Merge branch 'upstream'
diff --git a/ChangeLog b/ChangeLog
index 20f7d21..081a7ed 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,11 +1,3092 @@
-=== release 1.8.3 ===
+=== release 1.9.90 ===
-2016-08-19 Sebastian Dröge <slomo@coaxion.net>
+2016-09-30 Sebastian Dröge <slomo@coaxion.net>
* configure.ac:
- releasing 1.8.3
+ releasing 1.9.90
-2016-08-19 12:00:56 +0300 Sebastian Dröge <sebastian@centricular.com>
+2016-09-30 11:44:47 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * po/ky.po:
+ * po/sv.po:
+ po: Update translations
+
+2016-09-29 21:42:24 +0530 Arun Raghavan <arun@osg.samsung.com>
+
+ * ext/wayland/gstwaylandsink.c:
+ waylandsink: Actually use buffer pool config after setting it up
+ CID: 1373420
+
+2016-09-29 13:36:11 +0300 Sergey Mamonov <samamonov@gmail.com>
+
+ * ext/lv2/gstlv2filter.c:
+ fix for https://bugzilla.gnome.org/show_bug.cgi?id=771871
+
+2016-09-29 21:45:50 +0530 Arun Raghavan <arun@osg.samsung.com>
+
+ * sys/bluez/gsta2dpsink.c:
+ a2dpsink: Drop some dead-code
+ Left over from the last cleanup.
+ CID: 1373418
+
+2016-09-29 14:32:15 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/fdkaac/gstfdkaacdec.c:
+ fdkaacenc: fix accessing freed memory
+ The buffer data is not always copied in _Fill, and will be
+ read in _DecodeFrame. We unmap at the end of the function,
+ whether we get there via failure or early out, and keep a
+ ref to the buffer to ensure we can use it to unmap the
+ memory even after _finish_frame is called, as it unrefs
+ the buffer.
+ Note that there is an access beyond the allocated buffer,
+ which is only apparent when playing from souphttpsrc (ie,
+ not from filesrc). This appears to be a bug in the bit
+ reading code in libfdkaac AFAICT.
+ https://bugzilla.gnome.org/show_bug.cgi?id=772186
+
+2016-09-29 14:31:37 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/fdkaac/gstfdkaacdec.c:
+ * ext/fdkaac/gstfdkaacdec.h:
+ fdkaacdec: avoid memory corruption on decoding error
+ The buffer size is expected to be in multiples of the sample size,
+ not in bytes.
+ https://bugzilla.gnome.org/show_bug.cgi?id=772186
+
+2016-09-29 14:29:46 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/fdkaac/gstfdkaacdec.c:
+ fdkaacenc: fix buffer leak
+ https://bugzilla.gnome.org/show_bug.cgi?id=772186
+
+2016-09-28 09:44:58 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/fdkaac/gstfdkaacenc.c:
+ fdkaacenc: set framed=true on src caps
+ This fixes muxing in MPEG TS.
+ https://bugzilla.gnome.org/show_bug.cgi?id=772108
+
+2016-05-05 15:53:57 +0900 Gwang Yoon Hwang <yoon@igalia.com>
+
+ * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c:
+ * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h:
+ gl/dispmanx: Implements set_render_rectangle to adjust the position of window
+ We cannot set the x, y coordinate of the video frame at the dispmanx at
+ this point. We need to teach dispmanx backend to understand about
+ set_render_rectangle API to draw a video with other UI.
+ This patch keeps the current behavior which places video frame at the
+ center of the display if there is no set_render_rectangle call to the
+ dispmanx window.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766018
+
+2016-09-28 15:20:25 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglbasefilter.h:
+ * gst-libs/gst/gl/gstglbasememory.h:
+ * gst-libs/gst/gl/gstglbuffer.h:
+ * gst-libs/gst/gl/gstglbufferpool.h:
+ * gst-libs/gst/gl/gstglcolorconvert.h:
+ * gst-libs/gst/gl/gstglcontext.h:
+ * gst-libs/gst/gl/gstgldebug.h:
+ * gst-libs/gst/gl/gstgldisplay.h:
+ * gst-libs/gst/gl/gstglfeature.h:
+ * gst-libs/gst/gl/gstglfilter.h:
+ * gst-libs/gst/gl/gstglframebuffer.h:
+ * gst-libs/gst/gl/gstglmemory.h:
+ * gst-libs/gst/gl/gstglmemorypbo.h:
+ * gst-libs/gst/gl/gstgloverlaycompositor.h:
+ * gst-libs/gst/gl/gstglquery.h:
+ * gst-libs/gst/gl/gstglrenderbuffer.h:
+ * gst-libs/gst/gl/gstglshader.h:
+ * gst-libs/gst/gl/gstglslstage.h:
+ * gst-libs/gst/gl/gstglupload.h:
+ * gst-libs/gst/gl/gstglviewconvert.h:
+ gl: add necessary padding bytes to all public structs
+
+2016-09-27 16:17:00 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/fdkaac/gstfdkaacenc.c:
+ fdkaacenc: set transmux on the fdkaac lib
+ Not doing so will fail to decode in a simple fdkaacenc ! fdkaacdec
+ pipeline, though would work if this goes through a file.
+ https://bugzilla.gnome.org/show_bug.cgi?id=772067
+
+2016-09-27 16:15:44 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/fdkaac/gstfdkaacdec.c:
+ fdkaacdec: do not error out of out of sync return
+ The docs say we should continue feeding in data and decoding
+ https://bugzilla.gnome.org/show_bug.cgi?id=772067
+
+2016-09-27 09:08:51 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/fdkaac/gstfdkaacenc.c:
+ fdkaac: fix error with AOT_MP2_AAC_LC removed from libfdkaac API
+ AOT_MP2_AAC_LC is a "pseudo AOT" which got removed after 0.1.4,
+ and maps to AOT_AAC_LC.
+ Remove mpegversion 2 from th caps to match.
+ https://bugzilla.gnome.org/show_bug.cgi?id=772067
+
+2016-09-26 16:30:02 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * sys/bluez/meson.build:
+ meson: bluez: fix build
+
+2016-09-26 16:38:04 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * sys/decklink/linux/DeckLinkAPI.h:
+ * sys/decklink/linux/DeckLinkAPIConfiguration.h:
+ * sys/decklink/linux/DeckLinkAPIDeckControl.h:
+ * sys/decklink/linux/DeckLinkAPIDiscovery.h:
+ * sys/decklink/linux/DeckLinkAPIModes.h:
+ * sys/decklink/linux/DeckLinkAPITypes.h:
+ * sys/decklink/linux/DeckLinkAPIVersion.h:
+ * sys/decklink/osx/DeckLinkAPI.h:
+ * sys/decklink/osx/DeckLinkAPIConfiguration.h:
+ * sys/decklink/osx/DeckLinkAPIDeckControl.h:
+ * sys/decklink/osx/DeckLinkAPIDiscovery.h:
+ * sys/decklink/osx/DeckLinkAPIDispatch.cpp:
+ * sys/decklink/osx/DeckLinkAPIModes.h:
+ * sys/decklink/osx/DeckLinkAPIStreaming.h:
+ * sys/decklink/osx/DeckLinkAPITypes.h:
+ * sys/decklink/osx/DeckLinkAPIVersion.h:
+ decklink: Update to SDK 10.8
+ OSX and Linux only, Windows needs someone on Windows to convert the .idl
+ files to C source code.
+
+2016-09-26 11:41:42 +0100 Olivier Crête <olivier.crete@ocrete.ca>
+
+ * ext/fdkaac/gstfdkaacdec.c:
+ fdkaac: fix mixup setting interleaved output
+ https://bugzilla.gnome.org/show_bug.cgi?id=770455
+
+2016-09-26 13:26:36 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/player/gstplayer.c:
+ player: Only report the initial duration if the query was successful
+
+2016-09-26 11:15:25 +0900 Kyungyong Kim <kyungyong.kim@lge.com>
+
+ * gst/videoparsers/gsth265parse.c:
+ h265parse: Fix parsing of multiple NALs in the hvcC box
+ https://bugzilla.gnome.org/show_bug.cgi?id=771970
+
+2016-09-25 17:38:15 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * sys/bluez/Makefile.am:
+ bluez: dist new header file
+ Fixes distcheck.
+
+2016-09-24 22:39:38 +0530 Arun Raghavan <arun@arunraghavan.net>
+
+ * sys/bluez/gsta2dpsink.c:
+ * sys/bluez/gstavdtpsink.c:
+ * sys/bluez/gstavdtpsink.h:
+ a2dpsink: Don't try to set device caps on avdtpsink
+ We can't actually configure the transport, so we should only be working
+ with whatever we get.
+
+2016-09-23 16:31:50 +0530 Arun Raghavan <arun@arunraghavan.net>
+
+ * sys/bluez/gstavdtpsink.c:
+ avdtpsink: Chain event handling up to basesink
+
+2016-09-23 16:04:43 +0530 Arun Raghavan <arun@arunraghavan.net>
+
+ * sys/bluez/gsta2dpsink.c:
+ * sys/bluez/gsta2dpsink.h:
+ bluez: Clean up and make a2dpsink functional again
+ Was crashing, and had a lot of cruft (like a capsfilter and a fakesink)
+ that was no longer required.
+
+2016-09-15 17:49:15 +0530 Arun Raghavan <arun@arunraghavan.net>
+
+ * sys/bluez/Makefile.am:
+ * sys/bluez/gstavdtpsrc.c:
+ * sys/bluez/gstavdtpsrc.h:
+ * sys/bluez/gstavrcputil.c:
+ * sys/bluez/gstavrcputil.h:
+ * sys/bluez/org.bluez.xml:
+ avdtpsrc: Add support for AVRCP metadata
+ Metadata from AVRCP is emitted as tags, and the duration from AVRCP is
+ used in queries by avdtpsrc.
+
+2016-09-24 10:49:10 -0400 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/openjpeg/gstopenjpegdec.c:
+ openjpegdec: Properly offset and shift for all formats when converting
+ And while at it, also clean up some code.
+
+2016-09-24 10:05:16 -0400 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst/videoparsers/gstjpeg2000parse.c:
+ jpeg2000parse: Don't pass NULL strings to the colorspace / sampling parsing functions
+ They assert on NULL.
+
+2016-09-23 15:49:21 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/wayland/gstwaylandsink.c:
+ waylandsink: Don't leak GValues in getcaps
+
+2016-09-22 18:55:23 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/wayland/gstwaylandsink.c:
+ * ext/wayland/wlwindow.c:
+ * ext/wayland/wlwindow.h:
+ waylandsink: Update our window size on configure event
+ This is specific to when the waylandsink is not being embedded. In
+ this patch we pass the render lock to the window so it can safely
+ call gst_wl_window_set_render_rectangle() with the new size.
+ https://bugzilla.gnome.org/show_bug.cgi?id=722343
+
+2016-09-22 18:53:22 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/wayland/gstwaylandsink.c:
+ waylandsink: Remove atomic operation
+ We already take the render lock from the wlqueue thread in some other
+ place which indicates that there is no use of this atomic instead of
+ a proper locking mechanism.
+
+2016-09-22 15:37:41 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/wayland/gstwaylandsink.c:
+ waylandsink: Do not pre-configure proposed pool
+ Upstream must configure the pool before using it. Pre-configuring
+ the proposed pool could hide bugs in upstream elements.
+
+2016-09-22 15:35:44 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/wayland/wlwindow.c:
+ * ext/wayland/wlwindow.h:
+ waylandsink: Properly draw black border in absence of viewporter
+ When we don't have a viewporter (scaling support), we can't use the
+ 1x1 scaleup image trick. Instead, we need to allocate a buffer with
+ the same size as the area that need to have black background.
+
+2016-09-22 10:55:03 +0200 Florian Zwoch <fzwoch@gmail.com>
+
+ * sys/winscreencap/gstdx9screencapsrc.c:
+ dx9screencapsrc: throw error for invalid screen index
+ Currently dx9screencapsrc prints a verbose warning in case the screen
+ index is out of range for the current number of detected monitors. This
+ value is then dropped.
+ However there is no initial indication (beside the console print) if it
+ worked or not. This may result in capturing an unwanted screen as it
+ would capture the last set index that was not rejected.
+ This patch sets the index regardless. Instead, the element throws an
+ error when it tries to run or getting caps for an invalid index.
+ https://bugzilla.gnome.org/show_bug.cgi?id=771817
+
+2016-09-22 18:19:36 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstgldisplay.c:
+ gldisplay: also free the GWeakRef when removing dead contexts
+ Otherwise we leak GWeakRef's.
+ Found with make -C tests/check libs/gstglcontext.valgrind
+
+2016-09-21 15:51:52 -0700 Martin Kelly <martin@surround.io>
+
+ * gst-libs/gst/wayland/Makefile.am:
+ wayland/Makefile.am: add missing libs
+ libgstwayland is missing a dependency on $(GST_PLUGINS_BASE_LIBS), so add it.
+ https://bugzilla.gnome.org/show_bug.cgi?id=771794
+
+2016-09-21 15:07:50 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/wayland/wldisplay.c:
+ waylandsink: Destroy viewporter when done
+ https://bugzilla.gnome.org/show_bug.cgi?id=738079
+
+2016-09-21 11:33:18 -0700 Martin Kelly <martin@surround.io>
+
+ * tests/check/Makefile.am:
+ build: add missing $(GST_PLUGINS_BASE_LIBS)
+ The linker flags for several plugins (dashdemux, mssdemux, hlsdemux) are missing
+ $(GST_PLUGINS_BASE_LIBS), so add them so they can find -lgsttag and -lgstapp.
+ https://bugzilla.gnome.org/show_bug.cgi?id=771780
+
+2016-09-19 12:11:59 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/wayland/gstwaylandsink.c:
+ waylandsink: Port to vmeta and GstVideoFrame
+ This add support for non-standard strides to be used. Note that
+ some extra work is needed for multi-plane format which may have
+ a different GstMemory object per plane. This is not currently a
+ problem since SHM interface is limited to 1 memory.
+
+2016-09-19 12:08:20 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/wayland/gstwaylandsink.c:
+ waylandsink: Don't propose multiple time the same buffer pool
+ The buffer pool API does not allow multiple of owner. This otherwise
+ lead to error when renegotiation take place. Aso consider the
+ allocation query "need_pool" boolean.
+
+2016-09-19 12:06:17 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/wayland/gstwaylandsink.c:
+ waylandsink: Promote debug trace into error trace
+ Otherwise those error may go unseen making debugging much
+ harder.
+
+2016-09-19 12:04:52 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/wayland/gstwaylandsink.c:
+ waylandsink: Factor-out the pool creation
+
+2016-09-16 15:41:11 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/wayland/gstwaylandsink.c:
+ waylansink: Implement _show_frame()
+ This fixes the property show-preroll-frame expose by the VideoSink base
+ class and removes redundant code.
+
+2016-09-21 15:09:26 +0200 Joakim Johansson <joakimj@axis.com>
+
+ * tests/check/elements/rtponviftimestamp.c:
+ rtponviftimestamp: Update unit tests after changing default value of D-bit
+ The D bit shall always be set to true for the first buffer.
+ https://bugzilla.gnome.org/show_bug.cgi?id=770221
+
+2016-09-21 09:31:23 -0400 Sebastian Dröge <sebastian@centricular.com>
+
+ * sys/decklink/gstdecklink.cpp:
+ * sys/decklink/gstdecklinkaudiosink.cpp:
+ * sys/decklink/gstdecklinkaudiosrc.cpp:
+ * sys/decklink/gstdecklinkvideosink.cpp:
+ * sys/decklink/gstdecklinkvideosrc.cpp:
+ decklink: Print the Decklink API error return values in debug output in all places
+
+2016-09-20 18:28:29 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * ext/wayland/Makefile.am:
+ wayland: fix distcheck some more
+
+2016-09-13 11:18:27 +0200 Joakim Johansson <joakimj@axis.com>
+
+ * gst/onvif/gstrtponviftimestamp.c:
+ rtponviftimestamp: Change default value of D-bit
+ The default value of D-bit is changed to TRUE so discontinuity
+ is set for initial request and seek request as well.
+ Only set the e_bit flag for the CUSTOM_DOWNSTREAM event if
+ a cached buffer exists.
+ https://bugzilla.gnome.org/show_bug.cgi?id=770221
+
+2016-09-19 10:18:22 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * configure.ac:
+ configure: fix --disable-external
+ conditional "USE_VULKAN" was never defined
+
+2016-09-19 16:54:43 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gstglcolorbalance.c:
+ glcolorbalance: reconfigure on passthrough changes
+ Fixes an assertion when moving from passthrough to non-passthrough
+ Without an explicit reconfigure, glfiter won't have created the GL
+ resources such as the FBO, GL bufferpool, etc and basetransform will
+ allocate sysmem buffers instead.
+
+2016-09-16 13:43:50 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/player/gstplayer.c:
+ player: Remove some leftovers from external GstPlayer
+
+2016-09-17 14:12:44 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * ext/wayland/Makefile.am:
+ wayland: fix distcheck when wayland-scanner is not installed
+
+2016-09-15 14:10:02 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/wayland/wldisplay.c:
+ * ext/wayland/wlwindow.c:
+ waylandsink: Make wl_viewporter optional
+ This makes the viewporter interface optional. The end result is
+ obviously far from optimal, though it greatly helps testing on older
+ compostitors or gnome-wayland. We can make it strictly needed later when
+ this new interface get widely adopted.
+
+2016-06-14 16:34:35 -0700 Scott D Phillips <scott.d.phillips@intel.com>
+
+ * configure.ac:
+ * ext/wayland/Makefile.am:
+ * ext/wayland/scaler.xml:
+ * ext/wayland/wldisplay.c:
+ * ext/wayland/wldisplay.h:
+ * ext/wayland/wlwindow.c:
+ * ext/wayland/wlwindow.h:
+ wayland: Update from scaler to viewporter protocol
+ Signed-off-by: Scott D Phillips <scott.d.phillips@intel.com>
+ https://bugzilla.gnome.org/show_bug.cgi?id=767671
+
+2016-09-15 14:58:35 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * tests/check/libs/player.c:
+ player: Fix unit test for minor API change
+
+2016-09-15 13:15:22 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/player/gstplayer.c:
+ * gst-libs/gst/player/gstplayer.h:
+ player: Remove boolean return from set_subtitle_uri()
+ It can't fail synchronously and is inconsistent with set_uri().
+
+2016-09-14 18:07:55 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/player/gstplayer.c:
+ player: Don't change state to PLAYING immediately if a seek is pending
+ We first have to finish the seek (in PAUSED) and move to PLAYING once
+ the seek is actually finished (unless a new one is pending then).
+
+2016-09-14 11:30:48 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * configure.ac:
+ configure: Depend on gstreamer 1.9.2.1
+
+2016-09-08 11:57:52 +0900 Hyunjun Ko <zzoon@igalia.com>
+
+ * gst/dvbsuboverlay/gstdvbsuboverlay.c:
+ dvbsuboverlay: map with READWRITE for overlay blend
+ Just as in basetextoverlay [1], the frame to blend with the subtitles overlay
+ should be mapped with flags GST_MAP_READWRITE, because
+ gst_video_overlay_composition_blend() does both operations.
+ 1. https://cgit.freedesktop.org/gstreamer/gst-plugins-base/commit/?id=1396f804
+ Signed-off-by: Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+ https://bugzilla.gnome.org/show_bug.cgi?id=771382
+
+2016-09-13 20:08:19 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+
+ * configure.ac:
+ kmssink: update libdrm dependency to 2.4.55
+ The latest libdrm feature supported by kmssink is the universal plane, which
+ was added in 2.4.55. Let's update the dependency to that version.
+ https://bugzilla.gnome.org/show_bug.cgi?id=770146
+
+2016-09-11 00:06:52 +0000 Graham Leggett <minfrin@sharp.fm>
+
+ * gst/mpegtsdemux/mpegtsbase.c:
+ tsdemux: handle a NULL name in DVB short event descriptor
+ Resolves the warning:
+ GStreamer-WARNING **: Trying to set NULL string on field 'title' on taglist.
+ https://bugzilla.gnome.org/show_bug.cgi?id=771198
+
+2016-09-12 18:38:36 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ adaptivedemux: Also never have the SINK flag set on adaptivedemux
+
+2016-09-12 12:19:50 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * sys/decklink/gstdecklinkvideosink.cpp:
+ Revert "decklinkvideosink: Scale down scheduled frame times to milliseconds"
+ This reverts commit 3b7e0d7de32f0728259d601daa13b9eeec3dd3ce.
+ It was a bug in the driver and is supposed to be fixed with 10.8 and newer.
+
+2016-09-10 16:41:28 -0300 Thiago Santos <thiagossantos@gmail.com>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ adaptivedemux: fix typo in new API
+ Fixes supressed -> suppressed typo in previous commit
+ https://bugzilla.gnome.org/show_bug.cgi?id=770627
+
+2016-09-05 10:31:40 +0900 Wonchul Lee <wonchul.lee@collabora.com>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ adaptivedemux: prevent to propagate source flag to itself
+ https://bugzilla.gnome.org/show_bug.cgi?id=770627
+
+2016-09-10 20:51:27 +1000 Jan Schmidt <jan@centricular.com>
+
+ * autogen.sh:
+ * common:
+ Automatic update of common submodule
+ From b18d820 to f980fd9
+
+2016-09-10 09:54:09 +1000 Jan Schmidt <jan@centricular.com>
+
+ * autogen.sh:
+ * common:
+ Automatic update of common submodule
+ From 2c31690 to b18d820
+
+2016-09-09 23:24:01 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/meson.build:
+ meson/gl: use separate deps for gl and glx
+ e.g. passing with_gl_api=gles2 would still build the glx code but not be
+ linking against the libGL library which is where the glX* functions are
+ located and would result in a linker error.
+ Solved by checking for the libGL library if either opengl or glx may be
+ needed and then disabling the corresponding deps as requested.
+
+2016-09-09 16:55:23 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/meson.build:
+ * ext/vulkan/meson.build:
+ * ext/vulkan/vkconfig.h.meson:
+ meson: add build files for vulkan
+
+2016-09-09 16:36:03 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/gtk/meson.build:
+ * ext/meson.build:
+ meson: add build files for the gtk plugin
+
+2016-09-09 11:08:53 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/meson.build:
+ * ext/meson.build:
+ * gst-libs/gst/gl/gstglconfig.h.meson:
+ * gst-libs/gst/gl/meson.build:
+ * gst-libs/gst/meson.build:
+ * meson_options.txt:
+ * pkgconfig/meson.build:
+ meson: add some starting build files for GL
+ Currently only works on linux with egl/glx + wayland/x11 but the general
+ principals have been layed out for adding the other GL platforms/winsys'.
+
+2016-09-08 11:23:57 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/kms/gstkmssink.c:
+ kmssink: Scale up to the screen dimension
+ In most display sink, the logic is to use as much as possible
+ of the given window. In this case, the window is the screen,
+ hence it's logical to scale up.
+ https://bugzilla.gnome.org/show_bug.cgi?id=767422
+
+2016-09-08 11:21:09 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/kms/gstkmssink.c:
+ kmssink: Fix selection of source region
+ The source region was scaled for display before being passed
+ to drmModeSetPlane, which resulted in a portion of the video
+ being cropped. While when crop meta was present, the rectangle
+ was not centered since we where using unscaled width/height.
+ https://bugzilla.gnome.org/show_bug.cgi?id=767422
+
+2016-09-08 08:40:59 +0100 Julien Isorce <j.isorce@samsung.com>
+
+ * gst-libs/gst/player/gstplayer.h:
+ gstplayer: remove leftover update_interval api
+ old: gst_player_set_position_update_interval
+ new: gst_player_config_set_position_update_interval
+ https://bugzilla.gnome.org/show_bug.cgi?id=769144
+
+2016-09-01 19:46:31 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/vulkan/vkupload.c:
+ vkupload: add video/x-raw to the VulkanBuffer uploader
+ Allows upstream elements that use our memory to passthrough without copying.
+
+2016-09-01 19:43:59 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/vulkan/vkutils.c:
+ vkutils: set the last element of the layer array to NULL
+ g_strv* functions require this to not read off the end of the array.
+
+2016-09-07 20:11:55 +0100 Alistair Buxton <a.j.buxton@gmail.com>
+
+ * tests/examples/gl/clutter/Makefile.am:
+ gl/examples: Really remove references to $(GST_PLUGINS_GL_*).
+ These seem to have been missed in the previous commit to this file.
+ https://bugzilla.gnome.org/show_bug.cgi?id=771023
+
+2016-09-07 20:07:26 +0100 Alistair Buxton <a.j.buxton@gmail.com>
+
+ * gst-libs/gst/gl/Makefile.am:
+ gl: Remove duplicate GL_CFLAGS in Makefile.am.
+ https://bugzilla.gnome.org/show_bug.cgi?id=771021
+
+2016-08-05 18:17:32 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+
+ * sys/kms/gstkmsallocator.c:
+ kmssink: override stride if defined in driver
+ Some kms drivers demands specific pitches over the ones calculated by
+ GstVideoInfo. For example, intel driver demands strides round up 64.
+ This patch queries the driver for the prefered pitch and overwrites it
+ in the pool's GstVideoInfo structure.
+ https://bugzilla.gnome.org/show_bug.cgi?id=768446
+
+2016-09-06 16:05:53 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com>
+
+ * gst-libs/gst/base/gstaggregator.c:
+ aggregator: Use the event_full function for GstAggregatorPads
+ Allowing us to tell GstPad why we are failing an event, which might
+ be because we are 'flushing' even if the sinkpad is not in flush state
+ at that point.
+
+2016-09-06 13:13:39 +0800 Haihua Hu <jared.hu@nxp.com>
+
+ * ext/qt/gstqsgtexture.cc:
+ qmlglsink: check qt_context_ first in GstQSGTexture::bind()
+ When start qmlglsink app, it will set NULL buffer to GstQSGTexture
+ in which case that qt_context_ will be a random value and cause
+ gst_gl_context_activate() fail.
+ https://bugzilla.gnome.org/show_bug.cgi?id=770925
+
+2016-09-06 20:00:07 +1000 Matthew Waters <matthew@centricular.com>
+
+ * configure.ac:
+ build/vulkan: fix winsys detection based on the previously set variables
+ The X11/Wayland winsys checks weren't being used to enable the vulkan element.
+ Use them.
+
+2016-09-06 11:02:06 +0200 Philippe Normand <philn@igalia.com>
+
+ * ext/srtp/gstsrtpenc.c:
+ srtpenc: prevent deadlock in create_session
+ Temporarily release the object lock which is needed to post error
+ messages on the bus.
+ https://bugzilla.gnome.org/show_bug.cgi?id=770933
+
+2016-09-05 22:30:01 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com>
+
+ * meson.build:
+ meson: Fix building with meson 0.34 when using subprojects
+ When using subproject meson.source_root() returns the root
+ directory of the toplevel project which break build.
+ Upstream meson bug: https://github.com/mesonbuild/meson/issues/722
+
+2016-09-05 12:22:17 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com>
+
+ * meson.build:
+ meson: Bump version to 1.9.2
+
+2016-09-05 14:44:24 +1000 Alessandro Decina <alessandro.d@gmail.com>
+
+ * ext/gl/gstgluploadelement.c:
+ glupload: create the GstGLUpload object in ::transform_caps
+ Previously it was created in the init function and destroyed in ::stop, which
+ lead to segfaults when reusing the element.
+ Now the upload object is created in ::transform_caps if it is NULL, which is the
+ earliest we need it. The other vfuncs already bail out if the upload object is
+ NULL, which means that negotiation wasn't done.
+
+2016-08-29 11:40:54 +0900 Wonchul Lee <wonchul.lee@collabora.com>
+
+ * gst/mpegtsdemux/gstmpegdefs.h:
+ * gst/mpegtsdemux/tsdemux.c:
+ tsdemux: Support ATSC EAC3
+ EAC3 bit streams shall be identified with a stream_type value of 0x87 when
+ transmitted as PES streams conforming to ATSC-published standards. It is specified
+ in ATSC Standard A/52.
+ https://bugzilla.gnome.org/show_bug.cgi?id=770528
+
+2016-09-01 14:25:58 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * sys/decklink/gstdecklinkvideosink.cpp:
+ * sys/decklink/gstdecklinkvideosrc.cpp:
+ decklink: Fix-up last commit that was not meant to be pushed yet
+
+2016-09-01 14:18:33 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * sys/decklink/gstdecklinkaudiosink.cpp:
+ * sys/decklink/gstdecklinkvideosink.cpp:
+ decklink: Fix indentation
+
+2016-09-01 14:17:48 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * sys/decklink/gstdecklinkvideosink.cpp:
+ * sys/decklink/gstdecklinkvideosrc.cpp:
+ decklink: Require a clock when going from PAUSED_TO_PLAYING and don't crash if there is none
+ Also when going from PLAYING_TO_PAUSED, the clock might've been unset in the
+ meantime, e.g. because the element was removed from its surrounding bin.
+
+2016-09-01 12:28:22 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * configure.ac:
+ Back to development
+
+=== release 1.9.2 ===
+
+2016-09-01 12:27:59 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * 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-audiofxbad.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-bluez.xml:
+ * docs/plugins/inspect/plugin-bs2b.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-compositor.xml:
+ * docs/plugins/inspect/plugin-curl.xml:
+ * docs/plugins/inspect/plugin-dashdemux.xml:
+ * docs/plugins/inspect/plugin-dataurisrc.xml:
+ * docs/plugins/inspect/plugin-debugutilsbad.xml:
+ * docs/plugins/inspect/plugin-decklink.xml:
+ * docs/plugins/inspect/plugin-dtls.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-fbdevsink.xml:
+ * docs/plugins/inspect/plugin-festival.xml:
+ * docs/plugins/inspect/plugin-fieldanalysis.xml:
+ * docs/plugins/inspect/plugin-flite.xml:
+ * docs/plugins/inspect/plugin-fluidsynthmidi.xml:
+ * docs/plugins/inspect/plugin-freeverb.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-gstgtk.xml:
+ * docs/plugins/inspect/plugin-gstsiren.xml:
+ * docs/plugins/inspect/plugin-hls.xml:
+ * docs/plugins/inspect/plugin-id3tag.xml:
+ * docs/plugins/inspect/plugin-inter.xml:
+ * docs/plugins/inspect/plugin-interlace.xml:
+ * docs/plugins/inspect/plugin-ivfparse.xml:
+ * docs/plugins/inspect/plugin-ivtc.xml:
+ * docs/plugins/inspect/plugin-jp2kdecimator.xml:
+ * docs/plugins/inspect/plugin-jpegformat.xml:
+ * docs/plugins/inspect/plugin-kate.xml:
+ * docs/plugins/inspect/plugin-ladspa.xml:
+ * docs/plugins/inspect/plugin-midi.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-mplex.xml:
+ * docs/plugins/inspect/plugin-mxf.xml:
+ * docs/plugins/inspect/plugin-netsim.xml:
+ * docs/plugins/inspect/plugin-ofa.xml:
+ * docs/plugins/inspect/plugin-openal.xml:
+ * docs/plugins/inspect/plugin-opencv.xml:
+ * docs/plugins/inspect/plugin-openexr.xml:
+ * docs/plugins/inspect/plugin-opengl.xml:
+ * docs/plugins/inspect/plugin-openjpeg.xml:
+ * docs/plugins/inspect/plugin-opusparse.xml:
+ * docs/plugins/inspect/plugin-pcapparse.xml:
+ * docs/plugins/inspect/plugin-pnm.xml:
+ * docs/plugins/inspect/plugin-qt.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-rsvg.xml:
+ * docs/plugins/inspect/plugin-rtmp.xml:
+ * docs/plugins/inspect/plugin-rtponvif.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-smoothstreaming.xml:
+ * docs/plugins/inspect/plugin-sndfile.xml:
+ * docs/plugins/inspect/plugin-soundtouch.xml:
+ * docs/plugins/inspect/plugin-spandsp.xml:
+ * docs/plugins/inspect/plugin-speed.xml:
+ * docs/plugins/inspect/plugin-srtp.xml:
+ * docs/plugins/inspect/plugin-stereo.xml:
+ * docs/plugins/inspect/plugin-subenc.xml:
+ * docs/plugins/inspect/plugin-teletext.xml:
+ * docs/plugins/inspect/plugin-uvch264.xml:
+ * docs/plugins/inspect/plugin-vcdsrc.xml:
+ * docs/plugins/inspect/plugin-videofiltersbad.xml:
+ * docs/plugins/inspect/plugin-videoframe_audiolevel.xml:
+ * docs/plugins/inspect/plugin-videoparsersbad.xml:
+ * docs/plugins/inspect/plugin-videosignal.xml:
+ * docs/plugins/inspect/plugin-vmnc.xml:
+ * docs/plugins/inspect/plugin-voaacenc.xml:
+ * docs/plugins/inspect/plugin-voamrwbenc.xml:
+ * docs/plugins/inspect/plugin-waylandsink.xml:
+ * docs/plugins/inspect/plugin-webp.xml:
+ * docs/plugins/inspect/plugin-webrtcdsp.xml:
+ * docs/plugins/inspect/plugin-wildmidi.xml:
+ * docs/plugins/inspect/plugin-x265.xml:
+ * docs/plugins/inspect/plugin-y4mdec.xml:
+ * docs/plugins/inspect/plugin-yadif.xml:
+ * docs/plugins/inspect/plugin-zbar.xml:
+ * gst-plugins-bad.doap:
+ * win32/common/config.h:
+ Release 1.9.2
+
+2016-09-01 11:24:37 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.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/nl.po:
+ * po/or.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ro.po:
+ * po/ru.po:
+ * po/sk.po:
+ * po/sl.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ po: Update translations
+
+2016-08-30 16:21:25 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * configure.ac:
+ * sys/applemedia/Makefile.am:
+ * sys/applemedia/plugin.m:
+ applemedia: Conditionally compile qtkitvideosrc
+ The API was deprecated in 10.9 and apparently does not exist in the SDK for
+ macOS Sierra anymore.
+ https://bugzilla.gnome.org/show_bug.cgi?id=770587
+
+2016-08-31 04:26:43 +1000 Jan Schmidt <jan@centricular.com>
+
+ * gst-libs/gst/gl/gstglframebuffer.h:
+ gl: Remove extra duplicate typedef of GstGLFramebuffer
+ It's triggering a warning building git master on OSX
+
+2016-08-29 16:57:42 +1000 Matthew Waters <matthew@centricular.com>
+
+ * tests/check/libs/gstglupload.c:
+ tests/glupload: support opengl3 properly instead of spewing GL errors
+
+2016-08-29 16:52:44 +1000 Matthew Waters <matthew@centricular.com>
+
+ * pkgconfig/gstreamer-gl.pc.in:
+ gl/pkgconfig: add the lib include dir to the list of includes
+ 714d8aa in core removed this include dir from it's pkgconfig file.
+ https://bugzilla.gnome.org/show_bug.cgi?id=770523
+
+2016-08-29 15:43:10 +1000 Alessandro Decina <alessandro.d@gmail.com>
+
+ * gst-libs/gst/gl/gstglupload.c:
+ * tests/check/libs/gstglupload.c:
+ glupload: fix tests and check for the new RECONFIGURE behaviour
+ The tests were broken since 91fea30, which changed glupload to return
+ GST_GL_UPLOAD_RECONFIGURE if the texture target in the input buffers doesn't
+ match the texture-target configured in the output caps.
+ This commit fixes that and adds more checks for the new behaviour.
+
+2016-08-19 11:12:10 -0700 Thibault Saunier <thibault.saunier@osg.samsung.com>
+
+ * ext/gme/gstgme.c:
+ * ext/sndfile/gstsfsink.c:
+ * ext/teletextdec/gstteletextdec.c:
+ * ext/timidity/gsttimidity.c:
+ * ext/timidity/gstwildmidi.c:
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ * gst/aiff/aiffparse.c:
+ * gst/midi/midiparse.c:
+ * gst/mpegdemux/gstmpegdemux.c:
+ * gst/mpegtsdemux/mpegtsbase.c:
+ * gst/mxf/mxfdemux.c:
+ * gst/nuvdemux/gstnuvdemux.c:
+ * gst/tta/gstttaparse.c:
+ * sys/androidmedia/gstamcaudiodec.c:
+ * sys/androidmedia/gstamcvideodec.c:
+ * sys/androidmedia/gstamcvideoenc.c:
+ * sys/applemedia/avfassetsrc.m:
+ Use the new API to post flow ERROR messages on the bus
+ https://bugzilla.gnome.org/show_bug.cgi?id=770158
+
+2016-08-26 20:12:21 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * tests/check/elements/dash_mpd.c:
+ dash: Fix build of unit test
+
+2016-08-25 20:50:11 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ * ext/dash/gstdashdemux.h:
+ * ext/dash/gstmpdparser.c:
+ * ext/dash/gstmpdparser.h:
+ dashdemux: Add properties to select maximum allowed width/height and framerate
+ https://bugzilla.gnome.org/show_bug.cgi?id=770408
+
+2016-08-26 16:04:27 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * sys/decklink/gstdecklinkaudiosink.cpp:
+ decklinkaudiosink: Fix compiler warning on OS X
+ While gint64 and int64_t are always the same, clang does not agree with that.
+ /Applications/Xcode.app/Contents/Developer/usr/bin/make -C decklink
+ CXX libgstdecklink_la-gstdecklinkaudiosink.lo
+ gstdecklinkaudiosink.cpp:675:79: error: cannot initialize a parameter of type 'int64_t *' (aka 'long long *') with an rvalue of type 'gint64 *' (aka 'long *')
+ ret = buf->output->attributes->GetInt (BMDDeckLinkMaximumAudioChannels, &max_channels);
+ ^~~~~~~~~~~~~
+ ./linux/DeckLinkAPI.h:692:87: note: passing argument to parameter 'value' here
+ virtual HRESULT GetInt (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ int64_t *value) = 0;
+ ^
+
+2016-08-26 22:51:48 +1000 Alessandro Decina <alessandro.d@gmail.com>
+
+ * sys/applemedia/corevideomemory.c:
+ applemedia: fix compiler warning
+
+2016-08-26 15:48:36 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * sys/decklink/gstdecklinkvideosink.cpp:
+ decklinkvideosink: Scale down scheduled frame times to milliseconds
+ Scale down to milliseconds, otherwise at least some hardware has problems
+ scheduling the frames (or schedules them too slow) and we run out of available
+ frames.
+ https://bugzilla.gnome.org/show_bug.cgi?id=770282
+
+2016-08-26 14:08:11 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * sys/decklink/gstdecklink.cpp:
+ * sys/decklink/gstdecklink.h:
+ * sys/decklink/gstdecklinkaudiosink.cpp:
+ decklinkaudiosink: Add support for 8 and 16 channels
+
+2016-08-26 17:37:54 +1000 Alessandro Decina <alessandro.d@gmail.com>
+
+ * sys/applemedia/Makefile.am:
+ * sys/applemedia/avfassetsrc.m:
+ * sys/applemedia/avfvideosrc.m:
+ * sys/applemedia/coremediabuffer.c:
+ * sys/applemedia/coremediabuffer.h:
+ * sys/applemedia/corevideobuffer.c:
+ * sys/applemedia/corevideobuffer.h:
+ * sys/applemedia/corevideomemory.c:
+ * sys/applemedia/corevideomemory.h:
+ * sys/applemedia/iosglmemory.c:
+ * sys/applemedia/iosglmemory.h:
+ * sys/applemedia/iosurfacememory.c:
+ * sys/applemedia/plugin.m:
+ * sys/applemedia/qtkitvideosrc.m:
+ * sys/applemedia/videotexturecache.h:
+ * sys/applemedia/videotexturecache.m:
+ * sys/applemedia/vtdec.c:
+ * sys/applemedia/vtenc.c:
+ applemedia: changes to make GL memory mappable on CPU on iOS
+ This commit introduces IOSGLMemory which is a GLMemory that falls back to
+ GstAppleCoreVideoMemory for CPU access. This is a temporary solution until
+ IOSurface gets exposed as a public framework on iOS and so we can use
+ IOSurfaceMemory on both MacOS and iOS.
+ https://bugzilla.gnome.org/show_bug.cgi?id=769210
+
+2016-08-22 17:18:27 +1000 Alessandro Decina <alessandro.d@gmail.com>
+
+ * ext/gl/gstgluploadelement.c:
+ * gst-libs/gst/gl/gstglupload.c:
+ * gst-libs/gst/gl/gstglupload.h:
+ gstglupload: make the GLMemoryUpload method output the correct texture-target
+ Now when used with video/x-raw as input, the GLMemoryUpload method checks for
+ ->tex_target in input GLMemory(es) and sets the output texture-target
+ accordingly.
+ Fixes video corruption with a pipeline like avfvideosrc ! video/x-raw !
+ glimagesink where on macos avfvideosrc pushes RECTANGLE textures but glupload
+ was configuring texture-target=2D as output.
+
+2016-08-24 09:41:08 -0300 Thibault Saunier <tsaunier@gnome.org>
+
+ * gst-libs/gst/mpegts/mpegts_enum.py:
+ * gst/mpegtsdemux/meson.build:
+ * meson.build:
+ meson: Make mpegts lib build when using subprojects
+ The headers passed as parametter are relative to the build dir
+ basically "../subproject/gst-plugins-bad/gst-libs/gst/mpegts/XXX.h"
+ but that does not match what is needed at build time when building as
+ subproject, also we always add current dir as include_dir so we are
+ safe including directly.
+ And link mpegtsdemux against the 'math' library as it is needed.
+
+2016-08-26 03:46:39 +1000 Jan Schmidt <jan@centricular.com>
+
+ * docs/plugins/gst-plugins-bad-plugins-docs.sgml:
+ docs: Expose the opengl plugin and element docs
+
+2016-08-26 02:20:11 +1000 Jan Schmidt <jan@centricular.com>
+
+ * gst-libs/gst/video/gstvideoaggregator.c:
+ videoaggregator: Handle if update_caps() returns EMPTY
+ Don't assume the returned caps from update_caps() is
+ non-empty.
+
+2016-08-26 02:07:27 +1000 Jan Schmidt <jan@centricular.com>
+
+ * ext/gl/gstglvideomixer.c:
+ gl: Update glvideomixer doc
+
+2016-08-26 02:06:00 +1000 Jan Schmidt <jan@centricular.com>
+
+ * ext/gl/gstglstereomix.c:
+ * ext/gl/gstglviewconvert.c:
+ gl: Add/update docs for glviewconvert, glstereomix
+ Add some example pipelines for glstereomix, and fix up
+ the example pipelines for glviewconvert
+
+2016-08-26 00:29:34 +1000 Jan Schmidt <jan@centricular.com>
+
+ * ext/gl/gstglstereomix.c:
+ * ext/gl/gstglstereomix.h:
+ glstereomix: Fix caps negotiation
+ The videoaggregator negotiation sequence changed some time
+ back and broke glstereomix. Instead of doing nego incorrectly
+ in the find_best_format() vfunc, do it directly in the
+ update_caps() method.
+
+2016-08-25 15:26:49 +1000 Jan Schmidt <jan@centricular.com>
+
+ * gst-libs/gst/gl/gstglviewconvert.c:
+ glviewconvert: Fix texture target fixation
+ Don't set the chosen texture-target into the wrong structure.
+ The input caps may not be writable, and in any case - the
+ intention was to configure the othercaps. Also, remove an
+ extra unref - the othercaps ref is consumed by
+ gst_caps_make_writable already.
+
+2016-08-25 19:35:13 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ * ext/hls/gsthlsdemux.c:
+ * ext/smoothstreaming/gstmssdemux.c:
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ adaptivedemux: Enable bitrate selection for trick mode streaming again
+ And scale the bitrate with the absolute rate (if it's bigger than 1.0) to get
+ to the real bitrate due to faster playback.
+ This allowed in my tests to play a stream with 10x speed without buffering as
+ the lowest bitrate is chosen, instead of staying/selecting the highest bitrate
+ and then buffering all the time.
+ It was previously disabled for not very well specified reasons, which seem to
+ be not valid anymore nowadays.
+
+2016-08-25 16:33:17 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * tests/check/elements/.gitignore:
+ gitignore: add missing dash_isoff file
+
+2016-08-25 12:45:33 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * tests/check/Makefile.am:
+ build: fix gst-uninstalled build in osx
+ Fixes clang: error: argument unused during compilation: '-pthread'
+ when building the test programs.
+
+2016-08-25 14:35:59 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * configure.ac:
+ * tests/check/Makefile.am:
+ build: unconditionally check for video, audio and pbutils modules
+ Check for modules in configure and use GST_*_LIBS vars to link with
+ the libraries instead of hardcoding them.
+
+2016-07-26 19:55:13 +0200 Xabier Rodriguez Calvar <calvaris@igalia.com>
+
+ * ext/gl/gstglvideoflip.c:
+ * ext/gl/gstglvideoflip.h:
+ glvideoflip: implement GstVideoDirection interface
+ It implements now this interface with its video-direction
+ property. Values are changed to GstVideoOrientationMethod but they have
+ the same value than the originals.
+ https://bugzilla.gnome.org/show_bug.cgi?id=768687
+
+2016-08-24 19:43:55 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/fdkaac/gstfdkaacenc.c:
+ fdkaacenc: Implement some automatic bitrate selection
+ Based on sample rate and channel count, see
+ http://wiki.hydrogenaud.io/index.php?title=Fraunhofer_FDK_AAC#Recommended_Sampling_Rate_and_Bitrate_Combinations
+
+2016-08-24 14:15:09 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/player/gstplayer.c:
+ player: On redirects, remember the redirect URI separately and don't consider this an URI property change
+ The application does not know anything about the redirect, and changing its
+ URI internally will cause confusion.
+ Also don't reset the subtitle URI.
+
+2016-08-24 14:10:41 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/player/gstplayer.c:
+ player: Don't report spurious STOPPED state changes when doing transient changes there
+
+2016-08-24 13:01:46 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/player/gstplayer.c:
+ player: Ensure that rate is initialized to 1.0
+
+2016-08-24 10:16:00 +0000 Fredrik Fornwall <fredrik@fornwall.net>
+
+ * sys/opensles/Makefile.am:
+ opensles: Add opensles.h to noinst_HEADERS
+ https://bugzilla.gnome.org/show_bug.cgi?id=770326
+
+2016-08-23 14:37:17 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/player/gstplayer.c:
+ player: De-duplicate rate setting code and always use the property
+
+2016-08-23 14:33:11 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/player/gstplayer.c:
+ player: Protect setter/getter for the configuration with a mutex
+
+2016-08-23 14:32:24 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/player/gstplayer.c:
+ * gst-libs/gst/player/gstplayer.h:
+ player: Move subtitle URI setter next to the uri setter
+ It's confusing to have them a couple of hundred lines apart.
+
+2016-08-17 19:59:17 +0200 Matej Knopp <matej.knopp@gmail.com>
+
+ * sys/applemedia/vtdec.c:
+ vtdec: fix MPEG-2 video caps
+ Add systemstream=false to caps, otherwise the decoder
+ may be picked for MPEG-PS files. Also parsed=true,
+ as video toolbox expects entire frame in
+ VTDecompressionSessionDecodeFrame.
+ https://bugzilla.gnome.org/show_bug.cgi?id=770049
+
+2016-08-23 02:13:19 +1000 Jan Schmidt <jan@centricular.com>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c.rej:
+ * gst-libs/gst/adaptivedemux/set_state_keep.patch:
+ adaptivedemux: Fix the previous commit
+ Remove extra files that were not meant to be added to the commit
+
+2016-08-23 01:57:55 +1000 Jan Schmidt <jan@centricular.com>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c.rej:
+ * gst-libs/gst/adaptivedemux/set_state_keep.patch:
+ adaptivedemux: Fix broken updates loop on live streams
+ Prevent the manifest update loop from looping endlessly
+ after a seek event, by clearing the variable that tells
+ the task function not to immediately exit.
+
+2016-08-18 10:06:27 +0200 Michael Olbrich <m.olbrich@pengutronix.de>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ adaptivedemux: fix stream exposure condition
+ The new streams should not be exposed until all streams are done with the
+ current fragment. The old code is incorrect and actually only checked the
+ current stream. Fix this by properly checking all streams.
+ Also, ignore the current stream. The code is only reached when the current
+ stream finished downloading and since
+ 07f49f15b1196cc9fa0d45af91149a35fce123b9 ("adaptivedemux: On EOS, handle it
+ before waking download loop") download_finished is set after
+ gst_adaptive_demux_stream_advance_fragment_unlocked() is called.
+ Without this HLS playback with multiple streams is broken, because the new
+ streams are never exposed.
+ https://bugzilla.gnome.org/show_bug.cgi?id=770075
+
+2016-08-21 16:21:07 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * ext/mpg123/meson.build:
+ meson: remove unused mpg123 build file
+ mpg123 was moved to ugly.
+
+2016-08-12 21:21:45 +0530 Nirbheek Chauhan <nirbheek@centricular.com>
+
+ * .gitignore:
+ * config.h.meson:
+ * ext/assrender/meson.build:
+ * ext/bz2/meson.build:
+ * ext/chromaprint/meson.build:
+ * ext/curl/meson.build:
+ * ext/dash/meson.build:
+ * ext/directfb/meson.build:
+ * ext/dtls/meson.build:
+ * ext/dts/meson.build:
+ * ext/faac/meson.build:
+ * ext/faad/meson.build:
+ * ext/flite/meson.build:
+ * ext/fluidsynth/meson.build:
+ * ext/hls/meson.build:
+ * ext/kate/meson.build:
+ * ext/libde265/meson.build:
+ * ext/libmms/meson.build:
+ * ext/meson.build:
+ * ext/mpg123/meson.build:
+ * ext/openh264/meson.build:
+ * ext/openjpeg/meson.build:
+ * ext/opus/meson.build:
+ * ext/resindvd/meson.build:
+ * ext/rsvg/meson.build:
+ * ext/rtmp/meson.build:
+ * ext/sbc/meson.build:
+ * ext/schroedinger/meson.build:
+ * ext/smoothstreaming/meson.build:
+ * ext/soundtouch/meson.build:
+ * ext/spandsp/meson.build:
+ * ext/srtp/meson.build:
+ * ext/srtp/srtp_mkenum.py:
+ * ext/voaacenc/meson.build:
+ * ext/webp/meson.build:
+ * ext/x265/meson.build:
+ * ext/zbar/meson.build:
+ * gst-libs/gst/adaptivedemux/meson.build:
+ * gst-libs/gst/audio/meson.build:
+ * gst-libs/gst/base/meson.build:
+ * gst-libs/gst/basecamerabinsrc/meson.build:
+ * gst-libs/gst/codecparsers/meson.build:
+ * gst-libs/gst/gl/gstglconfig.h.meson:
+ * gst-libs/gst/gl/meson.build:
+ * gst-libs/gst/insertbin/meson.build:
+ * gst-libs/gst/interfaces/build_mkenum.py:
+ * gst-libs/gst/interfaces/meson.build:
+ * gst-libs/gst/meson.build:
+ * gst-libs/gst/mpegts/meson.build:
+ * gst-libs/gst/mpegts/mpegts_enum.py:
+ * gst-libs/gst/player/meson.build:
+ * gst-libs/gst/uridownloader/meson.build:
+ * gst-libs/gst/video/meson.build:
+ * gst-libs/meson.build:
+ * gst/accurip/meson.build:
+ * gst/adpcmdec/meson.build:
+ * gst/adpcmenc/meson.build:
+ * gst/aiff/meson.build:
+ * gst/asfmux/meson.build:
+ * gst/audiobuffer/meson.build:
+ * gst/audiofxbad/meson.build:
+ * gst/audiomixer/meson.build:
+ * gst/audiovisualizers/meson.build:
+ * gst/autoconvert/meson.build:
+ * gst/bayer/meson.build:
+ * gst/camerabin2/meson.build:
+ * gst/cdxaparse/meson.build:
+ * gst/coloreffects/meson.build:
+ * gst/compositor/meson.build:
+ * gst/dataurisrc/meson.build:
+ * gst/dccp/meson.build:
+ * gst/debugutils/meson.build:
+ * gst/dvbsuboverlay/meson.build:
+ * gst/dvdspu/meson.build:
+ * gst/faceoverlay/meson.build:
+ * gst/festival/meson.build:
+ * gst/fieldanalysis/meson.build:
+ * gst/freeverb/meson.build:
+ * gst/frei0r/meson.build:
+ * gst/games/meson.build:
+ * gst/gaudieffects/meson.build:
+ * gst/gdp/meson.build:
+ * gst/geometrictransform/meson.build:
+ * gst/hdvparse/meson.build:
+ * gst/id3tag/meson.build:
+ * gst/inter/meson.build:
+ * gst/interlace/meson.build:
+ * gst/ivfparse/meson.build:
+ * gst/ivtc/meson.build:
+ * gst/jp2kdecimator/meson.build:
+ * gst/jpegformat/meson.build:
+ * gst/librfb/meson.build:
+ * gst/meson.build:
+ * gst/midi/meson.build:
+ * gst/mixmatrix/meson.build:
+ * gst/mpeg1sys/meson.build:
+ * gst/mpegdemux/meson.build:
+ * gst/mpegpsmux/meson.build:
+ * gst/mpegtsdemux/meson.build:
+ * gst/mpegtsmux/meson.build:
+ * gst/mve/meson.build:
+ * gst/mxf/meson.build:
+ * gst/nuvdemux/meson.build:
+ * gst/onvif/meson.build:
+ * gst/overlay/meson.build:
+ * gst/patchdetect/meson.build:
+ * gst/pcapparse/meson.build:
+ * gst/pnm/meson.build:
+ * gst/rawparse/meson.build:
+ * gst/real/meson.build:
+ * gst/removesilence/meson.build:
+ * gst/rtjpeg/meson.build:
+ * gst/sdi/meson.build:
+ * gst/sdp/meson.build:
+ * gst/segmentclip/meson.build:
+ * gst/siren/meson.build:
+ * gst/smooth/meson.build:
+ * gst/speed/meson.build:
+ * gst/stereo/meson.build:
+ * gst/subenc/meson.build:
+ * gst/tta/meson.build:
+ * gst/vbidec/meson.build:
+ * gst/videofilters/meson.build:
+ * gst/videoframe_audiolevel/meson.build:
+ * gst/videomeasure/meson.build:
+ * gst/videoparsers/meson.build:
+ * gst/videosignal/meson.build:
+ * gst/vmnc/meson.build:
+ * gst/y4m/meson.build:
+ * gst/yadif/meson.build:
+ * meson.build:
+ * meson_options.txt:
+ * pkgconfig/meson.build:
+ * sys/bluez/meson.build:
+ * sys/d3dvideosink/meson.build:
+ * sys/directsound/meson.build:
+ * sys/dvb/meson.build:
+ * sys/meson.build:
+ * sys/wasapi/meson.build:
+ * sys/winks/meson.build:
+ * sys/winscreencap/meson.build:
+ Add support for Meson as alternative/parallel build system
+ https://github.com/mesonbuild/meson
+ With contributions from:
+ Tim-Philipp Müller <tim@centricular.com>
+ Matej Knopp <matej.knopp@gmail.com>
+ Jussi Pakkanen <jpakkane@gmail.com> (original port)
+ Highlights of the features provided are:
+ * Faster builds on Linux (~40-50% faster)
+ * The ability to build with MSVC on Windows
+ * Generate Visual Studio project files
+ * Generate XCode project files
+ * Much faster builds on Windows (on-par with Linux)
+ * Seriously fast configure and building on embedded
+ ... and many more. For more details see:
+ http://blog.nirbheek.in/2016/05/gstreamer-and-meson-new-hope.html
+ http://blog.nirbheek.in/2016/07/building-and-developing-gstreamer-using.html
+ Building with Meson should work on both Linux and Windows, but may
+ need a few more tweaks on other operating systems.
+
+2016-08-18 17:46:19 +0530 Nirbheek Chauhan <nirbheek@centricular.com>
+
+ * ext/dts/gstdtsdec.c:
+ * ext/resindvd/resindvdsrc.h:
+ * gst/bayer/gstbayer2rgb.c:
+ * gst/dccp/gstdccp_common.h:
+ * gst/librfb/d3des.c:
+ * sys/fbdev/gstfbdevsink.c:
+ plugins: Use stdint.h instead of _stdint.h
+ _stdint.h is generated by Autotools and we don't really need it. All
+ supported platforms now ship with stdint.h. The only stickler was MSVC,
+ and since Visual Studio 2015 it also ships stdint.h now.
+
+2016-08-12 21:51:17 +0530 Nirbheek Chauhan <nirbheek@centricular.com>
+
+ * win32/common/libgstgl.def:
+ win32: Update libgstgl.def
+
+2016-03-02 00:53:44 +0530 Nirbheek Chauhan <nirbheek.chauhan@gmail.com>
+
+ * gst-libs/gst/codecparsers/nalutils.c:
+ codecparsers: Explicitly export functions marked inline
+ On MSVC, inline functions are not available outside of a file unless
+ explicitly exported
+
+2016-08-19 12:24:58 +0100 Luis de Bethencourt <luisbg@osg.samsung.com>
+
+ * gst/rawparse/gstrawvideoparse.c:
+ rawvideoparse: fix typo in comment
+ Small typo in the comment explaining the code fixed by the previous commit.
+ Fixing it.
+
+2016-08-19 14:19:38 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst/rawparse/gstrawvideoparse.c:
+ rawvideoparse: Revert last commit and actually remember the physically last plane
+ Instead of just always taking the last one as before.
+
+2016-08-19 11:57:33 +0100 Luis de Bethencourt <luisbg@osg.samsung.com>
+
+ * gst/rawparse/gstrawvideoparse.c:
+ rawvideoparse: remove unused assignment
+ Value in last_plane will be overwritten before used, remove unused
+ asignment.
+ Fixes commit 91cf5ac69f9c99fe41d60f42b4174915dd135e7b
+ CID 1371462
+
+2016-08-18 18:55:41 +0200 Philippe Renon <philippe_renon@yahoo.fr>
+
+ * ext/daala/gstdaaladec.c:
+ daala: fix typo related compilation error
+ https://bugzilla.gnome.org/show_bug.cgi?id=770102
+
+2016-08-19 11:02:46 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * configure.ac:
+ * sys/Makefile.am:
+ * sys/applemedia-nonpublic/Makefile.am:
+ * sys/applemedia-nonpublic/bufferfactory.h:
+ * sys/applemedia-nonpublic/bufferfactory.m:
+ * sys/applemedia-nonpublic/celapi.c:
+ * sys/applemedia-nonpublic/celapi.h:
+ * sys/applemedia-nonpublic/celvideosrc.c:
+ * sys/applemedia-nonpublic/celvideosrc.h:
+ * sys/applemedia-nonpublic/cmapi.c:
+ * sys/applemedia-nonpublic/cmapi.h:
+ * sys/applemedia-nonpublic/coremediabuffer.c:
+ * sys/applemedia-nonpublic/coremediabuffer.h:
+ * sys/applemedia-nonpublic/coremediactx.c:
+ * sys/applemedia-nonpublic/coremediactx.h:
+ * sys/applemedia-nonpublic/corevideobuffer.c:
+ * sys/applemedia-nonpublic/corevideobuffer.h:
+ * sys/applemedia-nonpublic/cvapi.c:
+ * sys/applemedia-nonpublic/cvapi.h:
+ * sys/applemedia-nonpublic/dynapi-internal.h:
+ * sys/applemedia-nonpublic/dynapi.c:
+ * sys/applemedia-nonpublic/dynapi.h:
+ * sys/applemedia-nonpublic/mioapi.c:
+ * sys/applemedia-nonpublic/mioapi.h:
+ * sys/applemedia-nonpublic/miovideodevice.c:
+ * sys/applemedia-nonpublic/miovideodevice.h:
+ * sys/applemedia-nonpublic/miovideosrc.c:
+ * sys/applemedia-nonpublic/miovideosrc.h:
+ * sys/applemedia-nonpublic/mtapi.c:
+ * sys/applemedia-nonpublic/mtapi.h:
+ * sys/applemedia-nonpublic/plugin.m:
+ applemedia-nonpublic: remove bitrotten plugin that's no longer needed
+
+2016-08-19 19:46:24 +1000 Florian Zwoch <fzwoch@gmail.com>
+
+ * sys/applemedia/avfvideosrc.m:
+ avfvideosrc: account for retina displays when capturing screens
+ Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=770030
+
+2016-08-19 17:11:13 +1000 Matthew Waters <matthew@centricular.com>
+
+ * configure.ac:
+ build: bump graphene requirement to 1.4
+
+2016-08-19 15:35:49 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gstgltransformation.c:
+ * ext/gl/gstgltransformation.h:
+ gltransformation: rewrite the inverse transformation logic
+ It now returns the correct values for both orthographic and perspective
+ projections and takes into account the aspect ratio of the video, handles
+ the Y-flipping in GL and by us and uses some more helpers from graphene.
+
+2016-07-01 16:18:55 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglwindow.c:
+ glwindow: marshal gst_gl_window_resize through the window loop
+ saves having every caller do it themselves.
+
+2016-06-30 23:06:43 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/wayland/wayland_event_source.c:
+ gl/wayland: use multi-threaded safe event wayland API
+ Multiple threads may be accessing the wayland fd at the same time which
+ requires the use of special wayland API to deal with to ensure nobody
+ will steal reads and cause a stall for anyone else.
+
+2016-07-01 00:15:55 +1000 Matthew Waters <matthew@centricular.com>
+
+ * tests/examples/gl/gtk/fxtest/fxtest.c:
+ gl/examples/fxtest: fix up for wayland support
+ - Pass the wayland display to gst
+ - Redrawing on resize is no longer needed.
+
+2016-08-17 16:21:34 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/parsechannels.c:
+ dvb/parsechannels: warn on ignored key/value pairs
+ Otherwise at runtine, users get the misleading
+ parsing-OK message with no info on, for example,
+ properties that failed to map because of a typo.
+
+2016-08-16 15:35:39 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/parsechannels.c:
+ dvb/parsechannels: handle problems parsing dvbv5 config keys
+
+2016-08-18 15:28:33 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/mplex/gstmplex.cc:
+ mplex: Don't start task (yet/again) on pad release if we're in READY or NULL
+ Fixes spurious segfault in unit test, where the task was started again during
+ shutdown when all pads were removed... and was then still running while the
+ element was finalized.
+
+2016-08-18 13:21:54 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ dashdemux: In KEY_UNITS trick mode, download all I-frames and not only IDR
+
+2016-08-08 17:54:46 +0200 Carlos Rafael Giani <dv@pseudoterminal.org>
+
+ * tests/check/elements/.gitignore:
+ * tests/check/elements/rawaudioparse.c:
+ * tests/check/elements/rawvideoparse.c:
+ rawparse: Fix and extend unit tests
+ * Add caps change test to unit tests
+ * Cleanup leftover buffers after each unit test
+ * Add missing rawvideoparse entry in .gitignore
+ https://bugzilla.gnome.org/show_bug.cgi?id=769637
+
+2016-08-16 09:31:40 +0200 Carlos Rafael Giani <dv@pseudoterminal.org>
+
+ * gst/rawparse/gstrawvideoparse.c:
+ * gst/rawparse/gstrawvideoparse.h:
+ * tests/check/elements/rawvideoparse.c:
+ rawvideoparse: Compute plane offsets & strides if no custom ones are set
+ This is useful to ensure that the offsets and strides are computed if
+ only width, height, format etc. in the property config are set.
+ https://bugzilla.gnome.org/show_bug.cgi?id=769797
+
+2016-08-16 18:46:49 +0300 Sergei Saveliev <saveliev.sergei@gmail.com>
+
+ * sys/applemedia/avfassetsrc.m:
+ avfassetsrc: Don't escape the URI another time in another location too
+ One location was forgotten in a913a0b9679dd58945ad105d240db45595fdaba6
+ https://bugzilla.gnome.org/show_bug.cgi?id=767492
+
+2016-08-16 20:33:21 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/egl/gstegl.h:
+ gl/egl: fix inverted typedef
+ 2b6841d had an inverted typedef defining ginptr and EGLAttrib. Fix that.
+
+2016-08-16 10:37:28 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/timidity/gstwildmidi.c:
+ wildmidi: Fix compilation with wildmidi 0.4
+ Old versions used char* for the data, new versions use int8_t*. They're often
+ not the same and differ in signedness.
+
+2016-08-16 16:51:02 +1000 Matthew Waters <matthew@centricular.com>
+
+ * configure.ac:
+ * gst-libs/gst/gl/egl/gstegl.h:
+ gl/build: add configure check for possibly missing EGLAttrib
+ Fixes the build on older android targets.
+
+2016-07-13 17:15:44 +0800 Song Bing <bing.song@nxp.com>
+
+ * gst-libs/gst/gl/egl/gsteglimage.c:
+ * gst-libs/gst/gl/egl/gstglcontext_egl.c:
+ * gst-libs/gst/gl/egl/gstglcontext_egl.h:
+ * gst-libs/gst/gl/egl/gstglmemoryegl.c:
+ gl/egl/dmabuf: Wrong attribute list type for EGL 1.5
+ For EGL 1.5 spec, the attribute list type should be EGLAttrib.
+ https://bugzilla.gnome.org/show_bug.cgi?id=768602
+
+2016-08-15 16:14:25 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst-libs/gst/gl/gstglcontext.c:
+ glcontext: fix race joining thread on finalize
+ https://bugzilla.gnome.org/show_bug.cgi?id=769939
+
+2016-08-16 00:40:53 +1000 Jan Schmidt <jan@centricular.com>
+
+ * ext/qt/gstqtglutility.cc:
+ qt: Use wglShareLists() workaround unconditionally.
+ Sometimes wglCreateContextAttribsARB() exists, but
+ isn't functional (some Intel drivers), so it's
+ easiest to do the workaround unconditionally.
+
+2016-08-15 16:37:44 +1000 Jan Schmidt <jan@centricular.com>
+
+ * sys/winks/gstksvideodevice.c:
+ * sys/winks/gstksvideodevice.h:
+ * sys/winks/gstksvideosrc.c:
+ * sys/winks/ksvideohelpers.c:
+ * sys/winks/ksvideohelpers.h:
+ winks: Fix RGB frame flipping and postprocessing
+ Uncompressed RGB frames can be (usually are) bottom-up
+ layout in DirectShow, and the code to flip them wasn't
+ properly ported from 0.10. Fix it.
+ Fix post-processing of RGB buffers. We need a writable
+ buffer, but the requests pool is holding an extra ref.
+ This could use more fixing to use a buffer pool
+
+2016-08-12 22:17:25 +1000 Jan Schmidt <jan@centricular.com>
+
+ * sys/winks/gstksvideosrc.c:
+ winks: Give the ksvideosrc PRIMARY rank
+ It's the primary video source on Windows, so give it a
+ rank for autoplugging by camerabin and friends
+
+2016-08-12 22:16:33 +1000 Jan Schmidt <jan@centricular.com>
+
+ * sys/winks/ksvideohelpers.c:
+ winks: Fix swapped RGBx/RGB caps mapping, and endianness.
+ The RGBx and RGB format mappings were reversed.
+ What Windows calls RGB are laid out as BGR in our parlance, so
+ switch that too
+
+2016-08-08 13:41:14 +1000 Jan Schmidt <jan@centricular.com>
+
+ * ext/qt/gstqtglutility.cc:
+ qt: Move debug statement to after the category init
+ Don't output debug to an uninitialised debug category.
+
+2016-08-11 12:19:59 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * tests/check/Makefile.am:
+ dashdemux: Disable unit test for the time being
+ It uses random data streams but dashdemux nowadays actually looks into the
+ streams and doesn't like randomness very much. The tests should probably just
+ become validate tests on real streams.
+ https://bugzilla.gnome.org/show_bug.cgi?id=769553
+
+2016-08-11 12:11:22 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ Revert "Revert "dashdemux: When doing SIDX seeking, return instead of overriding the timestamp with 0 from the MPD seeking method""
+ This reverts commit aea2c13fc1672a7260679d706d0a084a34ba7531.
+
+2016-08-04 14:47:41 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ dashdemux: When doing chunked downloading on SIDX, clip requests on the SIDX entry boundaries
+ https://bugzilla.gnome.org/show_bug.cgi?id=741104
+
+2016-08-02 08:47:55 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ * ext/dash/gstdashdemux.h:
+ dashdemux: Collect average moof and first sync sample sizes
+ And always request those in the beginning so that ideally we get the moof and
+ the first sync sample all together with the first HTTP request.
+ https://bugzilla.gnome.org/show_bug.cgi?id=741104
+
+2016-08-02 08:35:26 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ * ext/dash/gstdashdemux.h:
+ dashdemux: Download any sync-sample following the moof directly in key-units only mode
+ We don't have to do yet another additional request but can just download the
+ data directly.
+ Also unify the key-unit only mode buffer pushing and extract it into its own
+ function now that it became more complicated.
+ https://bugzilla.gnome.org/show_bug.cgi?id=741104
+
+2016-07-29 12:50:58 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ dashdemux: If a fragment contains no sync samples, disable key-unit mode
+ https://bugzilla.gnome.org/show_bug.cgi?id=741104
+
+2016-07-29 12:32:50 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ * ext/dash/gstdashdemux.h:
+ dashdemux: Remember if for a stream we could do key-units only mode
+ This makes sure we don't even try going into that mode if we previously saw
+ that the stream does not have the suitable metadata.
+ https://bugzilla.gnome.org/show_bug.cgi?id=741104
+
+2016-07-29 11:54:21 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ dashdemux: Also allow key-unit only mode if (some) sample flags are given by trex but we can still find sync frames
+ https://bugzilla.gnome.org/show_bug.cgi?id=741104
+
+2016-07-12 20:09:52 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ dashdemux: Use chunked downloading for the moof in KEY_UNITS mode
+ Allows us to reuse the HTTP connection and reduce latencies a lot.
+ https://bugzilla.gnome.org/show_bug.cgi?id=741104
+
+2016-07-12 10:22:43 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.h:
+ adaptivedemux: Add API for allowing subclasses to download URLs in chunks
+ This allows to gradually download part of a fragment when the final size is
+ not known and only a part of it should be downloaded. For example when only
+ the moof should be parsed and/or a single keyframe should be downloaded.
+ https://bugzilla.gnome.org/show_bug.cgi?id=741104
+
+2016-06-01 14:02:11 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ dashdemux: Mark every first buffer of moov, sidx, moof and mdat as DISCONT in keyframe-only mode
+ We need to mark every first buffer of a key unit as discont, and also every
+ first buffer of a moov and moof. This ensures that qtdemux takes note of our
+ buffer offsets for each of those buffers instead of keeping track of them
+ itself from the first buffer. We need offsets to be consistent between moof
+ and mdat
+ https://bugzilla.gnome.org/show_bug.cgi?id=741104
+
+2016-07-28 10:53:49 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ dashdemux: Only enable key-unit trick mode for video streams
+ https://bugzilla.gnome.org/show_bug.cgi?id=741104
+
+2016-05-31 15:12:49 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ dashdemux: Only do keyframe-only playback if the corresponding seek flag is given
+ https://bugzilla.gnome.org/show_bug.cgi?id=741104
+
+2016-05-30 12:09:34 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ * ext/dash/gstdashdemux.h:
+ dashdemux: Implement downloading of only sync samples
+ https://bugzilla.gnome.org/show_bug.cgi?id=741104
+
+2016-05-30 11:15:03 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ * ext/dash/gstdashdemux.h:
+ dashdemux: Store parsed moof and extract offsets of sync samples in it
+ https://bugzilla.gnome.org/show_bug.cgi?id=741104
+
+2016-05-02 17:11:31 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * tests/check/Makefile.am:
+ * tests/check/elements/dash_isoff.c:
+ * tests/check/elements/dash_isoff.h:
+ dash: Add test for parsing a moof box
+ https://bugzilla.gnome.org/show_bug.cgi?id=741104
+
+2016-05-02 16:03:56 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * tests/check/Makefile.am:
+ * tests/check/elements/dash_isoff.c:
+ dash: Add unit test for ISOBFF box header parsing
+ https://bugzilla.gnome.org/show_bug.cgi?id=741104
+
+2016-04-07 21:33:51 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ * ext/dash/gstisoff.c:
+ * ext/dash/gstisoff.h:
+ dashdemux: Implement parsing of moof box
+ https://bugzilla.gnome.org/show_bug.cgi?id=741104
+
+2016-04-07 13:34:57 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstisoff.c:
+ dashdemux: Move code around to keep all sidx related functions together
+ https://bugzilla.gnome.org/show_bug.cgi?id=741104
+
+2016-04-07 12:57:13 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ * ext/dash/gstisoff.c:
+ * ext/dash/gstisoff.h:
+ dashdemux: Store box fourccs in the header at a central place
+ https://bugzilla.gnome.org/show_bug.cgi?id=741104
+
+2016-03-28 13:45:36 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ * ext/dash/gstdashdemux.h:
+ dashdemux: Implement parsing of ISOBMFF boxes
+ https://bugzilla.gnome.org/show_bug.cgi?id=741104
+
+2016-03-16 13:48:09 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstisoff.c:
+ * ext/dash/gstisoff.h:
+ dash: Add helper for parsing box headers
+ https://bugzilla.gnome.org/show_bug.cgi?id=741104
+
+2016-08-10 22:50:12 +0000 xlazom00 <xlazom00@gmail.com>
+
+ * ext/x265/gstx265enc.c:
+ x265enc: Enable aspect ratio
+ x265 encoder need aspectRatioIdc == X265_EXTENDED_SAR if we want to use
+ sarWidth/sarHeight
+ https://bugzilla.gnome.org/show_bug.cgi?id=769716
+
+2016-08-08 13:10:12 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * ext/openjpeg/gstopenjpegenc.c:
+ openjpegenc: use the corrent enumeration
+ Fixes the following error when building in osx.
+ error: implicit conversion from enumeration type
+ 'GstJPEG2000Colorspace' to different enumeration type
+ 'GstJPEG2000Sampling'
+
+2016-08-08 11:28:44 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * sys/androidmedia/gstamc.c:
+ amc: Fix call to realloc() to allocate the correct size of items
+
+2016-08-07 20:53:30 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * configure.ac:
+ * ext/Makefile.am:
+ fdkaac: actually build and dist
+
+2016-08-06 23:31:23 +0000 xlazom00 <xlazom00@gmail.com>
+
+ * ext/hls/Makefile.am:
+ * gst/timecode/Makefile.am:
+ hls, timecode: fix linking
+ https://bugzilla.gnome.org//show_bug.cgi?id=769587
+
+2016-08-07 12:20:16 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/fdkaac/Makefile.am:
+ * ext/fdkaac/gstfdkaacdec.c:
+ * ext/fdkaac/gstfdkaacdec.h:
+ * ext/fdkaac/plugin.c:
+ fdkaac: Add FDK AAC based decoder element
+ Missing is support for error concealment, etc.
+
+2016-08-07 11:39:07 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/fdkaac/Makefile.am:
+ * ext/fdkaac/gstfdkaacenc.c:
+ * ext/fdkaac/gstfdkaacenc.h:
+ * ext/fdkaac/plugin.c:
+ fdkaac: Add FDK AAC based encoder element
+ This currently only handles LC profile and exposes a bitrate property, but
+ handles up to 7.1 channels. See TODO list for missing features.
+
+2016-08-07 08:51:06 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * configure.ac:
+ * ext/fdkaac/Makefile.am:
+ * ext/fdkaac/plugin.c:
+ fdkaac: Initial plugin skeleton
+
+2016-08-01 11:45:30 +0200 Bernhard Miller <bernhard.miller@streamunlimited.com>
+
+ * gst/aiff/aiffparse.c:
+ aiffparse: keep end_offset when seeking
+ After seeking in aiff files the information about the data end offset is
+ discarded, leading to audio artifacts with metadata chunks at the end of
+ a file.
+ This patch retains the end offset information after a seek event.
+ https://bugzilla.gnome.org//show_bug.cgi?id=769376
+
+2016-08-06 16:15:33 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * gst/dvdspu/gstdvdspu.c:
+ dvdspu: don't crash if video frame could not be mapped
+ As might happen with e.g. vaapi and the test file from
+ https://bugzilla.gnome.org/show_bug.cgi?id=736227
+
+2016-08-05 09:16:58 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * ext/dash/gstdashdemux.c:
+ Revert "dashdemux: When doing SIDX seeking, return instead of overriding the timestamp with 0 from the MPD seeking method"
+ This reverts commit 947656cfd22b75f914d5abe0af82396787f67564.
+ This makes all dash seeking tests fail. Needs more testing to fully understand
+ what's going wrong. Revert ok'd by Sebastian
+
+2016-05-31 19:21:17 +0300 Vivia Nikolaidou <vivia@toolsonair.com>
+
+ * gst/timecode/Makefile.am:
+ * gst/timecode/gsttimecodewait.c:
+ * gst/timecode/gsttimecodewait.h:
+ * gst/timecode/plugin.c:
+ timecodewait: New element to wait for a specific timecode
+ timecodewait receives a timecode as an argument (either as string or as
+ GstVideoTimeCode - one is gst-launch-friendly and the other is code-friendly),
+ and it will drop all audio and video buffers until that timecode has been
+ reached.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766419
+
+2016-05-20 18:17:52 +0300 Vivia Nikolaidou <vivia@toolsonair.com>
+
+ * configure.ac:
+ * gst/timecode/Makefile.am:
+ * gst/timecode/gsttimecodestamper.c:
+ * gst/timecode/gsttimecodestamper.h:
+ * gst/timecode/plugin.c:
+ timecodestamper: New element to attach SMPTE timecode to buffers
+ The timecodestamper element attaches a SMPTE timecode to each video buffer.
+ This timecode corresponds to the current stream time.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766419
+
+2016-05-15 17:25:44 +0300 Vivia Nikolaidou <vivia@toolsonair.com>
+
+ * sys/decklink/gstdecklinkvideosink.cpp:
+ * sys/decklink/gstdecklinkvideosink.h:
+ decklinkvideosink: Add support for GstVideoTimeCode
+ The timecode will be fetched from the video buffer and outputted on the
+ decklink video sink.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766419
+
+2016-05-15 16:04:14 +0300 Vivia Nikolaidou <vivia@toolsonair.com>
+
+ * sys/decklink/gstdecklink.cpp:
+ * sys/decklink/gstdecklink.h:
+ * sys/decklink/gstdecklinkvideosrc.cpp:
+ * sys/decklink/gstdecklinkvideosrc.h:
+ decklinkvideosrc: Add support for GstVideoTimeCode
+ The timecode will be fetched from the decklink source and attached to the
+ video buffer.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766419
+
+2016-08-04 23:14:41 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglcolorconvert.c:
+ glcolorconvert: add missing rgb16 and bgr16 video formats in switch
+ Fixes an assertion that code should not be reached
+ https://bugzilla.gnome.org/show_bug.cgi?id=769462
+
+2016-08-04 22:28:13 +1000 Jan Schmidt <jan@centricular.com>
+
+ * ext/hls/gsthlsdemux.c:
+ hls: Avoid potential NULL pointer dereference.
+ Fixes CID 1364753
+
+2016-08-04 22:21:16 +1000 Jan Schmidt <jan@centricular.com>
+
+ * ext/hls/m3u8.c:
+ hls: Avoid coverity warning about access off the end of an array.
+ Fixes CID 1364755
+
+2016-08-04 14:42:34 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ dashdemux: When doing SIDX seeking, return instead of overriding the timestamp with 0 from the MPD seeking method
+ We don't need to call the latter at all as we're definitely in this period and
+ the segment is selected via the SIDX.
+ This is especially important when doing SNAP seeks, as otherwise we would
+ always start from the beginning of the period (usually 0) again.
+
+2016-08-04 11:08:30 +0100 Luis de Bethencourt <luisbg@osg.samsung.com>
+
+ * ext/hls/m3u8.c:
+ hls: m3u8: remove impossible condition
+ After the check in line 1,111, media->uri can't be NULL. So the two checks
+ for GST_HLS_MEDIA_TYPE_CLOSED_CAPTIONS are the same, removing the redundant
+ one which goes to cc_unsupported.
+ CID 1364752
+
+2016-08-04 04:53:50 +1000 Jan Schmidt <jan@centricular.com>
+
+ * ext/hls/gsthlsdemux.c:
+ hlsdemux: Don't output pending data after error
+ If the last_ret status is not OK, skip output
+ of any pending PCR scan buffer, similarly to how
+ the pending decryption buffer is handled above.
+
+2016-08-04 04:29:38 +1000 Jan Schmidt <jan@centricular.com>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ adaptivedemux: On EOS, handle it before waking download loop
+ Otherwise, if the download loop wakes too quickly, it
+ might miss the last_ret value update from the processing
+ thread and loop again.
+
+2016-08-04 01:51:37 +1000 Jan Schmidt <jan@centricular.com>
+
+ * ext/hls/gsthlsdemux-util.c:
+ hlsdemux: Include config.h and add header in utils
+ In gsthlsdemux-util.c, include config.h before any
+ other headers, and add a copyright / license header.
+
+2016-07-13 11:02:23 +0200 Edward Hervey <edward@centricular.com>
+
+ * gst/mpegtsdemux/tsdemux.c:
+ tsdemux: Fix draining on wrong programs
+ When draining a program, we might send a newsegment event on the pads
+ that are going to be removed (and then the pending data).
+ In order to do that, calculate_and_push_newsegment() needs to know
+ what list of streams it should take into account (instead of blindly
+ using the current one).
+ All callers to calculate_and_push_newsegment() and push_pending_data()
+ can now specify the program on which to act (or NULL for the default
+ one).
+
+2016-07-12 15:58:40 +0200 Edward Hervey <edward@centricular.com>
+
+ * gst/mpegtsdemux/tsdemux.c:
+ tsdemux: Fix GAP synchronization without a valid PCR PID
+ For streams that don't have a valid PCR PID, we just use the latest
+ PTS from any given stream.
+ https://bugzilla.gnome.org/show_bug.cgi?id=608148
+
+2016-05-31 13:09:43 +0200 Michael Olbrich <m.olbrich@pengutronix.de>
+
+ * gst/mpegtsdemux/mpegtspacketizer.c:
+ tsdemux: handle pcr_pid == 0x1fff
+ Streams without PCR make senses in HLS, where the playlist timestamps
+ can be used to seek or calculate the duration.
+ https://bugzilla.gnome.org/show_bug.cgi?id=608148
+
+2015-05-10 20:10:49 +0200 Arnaud Vrac <avrac@freebox.fr>
+
+ * gst/mpegtsdemux/mpegtsbase.c:
+ mpegtsdemux: do not abort playback when no PCR were found during initial scan
+ Seeking will not be possible in those streams but at least the can be
+ played. Note scanning is only done when tsdemux is configured in pull mode.
+ https://bugzilla.gnome.org/show_bug.cgi?id=608148
+
+2015-05-09 15:52:22 +0200 Arnaud Vrac <avrac@freebox.fr>
+
+ * gst/mpegtsdemux/tsdemux.c:
+ mpegtsdemux: only wait for PCR when PCR pid is set
+ Streams without PCR make senses in HLS, where the playlist timestamps
+ can be used to seek or calculate the duration.
+ https://bugzilla.gnome.org/show_bug.cgi?id=608148
+
+2016-08-03 04:18:18 +1000 Jan Schmidt <jan@centricular.com>
+
+ * ext/hls/gsthlsdemux.c:
+ hls: Fix compiler warning for possibly uninit variable
+
+2016-07-28 14:22:02 +0200 Michael Olbrich <m.olbrich@pengutronix.de>
+
+ * ext/hls/gsthlsdemux.c:
+ hlsdemux: seek all streams
+
+2016-05-25 11:23:59 +0200 Michael Olbrich <m.olbrich@pengutronix.de>
+
+ * ext/hls/gsthlsdemux.c:
+ hlsdemux: simplify gst_hls_demux_seek()
+ Don't initialize current_sequence. It is always overwritten in the walk
+ loop.
+
+2016-05-24 15:23:12 +0200 Michael Olbrich <m.olbrich@pengutronix.de>
+
+ * ext/hls/gsthlsdemux.c:
+ hlsdemux: don't download the last fragment when seeking beyond the end of the track
+ It's not used anyways.
+
+2016-07-12 23:05:55 +1000 Jan Schmidt <jan@centricular.com>
+
+ * ext/hls/gsthlsdemux-util.c:
+ * ext/hls/gsthlsdemux.c:
+ * ext/hls/gsthlsdemux.h:
+ hlsdemux: Add support for ID3 tag parsing
+ Parse start PTS out of the ID3 tags in
+ audio fragments. Informational only for now.
+
+2016-02-24 16:57:16 +1100 Jan Schmidt <jan@centricular.com>
+
+ * ext/hls/Makefile.am:
+ * ext/hls/gsthlsdemux-util.c:
+ * ext/hls/gsthlsdemux.c:
+ * ext/hls/gsthlsdemux.h:
+ hlsdemux: Do some reading and dumping of PCRs
+ Read PCRs out of the MPEG-TS stream in a basic way
+ and (for now) just log them
+
+2016-03-05 03:08:55 +1100 Jan Schmidt <jan@centricular.com>
+
+ * ext/hls/gsthlsdemux.c:
+ * ext/hls/gsthlsdemux.h:
+ hlsdemux: Only use the primary stream for bitrate selection.
+ When playing alternate rendition auxilliary streams, ignore
+ them in bitrate measurement (for now).
+
+2016-07-15 16:24:17 +1000 Jan Schmidt <jan@centricular.com>
+
+ * ext/hls/gsthlsdemux.c:
+ hlsdemux: Only select video and audio streams by default
+ Ignore subtitle streams for now, because the
+ different fragment duration causes problems
+ switching bitrates w/ decodebin2 group draining.
+
+2016-02-25 01:58:25 +1100 Jan Schmidt <jan@centricular.com>
+
+ * ext/hls/gsthlsdemux.c:
+ * ext/hls/gsthlsdemux.h:
+ hlsdemux: Publish all media for alternate renditions.
+ Create an output stream for each media when alternate renditions
+ are present. Update the manifests for all those streams, and
+ make sure that typefinding is still done for files smaller than 2KB
+ such as small WebVTT files.
+
+2016-03-08 01:24:20 +1100 Jan Schmidt <jan@centricular.com>
+
+ * ext/hls/gsthlsdemux.c:
+ hlsdemux: Adjust downstream buffer offsets
+ When fetching a byte-region from a server resource,
+ adjust the downstream buffer offsets so that downstream
+ doesn't know. This is because id3demux insists on the
+ first offset being 0. Later we might strip ID3 headers
+ entirely and this will be unneeded.
+
+2016-03-09 03:07:22 +1100 Jan Schmidt <jan@centricular.com>
+
+ * ext/hls/gsthlsdemux.c:
+ * ext/hls/m3u8.c:
+ * ext/hls/m3u8.h:
+ hlsdemux: Choose the default variant and track it when updating
+ Modify playlist updating to track information across updates
+ better, although still hackish.
+ When connection_speed == 0, choose the default variant
+ not the first one in the (now sorted) variant list, as that
+ will have the lowest bitrate.
+
+2015-12-05 11:12:33 +0000 Tim-Philipp Müller <tim@centricular.com>
+
+ * ext/hls/gsthlsdemux.c:
+ * ext/hls/gsthlsdemux.h:
+ * ext/hls/m3u8.c:
+ * ext/hls/m3u8.h:
+ * tests/check/elements/hlsdemux_m3u8.c:
+ hlsdemux: move variant list handling over to new master playlist code
+ Adapt hlsdemux for the m3u8 playlist changes.
+
+2015-11-27 19:26:02 +0000 Tim-Philipp Müller <tim@centricular.com>
+
+ * ext/hls/gsthlsdemux.c:
+ * ext/hls/gsthlsdemux.h:
+ * ext/hls/m3u8.c:
+ * ext/hls/m3u8.h:
+ hls: m3u8: Rework m3u8 parsing and storage.
+ Make M3U8 and GstM3U8MediaFile refcounted. The contents
+ of it and GstM3U8MediaFile are pretty much immutable
+ already, but if we make it refcounted we can just
+ return a ref to the media file from _get_next_fragment()
+ instead of copying over all fields one-by-one, and then
+ copying them all into the adaptive stream structure fields again.
+ Move state from client into m3u8 structure. This will
+ be useful later when we'll have multiple media playlists
+ being streamed at the same time, as will be the case with
+ alternative renditions.
+ This has the downside that we need to copy over some
+ state when we switch between variant streams.
+ The GstM3U8Client structure is gone, and main/current
+ lists are not directly in hlsdemux. hlsdemux had as
+ many CLIENT_LOCK/UNLOCK as the m3u8 code anyway...
+
+2016-07-27 09:28:23 +0800 Haihua Hu <jared.hu@nxp.com>
+
+ * tests/examples/qt/qmlsink/.gitignore:
+ * tests/examples/qt/qmlsink/main.cpp:
+ * tests/examples/qt/qmlsink/main.qml:
+ * tests/examples/qt/qmlsink/play.pro:
+ * tests/examples/qt/qmlsink/qml.qrc:
+ * tests/examples/qt/qmlsrc/.gitignore:
+ * tests/examples/qt/qmlsrc/grabqml.pro:
+ * tests/examples/qt/qmlsrc/main.cpp:
+ * tests/examples/qt/qmlsrc/main.qml:
+ * tests/examples/qt/qmlsrc/qml.qrc:
+ qmlglsrc: Add qmlglsrc unit test example
+ https://bugzilla.gnome.org/show_bug.cgi?id=768160
+
+2016-07-27 08:16:47 +0800 Haihua Hu <jared.hu@nxp.com>
+
+ * ext/qt/Makefile.am:
+ * ext/qt/gstplugin.cc:
+ * ext/qt/gstqtglutility.cc:
+ * ext/qt/gstqtglutility.h:
+ * ext/qt/gstqtsrc.cc:
+ * ext/qt/gstqtsrc.h:
+ * ext/qt/qtitem.cc:
+ * ext/qt/qtwindow.cc:
+ * ext/qt/qtwindow.h:
+ qt: implement qmlglsrc for qml view grab
+ [Matthew Waters]: gst-indent sources
+ https://bugzilla.gnome.org/show_bug.cgi?id=768160
+
+2016-07-27 10:55:01 +0800 Haihua Hu <jared.hu@nxp.com>
+
+ * gst-libs/gst/gl/x11/gstglwindow_x11.c:
+ glwindow: Fix glimagesink cannot show frame when connect to qmlglsrc
+ When connect to qmlglsrc, x11 event loop will be replace by qt event loop
+ which will cause the window cannot receive event from xserver, such as resize
+ https://bugzilla.gnome.org/show_bug.cgi?id=768160
+
+2016-08-02 17:21:20 +0900 Hyunjun Ko <zzoon@igalia.com>
+
+ * gst-libs/gst/gl/gstglupload.c:
+ glupload: Use bufferpool to allocate new buffer in GLTextureUploadMeta
+ To improve performace of upload with GLTextureUploadMeta,
+ use bufferpool instead of allocating new buffer every time.
+ https://bugzilla.gnome.org/show_bug.cgi?id=769293
+
+2016-07-27 14:48:50 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglwindow.c:
+ glwindow: move unsetting queue_resize to _resize() instead of _draw()
+ Makes infinitely more sense and implementation were expecting that behaviour
+ anyway and would enter a resize, draw, resize, draw, ... cycle instead of only
+ resizing once.
+
+2016-08-03 09:14:07 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ adaptivedemux: Never ever hold the manifest lock while changing the source element state
+ Otherwise we will deadlock in various situations that take the manifest lock
+ from the streaming thread or when shutting down or ...
+
+2016-08-02 17:07:37 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * tests/check/elements/aiffparse.c:
+ aiffparse: In PUSH mode we will never get the ID3 tags as they are at the end of the file
+ This previously did not fail as before we didn't get any tags at all in PUSH
+ mode, now we get the bitrates.
+
+2016-08-02 13:48:43 +0200 Carlos Rafael Giani <dv@pseudoterminal.org>
+
+ * gst/aiff/Makefile.am:
+ * gst/aiff/aiffparse.c:
+ aiffparse: Add tags for container format and bitrate
+ The bitrate is added to help downstream elements (like uridecodebin)
+ figure out a proper network buffer size
+ https://bugzilla.gnome.org/show_bug.cgi?id=769389
+
+2016-01-20 16:42:24 +0000 Alex Ashley <bugzilla@ashley-family.net>
+
+ * tests/check/elements/dash_mpd.c:
+ tests: dashdemux: add test for gst_mpd_client_get_maximum_segment_duration
+ Add a test of the gst_mpd_client_get_maximum_segment_duration() function
+ to check that it first checks the MPD@maxSegmentDuration and then falls
+ back to checking all of the segment durations.
+ https://bugzilla.gnome.org/show_bug.cgi?id=753751
+
+2016-02-24 15:54:54 +0000 Alex Ashley <bugzilla@ashley-family.net>
+
+ * ext/dash/gstdashdemux.c:
+ * ext/dash/gstmpdparser.c:
+ * ext/dash/gstmpdparser.h:
+ dashdemux: include segment duration when calculating seek range
+ The gst_dash_demux_get_live_seek_range () function returns a stop value
+ that is beyond the available range. The functions
+ gst_mpd_client_check_time_position() and
+ gst_mpd_client_get_next_segment_availability_end_time() in
+ gstmpdparser.c include the segment duration when checking if a segment
+ is available. The gst_dash_demux_get_live_seek_range() function
+ in gstdashdemux.c ignores the segment duration.
+ According to the DASH specification, if maxSegmentDuration is not present,
+ then the maximum Segment duration is the maximum duration of any Segment
+ documented in the MPD.
+ https://bugzilla.gnome.org/show_bug.cgi?id=753751
+
+2016-02-24 15:52:41 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.h:
+ adaptivedemux: retry once on 4xx/5xx in certain conditions
+ This helps catch those 404 server errors in live streams when
+ seeking to the very beginning, as the server will handle a
+ request with some delay, which can cause it to drop the fragment
+ before sending it.
+ https://bugzilla.gnome.org/show_bug.cgi?id=753751
+
+2016-02-24 15:47:09 +0000 Alex Ashley <bugzilla@ashley-family.net>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ adaptivedemux: expose HTTP status
+ To allow adaptivedemux to make retry decisions, it needs to know what
+ sort of HTTP error has occurred. For example, the retry logic for a
+ 410 error is different from a 504 error.
+ https://bugzilla.gnome.org/show_bug.cgi?id=753751
+
+2016-03-07 17:04:33 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ adaptivedemux: allow seeking before start in live streams
+ Some derived classes (at least dashdemux) expose a seeking range
+ based on wall clock. This means that a subsequent seek to the start
+ of this range will be before the allowed range.
+ To solve this, seeks without the ACCURATE flag are allowed to seek
+ before the start for live streams, in which case the segment is
+ shifted to start at the start of the new seek range. If there is
+ an end position, is is shifted too, to keep the duration constant.
+ https://bugzilla.gnome.org/show_bug.cgi?id=753751
+
+2016-08-01 14:12:35 +0800 Haihua Hu <jared.hu@nxp.com>
+
+ * ext/gl/gstglimagesink.c:
+ glimagesink: Fix horizontal/vertical flip matrizes
+ They were swapped.
+ https://bugzilla.gnome.org/show_bug.cgi?id=769371
+
+2016-07-29 16:32:22 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com>
+
+ * gst/videoparsers/gsth264parse.c:
+ videoparsers: h264: Add more scalable profiles to the profile list
+ Adding Scalable Constrained High (G.10.1.2.1) and
+ Scalable High Intra(G.10.1.3) profiles to the profile list
+ https://bugzilla.gnome.org/show_bug.cgi?id=769303
+
+2016-08-01 10:30:29 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * sys/androidmedia/gst-android-hardware-camera.c:
+ * sys/androidmedia/gst-android-hardware-sensor.c:
+ * sys/androidmedia/gstahssrc.c:
+ androidmedia: Run gst-indent over everything once again
+
+2016-08-01 10:28:26 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * sys/androidmedia/gstamc.c:
+ amc: If we find multiple codecs with the same name, just merge them
+ On the ODroid C1+ the H265 and H264 have the same name but are listed as two
+ different codecs. We have to handle them as the same one that supports both,
+ as otherwise we will register the same GType name twice which fails and we
+ then only have H265 support and not H264 support.
+
+2016-08-01 10:15:04 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * sys/androidmedia/gstamc.c:
+ amc: Use a GQueue for O(1) append instead of a GList
+
+2016-07-29 12:31:38 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ adaptivedemux: Also call reset() in READY->PAUSED
+ This allows subclasses to have initialization code in a single place.
+
+2016-07-29 10:49:26 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst/rawparse/gstrawaudioparse.c:
+ rawaudioparse: Use G_GINT64_MODIFIER for portability
+ https://bugzilla.gnome.org/show_bug.cgi?id=769295
+
+2016-07-29 10:07:23 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst/rawparse/gstunalignedaudioparse.c:
+ unalignedaudioparse: Fix element factory name of inner parser
+
+2016-07-29 08:54:00 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * sys/androidmedia/gstamc.c:
+ amc: Print generated raw/encoded caps in debug logs
+
+2016-07-28 11:27:29 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ * ext/dash/gstdashdemux.h:
+ dashdemux: Skip audio streams if TRICKMODE_NO_AUDIO is given in the seek event
+ We just don't expose pads for audio streams, or even download them.
+
+2016-07-28 11:16:24 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ dashdemux: Reset number of subtitle streams counter on reset() too
+ Otherwise we will continue increasing forever the number of subtitle streams
+ when reusing the element for another DASH manifest.
+
+2016-07-26 17:01:55 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * tests/check/pipelines/simple-launch-lines.c:
+ tests: fix simple-launch-lines when jpeg lib isn't present
+ JPEG detection in configure.ac defines HAVE_JPEG to 0 if the
+ jpeg lib isn't found, rather then not defining it.
+ https://bugzilla.gnome.org/show_bug.cgi?id=769197
+
+2016-07-25 17:55:24 +0200 Carlos Rafael Giani <dv@pseudoterminal.org>
+
+ * docs/plugins/gst-plugins-bad-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-bad-plugins-sections.txt:
+ * docs/plugins/inspect/plugin-rawparse.xml:
+ docs: Update rawparser documentation
+ Signed-off-by: Carlos Rafael Giani <dv@pseudoterminal.org>
+ https://bugzilla.gnome.org/show_bug.cgi?id=767011
+
+2016-07-25 17:54:09 +0200 Carlos Rafael Giani <dv@pseudoterminal.org>
+
+ * gst/rawparse/Makefile.am:
+ * gst/rawparse/gstaudioparse.c:
+ * gst/rawparse/gstaudioparse.h:
+ * gst/rawparse/gstrawparse.c:
+ * gst/rawparse/gstrawparse.h:
+ * gst/rawparse/gstvideoparse.c:
+ * gst/rawparse/gstvideoparse.h:
+ rawparse: Remove old parser code and wrap new parsers in old elements
+ https://bugzilla.gnome.org/show_bug.cgi?id=767011
+
+2016-07-25 13:45:40 +0200 Carlos Rafael Giani <dv@pseudoterminal.org>
+
+ * gst/rawparse/Makefile.am:
+ * gst/rawparse/gstrawaudioparse.c:
+ * gst/rawparse/gstrawaudioparse.h:
+ * gst/rawparse/gstrawbaseparse.c:
+ * gst/rawparse/gstrawbaseparse.h:
+ * gst/rawparse/gstrawvideoparse.c:
+ * gst/rawparse/gstrawvideoparse.h:
+ * gst/rawparse/gstunalignedaudioparse.c:
+ * gst/rawparse/gstunalignedvideoparse.c:
+ * gst/rawparse/gstunalignedvideoparse.h:
+ * gst/rawparse/plugin.c:
+ * gst/rawparse/unalignedvideo.h:
+ * tests/check/Makefile.am:
+ * tests/check/elements/.gitignore:
+ * tests/check/elements/rawaudioparse.c:
+ * tests/check/elements/rawvideoparse.c:
+ rawparse: Add new raw audio and video parser elements
+ The new rawaudioparse and rawvideoparse elements are based on GstBaseParse
+ and completely replace audioparse and videoparse
+ https://bugzilla.gnome.org/show_bug.cgi?id=767011
+
+2016-07-26 16:01:19 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/caopengllayersink.h:
+ * ext/gl/caopengllayersink.m:
+ caopengllayersink: remove unused to_quit variable
+ It was always 0 and never set to anything meaningful.
+
+2016-07-26 15:57:54 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglframebuffer.c:
+ glframebuffer: add compatibility definition for GL_DEPTH_STENCIL_ATTACHMENT
+ GLES2 doesn't have it defined...
+
+2016-07-15 13:39:54 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/effects/gstgleffectblur.c:
+ * ext/gl/effects/gstgleffectbulge.c:
+ * ext/gl/effects/gstgleffectfisheye.c:
+ * ext/gl/effects/gstgleffectglow.c:
+ * ext/gl/effects/gstgleffectidentity.c:
+ * ext/gl/effects/gstgleffectlaplacian.c:
+ * ext/gl/effects/gstgleffectlumatocurve.c:
+ * ext/gl/effects/gstgleffectlumatocurve.h:
+ * ext/gl/effects/gstgleffectmirror.c:
+ * ext/gl/effects/gstgleffectrgbtocurve.c:
+ * ext/gl/effects/gstgleffectsin.c:
+ * ext/gl/effects/gstgleffectsobel.c:
+ * ext/gl/effects/gstgleffectsquare.c:
+ * ext/gl/effects/gstgleffectsqueeze.c:
+ * ext/gl/effects/gstgleffectstretch.c:
+ * ext/gl/effects/gstgleffecttunnel.c:
+ * ext/gl/effects/gstgleffecttwirl.c:
+ * ext/gl/effects/gstgleffectxray.c:
+ * ext/gl/gstglcolorbalance.c:
+ * ext/gl/gstglcolorscale.c:
+ * ext/gl/gstgldeinterlace.c:
+ * ext/gl/gstgldeinterlace.h:
+ * ext/gl/gstgldifferencematte.c:
+ * ext/gl/gstglfilterapp.c:
+ * ext/gl/gstglfiltershader.c:
+ * ext/gl/gstgloverlay.c:
+ * gst-libs/gst/gl/gstglfilter.c:
+ * gst-libs/gst/gl/gstglfilter.h:
+ * gst-libs/gst/gl/gstglpixelformat.c:
+ * gst-libs/gst/gl/gstglutils.h:
+ glfilter: rewrite subclasses for filter_texture() occuring on GL thread
+ There's no need for the jump to an extra thread in most cases, especially
+ when relying solely on a shader to render. We can use the provided
+ render_to_target() functions to simplify filter writing.
+
+2016-07-12 15:34:24 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglutils.h:
+ glutils: remove unused GstGLDisplayProjection
+
+2016-07-12 15:29:29 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gstglimagesink.c:
+ * gst-libs/gst/gl/gstglcolorconvert.c:
+ * gst-libs/gst/gl/gstglmemorypbo.c:
+ * gst-libs/gst/gl/gstglutils.c:
+ * gst-libs/gst/gl/gstglutils.h:
+ * gst-libs/gst/gl/gstglviewconvert.c:
+ * tests/check/libs/gstglmemory.c:
+ * tests/check/libs/gstglupload.c:
+ glcontext: remove not thread-safe get/set_error()
+ Use GError's instead if necessary.
+
+2016-07-12 12:59:57 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gstglfilterapp.c:
+ * ext/gl/gstglfilterapp.h:
+ * ext/gl/gstglfiltercube.c:
+ * ext/gl/gstglfilterglass.c:
+ * ext/gl/gstglmixer.c:
+ * ext/gl/gstglmixer.h:
+ * ext/gl/gstglmosaic.c:
+ * ext/gl/gstgltestsrc.c:
+ * ext/gl/gstgltestsrc.h:
+ * ext/gl/gstgltransformation.c:
+ * ext/gl/gstglvideomixer.c:
+ * ext/gl/gstglvideomixer.h:
+ * gst-libs/gst/gl/gstgl_fwd.h:
+ * gst-libs/gst/gl/gstglcolorconvert.c:
+ * gst-libs/gst/gl/gstglcolorconvert.h:
+ * gst-libs/gst/gl/gstglfilter.c:
+ * gst-libs/gst/gl/gstglfilter.h:
+ * gst-libs/gst/gl/gstglframebuffer.c:
+ * gst-libs/gst/gl/gstglframebuffer.h:
+ * gst-libs/gst/gl/gstglutils.c:
+ * gst-libs/gst/gl/gstglutils.h:
+ * gst-libs/gst/gl/gstglviewconvert.c:
+ * gst-libs/gst/gl/gstglviewconvert.h:
+ * tests/check/libs/gstglcontext.c:
+ glframebuffer: rewrite for a more consistent API
+ Facilities are given to create fbo's and attach GL memory (renderbuffers
+ or textures). It also keeps track of the renderable size for use with
+ effective use with glViewport().
+
+2016-07-12 00:30:22 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gstglcolorbalance.c:
+ * ext/gl/gstglcolorscale.c:
+ * ext/gl/gstgldeinterlace.c:
+ * ext/gl/gstgldifferencematte.c:
+ * ext/gl/gstgldifferencematte.h:
+ * ext/gl/gstgleffects.c:
+ * ext/gl/gstgleffects.h:
+ * ext/gl/gstglfilterapp.c:
+ * ext/gl/gstglfiltercube.c:
+ * ext/gl/gstglfiltercube.h:
+ * ext/gl/gstglfilterglass.c:
+ * ext/gl/gstglfilterglass.h:
+ * ext/gl/gstglfiltershader.c:
+ * ext/gl/gstglmixer.c:
+ * ext/gl/gstglmixer.h:
+ * ext/gl/gstglmosaic.c:
+ * ext/gl/gstglmosaic.h:
+ * ext/gl/gstgloverlay.c:
+ * ext/gl/gstgltransformation.c:
+ * ext/gl/gstgltransformation.h:
+ * ext/gl/gstglvideomixer.c:
+ * gst-libs/gst/gl/gstglfilter.c:
+ * gst-libs/gst/gl/gstglfilter.h:
+ gl: use GLMemory for accessing textures everywhere
+ This simplifies and consolidates a lot of duplicated code creating
+ and modifying textures.
+
+2016-07-11 22:44:16 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/effects/gstgleffectblur.c:
+ * ext/gl/effects/gstgleffectbulge.c:
+ * ext/gl/effects/gstgleffectfisheye.c:
+ * ext/gl/effects/gstgleffectglow.c:
+ * ext/gl/effects/gstgleffectidentity.c:
+ * ext/gl/effects/gstgleffectlaplacian.c:
+ * ext/gl/effects/gstgleffectlumatocurve.c:
+ * ext/gl/effects/gstgleffectmirror.c:
+ * ext/gl/effects/gstgleffectrgbtocurve.c:
+ * ext/gl/effects/gstgleffectsin.c:
+ * ext/gl/effects/gstgleffectsobel.c:
+ * ext/gl/effects/gstgleffectsquare.c:
+ * ext/gl/effects/gstgleffectsqueeze.c:
+ * ext/gl/effects/gstgleffectstretch.c:
+ * ext/gl/effects/gstgleffecttunnel.c:
+ * ext/gl/effects/gstgleffecttwirl.c:
+ * ext/gl/effects/gstgleffectxray.c:
+ * ext/gl/gstglcolorbalance.c:
+ * ext/gl/gstgldeinterlace.c:
+ * ext/gl/gstgldifferencematte.c:
+ * ext/gl/gstglfiltershader.c:
+ * gst-libs/gst/gl/gstglfilter.c:
+ * gst-libs/gst/gl/gstglfilter.h:
+ glfilter: rename draw_texture to draw_fullscreen_quad
+ And remove unused arguments.
+
+2016-07-11 22:31:04 +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/gstgldisplay.c:
+ * gst-libs/gst/gl/gstglrenderbuffer.c:
+ * gst-libs/gst/gl/gstglrenderbuffer.h:
+ gl: add memory type for renderbuffer's
+ Soon to be used for framebuffers for e.g. depth buffers or throwaway color
+ buffers.
+
+2016-07-11 22:28:42 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglformat.c:
+ * gst-libs/gst/gl/gstglformat.h:
+ glformat: define our own set of formats from the GL defines
+ also add some depth/stencil formats
+
+2016-07-11 22:24:43 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gstgleffects.c:
+ gleffects: fix xray to use the correct function
+ Instead of duplicating the sin effect
+
+2016-07-11 21:29:10 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglbasememory.c:
+ * gst-libs/gst/gl/gstglbasememory.h:
+ glbasememory: assert for a valid allocator instead of segfaulting
+
+2016-04-29 14:42:34 +0200 Michael Olbrich <m.olbrich@pengutronix.de>
+
+ * gst/mpegtsdemux/gstmpegdefs.h:
+ * gst/mpegtsdemux/tsdemux.c:
+ tsdemux: add support for LPCM with stream_type = 0x83
+ https://bugzilla.gnome.org/show_bug.cgi?id=765807
+
+2016-07-25 13:06:46 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/player/gstplayer.c:
+ * gst-libs/gst/player/gstplayer.h:
+ player: Add some 'const' to config getters
+
+2016-07-25 13:06:36 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/player/gstplayer.c:
+ player: G-I annotation fixes
+
+2016-07-25 10:30:26 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * docs/libs/gst-plugins-bad-libs-sections.txt:
+ * gst-libs/gst/player/gstplayer.c:
+ * gst-libs/gst/player/gstplayer.h:
+ * tests/check/libs/player.c:
+ * win32/common/libgstplayer.def:
+ player: move 'position-update-interval' setting to the config struct
+ https://bugzilla.gnome.org/show_bug.cgi?id=769144
+
+2016-07-19 14:36:25 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * docs/libs/gst-plugins-bad-libs-sections.txt:
+ * gst-libs/gst/player/gstplayer.c:
+ * gst-libs/gst/player/gstplayer.h:
+ * tests/check/libs/player.c:
+ * win32/common/libgstplayer.def:
+ player: add API to change http user agent
+ Introducing a new 'config' API similar to GstBufferPoolConfig.
+ https://bugzilla.gnome.org/show_bug.cgi?id=765314
+
+2016-07-25 10:54:32 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * common:
+ Update common submodule
+ For 'make update-exports' changes
+
+2016-07-22 17:00:14 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * tests/examples/qt/qml/main.cpp:
+ qml: Don't forget to unref the actual sink element after setting it on glsinkbin
+
+2016-07-22 16:57:45 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * tests/examples/qt/qml/main.cpp:
+ qml: Use glsinkbin instead of glupload directly
+
+2016-07-18 18:36:42 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * ext/openh264/gstopenh264dec.cpp:
+ * ext/openh264/gstopenh264enc.cpp:
+ * ext/openh264/gstopenh264enc.h:
+ openh264: fix up for API changes in v1.6.0
+ Update for API changes in v1.6.0.
+ https://bugzilla.gnome.org/show_bug.cgi?id=768771
+
+2016-07-18 17:43:23 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * gst-libs/gst/gl/wayland/gstgldisplay_wayland.c:
+ * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h:
+ gl: wayland: improve debug message when connecting to display
+ And another copy'n'paste-o.
+ https://bugzilla.gnome.org/show_bug.cgi?id=768929
+
+2016-07-19 02:11:54 +1000 Jan Schmidt <jan@centricular.com>
+
+ * ext/hls/gsthlsdemux.c:
+ hlsdemux: Fix clearing of decryption state
+ Don't clear decryption state immediately after
+ initialising it in the start_fragment. Don't clear
+ the state of all streams when we want to only clear
+ the current stream.
+ https://bugzilla.gnome.org//show_bug.cgi?id=768757
+
+2016-07-15 10:31:35 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * tests/check/elements/adaptive_demux_common.c:
+ * tests/check/elements/adaptive_demux_engine.c:
+ * tests/check/elements/audiomixer.c:
+ * tests/check/elements/autovideoconvert.c:
+ * tests/check/elements/camerabin.c:
+ tests: fix bus leak
+ gst_bus_remove_signal_watch() has to be called to release the ref
+ taken by gst_bus_add_signal_watch().
+ https://bugzilla.gnome.org/show_bug.cgi?id=768843
+
+2016-07-15 11:48:25 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c:
+ camerabinpreview: fix bus leak
+ We were never removing the watch introduced in
+ gst_camerabin_create_preview_pipeline() so its extra ref on the bus was
+ never released.
+ https://bugzilla.gnome.org/show_bug.cgi?id=768838
+
+2016-07-13 23:02:10 +1000 Tim-Philipp Müller <tim@centricular.com>
+
+ * ext/hls/gsthlsdemux.c:
+ * ext/hls/gsthlsdemux.h:
+ hlsdemux: make decryption key handling per-stream
+ Add demuxer instance-wide decryption key cache. The current and
+ last key url are per-stream, so make a shared cache. Move the
+ decryption handling into the stream object, and use the shared
+ cache for the keys.
+
+2016-07-13 23:02:10 +1000 Jan Schmidt <jan@centricular.com>
+
+ * ext/hls/gsthlsdemux.c:
+ * ext/hls/gsthlsdemux.h:
+ hlsdemux: add hlsdemux-specific AdaptiveDemuxStream subclass
+ Prepare hlsdemux for more than one single stream. Currently hlsdemux
+ assumes there'll only ever be one stream and most of the stream-specific
+ state is actually in the hlsdemux structure. Add a stream subclass
+ instead and move some stream-specific members there instead.
+
+2016-07-13 23:02:10 +1000 Jan Schmidt <jan@centricular.com>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.h:
+ adaptivedemux: Add more safeguards around state changes.
+ Make state changes of internal elements more reliable by locking
+ their state, and ensuring that they aren't blocked pushing data
+ downstream before trying to set their state.
+ Add a boolean to avoid starting tasks when the main
+ thread is busy trying to shut the element down.
+
+2016-07-13 23:02:10 +1000 Jan Schmidt <jan@centricular.com>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ adaptivedemux: Add debug code to change bitrate.
+ Add some disabled-by-default debugging code that forces
+ bitrate changes by modulating the measured bitrate every
+ few fragments
+
+2016-07-13 23:02:10 +1000 Jan Schmidt <jan@centricular.com>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ adaptivedemux: More locking/switching fixes
+ Try harder to make switching pads work better by
+ making sure concurrent downloads are finished before exposing
+ a new set of pads.
+ Release the manifest lock when signalling no-more-pads, as
+ that can call back into adaptivedemux again
+
+2016-07-13 23:02:10 +1000 Jan Schmidt <jan@centricular.com>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ adaptivedemux: Don't switch streams and expose pads while downloading.
+ If other stream fragments are still downloading but new streams
+ have been scheduled, don't expose them yet - wait until the last
+ one finishes. Otherwise, we can cancel a partially downloaded
+ auxilliary stream and cause a gap.
+
+2016-07-13 23:02:10 +1000 Jan Schmidt <jan@centricular.com>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ adaptivedemux: Drop the manifest lock during outbound actions
+ Drop the manifest lock when performing actions that might
+ call back into adaptivedemux and trigger deadlocks, such
+ as adding/removing pads or sending in-band events (EOS).
+ Unlock the manifest lock when changing the child bin state to
+ NULL, as it might call back to acquire the manifest lock when
+ shutting down pads.
+ Drop the manifest lock while pushing events.
+
+2016-07-12 14:51:47 -0700 Martin Kelly <martin@surround.io>
+
+ * sys/androidmedia/Makefile.am:
+ * sys/androidmedia/gst-android-hardware-sensor.c:
+ * sys/androidmedia/gst-android-hardware-sensor.h:
+ * sys/androidmedia/gstahssrc.c:
+ * sys/androidmedia/gstahssrc.h:
+ * sys/androidmedia/gstamc.c:
+ * sys/androidmedia/gstsensors.h:
+ * sys/androidmedia/org/freedesktop/gstreamer/androidmedia/GstAhsCallback.java:
+ new plugin: Android hardware sensor source
+ ahssrc is a new plugin that enables Gstreamer to read from the
+ android.hardware.Sensor Android sensors. These sensors are treated as
+ buffers and can be passed through and manipulated by the pipeline.
+ https://bugzilla.gnome.org/show_bug.cgi?id=768110
+
+2016-07-14 19:38:26 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/gstlv2utils.c:
+ lv2: make it build with older lilv
+ Implementing the removal of presets is unfortunately not feasibla with
+ versions < 0.22.
+ Fixes #768595
+
+2016-07-13 23:00:51 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/webrtcdsp/gstwebrtcdsp.cpp:
+ * ext/webrtcdsp/gstwebrtcechoprobe.cpp:
+ webrtcdsp: Add delay-agnostic property
+ In this mode, we let WebRTC Audio Processing figure-out the delay. This
+ is useful when the latency reported by the stack cannot be trusted. Note
+ that in this mode, the leaking of echo during packet lost is much worst.
+ It is recommanded to use PLC (e.g. spanplc, or opus built-in plc).
+ In this mode, we don't do any synchronization. Instead, we simply process all
+ the available reverse stream data as it comes.
+
+2016-07-12 00:02:53 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst/videoparsers/gstjpeg2000parse.c:
+ jpeg2000parse: Use correct enum type
+ GST_JPEG2000_SAMPLING_RGB instead of GST_JPEG2000_COLORSPACE_RGB
+ https://bugzilla.gnome.org/show_bug.cgi?id=768696
+
+2016-07-11 21:13:58 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From f363b32 to f49c55e
+
+2016-07-11 11:58:12 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/kms/gstkmsallocator.c:
+ * sys/kms/gstkmsallocator.h:
+ * sys/kms/gstkmssink.c:
+ kmssink: Fix offsets handling
+ The calculation of the offset table was done base on a plane size
+ estimation. This does not always work. Instead, use memory offset the
+ same we as it's implement in GstVideoMeta map functions.
+
+2016-07-11 19:21:11 +0530 Nirbheek Chauhan <nirbheek@centricular.com>
+
+ * gst-libs/gst/video/gstvideoaggregator.c:
+ * gst/siren/gstsirendec.c:
+ Fix various gboolean vs GstFlowReturn problems
+ Caught by building with MSVC which gave warnings for these
+
+2016-07-08 19:03:06 +1000 Matthew Waters <matthew@centricular.com>
+
+ * configure.ac:
+ gl/build: fix configure when --enable-cocoa is passed on OS X
+ https://bugzilla.gnome.org/show_bug.cgi?id=768553
+
+2016-07-10 20:43:17 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/README:
+ lv2: planning update
+
+2016-07-10 20:42:42 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * configure.ac:
+ * ext/lv2/gstlv2utils.c:
+ lv2: keep working with older versions
+ Provide a fallback impl. for the only new function we were using from 0.22.
+ Fixes #768595
+
+2016-07-08 14:42:18 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * gst/camerabin2/gstcamerabin2.c:
+ camerabin: update docs section
+
+2016-07-07 13:22:02 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * configure.ac:
+ configure.ac: Cleanup unused variable
+ We only check for a header, no need for overriding LDFLAGS.
+
+2016-07-07 17:24:32 +0100 Luis de Bethencourt <luisbg@osg.samsung.com>
+
+ * gst/gaudieffects/gstgaussblur.h:
+ gaudi: fix documentation warning in GstGaussianBlur
+ Fixing the following warning when generating documentation:
+ xml/element-gaussianblur.xml:72: element refsect2: validity error :
+ ID GstGaussianBlur already defined
+ <refsect2 id="GstGaussianBlur" role="typedef">
+ ^
+ Warning: multiple "IDs" for constraint linkend: GstGaussianBlur.
+ DOC Fixing cross-references
+
+2016-07-07 17:16:47 +0100 Luis de Bethencourt <luisbg@osg.samsung.com>
+
+ * gst/gaudieffects/gstchromium.h:
+ gaudi: fix documentation warning in GstChromium
+ Fixing the following warning when generating documentation:
+ xml/element-chromium.xml:74: element refsect2: validity error :
+ ID GstChromium already defined
+ <refsect2 id="GstChromium" role="typedef">
+ ^
+ Warning: multiple "IDs" for constraint linkend: GstChromium.
+ DOC Fixing cross-references
+
+2016-07-07 12:31:20 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * configure.ac:
+ webrtcdsp: Relax C++11 check
+ The library does not require any STL C++11 specific headers.
+ This fixes our OSX build as we target a SDK version that does not
+ support C++11 STL.
+
+2016-07-07 12:31:03 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * configure.ac:
+ webrtcdsp: Add Android GNUSTL support
+
+2016-07-07 12:20:45 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * configure.ac:
+ webrtcdsp: Set USE_WEBRTCDSP when disabled
+
+2016-07-07 17:20:58 +0200 Edward Hervey <edward@centricular.com>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ adaptivedemux: Also consider more seek flags as "snap" seeks
+ In the case of KEY_UNIT and TRICKMODE_KEY_UNITS seeks, we want to
+ "snap" to the closest fragment.
+ Without this, we end up pushing out a segment which does not match
+ the first fragment timestamp being pushed out, resulting in one or
+ more buffers being eventually dropped because they are out of segment.
+
+2016-07-06 14:29:04 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * configure.ac:
+ webrtcdsp: Also allow webrtc-audio-processing 0.3
+ It seems to work and is the version available in Debian.
+
+2016-07-06 12:12:41 +0100 Luis de Bethencourt <luisbg@osg.samsung.com>
+
+ * ext/musepack/gstmusepackdec.c:
+ musepackdeck: unsigned can't be less than zero
+ Less-than-zero comparison of an unsigned value, guint64, is never true
+ CID 1363334
+
+2016-07-06 13:51:06 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * configure.ac:
+ Back to development
+
+=== release 1.9.1 ===
+
+2016-07-06 13:07:21 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-bad-plugins.args:
+ * 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-audiofxbad.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-bluez.xml:
+ * docs/plugins/inspect/plugin-bs2b.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-compositor.xml:
+ * docs/plugins/inspect/plugin-curl.xml:
+ * docs/plugins/inspect/plugin-dashdemux.xml:
+ * docs/plugins/inspect/plugin-dataurisrc.xml:
+ * docs/plugins/inspect/plugin-debugutilsbad.xml:
+ * docs/plugins/inspect/plugin-decklink.xml:
+ * docs/plugins/inspect/plugin-dtls.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-fbdevsink.xml:
+ * docs/plugins/inspect/plugin-festival.xml:
+ * docs/plugins/inspect/plugin-fieldanalysis.xml:
+ * docs/plugins/inspect/plugin-flite.xml:
+ * docs/plugins/inspect/plugin-fluidsynthmidi.xml:
+ * docs/plugins/inspect/plugin-freeverb.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-gstgtk.xml:
+ * docs/plugins/inspect/plugin-gstsiren.xml:
+ * docs/plugins/inspect/plugin-hls.xml:
+ * docs/plugins/inspect/plugin-id3tag.xml:
+ * docs/plugins/inspect/plugin-inter.xml:
+ * docs/plugins/inspect/plugin-interlace.xml:
+ * docs/plugins/inspect/plugin-ivfparse.xml:
+ * docs/plugins/inspect/plugin-ivtc.xml:
+ * docs/plugins/inspect/plugin-jp2kdecimator.xml:
+ * docs/plugins/inspect/plugin-jpegformat.xml:
+ * docs/plugins/inspect/plugin-kate.xml:
+ * docs/plugins/inspect/plugin-ladspa.xml:
+ * docs/plugins/inspect/plugin-midi.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-mplex.xml:
+ * docs/plugins/inspect/plugin-mxf.xml:
+ * docs/plugins/inspect/plugin-netsim.xml:
+ * docs/plugins/inspect/plugin-ofa.xml:
+ * docs/plugins/inspect/plugin-openal.xml:
+ * docs/plugins/inspect/plugin-opencv.xml:
+ * docs/plugins/inspect/plugin-openexr.xml:
+ * docs/plugins/inspect/plugin-opengl.xml:
+ * docs/plugins/inspect/plugin-openjpeg.xml:
+ * docs/plugins/inspect/plugin-opusparse.xml:
+ * docs/plugins/inspect/plugin-pcapparse.xml:
+ * docs/plugins/inspect/plugin-pnm.xml:
+ * docs/plugins/inspect/plugin-qt.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-rsvg.xml:
+ * docs/plugins/inspect/plugin-rtmp.xml:
+ * docs/plugins/inspect/plugin-rtponvif.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-smoothstreaming.xml:
+ * docs/plugins/inspect/plugin-sndfile.xml:
+ * docs/plugins/inspect/plugin-soundtouch.xml:
+ * docs/plugins/inspect/plugin-spandsp.xml:
+ * docs/plugins/inspect/plugin-speed.xml:
+ * docs/plugins/inspect/plugin-srtp.xml:
+ * docs/plugins/inspect/plugin-stereo.xml:
+ * docs/plugins/inspect/plugin-subenc.xml:
+ * docs/plugins/inspect/plugin-teletext.xml:
+ * docs/plugins/inspect/plugin-uvch264.xml:
+ * docs/plugins/inspect/plugin-vcdsrc.xml:
+ * docs/plugins/inspect/plugin-videofiltersbad.xml:
+ * docs/plugins/inspect/plugin-videoframe_audiolevel.xml:
+ * docs/plugins/inspect/plugin-videoparsersbad.xml:
+ * docs/plugins/inspect/plugin-videosignal.xml:
+ * docs/plugins/inspect/plugin-vmnc.xml:
+ * docs/plugins/inspect/plugin-voaacenc.xml:
+ * docs/plugins/inspect/plugin-voamrwbenc.xml:
+ * docs/plugins/inspect/plugin-waylandsink.xml:
+ * docs/plugins/inspect/plugin-webp.xml:
+ * docs/plugins/inspect/plugin-wildmidi.xml:
+ * docs/plugins/inspect/plugin-x265.xml:
+ * docs/plugins/inspect/plugin-y4mdec.xml:
+ * docs/plugins/inspect/plugin-yadif.xml:
+ * docs/plugins/inspect/plugin-zbar.xml:
+ * gst-plugins-bad.doap:
+ * win32/common/config.h:
+ Release 1.9.1
+
+2016-07-06 11:52:11 +0300 Sebastian Dröge <sebastian@centricular.com>
* po/af.po:
* po/az.po:
@@ -49,98 +3130,111 @@
* po/zh_CN.po:
Update .po files
-2016-08-16 18:46:49 +0300 Sergei Saveliev <saveliev.sergei@gmail.com>
+2016-07-06 10:19:24 +0300 Sebastian Dröge <sebastian@centricular.com>
- * sys/applemedia/avfassetsrc.m:
- avfassetsrc: Don't escape the URI another time in another location too
- One location was forgotten in a913a0b9679dd58945ad105d240db45595fdaba6
- https://bugzilla.gnome.org/show_bug.cgi?id=767492
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.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/nl.po:
+ * po/or.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ro.po:
+ * po/ru.po:
+ * po/sk.po:
+ * po/sl.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ po: Update translations
-2016-08-01 11:45:30 +0200 Bernhard Miller <bernhard.miller@streamunlimited.com>
+2016-07-05 09:21:58 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
- * gst/aiff/aiffparse.c:
- aiffparse: keep end_offset when seeking
- After seeking in aiff files the information about the data end offset is
- discarded, leading to audio artifacts with metadata chunks at the end of
- a file.
- This patch retains the end offset information after a seek event.
- https://bugzilla.gnome.org//show_bug.cgi?id=769376
+ * ext/webrtcdsp/gstwebrtcdsp.cpp:
+ webrtcdsp: Workaround GCC/MingW 4.7 limitations
+ It refuses to initialize a classes using brackets notation. This is
+ to allow building using our mingw version.
-2016-08-06 16:15:33 +0100 Tim-Philipp Müller <tim@centricular.com>
+2016-07-04 14:57:11 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
- * gst/dvdspu/gstdvdspu.c:
- dvdspu: don't crash if video frame could not be mapped
- As might happen with e.g. vaapi and the test file from
- https://bugzilla.gnome.org/show_bug.cgi?id=736227
+ * configure.ac:
+ configure.ac: Add missing double quotes
+ That affectation was ignored. This worked on recent GCC as C++11 is
+ enabled by default now.
-2016-08-08 11:28:44 +0200 Sebastian Dröge <sebastian@centricular.com>
+2016-07-02 10:24:51 +0200 Stefan Sauer <ensonic@users.sf.net>
- * sys/androidmedia/gstamc.c:
- amc: Fix call to realloc() to allocate the correct size of items
+ * ext/lv2/gstlv2filter.c:
+ * ext/lv2/gstlv2source.c:
+ * ext/lv2/gstlv2utils.c:
+ * ext/lv2/gstlv2utils.h:
+ lv2: add support for saving presets
+ Plugns supporting the state interface can now save their presets under '.lv2'.
-2016-08-01 10:28:26 +0300 Sebastian Dröge <sebastian@centricular.com>
+2016-06-15 22:22:58 +0200 Stefan Sauer <ensonic@users.sf.net>
- * sys/androidmedia/gstamc.c:
- amc: If we find multiple codecs with the same name, just merge them
- On the ODroid C1+ the H265 and H264 have the same name but are listed as two
- different codecs. We have to handle them as the same one that supports both,
- as otherwise we will register the same GType name twice which fails and we
- then only have H265 support and not H264 support.
+ * ext/lv2/README:
+ * ext/lv2/gstlv2.c:
+ * ext/lv2/gstlv2.h:
+ * ext/lv2/gstlv2filter.c:
+ * ext/lv2/gstlv2source.c:
+ * ext/lv2/gstlv2utils.c:
+ * ext/lv2/gstlv2utils.h:
+ lv2: support for loading presets
+ Detect if plugins can do presets. Lazily read a list of presets and add support
+ for loading.
-2016-08-01 10:15:04 +0300 Sebastian Dröge <sebastian@centricular.com>
+2016-07-04 16:54:53 +0200 Wim Taymans <wtaymans@redhat.com>
- * sys/androidmedia/gstamc.c:
- amc: Use a GQueue for O(1) append instead of a GList
+ * configure.ac:
+ * ext/musepack/gstmusepackdec.c:
+ * ext/musepack/gstmusepackreader.c:
+ musepackdec: port to 1.0
-2016-07-29 08:54:00 +0300 Sebastian Dröge <sebastian@centricular.com>
+2016-07-04 12:19:36 +0200 Marcin Lewandowski <marcin@radiokit.org>
- * sys/androidmedia/gstamc.c:
- amc: Print generated raw/encoded caps in debug logs
+ * sys/shm/gstshmsrc.c:
+ shmsrc: Do not call gst_poll_remove_fd upon stop if reading was never started
+ https://bugzilla.gnome.org/show_bug.cgi?id=768365
-2016-06-21 18:28:46 +1000 Matthew Waters <matthew@centricular.com>
+2016-07-01 14:50:27 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
- * gst-libs/gst/gl/gstglcontext.c:
- glcontext: fix get_current_gl_api() on win32
- Another case of incorrect calling conventions.
- Using this function on win32 would corrupt the stack pointer and end in
- massive hilarity.
+ * sys/dvb/parsechannels.c:
+ dvb/parsechannels: improve parsing-success message
+ * Fix typo
+ * Give information on what was actually parsed
-2016-08-16 02:46:42 +1000 Jan Schmidt <jan@centricular.com>
+2016-07-01 14:37:37 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
- * ext/qt/Makefile.am:
- * ext/qt/gstplugin.cc:
- qt: Disable qmlglsrc element in 1.8
- It relies on GstGL features and GstVideoAffineTransformationMeta
- that are only available in git master.
-
-2016-08-16 00:40:53 +1000 Jan Schmidt <jan@centricular.com>
-
- * ext/qt/gstqtglutility.cc:
- qt: Use wglShareLists() workaround unconditionally.
- Sometimes wglCreateContextAttribsARB() exists, but
- isn't functional (some Intel drivers), so it's
- easiest to do the workaround unconditionally.
-
-2016-08-08 13:41:14 +1000 Jan Schmidt <jan@centricular.com>
-
- * ext/qt/gstqtglutility.cc:
- qt: Move debug statement to after the category init
- Don't output debug to an uninitialised debug category.
-
-2016-07-27 08:16:47 +0800 Haihua Hu <jared.hu@nxp.com>
-
- * ext/qt/Makefile.am:
- * ext/qt/gstplugin.cc:
- * ext/qt/gstqtglutility.cc:
- * ext/qt/gstqtglutility.h:
- * ext/qt/gstqtsrc.cc:
- * ext/qt/gstqtsrc.h:
- * ext/qt/qtitem.cc:
- * ext/qt/qtwindow.cc:
- * ext/qt/qtwindow.h:
- qt: implement qmlglsrc for qml view grab
- [Matthew Waters]: gst-indent sources
- https://bugzilla.gnome.org/show_bug.cgi?id=768160
+ * sys/dvb/parsechannels.c:
+ dvb/parsechannels: don't use default conf filename for messages
+ The file name can be user-defined.
2016-07-01 19:22:32 +0100 Tim-Philipp Müller <tim@centricular.com>
@@ -152,6 +3246,316 @@
(and if it didn't we'd have just an empty -I argument).
https://bugzilla.gnome.org/show_bug.cgi?id=767553
+2016-07-01 14:05:49 +0100 Luis de Bethencourt <luisbg@osg.samsung.com>
+
+ * gst/videoparsers/gstjpeg2000parse.c:
+ gstjpeg2000parse: no need for else after a goto
+ else clause is redundant when the end of the if statement is a jump.
+ If we haven't gone to the beach, we are in the false branch.
+
+2016-06-30 07:47:50 -0400 Aaron Boxer <boxerab@gmail.com>
+
+ * gst/videoparsers/gstjpeg2000parse.c:
+ gstjpeg2000parse: improved parsing of jpc magic and j2c box
+ https://bugzilla.gnome.org/show_bug.cgi?id=767512
+
+2016-05-25 16:01:24 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.h:
+ adaptivedemux: Add custom flow return for allowing subclasses to specify when a fragment is finished
+ If it is finished before upstream going EOS.
+ https://bugzilla.gnome.org/show_bug.cgi?id=767365
+
+2016-05-27 16:08:09 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ * ext/dash/gstdashdemux.h:
+ dashdemux: Implement SIDX tracking based on buffer offset
+ This simplifies the code but also removes a bug with tracking of the remaining
+ size for the initial subfragment: we were not considering the size between the
+ index and the start of the first moof here.
+ https://bugzilla.gnome.org/show_bug.cgi?id=764684
+
+2016-03-31 13:39:59 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ * ext/dash/gstdashdemux.h:
+ dashdemux: Properly keep track of current offset
+ GstAdapter does not guarantee to pass through all the offsets, we have to keep
+ track of it ourselves.
+ https://bugzilla.gnome.org/show_bug.cgi?id=764684
+
+2016-03-31 13:39:59 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/hls/gsthlsdemux.c:
+ * ext/hls/gsthlsdemux.h:
+ hlsdemux: Properly keep track of current offset
+ GstAdapter does not guarantee to pass through all the offsets, we have to keep
+ track of it ourselves.
+ https://bugzilla.gnome.org/show_bug.cgi?id=764684
+
+2016-03-31 13:01:00 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/hls/gsthlsdemux.c:
+ hlsdemux: Clear pending data when needed
+ When switching fragments we don't want to keep any data around from the last
+ one, and also forget about all data when doing flushing seeks or selecting new
+ bitrates.
+ https://bugzilla.gnome.org/show_bug.cgi?id=764684
+
+2016-03-28 13:45:36 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/dash/gstdashdemux.c:
+ * ext/dash/gstdashdemux.h:
+ * ext/hls/gsthlsdemux.c:
+ * ext/hls/gsthlsdemux.h:
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.h:
+ adaptivedemux: Get rid of internal stream adapter and let subclasses handle this directly
+ This allows subclasses to have more control and especially ensure that they
+ push data downstream with the correct offsets.
+ https://bugzilla.gnome.org/show_bug.cgi?id=764684
+
+2016-07-01 12:20:14 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * gst-libs/gst/codecparsers/gstjpeg2000sampling.c:
+ codecparsers: jpeg2000: don't allow 0 value for array access with i-1
+
+2016-07-01 12:15:28 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * gst-libs/gst/codecparsers/gstjpeg2000sampling.c:
+ codecparsers: jpeg2000: fix possible out-of-bounds array access
+ sizeof(array) != G_N_ELEMENTS(array).
+ CID 1362900
+
+2016-06-30 23:38:26 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/openh264/gstopenh264enc.cpp:
+ openh264enc: Set frame timestamps before sending to the encoder
+
+2016-06-30 23:35:33 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/openh264/gstopenh264enc.cpp:
+ openh264enc: Fix initial time-per-frame calculation
+
+2016-06-30 23:33:38 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/openh264/gstopenh264enc.cpp:
+ * ext/openh264/gstopenh264enc.h:
+ openh264enc: Remove meaningless drop bitrate handling
+ This doesn't even have a property.
+
+2016-06-30 23:29:13 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/openh264/gstopenh264enc.cpp:
+ * ext/openh264/gstopenh264enc.h:
+ openh264enc: Expose maximum bitrate setting
+
+2016-06-30 23:19:26 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/openh264/gstopenh264enc.cpp:
+ openh264enc: Actually hook up the rate-control property
+
+2016-06-30 23:06:29 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/openh264/gstopenh264enc.cpp:
+ openh264enc: Use a constant SPS/PPS ID no matter if openh264 older or newer than 1.4 is used
+
+2016-06-30 23:02:49 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/openh264/gstopenh264enc.cpp:
+ openh264enc: Make slice settings more explicit and don't set any number if not a fixed number of slices is selected
+
+2016-06-29 15:56:47 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/webrtcdsp/gstwebrtcdsp.cpp:
+ * ext/webrtcdsp/gstwebrtcechoprobe.cpp:
+ * ext/webrtcdsp/gstwebrtcechoprobe.h:
+ webrtcdsp: Rewrite echo data synchronization
+ The previous code would run out of sync if there was packet lost
+ or clock skews. When that happened, the echo cancellation feature would
+ completely stop working. As this is crucial for audio calls, this patch
+ re-implement synchronization completely.
+ Instead of letting it drift until next discont, we now synchronize
+ against the record data at every iteration. This way we simply never
+ let the stream drift for longer then 10ms period. We also shorter the
+ delay by using the latency up the probe (basically excluding the sink
+ latency. This is a decent delay to avoid starving in the probe queue.
+ https://bugzilla.gnome.org/show_bug.cgi?id=768009
+
+2016-06-29 15:55:19 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/webrtcdsp/gstwebrtcdsp.cpp:
+ webrtcdsp: We now fail if there is no echo probe
+ When echo cancel is enabled, we now fail the pipeline if there is
+ not echo probe. For this reason there is no need to check if probe
+ pointer is set anymore.
+
+2016-06-30 21:50:12 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglviewconvert.c:
+ glviewconvert: fix transformation matrix usage
+ Calling glUniformMatrix before the shader is bound is invalid and
+ would result in errors like:
+ GL_INVALID_OPERATION in glUniformMatrix(program not linked)
+ Move glUniformMatrix() to after the gst_gl_shader_use() call.
+
+2016-06-28 16:07:43 -0400 Javier Martinez Canillas <javier@osg.samsung.com>
+
+ * sys/kms/gstkmssink.c:
+ kmssink: fallback to universal planes if no overlay plane is found
+ Without setting the DRM_CLIENT_CAP_UNIVERSAL_PLANES capability bit, only
+ overlay planes are made available for compatibility with legacy clients.
+ But if a CRTC doesn't have an overlay plane associated, then kmssink is
+ not able to find a plane for the CRTC and the pipeline will fail, i.e:
+ ERROR kmssink gstkmssink.c:482:gst_kms_sink_start:<kmssink0> Could not find a plane for crtc
+ If no overlay planes were found for a given CRTC, fallback to universal
+ planes so DRM will also return primary planes that can be used instead.
+ https://bugzilla.gnome.org/show_bug.cgi?id=768183
+ Signed-off-by: Javier Martinez Canillas <javier@osg.samsung.com>
+
+2016-06-28 20:51:56 -0400 Javier Martinez Canillas <javier@osg.samsung.com>
+
+ * docs/plugins/gst-plugins-bad-plugins.args:
+ * sys/kms/gstkmssink.c:
+ kmssink: add a plane-id property
+ Without setting the DRM_CLIENT_CAP_UNIVERSAL_PLANES capability bit, only
+ overlay planes are made available for compatibility with legacy clients.
+ But if a CRTC doesn't have an overlay plane associated, then kmssink is
+ not able to find a plane for the CRTC and the pipeline will fail, i.e:
+ ERROR kmssink gstkmssink.c:482:gst_kms_sink_start:<kmssink0> Could not find a plane for crtc
+ This patch adds a plane-id property to the kmssink element so a specific
+ plane can be used in case that a CRTC has only a primary plane associated.
+ https://bugzilla.gnome.org/show_bug.cgi?id=768183
+
+2016-06-30 10:33:30 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/openh264/gstopenh264enc.cpp:
+ openh264enc: Remove broken byte-stream to avc conversion and just output byte-stream as generated by the encoder
+ The byte-stream to avc conversion did not consider NAL sizes bigger than 2^16,
+ multiple layers, multiple NALs per layer, and various other things. This
+ caused corrupted streams in higher bitrates and other circumstances.
+ Let's just forward byte-stream as generated by the encoder and let h264parse
+ handle conversion to avc if needed. That way we only have to keep around one
+ version of the conversion and don't have to fix it in multiple places.
+
+2016-06-29 18:36:56 +0200 Edward Hervey <edward@centricular.com>
+
+ * gst/videoparsers/gsth264parse.c:
+ h264parse: Drop filler data
+ When skipping data, check if they are filler bytes. If so, drop the
+ data instead of skipping. We don't want to output filler bytes, but they
+ shouldn't cause a discontinuity.
+ https://bugzilla.gnome.org/show_bug.cgi?id=768125
+
+2016-06-30 08:31:20 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * sys/dvb/dvbbasebin.c:
+ dvbbasebin: Use a non-timer GstPoll
+ set_flushing() causes inconsistent states on timer polls and also signals a
+ g_critical() nowadays because of that.
+
+2016-06-30 14:04:36 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglupload.c:
+ glupload: fix raw data uploader with addition of GstVideoGLTextureType
+ Fixes regression from 989200820d43c78fb179d7984827800d83787390
+ https://bugzilla.gnome.org/show_bug.cgi?id=768217
+
+2016-06-29 23:55:18 -0400 Olivier Crête <olivier.crete@collabora.com>
+
+ * gst-libs/gst/gl/gstglcolorconvert.c:
+ glvideoconvert: RG/LA is available in OpenGL ES 3, so let that through
+
+2016-06-29 18:35:17 +1000 Matthew Waters <matthew@centricular.com>
+
+ * sys/applemedia/videotexturecache.m:
+ vtdec: use L/LA textures on GLES2 as well
+
+2016-06-24 13:41:11 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/eagl/gstglcontext_eagl.m:
+ Revert "Revert "gl/eagl: try getting a gles3 context""
+ This reverts commit eb142736318463e6e553c21707ba0d716f85a46f.
+ vtdec now successfully outputs textures that can be converted by
+ glcolorconvert in GLES3 contexts.
+
+2016-06-25 00:05:37 +1000 Matthew Waters <matthew@centricular.com>
+
+ * sys/applemedia/videotexturecache.m:
+ vtdec: add support for zerocopy decoding with GLES 3.x
+ It seems that Red/RG textures aren't supported anymore for zerocopy decoding
+ with GLES 3.x. Instead use Luminance/Luminance Alpha textures which are.
+
+2016-06-28 13:51:22 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gstgloverlay.c:
+ * gst-libs/gst/gl/egl/gstglmemoryegl.c:
+ * gst-libs/gst/gl/gstglbufferpool.c:
+ * gst-libs/gst/gl/gstglcolorconvert.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:
+ * gst-libs/gst/gl/gstglviewconvert.c:
+ * sys/androidmedia/gstamcvideodec.c:
+ * sys/applemedia/iosurfacememory.c:
+ * sys/applemedia/iosurfacememory.h:
+ * sys/applemedia/videotexturecache.m:
+ * tests/check/libs/gstglcolorconvert.c:
+ * tests/check/libs/gstglcontext.c:
+ * tests/check/libs/gstglmemory.c:
+ * tests/check/libs/gstglupload.c:
+ glmemory: add the texture type to allocate to parameters
+ Rather than assuming something. e.g. zerocopy on iOS with GLES3 requires
+ the use of Luminance/Luminance Alpha formats and does not work with
+ Red/RG textures.
+
+2016-06-28 13:09:51 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglcolorconvert.c:
+ glcolorconvert: don't assume Red/RG textures will be used
+ Take the used texture type from the memory instead.
+ Fixes conversion from multi-planar YUV formats with two components per plane
+ (NV12, NV21, YUY2, UYVY, GRAY16_*, etc) with Luminance Alpha input textures.
+ This is also needed for zerocopy decoding on iOS with GLES 3.x.
+
+2016-06-28 13:02:32 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglcontext.c:
+ glcontext: correct precondition for get_gl_version
+ The intention was to assert if both maj and min were NULL (as there would be no
+ point calling the function). Instead if either maj or min were NULL, the assert
+ would occur.
+ Fix that.
+
+2016-06-28 19:26:29 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * sys/d3dvideosink/d3dhelpers.c:
+ * sys/d3dvideosink/d3dvideosink.c:
+ d3dvideosink: Replace some more gst_caps_to_string() with GST_PTR_FORMAT
+ https://bugzilla.gnome.org/show_bug.cgi?id=768146
+
+2016-06-28 11:50:59 -0400 Jonathan Roy <jroy@adetelgroup.com>
+
+ * sys/d3dvideosink/d3dvideosink.c:
+ d3dvideosink: leak on caps string
+ https://bugzilla.gnome.org/show_bug.cgi?id=768146
+
+2016-06-28 11:08:22 +0100 Luis de Bethencourt <luisbg@osg.samsung.com>
+
+ * gst-libs/gst/codecparsers/gstjpeg2000sampling.c:
+ jpeg2000parse: fix typo in sampling check
+ Fixing small typo that changes the value of the return.
+
+2016-06-27 21:36:50 -0400 Olivier Crête <olivier.crete@collabora.com>
+
+ * tests/check/Makefile.am:
+ tests: Ignore kmssink for state change test
+ It can only be put to READY if the DRM stuff is available.
+
2016-06-27 18:15:08 +0800 Haihua Hu <jared.hu@nxp.com>
* configure.ac:
@@ -161,6 +3565,158 @@
in the necessary #ifdef to avoid build error.
https://bugzilla.gnome.org/show_bug.cgi?id=767553
+2016-06-24 18:14:06 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/dvbbasebin.c:
+ dvbbasebin: make sure we have an error in case of parsing failure
+ Drop a redundant comment and rellocate another one while at it.
+
+2016-06-22 16:14:33 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/parsechannels.c:
+ dvb/parsechannels: implement channels.conf format autodetection
+ Simple autodetection avoids having to call the parsers
+ one after the other.
+
+2016-06-21 16:08:57 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/parsechannels.c:
+ dvb/parsechannels: rename v5/zap parsers for congruency
+ Add function prototypes while at it.
+
+2016-04-12 21:04:25 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/parsechannels.c:
+ dvb/parsechannels: fix modulation names
+ Some names were incorrect. Authoritative source for
+ the dvbv5 format taken from v4l-utils' lib/libdvbv5/dvb-v5.c
+ Aditionally, add the missing setter mapping for the
+ modulation param.
+ This change makes ATSC work.
+ https://bugzilla.gnome.org/show_bug.cgi?id=764957
+
+2016-02-24 21:44:40 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * sys/dvb/parsechannels.c:
+ dvbbasebin: also accept DVBv5 channels.conf format
+ Confirmed working with ISDB-T & ATSC conf files.
+ https://bugzilla.gnome.org/show_bug.cgi?id=764957
+
+2016-06-21 11:48:36 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: fix ISDB-T property descriptions
+ Drop some stale trailing whitespace while at it.
+
+2016-06-21 11:32:07 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: fix misplaced space on doc block
+
+2016-05-10 03:32:59 +1000 Jan Schmidt <jan@centricular.com>
+
+ * gst/videoparsers/gsth264parse.c:
+ * gst/videoparsers/gsth264parse.h:
+ h264parse: When input alignment=AU, always drain each packet.
+ If the input alignment claims AU alignment, each received
+ buffer should contain a complete video frame, so never hold over parts
+ of buffers for later processing. Also reduces latency, as packets
+ are parsed/converted and output immediately instead of 1 buffer
+ later.
+ Fixes a problem where an (arguably disallowed) padding byte on the
+ end of a buffer is detected as an extra byte in the following
+ start code, and messes up the timestamping that should apply to
+ that start code.
+
+2016-06-24 13:05:24 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * win32/common/libgstcodecparsers.def:
+ win32: update codecparsers .def file for new symbols
+
+2016-06-24 09:41:18 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * ext/openjpeg/Makefile.am:
+ * ext/openjpeg/gstopenjpegdec.h:
+ * ext/openjpeg/gstopenjpegenc.c:
+ openjpeg: fix more broken includes
+
+2016-06-24 09:39:00 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * gst/videoparsers/gstjpeg2000parse.h:
+ videoparsers: fix broken include
+
+2016-06-21 12:41:46 -0400 Aaron Boxer <boxerab@gmail.com>
+
+ * ext/openjpeg/Makefile.am:
+ * ext/openjpeg/gstopenjpegdec.c:
+ * ext/openjpeg/gstopenjpegdec.h:
+ * ext/openjpeg/gstopenjpegenc.c:
+ * gst-libs/gst/codecparsers/Makefile.am:
+ * gst-libs/gst/codecparsers/gstjpeg2000sampling.c:
+ * gst-libs/gst/codecparsers/gstjpeg2000sampling.h:
+ * gst/videoparsers/Makefile.am:
+ * gst/videoparsers/gstjpeg2000parse.c:
+ * gst/videoparsers/gstjpeg2000parse.h:
+ * gst/videoparsers/gstjpeg2000sampling.h:
+ jpeg2000parse: use enums for colorspace and sampling, rather than strings
+ Also, move gstjpeg2000sampling to codecparsers project
+ https://bugzilla.gnome.org/show_bug.cgi?id=767908
+
+2016-06-24 01:57:13 +0530 Nirbheek Chauhan <nirbheek@centricular.com>
+
+ * configure.ac:
+ configure: Need to add -DGST_STATIC_COMPILATION when building only statically
+ https://bugzilla.gnome.org/show_bug.cgi?id=767463
+
+2016-06-23 15:57:58 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/gl/egl/gsteglimage.c:
+ eglimage: Only register debug category if dmabuf support is enabled
+ It's not used otherwise currently and causes compiler warnings.
+
+2016-06-22 22:28:03 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/webrtcdsp/gstwebrtcdsp.cpp:
+ webrtcdsp: Offset timestamp with duration
+ The saved timestamp is used to compute the delay of the probe data.
+ As it's used at the following incoming buffer, it needs to be offset
+ with the duration of the buffer to represent the end position. Also,
+ properly initialize the saved timestamp and protect against TIME_NONE.
+
+2016-06-22 21:54:13 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/webrtcdsp/gstwebrtcdsp.cpp:
+ webrtcdsp: Synchronize with delays
+ Until now, we were synchronizing both DSP and Probe adapter by
+ waiting and clipping the probe adapter data. This increases the CPU
+ usage, can cause copies if the audio is not 10ms aligned and the worst
+ is that it prevents the processing from compensating for inaccurate
+ latency. This is also a step forward toward supporting playback
+ filters.
+
+2016-06-22 21:45:08 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/webrtcdsp/gstwebrtcdsp.cpp:
+ webrtdsp: Remove restriction on channels number
+ Unlike 0.1, in 0.2 the reverse stream can have different number of
+ channels. Remove the check that restrict it.
+
+2016-06-22 21:44:35 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/webrtcdsp/gstwebrtcdsp.cpp:
+ webrtcdsp: Style fix
+
+2016-06-16 14:18:18 +1000 Alessandro Decina <alessandro.d@gmail.com>
+
+ * sys/applemedia/vtdec.c:
+ vtdec: minimize renegotiation to make hw decoding more reliable
+ The hardware decoder can become (temporarily) unavailable across
+ VTDecompressionSessionCreate/Destroy calls. During negotiation if the currently
+ configured caps are still accepted by downstream we keep using them so we don't
+ have to destroy and recreate the decoding session.
+ This indirectly fixes https://bugzilla.gnome.org/show_bug.cgi?id=767429, by
+ making vtdec stick to GLMemory.
+
2016-06-16 15:13:02 +1000 Matthew Waters <matthew@centricular.com>
* ext/qt/qtitem.cc:
@@ -178,6 +3734,336 @@
cp debug/libgstqtsink.dll /path/to/prefix/lib/gstreamer-1.0/libgstqtsink.cll
https://bugzilla.gnome.org/show_bug.cgi?id=761260
+2016-06-21 11:40:22 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * .gitignore:
+ Add missing file to gitignore
+
+2016-06-20 18:52:00 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-bad-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-bad-plugins-sections.txt:
+ * 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-androidcamera.xml:
+ * docs/plugins/inspect/plugin-assrender.xml:
+ * docs/plugins/inspect/plugin-audiofxbad.xml:
+ * docs/plugins/inspect/plugin-bluez.xml:
+ * docs/plugins/inspect/plugin-bs2b.xml:
+ * docs/plugins/inspect/plugin-compositor.xml:
+ * docs/plugins/inspect/plugin-dashdemux.xml:
+ * docs/plugins/inspect/plugin-decklink.xml:
+ * docs/plugins/inspect/plugin-dtls.xml:
+ * docs/plugins/inspect/plugin-dvbsuboverlay.xml:
+ * docs/plugins/inspect/plugin-fbdevsink.xml:
+ * docs/plugins/inspect/plugin-fluidsynthmidi.xml:
+ * docs/plugins/inspect/plugin-freeverb.xml:
+ * docs/plugins/inspect/plugin-frei0r.xml:
+ * docs/plugins/inspect/plugin-gstgtk.xml:
+ * docs/plugins/inspect/plugin-inter.xml:
+ * docs/plugins/inspect/plugin-ivfparse.xml:
+ * docs/plugins/inspect/plugin-ivtc.xml:
+ * docs/plugins/inspect/plugin-jp2kdecimator.xml:
+ * docs/plugins/inspect/plugin-kate.xml:
+ * docs/plugins/inspect/plugin-kms.xml:
+ * docs/plugins/inspect/plugin-ladspa.xml:
+ * docs/plugins/inspect/plugin-midi.xml:
+ * docs/plugins/inspect/plugin-mpegtsdemux.xml:
+ * docs/plugins/inspect/plugin-mxf.xml:
+ * docs/plugins/inspect/plugin-netsim.xml:
+ * docs/plugins/inspect/plugin-openexr.xml:
+ * docs/plugins/inspect/plugin-opengl.xml:
+ * docs/plugins/inspect/plugin-openjpeg.xml:
+ * docs/plugins/inspect/plugin-opusparse.xml:
+ * docs/plugins/inspect/plugin-pnm.xml:
+ * docs/plugins/inspect/plugin-qt.xml:
+ * docs/plugins/inspect/plugin-rawparse.xml:
+ * docs/plugins/inspect/plugin-resindvd.xml:
+ * docs/plugins/inspect/plugin-rsvg.xml:
+ * docs/plugins/inspect/plugin-rtponvif.xml:
+ * docs/plugins/inspect/plugin-smoothstreaming.xml:
+ * docs/plugins/inspect/plugin-sndfile.xml:
+ * docs/plugins/inspect/plugin-srtp.xml:
+ * docs/plugins/inspect/plugin-stereo.xml:
+ * docs/plugins/inspect/plugin-teletext.xml:
+ * docs/plugins/inspect/plugin-uvch264.xml:
+ * docs/plugins/inspect/plugin-vcdsrc.xml:
+ * docs/plugins/inspect/plugin-vdpau.xml:
+ * docs/plugins/inspect/plugin-videofiltersbad.xml:
+ * docs/plugins/inspect/plugin-videoframe_audiolevel.xml:
+ * docs/plugins/inspect/plugin-videoparsersbad.xml:
+ * docs/plugins/inspect/plugin-videosignal.xml:
+ * docs/plugins/inspect/plugin-vmnc.xml:
+ * docs/plugins/inspect/plugin-webp.xml:
+ * docs/plugins/inspect/plugin-webrtcdsp.xml:
+ * docs/plugins/inspect/plugin-wildmidi.xml:
+ * docs/plugins/inspect/plugin-x265.xml:
+ * docs/plugins/inspect/plugin-yadif.xml:
+ * docs/plugins/inspect/plugin-zbar.xml:
+ * gst/pnm/gstpnmenc.c:
+ doc: Automatic update
+ This is an automatic update with manual merges of running
+ "make update" in the doc/plugins directory. This should help
+ later maintenance of the plugins doc. A lot of plugin are
+ not referenced yet in the doc. Will come later.
+
+2016-06-20 16:30:19 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * docs/plugins/Makefile.am:
+ doc: Add .cpp files to doc parser
+ Also, complete the list of directory that need to be visited.
+
+2016-06-06 15:10:05 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * configure.ac:
+ * ext/Makefile.am:
+ * ext/webrtcdsp/Makefile.am:
+ * ext/webrtcdsp/gstwebrtcdsp.cpp:
+ * ext/webrtcdsp/gstwebrtcdsp.h:
+ * ext/webrtcdsp/gstwebrtcechoprobe.cpp:
+ * ext/webrtcdsp/gstwebrtcechoprobe.h:
+ webrtcdsp: Add WebRTC Audio Processing support
+ This DSP library can be used to enhance voice signal for real time
+ communication call. In implements multiple filters like noise reduction,
+ high pass filter, echo cancellation, automatic gain control, etc.
+ The webrtcdsp element can be used along, or with the help of the
+ webrtcechoprobe if echo cancellation is enabled. The echo probe should
+ be placed as close as possible to the audio sink, while the DSP is
+ generally place close to the audio capture. For local testing, one can
+ use an echo loop pipeline like the following:
+ autoaudiosrc ! webrtcdsp ! webrtcechoprobe ! autoaudiosink
+ This pipeline should produce a single echo rather then repeated echo.
+ Those elements works if they are placed in the same top level pipeline.
+ https://bugzilla.gnome.org/show_bug.cgi?id=767800
+
+2016-06-21 11:46:44 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * common:
+ Automatic update of common submodule
+ From ac2f647 to f363b32
+
+2016-03-22 16:51:53 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com>
+
+ * gst-libs/gst/gl/win32/gstglcontext_wgl.c:
+ glcontext/wgl: try wglCreateContextAttribsARB even not gl3 core profile
+ https://bugzilla.gnome.org/show_bug.cgi?id=764018
+
+2016-06-21 18:28:46 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglcontext.c:
+ glcontext: fix get_current_gl_api() on win32
+ Another case of incorrect calling conventions.
+ Using this function on win32 would corrupt the stack pointer and end in
+ massive hilarity.
+
+2016-06-15 12:47:05 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglcolorconvert.c:
+ * gst-libs/gst/gl/gstglsl.c:
+ * gst-libs/gst/gl/gstglsl_private.h:
+ * gst-libs/gst/gl/gstglviewconvert.c:
+ glsl: fixup external-oes shaders by mangling the required extension
+ Newer devices require using a different GLSL extension for accessing
+ external-oes textures in a shader using the texture() functions.
+ While the GL_OES_EGL_image_external_essl3 should supposedly be supported
+ on a any GLES3 android device, the extension was defined after a lot of the
+ older drivers were built so they will not know about it. Thus there are two
+ possible interpretations of which of texture[2D]() should be supported for
+ external-oes textures. Strict adherence to the GL_OES_EGL_image_external
+ extension spec which uses texture2D() or following GLES3's pattern, also
+ allowing texture() as a function for accessing external-oes textures
+ This adds another mangling pass to convert
+ #extension GL_OES_EGL_image_external : ...
+ into
+ #extension GL_OES_EGL_image_external_essl3 : ...
+ on GLES3 and when the GL_OES_EGL_image_external_essl3 extension is supported.
+ Only uses texture() when the GLES3 and the GL_OES_EGL_image_external_essl3
+ extension is supported for external-oes textures.
+ Uses GLES2 + texture2D() + GL_OES_EGL_image_external in all other external-oes
+ cases.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766993
+
+2016-05-24 16:26:24 +0530 Nirbheek Chauhan <nirbheek@centricular.com>
+
+ * sys/winks/ksdeviceprovider.c:
+ * sys/winks/kshelpers.c:
+ * sys/winks/kshelpers.h:
+ winks: Port to MSVC and pretend to be Windows XP
+ strcasecmp is not defined on MSVC, so just use the glib wrapper. Also pretend to
+ be Windows XP explicitly since the API we use was deprecated and removed
+ (ifdef-ed) from the SDK after this version of Windows. This will be especially
+ relevant once we stop supporting Windows XP soon:
+ https://bugzilla.gnome.org/show_bug.cgi?id=756866
+
+2016-03-02 02:17:54 +0530 Nirbheek Chauhan <nirbheek@centricular.com>
+
+ * win32/common/libgstadaptivedemux.def:
+ * win32/common/libgstbadaudio.def:
+ * win32/common/libgstbadbase.def:
+ * win32/common/libgstbadvideo.def:
+ * win32/common/libgstbasecamerabinsrc.def:
+ * win32/common/libgstinsertbin.def:
+ * win32/common/libgstmpegts.def:
+ * win32/common/libgsturidownloader.def:
+ win32: Add missing def files for libraries
+
+2016-03-02 00:55:15 +0530 Nirbheek Chauhan <nirbheek@centricular.com>
+
+ * gst/audiovisualizers/gstspacescope.c:
+ * gst/audiovisualizers/gstspectrascope.c:
+ * gst/audiovisualizers/gstsynaescope.c:
+ * gst/audiovisualizers/gstwavescope.c:
+ build: Factor out endian-order RGB formats
+ MSVC seems to ignore preprocessor conditionals inside static pad templates
+
+2016-06-13 22:29:39 -0400 Aaron Boxer <boxerab@gmail.com>
+
+ * ext/openjpeg/gstopenjpegdec.c:
+ * ext/openjpeg/gstopenjpegdec.h:
+ openjpegdec: use sampling field to determine RGB channel
+ https://bugzilla.gnome.org/show_bug.cgi?id=767402
+
+2016-06-02 13:53:38 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * tests/check/elements/templatematch.c:
+ templatematch: fix buffer leak in test
+ Need to call gst_check_drop_buffers() to unref the buffers exchanged
+ during the test.
+ https://bugzilla.gnome.org/show_bug.cgi?id=767159
+
+2016-05-19 13:31:56 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * tests/check/elements/glimagesink.c:
+ glimagesink: fix query leak in test
+ https://bugzilla.gnome.org/show_bug.cgi?id=766663
+
+2016-05-19 13:29:15 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * tests/check/elements/glimagesink.c:
+ glimagesink: properly setup/teardown tests
+ tcase_add_checked_fixture() is suppose to call the setup and teardown
+ functions so the tests don't have to do it manually.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766663
+
+2016-05-19 13:09:41 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * tests/check/libs/gstglupload.c:
+ glupload: fix shader leak in test
+ https://bugzilla.gnome.org/show_bug.cgi?id=766663
+
+2016-05-19 12:51:17 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * tests/check/elements/uvch264demux.c:
+ uvch264demux: fix buffer leaks in test
+ The mock chain functions aren't unreffing the buffers so the caller
+ should do it.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766663
+
+2016-05-19 12:36:42 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * tests/check/elements/camerabin.c:
+ camerabin: fix element leak in test
+ https://bugzilla.gnome.org/show_bug.cgi?id=766663
+
+2016-05-19 11:19:57 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * tests/check/elements/autoconvert.c:
+ fix buffer leaks in tests
+ gst_check_drop_buffers() release the buffers exchanged during the test.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766663
+
+2016-05-19 11:19:20 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * tests/check/elements/audiomixer.c:
+ * tests/check/elements/compositor.c:
+ fix event leaks in tests
+ The events are supposed to be unreffed when finishing the test, not
+ reffed.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766663
+
+2016-05-19 11:19:01 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * tests/check/elements/audiointerleave.c:
+ audiointerleave: fix message leaks by flushing the bus
+ https://bugzilla.gnome.org/show_bug.cgi?id=766663
+
+2016-05-19 11:16:37 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioaggregator.c:
+ audioaggregator: fix buffer leak
+ If the pad was still owning a buffer when being destroyed it was leaked.
+ Fix a leak with the test_flush_start_flush_stop test.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766663
+
+2016-05-18 16:58:44 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * tests/check/elements/autoconvert.c:
+ autoconvert: fix factories leak in test
+ The factories returned by gst_registry_find_feature() have to be
+ unreffed.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766663
+
+2016-06-17 14:58:44 +0200 Michael Olbrich <m.olbrich@pengutronix.de>
+
+ * gst-libs/gst/codecparsers/gsth264parser.c:
+ h264parse: fix default time_offset_length
+ The default value for time_offset_length should be 24, see
+ section E2.2 of the H264 spec.
+ https://bugzilla.gnome.org/show_bug.cgi?id=767792
+
+2016-06-17 14:31:42 +0200 Joan Pau Beltran <joanpau.beltran@socib.cat>
+
+ * ext/dc1394/gstdc1394src.c:
+ dc1394src: check for disabled transmission in _stop_cam
+ For symetry with _start_cam, check that the transmission
+ is effectively disabled in _stop_cam.
+ https://bugzilla.gnome.org/show_bug.cgi?id=763026
+
+2016-06-17 15:32:08 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: do not rely on temp var for fail detection
+ Use errno instead as local var might be overwritten
+ before the check.
+
+2016-06-14 15:29:08 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: rework set_pids()
+ - Reflow to avoid unneeded nesting
+ - Free aux pids array earlier
+ - Adjust debug output to deliver more meaningful information
+
+2016-06-14 14:24:35 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: drop pointless debug msg
+
+2016-06-09 16:05:39 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * gst-libs/gst/codecparsers/gsth264parser.h:
+ * gst-libs/gst/codecparsers/gsth265parser.h:
+ * gst-libs/gst/codecparsers/gstmpeg4parser.c:
+ * gst-libs/gst/codecparsers/gstmpegvideoparser.c:
+ * gst-libs/gst/codecparsers/gstmpegvideoparser.h:
+ * gst-libs/gst/codecparsers/gstvc1parser.c:
+ codecparsers: drop all otherwizes
+
+2016-06-12 13:53:18 -0400 Aaron Boxer <boxerab@gmail.com>
+
+ * gst/videoparsers/gstjpeg2000parse.c:
+ * gst/videoparsers/gstjpeg2000parse.h:
+ jpeg2000parse: support j2c format
+ https://bugzilla.gnome.org/show_bug.cgi?id=767512
+
+2016-06-16 01:54:16 +1000 Matthew Waters <matthew@centricular.com>
+
+ * tests/check/Makefile.am:
+ tests/glcontext: link against gstvideo for gst_video_info_*
+ fixes make distcheck complaining about it.
+
2016-04-14 18:14:32 +0300 Sergey Borovkov <sergey.borovkov@wireload.net>
* configure.ac:
@@ -208,182 +4094,91 @@
to get wayland display for QT.
https://bugzilla.gnome.org/show_bug.cgi?id=767553
-2016-03-04 15:50:26 +0900 Vineeth TM <vineeth.tm@samsung.com>
+2016-06-16 00:46:57 +1000 Matthew Waters <matthew@centricular.com>
- * ext/qt/gstqtsink.cc:
- bad: use new gst_element_class_add_static_pad_template()
- https://bugzilla.gnome.org/show_bug.cgi?id=763081
+ * tests/check/libs/gstglcontext.c:
+ tests/glcontext: update test for gen,del_texture removal
-2016-08-15 16:37:44 +1000 Jan Schmidt <jan@centricular.com>
+2016-06-14 22:12:18 +0200 Stefan Sauer <ensonic@users.sf.net>
- * sys/winks/gstksvideodevice.c:
- * sys/winks/gstksvideodevice.h:
- * sys/winks/gstksvideosrc.c:
- * sys/winks/ksvideohelpers.c:
- * sys/winks/ksvideohelpers.h:
- winks: Fix RGB frame flipping and postprocessing
- Uncompressed RGB frames can be (usually are) bottom-up
- layout in DirectShow, and the code to flip them wasn't
- properly ported from 0.10. Fix it.
- Fix post-processing of RGB buffers. We need a writable
- buffer, but the requests pool is holding an extra ref.
- This could use more fixing to use a buffer pool
+ * ext/ladspa/gstladspa.c:
+ ladspa: simplify registry cache structure creation
+ Create and fill structure in one go.
-2016-08-12 22:17:25 +1000 Jan Schmidt <jan@centricular.com>
+2016-06-14 13:48:09 +0800 Haihua Hu <jared.hu@nxp.com>
- * sys/winks/gstksvideosrc.c:
- winks: Give the ksvideosrc PRIMARY rank
- It's the primary video source on Windows, so give it a
- rank for autoplugging by camerabin and friends
+ * ext/gl/effects/gstgleffectssources.c:
+ gleffects: fix little rectangle that appears at the center of squeeze and tunnel effects
+ These two shader will calculate the vector length and use it as denominator.
+ But length could be zero which will cause undefine behaviour. Add protection for
+ this condition
+ https://bugzilla.gnome.org/show_bug.cgi?id=767635
-2016-08-12 22:16:33 +1000 Jan Schmidt <jan@centricular.com>
+2016-06-15 18:10:59 +1000 Matthew Waters <matthew@centricular.com>
- * sys/winks/ksvideohelpers.c:
- winks: Fix swapped RGBx/RGB caps mapping, and endianness.
- The RGBx and RGB format mappings were reversed.
- What Windows calls RGB are laid out as BGR in our parlance, so
- switch that too
+ * gst-libs/gst/gl/gstglsl.c:
+ glsl: add some debugging
-2016-05-24 16:26:24 +0530 Nirbheek Chauhan <nirbheek@centricular.com>
+2016-06-15 16:08:57 +1000 Matthew Waters <matthew@centricular.com>
- * sys/winks/ksdeviceprovider.c:
- * sys/winks/kshelpers.c:
- * sys/winks/kshelpers.h:
- winks: Port to MSVC and pretend to be Windows XP
- strcasecmp is not defined on MSVC, so just use the glib wrapper. Also pretend to
- be Windows XP explicitly since the API we use was deprecated and removed
- (ifdef-ed) from the SDK after this version of Windows. This will be especially
- relevant once we stop supporting Windows XP soon:
- https://bugzilla.gnome.org/show_bug.cgi?id=756866
+ * gst-libs/gst/gl/gstglutils.c:
+ * gst-libs/gst/gl/gstglutils.h:
+ glutils: remove unused functions for texture creation/deletion
+ Everyone uses GstGLMemory now and any future code should as well.
-2016-07-18 18:36:42 +0100 Tim-Philipp Müller <tim@centricular.com>
+2016-06-15 15:47:47 +1000 Matthew Waters <matthew@centricular.com>
- * ext/openh264/gstopenh264dec.cpp:
- * ext/openh264/gstopenh264enc.cpp:
- * ext/openh264/gstopenh264enc.h:
- openh264: fix up for API changes in v1.6.0
- Update for API changes in v1.6.0.
- https://bugzilla.gnome.org/show_bug.cgi?id=768771
+ * gst-libs/gst/gl/gstglfilter.h:
+ glfilter: remove unused class fields in/out_tex_id
+ The functionality is not used by any subclass nor are the values set anywhere.
-2016-05-24 00:55:11 +0100 Tim-Philipp Müller <tim@centricular.com>
+2016-06-15 15:08:39 +1000 Matthew Waters <matthew@centricular.com>
- * gst-libs/gst/gl/Makefile.am:
- * gst-libs/gst/insertbin/Makefile.am:
- * gst-libs/gst/mpegts/Makefile.am:
- * gst-libs/gst/player/Makefile.am:
- g-i: pass compiler env to g-ir-scanner
- It's what introspection.mak does as well. Should
- fix spurious build failures on gnome-continuous.
+ * ext/gl/gstgldeinterlace.c:
+ gldeinterlace: remove dead code accessing filter->in_tex_id
+ It's not set by anyone or anything and gldeinterlace is the only user of it now.
-2016-04-22 15:02:01 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+2016-06-15 14:40:40 +1000 Matthew Waters <matthew@centricular.com>
- * tests/check/elements/adaptive_demux_common.c:
- * tests/check/elements/adaptive_demux_common.h:
- tests: adaptivedemux: only check for data length after seek
- When the test involves doing a seek, only check for data size after
- the seek. The final segment range after seek might be different/smaller
- than the threshold for doing the seek and doing the check before
- seeking would fail.
+ * gst-libs/gst/gl/gstglupload.c:
+ gl/upload/meta: remove unneeded texture deletion
+ The textures are managed by the GstGLMemory inside the output buffer. Freeing
+ them prematurely may result in a use-after-free.
-2016-07-13 23:02:10 +1000 Jan Schmidt <jan@centricular.com>
+2016-05-30 14:10:23 +0200 Aleix Conchillo Flaqué <aleix@oblong.com>
- * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
- * gst-libs/gst/adaptivedemux/gstadaptivedemux.h:
- adaptivedemux: Add more safeguards around state changes.
- Make state changes of internal elements more reliable by locking
- their state, and ensuring that they aren't blocked pushing data
- downstream before trying to set their state.
- Add a boolean to avoid starting tasks when the main
- thread is busy trying to shut the element down.
+ * ext/srtp/gstsrtpenc.c:
+ * ext/srtp/gstsrtpenc.h:
+ srtpenc: remove get-rollover-counter signal and add stats property
+ We remove get-rollover-counter signal in favor of the "stats"
+ property. The "stats" property is a GstStructure with caps
+ application/x-srtp-encoder-stats that contains an array of
+ structures with caps application/x-srtp-stream.
+ Each stream structure contains "ssrc" and "roc" fields.
+ https://bugzilla.gnome.org/show_bug.cgi?id=733265
-2016-07-13 23:02:10 +1000 Jan Schmidt <jan@centricular.com>
+2016-05-25 12:55:36 +0200 Mats Lindestam <matslm@axis.com>
- * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
- adaptivedemux: More locking/switching fixes
- Release the manifest lock when signalling no-more-pads, as
- that can call back into adaptivedemux again
- Partial cherry-pick of 03f96d
+ * gst/videoparsers/gsth264parse.c:
+ h264parse: support for handling of config-interval = -1
+ Added support for handling of config-interval = -1.
+ config-inteval = -1 represents resending SPS and PPS for each
+ I-/IDR-frame.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766803
-2016-07-26 01:17:11 +1000 Jan Schmidt <jan@centricular.com>
+2016-05-25 12:45:17 +0200 Mats Lindestam <matslm@axis.com>
- * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
- adaptivedemux: Drop the manifest lock during outbound actions
- Drop the manifest lock when performing actions that might
- call back into adaptivedemux and trigger deadlocks, such
- as adding/removing pads or sending in-band events (EOS).
- Unlock the manifest lock when changing the child bin state to
- NULL, as it might call back to acquire the manifest lock when
- shutting down pads.
- Drop the manifest lock while pushing events.
+ * gst/videoparsers/gsth264parse.c:
+ h264parse: refactored handling of SPS/PPS when pushing frames
+ https://bugzilla.gnome.org/show_bug.cgi?id=766803
-2016-05-18 16:55:38 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+2016-05-25 11:54:55 +0200 Mats Lindestam <matslm@axis.com>
- * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
- adaptivedemux: fix pending tags leak
- https://bugzilla.gnome.org/show_bug.cgi?id=766662
-
-2016-05-09 12:50:47 +0300 Sebastian Dröge <sebastian@centricular.com>
-
- * sys/applemedia/Makefile.am:
- applemedia: Ship all headers in tarballs
- Some were missing from noinst_HEADERS.
- https://bugzilla.gnome.org/show_bug.cgi?id=766163
-
-2016-06-30 23:06:29 +0200 Sebastian Dröge <sebastian@centricular.com>
-
- * ext/openh264/gstopenh264enc.cpp:
- openh264enc: Use a constant SPS/PPS ID no matter if openh264 older or newer than 1.4 is used
-
-2016-06-30 23:35:33 +0200 Sebastian Dröge <sebastian@centricular.com>
-
- * ext/openh264/gstopenh264enc.cpp:
- openh264enc: Fix initial time-per-frame calculation
-
-2016-06-30 10:33:30 +0200 Sebastian Dröge <sebastian@centricular.com>
-
- * ext/openh264/gstopenh264enc.cpp:
- openh264enc: Remove broken byte-stream to avc conversion and just output byte-stream as generated by the encoder
- The byte-stream to avc conversion did not consider NAL sizes bigger than 2^16,
- multiple layers, multiple NALs per layer, and various other things. This
- caused corrupted streams in higher bitrates and other circumstances.
- Let's just forward byte-stream as generated by the encoder and let h264parse
- handle conversion to avc if needed. That way we only have to keep around one
- version of the conversion and don't have to fix it in multiple places.
-
-2016-06-28 19:26:29 +0300 Sebastian Dröge <sebastian@centricular.com>
-
- * sys/d3dvideosink/d3dhelpers.c:
- * sys/d3dvideosink/d3dvideosink.c:
- d3dvideosink: Replace some more gst_caps_to_string() with GST_PTR_FORMAT
- https://bugzilla.gnome.org/show_bug.cgi?id=768146
-
-2016-06-28 11:50:59 -0400 Jonathan Roy <jroy@adetelgroup.com>
-
- * sys/d3dvideosink/d3dvideosink.c:
- d3dvideosink: leak on caps string
- https://bugzilla.gnome.org/show_bug.cgi?id=768146
-
-2016-05-19 11:16:37 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
-
- * gst-libs/gst/audio/gstaudioaggregator.c:
- audioaggregator: fix buffer leak
- If the pad was still owning a buffer when being destroyed it was leaked.
- Fix a leak with the test_flush_start_flush_stop test.
- https://bugzilla.gnome.org/show_bug.cgi?id=766663
-
-2016-06-17 14:58:44 +0200 Michael Olbrich <m.olbrich@pengutronix.de>
-
- * gst-libs/gst/codecparsers/gsth264parser.c:
- h264parse: fix default time_offset_length
- The default value for time_offset_length should be 24, see
- section E2.2 of the H264 spec.
- https://bugzilla.gnome.org/show_bug.cgi?id=767792
-
-2016-06-13 09:20:02 +0300 Sebastian Dröge <sebastian@centricular.com>
-
- * sys/applemedia/iosassetsrc.m:
- iosassetsrc: Print the correct URI if it was rejected
- We were printing the previously set URI instead of the new one.
+ * gst/videoparsers/gsth264parse.c:
+ * gst/videoparsers/gsth264parse.h:
+ h264parse: change "config-interval" property type from uint to int
+ So we can use -1 as special value like in rtph264pay.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766803
2016-06-13 09:20:22 +0300 Sebastian Dröge <sebastian@centricular.com>
@@ -397,24 +4192,1120 @@
ipod-library://item/item.m4a%3Fid%3D3143338395173862951
https://bugzilla.gnome.org/show_bug.cgi?id=767492
-2016-06-14 13:48:09 +0800 Haihua Hu <jared.hu@nxp.com>
+2016-06-13 09:20:02 +0300 Sebastian Dröge <sebastian@centricular.com>
- * ext/gl/effects/gstgleffectssources.c:
- gleffects: fix little rectangle that appears at the center of squeeze and tunnel effects
- These two shader will calculate the vector length and use it as denominator.
- But length could be zero which will cause undefine behaviour. Add protection for
- this condition
- https://bugzilla.gnome.org/show_bug.cgi?id=767635
+ * sys/applemedia/iosassetsrc.m:
+ iosassetsrc: Print the correct URI if it was rejected
+ We were printing the previously set URI instead of the new one.
-=== release 1.8.2 ===
+2016-06-09 01:20:36 +0200 Sebastian Rasmussen <sebrn@axis.com>
-2016-06-09 11:51:42 +0300 Sebastian Dröge <sebastian@centricular.com>
+ * ext/curl/gstcurlsmtpsink.c:
+ curlsmtpsink: Lock and don't send final boundary upon error
+ Previously GstCurlSmtpSink could cause the pipeline thread to end up
+ waiting for a stopped thread to perform work.
+ The scenario was that the sink could be rendering a buffer and waiting
+ for the curl transfer thread to have sent the data. As soon as the
+ transfer thread has copied all data to curl's data buffer in
+ gst_curl_base_sink_transfer_read_cb() then the render call would stop
+ waiting and return GST_FLOW_OK. While this takes place the transfer
+ thread may suffer from an error e.g. due gst_poll_wait() timing out.
+ This causes the transfer thread to record the error, claim (it is not
+ really true since there was an error) that the data has been sent and
+ that a response has been received by trying to signal the pipeline
+ thread (but this has already stopped waiting). Finally the transfer
+ thread stops itself. A short while later the pipeline thread may attempt
+ to push an EOS event into GstCurlSmtpSink. Since there is no check in
+ gst_curl_smtp_sink_event() to check if the sink has suffered from any
+ error it may attempt to add a final boundary and ask the, now deceased,
+ transfer thread to transfer the new data. Next the sink element would
+ have waited for the transfer to complete (using a different mechanism
+ than normal transfers through GstCurlBaseSink). In this case there was
+ an error check to avoid waiting if an error had already been seen.
+ Finally GstCurlSmtpSink would chain up to GstCurlBaseSink which would
+ then block waiting for a response (normally this would be prevented by
+ the transfer thread suffering the error claiming that it had been
+ received, but GstCurlSmtpSink clobbered this flag after the fact).
+ Now GstCurlSmtpSink avoids this by locking over the entire event handing
+ (preventing simultaneous changes to flags by the two threads) and also
+ by avoiding to initiate transfer of final boundary if an error has
+ already been seen.
+ Also add GST_FIXME() for remaining similar issue where the pipeline
+ thread may block indefinitely waiting for transfer thread to transfer
+ data but the transfer thread errors out and fails to notify the pipeline
+ thread that the transfer failed.
+ https://bugzilla.gnome.org/show_bug.cgi?id=767501
- * ChangeLog:
- * NEWS:
- * RELEASE:
+2016-06-08 11:32:28 -0400 Aaron Boxer <boxerab@gmail.com>
+
+ * gst/videoparsers/gstjpeg2000parse.c:
+ * gst/videoparsers/gstjpeg2000parse.h:
+ * gst/videoparsers/gstjpeg2000sampling.h:
+ jpeg2000parse: Require either colorspace or sampling field in sink caps
+ And always set the sampling field on the src caps, if necessary guessing a
+ correct value for it from the colorspace field.
+ Also, did some cleanup: removed sampling enum - redundant.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766236
+
+2016-06-10 11:32:46 +0300 Heinrich Fink <hfink@toolsonair.com>
+
+ * ext/opencv/gstfacedetect.cpp:
+ facedetect: Fix compiler warning with clang 3.8
+ Use namespace only after it was actually defined by a header.
+ gstfacedetect.cpp:79:17: error: using directive refers to implicitly-defined namespace 'std' [-Werror]
+ using namespace std;
+ ^
+
+2016-06-06 16:35:15 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: unify exit paths on _start()
+
+2016-06-06 15:31:31 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: use proper acronym for PID (Packet Identifier)
+ Drop formatting tab from message while at it.
+
+2016-06-06 12:25:22 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: set common PES filter params once and reuse
+ Avoid setting the same harcoded values over and over again.
+
+2016-06-09 22:01:45 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * ext/dc1394/gstdc1394src.c:
+ dc1394src: minor clean-up
+ We always call _parse_caps() with non-NULL out vars.
+
+2016-06-09 22:01:13 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * ext/dc1394/gstdc1394src.c:
+ dc1394src: fix some more c99-isms
+
+2016-06-09 21:47:05 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * docs/plugins/Makefile.am:
+ docs: fix for renamed dc1394 source file
+ https://bugzilla.gnome.org/show_bug.cgi?id=763026
+
+2016-06-07 15:50:50 +0200 Joan Pau Beltran <joanpau.beltran@socib.cat>
+
+ * ext/dc1394/Makefile.am:
+ * ext/dc1394/gstdc1394src.c:
+ * ext/dc1394/gstdc1394src.h:
+ dc1394src: prefix and file names according to Gstreamer conventions
+ Replace the type and function prefix to follow the conventions:
+ - Use `GST_TYPE_DC1394_SRC` instead of `GST_TYPE_DC1394`.
+ - Use `GstDC1394Src` and `GstDC1394SrcClass` instead of
+ `GstDc1394` and `GstDc1394Class`.
+ - Use `gst_dc1394_src` instead of `gst_dc1394`.
+ https://bugzilla.gnome.org/show_bug.cgi?id=763026
+
+2016-05-10 18:30:35 +0200 Joan Pau Beltran <joanpau.beltran@socib.cat>
+
* configure.ac:
+ * ext/dc1394/Makefile.am:
+ * ext/dc1394/gstdc1394.c:
+ * ext/dc1394/gstdc1394.h:
+ dc1394src: port to 1.X
+ The dc1394src is a PushSrc element for IIDC cameras based on libdc1394.
+ The implementation from the 0.x series is deffective:
+ caps negotiation does not work, and some video formats
+ provided by the camera are not supported.
+ Refactor the code to port it to 1.X and enhance the support
+ for the full set of video options of IIDC cameras:
+ - The IIDC specification includes a set of camera video modes
+ (video format, frame size, and frame rates).
+ They do not map perfectly to Gstreamer formats, but those that
+ do not match are very rare (if used at all by any camera).
+ In addition, although the specification includes a raw format,
+ some cameras use mono video formats to capture in Bayer format.
+ Map corresponding video modes to Gstreamer formats in capabilities,
+ allowing both gray raw and Bayer video formats for mono video modes.
+ - The specification includes scalable video modes (Format7),
+ where the frame size and rate can be set to arbitrary values
+ (within the limits of the camera and the bus transport).
+ Allow the use of such mode, using the frame size and rate
+ from the negotiatied caps, and set the camera frame rate
+ adjusting the packet size as in:
+ <http://damien.douxchamps.net/ieee1394/libdc1394/faq/#How_do_I_set_the_frame_rate>
+ The scalable modes also allow for a custom ROI offset.
+ Support for it can be easily added later using properties.
+ - Camera operation using libdc1394 is as follows:
+ 1. Enumerate cameras on the system and open the camera
+ identified the enumeration index or by a GUID (64bit hex code).
+ 2. Query the video formats supported by the camera.
+ 3. Configure the camera for the desired video format.
+ 4. Setup the capture resources for the configured video format
+ and start the camera transmission.
+ 5. Capture frames from the camera and release them when not used.
+ 6. Stop the camera transmission and clear the capture resources.
+ 7. Close the camera freeing its resources.
+ Do steps 2 and 3 when getting and setting the caps respectively.
+ Ideally 4 and 6 would be done when going from PAUSED to PLAYING
+ and viceversa, but since caps might not be set yet, the video mode
+ is not properly configured leaving the camera in a broken state.
+ Hence, setup capture and start transmission in the set caps method,
+ and consequently clear the capture and stop the transmission
+ when going from PAUSED to READY (instead of PLAYING to PAUSED).
+ Symmetrycally, open the camera when going from READY to PAUSED,
+ allowing to probe the camera caps in the negotiation stage.
+ Implement that using the `start` and `stop` methods of `GstBaseSrc`,
+ instead of the `change-state` method of `GstElement`.
+ Stop the camera before setting new caps and restarting it again
+ to handle caps reconfiguration while in PLAYING (it has no effect
+ if the camera is not started).
+ - Create buffers copying the bytes of the captured frames.
+ Alternatively, the buffers could just wrap the bytes of the frames,
+ releasing the frame in the buffer's destroy notify function,
+ if all buffers were destroyed before going from PLAYING to PAUSED.
+ - No timestamp nor offset is set when creating buffers.
+ Timestamping is delegated to the parent class BaseSrc,
+ setting `gst_base_src_set_live` TRUE, `gst_base_src_set_format`
+ with GST_FORMAT_TIME and `gst_base_src_set_do_timestamp`.
+ Captured frames have a timestamp field with the system time
+ at the completion of the transmission of the frame,
+ but it is not sure that this comes from a monotonic clock,
+ and it seems to be left NULL in Windows.
+ - Use GUID and unit properties to select the camera to operate on.
+ The camera number used in version 0.X does not uniquely identify
+ the device (it depends on the set of cameras currently detected).
+ Since the GUID is 64bit identifier (same as MAC address),
+ handle it with a string property with its hexadecimal representation.
+ For practicality, operate on the first camera available if the GUID
+ is null (default) and match any camera unit number if unit is -1.
+ Alternatively, the GUID could be handed with an unsigned 64 bit
+ integer type property, using `0xffffffffffffffff` as default value
+ to select the first camera available (it is not a valid GUID value).
+ - Keep name `GstDc1394` and prefix `gst_dc1394` as in version 0.X,
+ although `GstDC1394Src` and `gst_dc1394_src` are more descriptive.
+ - Adjust build files to reenable the compilation of the plugin.
+ Remove dc1394 from the list of unported plugins in configure.ac.
+ Add the missing flags and libraries to Makefile.
+ Use `$()` for variable substitution, as many plugins do,
+ although other plugins use `@@` instead.
+ https://bugzilla.gnome.org/show_bug.cgi?id=763026
+
+2016-06-08 18:02:32 +0200 Edward Hervey <edward@centricular.com>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ adaptivedemux: Move SEEK handling to a separate function
+ Just for code readability. Doesn't change behaviour
+
+2016-06-07 21:10:04 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/webp/gstwebpdec.c:
+ webpdec: Wait for segment event before checking it
+ The heuristic to choose between packetise or not was changed to use the
+ segment format. The problem is that this change is reading the segment
+ during the caps event handling. The segment event will only be sent
+ after. That prevented the decoder to go in packetize mode, and avoid
+ useless parsing.
+ https://bugzilla.gnome.org/show_bug.cgi?id=736252
+
+2016-06-07 21:04:21 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst/vmnc/vmncdec.c:
+ vmncdec: Wait for segment event before checking it
+ The heuristic to choose between packetise or not was changed to use the
+ segment format. The problem is that this change is reading the segment
+ during the caps event handling. The segment event will only be sent
+ after. That prevented the decoder to go in packetize mode, and avoid
+ useless parsing.
+ https://bugzilla.gnome.org/show_bug.cgi?id=736252
+
+2016-06-07 14:15:41 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * ext/openjpeg/gstopenjpegenc.c:
+ openjpeg: fix builddir != srcdir build, and distcheck
+
+2016-06-01 19:02:33 -0400 Aaron Boxer <boxerab@gmail.com>
+
* docs/plugins/gst-plugins-bad-plugins.hierarchy:
+ * docs/plugins/inspect/plugin-videoparsersbad.xml:
+ * gst/videoparsers/Makefile.am:
+ * gst/videoparsers/gstjpeg2000parse.c:
+ * gst/videoparsers/gstjpeg2000parse.h:
+ * gst/videoparsers/gstjpeg2000sampling.h:
+ * gst/videoparsers/plugin.c:
+ jpeg2000parse: Add JPEG2000 parser element
+ https://bugzilla.gnome.org/show_bug.cgi?id=766236
+
+2016-06-01 19:01:44 -0400 Aaron Boxer <boxerab@gmail.com>
+
+ * ext/openjpeg/gstopenjpegenc.c:
+ * gst/videoparsers/Makefile.am:
+ * gst/videoparsers/gstjpeg2000sampling.h:
+ openjpeg: set sampling in the caps
+ https://bugzilla.gnome.org/show_bug.cgi?id=766236
+
+2016-05-02 17:38:50 +0200 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com>
+
+ * gst/mpegtsmux/mpegtsmux.c:
+ mpegtsmux: Set PTS on aligned buffers
+ This was broken in 09c05df (make "alignment" property more useful for
+ packetisation).
+ https://bugzilla.gnome.org/show_bug.cgi?id=765926
+
+2016-06-07 17:22:01 +1000 Alessandro Decina <alessandro.d@gmail.com>
+
+ * sys/applemedia/vtdec.c:
+ vtdec: always drain in ::negotiate
+ Move calling gst_vtdec_push_frames_if_needed from ::set_format to ::negotiate so
+ that we always drain even when renegotiation is triggered by downstream.
+
+2016-06-07 16:00:01 +1000 Alessandro Decina <alessandro.d@gmail.com>
+
+ * sys/applemedia/vtdec.c:
+ vtdec: try to preserve downstream caps order
+ vtdec specifies sysmem; GLMemory as template caps. When negotiating, we used to
+ call gst_pad_peer_query_caps (..., filter) with our template caps as filter. The
+ query does gst_caps_intersect (filter, peercaps) internally which gives
+ precedence to the order of the filter caps. While we want to output sysmem by
+ default, when negotiating with glimagesink which returns GLMemory; sysmem; we
+ do want to do GL, so we now query using a NULL filter and intersect the result
+ with our template caps giving precedence to downstream's caps.
+ tl;dr: make sure we end up negotiating GLMemory with glimagesink
+
+2016-06-06 14:08:43 -0400 Xavier Claessens <xavier.claessens@collabora.com>
+
+ * sys/androidmedia/gstahcsrc.c:
+ ahcsrc: Avoid a div by 0 warning
+ https://bugzilla.gnome.org/show_bug.cgi?id=767302
+
+2016-06-06 12:38:45 -0400 Xavier Claessens <xavier.claessens@collabora.com>
+
+ * sys/androidmedia/gstamcvideoenc.c:
+ amcvideoenc: Do not call gst_object_unref on GstCaps
+ https://bugzilla.gnome.org/show_bug.cgi?id=767298
+
+2016-05-19 11:16:50 +0200 Edward Hervey <edward@centricular.com>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ adaptivedemux: Set DISCONT on startup, resume and after seeks
+ Initial buffers after STREAM_START and seeks should always have the
+ DISCONT flag set.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766650
+
+2015-09-23 02:51:57 +1000 Jan Schmidt <jan@centricular.com>
+
+ * gst/mpegtsdemux/tsdemux.c:
+ * gst/mpegtsdemux/tsdemux.h:
+ tsdemux: Change the pad naming scheme to include a generation ID
+ A simple fix for the problem of creating new pads with duplicate
+ names when switching program, easier than the alternative of
+ trying to work out which pads might persist and manage that.
+ See https://bugzilla.gnome.org/show_bug.cgi?id=758454
+
+2016-06-06 11:13:00 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/player/gstplayer.c:
+ player: pause() should not inhibit signals but work exactly like play()
+ https://bugzilla.gnome.org/show_bug.cgi?id=766607#c23
+
+2016-06-03 15:58:52 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: improve description of PIDs property
+
+2016-06-03 07:11:33 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * sys/applemedia/Makefile.am:
+ applemedia: Only use the OpenGL framework on OSX
+ It's not available on ios (uses OpenGLES already)
+ https://bugzilla.gnome.org/show_bug.cgi?id=766973
+
+2016-05-17 17:14:49 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * gst-libs/gst/gl/egl/gstglmemoryegl.c:
+ * gst-libs/gst/gl/gstglbuffer.c:
+ * gst-libs/gst/gl/gstglmemorypbo.c:
+ * gst-libs/gst/video/gstvideoaggregator.c:
+ gst-libs: gl, video: use MAY_BE_LEAKED flag
+ https://bugzilla.gnome.org/show_bug.cgi?id=767162
+
+2016-05-18 12:48:48 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * sys/bluez/gsta2dpsink.c:
+ a2dpsink: unref avdtpsink if state transition failed
+ If for some reason the avdtpsink element can't go READY then the
+ gsta2dpsink can't either and so should release the ressources it
+ allocates when trying to do so.
+ Fix a leak with the generic/states test.
+ https://bugzilla.gnome.org/show_bug.cgi?id=767161
+
+2016-05-28 21:34:52 +0200 Havard Graff <havard.graff@gmail.com>
+
+ * sys/applemedia/Makefile.am:
+ applemedia: CGLTexImageIOSurface2D needs the OpenGL framework on OSX
+ https://bugzilla.gnome.org/show_bug.cgi?id=766973
+
+2016-05-28 21:39:00 +0200 Havard Graff <havard.graff@gmail.com>
+
+ * sys/applemedia/avsamplevideosink.m:
+ avsamplevideosink: check we are compiling for 10.1 up to 10.4
+ This API was deprecated in 10.4, so don't use it for 10.5 and onwards.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766973
+
+2016-06-01 13:43:32 +0200 Heinrich Fink <hfink@toolsonair.com>
+
+ * sys/applemedia/vtenc.c:
+ * sys/applemedia/vtenc.h:
+ applemedia: vtenc: Register a hardware-only vtenc_h264_hw element on OSX
+ Similar to vtdec_hw, this commit adds a vtenc_h264_hw element that fails
+ caps negotiation unless a hardware encoder could actually be acquired.
+ This is useful in situations where a fallback to a software encoder
+ other than the vtenc_h264 software encoder is desired (e.g. to x264enc).
+ https://bugzilla.gnome.org/show_bug.cgi?id=767104
+
+2016-06-02 16:30:02 +1000 Alessandro Decina <alessandro.d@gmail.com>
+
+ * sys/applemedia/vtdec.c:
+ vtdec: make vtdec_hw fallback to software on renegotiation
+ When renegotiating mid stream - for example with variable bitrate
+ streams - and therefore destroying and recreating VTSessions, the
+ hw decoder might become temporarily unavailable.
+ To deal with this and avoid erroring out on bitrate changes,
+ vtdec_hw now falls back to using the software decoder if the hw
+ one was available at some point but isn't anymore. At
+ renegotiation/bitrate change time, it will still retry to open
+ the hardware one.
+
+2016-06-02 13:10:51 +1000 Alessandro Decina <alessandro.d@gmail.com>
+
+ * sys/applemedia/vtdec.c:
+ vtdec: fix switching from GLMemory to Sysmem
+ When renegotiating from GLMemory to Sysmem do teardown the texture_cache.
+ Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=766190
+
+2016-06-02 11:36:57 +1000 Alessandro Decina <alessandro.d@gmail.com>
+
+ * sys/applemedia/vtdec.c:
+ vtdec: optimize renegotiation
+ ::negotiate can be called several times before the CAPS event is sent downstream
+ so use the currently configured output state caps instead of the pad current
+ caps when deciding whether to recreate the VTSession or not.
+ This leads to creating/destroying less VTSessions which makes renegotiation more
+ reliable especially when using hw decoding.
+
+2016-06-01 13:52:10 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: remove comment on self-explanatory code
+
+2016-06-01 13:18:21 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: avoid out-bound write on PID filter array
+ There's no need for an end-of-list marker in the filter
+ PIDs array if full, as the absolute maximum number of
+ elements (MAX_FILTERS) is known.
+ CID #1362441
+
+2016-05-31 20:41:14 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * sys/androidmedia/gstahcsrc.c:
+ androidmedia: fix error debug message when camera doesn't exist
+ Makes no sense to include the system error here since errno
+ will likely not be set and then it says 'system error: success'
+ which is confusing.
+ https://bugzilla.gnome.org/show_bug.cgi?id=767087
+
+2016-05-31 18:58:43 +0900 Justin Kim <justin.kim@collabora.com>
+
+ * sys/androidmedia/gstahcsrc.c:
+ ahcsrc: release resources in 'finalize' function
+ In general, 'dispose' function is used for dropping all references
+ and 'finalize' is called for releasing instances.
+ https://bugzilla.gnome.org/show_bug.cgi?id=763309
+
+2016-05-25 15:01:31 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * gst-libs/gst/player/gstplayer.c:
+ * tests/check/libs/player.c:
+ player: inhibit signals after gst_player_stop() has been called
+ Also wait for the state change to STOP to have been announced before
+ destroying the player so it won't appear as leaked by leak detector
+ tools.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766607
+
+2016-05-25 12:48:13 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * tests/check/libs/player.c:
+ player: handle uri-loaded in test
+ Had to adapt the existing tests because of this new callback.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766607
+
+2016-05-25 16:57:49 -0700 Scott D Phillips <scott.d.phillips@intel.com>
+
+ * gst/videoparsers/gsth265parse.c:
+ h265parse: Don't assume contiguous id's in make_codec_data
+ vps/sps/pps id's are not required to be used contiguously.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766891
+
+2016-05-28 01:22:32 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: add sample ATSC launch line
+
+2016-05-28 21:36:04 +0200 Havard Graff <havard.graff@gmail.com>
+
+ * gst-libs/gst/gl/gstglquery.c:
+ gl: glquery: cast to silence compiler warning
+ https://bugzilla.gnome.org/show_bug.cgi?id=766973
+
+2016-05-28 21:35:37 +0200 Havard Graff <havard.graff@gmail.com>
+
+ * ext/gl/gstgltestsrc.h:
+ gltestsrc: gltestsrc.h already defines GstGLTestSrc
+ And redefinition is not allowed.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766973
+
+2016-05-27 23:24:54 +0200 Havard Graff <havard.graff@gmail.com>
+
+ * gst-libs/gst/player/gstplayer.c:
+ player: use correct _NONE enum
+ https://bugzilla.gnome.org/show_bug.cgi?id=766973
+
+2016-05-28 10:44:04 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * gst-libs/gst/codecparsers/gsth264parser.c:
+ * gst-libs/gst/codecparsers/gsth264parser.h:
+ h264parser: maintain minimal ABI compat
+ Because we can.
+ https://bugzilla.gnome.org/show_bug.cgi?id=723352
+
+2014-05-22 16:12:01 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/codecparsers/gsth264parser.c:
+ * gst-libs/gst/codecparsers/gsth264parser.h:
+ h264parser: Remove unused fps_num/fps_den fields
+ Instead the newly added function should be used to calculate
+ the framerate properly.
+ https://bugzilla.gnome.org/show_bug.cgi?id=723352
+
+2016-05-25 10:59:00 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * ext/smoothstreaming/gstmssmanifest.c:
+ smoothstreaming: update fps calculation for h264 codec parser API changes
+ Use new gst_h264_video_calculate_framerate() API instead of fps_n/fps_d
+ fields in SPS struct which are to be removed.
+ Apparently H264 content in MSS is always non-interlaced/progressive,
+ so we can just pass 0 for field_pic_flag and don't need to parse any
+ slice headers first if there's no external signalling. But even if
+ that's not the case the new code is not worse than the existing code.
+ https://msdn.microsoft.com/en-us/library/cc189080%28VS.95%29.aspx
+ https://bugzilla.gnome.org/show_bug.cgi?id=723352
+
+2016-05-26 10:28:14 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: use single marker at end of filtering PID list
+ Avoids at least ~100 unneeded assignment operations at runtime
+
+2016-05-23 16:31:05 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: simplify reporting of set polarity
+
+2016-05-23 14:41:40 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: fix bandwidth-hz property description
+ Bandwidth Hz is no longer a DVBT-only property
+
+2016-05-23 14:02:10 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: fix usage of PES & DVR acronyms everywhere
+ Additionally, improve message on gst_poll_new() failure
+
+2016-05-26 20:16:07 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstgldisplay.c:
+ gldisplay: always unref the context on a collision
+ Otherwise we will leak GstGLContext's when adding the same context more than
+ once.
+ Fixes a regression caused by 5f9d10f6036068502ad23e1ec86a73e341801ae1 in the
+ gstglcontext unit test that failed with:
+ Assertion 'tmp == NULL' failed
+
+2016-05-25 13:38:47 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst-libs/gst/base/gstaggregator.c:
+ Revert "aggregator: Start the task when linked"
+ This reverts commit 302580c3815136d29479c3a8cae611d6e2ff3709.
+
+2016-05-20 14:34:37 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * ext/gl/caopengllayersink.h:
+ * ext/gl/caopengllayersink.m:
+ caopengllayersink: Don't cache buffer pool
+ Pools cannot be used by the two elements at the same time.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766611
+
+2016-04-13 16:30:28 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst-libs/gst/base/gstaggregator.c:
+ aggregator: Start the task when linked
+ Until now we would start the task when the pad is activated. Part of the
+ activiation concist of testing if the pipeline is live or not.
+ Unfortunatly, this is often too soon, as it's likely that the pad get
+ activated before it is fully linked in dynamic pipeline.
+ Instead, start the task when the first serialized event arrive. This is
+ a safe moment as we know that the upstream chain is complete and just
+ like the pad activation, the pads are locked, hence cannot change.
+ https://bugzilla.gnome.org/show_bug.cgi?id=757548
+
+2016-05-25 09:09:01 -0400 Xavier Claessens <xavier.claessens@collabora.com>
+
+ * gst-libs/gst/gl/win32/gstglcontext_wgl.c:
+ gl: win32: Add debug category in gstglcontext_wgl.c
+ https://bugzilla.gnome.org/show_bug.cgi?id=766867
+
+2016-05-16 20:02:28 +0800 Haihua Hu <jared.hu@nxp.com>
+
+ * ext/gl/gstglimagesink.c:
+ * ext/gl/gstglimagesink.h:
+ * gst-libs/gst/gl/gstglutils.c:
+ * gst-libs/gst/gl/gstglutils.h:
+ glimagesink: support video rotation using transform matrix
+ Add "rotate-method" to glimagesink and apply transform matrix
+ to vertex coordinate to control rotation.
+ https://bugzilla.gnome.org/show_bug.cgi?id=765795
+
+2016-05-24 23:39:27 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gstglbasemixer.c:
+ glvideomixer: fix race retrieving the GL context from the display
+ _get_gl_context() can be called concurrently from either propose_allocation() or
+ decide_allocation(). If it so happens that this happens at the same time,
+ the check for whether we already had a GL context was outside the lock. Inside
+ the lock and loop, the first thing that happens is that we unref the current GL
+ context (if valid) as if there was a conflict adding it to the display. If the
+ timing was unlucky, subsequent use of the GL context would be referencing an
+ already unreffed GL context object resulting in a critical:
+ g_object_ref: assertion 'object->ref_count > 0' failed
+ https://bugzilla.gnome.org/show_bug.cgi?id=766703
+
+2016-05-24 23:38:22 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstgldisplay.c:
+ gldisplay: add some debugging about retrieving GL contexts
+
+2016-05-25 10:01:38 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/gl/egl/gsteglimage.c:
+ eglimage: Re-add accidentially removed GST_DEFINE_MINI_OBJECT_TYPE()
+
+2016-05-23 15:24:53 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * gst-libs/gst/player/gstplayer.c:
+ player: fix suburi getter debug message
+ The property is a string, not a boolean.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766607
+
+2016-05-25 09:53:15 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/player/gstplayer.c:
+ player: Don't set subtitle URI directly but dispatch to the player thread
+ Otherwise we do state changes and everything in the application thread, which
+ might block and more important can cause reentrant signals.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766607
+
+2016-05-23 20:11:17 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/gl/egl/gsteglimage.c:
+ eglimage: Ensure that the debug category is always initalized
+ Before the initializer was only run if dmabuf support was used.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766794
+
+2016-05-24 23:30:09 +1000 Arjen Veenhuizen <arjen.veenhuizen@tno.nl>
+
+ * ext/gl/gstgltransformation.c:
+ gltransformation: make the pivot-z property READWRITE
+ Instead of just being READABLE.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766818
+
+2016-05-23 10:40:58 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * ext/gl/gstgltestsrc.c:
+ gltestsrc: fix src_impl leak
+ https://bugzilla.gnome.org/show_bug.cgi?id=766661
+
+2016-05-24 00:55:11 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * gst-libs/gst/gl/Makefile.am:
+ * gst-libs/gst/insertbin/Makefile.am:
+ * gst-libs/gst/mpegts/Makefile.am:
+ * gst-libs/gst/player/Makefile.am:
+ g-i: pass compiler env to g-ir-scanner
+ It's what introspection.mak does as well. Should
+ fix spurious build failures on gnome-continuous.
+
+2016-05-24 07:17:22 +1000 Jan Schmidt <jan@centricular.com>
+
+ * gst/pnm/gstpnmdec.c:
+ * gst/pnm/gstpnmdec.h:
+ pnmdec: Fix ASCII parsing
+ Parse gray16 properly in ascii mode, and fix
+ some bugs around reading data in chunks when
+ ascii values cross chunk boundaries
+
+2016-05-19 01:28:04 +1000 Jan Schmidt <jan@centricular.com>
+
+ * tests/check/Makefile.am:
+ * tests/check/elements/pnm.c:
+ pnm: Add a basic unit test
+ Test that we can run an encode / decode cycle in various
+ formats without errors
+
+2016-05-19 01:04:36 +1000 Jan Schmidt <jan@centricular.com>
+
+ * gst/pnm/gstpnmenc.c:
+ pnmenc: Make output caps match the srcpad template
+ Don't output 'image/pnm', which isn't even in the template
+ caps. Instead, output a mime-type consistent with what we
+ are encoding.
+
+2016-05-18 17:19:40 +1000 Jan Schmidt <jan@centricular.com>
+
+ * gst/pnm/gstpnmenc.c:
+ pnmenc: Tidy up code, support BE/LE GRAY16 properly
+ Remove code that dealt with odd strides separately - there's
+ not really any overhead to just using 1 codepath for both matched
+ and unmatched stride output.
+ Add separate codepaths for BE vs LE GRAY16 input so they're
+ handled properly
+
+2016-05-16 21:22:57 +1000 Jan Schmidt <jan@centricular.com>
+
+ * gst/pnm/gstpnmdec.c:
+ * gst/pnm/gstpnmdec.h:
+ pnmdec: Actually output LE or BE GRAY16 as negotiated
+ Add codepaths to output GRAY16 in little or big endian
+ as negotiated.
+ Move all output format negotiation into a central
+ function and clean it up
+
+2015-10-22 17:06:01 +0200 Dimitrios Katsaros <patcherwork@gmail.com>
+
+ * gst/pnm/gstpnmdec.c:
+ * gst/pnm/gstpnmdec.h:
+ * gst/pnm/gstpnmutils.c:
+ pnmdec: Implementation of GRAY16 handling
+ https://bugzilla.gnome.org/show_bug.cgi?id=757022
+
+2015-10-19 17:15:30 +0200 Dimitrios Katsaros <patcherwork@gmail.com>
+
+ * gst/pnm/gstpnmenc.c:
+ pnmenc: Implementation of GRAY16 handling
+ https://bugzilla.gnome.org/show_bug.cgi?id=757022
+
+2016-05-20 19:25:57 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+
+ * sys/kms/gstkmsbufferpool.c:
+ kmsbufferpool: error only if no allocator
+ Do not expect an allocator from the configuration, but expect to have already
+ one set.
+
+2016-05-15 11:52:55 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+
+ * sys/kms/gstkmssink.c:
+ kmssink: frame copy log in performance category
+ Log the message when the frame is going to be copy (worse case) under the
+ performance log category.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766466
+
+2016-05-15 11:51:22 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+
+ * sys/kms/gstkmssink.c:
+ kmssink: use trace level for buffer render log
+ Instead of using debug level for logging each buffer rendered, use trace
+ level.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766466
+
+2016-05-23 17:00:22 +0530 Arun Raghavan <arun@arunraghavan.net>
+
+ * gst-libs/gst/player/gstplayer-media-info.c:
+ player: Fix documentation for gst_player_video_info_get_framerate()
+ Document out parameters and fix function name.
+
+2016-05-18 16:00:47 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * tests/check/libs/player.c:
+ player: use gst_check_init() in test
+ Calling GST_DEBUG() in test rely on the default category to be defined,
+ which is done in gst_check_init().
+ https://bugzilla.gnome.org/show_bug.cgi?id=766607
+
+2016-05-20 17:28:52 -0400 Aaron Boxer <boxerab@gmail.com>
+
+ * ext/openjpeg/gstopenjpegenc.c:
+ openjpegenc: enable MCT for RGB video
+ https://bugzilla.gnome.org/show_bug.cgi?id=766732
+
+2016-05-20 14:08:03 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: group DVB-T2 substream-id check with its corresponding set_prop()
+
+2016-05-20 13:57:45 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: add DVB-S2 sub-stream ID check
+ Disable if invalid (> 255) instead of blindy setting this
+ property regardless of its actual value.
+
+2016-05-20 13:47:06 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: clarify consequence of passing a wrong ID to the substream filter
+
+2016-05-19 17:05:33 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * ext/gl/gltestsrc.c:
+ gltestsrc: fix shaders ref counting
+ The gltestsrc element uses two shaders: color_shader and snow_shader.
+ Those are alternatively assigned to the SrcShader->shader pointer and
+ their reference was transferred to it. Only the SrcShader->shader was
+ unreffed (in _src_shader_deinit()) so only one shader was properly
+ freed, the other one was leaked.
+ Fixed this by giving an extra ref to SrcShader->shader and unreffing the
+ 2 shaders in _src_smpte_free().
+ https://bugzilla.gnome.org/show_bug.cgi?id=766661
+
+2016-05-19 16:55:31 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * ext/gl/gstglmosaic.c:
+ glmosaic: fix shader leak
+ gst_gl_mosaic_init_shader() is called twice with test_glmosaic so the
+ first shader was leaked.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766661
+
+2016-05-16 17:11:53 -0400 Xavier Claessens <xavier.claessens@collabora.com>
+
+ * gst-libs/gst/gl/win32/gstglwindow_win32.c:
+ gl: win32: Unparent internal window before destroying it
+ For some reason DestroyWindow() deadlock if it's called from
+ parent window's KeyPress event.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766533
+
+2016-05-16 15:26:53 -0400 Xavier Claessens <xavier.claessens@collabora.com>
+
+ * gst-libs/gst/gl/win32/gstglwindow_win32.c:
+ gl: win32: Don't steal parent focus when creating internal window
+ This fix regression introduced by 0acc18c60f6f962cc6553f6047fdb64891bab544.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766520
+
+2016-05-14 11:56:59 +0200 Olivier Crête <olivier.crete@collabora.com>
+
+ * gst-libs/gst/video/gstvideoaggregator.c:
+ videoaggregator: Don't wait if input buffer is after output
+ If the input buffer is after the end of the output buffer, then waiting
+ for more data won't help. We will never get an input buffer for this point.
+ This fixes compositing of streams from rtspsrc.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766422
+
+2016-05-19 09:25:57 -0700 Martin Kelly <martin@surround.io>
+
+ * sys/androidmedia/gst-android-hardware-camera.c:
+ ahc: fix potential NULL deref
+ This bug was found via cppcheck static analysis.
+ If android.hardware.Camera.getParameters returns NULL, then object will
+ be NULL, and we won't allocate params. This means that the GST_DEBUG
+ statement referencing params->object will be invalid. Fix this by
+ exiting early if android.hardware.Camera.getParameters returns NULL.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766638
+
+2016-05-19 11:33:52 -0700 Martin Kelly <martin@surround.io>
+
+ * sys/androidmedia/gstahcsrc.c:
+ ahc: fix typo in doc blurb
+ https://bugzilla.gnome.org/show_bug.cgi?id=766679
+
+2016-05-18 16:55:38 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ adaptivedemux: fix pending tags leak
+ https://bugzilla.gnome.org/show_bug.cgi?id=766662
+
+2016-05-18 12:30:05 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * sys/kms/gstkmssink.c:
+ kmssink: chain up finalize method
+ https://bugzilla.gnome.org/show_bug.cgi?id=766597
+
+2016-05-18 12:33:51 -0700 Martin Kelly <martin@surround.io>
+
+ * tests/examples/opencv/gstfacedetect_test.c:
+ * tests/examples/opencv/gsthanddetect_test.c:
+ examples: opencv: typo fix
+ https://bugzilla.gnome.org/show_bug.cgi?id=766639
+
+2016-05-18 21:29:15 -0700 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/README:
+ * ext/lv2/gstlv2.c:
+ * ext/lv2/gstlv2.h:
+ * ext/lv2/gstlv2filter.c:
+ * ext/lv2/gstlv2source.c:
+ * ext/lv2/gstlv2utils.c:
+ * ext/lv2/gstlv2utils.h:
+ lv2: support CVPorts
+ CVPorts are ports that take a buffer. For now we just fill the buffers with
+ the control value.
+
+2016-05-18 21:26:50 -0700 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/gstlv2filter.c:
+ * ext/lv2/gstlv2source.c:
+ lv2: use _OBJECT log variants and lower log level when processing
+
+2016-05-17 14:33:04 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: move ISDB-T bandwidth check to _is_valid_bandwidth()
+ Allows test to be used for delivery system auto-detection.
+ Additionally, add 0 (auto) as valid value.
+
+2016-05-17 14:19:30 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: add '0' as a valid value for bandwidth
+ Underlying API considers this the BANDWIDTH_HZ equivalent
+ to the old BANDWIDTH_AUTO for BANDWIDTH.
+
+2016-05-17 13:53:54 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: factor out and reuse DVB-T/T2 bandwidth checks
+ Use new utility function as an additional check for delivery
+ system auto-detection.
+
+2016-05-17 12:06:45 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/parsechannels.c:
+ dvb/parsechannels: recognize additional bandwidths at zap parsing
+ Previously ignored 1.712, 5 and 10 MHz values are also valid
+
+2016-05-16 12:27:50 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * docs/libs/gst-plugins-bad-libs-sections.txt:
+ * gst-libs/gst/video/gstvideoaggregator.c:
+ * gst-libs/gst/video/gstvideoaggregator.h:
+ * gst-libs/gst/video/gstvideoaggregatorpad.h:
+ videoaggregator: canonicalise function names
+ Had to be done at some point:
+ gst_videoaggregator_* -> gst_video_aggregator_*
+ Also fix up some function names with typos.
+
+2016-05-15 23:31:33 -0700 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/gstlv2.c:
+ * ext/lv2/gstlv2.h:
+ lv2: cleanup the predicates
+ Use the defines from the headers and get rid of our own namespace defines.
+ Replace the 'role' prop with 'designation'.
+
+2016-05-15 23:27:22 -0700 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/gstlv2utils.c:
+ lv2: tweak enum logging
+ Log more details when we find a bad scalepoint and downgrade the logging of the
+ good enum valzes.
+
+2016-05-15 22:05:43 -0700 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/README:
+ * ext/lv2/gstlv2utils.c:
+ lv2: generate enums from scalepoints
+ Plugins can provide a set of named values for a control port. Ideally only those
+ values are set for the property. Check if all scalepoints are integers and if so
+ generate an enum type.
+
+2016-05-15 19:45:26 -0700 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/gstlv2utils.c:
+ lv2: reduce log spam for property bounds
+ Only complain about bad bounds, if the plugin actually set those. Otherwise
+ silently adjust our defaults.
+
+2016-05-15 17:58:51 -0700 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/gstlv2.c:
+ * ext/lv2/gstlv2.h:
+ lv2: remove lv2_symbol_pred
+ We're not actually using it.
+
+2016-05-15 17:54:06 -0700 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/gstlv2source.c:
+ lv2: remove leftover FIME
+
+2016-05-15 00:41:12 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: special case detection when DVB-T and T2 seem valid
+ There is no way to tell one over the other when parameters
+ seem valid for DVB-T and DVB-T2 and the adapter supports
+ both. Reason to go with the former here is that, from
+ experience, most DVB-T2 channels out there seem to use
+ parameters that are not valid for DVB-T, like QAM_256
+ https://bugzilla.gnome.org/show_bug.cgi?id=765731
+
+2016-05-14 23:32:49 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: add transmission mode check for DTMB
+
+2016-05-13 01:54:56 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/parsechannels.c:
+ dvb/parsechannels: use proper fe_spectral_inversion enum identifiers
+
+2016-05-13 01:25:08 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: explicitly disable stream filter for invalid ids
+
+2016-05-13 00:50:45 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/parsechannels.c:
+ dvb/parsechannels: do not assume DVB-T from zap file alone
+ DVB-T/T2 have the same number of fields so we were
+ wrongly assuming DVB-T for DVB-T2 broadcasts. Not
+ setting the delivery system here allows for dvbsrc
+ to make an informed guess based on the channel
+ parameters.
+
+2016-05-13 00:12:33 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: consider transmission mode for delsys autodetection
+
+2016-05-13 00:04:08 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: factor out transmission mode check against delsys
+
+2016-05-12 16:43:09 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: improve delivery system autodetection
+
+2016-05-12 14:12:09 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: add modulation checks for DVB-T and T2
+
+2016-05-15 14:46:40 -0700 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/ladspa/gstladspa.c:
+ ladspa: use _OBJECT log variants for plugin_init
+ Also trim leading whitespae.
+
+2016-05-15 14:45:15 -0700 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/README:
+ * ext/lv2/gstlv2.c:
+ * ext/lv2/gstlv2.h:
+ * ext/lv2/gstlv2filter.c:
+ * ext/lv2/gstlv2source.c:
+ * ext/lv2/gstlv2utils.c:
+ * ext/lv2/gstlv2utils.h:
+ lv2: add registry caching
+ Use the plugin_cache extra data to avoid introspecting over and over again.
+
+2016-05-14 12:35:15 -0700 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/README:
+ * ext/lv2/gstlv2utils.c:
+ lv2: implemnt the map-extension
+ This is the most used one and at the same time easy to implement sing QGQuark.
+
+2016-05-14 12:34:10 -0700 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/gstlv2.c:
+ * ext/lv2/gstlv2utils.c:
+ * ext/lv2/gstlv2utils.h:
+ lvs: add require_feature checks
+ Plugins can report what host features they need. Since we start to implement host feature
+ check which plugins we can no suuport.
+
+2016-05-15 14:34:33 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/compositor/compositor.c:
+ compositor: Check if we get a valid display ratio
+ As is done everywhere else, and avoids setting bogus values
+ And remove useless *<val> checks (we always provide valid values and
+ it's an internal function).
+ CID #1320700
+
+2016-05-15 14:16:55 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * ext/rtmp/gstrtmpsrc.c:
+ rtmpsrc: Remove dead assignments
+ * read is only used within the while loop
+ * todo and bsize only need to be assigned once
+
+2016-05-15 15:11:10 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/player/gstplayer.c:
+ player: Add uri-loaded signal that is fired whenever a new URI is actually loaded
+ This allows knowing the "boundary" from which on all following signals are for
+ the new URI.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766062
+
+2016-05-14 17:05:45 +0100 Matthew Waters <matthew@centricular.com>
+
+ * ext/opencv/gstfacedetect.cpp:
+ opencv/facedetect: fix the build with opencv 3.1.0
+ - add using namespace std; for std::vector
+ - use the cpp header imgproc.hpp file for the cv::ellipse function instead of
+ the C header
+ - Mat no longer takes IplImage in it's constructors, use the cvarrtomat()
+ function instead.
+ Fixes a couple of build errors:
+ gstfacedetect.cpp:140:30: error: ‘vector’ does not name a type
+ structure_and_message (const vector < Rect > &rectangles, const gchar * name,
+ ^~~~~~
+ gstfacedetect.cpp:140:37: error: expected ‘,’ or ‘...’ before ‘<’ token
+ structure_and_message (const vector < Rect > &rectangles, const gchar * name,
+ ^
+ gstfacedetect.cpp: In function ‘void structure_and_message(int)’:
+ gstfacedetect.cpp:143:13: error: ‘rectangles’ was not declared in this scope
+ Rect sr = rectangles[0];
+ [...]
+ gstfacedetect.cpp: In function ‘void
+ gst_face_detect_run_detector(GstFaceDetect*, cv::CascadeClassifier*, gint, gint,
+ cv::Rect, std::vector<cv::Rect_<int> >&)’:
+ gstfacedetect.cpp:562:31: error: no matching function for call to
+ ‘cv::Mat::Mat(IplImage*&, cv::Rect&)’
+ Mat roi (filter->cvGray, r);
+ [...]
+ gstfacedetect.cpp: In function ‘GstFlowReturn
+ gst_face_detect_transform_ip(GstOpencvVideoFilter*, GstBuffer*, IplImage*)’:
+ gstfacedetect.cpp:594:44: error: no matching function for call to
+ ‘cv::Mat::Mat(cv::Mat, bool)’
+ Mat mtxOrg (cv::cvarrToMat (img), false);
+ [...]
+ gstfacedetect.cpp:734:79: error: ‘ellipse’ was not declared in this scope
+ ellipse (mtxOrg, center, axes, 0, 0, 360, Scalar (cr, cg, cb), 3, 8,
+ 0);
+
+2016-05-15 11:20:21 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * Makefile.am:
+ build: add removed example dir to CRUFT_DIRS
+
+2016-05-15 13:33:53 +0300 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.interfaces:
* docs/plugins/inspect/plugin-accurip.xml:
* docs/plugins/inspect/plugin-adpcmdec.xml:
* docs/plugins/inspect/plugin-adpcmenc.xml:
@@ -462,8 +5353,10 @@
* docs/plugins/inspect/plugin-mpegtsdemux.xml:
* docs/plugins/inspect/plugin-mpegtsmux.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-pcapparse.xml:
* docs/plugins/inspect/plugin-pnm.xml:
* docs/plugins/inspect/plugin-rawparse.xml:
@@ -485,239 +5378,65 @@
* 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.8.2
+ docs: Update for git master
-2016-06-09 11:22:49 +0300 Sebastian Dröge <sebastian@centricular.com>
+2016-03-04 22:10:47 +0100 Carlos Rafael Giani <dv@pseudoterminal.org>
- * po/af.po:
- * po/az.po:
- * po/bg.po:
- * po/ca.po:
- * po/cs.po:
- * po/da.po:
- * po/de.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/nl.po:
- * po/or.po:
- * po/pl.po:
- * po/pt_BR.po:
- * po/ro.po:
- * po/ru.po:
- * po/sk.po:
- * po/sl.po:
- * po/sq.po:
- * po/sr.po:
- * po/sv.po:
- * po/tr.po:
- * po/uk.po:
- * po/vi.po:
- * po/zh_CN.po:
- Update .po files
+ * gst/rawparse/Makefile.am:
+ * gst/rawparse/gstaudioparse.c:
+ * gst/rawparse/gstunalignedaudioparse.c:
+ * gst/rawparse/gstunalignedaudioparse.h:
+ * gst/rawparse/plugin.c:
+ * gst/rawparse/unalignedaudio.h:
+ rawparse: Add unaligned raw audio parsing to audioparse and add new element
+ This helps in cases where raw audio data is being delivered, but the
+ buffers do not come in sample aligned sizes. The new unalignedaudioparse
+ bin can be autoplugged and configures an internal audioparse element to
+ align the data. audioparse itself gets support for audio/x-unaligned-raw
+ input caps; the output caps then contain the same information, except that
+ the name is changed to audio/x-raw (since audioparse aligns the data).
+ This ensures that souphttpsrc ! audioparse still works.
+ https://bugzilla.gnome.org/show_bug.cgi?id=689460
-2016-06-09 10:06:02 +0300 Sebastian Dröge <sebastian@centricular.com>
+2016-05-15 13:14:41 +0300 Matthew Waters <matthew@centricular.com>
- * po/hr.po:
- * po/pt_BR.po:
- * po/sk.po:
- po: Update translations
+ * gst-libs/gst/gl/gstgldisplay.c:
+ gldisplay: demote no platform display debug to info
+ Avoids confusing everyone with a warning that's not always fatal.
+ https://bugzilla.gnome.org/show_bug.cgi?id=746933
-2016-06-07 21:10:04 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+2016-05-15 12:31:38 +0300 Matthew Waters <matthew@centricular.com>
- * ext/webp/gstwebpdec.c:
- webpdec: Wait for segment event before checking it
- The heuristic to choose between packetise or not was changed to use the
- segment format. The problem is that this change is reading the segment
- during the caps event handling. The segment event will only be sent
- after. That prevented the decoder to go in packetize mode, and avoid
- useless parsing.
- https://bugzilla.gnome.org/show_bug.cgi?id=736252
+ * .gitignore:
+ .gitignore: remove non-existent directory
+ Partially reverts cdf91c455d4057a9d234766510bd2e8a44e1ed05
-2016-06-07 21:04:21 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+2016-05-15 19:05:48 +1000 Jan Schmidt <jan@centricular.com>
- * gst/vmnc/vmncdec.c:
- vmncdec: Wait for segment event before checking it
- The heuristic to choose between packetise or not was changed to use the
- segment format. The problem is that this change is reading the segment
- during the caps event handling. The segment event will only be sent
- after. That prevented the decoder to go in packetize mode, and avoid
- useless parsing.
- https://bugzilla.gnome.org/show_bug.cgi?id=736252
+ * gst/mpegdemux/gstmpegdemux.c:
+ mpegdemux: Handle system header when scanning for timestamps.
+ When scanning for SCR / PTS / DTS, handle the case where
+ the pack header is followed by the optional system header,
+ so we can correctly collect timestamps in such cases.
+ https://bugzilla.gnome.org/show_bug.cgi?id=623860
-2016-05-02 17:38:50 +0200 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com>
+2016-05-15 19:04:20 +1000 Jan Schmidt <jan@centricular.com>
- * gst/mpegtsmux/mpegtsmux.c:
- mpegtsmux: Set PTS on aligned buffers
- This was broken in 09c05df (make "alignment" property more useful for
- packetisation).
- https://bugzilla.gnome.org/show_bug.cgi?id=765926
+ * gst/mpegdemux/gstmpegdemux.c:
+ mpegdemux: Fix backward timestamp scan on small files.
+ When the file size is smaller than the configured 4MB scan
+ limit for timestamps, don't underflow the guard variable
+ when checking if it's time to stop.
+ Limit the backward SCR scan to the same 4MB as the PTS scan.
+ Add some comments.
-2016-05-20 14:34:37 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+2016-05-13 13:27:37 +0100 Tim-Philipp Müller <tim@centricular.com>
- * ext/gl/caopengllayersink.h:
- * ext/gl/caopengllayersink.m:
- caopengllayersink: Don't cache buffer pool
- Pools cannot be used by the two elements at the same time.
- https://bugzilla.gnome.org/show_bug.cgi?id=766611
-
-2016-06-07 17:22:01 +1000 Alessandro Decina <alessandro.d@gmail.com>
-
- * sys/applemedia/vtdec.c:
- vtdec: always drain in ::negotiate
- Move calling gst_vtdec_push_frames_if_needed from ::set_format to ::negotiate so
- that we always drain even when renegotiation is triggered by downstream.
-
-2016-06-07 16:00:01 +1000 Alessandro Decina <alessandro.d@gmail.com>
-
- * sys/applemedia/vtdec.c:
- vtdec: try to preserve downstream caps order
- vtdec specifies sysmem; GLMemory as template caps. When negotiating, we used to
- call gst_pad_peer_query_caps (..., filter) with our template caps as filter. The
- query does gst_caps_intersect (filter, peercaps) internally which gives
- precedence to the order of the filter caps. While we want to output sysmem by
- default, when negotiating with glimagesink which returns GLMemory; sysmem; we
- do want to do GL, so we now query using a NULL filter and intersect the result
- with our template caps giving precedence to downstream's caps.
- tl;dr: make sure we end up negotiating GLMemory with glimagesink
-
-2016-06-06 12:38:45 -0400 Xavier Claessens <xavier.claessens@collabora.com>
-
- * sys/androidmedia/gstamcvideoenc.c:
- amcvideoenc: Do not call gst_object_unref on GstCaps
- https://bugzilla.gnome.org/show_bug.cgi?id=767298
-
-2016-06-06 14:08:43 -0400 Xavier Claessens <xavier.claessens@collabora.com>
-
- * sys/androidmedia/gstahcsrc.c:
- ahcsrc: Avoid a div by 0 warning
- https://bugzilla.gnome.org/show_bug.cgi?id=767302
-
-2016-06-02 16:30:02 +1000 Alessandro Decina <alessandro.d@gmail.com>
-
- * sys/applemedia/vtdec.c:
- vtdec: make vtdec_hw fallback to software on renegotiation
- When renegotiating mid stream - for example with variable bitrate
- streams - and therefore destroying and recreating VTSessions, the
- hw decoder might become temporarily unavailable.
- To deal with this and avoid erroring out on bitrate changes,
- vtdec_hw now falls back to using the software decoder if the hw
- one was available at some point but isn't anymore. At
- renegotiation/bitrate change time, it will still retry to open
- the hardware one.
-
-2016-06-02 13:10:51 +1000 Alessandro Decina <alessandro.d@gmail.com>
-
- * sys/applemedia/vtdec.c:
- vtdec: fix switching from GLMemory to Sysmem
- When renegotiating from GLMemory to Sysmem do teardown the texture_cache.
- Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=766190
-
-2016-06-02 11:36:57 +1000 Alessandro Decina <alessandro.d@gmail.com>
-
- * sys/applemedia/vtdec.c:
- vtdec: optimize renegotiation
- ::negotiate can be called several times before the CAPS event is sent downstream
- so use the currently configured output state caps instead of the pad current
- caps when deciding whether to recreate the VTSession or not.
- This leads to creating/destroying less VTSessions which makes renegotiation more
- reliable especially when using hw decoding.
-
-2016-05-23 15:24:53 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
-
- * gst-libs/gst/player/gstplayer.c:
- player: fix suburi getter debug message
- The property is a string, not a boolean.
- https://bugzilla.gnome.org/show_bug.cgi?id=766607
-
-2016-05-25 09:53:15 +0300 Sebastian Dröge <sebastian@centricular.com>
-
- * gst-libs/gst/player/gstplayer.c:
- player: Don't set subtitle URI directly but dispatch to the player thread
- Otherwise we do state changes and everything in the application thread, which
- might block and more important can cause reentrant signals.
- https://bugzilla.gnome.org/show_bug.cgi?id=766607
-
-2016-05-23 17:00:22 +0530 Arun Raghavan <arun@arunraghavan.net>
-
- * gst-libs/gst/player/gstplayer-media-info.c:
- player: Fix documentation for gst_player_video_info_get_framerate()
- Document out parameters and fix function name.
-
-2016-05-18 16:00:47 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
-
- * tests/check/libs/player.c:
- player: use gst_check_init() in test
- Calling GST_DEBUG() in test rely on the default category to be defined,
- which is done in gst_check_init().
- https://bugzilla.gnome.org/show_bug.cgi?id=766607
-
-2016-05-20 17:28:52 -0400 Aaron Boxer <boxerab@gmail.com>
-
- * ext/openjpeg/gstopenjpegenc.c:
- openjpegenc: enable MCT for RGB video
- https://bugzilla.gnome.org/show_bug.cgi?id=766732
-
-2016-05-19 09:25:57 -0700 Martin Kelly <martin@surround.io>
-
- * sys/androidmedia/gst-android-hardware-camera.c:
- ahc: fix potential NULL deref
- This bug was found via cppcheck static analysis.
- If android.hardware.Camera.getParameters returns NULL, then object will
- be NULL, and we won't allocate params. This means that the GST_DEBUG
- statement referencing params->object will be invalid. Fix this by
- exiting early if android.hardware.Camera.getParameters returns NULL.
- https://bugzilla.gnome.org/show_bug.cgi?id=766638
-
-2016-05-19 16:55:31 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
-
- * ext/gl/gstglmosaic.c:
- glmosaic: fix shader leak
- gst_gl_mosaic_init_shader() is called twice with test_glmosaic so the
- first shader was leaked.
- https://bugzilla.gnome.org/show_bug.cgi?id=766661
-
-2016-05-16 17:11:53 -0400 Xavier Claessens <xavier.claessens@collabora.com>
-
- * gst-libs/gst/gl/win32/gstglwindow_win32.c:
- gl: win32: Unparent internal window before destroying it
- For some reason DestroyWindow() deadlock if it's called from
- parent window's KeyPress event.
- https://bugzilla.gnome.org/show_bug.cgi?id=766533
-
-2016-05-16 15:26:53 -0400 Xavier Claessens <xavier.claessens@collabora.com>
-
- * gst-libs/gst/gl/win32/gstglwindow_win32.c:
- gl: win32: Don't steal parent focus when creating internal window
- This fix regression introduced by 0acc18c60f6f962cc6553f6047fdb64891bab544.
- https://bugzilla.gnome.org/show_bug.cgi?id=766520
-
-2016-05-14 11:56:59 +0200 Olivier Crête <olivier.crete@collabora.com>
-
- * gst-libs/gst/video/gstvideoaggregator.c:
- videoaggregator: Don't wait if input buffer is after output
- If the input buffer is after the end of the output buffer, then waiting
- for more data won't help. We will never get an input buffer for this point.
- This fixes compositing of streams from rtspsrc.
- https://bugzilla.gnome.org/show_bug.cgi?id=766422
+ * gst/mpegdemux/gstmpegdemux.c:
+ mpegdemux: don't do bogus adjustments on seek if we have no first_pts
+ Fixes bogus segment and gap events with start=GST_CLOCK_TIME_NONE if
+ we failed to find a first_pts.
+ https://bugzilla.gnome.org/show_bug.cgi?id=623860
2016-05-14 16:59:14 +0300 Alex-P. Natsios <drakevr@2f30.org>
@@ -728,6 +5447,83 @@
customarily find there.
https://bugzilla.gnome.org/show_bug.cgi?id=766441
+2016-05-14 16:32:06 +0300 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gstgltransformation.c:
+ * ext/gl/gstgltransformation.h:
+ gltransformation: use the affine transformation meta if available downstream
+ We can avoid a render pass if downstream supports the affine transformation meta
+ and increase the performance of some pipelines involving gltransformation.
+ Implemented by checking for the affine transformation in the allocation query
+ from downstream and combining our matrix with that of upstream's (or creating
+ our own).
+
+2016-05-14 16:27:26 +0300 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gstglimagesink.c:
+ * ext/gl/gstglvideomixer.c:
+ * gst-libs/gst/gl/gstglshaderstrings.c:
+ * gst-libs/gst/gl/gstglshaderstrings.h:
+ * gst-libs/gst/gl/gstglutils.c:
+ * gst-libs/gst/gl/gstglutils.h:
+ * gst-libs/gst/gl/gstglviewconvert.c:
+ gl: take the affine transformation in NDC
+ Provide a function to get the affine matrix in the meta in terms of NDC
+ coordinates and use as a standard opengl matrix.
+ Also advertise support for the affine transformation meta in the allocation
+ query.
+
+2016-05-14 15:50:57 +0300 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gstglbasemixer.c:
+ * ext/gl/gstglbasemixer.h:
+ glbasemixer: actually attempt to propose an allocation upstream
+ We were always failing the allocation query as a flag was never being set to
+ signal a successful negotiation. Fix by setting the required flag on a
+ successful caps event from upstream.
+
+2016-05-12 10:52:06 -0700 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/Makefile.am:
+ * ext/lv2/README:
+ * ext/lv2/gstlv2.c:
+ * ext/lv2/gstlv2.h:
+ * ext/lv2/gstlv2source.c:
+ lv2: add a source plugin
+ Update the readme with a working example and list what feature are supported.
+
+2016-05-11 23:12:07 -0700 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/gstlv2utils.c:
+ lv2: add support for host features
+ Implement a log handler as the first one.
+
+2016-05-13 15:24:35 +0300 Matthew Waters <matthew@centricular.com>
+
+ * ext/vulkan/vkswapper.c:
+ vkswapper: check the error of the presentation for out of date
+ allows us to resize the swapchain correctly.
+
+2016-05-12 19:44:26 +0100 Damian Ziobro <damian@xmementoit.com>
+
+ * gst/mpegtsdemux/mpegtsbase.h:
+ mpegtsbase: remove unused variables: upstream_live and queried_latency
+ https://bugzilla.gnome.org/show_bug.cgi?id=766343
+
+2016-05-11 15:45:47 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: improve debug output from _open_frontend()
+ * Clarify message on delsys info gathering
+ * Combine redundant INFO/DEBUG pair
+
+2016-05-11 15:26:24 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: fix invalid dereference of delsys data
+ Use GPOINTER_TO_INT to read GINT_TO_POINTER stored
+ data.
+
2016-05-11 23:48:21 +0300 Sebastian Dröge <sebastian@centricular.com>
* sys/androidmedia/gstamc.c:
@@ -736,6 +5532,59 @@
srcpad caps, and thus fail.
https://bugzilla.gnome.org/show_bug.cgi?id=766289
+2016-05-11 16:42:35 +0200 Edward Hervey <edward@centricular.com>
+
+ * sys/decklink/gstdecklinkvideosrc.cpp:
+ decklinkvideosrc: Fix previous commit
+ The frames queue might return nothing (be empty) if we're flushing.
+ Move the assertion to after the flushing check
+
+2016-05-10 22:04:48 -0700 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/gstlv2.c:
+ lv2: skip plugins that need host features
+ We haven't implemented this yet and those plugin would fail when we instantiate
+ them.
+
+2016-05-10 21:11:41 -0700 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/gstlv2utils.c:
+ lv2: add classification from metadata
+ This helps apps to structure the element collection.
+
+2016-04-08 07:53:44 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/Makefile.am:
+ * ext/lv2/gstlv2filter.c:
+ * ext/lv2/gstlv2utils.c:
+ * ext/lv2/gstlv2utils.h:
+ lv2: extract helper code into lv2utils
+ This is a preparaton for adding lv2-sources and -sinks.
+
+2016-05-10 12:24:03 -0700 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/ladspa/gstladspasource.c:
+ * ext/ladspa/gstladspautils.c:
+ ladspa: code cleanup
+ Whitespace cleanup and unify codeing style.
+
+2016-05-10 12:22:04 -0700 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/ladspa/gstladspautils.c:
+ ladspa: simplify the code
+ Remove a local var and just use the parameter value.
+
+2016-05-10 18:14:36 +0200 Philippe Normand <philn@igalia.com>
+
+ * sys/applemedia/corevideobuffer.c:
+ applemedia: fix core_video_meta init registration
+
+2016-05-10 16:46:43 +0530 Nirbheek Chauhan <nirbheek@centricular.com>
+
+ * .gitignore:
+ .gitignore: Ignore tests/examples/gl/gtk generated files
+ And another test binary.
+
2016-05-10 16:24:08 +0530 Nirbheek Chauhan <nirbheek@centricular.com>
* configure.ac:
@@ -749,16 +5598,106 @@
distros should be shipping it by now.
https://bugzilla.gnome.org/show_bug.cgi?id=766213
-2016-05-04 11:30:11 +1000 Alessandro Decina <alessandro.d@gmail.com>
+2016-05-10 09:40:38 +0100 Tim-Philipp Müller <tim@centricular.com>
- * sys/applemedia/vtdec.c:
- applemedia: vtdec: output sysmem by default
+ * sys/decklink/gstdecklinkvideosrc.cpp:
+ decklinkvideosrc: fix use-after-free in error code path
-2016-05-05 18:00:25 +1000 Matthew Waters <matthew@centricular.com>
+2016-05-10 09:38:28 +0100 Tim-Philipp Müller <tim@centricular.com>
- * ext/vulkan/vkswapper.c:
- vkswapper: use gst_video_sink_center_rect for positioning the video
- Don't try to reimplement it badly.
+ * sys/decklink/gstdecklinkvideosrc.cpp:
+ decklinkvideosrc: remove unnecessary checks for non-NULL frame
+ We can't get a NULL frame here.
+ CID 1359923
+
+2016-05-09 15:23:32 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: abort at open frontend failure
+
+2016-05-09 12:50:47 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * sys/applemedia/Makefile.am:
+ applemedia: Ship all headers in tarballs
+ Some were missing from noinst_HEADERS.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766163
+
+2016-05-04 16:32:19 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ * sys/dvb/gstdvbsrc.h:
+ dvbsrc: smarten-up delsys autodetection logic
+ When there's no explicit delivery system information
+ for a channel in the channel configuration file and
+ the user hasn't selected one via setting the delsys
+ property, we *guessed* it by selecting the last
+ supported delsys reported by the driver. This change
+ provides the basis for smarter delsys auto detection
+ and implements a rule for DVB-T2. Rules for other
+ delivery systems can be added in _guess_delsys() in
+ a similar way.
+ Additionally: Store list of adapter-supported
+ delivery systems instead of querying the driver each
+ time this information is needed.
+ Related to:
+ https://bugzilla.gnome.org/show_bug.cgi?id=765731
+
+2016-05-03 15:00:55 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: remove remaining polling logic from _tune_fe()
+ No need to do any polling here.
+
+2016-05-06 10:51:39 +0200 Carlos Garcia Campos <cgarcia@igalia.com>
+
+ * gst-libs/gst/uridownloader/gsturidownloader.c:
+ uridownloader: Take the ownership of the src element
+ The URI downloader is creating the source element with
+ gst_element_factory_make() that returns a floating reference that nobody
+ is consuming. This is causing problems in WebKit, where the smart
+ pointers used to take references of the source elment get confused and
+ end up consuming the floating reference and then releasing the element,
+ which usually crashes because the URI downloader still tries to use its
+ src element. See https://bugs.webkit.org/show_bug.cgi?id=144040.
+ This commit adds two helper functions to ensure and destroy the source
+ element, to make the code simpler and less error prone. The ensure
+ method takes care of checking if we can reuse the existing one or we
+ need to create a new one, taking always its ownership. The destroy
+ method simply avoids duplicated code to set the source to NULL state and
+ then unref it.
+ https://bugzilla.gnome.org/show_bug.cgi?id=766053
+
+2016-04-29 12:31:01 +0100 Alex Ashley <bugzilla@ashley-family.net>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ adaptivedemux: fix threading issues in gst_adaptive_demux_wait_until function
+ The gst_adaptive_demux_wait_until() function can be woken up either
+ by its end_time being reached, or from other threads that want to
+ interrupt the waiting thread.
+ If the thread is interrupted, it needs to cancel its async clock callback
+ by unscheduling the clock callback. However, the callback task might already
+ have been activated, but is waiting for the mutex to become available. In this
+ case, the call to unschedule does not stop the callback from executing.
+ The solution to this second issue is to use a reference counted object that
+ is decremented by both the gst_adaptive_demux_wait_until() function and the
+ call to gst_clock_id_wait_async (). In this way, the GstAdaptiveDemuxTimer
+ object is only deleted when both the gst_adaptive_demux_wait_until() function
+ and the async callback are finished with the object.
+ https://bugzilla.gnome.org/show_bug.cgi?id=765728
+
+2016-03-03 15:50:49 +0900 Justin Kim <justin.kim@collabora.com>
+
+ * sys/androidmedia/Makefile.am:
+ * sys/androidmedia/gst-android-graphics-surfacetexture.c:
+ * sys/androidmedia/gst-android-graphics-surfacetexture.h:
+ * sys/androidmedia/gst-android-hardware-camera.c:
+ * sys/androidmedia/gst-android-hardware-camera.h:
+ * sys/androidmedia/gstahcsrc.c:
+ * sys/androidmedia/gstahcsrc.h:
+ * sys/androidmedia/gstamc.c:
+ androidmeida: replace with new surfacetexture for ahcsrc
+ GstAmcSurfaceTexture is more clear and simple than GstAGSurfaceTexture.
+ https://bugzilla.gnome.org/show_bug.cgi?id=763099
2016-05-05 23:53:05 +1000 Matthew Waters <matthew@centricular.com>
@@ -767,17 +5706,111 @@
Fixes out of tree builds from tarballs.
https://bugzilla.gnome.org/show_bug.cgi?id=764758
-2016-04-08 18:09:53 +1000 Matthew Waters <matthew@centricular.com>
+2016-05-05 23:18:11 +1000 Matthew Waters <matthew@centricular.com>
- * ext/vulkan/vkimagememory.c:
- vulkan: silence a validation warning filling out the image barrier
+ * ext/vulkan/vkswapper.c:
+ vkswapper: fix up display synchronization
+ Use the semaphores in the correct place, before and after the submission for
+ acquiring and presenting the swapchain buffer.
+ Waiting on the fence that only signals the command buffer completion rather than
+ the completion of the presentation is racy with the destruction of the vulkan
+ buffers associated with that image. Wait on the device to be idle instead after
+ presenting.
-2016-04-08 18:09:06 +1000 Matthew Waters <matthew@centricular.com>
+2016-05-05 18:00:25 +1000 Matthew Waters <matthew@centricular.com>
- * ext/vulkan/vkdevice.c:
- * ext/vulkan/vkinstance.c:
- vulkan: use the correct validation layer name
- The threading validation layer has changed names.
+ * ext/vulkan/vkswapper.c:
+ vkswapper: use gst_video_sink_center_rect for positioning the video
+ Don't try to reimplement it badly.
+
+2016-05-05 10:44:22 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * gst/mpegdemux/gstmpegdemux.c:
+ mpegdemux: fix description
+
+2016-05-05 10:41:53 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * gst/videofilters/gstvideodiff.c:
+ videodiff: fix supported formats in template caps
+
+2016-05-05 10:40:37 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * gst/videofilters/gstvideodiff.c:
+ * gst/videofilters/gstvideodiff.h:
+ videodiff: fill in FIXME metadata and docs with description
+ https://bugzilla.gnome.org/show_bug.cgi?id=765989
+
+2016-05-04 12:17:59 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gstglimagesink.c:
+ * ext/gl/gstglmixer.c:
+ * ext/gl/gstglstereosplit.c:
+ * gst-libs/gst/gl/egl/Makefile.am:
+ * gst-libs/gst/gl/egl/gsteglimage.c:
+ * gst-libs/gst/gl/egl/gsteglimage.h:
+ * gst-libs/gst/gl/egl/gsteglimagememory.c:
+ * gst-libs/gst/gl/egl/gsteglimagememory.h:
+ * gst-libs/gst/gl/egl/gstgldisplay_egl.c:
+ * gst-libs/gst/gl/egl/gstglmemoryegl.c:
+ * gst-libs/gst/gl/egl/gstglmemoryegl.h:
+ * gst-libs/gst/gl/gstglbufferpool.c:
+ * gst-libs/gst/gl/gstglbufferpool.h:
+ * gst-libs/gst/gl/gstgldisplay.c:
+ * gst-libs/gst/gl/gstglfilter.c:
+ * gst-libs/gst/gl/gstglupload.c:
+ gl/egl: replace gsteglimagememory with an EGLImage wrapper
+ That can be passed to GstGLMemoryEGL.
+ This also ports the dmabuf uploader to GstEGLImage and GstGLMemoryEGL.
+
+2016-01-21 22:18:17 +0900 Gwang Yoon Hwang <yoon@igalia.com>
+
+ * gst-libs/gst/gl/egl/Makefile.am:
+ * gst-libs/gst/gl/egl/gstgldisplay_egl.c:
+ * gst-libs/gst/gl/egl/gstglmemoryegl.c:
+ * gst-libs/gst/gl/egl/gstglmemoryegl.h:
+ * gst-libs/gst/gl/gstgl_fwd.h:
+ * gst-libs/gst/gl/gstgldisplay.c:
+ * gst-libs/gst/gl/gstglupload.c:
+ gl: implement GstGLMemoryEGL
+ Because current GstEGLImageMemory does not inherit GstGLMemory, GLUpload
+ allocates additional GLMemory and upload the decoded contents from the decoder
+ which uses EGLImage (e.g. gst-omx in RPi).
+ This work adds GstGLMemoryEGL to avoid this overhead. Decoders allocate
+ GstGLMemoryEGL and decode its contents to the EGLImage of GstGLMemoryEGL. And
+ GLUpload uses this memory without allocation of additional textures and blit
+ operations.
+ [Matthew Waters]: gst-indent the sources and fix a critical retreiving the egl
+ display from the memory.
+ https://bugzilla.gnome.org/show_bug.cgi?id=760916
+
+2016-05-04 01:16:51 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglbufferpool.c:
+ * gst-libs/gst/gl/gstglmemory.c:
+ * gst-libs/gst/gl/gstglmemory.h:
+ * gst-libs/gst/gl/gstglupload.c:
+ * gst-libs/gst/gl/gstglviewconvert.c:
+ glmemory: add wrapped data pointers to setup_buffer
+ Allows creating wrapped memories with GstGLAllocationParams.
+ The wrapped pointers will be set in the parameters before being passed
+ to the memory allocation function.
+
+2016-05-04 00:19:44 +1000 Matthew Waters <matthew@centricular.com>
+
+ * docs/libs/gst-plugins-bad-libs-sections.txt:
+ * gst-libs/gst/gl/gstglbasememory.c:
+ * gst-libs/gst/gl/gstglbasememory.h:
+ * gst-libs/gst/gl/gstglmemory.c:
+ * gst-libs/gst/gl/gstglmemory.h:
+ * gst-libs/gst/gl/gstglmemorypbo.c:
+ glbasememory: take a pointer as the wrapped gpu handle
+ Allows passing arbitrary data to wrap the the specific memory implementation
+ which is required for some memory implementations.
+
+2016-05-04 11:30:11 +1000 Alessandro Decina <alessandro.d@gmail.com>
+
+ * sys/applemedia/vtdec.c:
+ applemedia: vtdec: output sysmem by default
2016-05-02 11:30:43 +0300 Sebastian Dröge <sebastian@centricular.com>
@@ -795,12 +5828,170 @@
former is always called when srcpads caps are decided.
https://bugzilla.gnome.org/show_bug.cgi?id=765324
-2016-04-25 16:50:18 +0300 Sebastian Dröge <sebastian@centricular.com>
+2016-04-20 15:11:44 +0300 Vivia Nikolaidou <vivia@ahiru.eu>
- * gst/videoparsers/gsth264parse.c:
- h264parse: H264 level idc 0 is not valid
- Don't put level=0 into the caps, it confuses other elements.
- https://bugzilla.gnome.org/show_bug.cgi?id=765538
+ * sys/decklink/gstdecklink.cpp:
+ decklink: Fix swapped name and nick in GEnumValues
+ https://bugzilla.gnome.org/show_bug.cgi?id=742878
+
+2016-04-14 18:26:33 +0300 Vivia Nikolaidou <vivia@ahiru.eu>
+
+ * sys/decklink/gstdecklink.cpp:
+ * sys/decklink/gstdecklink.h:
+ * sys/decklink/gstdecklinkvideosink.cpp:
+ * sys/decklink/gstdecklinkvideosink.h:
+ * sys/decklink/gstdecklinkvideosrc.cpp:
+ * sys/decklink/gstdecklinkvideosrc.h:
+ decklink: Add initial 10bit support for YUV modes
+ https://bugzilla.gnome.org/show_bug.cgi?id=742878
+
+2016-05-03 15:52:38 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * sys/decklink/gstdecklink.cpp:
+ * sys/decklink/gstdecklinkaudiosrc.cpp:
+ decklink: Fix indentation
+
+2016-05-03 19:58:00 +1000 Matthew Waters <matthew@centricular.com>
+
+ * configure.ac:
+ * gst-libs/gst/gl/gstglapi.h:
+ gl: fix gles3 header usage for older platforms
+ Some platforms provide an old version of GLES2/gl2.h and GLES2/gl2ext.h that
+ will fail when including GLES3/gl3.h due to missing typedef's.
+ Seen on the RPi.
+
+2016-04-29 23:32:03 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: avoid possible race on _output_frontend_stats()
+ Make sure we send out our info message before we give up ownership
+ of the structure.
+
+2016-04-29 14:53:06 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: var rename in _output_frontend_params()
+ Now it matches the rest of its status peers. Underscore
+ was a leftover from previous times.
+
+2016-04-29 14:45:22 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: always output known frontend status params
+ The only mandatory frontend information for our use case
+ is its status. Make sure we output what we know instead
+ of choking at the first error getting SNR, BER or any of
+ the other informational parameters.
+
+2016-04-29 12:06:52 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: refactor signal locking loop
+ Get rid of preliminar frontend status check.
+
+2016-04-29 11:18:53 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: drop unneeded polling step on _tune_fe()
+ Additional waiting was not needed. Specially considering
+ it came after a successful READ_STATUS ioctl and was
+ followed by an EINTR-resilent retry.
+
+2016-04-29 17:19:19 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * gst/mpegtsmux/tsmux/tsmuxstream.c:
+ mpegtsmux: effectively check if there is a language
+ 'language' is an array and not a pointer.
+ CID 1358835
+
+2016-04-29 13:54:01 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/player/Makefile.am:
+ player: Add required paths via pkg-config for gstreamer-base-1.0 and gstreamer-video-1.0 for gobject-introspection
+ The GstBase-1.0.gir and GstVideo-1.0.gir files are required by GstPlayer.
+ Uninstalled builds fail if these files cannot be found.
+ https://bugzilla.gnome.org/show_bug.cgi?id=765804
+
+2016-04-08 16:47:15 +0800 Haihua Hu <jared.hu@nxp.com>
+
+ * ext/gl/Makefile.am:
+ * ext/gl/gstgldeinterlace.c:
+ * ext/gl/gstgldeinterlace.h:
+ * ext/gl/gstopengl.c:
+ gl: enable gldeinterlace on OpenGL ES
+ 1.Porting the exist deinterlace shader and OpenGL callback
+ to be compatible with OpenGL ES.
+ 2.Add a our blur vertical shader to gldeinterlace.
+ 3.Add a property named “method” to let user choose which
+ deinterlace function to use. Default to choose blur vertical
+ method for better performance.
+ [Matthew Waters]: fix name of greedyh in method property (was greedhy) and port
+ to git master.
+ https://bugzilla.gnome.org/show_bug.cgi?id=764873
+
+2016-04-28 15:19:17 +0530 Barun Kumar Singh <barun.singh@samsung.com>
+
+ * docs/libs/gst-plugins-bad-libs-sections.txt:
+ * gst-libs/gst/player/gstplayer.c:
+ * gst-libs/gst/player/gstplayer.h:
+ * win32/common/libgstplayer.def:
+ player: Add audio-video-offset property and setter/getter API
+ https://bugzilla.gnome.org/show_bug.cgi?id=765315
+
+2016-04-19 19:43:03 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/gl/gstglcolorconvert.c:
+ * gst-libs/gst/gl/gstglsl.c:
+ * gst-libs/gst/gl/gstglsl_private.h:
+ * gst-libs/gst/gl/gstglviewconvert.c:
+ glviewconvert: Port more things to GLES/GL 3 compatibility
+ And move the shader mangling code into a single place instead of having a copy
+ in glcolorconvert and glviewconvert.
+ https://bugzilla.gnome.org/show_bug.cgi?id=765266
+
+2016-04-19 19:27:33 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/gl/gstglcolorconvert.c:
+ glcolorconvert: GLES3 deprecates texture2D() and it does not work at all in newer versions than 3.3
+ Use the newer texture() function instead. This fixes glimagesink and other
+ things on various Android devices.
+ https://bugzilla.gnome.org/show_bug.cgi?id=765266
+
+2016-04-19 10:27:43 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * gst-libs/gst/mpegts/gstmpegtsdescriptor.c:
+ * gst-libs/gst/mpegts/gstmpegtsdescriptor.h:
+ * gst/mpegtsmux/tsmux/tsmuxstream.c:
+ * gst/mpegtsmux/tsmux/tsmuxstream.h:
+ mpegtsmux: write language descriptor when language is available
+ Adds a new function to mpegts lib to create a iso639 language
+ descriptor from a language and use it in mpegtsmux to add
+ a language descriptor to audio streams that have a language set.
+ https://bugzilla.gnome.org/show_bug.cgi?id=763647
+
+2016-04-26 16:48:58 +0800 Song Bing <bing.song@nxp.com>
+
+ * sys/pvr2d/gstpvrbufferpool.c:
+ pvrbufferpool: fix gst_meta_register() parameters
+ https://bugzilla.gnome.org/show_bug.cgi?id=765581
+
+2016-04-22 10:15:39 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst-libs/gst/base/gstaggregator.c:
+ aggregator: Check all pads for data when live
+ When live, we still need to inspect all pads queue in order to determin
+ if we have received the first buffer or not.
+ https://bugzilla.gnome.org/show_bug.cgi?id=765431
+
+2016-04-15 16:51:17 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst-libs/gst/base/gstaggregator.c:
+ aggregator: Fix locking when using the clock
+ This fixes a race where we check if there is a clock, then it get
+ removed and we endup calling gst_clock_new_single_shot_id() with a NULL
+ pointer instead of a valid clock and also calling gst_object_unref()
+ with a NULL pointer later.
+ https://bugzilla.gnome.org/show_bug.cgi?id=757548
2016-04-25 16:50:55 +0300 Sebastian Dröge <sebastian@centricular.com>
@@ -809,146 +6000,293 @@
Don't put level=0 into the caps, it confuses other elements.
https://bugzilla.gnome.org/show_bug.cgi?id=765538
-=== release 1.8.1 ===
+2016-04-25 16:50:18 +0300 Sebastian Dröge <sebastian@centricular.com>
-2016-04-20 18:22:13 +0300 Sebastian Dröge <sebastian@centricular.com>
+ * gst/videoparsers/gsth264parse.c:
+ h264parse: H264 level idc 0 is not valid
+ Don't put level=0 into the caps, it confuses other elements.
+ https://bugzilla.gnome.org/show_bug.cgi?id=765538
- * ChangeLog:
- * NEWS:
- * RELEASE:
- * configure.ac:
- * 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-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-hls.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-mplex.xml:
- * docs/plugins/inspect/plugin-ofa.xml:
- * docs/plugins/inspect/plugin-openal.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.8.1
+2016-04-22 14:51:31 +0200 Jerome Laheurte <jlaheurte@quividi.com>
-2016-04-20 18:10:11 +0300 Sebastian Dröge <sebastian@centricular.com>
+ * sys/dshowsrcwrapper/gstdshowfakesink.cpp:
+ * sys/dshowsrcwrapper/gstdshowvideosrc.cpp:
+ dshowsrcwrapper: fix DirectShow caps negotiation and set capture pin caps
+ Some cameras (IDS) have broken DirectShow drivers which incorrectly fill some
+ fields in the VIDEOINFOHEADER structure; comparison between suggested and
+ supported media types in CBaseRenderer should ignore deprecated and/or not
+ essential fields; additionaly explicitely setting the mediatype for the capture
+ pin before trying to connect it works around another IDS driver bug, and
+ should have been already done anyway.
+ https://bugzilla.gnome.org/show_bug.cgi?id=765428
- * po/af.po:
- * po/az.po:
- * po/bg.po:
- * po/ca.po:
- * po/cs.po:
- * po/da.po:
- * po/de.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/nl.po:
- * po/or.po:
- * po/pl.po:
- * po/pt_BR.po:
- * po/ro.po:
- * po/ru.po:
- * po/sk.po:
- * po/sl.po:
- * po/sq.po:
- * po/sr.po:
- * po/sv.po:
- * po/tr.po:
- * po/uk.po:
- * po/vi.po:
- * po/zh_CN.po:
- Update .po files
+2016-04-22 14:48:41 +0200 Jerome Laheurte <jlaheurte@quividi.com>
-2016-04-14 22:32:05 -0700 Aleix Conchillo Flaqué <aconchillo@gmail.com>
+ * sys/dshowsrcwrapper/gstdshow.cpp:
+ dshowsrcwrapper: add support for RGB32, RGB555, RGB565 and RGB8 color spaces
+ Some cameras (IDS) only support those.
+ https://bugzilla.gnome.org//show_bug.cgi?id=765427
- * ext/srtp/gstsrtpdec.c:
- srtpdec: also check for "roc" in caps
- Currently, gst_srtp_dec_sink_setcaps is happy if the "roc" field is not
- provided in the caps. If it is not provided the stream will be properly
- inserted in the hash table with a default "roc". Then, when the first
- buffer arrives validate_buffer will find an existing stream in the hash
- table and will not signal request-key, not allowing the user to provide
- a "roc".
- This patch expects "roc" in gst_srtp_dec_sink_setcaps, if not found a
- request-key will be signaled and the user will be able to provide all
- the srtp fields, including "roc".
- https://bugzilla.gnome.org/show_bug.cgi?id=765079
+2016-04-22 14:44:57 +0200 Jerome Laheurte <jlaheurte@quividi.com>
+
+ * sys/dshowsrcwrapper/CMakeLists.txt:
+ dshowsrcwrapper: fix include path and link error
+ Add include path so that the cmake-generated project
+ is able to find gstconfig.h
+ Add /SAFESEH:NO to MSVC linker options so it can link with
+ gstreamer libraries on Windows.
+ https://bugzilla.gnome.org//show_bug.cgi?id=765426
+
+2016-04-22 15:02:01 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * tests/check/elements/adaptive_demux_common.c:
+ * tests/check/elements/adaptive_demux_common.h:
+ tests: adaptivedemux: only check for data length after seek
+ When the test involves doing a seek, only check for data size after
+ the seek. The final segment range after seek might be different/smaller
+ than the threshold for doing the seek and doing the check before
+ seeking would fail.
+
+2016-02-16 14:26:55 +0000 Florin Apostol <florin.apostol@oregan.net>
+
+ * tests/check/elements/test_http_src.c:
+ * tests/check/elements/test_http_src.h:
+ adaptivedemux: tests: use macro to define names of request and response structs
+ Following the Don't Repeat Yourself principle, define macros
+ for the structures that contain the request and response headers,
+ so that the name is not repeated in multiple places in multiple files.
+ https://bugzilla.gnome.org/show_bug.cgi?id=762144
+
+2016-02-16 14:26:42 +0000 Florin Apostol <florin.apostol@oregan.net>
+
+ * tests/check/elements/adaptive_demux_common.c:
+ * tests/check/elements/hls_demux.c:
+ adaptivedemux: tests: improved checks for expected data
+ Check the size of received data for each buffer received by AppSink
+ https://bugzilla.gnome.org/show_bug.cgi?id=762144
+
+2016-02-16 11:37:44 +0000 Florin Apostol <florin.apostol@oregan.net>
+
+ * tests/check/elements/adaptive_demux_engine.c:
+ * tests/check/elements/adaptive_demux_engine.h:
+ * tests/check/elements/dash_demux.c:
+ dashdemux: tests: added content protection test
+ Test content protection
+ Configure 3 content protection sources:
+ - a uuid scheme/value pair
+ - a non uuid scheme/value pair (dash recognises only uuid schemes)
+ - a complex uuid scheme, with trailing spaces and capital letters in scheme uri
+ Only the uuid scheme should be recognised. We expect to receive 2 content protection events
+ https://bugzilla.gnome.org/show_bug.cgi?id=758064
+
+2016-04-22 17:04:57 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * ext/dash/gstmpdparser.c:
+ dash: strip lead/trailing whitespace from descriptortype attributes
+ The spec says it is xs:anyURI and leading and trailing whitespace
+ are to be ignored
+ https://bugzilla.gnome.org/show_bug.cgi?id=758064
+
+2016-02-16 14:26:05 +0000 Florin Apostol <florin.apostol@oregan.net>
+
+ * tests/check/elements/dash_demux.c:
+ dashdemux: tests: added test for media download error for in stream fragment
+ Tested download error for a fragment that is not the last media fragment
+ in the stream.
+ https://bugzilla.gnome.org/show_bug.cgi?id=762144
+
+2016-02-16 14:25:45 +0000 Florin Apostol <florin.apostol@oregan.net>
+
+ * tests/check/elements/dash_demux.c:
+ dashdemux: tests: added test for download errors during header download
+ Test header download error.
+ Let the adaptive demux download a few bytes, then instruct the
+ GstTestHTTPSrc element to generate an error while the fragment header
+ is still being downloaded.
+ https://bugzilla.gnome.org/show_bug.cgi?id=762144
+
+2016-02-16 14:25:32 +0000 Florin Apostol <florin.apostol@oregan.net>
+
+ * tests/check/elements/adaptive_demux_common.c:
+ * tests/check/elements/adaptive_demux_common.h:
+ * tests/check/elements/dash_demux.c:
+ dashdemux: tests: refactor testFragmentDownloadError
+ Renamed testFragmentDownloadError to testMediaDownloadErrorLastFragment.
+ Added gst_adaptive_demux_test_unexpected_eos function.
+ Remove unneeded testFragmentDownloadErrorCheckSizeOfDataReceived.
+ https://bugzilla.gnome.org/show_bug.cgi?id=762144
+
+2016-02-16 14:25:04 +0000 Florin Apostol <florin.apostol@oregan.net>
+
+ * tests/check/elements/dash_demux.c:
+ dashdemux: tests: tested latency query
+ Updated query test to also check if dash responds correctly to a latency
+ query.
+ https://bugzilla.gnome.org/show_bug.cgi?id=762144
+
+2016-02-16 14:24:49 +0000 Florin Apostol <florin.apostol@oregan.net>
+
+ * tests/check/elements/dash_demux.c:
+ dashdemux: tests: moved testQuery after testFragmentDownloadError
+ Moved testQuery after testFragmentDownloadError so that testDownloadError
+ and testFragmentDownloadError are grouped together.
+ The commit just moved the testQueryCheckDataReceived and
+ GST_START_TEST (testQuery) functions but git gets confused in matching the
+ lines and reports a lot of changes in the patch.
+ https://bugzilla.gnome.org/show_bug.cgi?id=762144
+
+2016-02-16 14:24:26 +0000 Florin Apostol <florin.apostol@oregan.net>
+
+ * tests/check/elements/adaptive_demux_common.c:
+ * tests/check/elements/adaptive_demux_common.h:
+ * tests/check/elements/dash_demux.c:
+ adaptivedemux: tests: create a GstDashDemuxTestCase class
+ Create a GstDashDemuxTestCase class that extends from GstAdaptiveDemuxTestCase.
+ This new class will contain all the DASH specific fields.
+ https://bugzilla.gnome.org/show_bug.cgi?id=762144
+
+2016-02-16 14:24:09 +0000 Florin Apostol <florin.apostol@oregan.net>
+
+ * tests/check/elements/dash_demux.c:
+ dashdemux: tests: added support to pass various parameters to http src callbacks
+ Added support to pass various parameters to http src callbacks using GstStructure.
+ https://bugzilla.gnome.org/show_bug.cgi?id=762144
+
+2016-03-01 14:54:01 -0800 Scott D Phillips <scott.d.phillips@intel.com>
+
+ * gst/debugutils/gstchecksumsink.c:
+ * gst/debugutils/gstchecksumsink.h:
+ checksumsink: add "hash" property and allow more checksum types
+ Now any GChecksumType can be used by GstChecksumSink, adding
+ support for MD5, SHA-256 and SHA-512 in addition to SHA-1.
+ https://bugzilla.gnome.org/show_bug.cgi?id=763006
+
+2016-04-22 08:20:14 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/check/Makefile.am:
+ check: Fix LDADD/CFLAGS for player unit test
+ It now requires libgstvideo
+
+2016-02-16 14:44:39 +0000 Florin Apostol <florin.apostol@oregan.net>
+
+ * tests/check/elements/adaptive_demux_engine.c:
+ * tests/check/elements/adaptive_demux_engine.h:
+ adaptivedemux: tests: use a GstTestClock as the system clock
+ To allow the adaptivedemux live stream tests to run in non-realtime, use a
+ GstTestClock as the system clock. This allows the unit tests to complete
+ more quickly than if they had to complete in real time.
+ https://bugzilla.gnome.org/show_bug.cgi?id=762147
+
+2016-02-16 14:44:27 +0000 Florin Apostol <florin.apostol@oregan.net>
+
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ adaptivedemux: use realtime_clock for waiting for a condition
+ There are several places in adaptivedemux where it waits for
+ time to pass, for example to wait until it should next download
+ a fragment. The problem with this approach is that it means that
+ unit tests are forced to execute in realtime.
+ This commit replaces the use of g_cond_wait_until() with single
+ shot GstClockID that signals the condition variable. Under normal
+ usage, this behaves exactly as before. A unit test can replace the
+ system clock with a GstTestClock, allowing the test to control the
+ timing in adaptivedemux.
+ https://bugzilla.gnome.org/show_bug.cgi?id=762147
+
+2016-02-16 14:44:10 +0000 Florin Apostol <florin.apostol@oregan.net>
+
+ * ext/dash/gstdashdemux.c:
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+ * gst-libs/gst/adaptivedemux/gstadaptivedemux.h:
+ adaptivedemux: use GstSystemClock to all real-time calculations
+ A realtime clock is used in many places, such as deciding which
+ fragment to select at start up and deciding how long to sleep
+ before a fragment becomes available. For example dashdemux needs
+ sample the client's estimate of UTC when selecting where to start
+ in a live DASH stream.
+ The problem with dashdemux calculating the client's idea of UTC is
+ that it makes it difficult to create unit tests, because the passage
+ of time is a factor in the test.
+ This commit changes dashdemux and adaptivedemux to use the
+ GstSystemClock, so that a unit test can replace the system clock when
+ it needs to be able to control the clock.
+ This commit makes no change to the behaviour under normal usage, as
+ GstSystemClock is based upon the system time.
+ https://bugzilla.gnome.org/show_bug.cgi?id=762147
+
+2016-04-21 14:58:45 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * win32/common/libgstplayer.def:
+ win32: Add new API to .def file
+
+2016-04-19 10:59:46 +0530 Barun Kumar Singh <barun.singh@samsung.com>
+
+ * docs/libs/gst-plugins-bad-libs-sections.txt:
+ * gst-libs/gst/player/Makefile.am:
+ * gst-libs/gst/player/gstplayer.c:
+ * gst-libs/gst/player/gstplayer.h:
+ * pkgconfig/gstreamer-player-uninstalled.pc.in:
+ * pkgconfig/gstreamer-player.pc.in:
+ player: Add support for multiview settings
+ https://bugzilla.gnome.org/show_bug.cgi?id=765302
+
+2016-04-21 10:06:40 +0900 Hyunjun Ko <zzoon@igalia.com>
+
+ * sys/applemedia/vtenc.c:
+ applemedia: vtenc: fix build break on iOS
+ Fix 'conflicting types' error
+ https://bugzilla.gnome.org/show_bug.cgi?id=765292
+
+2016-04-20 15:34:55 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: add test for invalid DVB-T2 bandwidth
+
+2016-04-20 14:47:22 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: warn on wrong DVB-T2 stream ID value
+ Stream ID, used for DVB-T2/S2 and ISDB-S can
+ not exceed 255 for the former. Change makes this
+ explicit.
+
+2016-04-20 21:07:28 +0900 Hyunjun Ko <zzoon@igalia.com>
+
+ * sys/applemedia/vtenc.c:
+ applemedia: vtenc: Fix a warning by weak-link symbol
+ Fix this warning
+ address of function 'VTCompressionSessionPrepareToEncodeFrames' will always evaluate to 'true' [-Wpointer-bool-conversion]
+ https://bugzilla.gnome.org/show_bug.cgi?id=765292
+
+2016-04-20 16:19:55 +0900 Hyunjun Ko <zzoon@igalia.com>
+
+ * ext/gl/caopengllayersink.m:
+ gl: caopengllayersink: fix a minor warning
+ Fix "unused variable" warning
+ https://bugzilla.gnome.org/show_bug.cgi?id=765292
+
+2016-04-20 16:00:36 +0900 Hyunjun Ko <zzoon@igalia.com>
+
+ * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m:
+ gl/cocoa: Fix incompatible type warning
+ https://bugzilla.gnome.org/show_bug.cgi?id=765292
+
+2016-04-19 14:57:22 +0530 Nirbheek Chauhan <nirbheek@centricular.com>
+
+ * sys/d3dvideosink/d3dhelpers.h:
+ d3dvideosink: Don't include deprecated and unavailable d3dx9tex.h
+ It's not needed, not on native Windows nor with mingw, and
+ we don't use anything from it anyway
+ https://bugzilla.gnome.org/show_bug.cgi?id=765250
+
+2016-04-14 12:46:58 +0200 Philipp Zabel <p.zabel@pengutronix.de>
+
+ * sys/kms/gstkmssink.c:
+ * sys/kms/gstkmssink.h:
+ kmssink: add sync support for secondary pipes
+ The vblank event request must specify the crtc for which to request
+ the event. This fixes kmssink synchronisation for crtcs other than
+ the first.
+ https://bugzilla.gnome.org/show_bug.cgi?id=765064
2016-04-19 09:30:39 +0300 Sebastian Dröge <sebastian@centricular.com>
@@ -966,6 +6304,29 @@
create by application.
https://bugzilla.gnome.org/show_bug.cgi?id=765241
+2016-04-18 13:46:55 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * gst-libs/gst/video/gstvideoaggregator.c:
+ videoaggregator: plug caps leak
+ It was losing ref of the original 'ret' caps that would be returned
+ or returning it with 2 references to it.
+
+2016-03-28 15:44:27 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * gst-libs/gst/video/gstvideoaggregator.c:
+ * tests/check/elements/compositor.c:
+ videoaggregator: properly handle interlace-mode restrictions
+ videoaggregator can't handle interlace-mode changes so it must
+ always restrict itself to the first interlacing mode it receives.
+ Tests included
+ https://bugzilla.gnome.org/show_bug.cgi?id=754495
+
+2016-01-22 16:49:57 +0000 Raffaele Rossi <rarossi@cisco.com>
+
+ * ext/dtls/README:
+ dtsl: add some documentation
+ https://bugzilla.gnome.org/show_bug.cgi?id=760994
+
2016-04-17 15:45:41 +0100 Heinrich Fink <hfink@toolsonair.com>
* ext/gl/caopengllayersink.m:
@@ -980,22 +6341,143 @@
Fixes blurry content on HiDPI screens
https://bugzilla.gnome.org/show_bug.cgi?id=765194
+2016-04-16 22:33:48 +1000 Jan Schmidt <jan@centricular.com>
+
+ * gst/mpegtsmux/mpegtsmux.c:
+ mpegtsmux: Remove an unnecessary check for NULL before g_free
+
+2016-04-15 13:22:51 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * gst-libs/gst/player/gstplayer-video-overlay-video-renderer.c:
+ * gst/compositor/compositor.c:
+ Drop usage of 'overlayed' to mean 'overlaid'
+
+2016-04-15 13:10:41 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: show invalid delsys/mod combination if found
+
+2016-04-15 11:29:48 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: add modulation check for ATSC
+
+2016-04-11 23:45:22 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: do not autodetect delsys twice
+ The process is dealt with the first time the adapter is
+ opened, there is no need to do this again.
+
+2016-04-14 22:32:05 -0700 Aleix Conchillo Flaqué <aconchillo@gmail.com>
+
+ * ext/srtp/gstsrtpdec.c:
+ srtpdec: also check for "roc" in caps
+ Currently, gst_srtp_dec_sink_setcaps is happy if the "roc" field is not
+ provided in the caps. If it is not provided the stream will be properly
+ inserted in the hash table with a default "roc". Then, when the first
+ buffer arrives validate_buffer will find an existing stream in the hash
+ table and will not signal request-key, not allowing the user to provide
+ a "roc".
+ This patch expects "roc" in gst_srtp_dec_sink_setcaps, if not found a
+ request-key will be signaled and the user will be able to provide all
+ the srtp fields, including "roc".
+ https://bugzilla.gnome.org/show_bug.cgi?id=765079
+
+2014-07-28 12:14:02 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com>
+
+ * gst-libs/gst/codecparsers/gstmpegvideoparser.c:
+ * gst-libs/gst/codecparsers/gstmpegvideoparser.h:
+ codecparsers: mpegvideo: Parse more slice header fields
+ https://bugzilla.gnome.org/show_bug.cgi?id=733872
+
+2014-07-28 11:17:05 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com>
+
+ * gst-libs/gst/codecparsers/gstmpegvideoparser.c:
+ * gst-libs/gst/codecparsers/gstmpegvideoparser.h:
+ codecparsers: mpegvideo: Add vbv_delay field to PictureHeader
+ https://bugzilla.gnome.org/show_bug.cgi?id=733872
+
+2014-07-28 11:14:22 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com>
+
+ * gst-libs/gst/codecparsers/gstmpegvideoparser.c:
+ * gst-libs/gst/codecparsers/gstmpegvideoparser.h:
+ codecparsers: mpegvideo: Add more fields to the GstMpegVideoSequenceHdr
+ Added the fields load_non_intra_quantiser_matrix and
+ load_chroma_intra_quantiser_matrix to the sequence header structure.
+ https://bugzilla.gnome.org/show_bug.cgi?id=733872
+
+2016-04-14 10:02:32 +0100 Julien Isorce <j.isorce@samsung.com>
+
+ * README:
+ * common:
+ Automatic update of common submodule
+ From 6f2d209 to ac2f647
+
2016-04-13 18:12:25 +0100 Damian Ziobro <damian@xmementoit.com>
* gst/mpegtsmux/mpegtsmux.c:
mpegtsmux: free pad_data->language before g_strdup in order to avoid memory leak
https://bugzilla.gnome.org/show_bug.cgi?id=765005
-2015-09-08 14:37:57 +0200 Patricia Muscalu <patricia@axis.com>
+2016-04-13 13:10:12 +0300 Sebastian Dröge <sebastian@centricular.com>
- * ext/curl/gstcurlbasesink.c:
- curlsink: catch an unknown error
- In this case the socket callback has not been called
- by libcurl and the curlsink has not been notified about any
- connection problems by libcurl.
- This indicates that it's a bug in libcurl so catch it as
- an unknown error.
- https://bugzilla.gnome.org/show_bug.cgi?id=754432
+ * sys/applemedia/corevideobuffer.c:
+ applemedia: GstCoreVideoMeta in the plugin using only public API has no ctx member
+
+2016-04-13 13:09:05 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * sys/applemedia/coremediabuffer.c:
+ applemedia: GstCoreMediaMeta in the plugin using only public API has no ctx member
+
+2016-04-13 10:25:32 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/directfb/dfbvideosink.c:
+ * sys/pvr2d/gstpvrbufferpool.c:
+ meta: Initialize all remaining metas in their init function
+ https://bugzilla.gnome.org/show_bug.cgi?id=764902
+
+2016-04-13 10:17:24 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst-libs/gst/codecparsers/gstmpegvideometa.c:
+ * sys/applemedia-nonpublic/coremediabuffer.c:
+ * sys/applemedia-nonpublic/corevideobuffer.c:
+ * sys/applemedia/coremediabuffer.c:
+ * sys/applemedia/corevideobuffer.c:
+ meta: Initialize all GstMeta fields
+ During allocation they are not initialized to all zeroes.
+ https://bugzilla.gnome.org/show_bug.cgi?id=764902
+
+2016-04-11 22:08:03 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: avoid redundant delsys querying
+ There is no need to query the frontend for the list
+ of supported delivery systems if we are selecting
+ one from the list of autodetected ones.
+
+2016-04-10 18:58:33 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * sys/dvb/parsechannels.c:
+ dvb/parsechannels: add information to file not found error
+ Adds useful failure info (like filename) comming from
+ g_file_get_contents() as done for every other error in
+ this block.
+
+2016-04-13 00:43:18 +1000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m:
+ * gst-libs/gst/gl/eagl/gstglwindow_eagl.m:
+ gl/cocoa/eagl: don't leak GThread's when dispatching messages
+ gst_gl_context_get_thread() returns a refed pointer, we need to unref it.
+
+2016-04-12 11:14:22 +0100 Luis de Bethencourt <luisbg@osg.samsung.com>
+
+ * ext/gl/gstgltestsrc.c:
+ gltestsrc: don't dereference null pointer
+ funcs can be NULL, it is one of the two conditions of the OR statement
+ above, so confirm it isn't before dereferencing with funcs->free.
+ CID 1358388
2016-04-12 04:16:55 +1000 Jan Schmidt <jan@centricular.com>
@@ -1007,6 +6489,200 @@
the new program back out of it. Instead, add the new program to
the hash table after handling removal of the old one.
+2016-04-06 04:15:40 +0000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglupload.c:
+ glupload: keep the parent buffer around when converting EGLImage to 2D textures
+ e.g. receiving and releasing a buffer from OMX too early will potentially
+ cause textures to be overwritten while/before they are displayed.
+
+2016-04-11 16:43:45 +0000 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gstglbasemixer.c:
+ glbasemixer: chain up to the parent implementation
+
+2016-04-11 18:06:25 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/vulkan/vkdevice.c:
+ vulkan: prettify the various versions in the debug output
+ output human readable numbers.
+
+2016-04-11 20:23:45 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * ext/openh264/gstopenh264dec.cpp:
+ openh264dec: minor clean-ups
+ Remove unused property getters, setters; outdated comment.
+
+2016-04-11 20:11:53 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * ext/openh264/gstopenh264dec.cpp:
+ * ext/openh264/gstopenh264dec.h:
+ * ext/openh264/gstopenh264enc.cpp:
+ * ext/openh264/gstopenh264enc.h:
+ openh264: remove unnecessary instance private structures
+ Element instance structures are not public API, so no need
+ for the extra indirection to hide the data.
+
+2016-04-11 20:04:00 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * ext/openh264/gstopenh264dec.cpp:
+ * ext/openh264/gstopenh264enc.cpp:
+ openh264: fix indentation
+
+2016-02-12 14:21:27 +0100 Philipp Zabel <p.zabel@pengutronix.de>
+
+ * sys/kms/gstkmsutils.c:
+ kmssink: enable UYVY, YUY2, and YVYU (interleaved YUV 4:2:2) formats
+ https://bugzilla.gnome.org/show_bug.cgi?id=761059
+
+2016-02-12 14:17:32 +0100 Philipp Zabel <p.zabel@pengutronix.de>
+
+ * sys/kms/gstkmsutils.c:
+ kmssink: enable NV16 (chroma-interleaved YUV 4:2:2) format
+ https://bugzilla.gnome.org/show_bug.cgi?id=761059
+
+2016-02-12 14:17:13 +0100 Philipp Zabel <p.zabel@pengutronix.de>
+
+ * sys/kms/gstkmsutils.c:
+ kmssink: enable Y42B (planar YUV 4:2:2) format
+ https://bugzilla.gnome.org/show_bug.cgi?id=761059
+
+2016-03-04 16:53:58 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+
+ * sys/kms/gstkmssink.c:
+ * sys/kms/gstkmssink.h:
+ kmssink: keep last rendered buffer in memory
+ https://bugzilla.gnome.org/show_bug.cgi?id=761059
+
+2016-02-20 23:13:54 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+
+ * sys/kms/gstkmssink.c:
+ * sys/kms/gstkmssink.h:
+ kmssink: wait for page flip or vblank
+ This patch requests for drmModePageFlip() for the used CRTC, if the kernel
+ module suppports async page flip. If it does not, the element requests for a
+ vblank event. A GstPoll waits for the event to happen.
+ https://bugzilla.gnome.org/show_bug.cgi?id=761059
+
+2016-02-10 20:43:47 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+
+ * configure.ac:
+ * sys/kms/Makefile.am:
+ * sys/kms/gstkmsallocator.c:
+ * sys/kms/gstkmsallocator.h:
+ * sys/kms/gstkmssink.c:
+ * sys/kms/gstkmssink.h:
+ kmssink: add dmabuf support
+ This patch will enable the import of dmabufs into a KMS buffer using
+ the PRIME kernel interface.
+ If the driver does not support prime import, the method is skipped.
+ It has been tested with a Freescale I.MX6 board.
+ https://bugzilla.gnome.org/show_bug.cgi?id=761059
+
+2016-01-31 13:12:34 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+
+ * sys/kms/gstkmssink.c:
+ * sys/kms/gstkmsutils.c:
+ * sys/kms/gstkmsutils.h:
+ kmssink: calculate display ratio
+ Get the aspect ratio given the information provided by libdrm, and with it
+ calculate the display ratio.
+ https://bugzilla.gnome.org/show_bug.cgi?id=761059
+
+2016-01-20 12:00:51 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+
+ * configure.ac:
+ * sys/Makefile.am:
+ * sys/kms/Makefile.am:
+ * sys/kms/gstkmsallocator.c:
+ * sys/kms/gstkmsallocator.h:
+ * sys/kms/gstkmsbufferpool.c:
+ * sys/kms/gstkmsbufferpool.h:
+ * sys/kms/gstkmssink.c:
+ * sys/kms/gstkmssink.h:
+ * sys/kms/gstkmsutils.c:
+ * sys/kms/gstkmsutils.h:
+ kmssink: add plugin and sink element
+ This is simple video sink that use libdrm/libkms API to render frames.
+ The element uses planes to render through drmModeSetPlane().
+ It has been tested in an Exynos4412 board and in a Freescale I.MX6 board.
+ https://bugzilla.gnome.org/show_bug.cgi?id=761059
+
+2016-04-10 17:46:15 +1000 Matthew Waters <matthew@centricular.com>
+
+ * configure.ac:
+ * ext/vulkan/Makefile.am:
+ * ext/vulkan/vkapi.h:
+ * ext/vulkan/vkdevice.c:
+ * ext/vulkan/vkdisplay.c:
+ * ext/vulkan/vkinstance.c:
+ * ext/vulkan/vkwindow.c:
+ * ext/vulkan/wayland/Makefile.am:
+ * ext/vulkan/wayland/vkdisplay_wayland.c:
+ * ext/vulkan/wayland/vkdisplay_wayland.h:
+ * ext/vulkan/wayland/vkwindow_wayland.c:
+ * ext/vulkan/wayland/vkwindow_wayland.h:
+ * ext/vulkan/wayland/wayland_event_source.c:
+ * ext/vulkan/wayland/wayland_event_source.h:
+ vulkan: add a wayland winsys implementation
+
+2016-04-10 17:43:39 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/vulkan/xcb/vkwindow_xcb.c:
+ * ext/vulkan/xcb/vkwindow_xcb.h:
+ vulkan/xcb: getProcAddress winsys functions
+ There's no guarantee that they will always be exposed by the vulkan loader.
+
+2016-04-09 17:52:28 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/vulkan/vkupload.c:
+ vkupload: copy necessary buffer metadata
+ timestamps, flags, etc
+
+2016-04-11 08:34:00 +1000 Alessandro Decina <alessandro.d@gmail.com>
+
+ * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m:
+ * gst-libs/gst/gl/eagl/gstglwindow_eagl.m:
+ libgstgl: cocoa, eagl: use libdispatch to schedule GL calls
+ Use libdispatch instead of GMainLoop to dispatch GL calls. libdispatch is more
+ optimized and cuts a lot of poll()/pthread_* overhead.
+
+2016-04-11 08:02:45 +1000 Alessandro Decina <alessandro.d@gmail.com>
+
+ * gst-libs/gst/gl/gstglwindow.c:
+ glwindow: reduce the number of GMutexes and GConds in send_message()
+ Don't create many short lived locks/conds in gst_gl_window_send_message. This is
+ a micro optimization to save a bunch of pthread_* calls which are expensive on
+ OSX/iOS and possibly other platforms.
+
+2016-04-10 22:18:38 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * win32/common/libgstgl.def:
+ win32: update .def file for new gl api
+
+2016-04-08 18:34:45 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/vulkan/vkswapper.c:
+ vkswapper: add necessary wait stages to the submission info
+
+2016-04-08 18:32:41 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/vulkan/vkswapper.c:
+ vkswapper: add srgb formats to our list of formats
+ intel returns them for their surface formats.
+
+2016-04-08 18:09:53 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/vulkan/vkimagememory.c:
+ vulkan: silence a validation warning filling out the image barrier
+
+2016-04-08 18:09:06 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/vulkan/vkdevice.c:
+ * ext/vulkan/vkinstance.c:
+ vulkan: use the correct validation layer name
+ The threading validation layer has changed names.
+
2016-04-08 14:07:55 +0300 Sebastian Dröge <sebastian@centricular.com>
* sys/decklink/gstdecklink.cpp:
@@ -1030,6 +6706,38 @@
Just warn and error out instead.
https://bugzilla.gnome.org/show_bug.cgi?id=764545
+2016-04-08 14:51:44 +1000 Matthew Waters <matthew@centricular.com>
+
+ * sys/nvenc/gstnvbaseenc.c:
+ * sys/nvenc/gstnvbaseenc.h:
+ nvenc: add some rate control modes/properties
+ Supported modes are constant quantizer, cbr, vbr and vbr with a minimum quantizer.
+
+2016-04-07 23:24:47 +1000 Matthew Waters <matthew@centricular.com>
+
+ * sys/nvenc/gstnvbaseenc.c:
+ * sys/nvenc/gstnvbaseenc.h:
+ * sys/nvenc/gstnvh264enc.c:
+ nvenc: move codec config initialization from the implementation to the base class
+ Supports a better separation of configuration parameters
+
+2016-04-07 22:46:08 +1000 Matthew Waters <matthew@centricular.com>
+
+ * sys/nvenc/gstnvbaseenc.c:
+ * sys/nvenc/gstnvbaseenc.h:
+ * sys/nvenc/gstnvenc.c:
+ * sys/nvenc/gstnvh264enc.c:
+ nvenc: add preset selection
+ Some presets are not always supported on all devices and will cause an error if
+ used. Specifically, the LOSSLESS presets are known to not work everywhere.
+
+2014-07-16 02:44:42 +0200 Marcin Kolny <marcin.kolny@gmail.com>
+
+ * ext/chromaprint/gstchromaprint.c:
+ chromaprint: emit notify::fingerprint signal when fingerprint is ready
+ In addition to adding the fingerprint to the tags.
+ https://bugzilla.gnome.org/show_bug.cgi?id=733233
+
2016-04-04 20:55:51 +1000 Matthew Waters <matthew@centricular.com>
* ext/gl/gstglvideomixer.c:
@@ -1040,6 +6748,160 @@
sure that it is also overridable.
https://bugzilla.gnome.org/show_bug.cgi?id=764363
+2016-04-05 21:40:58 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst/librfb/gstrfbsrc.c:
+ rfbsrc: Fix fallback to GstVideoBufferPool
+ The replacement pool need to be added to the query, otherwise the
+ baseclass won't see it. We also need to properly remove the rejected
+ pools.
+ https://bugzilla.gnome.org/show_bug.cgi?id=763441
+
+2016-04-05 21:07:32 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst/librfb/gstrfbsrc.c:
+ * gst/librfb/gstrfbsrc.h:
+ rfbsrc: Implement decide_allocation virtual
+ This way we can use the base class for buffer allocation, hence use
+ fill() instead of create() virtual. This also adds a strict check on the
+ select pool buffer size as we don't support strides and padding.
+ This is based on initial patch proposed by Sebastien Dröge, from which I
+ also fixed a buffer pool leak.
+ https://bugzilla.gnome.org/show_bug.cgi?id=763441
+
+2016-04-05 15:31:49 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst/librfb/gstrfbsrc.c:
+ rfbsrc: Fix caps negotiation
+ As we currently only use the server reported "natural" format, caps
+ negotiation should simply be limited to telling the base class which
+ format to use. Fix the negotiation by moving the associated code
+ into negotiate() virtual function. Also, use gst_base_src_set_caps()
+ rather then setting it on the pad directly. Also protect against this
+ method being called multiple time (we can't renegotiate for now).
+ This change also moves some network code that was being run during the
+ application state change call, to be run on the streaming thread.
+ https://bugzilla.gnome.org/show_bug.cgi?id=739598
+
+2016-03-26 13:36:34 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst/librfb/gstrfbsrc.c:
+ rfbsrc: Implement unlock() method
+ This prevent stalls when we try to stop the source while waiting
+ for the server to send more updates.
+
+2016-03-24 18:27:54 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst/librfb/rfbdecoder.c:
+ rfbsrc: Check for connection being closed
+ Although it's not very well documented, g_input_stream_read_all() will
+ set the number of bytes read to 0 if the connection is closed rather
+ then returning an error.
+
+2016-03-24 18:26:46 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst/librfb/rfbdecoder.c:
+ rfbsrc: Check for read/write error
+ Check for read/write error. This prevent undefined behaviour that rely
+ on unitialized buffer.
+
+2016-03-24 18:14:17 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst/librfb/gstrfbsrc.c:
+ * gst/librfb/rfbdecoder.c:
+ * gst/librfb/rfbdecoder.h:
+ rfbsrc: Add a internal method to disconnect
+ This also removes the disconnected boolean hack.
+
+2016-03-24 18:14:37 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst/librfb/gstrfbsrc.c:
+ rfbsrc: Don't ignore errors
+ This prevents recursion on error. This used to happen as we
+ don't change the state when something fails. We end up running
+ and failing in the same state forever.
+
+2016-03-24 16:46:49 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst/librfb/rfbdecoder.c:
+ * gst/librfb/rfbdecoder.h:
+ rfbsrc: Serialize write operations
+ Currently we send key events from seperate threads. IOStream does not
+ allow concurrent write operations, so protect this operation using a
+ mutex.
+
+2016-03-17 15:24:52 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst/librfb/rfbdecoder.c:
+ rfbsrc: Add 3.7/3.8 security type negotiation
+
+2016-03-16 18:48:49 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst/librfb/Makefile.am:
+ * gst/librfb/gstrfbsrc.c:
+ * gst/librfb/rfbdecoder.c:
+ * gst/librfb/rfbdecoder.h:
+ rfbsrc: Port to GSocketClient
+ Using GSocketClient we can simplify a lot the read/write operation.
+ This also provide an GSocketConnection (a GIOStream) which can then
+ be used with the GTlsClientConnection for secure connections. Note
+ that we use _write_all() to ensure all bytes have been read. This is
+ to follow the fact the none of the _send() calls check the return
+ value.
+
+2016-03-16 16:49:29 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst/librfb/Makefile.am:
+ * gst/librfb/gstrfbsrc.h:
+ * gst/librfb/rfb.h:
+ * gst/librfb/rfbdecoder.c:
+ rfbsrc: Remove useless library wrapping
+ We use a sinlge .c file, simplify everything by removing that
+ static library.
+
+2016-03-16 16:49:09 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst/librfb/Makefile.am:
+ * gst/librfb/rfb.c:
+ * gst/librfb/rfb.h:
+ * gst/librfb/rfbbuffer.c:
+ * gst/librfb/rfbbuffer.h:
+ * gst/librfb/rfbcontext.h:
+ * gst/librfb/rfbdecoder.h:
+ * gst/librfb/rfbutil.h:
+ rfbsrc: Cleanup dead code
+ Remove all the unused stuff, the include header, definition and C code
+ that don't contribute anything to this element.
+
+2016-03-14 15:08:13 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst/librfb/rfbdecoder.c:
+ rfbsrc: Properly fallback to 3.3
+ If the major version is not 3, then the minor version provided
+ should be ignored, as it is meaningless for our fallback.
+
+2016-03-14 15:05:45 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst/librfb/rfbdecoder.c:
+ rfbsrc: Cleanly handle security negotiation failure
+ When the security cannot be negotiated, the server returns
+ security type of 0 (failure). In that case, the next step is
+ to read the error reason string.
+
+2016-04-01 14:36:15 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/dash/gstmpdparser.c:
+ mpdparser: clamp segment durations to each other and period end
+ 5.3.2.1 in the spec.
+ https://bugzilla.gnome.org/show_bug.cgi?id=751792
+
+2015-09-10 13:22:58 +0100 Florin Apostol <florin.apostol@oregan.net>
+
+ * tests/check/elements/dash_mpd.c:
+ dashdemux: unit testing reproducing segment duration overflow
+ unit test reproducing https://bugzilla.gnome.org/show_bug.cgi?id=751792
+ With minor changes by Vincent Penquerc'h.
+
2016-04-05 14:49:51 +0300 Sebastian Dröge <sebastian@centricular.com>
* sys/decklink/gstdecklinkaudiosrc.cpp:
@@ -1067,6 +6929,51 @@
::VideoInputFrameArrived() callback, observed on Intensity Pro cards.
https://bugzilla.gnome.org/show_bug.cgi?id=747633
+2016-03-23 03:16:11 +0000 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gstglvideomixer.c:
+ glvideomixer: add support for the affine transformation meta
+
+2016-03-23 03:14:40 +0000 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gstglimagesink.c:
+ glimagesink: support the affine transformation meta for any texture target
+
+2016-04-05 16:22:49 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gstglmixer.c:
+ glmixer: set the current texture to 0 before mapping
+ If we fail mapping, we don't want to use undefined video data in the subclass.
+
+2015-09-08 14:37:57 +0200 Patricia Muscalu <patricia@axis.com>
+
+ * ext/curl/gstcurlbasesink.c:
+ curlsink: catch an unknown error
+ In this case the socket callback has not been called
+ by libcurl and the curlsink has not been notified about any
+ connection problems by libcurl.
+ This indicates that it's a bug in libcurl so catch it as
+ an unknown error.
+ https://bugzilla.gnome.org/show_bug.cgi?id=754432
+
+2016-04-04 13:43:30 +1000 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gstglmixerbin.c:
+ glmixerbin: proxy the start-time-* properties from aggregator
+
+2016-04-04 11:28:35 +0200 Santiago Carot-Nemesio <sancane@gmail.com>
+
+ * ext/dtls/gstdtlssrtpdec.c:
+ * ext/dtls/gstdtlssrtpenc.c:
+ dtls: Use unique names for internal elements to ease debugging
+ https://bugzilla.gnome.org/show_bug.cgi?id=748651
+
+2016-04-03 17:56:06 +0200 Aurélien Zanelli <aurelien.zanelli@darkosphere.fr>
+
+ * gst-libs/gst/base/gstaggregator.c:
+ aggregator: remove duplicated test of flow_return in pad_chain_internal
+ https://bugzilla.gnome.org/show_bug.cgi?id=764549
+
2016-04-03 18:06:20 +0900 Kouhei Sutou <kou@clear-code.com>
* sys/directsound/Makefile.am:
@@ -1077,6 +6984,73 @@
f9464ce3549c2b3948a582464631ba4f8dd0d5e7 .
https://bugzilla.gnome.org/show_bug.cgi?id=764523
+2016-03-31 11:21:35 +0200 Christoffer Stengren <christsn.gs@gmail.com>
+
+ * gst/gdp/dataprotocol.c:
+ * gst/gdp/dataprotocol.h:
+ * gst/gdp/gstgdpdepay.c:
+ * gst/gdp/gstgdpdepay.h:
+ gdpdepay: Query for buffer allocator before using default
+ https://bugzilla.gnome.org/show_bug.cgi?id=764361
+
+2016-03-22 19:27:39 +0200 Vivia Nikolaidou <vivia@toolsonair.com>
+
+ * gst/interlace/gstinterlace.c:
+ interlace: Allow interlaced sink caps, do passthrough
+ Allow interlace to receive already interlaced content, if compatible with its
+ configuration. In that case, it will just do passthrough.
+ https://bugzilla.gnome.org/show_bug.cgi?id=764036
+
+2016-04-01 21:24:34 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/README:
+ README: update to 1.0 and lilv
+
+2016-04-01 18:33:13 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/gstlv2filter.c:
+ lv2filter: remove the variable for the registry klass tag
+ Just pass the string when registering.
+
+2016-04-01 18:31:36 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * ext/lv2/gstlv2filter.c:
+ lv2filter: remove copy and paste of doc blob
+ This doc block is already in gstlv2.c.
+
+2016-04-01 12:59:19 +0200 Vanessa Chipirras Navalon <vanechipi@qtec.com>
+
+ * ext/opencv/gstsegmentation.cpp:
+ * ext/opencv/gstsegmentation.h:
+ opencv: segmentation: Ported to OpenCV version 3.1
+ Add namespace bgsegm, replacement functions and Template class for new
+ OpenCV versions because these functions have been removed. cvarrToMat() is
+ added because it is compatible with all versions of OpenCV and the use of
+ class Mat constructor is eliminated, it is also deprecated in 3.X versions.
+ Use the namespace cv because some functions are called many times.
+ This patch keeps compatibility with 2.4
+ https://bugzilla.gnome.org/show_bug.cgi?id=760473
+
+2016-04-01 14:12:08 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com>
+
+ * gst-libs/gst/codecparsers/gstvp9parser.c:
+ * gst-libs/gst/codecparsers/gstvp9parser.h:
+ codecparser: vp9: move persistent fields from GstVp9FrameHdr to GstVp9Parser
+ The subsampling_x, subsampling_y, bit_depth, color_space and color_range
+ fileds are moved from GstVp9FrameHdr to the global GstVp9Parser structure.
+ These fields are only present in keyframe or intra-only frame, no need to
+ duplicate them for inter-frames. This is an ABI change.
+ https://bugzilla.gnome.org/show_bug.cgi?id=764370
+
+2016-04-01 12:08:53 +0200 Vanessa Chipirras Navalon <vanechipi@qtec.com>
+
+ * ext/opencv/gsttextoverlay.h:
+ opencv: textoverlay: Ported to OpenCV version 3.1
+ imgproc_c.h is added because CvFont struct needs it in any 3.x version.
+ We use this structure in GstOpencvTextOverlay. This keeps compatibility
+ with 2.4.
+ https://bugzilla.gnome.org/show_bug.cgi?id=760473
+
2016-04-01 11:56:20 +0300 Sebastian Dröge <sebastian@centricular.com>
* gst/videoparsers/gsth264parse.c:
@@ -1086,6 +7060,196 @@
and the other compatible profiles.
https://bugzilla.gnome.org/show_bug.cgi?id=764448
+2016-03-22 07:19:03 +0000 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/egl/gsteglimagememory.c:
+ eglimage: perform eglCreateImage in the gl thread
+ while calling eglCreateImage without a GL context current in the executing
+ thread works on the RPi, some other implementations will return errors.
+ Marshall the eglCreateImage to the GL thread to appease these implementations.
+
+2016-04-01 14:58:56 +1100 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglviewconvert.c:
+ glviewconvert: support outputting to multiple draw buffers on GLES3
+ A similar change that was done to glcolorconvert adding the necessary shader
+ mangling.
+
+2016-03-31 19:50:28 +1100 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglcolorconvert.c:
+ glcolorconvert: implement multiple render targets for GLES3
+ There are numerous slight differences required between Desktop GL and GLES3 for
+ multiple render targets.
+ 1. gl_FragData doesn't exist at all and one is required to use
+ 'layout (location = ?) out ...' instead.
+ 2. gl_FragColor doesn't exist, same as 1
+ 3. texture2D() has been deprecated
+ Fortunately most of these have been taken care of with GL3 and the shader
+ mangling already exists so just expand the conditions they are used in. The
+ gl_FragData issue requires a new mangle pass though. We also use this new
+ pass on desktop GL for consistency.
+
+2016-03-31 18:23:22 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * tests/check/elements/mssdemux.c:
+ tests: mssdemux: do not use gst_object_unref for pure GObject*
+ Deallocate GObject* with g_object_unref instead of gst_object_unref.
+ Even if it works now, it is confusing and in the future it might
+ not work if any GstObject specifics are added.
+ https://bugzilla.gnome.org/show_bug.cgi?id=762142
+
+2016-02-16 13:55:54 +0000 Florin Apostol <florin.apostol@oregan.net>
+
+ * tests/check/elements/dash_demux.c:
+ dashdemux: tests: use g_object_unref for test data
+ The GstDashDemuxTestCase object is allocated using g_object_newv
+ but in many places was being deallocated using gst_object_unref.
+ This was caused by commit ae3ed25025e34ea9b09df59d22d7ebd7294560bc.
+ https://bugzilla.gnome.org/show_bug.cgi?id=762142
+
+2016-03-31 16:08:12 +0100 Luis de Bethencourt <luisbg@osg.samsung.com>
+
+ * ext/opencv/MotionCells.cpp:
+ * ext/opencv/MotionCells.h:
+ motioncells: fully construct MotionCells
+ Some members of MotionCells were not being initialized in the constructor.
+ Protect from potential garbage memory usage by fully initializing it.
+ Moving m_frameSize out of the class because it is only used in
+ performDetectionMotionCells().
+ CID 1197704
+
+2016-04-01 00:23:25 +1100 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/Makefile.am:
+ gl/build: add missing '\' at the end of the line in MakeFile.am
+ Otherwise the following elements aren't included in the correct variable.
+ Fixes error in 'make distcheck' failing to find gstgltestsrc.h
+
+2016-03-31 23:07:17 +1100 Matthew Waters <matthew@centricular.com>
+
+ * tests/check/Makefile.am:
+ gl/tests/pipelines: add custom _CFLAGS and LDADD
+ As is done everywhere else.
+ From what I can gather from make -C tests/check V=1 $(GST_PLUGINS_BAD_CFLAGS) is
+ required in order to find in-tree headers as well as srcdir != builddir
+ configurations.
+
+2016-03-31 22:20:01 +1100 Matthew Waters <matthew@centricular.com>
+
+ * tests/check/Makefile.am:
+ gl/tests: only build the simple-launch-lines test if we have GL
+
+2016-03-31 20:00:37 +1100 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglcolorconvert.c:
+ glcolorconvert: don't use the predefined variable name sample
+ Using 'sample' as a variable name is an error in GLES3
+
+2016-03-22 23:10:24 +1100 Matthew Waters <matthew@centricular.com>
+
+ * tests/examples/gl/gtk/switchvideooverlay/Makefile.am:
+ * tests/examples/gl/gtk/switchvideooverlay/main.cpp:
+ gl/examples: fix switchvideooverlay for wayland
+ and call XInitThreads() for X11
+
+2016-03-21 15:25:21 +1100 Matthew Waters <matthew@centricular.com>
+
+ * configure.ac:
+ * tests/examples/gl/gtk/Makefile.am:
+ * tests/examples/gl/gtk/gtkvideooverlay/.gitignore:
+ * tests/examples/gl/gtk/gtkvideooverlay/Makefile.am:
+ * tests/examples/gl/gtk/gtkvideooverlay/gtkvideooverlay.vcproj:
+ * tests/examples/gl/gtk/gtkvideooverlay/main.cpp:
+ gl/examples: remove duplicated videooverlay example
+ filtervideooverlay proved the exact same example (only with a extra glfiltercube).
+
+2016-03-21 15:23:41 +1100 Matthew Waters <matthew@centricular.com>
+
+ * tests/examples/gl/gtk/3dvideo/main.cpp:
+ gl/examples/3d: additions for wayland support
+
+2016-03-17 23:51:44 +1100 Matthew Waters <matthew@centricular.com>
+
+ * tests/check/Makefile.am:
+ * tests/check/pipelines/simple-launch-lines.c:
+ gl/tests: add missing test to the build system
+ Also update it for the current api
+
+2016-03-17 23:50:00 +1100 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/effects/gstgleffectssources.c:
+ * ext/gl/gstgldifferencematte.c:
+ * ext/gl/gstgldifferencematte.h:
+ gldifferencematte: port to gl3/gles2
+
+2016-02-26 20:55:47 +1100 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/Makefile.am:
+ * ext/gl/gltestsrc.c:
+ * ext/gl/gstgltestsrc.c:
+ * ext/gl/gstopengl.c:
+ gltestsrc: port to gles2/gl3
+ This makes gltestsrc work everywhere \o/
+ - workaround RPi returning invalid values for positive coords in the
+ checker shader
+ - reduce the number of iterations in the mandelbrot shader for gles2
+ https://bugzilla.gnome.org/show_bug.cgi?id=751540
+
+2016-02-26 16:57:47 +1100 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gltestsrc.c:
+ gltestsrc: port smpte pattern to shaders
+ Loosely based on patch by
+ Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk>
+ https://bugzilla.gnome.org/show_bug.cgi?id=751540
+
+2016-02-26 12:02:15 +1100 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gltestsrc.c:
+ gltestsrc: implement the circular method
+ https://bugzilla.gnome.org/show_bug.cgi?id=759801
+
+2016-02-25 21:18:31 +1100 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gltestsrc.c:
+ * ext/gl/gltestsrc.h:
+ * ext/gl/gstgltestsrc.c:
+ * ext/gl/gstgltestsrc.h:
+ gltestsrc: add a generic src framework
+ Any unsupported pattern (circular) results in an error
+
+2016-02-29 20:15:24 +1100 Matthew Waters <matthew@centricular.com>
+
+ * ext/gl/gstglstereosplit.c:
+ * ext/gl/gstglstereosplit.h:
+ glsterosplit: remove internal glupload/glcolorconvert
+ They are provided separately as elements and no other element contains the
+ internal references to glupload/glcolorconvert.
+
+2016-03-31 19:43:04 +1100 Matthew Waters <matthew@centricular.com>
+
+ * configure.ac:
+ * gst-libs/gst/gl/glprototypes/gstgl_gles2compat.h:
+ * gst-libs/gst/gl/gstglapi.h:
+ * gst-libs/gst/gl/gstglcontext.c:
+ gl: add support for building against GLES3 headers
+ with a fallback to GLES2 headers if available.
+
+2016-03-31 19:38:12 +1100 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglmemory.c:
+ glmemory: add checking the read implementation format/type on gles2 platforms
+ By default, reading GL_RED or GL_RG us unsupported by glReadPixels unless
+ exposed through GL_COLOR_READ_IMPLEMENTATION_FORMAT/TYPE. This allows
+ downloading multiple-planar video frames where possible.
+
+2016-03-31 19:35:09 +1100 Matthew Waters <matthew@centricular.com>
+
+ * gst-libs/gst/gl/gstglbasememory.c:
+ glbasememory: rollback map state when subclass map fails
+ Otherwise our state doesn't reflect reality.
+
2016-03-31 19:31:00 +1100 Matthew Waters <matthew@centricular.com>
* gst-libs/gst/gl/gstglmemorypbo.c:
@@ -1094,11 +7258,15 @@
Also only unset the NEED_DOWNLOAD flag in download_transfer() if the read actually
succeeds.
-2016-03-31 19:35:09 +1100 Matthew Waters <matthew@centricular.com>
+2016-03-31 19:25:32 +1100 Matthew Waters <matthew@centricular.com>
- * gst-libs/gst/gl/gstglbasememory.c:
- glbasememory: rollback map state when subclass map fails
- Otherwise our state doesn't reflect reality.
+ * gst-libs/gst/gl/glprototypes/shaders.h:
+ * gst-libs/gst/gl/gstglshader.c:
+ * gst-libs/gst/gl/gstglshader.h:
+ glshader: add glBindFragDataLocation
+ There are some cases where it's needed for binding in/out variables in shaders.
+ e.g. glsl 150 (gl 3.2) doesn't support the 'layout (location = ?)' specifiers in
+ the shader source so we have to bind them ourselves.
2016-03-31 12:20:30 +0300 Sebastian Dröge <sebastian@centricular.com>
@@ -1117,6 +7285,105 @@
across header versions (and ultimately nvidia driver releases).
https://bugzilla.gnome.org/show_bug.cgi?id=763324
+2016-03-30 22:34:59 +0100 Vanessa Chipirras Navalon <vanechipi@qtec.com>
+
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-bad-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-bad-plugins-sections.txt:
+ * docs/plugins/gst-plugins-bad-plugins.args:
+ * docs/plugins/inspect/plugin-opencv.xml:
+ * ext/opencv/Makefile.am:
+ * ext/opencv/gstopencv.cpp:
+ * ext/opencv/gstpyramidsegment.cpp:
+ * ext/opencv/gstpyramidsegment.h:
+ opencv: pyramidsegment: delete element
+ cvPyrSegmentation() has been deprecated in OpenCV 3.0, and there isn't any
+ function to replace it. Deleting this element so we can support OpenCV 3.1
+ without build issues.
+ https://bugzilla.gnome.org/show_bug.cgi?id=760473
+
+2016-01-26 16:52:37 +0100 Vanessa Chipirras Navalon <vanechipi@qtec.com>
+
+ * ext/opencv/gstcvsmooth.cpp:
+ opencv: gstcvsmooth: Ported to OpenCV version 3.1
+ cvarrToMat() is added because it is compatible with all versions of Opencv
+ and the use the class constructor Mat is eliminated because is deprecated
+ in 3.X versions. This keeps compatibility with 2.4.
+ https://bugzilla.gnome.org/show_bug.cgi?id=760473
+
+2016-01-27 10:05:13 +0100 Vanessa Chipirras Navalon <vanechipi@qtec.com>
+
+ * ext/opencv/gstgrabcut.cpp:
+ opencv: grabcut: Ported to OpenCV version 3.1
+ cvarrToMat() is added because it is compatible with all versions of Opencv
+ and using the class Mat constructor is eliminated, because is deprecated
+ in 3.X versions. The use the using namespace cv because is called some
+ functions many times. This keeps compatibility with 2.4.
+ https://bugzilla.gnome.org/show_bug.cgi?id=760473
+
+2016-01-27 15:37:39 +0100 Vanessa Chipirras Navalon <vanechipi@qtec.com>
+
+ * ext/opencv/gstfaceblur.cpp:
+ opencv: faceblur: Ported to OpenCV version 3.1
+ cvarrToMat() is added because it is compatible with all versions of Opencv
+ and the use of the class constructor Mat is eliminated because is deprecated
+ in 3.X versions. Included 'using namespace std' because it is needed for the
+ Vector class in 3.X versions. This keeps compatibility with 2.4.
+ https://bugzilla.gnome.org/show_bug.cgi?id=760473
+
+2016-01-27 15:51:37 +0100 Vanessa Chipirras Navalon <vanechipi@qtec.com>
+
+ * ext/opencv/gsthanddetect.cpp:
+ opencv: handdetect: Ported to OpenCV version 3.1
+ cvarrToMat() is added because it is compatible with all versions of Opencv
+ and the use of the class constructor Mat is eliminated because is deprecated
+ in 3.X versions. Included 'using namespace std' because it is needed for the
+ vector class in 3.X versions. This keeps compatibility with 2.4.
+ https://bugzilla.gnome.org/show_bug.cgi?id=760473
+
+2016-01-27 16:51:13 +0100 Vanessa Chipirras Navalon <vanechipi@qtec.com>
+
+ * ext/opencv/gstretinex.cpp:
+ opencv: retinex: Ported to OpenCV version 3.1
+ cvarrToMat() is added because it is compatible with all versions of Opencv
+ and using the class constructor Mat is eliminated because is deprecated
+ in 3.X versions. This keeps compatibility with 2.4.
+ https://bugzilla.gnome.org/show_bug.cgi?id=760473
+
+2016-01-28 16:19:46 +0100 Vanessa Chipirras Navalon <vanechipi@qtec.com>
+
+ * ext/opencv/gstdisparity.cpp:
+ * ext/opencv/gstdisparity.h:
+ opencv: disparity: Ported to OpenCV version 3.1
+ 'METHOD_VAR', 'METHOD_GC' is removed because there aren't equivalent functions
+ in new OpenCV versions. 'img_right_as_cvMat_rgb', 'img_left_as_cvMat_rgb' and
+ 'depth_map_as_cvMat2' variables is removed because these aren't used.
+ cvarrToMat() is added because it is compatible with all versions of Opencv
+ and using the class Mat constructor is eliminated, because is deprecated
+ in 3.X versions. The use 'using namespace cv' because is called some
+ functions many times. This keeps compatibility with 2.4.
+ https://bugzilla.gnome.org/show_bug.cgi?id=760473
+
+2016-02-01 13:58:49 +0100 Vanessa Chipirras Navalon <vanechipi@qtec.com>
+
+ * ext/opencv/gstskindetect.cpp:
+ opencv: skindetect: Ported to OpenCV version 3.1
+ cvCVPixToPlane() has been deprecated in OpenCV 3.0, and there is
+ function to replace it cvSplit(). The include compat.hpp is deleted because
+ in 3.X versions doen't exist and it isn't necessary for 2.4.X versions
+ in this element. This keeps compatibility with 2.4.
+ https://bugzilla.gnome.org/show_bug.cgi?id=760473
+
+2016-01-28 17:40:51 +0100 Vanessa Chipirras Navalon <vanechipi@qtec.com>
+
+ * configure.ac:
+ * ext/opencv/gstopencvutils.cpp:
+ opencv: Ported to OpenCV version 3.1 OpenCV
+ configure.ac was changed to work with new versions of OpenCV 3.X.
+ A new include is added gstopencvutils.cpp because it contains
+ the previous. This keeps compatibility with 2.4.
+ https://bugzilla.gnome.org/show_bug.cgi?id=760473
+
2016-03-30 10:34:07 +0300 Sebastian Dröge <sebastian@centricular.com>
* sys/androidmedia/gstahcsrc.c:
@@ -1127,6 +7394,70 @@
GStreamer API doesn't provide direct ways for doing so.
https://bugzilla.gnome.org/show_bug.cgi?id=764339
+2016-03-07 14:57:35 +0100 Edward Hervey <edward@centricular.com>
+
+ * ext/teletextdec/gstteletextdec.c:
+ teletexdec: Simplify negotiation code
+ No need to use a while() loop if we're going only going to use
+ the first structure of the caps ...
+ CID #1341748
+
+2016-03-28 13:52:07 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * tests/check/libs/aggregator.c:
+ aggregator: Fix leak in unit test
+ GST_PAD_PROBE_HANDLED means that we should've unreffed the probe data,
+ it was handled by us in one way or another.
+
+2016-03-28 08:46:10 +0530 Nirbheek Chauhan <nirbheek@centricular.com>
+
+ * .gitignore:
+ .gitignore: Ignore some more test temporary files
+
+2016-03-28 08:45:45 +0530 Nirbheek Chauhan <nirbheek@centricular.com>
+
+ * tests/check/elements/compositor.c:
+ tests/compositor: Add test for aggregator pad numbering
+ Tests that the behaviour in 7a5cb5a473 is being conformed to.
+
+2016-03-27 19:06:50 +0530 Nirbheek Chauhan <nirbheek@centricular.com>
+
+ * gst-libs/gst/base/gstaggregator.c:
+ aggregator: Fix strcmp test for sink template
+
+2016-03-27 18:41:30 +0530 Nirbheek Chauhan <nirbheek@centricular.com>
+
+ * gst-libs/gst/base/gstaggregator.c:
+ aggregator: Don't try to be too smart while allocating pad names
+ Previously, while allocating the pad number for a new pad, aggregator was
+ maintaining an interesting relationship between the pad count and the pad
+ number.
+ If you requested a sink pad called "sink_6", padcount (which is badly named and
+ actually means number-of-pads-minus-one) would be set to 6. Which means that if
+ you then requested a sink pad called "sink_0", it would be assigned the name
+ "sink_6" again, which fails the non-uniqueness test inside gstelement.c.
+ This can be fixed by instead setting padcount to be 7 in that case, but this
+ breaks manual management of pad names by the application since it then becomes
+ impossible to request a pad called "sink_2". Instead, we fix this by always
+ directly using the requested name as the sink pad name. Uniqueness of the pad
+ name is tested separately inside gstreamer core. If no name is requested, we use
+ the next available pad number.
+ Note that this is important since the sinkpad numbering in aggregator is not
+ meaningless. Videoaggregator uses it to decide the Z-order of video frames.
+
+2016-02-23 15:11:36 +0100 Thibault Saunier <tsaunier@gnome.org>
+
+ * configure.ac:
+ * ext/lv2/Makefile.am:
+ * ext/lv2/gstlv2.c:
+ * ext/lv2/gstlv2.h:
+ * ext/lv2/gstlv2filter.c:
+ lv2: Port filters to GStreamer 1.0 and use lilv instead of slv2
+ Properly separate files as we will not have only one single base class
+ for all elements as we used to with 0.10, but the same way it is done
+ with ladspa, we subclass GstAudioFilter, GstBaseSource etc...
+ https://bugzilla.gnome.org/show_bug.cgi?id=678207
+
2016-03-27 14:29:58 +0530 Nirbheek Chauhan <nirbheek@centricular.com>
* ext/gtk/gstgtkglsink.c:
@@ -1136,6 +7467,13 @@
Set a default category for gtkgstbasewidget lest the logging go to the 'default'
category where it can't be found easily
+2016-03-27 03:11:45 +0200 Yann Jouanin <yjo@witbe.net>
+
+ * ext/rtmp/gstrtmpsrc.c:
+ * ext/rtmp/gstrtmpsrc.h:
+ rtmpsrc plugin : add timeout option
+ https://bugzilla.gnome.org/show_bug.cgi?id=764251
+
2016-03-18 13:35:37 +0200 Sebastian Dröge <sebastian@centricular.com>
* gst/mxf/mxfmux.c:
@@ -1145,17 +7483,42 @@
their state so that they can be used again when starting the muxer again.
https://bugzilla.gnome.org/show_bug.cgi?id=763862
-2016-03-03 11:31:01 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+2016-03-05 09:47:27 +0200 Sebastian Dröge <sebastian@centricular.com>
- * gst/mpegtsdemux/mpegtspacketizer.c:
- mpegtspacketizer: simplify variable reset
- Just set it directly to 0, instead of checking and reseting
+ * docs/libs/gst-plugins-bad-libs-sections.txt:
+ * 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.c:
+ * win32/common/libgstplayer.def:
+ player: Add is_live flag to the GstPlayerMediaInfo
+ https://bugzilla.gnome.org/show_bug.cgi?id=763126
-2016-03-04 20:05:38 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+2016-02-29 11:39:54 +0200 Sebastian Dröge <sebastian@centricular.com>
- * sys/dvb/dvbbasebin.c:
- dvbbasebin: plug some leaks
- Plug various leaks in dvbbasebin.
+ * gst/sdp/Makefile.am:
+ * gst/sdp/gstsdpelem.c:
+ * gst/sdp/gstsdpsrc.c:
+ * gst/sdp/gstsdpsrc.h:
+ sdp: Add new sdpsrc element
+ This can read from an SDP file or get the SDP data via property. Works
+ around the problem that sdpdemux inside decodebin fails because the
+ GST_STATE_CHANGE_NO_PREROLL is not observed by the pipeline.
+ See https://bugzilla.gnome.org/show_bug.cgi?id=702495
+ https://bugzilla.gnome.org/show_bug.cgi?id=762860
+
+2016-03-25 17:49:14 +1100 Matthew Waters <matthew@centricular.com>
+
+ * ext/gtk/gtkgstglwidget.c:
+ gtk/gl: don't assert when gdk doesn't provide a GL context
+ Allows the application to check whether gtkglsink is supported by setting
+ the element to READY.
+ https://bugzilla.gnome.org/show_bug.cgi?id=764148
+
+2016-03-07 19:41:19 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * gst/mpegtsdemux/mpegtsbase.c:
+ mpegtsbase: plug EIT string leak
2016-03-07 19:06:19 -0300 Thiago Santos <thiagoss@osg.samsung.com>
@@ -1164,10 +7527,39 @@
Remember to unref the GPtrArray of the PAT table after
use
-2016-03-07 19:41:19 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+2016-03-04 20:05:38 -0300 Thiago Santos <thiagoss@osg.samsung.com>
- * gst/mpegtsdemux/mpegtsbase.c:
- mpegtsbase: plug EIT string leak
+ * sys/dvb/dvbbasebin.c:
+ dvbbasebin: plug some leaks
+ Plug various leaks in dvbbasebin.
+
+2016-03-03 11:31:01 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * gst/mpegtsdemux/mpegtspacketizer.c:
+ mpegtspacketizer: simplify variable reset
+ Just set it directly to 0, instead of checking and reseting
+
+2016-03-01 18:21:12 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: print time in same format
+ Makes it easier to compare
+
+2016-03-15 16:22:59 -0700 Martin Kelly <martin@surround.io>
+
+ * sys/androidmedia/gst-android-hardware-camera.c:
+ * sys/androidmedia/gstahcsrc.c:
+ ahc: use g_slice_new instead of g_slice_new0
+ In many cases, we use g_slice_new0 and then immediately overwrite the
+ allocated memory. This is inefficient. Since we're going to immediately
+ overwrite it, we might as well use plain g_slice_new.
+ https://bugzilla.gnome.org/show_bug.cgi?id=763998
+
+2016-03-10 08:50:28 +0900 Vineeth TM <vineeth.tm@samsung.com>
+
+ * sys/d3dvideosink/d3dvideosink.c:
+ d3dvideosink: post message to application for unhandled keyboard/mouse events
+ https://bugzilla.gnome.org/show_bug.cgi?id=763403
2016-03-10 08:49:01 +0900 Vineeth TM <vineeth.tm@samsung.com>
@@ -1181,11 +7573,348 @@
gtkbasesink: post message to application for unhandled keyboard/mouse events
https://bugzilla.gnome.org/show_bug.cgi?id=763403
-2016-03-10 08:50:28 +0900 Vineeth TM <vineeth.tm@samsung.com>
+2016-03-03 20:10:16 +0900 Justin Kim <justin.kim@collabora.com>
+ * sys/androidmedia/gstahcsrc.c:
+ * sys/androidmedia/gstahcsrc.h:
+ ahcsrc: remove probe_properties
+ It's a residue of 0.10.
+ https://bugzilla.gnome.org/show_bug.cgi?id=763100
+
+2016-03-04 15:50:26 +0900 Vineeth TM <vineeth.tm@samsung.com>
+
+ * ext/apexsink/gstapexsink.c:
+ * ext/assrender/gstassrender.c:
+ * ext/bz2/gstbz2dec.c:
+ * ext/bz2/gstbz2enc.c:
+ * ext/curl/gstcurlbasesink.c:
+ * ext/daala/gstdaaladec.c:
+ * ext/daala/gstdaalaenc.c:
+ * ext/dash/gstdashdemux.c:
+ * ext/directfb/dfbvideosink.c:
+ * ext/dtls/gstdtlsdec.c:
+ * ext/dtls/gstdtlsenc.c:
+ * ext/dtls/gstdtlssrtpdec.c:
+ * ext/dtls/gstdtlssrtpdemux.c:
+ * ext/dtls/gstdtlssrtpenc.c:
+ * ext/dts/gstdtsdec.c:
+ * ext/faac/gstfaac.c:
+ * ext/faad/gstfaad.c:
+ * ext/flite/gstflitetestsrc.c:
+ * ext/fluidsynth/gstfluiddec.c:
+ * ext/gl/caopengllayersink.m:
+ * ext/gl/gstglcolorconvertelement.c:
+ * ext/gl/gstgldownloadelement.c:
+ * ext/gl/gstglfilterbin.c:
+ * ext/gl/gstglimagesink.c:
+ * ext/gl/gstglmixer.c:
+ * ext/gl/gstglmixerbin.c:
+ * ext/gl/gstglsrcbin.c:
+ * ext/gl/gstglstereomix.c:
+ * ext/gl/gstglstereosplit.c:
+ * ext/gl/gstgltestsrc.c:
+ * ext/gl/gstgluploadelement.c:
+ * ext/gl/gstglvideoflip.c:
+ * ext/gme/gstgme.c:
+ * ext/gsm/gstgsmdec.c:
+ * ext/gsm/gstgsmenc.c:
+ * ext/gtk/gstgtkglsink.c:
+ * ext/gtk/gstgtksink.c:
+ * ext/hls/gsthlsdemux.c:
+ * ext/hls/gsthlssink.c:
+ * ext/kate/gstkatedec.c:
+ * ext/kate/gstkateenc.c:
+ * ext/kate/gstkateparse.c:
+ * ext/kate/gstkatetiger.c:
+ * ext/libde265/libde265-dec.c:
+ * ext/libmms/gstmms.c:
+ * ext/libvisual/visual-gl.c:
+ * ext/mimic/gstmimdec.c:
+ * ext/mimic/gstmimenc.c:
+ * ext/modplug/gstmodplug.cc:
+ * ext/mpeg2enc/gstmpeg2enc.cc:
+ * ext/mplex/gstmplex.cc:
+ * ext/musepack/gstmusepackdec.c:
+ * ext/nas/nassink.c:
+ * ext/neon/gstneonhttpsrc.c:
+ * ext/openal/gstopenalsink.c:
+ * ext/openal/gstopenalsrc.c:
+ * ext/opencv/gstcvequalizehist.cpp:
+ * ext/opencv/gstcvlaplace.cpp:
+ * ext/opencv/gstcvsobel.cpp:
+ * ext/opencv/gstdisparity.cpp:
+ * ext/opencv/gstedgedetect.cpp:
+ * ext/opencv/gstfaceblur.cpp:
+ * ext/opencv/gstfacedetect.cpp:
+ * ext/opencv/gstgrabcut.cpp:
+ * ext/opencv/gsthanddetect.cpp:
+ * ext/opencv/gstmotioncells.cpp:
+ * ext/opencv/gstpyramidsegment.cpp:
+ * ext/opencv/gstretinex.cpp:
+ * ext/opencv/gstsegmentation.cpp:
+ * ext/opencv/gstskindetect.cpp:
+ * ext/opencv/gsttemplatematch.cpp:
+ * ext/opencv/gsttextoverlay.cpp:
+ * ext/openexr/gstopenexrdec.cpp:
+ * ext/openh264/gstopenh264dec.cpp:
+ * ext/openh264/gstopenh264enc.cpp:
+ * ext/openjpeg/gstopenjpegdec.c:
+ * ext/openjpeg/gstopenjpegenc.c:
+ * ext/openni2/gstopenni2src.cpp:
+ * ext/opus/gstopusparse.c:
+ * ext/qt/gstqtsink.cc:
+ * ext/resindvd/resindvdbin.c:
+ * ext/resindvd/resindvdsrc.c:
+ * ext/resindvd/rsndec.c:
+ * ext/resindvd/rsninputselector.c:
+ * ext/resindvd/rsnparsetter.c:
+ * ext/rsvg/gstrsvgdec.c:
+ * ext/rsvg/gstrsvgoverlay.c:
+ * ext/rtmp/gstrtmpsink.c:
+ * ext/rtmp/gstrtmpsrc.c:
+ * ext/sbc/gstsbcdec.c:
+ * ext/sbc/gstsbcenc.c:
+ * ext/schroedinger/gstschrodec.c:
+ * ext/schroedinger/gstschroenc.c:
+ * ext/sdl/sdlaudiosink.c:
+ * ext/smoothstreaming/gstmssdemux.c:
+ * ext/sndfile/gstsfdec.c:
+ * ext/sndfile/gstsfsink.c:
+ * ext/sndfile/gstsfsrc.c:
+ * ext/sndio/sndiosink.c:
+ * ext/sndio/sndiosrc.c:
+ * ext/soundtouch/gstpitch.cc:
+ * ext/spandsp/gstdtmfdetect.c:
+ * ext/spandsp/gstspanplc.c:
+ * ext/spandsp/gsttonegeneratesrc.c:
+ * ext/spc/gstspc.c:
+ * ext/srtp/gstsrtpdec.c:
+ * ext/srtp/gstsrtpenc.c:
+ * ext/teletextdec/gstteletextdec.c:
+ * ext/timidity/gsttimidity.c:
+ * ext/timidity/gstwildmidi.c:
+ * ext/voaacenc/gstvoaacenc.c:
+ * ext/voamrwbenc/gstvoamrwbenc.c:
+ * ext/vulkan/vksink.c:
+ * ext/wayland/gstwaylandsink.c:
+ * ext/webp/gstwebpdec.c:
+ * ext/webp/gstwebpenc.c:
+ * ext/x265/gstx265enc.c:
+ * ext/xvid/gstxviddec.c:
+ * ext/xvid/gstxvidenc.c:
+ * ext/zbar/gstzbar.c:
+ * gst-libs/gst/gl/gstglfilter.c:
+ * gst-libs/gst/insertbin/gstinsertbin.c:
+ * gst/adpcmdec/adpcmdec.c:
+ * gst/adpcmenc/adpcmenc.c:
+ * gst/aiff/aiffmux.c:
+ * gst/aiff/aiffparse.c:
+ * gst/asfmux/gstasfmux.c:
+ * gst/asfmux/gstasfparse.c:
+ * gst/asfmux/gstrtpasfpay.c:
+ * gst/audiobuffer/gstaudioringbuffer.c:
+ * gst/audiofxbad/gstaudiochannelmix.c:
+ * gst/audiomixer/gstaudiointerleave.c:
+ * gst/audiomixer/gstaudiomixer.c:
+ * gst/audiovisualizers/gstspacescope.c:
+ * gst/audiovisualizers/gstspectrascope.c:
+ * gst/audiovisualizers/gstsynaescope.c:
+ * gst/audiovisualizers/gstwavescope.c:
+ * gst/autoconvert/gstautoconvert.c:
+ * gst/autoconvert/gstautovideoconvert.c:
+ * gst/bayer/gstrgb2bayer.c:
+ * gst/camerabin2/gstdigitalzoom.c:
+ * gst/camerabin2/gstviewfinderbin.c:
+ * gst/camerabin2/gstwrappercamerabinsrc.c:
+ * gst/cdxaparse/gstcdxaparse.c:
+ * gst/cdxaparse/gstvcdparse.c:
+ * gst/coloreffects/gstchromahold.c:
+ * gst/coloreffects/gstcoloreffects.c:
+ * gst/compositor/compositor.c:
+ * gst/dataurisrc/gstdataurisrc.c:
+ * gst/dccp/gstdccpclientsink.c:
+ * gst/dccp/gstdccpclientsrc.c:
+ * gst/dccp/gstdccpserversink.c:
+ * gst/dccp/gstdccpserversrc.c:
+ * gst/debugutils/fpsdisplaysink.c:
+ * gst/debugutils/gstchecksumsink.c:
+ * gst/debugutils/gstchopmydata.c:
+ * gst/debugutils/gstcompare.c:
+ * gst/debugutils/gstdebugspy.c:
+ * gst/debugutils/gsterrorignore.c:
+ * gst/dvbsuboverlay/gstdvbsuboverlay.c:
+ * gst/dvdspu/gstdvdspu.c:
+ * gst/faceoverlay/gstfaceoverlay.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/gstgdpdepay.c:
+ * gst/gdp/gstgdppay.c:
+ * gst/geometrictransform/gstgeometrictransform.c:
+ * gst/hdvparse/gsthdvparse.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/ivfparse/gstivfparse.c:
+ * gst/ivtc/gstcombdetect.c:
+ * gst/ivtc/gstivtc.c:
+ * gst/jp2kdecimator/gstjp2kdecimator.c:
+ * gst/jpegformat/gstjifmux.c:
+ * gst/jpegformat/gstjpegparse.c:
+ * gst/librfb/gstrfbsrc.c:
+ * gst/midi/midiparse.c:
+ * gst/mixmatrix/mixmatrix.c:
+ * gst/mpegpsmux/mpegpsmux.c:
+ * gst/mpegtsdemux/mpegtsbase.c:
+ * gst/mpegtsdemux/mpegtsparse.c:
+ * gst/mpegtsmux/mpegtsmux.c:
+ * gst/mve/gstmvemux.c:
+ * gst/mxf/mxfdemux.c:
+ * gst/mxf/mxfmux.c:
+ * gst/netsim/gstnetsim.c:
+ * gst/nuvdemux/gstnuvdemux.c:
+ * gst/onvif/gstrtponvifparse.c:
+ * gst/onvif/gstrtponviftimestamp.c:
+ * gst/overlay/gstoverlay.c:
+ * gst/patchdetect/gstpatchdetect.c:
+ * gst/pcapparse/gstirtspparse.c:
+ * gst/pcapparse/gstpcapparse.c:
+ * gst/pnm/gstpnmdec.c:
+ * gst/pnm/gstpnmenc.c:
+ * gst/rawparse/gstrawparse.c:
+ * gst/removesilence/gstremovesilence.c:
+ * gst/sdi/gstsdidemux.c:
+ * gst/sdi/gstsdimux.c:
+ * gst/sdp/gstsdpdemux.c:
+ * gst/segmentclip/gstaudiosegmentclip.c:
+ * gst/segmentclip/gstvideosegmentclip.c:
+ * gst/siren/gstsirendec.c:
+ * gst/siren/gstsirenenc.c:
+ * gst/smooth/gstsmooth.c:
+ * gst/speed/gstspeed.c:
+ * gst/subenc/gstsrtenc.c:
+ * gst/subenc/gstwebvttenc.c:
+ * gst/tta/gstttadec.c:
+ * gst/tta/gstttaparse.c:
+ * gst/vbidec/gstvbidec.c:
+ * gst/videoframe_audiolevel/gstvideoframe-audiolevel.c:
+ * gst/videomeasure/gstvideomeasure_collector.c:
+ * gst/videomeasure/gstvideomeasure_ssim.c:
+ * 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:
+ * gst/vmnc/vmncdec.c:
+ * gst/y4m/gsty4mdec.c:
+ * gst/yadif/gstyadif.c:
+ * sys/acmenc/acmenc.c:
+ * sys/acmmp3dec/acmmp3dec.c:
+ * sys/androidmedia/gstahcsrc.c:
+ * sys/applemedia-nonpublic/celvideosrc.c:
+ * sys/applemedia-nonpublic/miovideosrc.c:
+ * sys/applemedia/atdec.c:
+ * sys/applemedia/avfassetsrc.m:
+ * sys/applemedia/avfvideosrc.m:
+ * sys/applemedia/avsamplevideosink.m:
+ * sys/applemedia/iosassetsrc.m:
+ * sys/applemedia/qtkitvideosrc.m:
+ * sys/applemedia/vtdec.c:
+ * sys/avc/gstavcsrc.cpp:
+ * sys/bluez/gsta2dpsink.c:
+ * sys/bluez/gstavdtpsink.c:
+ * sys/bluez/gstavdtpsrc.c:
* sys/d3dvideosink/d3dvideosink.c:
- d3dvideosink: post message to application for unhandled keyboard/mouse events
- https://bugzilla.gnome.org/show_bug.cgi?id=763403
+ * sys/decklink/gstdecklinkaudiosink.cpp:
+ * sys/decklink/gstdecklinkaudiosrc.cpp:
+ * sys/directsound/gstdirectsoundsrc.c:
+ * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp:
+ * sys/dshowsrcwrapper/gstdshowvideosrc.cpp:
+ * sys/dshowvideosink/dshowvideosink.cpp:
+ * sys/dvb/dvbbasebin.c:
+ * sys/dvb/gstdvbsrc.c:
+ * sys/dxr3/dxr3audiosink.c:
+ * sys/dxr3/dxr3spusink.c:
+ * sys/dxr3/dxr3videosink.c:
+ * sys/fbdev/gstfbdevsink.c:
+ * sys/linsys/gstlinsyssdisink.c:
+ * sys/linsys/gstlinsyssdisrc.c:
+ * sys/nvenc/gstnvbaseenc.c:
+ * sys/nvenc/gstnvh264enc.c:
+ * sys/opensles/openslessink.c:
+ * sys/opensles/openslessrc.c:
+ * sys/pvr2d/gstpvrvideosink.c:
+ * sys/qcam/gstqcamsrc.c:
+ * sys/shm/gstshmsink.c:
+ * sys/shm/gstshmsrc.c:
+ * sys/tinyalsa/tinyalsasink.c:
+ * sys/uvch264/gstuvch264_mjpgdemux.c:
+ * sys/uvch264/gstuvch264_src.c:
+ * sys/vcd/vcdsrc.c:
+ * sys/vdpau/gstvdpsink.c:
+ * sys/vdpau/h264/gstvdph264dec.c:
+ * sys/vdpau/mpeg/gstvdpmpegdec.c:
+ * sys/vdpau/mpeg4/gstvdpmpeg4dec.c:
+ * sys/wasapi/gstwasapisink.c:
+ * sys/wasapi/gstwasapisrc.c:
+ * sys/wininet/gstwininetsrc.c:
+ * sys/winscreencap/gstdx9screencapsrc.c:
+ * sys/winscreencap/gstgdiscreencapsrc.c:
+ * tests/check/elements/autoconvert.c:
+ * tests/check/elements/camerabin.c:
+ * tests/check/elements/test_http_src.c:
+ * tests/check/libs/aggregator.c:
+ * tools/element-templates/sinkpad:
+ * tools/element-templates/sinkpad-audio:
+ * tools/element-templates/sinkpad-simple:
+ * tools/element-templates/sinkpad-template:
+ * tools/element-templates/srcpad:
+ * tools/element-templates/srcpad-audio:
+ * tools/element-templates/srcpad-simple:
+ * tools/element-templates/srcpad-template:
+ bad: use new gst_element_class_add_static_pad_template()
+ https://bugzilla.gnome.org/show_bug.cgi?id=763081
+
+2016-03-07 17:23:23 -0800 Martin Kelly <martin@surround.io>
+
+ * sys/androidmedia/gst-android-hardware-camera.c:
+ ahc: eliminate AHC*_CALL macros
+ Currently, we use AHC*_CALL macros to call many of the Camera functions.
+ However, we already have helper classes to call the Camera functions, so
+ eliminate the macros.
+ As a nice side-benefit, we also get improved error handling and
+ reporting when something goes wrong calling these functions, because a
+ GError gets populated, and we log a GST_ERROR when something fails. This
+ was harder to do using macros, as all error handling was hidden from the
+ caller.
+ https://bugzilla.gnome.org/show_bug.cgi?id=763065
+
+2016-02-18 11:29:06 -0800 Martin Kelly <martin@surround.io>
+
+ * sys/androidmedia/gst-android-hardware-camera.c:
+ ahc: use gst unref functions
+ https://bugzilla.gnome.org/show_bug.cgi?id=763065
+
+2016-02-18 14:08:13 -0800 Martin Kelly <martin@surround.io>
+
+ * sys/androidmedia/gst-android-hardware-camera.c:
+ ahc: use gst new object functions
+ https://bugzilla.gnome.org/show_bug.cgi?id=763065
2016-03-17 13:44:13 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
@@ -1202,13 +7931,10 @@
GtkWidget *window;
^~~~~~~~~
-2016-03-25 17:49:14 +1100 Matthew Waters <matthew@centricular.com>
+2016-03-24 13:33:12 +0200 Sebastian Dröge <sebastian@centricular.com>
- * ext/gtk/gtkgstglwidget.c:
- gtk/gl: don't assert when gdk doesn't provide a GL context
- Allows the application to check whether gtkglsink is supported by setting
- the element to READY.
- https://bugzilla.gnome.org/show_bug.cgi?id=764148
+ * configure.ac:
+ Back to development
=== release 1.8.0 ===
diff --git a/Makefile.am b/Makefile.am
index 6fa225a..b29d7fc 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -113,6 +113,7 @@
$(top_srcdir)/gst-libs/gst/baseparse \
$(top_srcdir)/gst-libs/gst/egl \
$(top_srcdir)/gst-libs/gst/signalprocessor \
+ $(top_srcdir)/tests/examples/gl/gtk/gtkvideooverlay \
$(top_srcdir)/tests/examples/scaletempo \
$(top_srcdir)/tests/examples/shapewipe \
$(top_srcdir)/tests/examples/switch \
diff --git a/Makefile.in b/Makefile.in
index fa276e9..d5f9bb8 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -314,6 +314,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -335,6 +337,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -384,6 +388,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -529,6 +535,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -655,8 +663,6 @@
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@
@@ -699,8 +705,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -884,6 +895,7 @@
$(top_srcdir)/gst-libs/gst/baseparse \
$(top_srcdir)/gst-libs/gst/egl \
$(top_srcdir)/gst-libs/gst/signalprocessor \
+ $(top_srcdir)/tests/examples/gl/gtk/gtkvideooverlay \
$(top_srcdir)/tests/examples/scaletempo \
$(top_srcdir)/tests/examples/shapewipe \
$(top_srcdir)/tests/examples/switch \
@@ -1442,8 +1454,11 @@
update-exports:
make check-exports 2>&1 | patch -p1
- git add win32/common/libgst*.def
- git diff --cached -- win32/common/
+ if test -f "$(top_srcdir)/win32/common/libgstgl.def"; then \
+ git checkout "$(top_srcdir)/win32/common/libgstgl.def"; \
+ fi
+ git add $(top_srcdir)/win32/common/libgst*.def
+ git diff --cached -- $(top_srcdir)/win32/common/
echo '^^^--- updated and staged changes above'
# complain about nonportable printf format strings (%lld, %llu, %zu etc.)
diff --git a/NEWS b/NEWS
index 9b1f149..072b2df 100644
--- a/NEWS
+++ b/NEWS
@@ -1,28 +1 @@
-### 1.8.3
-
-The third 1.8 bug-fix release (1.8.3) was released on 19 August 2016.
-This release only contains bugfixes and it should be safe to update from 1.8.3.
-
-#### Major bugfixes in 1.8.3
-
- - Fix Android build scripts on OS X and Windows
- - Fix stepping in PAUSED state in certain circumstances
- - Fix jackaudiosink hang when exiting
- - Fix udpsrc receiving multicast packets not only from the selected
- multicast group
- - Fix unnecessary decoding of unselected streams in GES
- - Fix (multi)udpsink randomly not sending to clients
- - Fix ALL\_BOTH probes not considering EVENT\_FLUSH
- - Fix average input rate calculations in queue2
- - Fix various locking issues causing deadlock in adaptivedemux
- - Fix gst-libav encoders to correctly produce codec\_data in caps
- - Add Wayland, Windows and Rasberry Pi support to the QML GL video sink
- - Add support for building with OpenH264 1.6
- - Add support for controlling deinterlacing in GES video sources
- - ... and many, many more!
-
-For a full list of bugfixes see [Bugzilla][buglist-1.8.3]. Note that this is
-not the full list of changes. For the full list of changes please refer to the
-GIT logs or ChangeLogs of the particular modules.
-
-[buglist-1.8.3]: https://bugzilla.gnome.org/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&classification=Platform&limit=0&list_id=145400&order=bug_id&product=GStreamer&query_format=advanced&resolution=FIXED&target_milestone=1.8.3
+This is GStreamer 1.9.90
diff --git a/README b/README
index fa53f95..48e2c9f 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-GStreamer 1.7.x development series
+GStreamer 1.9.x development series
WHAT IT IS
----------
diff --git a/RELEASE b/RELEASE
index d8caf0b..e70dea5 100644
--- a/RELEASE
+++ b/RELEASE
@@ -1,15 +1,13 @@
-Release notes for GStreamer Bad Plugins 1.8.3
+Release notes for GStreamer Bad Plugins 1.9.90
-The GStreamer team is proud to announce the third bugfix release in the stable
-1.8 release series of your favourite cross-platform multimedia framework!
+The GStreamer team is pleased to announce the first release candidate of the
+stable 1.10 release series. The 1.10 release series is adding new features on
+top of the 1.0, 1.2, 1.4, 1.6 and 1.8 series and is part of the API and
+ABI-stable 1.x release series of the GStreamer multimedia framework.
-This release only contains bugfixes and it is safe to update from 1.8.x. For a
-full list of bugfixes see Bugzilla.
-
-
-See /releases/1.8/ for the full release notes.
+Binaries for Android, iOS, Mac OS X and Windows will be provided in the next days.
"That an accusation?"
@@ -60,16 +58,29 @@
Bugs fixed in this release
- * 769210 : GLMemory created by avfvideosrc and vtdec on iOS (EAGL/gles3) can't be mapped
- * 761260 : qml: add Windows support
- * 763044 : Enable qmlglsink on Rasperry PI
- * 766163 : Some header files missing in sys/applemedia/ in gst-plugins-bad-1.8.1.tar.xz
- * 767492 : avfassetsrc: Escapes already escaped URIs wrongly, fails to work because of that
- * 767553 : qmlglsink: Add Wayland support
- * 767635 : gleffects: fix little rectangel appears at the center when use squeeze and tunnel effects
- * 767792 : h264parse: fix default time_offset_length
- * 768146 : d3dvideosink: leak on caps string
- * 769376 : aiffparse: seeking in aiff can create audio artifacts if there's extra data at the end
+ * 738079 : wayland: Destory the scaler interface while finalizing display object
+ * 761987 : waylandsink relies on wl_scaler
+ * 766018 : gl/dispmanx: Implements set_render_rectangle to adjust the position of window
+ * 767422 : kmssink: Uses scaled size to specify input buffer region
+ * 767671 : waylandsink: update from scaler protocol to viewporter protocol
+ * 768158 : waylandsink : memory leak of gst_wayland_sink_get_caps() and scaler of wldisplay
+ * 770146 : kmssink won't compile
+ * 770221 : rtponviftimestamp: Implement property " Immediate "
+ * 770455 : fdkaacdec: asserts on HE-AAC v2 sample
+ * 770925 : qmlglsink: check qt_context_ first in GstQSGTexture::bind()
+ * 770933 : srtpenc: deadlock in create_session
+ * 771021 : Duplicate GL_CFLAGS in gst-libs/gst/gl/Makefile.am
+ * 771023 : tests/examples/gl/clutter/Makefile.am references deprecated variable $(GST_PLUGINS_GL_LIBS)
+ * 771198 : mpegtsdemux: Trying to set NULL string on field 'title' on taglist
+ * 771382 : dvbsuboverlay: map with READWRITE for overlay blend
+ * 771780 : build: add missing $(GST_PLUGINS_BASE_LIBS)
+ * 771794 : wayland/Makefile.am: add missing libs
+ * 771817 : dx9screencapsrc: throw error for invalid screen index
+ * 771871 : lv2 plugin doesn't do processing in case of mono sound
+ * 771970 : h265parse: Fix parsing of multiple NALs in the hvcC box
+ * 772067 : fdkaacenc: fix enc ! dec case
+ * 772108 : fdkaacenc: set framed=true on src caps
+ * 772186 : fdkaac: misc memory related fixes
==== Download ====
@@ -106,18 +117,30 @@
Contributors to this release
- * Bernhard Miller
- * Guillaume Desmottes
+ * Alessandro Decina
+ * Alistair Buxton
+ * Arun Raghavan
+ * Florian Zwoch
+ * Graham Leggett
+ * Gwang Yoon Hwang
* Haihua Hu
+ * Hyunjun Ko
* Jan Schmidt
- * Jonathan Roy
+ * Joakim Johansson
+ * Julien Isorce
+ * Kyungyong Kim
+ * Martin Kelly
* Matthew Waters
- * Michael Olbrich
- * Nirbheek Chauhan
+ * Nicolas Dufresne
+ * Olivier Crête
+ * Philippe Normand
+ * Scott D Phillips
* Sebastian Dröge
- * Sergei Saveliev
- * Sergey Borovkov
+ * Sergey Mamonov
* Thiago Santos
+ * Thibault Saunier
* Tim-Philipp Müller
- * Vineeth TM
+ * Vincent Penquerc'h
+ * Víctor Manuel Jáquez Leal
+ * Wonchul Lee
\ No newline at end of file
diff --git a/common/Makefile.in b/common/Makefile.in
index 10571c4..ac4a598 100644
--- a/common/Makefile.in
+++ b/common/Makefile.in
@@ -276,6 +276,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -297,6 +299,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -346,6 +350,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -491,6 +497,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -617,8 +625,6 @@
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@
@@ -661,8 +667,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/common/gst.supp b/common/gst.supp
index 2740e9a..f85cd69 100644
--- a/common/gst.supp
+++ b/common/gst.supp
@@ -4024,5 +4024,4 @@
fun:malloc
...
fun:g_quark_init
- fun:glib_init_ctor
}
diff --git a/common/gtk-doc-plugins.mak b/common/gtk-doc-plugins.mak
index fe0977c..4b5dd1b 100644
--- a/common/gtk-doc-plugins.mak
+++ b/common/gtk-doc-plugins.mak
@@ -179,9 +179,13 @@
$(top_srcdir)/common/plugins.xsl $$a > xml/`basename $$a`; done
@for f in $(EXAMPLE_CFILES); do \
$(PYTHON) $(top_srcdir)/common/c-to-xml.py $$f > xml/element-`basename $$f .c`.xml; done
- @gtkdoc-mkdb \
+ @_source_dir='' ; \
+ for i in $(DOC_SOURCE_DIR) ; do \
+ _source_dir="$${_source_dir} --source-dir=$$i" ; \
+ done ; \
+ gtkdoc-mkdb \
--module=$(DOC_MODULE) \
- --source-dir=$(DOC_SOURCE_DIR) \
+ $${_source_dir} \
--expand-content-files="$(expand_content_files)" \
--main-sgml-file=$(srcdir)/$(DOC_MAIN_SGML_FILE) \
--output-format=xml \
diff --git a/common/gtk-doc.mak b/common/gtk-doc.mak
index 2aab3a9..3f83491 100644
--- a/common/gtk-doc.mak
+++ b/common/gtk-doc.mak
@@ -121,7 +121,11 @@
sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(expand_content_files)
@echo ' DOC Building XML'
- @gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) --output-format=xml $(MKDB_OPTIONS)
+ @_source_dir='' ; \
+ for i in $(DOC_SOURCE_DIR) ; do \
+ _source_dir="$${_source_dir} --source-dir=$$i" ; \
+ done ; \
+ gtkdoc-mkdb --module=$(DOC_MODULE) $${_source_dir} --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) --output-format=xml $(MKDB_OPTIONS)
@cp ../version.entities xml
@touch sgml-build.stamp
diff --git a/common/m4/Makefile.in b/common/m4/Makefile.in
index 25b8a7a..078b8be 100644
--- a/common/m4/Makefile.in
+++ b/common/m4/Makefile.in
@@ -216,6 +216,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -237,6 +239,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -286,6 +290,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -431,6 +437,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -557,8 +565,6 @@
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@
@@ -601,8 +607,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/common/m4/ax_pthread.m4 b/common/m4/ax_pthread.m4
index d383ad5..4c4051e 100644
--- a/common/m4/ax_pthread.m4
+++ b/common/m4/ax_pthread.m4
@@ -19,10 +19,10 @@
# is necessary on AIX to use the special cc_r compiler alias.)
#
# NOTE: You are assumed to not only compile your program with these flags,
-# but also link it with them as well. e.g. you should link with
+# but also to link with them as well. For example, you might link with
# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
#
-# If you are only building threads programs, you may wish to use these
+# If you are only building threaded programs, you may wish to use these
# variables in your default LIBS, CFLAGS, and CC:
#
# LIBS="$PTHREAD_LIBS $LIBS"
@@ -30,8 +30,8 @@
# CC="$PTHREAD_CC"
#
# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
-# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name
-# (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
+# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to
+# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
#
# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
# PTHREAD_PRIO_INHERIT symbol is defined when compiling with
@@ -82,35 +82,40 @@
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
-#serial 21
+#serial 23
AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
AC_DEFUN([AX_PTHREAD], [
AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([AC_PROG_CC])
+AC_REQUIRE([AC_PROG_SED])
AC_LANG_PUSH([C])
ax_pthread_ok=no
# We used to check for pthread.h first, but this fails if pthread.h
-# requires special compiler flags (e.g. on True64 or Sequent).
+# requires special compiler flags (e.g. on Tru64 or Sequent).
# It gets checked for in the link test anyway.
# First of all, check if the user has set any of the PTHREAD_LIBS,
# etcetera environment variables, and if threads linking works using
# them:
-if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
- save_CFLAGS="$CFLAGS"
+if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
+ ax_pthread_save_CC="$CC"
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
+ AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"])
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
- save_LIBS="$LIBS"
LIBS="$PTHREAD_LIBS $LIBS"
- AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
- AC_TRY_LINK_FUNC([pthread_join], [ax_pthread_ok=yes])
+ AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS])
+ AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes])
AC_MSG_RESULT([$ax_pthread_ok])
- if test x"$ax_pthread_ok" = xno; then
+ if test "x$ax_pthread_ok" = "xno"; then
PTHREAD_LIBS=""
PTHREAD_CFLAGS=""
fi
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
+ CC="$ax_pthread_save_CC"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
fi
# We must check for the threads library under a number of different
@@ -123,7 +128,7 @@
# which indicates that we try without any flags at all, and "pthread-config"
# which is a program returning the flags for the Pth emulation library.
-ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
# The ordering *is* (sometimes) important. Some notes on the
# individual items follow:
@@ -132,82 +137,225 @@
# none: in case threads are in libc; should be tried before -Kthread and
# other compiler flags to prevent continual compiler warnings
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
-# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
-# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
-# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
-# -pthreads: Solaris/gcc
-# -mthreads: Mingw32/gcc, Lynx/gcc
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64
+# (Note: HP C rejects this with "bad form for `-t' option")
+# -pthreads: Solaris/gcc (Note: HP C also rejects)
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
-# doesn't hurt to check since this sometimes defines pthreads too;
-# also defines -D_REENTRANT)
-# ... -mt is also the pthreads flag for HP/aCC
+# doesn't hurt to check since this sometimes defines pthreads and
+# -D_REENTRANT too), HP C (must be checked before -lpthread, which
+# is present but should not be used directly; and before -mthreads,
+# because the compiler interprets this as "-mt" + "-hreads")
+# -mthreads: Mingw32/gcc, Lynx/gcc
# pthread: Linux, etcetera
# --thread-safe: KAI C++
# pthread-config: use pthread-config program (for GNU Pth library)
-case ${host_os} in
+case $host_os in
+
+ freebsd*)
+
+ # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+ # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+
+ ax_pthread_flags="-kthread lthread $ax_pthread_flags"
+ ;;
+
+ hpux*)
+
+ # From the cc(1) man page: "[-mt] Sets various -D flags to enable
+ # multi-threading and also sets -lpthread."
+
+ ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags"
+ ;;
+
+ openedition*)
+
+ # IBM z/OS requires a feature-test macro to be defined in order to
+ # enable POSIX threads at all, so give the user a hint if this is
+ # not set. (We don't define these ourselves, as they can affect
+ # other portions of the system API in unpredictable ways.)
+
+ AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING],
+ [
+# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS)
+ AX_PTHREAD_ZOS_MISSING
+# endif
+ ],
+ [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])])
+ ;;
+
solaris*)
# On Solaris (at least, for some versions), libc contains stubbed
# (non-functional) versions of the pthreads routines, so link-based
- # tests will erroneously succeed. (We need to link with -pthreads/-mt/
- # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
- # a function called by this macro, so we could check for that, but
- # who knows whether they'll stub that too in a future libc.) So,
- # we'll just look for -pthreads and -lpthread first:
+ # tests will erroneously succeed. (N.B.: The stubs are missing
+ # pthread_cleanup_push, or rather a function called by this macro,
+ # so we could check for that, but who knows whether they'll stub
+ # that too in a future libc.) So we'll check first for the
+ # standard Solaris way of linking pthreads (-mt -lpthread).
- ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags"
- ;;
-
- darwin*)
- ax_pthread_flags="-pthread $ax_pthread_flags"
+ ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags"
;;
esac
-# Clang doesn't consider unrecognized options an error unless we specify
-# -Werror. We throw in some extra Clang-specific options to ensure that
-# this doesn't happen for GCC, which also accepts -Werror.
+# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
-AC_MSG_CHECKING([if compiler needs -Werror to reject unknown flags])
-save_CFLAGS="$CFLAGS"
-ax_pthread_extra_flags="-Werror"
-CFLAGS="$CFLAGS $ax_pthread_extra_flags -Wunknown-warning-option -Wsizeof-array-argument"
-AC_COMPILE_IFELSE([AC_LANG_PROGRAM([int foo(void);],[foo()])],
- [AC_MSG_RESULT([yes])],
- [ax_pthread_extra_flags=
- AC_MSG_RESULT([no])])
-CFLAGS="$save_CFLAGS"
+AS_IF([test "x$GCC" = "xyes"],
+ [ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"])
-if test x"$ax_pthread_ok" = xno; then
-for flag in $ax_pthread_flags; do
+# The presence of a feature test macro requesting re-entrant function
+# definitions is, on some systems, a strong hint that pthreads support is
+# correctly enabled
- case $flag in
+case $host_os in
+ darwin* | hpux* | linux* | osf* | solaris*)
+ ax_pthread_check_macro="_REENTRANT"
+ ;;
+
+ aix*)
+ ax_pthread_check_macro="_THREAD_SAFE"
+ ;;
+
+ *)
+ ax_pthread_check_macro="--"
+ ;;
+esac
+AS_IF([test "x$ax_pthread_check_macro" = "x--"],
+ [ax_pthread_check_cond=0],
+ [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"])
+
+# Are we compiling with Clang?
+
+AC_CACHE_CHECK([whether $CC is Clang],
+ [ax_cv_PTHREAD_CLANG],
+ [ax_cv_PTHREAD_CLANG=no
+ # Note that Autoconf sets GCC=yes for Clang as well as GCC
+ if test "x$GCC" = "xyes"; then
+ AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG],
+ [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
+# if defined(__clang__) && defined(__llvm__)
+ AX_PTHREAD_CC_IS_CLANG
+# endif
+ ],
+ [ax_cv_PTHREAD_CLANG=yes])
+ fi
+ ])
+ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
+
+ax_pthread_clang_warning=no
+
+# Clang needs special handling, because older versions handle the -pthread
+# option in a rather... idiosyncratic way
+
+if test "x$ax_pthread_clang" = "xyes"; then
+
+ # Clang takes -pthread; it has never supported any other flag
+
+ # (Note 1: This will need to be revisited if a system that Clang
+ # supports has POSIX threads in a separate library. This tends not
+ # to be the way of modern systems, but it's conceivable.)
+
+ # (Note 2: On some systems, notably Darwin, -pthread is not needed
+ # to get POSIX threads support; the API is always present and
+ # active. We could reasonably leave PTHREAD_CFLAGS empty. But
+ # -pthread does define _REENTRANT, and while the Darwin headers
+ # ignore this macro, third-party headers might not.)
+
+ PTHREAD_CFLAGS="-pthread"
+ PTHREAD_LIBS=
+
+ ax_pthread_ok=yes
+
+ # However, older versions of Clang make a point of warning the user
+ # that, in an invocation where only linking and no compilation is
+ # taking place, the -pthread option has no effect ("argument unused
+ # during compilation"). They expect -pthread to be passed in only
+ # when source code is being compiled.
+ #
+ # Problem is, this is at odds with the way Automake and most other
+ # C build frameworks function, which is that the same flags used in
+ # compilation (CFLAGS) are also used in linking. Many systems
+ # supported by AX_PTHREAD require exactly this for POSIX threads
+ # support, and in fact it is often not straightforward to specify a
+ # flag that is used only in the compilation phase and not in
+ # linking. Such a scenario is extremely rare in practice.
+ #
+ # Even though use of the -pthread flag in linking would only print
+ # a warning, this can be a nuisance for well-run software projects
+ # that build with -Werror. So if the active version of Clang has
+ # this misfeature, we search for an option to squash it.
+
+ AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread],
+ [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG],
+ [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
+ # Create an alternate version of $ac_link that compiles and
+ # links in two steps (.c -> .o, .o -> exe) instead of one
+ # (.c -> exe), because the warning occurs only in the second
+ # step
+ ax_pthread_save_ac_link="$ac_link"
+ ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
+ ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"`
+ ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
+ AS_IF([test "x$ax_pthread_try" = "xunknown"], [break])
+ CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
+ ac_link="$ax_pthread_save_ac_link"
+ AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
+ [ac_link="$ax_pthread_2step_ac_link"
+ AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
+ [break])
+ ])
+ done
+ ac_link="$ax_pthread_save_ac_link"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no])
+ ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
+ ])
+
+ case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
+ no | unknown) ;;
+ *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;;
+ esac
+
+fi # $ax_pthread_clang = yes
+
+if test "x$ax_pthread_ok" = "xno"; then
+for ax_pthread_try_flag in $ax_pthread_flags; do
+
+ case $ax_pthread_try_flag in
none)
AC_MSG_CHECKING([whether pthreads work without any flags])
;;
+ -mt,pthread)
+ AC_MSG_CHECKING([whether pthreads work with -mt -lpthread])
+ PTHREAD_CFLAGS="-mt"
+ PTHREAD_LIBS="-lpthread"
+ ;;
+
-*)
- AC_MSG_CHECKING([whether pthreads work with $flag])
- PTHREAD_CFLAGS="$flag"
+ AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag])
+ PTHREAD_CFLAGS="$ax_pthread_try_flag"
;;
pthread-config)
AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
- if test x"$ax_pthread_config" = xno; then continue; fi
+ AS_IF([test "x$ax_pthread_config" = "xno"], [continue])
PTHREAD_CFLAGS="`pthread-config --cflags`"
PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
;;
*)
- AC_MSG_CHECKING([for the pthreads library -l$flag])
- PTHREAD_LIBS="-l$flag"
+ AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag])
+ PTHREAD_LIBS="-l$ax_pthread_try_flag"
;;
esac
- save_LIBS="$LIBS"
- save_CFLAGS="$CFLAGS"
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
LIBS="$PTHREAD_LIBS $LIBS"
- CFLAGS="$CFLAGS $PTHREAD_CFLAGS $ax_pthread_extra_flags"
# Check for various functions. We must include pthread.h,
# since some functions may be macros. (On the Sequent, we
@@ -218,7 +366,11 @@
# pthread_cleanup_push because it is one of the few pthread
# functions on Solaris that doesn't have a non-functional libc stub.
# We try pthread_create on general principles.
+
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
+# if $ax_pthread_check_cond
+# error "$ax_pthread_check_macro must be defined"
+# endif
static void routine(void *a) { a = 0; }
static void *start_routine(void *a) { return a; }],
[pthread_t th; pthread_attr_t attr;
@@ -227,16 +379,14 @@
pthread_attr_init(&attr);
pthread_cleanup_push(routine, 0);
pthread_cleanup_pop(0) /* ; */])],
- [ax_pthread_ok=yes],
- [])
+ [ax_pthread_ok=yes],
+ [])
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
AC_MSG_RESULT([$ax_pthread_ok])
- if test "x$ax_pthread_ok" = xyes; then
- break;
- fi
+ AS_IF([test "x$ax_pthread_ok" = "xyes"], [break])
PTHREAD_LIBS=""
PTHREAD_CFLAGS=""
@@ -244,71 +394,74 @@
fi
# Various other checks:
-if test "x$ax_pthread_ok" = xyes; then
- save_LIBS="$LIBS"
- LIBS="$PTHREAD_LIBS $LIBS"
- save_CFLAGS="$CFLAGS"
+if test "x$ax_pthread_ok" = "xyes"; then
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ LIBS="$PTHREAD_LIBS $LIBS"
# Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
- AC_MSG_CHECKING([for joinable pthread attribute])
- attr_name=unknown
- for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
- AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
- [int attr = $attr; return attr /* ; */])],
- [attr_name=$attr; break],
- [])
- done
- AC_MSG_RESULT([$attr_name])
- if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
- AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], [$attr_name],
- [Define to necessary symbol if this constant
- uses a non-standard name on your system.])
- fi
+ AC_CACHE_CHECK([for joinable pthread attribute],
+ [ax_cv_PTHREAD_JOINABLE_ATTR],
+ [ax_cv_PTHREAD_JOINABLE_ATTR=unknown
+ for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
+ [int attr = $ax_pthread_attr; return attr /* ; */])],
+ [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break],
+ [])
+ done
+ ])
+ AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
+ test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
+ test "x$ax_pthread_joinable_attr_defined" != "xyes"],
+ [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE],
+ [$ax_cv_PTHREAD_JOINABLE_ATTR],
+ [Define to necessary symbol if this constant
+ uses a non-standard name on your system.])
+ ax_pthread_joinable_attr_defined=yes
+ ])
- AC_MSG_CHECKING([if more special flags are required for pthreads])
- flag=no
- case ${host_os} in
- aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";;
- osf* | hpux*) flag="-D_REENTRANT";;
- solaris*)
- if test "$GCC" = "yes"; then
- flag="-D_REENTRANT"
- else
- # TODO: What about Clang on Solaris?
- flag="-mt -D_REENTRANT"
- fi
- ;;
- esac
- AC_MSG_RESULT([$flag])
- if test "x$flag" != xno; then
- PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
- fi
+ AC_CACHE_CHECK([whether more special flags are required for pthreads],
+ [ax_cv_PTHREAD_SPECIAL_FLAGS],
+ [ax_cv_PTHREAD_SPECIAL_FLAGS=no
+ case $host_os in
+ solaris*)
+ ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
+ ;;
+ esac
+ ])
+ AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
+ test "x$ax_pthread_special_flags_added" != "xyes"],
+ [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
+ ax_pthread_special_flags_added=yes])
AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
- [ax_cv_PTHREAD_PRIO_INHERIT], [
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],
- [[int i = PTHREAD_PRIO_INHERIT;]])],
- [ax_cv_PTHREAD_PRIO_INHERIT=yes],
- [ax_cv_PTHREAD_PRIO_INHERIT=no])
+ [ax_cv_PTHREAD_PRIO_INHERIT],
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],
+ [[int i = PTHREAD_PRIO_INHERIT;]])],
+ [ax_cv_PTHREAD_PRIO_INHERIT=yes],
+ [ax_cv_PTHREAD_PRIO_INHERIT=no])
])
- AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"],
- [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])])
+ AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
+ test "x$ax_pthread_prio_inherit_defined" != "xyes"],
+ [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])
+ ax_pthread_prio_inherit_defined=yes
+ ])
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
# More AIX lossage: compile with *_r variant
- if test "x$GCC" != xyes; then
+ if test "x$GCC" != "xyes"; then
case $host_os in
aix*)
AS_CASE(["x/$CC"],
- [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
- [#handle absolute path differently from PATH based program lookup
- AS_CASE(["x$CC"],
- [x/*],
- [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])],
- [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])])
+ [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
+ [#handle absolute path differently from PATH based program lookup
+ AS_CASE(["x$CC"],
+ [x/*],
+ [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])],
+ [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])])
;;
esac
fi
@@ -321,7 +474,7 @@
AC_SUBST([PTHREAD_CC])
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
-if test x"$ax_pthread_ok" = xyes; then
+if test "x$ax_pthread_ok" = "xyes"; then
ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1])
:
else
diff --git a/common/win32.mak b/common/win32.mak
index 87cd346..6060532 100644
--- a/common/win32.mak
+++ b/common/win32.mak
@@ -61,8 +61,11 @@
update-exports:
make check-exports 2>&1 | patch -p1
- git add win32/common/libgst*.def
- git diff --cached -- win32/common/
+ if test -f "$(top_srcdir)/win32/common/libgstgl.def"; then \
+ git checkout "$(top_srcdir)/win32/common/libgstgl.def"; \
+ fi
+ git add $(top_srcdir)/win32/common/libgst*.def
+ git diff --cached -- $(top_srcdir)/win32/common/
echo '^^^--- updated and staged changes above'
# complain about nonportable printf format strings (%lld, %llu, %zu etc.)
diff --git a/config.h.in b/config.h.in
index 6431860..429459d 100644
--- a/config.h.in
+++ b/config.h.in
@@ -223,6 +223,9 @@
/* Define to enable DVB Source (used by dvb). */
#undef HAVE_DVB
+/* Define to 1 if the system has the type `EGLAttrib'. */
+#undef HAVE_EGLATTRIB
+
/* Define to enable building of experimental plug-ins. */
#undef HAVE_EXPERIMENTAL
@@ -241,6 +244,9 @@
/* Define to 1 if you have the <fcntl.h> header file. */
#undef HAVE_FCNTL_H
+/* Define to enable fdkaac plugin (used by fdkaac). */
+#undef HAVE_FDK_AAC
+
/* FIONREAD ioctl found in sys/filio.h */
#undef HAVE_FIONREAD_IN_SYS_FILIO
@@ -322,6 +328,9 @@
/* Define to enable Kate (used by kate). */
#undef HAVE_KATE
+/* Define to enable drm/kms libraries (used by kms). */
+#undef HAVE_KMS
+
/* Define to enable ladspa (used by ladspa). */
#undef HAVE_LADSPA
@@ -349,6 +358,9 @@
/* Define to enable libvisual visualization library (used by libvisual). */
#undef HAVE_LIBVISUAL
+/* Define if we have liblilv >= 0.22 */
+#undef HAVE_LILV_0_22
+
/* Define to enable Linear Systems SDI plugin (used by linsys). */
#undef HAVE_LINSYS
@@ -415,15 +427,9 @@
/* Define to enable opencv plugins (used by opencv). */
#undef HAVE_OPENCV
-/* Define to 1 if you have the <opencv2/contrib/contrib.hpp> header file. */
-#undef HAVE_OPENCV2_CONTRIB_CONTRIB_HPP
-
/* Define to 1 if you have the <opencv2/core/core_c.h> header file. */
#undef HAVE_OPENCV2_CORE_CORE_C_H
-/* Define to 1 if you have the <opencv2/core/types_c.h> header file. */
-#undef HAVE_OPENCV2_CORE_TYPES_C_H
-
/* Define to 1 if you have the <opencv2/core/version.hpp> header file. */
#undef HAVE_OPENCV2_CORE_VERSION_HPP
@@ -436,12 +442,6 @@
/* Define to 1 if you have the <opencv2/imgproc/imgproc.hpp> header file. */
#undef HAVE_OPENCV2_IMGPROC_IMGPROC_HPP
-/* Define to 1 if you have the <opencv2/legacy/compat.hpp> header file. */
-#undef HAVE_OPENCV2_LEGACY_COMPAT_HPP
-
-/* Define to 1 if you have the <opencv2/legacy/legacy.hpp> header file. */
-#undef HAVE_OPENCV2_LEGACY_LEGACY_HPP
-
/* Define to 1 if you have the <opencv2/objdetect/objdetect.hpp> header file.
*/
#undef HAVE_OPENCV2_OBJDETECT_OBJDETECT_HPP
@@ -501,6 +501,9 @@
/* Define to enable Qt elements (used by qt). */
#undef HAVE_QT
+/* Define if building with QTKit */
+#undef HAVE_QTKIT
+
/* Define if Qt eglfs integration is installed */
#undef HAVE_QT_EGLFS
@@ -648,6 +651,9 @@
/* Define to enable WebP (used by webp ). */
#undef HAVE_WEBP
+/* Define to enable WebRTC Audio Processing (used by webrtcdsp). */
+#undef HAVE_WEBRTCDSP
+
/* Define to enable wildmidi midi soft synth plugin (used by wildmidi). */
#undef HAVE_WILDMIDI
diff --git a/configure b/configure
index 9110f12..2508148 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.8.3.
+# Generated by GNU Autoconf 2.69 for GStreamer Bad Plug-ins 1.9.90.
#
# 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.8.3'
-PACKAGE_STRING='GStreamer Bad Plug-ins 1.8.3'
+PACKAGE_VERSION='1.9.90'
+PACKAGE_STRING='GStreamer Bad Plug-ins 1.9.90'
PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer'
PACKAGE_URL=''
@@ -652,6 +652,10 @@
GST_OPTION_CFLAGS
DEPRECATED_CFLAGS
PROFILE_CFLAGS
+USE_WEBRTCDSP_FALSE
+USE_WEBRTCDSP_TRUE
+WEBRTCDSP_LIBS
+WEBRTCDSP_CFLAGS
USE_X265_FALSE
USE_X265_TRUE
X265_LIBS
@@ -867,12 +871,16 @@
LIBDE265_CFLAGS
USE_LV2_FALSE
USE_LV2_TRUE
-SLV2_LIBS
-SLV2_CFLAGS
+LILV_LIBS
+LILV_CFLAGS
USE_LADSPA_FALSE
USE_LADSPA_TRUE
LRDF_LIBS
LRDF_CFLAGS
+USE_KMS_FALSE
+USE_KMS_TRUE
+DRM_LIBS
+DRM_CFLAGS
USE_KATE_FALSE
USE_KATE_TRUE
USE_TIGER_FALSE
@@ -894,6 +902,10 @@
FLITE_LIBS
FLITE_CFLAGS
HAVE_FLITE
+USE_FDK_AAC_FALSE
+USE_FDK_AAC_TRUE
+FDK_AAC_LIBS
+FDK_AAC_CFLAGS
USE_FBDEV_FALSE
USE_FBDEV_TRUE
USE_FAAD_FALSE
@@ -920,10 +932,9 @@
USE_WEBP_TRUE
WEBP_LIBS
WEBP_CFLAGS
-USE_WAYLAND_FALSE
-USE_WAYLAND_TRUE
-WAYLAND_LIBS
-WAYLAND_CFLAGS
+WAYLAND_PROTOCOLS_DATADIR
+WAYLAND_PROTOCOLS_LIBS
+WAYLAND_PROTOCOLS_CFLAGS
wayland_scanner
USE_DIRECTFB_FALSE
USE_DIRECTFB_TRUE
@@ -988,10 +999,6 @@
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
@@ -1042,6 +1049,10 @@
DIRECTSOUND_LIBS
DIRECTX_LDFLAGS
DIRECTX_CFLAGS
+USE_WAYLAND_FALSE
+USE_WAYLAND_TRUE
+WAYLAND_LIBS
+WAYLAND_CFLAGS
USE_XCB_FALSE
USE_XCB_TRUE
XCB_LIBS
@@ -1109,6 +1120,8 @@
X_CFLAGS
DCCP_LIBS
WINSOCK2_LIBS
+HAVE_QTKIT_FALSE
+HAVE_QTKIT_TRUE
HAVE_VIDEOTOOLBOX_FALSE
HAVE_VIDEOTOOLBOX_TRUE
HAVE_IOS_FALSE
@@ -1131,6 +1144,8 @@
USE_PLUGIN_VIDEOFILTERS_TRUE
USE_PLUGIN_TTA_FALSE
USE_PLUGIN_TTA_TRUE
+USE_PLUGIN_TIMECODE_FALSE
+USE_PLUGIN_TIMECODE_TRUE
USE_PLUGIN_STEREO_FALSE
USE_PLUGIN_STEREO_TRUE
USE_PLUGIN_SUBENC_FALSE
@@ -1352,6 +1367,12 @@
GST_PLUGINS_BASE_CFLAGS
HAVE_GST_CHECK_FALSE
HAVE_GST_CHECK_TRUE
+GST_PBUTILS_LIBS
+GST_PBUTILS_CFLAGS
+GST_AUDIO_LIBS
+GST_AUDIO_CFLAGS
+GST_VIDEO_LIBS
+GST_VIDEO_CFLAGS
GST_NET_LIBS
GST_NET_CFLAGS
GST_CONTROLLER_LIBS
@@ -1756,6 +1777,7 @@
enable_speed
enable_subenc
enable_stereo
+enable_timecode
enable_tta
enable_videofilters
enable_videomeasure
@@ -1812,10 +1834,12 @@
enable_faac
enable_faad
enable_fbdev
+enable_fdk_aac
enable_flite
enable_gsm
enable_fluidsynth
enable_kate
+enable_kms
enable_ladspa
enable_lv2
enable_libde265
@@ -1873,6 +1897,7 @@
enable_hls
with_libgcrypt_prefix
enable_x265
+enable_webrtcdsp
'
ac_precious_vars='build_alias
host_alias
@@ -1910,6 +1935,12 @@
GST_CONTROLLER_LIBS
GST_NET_CFLAGS
GST_NET_LIBS
+GST_VIDEO_CFLAGS
+GST_VIDEO_LIBS
+GST_AUDIO_CFLAGS
+GST_AUDIO_LIBS
+GST_PBUTILS_CFLAGS
+GST_PBUTILS_LIBS
GST_PLUGINS_BASE_CFLAGS
GST_PLUGINS_BASE_LIBS
GST_PLUGINS_GOOD_CFLAGS
@@ -1960,6 +1991,8 @@
LIBPNG_LIBS
XCB_CFLAGS
XCB_LIBS
+WAYLAND_CFLAGS
+WAYLAND_LIBS
BLUEZ5_CFLAGS
BLUEZ5_LIBS
GIO_UNIX_CFLAGS
@@ -1968,10 +2001,6 @@
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
@@ -1998,24 +2027,28 @@
LIBDC1394_LIBS
DIRECTFB_CFLAGS
DIRECTFB_LIBS
-WAYLAND_CFLAGS
-WAYLAND_LIBS
+WAYLAND_PROTOCOLS_CFLAGS
+WAYLAND_PROTOCOLS_LIBS
WEBP_CFLAGS
WEBP_LIBS
DAALA_CFLAGS
DAALA_LIBS
DVDNAV_CFLAGS
DVDNAV_LIBS
+FDK_AAC_CFLAGS
+FDK_AAC_LIBS
FLUIDSYNTH_CFLAGS
FLUIDSYNTH_LIBS
KATE_CFLAGS
KATE_LIBS
TIGER_CFLAGS
TIGER_LIBS
+DRM_CFLAGS
+DRM_LIBS
LRDF_CFLAGS
LRDF_LIBS
-SLV2_CFLAGS
-SLV2_LIBS
+LILV_CFLAGS
+LILV_LIBS
LIBDE265_CFLAGS
LIBDE265_LIBS
LIBMMS_CFLAGS
@@ -2103,7 +2136,9 @@
OPENSSL_CFLAGS
OPENSSL_LIBS
X265_CFLAGS
-X265_LIBS'
+X265_LIBS
+WEBRTCDSP_CFLAGS
+WEBRTCDSP_LIBS'
# Initialize some variables set by options.
@@ -2654,7 +2689,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.8.3 to adapt to many kinds of systems.
+\`configure' configures GStreamer Bad Plug-ins 1.9.90 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -2726,7 +2761,7 @@
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of GStreamer Bad Plug-ins 1.8.3:";;
+ short | recursive ) echo "Configuration of GStreamer Bad Plug-ins 1.9.90:";;
esac
cat <<\_ACEOF
@@ -2836,6 +2871,7 @@
--disable-speed disable dependency-less speed plugin
--disable-subenc disable dependency-less subenc plugin
--disable-stereo disable dependency-less stereo plugin
+ --disable-timecode disable dependency-less timecode plugin
--disable-tta disable dependency-less tta plugin
--disable-videofilters disable dependency-less videofilters plugin
--disable-videomeasure disable dependency-less videomeasure plugin
@@ -2888,10 +2924,12 @@
--disable-faac disable AAC encoder plug-in: faac
--disable-faad disable FAAD2 AAC decoder plug-in: faad
--disable-fbdev disable linux framebuffer: fbdevsink
+ --disable-fdk_aac disable fdkaac plugin: fdkaac
--disable-flite disable Flite plugin: flite
--disable-gsm disable GSM library: gsmenc gsmdec
--disable-fluidsynth disable fluidsynth: fluidsynth
--disable-kate disable Kate: kate
+ --disable-kms disable drm/kms libraries: kms
--disable-ladspa disable ladspa: ladspa
--disable-lv2 disable lv2: lv2
--disable-libde265 disable libde265 HEVC/H.265 decoder: libde265
@@ -2944,6 +2982,7 @@
--disable-sndio disable sndio audio: sndio
--disable-hls disable http live streaming plugin: hls
--disable-x265 disable x265 plug-in: x265
+ --disable-webrtcdsp disable WebRTC Audio Processing: webrtcdsp
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
@@ -3053,6 +3092,18 @@
C compiler flags for GST_NET, overriding pkg-config
GST_NET_LIBS
linker flags for GST_NET, 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_AUDIO_CFLAGS
+ C compiler flags for GST_AUDIO, overriding pkg-config
+ GST_AUDIO_LIBS
+ linker flags for GST_AUDIO, 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
GST_PLUGINS_BASE_CFLAGS
C compiler flags for GST_PLUGINS_BASE, overriding pkg-config
GST_PLUGINS_BASE_LIBS
@@ -3131,6 +3182,10 @@
LIBPNG_LIBS linker flags for LIBPNG, overriding pkg-config
XCB_CFLAGS C compiler flags for XCB, overriding pkg-config
XCB_LIBS linker flags for XCB, overriding pkg-config
+ WAYLAND_CFLAGS
+ C compiler flags for WAYLAND, overriding pkg-config
+ WAYLAND_LIBS
+ linker flags for WAYLAND, overriding pkg-config
BLUEZ5_CFLAGS
C compiler flags for BLUEZ5, overriding pkg-config
BLUEZ5_LIBS linker flags for BLUEZ5, overriding pkg-config
@@ -3144,14 +3199,6 @@
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
@@ -3196,10 +3243,10 @@
C compiler flags for DIRECTFB, overriding pkg-config
DIRECTFB_LIBS
linker flags for DIRECTFB, overriding pkg-config
- WAYLAND_CFLAGS
- C compiler flags for WAYLAND, overriding pkg-config
- WAYLAND_LIBS
- linker flags for WAYLAND, overriding pkg-config
+ WAYLAND_PROTOCOLS_CFLAGS
+ C compiler flags for WAYLAND_PROTOCOLS, overriding pkg-config
+ WAYLAND_PROTOCOLS_LIBS
+ linker flags for WAYLAND_PROTOCOLS, overriding pkg-config
WEBP_CFLAGS C compiler flags for WEBP, overriding pkg-config
WEBP_LIBS linker flags for WEBP, overriding pkg-config
DAALA_CFLAGS
@@ -3208,6 +3255,10 @@
DVDNAV_CFLAGS
C compiler flags for DVDNAV, overriding pkg-config
DVDNAV_LIBS linker flags for DVDNAV, overriding pkg-config
+ FDK_AAC_CFLAGS
+ C compiler flags for FDK_AAC, overriding pkg-config
+ FDK_AAC_LIBS
+ linker flags for FDK_AAC, overriding pkg-config
FLUIDSYNTH_CFLAGS
C compiler flags for FLUIDSYNTH, overriding pkg-config
FLUIDSYNTH_LIBS
@@ -3217,10 +3268,12 @@
TIGER_CFLAGS
C compiler flags for TIGER, overriding pkg-config
TIGER_LIBS linker flags for TIGER, overriding pkg-config
+ DRM_CFLAGS C compiler flags for DRM, overriding pkg-config
+ DRM_LIBS linker flags for DRM, overriding pkg-config
LRDF_CFLAGS C compiler flags for LRDF, overriding pkg-config
LRDF_LIBS linker flags for LRDF, overriding pkg-config
- SLV2_CFLAGS C compiler flags for SLV2, overriding pkg-config
- SLV2_LIBS linker flags for SLV2, overriding pkg-config
+ LILV_CFLAGS C compiler flags for LILV, overriding pkg-config
+ LILV_LIBS linker flags for LILV, overriding pkg-config
LIBDE265_CFLAGS
C compiler flags for LIBDE265, overriding pkg-config
LIBDE265_LIBS
@@ -3361,6 +3414,10 @@
linker flags for OPENSSL, overriding pkg-config
X265_CFLAGS C compiler flags for X265, overriding pkg-config
X265_LIBS linker flags for X265, overriding pkg-config
+ WEBRTCDSP_CFLAGS
+ C compiler flags for WEBRTCDSP, overriding pkg-config
+ WEBRTCDSP_LIBS
+ linker flags for WEBRTCDSP, overriding pkg-config
Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.
@@ -3428,7 +3485,7 @@
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-GStreamer Bad Plug-ins configure 1.8.3
+GStreamer Bad Plug-ins configure 1.9.90
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -4401,7 +4458,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.8.3, which was
+It was created by GStreamer Bad Plug-ins $as_me 1.9.90, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -5383,7 +5440,7 @@
# Define the identity of the package.
PACKAGE='gst-plugins-bad'
- VERSION='1.8.3'
+ VERSION='1.9.90'
cat >>confdefs.h <<_ACEOF
@@ -5594,9 +5651,9 @@
- PACKAGE_VERSION_MAJOR=$(echo 1.8.3 | cut -d'.' -f1)
- PACKAGE_VERSION_MINOR=$(echo 1.8.3 | cut -d'.' -f2)
- PACKAGE_VERSION_MICRO=$(echo 1.8.3 | cut -d'.' -f3)
+ PACKAGE_VERSION_MAJOR=$(echo 1.9.90 | cut -d'.' -f1)
+ PACKAGE_VERSION_MINOR=$(echo 1.9.90 | cut -d'.' -f2)
+ PACKAGE_VERSION_MICRO=$(echo 1.9.90 | cut -d'.' -f3)
@@ -5607,7 +5664,7 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking nano version" >&5
$as_echo_n "checking nano version... " >&6; }
- NANO=$(echo 1.8.3 | cut -d'.' -f4)
+ NANO=$(echo 1.9.90 | cut -d'.' -f4)
if test x"$NANO" = x || test "x$NANO" = "x0" ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: 0 (release)" >&5
@@ -10451,10 +10508,10 @@
done
- GST_CURRENT=803
+ GST_CURRENT=990
GST_REVISION=0
- GST_AGE=803
- GST_LIBVERSION=803:0:803
+ GST_AGE=990
+ GST_LIBVERSION=990:0:990
@@ -15082,8 +15139,8 @@
-GST_REQ=1.8.0
-GSTPB_REQ=1.8.0
+GST_REQ=1.9.90
+GSTPB_REQ=1.9.90
@@ -24967,6 +25024,8 @@
+
+
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -24976,19 +25035,23 @@
ax_pthread_ok=no
# We used to check for pthread.h first, but this fails if pthread.h
-# requires special compiler flags (e.g. on True64 or Sequent).
+# requires special compiler flags (e.g. on Tru64 or Sequent).
# It gets checked for in the link test anyway.
# First of all, check if the user has set any of the PTHREAD_LIBS,
# etcetera environment variables, and if threads linking works using
# them:
-if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
- save_CFLAGS="$CFLAGS"
+if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
+ ax_pthread_save_CC="$CC"
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
+ if test "x$PTHREAD_CC" != "x"; then :
+ CC="$PTHREAD_CC"
+fi
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
- save_LIBS="$LIBS"
LIBS="$PTHREAD_LIBS $LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5
-$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5
+$as_echo_n "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -25014,12 +25077,13 @@
conftest$ac_exeext conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
$as_echo "$ax_pthread_ok" >&6; }
- if test x"$ax_pthread_ok" = xno; then
+ if test "x$ax_pthread_ok" = "xno"; then
PTHREAD_LIBS=""
PTHREAD_CFLAGS=""
fi
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
+ CC="$ax_pthread_save_CC"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
fi
# We must check for the threads library under a number of different
@@ -25032,7 +25096,7 @@
# which indicates that we try without any flags at all, and "pthread-config"
# which is a program returning the flags for the Pth emulation library.
-ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
# The ordering *is* (sometimes) important. Some notes on the
# individual items follow:
@@ -25041,82 +25105,257 @@
# none: in case threads are in libc; should be tried before -Kthread and
# other compiler flags to prevent continual compiler warnings
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
-# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
-# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
-# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
-# -pthreads: Solaris/gcc
-# -mthreads: Mingw32/gcc, Lynx/gcc
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64
+# (Note: HP C rejects this with "bad form for `-t' option")
+# -pthreads: Solaris/gcc (Note: HP C also rejects)
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
-# doesn't hurt to check since this sometimes defines pthreads too;
-# also defines -D_REENTRANT)
-# ... -mt is also the pthreads flag for HP/aCC
+# doesn't hurt to check since this sometimes defines pthreads and
+# -D_REENTRANT too), HP C (must be checked before -lpthread, which
+# is present but should not be used directly; and before -mthreads,
+# because the compiler interprets this as "-mt" + "-hreads")
+# -mthreads: Mingw32/gcc, Lynx/gcc
# pthread: Linux, etcetera
# --thread-safe: KAI C++
# pthread-config: use pthread-config program (for GNU Pth library)
-case ${host_os} in
+case $host_os in
+
+ freebsd*)
+
+ # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+ # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+
+ ax_pthread_flags="-kthread lthread $ax_pthread_flags"
+ ;;
+
+ hpux*)
+
+ # From the cc(1) man page: "[-mt] Sets various -D flags to enable
+ # multi-threading and also sets -lpthread."
+
+ ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags"
+ ;;
+
+ openedition*)
+
+ # IBM z/OS requires a feature-test macro to be defined in order to
+ # enable POSIX threads at all, so give the user a hint if this is
+ # not set. (We don't define these ourselves, as they can affect
+ # other portions of the system API in unpredictable ways.)
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS)
+ AX_PTHREAD_ZOS_MISSING
+# endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5
+$as_echo "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;}
+fi
+rm -f conftest*
+
+ ;;
+
solaris*)
# On Solaris (at least, for some versions), libc contains stubbed
# (non-functional) versions of the pthreads routines, so link-based
- # tests will erroneously succeed. (We need to link with -pthreads/-mt/
- # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
- # a function called by this macro, so we could check for that, but
- # who knows whether they'll stub that too in a future libc.) So,
- # we'll just look for -pthreads and -lpthread first:
+ # tests will erroneously succeed. (N.B.: The stubs are missing
+ # pthread_cleanup_push, or rather a function called by this macro,
+ # so we could check for that, but who knows whether they'll stub
+ # that too in a future libc.) So we'll check first for the
+ # standard Solaris way of linking pthreads (-mt -lpthread).
- ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags"
- ;;
-
- darwin*)
- ax_pthread_flags="-pthread $ax_pthread_flags"
+ ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags"
;;
esac
-# Clang doesn't consider unrecognized options an error unless we specify
-# -Werror. We throw in some extra Clang-specific options to ensure that
-# this doesn't happen for GCC, which also accepts -Werror.
+# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler needs -Werror to reject unknown flags" >&5
-$as_echo_n "checking if compiler needs -Werror to reject unknown flags... " >&6; }
-save_CFLAGS="$CFLAGS"
-ax_pthread_extra_flags="-Werror"
-CFLAGS="$CFLAGS $ax_pthread_extra_flags -Wunknown-warning-option -Wsizeof-array-argument"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-int foo(void);
-int
-main ()
-{
-foo()
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
- ax_pthread_extra_flags=
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+if test "x$GCC" = "xyes"; then :
+ ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS="$save_CFLAGS"
-if test x"$ax_pthread_ok" = xno; then
-for flag in $ax_pthread_flags; do
+# The presence of a feature test macro requesting re-entrant function
+# definitions is, on some systems, a strong hint that pthreads support is
+# correctly enabled
- case $flag in
+case $host_os in
+ darwin* | hpux* | linux* | osf* | solaris*)
+ ax_pthread_check_macro="_REENTRANT"
+ ;;
+
+ aix*)
+ ax_pthread_check_macro="_THREAD_SAFE"
+ ;;
+
+ *)
+ ax_pthread_check_macro="--"
+ ;;
+esac
+if test "x$ax_pthread_check_macro" = "x--"; then :
+ ax_pthread_check_cond=0
+else
+ ax_pthread_check_cond="!defined($ax_pthread_check_macro)"
+fi
+
+# Are we compiling with Clang?
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5
+$as_echo_n "checking whether $CC is Clang... " >&6; }
+if ${ax_cv_PTHREAD_CLANG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ax_cv_PTHREAD_CLANG=no
+ # Note that Autoconf sets GCC=yes for Clang as well as GCC
+ if test "x$GCC" = "xyes"; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
+# if defined(__clang__) && defined(__llvm__)
+ AX_PTHREAD_CC_IS_CLANG
+# endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1; then :
+ ax_cv_PTHREAD_CLANG=yes
+fi
+rm -f conftest*
+
+ fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5
+$as_echo "$ax_cv_PTHREAD_CLANG" >&6; }
+ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
+
+ax_pthread_clang_warning=no
+
+# Clang needs special handling, because older versions handle the -pthread
+# option in a rather... idiosyncratic way
+
+if test "x$ax_pthread_clang" = "xyes"; then
+
+ # Clang takes -pthread; it has never supported any other flag
+
+ # (Note 1: This will need to be revisited if a system that Clang
+ # supports has POSIX threads in a separate library. This tends not
+ # to be the way of modern systems, but it's conceivable.)
+
+ # (Note 2: On some systems, notably Darwin, -pthread is not needed
+ # to get POSIX threads support; the API is always present and
+ # active. We could reasonably leave PTHREAD_CFLAGS empty. But
+ # -pthread does define _REENTRANT, and while the Darwin headers
+ # ignore this macro, third-party headers might not.)
+
+ PTHREAD_CFLAGS="-pthread"
+ PTHREAD_LIBS=
+
+ ax_pthread_ok=yes
+
+ # However, older versions of Clang make a point of warning the user
+ # that, in an invocation where only linking and no compilation is
+ # taking place, the -pthread option has no effect ("argument unused
+ # during compilation"). They expect -pthread to be passed in only
+ # when source code is being compiled.
+ #
+ # Problem is, this is at odds with the way Automake and most other
+ # C build frameworks function, which is that the same flags used in
+ # compilation (CFLAGS) are also used in linking. Many systems
+ # supported by AX_PTHREAD require exactly this for POSIX threads
+ # support, and in fact it is often not straightforward to specify a
+ # flag that is used only in the compilation phase and not in
+ # linking. Such a scenario is extremely rare in practice.
+ #
+ # Even though use of the -pthread flag in linking would only print
+ # a warning, this can be a nuisance for well-run software projects
+ # that build with -Werror. So if the active version of Clang has
+ # this misfeature, we search for an option to squash it.
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5
+$as_echo_n "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; }
+if ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
+ # Create an alternate version of $ac_link that compiles and
+ # links in two steps (.c -> .o, .o -> exe) instead of one
+ # (.c -> exe), because the warning occurs only in the second
+ # step
+ ax_pthread_save_ac_link="$ac_link"
+ ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
+ ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"`
+ ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
+ if test "x$ax_pthread_try" = "xunknown"; then :
+ break
+fi
+ CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
+ ac_link="$ax_pthread_save_ac_link"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int main(void){return 0;}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_link="$ax_pthread_2step_ac_link"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int main(void){return 0;}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ done
+ ac_link="$ax_pthread_save_ac_link"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ if test "x$ax_pthread_try" = "x"; then :
+ ax_pthread_try=no
+fi
+ ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5
+$as_echo "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; }
+
+ case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
+ no | unknown) ;;
+ *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;;
+ esac
+
+fi # $ax_pthread_clang = yes
+
+if test "x$ax_pthread_ok" = "xno"; then
+for ax_pthread_try_flag in $ax_pthread_flags; do
+
+ case $ax_pthread_try_flag in
none)
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5
$as_echo_n "checking whether pthreads work without any flags... " >&6; }
;;
+ -mt,pthread)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with -mt -lpthread" >&5
+$as_echo_n "checking whether pthreads work with -mt -lpthread... " >&6; }
+ PTHREAD_CFLAGS="-mt"
+ PTHREAD_LIBS="-lpthread"
+ ;;
+
-*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5
-$as_echo_n "checking whether pthreads work with $flag... " >&6; }
- PTHREAD_CFLAGS="$flag"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5
+$as_echo_n "checking whether pthreads work with $ax_pthread_try_flag... " >&6; }
+ PTHREAD_CFLAGS="$ax_pthread_try_flag"
;;
pthread-config)
@@ -25158,22 +25397,24 @@
fi
- if test x"$ax_pthread_config" = xno; then continue; fi
+ if test "x$ax_pthread_config" = "xno"; then :
+ continue
+fi
PTHREAD_CFLAGS="`pthread-config --cflags`"
PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
;;
*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5
-$as_echo_n "checking for the pthreads library -l$flag... " >&6; }
- PTHREAD_LIBS="-l$flag"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5
+$as_echo_n "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; }
+ PTHREAD_LIBS="-l$ax_pthread_try_flag"
;;
esac
- save_LIBS="$LIBS"
- save_CFLAGS="$CFLAGS"
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
LIBS="$PTHREAD_LIBS $LIBS"
- CFLAGS="$CFLAGS $PTHREAD_CFLAGS $ax_pthread_extra_flags"
# Check for various functions. We must include pthread.h,
# since some functions may be macros. (On the Sequent, we
@@ -25184,9 +25425,13 @@
# pthread_cleanup_push because it is one of the few pthread
# functions on Solaris that doesn't have a non-functional libc stub.
# We try pthread_create on general principles.
+
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <pthread.h>
+# if $ax_pthread_check_cond
+# error "$ax_pthread_check_macro must be defined"
+# endif
static void routine(void *a) { a = 0; }
static void *start_routine(void *a) { return a; }
int
@@ -25208,14 +25453,14 @@
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
$as_echo "$ax_pthread_ok" >&6; }
- if test "x$ax_pthread_ok" = xyes; then
- break;
- fi
+ if test "x$ax_pthread_ok" = "xyes"; then :
+ break
+fi
PTHREAD_LIBS=""
PTHREAD_CFLAGS=""
@@ -25223,72 +25468,80 @@
fi
# Various other checks:
-if test "x$ax_pthread_ok" = xyes; then
- save_LIBS="$LIBS"
- LIBS="$PTHREAD_LIBS $LIBS"
- save_CFLAGS="$CFLAGS"
+if test "x$ax_pthread_ok" = "xyes"; then
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ LIBS="$PTHREAD_LIBS $LIBS"
# Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5
$as_echo_n "checking for joinable pthread attribute... " >&6; }
- attr_name=unknown
- for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+if ${ax_cv_PTHREAD_JOINABLE_ATTR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ax_cv_PTHREAD_JOINABLE_ATTR=unknown
+ for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <pthread.h>
int
main ()
{
-int attr = $attr; return attr /* ; */
+int attr = $ax_pthread_attr; return attr /* ; */
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
- attr_name=$attr; break
+ ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
- done
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5
-$as_echo "$attr_name" >&6; }
- if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
+ done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5
+$as_echo "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; }
+ if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
+ test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
+ test "x$ax_pthread_joinable_attr_defined" != "xyes"; then :
cat >>confdefs.h <<_ACEOF
-#define PTHREAD_CREATE_JOINABLE $attr_name
+#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR
_ACEOF
- fi
+ ax_pthread_joinable_attr_defined=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5
-$as_echo_n "checking if more special flags are required for pthreads... " >&6; }
- flag=no
- case ${host_os} in
- aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";;
- osf* | hpux*) flag="-D_REENTRANT";;
- solaris*)
- if test "$GCC" = "yes"; then
- flag="-D_REENTRANT"
- else
- # TODO: What about Clang on Solaris?
- flag="-mt -D_REENTRANT"
- fi
- ;;
- esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag" >&5
-$as_echo "$flag" >&6; }
- if test "x$flag" != xno; then
- PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
- fi
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5
+$as_echo_n "checking whether more special flags are required for pthreads... " >&6; }
+if ${ax_cv_PTHREAD_SPECIAL_FLAGS+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ax_cv_PTHREAD_SPECIAL_FLAGS=no
+ case $host_os in
+ solaris*)
+ ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
+ ;;
+ esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5
+$as_echo "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; }
+ if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
+ test "x$ax_pthread_special_flags_added" != "xyes"; then :
+ PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
+ ax_pthread_special_flags_added=yes
+fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5
$as_echo_n "checking for PTHREAD_PRIO_INHERIT... " >&6; }
if ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then :
$as_echo_n "(cached) " >&6
else
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <pthread.h>
int
@@ -25310,23 +25563,26 @@
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5
$as_echo "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; }
- if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"; then :
+ if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
+ test "x$ax_pthread_prio_inherit_defined" != "xyes"; then :
$as_echo "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h
+ ax_pthread_prio_inherit_defined=yes
+
fi
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
# More AIX lossage: compile with *_r variant
- if test "x$GCC" != xyes; then
+ if test "x$GCC" != "xyes"; then
case $host_os in
aix*)
case "x/$CC" in #(
x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) :
#handle absolute path differently from PATH based program lookup
- case "x$CC" in #(
+ case "x$CC" in #(
x/*) :
if as_fn_executable_p ${CC}_r; then :
PTHREAD_CC="${CC}_r"
@@ -25391,7 +25647,7 @@
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
-if test x"$ax_pthread_ok" = xyes; then
+if test "x$ax_pthread_ok" = "xyes"; then
$as_echo "#define HAVE_PTHREAD 1" >>confdefs.h
@@ -27036,6 +27292,292 @@
+
+ which="gstreamer-video-$GST_API_VERSION"
+ required=$GST_REQ
+
+
+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-audio-$GST_API_VERSION"
+ required=$GST_REQ
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_AUDIO" >&5
+$as_echo_n "checking for GST_AUDIO... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$GST_AUDIO_CFLAGS"; then
+ pkg_cv_GST_AUDIO_CFLAGS="$GST_AUDIO_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_AUDIO_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_AUDIO_LIBS"; then
+ pkg_cv_GST_AUDIO_LIBS="$GST_AUDIO_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_AUDIO_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_AUDIO_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
+ else
+ GST_AUDIO_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$GST_AUDIO_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+ HAVE_GST_AUDIO="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$GST_AUDIO_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_AUDIO_PKG_ERRORS" >&5
+$as_echo "$as_me: $GST_AUDIO_PKG_ERRORS" >&6;}
+ fi
+
+elif test $pkg_failed = untried; then
+
+ HAVE_GST_AUDIO="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$GST_AUDIO_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_AUDIO_PKG_ERRORS" >&5
+$as_echo "$as_me: $GST_AUDIO_PKG_ERRORS" >&6;}
+ fi
+
+else
+ GST_AUDIO_CFLAGS=$pkg_cv_GST_AUDIO_CFLAGS
+ GST_AUDIO_LIBS=$pkg_cv_GST_AUDIO_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+ HAVE_GST_AUDIO="yes"
+
+fi
+
+
+
+ which="gstreamer-pbutils-$GST_API_VERSION"
+ required=$GST_REQ
+
+
+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
+
+
+
if test "x$HAVE_GST_CHECK" = "xyes"; then
HAVE_GST_CHECK_TRUE=
HAVE_GST_CHECK_FALSE='#'
@@ -28127,12 +28669,12 @@
pkg_cv_GRAPHENE_CFLAGS="$GRAPHENE_CFLAGS"
else
if test -n "$PKG_CONFIG" && \
- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"graphene-1.0 >= 1.0.0\""; } >&5
- ($PKG_CONFIG --exists --print-errors "graphene-1.0 >= 1.0.0") 2>&5
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"graphene-1.0 >= 1.4.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "graphene-1.0 >= 1.4.0") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
- pkg_cv_GRAPHENE_CFLAGS=`$PKG_CONFIG --cflags "graphene-1.0 >= 1.0.0" 2>/dev/null`
+ pkg_cv_GRAPHENE_CFLAGS=`$PKG_CONFIG --cflags "graphene-1.0 >= 1.4.0" 2>/dev/null`
else
pkg_failed=yes
fi
@@ -28145,12 +28687,12 @@
pkg_cv_GRAPHENE_LIBS="$GRAPHENE_LIBS"
else
if test -n "$PKG_CONFIG" && \
- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"graphene-1.0 >= 1.0.0\""; } >&5
- ($PKG_CONFIG --exists --print-errors "graphene-1.0 >= 1.0.0") 2>&5
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"graphene-1.0 >= 1.4.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "graphene-1.0 >= 1.4.0") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
- pkg_cv_GRAPHENE_LIBS=`$PKG_CONFIG --libs "graphene-1.0 >= 1.0.0" 2>/dev/null`
+ pkg_cv_GRAPHENE_LIBS=`$PKG_CONFIG --libs "graphene-1.0 >= 1.4.0" 2>/dev/null`
else
pkg_failed=yes
fi
@@ -28169,9 +28711,9 @@
_pkg_short_errors_supported=no
fi
if test $_pkg_short_errors_supported = yes; then
- GRAPHENE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "graphene-1.0 >= 1.0.0"`
+ GRAPHENE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "graphene-1.0 >= 1.4.0"`
else
- GRAPHENE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "graphene-1.0 >= 1.0.0"`
+ GRAPHENE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "graphene-1.0 >= 1.4.0"`
fi
# Put the nasty error message in config.log where it belongs
echo "$GRAPHENE_PKG_ERRORS" >&5
@@ -28985,6 +29527,10 @@
fi
+if test x$enable_static = xyes -a x$enable_shared = xno; then
+ GST_STATIC_CFLAGS="-DGST_STATIC_COMPILATION"
+fi
+
# Check whether --with-player-tests was given.
if test "${with_player_tests+set}" = set; then :
@@ -30210,10 +30756,11 @@
sdi tta \
videomeasure \
linsys \
- apexsink dc1394 \
- musepack nas sdl timidity \
+ apexsink \
+ nas sdl timidity \
wininet \
- xvid lv2 sndio libvisual"
+ xvid sndio libvisual"
+
@@ -32797,6 +33344,49 @@
+ GST_PLUGINS_ALL="$GST_PLUGINS_ALL timecode"
+
+
+
+ # Check whether --enable-timecode was given.
+if test "${enable_timecode+set}" = set; then :
+ enableval=$enable_timecode;
+ case "${enableval}" in
+ yes) gst_use_timecode=yes ;;
+ no) gst_use_timecode=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-timecode" "$LINENO" 5 ;;
+ esac
+
+else
+ gst_use_timecode=yes
+fi
+
+ if test x$gst_use_timecode = xno; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin timecode" >&5
+$as_echo "$as_me: disabling dependency-less plugin timecode" >&6;}
+ WITHOUT_PLUGINS="$WITHOUT_PLUGINS timecode"
+ fi
+
+
+ if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " timecode " > /dev/null; then
+ GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED timecode"
+ fi
+ if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " timecode " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ timecode / /'`
+ fi
+ if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " timecode " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ timecode / /'`
+ fi
+ if echo " $GST_PLUGINS_SELECTED " | grep -i " timecode " > /dev/null; then
+ USE_PLUGIN_TIMECODE_TRUE=
+ USE_PLUGIN_TIMECODE_FALSE='#'
+else
+ USE_PLUGIN_TIMECODE_TRUE='#'
+ USE_PLUGIN_TIMECODE_FALSE=
+fi
+
+
+
GST_PLUGINS_ALL="$GST_PLUGINS_ALL tta"
@@ -33166,6 +33756,14 @@
fi
+ac_fn_c_check_header_preproc "$LINENO" "QTKit/QTKit.h" "ac_cv_header_QTKit_QTKit_h"
+if test "x$ac_cv_header_QTKit_QTKit_h" = xyes; then :
+ HAVE_QTKIT="yes"
+else
+ HAVE_QTKIT="no"
+fi
+
+
if test "x$HAVE_VIDEOTOOLBOX" = "xyes"; then
old_LIBS=$LIBS
@@ -33224,6 +33822,19 @@
fi
+ if test "x$HAVE_QTKIT" = "xyes"; then
+ HAVE_QTKIT_TRUE=
+ HAVE_QTKIT_FALSE='#'
+else
+ HAVE_QTKIT_TRUE='#'
+ HAVE_QTKIT_FALSE=
+fi
+
+if test "x$HAVE_QTKIT" = "xyes"; then
+
+$as_echo "#define HAVE_QTKIT 1" >>confdefs.h
+
+fi
for ac_header in sys/socket.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default"
@@ -33530,6 +34141,7 @@
HAVE_GL=no
HAVE_GLES2=no
+HAVE_GLES3_H=no
HAVE_WAYLAND_EGL=no
HAVE_EGL_RPI=no
@@ -33938,6 +34550,12 @@
fi
+ ac_fn_c_check_header_mongrel "$LINENO" "GLES3/gl3.h" "ac_cv_header_GLES3_gl3_h" "$ac_includes_default"
+if test "x$ac_cv_header_GLES3_gl3_h" = xyes; then :
+ HAVE_GLES3_H=yes
+fi
+
+
fi
if test "x$NEED_EGL" != "xno"; then
@@ -34490,6 +35108,17 @@
$as_echo "yes" >&6; }
HAVE_WAYLAND_EGL=yes
fi
+
+ # OS X and iOS always have GL available
+ case $host in
+ *-darwin*)
+ if test "x$HAVE_IOS" = "xyes"; then
+ HAVE_GLES2=yes
+ else
+ HAVE_GL=yes
+ fi
+ ;;
+ esac
;;
esac
@@ -34654,6 +35283,10 @@
fi
if test "x$HAVE_GL" = "xyes" -a "x$HAVE_GLES2" = "xyes"; then
+ GLES3_H_DEFINE=0
+ if test "x$HAVE_GLES3_H" == "xyes"; then
+ GLES3_H_DEFINE=1
+ fi
GL_INCLUDES="
#ifdef __GNUC__
# pragma GCC diagnostic push
@@ -34666,8 +35299,13 @@
# include <OpenGLES/ES2/gl.h>
# include <OpenGLES/ES2/glext.h>
# else
-# include <GLES2/gl2.h>
-# include <GLES2/gl2ext.h>
+# if $GLES3_H_DEFINE
+# include <GLES3/gl3.h>
+# include <GLES3/gl3ext.h>
+# else
+# include <GLES2/gl2.h>
+# include <GLES2/gl2ext.h>
+# endif
# endif
# ifdef __APPLE__
# include <OpenGL/OpenGL.h>
@@ -34711,6 +35349,7 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Disabling GL|ES 2.0 support" >&5
$as_echo "$as_me: WARNING: Disabling GL|ES 2.0 support" >&2;}
HAVE_GLES2=no
+ HAVE_GLES3_H=no
fi
fi
@@ -34952,6 +35591,9 @@
if test "x$USE_GLES2" = "xyes"; then
GL_APIS="gles2 $GL_APIS"
GST_GL_HAVE_GLES2=1
+ if test "x$HAVE_GLES3_H" = "xyes"; then
+ GST_GL_HAVE_GLES3=1
+ fi
fi
GL_CONFIG_DEFINES="$GL_CONFIG_DEFINES
@@ -35239,8 +35881,13 @@
# include <OpenGLES/ES2/gl.h>
# include <OpenGLES/ES2/glext.h>
# else
-# include <GLES2/gl2.h>
-# include <GLES2/gl2ext.h>
+# if $GST_GL_HAVE_GLES3
+# include <GLES3/gl3.h>
+# include <GLES3/gl3ext.h>
+# else
+# include <GLES2/gl2.h>
+# include <GLES2/gl2ext.h>
+# endif
# endif
"
fi
@@ -35266,6 +35913,7 @@
GST_GL_HAVE_GLSYNC=0
GST_GL_HAVE_GLUINT64=0
GST_GL_HAVE_GLINT64=0
+GST_GL_HAVE_EGLATTRIB=0
old_CFLAGS=$CFLAGS
CFLAGS="$GL_CFLAGS $CFLAGS"
@@ -35375,6 +36023,27 @@
GST_GL_HAVE_GLINT64=1
fi
+if test "x$USE_EGL" = "xyes"; then
+ EGL_INCLUDES="$GL_INCLUDES
+ #include <EGL/egl.h>
+ #include <EGL/eglext.h>
+ "
+ ac_fn_c_check_type "$LINENO" "EGLAttrib" "ac_cv_type_EGLAttrib" "$EGL_INCLUDES
+"
+if test "x$ac_cv_type_EGLAttrib" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_EGLATTRIB 1
+_ACEOF
+
+
+fi
+
+ if test "x$ac_cv_type_EGLAttrib" = "xyes"; then
+ GST_GL_HAVE_EGLATTRIB=1
+ fi
+fi
+
CFLAGS=$old_CFLAGS
GL_CONFIG_DEFINES="$GL_CONFIG_DEFINES
@@ -35385,6 +36054,7 @@
#define GST_GL_HAVE_GLSYNC $GST_GL_HAVE_GLSYNC
#define GST_GL_HAVE_GLUINT64 $GST_GL_HAVE_GLUINT64
#define GST_GL_HAVE_GLINT64 $GST_GL_HAVE_GLINT64
+#define GST_GL_HAVE_EGLATTRIB $GST_GL_HAVE_EGLATTRIB
"
ac_config_commands="$ac_config_commands gst-libs/gst/gl/gstglconfig.h"
@@ -35599,8 +36269,6 @@
fi
-VULKAN_CONFIG_DEFINES=""
-
pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XCB" >&5
@@ -35662,18 +36330,17 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
- HAVE_XCB=no
+ GST_VULKAN_HAVE_WINDOW_XCB=0
elif test $pkg_failed = untried; then
- HAVE_XCB=no
+ GST_VULKAN_HAVE_WINDOW_XCB=0
else
XCB_CFLAGS=$pkg_cv_XCB_CFLAGS
XCB_LIBS=$pkg_cv_XCB_LIBS
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
- HAVE_XCB=yes
+ GST_VULKAN_HAVE_WINDOW_XCB=1
fi
-
- if test "x$HAVE_XCB" = "xyes"; then
+ if test "x$GST_VULKAN_HAVE_WINDOW_XCB" = "x1"; then
USE_XCB_TRUE=
USE_XCB_FALSE='#'
else
@@ -35681,10 +36348,89 @@
USE_XCB_FALSE=
fi
-if test "x$HAVE_XCB" = "xyes"; then
- VULKAN_CONFIG_DEFINES="$VULKAN_CONFIG_DEFINES
- #define GST_VULKAN_HAVE_WINDOW_XCB 1"
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for WAYLAND" >&5
+$as_echo_n "checking for WAYLAND... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$WAYLAND_CFLAGS"; then
+ pkg_cv_WAYLAND_CFLAGS="$WAYLAND_CFLAGS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wayland-client >= 1.4\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "wayland-client >= 1.4") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_WAYLAND_CFLAGS=`$PKG_CONFIG --cflags "wayland-client >= 1.4" 2>/dev/null`
+else
+ pkg_failed=yes
fi
+ fi
+else
+ pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+ if test -n "$WAYLAND_LIBS"; then
+ pkg_cv_WAYLAND_LIBS="$WAYLAND_LIBS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wayland-client >= 1.4\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "wayland-client >= 1.4") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_WAYLAND_LIBS=`$PKG_CONFIG --libs "wayland-client >= 1.4" 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
+ WAYLAND_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "wayland-client >= 1.4"`
+ else
+ WAYLAND_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "wayland-client >= 1.4"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$WAYLAND_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ GST_VULKAN_HAVE_WINDOW_WAYLAND=0
+elif test $pkg_failed = untried; then
+ GST_VULKAN_HAVE_WINDOW_WAYLAND=0
+else
+ WAYLAND_CFLAGS=$pkg_cv_WAYLAND_CFLAGS
+ WAYLAND_LIBS=$pkg_cv_WAYLAND_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ GST_VULKAN_HAVE_WINDOW_WAYLAND=1
+fi
+ if test "x$GST_VULKAN_HAVE_WINDOW_WAYLAND" = "x1"; then
+ USE_WAYLAND_TRUE=
+ USE_WAYLAND_FALSE='#'
+else
+ USE_WAYLAND_TRUE='#'
+ USE_WAYLAND_FALSE=
+fi
+
+VULKAN_CONFIG_DEFINES="
+#define GST_VULKAN_HAVE_WINDOW_XCB $GST_VULKAN_HAVE_WINDOW_XCB
+#define GST_VULKAN_HAVE_WINDOW_WAYLAND $GST_VULKAN_HAVE_WINDOW_WAYLAND"
ac_config_commands="$ac_config_commands ext/vulkan/vkconfig.h"
@@ -37664,196 +38410,6 @@
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 :
@@ -41229,14 +41785,89 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
- if test "x$wayland_scanner" != "x"; then
- HAVE_WAYLAND="yes"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: wayland-scanner is required to build the wayland plugin" >&5
-$as_echo "wayland-scanner is required to build the wayland plugin" >&6; }
- HAVE_WAYLAND="no"
- fi
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for WAYLAND_PROTOCOLS" >&5
+$as_echo_n "checking for WAYLAND_PROTOCOLS... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$WAYLAND_PROTOCOLS_CFLAGS"; then
+ pkg_cv_WAYLAND_PROTOCOLS_CFLAGS="$WAYLAND_PROTOCOLS_CFLAGS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wayland-protocols >= 1.4\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "wayland-protocols >= 1.4") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_WAYLAND_PROTOCOLS_CFLAGS=`$PKG_CONFIG --cflags "wayland-protocols >= 1.4" 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ fi
+else
+ pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+ if test -n "$WAYLAND_PROTOCOLS_LIBS"; then
+ pkg_cv_WAYLAND_PROTOCOLS_LIBS="$WAYLAND_PROTOCOLS_LIBS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wayland-protocols >= 1.4\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "wayland-protocols >= 1.4") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_WAYLAND_PROTOCOLS_LIBS=`$PKG_CONFIG --libs "wayland-protocols >= 1.4" 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
+ WAYLAND_PROTOCOLS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "wayland-protocols >= 1.4"`
+ else
+ WAYLAND_PROTOCOLS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "wayland-protocols >= 1.4"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$WAYLAND_PROTOCOLS_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ HAVE_WAYLAND="no"
+
+elif test $pkg_failed = untried; then
+ HAVE_WAYLAND="no"
+
+else
+ WAYLAND_PROTOCOLS_CFLAGS=$pkg_cv_WAYLAND_PROTOCOLS_CFLAGS
+ WAYLAND_PROTOCOLS_LIBS=$pkg_cv_WAYLAND_PROTOCOLS_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+ if test "x$wayland_scanner" != "x"; then
+ HAVE_WAYLAND="yes"
+ WAYLAND_PROTOCOLS_DATADIR=`$PKG_CONFIG --variable=pkgdatadir wayland-protocols`
+
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: wayland-scanner is required to build the wayland plugin" >&5
+$as_echo "wayland-scanner is required to build the wayland plugin" >&6; }
+ HAVE_WAYLAND="no"
+ fi
+
+fi
fi
@@ -42435,6 +43066,169 @@
echo
+{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: fdkaac plugin ***" >&5
+$as_echo "$as_me: *** checking feature: fdkaac plugin ***" >&6;}
+if test "xfdkaac" != "x"
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: fdkaac ***" >&5
+$as_echo "$as_me: *** for plug-ins: fdkaac ***" >&6;}
+fi
+NOUSE=
+if test "x$USE_FDK_AAC" = "xno"; then
+ NOUSE="yes"
+fi
+# Check whether --enable-fdk_aac was given.
+if test "${enable_fdk_aac+set}" = set; then :
+ enableval=$enable_fdk_aac; case "${enableval}" in
+ yes) USE_FDK_AAC=yes;;
+ no) USE_FDK_AAC=no;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-fdk_aac" "$LINENO" 5 ;;
+ esac
+else
+ USE_FDK_AAC=yes
+fi
+
+if test "x$NOUSE" = "xyes"; then
+ USE_FDK_AAC="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** fdkaac pre-configured not to be built" >&5
+$as_echo "$as_me: WARNING: *** fdkaac pre-configured not to be built" >&2;}
+fi
+NOUSE=
+
+if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " FDK_AAC " > /dev/null; then
+ USE_FDK_AAC="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** fdkaac not ported" >&5
+$as_echo "$as_me: WARNING: *** fdkaac not ported" >&2;}
+fi
+
+
+if test x$USE_FDK_AAC = 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_FDK_AAC=no
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FDK_AAC" >&5
+$as_echo_n "checking for FDK_AAC... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$FDK_AAC_CFLAGS"; then
+ pkg_cv_FDK_AAC_CFLAGS="$FDK_AAC_CFLAGS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fdk-aac\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "fdk-aac") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_FDK_AAC_CFLAGS=`$PKG_CONFIG --cflags "fdk-aac" 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ fi
+else
+ pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+ if test -n "$FDK_AAC_LIBS"; then
+ pkg_cv_FDK_AAC_LIBS="$FDK_AAC_LIBS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fdk-aac\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "fdk-aac") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_FDK_AAC_LIBS=`$PKG_CONFIG --libs "fdk-aac" 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
+ FDK_AAC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "fdk-aac"`
+ else
+ FDK_AAC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "fdk-aac"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$FDK_AAC_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+ HAVE_FDK_AAC="no"
+
+elif test $pkg_failed = untried; then
+
+ HAVE_FDK_AAC="no"
+
+else
+ FDK_AAC_CFLAGS=$pkg_cv_FDK_AAC_CFLAGS
+ FDK_AAC_LIBS=$pkg_cv_FDK_AAC_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ HAVE_FDK_AAC="yes"
+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_FDK_AAC = xno; then
+ USE_FDK_AAC=no
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: fdkaac" >&5
+$as_echo "$as_me: *** These plugins will be built: fdkaac" >&6;}
+ fi
+fi
+if test x$USE_FDK_AAC = xyes; then
+ :
+ if test "xfdkaac" != "x"; then
+ GST_PLUGINS_YES="\tfdkaac\n$GST_PLUGINS_YES"
+ fi
+
+$as_echo "#define HAVE_FDK_AAC /**/" >>confdefs.h
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: fdkaac" >&5
+$as_echo "$as_me: *** These plugins will not be built: fdkaac" >&6;}
+ if test "xfdkaac" != "x"; then
+ GST_PLUGINS_NO="\tfdkaac\n$GST_PLUGINS_NO"
+ fi
+ :
+fi
+ if test x$USE_FDK_AAC = xyes; then
+ USE_FDK_AAC_TRUE=
+ USE_FDK_AAC_FALSE='#'
+else
+ USE_FDK_AAC_TRUE='#'
+ USE_FDK_AAC_FALSE=
+fi
+
+
+
+echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Flite plugin ***" >&5
$as_echo "$as_me: *** checking feature: Flite plugin ***" >&6;}
if test "xflite" != "x"
@@ -43238,6 +44032,260 @@
echo
+{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: drm/kms libraries ***" >&5
+$as_echo "$as_me: *** checking feature: drm/kms libraries ***" >&6;}
+if test "xkms" != "x"
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: kms ***" >&5
+$as_echo "$as_me: *** for plug-ins: kms ***" >&6;}
+fi
+NOUSE=
+if test "x$USE_KMS" = "xno"; then
+ NOUSE="yes"
+fi
+# Check whether --enable-kms was given.
+if test "${enable_kms+set}" = set; then :
+ enableval=$enable_kms; case "${enableval}" in
+ yes) USE_KMS=yes;;
+ no) USE_KMS=no;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-kms" "$LINENO" 5 ;;
+ esac
+else
+ USE_KMS=yes
+fi
+
+if test "x$NOUSE" = "xyes"; then
+ USE_KMS="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** kms pre-configured not to be built" >&5
+$as_echo "$as_me: WARNING: *** kms pre-configured not to be built" >&2;}
+fi
+NOUSE=
+
+if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " KMS " > /dev/null; then
+ USE_KMS="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** kms not ported" >&5
+$as_echo "$as_me: WARNING: *** kms not ported" >&2;}
+fi
+
+
+if test x$USE_KMS = 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_KMS=no
+
+
+ which="gstreamer-allocators-1.0"
+ required="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 \"\$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_ALLOCATORS_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_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 \"\$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_ALLOCATORS_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_ALLOCATORS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
+ else
+ GST_ALLOCATORS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$GST_ALLOCATORS_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+ HAVE_GST_ALLOCATORS="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$GST_ALLOCATORS_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_ALLOCATORS_PKG_ERRORS" >&5
+$as_echo "$as_me: $GST_ALLOCATORS_PKG_ERRORS" >&6;}
+ fi
+
+elif test $pkg_failed = untried; then
+
+ HAVE_GST_ALLOCATORS="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$GST_ALLOCATORS_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_ALLOCATORS_PKG_ERRORS" >&5
+$as_echo "$as_me: $GST_ALLOCATORS_PKG_ERRORS" >&6;}
+ fi
+
+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
+
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for DRM" >&5
+$as_echo_n "checking for DRM... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$DRM_CFLAGS"; then
+ pkg_cv_DRM_CFLAGS="$DRM_CFLAGS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libdrm >= 2.4.55 libkms\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libdrm >= 2.4.55 libkms") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_DRM_CFLAGS=`$PKG_CONFIG --cflags "libdrm >= 2.4.55 libkms" 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ fi
+else
+ pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+ if test -n "$DRM_LIBS"; then
+ pkg_cv_DRM_LIBS="$DRM_LIBS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libdrm >= 2.4.55 libkms\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libdrm >= 2.4.55 libkms") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_DRM_LIBS=`$PKG_CONFIG --libs "libdrm >= 2.4.55 libkms" 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
+ DRM_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libdrm >= 2.4.55 libkms"`
+ else
+ DRM_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libdrm >= 2.4.55 libkms"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$DRM_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ HAVE_KMS=no
+elif test $pkg_failed = untried; then
+ HAVE_KMS=no
+else
+ DRM_CFLAGS=$pkg_cv_DRM_CFLAGS
+ DRM_LIBS=$pkg_cv_DRM_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ HAVE_KMS=yes
+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_KMS = xno; then
+ USE_KMS=no
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: kms" >&5
+$as_echo "$as_me: *** These plugins will be built: kms" >&6;}
+ fi
+fi
+if test x$USE_KMS = xyes; then
+ :
+ if test "xkms" != "x"; then
+ GST_PLUGINS_YES="\tkms\n$GST_PLUGINS_YES"
+ fi
+
+$as_echo "#define HAVE_KMS /**/" >>confdefs.h
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: kms" >&5
+$as_echo "$as_me: *** These plugins will not be built: kms" >&6;}
+ if test "xkms" != "x"; then
+ GST_PLUGINS_NO="\tkms\n$GST_PLUGINS_NO"
+ fi
+ :
+fi
+ if test x$USE_KMS = xyes; then
+ USE_KMS_TRUE=
+ USE_KMS_FALSE='#'
+else
+ USE_KMS_TRUE='#'
+ USE_KMS_FALSE=
+fi
+
+
+
+echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: ladspa ***" >&5
$as_echo "$as_me: *** checking feature: ladspa ***" >&6;}
if test "xladspa" != "x"
@@ -43461,20 +44509,20 @@
pkg_failed=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SLV2" >&5
-$as_echo_n "checking for SLV2... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LILV" >&5
+$as_echo_n "checking for LILV... " >&6; }
if test -n "$PKG_CONFIG"; then
- if test -n "$SLV2_CFLAGS"; then
- pkg_cv_SLV2_CFLAGS="$SLV2_CFLAGS"
+ if test -n "$LILV_CFLAGS"; then
+ pkg_cv_LILV_CFLAGS="$LILV_CFLAGS"
else
if test -n "$PKG_CONFIG" && \
- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"slv2 >= 0.6.6\""; } >&5
- ($PKG_CONFIG --exists --print-errors "slv2 >= 0.6.6") 2>&5
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lilv-0 >= 0.22\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "lilv-0 >= 0.22") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
- pkg_cv_SLV2_CFLAGS=`$PKG_CONFIG --cflags "slv2 >= 0.6.6" 2>/dev/null`
+ pkg_cv_LILV_CFLAGS=`$PKG_CONFIG --cflags "lilv-0 >= 0.22" 2>/dev/null`
else
pkg_failed=yes
fi
@@ -43483,16 +44531,16 @@
pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
- if test -n "$SLV2_LIBS"; then
- pkg_cv_SLV2_LIBS="$SLV2_LIBS"
+ if test -n "$LILV_LIBS"; then
+ pkg_cv_LILV_LIBS="$LILV_LIBS"
else
if test -n "$PKG_CONFIG" && \
- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"slv2 >= 0.6.6\""; } >&5
- ($PKG_CONFIG --exists --print-errors "slv2 >= 0.6.6") 2>&5
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lilv-0 >= 0.22\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "lilv-0 >= 0.22") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
- pkg_cv_SLV2_LIBS=`$PKG_CONFIG --libs "slv2 >= 0.6.6" 2>/dev/null`
+ pkg_cv_LILV_LIBS=`$PKG_CONFIG --libs "lilv-0 >= 0.22" 2>/dev/null`
else
pkg_failed=yes
fi
@@ -43511,12 +44559,74 @@
_pkg_short_errors_supported=no
fi
if test $_pkg_short_errors_supported = yes; then
- SLV2_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "slv2 >= 0.6.6"`
+ LILV_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "lilv-0 >= 0.22"`
else
- SLV2_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "slv2 >= 0.6.6"`
+ LILV_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "lilv-0 >= 0.22"`
fi
# Put the nasty error message in config.log where it belongs
- echo "$SLV2_PKG_ERRORS" >&5
+ echo "$LILV_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 LILV" >&5
+$as_echo_n "checking for LILV... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$LILV_CFLAGS"; then
+ pkg_cv_LILV_CFLAGS="$LILV_CFLAGS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lilv-0 >= 0.16\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "lilv-0 >= 0.16") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_LILV_CFLAGS=`$PKG_CONFIG --cflags "lilv-0 >= 0.16" 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ fi
+else
+ pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+ if test -n "$LILV_LIBS"; then
+ pkg_cv_LILV_LIBS="$LILV_LIBS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lilv-0 >= 0.16\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "lilv-0 >= 0.16") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_LILV_LIBS=`$PKG_CONFIG --libs "lilv-0 >= 0.16" 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
+ LILV_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "lilv-0 >= 0.16"`
+ else
+ LILV_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "lilv-0 >= 0.16"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$LILV_PKG_ERRORS" >&5
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
@@ -43524,13 +44634,101 @@
elif test $pkg_failed = untried; then
HAVE_LV2="no"
else
- SLV2_CFLAGS=$pkg_cv_SLV2_CFLAGS
- SLV2_LIBS=$pkg_cv_SLV2_LIBS
+ LILV_CFLAGS=$pkg_cv_LILV_CFLAGS
+ LILV_LIBS=$pkg_cv_LILV_LIBS
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
HAVE_LV2="yes"
fi
+elif test $pkg_failed = untried; then
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LILV" >&5
+$as_echo_n "checking for LILV... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$LILV_CFLAGS"; then
+ pkg_cv_LILV_CFLAGS="$LILV_CFLAGS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lilv-0 >= 0.16\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "lilv-0 >= 0.16") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_LILV_CFLAGS=`$PKG_CONFIG --cflags "lilv-0 >= 0.16" 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ fi
+else
+ pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+ if test -n "$LILV_LIBS"; then
+ pkg_cv_LILV_LIBS="$LILV_LIBS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lilv-0 >= 0.16\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "lilv-0 >= 0.16") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_LILV_LIBS=`$PKG_CONFIG --libs "lilv-0 >= 0.16" 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
+ LILV_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "lilv-0 >= 0.16"`
+ else
+ LILV_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "lilv-0 >= 0.16"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$LILV_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ HAVE_LV2="no"
+elif test $pkg_failed = untried; then
+ HAVE_LV2="no"
+else
+ LILV_CFLAGS=$pkg_cv_LILV_CFLAGS
+ LILV_LIBS=$pkg_cv_LILV_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ HAVE_LV2="yes"
+fi
+
+else
+ LILV_CFLAGS=$pkg_cv_LILV_CFLAGS
+ LILV_LIBS=$pkg_cv_LILV_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+ HAVE_LV2="yes",
+ HAVE_LILV_0_22="yes"
+
+$as_echo "#define HAVE_LILV_0_22 1" >>confdefs.h
+
+
+fi
+
@@ -46250,12 +47448,12 @@
pkg_cv_OPENCV_CFLAGS="$OPENCV_CFLAGS"
else
if test -n "$PKG_CONFIG" && \
- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"opencv >= 2.3.0 opencv < 2.5.0 \""; } >&5
- ($PKG_CONFIG --exists --print-errors "opencv >= 2.3.0 opencv < 2.5.0 ") 2>&5
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"opencv >= 2.3.0 opencv <= 3.1.0 \""; } >&5
+ ($PKG_CONFIG --exists --print-errors "opencv >= 2.3.0 opencv <= 3.1.0 ") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
- pkg_cv_OPENCV_CFLAGS=`$PKG_CONFIG --cflags "opencv >= 2.3.0 opencv < 2.5.0 " 2>/dev/null`
+ pkg_cv_OPENCV_CFLAGS=`$PKG_CONFIG --cflags "opencv >= 2.3.0 opencv <= 3.1.0 " 2>/dev/null`
else
pkg_failed=yes
fi
@@ -46268,12 +47466,12 @@
pkg_cv_OPENCV_LIBS="$OPENCV_LIBS"
else
if test -n "$PKG_CONFIG" && \
- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"opencv >= 2.3.0 opencv < 2.5.0 \""; } >&5
- ($PKG_CONFIG --exists --print-errors "opencv >= 2.3.0 opencv < 2.5.0 ") 2>&5
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"opencv >= 2.3.0 opencv <= 3.1.0 \""; } >&5
+ ($PKG_CONFIG --exists --print-errors "opencv >= 2.3.0 opencv <= 3.1.0 ") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
- pkg_cv_OPENCV_LIBS=`$PKG_CONFIG --libs "opencv >= 2.3.0 opencv < 2.5.0 " 2>/dev/null`
+ pkg_cv_OPENCV_LIBS=`$PKG_CONFIG --libs "opencv >= 2.3.0 opencv <= 3.1.0 " 2>/dev/null`
else
pkg_failed=yes
fi
@@ -46292,9 +47490,9 @@
_pkg_short_errors_supported=no
fi
if test $_pkg_short_errors_supported = yes; then
- OPENCV_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "opencv >= 2.3.0 opencv < 2.5.0 "`
+ OPENCV_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "opencv >= 2.3.0 opencv <= 3.1.0 "`
else
- OPENCV_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "opencv >= 2.3.0 opencv < 2.5.0 "`
+ OPENCV_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "opencv >= 2.3.0 opencv <= 3.1.0 "`
fi
# Put the nasty error message in config.log where it belongs
echo "$OPENCV_PKG_ERRORS" >&5
@@ -46708,15 +47906,11 @@
OLD_CPPFLAGS=$CPPFLAGS
CPPFLAGS=$OPENCV_CFLAGS
something_not_found=no
- for ac_header in opencv2/contrib/contrib.hpp \
- opencv2/core/core_c.h \
- opencv2/core/types_c.h \
+ for ac_header in opencv2/core/core_c.h \
opencv2/core/version.hpp \
opencv2/highgui/highgui_c.h \
opencv2/imgproc/imgproc.hpp \
opencv2/imgproc/imgproc_c.h \
- opencv2/legacy/compat.hpp \
- opencv2/legacy/legacy.hpp \
opencv2/objdetect/objdetect.hpp \
opencv2/video/background_segm.hpp
do :
@@ -49674,7 +50868,6 @@
HAVE_VULKAN=no
- HAVE_VULKAN=no
ac_fn_c_check_header_mongrel "$LINENO" "vulkan/vulkan.h" "ac_cv_header_vulkan_vulkan_h" "$ac_includes_default"
if test "x$ac_cv_header_vulkan_vulkan_h" = xyes; then :
@@ -49718,8 +50911,11 @@
VULKAN_LIBS="-lvulkan"
- if test "x$HAVE_XCB" = "xyes"; then
- HAVE_VULKAN=yes
+ if test "x$GST_VULKAN_HAVE_WINDOW_XCB" = "x1"; then
+ HAVE_VULKAN="yes"
+ fi
+ if test "x$GST_VULKAN_HAVE_WINDOW_WAYLAND" = "x1"; then
+ HAVE_VULKAN="yes"
fi
fi
@@ -57188,6 +58384,317 @@
+echo
+{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: WebRTC Audio Processing ***" >&5
+$as_echo "$as_me: *** checking feature: WebRTC Audio Processing ***" >&6;}
+if test "xwebrtcdsp" != "x"
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: webrtcdsp ***" >&5
+$as_echo "$as_me: *** for plug-ins: webrtcdsp ***" >&6;}
+fi
+NOUSE=
+if test "x$USE_WEBRTCDSP" = "xno"; then
+ NOUSE="yes"
+fi
+# Check whether --enable-webrtcdsp was given.
+if test "${enable_webrtcdsp+set}" = set; then :
+ enableval=$enable_webrtcdsp; case "${enableval}" in
+ yes) USE_WEBRTCDSP=yes;;
+ no) USE_WEBRTCDSP=no;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-webrtcdsp" "$LINENO" 5 ;;
+ esac
+else
+ USE_WEBRTCDSP=yes
+fi
+
+if test "x$NOUSE" = "xyes"; then
+ USE_WEBRTCDSP="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** webrtcdsp pre-configured not to be built" >&5
+$as_echo "$as_me: WARNING: *** webrtcdsp pre-configured not to be built" >&2;}
+fi
+NOUSE=
+
+if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " WEBRTCDSP " > /dev/null; then
+ USE_WEBRTCDSP="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** webrtcdsp not ported" >&5
+$as_echo "$as_me: WARNING: *** webrtcdsp not ported" >&2;}
+fi
+
+
+if test x$USE_WEBRTCDSP = 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_WEBRTCDSP=no
+
+
+
+ which="webrtc-audio-processing >= 0.2 webrtc-audio-processing < 0.4"
+ required="no"
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for WEBRTCDSP" >&5
+$as_echo_n "checking for WEBRTCDSP... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$WEBRTCDSP_CFLAGS"; then
+ pkg_cv_WEBRTCDSP_CFLAGS="$WEBRTCDSP_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_WEBRTCDSP_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 "$WEBRTCDSP_LIBS"; then
+ pkg_cv_WEBRTCDSP_LIBS="$WEBRTCDSP_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_WEBRTCDSP_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
+ WEBRTCDSP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
+ else
+ WEBRTCDSP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$WEBRTCDSP_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+ HAVE_WEBRTCDSP="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$WEBRTCDSP_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $WEBRTCDSP_PKG_ERRORS" >&5
+$as_echo "$as_me: $WEBRTCDSP_PKG_ERRORS" >&6;}
+ fi
+
+elif test $pkg_failed = untried; then
+
+ HAVE_WEBRTCDSP="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$WEBRTCDSP_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $WEBRTCDSP_PKG_ERRORS" >&5
+$as_echo "$as_me: $WEBRTCDSP_PKG_ERRORS" >&6;}
+ fi
+
+else
+ WEBRTCDSP_CFLAGS=$pkg_cv_WEBRTCDSP_CFLAGS
+ WEBRTCDSP_LIBS=$pkg_cv_WEBRTCDSP_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+ HAVE_WEBRTCDSP="yes"
+
+fi
+
+
+
+ # On Android, C++ headers comes with the STL implementation
+ case "${host}" in #(
+ *android*) :
+
+
+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_fn_error $? "Package requirements (gnustl) were not met:
+
+$GNUSTL_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 GNUSTL_CFLAGS
+and GNUSTL_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 GNUSTL_CFLAGS
+and GNUSTL_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
+ 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; }
+
+ WEBRTCDSP_CFLAGS="$WEBRTCDSP_CFLAGS $GNUSTL_CFLAGS"
+ WEBRTCDSP_LIBS="$WEBRTCDSP_LIBS $GNUSTL_LIBS"
+fi
+ ;; #(
+ *) :
+ ;;
+esac
+
+
+
+ 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
+
+ old_CPPFLAGS=$CPPFLAGS
+ CPPFLAGS="-std=c++11 $CPPFLAGS $GNUSTL_CFLAGS"
+ ac_fn_cxx_check_header_mongrel "$LINENO" "vector" "ac_cv_header_vector" "$ac_includes_default"
+if test "x$ac_cv_header_vector" = xyes; then :
+
+else
+ HAVE_WEBRTCDSP=no
+fi
+
+
+ CPPFLAGS=$old_CPPFLAGS
+ 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
+
+
+
+ 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_WEBRTCDSP = xno; then
+ USE_WEBRTCDSP=no
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: webrtcdsp" >&5
+$as_echo "$as_me: *** These plugins will be built: webrtcdsp" >&6;}
+ fi
+fi
+if test x$USE_WEBRTCDSP = xyes; then
+ :
+ if test "xwebrtcdsp" != "x"; then
+ GST_PLUGINS_YES="\twebrtcdsp\n$GST_PLUGINS_YES"
+ fi
+
+$as_echo "#define HAVE_WEBRTCDSP /**/" >>confdefs.h
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: webrtcdsp" >&5
+$as_echo "$as_me: *** These plugins will not be built: webrtcdsp" >&6;}
+ if test "xwebrtcdsp" != "x"; then
+ GST_PLUGINS_NO="\twebrtcdsp\n$GST_PLUGINS_NO"
+ fi
+ :
+fi
+ if test x$USE_WEBRTCDSP = xyes; then
+ USE_WEBRTCDSP_TRUE=
+ USE_WEBRTCDSP_FALSE='#'
+else
+ USE_WEBRTCDSP_TRUE='#'
+ USE_WEBRTCDSP_FALSE=
+fi
+
+
+
else
@@ -57368,6 +58875,14 @@
fi
if false; then
+ USE_FDK_AAC_TRUE=
+ USE_FDK_AAC_FALSE='#'
+else
+ USE_FDK_AAC_TRUE='#'
+ USE_FDK_AAC_FALSE=
+fi
+
+ if false; then
USE_FLITE_TRUE=
USE_FLITE_FALSE='#'
else
@@ -57432,6 +58947,14 @@
fi
if false; then
+ USE_KMS_TRUE=
+ USE_KMS_FALSE='#'
+else
+ USE_KMS_TRUE='#'
+ USE_KMS_FALSE=
+fi
+
+ if false; then
USE_TIGER_TRUE=
USE_TIGER_FALSE='#'
else
@@ -57808,6 +59331,14 @@
fi
if false; then
+ USE_WEBRTCDSP_TRUE=
+ USE_WEBRTCDSP_FALSE='#'
+else
+ USE_WEBRTCDSP_TRUE='#'
+ USE_WEBRTCDSP_FALSE=
+fi
+
+ if false; then
USE_OPENH264_TRUE=
USE_OPENH264_FALSE='#'
else
@@ -57831,6 +59362,14 @@
USE_DTLS_FALSE=
fi
+ if false; then
+ USE_VULKAN_TRUE=
+ USE_VULKAN_FALSE='#'
+else
+ USE_VULKAN_TRUE='#'
+ USE_VULKAN_FALSE=
+fi
+
fi
@@ -57854,7 +59393,7 @@
-GST_CFLAGS="$GST_CFLAGS -DGST_USE_UNSTABLE_API"
+GST_CFLAGS="$GST_CFLAGS $GST_STATIC_CFLAGS -DGST_USE_UNSTABLE_API"
GST_CXXFLAGS="$GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CXXFLAGS)"
GST_OBJCFLAGS="$GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_OBJCFLAGS)"
GST_CFLAGS="$GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CFLAGS)"
@@ -57885,7 +59424,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/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/netsim/Makefile gst/nuvdemux/Makefile gst/onvif/Makefile gst/patchdetect/Makefile gst/pcapparse/Makefile gst/pnm/Makefile gst/rawparse/Makefile gst/removesilence/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 gst-libs/gst/audio/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/tinyalsa/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/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/spc/Makefile ext/timidity/Makefile ext/vulkan/Makefile ext/vulkan/xcb/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 pkgconfig/gstreamer-bad-audio.pc pkgconfig/gstreamer-bad-audio-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/netsim/Makefile gst/nuvdemux/Makefile gst/onvif/Makefile gst/patchdetect/Makefile gst/pcapparse/Makefile gst/pnm/Makefile gst/rawparse/Makefile gst/removesilence/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/timecode/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 gst-libs/gst/audio/Makefile sys/Makefile sys/dshowdecwrapper/Makefile sys/acmenc/Makefile sys/acmmp3dec/Makefile sys/androidmedia/Makefile sys/applemedia/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/kms/Makefile sys/linsys/Makefile sys/nvenc/Makefile sys/opensles/Makefile sys/shm/Makefile sys/tinyalsa/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/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/fdkaac/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/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/spc/Makefile ext/timidity/Makefile ext/vulkan/Makefile ext/vulkan/xcb/Makefile ext/vulkan/wayland/Makefile ext/webp/Makefile ext/x265/Makefile ext/xvid/Makefile ext/zbar/Makefile ext/dtls/Makefile ext/webrtcdsp/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 pkgconfig/gstreamer-bad-audio.pc pkgconfig/gstreamer-bad-audio-uninstalled.pc tools/Makefile m4/Makefile"
sed \
@@ -58496,6 +60035,10 @@
as_fn_error $? "conditional \"USE_PLUGIN_STEREO\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${USE_PLUGIN_TIMECODE_TRUE}" && test -z "${USE_PLUGIN_TIMECODE_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PLUGIN_TIMECODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${USE_PLUGIN_TTA_TRUE}" && test -z "${USE_PLUGIN_TTA_FALSE}"; then
as_fn_error $? "conditional \"USE_PLUGIN_TTA\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -58540,6 +60083,10 @@
as_fn_error $? "conditional \"HAVE_VIDEOTOOLBOX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${HAVE_QTKIT_TRUE}" && test -z "${HAVE_QTKIT_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_QTKIT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${USE_PLUGIN_DCCP_TRUE}" && test -z "${USE_PLUGIN_DCCP_FALSE}"; then
as_fn_error $? "conditional \"USE_PLUGIN_DCCP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -58624,6 +60171,10 @@
as_fn_error $? "conditional \"USE_XCB\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${USE_WAYLAND_TRUE}" && test -z "${USE_WAYLAND_FALSE}"; then
+ as_fn_error $? "conditional \"USE_WAYLAND\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${USE_DIRECTSOUND_TRUE}" && test -z "${USE_DIRECTSOUND_FALSE}"; then
as_fn_error $? "conditional \"USE_DIRECTSOUND\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -58780,6 +60331,10 @@
as_fn_error $? "conditional \"USE_FBDEV\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${USE_FDK_AAC_TRUE}" && test -z "${USE_FDK_AAC_FALSE}"; then
+ as_fn_error $? "conditional \"USE_FDK_AAC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${USE_FLITE_TRUE}" && test -z "${USE_FLITE_FALSE}"; then
as_fn_error $? "conditional \"USE_FLITE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -58804,6 +60359,10 @@
as_fn_error $? "conditional \"USE_KATE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${USE_KMS_TRUE}" && test -z "${USE_KMS_FALSE}"; then
+ as_fn_error $? "conditional \"USE_KMS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${USE_LADSPA_TRUE}" && test -z "${USE_LADSPA_FALSE}"; then
as_fn_error $? "conditional \"USE_LADSPA\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -59016,6 +60575,10 @@
as_fn_error $? "conditional \"USE_X265\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${USE_WEBRTCDSP_TRUE}" && test -z "${USE_WEBRTCDSP_FALSE}"; then
+ as_fn_error $? "conditional \"USE_WEBRTCDSP\" 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
@@ -59104,6 +60667,10 @@
as_fn_error $? "conditional \"USE_FBDEV\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${USE_FDK_AAC_TRUE}" && test -z "${USE_FDK_AAC_FALSE}"; then
+ as_fn_error $? "conditional \"USE_FDK_AAC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${USE_FLITE_TRUE}" && test -z "${USE_FLITE_FALSE}"; then
as_fn_error $? "conditional \"USE_FLITE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -59136,6 +60703,10 @@
as_fn_error $? "conditional \"USE_KATE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${USE_KMS_TRUE}" && test -z "${USE_KMS_FALSE}"; then
+ as_fn_error $? "conditional \"USE_KMS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${USE_TIGER_TRUE}" && test -z "${USE_TIGER_FALSE}"; then
as_fn_error $? "conditional \"USE_TIGER\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -59324,6 +60895,10 @@
as_fn_error $? "conditional \"USE_WEBP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${USE_WEBRTCDSP_TRUE}" && test -z "${USE_WEBRTCDSP_FALSE}"; then
+ as_fn_error $? "conditional \"USE_WEBRTCDSP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${USE_OPENH264_TRUE}" && test -z "${USE_OPENH264_FALSE}"; then
as_fn_error $? "conditional \"USE_OPENH264\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -59336,6 +60911,10 @@
as_fn_error $? "conditional \"USE_DTLS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${USE_VULKAN_TRUE}" && test -z "${USE_VULKAN_FALSE}"; then
+ as_fn_error $? "conditional \"USE_VULKAN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
: "${CONFIG_STATUS=./config.status}"
ac_write_fail=0
@@ -59733,7 +61312,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.8.3, which was
+This file was extended by GStreamer Bad Plug-ins $as_me 1.9.90, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -59799,7 +61378,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.8.3
+GStreamer Bad Plug-ins config.status 1.9.90
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
@@ -60415,6 +61994,7 @@
"gst/subenc/Makefile") CONFIG_FILES="$CONFIG_FILES gst/subenc/Makefile" ;;
"gst/stereo/Makefile") CONFIG_FILES="$CONFIG_FILES gst/stereo/Makefile" ;;
"gst/tta/Makefile") CONFIG_FILES="$CONFIG_FILES gst/tta/Makefile" ;;
+ "gst/timecode/Makefile") CONFIG_FILES="$CONFIG_FILES gst/timecode/Makefile" ;;
"gst/videofilters/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videofilters/Makefile" ;;
"gst/videomeasure/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videomeasure/Makefile" ;;
"gst/videoparsers/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videoparsers/Makefile" ;;
@@ -60453,7 +62033,6 @@
"sys/acmmp3dec/Makefile") CONFIG_FILES="$CONFIG_FILES sys/acmmp3dec/Makefile" ;;
"sys/androidmedia/Makefile") CONFIG_FILES="$CONFIG_FILES sys/androidmedia/Makefile" ;;
"sys/applemedia/Makefile") CONFIG_FILES="$CONFIG_FILES sys/applemedia/Makefile" ;;
- "sys/applemedia-nonpublic/Makefile") CONFIG_FILES="$CONFIG_FILES sys/applemedia-nonpublic/Makefile" ;;
"sys/avc/Makefile") CONFIG_FILES="$CONFIG_FILES sys/avc/Makefile" ;;
"sys/bluez/Makefile") CONFIG_FILES="$CONFIG_FILES sys/bluez/Makefile" ;;
"sys/d3dvideosink/Makefile") CONFIG_FILES="$CONFIG_FILES sys/d3dvideosink/Makefile" ;;
@@ -60463,6 +62042,7 @@
"sys/dshowvideosink/Makefile") CONFIG_FILES="$CONFIG_FILES sys/dshowvideosink/Makefile" ;;
"sys/dvb/Makefile") CONFIG_FILES="$CONFIG_FILES sys/dvb/Makefile" ;;
"sys/fbdev/Makefile") CONFIG_FILES="$CONFIG_FILES sys/fbdev/Makefile" ;;
+ "sys/kms/Makefile") CONFIG_FILES="$CONFIG_FILES sys/kms/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" ;;
@@ -60493,7 +62073,6 @@
"tests/examples/gl/generic/doublecube/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/generic/doublecube/Makefile" ;;
"tests/examples/gl/generic/recordgraphic/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/generic/recordgraphic/Makefile" ;;
"tests/examples/gl/gtk/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/gtk/Makefile" ;;
- "tests/examples/gl/gtk/gtkvideooverlay/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/gtk/gtkvideooverlay/Makefile" ;;
"tests/examples/gl/gtk/3dvideo/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/gtk/3dvideo/Makefile" ;;
"tests/examples/gl/gtk/filternovideooverlay/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/gtk/filternovideooverlay/Makefile" ;;
"tests/examples/gl/gtk/filtervideooverlay/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/gtk/filtervideooverlay/Makefile" ;;
@@ -60526,6 +62105,7 @@
"ext/gtk/Makefile") CONFIG_FILES="$CONFIG_FILES ext/gtk/Makefile" ;;
"ext/faac/Makefile") CONFIG_FILES="$CONFIG_FILES ext/faac/Makefile" ;;
"ext/faad/Makefile") CONFIG_FILES="$CONFIG_FILES ext/faad/Makefile" ;;
+ "ext/fdkaac/Makefile") CONFIG_FILES="$CONFIG_FILES ext/fdkaac/Makefile" ;;
"ext/flite/Makefile") CONFIG_FILES="$CONFIG_FILES ext/flite/Makefile" ;;
"ext/fluidsynth/Makefile") CONFIG_FILES="$CONFIG_FILES ext/fluidsynth/Makefile" ;;
"ext/gsm/Makefile") CONFIG_FILES="$CONFIG_FILES ext/gsm/Makefile" ;;
@@ -60571,11 +62151,13 @@
"ext/timidity/Makefile") CONFIG_FILES="$CONFIG_FILES ext/timidity/Makefile" ;;
"ext/vulkan/Makefile") CONFIG_FILES="$CONFIG_FILES ext/vulkan/Makefile" ;;
"ext/vulkan/xcb/Makefile") CONFIG_FILES="$CONFIG_FILES ext/vulkan/xcb/Makefile" ;;
+ "ext/vulkan/wayland/Makefile") CONFIG_FILES="$CONFIG_FILES ext/vulkan/wayland/Makefile" ;;
"ext/webp/Makefile") CONFIG_FILES="$CONFIG_FILES ext/webp/Makefile" ;;
"ext/x265/Makefile") CONFIG_FILES="$CONFIG_FILES ext/x265/Makefile" ;;
"ext/xvid/Makefile") CONFIG_FILES="$CONFIG_FILES ext/xvid/Makefile" ;;
"ext/zbar/Makefile") CONFIG_FILES="$CONFIG_FILES ext/zbar/Makefile" ;;
"ext/dtls/Makefile") CONFIG_FILES="$CONFIG_FILES ext/dtls/Makefile" ;;
+ "ext/webrtcdsp/Makefile") CONFIG_FILES="$CONFIG_FILES ext/webrtcdsp/Makefile" ;;
"po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
"docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;;
"docs/plugins/Makefile") CONFIG_FILES="$CONFIG_FILES docs/plugins/Makefile" ;;
diff --git a/configure.ac b/configure.ac
index f0a1e17..8402afd 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.8.3],[http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer],[gst-plugins-bad])
+AC_INIT([GStreamer Bad Plug-ins],[1.9.90],[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, 803, 0, 803)
+AS_LIBTOOL(GST, 990, 0, 990)
dnl *** required versions of GStreamer stuff ***
-GST_REQ=1.8.0
-GSTPB_REQ=1.8.0
+GST_REQ=1.9.90
+GSTPB_REQ=1.9.90
dnl *** autotools stuff ****
@@ -201,6 +201,10 @@
AG_GST_CHECK_GST_CHECK($GST_API_VERSION, [$GST_REQ], no)
AG_GST_CHECK_GST_CONTROLLER($GST_API_VERSION, [$GST_REQ], yes)
AG_GST_CHECK_GST_NET($GST_API_VERSION, [$GST_REQ], yes)
+AG_GST_PKG_CHECK_MODULES(GST_VIDEO, gstreamer-video-[$GST_API_VERSION], [$GST_REQ], yes)
+AG_GST_PKG_CHECK_MODULES(GST_AUDIO, gstreamer-audio-[$GST_API_VERSION], [$GST_REQ], yes)
+AG_GST_PKG_CHECK_MODULES(GST_PBUTILS, gstreamer-pbutils-[$GST_API_VERSION], [$GST_REQ], yes)
+
AM_CONDITIONAL(HAVE_GST_CHECK, test "x$HAVE_GST_CHECK" = "xyes")
AG_GST_CHECK_GST_PLUGINS_BASE($GST_API_VERSION, [$GSTPB_REQ], yes)
@@ -310,7 +314,7 @@
dnl graphene-1.0 is optional and used in gltransformation
HAVE_GRAPHENE=NO
-PKG_CHECK_MODULES(GRAPHENE, graphene-1.0 >= 1.0.0, HAVE_GRAPHENE=yes, HAVE_GRAPHENE=no)
+PKG_CHECK_MODULES(GRAPHENE, graphene-1.0 >= 1.4.0, HAVE_GRAPHENE=yes, HAVE_GRAPHENE=no)
if test "x$HAVE_GRAPHENE" = "xyes"; then
AC_DEFINE(HAVE_GRAPHENE, [1] , [Use graphene])
fi
@@ -396,6 +400,12 @@
AC_SUBST(GST_PLUGIN_LIBTOOLFLAGS)
AM_CONDITIONAL(GST_PLUGIN_BUILD_STATIC, test "x$enable_static_plugins" = "xyes")
+dnl If only building static libraries, define GST_STATIC_COMPILATION. This is
+dnl needed only on Windows, but it doesn't hurt to have it everywhere.
+if test x$enable_static = xyes -a x$enable_shared = xno; then
+ GST_STATIC_CFLAGS="-DGST_STATIC_COMPILATION"
+fi
+
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
@@ -450,10 +460,11 @@
sdi tta \
videomeasure \
linsys \
- apexsink dc1394 \
- musepack nas sdl timidity \
+ apexsink \
+ nas sdl timidity \
wininet \
- xvid lv2 sndio libvisual"
+ xvid sndio libvisual"
+
AC_SUBST(GST_PLUGINS_NONPORTED)
dnl these are all the gst plug-ins, compilable without additional libs
@@ -517,6 +528,7 @@
AG_GST_CHECK_PLUGIN(speed)
AG_GST_CHECK_PLUGIN(subenc)
AG_GST_CHECK_PLUGIN(stereo)
+AG_GST_CHECK_PLUGIN(timecode)
AG_GST_CHECK_PLUGIN(tta)
AG_GST_CHECK_PLUGIN(videofilters)
AG_GST_CHECK_PLUGIN(videomeasure)
@@ -531,6 +543,7 @@
AC_CHECK_HEADER(AVFoundation/AVFoundation.h, HAVE_AVFOUNDATION="yes", HAVE_AVFOUNDATION="no", [-])
AC_CHECK_HEADER(MobileCoreServices/MobileCoreServices.h, HAVE_IOS="yes", HAVE_IOS="no", [-])
AC_CHECK_HEADER(VideoToolbox/VideoToolbox.h, HAVE_VIDEOTOOLBOX="yes", HAVE_VIDEOTOOLBOX="no", [-])
+AC_CHECK_HEADER(QTKit/QTKit.h, HAVE_QTKIT="yes", HAVE_QTKIT="no", [-])
if test "x$HAVE_VIDEOTOOLBOX" = "xyes"; then
old_LIBS=$LIBS
@@ -557,6 +570,10 @@
AC_DEFINE(HAVE_VIDEOTOOLBOX, 1, [Define if building with VideoToolbox])
fi
+AM_CONDITIONAL(HAVE_QTKIT, test "x$HAVE_QTKIT" = "xyes")
+if test "x$HAVE_QTKIT" = "xyes"; then
+ AC_DEFINE(HAVE_QTKIT, 1, [Define if building with QTKit])
+fi
dnl disable gst plugins we might not be able to build on this
dnl platform: (ugly but minimally invasive)
dnl FIXME: maybe move to sys, or make work with winsock2
@@ -681,6 +698,7 @@
HAVE_GL=no
HAVE_GLES2=no
+HAVE_GLES3_H=no
HAVE_WAYLAND_EGL=no
HAVE_EGL_RPI=no
@@ -707,6 +725,7 @@
if test "x$HAVE_GLES2" != "xyes"; then
AG_GST_CHECK_LIBHEADER(GLES2, GLESv2, glTexImage2D,, GLES2/gl2.h)
fi
+ AC_CHECK_HEADER([GLES3/gl3.h], [HAVE_GLES3_H=yes])
fi
if test "x$NEED_EGL" != "xno"; then
AG_GST_PKG_CHECK_MODULES(EGL, egl)
@@ -780,6 +799,17 @@
CFLAGS=$old_CFLAGS
PKG_CHECK_MODULES(WAYLAND_EGL, wayland-client >= 1.0 wayland-cursor >= 1.0 wayland-egl >= 9.0, HAVE_WAYLAND_EGL=yes, HAVE_WAYLAND_EGL=no)
+
+ # OS X and iOS always have GL available
+ case $host in
+ *-darwin*)
+ if test "x$HAVE_IOS" = "xyes"; then
+ HAVE_GLES2=yes
+ else
+ HAVE_GL=yes
+ fi
+ ;;
+ esac
;;
esac
@@ -857,6 +887,10 @@
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
+ GLES3_H_DEFINE=0
+ if test "x$HAVE_GLES3_H" == "xyes"; then
+ GLES3_H_DEFINE=1
+ fi
GL_INCLUDES="
#ifdef __GNUC__
# pragma GCC diagnostic push
@@ -869,8 +903,13 @@
# include <OpenGLES/ES2/gl.h>
# include <OpenGLES/ES2/glext.h>
# else
-# include <GLES2/gl2.h>
-# include <GLES2/gl2ext.h>
+# if $GLES3_H_DEFINE
+# include <GLES3/gl3.h>
+# include <GLES3/gl3ext.h>
+# else
+# include <GLES2/gl2.h>
+# include <GLES2/gl2ext.h>
+# endif
# endif
# ifdef __APPLE__
# include <OpenGL/OpenGL.h>
@@ -906,6 +945,7 @@
else
AC_MSG_WARN([Disabling GL|ES 2.0 support])
HAVE_GLES2=no
+ HAVE_GLES3_H=no
fi
])
CFLAGS="$save_CFLAGS"
@@ -1149,6 +1189,9 @@
if test "x$USE_GLES2" = "xyes"; then
GL_APIS="gles2 $GL_APIS"
GST_GL_HAVE_GLES2=1
+ if test "x$HAVE_GLES3_H" = "xyes"; then
+ GST_GL_HAVE_GLES3=1
+ fi
fi
GL_CONFIG_DEFINES="$GL_CONFIG_DEFINES
@@ -1318,8 +1361,13 @@
# include <OpenGLES/ES2/gl.h>
# include <OpenGLES/ES2/glext.h>
# else
-# include <GLES2/gl2.h>
-# include <GLES2/gl2ext.h>
+# if $GST_GL_HAVE_GLES3
+# include <GLES3/gl3.h>
+# include <GLES3/gl3ext.h>
+# else
+# include <GLES2/gl2.h>
+# include <GLES2/gl2ext.h>
+# endif
# endif
"
fi
@@ -1345,6 +1393,7 @@
GST_GL_HAVE_GLSYNC=0
GST_GL_HAVE_GLUINT64=0
GST_GL_HAVE_GLINT64=0
+GST_GL_HAVE_EGLATTRIB=0
old_CFLAGS=$CFLAGS
CFLAGS="$GL_CFLAGS $CFLAGS"
@@ -1384,6 +1433,17 @@
GST_GL_HAVE_GLINT64=1
fi
+if test "x$USE_EGL" = "xyes"; then
+ EGL_INCLUDES="$GL_INCLUDES
+ #include <EGL/egl.h>
+ #include <EGL/eglext.h>
+ "
+ AC_CHECK_TYPES(EGLAttrib, [], [], [[$EGL_INCLUDES]])
+ if test "x$ac_cv_type_EGLAttrib" = "xyes"; then
+ GST_GL_HAVE_EGLATTRIB=1
+ fi
+fi
+
CFLAGS=$old_CFLAGS
GL_CONFIG_DEFINES="$GL_CONFIG_DEFINES
@@ -1394,6 +1454,7 @@
#define GST_GL_HAVE_GLSYNC $GST_GL_HAVE_GLSYNC
#define GST_GL_HAVE_GLUINT64 $GST_GL_HAVE_GLUINT64
#define GST_GL_HAVE_GLINT64 $GST_GL_HAVE_GLINT64
+#define GST_GL_HAVE_EGLATTRIB $GST_GL_HAVE_EGLATTRIB
"
AC_CONFIG_COMMANDS([gst-libs/gst/gl/gstglconfig.h], [
@@ -1470,15 +1531,14 @@
AM_CONDITIONAL(HAVE_JPEG, test "x$HAVE_JPEG" = "xyes")
dnl Vulkan
-VULKAN_CONFIG_DEFINES=""
+PKG_CHECK_MODULES(XCB, xcb >= 1.10, GST_VULKAN_HAVE_WINDOW_XCB=1, GST_VULKAN_HAVE_WINDOW_XCB=0)
+AM_CONDITIONAL(USE_XCB, test "x$GST_VULKAN_HAVE_WINDOW_XCB" = "x1")
-PKG_CHECK_MODULES(XCB, xcb >= 1.10, HAVE_XCB=yes, HAVE_XCB=no)
-
-AM_CONDITIONAL(USE_XCB, test "x$HAVE_XCB" = "xyes")
-if test "x$HAVE_XCB" = "xyes"; then
- VULKAN_CONFIG_DEFINES="$VULKAN_CONFIG_DEFINES
- #define GST_VULKAN_HAVE_WINDOW_XCB 1"
-fi
+PKG_CHECK_MODULES(WAYLAND, wayland-client >= 1.4, GST_VULKAN_HAVE_WINDOW_WAYLAND=1, GST_VULKAN_HAVE_WINDOW_WAYLAND=0)
+AM_CONDITIONAL(USE_WAYLAND, test "x$GST_VULKAN_HAVE_WINDOW_WAYLAND" = "x1")
+VULKAN_CONFIG_DEFINES="
+#define GST_VULKAN_HAVE_WINDOW_XCB $GST_VULKAN_HAVE_WINDOW_XCB
+#define GST_VULKAN_HAVE_WINDOW_WAYLAND $GST_VULKAN_HAVE_WINDOW_WAYLAND"
AC_CONFIG_COMMANDS([ext/vulkan/vkconfig.h], [
outfile=vkconfig.h-tmp
@@ -1850,8 +1910,6 @@
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]),
@@ -2161,13 +2219,17 @@
AC_PATH_PROG([wayland_scanner], [wayland-scanner])
AG_GST_CHECK_FEATURE(WAYLAND, [wayland sink], wayland , [
PKG_CHECK_MODULES(WAYLAND, wayland-client >= 1.4.0, [
- if test "x$wayland_scanner" != "x"; then
- HAVE_WAYLAND="yes"
- else
- AC_MSG_RESULT([wayland-scanner is required to build the wayland plugin])
- HAVE_WAYLAND="no"
- fi
- ],
+ PKG_CHECK_MODULES(WAYLAND_PROTOCOLS, wayland-protocols >= 1.4, [
+ if test "x$wayland_scanner" != "x"; then
+ HAVE_WAYLAND="yes"
+ AC_SUBST(WAYLAND_PROTOCOLS_DATADIR, `$PKG_CONFIG --variable=pkgdatadir wayland-protocols`)
+ else
+ AC_MSG_RESULT([wayland-scanner is required to build the wayland plugin])
+ HAVE_WAYLAND="no"
+ fi
+ ],
+ [ HAVE_WAYLAND="no"
+ ])],
[ HAVE_WAYLAND="no"
])
])
@@ -2258,6 +2320,14 @@
fi
])
+dnl *** fdkaac ***
+translit(dnm, m, l) AM_CONDITIONAL(USE_FDK_AAC, true)
+AG_GST_CHECK_FEATURE(FDK_AAC, [fdkaac plugin], fdkaac, [
+ PKG_CHECK_MODULES(FDK_AAC, fdk-aac, HAVE_FDK_AAC="yes", [
+ HAVE_FDK_AAC="no"
+ ])
+])
+
dnl *** flite ***
translit(dnm, m, l) AM_CONDITIONAL(USE_FLITE, true)
AG_GST_CHECK_FEATURE(FLITE, [Flite plugin], flite, [
@@ -2311,6 +2381,13 @@
AC_SUBST(TIGER_LIBS)
],,,[AM_CONDITIONAL(USE_TIGER, false)])
+dnl *** kms ***
+translit(dnm, m, l) AM_CONDITIONAL(USE_KMS, true)
+AG_GST_CHECK_FEATURE(KMS, [drm/kms libraries], kms, [
+ AG_GST_PKG_CHECK_MODULES(GST_ALLOCATORS, gstreamer-allocators-1.0)
+ PKG_CHECK_MODULES([DRM], [libdrm >= 2.4.55 libkms], HAVE_KMS=yes, HAVE_KMS=no)
+])
+
dnl *** ladspa ***
translit(dnm, m, l) AM_CONDITIONAL(USE_LADSPA, true)
AG_GST_CHECK_FEATURE(LADSPA, [ladspa], ladspa, [
@@ -2327,9 +2404,15 @@
dnl *** LV2 ***
translit(dnm, m, l) AM_CONDITIONAL(USE_LV2, true)
AG_GST_CHECK_FEATURE(LV2, [lv2], lv2, [
- PKG_CHECK_MODULES(SLV2, slv2 >= 0.6.6, HAVE_LV2="yes", HAVE_LV2="no")
- AC_SUBST(SLV2_CFLAGS)
- AC_SUBST(SLV2_LIBS)
+ PKG_CHECK_MODULES(LILV, lilv-0 >= 0.22, [
+ HAVE_LV2="yes",
+ HAVE_LILV_0_22="yes"
+ AC_DEFINE(HAVE_LILV_0_22, 1, [Define if we have liblilv >= 0.22])
+ ],[
+ PKG_CHECK_MODULES(LILV, lilv-0 >= 0.16, HAVE_LV2="yes", HAVE_LV2="no")
+ ])
+ AC_SUBST(LILV_CFLAGS)
+ AC_SUBST(LILV_LIBS)
])
dnl *** libde265 ***
@@ -2657,21 +2740,17 @@
dnl a new version and the no-backward-compatibility define. (There doesn't
dnl seem to be a switch to suppress the warnings the cvcompat.h header
dnl causes.)
- PKG_CHECK_MODULES(OPENCV, opencv >= 2.3.0 opencv < 2.5.0 , [
+ PKG_CHECK_MODULES(OPENCV, opencv >= 2.3.0 opencv <= 3.1.0 , [
AC_PROG_CXX
AC_LANG([C++])
OLD_CPPFLAGS=$CPPFLAGS
CPPFLAGS=$OPENCV_CFLAGS
something_not_found=no
- AC_CHECK_HEADERS([opencv2/contrib/contrib.hpp \
- opencv2/core/core_c.h \
- opencv2/core/types_c.h \
+ AC_CHECK_HEADERS([opencv2/core/core_c.h \
opencv2/core/version.hpp \
opencv2/highgui/highgui_c.h \
opencv2/imgproc/imgproc.hpp \
opencv2/imgproc/imgproc_c.h \
- opencv2/legacy/compat.hpp \
- opencv2/legacy/legacy.hpp \
opencv2/objdetect/objdetect.hpp \
opencv2/video/background_segm.hpp], [], [something_not_found=yes])
CPPFLAGS=$OLD_CPPFLAGS
@@ -2923,14 +3002,15 @@
dnl *** Vulkan ***
translit(dnm, m, l) AM_CONDITIONAL(USE_VULKAN, true)
AG_GST_CHECK_FEATURE(VULKAN, [Vulkan elements], vulkan, [
- HAVE_VULKAN=no
AC_CHECK_HEADER(vulkan/vulkan.h, [
AC_CHECK_LIB(vulkan, vkCreateDevice, [
VULKAN_LIBS="-lvulkan"
AC_SUBST(VULKAN_LIBS)
- dnl TODO check platform support (x11, win32, wayland, android, etc)
- if test "x$HAVE_XCB" = "xyes"; then
- HAVE_VULKAN=yes
+ if test "x$GST_VULKAN_HAVE_WINDOW_XCB" = "x1"; then
+ HAVE_VULKAN="yes"
+ fi
+ if test "x$GST_VULKAN_HAVE_WINDOW_WAYLAND" = "x1"; then
+ HAVE_VULKAN="yes"
fi
], [])
], [])
@@ -3334,6 +3414,32 @@
AG_GST_PKG_CHECK_MODULES(X265, x265)
])
+dnl *** WebRTC Audio Processing ***
+dnl Note: We test for a specific version as there is no API stability
+translit(dnm, m, l) AM_CONDITIONAL(USE_WEBRTCDSP, true)
+AG_GST_CHECK_FEATURE(WEBRTCDSP, [WebRTC Audio Processing], webrtcdsp, [
+
+ AG_GST_PKG_CHECK_MODULES(WEBRTCDSP, webrtc-audio-processing >= 0.2 webrtc-audio-processing < 0.4)
+
+ # On Android, C++ headers comes with the STL implementation
+ AS_CASE(["${host}"],
+ [*android*],
+ [
+ PKG_CHECK_MODULES(GNUSTL, gnustl, [
+ WEBRTCDSP_CFLAGS="$WEBRTCDSP_CFLAGS $GNUSTL_CFLAGS"
+ WEBRTCDSP_LIBS="$WEBRTCDSP_LIBS $GNUSTL_LIBS"])
+ ])
+ AC_SUBST([WEBRTCDSP_CFLAGS])
+ AC_SUBST([WEBRTCDSP_LIBS])
+
+ AC_LANG_PUSH([C++])
+ old_CPPFLAGS=$CPPFLAGS
+ CPPFLAGS="-std=c++11 $CPPFLAGS $GNUSTL_CFLAGS"
+ AC_CHECK_HEADER([vector],[],[HAVE_WEBRTCDSP=no])
+ CPPFLAGS=$old_CPPFLAGS
+ AC_LANG_POP([C++])
+])
+
else
dnl not building plugins with external dependencies,
@@ -3361,6 +3467,7 @@
AM_CONDITIONAL(USE_FAAC, false)
AM_CONDITIONAL(USE_FAAD, false)
AM_CONDITIONAL(USE_FBDEV, false)
+AM_CONDITIONAL(USE_FDK_AAC, false)
AM_CONDITIONAL(USE_FLITE, false)
AM_CONDITIONAL(USE_FLUIDSYNTH, false)
AM_CONDITIONAL(USE_GL, false)
@@ -3369,6 +3476,7 @@
AM_CONDITIONAL(USE_GTK3_GL, false)
AM_CONDITIONAL(USE_HLS, false)
AM_CONDITIONAL(USE_KATE, false)
+AM_CONDITIONAL(USE_KMS, false)
AM_CONDITIONAL(USE_TIGER, false)
AM_CONDITIONAL(USE_LADSPA, false)
AM_CONDITIONAL(USE_LV2, false)
@@ -3416,9 +3524,11 @@
AM_CONDITIONAL(USE_SNDIO, false)
AM_CONDITIONAL(USE_UVCH264, false)
AM_CONDITIONAL(USE_WEBP, false)
+AM_CONDITIONAL(USE_WEBRTCDSP, false)
AM_CONDITIONAL(USE_OPENH264, false)
AM_CONDITIONAL(USE_X265, false)
AM_CONDITIONAL(USE_DTLS, false)
+AM_CONDITIONAL(USE_VULKAN, false)
fi dnl of EXT plugins
@@ -3459,7 +3569,7 @@
dnl prefer internal headers to already installed ones
dnl also add builddir include for enumtypes and marshal
dnl add GST_OPTION_CFLAGS, but overridable
-GST_CFLAGS="$GST_CFLAGS -DGST_USE_UNSTABLE_API"
+GST_CFLAGS="$GST_CFLAGS $GST_STATIC_CFLAGS -DGST_USE_UNSTABLE_API"
GST_CXXFLAGS="$GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CXXFLAGS)"
GST_OBJCFLAGS="$GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_OBJCFLAGS)"
GST_CFLAGS="$GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CFLAGS)"
@@ -3567,6 +3677,7 @@
gst/subenc/Makefile
gst/stereo/Makefile
gst/tta/Makefile
+gst/timecode/Makefile
gst/videofilters/Makefile
gst/videomeasure/Makefile
gst/videoparsers/Makefile
@@ -3605,7 +3716,6 @@
sys/acmmp3dec/Makefile
sys/androidmedia/Makefile
sys/applemedia/Makefile
-sys/applemedia-nonpublic/Makefile
sys/avc/Makefile
sys/bluez/Makefile
sys/d3dvideosink/Makefile
@@ -3615,6 +3725,7 @@
sys/dshowvideosink/Makefile
sys/dvb/Makefile
sys/fbdev/Makefile
+sys/kms/Makefile
sys/linsys/Makefile
sys/nvenc/Makefile
sys/opensles/Makefile
@@ -3645,7 +3756,6 @@
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
@@ -3678,6 +3788,7 @@
ext/gtk/Makefile
ext/faac/Makefile
ext/faad/Makefile
+ext/fdkaac/Makefile
ext/flite/Makefile
ext/fluidsynth/Makefile
ext/gsm/Makefile
@@ -3723,11 +3834,13 @@
ext/timidity/Makefile
ext/vulkan/Makefile
ext/vulkan/xcb/Makefile
+ext/vulkan/wayland/Makefile
ext/webp/Makefile
ext/x265/Makefile
ext/xvid/Makefile
ext/zbar/Makefile
ext/dtls/Makefile
+ext/webrtcdsp/Makefile
po/Makefile.in
docs/Makefile
docs/plugins/Makefile
diff --git a/docs/Makefile.in b/docs/Makefile.in
index 052f2d0..7b1293d 100644
--- a/docs/Makefile.in
+++ b/docs/Makefile.in
@@ -275,6 +275,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -296,6 +298,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -345,6 +349,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -490,6 +496,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -616,8 +624,6 @@
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@
@@ -660,8 +666,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/docs/libs/Makefile.in b/docs/libs/Makefile.in
index dec78aa..edcd08b 100644
--- a/docs/libs/Makefile.in
+++ b/docs/libs/Makefile.in
@@ -237,6 +237,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -258,6 +260,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -307,6 +311,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -452,6 +458,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -578,8 +586,6 @@
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@
@@ -622,8 +628,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -1143,7 +1154,11 @@
@ENABLE_GTK_DOC_TRUE@sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(expand_content_files)
@ENABLE_GTK_DOC_TRUE@ @echo ' DOC Building XML'
-@ENABLE_GTK_DOC_TRUE@ @gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) --output-format=xml $(MKDB_OPTIONS)
+@ENABLE_GTK_DOC_TRUE@ @_source_dir='' ; \
+@ENABLE_GTK_DOC_TRUE@ for i in $(DOC_SOURCE_DIR) ; do \
+@ENABLE_GTK_DOC_TRUE@ _source_dir="$${_source_dir} --source-dir=$$i" ; \
+@ENABLE_GTK_DOC_TRUE@ done ; \
+@ENABLE_GTK_DOC_TRUE@ gtkdoc-mkdb --module=$(DOC_MODULE) $${_source_dir} --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) --output-format=xml $(MKDB_OPTIONS)
@ENABLE_GTK_DOC_TRUE@ @cp ../version.entities xml
@ENABLE_GTK_DOC_TRUE@ @touch sgml-build.stamp
diff --git a/docs/libs/gst-plugins-bad-libs-sections.txt b/docs/libs/gst-plugins-bad-libs-sections.txt
index 922da0f..a14bfc2 100644
--- a/docs/libs/gst-plugins-bad-libs-sections.txt
+++ b/docs/libs/gst-plugins-bad-libs-sections.txt
@@ -1184,6 +1184,7 @@
gst_gl_video_allocation_params_init_full
gst_gl_video_allocation_params_new
gst_gl_video_allocation_params_new_wrapped_data
+gst_gl_video_allocation_params_new_wrapped_gl_handle
gst_gl_video_allocation_params_new_wrapped_texture
GstGLMemoryAllocator
GstGLMemoryAllocatorClass
@@ -1660,7 +1661,7 @@
GST_VIDEO_AGGREGATOR
GST_VIDEO_AGGREGATOR_CLASS
GST_VIDEO_AGGREGATOR_GET_CLASS
-gst_videoaggregator_get_type
+gst_video_aggregator_get_type
GstVideoAggregatorPrivate
</SECTION>
@@ -1676,7 +1677,7 @@
GST_VIDEO_AGGREGATOR_PAD
GST_VIDEO_AGGREGATOR_PAD_CLASS
GST_VIDEO_AGGREGATOR_PAD_GET_CLASS
-gst_videoaggregator_pad_get_type
+gst_video_aggregator_pad_get_type
</SECTION>
<SECTION>
@@ -1704,8 +1705,8 @@
gst_player_get_pipeline
-gst_player_set_position_update_interval
-gst_player_get_position_update_interval
+gst_player_set_config
+gst_player_get_config
GstPlayerState
gst_player_state_get_name
@@ -1745,6 +1746,14 @@
gst_player_set_color_balance
gst_player_get_color_balance
+gst_player_get_multiview_mode
+gst_player_set_multiview_mode
+gst_player_get_multiview_flags
+gst_player_set_multiview_flags
+
+gst_player_get_audio_video_offset
+gst_player_set_audio_video_offset
+
gst_player_get_rate
gst_player_set_rate
@@ -1754,6 +1763,13 @@
GstPlayerVideoRenderer
GstPlayerVideoRendererInterface
+<SUBSECTION config>
+gst_player_config_set_position_update_interval
+gst_player_config_get_position_update_interval
+
+gst_player_config_set_user_agent
+gst_player_config_get_user_agent
+
<SUBSECTION Standard>
GST_IS_PLAYER
GST_IS_PLAYER_CLASS
@@ -1858,6 +1874,7 @@
gst_player_media_info_get_title
gst_player_media_info_get_container_format
gst_player_media_info_is_seekable
+gst_player_media_info_is_live
gst_player_media_info_get_image_sample
gst_player_media_info_get_tags
gst_player_media_info_get_stream_list
diff --git a/docs/libs/html/GstGLFilter.html b/docs/libs/html/GstGLFilter.html
index 5915661..6c86e93 100644
--- a/docs/libs/html/GstGLFilter.html
+++ b/docs/libs/html/GstGLFilter.html
@@ -42,15 +42,7 @@
<tbody>
<tr>
<td class="function_type">
-<span class="returnvalue">void</span>
-</td>
-<td class="function_name">
-<a class="link" href="GstGLFilter.html#gst-gl-filter-draw-texture" title="gst_gl_filter_draw_texture ()">gst_gl_filter_draw_texture</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">void</span>
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
</td>
<td class="function_name">
<a class="link" href="GstGLFilter.html#gst-gl-filter-render-to-target" title="gst_gl_filter_render_to_target ()">gst_gl_filter_render_to_target</a> <span class="c_punctuation">()</span>
@@ -111,68 +103,17 @@
<div class="refsect1">
<a name="GstGLFilter.functions_details"></a><h2>Functions</h2>
<div class="refsect2">
-<a name="gst-gl-filter-draw-texture"></a><h3>gst_gl_filter_draw_texture ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-gst_gl_filter_draw_texture (<em class="parameter"><code><a class="link" href="GstGLFilter.html" title="GstGLFilter"><span class="type">GstGLFilter</span></a> *filter</code></em>,
- <em class="parameter"><code><span class="type">GLuint</span> texture</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> width</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> height</code></em>);</pre>
-<p>Draws <em class="parameter"><code>texture</code></em>
- into the OpenGL scene at the specified <em class="parameter"><code>width</code></em>
- and <em class="parameter"><code>height</code></em>
-.</p>
-<div class="refsect3">
-<a name="gst-gl-filter-draw-texture.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table class="informaltable" 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>filter</p></td>
-<td class="parameter_description"><p>a <a class="link" href="GstGLFilter.html" title="GstGLFilter"><span class="type">GstGLFilter</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>texture</p></td>
-<td class="parameter_description"><p>the texture to draw</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>texture</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 texture</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-</tbody>
-</table></div>
-</div>
-</div>
-<hr>
-<div class="refsect2">
<a name="gst-gl-filter-render-to-target"></a><h3>gst_gl_filter_render_to_target ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
gst_gl_filter_render_to_target (<em class="parameter"><code><a class="link" href="GstGLFilter.html" title="GstGLFilter"><span class="type">GstGLFilter</span></a> *filter</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> resize</code></em>,
- <em class="parameter"><code><span class="type">GLuint</span> input</code></em>,
- <em class="parameter"><code><span class="type">GLuint</span> target</code></em>,
- <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#GLCB:CAPS" title="GLCB ()"><span class="type">GLCB</span></a> func</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> *input</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> *output</code></em>,
+ <em class="parameter"><code><span class="type">GstGLFilterRenderFunc</span> func</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>);</pre>
<p>Transforms <em class="parameter"><code>input</code></em>
into <em class="parameter"><code>output</code></em>
using <em class="parameter"><code>func</code></em>
- on through FBO. <em class="parameter"><code>resize</code></em>
- should
-only ever be <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> whenever <em class="parameter"><code>input</code></em>
- is the input texture of <em class="parameter"><code>filter</code></em>
-.</p>
+ on through FBO.</p>
<div class="refsect3">
<a name="gst-gl-filter-render-to-target.parameters"></a><h4>Parameters</h4>
<div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -188,18 +129,12 @@
<td class="parameter_annotations"> </td>
</tr>
<tr>
-<td class="parameter_name"><p>resize</p></td>
-<td class="parameter_description"><p>whether to automatically resize the texture between the input size
-and the output size</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
<td class="parameter_name"><p>input</p></td>
<td class="parameter_description"><p>the input texture</p></td>
<td class="parameter_annotations"> </td>
</tr>
<tr>
-<td class="parameter_name"><p>target</p></td>
+<td class="parameter_name"><p>output</p></td>
<td class="parameter_description"><p>the output texture</p></td>
<td class="parameter_annotations"> </td>
</tr>
@@ -220,6 +155,11 @@
</tbody>
</table></div>
</div>
+<div class="refsect3">
+<a name="gst-gl-filter-render-to-target.returns"></a><h4>Returns</h4>
+<p> the return value of <em class="parameter"><code>func</code></em>
+</p>
+</div>
</div>
<hr>
<div class="refsect2">
@@ -227,18 +167,13 @@
<pre class="programlisting"><span class="returnvalue">void</span>
gst_gl_filter_render_to_target_with_shader
(<em class="parameter"><code><a class="link" href="GstGLFilter.html" title="GstGLFilter"><span class="type">GstGLFilter</span></a> *filter</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> resize</code></em>,
- <em class="parameter"><code><span class="type">GLuint</span> input</code></em>,
- <em class="parameter"><code><span class="type">GLuint</span> target</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> *input</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> *output</code></em>,
<em class="parameter"><code><a class="link" href="GstGLShader.html" title="GstGLShader"><span class="type">GstGLShader</span></a> *shader</code></em>);</pre>
<p>Transforms <em class="parameter"><code>input</code></em>
into <em class="parameter"><code>output</code></em>
using <em class="parameter"><code>shader</code></em>
- on FBO. <em class="parameter"><code>resize</code></em>
- should
-only ever be <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> whenever <em class="parameter"><code>input</code></em>
- is the input texture of <em class="parameter"><code>filter</code></em>
-.</p>
+ with a FBO.</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="gst-gl-filter-render-to-target-with-shader.parameters"></a><h4>Parameters</h4>
@@ -255,18 +190,12 @@
<td class="parameter_annotations"> </td>
</tr>
<tr>
-<td class="parameter_name"><p>resize</p></td>
-<td class="parameter_description"><p>whether to automatically resize the texture between the input size
-and the output size</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
<td class="parameter_name"><p>input</p></td>
<td class="parameter_description"><p>the input texture</p></td>
<td class="parameter_annotations"> </td>
</tr>
<tr>
-<td class="parameter_name"><p>target</p></td>
+<td class="parameter_name"><p>output</p></td>
<td class="parameter_description"><p>the output texture</p></td>
<td class="parameter_annotations"> </td>
</tr>
@@ -349,7 +278,7 @@
gboolean (*set_caps) (GstGLFilter* filter, GstCaps* incaps, GstCaps* outcaps);
gboolean (*filter) (GstGLFilter *filter, GstBuffer *inbuf, GstBuffer *outbuf);
- gboolean (*filter_texture) (GstGLFilter *filter, guint in_tex, guint out_tex);
+ gboolean (*filter_texture) (GstGLFilter *filter, GstGLMemory *in_tex, GstGLMemory *out_tex);
gboolean (*init_fbo) (GstGLFilter *filter);
GstCaps *(*transform_internal_caps) (GstGLFilter *filter,
@@ -358,6 +287,8 @@
/* useful to init and cleanup custom gl resources */
void (*display_init_cb) (GstGLFilter *filter);
void (*display_reset_cb) (GstGLFilter *filter);
+
+ gpointer _padding[GST_PADDING];
} GstGLFilterClass;
</pre>
<div class="refsect3">
@@ -414,6 +345,11 @@
<td class="struct_member_description"><p>execute arbitrary gl code at stop</p></td>
<td class="struct_member_annotations"> </td>
</tr>
+<tr>
+<td class="struct_member_name"><p><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> <em class="structfield"><code><a name="GstGLFilterClass.-padding"></a>_padding</code></em>[GST_PADDING];</p></td>
+<td> </td>
+<td> </td>
+</tr>
</tbody>
</table></div>
</div>
diff --git a/docs/libs/html/GstGLFramebuffer.html b/docs/libs/html/GstGLFramebuffer.html
index 3cdd4be..34aa7e4 100644
--- a/docs/libs/html/GstGLFramebuffer.html
+++ b/docs/libs/html/GstGLFramebuffer.html
@@ -39,40 +39,14 @@
<col width="150px" class="functions_return">
<col class="functions_name">
</colgroup>
-<tbody>
-<tr>
+<tbody><tr>
<td class="function_type">
<a class="link" href="GstGLFramebuffer.html" title="GstGLFramebuffer"><span class="returnvalue">GstGLFramebuffer</span></a> *
</td>
<td class="function_name">
<a class="link" href="GstGLFramebuffer.html#gst-gl-framebuffer-new" title="gst_gl_framebuffer_new ()">gst_gl_framebuffer_new</a> <span class="c_punctuation">()</span>
</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-</td>
-<td class="function_name">
-<a class="link" href="GstGLFramebuffer.html#gst-gl-framebuffer-generate" title="gst_gl_framebuffer_generate ()">gst_gl_framebuffer_generate</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="GstGLFramebuffer.html#gst-gl-framebuffer-delete" title="gst_gl_framebuffer_delete ()">gst_gl_framebuffer_delete</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-</td>
-<td class="function_name">
-<a class="link" href="GstGLFramebuffer.html#gst-gl-framebuffer-use-v2" title="gst_gl_framebuffer_use_v2 ()">gst_gl_framebuffer_use_v2</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-</tbody>
+</tr></tbody>
</table></div>
</div>
<div class="refsect1">
@@ -84,8 +58,8 @@
</colgroup>
<tbody>
<tr>
-<td class="datatype_keyword">struct</td>
-<td class="function_name"><a class="link" href="GstGLFramebuffer.html#GstGLFramebuffer-struct" title="struct GstGLFramebuffer">GstGLFramebuffer</a></td>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="GstGLFramebuffer.html#GstGLFramebuffer-struct" title="GstGLFramebuffer">GstGLFramebuffer</a></td>
</tr>
<tr>
<td class="datatype_keyword">struct</td>
@@ -97,7 +71,9 @@
<div class="refsect1">
<a name="GstGLFramebuffer.object-hierarchy"></a><h2>Object Hierarchy</h2>
<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
- <span class="lineart">╰──</span> GstGLFramebuffer
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> GstGLFramebuffer
</pre>
</div>
<div class="refsect1">
@@ -110,49 +86,20 @@
<pre class="programlisting"><a class="link" href="GstGLFramebuffer.html" title="GstGLFramebuffer"><span class="returnvalue">GstGLFramebuffer</span></a> *
gst_gl_framebuffer_new (<em class="parameter"><code><a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a> *context</code></em>);</pre>
</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-framebuffer-generate"></a><h3>gst_gl_framebuffer_generate ()</h3>
-<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_gl_framebuffer_generate (<em class="parameter"><code><a class="link" href="GstGLFramebuffer.html" title="GstGLFramebuffer"><span class="type">GstGLFramebuffer</span></a> *frame</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> width</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> height</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> *fbo</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> *depthbuffer</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-framebuffer-delete"></a><h3>gst_gl_framebuffer_delete ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-gst_gl_framebuffer_delete (<em class="parameter"><code><a class="link" href="GstGLFramebuffer.html" title="GstGLFramebuffer"><span class="type">GstGLFramebuffer</span></a> *frame</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> fbo</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> depth</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-framebuffer-use-v2"></a><h3>gst_gl_framebuffer_use_v2 ()</h3>
-<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_gl_framebuffer_use_v2 (<em class="parameter"><code><a class="link" href="GstGLFramebuffer.html" title="GstGLFramebuffer"><span class="type">GstGLFramebuffer</span></a> *frame</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> texture_fbo_width</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> texture_fbo_height</code></em>,
- <em class="parameter"><code><span class="type">GLuint</span> fbo</code></em>,
- <em class="parameter"><code><span class="type">GLuint</span> depth_buffer</code></em>,
- <em class="parameter"><code><span class="type">GLuint</span> texture_fbo</code></em>,
- <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#GLCB-V2:CAPS" title="GLCB_V2 ()"><span class="type">GLCB_V2</span></a> cb</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> stuff</code></em>);</pre>
-</div>
</div>
<div class="refsect1">
<a name="GstGLFramebuffer.other_details"></a><h2>Types and Values</h2>
<div class="refsect2">
-<a name="GstGLFramebuffer-struct"></a><h3>struct GstGLFramebuffer</h3>
-<pre class="programlisting">struct GstGLFramebuffer;</pre>
+<a name="GstGLFramebuffer-struct"></a><h3>GstGLFramebuffer</h3>
+<pre class="programlisting">typedef struct _GstGLFramebuffer GstGLFramebuffer;</pre>
</div>
<hr>
<div class="refsect2">
<a name="GstGLFramebufferClass"></a><h3>struct GstGLFramebufferClass</h3>
<pre class="programlisting">struct GstGLFramebufferClass {
- GObjectClass object_class;
+ GstObjectClass object_class;
+
+ gpointer _padding[GST_PADDING];
};
</pre>
</div>
diff --git a/docs/libs/html/GstGLUpload.html b/docs/libs/html/GstGLUpload.html
index 2c66ebd..5f73454 100644
--- a/docs/libs/html/GstGLUpload.html
+++ b/docs/libs/html/GstGLUpload.html
@@ -275,7 +275,8 @@
<div class="refsect2">
<a name="gst-gl-upload-transform-caps"></a><h3>gst_gl_upload_transform_caps ()</h3>
<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstCaps.html#GstCaps-struct"><span class="returnvalue">GstCaps</span></a> *
-gst_gl_upload_transform_caps (<em class="parameter"><code><a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a> *context</code></em>,
+gst_gl_upload_transform_caps (<em class="parameter"><code><a class="link" href="GstGLUpload.html" title="GstGLUpload"><span class="type">GstGLUpload</span></a> *upload</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><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstPad.html#GstPadDirection"><span class="type">GstPadDirection</span></a> direction</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstCaps.html#GstCaps-struct"><span class="type">GstCaps</span></a> *caps</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstCaps.html#GstCaps-struct"><span class="type">GstCaps</span></a> *filter</code></em>);</pre>
diff --git a/docs/libs/html/api-index-full.html b/docs/libs/html/api-index-full.html
index 94ff3e1..621b26f 100644
--- a/docs/libs/html/api-index-full.html
+++ b/docs/libs/html/api-index-full.html
@@ -216,18 +216,10 @@
</dt>
<dd></dd>
<dt>
-<a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html#GST-CAPS-FEATURE-MEMORY-EGL-IMAGE:CAPS" title="GST_CAPS_FEATURE_MEMORY_EGL_IMAGE">GST_CAPS_FEATURE_MEMORY_EGL_IMAGE</a>, macro in <a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html" title="GstEGLImageMemory">GstEGLImageMemory</a>
-</dt>
-<dd></dd>
-<dt>
<a class="link" href="gst-plugins-bad-libs-GstGLBuffer.html#GST-CAPS-FEATURE-MEMORY-GL-BUFFER:CAPS" title="GST_CAPS_FEATURE_MEMORY_GL_BUFFER">GST_CAPS_FEATURE_MEMORY_GL_BUFFER</a>, macro in <a class="link" href="gst-plugins-bad-libs-GstGLBuffer.html" title="GstGLBuffer">GstGLBuffer</a>
</dt>
<dd></dd>
<dt>
-<a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#CDCB:CAPS" title="CDCB ()">CDCB</a>, user_function in <a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html" title="OpenGL Miscellaneous Utilities">OpenGL Miscellaneous Utilities</a>
-</dt>
-<dd></dd>
-<dt>
<a class="link" href="GstGLDisplay.html#gst-context-get-gl-display" title="gst_context_get_gl_display ()">gst_context_get_gl_display</a>, function in <a class="link" href="GstGLDisplay.html" title="GstGLDisplay">GstGLDisplay</a>
</dt>
<dd></dd>
@@ -266,34 +258,6 @@
<dd></dd>
<a name="idxE"></a><h3 class="title">E</h3>
<dt>
-<a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html#gst-egl-image-memory-get-display" title="gst_egl_image_memory_get_display ()">gst_egl_image_memory_get_display</a>, function in <a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html" title="GstEGLImageMemory">GstEGLImageMemory</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html#gst-egl-image-memory-get-image" title="gst_egl_image_memory_get_image ()">gst_egl_image_memory_get_image</a>, function in <a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html" title="GstEGLImageMemory">GstEGLImageMemory</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html#gst-egl-image-memory-get-orientation" title="gst_egl_image_memory_get_orientation ()">gst_egl_image_memory_get_orientation</a>, function in <a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html" title="GstEGLImageMemory">GstEGLImageMemory</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html#gst-egl-image-memory-init" title="gst_egl_image_memory_init ()">gst_egl_image_memory_init</a>, function in <a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html" title="GstEGLImageMemory">GstEGLImageMemory</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html#gst-egl-image-memory-setup-buffer" title="gst_egl_image_memory_setup_buffer ()">gst_egl_image_memory_setup_buffer</a>, function in <a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html" title="GstEGLImageMemory">GstEGLImageMemory</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html#gst-egl-image-memory-set-orientation" title="gst_egl_image_memory_set_orientation ()">gst_egl_image_memory_set_orientation</a>, function in <a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html" title="GstEGLImageMemory">GstEGLImageMemory</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html#GST-EGL-IMAGE-MEMORY-TYPE:CAPS" title="GST_EGL_IMAGE_MEMORY_TYPE">GST_EGL_IMAGE_MEMORY_TYPE</a>, macro in <a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html" title="GstEGLImageMemory">GstEGLImageMemory</a>
-</dt>
-<dd></dd>
-<dt>
<a class="link" href="gst-plugins-bad-libs-Base-MPEG-TS-sections.html#gst-event-parse-mpegts-section" title="gst_event_parse_mpegts_section ()">gst_event_parse_mpegts_section</a>, function in <a class="link" href="gst-plugins-bad-libs-Base-MPEG-TS-sections.html" title="Base MPEG-TS sections">Base MPEG-TS sections</a>
</dt>
<dd></dd>
@@ -403,14 +367,6 @@
</dt>
<dd></dd>
<dt>
-<a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#GLCB:CAPS" title="GLCB ()">GLCB</a>, user_function in <a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html" title="OpenGL Miscellaneous Utilities">OpenGL Miscellaneous Utilities</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#GLCB-V2:CAPS" title="GLCB_V2 ()">GLCB_V2</a>, user_function in <a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html" title="OpenGL Miscellaneous Utilities">OpenGL Miscellaneous Utilities</a>
-</dt>
-<dd></dd>
-<dt>
<a class="link" href="GstGLColorConvert.html#GstGLColorConvert-struct" title="GstGLColorConvert">GstGLColorConvert</a>, struct in <a class="link" href="GstGLColorConvert.html" title="GstGLColorConvert">GstGLColorConvert</a>
</dt>
<dd></dd>
@@ -459,10 +415,6 @@
</dt>
<dd></dd>
<dt>
-<a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#GstGLDisplayProjection" title="enum GstGLDisplayProjection">GstGLDisplayProjection</a>, enum in <a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html" title="OpenGL Miscellaneous Utilities">OpenGL Miscellaneous Utilities</a>
-</dt>
-<dd></dd>
-<dt>
<a class="link" href="GstGLDisplay.html#GstGLDisplayType" title="enum GstGLDisplayType">GstGLDisplayType</a>, enum in <a class="link" href="GstGLDisplay.html" title="GstGLDisplay">GstGLDisplay</a>
</dt>
<dd></dd>
@@ -475,7 +427,7 @@
</dt>
<dd></dd>
<dt>
-<a class="link" href="GstGLFramebuffer.html#GstGLFramebuffer-struct" title="struct GstGLFramebuffer">GstGLFramebuffer</a>, struct in <a class="link" href="GstGLFramebuffer.html" title="GstGLFramebuffer">GstGLFramebuffer</a>
+<a class="link" href="GstGLFramebuffer.html#GstGLFramebuffer-struct" title="GstGLFramebuffer">GstGLFramebuffer</a>, struct in <a class="link" href="GstGLFramebuffer.html" title="GstGLFramebuffer">GstGLFramebuffer</a>
</dt>
<dd></dd>
<dt>
@@ -983,18 +935,10 @@
</dt>
<dd></dd>
<dt>
-<a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-del-fbo" title="gst_gl_context_del_fbo ()">gst_gl_context_del_fbo</a>, function in <a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html" title="OpenGL Miscellaneous Utilities">OpenGL Miscellaneous Utilities</a>
-</dt>
-<dd></dd>
-<dt>
<a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-del-shader" title="gst_gl_context_del_shader ()">gst_gl_context_del_shader</a>, function in <a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html" title="OpenGL Miscellaneous Utilities">OpenGL Miscellaneous Utilities</a>
</dt>
<dd></dd>
<dt>
-<a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-del-texture" title="gst_gl_context_del_texture ()">gst_gl_context_del_texture</a>, function in <a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html" title="OpenGL Miscellaneous Utilities">OpenGL Miscellaneous Utilities</a>
-</dt>
-<dd></dd>
-<dt>
<a class="link" href="GstGLContext.html#gst-gl-context-destroy" title="gst_gl_context_destroy ()">gst_gl_context_destroy</a>, function in <a class="link" href="GstGLContext.html" title="GstGLContext">GstGLContext</a>
</dt>
<dd></dd>
@@ -1031,18 +975,10 @@
</dt>
<dd></dd>
<dt>
-<a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-gen-fbo" title="gst_gl_context_gen_fbo ()">gst_gl_context_gen_fbo</a>, function in <a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html" title="OpenGL Miscellaneous Utilities">OpenGL Miscellaneous Utilities</a>
-</dt>
-<dd></dd>
-<dt>
<a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-gen-shader" title="gst_gl_context_gen_shader ()">gst_gl_context_gen_shader</a>, function in <a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html" title="OpenGL Miscellaneous Utilities">OpenGL Miscellaneous Utilities</a>
</dt>
<dd></dd>
<dt>
-<a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-gen-texture" title="gst_gl_context_gen_texture ()">gst_gl_context_gen_texture</a>, function in <a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html" title="OpenGL Miscellaneous Utilities">OpenGL Miscellaneous Utilities</a>
-</dt>
-<dd></dd>
-<dt>
<a class="link" href="GstGLContext.html#gst-gl-context-get-current" title="gst_gl_context_get_current ()">gst_gl_context_get_current</a>, function in <a class="link" href="GstGLContext.html" title="GstGLContext">GstGLContext</a>
</dt>
<dd></dd>
@@ -1059,10 +995,6 @@
</dt>
<dd></dd>
<dt>
-<a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-get-error" title="gst_gl_context_get_error ()">gst_gl_context_get_error</a>, function in <a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html" title="OpenGL Miscellaneous Utilities">OpenGL Miscellaneous Utilities</a>
-</dt>
-<dd></dd>
-<dt>
<a class="link" href="GstGLContext.html#gst-gl-context-get-gl-api" title="gst_gl_context_get_gl_api ()">gst_gl_context_get_gl_api</a>, function in <a class="link" href="GstGLContext.html" title="GstGLContext">GstGLContext</a>
</dt>
<dd></dd>
@@ -1119,10 +1051,6 @@
</dt>
<dd></dd>
<dt>
-<a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-set-error" title="gst_gl_context_set_error ()">gst_gl_context_set_error</a>, function in <a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html" title="OpenGL Miscellaneous Utilities">OpenGL Miscellaneous Utilities</a>
-</dt>
-<dd></dd>
-<dt>
<a class="link" href="GstGLContext.html#gst-gl-context-set-shared-with" title="gst_gl_context_set_shared_with ()">gst_gl_context_set_shared_with</a>, function in <a class="link" href="GstGLContext.html" title="GstGLContext">GstGLContext</a>
</dt>
<dd></dd>
@@ -1139,10 +1067,6 @@
</dt>
<dd></dd>
<dt>
-<a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-use-fbo-v2" title="gst_gl_context_use_fbo_v2 ()">gst_gl_context_use_fbo_v2</a>, function in <a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html" title="OpenGL Miscellaneous Utilities">OpenGL Miscellaneous Utilities</a>
-</dt>
-<dd></dd>
-<dt>
<a class="link" href="gst-plugins-bad-libs-GstGLContextWGL.html#gst-gl-context-wgl-get-current-context" title="gst_gl_context_wgl_get_current_context ()">gst_gl_context_wgl_get_current_context</a>, function in <a class="link" href="gst-plugins-bad-libs-GstGLContextWGL.html" title="GstGLContextWGL">GstGLContextWGL</a>
</dt>
<dd></dd>
@@ -1195,10 +1119,6 @@
</dt>
<dd></dd>
<dt>
-<a class="link" href="GstGLFilter.html#gst-gl-filter-draw-texture" title="gst_gl_filter_draw_texture ()">gst_gl_filter_draw_texture</a>, function in <a class="link" href="GstGLFilter.html" title="GstGLFilter">GstGLFilter</a>
-</dt>
-<dd></dd>
-<dt>
<a class="link" href="GstGLFilter.html#gst-gl-filter-filter-texture" title="gst_gl_filter_filter_texture ()">gst_gl_filter_filter_texture</a>, function in <a class="link" href="GstGLFilter.html" title="GstGLFilter">GstGLFilter</a>
</dt>
<dd></dd>
@@ -1219,26 +1139,10 @@
</dt>
<dd></dd>
<dt>
-<a class="link" href="GstGLFramebuffer.html#gst-gl-framebuffer-delete" title="gst_gl_framebuffer_delete ()">gst_gl_framebuffer_delete</a>, function in <a class="link" href="GstGLFramebuffer.html" title="GstGLFramebuffer">GstGLFramebuffer</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="GstGLFramebuffer.html#gst-gl-framebuffer-generate" title="gst_gl_framebuffer_generate ()">gst_gl_framebuffer_generate</a>, function in <a class="link" href="GstGLFramebuffer.html" title="GstGLFramebuffer">GstGLFramebuffer</a>
-</dt>
-<dd></dd>
-<dt>
<a class="link" href="GstGLFramebuffer.html#gst-gl-framebuffer-new" title="gst_gl_framebuffer_new ()">gst_gl_framebuffer_new</a>, function in <a class="link" href="GstGLFramebuffer.html" title="GstGLFramebuffer">GstGLFramebuffer</a>
</dt>
<dd></dd>
<dt>
-<a class="link" href="GstGLFramebuffer.html#gst-gl-framebuffer-use-v2" title="gst_gl_framebuffer_use_v2 ()">gst_gl_framebuffer_use_v2</a>, function in <a class="link" href="GstGLFramebuffer.html" title="GstGLFramebuffer">GstGLFramebuffer</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-generate-texture-full" title="gst_gl_generate_texture_full ()">gst_gl_generate_texture_full</a>, function in <a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html" title="OpenGL Miscellaneous Utilities">OpenGL Miscellaneous Utilities</a>
-</dt>
-<dd></dd>
-<dt>
<a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-get-plane-data-size" title="gst_gl_get_plane_data_size ()">gst_gl_get_plane_data_size</a>, function in <a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html" title="OpenGL Miscellaneous Utilities">OpenGL Miscellaneous Utilities</a>
</dt>
<dd></dd>
@@ -1647,6 +1551,10 @@
</dt>
<dd></dd>
<dt>
+<a class="link" href="gst-plugins-bad-libs-GstGLMemory.html#gst-gl-video-allocation-params-new-wrapped-gl-handle" title="gst_gl_video_allocation_params_new_wrapped_gl_handle ()">gst_gl_video_allocation_params_new_wrapped_gl_handle</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-video-allocation-params-new-wrapped-texture" title="gst_gl_video_allocation_params_new_wrapped_texture ()">gst_gl_video_allocation_params_new_wrapped_texture</a>, function in <a class="link" href="gst-plugins-bad-libs-GstGLMemory.html" title="GstGLMemory">GstGLMemory</a>
</dt>
<dd></dd>
@@ -2049,10 +1957,6 @@
</dt>
<dd></dd>
<dt>
-<a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html#gst-is-egl-image-memory" title="gst_is_egl_image_memory ()">gst_is_egl_image_memory</a>, function in <a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html" title="GstEGLImageMemory">GstEGLImageMemory</a>
-</dt>
-<dd></dd>
-<dt>
<a class="link" href="gst-plugins-bad-libs-gstglbasememory.html#gst-is-gl-base-memory" title="gst_is_gl_base_memory ()">gst_is_gl_base_memory</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglbasememory.html" title="GstGLBaseMemory">GstGLBaseMemory</a>
</dt>
<dd></dd>
@@ -3340,6 +3244,10 @@
</dt>
<dd></dd>
<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-uri-loaded" title="The “uri-loaded” signal">GstPlayer::uri-loaded</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>
@@ -3352,6 +3260,10 @@
</dt>
<dd></dd>
<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--audio-video-offset" title="The “audio-video-offset” property">GstPlayer:audio-video-offset</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-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>
@@ -3384,10 +3296,6 @@
</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>
@@ -3404,6 +3312,14 @@
</dt>
<dd></dd>
<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--video-multiview-flags" title="The “video-multiview-flags” property">GstPlayer:video-multiview-flags</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-multiview-mode" title="The “video-multiview-mode” property">GstPlayer:video-multiview-mode</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>
@@ -3488,6 +3404,22 @@
</dt>
<dd></dd>
<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-config-get-position-update-interval" title="gst_player_config_get_position_update_interval ()">gst_player_config_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-config-get-user-agent" title="gst_player_config_get_user_agent ()">gst_player_config_get_user_agent</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-config-set-position-update-interval" title="gst_player_config_set_position_update_interval ()">gst_player_config_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-config-set-user-agent" title="gst_player_config_set_user_agent ()">gst_player_config_set_user_agent</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>
@@ -3500,10 +3432,18 @@
</dt>
<dd></dd>
<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-audio-video-offset" title="gst_player_get_audio_video_offset ()">gst_player_get_audio_video_offset</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-config" title="gst_player_get_config ()">gst_player_get_config</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>
@@ -3528,6 +3468,14 @@
</dt>
<dd></dd>
<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-multiview-flags" title="gst_player_get_multiview_flags ()">gst_player_get_multiview_flags</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-multiview-mode" title="gst_player_get_multiview_mode ()">gst_player_get_multiview_mode</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>
@@ -3540,10 +3488,6 @@
</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>
@@ -3604,6 +3548,10 @@
</dt>
<dd></dd>
<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-is-live" title="gst_player_media_info_is_live ()">gst_player_media_info_is_live</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>
@@ -3632,15 +3580,27 @@
</dt>
<dd></dd>
<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-audio-video-offset" title="gst_player_set_audio_video_offset ()">gst_player_set_audio_video_offset</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>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-config" title="gst_player_set_config ()">gst_player_set_config</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>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-multiview-flags" title="gst_player_set_multiview_flags ()">gst_player_set_multiview_flags</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-multiview-mode" title="gst_player_set_multiview_mode ()">gst_player_set_multiview_mode</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>
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 ef0bc7c..e120295 100644
--- a/docs/libs/html/gst-plugins-bad-libs-1.0.devhelp2
+++ b/docs/libs/html/gst-plugins-bad-libs-1.0.devhelp2
@@ -576,32 +576,20 @@
<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_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"/>
- <keyword type="function" name="gst_egl_image_memory_get_orientation ()" link="gst-plugins-bad-libs-GstEGLImageMemory.html#gst-egl-image-memory-get-orientation"/>
- <keyword type="function" name="gst_egl_image_memory_set_orientation ()" link="gst-plugins-bad-libs-GstEGLImageMemory.html#gst-egl-image-memory-set-orientation"/>
- <keyword type="function" name="gst_egl_image_memory_setup_buffer ()" link="gst-plugins-bad-libs-GstEGLImageMemory.html#gst-egl-image-memory-setup-buffer"/>
- <keyword type="function" name="gst_is_egl_image_memory ()" link="gst-plugins-bad-libs-GstEGLImageMemory.html#gst-is-egl-image-memory"/>
- <keyword type="macro" name="GST_EGL_IMAGE_MEMORY_TYPE" link="gst-plugins-bad-libs-GstEGLImageMemory.html#GST-EGL-IMAGE-MEMORY-TYPE:CAPS"/>
- <keyword type="macro" name="GST_CAPS_FEATURE_MEMORY_EGL_IMAGE" link="gst-plugins-bad-libs-GstEGLImageMemory.html#GST-CAPS-FEATURE-MEMORY-EGL-IMAGE:CAPS"/>
- <keyword type="function" name="gst_gl_filter_draw_texture ()" link="GstGLFilter.html#gst-gl-filter-draw-texture"/>
<keyword type="function" name="gst_gl_filter_render_to_target ()" link="GstGLFilter.html#gst-gl-filter-render-to-target"/>
<keyword type="function" name="gst_gl_filter_render_to_target_with_shader ()" link="GstGLFilter.html#gst-gl-filter-render-to-target-with-shader"/>
<keyword type="function" name="gst_gl_filter_filter_texture ()" link="GstGLFilter.html#gst-gl-filter-filter-texture"/>
<keyword type="struct" name="GstGLFilter" link="GstGLFilter.html#GstGLFilter-struct"/>
<keyword type="struct" name="GstGLFilterClass" link="GstGLFilter.html#GstGLFilterClass"/>
<keyword type="function" name="gst_gl_framebuffer_new ()" link="GstGLFramebuffer.html#gst-gl-framebuffer-new"/>
- <keyword type="function" name="gst_gl_framebuffer_generate ()" link="GstGLFramebuffer.html#gst-gl-framebuffer-generate"/>
- <keyword type="function" name="gst_gl_framebuffer_delete ()" link="GstGLFramebuffer.html#gst-gl-framebuffer-delete"/>
- <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="GstGLFramebuffer" link="GstGLFramebuffer.html#GstGLFramebuffer-struct"/>
<keyword type="struct" name="struct GstGLFramebufferClass" link="GstGLFramebuffer.html#GstGLFramebufferClass"/>
<keyword type="function" name="gst_gl_video_allocation_params_copy_data ()" link="gst-plugins-bad-libs-GstGLMemory.html#gst-gl-video-allocation-params-copy-data" since="1.8"/>
<keyword type="function" name="gst_gl_video_allocation_params_free_data ()" link="gst-plugins-bad-libs-GstGLMemory.html#gst-gl-video-allocation-params-free-data" since="1.8"/>
<keyword type="function" name="gst_gl_video_allocation_params_init_full ()" link="gst-plugins-bad-libs-GstGLMemory.html#gst-gl-video-allocation-params-init-full" since="1.8"/>
<keyword type="function" name="gst_gl_video_allocation_params_new ()" link="gst-plugins-bad-libs-GstGLMemory.html#gst-gl-video-allocation-params-new" since="1.8"/>
<keyword type="function" name="gst_gl_video_allocation_params_new_wrapped_data ()" link="gst-plugins-bad-libs-GstGLMemory.html#gst-gl-video-allocation-params-new-wrapped-data" since="1.8"/>
+ <keyword type="function" name="gst_gl_video_allocation_params_new_wrapped_gl_handle ()" link="gst-plugins-bad-libs-GstGLMemory.html#gst-gl-video-allocation-params-new-wrapped-gl-handle" since="1.8"/>
<keyword type="function" name="gst_gl_video_allocation_params_new_wrapped_texture ()" link="gst-plugins-bad-libs-GstGLMemory.html#gst-gl-video-allocation-params-new-wrapped-texture" since="1.8"/>
<keyword type="function" name="gst_gl_memory_allocator_get_default ()" link="gst-plugins-bad-libs-GstGLMemory.html#gst-gl-memory-allocator-get-default" since="1.8"/>
<keyword type="function" name="gst_gl_memory_init_once ()" link="gst-plugins-bad-libs-GstGLMemory.html#gst-gl-memory-init-once" since="1.4"/>
@@ -775,23 +763,12 @@
<keyword type="macro" name="GST_GL_ASYNC_CAT_LEVEL_LOG()" link="gst-plugins-bad-libs-OpenGL-debugging.html#GST-GL-ASYNC-CAT-LEVEL-LOG:CAPS"/>
<keyword type="function" name="gst_gl_insert_debug_marker ()" link="gst-plugins-bad-libs-OpenGL-debugging.html#gst-gl-insert-debug-marker" since="1.8"/>
<keyword type="struct" name="struct GstGLAsyncDebug" link="gst-plugins-bad-libs-OpenGL-debugging.html#GstGLAsyncDebug"/>
- <keyword type="function" name="GLCB ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#GLCB:CAPS"/>
- <keyword type="function" name="GLCB_V2 ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#GLCB-V2:CAPS"/>
- <keyword type="function" name="CDCB ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#CDCB:CAPS"/>
<keyword type="function" name="gst_gl_handle_set_context ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-handle-set-context"/>
<keyword type="function" name="gst_gl_handle_context_query ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-handle-context-query"/>
- <keyword type="function" name="gst_gl_context_gen_texture ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-gen-texture"/>
- <keyword type="function" name="gst_gl_context_del_texture ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-del-texture"/>
- <keyword type="function" name="gst_gl_context_gen_fbo ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-gen-fbo"/>
- <keyword type="function" name="gst_gl_context_del_fbo ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-del-fbo"/>
- <keyword type="function" name="gst_gl_context_use_fbo_v2 ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-use-fbo-v2"/>
<keyword type="function" name="gst_gl_context_gen_shader ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-gen-shader"/>
<keyword type="function" name="gst_gl_context_del_shader ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-del-shader"/>
<keyword type="function" name="gst_gl_context_check_framebuffer_status ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-check-framebuffer-status"/>
- <keyword type="function" name="gst_gl_context_set_error ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-set-error"/>
- <keyword type="function" name="gst_gl_context_get_error ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-get-error"/>
<keyword type="function" name="gst_gl_context_clear_shader ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-clear-shader"/>
- <keyword type="function" name="gst_gl_generate_texture_full ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-generate-texture-full"/>
<keyword type="function" name="gst_gl_caps_replace_all_caps_features ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-caps-replace-all-caps-features"/>
<keyword type="function" name="gst_gl_ensure_element_data ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-ensure-element-data"/>
<keyword type="function" name="gst_gl_get_plane_data_size ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-get-plane-data-size"/>
@@ -800,7 +777,6 @@
<keyword type="function" name="gst_gl_value_get_texture_target_mask ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-value-get-texture-target-mask"/>
<keyword type="function" name="gst_gl_value_set_texture_target ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-value-set-texture-target"/>
<keyword type="function" name="gst_gl_value_set_texture_target_from_mask ()" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-value-set-texture-target-from-mask"/>
- <keyword type="enum" name="enum GstGLDisplayProjection" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#GstGLDisplayProjection"/>
<keyword type="function" name="gst_gl_format_type_n_bytes ()" link="gst-plugins-bad-libs-OpenGL-Formats.html#gst-gl-format-type-n-bytes"/>
<keyword type="function" name="gst_gl_texture_type_n_bytes ()" link="gst-plugins-bad-libs-OpenGL-Formats.html#gst-gl-texture-type-n-bytes"/>
<keyword type="function" name="gst_gl_format_from_gl_texture_type ()" link="gst-plugins-bad-libs-OpenGL-Formats.html#gst-gl-format-from-gl-texture-type"/>
@@ -832,8 +808,8 @@
<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_set_config ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-set-config"/>
+ <keyword type="function" name="gst_player_get_config ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-config"/>
<keyword type="function" name="gst_player_state_get_name ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-state-get-name"/>
<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"/>
@@ -858,8 +834,18 @@
<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_multiview_mode ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-multiview-mode" since="1.10"/>
+ <keyword type="function" name="gst_player_set_multiview_mode ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-set-multiview-mode" since="1.10"/>
+ <keyword type="function" name="gst_player_get_multiview_flags ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-multiview-flags" since="1.10"/>
+ <keyword type="function" name="gst_player_set_multiview_flags ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-set-multiview-flags" since="1.10"/>
+ <keyword type="function" name="gst_player_get_audio_video_offset ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-audio-video-offset"/>
+ <keyword type="function" name="gst_player_set_audio_video_offset ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-set-audio-video-offset"/>
<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="function" name="gst_player_config_set_position_update_interval ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-config-set-position-update-interval"/>
+ <keyword type="function" name="gst_player_config_get_position_update_interval ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-config-get-position-update-interval"/>
+ <keyword type="function" name="gst_player_config_set_user_agent ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-config-set-user-agent"/>
+ <keyword type="function" name="gst_player_config_get_user_agent ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-config-get-user-agent"/>
<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="macro" name="GST_PLAYER_ERROR" link="gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-ERROR:CAPS"/>
@@ -869,6 +855,7 @@
<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 “audio-video-offset” property" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer--audio-video-offset"/>
<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"/>
@@ -877,11 +864,12 @@
<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-multiview-flags” property" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer--video-multiview-flags"/>
+ <keyword type="property" name="The “video-multiview-mode” property" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer--video-multiview-mode"/>
<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"/>
@@ -893,6 +881,7 @@
<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 “uri-loaded” signal" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer-uri-loaded"/>
<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"/>
@@ -901,6 +890,7 @@
<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_is_live ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-is-live"/>
<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"/>
@@ -1731,8 +1721,6 @@
<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_GL_DISPLAY_PROJECTION_ORTHO2D" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#GST-GL-DISPLAY-PROJECTION-ORTHO2D:CAPS"/>
- <keyword type="constant" name="GST_GL_DISPLAY_PROJECTION_PERSPECTIVE" link="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#GST-GL-DISPLAY-PROJECTION-PERSPECTIVE:CAPS"/>
<keyword type="constant" name="GST_GL_TEXTURE_TARGET_NONE" link="gst-plugins-bad-libs-OpenGL-Formats.html#GST-GL-TEXTURE-TARGET-NONE:CAPS"/>
<keyword type="constant" name="GST_GL_TEXTURE_TARGET_2D" link="gst-plugins-bad-libs-OpenGL-Formats.html#GST-GL-TEXTURE-TARGET-2D:CAPS"/>
<keyword type="constant" name="GST_GL_TEXTURE_TARGET_RECTANGLE" link="gst-plugins-bad-libs-OpenGL-Formats.html#GST-GL-TEXTURE-TARGET-RECTANGLE:CAPS"/>
@@ -1892,8 +1880,8 @@
<keyword type="member" name="GstH264SPS.crop-rect-height" link="gst-plugins-bad-libs-h264parser.html#GstH264SPS.crop-rect-height"/>
<keyword type="member" name="GstH264SPS.crop-rect-x" link="gst-plugins-bad-libs-h264parser.html#GstH264SPS.crop-rect-x"/>
<keyword type="member" name="GstH264SPS.crop-rect-y" link="gst-plugins-bad-libs-h264parser.html#GstH264SPS.crop-rect-y"/>
- <keyword type="member" name="GstH264SPS.fps-num" link="gst-plugins-bad-libs-h264parser.html#GstH264SPS.fps-num"/>
- <keyword type="member" name="GstH264SPS.fps-den" link="gst-plugins-bad-libs-h264parser.html#GstH264SPS.fps-den"/>
+ <keyword type="member" name="GstH264SPS.fps-num-removed" link="gst-plugins-bad-libs-h264parser.html#GstH264SPS.fps-num-removed"/>
+ <keyword type="member" name="GstH264SPS.fps-den-removed" link="gst-plugins-bad-libs-h264parser.html#GstH264SPS.fps-den-removed"/>
<keyword type="member" name="GstH264SPS.valid" link="gst-plugins-bad-libs-h264parser.html#GstH264SPS.valid"/>
<keyword type="member" name="GstH264SPS.extension-type" link="gst-plugins-bad-libs-h264parser.html#GstH264SPS.extension-type"/>
<keyword type="member" name="GstH264HRDParams.cpb-cnt-minus1" link="gst-plugins-bad-libs-h264parser.html#GstH264HRDParams.cpb-cnt-minus1"/>
@@ -1975,7 +1963,9 @@
<keyword type="member" name="GstMpegVideoSequenceHdr.bitrate-value" link="gst-plugins-bad-libs-mpegvideoparser.html#GstMpegVideoSequenceHdr.bitrate-value"/>
<keyword type="member" name="GstMpegVideoSequenceHdr.vbv-buffer-size-value" link="gst-plugins-bad-libs-mpegvideoparser.html#GstMpegVideoSequenceHdr.vbv-buffer-size-value"/>
<keyword type="member" name="GstMpegVideoSequenceHdr.constrained-parameters-flag" link="gst-plugins-bad-libs-mpegvideoparser.html#GstMpegVideoSequenceHdr.constrained-parameters-flag"/>
+ <keyword type="member" name="GstMpegVideoSequenceHdr.load-intra-quantiser-matrix" link="gst-plugins-bad-libs-mpegvideoparser.html#GstMpegVideoSequenceHdr.load-intra-quantiser-matrix"/>
<keyword type="member" name="GstMpegVideoSequenceHdr.intra-quantizer-matrix" link="gst-plugins-bad-libs-mpegvideoparser.html#GstMpegVideoSequenceHdr.intra-quantizer-matrix"/>
+ <keyword type="member" name="GstMpegVideoSequenceHdr.load-non-intra-quantiser-matrix" link="gst-plugins-bad-libs-mpegvideoparser.html#GstMpegVideoSequenceHdr.load-non-intra-quantiser-matrix"/>
<keyword type="member" name="GstMpegVideoSequenceHdr.non-intra-quantizer-matrix" link="gst-plugins-bad-libs-mpegvideoparser.html#GstMpegVideoSequenceHdr.non-intra-quantizer-matrix"/>
<keyword type="member" name="GstMpegVideoSequenceHdr.par-w" link="gst-plugins-bad-libs-mpegvideoparser.html#GstMpegVideoSequenceHdr.par-w"/>
<keyword type="member" name="GstMpegVideoSequenceHdr.par-h" link="gst-plugins-bad-libs-mpegvideoparser.html#GstMpegVideoSequenceHdr.par-h"/>
@@ -1996,6 +1986,7 @@
<keyword type="member" name="GstMpegVideoSequenceExt.profile-level-escape-bit" link="gst-plugins-bad-libs-mpegvideoparser.html#GstMpegVideoSequenceExt.profile-level-escape-bit"/>
<keyword type="member" name="GstMpegVideoPictureHdr.tsn" link="gst-plugins-bad-libs-mpegvideoparser.html#GstMpegVideoPictureHdr.tsn"/>
<keyword type="member" name="GstMpegVideoPictureHdr.pic-type" link="gst-plugins-bad-libs-mpegvideoparser.html#GstMpegVideoPictureHdr.pic-type"/>
+ <keyword type="member" name="GstMpegVideoPictureHdr.vbv-delay" link="gst-plugins-bad-libs-mpegvideoparser.html#GstMpegVideoPictureHdr.vbv-delay"/>
<keyword type="member" name="GstMpegVideoPictureHdr.full-pel-forward-vector" link="gst-plugins-bad-libs-mpegvideoparser.html#GstMpegVideoPictureHdr.full-pel-forward-vector"/>
<keyword type="member" name="GstMpegVideoPictureHdr.full-pel-backward-vector" link="gst-plugins-bad-libs-mpegvideoparser.html#GstMpegVideoPictureHdr.full-pel-backward-vector"/>
<keyword type="member" name="GstMpegVideoPictureHdr.f-code" link="gst-plugins-bad-libs-mpegvideoparser.html#GstMpegVideoPictureHdr.f-code"/>
@@ -2325,11 +2316,11 @@
<keyword type="member" name="GstGLBaseMemoryAllocatorClass.alloc" link="gst-plugins-bad-libs-gstglbasememory.html#GstGLBaseMemoryAllocatorClass.alloc"/>
<keyword type="member" name="GstGLBaseMemoryAllocatorClass.create" link="gst-plugins-bad-libs-gstglbasememory.html#GstGLBaseMemoryAllocatorClass.create"/>
<keyword type="member" name="GstGLBaseMemoryAllocatorClass.map" link="gst-plugins-bad-libs-gstglbasememory.html#GstGLBaseMemoryAllocatorClass.map"/>
- <keyword type="member" name="GstGLBaseMemoryAllocatorClass.flush" link="gst-plugins-bad-libs-gstglbasememory.html#GstGLBaseMemoryAllocatorClass.flush"/>
- <keyword type="member" name="GstGLBaseMemoryAllocatorClass.invalidate" link="gst-plugins-bad-libs-gstglbasememory.html#GstGLBaseMemoryAllocatorClass.invalidate"/>
<keyword type="member" name="GstGLBaseMemoryAllocatorClass.unmap" link="gst-plugins-bad-libs-gstglbasememory.html#GstGLBaseMemoryAllocatorClass.unmap"/>
<keyword type="member" name="GstGLBaseMemoryAllocatorClass.copy" link="gst-plugins-bad-libs-gstglbasememory.html#GstGLBaseMemoryAllocatorClass.copy"/>
<keyword type="member" name="GstGLBaseMemoryAllocatorClass.destroy" link="gst-plugins-bad-libs-gstglbasememory.html#GstGLBaseMemoryAllocatorClass.destroy"/>
+ <keyword type="member" name="GstGLBaseMemoryAllocatorClass.flush" link="gst-plugins-bad-libs-gstglbasememory.html#GstGLBaseMemoryAllocatorClass.flush"/>
+ <keyword type="member" name="GstGLBaseMemoryAllocatorClass.invalidate" link="gst-plugins-bad-libs-gstglbasememory.html#GstGLBaseMemoryAllocatorClass.invalidate"/>
<keyword type="member" name="GstGLAllocationParams.struct-size" link="gst-plugins-bad-libs-gstglbasememory.html#GstGLAllocationParams.struct-size"/>
<keyword type="member" name="GstGLAllocationParams.copy" link="gst-plugins-bad-libs-gstglbasememory.html#GstGLAllocationParams.copy"/>
<keyword type="member" name="GstGLAllocationParams.free" link="gst-plugins-bad-libs-gstglbasememory.html#GstGLAllocationParams.free"/>
@@ -2361,6 +2352,7 @@
<keyword type="member" name="GstGLFilterClass.transform-internal-caps" link="GstGLFilter.html#GstGLFilterClass.transform-internal-caps"/>
<keyword type="member" name="GstGLFilterClass.display-init-cb" link="GstGLFilter.html#GstGLFilterClass.display-init-cb"/>
<keyword type="member" name="GstGLFilterClass.display-reset-cb" link="GstGLFilter.html#GstGLFilterClass.display-reset-cb"/>
+ <keyword type="member" name="GstGLFilterClass.-padding" link="GstGLFilter.html#GstGLFilterClass.-padding"/>
<keyword type="member" name="GstGLMemory.mem" link="gst-plugins-bad-libs-GstGLMemory.html#GstGLMemory.mem"/>
<keyword type="member" name="GstGLMemory.tex-id" link="gst-plugins-bad-libs-GstGLMemory.html#GstGLMemory.tex-id"/>
<keyword type="member" name="GstGLMemory.tex-target" link="gst-plugins-bad-libs-GstGLMemory.html#GstGLMemory.tex-target"/>
diff --git a/docs/libs/html/gst-plugins-bad-libs-GstEGLImageMemory.html b/docs/libs/html/gst-plugins-bad-libs-GstEGLImageMemory.html
index 8143490..166bb00 100644
--- a/docs/libs/html/gst-plugins-bad-libs-GstEGLImageMemory.html
+++ b/docs/libs/html/gst-plugins-bad-libs-GstEGLImageMemory.html
@@ -32,154 +32,14 @@
<td class="gallery_image" valign="top" align="right"></td>
</tr></table></div>
<div class="refsect1">
-<a name="gst-plugins-bad-libs-GstEGLImageMemory.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table class="informaltable" width="100%" border="0">
-<colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
-</colgroup>
-<tbody>
-<tr>
-<td class="function_type">
-<span class="returnvalue">void</span>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html#gst-egl-image-memory-init" title="gst_egl_image_memory_init ()">gst_egl_image_memory_init</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">EGLDisplay</span>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html#gst-egl-image-memory-get-display" title="gst_egl_image_memory_get_display ()">gst_egl_image_memory_get_display</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">EGLImageKHR</span>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html#gst-egl-image-memory-get-image" title="gst_egl_image_memory_get_image ()">gst_egl_image_memory_get_image</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GstVideoGLTextureOrientation</span>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html#gst-egl-image-memory-get-orientation" title="gst_egl_image_memory_get_orientation ()">gst_egl_image_memory_get_orientation</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-GstEGLImageMemory.html#gst-egl-image-memory-set-orientation" title="gst_egl_image_memory_set_orientation ()">gst_egl_image_memory_set_orientation</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html#gst-egl-image-memory-setup-buffer" title="gst_egl_image_memory_setup_buffer ()">gst_egl_image_memory_setup_buffer</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html#gst-is-egl-image-memory" title="gst_is_egl_image_memory ()">gst_is_egl_image_memory</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<div class="refsect1">
-<a name="gst-plugins-bad-libs-GstEGLImageMemory.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table class="informaltable" width="100%" border="0">
-<colgroup>
-<col width="150px" class="name">
-<col class="description">
-</colgroup>
-<tbody>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html#GST-EGL-IMAGE-MEMORY-TYPE:CAPS" title="GST_EGL_IMAGE_MEMORY_TYPE">GST_EGL_IMAGE_MEMORY_TYPE</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="gst-plugins-bad-libs-GstEGLImageMemory.html#GST-CAPS-FEATURE-MEMORY-EGL-IMAGE:CAPS" title="GST_CAPS_FEATURE_MEMORY_EGL_IMAGE">GST_CAPS_FEATURE_MEMORY_EGL_IMAGE</a></td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<div class="refsect1">
<a name="gst-plugins-bad-libs-GstEGLImageMemory.description"></a><h2>Description</h2>
</div>
<div class="refsect1">
<a name="gst-plugins-bad-libs-GstEGLImageMemory.functions_details"></a><h2>Functions</h2>
-<div class="refsect2">
-<a name="gst-egl-image-memory-init"></a><h3>gst_egl_image_memory_init ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-gst_egl_image_memory_init (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-egl-image-memory-get-display"></a><h3>gst_egl_image_memory_get_display ()</h3>
-<pre class="programlisting"><span class="returnvalue">EGLDisplay</span>
-gst_egl_image_memory_get_display (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstMemory.html#GstMemory-struct"><span class="type">GstMemory</span></a> *mem</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-egl-image-memory-get-image"></a><h3>gst_egl_image_memory_get_image ()</h3>
-<pre class="programlisting"><span class="returnvalue">EGLImageKHR</span>
-gst_egl_image_memory_get_image (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstMemory.html#GstMemory-struct"><span class="type">GstMemory</span></a> *mem</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-egl-image-memory-get-orientation"></a><h3>gst_egl_image_memory_get_orientation ()</h3>
-<pre class="programlisting"><span class="returnvalue">GstVideoGLTextureOrientation</span>
-gst_egl_image_memory_get_orientation (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstMemory.html#GstMemory-struct"><span class="type">GstMemory</span></a> *mem</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-egl-image-memory-set-orientation"></a><h3>gst_egl_image_memory_set_orientation ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-gst_egl_image_memory_set_orientation (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstMemory.html#GstMemory-struct"><span class="type">GstMemory</span></a> *mem</code></em>,
- <em class="parameter"><code><span class="type">GstVideoGLTextureOrientation</span> orientation</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-egl-image-memory-setup-buffer"></a><h3>gst_egl_image_memory_setup_buffer ()</h3>
-<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_egl_image_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="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> *info</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstBuffer.html#GstBuffer-struct"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-is-egl-image-memory"></a><h3>gst_is_egl_image_memory ()</h3>
-<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_is_egl_image_memory (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstMemory.html#GstMemory-struct"><span class="type">GstMemory</span></a> *mem</code></em>);</pre>
-</div>
+<p></p>
</div>
<div class="refsect1">
<a name="gst-plugins-bad-libs-GstEGLImageMemory.other_details"></a><h2>Types and Values</h2>
-<div class="refsect2">
-<a name="GST-EGL-IMAGE-MEMORY-TYPE:CAPS"></a><h3>GST_EGL_IMAGE_MEMORY_TYPE</h3>
-<pre class="programlisting">#define GST_EGL_IMAGE_MEMORY_TYPE "EGLImage"
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GST-CAPS-FEATURE-MEMORY-EGL-IMAGE:CAPS"></a><h3>GST_CAPS_FEATURE_MEMORY_EGL_IMAGE</h3>
-<pre class="programlisting">#define GST_CAPS_FEATURE_MEMORY_EGL_IMAGE "memory:EGLImage"
-</pre>
-</div>
</div>
</div>
<div class="footer">
diff --git a/docs/libs/html/gst-plugins-bad-libs-GstGLContextEGL.html b/docs/libs/html/gst-plugins-bad-libs-GstGLContextEGL.html
index 04e867e..2f8ad01 100644
--- a/docs/libs/html/gst-plugins-bad-libs-GstGLContextEGL.html
+++ b/docs/libs/html/gst-plugins-bad-libs-GstGLContextEGL.html
@@ -116,12 +116,17 @@
EGLSurface egl_surface;
EGLConfig egl_config;
+ gint egl_major;
+ gint egl_minor;
+
GstGLAPI gl_api;
const gchar *egl_exts;
- EGLImageKHR (*eglCreateImage) (EGLDisplay dpy, EGLContext ctx, EGLenum target,
+ EGLImageKHR (*eglCreateImageKHR) (EGLDisplay dpy, EGLContext ctx, EGLenum target,
EGLClientBuffer buffer, const EGLint *attrib_list);
+ EGLImageKHR (*eglCreateImage) (EGLDisplay dpy, EGLContext ctx, EGLenum target,
+ EGLClientBuffer buffer, const EGLAttrib *attrib_list);
EGLBoolean (*eglDestroyImage) (EGLDisplay dpy, EGLImageKHR image);
/* Cached handle */
diff --git a/docs/libs/html/gst-plugins-bad-libs-GstGLMemory.html b/docs/libs/html/gst-plugins-bad-libs-GstGLMemory.html
index 633f69e..996f1fd 100644
--- a/docs/libs/html/gst-plugins-bad-libs-GstGLMemory.html
+++ b/docs/libs/html/gst-plugins-bad-libs-GstGLMemory.html
@@ -85,6 +85,14 @@
<a class="link" href="gst-plugins-bad-libs-GstGLMemory.html#GstGLVideoAllocationParams" title="struct GstGLVideoAllocationParams"><span class="returnvalue">GstGLVideoAllocationParams</span></a> *
</td>
<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-GstGLMemory.html#gst-gl-video-allocation-params-new-wrapped-gl-handle" title="gst_gl_video_allocation_params_new_wrapped_gl_handle ()">gst_gl_video_allocation_params_new_wrapped_gl_handle</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="gst-plugins-bad-libs-GstGLMemory.html#GstGLVideoAllocationParams" title="struct GstGLVideoAllocationParams"><span class="returnvalue">GstGLVideoAllocationParams</span></a> *
+</td>
+<td class="function_name">
<a class="link" href="gst-plugins-bad-libs-GstGLMemory.html#gst-gl-video-allocation-params-new-wrapped-texture" title="gst_gl_video_allocation_params_new_wrapped_texture ()">gst_gl_video_allocation_params_new_wrapped_texture</a> <span class="c_punctuation">()</span>
</td>
</tr>
@@ -337,8 +345,9 @@
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> plane</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoAlignment"><span class="type">GstVideoAlignment</span></a> *valign</code></em>,
<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-OpenGL-Formats.html#GstGLTextureTarget" title="enum GstGLTextureTarget"><span class="type">GstGLTextureTarget</span></a> target</code></em>,
+ <em class="parameter"><code><span class="type">GstVideoGLTextureType</span> tex_type</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> wrapped_data</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> gl_handle</code></em>,
+ <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> gl_handle</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> notify</code></em>);</pre>
<p>Intended for subclass usage</p>
@@ -412,6 +421,11 @@
<td class="parameter_annotations"> </td>
</tr>
<tr>
+<td class="parameter_name"><p>tex_type</p></td>
+<td class="parameter_description"><p>the <span class="type">GstVideoGLTextureType</span></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
<td class="parameter_name"><p>wrapped_data</p></td>
<td class="parameter_description"><p> the optional data pointer to wrap. </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>
@@ -451,7 +465,8 @@
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> *v_info</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> plane</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoAlignment"><span class="type">GstVideoAlignment</span></a> *valign</code></em>,
- <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-OpenGL-Formats.html#GstGLTextureTarget" title="enum GstGLTextureTarget"><span class="type">GstGLTextureTarget</span></a> target</code></em>);</pre>
+ <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-OpenGL-Formats.html#GstGLTextureTarget" title="enum GstGLTextureTarget"><span class="type">GstGLTextureTarget</span></a> target</code></em>,
+ <em class="parameter"><code><span class="type">GstVideoGLTextureType</span> tex_type</code></em>);</pre>
<div class="refsect3">
<a name="gst-gl-video-allocation-params-new.parameters"></a><h4>Parameters</h4>
<div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -468,32 +483,33 @@
</tr>
<tr>
<td class="parameter_name"><p>alloc_params</p></td>
-<td class="parameter_description"><p> the <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstAllocator.html#GstAllocationParams-struct"><span class="type">GstAllocationParams</span></a> for <em class="parameter"><code>wrapped_data</code></em>
-. </p></td>
+<td class="parameter_description"><p> the <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstAllocator.html#GstAllocationParams-struct"><span class="type">GstAllocationParams</span></a> for sysmem mappings of the texture. </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>v_info</p></td>
-<td class="parameter_description"><p>the <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> for <em class="parameter"><code>wrapped_data</code></em>
-</p></td>
+<td class="parameter_description"><p>the <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> for the texture</p></td>
<td class="parameter_annotations"> </td>
</tr>
<tr>
<td class="parameter_name"><p>plane</p></td>
-<td class="parameter_description"><p>the video plane <em class="parameter"><code>wrapped_data</code></em>
-represents</p></td>
+<td class="parameter_description"><p>the video plane of <em class="parameter"><code>v_info</code></em>
+to allocate</p></td>
<td class="parameter_annotations"> </td>
</tr>
<tr>
<td class="parameter_name"><p>valign</p></td>
-<td class="parameter_description"><p> any <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoAlignment"><span class="type">GstVideoAlignment</span></a> applied to symem mappings of <em class="parameter"><code>wrapped_data</code></em>
-. </p></td>
+<td class="parameter_description"><p> any <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoAlignment"><span class="type">GstVideoAlignment</span></a> applied to symem mappings of the texture. </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>target</p></td>
-<td class="parameter_description"><p>the <a class="link" href="gst-plugins-bad-libs-OpenGL-Formats.html#GstGLTextureTarget" title="enum GstGLTextureTarget"><span class="type">GstGLTextureTarget</span></a> for <em class="parameter"><code>wrapped_data</code></em>
-</p></td>
+<td class="parameter_description"><p>the <a class="link" href="gst-plugins-bad-libs-OpenGL-Formats.html#GstGLTextureTarget" title="enum GstGLTextureTarget"><span class="type">GstGLTextureTarget</span></a> for the created textures</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>target</p></td>
+<td class="parameter_description"><p>the <span class="type">GstVideoGLTextureType</span> for the created textures</p></td>
<td class="parameter_annotations"> </td>
</tr>
</tbody>
@@ -516,6 +532,7 @@
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> plane</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoAlignment"><span class="type">GstVideoAlignment</span></a> *valign</code></em>,
<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-OpenGL-Formats.html#GstGLTextureTarget" title="enum GstGLTextureTarget"><span class="type">GstGLTextureTarget</span></a> target</code></em>,
+ <em class="parameter"><code><span class="type">GstVideoGLTextureType</span> tex_type</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> wrapped_data</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> notify</code></em>);</pre>
@@ -564,6 +581,12 @@
<td class="parameter_annotations"> </td>
</tr>
<tr>
+<td class="parameter_name"><p>tex_type</p></td>
+<td class="parameter_description"><p>the <span class="type">GstVideoGLTextureType</span> for <em class="parameter"><code>wrapped_data</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
<td class="parameter_name"><p>wrapped_data</p></td>
<td class="parameter_description"><p>the data pointer to wrap</p></td>
<td class="parameter_annotations"> </td>
@@ -591,6 +614,101 @@
</div>
<hr>
<div class="refsect2">
+<a name="gst-gl-video-allocation-params-new-wrapped-gl-handle"></a><h3>gst_gl_video_allocation_params_new_wrapped_gl_handle ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-bad-libs-GstGLMemory.html#GstGLVideoAllocationParams" title="struct GstGLVideoAllocationParams"><span class="returnvalue">GstGLVideoAllocationParams</span></a> *
+gst_gl_video_allocation_params_new_wrapped_gl_handle
+ (<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="/usr/share/gtk-doc/html/gstreamer-1.0GstAllocator.html#GstAllocationParams-struct"><span class="type">GstAllocationParams</span></a> *alloc_params</code></em>,
+ <em class="parameter"><code><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> *v_info</code></em>,
+ <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> plane</code></em>,
+ <em class="parameter"><code><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoAlignment"><span class="type">GstVideoAlignment</span></a> *valign</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-OpenGL-Formats.html#GstGLTextureTarget" title="enum GstGLTextureTarget"><span class="type">GstGLTextureTarget</span></a> target</code></em>,
+ <em class="parameter"><code><span class="type">GstVideoGLTextureType</span> tex_type</code></em>,
+ <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> gl_handle</code></em>,
+ <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
+ <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> notify</code></em>);</pre>
+<p><em class="parameter"><code>gl_handle</code></em>
+ is defined by the specific OpenGL handle being wrapped
+For <a class="link" href="gst-plugins-bad-libs-GstGLMemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a> and <a class="link" href="gst-plugins-bad-libs-gstglmemorypbo.html#GstGLMemoryPBO" title="GstGLMemoryPBO"><span class="type">GstGLMemoryPBO</span></a> it is an OpenGL texture id.
+Other memory types may define it to require a different type of parameter.</p>
+<div class="refsect3">
+<a name="gst-gl-video-allocation-params-new-wrapped-gl-handle.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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>alloc_params</p></td>
+<td class="parameter_description"><p> the <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstAllocator.html#GstAllocationParams-struct"><span class="type">GstAllocationParams</span></a> for <em class="parameter"><code>tex_id</code></em>
+. </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>v_info</p></td>
+<td class="parameter_description"><p>the <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> for <em class="parameter"><code>tex_id</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>plane</p></td>
+<td class="parameter_description"><p>the video plane <em class="parameter"><code>tex_id</code></em>
+represents</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>valign</p></td>
+<td class="parameter_description"><p> any <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoAlignment"><span class="type">GstVideoAlignment</span></a> applied to symem mappings of <em class="parameter"><code>tex_id</code></em>
+. </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>target</p></td>
+<td class="parameter_description"><p>the <a class="link" href="gst-plugins-bad-libs-OpenGL-Formats.html#GstGLTextureTarget" title="enum GstGLTextureTarget"><span class="type">GstGLTextureTarget</span></a> for <em class="parameter"><code>tex_id</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>tex_type</p></td>
+<td class="parameter_description"><p>the <span class="type">GstVideoGLTextureType</span> for <em class="parameter"><code>tex_id</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>gl_handle</p></td>
+<td class="parameter_description"><p>the GL handle 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> 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>
+<tr>
+<td class="parameter_name"><p>notify</p></td>
+<td class="parameter_description"><p> a <a href="/usr/share/gtk-doc/html/glibglib-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>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gst-gl-video-allocation-params-new-wrapped-gl-handle.returns"></a><h4>Returns</h4>
+<p> a new <a class="link" href="gst-plugins-bad-libs-GstGLMemory.html#GstGLVideoAllocationParams" title="struct GstGLVideoAllocationParams"><span class="type">GstGLVideoAllocationParams</span></a> for wrapping <em class="parameter"><code>gl_handle</code></em>
+</p>
+</div>
+<p class="since">Since: 1.8</p>
+</div>
+<hr>
+<div class="refsect2">
<a name="gst-gl-video-allocation-params-new-wrapped-texture"></a><h3>gst_gl_video_allocation_params_new_wrapped_texture ()</h3>
<pre class="programlisting"><a class="link" href="gst-plugins-bad-libs-GstGLMemory.html#GstGLVideoAllocationParams" title="struct GstGLVideoAllocationParams"><span class="returnvalue">GstGLVideoAllocationParams</span></a> *
gst_gl_video_allocation_params_new_wrapped_texture
@@ -600,6 +718,7 @@
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> plane</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoAlignment"><span class="type">GstVideoAlignment</span></a> *valign</code></em>,
<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-OpenGL-Formats.html#GstGLTextureTarget" title="enum GstGLTextureTarget"><span class="type">GstGLTextureTarget</span></a> target</code></em>,
+ <em class="parameter"><code><span class="type">GstVideoGLTextureType</span> tex_type</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> tex_id</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> notify</code></em>);</pre>
@@ -648,6 +767,12 @@
<td class="parameter_annotations"> </td>
</tr>
<tr>
+<td class="parameter_name"><p>tex_type</p></td>
+<td class="parameter_description"><p>the <span class="type">GstGLTextureType</span> for <em class="parameter"><code>tex_id</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
<td class="parameter_name"><p>tex_id</p></td>
<td class="parameter_description"><p>the GL texture to wrap</p></td>
<td class="parameter_annotations"> </td>
@@ -718,6 +843,7 @@
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstMemory.html#GstMemory-struct"><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><a class="link" href="gst-plugins-bad-libs-OpenGL-Formats.html#GstGLTextureTarget" title="enum GstGLTextureTarget"><span class="type">GstGLTextureTarget</span></a> target</code></em>,
+ <em class="parameter"><code><span class="type">GstVideoGLTextureType</span> tex_type</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstAllocator.html#GstAllocationParams-struct"><span class="type">GstAllocationParams</span></a> *params</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> *info</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> plane</code></em>,
@@ -1119,7 +1245,10 @@
<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
gst_gl_memory_setup_buffer (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-GstGLMemory.html#GstGLMemoryAllocator"><span class="type">GstGLMemoryAllocator</span></a> *allocator</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstBuffer.html#GstBuffer-struct"><span class="type">GstBuffer</span></a> *buffer</code></em>,
- <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-GstGLMemory.html#GstGLVideoAllocationParams" title="struct GstGLVideoAllocationParams"><span class="type">GstGLVideoAllocationParams</span></a> *params</code></em>);</pre>
+ <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-GstGLMemory.html#GstGLVideoAllocationParams" title="struct GstGLVideoAllocationParams"><span class="type">GstGLVideoAllocationParams</span></a> *params</code></em>,
+ <em class="parameter"><code><span class="type">GstVideoGLTextureType</span> *tex_types</code></em>,
+ <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> *wrapped_data</code></em>,
+ <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gsize"><span class="type">gsize</span></a> n_wrapped_pointers</code></em>);</pre>
<div class="refsect3">
<a name="gst-gl-memory-setup-buffer.parameters"></a><h4>Parameters</h4>
<div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1145,6 +1274,11 @@
<td class="parameter_description"><p>the <a class="link" href="gst-plugins-bad-libs-GstGLMemory.html#GstGLVideoAllocationParams" title="struct GstGLVideoAllocationParams"><span class="type">GstGLVideoAllocationParams</span></a> to allocate with</p></td>
<td class="parameter_annotations"> </td>
</tr>
+<tr>
+<td class="parameter_name"><p>tex_types</p></td>
+<td class="parameter_description"><p> a list of <span class="type">GstVideoGLTextureType</span>'s to allocate 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>
@@ -1171,6 +1305,7 @@
guint plane;
GstVideoAlignment *valign;
GstGLTextureTarget target;
+ GstVideoGLTextureType tex_type;
};
</pre>
</div>
diff --git a/docs/libs/html/gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html b/docs/libs/html/gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html
index a3841ea..3dea301 100644
--- a/docs/libs/html/gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html
+++ b/docs/libs/html/gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html
@@ -41,30 +41,6 @@
<tbody>
<tr>
<td class="function_type">
-<span class="returnvalue">void</span>
-</td>
-<td class="function_name">
-<span class="c_punctuation">(</span><a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#GLCB:CAPS" title="GLCB ()">*GLCB</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">void</span>
-</td>
-<td class="function_name">
-<span class="c_punctuation">(</span><a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#GLCB-V2:CAPS" title="GLCB_V2 ()">*GLCB_V2</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-</td>
-<td class="function_name">
-<span class="c_punctuation">(</span><a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#CDCB:CAPS" title="CDCB ()">*CDCB</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
</td>
<td class="function_name">
@@ -81,46 +57,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-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-gen-texture" title="gst_gl_context_gen_texture ()">gst_gl_context_gen_texture</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-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-del-texture" title="gst_gl_context_del_texture ()">gst_gl_context_del_texture</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-gen-fbo" title="gst_gl_context_gen_fbo ()">gst_gl_context_gen_fbo</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-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-del-fbo" title="gst_gl_context_del_fbo ()">gst_gl_context_del_fbo</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-use-fbo-v2" title="gst_gl_context_use_fbo_v2 ()">gst_gl_context_use_fbo_v2</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
</td>
<td class="function_name">
@@ -148,35 +84,11 @@
<span class="returnvalue">void</span>
</td>
<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-set-error" title="gst_gl_context_set_error ()">gst_gl_context_set_error</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-get-error" title="gst_gl_context_get_error ()">gst_gl_context_get_error</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-OpenGL-Miscellaneous-Utilities.html#gst-gl-context-clear-shader" title="gst_gl_context_clear_shader ()">gst_gl_context_clear_shader</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-OpenGL-Miscellaneous-Utilities.html#gst-gl-generate-texture-full" title="gst_gl_generate_texture_full ()">gst_gl_generate_texture_full</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
<a href="/usr/share/gtk-doc/html/gstreamer-1.0GstCaps.html#GstCaps-struct"><span class="returnvalue">GstCaps</span></a> *
</td>
<td class="function_name">
@@ -243,130 +155,11 @@
</table></div>
</div>
<div class="refsect1">
-<a name="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table class="informaltable" width="100%" border="0">
-<colgroup>
-<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-OpenGL-Miscellaneous-Utilities.html#GstGLDisplayProjection" title="enum GstGLDisplayProjection">GstGLDisplayProjection</a></td>
-</tr></tbody>
-</table></div>
-</div>
-<div class="refsect1">
<a name="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.description"></a><h2>Description</h2>
</div>
<div class="refsect1">
<a name="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.functions_details"></a><h2>Functions</h2>
<div class="refsect2">
-<a name="GLCB:CAPS"></a><h3>GLCB ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-<span class="c_punctuation">(</span>*GLCB<span class="c_punctuation">)</span> (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> Param1</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> Param2</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> Param3</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-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="GLCB.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table class="informaltable" 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>width</p></td>
-<td class="parameter_description"><p>the width</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>height</p></td>
-<td class="parameter_description"><p>the height</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>texture</p></td>
-<td class="parameter_description"><p>texture</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>stuff</p></td>
-<td class="parameter_description"><p>user data</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-</tbody>
-</table></div>
-</div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GLCB-V2:CAPS"></a><h3>GLCB_V2 ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-<span class="c_punctuation">(</span>*GLCB_V2<span class="c_punctuation">)</span> (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-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="GLCB-V2.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table class="informaltable" 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>stuff</p></td>
-<td class="parameter_description"><p>user data</p></td>
-<td class="parameter_annotations"> </td>
-</tr></tbody>
-</table></div>
-</div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="CDCB:CAPS"></a><h3>CDCB ()</h3>
-<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-<span class="c_punctuation">(</span>*CDCB<span class="c_punctuation">)</span> (<em class="parameter"><code><span class="type">GLuint</span> texture</code></em>,
- <em class="parameter"><code><span class="type">GLuint</span> width</code></em>,
- <em class="parameter"><code><span class="type">GLuint</span> height</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>);</pre>
-<p>client draw callback</p>
-<div class="refsect3">
-<a name="CDCB.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table class="informaltable" 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>texture</p></td>
-<td class="parameter_description"><p>texture to draw</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>width</p></td>
-<td class="parameter_description"><p>new width</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>height</p></td>
-<td class="parameter_description"><p>new height:</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>data</p></td>
-<td class="parameter_description"><p>user data</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-</tbody>
-</table></div>
-</div>
-</div>
-<hr>
-<div class="refsect2">
<a name="gst-gl-handle-set-context"></a><h3>gst_gl_handle_set_context ()</h3>
<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
gst_gl_handle_set_context (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct"><span class="type">GstElement</span></a> *element</code></em>,
@@ -385,54 +178,6 @@
</div>
<hr>
<div class="refsect2">
-<a name="gst-gl-context-gen-texture"></a><h3>gst_gl_context_gen_texture ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-gst_gl_context_gen_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><span class="type">GLuint</span> *pTexture</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoFormat"><span class="type">GstVideoFormat</span></a> v_format</code></em>,
- <em class="parameter"><code><span class="type">GLint</span> width</code></em>,
- <em class="parameter"><code><span class="type">GLint</span> height</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-context-del-texture"></a><h3>gst_gl_context_del_texture ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-gst_gl_context_del_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><span class="type">GLuint</span> *pTexture</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-context-gen-fbo"></a><h3>gst_gl_context_gen_fbo ()</h3>
-<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_gl_context_gen_fbo (<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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> width</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> height</code></em>,
- <em class="parameter"><code><span class="type">GLuint</span> *fbo</code></em>,
- <em class="parameter"><code><span class="type">GLuint</span> *depthbuffer</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-context-del-fbo"></a><h3>gst_gl_context_del_fbo ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-gst_gl_context_del_fbo (<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">GLuint</span> fbo</code></em>,
- <em class="parameter"><code><span class="type">GLuint</span> depth_buffer</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-context-use-fbo-v2"></a><h3>gst_gl_context_use_fbo_v2 ()</h3>
-<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_gl_context_use_fbo_v2 (<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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> texture_fbo_width</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> texture_fbo_height</code></em>,
- <em class="parameter"><code><span class="type">GLuint</span> fbo</code></em>,
- <em class="parameter"><code><span class="type">GLuint</span> depth_buffer</code></em>,
- <em class="parameter"><code><span class="type">GLuint</span> texture_fbo</code></em>,
- <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.html#GLCB-V2:CAPS" title="GLCB_V2 ()"><span class="type">GLCB_V2</span></a> cb</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> stuff</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
<a name="gst-gl-context-gen-shader"></a><h3>gst_gl_context_gen_shader ()</h3>
<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
gst_gl_context_gen_shader (<em class="parameter"><code><a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a> *context</code></em>,
@@ -456,20 +201,6 @@
</div>
<hr>
<div class="refsect2">
-<a name="gst-gl-context-set-error"></a><h3>gst_gl_context_set_error ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-gst_gl_context_set_error (<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>const <span class="type">char</span> *format</code></em>,
- <em class="parameter"><code>...</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-context-get-error"></a><h3>gst_gl_context_get_error ()</h3>
-<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
-gst_gl_context_get_error (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
<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>
@@ -493,18 +224,6 @@
</div>
<hr>
<div class="refsect2">
-<a name="gst-gl-generate-texture-full"></a><h3>gst_gl_generate_texture_full ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-gst_gl_generate_texture_full (<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>const <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> *info</code></em>,
- <em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> comp</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> stride[]</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gsize"><span class="type">gsize</span></a> offset[]</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gsize"><span class="type">gsize</span></a> size[]</code></em>,
- <em class="parameter"><code><span class="type">GLuint</span> *pTexture</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
<a name="gst-gl-caps-replace-all-caps-features"></a><h3>gst_gl_caps_replace_all_caps_features ()</h3>
<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstCaps.html#GstCaps-struct"><span class="returnvalue">GstCaps</span></a> *
gst_gl_caps_replace_all_caps_features (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstCaps.html#GstCaps-struct"><span class="type">GstCaps</span></a> *caps</code></em>,
@@ -645,31 +364,6 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-libs-OpenGL-Miscellaneous-Utilities.other_details"></a><h2>Types and Values</h2>
-<div class="refsect2">
-<a name="GstGLDisplayProjection"></a><h3>enum GstGLDisplayProjection</h3>
-<div class="refsect3">
-<a name="GstGLDisplayProjection.members"></a><h4>Members</h4>
-<div class="informaltable"><table class="informaltable" 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-DISPLAY-PROJECTION-ORTHO2D:CAPS"></a>GST_GL_DISPLAY_PROJECTION_ORTHO2D</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="GST-GL-DISPLAY-PROJECTION-PERSPECTIVE:CAPS"></a>GST_GL_DISPLAY_PROJECTION_PERSPECTIVE</p></td>
-<td> </td>
-<td> </td>
-</tr>
-</tbody>
-</table></div>
-</div>
-</div>
</div>
</div>
<div class="footer">
diff --git a/docs/libs/html/gst-plugins-bad-libs-gstglbasememory.html b/docs/libs/html/gst-plugins-bad-libs-gstglbasememory.html
index 1f333d0..e53334a 100644
--- a/docs/libs/html/gst-plugins-bad-libs-gstglbasememory.html
+++ b/docs/libs/html/gst-plugins-bad-libs-gstglbasememory.html
@@ -345,7 +345,7 @@
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gsize"><span class="type">gsize</span></a> alloc_size</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstAllocator.html#GstAllocationParams-struct"><span class="type">GstAllocationParams</span></a> *alloc_params</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> wrapped_data</code></em>,
- <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> gl_handle</code></em>,
+ <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> gl_handle</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> notify</code></em>);</pre>
<p><em class="parameter"><code>notify</code></em>
@@ -970,13 +970,13 @@
GstGLBaseMemoryAllocatorCreateFunction create;
GstGLBaseMemoryAllocatorMapFunction map;
+ GstGLBaseMemoryAllocatorUnmapFunction unmap;
+ GstGLBaseMemoryAllocatorCopyFunction copy;
+ GstGLBaseMemoryAllocatorDestroyFunction destroy;
#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;
} GstGLBaseMemoryAllocatorClass;
</pre>
<div class="refsect3">
@@ -1004,16 +1004,6 @@
<td class="struct_member_annotations"> </td>
</tr>
<tr>
-<td class="struct_member_name"><p><span class="type">GstGLBaseMemoryAllocatorFlushFunction</span> <em class="structfield"><code><a name="GstGLBaseMemoryAllocatorClass.flush"></a>flush</code></em>;</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="struct_member_name"><p><span class="type">GstGLBaseMemoryAllocatorInvalidateFunction</span> <em class="structfield"><code><a name="GstGLBaseMemoryAllocatorClass.invalidate"></a>invalidate</code></em>;</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
<td class="struct_member_name"><p><a class="link" href="gst-plugins-bad-libs-gstglbasememory.html#GstGLBaseMemoryAllocatorUnmapFunction" title="GstGLBaseMemoryAllocatorUnmapFunction ()"><span class="type">GstGLBaseMemoryAllocatorUnmapFunction</span></a> <em class="structfield"><code><a name="GstGLBaseMemoryAllocatorClass.unmap"></a>unmap</code></em>;</p></td>
<td class="struct_member_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstglbasememory.html#GstGLBaseMemoryAllocatorUnmapFunction" title="GstGLBaseMemoryAllocatorUnmapFunction ()"><span class="type">GstGLBaseMemoryAllocatorUnmapFunction</span></a></p></td>
<td class="struct_member_annotations"> </td>
@@ -1028,6 +1018,16 @@
<td class="struct_member_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstglbasememory.html#GstGLBaseMemoryAllocatorDestroyFunction" title="GstGLBaseMemoryAllocatorDestroyFunction ()"><span class="type">GstGLBaseMemoryAllocatorDestroyFunction</span></a></p></td>
<td class="struct_member_annotations"> </td>
</tr>
+<tr>
+<td class="struct_member_name"><p><span class="type">GstGLBaseMemoryAllocatorFlushFunction</span> <em class="structfield"><code><a name="GstGLBaseMemoryAllocatorClass.flush"></a>flush</code></em>;</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><span class="type">GstGLBaseMemoryAllocatorInvalidateFunction</span> <em class="structfield"><code><a name="GstGLBaseMemoryAllocatorClass.invalidate"></a>invalidate</code></em>;</p></td>
+<td> </td>
+<td> </td>
+</tr>
</tbody>
</table></div>
</div>
@@ -1145,7 +1145,7 @@
/* 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;
+ gpointer gl_handle;
};
</pre>
<div class="refsect3">
@@ -1209,7 +1209,7 @@
<td class="struct_member_annotations"> </td>
</tr>
<tr>
-<td class="struct_member_name"><p><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="GstGLAllocationParams.gl-handle"></a>gl_handle</code></em>;</p></td>
+<td class="struct_member_name"><p><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> <em class="structfield"><code><a name="GstGLAllocationParams.gl-handle"></a>gl_handle</code></em>;</p></td>
<td class="struct_member_description"><p>the wrapped OpenGL handle</p></td>
<td class="struct_member_annotations"> </td>
</tr>
diff --git a/docs/libs/html/gst-plugins-bad-libs-gstplayer-mediainfo.html b/docs/libs/html/gst-plugins-bad-libs-gstplayer-mediainfo.html
index 023f4c9..2a67c75 100644
--- a/docs/libs/html/gst-plugins-bad-libs-gstplayer-mediainfo.html
+++ b/docs/libs/html/gst-plugins-bad-libs-gstplayer-mediainfo.html
@@ -79,6 +79,14 @@
</tr>
<tr>
<td class="function_type">
+<a href="/usr/share/gtk-doc/html/glibglib-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-live" title="gst_player_media_info_is_live ()">gst_player_media_info_is_live</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
<a href="/usr/share/gtk-doc/html/gstreamer-1.0GstSample.html#GstSample-struct"><span class="returnvalue">GstSample</span></a> *
</td>
<td class="function_name">
@@ -409,6 +417,31 @@
</div>
<hr>
<div class="refsect2">
+<a name="gst-player-media-info-is-live"></a><h3>gst_player_media_info_is_live ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gst_player_media_info_is_live (<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="gst-player-media-info-is-live.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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="gst-player-media-info-is-live.returns"></a><h4>Returns</h4>
+<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the media is live.</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="/usr/share/gtk-doc/html/gstreamer-1.0GstSample.html#GstSample-struct"><span class="returnvalue">GstSample</span></a> *
gst_player_media_info_get_image_sample
diff --git a/docs/libs/html/gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html b/docs/libs/html/gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html
index 8bf557d..dc406f6 100644
--- a/docs/libs/html/gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html
+++ b/docs/libs/html/gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html
@@ -268,7 +268,7 @@
<p>Configure a subregion as a video target within the window set by
<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 ()"><code class="function">gst_player_video_overlay_video_renderer_set_window_handle()</code></a>. If this is not
used or not supported the video will fill the area of the window set as the
-overlay to 100%. By specifying the rectangle, the video can be overlayed to
+overlay to 100%. By specifying the rectangle, the video can be overlaid to
a specific region of that window only. After setting the new rectangle one
should call <a class="link" href="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html#gst-player-video-overlay-video-renderer-expose" title="gst_player_video_overlay_video_renderer_expose ()"><code class="function">gst_player_video_overlay_video_renderer_expose()</code></a> to force a
redraw. To unset the region pass -1 for the <em class="parameter"><code>width</code></em>
diff --git a/docs/libs/html/gst-plugins-bad-libs-gstplayer.html b/docs/libs/html/gst-plugins-bad-libs-gstplayer.html
index 97ee382..46959b8 100644
--- a/docs/libs/html/gst-plugins-bad-libs-gstplayer.html
+++ b/docs/libs/html/gst-plugins-bad-libs-gstplayer.html
@@ -158,18 +158,18 @@
</tr>
<tr>
<td class="function_type">
-<span class="returnvalue">void</span>
+<a href="/usr/share/gtk-doc/html/glibglib-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-position-update-interval" title="gst_player_set_position_update_interval ()">gst_player_set_position_update_interval</a> <span class="c_punctuation">()</span>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-config" title="gst_player_set_config ()">gst_player_set_config</a> <span class="c_punctuation">()</span>
</td>
</tr>
<tr>
<td class="function_type">
-<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a>
+<a href="/usr/share/gtk-doc/html/gstreamer-1.0GstStructure.html#GstStructure-struct"><span class="returnvalue">GstStructure</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>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-config" title="gst_player_get_config ()">gst_player_get_config</a> <span class="c_punctuation">()</span>
</td>
</tr>
<tr>
@@ -292,7 +292,7 @@
</tr>
<tr>
<td class="function_type">
-<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+<span class="returnvalue">void</span>
</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>
@@ -363,6 +363,54 @@
</tr>
<tr>
<td class="function_type">
+<a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewMode"><span class="returnvalue">GstVideoMultiviewMode</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-multiview-mode" title="gst_player_get_multiview_mode ()">gst_player_get_multiview_mode</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-multiview-mode" title="gst_player_set_multiview_mode ()">gst_player_set_multiview_mode</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewFlags"><span class="returnvalue">GstVideoMultiviewFlags</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-multiview-flags" title="gst_player_get_multiview_flags ()">gst_player_get_multiview_flags</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-multiview-flags" title="gst_player_set_multiview_flags ()">gst_player_set_multiview_flags</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint64"><span class="returnvalue">gint64</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-audio-video-offset" title="gst_player_get_audio_video_offset ()">gst_player_get_audio_video_offset</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-video-offset" title="gst_player_set_audio_video_offset ()">gst_player_set_audio_video_offset</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
</td>
<td class="function_name">
@@ -377,6 +425,38 @@
<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>
+<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-config-set-position-update-interval" title="gst_player_config_set_position_update_interval ()">gst_player_config_set_position_update_interval</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="/usr/share/gtk-doc/html/glibglib-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-config-get-position-update-interval" title="gst_player_config_get_position_update_interval ()">gst_player_config_get_position_update_interval</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-config-set-user-agent" title="gst_player_config_set_user_agent ()">gst_player_config_set_user_agent</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="/usr/share/gtk-doc/html/glibglib-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-config-get-user-agent" title="gst_player_config_get_user_agent ()">gst_player_config_get_user_agent</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
</tbody>
</table></div>
</div>
@@ -390,6 +470,11 @@
</colgroup>
<tbody>
<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint64"><span class="type">gint64</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--audio-video-offset" title="The “audio-video-offset” property">audio-video-offset</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<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>
@@ -435,11 +520,6 @@
<td class="property_flags">Read</td>
</tr>
<tr>
-<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-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="/usr/share/gtk-doc/html/glibglib-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>
@@ -463,6 +543,16 @@
<td class="property_flags">Read / Write</td>
</tr>
<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewFlags"><span class="type">GstVideoMultiviewFlags</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--video-multiview-flags" title="The “video-multiview-flags” property">video-multiview-flags</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewFramePacking"><span class="type">GstVideoMultiviewFramePacking</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--video-multiview-mode" title="The “video-multiview-mode” property">video-multiview-mode</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>
@@ -532,6 +622,11 @@
</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-uri-loaded" title="The “uri-loaded” signal">uri-loaded</a></td>
+<td class="signal_flags"><a href="/usr/share/gtk-doc/html/gobjectgobject-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="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></td>
</tr>
@@ -1019,15 +1114,21 @@
</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="/usr/share/gtk-doc/html/glibglib-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>
+<a name="gst-player-set-config"></a><h3>gst_player_set_config ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gst_player_set_config (<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="/usr/share/gtk-doc/html/gstreamer-1.0GstStructure.html#GstStructure-struct"><span class="type">GstStructure</span></a> *config</code></em>);</pre>
+<p>Set the configuration of the player. If the player is already configured, and
+the configuration haven't change, this function will return <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>. If the
+player is not in the GST_PLAYER_STATE_STOPPED, this method will return <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>
+and active configuration will remain.</p>
+<p><em class="parameter"><code>config</code></em>
+ is a <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstStructure.html#GstStructure-struct"><span class="type">GstStructure</span></a> that contains the configuration parameters for
+the player.</p>
+<p>This function takes ownership of <em class="parameter"><code>config</code></em>
+.</p>
<div class="refsect3">
-<a name="gst-player-set-position-update-interval.parameters"></a><h4>Parameters</h4>
+<a name="gst-player-set-config.parameters"></a><h4>Parameters</h4>
<div class="informaltable"><table class="informaltable" width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1041,22 +1142,29 @@
<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>
+<td class="parameter_name"><p>config</p></td>
+<td class="parameter_description"><p> a <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstStructure.html#GstStructure-struct"><span class="type">GstStructure</span></a>. </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>]</span></td>
</tr>
</tbody>
</table></div>
</div>
+<div class="refsect3">
+<a name="gst-player-set-config.returns"></a><h4>Returns</h4>
+<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> when the configuration could be set.
+Since 1.10</p>
+</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="/usr/share/gtk-doc/html/glibglib-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>
+<a name="gst-player-get-config"></a><h3>gst_player_get_config ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstStructure.html#GstStructure-struct"><span class="returnvalue">GstStructure</span></a> *
+gst_player_get_config (<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>Get a copy of the current configuration of the player. This configuration
+can either be modified and used for the <a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-config" title="gst_player_set_config ()"><code class="function">gst_player_set_config()</code></a> call
+or it must be freed after usage.</p>
<div class="refsect3">
-<a name="gst-player-get-position-update-interval.parameters"></a><h4>Parameters</h4>
+<a name="gst-player-get-config.parameters"></a><h4>Parameters</h4>
<div class="informaltable"><table class="informaltable" width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1071,8 +1179,12 @@
</table></div>
</div>
<div class="refsect3">
-<a name="gst-player-get-position-update-interval.returns"></a><h4>Returns</h4>
-<p> current position update interval in milliseconds</p>
+<a name="gst-player-get-config.returns"></a><h4>Returns</h4>
+<p> a copy of the current configuration of <em class="parameter"><code>player</code></em>
+. Use
+<a href="/usr/share/gtk-doc/html/gstreamer-1.0GstStructure.html#gst-structure-free"><code class="function">gst_structure_free()</code></a> after usage or <a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-config" title="gst_player_set_config ()"><code class="function">gst_player_set_config()</code></a>.</p>
+<p>Since 1.10. </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>
@@ -1520,7 +1632,7 @@
<hr>
<div class="refsect2">
<a name="gst-player-set-subtitle-uri"></a><h3>gst_player_set_subtitle_uri ()</h3>
-<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+<pre class="programlisting"><span class="returnvalue">void</span>
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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>);</pre>
<div class="refsect3">
@@ -1807,6 +1919,191 @@
</div>
<hr>
<div class="refsect2">
+<a name="gst-player-get-multiview-mode"></a><h3>gst_player_get_multiview_mode ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewMode"><span class="returnvalue">GstVideoMultiviewMode</span></a>
+gst_player_get_multiview_mode (<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>Retrieve the current value of the indicated <em class="parameter"><code>type</code></em>
+.</p>
+<div class="refsect3">
+<a name="gst-player-get-multiview-mode.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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="gst-player-get-multiview-mode.returns"></a><h4>Returns</h4>
+<p> The current value of <em class="parameter"><code>type</code></em>
+, Default: -1 "none"</p>
+</div>
+<p class="since">Since: 1.10</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-set-multiview-mode"></a><h3>gst_player_set_multiview_mode ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_set_multiview_mode (<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="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewMode"><span class="type">GstVideoMultiviewMode</span></a> mode</code></em>);</pre>
+<p>Sets the current value of the indicated mode <em class="parameter"><code>type</code></em>
+ to the passed
+value.</p>
+<div class="refsect3">
+<a name="gst-player-set-multiview-mode.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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>mode</p></td>
+<td class="parameter_description"><p>The new value for the <em class="parameter"><code>type</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: 1.10</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-get-multiview-flags"></a><h3>gst_player_get_multiview_flags ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewFlags"><span class="returnvalue">GstVideoMultiviewFlags</span></a>
+gst_player_get_multiview_flags (<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>Retrieve the current value of the indicated <em class="parameter"><code>type</code></em>
+.</p>
+<div class="refsect3">
+<a name="gst-player-get-multiview-flags.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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="gst-player-get-multiview-flags.returns"></a><h4>Returns</h4>
+<p> The current value of <em class="parameter"><code>type</code></em>
+, Default: 0x00000000 "none</p>
+</div>
+<p class="since">Since: 1.10</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-set-multiview-flags"></a><h3>gst_player_set_multiview_flags ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_set_multiview_flags (<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="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewFlags"><span class="type">GstVideoMultiviewFlags</span></a> flags</code></em>);</pre>
+<p>Sets the current value of the indicated mode <em class="parameter"><code>type</code></em>
+ to the passed
+value.</p>
+<div class="refsect3">
+<a name="gst-player-set-multiview-flags.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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>flags</p></td>
+<td class="parameter_description"><p>The new value for the <em class="parameter"><code>type</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: 1.10</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-get-audio-video-offset"></a><h3>gst_player_get_audio_video_offset ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint64"><span class="returnvalue">gint64</span></a>
+gst_player_get_audio_video_offset (<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>Retrieve the current value of audio-video-offset property</p>
+<div class="refsect3">
+<a name="gst-player-get-audio-video-offset.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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="gst-player-get-audio-video-offset.returns"></a><h4>Returns</h4>
+<p> The current value of audio-video-offset in nanoseconds</p>
+<p>Since 1.10</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-set-audio-video-offset"></a><h3>gst_player_set_audio_video_offset ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_set_audio_video_offset (<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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint64"><span class="type">gint64</span></a> offset</code></em>);</pre>
+<p>Sets audio-video-offset property by value of <em class="parameter"><code>offset</code></em>
+</p>
+<p>Since 1.10</p>
+<div class="refsect3">
+<a name="gst-player-set-audio-video-offset.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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>offset</p></td>
+<td class="parameter_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint64"><span class="type">gint64</span></a> in nanoseconds</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
<a name="gst-player-get-rate"></a><h3>gst_player_get_rate ()</h3>
<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-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>
@@ -1860,6 +2157,129 @@
</table></div>
</div>
</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-config-set-position-update-interval"></a><h3>gst_player_config_set_position_update_interval ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_config_set_position_update_interval
+ (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstStructure.html#GstStructure-struct"><span class="type">GstStructure</span></a> *config</code></em>,
+ <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-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.
+Since 1.10</p>
+<div class="refsect3">
+<a name="gst-player-config-set-position-update-interval.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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>config</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> configuration</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-config-get-position-update-interval"></a><h3>gst_player_config_get_position_update_interval ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a>
+gst_player_config_get_position_update_interval
+ (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstStructure.html#GstStructure-struct"><span class="type">GstStructure</span></a> *config</code></em>);</pre>
+<div class="refsect3">
+<a name="gst-player-config-get-position-update-interval.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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>config</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> configuration</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gst-player-config-get-position-update-interval.returns"></a><h4>Returns</h4>
+<p> current position update interval in milliseconds</p>
+<p>Since 1.10</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-config-set-user-agent"></a><h3>gst_player_config_set_user_agent ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_config_set_user_agent (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstStructure.html#GstStructure-struct"><span class="type">GstStructure</span></a> *config</code></em>,
+ <em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *agent</code></em>);</pre>
+<p>Set the user agent to pass to the server if <em class="parameter"><code>player</code></em>
+ needs to connect
+to a server during playback. This is typically used when playing HTTP
+or RTSP streams.</p>
+<p>Since 1.10</p>
+<div class="refsect3">
+<a name="gst-player-config-set-user-agent.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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>config</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> configuration</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>agent</p></td>
+<td class="parameter_description"><p>the string to use as user agent</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-config-get-user-agent"></a><h3>gst_player_config_get_user_agent ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+gst_player_config_get_user_agent (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstStructure.html#GstStructure-struct"><span class="type">GstStructure</span></a> *config</code></em>);</pre>
+<p>Return the user agent which has been configured using
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-config-set-user-agent" title="gst_player_config_set_user_agent ()"><code class="function">gst_player_config_set_user_agent()</code></a> if any.</p>
+<div class="refsect3">
+<a name="gst-player-config-get-user-agent.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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>config</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> configuration</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gst-player-config-get-user-agent.returns"></a><h4>Returns</h4>
+<p> the configured agent, or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+Since 1.10. </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.other_details"></a><h2>Types and Values</h2>
@@ -2022,6 +2442,14 @@
<div class="refsect1">
<a name="gst-plugins-bad-libs-gstplayer.property-details"></a><h2>Property Details</h2>
<div class="refsect2">
+<a name="GstPlayer--audio-video-offset"></a><h3>The <code class="literal">“audio-video-offset”</code> property</h3>
+<pre class="programlisting"> “audio-video-offset” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint64"><span class="type">gint64</span></a></pre>
+<p>The synchronisation offset between audio and video in nanoseconds.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<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>
@@ -2081,15 +2509,6 @@
</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="/usr/share/gtk-doc/html/glibglib-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: <= 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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
<p>Playback rate.</p>
@@ -2122,6 +2541,21 @@
</div>
<hr>
<div class="refsect2">
+<a name="GstPlayer--video-multiview-flags"></a><h3>The <code class="literal">“video-multiview-flags”</code> property</h3>
+<pre class="programlisting"> “video-multiview-flags” <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewFlags"><span class="type">GstVideoMultiviewFlags</span></a></pre>
+<p>Override details of the multiview frame layout.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer--video-multiview-mode"></a><h3>The <code class="literal">“video-multiview-mode”</code> property</h3>
+<pre class="programlisting"> “video-multiview-mode” <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewFramePacking"><span class="type">GstVideoMultiviewFramePacking</span></a></pre>
+<p>Re-interpret a video stream as one of several frame-packed stereoscopic modes.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: GST_VIDEO_MULTIVIEW_FRAME_PACKING_NONE</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>
@@ -2219,6 +2653,15 @@
</div>
<hr>
<div class="refsect2">
+<a name="GstPlayer-uri-loaded"></a><h3>The <code class="literal">“uri-loaded”</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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *arg1,
+ <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data)</pre>
+<p>Flags: <a href="/usr/share/gtk-doc/html/gobjectgobject-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,
diff --git a/docs/libs/html/gst-plugins-bad-libs-h264parser.html b/docs/libs/html/gst-plugins-bad-libs-h264parser.html
index 404dc52..eca1b07 100644
--- a/docs/libs/html/gst-plugins-bad-libs-h264parser.html
+++ b/docs/libs/html/gst-plugins-bad-libs-h264parser.html
@@ -1697,7 +1697,7 @@
gint width, height;
gint crop_rect_width, crop_rect_height;
gint crop_rect_x, crop_rect_y;
- gint fps_num, fps_den;
+ gint fps_num_removed, fps_den_removed; /* FIXME: remove */
gboolean valid;
/* Subset SPS extensions */
@@ -1953,12 +1953,12 @@
<td> </td>
</tr>
<tr>
-<td class="struct_member_name"><p><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstH264SPS.fps-num"></a>fps_num</code></em>;</p></td>
+<td class="struct_member_name"><p><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstH264SPS.fps-num-removed"></a>fps_num_removed</code></em>;</p></td>
<td> </td>
<td> </td>
</tr>
<tr>
-<td class="struct_member_name"><p><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstH264SPS.fps-den"></a>fps_den</code></em>;</p></td>
+<td class="struct_member_name"><p><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstH264SPS.fps-den-removed"></a>fps_den_removed</code></em>;</p></td>
<td> </td>
<td> </td>
</tr>
@@ -2214,7 +2214,7 @@
</tr>
<tr>
<td class="struct_member_name"><p><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint8"><span class="type">guint8</span></a> <em class="structfield"><code><a name="GstH264VUIParams.overscan-info-present-flag"></a>overscan_info_present_flag</code></em>;</p></td>
-<td class="struct_member_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> overscan_appropriate_flag is present <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwize</p></td>
+<td class="struct_member_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> overscan_appropriate_flag is present <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p></td>
<td class="struct_member_annotations"> </td>
</tr>
<tr>
@@ -2264,7 +2264,7 @@
<tr>
<td class="struct_member_name"><p><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint8"><span class="type">guint8</span></a> <em class="structfield"><code><a name="GstH264VUIParams.chroma-loc-info-present-flag"></a>chroma_loc_info_present_flag</code></em>;</p></td>
<td class="struct_member_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> specifies that chroma_sample_loc_type_top_field and
-chroma_sample_loc_type_bottom_field are present, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwize</p></td>
+chroma_sample_loc_type_bottom_field are present, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p></td>
<td class="struct_member_annotations"> </td>
</tr>
<tr>
@@ -2300,7 +2300,7 @@
<td class="struct_member_name"><p><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint8"><span class="type">guint8</span></a> <em class="structfield"><code><a name="GstH264VUIParams.fixed-frame-rate-flag"></a>fixed_frame_rate_flag</code></em>;</p></td>
<td class="struct_member_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> indicates that the temporal distance between the HRD output times
of any two consecutive pictures in output order is constrained as specified in the spec, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>
-otherwize.</p></td>
+otherwise.</p></td>
<td class="struct_member_annotations"> </td>
</tr>
<tr>
diff --git a/docs/libs/html/gst-plugins-bad-libs-mpeg4parser.html b/docs/libs/html/gst-plugins-bad-libs-mpeg4parser.html
index f1f03f6..54a9a29 100644
--- a/docs/libs/html/gst-plugins-bad-libs-mpeg4parser.html
+++ b/docs/libs/html/gst-plugins-bad-libs-mpeg4parser.html
@@ -231,7 +231,7 @@
</tr>
<tr>
<td class="parameter_name"><p>skip_user_data</p></td>
-<td class="parameter_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> to skip user data packet <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwize</p></td>
+<td class="parameter_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> to skip user data packet <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p></td>
<td class="parameter_annotations"> </td>
</tr>
<tr>
diff --git a/docs/libs/html/gst-plugins-bad-libs-mpegvideoparser.html b/docs/libs/html/gst-plugins-bad-libs-mpegvideoparser.html
index 6e731a1..82f7c7a 100644
--- a/docs/libs/html/gst-plugins-bad-libs-mpegvideoparser.html
+++ b/docs/libs/html/gst-plugins-bad-libs-mpegvideoparser.html
@@ -307,7 +307,7 @@
</div>
<div class="refsect3">
<a name="gst-mpeg-video-parse-sequence-header.returns"></a><h4>Returns</h4>
-<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the seqhdr could be parsed correctly, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwize.</p>
+<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the seqhdr could be parsed correctly, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</p>
</div>
</div>
<hr>
@@ -361,7 +361,7 @@
<div class="refsect3">
<a name="gst-mpeg-video-parse-picture-header.returns"></a><h4>Returns</h4>
<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the picture sequence could be parsed correctly, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>
-otherwize.</p>
+otherwise.</p>
</div>
</div>
<hr>
@@ -416,7 +416,7 @@
<div class="refsect3">
<a name="gst-mpeg-video-parse-picture-extension.returns"></a><h4>Returns</h4>
<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the picture extension could be parsed correctly,
-<a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwize.</p>
+<a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</p>
</div>
</div>
<hr>
@@ -469,7 +469,7 @@
</div>
<div class="refsect3">
<a name="gst-mpeg-video-parse-gop.returns"></a><h4>Returns</h4>
-<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the gop could be parsed correctly, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwize.</p>
+<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the gop could be parsed correctly, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</p>
</div>
</div>
<hr>
@@ -524,7 +524,7 @@
</div>
<div class="refsect3">
<a name="gst-mpeg-video-parse-sequence-extension.returns"></a><h4>Returns</h4>
-<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the seqext could be parsed correctly, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwize.</p>
+<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the seqext could be parsed correctly, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</p>
</div>
</div>
<hr>
@@ -591,7 +591,7 @@
<div class="refsect3">
<a name="gst-mpeg-video-parse-quant-matrix-extension.returns"></a><h4>Returns</h4>
<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the quant matrix extension could be parsed correctly,
-<a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwize.</p>
+<a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</p>
</div>
</div>
<hr>
@@ -1016,7 +1016,9 @@
guint8 constrained_parameters_flag;
+ guint8 load_intra_quantiser_matrix;
guint8 intra_quantizer_matrix[64];
+ guint8 load_non_intra_quantiser_matrix;
guint8 non_intra_quantizer_matrix[64];
/* Calculated values */
@@ -1071,11 +1073,21 @@
<td class="struct_member_annotations"> </td>
</tr>
<tr>
+<td class="struct_member_name"><p><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint8"><span class="type">guint8</span></a> <em class="structfield"><code><a name="GstMpegVideoSequenceHdr.load-intra-quantiser-matrix"></a>load_intra_quantiser_matrix</code></em>;</p></td>
+<td class="struct_member_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> indicates the presence of intra_quantiser_matrix</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
<td class="struct_member_name"><p><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint8"><span class="type">guint8</span></a> <em class="structfield"><code><a name="GstMpegVideoSequenceHdr.intra-quantizer-matrix"></a>intra_quantizer_matrix</code></em>[64];</p></td>
<td class="struct_member_description"><p>intra-quantization table, in zigzag scan order</p></td>
<td class="struct_member_annotations"> </td>
</tr>
<tr>
+<td class="struct_member_name"><p><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint8"><span class="type">guint8</span></a> <em class="structfield"><code><a name="GstMpegVideoSequenceHdr.load-non-intra-quantiser-matrix"></a>load_non_intra_quantiser_matrix</code></em>;</p></td>
+<td class="struct_member_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> indicates the presence of non_intra_quantiser_matrix</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
<td class="struct_member_name"><p><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint8"><span class="type">guint8</span></a> <em class="structfield"><code><a name="GstMpegVideoSequenceHdr.non-intra-quantizer-matrix"></a>non_intra_quantizer_matrix</code></em>[64];</p></td>
<td class="struct_member_description"><p>non-intra quantization table, in zigzag scan order</p></td>
<td class="struct_member_annotations"> </td>
@@ -1216,6 +1228,7 @@
<pre class="programlisting">struct GstMpegVideoPictureHdr {
guint16 tsn;
guint8 pic_type;
+ guint16 vbv_delay;
guint8 full_pel_forward_vector, full_pel_backward_vector;
@@ -1243,6 +1256,11 @@
<td class="struct_member_annotations"> </td>
</tr>
<tr>
+<td class="struct_member_name"><p><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint16"><span class="type">guint16</span></a> <em class="structfield"><code><a name="GstMpegVideoPictureHdr.vbv-delay"></a>vbv_delay</code></em>;</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
<td class="struct_member_name"><p><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint8"><span class="type">guint8</span></a> <em class="structfield"><code><a name="GstMpegVideoPictureHdr.full-pel-forward-vector"></a>full_pel_forward_vector</code></em>;</p></td>
<td class="struct_member_description"><p>the full pel forward flag of
the frame: 0 or 1.</p></td>
@@ -1416,7 +1434,7 @@
</tr>
<tr>
<td class="struct_member_name"><p><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint8"><span class="type">guint8</span></a> <em class="structfield"><code><a name="GstMpegVideoPictureExt.progressive-frame"></a>progressive_frame</code></em>;</p></td>
-<td class="struct_member_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the frame is progressive <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwize</p></td>
+<td class="struct_member_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the frame is progressive <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p></td>
<td class="struct_member_annotations"> </td>
</tr>
<tr>
diff --git a/docs/libs/html/gst-plugins-bad-libs-vc1parser.html b/docs/libs/html/gst-plugins-bad-libs-vc1parser.html
index 0d38ca3..ccae74d 100644
--- a/docs/libs/html/gst-plugins-bad-libs-vc1parser.html
+++ b/docs/libs/html/gst-plugins-bad-libs-vc1parser.html
@@ -687,7 +687,7 @@
</div>
<div class="refsect3">
<a name="gst-vc1-bitplanes-ensure-size.returns"></a><h4>Returns</h4>
-<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if everything went fine, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwize</p>
+<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if everything went fine, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
</div>
</div>
</div>
diff --git a/docs/libs/html/gstreamer-libs-hierarchy.html b/docs/libs/html/gstreamer-libs-hierarchy.html
index 0ddd4d9..94793a3 100644
--- a/docs/libs/html/gstreamer-libs-hierarchy.html
+++ b/docs/libs/html/gstreamer-libs-hierarchy.html
@@ -42,13 +42,13 @@
<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="GstGLFramebuffer.html" title="GstGLFramebuffer">GstGLFramebuffer</a>
<span class="lineart">│</span> <span class="lineart">├──</span> <a class="link" href="GstGLShader.html" title="GstGLShader">GstGLShader</a>
<span class="lineart">│</span> <span class="lineart">├──</span> <a class="link" href=".html#GstGLSLStage">GstGLSLStage</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> GstGLViewConvert
<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>
diff --git a/docs/libs/html/index.html b/docs/libs/html/index.html
index dc2f729..9ea1815 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.8.3)
+ for GStreamer Bad Library 1.0 (1.9.90)
<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>
diff --git a/docs/plugins/Makefile.am b/docs/plugins/Makefile.am
index 7607b55..0dc14f8 100644
--- a/docs/plugins/Makefile.am
+++ b/docs/plugins/Makefile.am
@@ -25,7 +25,7 @@
SCAN_OPTIONS=
# Extra options to supply to gtkdoc-mkdb.
-MKDB_OPTIONS=--sgml-mode --source-suffixes=c,h,cc,m
+MKDB_OPTIONS=--sgml-mode --source-suffixes=c,h,cc,cpp,m
# Extra options to supply to gtkdoc-fixref.
FIXXREF_OPTIONS=--extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html \
@@ -38,7 +38,8 @@
$(top_srcdir)/ext/*/*.hh
CFILE_GLOB= \
$(top_srcdir)/gst/*/*.c $(top_srcdir)/ext/*/*.c $(top_srcdir)/sys/*/*.c \
- $(top_srcdir)/ext/*/*.cc $(top_srcdir)/sys/*/*.m
+ $(top_srcdir)/ext/*/*.cc $(top_srcdir)/ext/*/*.cpp $(top_srcdir)/sys/*/*.cpp \
+ $(top_srcdir)/ext/*/*.m $(top_srcdir)/sys/*/*.m
# Header files to ignore when scanning.
IGNORE_HFILES =
@@ -69,7 +70,7 @@
$(top_srcdir)/ext/curl/gstcurlhttpsink.h \
$(top_srcdir)/ext/curl/gstcurlsmtpsink.h \
$(top_srcdir)/ext/curl/gstcurltlssink.h \
- $(top_srcdir)/ext/dc1394/gstdc1394.h \
+ $(top_srcdir)/ext/dc1394/gstdc1394src.h \
$(top_srcdir)/ext/directfb/dfbvideosink.h \
$(top_srcdir)/ext/dts/gstdtsdec.h \
$(top_srcdir)/ext/faac/gstfaac.h \
@@ -94,12 +95,13 @@
$(top_srcdir)/ext/opencv/gstedgedetect.h \
$(top_srcdir)/ext/opencv/gstfaceblur.h \
$(top_srcdir)/ext/opencv/gstfacedetect.h \
- $(top_srcdir)/ext/opencv/gstpyramidsegment.h \
$(top_srcdir)/ext/opencv/gsttemplatematch.h \
$(top_srcdir)/ext/opencv/gsttextoverlay.h \
$(top_srcdir)/ext/openni2/gstopenni2src.h \
$(top_srcdir)/ext/rsvg/gstrsvgdec.h \
$(top_srcdir)/ext/rsvg/gstrsvgoverlay.h \
+ $(top_srcdir)/ext/rtmp/gstrtmpsrc.h \
+ $(top_srcdir)/ext/rtmp/gstrtmpsink.h \
$(top_srcdir)/ext/spandsp/gstspanplc.h \
$(top_srcdir)/ext/spandsp/gstdtmfdetect.h \
$(top_srcdir)/ext/sdl/sdlaudiosink.h \
@@ -108,6 +110,8 @@
$(top_srcdir)/ext/timidity/gstwildmidi.h \
$(top_srcdir)/ext/voaacenc/gstvoaacenc.h \
$(top_srcdir)/ext/voamrwbenc/gstvoamrwbenc.h \
+ $(top_srcdir)/ext/webrtcdsp/gstwebrtcdsp.h \
+ $(top_srcdir)/ext/webrtcdsp/gstwebrtcechoprobe.h \
$(top_srcdir)/ext/zbar/gstzbar.h \
$(top_srcdir)/gst/aiff/aiffparse.h \
$(top_srcdir)/gst/aiff/aiffmux.h \
@@ -150,6 +154,8 @@
$(top_srcdir)/gst/geometrictransform/gstwaterripple.h \
$(top_srcdir)/gst/ivfparse/gstivfparse.h \
$(top_srcdir)/gst/jpegformat/gstjpegparse.h \
+ $(top_srcdir)/gst/mpegtsdemux/tsdemux.h \
+ $(top_srcdir)/gst/mpegtsmux/mpegtsmux.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 c2aae2c..e6306ae 100644
--- a/docs/plugins/Makefile.in
+++ b/docs/plugins/Makefile.in
@@ -295,6 +295,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -316,6 +318,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -365,6 +369,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -510,6 +516,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -636,8 +644,6 @@
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@
@@ -680,8 +686,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -798,7 +809,7 @@
SCAN_OPTIONS =
# Extra options to supply to gtkdoc-mkdb.
-MKDB_OPTIONS = --sgml-mode --source-suffixes=c,h,cc,m
+MKDB_OPTIONS = --sgml-mode --source-suffixes=c,h,cc,cpp,m
# Extra options to supply to gtkdoc-fixref.
FIXXREF_OPTIONS = --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html \
@@ -813,7 +824,8 @@
CFILE_GLOB = \
$(top_srcdir)/gst/*/*.c $(top_srcdir)/ext/*/*.c $(top_srcdir)/sys/*/*.c \
- $(top_srcdir)/ext/*/*.cc $(top_srcdir)/sys/*/*.m
+ $(top_srcdir)/ext/*/*.cc $(top_srcdir)/ext/*/*.cpp $(top_srcdir)/sys/*/*.cpp \
+ $(top_srcdir)/ext/*/*.m $(top_srcdir)/sys/*/*.m
# Header files to ignore when scanning.
@@ -845,7 +857,7 @@
$(top_srcdir)/ext/curl/gstcurlhttpsink.h \
$(top_srcdir)/ext/curl/gstcurlsmtpsink.h \
$(top_srcdir)/ext/curl/gstcurltlssink.h \
- $(top_srcdir)/ext/dc1394/gstdc1394.h \
+ $(top_srcdir)/ext/dc1394/gstdc1394src.h \
$(top_srcdir)/ext/directfb/dfbvideosink.h \
$(top_srcdir)/ext/dts/gstdtsdec.h \
$(top_srcdir)/ext/faac/gstfaac.h \
@@ -870,12 +882,13 @@
$(top_srcdir)/ext/opencv/gstedgedetect.h \
$(top_srcdir)/ext/opencv/gstfaceblur.h \
$(top_srcdir)/ext/opencv/gstfacedetect.h \
- $(top_srcdir)/ext/opencv/gstpyramidsegment.h \
$(top_srcdir)/ext/opencv/gsttemplatematch.h \
$(top_srcdir)/ext/opencv/gsttextoverlay.h \
$(top_srcdir)/ext/openni2/gstopenni2src.h \
$(top_srcdir)/ext/rsvg/gstrsvgdec.h \
$(top_srcdir)/ext/rsvg/gstrsvgoverlay.h \
+ $(top_srcdir)/ext/rtmp/gstrtmpsrc.h \
+ $(top_srcdir)/ext/rtmp/gstrtmpsink.h \
$(top_srcdir)/ext/spandsp/gstspanplc.h \
$(top_srcdir)/ext/spandsp/gstdtmfdetect.h \
$(top_srcdir)/ext/sdl/sdlaudiosink.h \
@@ -884,6 +897,8 @@
$(top_srcdir)/ext/timidity/gstwildmidi.h \
$(top_srcdir)/ext/voaacenc/gstvoaacenc.h \
$(top_srcdir)/ext/voamrwbenc/gstvoamrwbenc.h \
+ $(top_srcdir)/ext/webrtcdsp/gstwebrtcdsp.h \
+ $(top_srcdir)/ext/webrtcdsp/gstwebrtcechoprobe.h \
$(top_srcdir)/ext/zbar/gstzbar.h \
$(top_srcdir)/gst/aiff/aiffparse.h \
$(top_srcdir)/gst/aiff/aiffmux.h \
@@ -926,6 +941,8 @@
$(top_srcdir)/gst/geometrictransform/gstwaterripple.h \
$(top_srcdir)/gst/ivfparse/gstivfparse.h \
$(top_srcdir)/gst/jpegformat/gstjpegparse.h \
+ $(top_srcdir)/gst/mpegtsdemux/tsdemux.h \
+ $(top_srcdir)/gst/mpegtsmux/mpegtsmux.h \
$(top_srcdir)/gst/mxf/mxfdemux.h \
$(top_srcdir)/gst/mxf/mxfmux.h \
$(top_srcdir)/gst/nuvdemux/gstnuvdemux.h \
@@ -1503,9 +1520,13 @@
@ENABLE_GTK_DOC_TRUE@ $(top_srcdir)/common/plugins.xsl $$a > xml/`basename $$a`; done
@ENABLE_GTK_DOC_TRUE@ @for f in $(EXAMPLE_CFILES); do \
@ENABLE_GTK_DOC_TRUE@ $(PYTHON) $(top_srcdir)/common/c-to-xml.py $$f > xml/element-`basename $$f .c`.xml; done
-@ENABLE_GTK_DOC_TRUE@ @gtkdoc-mkdb \
+@ENABLE_GTK_DOC_TRUE@ @_source_dir='' ; \
+@ENABLE_GTK_DOC_TRUE@ for i in $(DOC_SOURCE_DIR) ; do \
+@ENABLE_GTK_DOC_TRUE@ _source_dir="$${_source_dir} --source-dir=$$i" ; \
+@ENABLE_GTK_DOC_TRUE@ done ; \
+@ENABLE_GTK_DOC_TRUE@ gtkdoc-mkdb \
@ENABLE_GTK_DOC_TRUE@ --module=$(DOC_MODULE) \
-@ENABLE_GTK_DOC_TRUE@ --source-dir=$(DOC_SOURCE_DIR) \
+@ENABLE_GTK_DOC_TRUE@ $${_source_dir} \
@ENABLE_GTK_DOC_TRUE@ --expand-content-files="$(expand_content_files)" \
@ENABLE_GTK_DOC_TRUE@ --main-sgml-file=$(srcdir)/$(DOC_MAIN_SGML_FILE) \
@ENABLE_GTK_DOC_TRUE@ --output-format=xml \
diff --git a/docs/plugins/gst-plugins-bad-plugins-docs.sgml b/docs/plugins/gst-plugins-bad-plugins-docs.sgml
index 710ced5..dea2355 100644
--- a/docs/plugins/gst-plugins-bad-plugins-docs.sgml
+++ b/docs/plugins/gst-plugins-bad-plugins-docs.sgml
@@ -23,6 +23,7 @@
<xi:include href="xml/element-assrender.xml" />
<xi:include href="xml/element-audiointerleave.xml" />
<xi:include href="xml/element-audiomixer.xml" />
+ <xi:include href="xml/element-audioparse.xml" />
<xi:include href="xml/element-autoconvert.xml" />
<xi:include href="xml/element-bs2b.xml" />
<xi:include href="xml/element-bulge.xml" />
@@ -57,6 +58,52 @@
<xi:include href="xml/element-fisheye.xml" />
<xi:include href="xml/element-fpsdisplaysink.xml" />
<xi:include href="xml/element-gaussianblur.xml" />
+ <xi:include href="xml/element-glcolorbalance.xml" />
+ <xi:include href="xml/element-glcolorconvert.xml" />
+ <xi:include href="xml/element-glcolorscale.xml" />
+ <xi:include href="xml/element-gldeinterlace.xml" />
+ <xi:include href="xml/element-gldifferencematte.xml" />
+ <xi:include href="xml/element-gldownload.xml" />
+ <xi:include href="xml/element-gleffects_blur.xml" />
+ <xi:include href="xml/element-gleffects_bulge.xml" />
+ <xi:include href="xml/element-gleffects_fisheye.xml" />
+ <xi:include href="xml/element-gleffects_glow.xml" />
+ <xi:include href="xml/element-gleffects_heat.xml" />
+ <xi:include href="xml/element-gleffects_identity.xml" />
+ <xi:include href="xml/element-gleffects_laplacian.xml" />
+ <xi:include href="xml/element-gleffects_lumaxpro.xml" />
+ <xi:include href="xml/element-gleffects_mirror.xml" />
+ <xi:include href="xml/element-gleffects_sepia.xml" />
+ <xi:include href="xml/element-gleffects_sin.xml" />
+ <xi:include href="xml/element-gleffects_sobel.xml" />
+ <xi:include href="xml/element-gleffects_square.xml" />
+ <xi:include href="xml/element-gleffects_squeeze.xml" />
+ <xi:include href="xml/element-gleffects_stretch.xml" />
+ <xi:include href="xml/element-gleffects_tunnel.xml" />
+ <xi:include href="xml/element-gleffects_twirl.xml" />
+ <xi:include href="xml/element-gleffects.xml" />
+ <xi:include href="xml/element-gleffects_xpro.xml" />
+ <xi:include href="xml/element-gleffects_xray.xml" />
+ <xi:include href="xml/element-glfilterapp.xml" />
+ <xi:include href="xml/element-glfilterbin.xml" />
+ <xi:include href="xml/element-glfiltercube.xml" />
+ <xi:include href="xml/element-glfilterglass.xml" />
+ <xi:include href="xml/element-glimagesinkelement.xml" />
+ <xi:include href="xml/element-glimagesink.xml" />
+ <xi:include href="xml/element-glmixerbin.xml" />
+ <xi:include href="xml/element-glmosaic.xml" />
+ <xi:include href="xml/element-gloverlay.xml" />
+ <xi:include href="xml/element-glshader.xml" />
+ <xi:include href="xml/element-glsinkbin.xml" />
+ <xi:include href="xml/element-glsrcbin.xml" />
+ <xi:include href="xml/element-glstereomix.xml" />
+ <xi:include href="xml/element-glstereosplit.xml" />
+ <xi:include href="xml/element-gltestsrc.xml" />
+ <xi:include href="xml/element-gltransformation.xml" />
+ <xi:include href="xml/element-glupload.xml" />
+ <xi:include href="xml/element-glvideomixerelement.xml" />
+ <xi:include href="xml/element-glvideomixer.xml" />
+ <xi:include href="xml/element-glviewconvert.xml" />
<xi:include href="xml/element-jpegparse.xml" />
<xi:include href="xml/element-kaleidoscope.xml" />
<xi:include href="xml/element-liveadder.xml" />
@@ -75,7 +122,8 @@
<xi:include href="xml/element-openalsink.xml" />
<xi:include href="xml/element-pcapparse.xml" />
<xi:include href="xml/element-pinch.xml" />
- <xi:include href="xml/element-pyramidsegment.xml" />
+ <xi:include href="xml/element-rawaudioparse.xml" />
+ <xi:include href="xml/element-rawvideoparse.xml" />
<xi:include href="xml/element-rfbsrc.xml" />
<xi:include href="xml/element-rtmpsink.xml" />
<xi:include href="xml/element-rtmpsrc.xml" />
@@ -94,12 +142,16 @@
<xi:include href="xml/element-opencvtextoverlay.xml" />
<xi:include href="xml/element-tunnel.xml" />
<xi:include href="xml/element-twirl.xml" />
+ <xi:include href="xml/element-unalignedaudioparse.xml" />
+ <xi:include href="xml/element-unalignedvideoparse.xml" />
<xi:include href="xml/element-videoparse.xml" />
<xi:include href="xml/element-waterripple.xml" />
<xi:include href="xml/element-zbar.xml" />
<xi:include href="xml/element-voaacenc.xml" />
<xi:include href="xml/element-voamrwbenc.xml" />
<xi:include href="xml/element-wavescope.xml" />
+ <xi:include href="xml/element-webrtcdsp.xml" />
+ <xi:include href="xml/element-webrtcechoprobe.xml" />
</chapter>
<chapter>
@@ -137,6 +189,7 @@
<xi:include href="xml/plugin-neon.xml" />
<xi:include href="xml/plugin-ofa.xml" />
<xi:include href="xml/plugin-openal.xml" />
+ <xi:include href="xml/plugin-opengl.xml" />
<xi:include href="xml/plugin-opencv.xml" />
<xi:include href="xml/plugin-pcapparse.xml" />
<xi:include href="xml/plugin-rawparse.xml" />
@@ -148,6 +201,7 @@
<xi:include href="xml/plugin-speed.xml" />
<xi:include href="xml/plugin-voaacenc.xml" />
<xi:include href="xml/plugin-voamrwbenc.xml" />
+ <xi:include href="xml/plugin-webrtcdsp.xml" />
<xi:include href="xml/plugin-zbar.xml" />
</chapter>
</book>
diff --git a/docs/plugins/gst-plugins-bad-plugins-sections.txt b/docs/plugins/gst-plugins-bad-plugins-sections.txt
index 2c1365b..ba933c1 100644
--- a/docs/plugins/gst-plugins-bad-plugins-sections.txt
+++ b/docs/plugins/gst-plugins-bad-plugins-sections.txt
@@ -1,14 +1,96 @@
<SECTION>
+<FILE>element-adpcmdec</FILE>
+<TITLE>adpcmdec</TITLE>
+GstCMDec
+<SUBSECTION Standard>
+GstCMDecClass
+GST_CM_DEC
+GST_CM_DEC_CAST
+GST_IS_CM_DEC
+GST_CM_DEC_CLASS
+GST_IS_CM_DEC_CLASS
+GST_TYPE_CM_DEC
+<SUBSECTION Private>
+gst_cm_dec_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-adpcmenc</FILE>
+<TITLE>adpcmenc</TITLE>
+GstCMEnc
+<SUBSECTION Standard>
+GstCMEncClass
+GST_CM_ENC
+GST_CM_ENC_CAST
+GST_IS_CM_ENC
+GST_CM_ENC_CLASS
+GST_IS_CM_ENC_CLASS
+GST_TYPE_CM_ENC
+<SUBSECTION Private>
+gst_cm_enc_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-audioparse</FILE>
+<TITLE>audioparse</TITLE>
+GstAudioParse
+<SUBSECTION Standard>
+GstAudioParseClass
+GST_AUDIO_PARSE
+GST_AUDIO_PARSE_CAST
+GST_IS_AUDIO_PARSE
+GST_AUDIO_PARSE_CLASS
+GST_IS_AUDIO_PARSE_CLASS
+GST_TYPE_AUDIO_PARSE
+<SUBSECTION Private>
+gst_audio_parse_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-dvbbasebin</FILE>
+<TITLE>dvbbasebin</TITLE>
+GstBaseBin
+<SUBSECTION Standard>
+GstBaseBinClass
+GST_BASE_BIN
+GST_BASE_BIN_CAST
+GST_IS_BASE_BIN
+GST_BASE_BIN_CLASS
+GST_IS_BASE_BIN_CLASS
+GST_TYPE_BASE_BIN
+<SUBSECTION Private>
+gst_base_bin_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-a2dpsink</FILE>
+<TITLE>a2dpsink</TITLE>
+GstA2dpSink
+<SUBSECTION Standard>
+GstA2dpSinkClass
+GST_A2DP_SINK
+GST_A2DP_SINK_CAST
+GST_IS_A2DP_SINK
+GST_A2DP_SINK_CLASS
+GST_IS_A2DP_SINK_CLASS
+GST_TYPE_A2DP_SINK
+<SUBSECTION Private>
+gst_a2dp_sink_get_type
+</SECTION>
+
+<SECTION>
<FILE>element-accurip</FILE>
<TITLE>accurip</TITLE>
GstAccurip
<SUBSECTION Standard>
+GstAccuripClass
GST_ACCURIP
-GST_ACCURIP_CLASS
+GST_ACCURIP_CAST
GST_IS_ACCURIP
+GST_ACCURIP_CLASS
GST_IS_ACCURIP_CLASS
GST_TYPE_ACCURIP
-GstAccuripClass
+<SUBSECTION Private>
gst_accurip_get_type
</SECTION>
@@ -17,12 +99,14 @@
<TITLE>aiffmux</TITLE>
GstAiffMux
<SUBSECTION Standard>
+GstAiffMuxClass
GST_AIFF_MUX
-GST_AIFF_MUX_CLASS
+GST_AIFF_MUX_CAST
GST_IS_AIFF_MUX
+GST_AIFF_MUX_CLASS
GST_IS_AIFF_MUX_CLASS
GST_TYPE_AIFF_MUX
-GstAiffMuxClass
+<SUBSECTION Private>
gst_aiff_mux_get_type
</SECTION>
@@ -31,41 +115,94 @@
<TITLE>aiffparse</TITLE>
GstAiffParse
<SUBSECTION Standard>
+GstAiffParseClass
GST_AIFF_PARSE
-GST_AIFF_PARSE_CLASS
+GST_AIFF_PARSE_CAST
GST_IS_AIFF_PARSE
+GST_AIFF_PARSE_CLASS
GST_IS_AIFF_PARSE_CLASS
GST_TYPE_AIFF_PARSE
-GstAiffParseClass
-GstAiffParseState
+<SUBSECTION Private>
gst_aiff_parse_get_type
</SECTION>
<SECTION>
+<FILE>element-asfmux</FILE>
+<TITLE>asfmux</TITLE>
+GstAsfMux
+<SUBSECTION Standard>
+GstAsfMuxClass
+GST_ASF_MUX
+GST_ASF_MUX_CAST
+GST_IS_ASF_MUX
+GST_ASF_MUX_CLASS
+GST_IS_ASF_MUX_CLASS
+GST_TYPE_ASF_MUX
+<SUBSECTION Private>
+gst_asf_mux_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-asfparse</FILE>
+<TITLE>asfparse</TITLE>
+GstAsfParse
+<SUBSECTION Standard>
+GstAsfParseClass
+GST_ASF_PARSE
+GST_ASF_PARSE_CAST
+GST_IS_ASF_PARSE
+GST_ASF_PARSE_CLASS
+GST_IS_ASF_PARSE_CLASS
+GST_TYPE_ASF_PARSE
+<SUBSECTION Private>
+gst_asf_parse_get_type
+</SECTION>
+
+<SECTION>
<FILE>element-assrender</FILE>
<TITLE>assrender</TITLE>
GstAssRender
<SUBSECTION Standard>
-GstAssRenderBlitFunction
GstAssRenderClass
GST_ASS_RENDER
-GST_ASS_RENDER_CLASS
+GST_ASS_RENDER_CAST
GST_IS_ASS_RENDER
+GST_ASS_RENDER_CLASS
GST_IS_ASS_RENDER_CLASS
+GST_TYPE_ASS_RENDER
+<SUBSECTION Private>
gst_ass_render_get_type
</SECTION>
<SECTION>
+<FILE>element-audiochannelmix</FILE>
+<TITLE>audiochannelmix</TITLE>
+GstAudioChannelMix
+<SUBSECTION Standard>
+GstAudioChannelMixClass
+GST_AUDIO_CHANNEL_MIX
+GST_AUDIO_CHANNEL_MIX_CAST
+GST_IS_AUDIO_CHANNEL_MIX
+GST_AUDIO_CHANNEL_MIX_CLASS
+GST_IS_AUDIO_CHANNEL_MIX_CLASS
+GST_TYPE_AUDIO_CHANNEL_MIX
+<SUBSECTION Private>
+gst_audio_channel_mix_get_type
+</SECTION>
+
+<SECTION>
<FILE>element-audiointerleave</FILE>
<TITLE>audiointerleave</TITLE>
GstAudioInterleave
<SUBSECTION Standard>
GstAudioInterleaveClass
GST_AUDIO_INTERLEAVE
-GST_AUDIO_INTERLEAVE_CLASS
+GST_AUDIO_INTERLEAVE_CAST
GST_IS_AUDIO_INTERLEAVE
+GST_AUDIO_INTERLEAVE_CLASS
GST_IS_AUDIO_INTERLEAVE_CLASS
GST_TYPE_AUDIO_INTERLEAVE
+<SUBSECTION Private>
gst_audio_interleave_get_type
</SECTION>
@@ -76,10 +213,12 @@
<SUBSECTION Standard>
GstAudioMixerClass
GST_AUDIO_MIXER
-GST_AUDIO_MIXER_CLASS
+GST_AUDIO_MIXER_CAST
GST_IS_AUDIO_MIXER
+GST_AUDIO_MIXER_CLASS
GST_IS_AUDIO_MIXER_CLASS
GST_TYPE_AUDIO_MIXER
+<SUBSECTION Private>
gst_audio_mixer_get_type
</SECTION>
@@ -87,27 +226,129 @@
<FILE>element-audioparse</FILE>
<TITLE>audioparse</TITLE>
GstAudioParse
+GstAudioParseFormat
<SUBSECTION Standard>
GstAudioParseClass
GST_AUDIO_PARSE
-GST_AUDIO_PARSE_CLASS
+GST_AUDIO_PARSE_CAST
GST_IS_AUDIO_PARSE
+GST_AUDIO_PARSE_CLASS
GST_IS_AUDIO_PARSE_CLASS
GST_TYPE_AUDIO_PARSE
+<SUBSECTION Private>
gst_audio_parse_get_type
</SECTION>
<SECTION>
+<FILE>element-audiosegmentclip</FILE>
+<TITLE>audiosegmentclip</TITLE>
+GstAudioSegmentClip
+<SUBSECTION Standard>
+GstAudioSegmentClipClass
+GST_AUDIO_SEGMENT_CLIP
+GST_AUDIO_SEGMENT_CLIP_CAST
+GST_IS_AUDIO_SEGMENT_CLIP
+GST_AUDIO_SEGMENT_CLIP_CLASS
+GST_IS_AUDIO_SEGMENT_CLIP_CLASS
+GST_TYPE_AUDIO_SEGMENT_CLIP
+<SUBSECTION Private>
+gst_audio_segment_clip_get_type
+</SECTION>
+
+<SECTION>
<FILE>element-autoconvert</FILE>
<TITLE>autoconvert</TITLE>
GstAutoConvert
<SUBSECTION Standard>
GstAutoConvertClass
-GST_TYPE_AUTO_CONVERT
GST_AUTO_CONVERT
-GST_AUTO_CONVERT_CLASS
+GST_AUTO_CONVERT_CAST
GST_IS_AUTO_CONVERT
+GST_AUTO_CONVERT_CLASS
GST_IS_AUTO_CONVERT_CLASS
+GST_TYPE_AUTO_CONVERT
+<SUBSECTION Private>
+gst_auto_convert_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-autovideoconvert</FILE>
+<TITLE>autovideoconvert</TITLE>
+GstAutoVideoConvert
+<SUBSECTION Standard>
+GstAutoVideoConvertClass
+GST_AUTO_VIDEO_CONVERT
+GST_AUTO_VIDEO_CONVERT_CAST
+GST_IS_AUTO_VIDEO_CONVERT
+GST_AUTO_VIDEO_CONVERT_CLASS
+GST_IS_AUTO_VIDEO_CONVERT_CLASS
+GST_TYPE_AUTO_VIDEO_CONVERT
+<SUBSECTION Private>
+gst_auto_video_convert_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-avdtpsink</FILE>
+<TITLE>avdtpsink</TITLE>
+GstAvdtpSink
+<SUBSECTION Standard>
+GstAvdtpSinkClass
+GST_AVDTP_SINK
+GST_AVDTP_SINK_CAST
+GST_IS_AVDTP_SINK
+GST_AVDTP_SINK_CLASS
+GST_IS_AVDTP_SINK_CLASS
+GST_TYPE_AVDTP_SINK
+<SUBSECTION Private>
+gst_avdtp_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-avdtpsrc</FILE>
+<TITLE>avdtpsrc</TITLE>
+GstAvdtpSrc
+<SUBSECTION Standard>
+GstAvdtpSrcClass
+GST_AVDTP_SRC
+GST_AVDTP_SRC_CAST
+GST_IS_AVDTP_SRC
+GST_AVDTP_SRC_CLASS
+GST_IS_AVDTP_SRC_CLASS
+GST_TYPE_AVDTP_SRC
+<SUBSECTION Private>
+gst_avdtp_src_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-bpmdetect</FILE>
+<TITLE>bpmdetect</TITLE>
+GstBPMDetect
+<SUBSECTION Standard>
+GstBPMDetectClass
+GST_BPM_DETECT
+GST_BPM_DETECT_CAST
+GST_IS_BPM_DETECT
+GST_BPM_DETECT_CLASS
+GST_IS_BPM_DETECT_CLASS
+GST_TYPE_BPM_DETECT
+<SUBSECTION Private>
+gst_bpm_detect_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-bayer2rgb</FILE>
+<TITLE>bayer2rgb</TITLE>
+GstBayer2RGB
+<SUBSECTION Standard>
+GstBayer2RGBClass
+GST_BAYER2_RGB
+GST_BAYER2_RGB_CAST
+GST_IS_BAYER2_RGB
+GST_BAYER2_RGB_CLASS
+GST_IS_BAYER2_RGB_CLASS
+GST_TYPE_BAYER2_RGB
+<SUBSECTION Private>
+gst_bayer2_rgb_get_type
</SECTION>
<SECTION>
@@ -118,12 +359,12 @@
GstBs2bClass
GST_BS2B
GST_BS2B_CAST
-GST_BS2B_CLASS
GST_IS_BS2B
+GST_BS2B_CLASS
GST_IS_BS2B_CLASS
GST_TYPE_BS2B
+<SUBSECTION Private>
gst_bs2b_get_type
-gst_bs2b_plugin_init
</SECTION>
<SECTION>
@@ -134,12 +375,12 @@
GstBulgeClass
GST_BULGE
GST_BULGE_CAST
-GST_BULGE_CLASS
GST_IS_BULGE
+GST_BULGE_CLASS
GST_IS_BULGE_CLASS
GST_TYPE_BULGE
+<SUBSECTION Private>
gst_bulge_get_type
-gst_bulge_plugin_init
</SECTION>
<SECTION>
@@ -149,42 +390,143 @@
<SUBSECTION Standard>
GstBurnClass
GST_BURN
-GST_BURN_CLASS
+GST_BURN_CAST
GST_IS_BURN
+GST_BURN_CLASS
GST_IS_BURN_CLASS
GST_TYPE_BURN
+<SUBSECTION Private>
gst_burn_get_type
-gst_burn_plugin_init
+</SECTION>
+
+<SECTION>
+<FILE>element-bz2dec</FILE>
+<TITLE>bz2dec</TITLE>
+GstBz2dec
+<SUBSECTION Standard>
+GstBz2decClass
+GST_BZ2DEC
+GST_BZ2DEC_CAST
+GST_IS_BZ2DEC
+GST_BZ2DEC_CLASS
+GST_IS_BZ2DEC_CLASS
+GST_TYPE_BZ2DEC
+<SUBSECTION Private>
+gst_bz2dec_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-bz2enc</FILE>
+<TITLE>bz2enc</TITLE>
+GstBz2enc
+<SUBSECTION Standard>
+GstBz2encClass
+GST_BZ2ENC
+GST_BZ2ENC_CAST
+GST_IS_BZ2ENC
+GST_BZ2ENC_CLASS
+GST_IS_BZ2ENC_CLASS
+GST_TYPE_BZ2ENC
+<SUBSECTION Private>
+gst_bz2enc_get_type
</SECTION>
<SECTION>
<FILE>element-camerabin</FILE>
<TITLE>camerabin</TITLE>
GstCameraBin
+GstCameraBin2Mode
<SUBSECTION Standard>
GstCameraBinClass
GST_CAMERA_BIN
+GST_CAMERA_BIN_CAST
GST_IS_CAMERA_BIN
-GST_TYPE_CAMERA_BIN
GST_CAMERA_BIN_CLASS
GST_IS_CAMERA_BIN_CLASS
+GST_TYPE_CAMERA_BIN
+<SUBSECTION Private>
gst_camera_bin_get_type
</SECTION>
+<SECTION>
+<FILE>element-checksumsink</FILE>
+<TITLE>checksumsink</TITLE>
+GstChecksumSink
+GstChecksumSinkHash
+<SUBSECTION Standard>
+GstChecksumSinkClass
+GST_CHECKSUM_SINK
+GST_CHECKSUM_SINK_CAST
+GST_IS_CHECKSUM_SINK
+GST_CHECKSUM_SINK_CLASS
+GST_IS_CHECKSUM_SINK_CLASS
+GST_TYPE_CHECKSUM_SINK
+<SUBSECTION Private>
+gst_checksum_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-chopmydata</FILE>
+<TITLE>chopmydata</TITLE>
+GstChopMyData
+<SUBSECTION Standard>
+GstChopMyDataClass
+GST_CHOP_MY_DATA
+GST_CHOP_MY_DATA_CAST
+GST_IS_CHOP_MY_DATA
+GST_CHOP_MY_DATA_CLASS
+GST_IS_CHOP_MY_DATA_CLASS
+GST_TYPE_CHOP_MY_DATA
+<SUBSECTION Private>
+gst_chop_my_data_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-chromahold</FILE>
+<TITLE>chromahold</TITLE>
+GstChromaHold
+<SUBSECTION Standard>
+GstChromaHoldClass
+GST_CHROMA_HOLD
+GST_CHROMA_HOLD_CAST
+GST_IS_CHROMA_HOLD
+GST_CHROMA_HOLD_CLASS
+GST_IS_CHROMA_HOLD_CLASS
+GST_TYPE_CHROMA_HOLD
+<SUBSECTION Private>
+gst_chroma_hold_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-chromaprint</FILE>
+<TITLE>chromaprint</TITLE>
+GstChromaprint
+<SUBSECTION Standard>
+GstChromaprintClass
+GST_CHROMAPRINT
+GST_CHROMAPRINT_CAST
+GST_IS_CHROMAPRINT
+GST_CHROMAPRINT_CLASS
+GST_IS_CHROMAPRINT_CLASS
+GST_TYPE_CHROMAPRINT
+<SUBSECTION Private>
+gst_chromaprint_get_type
+</SECTION>
<SECTION>
<FILE>element-chromium</FILE>
<TITLE>chromium</TITLE>
-<SUBSECTION Standard>
GstChromium
+<SUBSECTION Standard>
GstChromiumClass
GST_CHROMIUM
-GST_CHROMIUM_CLASS
+GST_CHROMIUM_CAST
GST_IS_CHROMIUM
+GST_CHROMIUM_CLASS
GST_IS_CHROMIUM_CLASS
GST_TYPE_CHROMIUM
+<SUBSECTION Private>
gst_chromium_get_type
-gst_chromium_plugin_init
</SECTION>
<SECTION>
@@ -195,40 +537,143 @@
GstCircleClass
GST_CIRCLE
GST_CIRCLE_CAST
-GST_CIRCLE_CLASS
GST_IS_CIRCLE
+GST_CIRCLE_CLASS
GST_IS_CIRCLE_CLASS
GST_TYPE_CIRCLE
+<SUBSECTION Private>
gst_circle_get_type
-gst_circle_plugin_init
</SECTION>
<SECTION>
<FILE>element-coloreffects</FILE>
<TITLE>coloreffects</TITLE>
GstColorEffects
+GstColorEffectsPreset
<SUBSECTION Standard>
GstColorEffectsClass
GST_COLOR_EFFECTS
-GST_COLOR_EFFECTS_CLASS
+GST_COLOR_EFFECTS_CAST
GST_IS_COLOR_EFFECTS
+GST_COLOR_EFFECTS_CLASS
GST_IS_COLOR_EFFECTS_CLASS
GST_TYPE_COLOR_EFFECTS
+<SUBSECTION Private>
gst_color_effects_get_type
</SECTION>
<SECTION>
-<FILE>element-curlsink</FILE>
-<TITLE>curlsink</TITLE>
-GstCurlSink
+<FILE>element-combdetect</FILE>
+<TITLE>combdetect</TITLE>
+GstCombDetect
<SUBSECTION Standard>
-GstCurlSinkClass
-GST_CURL_SINK
-GST_CURL_SINK_CLASS
-GST_IS_CURL_SINK
-GST_IS_CURL_SINK_CLASS
-GST_TYPE_CURL_SINK
-gst_curl_sink_get_type
+GstCombDetectClass
+GST_COMB_DETECT
+GST_COMB_DETECT_CAST
+GST_IS_COMB_DETECT
+GST_COMB_DETECT_CLASS
+GST_IS_COMB_DETECT_CLASS
+GST_TYPE_COMB_DETECT
+<SUBSECTION Private>
+gst_comb_detect_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-compare</FILE>
+<TITLE>compare</TITLE>
+GstCompare
+GstCompareMethod
+<SUBSECTION Standard>
+GstCompareClass
+GST_COMPARE
+GST_COMPARE_CAST
+GST_IS_COMPARE
+GST_COMPARE_CLASS
+GST_IS_COMPARE_CLASS
+GST_TYPE_COMPARE
+<SUBSECTION Private>
+gst_compare_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-compositor</FILE>
+<TITLE>compositor</TITLE>
+GstCompositor
+GstCompositorBackground
+<SUBSECTION Standard>
+GstCompositorClass
+GST_COMPOSITOR
+GST_COMPOSITOR_CAST
+GST_IS_COMPOSITOR
+GST_COMPOSITOR_CLASS
+GST_IS_COMPOSITOR_CLASS
+GST_TYPE_COMPOSITOR
+<SUBSECTION Private>
+gst_compositor_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-curlfilesink</FILE>
+<TITLE>curlfilesink</TITLE>
+GstCurlFileSink
+<SUBSECTION Standard>
+GstCurlFileSinkClass
+GST_CURL_FILE_SINK
+GST_CURL_FILE_SINK_CAST
+GST_IS_CURL_FILE_SINK
+GST_CURL_FILE_SINK_CLASS
+GST_IS_CURL_FILE_SINK_CLASS
+GST_TYPE_CURL_FILE_SINK
+<SUBSECTION Private>
+gst_curl_file_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-curlftpsink</FILE>
+<TITLE>curlftpsink</TITLE>
+GstCurlFtpSink
+<SUBSECTION Standard>
+GstCurlFtpSinkClass
+GST_CURL_FTP_SINK
+GST_CURL_FTP_SINK_CAST
+GST_IS_CURL_FTP_SINK
+GST_CURL_FTP_SINK_CLASS
+GST_IS_CURL_FTP_SINK_CLASS
+GST_TYPE_CURL_FTP_SINK
+<SUBSECTION Private>
+gst_curl_ftp_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-curlhttpsink</FILE>
+<TITLE>curlhttpsink</TITLE>
+GstCurlHttpSink
+<SUBSECTION Standard>
+GstCurlHttpSinkClass
+GST_CURL_HTTP_SINK
+GST_CURL_HTTP_SINK_CAST
+GST_IS_CURL_HTTP_SINK
+GST_CURL_HTTP_SINK_CLASS
+GST_IS_CURL_HTTP_SINK_CLASS
+GST_TYPE_CURL_HTTP_SINK
+<SUBSECTION Private>
+gst_curl_http_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-curlsmtpsink</FILE>
+<TITLE>curlsmtpsink</TITLE>
+GstCurlSmtpSink
+<SUBSECTION Standard>
+GstCurlSmtpSinkClass
+GST_CURL_SMTP_SINK
+GST_CURL_SMTP_SINK_CAST
+GST_IS_CURL_SMTP_SINK
+GST_CURL_SMTP_SINK_CLASS
+GST_IS_CURL_SMTP_SINK_CLASS
+GST_TYPE_CURL_SMTP_SINK
+<SUBSECTION Private>
+gst_curl_smtp_sink_get_type
</SECTION>
<SECTION>
@@ -238,27 +683,13 @@
<SUBSECTION Standard>
GstCvDilateClass
GST_CV_DILATE
-GST_CV_DILATE_CLASS
+GST_CV_DILATE_CAST
GST_IS_CV_DILATE
+GST_CV_DILATE_CLASS
GST_IS_CV_DILATE_CLASS
GST_TYPE_CV_DILATE
+<SUBSECTION Private>
gst_cv_dilate_get_type
-gst_cv_dilate_plugin_init
-</SECTION>
-
-<SECTION>
-<FILE>element-cverode</FILE>
-<TITLE>cverode</TITLE>
-GstCvErode
-<SUBSECTION Standard>
-GstCvErodeClass
-GST_CV_ERODE
-GST_CV_ERODE_CLASS
-GST_IS_CV_ERODE
-GST_IS_CV_ERODE_CLASS
-GST_TYPE_CV_ERODE
-gst_cv_erode_get_type
-gst_cv_erode_plugin_init
</SECTION>
<SECTION>
@@ -268,12 +699,29 @@
<SUBSECTION Standard>
GstCvEqualizeHistClass
GST_CV_EQUALIZE_HIST
-GST_CV_EQUALIZE_HIST_CLASS
+GST_CV_EQUALIZE_HIST_CAST
GST_IS_CV_EQUALIZE_HIST
+GST_CV_EQUALIZE_HIST_CLASS
GST_IS_CV_EQUALIZE_HIST_CLASS
GST_TYPE_CV_EQUALIZE_HIST
+<SUBSECTION Private>
gst_cv_equalize_hist_get_type
-gst_cv_equalize_hist_plugin_init
+</SECTION>
+
+<SECTION>
+<FILE>element-cverode</FILE>
+<TITLE>cverode</TITLE>
+GstCvErode
+<SUBSECTION Standard>
+GstCvErodeClass
+GST_CV_ERODE
+GST_CV_ERODE_CAST
+GST_IS_CV_ERODE
+GST_CV_ERODE_CLASS
+GST_IS_CV_ERODE_CLASS
+GST_TYPE_CV_ERODE
+<SUBSECTION Private>
+gst_cv_erode_get_type
</SECTION>
<SECTION>
@@ -283,27 +731,30 @@
<SUBSECTION Standard>
GstCvLaplaceClass
GST_CV_LAPLACE
-GST_CV_LAPLACE_CLASS
+GST_CV_LAPLACE_CAST
GST_IS_CV_LAPLACE
+GST_CV_LAPLACE_CLASS
GST_IS_CV_LAPLACE_CLASS
GST_TYPE_CV_LAPLACE
+<SUBSECTION Private>
gst_cv_laplace_get_type
-gst_cv_laplace_plugin_init
</SECTION>
<SECTION>
<FILE>element-cvsmooth</FILE>
<TITLE>cvsmooth</TITLE>
GstCvSmooth
+GstCvSmoothTypeType
<SUBSECTION Standard>
GstCvSmoothClass
GST_CV_SMOOTH
-GST_CV_SMOOTH_CLASS
+GST_CV_SMOOTH_CAST
GST_IS_CV_SMOOTH
+GST_CV_SMOOTH_CLASS
GST_IS_CV_SMOOTH_CLASS
GST_TYPE_CV_SMOOTH
+<SUBSECTION Private>
gst_cv_smooth_get_type
-gst_cv_smooth_plugin_init
</SECTION>
<SECTION>
@@ -313,12 +764,61 @@
<SUBSECTION Standard>
GstCvSobelClass
GST_CV_SOBEL
-GST_CV_SOBEL_CLASS
+GST_CV_SOBEL_CAST
GST_IS_CV_SOBEL
+GST_CV_SOBEL_CLASS
GST_IS_CV_SOBEL_CLASS
GST_TYPE_CV_SOBEL
+<SUBSECTION Private>
gst_cv_sobel_get_type
-gst_cv_sobel_plugin_init
+</SECTION>
+
+<SECTION>
+<FILE>element-dvbsuboverlay</FILE>
+<TITLE>dvbsuboverlay</TITLE>
+GstDVBSubOverlay
+<SUBSECTION Standard>
+GstDVBSubOverlayClass
+GST_DVB_SUB_OVERLAY
+GST_DVB_SUB_OVERLAY_CAST
+GST_IS_DVB_SUB_OVERLAY
+GST_DVB_SUB_OVERLAY_CLASS
+GST_IS_DVB_SUB_OVERLAY_CLASS
+GST_TYPE_DVB_SUB_OVERLAY
+<SUBSECTION Private>
+gst_dvb_sub_overlay_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-dvdspu</FILE>
+<TITLE>dvdspu</TITLE>
+GstDVDSpu
+<SUBSECTION Standard>
+GstDVDSpuClass
+GST_DVD_SPU
+GST_DVD_SPU_CAST
+GST_IS_DVD_SPU
+GST_DVD_SPU_CLASS
+GST_IS_DVD_SPU_CLASS
+GST_TYPE_DVD_SPU
+<SUBSECTION Private>
+gst_dvd_spu_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-dashdemux</FILE>
+<TITLE>dashdemux</TITLE>
+GstDashDemux
+<SUBSECTION Standard>
+GstDashDemuxClass
+GST_DASH_DEMUX
+GST_DASH_DEMUX_CAST
+GST_IS_DASH_DEMUX
+GST_DASH_DEMUX_CLASS
+GST_IS_DASH_DEMUX_CLASS
+GST_TYPE_DASH_DEMUX
+<SUBSECTION Private>
+gst_dash_demux_get_type
</SECTION>
<SECTION>
@@ -328,14 +828,15 @@
<SUBSECTION Standard>
GstDataURISrcClass
GST_DATA_URI_SRC
-GST_DATA_URI_SRC_CLASS
+GST_DATA_URI_SRC_CAST
GST_IS_DATA_URI_SRC
+GST_DATA_URI_SRC_CLASS
GST_IS_DATA_URI_SRC_CLASS
GST_TYPE_DATA_URI_SRC
+<SUBSECTION Private>
gst_data_uri_src_get_type
</SECTION>
-
<SECTION>
<FILE>element-dc1394</FILE>
<TITLE>dc1394</TITLE>
@@ -407,6 +908,86 @@
</SECTION>
<SECTION>
+<FILE>element-debugspy</FILE>
+<TITLE>debugspy</TITLE>
+GstDebugSpy
+<SUBSECTION Standard>
+GstDebugSpyClass
+GST_DEBUG_SPY
+GST_DEBUG_SPY_CAST
+GST_IS_DEBUG_SPY
+GST_DEBUG_SPY_CLASS
+GST_IS_DEBUG_SPY_CLASS
+GST_TYPE_DEBUG_SPY
+<SUBSECTION Private>
+gst_debug_spy_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-decklinkaudiosink</FILE>
+<TITLE>decklinkaudiosink</TITLE>
+GstDecklinkAudioSink
+<SUBSECTION Standard>
+GstDecklinkAudioSinkClass
+GST_DECKLINK_AUDIO_SINK
+GST_DECKLINK_AUDIO_SINK_CAST
+GST_IS_DECKLINK_AUDIO_SINK
+GST_DECKLINK_AUDIO_SINK_CLASS
+GST_IS_DECKLINK_AUDIO_SINK_CLASS
+GST_TYPE_DECKLINK_AUDIO_SINK
+<SUBSECTION Private>
+gst_decklink_audio_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-decklinkaudiosrc</FILE>
+<TITLE>decklinkaudiosrc</TITLE>
+GstDecklinkAudioSrc
+<SUBSECTION Standard>
+GstDecklinkAudioSrcClass
+GST_DECKLINK_AUDIO_SRC
+GST_DECKLINK_AUDIO_SRC_CAST
+GST_IS_DECKLINK_AUDIO_SRC
+GST_DECKLINK_AUDIO_SRC_CLASS
+GST_IS_DECKLINK_AUDIO_SRC_CLASS
+GST_TYPE_DECKLINK_AUDIO_SRC
+<SUBSECTION Private>
+gst_decklink_audio_src_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-decklinkvideosink</FILE>
+<TITLE>decklinkvideosink</TITLE>
+GstDecklinkVideoSink
+<SUBSECTION Standard>
+GstDecklinkVideoSinkClass
+GST_DECKLINK_VIDEO_SINK
+GST_DECKLINK_VIDEO_SINK_CAST
+GST_IS_DECKLINK_VIDEO_SINK
+GST_DECKLINK_VIDEO_SINK_CLASS
+GST_IS_DECKLINK_VIDEO_SINK_CLASS
+GST_TYPE_DECKLINK_VIDEO_SINK
+<SUBSECTION Private>
+gst_decklink_video_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-decklinkvideosrc</FILE>
+<TITLE>decklinkvideosrc</TITLE>
+GstDecklinkVideoSrc
+<SUBSECTION Standard>
+GstDecklinkVideoSrcClass
+GST_DECKLINK_VIDEO_SRC
+GST_DECKLINK_VIDEO_SRC_CAST
+GST_IS_DECKLINK_VIDEO_SRC
+GST_DECKLINK_VIDEO_SRC_CLASS
+GST_IS_DECKLINK_VIDEO_SRC_CLASS
+GST_TYPE_DECKLINK_VIDEO_SRC
+<SUBSECTION Private>
+gst_decklink_video_src_get_type
+</SECTION>
+
+<SECTION>
<FILE>element-dfbvideosink</FILE>
<TITLE>dfbvideosink</TITLE>
GstDfbVideoSink
@@ -434,12 +1015,12 @@
GstDiffuseClass
GST_DIFFUSE
GST_DIFFUSE_CAST
-GST_DIFFUSE_CLASS
GST_IS_DIFFUSE
+GST_DIFFUSE_CLASS
GST_IS_DIFFUSE_CLASS
GST_TYPE_DIFFUSE
+<SUBSECTION Private>
gst_diffuse_get_type
-gst_diffuse_plugin_init
</SECTION>
<SECTION>
@@ -449,12 +1030,46 @@
<SUBSECTION Standard>
GstDilateClass
GST_DILATE
-GST_DILATE_CLASS
+GST_DILATE_CAST
GST_IS_DILATE
+GST_DILATE_CLASS
GST_IS_DILATE_CLASS
GST_TYPE_DILATE
+<SUBSECTION Private>
gst_dilate_get_type
-gst_dilate_plugin_init
+</SECTION>
+
+<SECTION>
+<FILE>element-diracparse</FILE>
+<TITLE>diracparse</TITLE>
+GstDiracParse
+<SUBSECTION Standard>
+GstDiracParseClass
+GST_DIRAC_PARSE
+GST_DIRAC_PARSE_CAST
+GST_IS_DIRAC_PARSE
+GST_DIRAC_PARSE_CLASS
+GST_IS_DIRAC_PARSE_CLASS
+GST_TYPE_DIRAC_PARSE
+<SUBSECTION Private>
+gst_dirac_parse_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-disparity</FILE>
+<TITLE>disparity</TITLE>
+GstDisparity
+GstDisparityMethod
+<SUBSECTION Standard>
+GstDisparityClass
+GST_DISPARITY
+GST_DISPARITY_CAST
+GST_IS_DISPARITY
+GST_DISPARITY_CLASS
+GST_IS_DISPARITY_CLASS
+GST_TYPE_DISPARITY
+<SUBSECTION Private>
+gst_disparity_get_type
</SECTION>
<SECTION>
@@ -464,12 +1079,93 @@
<SUBSECTION Standard>
GstDodgeClass
GST_DODGE
-GST_DODGE_CLASS
+GST_DODGE_CAST
GST_IS_DODGE
+GST_DODGE_CLASS
GST_IS_DODGE_CLASS
GST_TYPE_DODGE
+<SUBSECTION Private>
gst_dodge_get_type
-gst_dodge_plugin_init
+</SECTION>
+
+<SECTION>
+<FILE>element-dtlsdec</FILE>
+<TITLE>dtlsdec</TITLE>
+GstDtlsDec
+<SUBSECTION Standard>
+GstDtlsDecClass
+GST_DTLS_DEC
+GST_DTLS_DEC_CAST
+GST_IS_DTLS_DEC
+GST_DTLS_DEC_CLASS
+GST_IS_DTLS_DEC_CLASS
+GST_TYPE_DTLS_DEC
+<SUBSECTION Private>
+gst_dtls_dec_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-dtlsenc</FILE>
+<TITLE>dtlsenc</TITLE>
+GstDtlsEnc
+<SUBSECTION Standard>
+GstDtlsEncClass
+GST_DTLS_ENC
+GST_DTLS_ENC_CAST
+GST_IS_DTLS_ENC
+GST_DTLS_ENC_CLASS
+GST_IS_DTLS_ENC_CLASS
+GST_TYPE_DTLS_ENC
+<SUBSECTION Private>
+gst_dtls_enc_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-dtlssrtpdec</FILE>
+<TITLE>dtlssrtpdec</TITLE>
+GstDtlsSrtpDec
+<SUBSECTION Standard>
+GstDtlsSrtpDecClass
+GST_DTLS_SRTP_DEC
+GST_DTLS_SRTP_DEC_CAST
+GST_IS_DTLS_SRTP_DEC
+GST_DTLS_SRTP_DEC_CLASS
+GST_IS_DTLS_SRTP_DEC_CLASS
+GST_TYPE_DTLS_SRTP_DEC
+<SUBSECTION Private>
+gst_dtls_srtp_dec_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-dtlssrtpdemux</FILE>
+<TITLE>dtlssrtpdemux</TITLE>
+GstDtlsSrtpDemux
+<SUBSECTION Standard>
+GstDtlsSrtpDemuxClass
+GST_DTLS_SRTP_DEMUX
+GST_DTLS_SRTP_DEMUX_CAST
+GST_IS_DTLS_SRTP_DEMUX
+GST_DTLS_SRTP_DEMUX_CLASS
+GST_IS_DTLS_SRTP_DEMUX_CLASS
+GST_TYPE_DTLS_SRTP_DEMUX
+<SUBSECTION Private>
+gst_dtls_srtp_demux_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-dtlssrtpenc</FILE>
+<TITLE>dtlssrtpenc</TITLE>
+GstDtlsSrtpEnc
+<SUBSECTION Standard>
+GstDtlsSrtpEncClass
+GST_DTLS_SRTP_ENC
+GST_DTLS_SRTP_ENC_CAST
+GST_IS_DTLS_SRTP_ENC
+GST_DTLS_SRTP_ENC_CLASS
+GST_IS_DTLS_SRTP_ENC_CLASS
+GST_TYPE_DTLS_SRTP_ENC
+<SUBSECTION Private>
+gst_dtls_srtp_enc_get_type
</SECTION>
<SECTION>
@@ -478,16 +1174,14 @@
GstDtmfDetect
<SUBSECTION Standard>
GstDtmfDetectClass
-GstDtmfDetectPrivate
-GST_TYPE_DTMF_DETECT
GST_DTMF_DETECT
GST_DTMF_DETECT_CAST
-GST_DTMF_DETECT_CLASS
-GST_DTMF_DETECT_GET_CLASS
GST_IS_DTMF_DETECT
+GST_DTMF_DETECT_CLASS
GST_IS_DTMF_DETECT_CLASS
+GST_TYPE_DTMF_DETECT
+<SUBSECTION Private>
gst_dtmf_detect_get_type
-gst_dtmf_detect_plugin_init
</SECTION>
<SECTION>
@@ -496,75 +1190,80 @@
GstDtsDec
<SUBSECTION Standard>
GstDtsDecClass
-gst_dtsdec_get_type
-GST_TYPE_DTSDEC
-GST_DTSDEC
-GST_DTSDEC_CLASS
-GST_IS_DTSDEC
-GST_IS_DTSDEC_CLASS
+GST_DTS_DEC
+GST_DTS_DEC_CAST
+GST_IS_DTS_DEC
+GST_DTS_DEC_CLASS
+GST_IS_DTS_DEC_CLASS
+GST_TYPE_DTS_DEC
+<SUBSECTION Private>
+gst_dts_dec_get_type
</SECTION>
<SECTION>
<FILE>element-dvbsrc</FILE>
<TITLE>dvbsrc</TITLE>
GstDvbSrc
+GstDvbSrcBandwidth
+GstDvbSrcCode_Rate
+GstDvbSrcCode_Rate
+GstDvbSrcDelsys
+GstDvbSrcGuard
+GstDvbSrcHierarchy
+GstDvbSrcInterleaving
+GstDvbSrcInversion
+GstDvbSrcCode_Rate
+GstDvbSrcModulation
+GstDvbSrcCode_Rate
+GstDvbSrcModulation
+GstDvbSrcCode_Rate
+GstDvbSrcModulation
+GstDvbSrcModulation
+GstDvbSrcPilot
+GstDvbSrcRolloff
+GstDvbSrcTransmission_Mode
<SUBSECTION Standard>
GstDvbSrcClass
-GstDvbSrcParam
-GstDvbSrcPol
-GST_DVBSRC
-GST_DVBSRC_CLASS
-GST_IS_DVBSRC
-GST_IS_DVBSRC_CLASS
-GST_TYPE_DVBSRC
-gst_dvbsrc_get_type
-gst_dvbsrc_plugin_init
-DEFAULT_BUFFER_SIZE
-DEFAULT_DEVICE
-DEFAULT_DISEQC_SRC
-DEFAULT_SYMBOL_RATE
-MAX_FILTERS
-IPACKS
-IN_SIZE
-TS_SIZE
-</SECTION>
-
-<SECTION>
-<FILE>element-dvdspu</FILE>
-<TITLE>dvdspu</TITLE>
-GstDVDSpu
-<SUBSECTION Standard>
-GstDVDSpuClass
-GST_DVD_SPU
-GST_DVD_SPU_CLASS
-GST_IS_DVD_SPU
-GST_IS_DVD_SPU_CLASS
-GST_TYPE_DVD_SPU
-gst_dvd_spu_get_type
-SpuColour
-SpuLineCtrlI
-SpuPacket
-SpuPixCtrlI
-SpuRect
-SpuState
-DVD_SPU_LOCK
-DVD_SPU_UNLOCK
-SPU_STATE_FLAGS_MASK
+GST_DVB_SRC
+GST_DVB_SRC_CAST
+GST_IS_DVB_SRC
+GST_DVB_SRC_CLASS
+GST_IS_DVB_SRC_CLASS
+GST_TYPE_DVB_SRC
+<SUBSECTION Private>
+gst_dvb_src_get_type
</SECTION>
<SECTION>
<FILE>element-edgedetect</FILE>
<TITLE>edgedetect</TITLE>
-Gstedgedetect
+GstEdgeDetect
<SUBSECTION Standard>
-GstedgedetectClass
-GST_EDGEDETECT
-GST_EDGEDETECT_CLASS
-GST_IS_EDGEDETECT
-GST_IS_EDGEDETECT_CLASS
-GST_TYPE_EDGEDETECT
-gst_edgedetect_get_type
-gst_edgedetect_plugin_init
+GstEdgeDetectClass
+GST_EDGE_DETECT
+GST_EDGE_DETECT_CAST
+GST_IS_EDGE_DETECT
+GST_EDGE_DETECT_CLASS
+GST_IS_EDGE_DETECT_CLASS
+GST_TYPE_EDGE_DETECT
+<SUBSECTION Private>
+gst_edge_detect_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-errorignore</FILE>
+<TITLE>errorignore</TITLE>
+GstErrorIgnore
+<SUBSECTION Standard>
+GstErrorIgnoreClass
+GST_ERROR_IGNORE
+GST_ERROR_IGNORE_CAST
+GST_IS_ERROR_IGNORE
+GST_ERROR_IGNORE_CLASS
+GST_IS_ERROR_IGNORE_CLASS
+GST_TYPE_ERROR_IGNORE
+<SUBSECTION Private>
+gst_error_ignore_get_type
</SECTION>
<SECTION>
@@ -574,25 +1273,62 @@
<SUBSECTION Standard>
GstExclusionClass
GST_EXCLUSION
-GST_EXCLUSION_CLASS
+GST_EXCLUSION_CAST
GST_IS_EXCLUSION
+GST_EXCLUSION_CLASS
GST_IS_EXCLUSION_CLASS
GST_TYPE_EXCLUSION
+<SUBSECTION Private>
gst_exclusion_get_type
-gst_exclusion_plugin_init
+</SECTION>
+
+<SECTION>
+<FILE>element-fbdevsink</FILE>
+<TITLE>fbdevsink</TITLE>
+GstFBDEVSink
+<SUBSECTION Standard>
+GstFBDEVSinkClass
+GST_FBDEV_SINK
+GST_FBDEV_SINK_CAST
+GST_IS_FBDEV_SINK
+GST_FBDEV_SINK_CLASS
+GST_IS_FBDEV_SINK_CLASS
+GST_TYPE_FBDEV_SINK
+<SUBSECTION Private>
+gst_fbdev_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-fpsdisplaysink</FILE>
+<TITLE>fpsdisplaysink</TITLE>
+GstFPSDisplaySink
+<SUBSECTION Standard>
+GstFPSDisplaySinkClass
+GST_FPS_DISPLAY_SINK
+GST_FPS_DISPLAY_SINK_CAST
+GST_IS_FPS_DISPLAY_SINK
+GST_FPS_DISPLAY_SINK_CLASS
+GST_IS_FPS_DISPLAY_SINK_CLASS
+GST_TYPE_FPS_DISPLAY_SINK
+<SUBSECTION Private>
+gst_fps_display_sink_get_type
</SECTION>
<SECTION>
<FILE>element-faac</FILE>
<TITLE>faac</TITLE>
GstFaac
+GstFaacBrtype
+GstFaacShortCtl
<SUBSECTION Standard>
GstFaacClass
-GST_TYPE_FAAC
GST_FAAC
+GST_FAAC_CAST
GST_IS_FAAC
GST_FAAC_CLASS
GST_IS_FAAC_CLASS
+GST_TYPE_FAAC
+<SUBSECTION Private>
gst_faac_get_type
</SECTION>
@@ -602,41 +1338,47 @@
GstFaad
<SUBSECTION Standard>
GstFaadClass
-GST_TYPE_FAAD
GST_FAAD
+GST_FAAD_CAST
GST_IS_FAAD
GST_FAAD_CLASS
GST_IS_FAAD_CLASS
+GST_TYPE_FAAD
+<SUBSECTION Private>
gst_faad_get_type
</SECTION>
-<SECTION>
+<SECTION>
<FILE>element-faceblur</FILE>
<TITLE>faceblur</TITLE>
-Gstfaceblur
+GstFaceBlur
<SUBSECTION Standard>
-GstfaceblurClass
-GST_FACEBLUR
-GST_FACEBLUR_CLASS
-GST_TYPE_FACEBLUR
-GST_IS_FACEBLUR
-GST_IS_FACEBLUR_CLASS
-gst_faceblur_get_type
-gst_faceblur_plugin_init
+GstFaceBlurClass
+GST_FACE_BLUR
+GST_FACE_BLUR_CAST
+GST_IS_FACE_BLUR
+GST_FACE_BLUR_CLASS
+GST_IS_FACE_BLUR_CLASS
+GST_TYPE_FACE_BLUR
+<SUBSECTION Private>
+gst_face_blur_get_type
</SECTION>
+<SECTION>
<FILE>element-facedetect</FILE>
<TITLE>facedetect</TITLE>
-Gstfacedetect
+GstFaceDetect
+GstFaceDetectUpdates
<SUBSECTION Standard>
-GstfacedetectClass
-GST_FACEDETECT
-GST_FACEDETECT_CLASS
-GST_TYPE_FACEDETECT
-GST_IS_FACEDETECT
-GST_IS_FACEDETECT_CLASS
-gst_facedetect_get_type
-gst_facedetect_plugin_init
+GstFaceDetectClass
+GST_FACE_DETECT
+GST_FACE_DETECT_CAST
+GST_IS_FACE_DETECT
+GST_FACE_DETECT_CLASS
+GST_IS_FACE_DETECT_CLASS
+GST_TYPE_FACE_DETECT
+<SUBSECTION Private>
+gst_face_detect_get_type
</SECTION>
<SECTION>
@@ -645,16 +1387,32 @@
GstFestival
<SUBSECTION Standard>
GstFestivalClass
-GstFestivalFlags
GST_FESTIVAL
-GST_FESTIVAL_CLASS
+GST_FESTIVAL_CAST
GST_IS_FESTIVAL
+GST_FESTIVAL_CLASS
GST_IS_FESTIVAL_CLASS
GST_TYPE_FESTIVAL
+<SUBSECTION Private>
gst_festival_get_type
-FESTIVAL_DEFAULT_SERVER_HOST
-FESTIVAL_DEFAULT_SERVER_PORT
-FESTIVAL_DEFAULT_TEXT_MODE
+</SECTION>
+
+<SECTION>
+<FILE>element-fieldanalysis</FILE>
+<TITLE>fieldanalysis</TITLE>
+GstFieldAnalysis
+GstFieldAnalysisFieldMetric
+GstFieldAnalysisFrameMetric
+<SUBSECTION Standard>
+GstFieldAnalysisClass
+GST_FIELD_ANALYSIS
+GST_FIELD_ANALYSIS_CAST
+GST_IS_FIELD_ANALYSIS
+GST_FIELD_ANALYSIS_CLASS
+GST_IS_FIELD_ANALYSIS_CLASS
+GST_TYPE_FIELD_ANALYSIS
+<SUBSECTION Private>
+gst_field_analysis_get_type
</SECTION>
<SECTION>
@@ -665,38 +1423,862 @@
GstFisheyeClass
GST_FISHEYE
GST_FISHEYE_CAST
-GST_FISHEYE_CLASS
GST_IS_FISHEYE
+GST_FISHEYE_CLASS
GST_IS_FISHEYE_CLASS
GST_TYPE_FISHEYE
+<SUBSECTION Private>
gst_fisheye_get_type
-gst_fisheye_plugin_init
</SECTION>
<SECTION>
-<FILE>element-fpsdisplaysink</FILE>
-<TITLE>fpsdisplaysink</TITLE>
-GstFPSDisplaySink
+<FILE>element-fluiddec</FILE>
+<TITLE>fluiddec</TITLE>
+GstFluidDec
<SUBSECTION Standard>
-GstFPSDisplaySinkClass
-GST_TYPE_FPS_DISPLAY_SINK
-GST_FPS_DISPLAY_SINK
-GST_IS_FPS_DISPLAY_SINK
-GST_FPS_DISPLAY_SINK_CLASS
-GST_IS_FPS_DISPLAY_SINK_CLASS
-fps_display_sink_get_type
+GstFluidDecClass
+GST_FLUID_DEC
+GST_FLUID_DEC_CAST
+GST_IS_FLUID_DEC
+GST_FLUID_DEC_CLASS
+GST_IS_FLUID_DEC_CLASS
+GST_TYPE_FLUID_DEC
+<SUBSECTION Private>
+gst_fluid_dec_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-freeverb</FILE>
+<TITLE>freeverb</TITLE>
+GstFreeverb
+<SUBSECTION Standard>
+GstFreeverbClass
+GST_FREEVERB
+GST_FREEVERB_CAST
+GST_IS_FREEVERB
+GST_FREEVERB_CLASS
+GST_IS_FREEVERB_CLASS
+GST_TYPE_FREEVERB
+<SUBSECTION Private>
+gst_freeverb_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gdpdepay</FILE>
+<TITLE>gdpdepay</TITLE>
+GstGDPDepay
+<SUBSECTION Standard>
+GstGDPDepayClass
+GST_GDP_DEPAY
+GST_GDP_DEPAY_CAST
+GST_IS_GDP_DEPAY
+GST_GDP_DEPAY_CLASS
+GST_IS_GDP_DEPAY_CLASS
+GST_TYPE_GDP_DEPAY
+<SUBSECTION Private>
+gst_gdp_depay_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gdppay</FILE>
+<TITLE>gdppay</TITLE>
+GstGDPPay
+<SUBSECTION Standard>
+GstGDPPayClass
+GST_GDP_PAY
+GST_GDP_PAY_CAST
+GST_IS_GDP_PAY
+GST_GDP_PAY_CLASS
+GST_IS_GDP_PAY_CLASS
+GST_TYPE_GDP_PAY
+<SUBSECTION Private>
+gst_gdp_pay_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-glcolorbalance</FILE>
+<TITLE>glcolorbalance</TITLE>
+GstGLColorBalance
+<SUBSECTION Standard>
+GstGLColorBalanceClass
+GST_GL_COLOR_BALANCE
+GST_GL_COLOR_BALANCE_CAST
+GST_IS_GL_COLOR_BALANCE
+GST_GL_COLOR_BALANCE_CLASS
+GST_IS_GL_COLOR_BALANCE_CLASS
+GST_TYPE_GL_COLOR_BALANCE
+<SUBSECTION Private>
+gst_gl_color_balance_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-glcolorconvert</FILE>
+<TITLE>glcolorconvert</TITLE>
+GstGLColorConvertElement
+<SUBSECTION Standard>
+GstGLColorConvertElementClass
+GST_GL_COLOR_CONVERT_ELEMENT
+GST_GL_COLOR_CONVERT_ELEMENT_CAST
+GST_IS_GL_COLOR_CONVERT_ELEMENT
+GST_GL_COLOR_CONVERT_ELEMENT_CLASS
+GST_IS_GL_COLOR_CONVERT_ELEMENT_CLASS
+GST_TYPE_GL_COLOR_CONVERT_ELEMENT
+<SUBSECTION Private>
+gst_gl_color_convert_element_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-glcolorscale</FILE>
+<TITLE>glcolorscale</TITLE>
+GstGLColorscale
+<SUBSECTION Standard>
+GstGLColorscaleClass
+GST_GL_COLORSCALE
+GST_GL_COLORSCALE_CAST
+GST_IS_GL_COLORSCALE
+GST_GL_COLORSCALE_CLASS
+GST_IS_GL_COLORSCALE_CLASS
+GST_TYPE_GL_COLORSCALE
+<SUBSECTION Private>
+gst_gl_colorscale_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gldeinterlace</FILE>
+<TITLE>gldeinterlace</TITLE>
+GstGLDeinterlace
+GstGLDeinterlaceMethod
+<SUBSECTION Standard>
+GstGLDeinterlaceClass
+GST_GL_DEINTERLACE
+GST_GL_DEINTERLACE_CAST
+GST_IS_GL_DEINTERLACE
+GST_GL_DEINTERLACE_CLASS
+GST_IS_GL_DEINTERLACE_CLASS
+GST_TYPE_GL_DEINTERLACE
+<SUBSECTION Private>
+gst_gl_deinterlace_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gldifferencematte</FILE>
+<TITLE>gldifferencematte</TITLE>
+GstGLDifferenceMatte
+<SUBSECTION Standard>
+GstGLDifferenceMatteClass
+GST_GL_DIFFERENCE_MATTE
+GST_GL_DIFFERENCE_MATTE_CAST
+GST_IS_GL_DIFFERENCE_MATTE
+GST_GL_DIFFERENCE_MATTE_CLASS
+GST_IS_GL_DIFFERENCE_MATTE_CLASS
+GST_TYPE_GL_DIFFERENCE_MATTE
+<SUBSECTION Private>
+gst_gl_difference_matte_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gldownload</FILE>
+<TITLE>gldownload</TITLE>
+GstGLDownloadElement
+<SUBSECTION Standard>
+GstGLDownloadElementClass
+GST_GL_DOWNLOAD_ELEMENT
+GST_GL_DOWNLOAD_ELEMENT_CAST
+GST_IS_GL_DOWNLOAD_ELEMENT
+GST_GL_DOWNLOAD_ELEMENT_CLASS
+GST_IS_GL_DOWNLOAD_ELEMENT_CLASS
+GST_TYPE_GL_DOWNLOAD_ELEMENT
+<SUBSECTION Private>
+gst_gl_download_element_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gleffects</FILE>
+<TITLE>gleffects</TITLE>
+GstGLEffectsGeneric
+<SUBSECTION Standard>
+GstGLEffectsGenericClass
+GST_GL_EFFECTS_GENERIC
+GST_GL_EFFECTS_GENERIC_CAST
+GST_IS_GL_EFFECTS_GENERIC
+GST_GL_EFFECTS_GENERIC_CLASS
+GST_IS_GL_EFFECTS_GENERIC_CLASS
+GST_TYPE_GL_EFFECTS_GENERIC
+<SUBSECTION Private>
+gst_gl_effects_generic_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-glfilterapp</FILE>
+<TITLE>glfilterapp</TITLE>
+GstGLFilterApp
+<SUBSECTION Standard>
+GstGLFilterAppClass
+GST_GL_FILTER_APP
+GST_GL_FILTER_APP_CAST
+GST_IS_GL_FILTER_APP
+GST_GL_FILTER_APP_CLASS
+GST_IS_GL_FILTER_APP_CLASS
+GST_TYPE_GL_FILTER_APP
+<SUBSECTION Private>
+gst_gl_filter_app_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-glfilterbin</FILE>
+<TITLE>glfilterbin</TITLE>
+GstGLFilterBin
+<SUBSECTION Standard>
+GstGLFilterBinClass
+GST_GL_FILTER_BIN
+GST_GL_FILTER_BIN_CAST
+GST_IS_GL_FILTER_BIN
+GST_GL_FILTER_BIN_CLASS
+GST_IS_GL_FILTER_BIN_CLASS
+GST_TYPE_GL_FILTER_BIN
+<SUBSECTION Private>
+gst_gl_filter_bin_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-glfiltercube</FILE>
+<TITLE>glfiltercube</TITLE>
+GstGLFilterCube
+<SUBSECTION Standard>
+GstGLFilterCubeClass
+GST_GL_FILTER_CUBE
+GST_GL_FILTER_CUBE_CAST
+GST_IS_GL_FILTER_CUBE
+GST_GL_FILTER_CUBE_CLASS
+GST_IS_GL_FILTER_CUBE_CLASS
+GST_TYPE_GL_FILTER_CUBE
+<SUBSECTION Private>
+gst_gl_filter_cube_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-glfilterglass</FILE>
+<TITLE>glfilterglass</TITLE>
+GstGLFilterGlass
+<SUBSECTION Standard>
+GstGLFilterGlassClass
+GST_GL_FILTER_GLASS
+GST_GL_FILTER_GLASS_CAST
+GST_IS_GL_FILTER_GLASS
+GST_GL_FILTER_GLASS_CLASS
+GST_IS_GL_FILTER_GLASS_CLASS
+GST_TYPE_GL_FILTER_GLASS
+<SUBSECTION Private>
+gst_gl_filter_glass_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-glshader</FILE>
+<TITLE>glshader</TITLE>
+GstGLFilterShader
+<SUBSECTION Standard>
+GstGLFilterShaderClass
+GST_GL_FILTER_SHADER
+GST_GL_FILTER_SHADER_CAST
+GST_IS_GL_FILTER_SHADER
+GST_GL_FILTER_SHADER_CLASS
+GST_IS_GL_FILTER_SHADER_CLASS
+GST_TYPE_GL_FILTER_SHADER
+<SUBSECTION Private>
+gst_gl_filter_shader_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-glimagesinkelement</FILE>
+<TITLE>glimagesinkelement</TITLE>
+GstGLImageSink
+<SUBSECTION Standard>
+GstGLImageSinkClass
+GST_GL_IMAGE_SINK
+GST_GL_IMAGE_SINK_CAST
+GST_IS_GL_IMAGE_SINK
+GST_GL_IMAGE_SINK_CLASS
+GST_IS_GL_IMAGE_SINK_CLASS
+GST_TYPE_GL_IMAGE_SINK
+<SUBSECTION Private>
+gst_gl_image_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-glimagesink</FILE>
+<TITLE>glimagesink</TITLE>
+GstGLImageSinkBin
+<SUBSECTION Standard>
+GstGLImageSinkBinClass
+GST_GL_IMAGE_SINK_BIN
+GST_GL_IMAGE_SINK_BIN_CAST
+GST_IS_GL_IMAGE_SINK_BIN
+GST_GL_IMAGE_SINK_BIN_CLASS
+GST_IS_GL_IMAGE_SINK_BIN_CLASS
+GST_TYPE_GL_IMAGE_SINK_BIN
+<SUBSECTION Private>
+gst_gl_image_sink_bin_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-glmixerbin</FILE>
+<TITLE>glmixerbin</TITLE>
+GstGLMixerBin
+GstGLMixerBinStartTimeSelection
+<SUBSECTION Standard>
+GstGLMixerBinClass
+GST_GL_MIXER_BIN
+GST_GL_MIXER_BIN_CAST
+GST_IS_GL_MIXER_BIN
+GST_GL_MIXER_BIN_CLASS
+GST_IS_GL_MIXER_BIN_CLASS
+GST_TYPE_GL_MIXER_BIN
+<SUBSECTION Private>
+gst_gl_mixer_bin_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-glmosaic</FILE>
+<TITLE>glmosaic</TITLE>
+GstGLMosaic
+<SUBSECTION Standard>
+GstGLMosaicClass
+GST_GL_MOSAIC
+GST_GL_MOSAIC_CAST
+GST_IS_GL_MOSAIC
+GST_GL_MOSAIC_CLASS
+GST_IS_GL_MOSAIC_CLASS
+GST_TYPE_GL_MOSAIC
+<SUBSECTION Private>
+gst_gl_mosaic_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gloverlay</FILE>
+<TITLE>gloverlay</TITLE>
+GstGLOverlay
+<SUBSECTION Standard>
+GstGLOverlayClass
+GST_GL_OVERLAY
+GST_GL_OVERLAY_CAST
+GST_IS_GL_OVERLAY
+GST_GL_OVERLAY_CLASS
+GST_IS_GL_OVERLAY_CLASS
+GST_TYPE_GL_OVERLAY
+<SUBSECTION Private>
+gst_gl_overlay_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-glsinkbin</FILE>
+<TITLE>glsinkbin</TITLE>
+GstGLSinkBin
+<SUBSECTION Standard>
+GstGLSinkBinClass
+GST_GL_SINK_BIN
+GST_GL_SINK_BIN_CAST
+GST_IS_GL_SINK_BIN
+GST_GL_SINK_BIN_CLASS
+GST_IS_GL_SINK_BIN_CLASS
+GST_TYPE_GL_SINK_BIN
+<SUBSECTION Private>
+gst_gl_sink_bin_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-glsrcbin</FILE>
+<TITLE>glsrcbin</TITLE>
+GstGLSrcBin
+<SUBSECTION Standard>
+GstGLSrcBinClass
+GST_GL_SRC_BIN
+GST_GL_SRC_BIN_CAST
+GST_IS_GL_SRC_BIN
+GST_GL_SRC_BIN_CLASS
+GST_IS_GL_SRC_BIN_CLASS
+GST_TYPE_GL_SRC_BIN
+<SUBSECTION Private>
+gst_gl_src_bin_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-glstereomix</FILE>
+<TITLE>glstereomix</TITLE>
+GstGLStereoMix
+<SUBSECTION Standard>
+GstGLStereoMixClass
+GST_GL_STEREO_MIX
+GST_GL_STEREO_MIX_CAST
+GST_IS_GL_STEREO_MIX
+GST_GL_STEREO_MIX_CLASS
+GST_IS_GL_STEREO_MIX_CLASS
+GST_TYPE_GL_STEREO_MIX
+<SUBSECTION Private>
+gst_gl_stereo_mix_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-glstereosplit</FILE>
+<TITLE>glstereosplit</TITLE>
+GstGLStereoSplit
+<SUBSECTION Standard>
+GstGLStereoSplitClass
+GST_GL_STEREO_SPLIT
+GST_GL_STEREO_SPLIT_CAST
+GST_IS_GL_STEREO_SPLIT
+GST_GL_STEREO_SPLIT_CLASS
+GST_IS_GL_STEREO_SPLIT_CLASS
+GST_TYPE_GL_STEREO_SPLIT
+<SUBSECTION Private>
+gst_gl_stereo_split_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gltestsrc</FILE>
+<TITLE>gltestsrc</TITLE>
+GstGLTestSrc
+GstGLTestSrcPattern
+<SUBSECTION Standard>
+GstGLTestSrcClass
+GST_GL_TEST_SRC
+GST_GL_TEST_SRC_CAST
+GST_IS_GL_TEST_SRC
+GST_GL_TEST_SRC_CLASS
+GST_IS_GL_TEST_SRC_CLASS
+GST_TYPE_GL_TEST_SRC
+<SUBSECTION Private>
+gst_gl_test_src_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gltransformation</FILE>
+<TITLE>gltransformation</TITLE>
+GstGLTransformation
+<SUBSECTION Standard>
+GstGLTransformationClass
+GST_GL_TRANSFORMATION
+GST_GL_TRANSFORMATION_CLASS
+GST_IS_GL_TRANSFORMATION
+GST_IS_GL_TRANSFORMATION_CLASS
+GST_TYPE_GL_TRANSFORMATION
+</SECTION>
+
+<SECTION>
+<FILE>element-glupload</FILE>
+<TITLE>glupload</TITLE>
+GstGLUploadElement
+<SUBSECTION Standard>
+GstGLUploadElementClass
+GST_GL_UPLOAD_ELEMENT
+GST_GL_UPLOAD_ELEMENT_CAST
+GST_IS_GL_UPLOAD_ELEMENT
+GST_GL_UPLOAD_ELEMENT_CLASS
+GST_IS_GL_UPLOAD_ELEMENT_CLASS
+GST_TYPE_GL_UPLOAD_ELEMENT
+<SUBSECTION Private>
+gst_gl_upload_element_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-glvideomixerelement</FILE>
+<TITLE>glvideomixerelement</TITLE>
+GstGLVideoMixer
+GstGLVideoMixerBackground
+<SUBSECTION Standard>
+GstGLVideoMixerClass
+GST_GL_VIDEO_MIXER
+GST_GL_VIDEO_MIXER_CAST
+GST_IS_GL_VIDEO_MIXER
+GST_GL_VIDEO_MIXER_CLASS
+GST_IS_GL_VIDEO_MIXER_CLASS
+GST_TYPE_GL_VIDEO_MIXER
+<SUBSECTION Private>
+gst_gl_video_mixer_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-glvideomixer</FILE>
+<TITLE>glvideomixer</TITLE>
+GstGLVideoMixerBin
+<SUBSECTION Standard>
+GstGLVideoMixerBinClass
+GST_GL_VIDEO_MIXER_BIN
+GST_GL_VIDEO_MIXER_BIN_CAST
+GST_IS_GL_VIDEO_MIXER_BIN
+GST_GL_VIDEO_MIXER_BIN_CLASS
+GST_IS_GL_VIDEO_MIXER_BIN_CLASS
+GST_TYPE_GL_VIDEO_MIXER_BIN
+<SUBSECTION Private>
+gst_gl_video_mixer_bin_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-glviewconvert</FILE>
+<TITLE>glviewconvert</TITLE>
+GstGLViewConvertElement
+<SUBSECTION Standard>
+GstGLViewConvertElementClass
+GST_GL_VIEW_CONVERT_ELEMENT
+GST_GL_VIEW_CONVERT_ELEMENT_CAST
+GST_IS_GL_VIEW_CONVERT_ELEMENT
+GST_GL_VIEW_CONVERT_ELEMENT_CLASS
+GST_IS_GL_VIEW_CONVERT_ELEMENT_CLASS
+GST_TYPE_GL_VIEW_CONVERT_ELEMENT
+<SUBSECTION Private>
+gst_gl_view_convert_element_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gsmdec</FILE>
+<TITLE>gsmdec</TITLE>
+GstGSMDec
+<SUBSECTION Standard>
+GstGSMDecClass
+GST_GSM_DEC
+GST_GSM_DEC_CAST
+GST_IS_GSM_DEC
+GST_GSM_DEC_CLASS
+GST_IS_GSM_DEC_CLASS
+GST_TYPE_GSM_DEC
+<SUBSECTION Private>
+gst_gsm_dec_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gsmenc</FILE>
+<TITLE>gsmenc</TITLE>
+GstGSMEnc
+<SUBSECTION Standard>
+GstGSMEncClass
+GST_GSM_ENC
+GST_GSM_ENC_CAST
+GST_IS_GSM_ENC
+GST_GSM_ENC_CLASS
+GST_IS_GSM_ENC_CLASS
+GST_TYPE_GSM_ENC
+<SUBSECTION Private>
+gst_gsm_enc_get_type
</SECTION>
<SECTION>
<FILE>element-gaussianblur</FILE>
<TITLE>gaussianblur</TITLE>
-GaussBlur
+GstGaussianBlur
<SUBSECTION Standard>
-GaussBlurClass
-GAUSS_BLUR
-GST_TYPE_GAUSS_BLUR
-gauss_blur_get_type
-gst_gauss_blur_plugin_init
+GstGaussianBlurClass
+GST_GAUSSIAN_BLUR
+GST_GAUSSIAN_BLUR_CAST
+GST_IS_GAUSSIAN_BLUR
+GST_GAUSSIAN_BLUR_CLASS
+GST_IS_GAUSSIAN_BLUR_CLASS
+GST_TYPE_GAUSSIAN_BLUR
+<SUBSECTION Private>
+gst_gaussian_blur_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gmedec</FILE>
+<TITLE>gmedec</TITLE>
+GstGmeDec
+<SUBSECTION Standard>
+GstGmeDecClass
+GST_GME_DEC
+GST_GME_DEC_CAST
+GST_IS_GME_DEC
+GST_GME_DEC_CLASS
+GST_IS_GME_DEC_CLASS
+GST_TYPE_GME_DEC
+<SUBSECTION Private>
+gst_gme_dec_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-grabcut</FILE>
+<TITLE>grabcut</TITLE>
+GstGrabcut
+<SUBSECTION Standard>
+GstGrabcutClass
+GST_GRABCUT
+GST_GRABCUT_CAST
+GST_IS_GRABCUT
+GST_GRABCUT_CLASS
+GST_IS_GRABCUT_CLASS
+GST_TYPE_GRABCUT
+<SUBSECTION Private>
+gst_grabcut_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gtkglsink</FILE>
+<TITLE>gtkglsink</TITLE>
+GstGtkGLSink
+<SUBSECTION Standard>
+GstGtkGLSinkClass
+GST_GTK_GL_SINK
+GST_GTK_GL_SINK_CAST
+GST_IS_GTK_GL_SINK
+GST_GTK_GL_SINK_CLASS
+GST_IS_GTK_GL_SINK_CLASS
+GST_TYPE_GTK_GL_SINK
+<SUBSECTION Private>
+gst_gtk_gl_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gtksink</FILE>
+<TITLE>gtksink</TITLE>
+GstGtkSink
+<SUBSECTION Standard>
+GstGtkSinkClass
+GST_GTK_SINK
+GST_GTK_SINK_CAST
+GST_IS_GTK_SINK
+GST_GTK_SINK_CLASS
+GST_IS_GTK_SINK_CLASS
+GST_TYPE_GTK_SINK
+<SUBSECTION Private>
+gst_gtk_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-h263parse</FILE>
+<TITLE>h263parse</TITLE>
+GstH263Parse
+<SUBSECTION Standard>
+GstH263ParseClass
+GST_H263_PARSE
+GST_H263_PARSE_CAST
+GST_IS_H263_PARSE
+GST_H263_PARSE_CLASS
+GST_IS_H263_PARSE_CLASS
+GST_TYPE_H263_PARSE
+<SUBSECTION Private>
+gst_h263_parse_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-h264parse</FILE>
+<TITLE>h264parse</TITLE>
+GstH264Parse
+<SUBSECTION Standard>
+GstH264ParseClass
+GST_H264_PARSE
+GST_H264_PARSE_CAST
+GST_IS_H264_PARSE
+GST_H264_PARSE_CLASS
+GST_IS_H264_PARSE_CLASS
+GST_TYPE_H264_PARSE
+<SUBSECTION Private>
+gst_h264_parse_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-h265parse</FILE>
+<TITLE>h265parse</TITLE>
+GstH265Parse
+<SUBSECTION Standard>
+GstH265ParseClass
+GST_H265_PARSE
+GST_H265_PARSE_CAST
+GST_IS_H265_PARSE
+GST_H265_PARSE_CLASS
+GST_IS_H265_PARSE_CLASS
+GST_TYPE_H265_PARSE
+<SUBSECTION Private>
+gst_h265_parse_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-hlsdemux</FILE>
+<TITLE>hlsdemux</TITLE>
+GstHLSDemux
+<SUBSECTION Standard>
+GstHLSDemuxClass
+GST_HLS_DEMUX
+GST_HLS_DEMUX_CAST
+GST_IS_HLS_DEMUX
+GST_HLS_DEMUX_CLASS
+GST_IS_HLS_DEMUX_CLASS
+GST_TYPE_HLS_DEMUX
+<SUBSECTION Private>
+gst_hls_demux_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-handdetect</FILE>
+<TITLE>handdetect</TITLE>
+GstHanddetect
+<SUBSECTION Standard>
+GstHanddetectClass
+GST_HANDDETECT
+GST_HANDDETECT_CAST
+GST_IS_HANDDETECT
+GST_HANDDETECT_CLASS
+GST_IS_HANDDETECT_CLASS
+GST_TYPE_HANDDETECT
+<SUBSECTION Private>
+gst_handdetect_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-hlssink</FILE>
+<TITLE>hlssink</TITLE>
+GstHlsSink
+<SUBSECTION Standard>
+GstHlsSinkClass
+GST_HLS_SINK
+GST_HLS_SINK_CAST
+GST_IS_HLS_SINK
+GST_HLS_SINK_CLASS
+GST_IS_HLS_SINK_CLASS
+GST_TYPE_HLS_SINK
+<SUBSECTION Private>
+gst_hls_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-irtspparse</FILE>
+<TITLE>irtspparse</TITLE>
+GstIRTSPParse
+<SUBSECTION Standard>
+GstIRTSPParseClass
+GST_IRTSP_PARSE
+GST_IRTSP_PARSE_CAST
+GST_IS_IRTSP_PARSE
+GST_IRTSP_PARSE_CLASS
+GST_IS_IRTSP_PARSE_CLASS
+GST_TYPE_IRTSP_PARSE
+<SUBSECTION Private>
+gst_irtsp_parse_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-id3mux</FILE>
+<TITLE>id3mux</TITLE>
+GstId3Mux
+<SUBSECTION Standard>
+GstId3MuxClass
+GST_ID3_MUX
+GST_ID3_MUX_CAST
+GST_IS_ID3_MUX
+GST_ID3_MUX_CLASS
+GST_IS_ID3_MUX_CLASS
+GST_TYPE_ID3_MUX
+<SUBSECTION Private>
+gst_id3_mux_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-interaudiosink</FILE>
+<TITLE>interaudiosink</TITLE>
+GstInterAudioSink
+<SUBSECTION Standard>
+GstInterAudioSinkClass
+GST_INTER_AUDIO_SINK
+GST_INTER_AUDIO_SINK_CAST
+GST_IS_INTER_AUDIO_SINK
+GST_INTER_AUDIO_SINK_CLASS
+GST_IS_INTER_AUDIO_SINK_CLASS
+GST_TYPE_INTER_AUDIO_SINK
+<SUBSECTION Private>
+gst_inter_audio_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-interaudiosrc</FILE>
+<TITLE>interaudiosrc</TITLE>
+GstInterAudioSrc
+<SUBSECTION Standard>
+GstInterAudioSrcClass
+GST_INTER_AUDIO_SRC
+GST_INTER_AUDIO_SRC_CAST
+GST_IS_INTER_AUDIO_SRC
+GST_INTER_AUDIO_SRC_CLASS
+GST_IS_INTER_AUDIO_SRC_CLASS
+GST_TYPE_INTER_AUDIO_SRC
+<SUBSECTION Private>
+gst_inter_audio_src_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-intersubsink</FILE>
+<TITLE>intersubsink</TITLE>
+GstInterSubSink
+<SUBSECTION Standard>
+GstInterSubSinkClass
+GST_INTER_SUB_SINK
+GST_INTER_SUB_SINK_CAST
+GST_IS_INTER_SUB_SINK
+GST_INTER_SUB_SINK_CLASS
+GST_IS_INTER_SUB_SINK_CLASS
+GST_TYPE_INTER_SUB_SINK
+<SUBSECTION Private>
+gst_inter_sub_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-intersubsrc</FILE>
+<TITLE>intersubsrc</TITLE>
+GstInterSubSrc
+<SUBSECTION Standard>
+GstInterSubSrcClass
+GST_INTER_SUB_SRC
+GST_INTER_SUB_SRC_CAST
+GST_IS_INTER_SUB_SRC
+GST_INTER_SUB_SRC_CLASS
+GST_IS_INTER_SUB_SRC_CLASS
+GST_TYPE_INTER_SUB_SRC
+<SUBSECTION Private>
+gst_inter_sub_src_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-intervideosink</FILE>
+<TITLE>intervideosink</TITLE>
+GstInterVideoSink
+<SUBSECTION Standard>
+GstInterVideoSinkClass
+GST_INTER_VIDEO_SINK
+GST_INTER_VIDEO_SINK_CAST
+GST_IS_INTER_VIDEO_SINK
+GST_INTER_VIDEO_SINK_CLASS
+GST_IS_INTER_VIDEO_SINK_CLASS
+GST_TYPE_INTER_VIDEO_SINK
+<SUBSECTION Private>
+gst_inter_video_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-intervideosrc</FILE>
+<TITLE>intervideosrc</TITLE>
+GstInterVideoSrc
+<SUBSECTION Standard>
+GstInterVideoSrcClass
+GST_INTER_VIDEO_SRC
+GST_INTER_VIDEO_SRC_CAST
+GST_IS_INTER_VIDEO_SRC
+GST_INTER_VIDEO_SRC_CLASS
+GST_IS_INTER_VIDEO_SRC_CLASS
+GST_TYPE_INTER_VIDEO_SRC
+<SUBSECTION Private>
+gst_inter_video_src_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-interlace</FILE>
+<TITLE>interlace</TITLE>
+GstInterlace
+GstInterlacePattern
+<SUBSECTION Standard>
+GstInterlaceClass
+GST_INTERLACE
+GST_INTERLACE_CAST
+GST_IS_INTERLACE
+GST_INTERLACE_CLASS
+GST_IS_INTERLACE_CLASS
+GST_TYPE_INTERLACE
+<SUBSECTION Private>
+gst_interlace_get_type
</SECTION>
<SECTION>
@@ -704,38 +2286,111 @@
<TITLE>ivfparse</TITLE>
GstIvfParse
<SUBSECTION Standard>
-GstIvfParseState
GstIvfParseClass
GST_IVF_PARSE
-GST_IVF_PARSE_CLASS
+GST_IVF_PARSE_CAST
GST_IS_IVF_PARSE
+GST_IVF_PARSE_CLASS
GST_IS_IVF_PARSE_CLASS
GST_TYPE_IVF_PARSE
+<SUBSECTION Private>
gst_ivf_parse_get_type
</SECTION>
<SECTION>
+<FILE>element-ivtc</FILE>
+<TITLE>ivtc</TITLE>
+GstIvtc
+<SUBSECTION Standard>
+GstIvtcClass
+GST_IVTC
+GST_IVTC_CAST
+GST_IS_IVTC
+GST_IVTC_CLASS
+GST_IS_IVTC_CLASS
+GST_TYPE_IVTC
+<SUBSECTION Private>
+gst_ivtc_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-jp2kdecimator</FILE>
+<TITLE>jp2kdecimator</TITLE>
+GstJP2kDecimator
+<SUBSECTION Standard>
+GstJP2kDecimatorClass
+GST_J_P2K_DECIMATOR
+GST_J_P2K_DECIMATOR_CAST
+GST_IS_J_P2K_DECIMATOR
+GST_J_P2K_DECIMATOR_CLASS
+GST_IS_J_P2K_DECIMATOR_CLASS
+GST_TYPE_J_P2K_DECIMATOR
+<SUBSECTION Private>
+gst_j_p2k_decimator_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-jpeg2000parse</FILE>
+<TITLE>jpeg2000parse</TITLE>
+GstJPEG2000Parse
+<SUBSECTION Standard>
+GstJPEG2000ParseClass
+GST_JPE_G2000_PARSE
+GST_JPE_G2000_PARSE_CAST
+GST_IS_JPE_G2000_PARSE
+GST_JPE_G2000_PARSE_CLASS
+GST_IS_JPE_G2000_PARSE_CLASS
+GST_TYPE_JPE_G2000_PARSE
+<SUBSECTION Private>
+gst_jpe_g2000_parse_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-jifmux</FILE>
+<TITLE>jifmux</TITLE>
+GstJifMux
+<SUBSECTION Standard>
+GstJifMuxClass
+GST_JIF_MUX
+GST_JIF_MUX_CAST
+GST_IS_JIF_MUX
+GST_JIF_MUX_CLASS
+GST_IS_JIF_MUX_CLASS
+GST_TYPE_JIF_MUX
+<SUBSECTION Private>
+gst_jif_mux_get_type
+</SECTION>
+
+<SECTION>
<FILE>element-jpegparse</FILE>
<TITLE>jpegparse</TITLE>
GstJpegParse
-<SUBSECTION Starndard>
+<SUBSECTION Standard>
GstJpegParseClass
GST_JPEG_PARSE
-GST_JPEG_PARSE_CLASS
+GST_JPEG_PARSE_CAST
GST_IS_JPEG_PARSE
+GST_JPEG_PARSE_CLASS
GST_IS_JPEG_PARSE_CLASS
GST_TYPE_JPEG_PARSE
+<SUBSECTION Private>
gst_jpeg_parse_get_type
</SECTION>
<SECTION>
-<FILE>element-liveadder</FILE>
-<TITLE>liveadder</TITLE>
-GstLiveAdder
+<FILE>element-kmssink</FILE>
+<TITLE>kmssink</TITLE>
+GstKMSSink
<SUBSECTION Standard>
-GstLiveAdderClass
-GST_TYPE_LIVE_ADDER
-gst_live_adder_get_type
+GstKMSSinkClass
+GST_KMS_SINK
+GST_KMS_SINK_CAST
+GST_IS_KMS_SINK
+GST_KMS_SINK_CLASS
+GST_IS_KMS_SINK_CLASS
+GST_TYPE_KMS_SINK
+<SUBSECTION Private>
+gst_kms_sink_get_type
</SECTION>
<SECTION>
@@ -746,12 +2401,12 @@
GstKaleidoscopeClass
GST_KALEIDOSCOPE
GST_KALEIDOSCOPE_CAST
-GST_KALEIDOSCOPE_CLASS
GST_IS_KALEIDOSCOPE
+GST_KALEIDOSCOPE_CLASS
GST_IS_KALEIDOSCOPE_CLASS
GST_TYPE_KALEIDOSCOPE
+<SUBSECTION Private>
gst_kaleidoscope_get_type
-gst_kaleidoscope_plugin_init
</SECTION>
<SECTION>
@@ -761,10 +2416,12 @@
<SUBSECTION Standard>
GstKateDecClass
GST_KATE_DEC
-GST_KATE_DEC_CLASS
+GST_KATE_DEC_CAST
GST_IS_KATE_DEC
+GST_KATE_DEC_CLASS
GST_IS_KATE_DEC_CLASS
GST_TYPE_KATE_DEC
+<SUBSECTION Private>
gst_kate_dec_get_type
</SECTION>
@@ -775,10 +2432,12 @@
<SUBSECTION Standard>
GstKateEncClass
GST_KATE_ENC
-GST_KATE_ENC_CLASS
+GST_KATE_ENC_CAST
GST_IS_KATE_ENC
+GST_KATE_ENC_CLASS
GST_IS_KATE_ENC_CLASS
GST_TYPE_KATE_ENC
+<SUBSECTION Private>
gst_kate_enc_get_type
</SECTION>
@@ -789,10 +2448,12 @@
<SUBSECTION Standard>
GstKateParseClass
GST_KATE_PARSE
-GST_KATE_PARSE_CLASS
+GST_KATE_PARSE_CAST
GST_IS_KATE_PARSE
+GST_KATE_PARSE_CLASS
GST_IS_KATE_PARSE_CLASS
GST_TYPE_KATE_PARSE
+<SUBSECTION Private>
gst_kate_parse_get_type
</SECTION>
@@ -803,10 +2464,12 @@
<SUBSECTION Standard>
GstKateTagClass
GST_KATE_TAG
-GST_KATE_TAG_CLASS
+GST_KATE_TAG_CAST
GST_IS_KATE_TAG
+GST_KATE_TAG_CLASS
GST_IS_KATE_TAG_CLASS
GST_TYPE_KATE_TAG
+<SUBSECTION Private>
gst_kate_tag_get_type
</SECTION>
@@ -825,6 +2488,22 @@
</SECTION>
<SECTION>
+<FILE>element-liveadder</FILE>
+<TITLE>liveadder</TITLE>
+GstLiveAdder
+<SUBSECTION Standard>
+GstLiveAdderClass
+GST_LIVE_ADDER
+GST_LIVE_ADDER_CAST
+GST_IS_LIVE_ADDER
+GST_LIVE_ADDER_CLASS
+GST_IS_LIVE_ADDER_CLASS
+GST_TYPE_LIVE_ADDER
+<SUBSECTION Private>
+gst_live_adder_get_type
+</SECTION>
+
+<SECTION>
<FILE>element-ladspa</FILE>
<TITLE>ladspa</TITLE>
GstLADSPA
@@ -833,6 +2512,54 @@
</SECTION>
<SECTION>
+<FILE>element-mmssrc</FILE>
+<TITLE>mmssrc</TITLE>
+GstMMS
+<SUBSECTION Standard>
+GstMMSClass
+GST_MMS
+GST_MMS_CAST
+GST_IS_MMS
+GST_MMS_CLASS
+GST_IS_MMS_CLASS
+GST_TYPE_MMS
+<SUBSECTION Private>
+gst_mms_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-mxfdemux</FILE>
+<TITLE>mxfdemux</TITLE>
+GstMXFDemux
+<SUBSECTION Standard>
+GstMXFDemuxClass
+GST_MXF_DEMUX
+GST_MXF_DEMUX_CAST
+GST_IS_MXF_DEMUX
+GST_MXF_DEMUX_CLASS
+GST_IS_MXF_DEMUX_CLASS
+GST_TYPE_MXF_DEMUX
+<SUBSECTION Private>
+gst_mxf_demux_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-mxfmux</FILE>
+<TITLE>mxfmux</TITLE>
+GstMXFMux
+<SUBSECTION Standard>
+GstMXFMuxClass
+GST_MXF_MUX
+GST_MXF_MUX_CAST
+GST_IS_MXF_MUX
+GST_MXF_MUX_CLASS
+GST_IS_MXF_MUX_CLASS
+GST_TYPE_MXF_MUX
+<SUBSECTION Private>
+gst_mxf_mux_get_type
+</SECTION>
+
+<SECTION>
<FILE>element-marble</FILE>
<TITLE>marble</TITLE>
GstMarble
@@ -840,12 +2567,28 @@
GstMarbleClass
GST_MARBLE
GST_MARBLE_CAST
-GST_MARBLE_CLASS
GST_IS_MARBLE
+GST_MARBLE_CLASS
GST_IS_MARBLE_CLASS
GST_TYPE_MARBLE
+<SUBSECTION Private>
gst_marble_get_type
-gst_marble_plugin_init
+</SECTION>
+
+<SECTION>
+<FILE>element-midiparse</FILE>
+<TITLE>midiparse</TITLE>
+GstMidiParse
+<SUBSECTION Standard>
+GstMidiParseClass
+GST_MIDI_PARSE
+GST_MIDI_PARSE_CAST
+GST_IS_MIDI_PARSE
+GST_MIDI_PARSE_CLASS
+GST_IS_MIDI_PARSE_CLASS
+GST_TYPE_MIDI_PARSE
+<SUBSECTION Private>
+gst_midi_parse_get_type
</SECTION>
<SECTION>
@@ -854,12 +2597,14 @@
GstMimDec
<SUBSECTION Standard>
GstMimDecClass
-GST_IS_MIMDEC
-GST_IS_MIMDEC_CLASS
-GST_MIMDEC
-GST_MIMDEC_CLASS
-GST_TYPE_MIMDEC
-gst_mimdec_get_type
+GST_MIM_DEC
+GST_MIM_DEC_CAST
+GST_IS_MIM_DEC
+GST_MIM_DEC_CLASS
+GST_IS_MIM_DEC_CLASS
+GST_TYPE_MIM_DEC
+<SUBSECTION Private>
+gst_mim_dec_get_type
</SECTION>
<SECTION>
@@ -868,28 +2613,31 @@
GstMimEnc
<SUBSECTION Standard>
GstMimEncClass
-GST_IS_MIMENC
-GST_IS_MIMENC_CLASS
-GST_MIMENC
-GST_MIMENC_CLASS
-GST_TYPE_MIMENC
-gst_mimenc_get_type
+GST_MIM_ENC
+GST_MIM_ENC_CAST
+GST_IS_MIM_ENC
+GST_MIM_ENC_CLASS
+GST_IS_MIM_ENC_CLASS
+GST_TYPE_MIM_ENC
+<SUBSECTION Private>
+gst_mim_enc_get_type
</SECTION>
<SECTION>
<FILE>element-mirror</FILE>
<TITLE>mirror</TITLE>
GstMirror
+GstMirrorMode
<SUBSECTION Standard>
GstMirrorClass
GST_MIRROR
GST_MIRROR_CAST
-GST_MIRROR_CLASS
GST_IS_MIRROR
+GST_MIRROR_CLASS
GST_IS_MIRROR_CLASS
GST_TYPE_MIRROR
+<SUBSECTION Private>
gst_mirror_get_type
-gst_mirror_plugin_init
</SECTION>
<SECTION>
@@ -898,97 +2646,137 @@
GstModPlug
<SUBSECTION Standard>
GstModPlugClass
-GST_MODPLUG
-GST_MODPLUG_CLASS
-GST_IS_MODPLUG
-GST_IS_MODPLUG_CLASS
-GST_TYPE_MODPLUG
-gst_modplug_get_type
+GST_MOD_PLUG
+GST_MOD_PLUG_CAST
+GST_IS_MOD_PLUG
+GST_MOD_PLUG_CLASS
+GST_IS_MOD_PLUG_CLASS
+GST_TYPE_MOD_PLUG
+<SUBSECTION Private>
+gst_mod_plug_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-motioncells</FILE>
+<TITLE>motioncells</TITLE>
+GstMotioncells
+<SUBSECTION Standard>
+GstMotioncellsClass
+GST_MOTIONCELLS
+GST_MOTIONCELLS_CAST
+GST_IS_MOTIONCELLS
+GST_MOTIONCELLS_CLASS
+GST_IS_MOTIONCELLS_CLASS
+GST_TYPE_MOTIONCELLS
+<SUBSECTION Private>
+gst_motioncells_get_type
</SECTION>
<SECTION>
<FILE>element-mpeg2enc</FILE>
<TITLE>mpeg2enc</TITLE>
GstMpeg2enc
+GstMpeg2encAspect
+GstMpeg2encFormat
+GstMpeg2encFramerate
+GstMpeg2encInterlaceMode
+GstMpeg2encVideoNorm
+GstMpeg2encPlaybackFieldOrders
+GstMpeg2encQuantisationMatrix
<SUBSECTION Standard>
GstMpeg2encClass
GST_MPEG2ENC
-GST_MPEG2ENC_CLASS
+GST_MPEG2ENC_CAST
GST_IS_MPEG2ENC
+GST_MPEG2ENC_CLASS
GST_IS_MPEG2ENC_CLASS
GST_TYPE_MPEG2ENC
-GST_MPEG2ENC_MUTEX_LOCK
-GST_MPEG2ENC_MUTEX_UNLOCK
-GST_MPEG2ENC_SIGNAL
-GST_MPEG2ENC_WAIT
+<SUBSECTION Private>
gst_mpeg2enc_get_type
</SECTION>
<SECTION>
-<FILE>element-mpegpsmux</FILE>
-<TITLE>mpegpsmux</TITLE>
+<FILE>element-mpeg4videoparse</FILE>
+<TITLE>mpeg4videoparse</TITLE>
+GstMpeg4VParse
<SUBSECTION Standard>
-MpegPsMux
-GST_MPEG_PSMUX
-GST_TYPE_MPEG_PSMUX
-MpegPsMuxClass
-mpegpsmux_get_type
+GstMpeg4VParseClass
+GST_MPEG4_V_PARSE
+GST_MPEG4_V_PARSE_CAST
+GST_IS_MPEG4_V_PARSE
+GST_MPEG4_V_PARSE_CLASS
+GST_IS_MPEG4_V_PARSE_CLASS
+GST_TYPE_MPEG4_V_PARSE
<SUBSECTION Private>
-MpegPsPadData
-MpegPsPadDataPrepareFunction
-CLOCK_BASE
-CLOCK_FREQ
-GSTTIME_TO_MPEGTIME
-NORMAL_TS_PACKET_LENGTH
-M2TS_PACKET_LENGTH
-STANDARD_TIME_CLOCK
-TWO_POW_33_MINUS1
+gst_mpeg4_v_parse_get_type
</SECTION>
<SECTION>
-<FILE>element-mpegtsmux</FILE>
-<TITLE>mpegtsmux</TITLE>
+<FILE>element-mpegpsdemux</FILE>
+<TITLE>mpegpsdemux</TITLE>
+GstMpegPSDemux
<SUBSECTION Standard>
-MpegTsMux
-GST_MPEG_TSMUX
-GST_TYPE_MPEG_TSMUX
-MpegTsMuxClass
-mpegtsmux_get_type
+GstMpegPSDemuxClass
+GST_MPEG_PS_DEMUX
+GST_MPEG_PS_DEMUX_CAST
+GST_IS_MPEG_PS_DEMUX
+GST_MPEG_PS_DEMUX_CLASS
+GST_IS_MPEG_PS_DEMUX_CLASS
+GST_TYPE_MPEG_PS_DEMUX
<SUBSECTION Private>
-MpegTsPadData
-CLOCK_BASE
-CLOCK_FREQ
-CLOCK_FREQ_SCR
-MPEGTIME_TO_GSTTIME
-GSTTIME_TO_MPEGTIME
-MPEG_SYS_TIME_TO_GSTTIME
-GSTTIME_TO_MPEG_SYS_TIME
-NORMAL_TS_PACKET_LENGTH
-M2TS_PACKET_LENGTH
-MAX_PROG_NUMBER
-DEFAULT_PROG_ID
+gst_mpeg_ps_demux_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-mpegvideoparse</FILE>
+<TITLE>mpegvideoparse</TITLE>
+GstMpegvParse
+<SUBSECTION Standard>
+GstMpegvParseClass
+GST_MPEGV_PARSE
+GST_MPEGV_PARSE_CAST
+GST_IS_MPEGV_PARSE
+GST_MPEGV_PARSE_CLASS
+GST_IS_MPEGV_PARSE_CLASS
+GST_TYPE_MPEGV_PARSE
+<SUBSECTION Private>
+gst_mpegv_parse_get_type
</SECTION>
<SECTION>
<FILE>element-mplex</FILE>
<TITLE>mplex</TITLE>
GstMplex
+GstMplexFormat
<SUBSECTION Standard>
GstMplexClass
GST_MPLEX
-GST_MPLEX_CLASS
+GST_MPLEX_CAST
GST_IS_MPLEX
+GST_MPLEX_CLASS
GST_IS_MPLEX_CLASS
GST_TYPE_MPLEX
-GST_MPLEX_MUTEX_LOCK
-GST_MPLEX_MUTEX_UNLOCK
-GST_MPLEX_SIGNAL
-GST_MPLEX_SIGNAL_ALL
-GST_MPLEX_WAIT
+<SUBSECTION Private>
gst_mplex_get_type
</SECTION>
<SECTION>
+<FILE>element-mssdemux</FILE>
+<TITLE>mssdemux</TITLE>
+GstMssDemux
+<SUBSECTION Standard>
+GstMssDemuxClass
+GST_MSS_DEMUX
+GST_MSS_DEMUX_CAST
+GST_IS_MSS_DEMUX
+GST_MSS_DEMUX_CLASS
+GST_IS_MSS_DEMUX_CLASS
+GST_TYPE_MSS_DEMUX
+<SUBSECTION Private>
+gst_mss_demux_get_type
+</SECTION>
+
+<SECTION>
<FILE>element-mxfdemux</FILE>
<TITLE>mxfdemux</TITLE>
GstMXFDemux
@@ -1018,6 +2806,22 @@
</SECTION>
<SECTION>
+<FILE>element-netsim</FILE>
+<TITLE>netsim</TITLE>
+GstNetSim
+<SUBSECTION Standard>
+GstNetSimClass
+GST_NET_SIM
+GST_NET_SIM_CAST
+GST_IS_NET_SIM
+GST_NET_SIM_CLASS
+GST_IS_NET_SIM_CLASS
+GST_TYPE_NET_SIM
+<SUBSECTION Private>
+gst_net_sim_get_type
+</SECTION>
+
+<SECTION>
<FILE>element-nuvdemux</FILE>
<TITLE>nuvdemux</TITLE>
GstNuvDemux
@@ -1053,25 +2857,78 @@
<SUBSECTION Standard>
GstOFAClass
GST_OFA
-GST_OFA_CLASS
+GST_OFA_CAST
GST_IS_OFA
+GST_OFA_CLASS
GST_IS_OFA_CLASS
GST_TYPE_OFA
+<SUBSECTION Private>
gst_ofa_get_type
</SECTION>
<SECTION>
<FILE>element-openalsink</FILE>
<TITLE>openalsink</TITLE>
-GstOpenalSink
+GstOpenALSink
<SUBSECTION Standard>
-GstOpenalSinkClass
-GST_OPENAL_SINK
-GST_OPENAL_SINK_CLASS
-GST_IS_OPENAL_SINK
-GST_IS_OPENAL_SINK_CLASS
-GST_TYPE_OPENAL_SINK
-gst_openal_sink_get_type
+GstOpenALSinkClass
+GST_OPEN_AL_SINK
+GST_OPEN_AL_SINK_CAST
+GST_IS_OPEN_AL_SINK
+GST_OPEN_AL_SINK_CLASS
+GST_IS_OPEN_AL_SINK_CLASS
+GST_TYPE_OPEN_AL_SINK
+<SUBSECTION Private>
+gst_open_al_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-openexrdec</FILE>
+<TITLE>openexrdec</TITLE>
+GstOpenEXRDec
+<SUBSECTION Standard>
+GstOpenEXRDecClass
+GST_OPEN_EXR_DEC
+GST_OPEN_EXR_DEC_CAST
+GST_IS_OPEN_EXR_DEC
+GST_OPEN_EXR_DEC_CLASS
+GST_IS_OPEN_EXR_DEC_CLASS
+GST_TYPE_OPEN_EXR_DEC
+<SUBSECTION Private>
+gst_open_exr_dec_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-openjpegdec</FILE>
+<TITLE>openjpegdec</TITLE>
+GstOpenJPEGDec
+<SUBSECTION Standard>
+GstOpenJPEGDecClass
+GST_OPEN_JPEG_DEC
+GST_OPEN_JPEG_DEC_CAST
+GST_IS_OPEN_JPEG_DEC
+GST_OPEN_JPEG_DEC_CLASS
+GST_IS_OPEN_JPEG_DEC_CLASS
+GST_TYPE_OPEN_JPEG_DEC
+<SUBSECTION Private>
+gst_open_jpeg_dec_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-openjpegenc</FILE>
+<TITLE>openjpegenc</TITLE>
+GstOpenJPEGEnc
+GstOpenJPEGEncProgressionOrder
+<SUBSECTION Standard>
+GstOpenJPEGEncClass
+GST_OPEN_JPEG_ENC
+GST_OPEN_JPEG_ENC_CAST
+GST_IS_OPEN_JPEG_ENC
+GST_OPEN_JPEG_ENC_CLASS
+GST_IS_OPEN_JPEG_ENC_CLASS
+GST_TYPE_OPEN_JPEG_ENC
+<SUBSECTION Private>
+gst_open_jpeg_enc_get_type
</SECTION>
<SECTION>
@@ -1081,25 +2938,45 @@
<SUBSECTION Standard>
GstOpenalSrcClass
GST_OPENAL_SRC
-GST_OPENAL_SRC_CLASS
+GST_OPENAL_SRC_CAST
GST_IS_OPENAL_SRC
+GST_OPENAL_SRC_CLASS
GST_IS_OPENAL_SRC_CLASS
GST_TYPE_OPENAL_SRC
+<SUBSECTION Private>
gst_openal_src_get_type
</SECTION>
+<SECTION>
<FILE>element-opencvtextoverlay</FILE>
<TITLE>opencvtextoverlay</TITLE>
GstOpencvTextOverlay
<SUBSECTION Standard>
GstOpencvTextOverlayClass
GST_OPENCV_TEXT_OVERLAY
-GST_OPENCV_TEXT_OVERLAY_CLASS
-GST_TYPE_OPENCV_TEXT_OVERLAY
+GST_OPENCV_TEXT_OVERLAY_CAST
GST_IS_OPENCV_TEXT_OVERLAY
+GST_OPENCV_TEXT_OVERLAY_CLASS
GST_IS_OPENCV_TEXT_OVERLAY_CLASS
+GST_TYPE_OPENCV_TEXT_OVERLAY
+<SUBSECTION Private>
gst_opencv_text_overlay_get_type
-gst_opencv_text_overlay_plugin_init
+</SECTION>
+
+<SECTION>
+<FILE>element-opusparse</FILE>
+<TITLE>opusparse</TITLE>
+GstOpusParse
+<SUBSECTION Standard>
+GstOpusParseClass
+GST_OPUS_PARSE
+GST_OPUS_PARSE_CAST
+GST_IS_OPUS_PARSE
+GST_OPUS_PARSE_CLASS
+GST_IS_OPUS_PARSE_CLASS
+GST_TYPE_OPUS_PARSE
+<SUBSECTION Private>
+gst_opus_parse_get_type
</SECTION>
<SECTION>
@@ -1109,15 +2986,32 @@
<SUBSECTION Standard>
GstPcapParseClass
GST_PCAP_PARSE
-GST_PCAP_PARSE_CLASS
+GST_PCAP_PARSE_CAST
GST_IS_PCAP_PARSE
+GST_PCAP_PARSE_CLASS
GST_IS_PCAP_PARSE_CLASS
GST_TYPE_PCAP_PARSE
-GstPcapParseState
+<SUBSECTION Private>
gst_pcap_parse_get_type
</SECTION>
<SECTION>
+<FILE>element-perspective</FILE>
+<TITLE>perspective</TITLE>
+GstPerspective
+<SUBSECTION Standard>
+GstPerspectiveClass
+GST_PERSPECTIVE
+GST_PERSPECTIVE_CAST
+GST_IS_PERSPECTIVE
+GST_PERSPECTIVE_CLASS
+GST_IS_PERSPECTIVE_CLASS
+GST_TYPE_PERSPECTIVE
+<SUBSECTION Private>
+gst_perspective_get_type
+</SECTION>
+
+<SECTION>
<FILE>element-pinch</FILE>
<TITLE>pinch</TITLE>
GstPinch
@@ -1125,68 +3019,108 @@
GstPinchClass
GST_PINCH
GST_PINCH_CAST
-GST_PINCH_CLASS
GST_IS_PINCH
+GST_PINCH_CLASS
GST_IS_PINCH_CLASS
GST_TYPE_PINCH
+<SUBSECTION Private>
gst_pinch_get_type
-gst_pinch_plugin_init
-</SECTION>
-
-<FILE>element-pyramidsegment</FILE>
-<TITLE>pyramidsegment</TITLE>
-Gstpyramidsegment
-<SUBSECTION Standard>
-GstpyramidsegmentClass
-GST_PYRAMIDSEGMENT
-GST_PYRAMIDSEGMENT_CLASS
-GST_TYPE_PYRAMIDSEGMENT
-GST_IS_PYRAMIDSEGMENT
-GST_IS_PYRAMIDSEGMENT_CLASS
-gst_pyramidsegment_get_type
-gst_pyramidsegment_plugin_init
</SECTION>
<SECTION>
-<FILE>element-rfbsrc</FILE>
-<TITLE>rfbsrc</TITLE>
-GstRfbSrc
+<FILE>element-pitch</FILE>
+<TITLE>pitch</TITLE>
+GstPitch
<SUBSECTION Standard>
-GstRfbSrcClass
-GST_RFB_SRC
-GST_RFB_SRC_CLASS
-GST_IS_RFB_SRC
-GST_IS_RFB_SRC_CLASS
-GST_TYPE_RFB_SRC
-gst_rfb_src_get_type
+GstPitchClass
+GST_PITCH
+GST_PITCH_CAST
+GST_IS_PITCH
+GST_PITCH_CLASS
+GST_IS_PITCH_CLASS
+GST_TYPE_PITCH
+<SUBSECTION Private>
+gst_pitch_get_type
</SECTION>
<SECTION>
-<FILE>element-rsvgoverlay</FILE>
-<TITLE>rsvgoverlay</TITLE>
-GstRsvgOverlay
+<FILE>element-pngparse</FILE>
+<TITLE>pngparse</TITLE>
+GstPngParse
<SUBSECTION Standard>
-GstRsvgOverlayClass
-GST_RSVG_OVERLAY
-GST_RSVG_OVERLAY_CLASS
-GST_IS_RSVG_OVERLAY
-GST_IS_RSVG_OVERLAY_CLASS
-GST_TYPE_RSVG_OVERLAY
-gst_rsvg_overlay_get_type
+GstPngParseClass
+GST_PNG_PARSE
+GST_PNG_PARSE_CAST
+GST_IS_PNG_PARSE
+GST_PNG_PARSE_CLASS
+GST_IS_PNG_PARSE_CLASS
+GST_TYPE_PNG_PARSE
+<SUBSECTION Private>
+gst_png_parse_get_type
</SECTION>
<SECTION>
-<FILE>element-rsvgdec</FILE>
-<TITLE>rsvgdec</TITLE>
-GstRsvgDec
+<FILE>element-pnmdec</FILE>
+<TITLE>pnmdec</TITLE>
+GstPnmdec
<SUBSECTION Standard>
-GstRsvgDecClass
-GST_RSVG_DEC
-GST_RSVG_DEC_CLASS
-GST_IS_RSVG_DEC
-GST_IS_RSVG_DEC_CLASS
-GST_TYPE_RSVG_DEC
-gst_rsvg_dec_get_type
+GstPnmdecClass
+GST_PNMDEC
+GST_PNMDEC_CAST
+GST_IS_PNMDEC
+GST_PNMDEC_CLASS
+GST_IS_PNMDEC_CLASS
+GST_TYPE_PNMDEC
+<SUBSECTION Private>
+gst_pnmdec_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-pnmenc</FILE>
+<TITLE>pnmenc</TITLE>
+GstPnmenc
+<SUBSECTION Standard>
+GstPnmencClass
+GST_PNMENC
+GST_PNMENC_CAST
+GST_IS_PNMENC
+GST_PNMENC_CLASS
+GST_IS_PNMENC_CLASS
+GST_TYPE_PNMENC
+<SUBSECTION Private>
+gst_pnmenc_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-qmlglsink</FILE>
+<TITLE>qmlglsink</TITLE>
+GstQtSink
+<SUBSECTION Standard>
+GstQtSinkClass
+GST_QT_SINK
+GST_QT_SINK_CAST
+GST_IS_QT_SINK
+GST_QT_SINK_CLASS
+GST_IS_QT_SINK_CLASS
+GST_TYPE_QT_SINK
+<SUBSECTION Private>
+gst_qt_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-rgb2bayer</FILE>
+<TITLE>rgb2bayer</TITLE>
+GstRGB2Bayer
+<SUBSECTION Standard>
+GstRGB2BayerClass
+GST_RG_B2_BAYER
+GST_RG_B2_BAYER_CAST
+GST_IS_RG_B2_BAYER
+GST_RG_B2_BAYER_CLASS
+GST_IS_RG_B2_BAYER_CLASS
+GST_TYPE_RG_B2_BAYER
+<SUBSECTION Private>
+gst_rg_b2_bayer_get_type
</SECTION>
<SECTION>
@@ -1196,11 +3130,13 @@
<SUBSECTION Standard>
GstRTMPSinkClass
GST_RTMP_SINK
+GST_RTMP_SINK_CAST
GST_IS_RTMP_SINK
-GST_TYPE_RTMP_SINK
-gst_rtmp_sink_get_type
GST_RTMP_SINK_CLASS
GST_IS_RTMP_SINK_CLASS
+GST_TYPE_RTMP_SINK
+<SUBSECTION Private>
+gst_rtmp_sink_get_type
</SECTION>
<SECTION>
@@ -1210,11 +3146,158 @@
<SUBSECTION Standard>
GstRTMPSrcClass
GST_RTMP_SRC
+GST_RTMP_SRC_CAST
GST_IS_RTMP_SRC
-GST_TYPE_RTMP_SRC
-gst_rtmp_src_get_type
GST_RTMP_SRC_CLASS
GST_IS_RTMP_SRC_CLASS
+GST_TYPE_RTMP_SRC
+<SUBSECTION Private>
+gst_rtmp_src_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-removesilence</FILE>
+<TITLE>removesilence</TITLE>
+GstRemoveSilence
+<SUBSECTION Standard>
+GstRemoveSilenceClass
+GST_REMOVE_SILENCE
+GST_REMOVE_SILENCE_CAST
+GST_IS_REMOVE_SILENCE
+GST_REMOVE_SILENCE_CLASS
+GST_IS_REMOVE_SILENCE_CLASS
+GST_TYPE_REMOVE_SILENCE
+<SUBSECTION Private>
+gst_remove_silence_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-retinex</FILE>
+<TITLE>retinex</TITLE>
+GstRetinex
+GstRetinexMethod
+<SUBSECTION Standard>
+GstRetinexClass
+GST_RETINEX
+GST_RETINEX_CAST
+GST_IS_RETINEX
+GST_RETINEX_CLASS
+GST_IS_RETINEX_CLASS
+GST_TYPE_RETINEX
+<SUBSECTION Private>
+gst_retinex_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-rfbsrc</FILE>
+<TITLE>rfbsrc</TITLE>
+GstRfbSrc
+<SUBSECTION Standard>
+GstRfbSrcClass
+GST_RFB_SRC
+GST_RFB_SRC_CAST
+GST_IS_RFB_SRC
+GST_RFB_SRC_CLASS
+GST_IS_RFB_SRC_CLASS
+GST_TYPE_RFB_SRC
+<SUBSECTION Private>
+gst_rfb_src_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-rotate</FILE>
+<TITLE>rotate</TITLE>
+GstRotate
+<SUBSECTION Standard>
+GstRotateClass
+GST_ROTATE
+GST_ROTATE_CAST
+GST_IS_ROTATE
+GST_ROTATE_CLASS
+GST_IS_ROTATE_CLASS
+GST_TYPE_ROTATE
+<SUBSECTION Private>
+gst_rotate_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-rsvgdec</FILE>
+<TITLE>rsvgdec</TITLE>
+GstRsvgDec
+<SUBSECTION Standard>
+GstRsvgDecClass
+GST_RSVG_DEC
+GST_RSVG_DEC_CAST
+GST_IS_RSVG_DEC
+GST_RSVG_DEC_CLASS
+GST_IS_RSVG_DEC_CLASS
+GST_TYPE_RSVG_DEC
+<SUBSECTION Private>
+gst_rsvg_dec_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-rsvgoverlay</FILE>
+<TITLE>rsvgoverlay</TITLE>
+GstRsvgOverlay
+<SUBSECTION Standard>
+GstRsvgOverlayClass
+GST_RSVG_OVERLAY
+GST_RSVG_OVERLAY_CAST
+GST_IS_RSVG_OVERLAY
+GST_RSVG_OVERLAY_CLASS
+GST_IS_RSVG_OVERLAY_CLASS
+GST_TYPE_RSVG_OVERLAY
+<SUBSECTION Private>
+gst_rsvg_overlay_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-rtpasfpay</FILE>
+<TITLE>rtpasfpay</TITLE>
+GstRtpAsfPay
+<SUBSECTION Standard>
+GstRtpAsfPayClass
+GST_RTP_ASF_PAY
+GST_RTP_ASF_PAY_CAST
+GST_IS_RTP_ASF_PAY
+GST_RTP_ASF_PAY_CLASS
+GST_IS_RTP_ASF_PAY_CLASS
+GST_TYPE_RTP_ASF_PAY
+<SUBSECTION Private>
+gst_rtp_asf_pay_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-rtponvifparse</FILE>
+<TITLE>rtponvifparse</TITLE>
+GstRtpOnvifParse
+<SUBSECTION Standard>
+GstRtpOnvifParseClass
+GST_RTP_ONVIF_PARSE
+GST_RTP_ONVIF_PARSE_CAST
+GST_IS_RTP_ONVIF_PARSE
+GST_RTP_ONVIF_PARSE_CLASS
+GST_IS_RTP_ONVIF_PARSE_CLASS
+GST_TYPE_RTP_ONVIF_PARSE
+<SUBSECTION Private>
+gst_rtp_onvif_parse_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-rtponviftimestamp</FILE>
+<TITLE>rtponviftimestamp</TITLE>
+GstRtpOnvifTimestamp
+<SUBSECTION Standard>
+GstRtpOnvifTimestampClass
+GST_RTP_ONVIF_TIMESTAMP
+GST_RTP_ONVIF_TIMESTAMP_CAST
+GST_IS_RTP_ONVIF_TIMESTAMP
+GST_RTP_ONVIF_TIMESTAMP_CLASS
+GST_IS_RTP_ONVIF_TIMESTAMP_CLASS
+GST_TYPE_RTP_ONVIF_TIMESTAMP
+<SUBSECTION Private>
+gst_rtp_onvif_timestamp_get_type
</SECTION>
<SECTION>
@@ -1254,17 +3337,111 @@
GstSDPDemux
<SUBSECTION Standard>
GstSDPDemuxClass
-GstSDPStream
GST_SDP_DEMUX
-GST_SDP_DEMUX_CLASS
+GST_SDP_DEMUX_CAST
GST_IS_SDP_DEMUX
+GST_SDP_DEMUX_CLASS
GST_IS_SDP_DEMUX_CLASS
GST_TYPE_SDP_DEMUX
+<SUBSECTION Private>
gst_sdp_demux_get_type
-GST_SDP_DEMUX_CAST
-GST_SDP_STREAM_GET_LOCK
-GST_SDP_STREAM_LOCK
-GST_SDP_STREAM_UNLOCK
+</SECTION>
+
+<SECTION>
+<FILE>element-sfdec</FILE>
+<TITLE>sfdec</TITLE>
+GstSFDec
+<SUBSECTION Standard>
+GstSFDecClass
+GST_SF_DEC
+GST_SF_DEC_CAST
+GST_IS_SF_DEC
+GST_SF_DEC_CLASS
+GST_IS_SF_DEC_CLASS
+GST_TYPE_SF_DEC
+<SUBSECTION Private>
+gst_sf_dec_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-scenechange</FILE>
+<TITLE>scenechange</TITLE>
+GstSceneChange
+<SUBSECTION Standard>
+GstSceneChangeClass
+GST_SCENE_CHANGE
+GST_SCENE_CHANGE_CAST
+GST_IS_SCENE_CHANGE
+GST_SCENE_CHANGE_CLASS
+GST_IS_SCENE_CHANGE_CLASS
+GST_TYPE_SCENE_CHANGE
+<SUBSECTION Private>
+gst_scene_change_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-schrodec</FILE>
+<TITLE>schrodec</TITLE>
+GstSchroDec
+<SUBSECTION Standard>
+GstSchroDecClass
+GST_SCHRO_DEC
+GST_SCHRO_DEC_CAST
+GST_IS_SCHRO_DEC
+GST_SCHRO_DEC_CLASS
+GST_IS_SCHRO_DEC_CLASS
+GST_TYPE_SCHRO_DEC
+<SUBSECTION Private>
+gst_schro_dec_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-schroenc</FILE>
+<TITLE>schroenc</TITLE>
+GstSchroEnc
+<SUBSECTION Standard>
+GstSchroEncClass
+GST_SCHRO_ENC
+GST_SCHRO_ENC_CAST
+GST_IS_SCHRO_ENC
+GST_SCHRO_ENC_CLASS
+GST_IS_SCHRO_ENC_CLASS
+GST_TYPE_SCHRO_ENC
+<SUBSECTION Private>
+gst_schro_enc_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-sdpsrc</FILE>
+<TITLE>sdpsrc</TITLE>
+GstSdpSrc
+<SUBSECTION Standard>
+GstSdpSrcClass
+GST_SDP_SRC
+GST_SDP_SRC_CAST
+GST_IS_SDP_SRC
+GST_SDP_SRC_CLASS
+GST_IS_SDP_SRC_CLASS
+GST_TYPE_SDP_SRC
+<SUBSECTION Private>
+gst_sdp_src_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-segmentation</FILE>
+<TITLE>segmentation</TITLE>
+GstSegmentation
+GstSegmentationMethod
+<SUBSECTION Standard>
+GstSegmentationClass
+GST_SEGMENTATION
+GST_SEGMENTATION_CAST
+GST_IS_SEGMENTATION
+GST_SEGMENTATION_CLASS
+GST_IS_SEGMENTATION_CLASS
+GST_TYPE_SEGMENTATION
+<SUBSECTION Private>
+gst_segmentation_get_type
</SECTION>
<SECTION>
@@ -1273,11 +3450,13 @@
GstShmSink
<SUBSECTION Standard>
GstShmSinkClass
-GST_IS_SHM_SINK
-GST_IS_SHM_SINK_CLASS
GST_SHM_SINK
+GST_SHM_SINK_CAST
+GST_IS_SHM_SINK
GST_SHM_SINK_CLASS
+GST_IS_SHM_SINK_CLASS
GST_TYPE_SHM_SINK
+<SUBSECTION Private>
gst_shm_sink_get_type
</SECTION>
@@ -1287,54 +3466,174 @@
GstShmSrc
<SUBSECTION Standard>
GstShmSrcClass
-GST_IS_SHM_SRC
-GST_IS_SHM_SRC_CLASS
GST_SHM_SRC
+GST_SHM_SRC_CAST
+GST_IS_SHM_SRC
GST_SHM_SRC_CLASS
+GST_IS_SHM_SRC_CLASS
GST_TYPE_SHM_SRC
+<SUBSECTION Private>
gst_shm_src_get_type
</SECTION>
<SECTION>
+<FILE>element-simplevideomark</FILE>
+<TITLE>simplevideomark</TITLE>
+GstSimpleVideoMark
+<SUBSECTION Standard>
+GstSimpleVideoMarkClass
+GST_SIMPLE_VIDEO_MARK
+GST_SIMPLE_VIDEO_MARK_CAST
+GST_IS_SIMPLE_VIDEO_MARK
+GST_SIMPLE_VIDEO_MARK_CLASS
+GST_IS_SIMPLE_VIDEO_MARK_CLASS
+GST_TYPE_SIMPLE_VIDEO_MARK
+<SUBSECTION Private>
+gst_simple_video_mark_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-simplevideomarkdetect</FILE>
+<TITLE>simplevideomarkdetect</TITLE>
+GstSimpleVideoMarkDetect
+<SUBSECTION Standard>
+GstSimpleVideoMarkDetectClass
+GST_SIMPLE_VIDEO_MARK_DETECT
+GST_SIMPLE_VIDEO_MARK_DETECT_CAST
+GST_IS_SIMPLE_VIDEO_MARK_DETECT
+GST_SIMPLE_VIDEO_MARK_DETECT_CLASS
+GST_IS_SIMPLE_VIDEO_MARK_DETECT_CLASS
+GST_TYPE_SIMPLE_VIDEO_MARK_DETECT
+<SUBSECTION Private>
+gst_simple_video_mark_detect_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-sirendec</FILE>
+<TITLE>sirendec</TITLE>
+GstSirenDec
+<SUBSECTION Standard>
+GstSirenDecClass
+GST_SIREN_DEC
+GST_SIREN_DEC_CAST
+GST_IS_SIREN_DEC
+GST_SIREN_DEC_CLASS
+GST_IS_SIREN_DEC_CLASS
+GST_TYPE_SIREN_DEC
+<SUBSECTION Private>
+gst_siren_dec_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-sirenenc</FILE>
+<TITLE>sirenenc</TITLE>
+GstSirenEnc
+<SUBSECTION Standard>
+GstSirenEncClass
+GST_SIREN_ENC
+GST_SIREN_ENC_CAST
+GST_IS_SIREN_ENC
+GST_SIREN_ENC_CLASS
+GST_IS_SIREN_ENC_CLASS
+GST_TYPE_SIREN_ENC
+<SUBSECTION Private>
+gst_siren_enc_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-skindetect</FILE>
+<TITLE>skindetect</TITLE>
+GstSkinDetect
+<SUBSECTION Standard>
+GstSkinDetectClass
+GST_SKIN_DETECT
+GST_SKIN_DETECT_CAST
+GST_IS_SKIN_DETECT
+GST_SKIN_DETECT_CLASS
+GST_IS_SKIN_DETECT_CLASS
+GST_TYPE_SKIN_DETECT
+<SUBSECTION Private>
+gst_skin_detect_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-smooth</FILE>
+<TITLE>smooth</TITLE>
+GstSmooth
+<SUBSECTION Standard>
+GstSmoothClass
+GST_SMOOTH
+GST_SMOOTH_CAST
+GST_IS_SMOOTH
+GST_SMOOTH_CLASS
+GST_IS_SMOOTH_CLASS
+GST_TYPE_SMOOTH
+<SUBSECTION Private>
+gst_smooth_get_type
+</SECTION>
+
+<SECTION>
<FILE>element-solarize</FILE>
<TITLE>solarize</TITLE>
GstSolarize
<SUBSECTION Standard>
GstSolarizeClass
GST_SOLARIZE
-GST_SOLARIZE_CLASS
+GST_SOLARIZE_CAST
GST_IS_SOLARIZE
+GST_SOLARIZE_CLASS
GST_IS_SOLARIZE_CLASS
GST_TYPE_SOLARIZE
+<SUBSECTION Private>
gst_solarize_get_type
-gst_solarize_plugin_init
</SECTION>
<SECTION>
<FILE>element-spacescope</FILE>
<TITLE>spacescope</TITLE>
GstSpaceScope
+GstSpaceScopeStyle
<SUBSECTION Standard>
GstSpaceScopeClass
GST_SPACE_SCOPE
-GST_SPACE_SCOPE_CLASS
+GST_SPACE_SCOPE_CAST
GST_IS_SPACE_SCOPE
+GST_SPACE_SCOPE_CLASS
GST_IS_SPACE_SCOPE_CLASS
GST_TYPE_SPACE_SCOPE
+<SUBSECTION Private>
gst_space_scope_get_type
</SECTION>
<SECTION>
+<FILE>element-spanplc</FILE>
+<TITLE>spanplc</TITLE>
+GstSpanPlc
+<SUBSECTION Standard>
+GstSpanPlcClass
+GST_SPAN_PLC
+GST_SPAN_PLC_CAST
+GST_IS_SPAN_PLC
+GST_SPAN_PLC_CLASS
+GST_IS_SPAN_PLC_CLASS
+GST_TYPE_SPAN_PLC
+<SUBSECTION Private>
+gst_span_plc_get_type
+</SECTION>
+
+<SECTION>
<FILE>element-spectrascope</FILE>
<TITLE>spectrascope</TITLE>
GstSpectraScope
<SUBSECTION Standard>
GstSpectraScopeClass
GST_SPECTRA_SCOPE
-GST_SPECTRA_SCOPE_CLASS
+GST_SPECTRA_SCOPE_CAST
GST_IS_SPECTRA_SCOPE
+GST_SPECTRA_SCOPE_CLASS
GST_IS_SPECTRA_SCOPE_CLASS
GST_TYPE_SPECTRA_SCOPE
+<SUBSECTION Private>
gst_spectra_scope_get_type
</SECTION>
@@ -1344,12 +3643,13 @@
GstSpeed
<SUBSECTION Standard>
GstSpeedClass
-GstSpeedFormat
GST_SPEED
-GST_SPEED_CLASS
+GST_SPEED_CAST
GST_IS_SPEED
+GST_SPEED_CLASS
GST_IS_SPEED_CLASS
GST_TYPE_SPEED
+<SUBSECTION Private>
gst_speed_get_type
</SECTION>
@@ -1361,12 +3661,12 @@
GstSphereClass
GST_SPHERE
GST_SPHERE_CAST
-GST_SPHERE_CLASS
GST_IS_SPHERE
+GST_SPHERE_CLASS
GST_IS_SPHERE_CLASS
GST_TYPE_SPHERE
+<SUBSECTION Private>
gst_sphere_get_type
-gst_sphere_plugin_init
</SECTION>
<SECTION>
@@ -1377,12 +3677,60 @@
GstSquareClass
GST_SQUARE
GST_SQUARE_CAST
-GST_SQUARE_CLASS
GST_IS_SQUARE
+GST_SQUARE_CLASS
GST_IS_SQUARE_CLASS
GST_TYPE_SQUARE
+<SUBSECTION Private>
gst_square_get_type
-gst_square_plugin_init
+</SECTION>
+
+<SECTION>
+<FILE>element-srtenc</FILE>
+<TITLE>srtenc</TITLE>
+GstSrtEnc
+<SUBSECTION Standard>
+GstSrtEncClass
+GST_SRT_ENC
+GST_SRT_ENC_CAST
+GST_IS_SRT_ENC
+GST_SRT_ENC_CLASS
+GST_IS_SRT_ENC_CLASS
+GST_TYPE_SRT_ENC
+<SUBSECTION Private>
+gst_srt_enc_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-srtpdec</FILE>
+<TITLE>srtpdec</TITLE>
+GstSrtpDec
+<SUBSECTION Standard>
+GstSrtpDecClass
+GST_SRTP_DEC
+GST_SRTP_DEC_CAST
+GST_IS_SRTP_DEC
+GST_SRTP_DEC_CLASS
+GST_IS_SRTP_DEC_CLASS
+GST_TYPE_SRTP_DEC
+<SUBSECTION Private>
+gst_srtp_dec_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-srtpenc</FILE>
+<TITLE>srtpenc</TITLE>
+GstSrtpEnc
+<SUBSECTION Standard>
+GstSrtpEncClass
+GST_SRTP_ENC
+GST_SRTP_ENC_CAST
+GST_IS_SRTP_ENC
+GST_SRTP_ENC_CLASS
+GST_IS_SRTP_ENC_CLASS
+GST_TYPE_SRTP_ENC
+<SUBSECTION Private>
+gst_srtp_enc_get_type
</SECTION>
<SECTION>
@@ -1392,10 +3740,12 @@
<SUBSECTION Standard>
GstStereoClass
GST_STEREO
-GST_STEREO_CLASS
+GST_STEREO_CAST
GST_IS_STEREO
+GST_STEREO_CLASS
GST_IS_STEREO_CLASS
GST_TYPE_STEREO
+<SUBSECTION Private>
gst_stereo_get_type
</SECTION>
@@ -1407,12 +3757,12 @@
GstStretchClass
GST_STRETCH
GST_STRETCH_CAST
-GST_STRETCH_CLASS
GST_IS_STRETCH
+GST_STRETCH_CLASS
GST_IS_STRETCH_CLASS
GST_TYPE_STRETCH
+<SUBSECTION Private>
gst_stretch_get_type
-gst_stretch_plugin_init
</SECTION>
<SECTION>
@@ -1422,25 +3772,77 @@
<SUBSECTION Standard>
GstSynaeScopeClass
GST_SYNAE_SCOPE
-GST_SYNAE_SCOPE_CLASS
+GST_SYNAE_SCOPE_CAST
GST_IS_SYNAE_SCOPE
+GST_SYNAE_SCOPE_CLASS
GST_IS_SYNAE_SCOPE_CLASS
GST_TYPE_SYNAE_SCOPE
+<SUBSECTION Private>
gst_synae_scope_get_type
</SECTION>
+<SECTION>
+<FILE>element-tsdemux</FILE>
+<TITLE>tsdemux</TITLE>
+GstTSDemux
+<SUBSECTION Standard>
+GstTSDemuxClass
+GST_TS_DEMUX
+GST_TS_DEMUX_CAST
+GST_IS_TS_DEMUX
+GST_TS_DEMUX_CLASS
+GST_IS_TS_DEMUX_CLASS
+GST_TYPE_TS_DEMUX
+<SUBSECTION Private>
+gst_ts_demux_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-teletextdec</FILE>
+<TITLE>teletextdec</TITLE>
+GstTeletextDec
+<SUBSECTION Standard>
+GstTeletextDecClass
+GST_TELETEXT_DEC
+GST_TELETEXT_DEC_CAST
+GST_IS_TELETEXT_DEC
+GST_TELETEXT_DEC_CLASS
+GST_IS_TELETEXT_DEC_CLASS
+GST_TYPE_TELETEXT_DEC
+<SUBSECTION Private>
+gst_teletext_dec_get_type
+</SECTION>
+
+<SECTION>
<FILE>element-templatematch</FILE>
<TITLE>templatematch</TITLE>
GstTemplateMatch
<SUBSECTION Standard>
GstTemplateMatchClass
-GST_TEMPLATEMATCH
-GST_TEMPLATEMATCH_CLASS
-GST_TYPE_TEMPLATEMATCH
-GST_IS_TEMPLATEMATCH
-GST_IS_TEMPLATEMATCH_CLASS
-gst_templatematch_get_type
-gst_templatematch_plugin_init
+GST_TEMPLATE_MATCH
+GST_TEMPLATE_MATCH_CAST
+GST_IS_TEMPLATE_MATCH
+GST_TEMPLATE_MATCH_CLASS
+GST_IS_TEMPLATE_MATCH_CLASS
+GST_TYPE_TEMPLATE_MATCH
+<SUBSECTION Private>
+gst_template_match_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-tonegeneratesrc</FILE>
+<TITLE>tonegeneratesrc</TITLE>
+GstToneGenerateSrc
+<SUBSECTION Standard>
+GstToneGenerateSrcClass
+GST_TONE_GENERATE_SRC
+GST_TONE_GENERATE_SRC_CAST
+GST_IS_TONE_GENERATE_SRC
+GST_TONE_GENERATE_SRC_CLASS
+GST_IS_TONE_GENERATE_SRC_CLASS
+GST_TYPE_TONE_GENERATE_SRC
+<SUBSECTION Private>
+gst_tone_generate_src_get_type
</SECTION>
<SECTION>
@@ -1465,12 +3867,12 @@
GstTunnelClass
GST_TUNNEL
GST_TUNNEL_CAST
-GST_TUNNEL_CLASS
GST_IS_TUNNEL
+GST_TUNNEL_CLASS
GST_IS_TUNNEL_CLASS
GST_TYPE_TUNNEL
+<SUBSECTION Private>
gst_tunnel_get_type
-gst_tunnel_plugin_init
</SECTION>
<SECTION>
@@ -1481,12 +3883,140 @@
GstTwirlClass
GST_TWIRL
GST_TWIRL_CAST
-GST_TWIRL_CLASS
GST_IS_TWIRL
+GST_TWIRL_CLASS
GST_IS_TWIRL_CLASS
GST_TYPE_TWIRL
+<SUBSECTION Private>
gst_twirl_get_type
-gst_twirl_plugin_init
+</SECTION>
+
+<SECTION>
+<FILE>element-unalignedaudioparse</FILE>
+<TITLE>unalignedaudioparse</TITLE>
+GstUnalignedAudioParse
+<SUBSECTION Standard>
+GstUnalignedAudioParseClass
+GST_UNALIGNED_AUDIO_PARSE
+GST_UNALIGNED_AUDIO_PARSE_CAST
+GST_IS_UNALIGNED_AUDIO_PARSE
+GST_UNALIGNED_AUDIO_PARSE_CLASS
+GST_IS_UNALIGNED_AUDIO_PARSE_CLASS
+GST_TYPE_UNALIGNED_AUDIO_PARSE
+<SUBSECTION Private>
+gst_unaligned_audio_parse_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-unalignedvideoparse</FILE>
+<TITLE>unalignedvideoparse</TITLE>
+GstUnalignedVideoParse
+<SUBSECTION Standard>
+GstUnalignedVideoParseClass
+GST_UNALIGNED_VIDEO_PARSE
+GST_UNALIGNED_VIDEO_PARSE_CAST
+GST_IS_UNALIGNED_VIDEO_PARSE
+GST_UNALIGNED_VIDEO_PARSE_CLASS
+GST_IS_UNALIGNED_VIDEO_PARSE_CLASS
+GST_TYPE_UNALIGNED_VIDEO_PARSE
+<SUBSECTION Private>
+gst_unaligned_video_parse_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-uvch264mjpgdemux</FILE>
+<TITLE>uvch264mjpgdemux</TITLE>
+GstUvcH264MjpgDemux
+<SUBSECTION Standard>
+GstUvcH264MjpgDemuxClass
+GST_UVC_H264_MJPG_DEMUX
+GST_UVC_H264_MJPG_DEMUX_CAST
+GST_IS_UVC_H264_MJPG_DEMUX
+GST_UVC_H264_MJPG_DEMUX_CLASS
+GST_IS_UVC_H264_MJPG_DEMUX_CLASS
+GST_TYPE_UVC_H264_MJPG_DEMUX
+<SUBSECTION Private>
+gst_uvc_h264_mjpg_demux_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-uvch264src</FILE>
+<TITLE>uvch264src</TITLE>
+GstUvcH264Src
+<SUBSECTION Standard>
+GstUvcH264SrcClass
+GST_UVC_H264_SRC
+GST_UVC_H264_SRC_CAST
+GST_IS_UVC_H264_SRC
+GST_UVC_H264_SRC_CLASS
+GST_IS_UVC_H264_SRC_CLASS
+GST_TYPE_UVC_H264_SRC
+<SUBSECTION Private>
+gst_uvc_h264_src_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-vc1parse</FILE>
+<TITLE>vc1parse</TITLE>
+GstVC1Parse
+<SUBSECTION Standard>
+GstVC1ParseClass
+GST_V_C1_PARSE
+GST_V_C1_PARSE_CAST
+GST_IS_V_C1_PARSE
+GST_V_C1_PARSE_CLASS
+GST_IS_V_C1_PARSE_CLASS
+GST_TYPE_V_C1_PARSE
+<SUBSECTION Private>
+gst_v_c1_parse_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-vcdsrc</FILE>
+<TITLE>vcdsrc</TITLE>
+GstVCDSrc
+<SUBSECTION Standard>
+GstVCDSrcClass
+GST_VCD_SRC
+GST_VCD_SRC_CAST
+GST_IS_VCD_SRC
+GST_VCD_SRC_CLASS
+GST_IS_VCD_SRC_CLASS
+GST_TYPE_VCD_SRC
+<SUBSECTION Private>
+gst_vcd_src_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-vmncdec</FILE>
+<TITLE>vmncdec</TITLE>
+GstVMncDec
+<SUBSECTION Standard>
+GstVMncDecClass
+GST_V_MNC_DEC
+GST_V_MNC_DEC_CAST
+GST_IS_V_MNC_DEC
+GST_V_MNC_DEC_CLASS
+GST_IS_V_MNC_DEC_CLASS
+GST_TYPE_V_MNC_DEC
+<SUBSECTION Private>
+gst_v_mnc_dec_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-vdpaumpegdec</FILE>
+<TITLE>vdpaumpegdec</TITLE>
+GstVdpMpegDec
+<SUBSECTION Standard>
+GstVdpMpegDecClass
+GST_VDP_MPEG_DEC
+GST_VDP_MPEG_DEC_CAST
+GST_IS_VDP_MPEG_DEC
+GST_VDP_MPEG_DEC_CLASS
+GST_IS_VDP_MPEG_DEC_CLASS
+GST_TYPE_VDP_MPEG_DEC
+<SUBSECTION Private>
+gst_vdp_mpeg_dec_get_type
</SECTION>
<SECTION>
@@ -1496,40 +4026,45 @@
<SUBSECTION Standard>
GstVideoAnalyseClass
GST_VIDEO_ANALYSE
+GST_VIDEO_ANALYSE_CAST
GST_IS_VIDEO_ANALYSE
-GST_TYPE_VIDEO_ANALYSE
-gst_video_analyse_get_type
GST_VIDEO_ANALYSE_CLASS
GST_IS_VIDEO_ANALYSE_CLASS
-gst_wildmidi_get_type
+GST_TYPE_VIDEO_ANALYSE
+<SUBSECTION Private>
+gst_video_analyse_get_type
</SECTION>
<SECTION>
-<FILE>element-videodetect</FILE>
-<TITLE>videodetect</TITLE>
-GstVideoDetect
+<FILE>element-videodiff</FILE>
+<TITLE>videodiff</TITLE>
+GstVideoDiff
<SUBSECTION Standard>
-GstVideoDetectClass
-GST_VIDEO_DETECT
-GST_IS_VIDEO_DETECT
-GST_TYPE_VIDEO_DETECT
-gst_video_detect_get_type
-GST_VIDEO_DETECT_CLASS
-GST_IS_VIDEO_DETECT_CLASS
+GstVideoDiffClass
+GST_VIDEO_DIFF
+GST_VIDEO_DIFF_CAST
+GST_IS_VIDEO_DIFF
+GST_VIDEO_DIFF_CLASS
+GST_IS_VIDEO_DIFF_CLASS
+GST_TYPE_VIDEO_DIFF
+<SUBSECTION Private>
+gst_video_diff_get_type
</SECTION>
<SECTION>
-<FILE>element-videomark</FILE>
-<TITLE>videomark</TITLE>
-GstVideoMark
+<FILE>element-videoframe-audiolevel</FILE>
+<TITLE>videoframe-audiolevel</TITLE>
+GstVideoFrameAudioLevel
<SUBSECTION Standard>
-GstVideoMarkClass
-GST_VIDEO_MARK
-GST_IS_VIDEO_MARK
-GST_TYPE_VIDEO_MARK
-gst_video_mark_get_type
-GST_VIDEO_MARK_CLASS
-GST_IS_VIDEO_MARK_CLASS
+GstVideoFrameAudioLevelClass
+GST_VIDEO_FRAME_AUDIO_LEVEL
+GST_VIDEO_FRAME_AUDIO_LEVEL_CAST
+GST_IS_VIDEO_FRAME_AUDIO_LEVEL
+GST_VIDEO_FRAME_AUDIO_LEVEL_CLASS
+GST_IS_VIDEO_FRAME_AUDIO_LEVEL_CLASS
+GST_TYPE_VIDEO_FRAME_AUDIO_LEVEL
+<SUBSECTION Private>
+gst_video_frame_audio_level_get_type
</SECTION>
<SECTION>
@@ -1539,14 +4074,113 @@
<SUBSECTION Standard>
GstVideoParseClass
GST_VIDEO_PARSE
-GST_VIDEO_PARSE_CLASS
+GST_VIDEO_PARSE_CAST
GST_IS_VIDEO_PARSE
+GST_VIDEO_PARSE_CLASS
GST_IS_VIDEO_PARSE_CLASS
GST_TYPE_VIDEO_PARSE
+<SUBSECTION Private>
gst_video_parse_get_type
</SECTION>
<SECTION>
+<FILE>element-rawaudioparse</FILE>
+<TITLE>rawaudioparse</TITLE>
+GstRawAudioParse
+<SUBSECTION Standard>
+GstRawAudioParseClass
+GST_RAW_AUDIO_PARSE
+GST_RAW_AUDIO_PARSE_CAST
+GST_IS_AUDIO_PARSE
+GST_RAW_AUDIO_PARSE_CLASS
+GST_IS_AUDIO_PARSE_CLASS
+GST_TYPE_AUDIO_PARSE
+<SUBSECTION Private>
+gst_raw_audio_parse_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-rawvideoparse</FILE>
+<TITLE>rawvideoparse</TITLE>
+GstRawVideoParse
+<SUBSECTION Standard>
+GstRawVideoParseClass
+GST_RAW_VIDEO_PARSE
+GST_RAW_VIDEO_PARSE_CAST
+GST_IS_VIDEO_PARSE
+GST_RAW_VIDEO_PARSE_CLASS
+GST_IS_VIDEO_PARSE_CLASS
+GST_TYPE_VIDEO_PARSE
+<SUBSECTION Private>
+gst_raw_video_parse_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-videosegmentclip</FILE>
+<TITLE>videosegmentclip</TITLE>
+GstVideoSegmentClip
+<SUBSECTION Standard>
+GstVideoSegmentClipClass
+GST_VIDEO_SEGMENT_CLIP
+GST_VIDEO_SEGMENT_CLIP_CAST
+GST_IS_VIDEO_SEGMENT_CLIP
+GST_VIDEO_SEGMENT_CLIP_CLASS
+GST_IS_VIDEO_SEGMENT_CLIP_CLASS
+GST_TYPE_VIDEO_SEGMENT_CLIP
+<SUBSECTION Private>
+gst_video_segment_clip_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-viewfinderbin</FILE>
+<TITLE>viewfinderbin</TITLE>
+GstViewfinderBin
+<SUBSECTION Standard>
+GstViewfinderBinClass
+GST_VIEWFINDER_BIN
+GST_VIEWFINDER_BIN_CAST
+GST_IS_VIEWFINDER_BIN
+GST_VIEWFINDER_BIN_CLASS
+GST_IS_VIEWFINDER_BIN_CLASS
+GST_TYPE_VIEWFINDER_BIN
+<SUBSECTION Private>
+gst_viewfinder_bin_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-voamrwbenc</FILE>
+<TITLE>voamrwbenc</TITLE>
+GstVoAmrWbEnc
+GstVoAmrWbEncBandMode
+<SUBSECTION Standard>
+GstVoAmrWbEncClass
+GST_VO_AMR_WB_ENC
+GST_VO_AMR_WB_ENC_CAST
+GST_IS_VO_AMR_WB_ENC
+GST_VO_AMR_WB_ENC_CLASS
+GST_IS_VO_AMR_WB_ENC_CLASS
+GST_TYPE_VO_AMR_WB_ENC
+<SUBSECTION Private>
+gst_vo_amr_wb_enc_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-watchdog</FILE>
+<TITLE>watchdog</TITLE>
+GstWatchdog
+<SUBSECTION Standard>
+GstWatchdogClass
+GST_WATCHDOG
+GST_WATCHDOG_CAST
+GST_IS_WATCHDOG
+GST_WATCHDOG_CLASS
+GST_IS_WATCHDOG_CLASS
+GST_TYPE_WATCHDOG
+<SUBSECTION Private>
+gst_watchdog_get_type
+</SECTION>
+
+<SECTION>
<FILE>element-waterripple</FILE>
<TITLE>waterripple</TITLE>
GstWaterRipple
@@ -1554,39 +4188,158 @@
GstWaterRippleClass
GST_WATER_RIPPLE
GST_WATER_RIPPLE_CAST
-GST_WATER_RIPPLE_CLASS
GST_IS_WATER_RIPPLE
+GST_WATER_RIPPLE_CLASS
GST_IS_WATER_RIPPLE_CLASS
GST_TYPE_WATER_RIPPLE
+<SUBSECTION Private>
gst_water_ripple_get_type
-gst_water_ripple_plugin_init
</SECTION>
<SECTION>
<FILE>element-wavescope</FILE>
<TITLE>wavescope</TITLE>
GstWaveScope
+GstWaveScopeStyle
<SUBSECTION Standard>
GstWaveScopeClass
GST_WAVE_SCOPE
-GST_WAVE_SCOPE_CLASS
+GST_WAVE_SCOPE_CAST
GST_IS_WAVE_SCOPE
+GST_WAVE_SCOPE_CLASS
GST_IS_WAVE_SCOPE_CLASS
GST_TYPE_WAVE_SCOPE
+<SUBSECTION Private>
gst_wave_scope_get_type
</SECTION>
<SECTION>
+<FILE>element-waylandsink</FILE>
+<TITLE>waylandsink</TITLE>
+GstWaylandSink
+<SUBSECTION Standard>
+GstWaylandSinkClass
+GST_WAYLAND_SINK
+GST_WAYLAND_SINK_CAST
+GST_IS_WAYLAND_SINK
+GST_WAYLAND_SINK_CLASS
+GST_IS_WAYLAND_SINK_CLASS
+GST_TYPE_WAYLAND_SINK
+<SUBSECTION Private>
+gst_wayland_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-webpdec</FILE>
+<TITLE>webpdec</TITLE>
+GstWebPDec
+<SUBSECTION Standard>
+GstWebPDecClass
+GST_WEB_P_DEC
+GST_WEB_P_DEC_CAST
+GST_IS_WEB_P_DEC
+GST_WEB_P_DEC_CLASS
+GST_IS_WEB_P_DEC_CLASS
+GST_TYPE_WEB_P_DEC
+<SUBSECTION Private>
+gst_web_p_dec_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-webpenc</FILE>
+<TITLE>webpenc</TITLE>
+GstWebpEnc
+GstWebpEncPreset
+<SUBSECTION Standard>
+GstWebpEncClass
+GST_WEBP_ENC
+GST_WEBP_ENC_CAST
+GST_IS_WEBP_ENC
+GST_WEBP_ENC_CLASS
+GST_IS_WEBP_ENC_CLASS
+GST_TYPE_WEBP_ENC
+<SUBSECTION Private>
+gst_webp_enc_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-webrtcdsp</FILE>
+<TITLE>webrtcdsp</TITLE>
+GstWebrtcDsp
+<SUBSECTION Standard>
+GstWebrtcDspClass
+GST_WEBRTC_DSP
+GST_WEBRTC_DSP_CAST
+GST_IS_WEBRTC_DSP
+GST_WEBRTC_DSP_CLASS
+GST_IS_WEBRTC_DSP_CLASS
+GST_TYPE_WEBRTC_DSP
+<SUBSECTION Private>
+gst_webrtc_dsp_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-webrtcechoprobe</FILE>
+<TITLE>webrtcechoprobe</TITLE>
+GstWebrtcEchoProbe
+<SUBSECTION Standard>
+GstWebrtcEchoProbeClass
+GST_WEBRTC_ECHO_PROBE
+GST_WEBRTC_ECHO_PROBE_CAST
+GST_IS_WEBRTC_ECHO_PROBE
+GST_WEBRTC_ECHO_PROBE_CLASS
+GST_IS_WEBRTC_ECHO_PROBE_CLASS
+GST_TYPE_WEBRTC_ECHO_PROBE
+<SUBSECTION Private>
+gst_webrtc_echo_probe_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-webvttenc</FILE>
+<TITLE>webvttenc</TITLE>
+GstWebvttEnc
+<SUBSECTION Standard>
+GstWebvttEncClass
+GST_WEBVTT_ENC
+GST_WEBVTT_ENC_CAST
+GST_IS_WEBVTT_ENC
+GST_WEBVTT_ENC_CLASS
+GST_IS_WEBVTT_ENC_CLASS
+GST_TYPE_WEBVTT_ENC
+<SUBSECTION Private>
+gst_webvtt_enc_get_type
+</SECTION>
+
+<SECTION>
<FILE>element-wildmidi</FILE>
<TITLE>wildmidi</TITLE>
GstWildmidi
<SUBSECTION Standard>
GstWildmidiClass
GST_WILDMIDI
-GST_WILDMIDI_CLASS
+GST_WILDMIDI_CAST
GST_IS_WILDMIDI
+GST_WILDMIDI_CLASS
GST_IS_WILDMIDI_CLASS
GST_TYPE_WILDMIDI
+<SUBSECTION Private>
+gst_wildmidi_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-wrappercamerabinsrc</FILE>
+<TITLE>wrappercamerabinsrc</TITLE>
+GstWrapperCameraBinSrc
+<SUBSECTION Standard>
+GstWrapperCameraBinSrcClass
+GST_WRAPPER_CAMERA_BIN_SRC
+GST_WRAPPER_CAMERA_BIN_SRC_CAST
+GST_IS_WRAPPER_CAMERA_BIN_SRC
+GST_WRAPPER_CAMERA_BIN_SRC_CLASS
+GST_IS_WRAPPER_CAMERA_BIN_SRC_CLASS
+GST_TYPE_WRAPPER_CAMERA_BIN_SRC
+<SUBSECTION Private>
+gst_wrapper_camera_bin_src_get_type
</SECTION>
<SECTION>
@@ -1604,17 +4357,52 @@
</SECTION>
<SECTION>
-<FILE>element-voamrwbenc</FILE>
-<TITLE>voamrwbenc</TITLE>
-GstVoAmrwbEnc
+<FILE>element-x265enc</FILE>
+<TITLE>x265enc</TITLE>
+GstX265Enc
<SUBSECTION Standard>
-GstVoAmrwbEncClass
-GST_VOAMRWBENC
-GST_VOAMRWBENC_CLASS
-GST_IS_VOAMRWBENC
-GST_IS_VOAMRWBENC_CLASS
-GST_TYPE_VOAMRWBENC
-gst_voamrwbenc_get_type
+GstX265EncClass
+GST_X265_ENC
+GST_X265_ENC_CAST
+GST_IS_X265_ENC
+GST_X265_ENC_CLASS
+GST_IS_X265_ENC_CLASS
+GST_TYPE_X265_ENC
+<SUBSECTION Private>
+gst_x265_enc_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-y4mdec</FILE>
+<TITLE>y4mdec</TITLE>
+GstY4mDec
+<SUBSECTION Standard>
+GstY4mDecClass
+GST_Y4M_DEC
+GST_Y4M_DEC_CAST
+GST_IS_Y4M_DEC
+GST_Y4M_DEC_CLASS
+GST_IS_Y4M_DEC_CLASS
+GST_TYPE_Y4M_DEC
+<SUBSECTION Private>
+gst_y4m_dec_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-yadif</FILE>
+<TITLE>yadif</TITLE>
+GstYadif
+GstYadifModes
+<SUBSECTION Standard>
+GstYadifClass
+GST_YADIF
+GST_YADIF_CAST
+GST_IS_YADIF
+GST_YADIF_CLASS
+GST_IS_YADIF_CLASS
+GST_TYPE_YADIF
+<SUBSECTION Private>
+gst_yadif_get_type
</SECTION>
<SECTION>
@@ -1623,42 +4411,397 @@
GstZBar
<SUBSECTION Standard>
GstZBarClass
-GST_ZBAR
-GST_ZBAR_CLASS
-GST_IS_ZBAR
-GST_IS_ZBAR_CLASS
-GST_TYPE_ZBAR
+GST_Z_BAR
+GST_Z_BAR_CAST
+GST_IS_Z_BAR
+GST_Z_BAR_CLASS
+GST_IS_Z_BAR_CLASS
+GST_TYPE_Z_BAR
+<SUBSECTION Private>
+gst_z_bar_get_type
</SECTION>
<SECTION>
-<FILE>element-gltransformation</FILE>
-<TITLE>gltransformation</TITLE>
-GstGLTransformation
+<FILE>element-zebrastripe</FILE>
+<TITLE>zebrastripe</TITLE>
+GstZebraStripe
<SUBSECTION Standard>
-GstGLTransformationClass
-GST_GL_TRANSFORMATION
-GST_GL_TRANSFORMATION_CLASS
-GST_IS_GL_TRANSFORMATION
-GST_IS_GL_TRANSFORMATION_CLASS
-GST_TYPE_GL_TRANSFORMATION
+GstZebraStripeClass
+GST_ZEBRA_STRIPE
+GST_ZEBRA_STRIPE_CAST
+GST_IS_ZEBRA_STRIPE
+GST_ZEBRA_STRIPE_CLASS
+GST_IS_ZEBRA_STRIPE_CLASS
+GST_TYPE_ZEBRA_STRIPE
+<SUBSECTION Private>
+gst_zebra_stripe_get_type
</SECTION>
<SECTION>
-<FILE>element-compositor</FILE>
-<TITLE>compositor</TITLE>
+<FILE>element-mpegpsmux</FILE>
+<TITLE>mpegpsmux</TITLE>
+GstgPsMux
<SUBSECTION Standard>
-GstCompositorClass
-GstCompositor
-GST_COMPOSITOR
-GST_COMPOSITOR_CLASS
-GST_IS_COMPOSITOR
-GST_IS_COMPOSITOR_CLASS
-GST_TYPE_COMPOSITOR
-GstCompositorPad
-GstCompositorPadClass
-GST_COMPOSITOR_PAD
-GST_COMPOSITOR_PAD_CLASS
-GST_IS_COMPOSITOR_PAD
-GST_IS_COMPOSITOR_PAD_CLASS
-GST_TYPE_COMPOSITOR_PAD
+GstgPsMuxClass
+GST_G_PS_MUX
+GST_G_PS_MUX_CAST
+GST_IS_G_PS_MUX
+GST_G_PS_MUX_CLASS
+GST_IS_G_PS_MUX_CLASS
+GST_TYPE_G_PS_MUX
+<SUBSECTION Private>
+gst_g_ps_mux_get_type
</SECTION>
+
+<SECTION>
+<FILE>element-tsparse</FILE>
+<TITLE>tsparse</TITLE>
+GstgTSParse2
+<SUBSECTION Standard>
+GstgTSParse2Class
+GST_G_TS_PARSE2
+GST_G_TS_PARSE2_CAST
+GST_IS_G_TS_PARSE2
+GST_G_TS_PARSE2_CLASS
+GST_IS_G_TS_PARSE2_CLASS
+GST_TYPE_G_TS_PARSE2
+<SUBSECTION Private>
+gst_g_ts_parse2_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-mpegtsmux</FILE>
+<TITLE>mpegtsmux</TITLE>
+GstgTsMux
+<SUBSECTION Standard>
+GstgTsMuxClass
+GST_G_TS_MUX
+GST_G_TS_MUX_CAST
+GST_IS_G_TS_MUX
+GST_G_TS_MUX_CLASS
+GST_IS_G_TS_MUX_CLASS
+GST_TYPE_G_TS_MUX
+<SUBSECTION Private>
+gst_g_ts_mux_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-rsndvdbin</FILE>
+<TITLE>rsndvdbin</TITLE>
+GstDvdBin
+<SUBSECTION Standard>
+GstDvdBinClass
+GST_DVD_BIN
+GST_DVD_BIN_CAST
+GST_IS_DVD_BIN
+GST_DVD_BIN_CLASS
+GST_IS_DVD_BIN_CLASS
+GST_TYPE_DVD_BIN
+<SUBSECTION Private>
+gst_dvd_bin_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gleffects_blur</FILE>
+<TITLE>gleffects_blur</TITLE>
+Gstffects_blur
+<SUBSECTION Standard>
+Gstffects_blurClass
+GST_FFECTS_BLUR
+GST_FFECTS_BLUR_CAST
+GST_IS_FFECTS_BLUR
+GST_FFECTS_BLUR_CLASS
+GST_IS_FFECTS_BLUR_CLASS
+GST_TYPE_FFECTS_BLUR
+<SUBSECTION Private>
+gst_ffects_blur_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gleffects_bulge</FILE>
+<TITLE>gleffects_bulge</TITLE>
+Gstffects_bulge
+<SUBSECTION Standard>
+Gstffects_bulgeClass
+GST_FFECTS_BULGE
+GST_FFECTS_BULGE_CAST
+GST_IS_FFECTS_BULGE
+GST_FFECTS_BULGE_CLASS
+GST_IS_FFECTS_BULGE_CLASS
+GST_TYPE_FFECTS_BULGE
+<SUBSECTION Private>
+gst_ffects_bulge_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gleffects_fisheye</FILE>
+<TITLE>gleffects_fisheye</TITLE>
+Gstffects_fisheye
+<SUBSECTION Standard>
+Gstffects_fisheyeClass
+GST_FFECTS_FISHEYE
+GST_FFECTS_FISHEYE_CAST
+GST_IS_FFECTS_FISHEYE
+GST_FFECTS_FISHEYE_CLASS
+GST_IS_FFECTS_FISHEYE_CLASS
+GST_TYPE_FFECTS_FISHEYE
+<SUBSECTION Private>
+gst_ffects_fisheye_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gleffects_glow</FILE>
+<TITLE>gleffects_glow</TITLE>
+Gstffects_glow
+<SUBSECTION Standard>
+Gstffects_glowClass
+GST_FFECTS_GLOW
+GST_FFECTS_GLOW_CAST
+GST_IS_FFECTS_GLOW
+GST_FFECTS_GLOW_CLASS
+GST_IS_FFECTS_GLOW_CLASS
+GST_TYPE_FFECTS_GLOW
+<SUBSECTION Private>
+gst_ffects_glow_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gleffects_heat</FILE>
+<TITLE>gleffects_heat</TITLE>
+Gstffects_heat
+<SUBSECTION Standard>
+Gstffects_heatClass
+GST_FFECTS_HEAT
+GST_FFECTS_HEAT_CAST
+GST_IS_FFECTS_HEAT
+GST_FFECTS_HEAT_CLASS
+GST_IS_FFECTS_HEAT_CLASS
+GST_TYPE_FFECTS_HEAT
+<SUBSECTION Private>
+gst_ffects_heat_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gleffects_identity</FILE>
+<TITLE>gleffects_identity</TITLE>
+Gstffects_identity
+<SUBSECTION Standard>
+Gstffects_identityClass
+GST_FFECTS_IDENTITY
+GST_FFECTS_IDENTITY_CAST
+GST_IS_FFECTS_IDENTITY
+GST_FFECTS_IDENTITY_CLASS
+GST_IS_FFECTS_IDENTITY_CLASS
+GST_TYPE_FFECTS_IDENTITY
+<SUBSECTION Private>
+gst_ffects_identity_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gleffects_laplacian</FILE>
+<TITLE>gleffects_laplacian</TITLE>
+Gstffects_laplacian
+<SUBSECTION Standard>
+Gstffects_laplacianClass
+GST_FFECTS_LAPLACIAN
+GST_FFECTS_LAPLACIAN_CAST
+GST_IS_FFECTS_LAPLACIAN
+GST_FFECTS_LAPLACIAN_CLASS
+GST_IS_FFECTS_LAPLACIAN_CLASS
+GST_TYPE_FFECTS_LAPLACIAN
+<SUBSECTION Private>
+gst_ffects_laplacian_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gleffects_lumaxpro</FILE>
+<TITLE>gleffects_lumaxpro</TITLE>
+Gstffects_lumaxpro
+<SUBSECTION Standard>
+Gstffects_lumaxproClass
+GST_FFECTS_LUMAXPRO
+GST_FFECTS_LUMAXPRO_CAST
+GST_IS_FFECTS_LUMAXPRO
+GST_FFECTS_LUMAXPRO_CLASS
+GST_IS_FFECTS_LUMAXPRO_CLASS
+GST_TYPE_FFECTS_LUMAXPRO
+<SUBSECTION Private>
+gst_ffects_lumaxpro_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gleffects_mirror</FILE>
+<TITLE>gleffects_mirror</TITLE>
+Gstffects_mirror
+<SUBSECTION Standard>
+Gstffects_mirrorClass
+GST_FFECTS_MIRROR
+GST_FFECTS_MIRROR_CAST
+GST_IS_FFECTS_MIRROR
+GST_FFECTS_MIRROR_CLASS
+GST_IS_FFECTS_MIRROR_CLASS
+GST_TYPE_FFECTS_MIRROR
+<SUBSECTION Private>
+gst_ffects_mirror_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gleffects_sepia</FILE>
+<TITLE>gleffects_sepia</TITLE>
+Gstffects_sepia
+<SUBSECTION Standard>
+Gstffects_sepiaClass
+GST_FFECTS_SEPIA
+GST_FFECTS_SEPIA_CAST
+GST_IS_FFECTS_SEPIA
+GST_FFECTS_SEPIA_CLASS
+GST_IS_FFECTS_SEPIA_CLASS
+GST_TYPE_FFECTS_SEPIA
+<SUBSECTION Private>
+gst_ffects_sepia_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gleffects_sin</FILE>
+<TITLE>gleffects_sin</TITLE>
+Gstffects_sin
+<SUBSECTION Standard>
+Gstffects_sinClass
+GST_FFECTS_SIN
+GST_FFECTS_SIN_CAST
+GST_IS_FFECTS_SIN
+GST_FFECTS_SIN_CLASS
+GST_IS_FFECTS_SIN_CLASS
+GST_TYPE_FFECTS_SIN
+<SUBSECTION Private>
+gst_ffects_sin_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gleffects_sobel</FILE>
+<TITLE>gleffects_sobel</TITLE>
+Gstffects_sobel
+<SUBSECTION Standard>
+Gstffects_sobelClass
+GST_FFECTS_SOBEL
+GST_FFECTS_SOBEL_CAST
+GST_IS_FFECTS_SOBEL
+GST_FFECTS_SOBEL_CLASS
+GST_IS_FFECTS_SOBEL_CLASS
+GST_TYPE_FFECTS_SOBEL
+<SUBSECTION Private>
+gst_ffects_sobel_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gleffects_square</FILE>
+<TITLE>gleffects_square</TITLE>
+Gstffects_square
+<SUBSECTION Standard>
+Gstffects_squareClass
+GST_FFECTS_SQUARE
+GST_FFECTS_SQUARE_CAST
+GST_IS_FFECTS_SQUARE
+GST_FFECTS_SQUARE_CLASS
+GST_IS_FFECTS_SQUARE_CLASS
+GST_TYPE_FFECTS_SQUARE
+<SUBSECTION Private>
+gst_ffects_square_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gleffects_squeeze</FILE>
+<TITLE>gleffects_squeeze</TITLE>
+Gstffects_squeeze
+<SUBSECTION Standard>
+Gstffects_squeezeClass
+GST_FFECTS_SQUEEZE
+GST_FFECTS_SQUEEZE_CAST
+GST_IS_FFECTS_SQUEEZE
+GST_FFECTS_SQUEEZE_CLASS
+GST_IS_FFECTS_SQUEEZE_CLASS
+GST_TYPE_FFECTS_SQUEEZE
+<SUBSECTION Private>
+gst_ffects_squeeze_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gleffects_stretch</FILE>
+<TITLE>gleffects_stretch</TITLE>
+Gstffects_stretch
+<SUBSECTION Standard>
+Gstffects_stretchClass
+GST_FFECTS_STRETCH
+GST_FFECTS_STRETCH_CAST
+GST_IS_FFECTS_STRETCH
+GST_FFECTS_STRETCH_CLASS
+GST_IS_FFECTS_STRETCH_CLASS
+GST_TYPE_FFECTS_STRETCH
+<SUBSECTION Private>
+gst_ffects_stretch_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gleffects_tunnel</FILE>
+<TITLE>gleffects_tunnel</TITLE>
+Gstffects_tunnel
+<SUBSECTION Standard>
+Gstffects_tunnelClass
+GST_FFECTS_TUNNEL
+GST_FFECTS_TUNNEL_CAST
+GST_IS_FFECTS_TUNNEL
+GST_FFECTS_TUNNEL_CLASS
+GST_IS_FFECTS_TUNNEL_CLASS
+GST_TYPE_FFECTS_TUNNEL
+<SUBSECTION Private>
+gst_ffects_tunnel_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gleffects_twirl</FILE>
+<TITLE>gleffects_twirl</TITLE>
+Gstffects_twirl
+<SUBSECTION Standard>
+Gstffects_twirlClass
+GST_FFECTS_TWIRL
+GST_FFECTS_TWIRL_CAST
+GST_IS_FFECTS_TWIRL
+GST_FFECTS_TWIRL_CLASS
+GST_IS_FFECTS_TWIRL_CLASS
+GST_TYPE_FFECTS_TWIRL
+<SUBSECTION Private>
+gst_ffects_twirl_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gleffects_xpro</FILE>
+<TITLE>gleffects_xpro</TITLE>
+Gstffects_xpro
+<SUBSECTION Standard>
+Gstffects_xproClass
+GST_FFECTS_XPRO
+GST_FFECTS_XPRO_CAST
+GST_IS_FFECTS_XPRO
+GST_FFECTS_XPRO_CLASS
+GST_IS_FFECTS_XPRO_CLASS
+GST_TYPE_FFECTS_XPRO
+<SUBSECTION Private>
+gst_ffects_xpro_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-gleffects_xray</FILE>
+<TITLE>gleffects_xray</TITLE>
+Gstffects_xray
+<SUBSECTION Standard>
+Gstffects_xrayClass
+GST_FFECTS_XRAY
+GST_FFECTS_XRAY_CAST
+GST_IS_FFECTS_XRAY
+GST_FFECTS_XRAY_CLASS
+GST_IS_FFECTS_XRAY_CLASS
+GST_TYPE_FFECTS_XRAY
+<SUBSECTION Private>
+gst_ffects_xray_get_type
+</SECTION>
+
diff --git a/docs/plugins/gst-plugins-bad-plugins.args b/docs/plugins/gst-plugins-bad-plugins.args
index 4d145e9..25b4ac0 100644
--- a/docs/plugins/gst-plugins-bad-plugins.args
+++ b/docs/plugins/gst-plugins-bad-plugins.args
@@ -1399,6 +1399,16 @@
</ARG>
<ARG>
+<NAME>GstGLImageSink::rotate-method</NAME>
+<TYPE>GstGLRotateMethod</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>rotate method</NICK>
+<BLURB>rotate method.</BLURB>
+<DEFAULT>Identity (no rotation)</DEFAULT>
+</ARG>
+
+<ARG>
<NAME>GstRgAnalysis::forced</NAME>
<TYPE>gboolean</TYPE>
<RANGE></RANGE>
@@ -1704,7 +1714,7 @@
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>bandwidth-hz</NICK>
-<BLURB>(DVB-T) Bandwidth in Hz.</BLURB>
+<BLURB>Channel bandwidth in Hz.</BLURB>
<DEFAULT>8000000</DEFAULT>
</ARG>
@@ -1814,7 +1824,7 @@
<RANGE></RANGE>
<FLAGS>w</FLAGS>
<NICK>pids</NICK>
-<BLURB>Colon seperated list of pids (eg. 110:120).</BLURB>
+<BLURB>Colon-separated list of PIDs (eg. 110:120) to capture. ACT and CAT are automatically included but PMT should be added explicitly. Special value 8192 gets full MPEG-TS.</BLURB>
<DEFAULT>"8192"</DEFAULT>
</ARG>
@@ -2003,7 +2013,7 @@
<TYPE>guint</TYPE>
<RANGE>[1,7]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T layer enabled</NICK>
+<NICK>ISDB-T layer enabled</NICK>
<BLURB>(ISDB-T) Layer Enabled (7 = All layers).</BLURB>
<DEFAULT>7</DEFAULT>
</ARG>
@@ -2033,7 +2043,7 @@
<TYPE>gint</TYPE>
<RANGE>[G_MAXULONG,13]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T layer A segment count</NICK>
+<NICK>ISDB-T layer A segment count</NICK>
<BLURB>(ISDB-T) Layer A segment count (-1 = AUTO).</BLURB>
<DEFAULT>-1</DEFAULT>
</ARG>
@@ -2043,7 +2053,7 @@
<TYPE>gint</TYPE>
<RANGE>[G_MAXULONG,8]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T layer A time interleaving </NICK>
+<NICK>ISDB-T layer A time interleaving</NICK>
<BLURB>(ISDB-T) Layer A time interleaving (-1 = AUTO).</BLURB>
<DEFAULT>-1</DEFAULT>
</ARG>
@@ -2073,7 +2083,7 @@
<TYPE>gint</TYPE>
<RANGE>[G_MAXULONG,13]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T layer B segment count</NICK>
+<NICK>ISDB-T layer B segment count</NICK>
<BLURB>(ISDB-T) Layer B segment count (-1 = AUTO).</BLURB>
<DEFAULT>-1</DEFAULT>
</ARG>
@@ -2083,7 +2093,7 @@
<TYPE>gint</TYPE>
<RANGE>[G_MAXULONG,8]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T layer B time interleaving </NICK>
+<NICK>ISDB-T layer B time interleaving</NICK>
<BLURB>(ISDB-T) Layer B time interleaving (-1 = AUTO).</BLURB>
<DEFAULT>-1</DEFAULT>
</ARG>
@@ -2113,7 +2123,7 @@
<TYPE>gint</TYPE>
<RANGE>[G_MAXULONG,13]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T layer C segment count</NICK>
+<NICK>ISDB-T layer C segment count</NICK>
<BLURB>(ISDB-T) Layer C segment count (-1 = AUTO).</BLURB>
<DEFAULT>-1</DEFAULT>
</ARG>
@@ -2123,7 +2133,7 @@
<TYPE>gint</TYPE>
<RANGE>[G_MAXULONG,8]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T layer C time interleaving </NICK>
+<NICK>ISDB-T layer C time interleaving</NICK>
<BLURB>(ISDB-T) Layer C time interleaving (-1 = AUTO).</BLURB>
<DEFAULT>-1</DEFAULT>
</ARG>
@@ -2133,7 +2143,7 @@
<TYPE>gint</TYPE>
<RANGE>[G_MAXULONG,1]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T partial reception</NICK>
+<NICK>ISDB-T partial reception</NICK>
<BLURB>(ISDB-T) Partial Reception (-1 = AUTO).</BLURB>
<DEFAULT>1</DEFAULT>
</ARG>
@@ -2143,7 +2153,7 @@
<TYPE>guint</TYPE>
<RANGE>[1,13]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T SB segment count</NICK>
+<NICK>ISDB-T SB segment count</NICK>
<BLURB>(ISDB-T) SB segment count.</BLURB>
<DEFAULT>1</DEFAULT>
</ARG>
@@ -2153,7 +2163,7 @@
<TYPE>gint</TYPE>
<RANGE>[0,12]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T SB segment IDX</NICK>
+<NICK>ISDB-T SB segment IDX</NICK>
<BLURB>(ISDB-T) SB segment IDX.</BLURB>
<DEFAULT>0</DEFAULT>
</ARG>
@@ -2163,7 +2173,7 @@
<TYPE>gint</TYPE>
<RANGE>[G_MAXULONG,41]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T SB subchannel ID</NICK>
+<NICK>ISDB-T SB subchannel ID</NICK>
<BLURB>(ISDB-T) SB Subchannel ID (-1 = AUTO).</BLURB>
<DEFAULT>0</DEFAULT>
</ARG>
@@ -2173,7 +2183,7 @@
<TYPE>gint</TYPE>
<RANGE>[0,1]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T sound broadcasting</NICK>
+<NICK>ISDB-T sound broadcasting</NICK>
<BLURB>(ISDB-T) Sound Broadcasting.</BLURB>
<DEFAULT>0</DEFAULT>
</ARG>
@@ -18174,7 +18184,7 @@
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>bandwidth-hz</NICK>
-<BLURB>(DVB-T) Bandwidth in Hz.</BLURB>
+<BLURB>Channel bandwidth in Hz.</BLURB>
<DEFAULT>8000000</DEFAULT>
</ARG>
@@ -18233,7 +18243,7 @@
<TYPE>guint</TYPE>
<RANGE>[1,7]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T layer enabled</NICK>
+<NICK>ISDB-T layer enabled</NICK>
<BLURB>(ISDB-T) Layer Enabled (7 = All layers).</BLURB>
<DEFAULT>7</DEFAULT>
</ARG>
@@ -18263,7 +18273,7 @@
<TYPE>gint</TYPE>
<RANGE>[G_MAXULONG,13]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T layer A segment count</NICK>
+<NICK>ISDB-T layer A segment count</NICK>
<BLURB>(ISDB-T) Layer A segment count (-1 = AUTO).</BLURB>
<DEFAULT>-1</DEFAULT>
</ARG>
@@ -18273,7 +18283,7 @@
<TYPE>gint</TYPE>
<RANGE>[G_MAXULONG,8]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T layer A time interleaving </NICK>
+<NICK>ISDB-T layer A time interleaving</NICK>
<BLURB>(ISDB-T) Layer A time interleaving (-1 = AUTO).</BLURB>
<DEFAULT>-1</DEFAULT>
</ARG>
@@ -18303,7 +18313,7 @@
<TYPE>gint</TYPE>
<RANGE>[G_MAXULONG,13]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T layer B segment count</NICK>
+<NICK>ISDB-T layer B segment count</NICK>
<BLURB>(ISDB-T) Layer B segment count (-1 = AUTO).</BLURB>
<DEFAULT>-1</DEFAULT>
</ARG>
@@ -18313,7 +18323,7 @@
<TYPE>gint</TYPE>
<RANGE>[G_MAXULONG,8]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T layer B time interleaving </NICK>
+<NICK>ISDB-T layer B time interleaving</NICK>
<BLURB>(ISDB-T) Layer B time interleaving (-1 = AUTO).</BLURB>
<DEFAULT>-1</DEFAULT>
</ARG>
@@ -18343,7 +18353,7 @@
<TYPE>gint</TYPE>
<RANGE>[G_MAXULONG,13]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T layer C segment count</NICK>
+<NICK>ISDB-T layer C segment count</NICK>
<BLURB>(ISDB-T) Layer C segment count (-1 = AUTO).</BLURB>
<DEFAULT>-1</DEFAULT>
</ARG>
@@ -18353,7 +18363,7 @@
<TYPE>gint</TYPE>
<RANGE>[G_MAXULONG,8]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T layer C time interleaving </NICK>
+<NICK>ISDB-T layer C time interleaving</NICK>
<BLURB>(ISDB-T) Layer C time interleaving (-1 = AUTO).</BLURB>
<DEFAULT>-1</DEFAULT>
</ARG>
@@ -18363,7 +18373,7 @@
<TYPE>gint</TYPE>
<RANGE>[G_MAXULONG,1]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T partial reception</NICK>
+<NICK>ISDB-T partial reception</NICK>
<BLURB>(ISDB-T) Partial Reception (-1 = AUTO).</BLURB>
<DEFAULT>1</DEFAULT>
</ARG>
@@ -18373,7 +18383,7 @@
<TYPE>guint</TYPE>
<RANGE>[1,13]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T SB segment count</NICK>
+<NICK>ISDB-T SB segment count</NICK>
<BLURB>(ISDB-T) SB segment count.</BLURB>
<DEFAULT>1</DEFAULT>
</ARG>
@@ -18383,7 +18393,7 @@
<TYPE>gint</TYPE>
<RANGE>[0,12]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T SB segment IDX</NICK>
+<NICK>ISDB-T SB segment IDX</NICK>
<BLURB>(ISDB-T) SB segment IDX.</BLURB>
<DEFAULT>0</DEFAULT>
</ARG>
@@ -18393,7 +18403,7 @@
<TYPE>gint</TYPE>
<RANGE>[G_MAXULONG,41]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T SB subchannel ID</NICK>
+<NICK>ISDB-T SB subchannel ID</NICK>
<BLURB>(ISDB-T) SB Subchannel ID (-1 = AUTO).</BLURB>
<DEFAULT>0</DEFAULT>
</ARG>
@@ -18403,7 +18413,7 @@
<TYPE>gint</TYPE>
<RANGE>[0,1]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>ISB-T sound broadcasting</NICK>
+<NICK>ISDB-T sound broadcasting</NICK>
<BLURB>(ISDB-T) Sound Broadcasting.</BLURB>
<DEFAULT>0</DEFAULT>
</ARG>
@@ -18900,11 +18910,11 @@
<ARG>
<NAME>GstH264Parse::config-interval</NAME>
-<TYPE>guint</TYPE>
-<RANGE><= 3600</RANGE>
+<TYPE>gint</TYPE>
+<RANGE>[G_MAXULONG,3600]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>SPS PPS Send Interval</NICK>
-<BLURB>Send SPS and PPS Insertion Interval in seconds (sprop parameter sets will be multiplexed in the data stream when detected.) (0 = disabled).</BLURB>
+<BLURB>Send SPS and PPS Insertion Interval in seconds (sprop parameter sets will be multiplexed in the data stream when detected.) (0 = disabled, -1 = send with every IDR frame).</BLURB>
<DEFAULT>0</DEFAULT>
</ARG>
@@ -27264,8 +27274,8 @@
<RANGE>[0,1]</RANGE>
<FLAGS>rw</FLAGS>
<NICK>diffspace</NICK>
-<BLURB>difference space: a value from 0 to 256.</BLURB>
-<DEFAULT>1</DEFAULT>
+<BLURB>difference space: a value from 0 to 256 (mapped to [0,1]).</BLURB>
+<DEFAULT>0.00390625</DEFAULT>
</ARG>
<ARG>
@@ -27274,8 +27284,8 @@
<RANGE>[0,1]</RANGE>
<FLAGS>rw</FLAGS>
<NICK>triplevel</NICK>
-<BLURB>level of trip: use high numbers, incremented by 100.</BLURB>
-<DEFAULT>0</DEFAULT>
+<BLURB>level of trip: mapped to [0,1] asymptotical.</BLURB>
+<DEFAULT>1</DEFAULT>
</ARG>
<ARG>
@@ -27313,7 +27323,7 @@
<TYPE>gdouble</TYPE>
<RANGE>[0,1]</RANGE>
<FLAGS>rw</FLAGS>
-<NICK>brightness</NICK>
+<NICK>Brightness</NICK>
<BLURB></BLURB>
<DEFAULT>0.5</DEFAULT>
</ARG>
@@ -27359,6 +27369,46 @@
</ARG>
<ARG>
+<NAME>frei0r-filter-lens-correction::correction-near-center</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Correction near center</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-lens-correction::correction-near-edges</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Correction near edges</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-lens-correction::x-center</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>X center</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-lens-correction::y-center</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Y center</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
<NAME>frei0r-filter-brightness::brightness</NAME>
<TYPE>gdouble</TYPE>
<RANGE>[0,1]</RANGE>
@@ -27429,6 +27479,26 @@
</ARG>
<ARG>
+<NAME>frei0r-filter-pixeliz0r::block-height</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Block height</NICK>
+<BLURB>Vertical size of one "pixel".</BLURB>
+<DEFAULT>0.0291667</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pixeliz0r::block-width</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Block width</NICK>
+<BLURB>Horizontal size of one "pixel".</BLURB>
+<DEFAULT>0.021875</DEFAULT>
+</ARG>
+
+<ARG>
<NAME>frei0r-filter-3dflippo::center-position--x-</NAME>
<TYPE>gdouble</TYPE>
<RANGE>[0,1]</RANGE>
@@ -27605,7 +27675,7 @@
<FLAGS>rw</FLAGS>
<NICK>Saturation</NICK>
<BLURB>The saturation value.</BLURB>
-<DEFAULT>0</DEFAULT>
+<DEFAULT>0.125</DEFAULT>
</ARG>
<ARG>
@@ -27635,7 +27705,7 @@
<FLAGS>rw</FLAGS>
<NICK>lredscale</NICK>
<BLURB>multiplier for downscaling non-edge brightness.</BLURB>
-<DEFAULT>5.48413e-322</DEFAULT>
+<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
@@ -27645,7 +27715,7 @@
<FLAGS>rw</FLAGS>
<NICK>lthresh</NICK>
<BLURB>threshold for edge lightening.</BLURB>
-<DEFAULT>8.00386e-321</DEFAULT>
+<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
@@ -27655,7 +27725,7 @@
<FLAGS>rw</FLAGS>
<NICK>lupscale</NICK>
<BLURB>multiplier for upscaling edge brightness.</BLURB>
-<DEFAULT>7.93469e-321</DEFAULT>
+<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
@@ -27685,7 +27755,7 @@
<FLAGS>rw</FLAGS>
<NICK>Green Tint</NICK>
<BLURB>Adjust the level of green.</BLURB>
-<DEFAULT>0</DEFAULT>
+<DEFAULT>0.133333</DEFAULT>
</ARG>
<ARG>
@@ -27825,7 +27895,7 @@
<FLAGS>rw</FLAGS>
<NICK>blend</NICK>
<BLURB>blend factor.</BLURB>
-<DEFAULT>0</DEFAULT>
+<DEFAULT>7.49023e-11</DEFAULT>
</ARG>
<ARG>
@@ -28015,7 +28085,7 @@
<FLAGS>rw</FLAGS>
<NICK>HSync</NICK>
<BLURB>the hsync offset.</BLURB>
-<DEFAULT>2.11543e-316</DEFAULT>
+<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
@@ -33995,7 +34065,7 @@
<FLAGS>rw</FLAGS>
<NICK>Histogram position</NICK>
<BLURB>Histogram position.</BLURB>
-<DEFAULT>0</DEFAULT>
+<DEFAULT>0.3</DEFAULT>
</ARG>
<ARG>
@@ -34125,7 +34195,7 @@
<FLAGS>rw</FLAGS>
<NICK>Color (G)</NICK>
<BLURB>The color to make transparent (B G R).</BLURB>
-<DEFAULT>0</DEFAULT>
+<DEFAULT>0.94</DEFAULT>
</ARG>
<ARG>
@@ -34145,7 +34215,7 @@
<FLAGS>rw</FLAGS>
<NICK>Distance</NICK>
<BLURB>Distance to Color (127 is good).</BLURB>
-<DEFAULT>0</DEFAULT>
+<DEFAULT>0.288</DEFAULT>
</ARG>
<ARG>
@@ -34345,7 +34415,7 @@
<FLAGS>rw</FLAGS>
<NICK>Zoomrate</NICK>
<BLURB>Zoomrate.</BLURB>
-<DEFAULT>0</DEFAULT>
+<DEFAULT>0.202</DEFAULT>
</ARG>
<ARG>
@@ -34354,8 +34424,8 @@
<RANGE>[0,1]</RANGE>
<FLAGS>rw</FLAGS>
<NICK>Channel</NICK>
-<BLURB>Channel to adjust levels (1 = RED; 2 = GREEN; 3 = BLUE; 4 = LUMA).</BLURB>
-<DEFAULT>0</DEFAULT>
+<BLURB>Channel to adjust (0 = red, 0.1 = green, 0.2 = blue, 0.3 = alpha, 0.4 = luma, 0.5 = rgb, 0.6 = hue, 0.7 = saturation).</BLURB>
+<DEFAULT>0.5</DEFAULT>
</ARG>
<ARG>
@@ -34364,8 +34434,8 @@
<RANGE>[0,1]</RANGE>
<FLAGS>rw</FLAGS>
<NICK>Curve point number</NICK>
-<BLURB>Number of point to use to build curve.</BLURB>
-<DEFAULT>0</DEFAULT>
+<BLURB>Number of points to use to build curve (/10 to fit [0,1] parameter range). Minimum 2 (0.2), Maximum 5 (0.5). Not relevant for Bézier spline.</BLURB>
+<DEFAULT>0.2</DEFAULT>
</ARG>
<ARG>
@@ -34374,8 +34444,8 @@
<RANGE>[0,1]</RANGE>
<FLAGS>rw</FLAGS>
<NICK>Graph position</NICK>
-<BLURB>Output image corner where curve graph will be drawn (1 = TOP,LEFT; 2 = TOP,RIGHT; 3 = BOTTOM,LEFT; 4 = BOTTOM, RIGHT).</BLURB>
-<DEFAULT>0</DEFAULT>
+<BLURB>Output image corner where curve graph will be drawn (0.1 = TOP,LEFT; 0.2 = TOP,RIGHT; 0.3 = BOTTOM,LEFT; 0.4 = BOTTOM, RIGHT).</BLURB>
+<DEFAULT>0.3</DEFAULT>
</ARG>
<ARG>
@@ -34385,7 +34455,7 @@
<FLAGS>rw</FLAGS>
<NICK>Point 1 input value</NICK>
<BLURB>Point 1 input value.</BLURB>
-<DEFAULT>1</DEFAULT>
+<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
@@ -34395,7 +34465,7 @@
<FLAGS>rw</FLAGS>
<NICK>Point 1 output value</NICK>
<BLURB>Point 1 output value.</BLURB>
-<DEFAULT>1</DEFAULT>
+<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
@@ -34425,7 +34495,7 @@
<FLAGS>rw</FLAGS>
<NICK>Point 3 input value</NICK>
<BLURB>Point 3 input value.</BLURB>
-<DEFAULT>1</DEFAULT>
+<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
@@ -34435,7 +34505,7 @@
<FLAGS>rw</FLAGS>
<NICK>Point 3 output value</NICK>
<BLURB>Point 3 output value.</BLURB>
-<DEFAULT>1</DEFAULT>
+<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
@@ -34445,7 +34515,7 @@
<FLAGS>rw</FLAGS>
<NICK>Point 4 input value</NICK>
<BLURB>Point 4 input value.</BLURB>
-<DEFAULT>1</DEFAULT>
+<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
@@ -34455,7 +34525,7 @@
<FLAGS>rw</FLAGS>
<NICK>Point 4 output value</NICK>
<BLURB>Point 4 output value.</BLURB>
-<DEFAULT>1</DEFAULT>
+<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
@@ -34465,7 +34535,7 @@
<FLAGS>rw</FLAGS>
<NICK>Point 5 input value</NICK>
<BLURB>Point 5 input value.</BLURB>
-<DEFAULT>1</DEFAULT>
+<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
@@ -34475,7 +34545,7 @@
<FLAGS>rw</FLAGS>
<NICK>Point 5 output value</NICK>
<BLURB>Point 5 output value.</BLURB>
-<DEFAULT>1</DEFAULT>
+<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
@@ -34489,6 +34559,26 @@
</ARG>
<ARG>
+<NAME>frei0r-filter-curves::b--zier-spline</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Bézier spline</NICK>
+<BLURB>Use cubic Bézier spline. Has to be a sorted list of points in the format "handle1x;handle1y#pointx;pointy#handle2x;handle2y"(pointx = in, pointy = out). Points are separated by a "|".The values can have "double" precision. x, y for points should be in the range 0-1. x,y for handles might also be out of this range.</BLURB>
+<DEFAULT>""</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-curves::luma-formula</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Luma formula</NICK>
+<BLURB>Use Rec. 601 (false) or Rec. 709 (true).</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
<NAME>VdpSink::display</NAME>
<TYPE>gchar*</TYPE>
<RANGE></RANGE>
@@ -46409,6 +46499,16 @@
</ARG>
<ARG>
+<NAME>GstRTMPSrc::timeout</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>RTMP Timeout</NICK>
+<BLURB>Time without receiving any data from the server to wait before to timeout the session.</BLURB>
+<DEFAULT>120</DEFAULT>
+</ARG>
+
+<ARG>
<NAME>GstFliteTestSrc::samplesperbuffer</NAME>
<TYPE>gint</TYPE>
<RANGE>>= 1</RANGE>
@@ -46909,46 +47009,6 @@
</ARG>
<ARG>
-<NAME>Gstpyramidsegment::level</NAME>
-<TYPE>gint</TYPE>
-<RANGE>[0,4]</RANGE>
-<FLAGS>rw</FLAGS>
-<NICK>Level</NICK>
-<BLURB>Maximum level of the pyramid segmentation.</BLURB>
-<DEFAULT>4</DEFAULT>
-</ARG>
-
-<ARG>
-<NAME>Gstpyramidsegment::silent</NAME>
-<TYPE>gboolean</TYPE>
-<RANGE></RANGE>
-<FLAGS>rw</FLAGS>
-<NICK>Silent</NICK>
-<BLURB>Produce verbose output ?.</BLURB>
-<DEFAULT>FALSE</DEFAULT>
-</ARG>
-
-<ARG>
-<NAME>Gstpyramidsegment::threshold1</NAME>
-<TYPE>gdouble</TYPE>
-<RANGE>[0,1000]</RANGE>
-<FLAGS>rw</FLAGS>
-<NICK>Threshold1</NICK>
-<BLURB>Error threshold for establishing links.</BLURB>
-<DEFAULT>50</DEFAULT>
-</ARG>
-
-<ARG>
-<NAME>Gstpyramidsegment::threshold2</NAME>
-<TYPE>gdouble</TYPE>
-<RANGE>[0,1000]</RANGE>
-<FLAGS>rw</FLAGS>
-<NICK>Threshold2</NICK>
-<BLURB>Error threshold for segment clustering.</BLURB>
-<DEFAULT>60</DEFAULT>
-</ARG>
-
-<ARG>
<NAME>Gstfacedetect::display</NAME>
<TYPE>gboolean</TYPE>
<RANGE></RANGE>
@@ -59981,11 +60041,11 @@
<ARG>
<NAME>GstDashDemux::max-bitrate</NAME>
<TYPE>guint</TYPE>
-<RANGE>>= 1000</RANGE>
+<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>Max bitrate</NICK>
-<BLURB>Max of bitrate supported by target decoder.</BLURB>
-<DEFAULT>24000000</DEFAULT>
+<BLURB>Max of bitrate supported by target video decoder (0 = no maximum).</BLURB>
+<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
@@ -60009,6 +60069,36 @@
</ARG>
<ARG>
+<NAME>GstDashDemux::max-video-framerate</NAME>
+<TYPE>GstFraction</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max video framerate</NICK>
+<BLURB>Max video framerate to select (0/1 = no maximum).</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDashDemux::max-video-height</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max video height</NICK>
+<BLURB>Max video height to select (0 = no maximum).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDashDemux::max-video-width</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max video width</NICK>
+<BLURB>Max video width to select (0 = no maximum).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
<NAME>GstSkinDetect::method</NAME>
<TYPE>GstSkindetectMethod</TYPE>
<RANGE></RANGE>
@@ -66743,6 +66833,16 @@
</ARG>
<ARG>
+<NAME>GstSrtpEnc::stats</NAME>
+<TYPE>GstStructure*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Statistics</NICK>
+<BLURB>Various statistics.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
<NAME>GstSegmentation::learning-rate</NAME>
<TYPE>gfloat</TYPE>
<RANGE>[0,1]</RANGE>
@@ -67672,11 +67772,11 @@
<ARG>
<NAME>GstRtpH265Pay::config-interval</NAME>
-<TYPE>guint</TYPE>
-<RANGE><= 3600</RANGE>
+<TYPE>gint</TYPE>
+<RANGE>[G_MAXULONG,3600]</RANGE>
<FLAGS>rw</FLAGS>
<NICK>VPS SPS PPS Send Interval</NICK>
-<BLURB>Send VPS, SPS and PPS Insertion Interval in seconds (sprop parameter sets will be multiplexed in the data stream when detected.) (0 = disabled).</BLURB>
+<BLURB>Send VPS, SPS and PPS Insertion Interval in seconds (sprop parameter sets will be multiplexed in the data stream when detected.) (0 = disabled, -1 = send with every IDR frame).</BLURB>
<DEFAULT>0</DEFAULT>
</ARG>
@@ -67737,7 +67837,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Connection</NICK>
<BLURB>Video input connection to use.</BLURB>
-<DEFAULT>auto</DEFAULT>
+<DEFAULT>Auto</DEFAULT>
</ARG>
<ARG>
@@ -67757,7 +67857,27 @@
<FLAGS>rwx</FLAGS>
<NICK>Playback Mode</NICK>
<BLURB>Video Mode to use for playback.</BLURB>
-<DEFAULT>auto</DEFAULT>
+<DEFAULT>Automatic detection</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDecklinkVideoSrc::video-format</NAME>
+<TYPE>GstDecklinkVideoFormat</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Video format</NICK>
+<BLURB>Video format type to use for input (Only use auto for mode=auto).</BLURB>
+<DEFAULT>Auto</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDecklinkVideoSrc::timecode-format</NAME>
+<TYPE>GstDecklinkTimecodeFormat</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Timecode format</NICK>
+<BLURB>Timecode format type to use for input.</BLURB>
+<DEFAULT>bmdTimecodeRP188Any</DEFAULT>
</ARG>
<ARG>
@@ -67777,7 +67897,27 @@
<FLAGS>rwx</FLAGS>
<NICK>Playback Mode</NICK>
<BLURB>Video Mode to use for playback.</BLURB>
-<DEFAULT>ntsc</DEFAULT>
+<DEFAULT>NTSC SD 60i</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDecklinkVideoSink::video-format</NAME>
+<TYPE>GstDecklinkVideoFormat</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Video format</NICK>
+<BLURB>Video format type to use for playback.</BLURB>
+<DEFAULT>bmdFormat8BitYUV</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDecklinkVideoSink::timecode-format</NAME>
+<TYPE>GstDecklinkTimecodeFormat</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Timecode format</NICK>
+<BLURB>Timecode format type to use for playback.</BLURB>
+<DEFAULT>bmdTimecodeRP188Any</DEFAULT>
</ARG>
<ARG>
@@ -67807,7 +67947,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Connection</NICK>
<BLURB>Audio input connection to use.</BLURB>
-<DEFAULT>auto</DEFAULT>
+<DEFAULT>Automatic</DEFAULT>
</ARG>
<ARG>
@@ -67962,7 +68102,7 @@
<ARG>
<NAME>GstOpenh264Enc::slice-mode</NAME>
-<TYPE>GstOpenh264EncSliceMode</TYPE>
+<TYPE>GstOpenh264EncSliceModes</TYPE>
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>Slice mode</NICK>
@@ -67991,6 +68131,16 @@
</ARG>
<ARG>
+<NAME>GstOpenh264Enc::max-bitrate</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max Bitrate</NICK>
+<BLURB>Maximum Bitrate (in bits per second).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
<NAME>GstLibde265Dec::max-threads</NAME>
<TYPE>gint</TYPE>
<RANGE>>= 0</RANGE>
@@ -68211,6 +68361,26 @@
</ARG>
<ARG>
+<NAME>GstGLMixerBin::start-time</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Start Time</NICK>
+<BLURB>Start time to use if start-time-selection=set.</BLURB>
+<DEFAULT>18446744073709551615</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGLMixerBin::start-time-selection</NAME>
+<TYPE>GstGLMixerBinStartTimeSelection</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Start Time Selection</NICK>
+<BLURB>Decides which start time is output.</BLURB>
+<DEFAULT>Start at 0 running time (default)</DEFAULT>
+</ARG>
+
+<ARG>
<NAME>GstGLImageSinkBin::async</NAME>
<TYPE>gboolean</TYPE>
<RANGE></RANGE>
@@ -68411,6 +68581,16 @@
</ARG>
<ARG>
+<NAME>GstGLImageSinkBin::rotate-method</NAME>
+<TYPE>GstGLRotateMethod</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>rotate method</NICK>
+<BLURB>rotate method.</BLURB>
+<DEFAULT>Identity (no rotation)</DEFAULT>
+</ARG>
+
+<ARG>
<NAME>GstGLFilterBin::filter</NAME>
<TYPE>GstElement*</TYPE>
<RANGE></RANGE>
@@ -69361,6 +69541,2606 @@
</ARG>
<ARG>
+<NAME>GstChecksumSink::hash</NAME>
+<TYPE>GstChecksumSinkHash</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Hash</NICK>
+<BLURB>Checksum type.</BLURB>
+<DEFAULT>SHA-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstSdpSrc::location</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Location</NICK>
+<BLURB>URI to SDP file (sdp:///path/to/file).</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstSdpSrc::sdp</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>SDP</NICK>
+<BLURB>SDP description used instead of location.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGLDeinterlace::method</NAME>
+<TYPE>GstGLDeinterlaceMethod</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Deinterlace Method</NICK>
+<BLURB>Select which deinterlace method apply to GL video texture.</BLURB>
+<DEFAULT>Blur Vertical</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-r::amplitude</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Amplitude</NICK>
+<BLURB>Amplitude (contrast) of the pattern.</BLURB>
+<DEFAULT>0.8</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-r::aspect-type</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Aspect type</NICK>
+<BLURB>Pixel aspect ratio presets.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-r::channel</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Channel</NICK>
+<BLURB>Into which color channel to draw.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-r::freq-1</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Freq 1</NICK>
+<BLURB>Pattern 7 H frequency.</BLURB>
+<DEFAULT>0.03</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-r::freq-2</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Freq 2</NICK>
+<BLURB>Pattern 7 V frequency.</BLURB>
+<DEFAULT>0.03</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-r::lin-p-swp</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Lin P swp</NICK>
+<BLURB>Use linear period sweep.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-r::manual-aspect</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Manual aspect</NICK>
+<BLURB>Manual pixel aspect ratio.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-r::type</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Type</NICK>
+<BLURB>Type of test pattern.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-l::channel</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Channel</NICK>
+<BLURB>Into which color channel to draw.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-l::type</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Type</NICK>
+<BLURB>Type of test pattern.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-i::amplitude</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Amplitude</NICK>
+<BLURB>Amplitude (contrast) of the pattern.</BLURB>
+<DEFAULT>0.8</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-i::channel</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Channel</NICK>
+<BLURB>Into which color channel to draw.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-i::negative</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Negative</NICK>
+<BLURB>Change polarity of impulse/step.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-i::tilt</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Tilt</NICK>
+<BLURB>Angle of step function.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-i::type</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Type</NICK>
+<BLURB>Type of test pattern.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-i::width</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Width</NICK>
+<BLURB>Width of impulse.</BLURB>
+<DEFAULT>0.040404</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-g::aspect-type</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Aspect type</NICK>
+<BLURB>Pixel aspect ratio presets.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-g::manual-aspect</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Manual Aspect</NICK>
+<BLURB>Manual pixel aspect ratio.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-g::negative</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Negative</NICK>
+<BLURB>Polarity of image.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-g::size-1</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Size 1</NICK>
+<BLURB>Size of major features.</BLURB>
+<DEFAULT>0.28125</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-g::size-2</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Size 2</NICK>
+<BLURB>Size of minor features.</BLURB>
+<DEFAULT>0.0625</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-g::type</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Type</NICK>
+<BLURB>Type of test pattern.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-c::color-space</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Color space</NICK>
+<BLURB></BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-c::cross-section</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Cross section</NICK>
+<BLURB></BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-c::fullscreen</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Fullscreen</NICK>
+<BLURB></BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-c::third-axis-value</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Third axis value</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-b::aspect-type</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Aspect type</NICK>
+<BLURB>7 choices, pixel aspect ratio.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-b::manual-aspect</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Manual Aspect</NICK>
+<BLURB>Manual pixel aspect ratio (Aspect type 6).</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-src-test-pat-b::type</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Type</NICK>
+<BLURB>8 choices, select test pattern.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-mixer-cairoblend::blend-mode</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>blend mode</NICK>
+<BLURB>Blend mode used to compose image. Accepted values: 'normal', 'add', 'saturate', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'colordodge', 'colorburn', 'hardlight', 'softlight', 'difference', 'exclusion', 'hslhue', 'hslsaturation', 'hslcolor', 'hslluminosity'.</BLURB>
+<DEFAULT>"normal"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-mixer-cairoblend::opacity</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>opacity</NICK>
+<BLURB>Opacity of composited image.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-mixer-cairoaffineblend::anchor-x</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>anchor x</NICK>
+<BLURB>X position of rotation center within the second input.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-mixer-cairoaffineblend::anchor-y</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>anchor y</NICK>
+<BLURB>Y position of rotation center within the second input.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-mixer-cairoaffineblend::blend-mode</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>blend mode</NICK>
+<BLURB>Blend mode used to compose image. Accepted values: 'normal', 'add', 'saturate', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'colordodge', 'colorburn', 'hardlight', 'softlight', 'difference', 'exclusion', 'hslhue', 'hslsaturation', 'hslcolor', 'hslluminosity'.</BLURB>
+<DEFAULT>"normal"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-mixer-cairoaffineblend::opacity</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>opacity</NICK>
+<BLURB>Opacity of second input.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-mixer-cairoaffineblend::rotation</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>rotation</NICK>
+<BLURB>Rotation of second input, value interperted as range 0 - 360.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-mixer-cairoaffineblend::x</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>x</NICK>
+<BLURB>X position of second input, value interperted as range -2*width - 3*width.</BLURB>
+<DEFAULT>0.4</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-mixer-cairoaffineblend::x-scale</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>x scale</NICK>
+<BLURB>X scale of second input, value interperted as range 0 - 5.</BLURB>
+<DEFAULT>0.2</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-mixer-cairoaffineblend::y</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>y</NICK>
+<BLURB>Y position of second input, value interperted as range -2*height - 3*height.</BLURB>
+<DEFAULT>0.4</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-mixer-cairoaffineblend::y-scale</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>y scale</NICK>
+<BLURB>Y scale of second input, value interperted as range 0 - 5.</BLURB>
+<DEFAULT>0.2</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-white-balance--lms-space-::color-temperature</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Color Temperature</NICK>
+<BLURB>Choose an output color temperature, if different from 6500 K.</BLURB>
+<DEFAULT>0.433333</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-white-balance--lms-space-::neutral-color-b</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Neutral Color (B)</NICK>
+<BLURB>Choose a color from the source image that should be white.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-white-balance--lms-space-::neutral-color-g</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Neutral Color (G)</NICK>
+<BLURB>Choose a color from the source image that should be white.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-white-balance--lms-space-::neutral-color-r</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Neutral Color (R)</NICK>
+<BLURB>Choose a color from the source image that should be white.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-vignette::aspect</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>aspect</NICK>
+<BLURB>Aspect ratio.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-vignette::clearcenter</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>clearCenter</NICK>
+<BLURB>Size of the unaffected center.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-vignette::soft</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>soft</NICK>
+<BLURB>Softness.</BLURB>
+<DEFAULT>0.6</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-vectorscope::mix</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>mix</NICK>
+<BLURB>The amount of source image mixed into background of display.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-vectorscope::overlay-sides</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>overlay sides</NICK>
+<BLURB>If false, the sides of image are shown without overlay.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-timeout-indicator::color-b</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>color (B)</NICK>
+<BLURB>Indicator colour.</BLURB>
+<DEFAULT>6.44597e-44</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-timeout-indicator::color-g</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>color (G)</NICK>
+<BLURB>Indicator colour.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-timeout-indicator::color-r</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>color (R)</NICK>
+<BLURB>Indicator colour.</BLURB>
+<DEFAULT>1.28487e-37</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-timeout-indicator::time</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>time</NICK>
+<BLURB>Current time.</BLURB>
+<DEFAULT>1.80984e-316</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-timeout-indicator::transparency</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>transparency</NICK>
+<BLURB>Indicator transparency.</BLURB>
+<DEFAULT>1.80984e-316</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-spillsupress::supresstype</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>supresstype</NICK>
+<BLURB>Defines if green or blue screen spill supress is applied.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-sop-sat::aoffset</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>aOffset</NICK>
+<BLURB>Offset of the alpha component.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-sop-sat::apower</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>aPower</NICK>
+<BLURB>Power (Gamma) of the alpha component.</BLURB>
+<DEFAULT>0.05</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-sop-sat::aslope</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>aSlope</NICK>
+<BLURB>Slope of the alpha component.</BLURB>
+<DEFAULT>0.05</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-sop-sat::boffset</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>bOffset</NICK>
+<BLURB>Offset of the blue color component.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-sop-sat::bpower</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>bPower</NICK>
+<BLURB>Power (Gamma) of the blue color component.</BLURB>
+<DEFAULT>0.05</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-sop-sat::bslope</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>bSlope</NICK>
+<BLURB>Slope of the blue color component.</BLURB>
+<DEFAULT>0.05</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-sop-sat::goffset</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>gOffset</NICK>
+<BLURB>Offset of the green color component.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-sop-sat::gpower</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>gPower</NICK>
+<BLURB>Power (Gamma) of the green color component.</BLURB>
+<DEFAULT>0.05</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-sop-sat::gslope</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>gSlope</NICK>
+<BLURB>Slope of the green color component.</BLURB>
+<DEFAULT>0.05</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-sop-sat::roffset</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>rOffset</NICK>
+<BLURB>Offset of the red color component.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-sop-sat::rpower</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>rPower</NICK>
+<BLURB>Power (Gamma) of the red color component.</BLURB>
+<DEFAULT>0.05</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-sop-sat::rslope</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>rSlope</NICK>
+<BLURB>Slope of the red color component.</BLURB>
+<DEFAULT>0.05</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-sop-sat::saturation</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>saturation</NICK>
+<BLURB>Overall saturation.</BLURB>
+<DEFAULT>0.1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-softglow::blur</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>blur</NICK>
+<BLURB>Blur of the glow.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-softglow::blurblend</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>blurblend</NICK>
+<BLURB>Blend mode used to blend highlight blur with input image.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-softglow::brightness</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>brightness</NICK>
+<BLURB>Brightness of highlight areas.</BLURB>
+<DEFAULT>0.75</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-softglow::sharpness</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>sharpness</NICK>
+<BLURB>Sharpness of highlight areas.</BLURB>
+<DEFAULT>0.85</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-sigmoidaltransfer::brightness</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>brightness</NICK>
+<BLURB>Brightnesss of image.</BLURB>
+<DEFAULT>0.75</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-sigmoidaltransfer::sharpness</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>sharpness</NICK>
+<BLURB>Sharpness of transfer.</BLURB>
+<DEFAULT>0.85</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-sharpness::amount</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Amount</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.3</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-sharpness::size</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Size</NICK>
+<BLURB></BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-select0r::color-to-select-b</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Color to select (B)</NICK>
+<BLURB></BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-select0r::color-to-select-g</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Color to select (G)</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.8</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-select0r::color-to-select-r</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Color to select (R)</NICK>
+<BLURB></BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-select0r::delta-b---i---i</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Delta B / I / I</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.2</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-select0r::delta-g---b---chroma</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Delta G / B / Chroma</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.2</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-select0r::delta-r---a---hue</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Delta R / A / Hue</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.2</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-select0r::edge-mode</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Edge mode</NICK>
+<BLURB></BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-select0r::invert-selection</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Invert selection</NICK>
+<BLURB></BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-select0r::operation</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Operation</NICK>
+<BLURB></BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-select0r::selection-subspace</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Selection subspace</NICK>
+<BLURB></BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-select0r::slope</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Slope</NICK>
+<BLURB></BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-select0r::subspace-shape</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Subspace shape</NICK>
+<BLURB></BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-rgbnoise::noise</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>noise</NICK>
+<BLURB>Amount of noise added.</BLURB>
+<DEFAULT>0.2</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-rgb-parade::mix</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>mix</NICK>
+<BLURB>The amount of source image mixed into background of display.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-rgb-parade::overlay-sides</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>overlay sides</NICK>
+<BLURB>If false, the sides of image are shown without overlay.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::alpha-trace</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Alpha trace</NICK>
+<BLURB>Show Alpha trace on scope.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::b-trace</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>B trace</NICK>
+<BLURB>Show B trace on scope.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::channel</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Channel</NICK>
+<BLURB>Channel to numerically display.</BLURB>
+<DEFAULT>0.375005</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::color</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Color</NICK>
+<BLURB>rec 601 or rec 709.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::crosshair-color</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Crosshair color</NICK>
+<BLURB>Color of the profile marker.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::display-average</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Display average</NICK>
+<BLURB>e.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::display-maximum</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Display maximum</NICK>
+<BLURB></BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::display-minimum</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Display minimum</NICK>
+<BLURB></BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::display-rms</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Display RMS</NICK>
+<BLURB></BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::g-trace</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>G trace</NICK>
+<BLURB>Show G trace on scope.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::length</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Length</NICK>
+<BLURB>Length of profile.</BLURB>
+<DEFAULT>0.589744</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::marker-1</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Marker 1</NICK>
+<BLURB>Position of marker 1.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::marker-2</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Marker 2</NICK>
+<BLURB>Position of marker 2.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::param-256-scale</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>256 scale</NICK>
+<BLURB>use 0-255 instead of 0.0-1.0.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::pb-trace</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Pb trace</NICK>
+<BLURB>Show Pb trace on scope.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::pr-trace</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Pr trace</NICK>
+<BLURB>Show Pr trace on scope.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::r-trace</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>R trace</NICK>
+<BLURB>Show R trace on scope.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::tilt</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Tilt</NICK>
+<BLURB>Tilt of profile.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::x</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>X</NICK>
+<BLURB>X position of profile.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::y</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Y</NICK>
+<BLURB>Y position of profile.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0file::y-trace</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Y trace</NICK>
+<BLURB>Show Y' trace on scope.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0be::big-window</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Big window</NICK>
+<BLURB>Display more data.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0be::measurement</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Measurement</NICK>
+<BLURB>What measurement to display.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0be::param-256-scale</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>256 scale</NICK>
+<BLURB>use 0-255 instead of 0.0-1.0.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0be::show-alpha</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Show alpha</NICK>
+<BLURB>Display alpha value too.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0be::x</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>X</NICK>
+<BLURB>X position of probe.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0be::x-size</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>X size</NICK>
+<BLURB>X size of probe.</BLURB>
+<DEFAULT>0.25</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0be::y</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Y</NICK>
+<BLURB>Y position of probe.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-pr0be::y-size</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Y size</NICK>
+<BLURB>Y size of probe.</BLURB>
+<DEFAULT>0.25</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-posterize::levels</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>levels</NICK>
+<BLURB>Number of values per channel.</BLURB>
+<DEFAULT>0.104167</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-ndvi-filter::color-map</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Color Map</NICK>
+<BLURB>The color map to use. One of 'earth', 'grayscale', 'heat' or 'rainbow'.</BLURB>
+<DEFAULT>"grayscale"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-ndvi-filter::index-calculation</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Index Calculation</NICK>
+<BLURB>The index calculation to use. One of 'ndvi' or 'vi'.</BLURB>
+<DEFAULT>"ndvi"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-ndvi-filter::legend</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Legend</NICK>
+<BLURB>Control legend display. One of 'off' or 'bottom'.</BLURB>
+<DEFAULT>"off"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-ndvi-filter::levels</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Levels</NICK>
+<BLURB>The number of color levels to use in the false image (divided by 1000).</BLURB>
+<DEFAULT>0.256</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-ndvi-filter::nir-channel</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>NIR Channel</NICK>
+<BLURB>The channel to use for the near-infrared component. One of 'r', 'g', or 'b'.</BLURB>
+<DEFAULT>"r"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-ndvi-filter::nir-offset</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>NIR Offset</NICK>
+<BLURB>An offset to be applied to the near-infrared component (mapped to [-100%, 100%].</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-ndvi-filter::nir-scale</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>NIR Scale</NICK>
+<BLURB>A scaling factor to be applied to the near-infrared component (divided by 10).</BLURB>
+<DEFAULT>0.1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-ndvi-filter::vis-offset</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>VIS Offset</NICK>
+<BLURB>An offset to be applied to the visible component (mapped to [-100%, 100%].</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-ndvi-filter::vis-scale</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>VIS Scale</NICK>
+<BLURB>A scaling factor to be applied to the visible component (divided by 10).</BLURB>
+<DEFAULT>0.1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-ndvi-filter::visible-channel</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Visible Channel</NICK>
+<BLURB>The channel to use for the visible component. One of 'r', 'g', or 'b'.</BLURB>
+<DEFAULT>"b"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-medians::size</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Size</NICK>
+<BLURB>Size for 'var size' type filter.</BLURB>
+<DEFAULT>0.1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-medians::type</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Type</NICK>
+<BLURB>Choose type of median: Cross5, Square3x3, Bilevel, Diamond3x3, Square5x5, Temp3, Temp5, ArceBI, ML3D, ML3dEX, VarSize.</BLURB>
+<DEFAULT>"Square3x3"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-light-graffiti::backgroundweight</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>backgroundWeight</NICK>
+<BLURB>Describes how strong the (accumulated) background should shine through.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-light-graffiti::blackreference</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>blackReference</NICK>
+<BLURB>Uses black as background image instead of the first frame.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-light-graffiti::dim</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>dim</NICK>
+<BLURB>Dimming of the light mask.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-light-graffiti::longalpha</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>longAlpha</NICK>
+<BLURB>Alpha value for moving average.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-light-graffiti::loweroverexposure</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>lowerOverexposure</NICK>
+<BLURB>Prevents some overexposure if the light source stays steady too long (varying speed).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-light-graffiti::nonlineardim</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>nonlinearDim</NICK>
+<BLURB>Nonlinear dimming (may look more natural).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-light-graffiti::reset</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>reset</NICK>
+<BLURB>Reset filter masks.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-light-graffiti::saturation</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>saturation</NICK>
+<BLURB>Saturation of lights.</BLURB>
+<DEFAULT>0.25</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-light-graffiti::sensitivity</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>sensitivity</NICK>
+<BLURB>Sensitivity of the effect for light (higher sensitivity will lead to brighter lights).</BLURB>
+<DEFAULT>0.2</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-light-graffiti::statsbrightness</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>statsBrightness</NICK>
+<BLURB>Display the brightness and threshold, for adjusting the brightness threshold parameter.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-light-graffiti::statsdifference</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>statsDifference</NICK>
+<BLURB>Display the background difference and threshold.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-light-graffiti::statsdiffsum</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>statsDiffSum</NICK>
+<BLURB>Display the sum of the background difference and the threshold.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-light-graffiti::thresholdbrightness</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>thresholdBrightness</NICK>
+<BLURB>Brightness threshold to distinguish between foreground and background.</BLURB>
+<DEFAULT>0.588235</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-light-graffiti::thresholddifference</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>thresholdDifference</NICK>
+<BLURB>Threshold: Difference to background to distinguish between fore- and background.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-light-graffiti::thresholddiffsum</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>thresholdDiffSum</NICK>
+<BLURB>Threshold for sum of differences. Can in most cases be ignored (set to 0).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-light-graffiti::transparentbackground</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>transparentBackground</NICK>
+<BLURB>Make the background transparent.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-keyspillm0pup::amount-1</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Amount 1</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.55</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-keyspillm0pup::amount-2</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Amount 2</NICK>
+<BLURB></BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-keyspillm0pup::hue-gate</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Hue gate</NICK>
+<BLURB>Restrict mask to hues close to key.</BLURB>
+<DEFAULT>0.25</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-keyspillm0pup::key-color-b</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Key color (B)</NICK>
+<BLURB>Key color that was used for chroma keying.</BLURB>
+<DEFAULT>0.1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-keyspillm0pup::key-color-g</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Key color (G)</NICK>
+<BLURB>Key color that was used for chroma keying.</BLURB>
+<DEFAULT>0.8</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-keyspillm0pup::key-color-r</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Key color (R)</NICK>
+<BLURB>Key color that was used for chroma keying.</BLURB>
+<DEFAULT>0.1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-keyspillm0pup::mask-to-alpha</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Mask to Alpha</NICK>
+<BLURB>Replace alpha channel with the mask.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-keyspillm0pup::mask-type</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Mask type</NICK>
+<BLURB>Which mask to apply [0,1,2,3].</BLURB>
+<DEFAULT>"0"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-keyspillm0pup::operation-1</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Operation 1</NICK>
+<BLURB>First operation 1 [0,1,2].</BLURB>
+<DEFAULT>"1"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-keyspillm0pup::operation-2</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Operation 2</NICK>
+<BLURB>Second operation 2 [0,1,2].</BLURB>
+<DEFAULT>"0"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-keyspillm0pup::saturation-threshold</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Saturation threshold</NICK>
+<BLURB>Restrict mask to saturated colors.</BLURB>
+<DEFAULT>0.15</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-keyspillm0pup::show-mask</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Show mask</NICK>
+<BLURB>Replace image with the mask.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-keyspillm0pup::slope</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Slope</NICK>
+<BLURB>Range of colors around the key where effect gradually decreases.</BLURB>
+<DEFAULT>0.4</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-keyspillm0pup::target-color-b</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Target color (B)</NICK>
+<BLURB>Desired color to replace key residue with.</BLURB>
+<DEFAULT>0.4</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-keyspillm0pup::target-color-g</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Target color (G)</NICK>
+<BLURB>Desired color to replace key residue with.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-keyspillm0pup::target-color-r</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Target color (R)</NICK>
+<BLURB>Desired color to replace key residue with.</BLURB>
+<DEFAULT>0.78</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-keyspillm0pup::tolerance</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Tolerance</NICK>
+<BLURB>Range of colors around the key, where effect is full strength.</BLURB>
+<DEFAULT>0.24</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-iir-blur::amount</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Amount</NICK>
+<BLURB>Amount of blur.</BLURB>
+<DEFAULT>0.2</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-iir-blur::edge</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Edge</NICK>
+<BLURB>Edge compensation.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-iir-blur::type</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Type</NICK>
+<BLURB>Blur type.</BLURB>
+<DEFAULT>0.333344</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-hqdn3d::spatial</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Spatial</NICK>
+<BLURB>Amount of spatial filtering.</BLURB>
+<DEFAULT>0.04</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-hqdn3d::temporal</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Temporal</NICK>
+<BLURB>Amount of temporal filtering.</BLURB>
+<DEFAULT>0.06</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-emboss::azimuth</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>azimuth</NICK>
+<BLURB>Light direction.</BLURB>
+<DEFAULT>0.375</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-emboss::elevation</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>elevation</NICK>
+<BLURB>Background lightness.</BLURB>
+<DEFAULT>0.333333</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-emboss::width45</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>width45</NICK>
+<BLURB>Bump height.</BLURB>
+<DEFAULT>0.25</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-dither::levels</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>levels</NICK>
+<BLURB>Number of values per channel.</BLURB>
+<DEFAULT>0.104167</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-dither::matrixid</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>matrixid</NICK>
+<BLURB>Id of matrix used for dithering.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-defish0r::amount</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Amount</NICK>
+<BLURB>Focal Ratio.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-defish0r::aspect-type</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Aspect type</NICK>
+<BLURB>Pixel aspect ratio presets.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-defish0r::defish</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>DeFish</NICK>
+<BLURB>Fish or Defish.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-defish0r::interpolator</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Interpolator</NICK>
+<BLURB>Quality of interpolation.</BLURB>
+<DEFAULT>0.166667</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-defish0r::manual-aspect</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Manual Aspect</NICK>
+<BLURB>Manual Pixel Aspect ratio.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-defish0r::manual-scale</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Manual Scale</NICK>
+<BLURB>Manual Scale.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-defish0r::scaling</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Scaling</NICK>
+<BLURB>Scaling method.</BLURB>
+<DEFAULT>0.666667</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-defish0r::type</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Type</NICK>
+<BLURB>Mapping function.</BLURB>
+<DEFAULT>0.666667</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-colortap::table</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>table</NICK>
+<BLURB>Lookup table used to filter colors. One of: xpro, sepia, heat, red_green, old_photo, xray, esses, yellow_blue.</BLURB>
+<DEFAULT>"esses"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-colorize::hue</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>hue</NICK>
+<BLURB>Color shade of the colorized image.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-colorize::lightness</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>lightness</NICK>
+<BLURB>Lightness of the colorized image.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-colorize::saturation</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>saturation</NICK>
+<BLURB>Amount of color in the colorized image.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-colorhalftone::cyan-angle</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>cyan angle</NICK>
+<BLURB>Cyan dots angle.</BLURB>
+<DEFAULT>0.3</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-colorhalftone::dot-radius</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>dot radius</NICK>
+<BLURB>Halftone pattern dot size.</BLURB>
+<DEFAULT>0.4</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-colorhalftone::magenta-angle</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>magenta angle</NICK>
+<BLURB>Magenta dots angle.</BLURB>
+<DEFAULT>0.45</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-colorhalftone::yellow-angle</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>yellow angle</NICK>
+<BLURB>Yellow dots angle.</BLURB>
+<DEFAULT>0.25</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-coloradj-rgb::action</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Action</NICK>
+<BLURB>Type of color adjustment.</BLURB>
+<DEFAULT>0.333344</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-coloradj-rgb::alpha-controlled</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Alpha controlled</NICK>
+<BLURB>Adjust only areas with nonzero alpha.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-coloradj-rgb::b</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>B</NICK>
+<BLURB>Amount of blue.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-coloradj-rgb::g</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>G</NICK>
+<BLURB>Amount of green.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-coloradj-rgb::keep-luma</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Keep luma</NICK>
+<BLURB>Don't change brightness.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-coloradj-rgb::luma-formula</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Luma formula</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.500025</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-coloradj-rgb::r</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>R</NICK>
+<BLURB>Amount of red.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-cairoimagegrid::columns</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>columns</NICK>
+<BLURB>Number of columns in the image grid. Input range 0 - 1 is interpreted as range 1 - 20.</BLURB>
+<DEFAULT>0.105263</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-cairoimagegrid::rows</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>rows</NICK>
+<BLURB>Number of rows in the image grid. Input range 0 - 1 is interpreted as range 1 - 20.</BLURB>
+<DEFAULT>0.105263</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-cairogradient::blend-mode</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>blend mode</NICK>
+<BLURB>Blend mode used to compose gradient on image. Accepted values: 'normal', 'add', 'saturate', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'colordodge', 'colorburn', 'hardlight', 'softlight', 'difference', 'exclusion', 'hslhue', 'hslsaturation', 'hslcolor', 'hslluminosity'.</BLURB>
+<DEFAULT>"normal"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-cairogradient::end-color-b</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>end color (B)</NICK>
+<BLURB>Second color of the gradient.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-cairogradient::end-color-g</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>end color (G)</NICK>
+<BLURB>Second color of the gradient.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-cairogradient::end-color-r</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>end color (R)</NICK>
+<BLURB>Second color of the gradient.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-cairogradient::end-opacity</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>end opacity</NICK>
+<BLURB>Opacity of the second color of the gradient.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-cairogradient::end-x</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>end x</NICK>
+<BLURB>X position of the end point of the gradient.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-cairogradient::end-y</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>end y</NICK>
+<BLURB>Y position of the end point of the gradient.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-cairogradient::offset</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>offset</NICK>
+<BLURB>Position of first color in the line connecting gradient ends, really useful only for radial gradient.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-cairogradient::pattern</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>pattern</NICK>
+<BLURB>Linear or radial gradient.</BLURB>
+<DEFAULT>"gradient_linear"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-cairogradient::start-color-b</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>start color (B)</NICK>
+<BLURB>First color of the gradient.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-cairogradient::start-color-g</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>start color (G)</NICK>
+<BLURB>First color of the gradient.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-cairogradient::start-color-r</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>start color (R)</NICK>
+<BLURB>First color of the gradient.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-cairogradient::start-opacity</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>start opacity</NICK>
+<BLURB>Opacity of the first color of the gradient.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-cairogradient::start-x</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>start x</NICK>
+<BLURB>X position of the start point of the gradient.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-cairogradient::start-y</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>start y</NICK>
+<BLURB>Y position of the start point of the gradient.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-c0rners::alpha-operation</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Alpha operation</NICK>
+<BLURB></BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-c0rners::corner-1-x</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Corner 1 X</NICK>
+<BLURB>X coordinate of corner 1.</BLURB>
+<DEFAULT>0.333333</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-c0rners::corner-1-y</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Corner 1 Y</NICK>
+<BLURB>Y coordinate of corner 1.</BLURB>
+<DEFAULT>0.333333</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-c0rners::corner-2-x</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Corner 2 X</NICK>
+<BLURB>X coordinate of corner 2.</BLURB>
+<DEFAULT>0.666666</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-c0rners::corner-2-y</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Corner 2 Y</NICK>
+<BLURB>Y coordinate of corner 2.</BLURB>
+<DEFAULT>0.333333</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-c0rners::corner-3-x</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Corner 3 X</NICK>
+<BLURB>X coordinate of corner 3.</BLURB>
+<DEFAULT>0.666666</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-c0rners::corner-3-y</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Corner 3 Y</NICK>
+<BLURB>Y coordinate of corner 3.</BLURB>
+<DEFAULT>0.666666</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-c0rners::corner-4-x</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Corner 4 X</NICK>
+<BLURB>X coordinate of corner 4.</BLURB>
+<DEFAULT>0.333333</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-c0rners::corner-4-y</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Corner 4 Y</NICK>
+<BLURB>Y coordinate of corner 4.</BLURB>
+<DEFAULT>0.666666</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-c0rners::enable-stretch</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Enable Stretch</NICK>
+<BLURB>Enable stretching.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-c0rners::feather-alpha</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Feather Alpha</NICK>
+<BLURB>Makes smooth transition into transparent.</BLURB>
+<DEFAULT>0.01</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-c0rners::interpolator</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Interpolator</NICK>
+<BLURB>Quality of interpolation.</BLURB>
+<DEFAULT>0.166667</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-c0rners::stretch-x</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Stretch X</NICK>
+<BLURB>Amount of stretching in X direction.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-c0rners::stretch-y</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Stretch Y</NICK>
+<BLURB>Amount of stretching in Y direction.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-c0rners::transparent-background</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Transparent Background</NICK>
+<BLURB>Makes background transparent.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alphaspot::max</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max</NICK>
+<BLURB></BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alphaspot::min</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Min</NICK>
+<BLURB></BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alphaspot::operation</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Operation</NICK>
+<BLURB></BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alphaspot::position-x</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Position X</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alphaspot::position-y</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Position Y</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alphaspot::shape</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Shape</NICK>
+<BLURB></BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alphaspot::size-x</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Size X</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alphaspot::size-y</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Size Y</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alphaspot::tilt</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Tilt</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alphaspot::transition-width</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Transition width</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.2</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alphagrad::max</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max</NICK>
+<BLURB></BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alphagrad::min</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Min</NICK>
+<BLURB></BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alphagrad::operation</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Operation</NICK>
+<BLURB></BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alphagrad::position</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Position</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alphagrad::tilt</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Tilt</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alphagrad::transition-width</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Transition width</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alpha0ps::display</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Display</NICK>
+<BLURB></BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alpha0ps::display-input-alpha</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Display input alpha</NICK>
+<BLURB></BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alpha0ps::invert</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Invert</NICK>
+<BLURB></BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alpha0ps::operation</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Operation</NICK>
+<BLURB></BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alpha0ps::shrink-grow-blur-amount</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Shrink/Grow/Blur amount</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.333344</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>frei0r-filter-alpha0ps::threshold</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Threshold</NICK>
+<BLURB></BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstKMSSink::connector-id</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= G_MAXULONG</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Connector ID</NICK>
+<BLURB>DRM connector id.</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstKMSSink::driver-name</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>device name</NICK>
+<BLURB>DRM device driver name.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstKMSSink::plane-id</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= G_MAXULONG</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Plane ID</NICK>
+<BLURB>DRM plane id.</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
<NAME>GstBs2b::fcut</NAME>
<TYPE>gint</TYPE>
<RANGE>[300,2000]</RANGE>
@@ -69380,3 +72160,393 @@
<DEFAULT>45</DEFAULT>
</ARG>
+<ARG>
+<NAME>GstWebrtcDsp::echo-cancel</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Echo Cancel</NICK>
+<BLURB>Enable or disable echo canceller, note that it will be disabled if no webrtcechoprobe has been found.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstWebrtcDsp::experimental-agc</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Experimental AGC</NICK>
+<BLURB>Enable or disable experimental automatic gain control.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstWebrtcDsp::extended-filter</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Extended Filter</NICK>
+<BLURB>Enable or disable the extended filter.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstWebrtcDsp::gain-control</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Gain Control</NICK>
+<BLURB>Enable or disable automatic digital gain control.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstWebrtcDsp::high-pass-filter</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>High Pass Filter</NICK>
+<BLURB>Enable or disable high pass filtering.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstWebrtcDsp::noise-suppression</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Noise Suppression</NICK>
+<BLURB>Enable or disable noise suppression.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstWebrtcDsp::probe</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Echo Probe</NICK>
+<BLURB>The name of the webrtcechoprobe element that record the audio being played through loud speakers. Must be set before PAUSED state.</BLURB>
+<DEFAULT>"webrtcechoprobe0"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstWebrtcDsp::echo-suppression-level</NAME>
+<TYPE>GstWebrtcEchoSuppressionLevel</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Echo Suppression Level</NICK>
+<BLURB>Controls the aggressiveness of the suppressor. A higher level trades off double-talk performance for increased echo suppression.</BLURB>
+<DEFAULT>Moderate Suppression</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstWebrtcDsp::noise-suppression-level</NAME>
+<TYPE>GstWebrtcNoiseSuppressionLevel</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Noise Suppression Level</NICK>
+<BLURB>Controls the aggressiveness of the suppression. Increasing the level will reduce the noise level at the expense of a higher speech distortion.</BLURB>
+<DEFAULT>Moderate Suppression</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstWebrtcDsp::delay-agnostic</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Delay Agnostic</NICK>
+<BLURB>Enable or disable the delay agnostic mode.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDC1394Src::dma</NAME>
+<TYPE>guint</TYPE>
+<RANGE>>= 1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>DMA ring buffer size</NICK>
+<BLURB>The number of frames in the Direct Memory Access ring buffer.</BLURB>
+<DEFAULT>10</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDC1394Src::guid</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Camera GUID</NICK>
+<BLURB>The hexadecimal representation of the GUID of the camera (use first camera available if null).</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDC1394Src::iso</NAME>
+<TYPE>GstDC1394ISOSpeed</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>ISO bandwidth</NICK>
+<BLURB>The ISO bandwidth in Mbps.</BLURB>
+<DEFAULT>DC1394 ISO speed 400</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDC1394Src::unit</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= G_MAXULONG</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Camera unit</NICK>
+<BLURB>The unit number of the camera (-1 if no unit number is used).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTimeCodeWait::target-timecode</NAME>
+<TYPE>GstVideoTimeCode*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Target timecode (object)</NICK>
+<BLURB>Timecode to wait for (object).</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTimeCodeWait::target-timecode-string</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Target timecode (string)</NICK>
+<BLURB>Timecode to wait for (string). Must take the form 00:00:00:00.</BLURB>
+<DEFAULT>"00:00:00:00"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTimeCodeStamper::daily-jam</NAME>
+<TYPE>GDateTime*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Daily jam</NICK>
+<BLURB>The daily jam of the timecode.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTimeCodeStamper::drop-frame</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Override existing timecode</NICK>
+<BLURB>Use drop-frame timecodes for 29.97 and 59.94 FPS.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTimeCodeStamper::override-existing</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Override existing timecode</NICK>
+<BLURB>If set to true, any existing timecode will be overridden.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTimeCodeStamper::source-clock</NAME>
+<TYPE>GstClock*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Source clock to use for first timecode</NICK>
+<BLURB>If unset, the timecode will refer to the stream time.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstRawVideoParse::format</NAME>
+<TYPE>GstVideoFormat</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Format</NICK>
+<BLURB>Format of frames in raw stream.</BLURB>
+<DEFAULT>GST_VIDEO_FORMAT_I420</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstRawVideoParse::frame-stride</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Frame stride</NICK>
+<BLURB>Stride between whole frames (0 = frames are tightly packed together).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstRawVideoParse::framerate</NAME>
+<TYPE>GstFraction</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Frame rate</NICK>
+<BLURB>Rate of frames in raw stream.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstRawVideoParse::height</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Height</NICK>
+<BLURB>Height of frames in raw stream.</BLURB>
+<DEFAULT>240</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstRawVideoParse::interlaced</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Interlaced flag</NICK>
+<BLURB>True if frames in raw stream are interlaced.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstRawVideoParse::pixel-aspect-ratio</NAME>
+<TYPE>GstFraction</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Pixel aspect ratio</NICK>
+<BLURB>Pixel aspect ratio of frames in raw stream.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstRawVideoParse::plane-offsets</NAME>
+<TYPE>GValueArray*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Plane offsets</NICK>
+<BLURB>Offsets of the planets in bytes.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstRawVideoParse::plane-strides</NAME>
+<TYPE>GValueArray*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Plane strides</NICK>
+<BLURB>Strides of the planets in bytes.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstRawVideoParse::top-field-first</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Top field first</NICK>
+<BLURB>True if top field in frames in raw stream come first (not used if frames aren't interlaced).</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstRawVideoParse::width</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Width</NICK>
+<BLURB>Width of frames in raw stream.</BLURB>
+<DEFAULT>320</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstRawAudioParse::channel-positions</NAME>
+<TYPE>GValueArray*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Channel positions</NICK>
+<BLURB>Channel positions used on the output.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstRawAudioParse::format</NAME>
+<TYPE>GstRawAudioParseFormat</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Format</NICK>
+<BLURB>Format of the raw audio stream.</BLURB>
+<DEFAULT>PCM</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstRawAudioParse::interleaved</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Interleaved layout</NICK>
+<BLURB>True if audio has interleaved layout.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstRawAudioParse::num-channels</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Number of channels</NICK>
+<BLURB>Number of channels in raw stream.</BLURB>
+<DEFAULT>2</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstRawAudioParse::pcm-format</NAME>
+<TYPE>GstAudioFormat</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>PCM format</NICK>
+<BLURB>Format of audio samples in PCM stream (ignored if format property is not set to pcm).</BLURB>
+<DEFAULT>GST_AUDIO_FORMAT_UNKNOWN</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstRawAudioParse::sample-rate</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Sample rate</NICK>
+<BLURB>Rate of audio samples in raw stream.</BLURB>
+<DEFAULT>44100</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQtSrc::use-default-fbo</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>If use default fbo</NICK>
+<BLURB>When set TRUE, it will not create new fbo for qml render thread.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQtSrc::window</NAME>
+<TYPE>gpointer</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>QQuickWindow</NICK>
+<BLURB>The QQuickWindow to place in the object heirachy.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFdkAacEnc::bitrate</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Bitrate</NICK>
+<BLURB>Target Audio Bitrate (0 = fixed value based on sample rate and channel count).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
diff --git a/docs/plugins/gst-plugins-bad-plugins.hierarchy b/docs/plugins/gst-plugins-bad-plugins.hierarchy
index c961f7f..2a879f1 100644
--- a/docs/plugins/gst-plugins-bad-plugins.hierarchy
+++ b/docs/plugins/gst-plugins-bad-plugins.hierarchy
@@ -36,12 +36,14 @@
ADPCMDec
GstDtsDec
GstFaad
+ GstFdkAacDec
GstGSMDec
GstSbcDec
GstSirenDec
GstAudioEncoder
ADPCMEnc
GstFaac
+ GstFdkAacEnc
GstGSMEnc
GstSbcEnc
GstSirenEnc
@@ -60,11 +62,15 @@
GstH265Parse
GstIRTSPParse
GstIvfParse
+ GstJPEG2000Parse
GstJpegParse
GstMpeg4VParse
GstMpegvParse
GstOpusParse
GstPngParse
+ GstRawBaseParse
+ GstRawAudioParse
+ GstRawVideoParse
GstVC1Parse
GstBaseSink
GstAudioBaseSink
@@ -108,11 +114,13 @@
GstAudioBaseSrc
GstAudioSrc
GstOpenalSrc
+ GstDC1394Src
GstDecklinkAudioSrc
GstDecklinkVideoSrc
GstDvbSrc
GstGLTestSrc
GstMMS
+ GstQtSrc
GstRTMPSrc
GstRfbSrc
GstShmSrc
@@ -136,6 +144,8 @@
ladspa-sine-so-sine-fcaa
GstOFA
GstStereo
+ GstWebrtcDsp
+ GstWebrtcEchoProbe
GstBayer2RGB
GstDebugSpy
GstDtmfDetect
@@ -179,6 +189,7 @@
GstIvtc
GstRGB2Bayer
GstRemoveSilence
+ GstTimeCodeStamper
GstVideoFilter
GstBurn
GstChromaHold
@@ -222,7 +233,6 @@
GstHanddetect
GstMotioncells
GstOpencvTextOverlay
- GstPyramidSegment
GstSkinDetect
GstTemplateMatch
GstRetinex
@@ -246,6 +256,7 @@
GstDashDemux
GstHLSDemux
GstMssDemux
+ GstAudioParse
GstAutoConvert
GstAutoVideoConvert
GstBaseCameraSrc
@@ -265,6 +276,10 @@
GstPipeline
GstCameraBin
GstSDPDemux
+ GstSdpSrc
+ GstUnalignedAudioParse
+ GstUnalignedVideoParse
+ GstVideoParse
GstViewfinderBin
RsnDvdBin
GstBz2dec
@@ -300,14 +315,12 @@
GstMpeg2enc
GstMpegPSDemux
GstMplex
+ GstMusepackDec
GstNetSim
GstPcapParse
GstPitch
GstRTPBasePayload
GstRtpAsfPay
- GstRawParse
- GstAudioParse
- GstVideoParse
GstRtpOnvifParse
GstRtpOnvifTimestamp
GstSFDec
@@ -322,6 +335,7 @@
GstTagMux
GstId3Mux
GstTeletextDec
+ GstTimeCodeWait
GstUvcH264MjpgDemux
GstVideoDecoder
GstLibde265Dec
diff --git a/docs/plugins/gst-plugins-bad-plugins.interfaces b/docs/plugins/gst-plugins-bad-plugins.interfaces
index d8aedb8..53b47ca 100644
--- a/docs/plugins/gst-plugins-bad-plugins.interfaces
+++ b/docs/plugins/gst-plugins-bad-plugins.interfaces
@@ -8,6 +8,7 @@
GstAudioEncoder GstPreset
GstAudioInterleave GstChildProxy
GstAudioMixer GstChildProxy
+GstAudioParse GstChildProxy
GstAutoConvert GstChildProxy
GstAutoVideoConvert GstChildProxy
GstBaseCameraSrc GstChildProxy
@@ -32,6 +33,7 @@
GstFPSDisplaySink GstChildProxy
GstFaac GstPreset
GstFaceOverlay GstChildProxy
+GstFdkAacEnc GstPreset
GstFreeverb GstPreset
GstGLBaseMixer GstChildProxy
GstGLColorBalance GstColorBalance
@@ -78,14 +80,18 @@
GstSDPDemux GstChildProxy
GstSbcEnc GstPreset
GstSchroEnc GstPreset
+GstSdpSrc GstChildProxy GstURIHandler
GstSirenEnc GstPreset
GstTagMux GstTagSetter
+GstUnalignedAudioParse GstChildProxy
+GstUnalignedVideoParse GstChildProxy
GstUvcH264Src GstChildProxy
GstVCDSrc GstURIHandler
GstVP8Enc GstPreset GstTagSetter
GstVP8Enc GstTagSetter GstPreset
GstVideoAggregator GstChildProxy
GstVideoEncoder GstPreset
+GstVideoParse GstChildProxy
GstViewfinderBin GstChildProxy
GstVoAacEnc GstPreset
GstVoAmrWbEnc GstPreset
diff --git a/docs/plugins/html/ch01.html b/docs/plugins/html/ch01.html
index db8e432..1c001f7 100644
--- a/docs/plugins/html/ch01.html
+++ b/docs/plugins/html/ch01.html
@@ -42,6 +42,9 @@
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-audiomixer.html">audiomixer</a></span><span class="refpurpose"></span>
</dt>
<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-audioparse.html">audioparse</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-autoconvert.html">autoconvert</a></span><span class="refpurpose"></span>
</dt>
<dt>
@@ -99,7 +102,7 @@
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-dodge.html">dodge</a></span><span class="refpurpose"></span>
</dt>
<dt>
-<span class="refentrytitle"><a href="gst-plugins-bad-plugins-dtmfdetect.html">dtmfdetect</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-dtmfdetect.html">dtmfdetect</a></span><span class="refpurpose"> — Detects DTMF tones</span>
</dt>
<dt>
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-dtsdec.html">dtsdec</a></span><span class="refpurpose"></span>
@@ -141,6 +144,144 @@
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gaussianblur.html">gaussianblur</a></span><span class="refpurpose"></span>
</dt>
<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glcolorbalance.html">glcolorbalance</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glcolorconvert.html">glcolorconvert</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glcolorscale.html">glcolorscale</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gldeinterlace.html">gldeinterlace</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gldifferencematte.html">gldifferencematte</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gldownload.html">gldownload</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-blur.html">gleffects_blur</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-bulge.html">gleffects_bulge</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-fisheye.html">gleffects_fisheye</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-glow.html">gleffects_glow</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-heat.html">gleffects_heat</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-identity.html">gleffects_identity</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-laplacian.html">gleffects_laplacian</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-lumaxpro.html">gleffects_lumaxpro</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-mirror.html">gleffects_mirror</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-sepia.html">gleffects_sepia</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-sin.html">gleffects_sin</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-sobel.html">gleffects_sobel</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-square.html">gleffects_square</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-squeeze.html">gleffects_squeeze</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-stretch.html">gleffects_stretch</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-tunnel.html">gleffects_tunnel</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-twirl.html">gleffects_twirl</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects.html">gleffects</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-xpro.html">gleffects_xpro</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-xray.html">gleffects_xray</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glfilterapp.html">glfilterapp</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glfilterbin.html">glfilterbin</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glfiltercube.html">glfiltercube</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glfilterglass.html">glfilterglass</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glimagesinkelement.html">glimagesinkelement</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glimagesink.html">glimagesink</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glmixerbin.html">glmixerbin</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glmosaic.html">glmosaic</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gloverlay.html">gloverlay</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glshader.html">glshader</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glsinkbin.html">glsinkbin</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glsrcbin.html">glsrcbin</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glstereomix.html">glstereomix</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glstereosplit.html">glstereosplit</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gltestsrc.html">gltestsrc</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gltransformation.html">gltransformation</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glupload.html">glupload</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glvideomixerelement.html">glvideomixerelement</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glvideomixer.html">glvideomixer</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glviewconvert.html">glviewconvert</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-jpegparse.html">jpegparse</a></span><span class="refpurpose"> — JPEG parser</span>
</dt>
<dt>
@@ -183,10 +324,10 @@
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-ofa.html">ofa</a></span><span class="refpurpose"></span>
</dt>
<dt>
-<span class="refentrytitle"><a href="gst-plugins-bad-plugins-openalsrc.html">openalsrc</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-openalsrc.html">openalsrc</a></span><span class="refpurpose"> — capture raw audio samples through OpenAL</span>
</dt>
<dt>
-<span class="refentrytitle"><a href="gst-plugins-bad-plugins-openalsink.html">openalsink</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-openalsink.html">openalsink</a></span><span class="refpurpose"> — capture raw audio samples through OpenAL</span>
</dt>
<dt>
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-pcapparse.html">pcapparse</a></span><span class="refpurpose"></span>
@@ -195,7 +336,10 @@
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-pinch.html">pinch</a></span><span class="refpurpose"></span>
</dt>
<dt>
-<span class="refentrytitle"><a href="gst-plugins-bad-plugins-pyramidsegment.html">pyramidsegment</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-rawaudioparse.html">rawaudioparse</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-rawvideoparse.html">rawvideoparse</a></span><span class="refpurpose"></span>
</dt>
<dt>
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-rfbsrc.html">rfbsrc</a></span><span class="refpurpose"></span>
@@ -252,6 +396,12 @@
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-twirl.html">twirl</a></span><span class="refpurpose"></span>
</dt>
<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-unalignedaudioparse.html">unalignedaudioparse</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-unalignedvideoparse.html">unalignedvideoparse</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-videoparse.html">videoparse</a></span><span class="refpurpose"></span>
</dt>
<dt>
@@ -269,6 +419,12 @@
<dt>
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-wavescope.html">wavescope</a></span><span class="refpurpose"></span>
</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-webrtcdsp.html">webrtcdsp</a></span><span class="refpurpose"> — Audio Filter using WebRTC Audio Processing library</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-webrtcechoprobe.html">webrtcechoprobe</a></span><span class="refpurpose"></span>
+</dt>
</dl></div>
</div>
<div class="footer">
diff --git a/docs/plugins/html/ch02.html b/docs/plugins/html/ch02.html
index e4a6f00..276d2eb 100644
--- a/docs/plugins/html/ch02.html
+++ b/docs/plugins/html/ch02.html
@@ -6,7 +6,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
-<link rel="prev" href="gst-plugins-bad-plugins-wavescope.html" title="wavescope">
+<link rel="prev" href="gst-plugins-bad-plugins-webrtcechoprobe.html" title="webrtcechoprobe">
<link rel="next" href="gst-plugins-bad-plugins-plugin-aiff.html" title="aiff">
<meta name="generator" content="GTK-Doc V1.25 (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><img src="up-insensitive.png" width="16" height="16" border="0"></td>
-<td><a accesskey="p" href="gst-plugins-bad-plugins-wavescope.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-webrtcechoprobe.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-aiff.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
</tr></table>
<div class="chapter">
@@ -123,6 +123,9 @@
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-plugin-openal.html">openal</a></span><span class="refpurpose"> — OpenAL plugin library</span>
</dt>
<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-plugin-opengl.html">opengl</a></span><span class="refpurpose"> — OpenGL plugin</span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-plugin-opencv.html">opencv</a></span><span class="refpurpose"> — GStreamer OpenCV Plugins</span>
</dt>
<dt>
@@ -156,6 +159,9 @@
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-plugin-voamrwbenc.html">voamrwbenc</a></span><span class="refpurpose"> — Adaptive Multi-Rate Wide-Band Encoder</span>
</dt>
<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-plugin-webrtcdsp.html">webrtcdsp</a></span><span class="refpurpose"> — Voice pre-processing using WebRTC Audio Processing Library</span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-plugin-zbar.html">zbar</a></span><span class="refpurpose"> — zbar barcode scanner</span>
</dt>
</dl></div>
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 3db072a..0741f2b 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-1.0.devhelp2
+++ b/docs/plugins/html/gst-plugins-bad-plugins-1.0.devhelp2
@@ -8,6 +8,7 @@
<sub name="assrender" link="gst-plugins-bad-plugins-assrender.html"/>
<sub name="audiointerleave" link="gst-plugins-bad-plugins-audiointerleave.html"/>
<sub name="audiomixer" link="gst-plugins-bad-plugins-audiomixer.html"/>
+ <sub name="audioparse" link="gst-plugins-bad-plugins-audioparse.html"/>
<sub name="autoconvert" link="gst-plugins-bad-plugins-autoconvert.html"/>
<sub name="bs2b" link="gst-plugins-bad-plugins-bs2b.html"/>
<sub name="bulge" link="gst-plugins-bad-plugins-bulge.html"/>
@@ -41,6 +42,52 @@
<sub name="fisheye" link="gst-plugins-bad-plugins-fisheye.html"/>
<sub name="fpsdisplaysink" link="gst-plugins-bad-plugins-fpsdisplaysink.html"/>
<sub name="gaussianblur" link="gst-plugins-bad-plugins-gaussianblur.html"/>
+ <sub name="glcolorbalance" link="gst-plugins-bad-plugins-glcolorbalance.html"/>
+ <sub name="glcolorconvert" link="gst-plugins-bad-plugins-glcolorconvert.html"/>
+ <sub name="glcolorscale" link="gst-plugins-bad-plugins-glcolorscale.html"/>
+ <sub name="gldeinterlace" link="gst-plugins-bad-plugins-gldeinterlace.html"/>
+ <sub name="gldifferencematte" link="gst-plugins-bad-plugins-gldifferencematte.html"/>
+ <sub name="gldownload" link="gst-plugins-bad-plugins-gldownload.html"/>
+ <sub name="gleffects_blur" link="gst-plugins-bad-plugins-gleffects-blur.html"/>
+ <sub name="gleffects_bulge" link="gst-plugins-bad-plugins-gleffects-bulge.html"/>
+ <sub name="gleffects_fisheye" link="gst-plugins-bad-plugins-gleffects-fisheye.html"/>
+ <sub name="gleffects_glow" link="gst-plugins-bad-plugins-gleffects-glow.html"/>
+ <sub name="gleffects_heat" link="gst-plugins-bad-plugins-gleffects-heat.html"/>
+ <sub name="gleffects_identity" link="gst-plugins-bad-plugins-gleffects-identity.html"/>
+ <sub name="gleffects_laplacian" link="gst-plugins-bad-plugins-gleffects-laplacian.html"/>
+ <sub name="gleffects_lumaxpro" link="gst-plugins-bad-plugins-gleffects-lumaxpro.html"/>
+ <sub name="gleffects_mirror" link="gst-plugins-bad-plugins-gleffects-mirror.html"/>
+ <sub name="gleffects_sepia" link="gst-plugins-bad-plugins-gleffects-sepia.html"/>
+ <sub name="gleffects_sin" link="gst-plugins-bad-plugins-gleffects-sin.html"/>
+ <sub name="gleffects_sobel" link="gst-plugins-bad-plugins-gleffects-sobel.html"/>
+ <sub name="gleffects_square" link="gst-plugins-bad-plugins-gleffects-square.html"/>
+ <sub name="gleffects_squeeze" link="gst-plugins-bad-plugins-gleffects-squeeze.html"/>
+ <sub name="gleffects_stretch" link="gst-plugins-bad-plugins-gleffects-stretch.html"/>
+ <sub name="gleffects_tunnel" link="gst-plugins-bad-plugins-gleffects-tunnel.html"/>
+ <sub name="gleffects_twirl" link="gst-plugins-bad-plugins-gleffects-twirl.html"/>
+ <sub name="gleffects" link="gst-plugins-bad-plugins-gleffects.html"/>
+ <sub name="gleffects_xpro" link="gst-plugins-bad-plugins-gleffects-xpro.html"/>
+ <sub name="gleffects_xray" link="gst-plugins-bad-plugins-gleffects-xray.html"/>
+ <sub name="glfilterapp" link="gst-plugins-bad-plugins-glfilterapp.html"/>
+ <sub name="glfilterbin" link="gst-plugins-bad-plugins-glfilterbin.html"/>
+ <sub name="glfiltercube" link="gst-plugins-bad-plugins-glfiltercube.html"/>
+ <sub name="glfilterglass" link="gst-plugins-bad-plugins-glfilterglass.html"/>
+ <sub name="glimagesinkelement" link="gst-plugins-bad-plugins-glimagesinkelement.html"/>
+ <sub name="glimagesink" link="gst-plugins-bad-plugins-glimagesink.html"/>
+ <sub name="glmixerbin" link="gst-plugins-bad-plugins-glmixerbin.html"/>
+ <sub name="glmosaic" link="gst-plugins-bad-plugins-glmosaic.html"/>
+ <sub name="gloverlay" link="gst-plugins-bad-plugins-gloverlay.html"/>
+ <sub name="glshader" link="gst-plugins-bad-plugins-glshader.html"/>
+ <sub name="glsinkbin" link="gst-plugins-bad-plugins-glsinkbin.html"/>
+ <sub name="glsrcbin" link="gst-plugins-bad-plugins-glsrcbin.html"/>
+ <sub name="glstereomix" link="gst-plugins-bad-plugins-glstereomix.html"/>
+ <sub name="glstereosplit" link="gst-plugins-bad-plugins-glstereosplit.html"/>
+ <sub name="gltestsrc" link="gst-plugins-bad-plugins-gltestsrc.html"/>
+ <sub name="gltransformation" link="gst-plugins-bad-plugins-gltransformation.html"/>
+ <sub name="glupload" link="gst-plugins-bad-plugins-glupload.html"/>
+ <sub name="glvideomixerelement" link="gst-plugins-bad-plugins-glvideomixerelement.html"/>
+ <sub name="glvideomixer" link="gst-plugins-bad-plugins-glvideomixer.html"/>
+ <sub name="glviewconvert" link="gst-plugins-bad-plugins-glviewconvert.html"/>
<sub name="jpegparse" link="gst-plugins-bad-plugins-jpegparse.html"/>
<sub name="kaleidoscope" link="gst-plugins-bad-plugins-kaleidoscope.html"/>
<sub name="liveadder" link="gst-plugins-bad-plugins-liveadder.html"/>
@@ -59,7 +106,8 @@
<sub name="openalsink" link="gst-plugins-bad-plugins-openalsink.html"/>
<sub name="pcapparse" link="gst-plugins-bad-plugins-pcapparse.html"/>
<sub name="pinch" link="gst-plugins-bad-plugins-pinch.html"/>
- <sub name="pyramidsegment" link="gst-plugins-bad-plugins-pyramidsegment.html"/>
+ <sub name="rawaudioparse" link="gst-plugins-bad-plugins-rawaudioparse.html"/>
+ <sub name="rawvideoparse" link="gst-plugins-bad-plugins-rawvideoparse.html"/>
<sub name="rfbsrc" link="gst-plugins-bad-plugins-rfbsrc.html"/>
<sub name="rtmpsink" link="gst-plugins-bad-plugins-rtmpsink.html"/>
<sub name="rtmpsrc" link="gst-plugins-bad-plugins-rtmpsrc.html"/>
@@ -78,12 +126,16 @@
<sub name="opencvtextoverlay" link="gst-plugins-bad-plugins-opencvtextoverlay.html"/>
<sub name="tunnel" link="gst-plugins-bad-plugins-tunnel.html"/>
<sub name="twirl" link="gst-plugins-bad-plugins-twirl.html"/>
+ <sub name="unalignedaudioparse" link="gst-plugins-bad-plugins-unalignedaudioparse.html"/>
+ <sub name="unalignedvideoparse" link="gst-plugins-bad-plugins-unalignedvideoparse.html"/>
<sub name="videoparse" link="gst-plugins-bad-plugins-videoparse.html"/>
<sub name="waterripple" link="gst-plugins-bad-plugins-waterripple.html"/>
<sub name="zbar" link="gst-plugins-bad-plugins-zbar.html"/>
<sub name="voaacenc" link="gst-plugins-bad-plugins-voaacenc.html"/>
<sub name="voamrwbenc" link="gst-plugins-bad-plugins-voamrwbenc.html"/>
<sub name="wavescope" link="gst-plugins-bad-plugins-wavescope.html"/>
+ <sub name="webrtcdsp" link="gst-plugins-bad-plugins-webrtcdsp.html"/>
+ <sub name="webrtcechoprobe" link="gst-plugins-bad-plugins-webrtcechoprobe.html"/>
</sub>
<sub name="gst-plugins-bad Plugins" link="ch02.html">
<sub name="aiff" link="gst-plugins-bad-plugins-plugin-aiff.html"/>
@@ -119,6 +171,7 @@
<sub name="neon" link="gst-plugins-bad-plugins-plugin-neon.html"/>
<sub name="ofa" link="gst-plugins-bad-plugins-plugin-ofa.html"/>
<sub name="openal" link="gst-plugins-bad-plugins-plugin-openal.html"/>
+ <sub name="opengl" link="gst-plugins-bad-plugins-plugin-opengl.html"/>
<sub name="opencv" link="gst-plugins-bad-plugins-plugin-opencv.html"/>
<sub name="pcapparse" link="gst-plugins-bad-plugins-plugin-pcapparse.html"/>
<sub name="rawparse" link="gst-plugins-bad-plugins-plugin-rawparse.html"/>
@@ -130,6 +183,7 @@
<sub name="speed" link="gst-plugins-bad-plugins-plugin-speed.html"/>
<sub name="voaacenc" link="gst-plugins-bad-plugins-plugin-voaacenc.html"/>
<sub name="voamrwbenc" link="gst-plugins-bad-plugins-plugin-voamrwbenc.html"/>
+ <sub name="webrtcdsp" link="gst-plugins-bad-plugins-plugin-webrtcdsp.html"/>
<sub name="zbar" link="gst-plugins-bad-plugins-plugin-zbar.html"/>
</sub>
</chapters>
@@ -152,6 +206,18 @@
<keyword type="property" name="The “discont-wait” property" link="gst-plugins-bad-plugins-audiomixer.html#GstAudioMixer--discont-wait"/>
<keyword type="property" name="The “blocksize” property" link="gst-plugins-bad-plugins-audiomixer.html#GstAudioMixer--blocksize"/>
<keyword type="property" name="The “output-buffer-duration” property" link="gst-plugins-bad-plugins-audiomixer.html#GstAudioMixer--output-buffer-duration"/>
+ <keyword type="struct" name="struct GstAudioParse" link="gst-plugins-bad-plugins-audioparse.html#GstAudioParse-struct"/>
+ <keyword type="property" name="The “channels” property" link="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--channels"/>
+ <keyword type="property" name="The “depth” property" link="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--depth"/>
+ <keyword type="property" name="The “endianness” property" link="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--endianness"/>
+ <keyword type="property" name="The “format” property" link="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--format"/>
+ <keyword type="property" name="The “rate” property" link="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--rate"/>
+ <keyword type="property" name="The “signed” property" link="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--signed"/>
+ <keyword type="property" name="The “width” property" link="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--width"/>
+ <keyword type="property" name="The “channel-positions” property" link="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--channel-positions"/>
+ <keyword type="property" name="The “interleaved” property" link="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--interleaved"/>
+ <keyword type="property" name="The “raw-format” property" link="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--raw-format"/>
+ <keyword type="property" name="The “use-sink-caps” property" link="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--use-sink-caps"/>
<keyword type="struct" name="struct GstAutoConvert" link="gst-plugins-bad-plugins-autoconvert.html#GstAutoConvert-struct"/>
<keyword type="property" name="The “factories” property" link="gst-plugins-bad-plugins-autoconvert.html#GstAutoConvert--factories"/>
<keyword type="property" name="The “initial-identity” property" link="gst-plugins-bad-plugins-autoconvert.html#GstAutoConvert--initial-identity"/>
@@ -163,6 +229,7 @@
<keyword type="struct" name="struct GstBurn" link="gst-plugins-bad-plugins-burn.html#GstBurn-struct"/>
<keyword type="property" name="The “silent” property" link="gst-plugins-bad-plugins-burn.html#GstBurn--silent"/>
<keyword type="property" name="The “adjustment” property" link="gst-plugins-bad-plugins-burn.html#GstBurn--adjustment"/>
+ <keyword type="struct" name="struct GstChromium" link="gst-plugins-bad-plugins-chromium.html#GstChromium-struct"/>
<keyword type="property" name="The “silent” property" link="gst-plugins-bad-plugins-chromium.html#GstChromium--silent"/>
<keyword type="property" name="The “edge-a” property" link="gst-plugins-bad-plugins-chromium.html#GstChromium--edge-a"/>
<keyword type="property" name="The “edge-b” property" link="gst-plugins-bad-plugins-chromium.html#GstChromium--edge-b"/>
@@ -171,7 +238,10 @@
<keyword type="property" name="The “height” property" link="gst-plugins-bad-plugins-circle.html#GstCircle--height"/>
<keyword type="property" name="The “spread-angle” property" link="gst-plugins-bad-plugins-circle.html#GstCircle--spread-angle"/>
<keyword type="struct" name="struct GstColorEffects" link="gst-plugins-bad-plugins-coloreffects.html#GstColorEffects-struct"/>
+ <keyword type="enum" name="enum GstColorEffectsPreset" link="gst-plugins-bad-plugins-coloreffects.html#GstColorEffectsPreset"/>
<keyword type="property" name="The “preset” property" link="gst-plugins-bad-plugins-coloreffects.html#GstColorEffects--preset"/>
+ <keyword type="struct" name="struct GstCompositor" link="gst-plugins-bad-plugins-compositor.html#GstCompositor-struct"/>
+ <keyword type="enum" name="enum GstCompositorBackground" link="gst-plugins-bad-plugins-compositor.html#GstCompositorBackground"/>
<keyword type="property" name="The “background” property" link="gst-plugins-bad-plugins-compositor.html#GstCompositor--background"/>
<keyword type="struct" name="struct GstCvDilate" link="gst-plugins-bad-plugins-cvdilate.html#GstCvDilate-struct"/>
<keyword type="struct" name="struct GstCvErode" link="gst-plugins-bad-plugins-cverode.html#GstCvErode-struct"/>
@@ -269,6 +339,11 @@
<keyword type="struct" name="struct GstExclusion" link="gst-plugins-bad-plugins-exclusion.html#GstExclusion-struct"/>
<keyword type="property" name="The “silent” property" link="gst-plugins-bad-plugins-exclusion.html#GstExclusion--silent"/>
<keyword type="property" name="The “factor” property" link="gst-plugins-bad-plugins-exclusion.html#GstExclusion--factor"/>
+ <keyword type="struct" name="struct GstEdgeDetect" link="gst-plugins-bad-plugins-edgedetect.html#GstEdgeDetect-struct"/>
+ <keyword type="property" name="The “aperture” property" link="gst-plugins-bad-plugins-edgedetect.html#GstEdgeDetect--aperture"/>
+ <keyword type="property" name="The “mask” property" link="gst-plugins-bad-plugins-edgedetect.html#GstEdgeDetect--mask"/>
+ <keyword type="property" name="The “threshold1” property" link="gst-plugins-bad-plugins-edgedetect.html#GstEdgeDetect--threshold1"/>
+ <keyword type="property" name="The “threshold2” property" link="gst-plugins-bad-plugins-edgedetect.html#GstEdgeDetect--threshold2"/>
<keyword type="struct" name="struct GstFaac" link="gst-plugins-bad-plugins-faac.html#GstFaac-struct"/>
<keyword type="property" name="The “bitrate” property" link="gst-plugins-bad-plugins-faac.html#GstFaac--bitrate"/>
<keyword type="property" name="The “midside” property" link="gst-plugins-bad-plugins-faac.html#GstFaac--midside"/>
@@ -279,6 +354,27 @@
<keyword type="property" name="The “quality” property" link="gst-plugins-bad-plugins-faac.html#GstFaac--quality"/>
<keyword type="property" name="The “rate-control” property" link="gst-plugins-bad-plugins-faac.html#GstFaac--rate-control"/>
<keyword type="struct" name="GstFaad" link="gst-plugins-bad-plugins-faad.html#GstFaad-struct"/>
+ <keyword type="struct" name="struct GstFaceBlur" link="gst-plugins-bad-plugins-faceblur.html#GstFaceBlur-struct"/>
+ <keyword type="property" name="The “profile” property" link="gst-plugins-bad-plugins-faceblur.html#GstFaceBlur--profile"/>
+ <keyword type="property" name="The “flags” property" link="gst-plugins-bad-plugins-faceblur.html#GstFaceBlur--flags"/>
+ <keyword type="property" name="The “min-neighbors” property" link="gst-plugins-bad-plugins-faceblur.html#GstFaceBlur--min-neighbors"/>
+ <keyword type="property" name="The “min-size-height” property" link="gst-plugins-bad-plugins-faceblur.html#GstFaceBlur--min-size-height"/>
+ <keyword type="property" name="The “min-size-width” property" link="gst-plugins-bad-plugins-faceblur.html#GstFaceBlur--min-size-width"/>
+ <keyword type="property" name="The “scale-factor” property" link="gst-plugins-bad-plugins-faceblur.html#GstFaceBlur--scale-factor"/>
+ <keyword type="struct" name="struct GstFaceDetect" link="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect-struct"/>
+ <keyword type="enum" name="enum GstFaceDetectUpdates" link="gst-plugins-bad-plugins-facedetect.html#GstFaceDetectUpdates"/>
+ <keyword type="property" name="The “display” property" link="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--display"/>
+ <keyword type="property" name="The “eyes-profile” property" link="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--eyes-profile"/>
+ <keyword type="property" name="The “flags” property" link="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--flags"/>
+ <keyword type="property" name="The “min-neighbors” property" link="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--min-neighbors"/>
+ <keyword type="property" name="The “min-size-height” property" link="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--min-size-height"/>
+ <keyword type="property" name="The “min-size-width” property" link="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--min-size-width"/>
+ <keyword type="property" name="The “mouth-profile” property" link="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--mouth-profile"/>
+ <keyword type="property" name="The “nose-profile” property" link="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--nose-profile"/>
+ <keyword type="property" name="The “profile” property" link="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--profile"/>
+ <keyword type="property" name="The “scale-factor” property" link="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--scale-factor"/>
+ <keyword type="property" name="The “updates” property" link="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--updates"/>
+ <keyword type="property" name="The “min-stddev” property" link="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--min-stddev"/>
<keyword type="struct" name="struct GstFestival" link="gst-plugins-bad-plugins-festival.html#GstFestival-struct"/>
<keyword type="struct" name="struct GstFisheye" link="gst-plugins-bad-plugins-fisheye.html#GstFisheye-struct"/>
<keyword type="struct" name="struct GstFPSDisplaySink" link="gst-plugins-bad-plugins-fpsdisplaysink.html#GstFPSDisplaySink-struct"/>
@@ -294,14 +390,134 @@
<keyword type="property" name="The “last-message” property" link="gst-plugins-bad-plugins-fpsdisplaysink.html#GstFPSDisplaySink--last-message"/>
<keyword type="property" name="The “silent” property" link="gst-plugins-bad-plugins-fpsdisplaysink.html#GstFPSDisplaySink--silent"/>
<keyword type="signal" name="The “fps-measurements” signal" link="gst-plugins-bad-plugins-fpsdisplaysink.html#GstFPSDisplaySink-fps-measurements"/>
- <keyword type="macro" name="GST_JPEG_PARSE()" link="gst-plugins-bad-plugins-jpegparse.html#GST-JPEG-PARSE:CAPS"/>
- <keyword type="macro" name="GST_JPEG_PARSE_CLASS()" link="gst-plugins-bad-plugins-jpegparse.html#GST-JPEG-PARSE-CLASS:CAPS"/>
- <keyword type="macro" name="GST_IS_JPEG_PARSE()" link="gst-plugins-bad-plugins-jpegparse.html#GST-IS-JPEG-PARSE:CAPS"/>
- <keyword type="macro" name="GST_IS_JPEG_PARSE_CLASS()" link="gst-plugins-bad-plugins-jpegparse.html#GST-IS-JPEG-PARSE-CLASS:CAPS"/>
- <keyword type="function" name="gst_jpeg_parse_get_type ()" link="gst-plugins-bad-plugins-jpegparse.html#gst-jpeg-parse-get-type"/>
+ <keyword type="struct" name="struct GstGaussianBlur" link="gst-plugins-bad-plugins-gaussianblur.html#GstGaussianBlur-struct"/>
+ <keyword type="property" name="The “sigma” property" link="gst-plugins-bad-plugins-gaussianblur.html#GstGaussianBlur--sigma"/>
+ <keyword type="struct" name="struct GstGLColorBalance" link="gst-plugins-bad-plugins-glcolorbalance.html#GstGLColorBalance-struct"/>
+ <keyword type="property" name="The “brightness” property" link="gst-plugins-bad-plugins-glcolorbalance.html#GstGLColorBalance--brightness"/>
+ <keyword type="property" name="The “contrast” property" link="gst-plugins-bad-plugins-glcolorbalance.html#GstGLColorBalance--contrast"/>
+ <keyword type="property" name="The “hue” property" link="gst-plugins-bad-plugins-glcolorbalance.html#GstGLColorBalance--hue"/>
+ <keyword type="property" name="The “saturation” property" link="gst-plugins-bad-plugins-glcolorbalance.html#GstGLColorBalance--saturation"/>
+ <keyword type="struct" name="struct GstGLColorConvertElement" link="gst-plugins-bad-plugins-glcolorconvert.html#GstGLColorConvertElement-struct"/>
+ <keyword type="struct" name="struct GstGLColorscale" link="gst-plugins-bad-plugins-glcolorscale.html#GstGLColorscale-struct"/>
+ <keyword type="struct" name="struct GstGLDeinterlace" link="gst-plugins-bad-plugins-gldeinterlace.html#GstGLDeinterlace-struct"/>
+ <keyword type="property" name="The “method” property" link="gst-plugins-bad-plugins-gldeinterlace.html#GstGLDeinterlace--method"/>
+ <keyword type="struct" name="struct GstGLDifferenceMatte" link="gst-plugins-bad-plugins-gldifferencematte.html#GstGLDifferenceMatte-struct"/>
+ <keyword type="property" name="The “location” property" link="gst-plugins-bad-plugins-gldifferencematte.html#GstGLDifferenceMatte--location"/>
+ <keyword type="struct" name="struct GstGLDownloadElement" link="gst-plugins-bad-plugins-gldownload.html#GstGLDownloadElement-struct"/>
+ <keyword type="struct" name="struct GstGLFilterApp" link="gst-plugins-bad-plugins-glfilterapp.html#GstGLFilterApp-struct"/>
+ <keyword type="property" name="The “client-data” property" link="gst-plugins-bad-plugins-glfilterapp.html#GstGLFilterApp--client-data"/>
+ <keyword type="property" name="The “client-draw-callback” property" link="gst-plugins-bad-plugins-glfilterapp.html#GstGLFilterApp--client-draw-callback"/>
+ <keyword type="property" name="The “client-reshape-callback” property" link="gst-plugins-bad-plugins-glfilterapp.html#GstGLFilterApp--client-reshape-callback"/>
+ <keyword type="signal" name="The “client-draw” signal" link="gst-plugins-bad-plugins-glfilterapp.html#GstGLFilterApp-client-draw"/>
+ <keyword type="struct" name="struct GstGLFilterBin" link="gst-plugins-bad-plugins-glfilterbin.html#GstGLFilterBin-struct"/>
+ <keyword type="property" name="The “filter” property" link="gst-plugins-bad-plugins-glfilterbin.html#GstGLFilterBin--filter"/>
+ <keyword type="signal" name="The “create-element” signal" link="gst-plugins-bad-plugins-glfilterbin.html#GstGLFilterBin-create-element"/>
+ <keyword type="struct" name="struct GstGLFilterCube" link="gst-plugins-bad-plugins-glfiltercube.html#GstGLFilterCube-struct"/>
+ <keyword type="property" name="The “aspect” property" link="gst-plugins-bad-plugins-glfiltercube.html#GstGLFilterCube--aspect"/>
+ <keyword type="property" name="The “blue” property" link="gst-plugins-bad-plugins-glfiltercube.html#GstGLFilterCube--blue"/>
+ <keyword type="property" name="The “fovy” property" link="gst-plugins-bad-plugins-glfiltercube.html#GstGLFilterCube--fovy"/>
+ <keyword type="property" name="The “green” property" link="gst-plugins-bad-plugins-glfiltercube.html#GstGLFilterCube--green"/>
+ <keyword type="property" name="The “red” property" link="gst-plugins-bad-plugins-glfiltercube.html#GstGLFilterCube--red"/>
+ <keyword type="property" name="The “zfar” property" link="gst-plugins-bad-plugins-glfiltercube.html#GstGLFilterCube--zfar"/>
+ <keyword type="property" name="The “znear” property" link="gst-plugins-bad-plugins-glfiltercube.html#GstGLFilterCube--znear"/>
+ <keyword type="struct" name="struct GstGLFilterGlass" link="gst-plugins-bad-plugins-glfilterglass.html#GstGLFilterGlass-struct"/>
+ <keyword type="struct" name="struct GstGLImageSink" link="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink-struct"/>
+ <keyword type="property" name="The “display” property" link="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--display"/>
+ <keyword type="property" name="The “client-data” property" link="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--client-data"/>
+ <keyword type="property" name="The “client-draw-callback” property" link="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--client-draw-callback"/>
+ <keyword type="property" name="The “client-reshape-callback” property" link="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--client-reshape-callback"/>
+ <keyword type="property" name="The “force-aspect-ratio” property" link="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--force-aspect-ratio"/>
+ <keyword type="property" name="The “other-context” property" link="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--other-context"/>
+ <keyword type="property" name="The “pixel-aspect-ratio” property" link="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--pixel-aspect-ratio"/>
+ <keyword type="property" name="The “context” property" link="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--context"/>
+ <keyword type="property" name="The “handle-events” property" link="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--handle-events"/>
+ <keyword type="property" name="The “ignore-alpha” property" link="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--ignore-alpha"/>
+ <keyword type="property" name="The “output-multiview-downmix-mode” property" link="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--output-multiview-downmix-mode"/>
+ <keyword type="property" name="The “output-multiview-flags” property" link="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--output-multiview-flags"/>
+ <keyword type="property" name="The “output-multiview-mode” property" link="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--output-multiview-mode"/>
+ <keyword type="property" name="The “rotate-method” property" link="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--rotate-method"/>
+ <keyword type="signal" name="The “client-draw” signal" link="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink-client-draw"/>
+ <keyword type="signal" name="The “client-reshape” signal" link="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink-client-reshape"/>
+ <keyword type="struct" name="struct GstGLMixerBin" link="gst-plugins-bad-plugins-glmixerbin.html#GstGLMixerBin-struct"/>
+ <keyword type="property" name="The “latency” property" link="gst-plugins-bad-plugins-glmixerbin.html#GstGLMixerBin--latency"/>
+ <keyword type="property" name="The “mixer” property" link="gst-plugins-bad-plugins-glmixerbin.html#GstGLMixerBin--mixer"/>
+ <keyword type="property" name="The “start-time” property" link="gst-plugins-bad-plugins-glmixerbin.html#GstGLMixerBin--start-time"/>
+ <keyword type="property" name="The “start-time-selection” property" link="gst-plugins-bad-plugins-glmixerbin.html#GstGLMixerBin--start-time-selection"/>
+ <keyword type="signal" name="The “create-element” signal" link="gst-plugins-bad-plugins-glmixerbin.html#GstGLMixerBin-create-element"/>
+ <keyword type="struct" name="struct GstGLMosaic" link="gst-plugins-bad-plugins-glmosaic.html#GstGLMosaic-struct"/>
+ <keyword type="struct" name="struct GstGLOverlay" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay-struct"/>
+ <keyword type="property" name="The “angle-png” property" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--angle-png"/>
+ <keyword type="property" name="The “angle-video” property" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--angle-video"/>
+ <keyword type="property" name="The “location” property" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--location"/>
+ <keyword type="property" name="The “proportion-png” property" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--proportion-png"/>
+ <keyword type="property" name="The “proportion-video” property" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--proportion-video"/>
+ <keyword type="property" name="The “ratio-video” property" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--ratio-video"/>
+ <keyword type="property" name="The “rotate-png” property" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--rotate-png"/>
+ <keyword type="property" name="The “rotate-video” property" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--rotate-video"/>
+ <keyword type="property" name="The “video-top” property" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--video-top"/>
+ <keyword type="property" name="The “xpos-png” property" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--xpos-png"/>
+ <keyword type="property" name="The “xpos-video” property" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--xpos-video"/>
+ <keyword type="property" name="The “ypos-png” property" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--ypos-png"/>
+ <keyword type="property" name="The “ypos-video” property" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--ypos-video"/>
+ <keyword type="property" name="The “alpha” property" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--alpha"/>
+ <keyword type="property" name="The “offset-x” property" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--offset-x"/>
+ <keyword type="property" name="The “offset-y” property" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--offset-y"/>
+ <keyword type="property" name="The “overlay-height” property" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--overlay-height"/>
+ <keyword type="property" name="The “overlay-width” property" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--overlay-width"/>
+ <keyword type="property" name="The “relative-x” property" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--relative-x"/>
+ <keyword type="property" name="The “relative-y” property" link="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--relative-y"/>
+ <keyword type="struct" name="struct GstGLFilterShader" link="gst-plugins-bad-plugins-glshader.html#GstGLFilterShader-struct"/>
+ <keyword type="property" name="The “location” property" link="gst-plugins-bad-plugins-glshader.html#GstGLFilterShader--location"/>
+ <keyword type="property" name="The “preset” property" link="gst-plugins-bad-plugins-glshader.html#GstGLFilterShader--preset"/>
+ <keyword type="property" name="The “vars” property" link="gst-plugins-bad-plugins-glshader.html#GstGLFilterShader--vars"/>
+ <keyword type="property" name="The “fragment” property" link="gst-plugins-bad-plugins-glshader.html#GstGLFilterShader--fragment"/>
+ <keyword type="property" name="The “shader” property" link="gst-plugins-bad-plugins-glshader.html#GstGLFilterShader--shader"/>
+ <keyword type="property" name="The “uniforms” property" link="gst-plugins-bad-plugins-glshader.html#GstGLFilterShader--uniforms"/>
+ <keyword type="property" name="The “update-shader” property" link="gst-plugins-bad-plugins-glshader.html#GstGLFilterShader--update-shader"/>
+ <keyword type="property" name="The “vertex” property" link="gst-plugins-bad-plugins-glshader.html#GstGLFilterShader--vertex"/>
+ <keyword type="signal" name="The “create-shader” signal" link="gst-plugins-bad-plugins-glshader.html#GstGLFilterShader-create-shader"/>
+ <keyword type="struct" name="struct GstGLSinkBin" link="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin-struct"/>
+ <keyword type="property" name="The “force-aspect-ratio” property" link="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--force-aspect-ratio"/>
+ <keyword type="property" name="The “sink” property" link="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--sink"/>
+ <keyword type="property" name="The “async” property" link="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--async"/>
+ <keyword type="property" name="The “blocksize” property" link="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--blocksize"/>
+ <keyword type="property" name="The “enable-last-sample” property" link="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--enable-last-sample"/>
+ <keyword type="property" name="The “last-sample” property" link="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--last-sample"/>
+ <keyword type="property" name="The “max-bitrate” property" link="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--max-bitrate"/>
+ <keyword type="property" name="The “max-lateness” property" link="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--max-lateness"/>
+ <keyword type="property" name="The “qos” property" link="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--qos"/>
+ <keyword type="property" name="The “render-delay” property" link="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--render-delay"/>
+ <keyword type="property" name="The “sync” property" link="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--sync"/>
+ <keyword type="property" name="The “throttle-time” property" link="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--throttle-time"/>
+ <keyword type="property" name="The “ts-offset” property" link="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--ts-offset"/>
+ <keyword type="property" name="The “brightness” property" link="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--brightness"/>
+ <keyword type="property" name="The “contrast” property" link="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--contrast"/>
+ <keyword type="property" name="The “hue” property" link="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--hue"/>
+ <keyword type="property" name="The “saturation” property" link="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--saturation"/>
+ <keyword type="signal" name="The “create-element” signal" link="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin-create-element"/>
+ <keyword type="struct" name="struct GstGLSrcBin" link="gst-plugins-bad-plugins-glsrcbin.html#GstGLSrcBin-struct"/>
+ <keyword type="property" name="The “src” property" link="gst-plugins-bad-plugins-glsrcbin.html#GstGLSrcBin--src"/>
+ <keyword type="signal" name="The “create-element” signal" link="gst-plugins-bad-plugins-glsrcbin.html#GstGLSrcBin-create-element"/>
+ <keyword type="struct" name="struct GstGLStereoMix" link="gst-plugins-bad-plugins-glstereomix.html#GstGLStereoMix-struct"/>
+ <keyword type="property" name="The “downmix-mode” property" link="gst-plugins-bad-plugins-glstereomix.html#GstGLStereoMix--downmix-mode"/>
+ <keyword type="struct" name="struct GstGLStereoSplit" link="gst-plugins-bad-plugins-glstereosplit.html#GstGLStereoSplit-struct"/>
+ <keyword type="struct" name="GstGLTestSrc" link="gst-plugins-bad-plugins-gltestsrc.html#GstGLTestSrc-struct"/>
+ <keyword type="enum" name="enum GstGLTestSrcPattern" link="gst-plugins-bad-plugins-gltestsrc.html#GstGLTestSrcPattern"/>
+ <keyword type="property" name="The “is-live” property" link="gst-plugins-bad-plugins-gltestsrc.html#GstGLTestSrc--is-live"/>
+ <keyword type="property" name="The “pattern” property" link="gst-plugins-bad-plugins-gltestsrc.html#GstGLTestSrc--pattern"/>
+ <keyword type="property" name="The “timestamp-offset” property" link="gst-plugins-bad-plugins-gltestsrc.html#GstGLTestSrc--timestamp-offset"/>
+ <keyword type="struct" name="struct GstGLTransformation" link="gst-plugins-bad-plugins-gltransformation.html#GstGLTransformation"/>
+ <keyword type="struct" name="struct GstGLUploadElement" link="gst-plugins-bad-plugins-glupload.html#GstGLUploadElement-struct"/>
+ <keyword type="struct" name="struct GstGLVideoMixer" link="gst-plugins-bad-plugins-glvideomixerelement.html#GstGLVideoMixer-struct"/>
+ <keyword type="enum" name="enum GstGLVideoMixerBackground" link="gst-plugins-bad-plugins-glvideomixerelement.html#GstGLVideoMixerBackground"/>
+ <keyword type="property" name="The “background” property" link="gst-plugins-bad-plugins-glvideomixerelement.html#GstGLVideoMixer--background"/>
+ <keyword type="struct" name="struct GstGLViewConvertElement" link="gst-plugins-bad-plugins-glviewconvert.html#GstGLViewConvertElement-struct"/>
+ <keyword type="property" name="The “downmix-mode” property" link="gst-plugins-bad-plugins-glviewconvert.html#GstGLViewConvertElement--downmix-mode"/>
+ <keyword type="property" name="The “input-flags-override” property" link="gst-plugins-bad-plugins-glviewconvert.html#GstGLViewConvertElement--input-flags-override"/>
+ <keyword type="property" name="The “input-mode-override” property" link="gst-plugins-bad-plugins-glviewconvert.html#GstGLViewConvertElement--input-mode-override"/>
+ <keyword type="property" name="The “output-flags-override” property" link="gst-plugins-bad-plugins-glviewconvert.html#GstGLViewConvertElement--output-flags-override"/>
+ <keyword type="property" name="The “output-mode-override” property" link="gst-plugins-bad-plugins-glviewconvert.html#GstGLViewConvertElement--output-mode-override"/>
<keyword type="struct" name="struct GstJpegParse" link="gst-plugins-bad-plugins-jpegparse.html#GstJpegParse-struct"/>
- <keyword type="struct" name="struct GstJpegParseClass" link="gst-plugins-bad-plugins-jpegparse.html#GstJpegParseClass"/>
- <keyword type="macro" name="GST_TYPE_JPEG_PARSE" link="gst-plugins-bad-plugins-jpegparse.html#GST-TYPE-JPEG-PARSE:CAPS"/>
<keyword type="struct" name="struct GstKaleidoscope" link="gst-plugins-bad-plugins-kaleidoscope.html#GstKaleidoscope-struct"/>
<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"/>
@@ -315,6 +531,7 @@
<keyword type="property" name="The “paused-mode” property" link="gst-plugins-bad-plugins-mimenc.html#GstMimEnc--paused-mode"/>
<keyword type="struct" name="struct GstMimDec" link="gst-plugins-bad-plugins-mimdec.html#GstMimDec-struct"/>
<keyword type="struct" name="struct GstMirror" link="gst-plugins-bad-plugins-mirror.html#GstMirror-struct"/>
+ <keyword type="enum" name="enum GstMirrorMode" link="gst-plugins-bad-plugins-mirror.html#GstMirrorMode"/>
<keyword type="property" name="The “mode” property" link="gst-plugins-bad-plugins-mirror.html#GstMirror--mode"/>
<keyword type="struct" name="GstModPlug" link="gst-plugins-bad-plugins-modplug.html#GstModPlug-struct"/>
<keyword type="property" name="The “megabass” property" link="gst-plugins-bad-plugins-modplug.html#GstModPlug--megabass"/>
@@ -364,13 +581,6 @@
<keyword type="property" name="The “sequence-length” property" link="gst-plugins-bad-plugins-mpeg2enc.html#GstMpeg2enc--sequence-length"/>
<keyword type="property" name="The “unit-coeff-elim” property" link="gst-plugins-bad-plugins-mpeg2enc.html#GstMpeg2enc--unit-coeff-elim"/>
<keyword type="property" name="The “vcd-still-size” property" link="gst-plugins-bad-plugins-mpeg2enc.html#GstMpeg2enc--vcd-still-size"/>
- <keyword type="property" name="The “aggregate-gops” property" link="gst-plugins-bad-plugins-mpegpsmux.html#MpegPsMux--aggregate-gops"/>
- <keyword type="property" name="The “m2ts-mode” property" link="gst-plugins-bad-plugins-mpegtsmux.html#MpegTsMux--m2ts-mode"/>
- <keyword type="property" name="The “prog-map” property" link="gst-plugins-bad-plugins-mpegtsmux.html#MpegTsMux--prog-map"/>
- <keyword type="property" name="The “pat-interval” property" link="gst-plugins-bad-plugins-mpegtsmux.html#MpegTsMux--pat-interval"/>
- <keyword type="property" name="The “pmt-interval” property" link="gst-plugins-bad-plugins-mpegtsmux.html#MpegTsMux--pmt-interval"/>
- <keyword type="property" name="The “alignment” property" link="gst-plugins-bad-plugins-mpegtsmux.html#MpegTsMux--alignment"/>
- <keyword type="property" name="The “si-interval” property" link="gst-plugins-bad-plugins-mpegtsmux.html#MpegTsMux--si-interval"/>
<keyword type="struct" name="GstMplex" link="gst-plugins-bad-plugins-mplex.html#GstMplex-struct"/>
<keyword type="property" name="The “bufsize” property" link="gst-plugins-bad-plugins-mplex.html#GstMplex--bufsize"/>
<keyword type="property" name="The “format” property" link="gst-plugins-bad-plugins-mplex.html#GstMplex--format"/>
@@ -399,6 +609,15 @@
<keyword type="struct" name="struct GstOpenalSrc" link="gst-plugins-bad-plugins-openalsrc.html#GstOpenalSrc-struct"/>
<keyword type="property" name="The “device” property" link="gst-plugins-bad-plugins-openalsrc.html#GstOpenalSrc--device"/>
<keyword type="property" name="The “device-name” property" link="gst-plugins-bad-plugins-openalsrc.html#GstOpenalSrc--device-name"/>
+ <keyword type="struct" name="struct GstOpenALSink" link="gst-plugins-bad-plugins-openalsink.html#GstOpenALSink-struct"/>
+ <keyword type="property" name="The “context-handle” property" link="gst-plugins-bad-plugins-openalsink.html#GstOpenALSink--context-handle"/>
+ <keyword type="property" name="The “device” property" link="gst-plugins-bad-plugins-openalsink.html#GstOpenALSink--device"/>
+ <keyword type="property" name="The “device-handle” property" link="gst-plugins-bad-plugins-openalsink.html#GstOpenALSink--device-handle"/>
+ <keyword type="property" name="The “device-name” property" link="gst-plugins-bad-plugins-openalsink.html#GstOpenALSink--device-name"/>
+ <keyword type="property" name="The “source-id” property" link="gst-plugins-bad-plugins-openalsink.html#GstOpenALSink--source-id"/>
+ <keyword type="property" name="The “user-context” property" link="gst-plugins-bad-plugins-openalsink.html#GstOpenALSink--user-context"/>
+ <keyword type="property" name="The “user-device” property" link="gst-plugins-bad-plugins-openalsink.html#GstOpenALSink--user-device"/>
+ <keyword type="property" name="The “user-source” property" link="gst-plugins-bad-plugins-openalsink.html#GstOpenALSink--user-source"/>
<keyword type="struct" name="struct GstPcapParse" link="gst-plugins-bad-plugins-pcapparse.html#GstPcapParse-struct"/>
<keyword type="property" name="The “dst-ip” property" link="gst-plugins-bad-plugins-pcapparse.html#GstPcapParse--dst-ip"/>
<keyword type="property" name="The “dst-port” property" link="gst-plugins-bad-plugins-pcapparse.html#GstPcapParse--dst-port"/>
@@ -408,6 +627,24 @@
<keyword type="property" name="The “ts-offset” property" link="gst-plugins-bad-plugins-pcapparse.html#GstPcapParse--ts-offset"/>
<keyword type="struct" name="struct GstPinch" link="gst-plugins-bad-plugins-pinch.html#GstPinch-struct"/>
<keyword type="property" name="The “intensity” property" link="gst-plugins-bad-plugins-pinch.html#GstPinch--intensity"/>
+ <keyword type="struct" name="struct GstRawAudioParse" link="gst-plugins-bad-plugins-rawaudioparse.html#GstRawAudioParse-struct"/>
+ <keyword type="property" name="The “channel-positions” property" link="gst-plugins-bad-plugins-rawaudioparse.html#GstRawAudioParse--channel-positions"/>
+ <keyword type="property" name="The “format” property" link="gst-plugins-bad-plugins-rawaudioparse.html#GstRawAudioParse--format"/>
+ <keyword type="property" name="The “interleaved” property" link="gst-plugins-bad-plugins-rawaudioparse.html#GstRawAudioParse--interleaved"/>
+ <keyword type="property" name="The “num-channels” property" link="gst-plugins-bad-plugins-rawaudioparse.html#GstRawAudioParse--num-channels"/>
+ <keyword type="property" name="The “pcm-format” property" link="gst-plugins-bad-plugins-rawaudioparse.html#GstRawAudioParse--pcm-format"/>
+ <keyword type="property" name="The “sample-rate” property" link="gst-plugins-bad-plugins-rawaudioparse.html#GstRawAudioParse--sample-rate"/>
+ <keyword type="struct" name="struct GstRawVideoParse" link="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse-struct"/>
+ <keyword type="property" name="The “format” property" link="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse--format"/>
+ <keyword type="property" name="The “frame-stride” property" link="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse--frame-stride"/>
+ <keyword type="property" name="The “framerate” property" link="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse--framerate"/>
+ <keyword type="property" name="The “height” property" link="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse--height"/>
+ <keyword type="property" name="The “interlaced” property" link="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse--interlaced"/>
+ <keyword type="property" name="The “pixel-aspect-ratio” property" link="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse--pixel-aspect-ratio"/>
+ <keyword type="property" name="The “plane-offsets” property" link="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse--plane-offsets"/>
+ <keyword type="property" name="The “plane-strides” property" link="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse--plane-strides"/>
+ <keyword type="property" name="The “top-field-first” property" link="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse--top-field-first"/>
+ <keyword type="property" name="The “width” property" link="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse--width"/>
<keyword type="struct" name="struct GstRfbSrc" link="gst-plugins-bad-plugins-rfbsrc.html#GstRfbSrc-struct"/>
<keyword type="property" name="The “host” property" link="gst-plugins-bad-plugins-rfbsrc.html#GstRfbSrc--host"/>
<keyword type="property" name="The “port” property" link="gst-plugins-bad-plugins-rfbsrc.html#GstRfbSrc--port"/>
@@ -425,6 +662,7 @@
<keyword type="property" name="The “location” property" link="gst-plugins-bad-plugins-rtmpsink.html#GstRTMPSink--location"/>
<keyword type="struct" name="struct GstRTMPSrc" link="gst-plugins-bad-plugins-rtmpsrc.html#GstRTMPSrc-struct"/>
<keyword type="property" name="The “location” property" link="gst-plugins-bad-plugins-rtmpsrc.html#GstRTMPSrc--location"/>
+ <keyword type="property" name="The “timeout” property" link="gst-plugins-bad-plugins-rtmpsrc.html#GstRTMPSrc--timeout"/>
<keyword type="struct" name="struct GstShmSink" link="gst-plugins-bad-plugins-shmsink.html#GstShmSink-struct"/>
<keyword type="property" name="The “perms” property" link="gst-plugins-bad-plugins-shmsink.html#GstShmSink--perms"/>
<keyword type="property" name="The “shm-size” property" link="gst-plugins-bad-plugins-shmsink.html#GstShmSink--shm-size"/>
@@ -478,6 +716,8 @@
<keyword type="struct" name="struct GstTunnel" link="gst-plugins-bad-plugins-tunnel.html#GstTunnel-struct"/>
<keyword type="struct" name="struct GstTwirl" link="gst-plugins-bad-plugins-twirl.html#GstTwirl-struct"/>
<keyword type="property" name="The “angle” property" link="gst-plugins-bad-plugins-twirl.html#GstTwirl--angle"/>
+ <keyword type="struct" name="GstUnalignedAudioParse" link="gst-plugins-bad-plugins-unalignedaudioparse.html#GstUnalignedAudioParse-struct"/>
+ <keyword type="struct" name="GstUnalignedVideoParse" link="gst-plugins-bad-plugins-unalignedvideoparse.html#GstUnalignedVideoParse-struct"/>
<keyword type="struct" name="struct GstVideoParse" link="gst-plugins-bad-plugins-videoparse.html#GstVideoParse-struct"/>
<keyword type="property" name="The “alpha-mask” property" link="gst-plugins-bad-plugins-videoparse.html#GstVideoParse--alpha-mask"/>
<keyword type="property" name="The “blue-mask” property" link="gst-plugins-bad-plugins-videoparse.html#GstVideoParse--blue-mask"/>
@@ -506,7 +746,57 @@
<keyword type="property" name="The “attach-frame” property" link="gst-plugins-bad-plugins-zbar.html#GstZBar--attach-frame"/>
<keyword type="struct" name="struct GstVoAacEnc" link="gst-plugins-bad-plugins-voaacenc.html#GstVoAacEnc-struct"/>
<keyword type="property" name="The “bitrate” property" link="gst-plugins-bad-plugins-voaacenc.html#GstVoAacEnc--bitrate"/>
+ <keyword type="struct" name="struct GstVoAmrWbEnc" link="gst-plugins-bad-plugins-voamrwbenc.html#GstVoAmrWbEnc-struct"/>
+ <keyword type="property" name="The “band-mode” property" link="gst-plugins-bad-plugins-voamrwbenc.html#GstVoAmrWbEnc--band-mode"/>
<keyword type="struct" name="struct GstWaveScope" link="gst-plugins-bad-plugins-wavescope.html#GstWaveScope-struct"/>
<keyword type="property" name="The “style” property" link="gst-plugins-bad-plugins-wavescope.html#GstWaveScope--style"/>
+ <keyword type="struct" name="GstWebrtcDsp" link="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp-struct"/>
+ <keyword type="property" name="The “echo-cancel” property" link="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp--echo-cancel"/>
+ <keyword type="property" name="The “experimental-agc” property" link="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp--experimental-agc"/>
+ <keyword type="property" name="The “extended-filter” property" link="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp--extended-filter"/>
+ <keyword type="property" name="The “gain-control” property" link="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp--gain-control"/>
+ <keyword type="property" name="The “high-pass-filter” property" link="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp--high-pass-filter"/>
+ <keyword type="property" name="The “noise-suppression” property" link="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp--noise-suppression"/>
+ <keyword type="property" name="The “probe” property" link="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp--probe"/>
+ <keyword type="property" name="The “echo-suppression-level” property" link="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp--echo-suppression-level"/>
+ <keyword type="property" name="The “noise-suppression-level” property" link="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp--noise-suppression-level"/>
+ <keyword type="property" name="The “delay-agnostic” property" link="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp--delay-agnostic"/>
+ <keyword type="struct" name="struct GstWebrtcEchoProbe" link="gst-plugins-bad-plugins-webrtcechoprobe.html#GstWebrtcEchoProbe-struct"/>
+ <keyword type="constant" name="GST_COLOR_EFFECTS_PRESET_NONE" link="gst-plugins-bad-plugins-coloreffects.html#GST-COLOR-EFFECTS-PRESET-NONE:CAPS"/>
+ <keyword type="constant" name="GST_COLOR_EFFECTS_PRESET_HEAT" link="gst-plugins-bad-plugins-coloreffects.html#GST-COLOR-EFFECTS-PRESET-HEAT:CAPS"/>
+ <keyword type="constant" name="GST_COLOR_EFFECTS_PRESET_SEPIA" link="gst-plugins-bad-plugins-coloreffects.html#GST-COLOR-EFFECTS-PRESET-SEPIA:CAPS"/>
+ <keyword type="constant" name="GST_COLOR_EFFECTS_PRESET_XRAY" link="gst-plugins-bad-plugins-coloreffects.html#GST-COLOR-EFFECTS-PRESET-XRAY:CAPS"/>
+ <keyword type="constant" name="GST_COLOR_EFFECTS_PRESET_XPRO" link="gst-plugins-bad-plugins-coloreffects.html#GST-COLOR-EFFECTS-PRESET-XPRO:CAPS"/>
+ <keyword type="constant" name="GST_COLOR_EFFECTS_PRESET_YELLOWBLUE" link="gst-plugins-bad-plugins-coloreffects.html#GST-COLOR-EFFECTS-PRESET-YELLOWBLUE:CAPS"/>
+ <keyword type="constant" name="COMPOSITOR_BACKGROUND_CHECKER" link="gst-plugins-bad-plugins-compositor.html#COMPOSITOR-BACKGROUND-CHECKER:CAPS"/>
+ <keyword type="constant" name="COMPOSITOR_BACKGROUND_BLACK" link="gst-plugins-bad-plugins-compositor.html#COMPOSITOR-BACKGROUND-BLACK:CAPS"/>
+ <keyword type="constant" name="COMPOSITOR_BACKGROUND_WHITE" link="gst-plugins-bad-plugins-compositor.html#COMPOSITOR-BACKGROUND-WHITE:CAPS"/>
+ <keyword type="constant" name="COMPOSITOR_BACKGROUND_TRANSPARENT" link="gst-plugins-bad-plugins-compositor.html#COMPOSITOR-BACKGROUND-TRANSPARENT:CAPS"/>
+ <keyword type="constant" name="GST_FACEDETECT_UPDATES_EVERY_FRAME" link="gst-plugins-bad-plugins-facedetect.html#GST-FACEDETECT-UPDATES-EVERY-FRAME:CAPS"/>
+ <keyword type="constant" name="GST_FACEDETECT_UPDATES_ON_CHANGE" link="gst-plugins-bad-plugins-facedetect.html#GST-FACEDETECT-UPDATES-ON-CHANGE:CAPS"/>
+ <keyword type="constant" name="GST_FACEDETECT_UPDATES_ON_FACE" link="gst-plugins-bad-plugins-facedetect.html#GST-FACEDETECT-UPDATES-ON-FACE:CAPS"/>
+ <keyword type="constant" name="GST_FACEDETECT_UPDATES_NONE" link="gst-plugins-bad-plugins-facedetect.html#GST-FACEDETECT-UPDATES-NONE:CAPS"/>
+ <keyword type="constant" name="GST_GL_TEST_SRC_SMPTE" link="gst-plugins-bad-plugins-gltestsrc.html#GST-GL-TEST-SRC-SMPTE:CAPS"/>
+ <keyword type="constant" name="GST_GL_TEST_SRC_SNOW" link="gst-plugins-bad-plugins-gltestsrc.html#GST-GL-TEST-SRC-SNOW:CAPS"/>
+ <keyword type="constant" name="GST_GL_TEST_SRC_BLACK" link="gst-plugins-bad-plugins-gltestsrc.html#GST-GL-TEST-SRC-BLACK:CAPS"/>
+ <keyword type="constant" name="GST_GL_TEST_SRC_WHITE" link="gst-plugins-bad-plugins-gltestsrc.html#GST-GL-TEST-SRC-WHITE:CAPS"/>
+ <keyword type="constant" name="GST_GL_TEST_SRC_RED" link="gst-plugins-bad-plugins-gltestsrc.html#GST-GL-TEST-SRC-RED:CAPS"/>
+ <keyword type="constant" name="GST_GL_TEST_SRC_GREEN" link="gst-plugins-bad-plugins-gltestsrc.html#GST-GL-TEST-SRC-GREEN:CAPS"/>
+ <keyword type="constant" name="GST_GL_TEST_SRC_BLUE" link="gst-plugins-bad-plugins-gltestsrc.html#GST-GL-TEST-SRC-BLUE:CAPS"/>
+ <keyword type="constant" name="GST_GL_TEST_SRC_CHECKERS1" link="gst-plugins-bad-plugins-gltestsrc.html#GST-GL-TEST-SRC-CHECKERS1:CAPS"/>
+ <keyword type="constant" name="GST_GL_TEST_SRC_CHECKERS2" link="gst-plugins-bad-plugins-gltestsrc.html#GST-GL-TEST-SRC-CHECKERS2:CAPS"/>
+ <keyword type="constant" name="GST_GL_TEST_SRC_CHECKERS4" link="gst-plugins-bad-plugins-gltestsrc.html#GST-GL-TEST-SRC-CHECKERS4:CAPS"/>
+ <keyword type="constant" name="GST_GL_TEST_SRC_CHECKERS8" link="gst-plugins-bad-plugins-gltestsrc.html#GST-GL-TEST-SRC-CHECKERS8:CAPS"/>
+ <keyword type="constant" name="GST_GL_TEST_SRC_CIRCULAR" link="gst-plugins-bad-plugins-gltestsrc.html#GST-GL-TEST-SRC-CIRCULAR:CAPS"/>
+ <keyword type="constant" name="GST_GL_TEST_SRC_BLINK" link="gst-plugins-bad-plugins-gltestsrc.html#GST-GL-TEST-SRC-BLINK:CAPS"/>
+ <keyword type="constant" name="GST_GL_TEST_SRC_MANDELBROT" link="gst-plugins-bad-plugins-gltestsrc.html#GST-GL-TEST-SRC-MANDELBROT:CAPS"/>
+ <keyword type="constant" name="GST_GL_VIDEO_MIXER_BACKGROUND_CHECKER" link="gst-plugins-bad-plugins-glvideomixerelement.html#GST-GL-VIDEO-MIXER-BACKGROUND-CHECKER:CAPS"/>
+ <keyword type="constant" name="GST_GL_VIDEO_MIXER_BACKGROUND_BLACK" link="gst-plugins-bad-plugins-glvideomixerelement.html#GST-GL-VIDEO-MIXER-BACKGROUND-BLACK:CAPS"/>
+ <keyword type="constant" name="GST_GL_VIDEO_MIXER_BACKGROUND_WHITE" link="gst-plugins-bad-plugins-glvideomixerelement.html#GST-GL-VIDEO-MIXER-BACKGROUND-WHITE:CAPS"/>
+ <keyword type="constant" name="GST_GL_VIDEO_MIXER_BACKGROUND_TRANSPARENT" link="gst-plugins-bad-plugins-glvideomixerelement.html#GST-GL-VIDEO-MIXER-BACKGROUND-TRANSPARENT:CAPS"/>
+ <keyword type="constant" name="GST_MIRROR_MODE_LEFT" link="gst-plugins-bad-plugins-mirror.html#GST-MIRROR-MODE-LEFT:CAPS"/>
+ <keyword type="constant" name="GST_MIRROR_MODE_RIGHT" link="gst-plugins-bad-plugins-mirror.html#GST-MIRROR-MODE-RIGHT:CAPS"/>
+ <keyword type="constant" name="GST_MIRROR_MODE_TOP" link="gst-plugins-bad-plugins-mirror.html#GST-MIRROR-MODE-TOP:CAPS"/>
+ <keyword type="constant" name="GST_MIRROR_MODE_BOTTOM" link="gst-plugins-bad-plugins-mirror.html#GST-MIRROR-MODE-BOTTOM:CAPS"/>
</functions>
</book>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-assrender.html b/docs/plugins/html/gst-plugins-bad-plugins-assrender.html
index 1246a6c..3d042c0 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-assrender.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-assrender.html
@@ -84,10 +84,25 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-assrender.description"></a><h2>Description</h2>
+<p>Renders timestamped SSA/ASS subtitles on top of a video stream.</p>
+<div class="refsect2">
+<a name="id-1.2.5.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 filesrc location<span class="gtkdoc opt">=/</span>path<span class="gtkdoc opt">/</span>to<span class="gtkdoc opt">/</span>mkv <span class="gtkdoc opt">!</span> matroskademux name<span class="gtkdoc opt">=</span>d <span class="gtkdoc opt">!</span> queue <span class="gtkdoc opt">!</span> mpegaudioparse <span class="gtkdoc opt">!</span> mad <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> autoaudiosink d<span class="gtkdoc opt">. !</span> queue <span class="gtkdoc opt">!</span> h264parse <span class="gtkdoc opt">!</span> avdec_h264 <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> r<span class="gtkdoc opt">.</span> d<span class="gtkdoc opt">. !</span> queue <span class="gtkdoc opt">!</span> <span class="string">"application/x-ass"</span> <span class="gtkdoc opt">!</span> assrender name<span class="gtkdoc opt">=</span>r <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ 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.
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.5.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.5.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -113,7 +128,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.5.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.5.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -166,7 +181,7 @@
</tr>
<tr>
<td><p><span class="term"></span></p></td>
-<td> video/x-raw(ANY), format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+<td> video/x-raw(ANY), format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
</tr>
</tbody>
</table></div>
@@ -194,7 +209,7 @@
</tr>
<tr>
<td><p><span class="term"></span></p></td>
-<td> video/x-raw(ANY), format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+<td> video/x-raw(ANY), format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
</tr>
</tbody>
</table></div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-audiomixer.html b/docs/plugins/html/gst-plugins-bad-plugins-audiomixer.html
index efa9fd0..ce7e6d8 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-audiomixer.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-audiomixer.html
@@ -7,7 +7,7 @@
<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
<link rel="prev" href="gst-plugins-bad-plugins-audiointerleave.html" title="audiointerleave">
-<link rel="next" href="gst-plugins-bad-plugins-autoconvert.html" title="autoconvert">
+<link rel="next" href="gst-plugins-bad-plugins-audioparse.html" title="audioparse">
<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
@@ -23,7 +23,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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
<td><a accesskey="p" href="gst-plugins-bad-plugins-audiointerleave.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gst-plugins-bad-plugins-autoconvert.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-audioparse.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-audiomixer"></a><div class="titlepage"></div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-audioparse.html b/docs/plugins/html/gst-plugins-bad-plugins-audioparse.html
new file mode 100644
index 0000000..24c8141
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-audioparse.html
@@ -0,0 +1,339 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>audioparse: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-audiomixer.html" title="audiomixer">
+<link rel="next" href="gst-plugins-bad-plugins-autoconvert.html" title="autoconvert">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-audioparse.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-audioparse.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_interfaces"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-audioparse.implemented-interfaces" class="shortcut">Implemented Interfaces</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-audioparse.properties" class="shortcut">Properties</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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-audiomixer.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-autoconvert.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-audioparse"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-audioparse.top_of_page"></a>audioparse</span></h2>
+<p>audioparse</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-audioparse.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--channels" title="The “channels” property">channels</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--depth" title="The “depth” property">depth</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><span class="type">GstAudioParseEndianness</span></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--endianness" title="The “endianness” property">endianness</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><span class="type">GstAudioParseFormat</span></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--format" title="The “format” property">format</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--rate" title="The “rate” property">rate</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--signed" title="The “signed” property">signed</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--width" title="The “width” property">width</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/gobjectgobject-Value-arrays.html#GValueArray"><span class="type">GValueArray</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--channel-positions" title="The “channel-positions” property">channel-positions</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--interleaved" title="The “interleaved” property">interleaved</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstaudio.html#GstAudioFormat"><span class="type">GstAudioFormat</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--raw-format" title="The “raw-format” property">raw-format</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-audioparse.html#GstAudioParse--use-sink-caps" title="The “use-sink-caps” property">use-sink-caps</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="GstAudioParse"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-audioparse.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-audioparse.html#GstAudioParse-struct" title="struct GstAudioParse">GstAudioParse</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-audioparse.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstBin.html#GstBin-struct">GstBin</a>
+ <span class="lineart">╰──</span> GstAudioParse
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-audioparse.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstAudioParse implements
+ <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstChildProxy.html#GstChildProxy-struct">GstChildProxy</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-audioparse.description"></a><h2>Description</h2>
+<p>Converts a byte stream into audio frames.</p>
+<div class="note">This element is deprecated. Use <a class="link" href="gst-plugins-bad-plugins-rawaudioparse.html#GstRawAudioParse"><span class="type">GstRawAudioParse</span></a> instead.</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.8.8.4.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-rawparse.html#plugin-rawparse">rawparse</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Sebastian Dröge <sebastian.droege@collabora.co.uk></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Audio</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.8.8.4.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw, format=(string){ S8, U8, S16LE, S16BE, U16LE, U16BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S32LE, S32BE, U32LE, U32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, F32LE, F32BE, F64LE, F64BE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string){ interleaved, non-interleaved }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-unaligned-raw, format=(string){ S8, U8, S16LE, S16BE, U16LE, U16BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S32LE, S32BE, U32LE, U32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, F32LE, F32BE, F64LE, F64BE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string){ interleaved, non-interleaved }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-audioparse.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-audioparse.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstAudioParse-struct"></a><h3>struct GstAudioParse</h3>
+<pre class="programlisting">struct GstAudioParse;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-audioparse.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstAudioParse--channels"></a><h3>The <code class="literal">“channels”</code> property</h3>
+<pre class="programlisting"> “channels” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Number of channels in raw stream.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [1,64]</p>
+<p>Default value: 2</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioParse--depth"></a><h3>The <code class="literal">“depth”</code> property</h3>
+<pre class="programlisting"> “depth” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Depth of audio samples in raw stream.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: >= 1</p>
+<p>Default value: 16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioParse--endianness"></a><h3>The <code class="literal">“endianness”</code> property</h3>
+<pre class="programlisting"> “endianness” <span class="type">GstAudioParseEndianness</span></pre>
+<p>Endianness of audio samples in raw stream.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: Little Endian</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioParse--format"></a><h3>The <code class="literal">“format”</code> property</h3>
+<pre class="programlisting"> “format” <span class="type">GstAudioParseFormat</span></pre>
+<p>Format of audio samples in raw stream.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: Raw</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioParse--rate"></a><h3>The <code class="literal">“rate”</code> property</h3>
+<pre class="programlisting"> “rate” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Rate of audio samples in raw stream.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: >= 1</p>
+<p>Default value: 44100</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioParse--signed"></a><h3>The <code class="literal">“signed”</code> property</h3>
+<pre class="programlisting"> “signed” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Sign of audio samples in raw stream.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioParse--width"></a><h3>The <code class="literal">“width”</code> property</h3>
+<pre class="programlisting"> “width” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Width of audio samples in raw stream.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: >= 1</p>
+<p>Default value: 16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioParse--channel-positions"></a><h3>The <code class="literal">“channel-positions”</code> property</h3>
+<pre class="programlisting"> “channel-positions” <a href="/usr/share/gtk-doc/html/gobjectgobject-Value-arrays.html#GValueArray"><span class="type">GValueArray</span></a> *</pre>
+<p>Channel positions used on the output.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioParse--interleaved"></a><h3>The <code class="literal">“interleaved”</code> property</h3>
+<pre class="programlisting"> “interleaved” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>True if audio has interleaved layout.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioParse--raw-format"></a><h3>The <code class="literal">“raw-format”</code> property</h3>
+<pre class="programlisting"> “raw-format” <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstaudio.html#GstAudioFormat"><span class="type">GstAudioFormat</span></a></pre>
+<p>Format of audio samples in raw stream.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: GST_AUDIO_FORMAT_S16LE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioParse--use-sink-caps"></a><h3>The <code class="literal">“use-sink-caps”</code> property</h3>
+<pre class="programlisting"> “use-sink-caps” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Use the sink caps for the format, only performing timestamping.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: FALSE</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-autoconvert.html b/docs/plugins/html/gst-plugins-bad-plugins-autoconvert.html
index b352b06..2432e32 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-autoconvert.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-autoconvert.html
@@ -6,7 +6,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
-<link rel="prev" href="gst-plugins-bad-plugins-audiomixer.html" title="audiomixer">
+<link rel="prev" href="gst-plugins-bad-plugins-audioparse.html" title="audioparse">
<link rel="next" href="gst-plugins-bad-plugins-bs2b.html" title="bs2b">
<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
@@ -22,7 +22,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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gst-plugins-bad-plugins-audiomixer.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-audioparse.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
<td><a accesskey="n" href="gst-plugins-bad-plugins-bs2b.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
</tr></table>
<div class="refentry">
@@ -98,7 +98,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.8.8.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.9.8.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -124,7 +124,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.8.8.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.9.8.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-bs2b.html b/docs/plugins/html/gst-plugins-bad-plugins-bs2b.html
index e457fc0..610db8d 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-bs2b.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-bs2b.html
@@ -88,10 +88,27 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-bs2b.description"></a><h2>Description</h2>
+<p>Improve headphone listening of stereo audio records using the bs2b library.
+It does so by mixing the left and right channel in a way that simulates
+a stereo speaker setup while using headphones.</p>
+<div class="refsect2">
+<a name="id-1.2.10.8.3"></a><h3>Example pipelines</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> audiotestsrc <span class="gtkdoc opt">!</span> <span class="string">"audio/x-raw,channel-mask=(bitmask)0x1"</span> <span class="gtkdoc opt">!</span> interleave name<span class="gtkdoc opt">=</span>i <span class="gtkdoc opt">!</span> bs2b <span class="gtkdoc opt">!</span> autoaudiosink audiotestsrc freq<span class="gtkdoc opt">=</span><span class="number">330</span> <span class="gtkdoc opt">!</span> <span class="string">"audio/x-raw,channel-mask=(bitmask)0x2"</span> <span class="gtkdoc opt">!</span> i<span class="gtkdoc opt">.</span></pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Play two independent sine test sources and crossfeed them.
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.9.8.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.10.8.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -117,7 +134,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.9.8.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.10.8.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-bulge.html b/docs/plugins/html/gst-plugins-bad-plugins-bulge.html
index 0c63bd8..63ec883 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-bulge.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-bulge.html
@@ -79,7 +79,7 @@
<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.10.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.11.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -95,7 +95,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.10.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.11.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -121,7 +121,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.10.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.11.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-burn.html b/docs/plugins/html/gst-plugins-bad-plugins-burn.html
index b073437..5a1242b 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-burn.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-burn.html
@@ -83,7 +83,7 @@
<a name="gst-plugins-bad-plugins-burn.description"></a><h2>Description</h2>
<p>Burn adjusts the colors of a video stream in realtime.</p>
<div class="refsect2">
-<a name="id-1.2.11.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.12.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -99,7 +99,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.11.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.12.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -125,7 +125,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.11.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.12.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-camerabin.html b/docs/plugins/html/gst-plugins-bad-plugins-camerabin.html
index f0def8f..0236422 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-camerabin.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-camerabin.html
@@ -33,10 +33,126 @@
</tr></table></div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-camerabin.description"></a><h2>Description</h2>
+<p>CameraBin is a high-level camera object that encapsulates gstreamer
+elements, providing an API for controlling a digital camera.</p>
+<div class="note">
+Note that camerabin is still UNSTABLE and under development.
+</div>
+<p>CameraBin has the following main features:</p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+Record videos
+</li>
+<li class="listitem">
+Capture pictures
+</li>
+<li class="listitem">
+Display a viewfinder
+</li>
+<li class="listitem">
+Post preview images for each capture (video and image)
+</li>
+</ul></div>
+<div class="refsect2">
+<a name="id-1.2.13.3.6"></a><h3>Usage</h3>
+<p>
+Camerabin can be created using <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElementFactory.html#gst-element-factory-make"><code class="function">gst_element_factory_make()</code></a> just like
+any other element. Video or image capture mode can be selected using
+the <span class="type">“mode”</span> property and the file to save the capture is
+selected using <span class="type">“location”</span> property.
+
+After creating camerabin, applications might want to do some
+customization (there's a section about this below), then select
+the desired mode and start capturing.
+
+In image capture mode, just send a <span class="type">“start-capture”</span> and a
+picture will be captured. When the picture is stored on the selected
+location, a <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstMessage.html#GST-MESSAGE-ELEMENT:CAPS"><code class="literal">GST_MESSAGE_ELEMENT</code></a> named 'image-done' will be posted on
+the <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstBus.html#GstBus-struct"><span class="type">GstBus</span></a>.
+
+In video capture mode, send a <span class="type">“start-capture”</span> to start
+recording, then send a <span class="type">“stop-capture”</span> to stop recording.
+Note that both signals are asynchronous, so, calling
+<span class="type">“stop-capture”</span> doesn't guarantee that the video has been
+properly finished yet. Applications should wait for the 'video-done'
+message to be posted on the bus.
+
+In both modes, if <span class="type">“post-previews”</span> is <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, a <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstBuffer.html#GstBuffer-struct"><span class="type">GstBuffer</span></a>
+will be post to the <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstBus.html#GstBus-struct"><span class="type">GstBus</span></a> in a field named 'buffer', in a
+'preview-image' message of type <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstMessage.html#GST-MESSAGE-ELEMENT:CAPS"><code class="literal">GST_MESSAGE_ELEMENT</code></a>.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.13.3.7"></a><h3>Customization</h3>
+<p>
+Camerabin provides various customization properties, allowing the user
+to set custom filters, selecting the viewfinder sink and formats to
+use to encode the captured images/videos.
+
+<a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile-struct"><span class="type">GstEncodingProfile</span></a>s are used to tell camerabin which formats it
+should encode the captures to, those should be set to
+<span class="type">“image-profile”</span> and <span class="type">“video-profile”</span>. Default is
+jpeg for images, and ogg (theora and vorbis) for video. If a profile without
+an audio stream is set for video, audio will be disabled on recordings.
+
+<span class="type">“preview-caps”</span> can be used to select which format preview
+images should be posted on the <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstBus.html#GstBus-struct"><span class="type">GstBus</span></a>. It has to be a raw video format.
+
+Camerabin has a <span class="type">“camera-source”</span> property so applications can
+set their source that will provide buffers for the viewfinder and for
+captures. This camera source is a special type of source that has 3 pads.
+To use a 'regular' source with a single pad you should use
+<span class="type">GstWrapperCameraBinSource</span>, it will adapt your source and provide 3 pads.
+
+Applications can also select the desired viewfinder sink using
+<span class="type">“viewfinder-sink”</span>, it is also possible to select the audio
+source using <span class="type">“audio-source”</span>.
+
+The viewfinder resolution can be configured using
+<span class="type">“viewfinder-caps”</span>, these <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstCaps.html#GstCaps-struct"><span class="type">GstCaps</span></a> should be a subset of
+<span class="type">“viewfinder-supported-caps”</span>.
+
+To select the desired resolution for captures, camerabin provides
+<span class="type">“image-capture-caps”</span> and <span class="type">“video-capture-caps”</span>,
+these caps must be a subset of what the source can produce. The allowed
+caps can be probed using <span class="type">“image-capture-supported-caps”</span> and
+<span class="type">“video-capture-supported-caps”</span>. In an analogous way, there
+are <span class="type">“audio-capture-caps”</span> and
+<span class="type">“audio-capture-supported-caps”</span>.
+
+Camerabin also allows applications to insert custom <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct"><span class="type">GstElements</span></a> on any
+of its branches: video capture, image capture, viewfinder and preview.
+Check <span class="type">“video-filter”</span>, <span class="type">“image-filter”</span>,
+<span class="type">“viewfinder-filter”</span> and <span class="type">“preview-filter”</span>.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.13.3.8"></a><h3>Example launch line</h3>
+<p>
+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.
+</p>
+<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 <span class="gtkdoc opt">-</span>m camerabin</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+
+<p>
+</p>
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.12.3.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.13.3.9.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -62,7 +178,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.12.3.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.13.3.9.2"></a><h3>Element Pads</h3>
</div>
</div>
</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-chromium.html b/docs/plugins/html/gst-plugins-bad-plugins-chromium.html
index 35591c3..4b76f1e 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-chromium.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-chromium.html
@@ -61,6 +61,19 @@
</table></div>
</div>
<a name="GstChromium"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-chromium.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-chromium.html#GstChromium-struct" title="struct GstChromium">GstChromium</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
<a name="gst-plugins-bad-plugins-chromium.object-hierarchy"></a><h2>Object Hierarchy</h2>
<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
<span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
@@ -75,7 +88,7 @@
<a name="gst-plugins-bad-plugins-chromium.description"></a><h2>Description</h2>
<p>Chromium breaks the colors of a video stream in realtime.</p>
<div class="refsect2">
-<a name="id-1.2.13.6.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.14.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -91,7 +104,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.13.6.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.14.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -117,7 +130,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.13.6.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.14.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -175,6 +188,10 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-chromium.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstChromium-struct"></a><h3>struct GstChromium</h3>
+<pre class="programlisting">struct GstChromium;</pre>
+</div>
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-chromium.property-details"></a><h2>Property Details</h2>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-circle.html b/docs/plugins/html/gst-plugins-bad-plugins-circle.html
index 868ec80..a025dde 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-circle.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-circle.html
@@ -91,7 +91,7 @@
<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.14.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.15.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -107,7 +107,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.14.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.15.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -133,7 +133,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.14.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.15.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-coloreffects.html b/docs/plugins/html/gst-plugins-bad-plugins-coloreffects.html
index c7b755b..0cc39c4 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-coloreffects.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-coloreffects.html
@@ -42,7 +42,7 @@
<col width="200px" class="properties_flags">
</colgroup>
<tbody><tr>
-<td class="property_type"><span class="type">GstColorEffectsPreset</span></td>
+<td class="property_type"><a class="link" href="gst-plugins-bad-plugins-coloreffects.html#GstColorEffectsPreset" title="enum GstColorEffectsPreset"><span class="type">GstColorEffectsPreset</span></a></td>
<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-coloreffects.html#GstColorEffects--preset" title="The “preset” property">preset</a></td>
<td class="property_flags">Read / Write</td>
</tr></tbody>
@@ -55,10 +55,16 @@
<col width="150px" class="name">
<col class="description">
</colgroup>
-<tbody><tr>
+<tbody>
+<tr>
<td class="datatype_keyword">struct</td>
<td class="function_name"><a class="link" href="gst-plugins-bad-plugins-coloreffects.html#GstColorEffects-struct" title="struct GstColorEffects">GstColorEffects</a></td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-plugins-coloreffects.html#GstColorEffectsPreset" title="enum GstColorEffectsPreset">GstColorEffectsPreset</a></td>
+</tr>
+</tbody>
</table></div>
</div>
<div class="refsect1">
@@ -76,7 +82,7 @@
<a name="gst-plugins-bad-plugins-coloreffects.description"></a><h2>Description</h2>
<p>Map colors of the video input to a lookup table</p>
<div class="refsect2">
-<a name="id-1.2.15.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.16.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -94,7 +100,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.15.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.16.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -120,7 +126,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.15.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.16.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -183,12 +189,59 @@
<pre class="programlisting">struct GstColorEffects;</pre>
<p>Opaque datastructure.</p>
</div>
+<hr>
+<div class="refsect2">
+<a name="GstColorEffectsPreset"></a><h3>enum GstColorEffectsPreset</h3>
+<p>How to split the video frame and which side reflect</p>
+<div class="refsect3">
+<a name="GstColorEffectsPreset.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" 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-COLOR-EFFECTS-PRESET-NONE:CAPS"></a>GST_COLOR_EFFECTS_PRESET_NONE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-COLOR-EFFECTS-PRESET-HEAT:CAPS"></a>GST_COLOR_EFFECTS_PRESET_HEAT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-COLOR-EFFECTS-PRESET-SEPIA:CAPS"></a>GST_COLOR_EFFECTS_PRESET_SEPIA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-COLOR-EFFECTS-PRESET-XRAY:CAPS"></a>GST_COLOR_EFFECTS_PRESET_XRAY</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-COLOR-EFFECTS-PRESET-XPRO:CAPS"></a>GST_COLOR_EFFECTS_PRESET_XPRO</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-COLOR-EFFECTS-PRESET-YELLOWBLUE:CAPS"></a>GST_COLOR_EFFECTS_PRESET_YELLOWBLUE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-coloreffects.property-details"></a><h2>Property Details</h2>
<div class="refsect2">
<a name="GstColorEffects--preset"></a><h3>The <code class="literal">“preset”</code> property</h3>
-<pre class="programlisting"> “preset” <span class="type">GstColorEffectsPreset</span></pre>
+<pre class="programlisting"> “preset” <a class="link" href="gst-plugins-bad-plugins-coloreffects.html#GstColorEffectsPreset" title="enum GstColorEffectsPreset"><span class="type">GstColorEffectsPreset</span></a></pre>
<p>Color effect preset to use.</p>
<p>Flags: Read / Write</p>
<p>Default value: Do nothing preset</p>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-compositor.html b/docs/plugins/html/gst-plugins-bad-plugins-compositor.html
index 13e52d4..47d9e71 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-compositor.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-compositor.html
@@ -16,7 +16,8 @@
<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-compositor.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
- <a href="#gst-plugins-bad-plugins-compositor.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-compositor.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_interfaces"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-compositor.implemented-interfaces" class="shortcut">Implemented Interfaces</a></span><span id="nav_properties"> <span class="dim">|</span>
<a href="#gst-plugins-bad-plugins-compositor.properties" class="shortcut">Properties</a></span>
</td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
@@ -42,28 +43,49 @@
<col width="200px" class="properties_flags">
</colgroup>
<tbody><tr>
-<td class="property_type"><span class="type">GstCompositorBackground</span></td>
+<td class="property_type"><a class="link" href="gst-plugins-bad-plugins-compositor.html#GstCompositorBackground" title="enum GstCompositorBackground"><span class="type">GstCompositorBackground</span></a></td>
<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-compositor.html#GstCompositor--background" title="The “background” property">background</a></td>
<td class="property_flags">Read / Write</td>
</tr></tbody>
</table></div>
</div>
-<a name="GstCompositor"></a><a name="GstCompositorPad"></a><div class="refsect1">
+<a name="GstCompositor"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-compositor.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-compositor.html#GstCompositor-struct" title="struct GstCompositor">GstCompositor</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-plugins-compositor.html#GstCompositorBackground" title="enum GstCompositorBackground">GstCompositorBackground</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
<a name="gst-plugins-bad-plugins-compositor.object-hierarchy"></a><h2>Object Hierarchy</h2>
<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
<span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
<span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
- <span class="lineart">├──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
- <span class="lineart">│</span> <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0gst-plugins-bad-libs-GstAggregator.html#GstAggregator">GstAggregator</a>
- <span class="lineart">│</span> <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0gst-plugins-bad-libs-GstVideoAggregator.html#GstVideoAggregator">GstVideoAggregator</a>
- <span class="lineart">│</span> <span class="lineart">╰──</span> GstCompositor
- <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstPad.html#GstPad-struct">GstPad</a>
- <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0gst-plugins-bad-libs-GstAggregatorPad.html#GstAggregatorPad">GstAggregatorPad</a>
- <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0gst-plugins-bad-libs-GstVideoAggregatorPad.html#GstVideoAggregatorPad">GstVideoAggregatorPad</a>
- <span class="lineart">╰──</span> GstCompositorPad
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0gst-plugins-bad-libs-GstAggregator.html#GstAggregator">GstAggregator</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0gst-plugins-bad-libs-GstVideoAggregator.html#GstVideoAggregator">GstVideoAggregator</a>
+ <span class="lineart">╰──</span> GstCompositor
</pre>
</div>
<div class="refsect1">
+<a name="gst-plugins-bad-plugins-compositor.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstCompositor implements
+ <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstChildProxy.html#GstChildProxy-struct">GstChildProxy</a>.</p>
+</div>
+<div class="refsect1">
<a name="gst-plugins-bad-plugins-compositor.description"></a><h2>Description</h2>
<p>Compositor can accept AYUV, ARGB and BGRA video streams. For each of the requested
sink pads it will compare the incoming geometry and framerate to define the
@@ -71,7 +93,7 @@
biggest incoming video stream and the framerate of the fastest incoming one.</p>
<p>Compositor will do colorspace conversion.</p>
<p>Individual parameters for each input stream can be configured on the
-<a class="link" href="gst-plugins-bad-plugins-compositor.html#GstCompositorPad"><span class="type">GstCompositorPad</span></a>:</p>
+<span class="type">GstCompositorPad</span>:</p>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
"xpos": The x-coordinate position of the top-left corner of the picture
@@ -100,7 +122,7 @@
</li>
</ul></div>
<div class="refsect2">
-<a name="id-1.2.16.7.6"></a><h3>Sample pipelines</h3>
+<a name="id-1.2.17.8.6"></a><h3>Sample pipelines</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -128,7 +150,7 @@
A pipeline to demonstrate compositor used together with videobox.
This should show a 320x240 pixels video test source with some transparency
showing the background checker pattern. Another video test source with just
-the snow pattern of 100x100 pixels is overlayed on top of the first one on
+the snow pattern of 100x100 pixels is overlaid on top of the first one on
the left vertically centered with a small transparency showing the first
video test source behind and the checker pattern under it. Note that the
framerate of the output video is 10 frames per second.
@@ -199,7 +221,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.16.7.7.1"></a><h3>Element Information</h3>
+<a name="id-1.2.17.8.7.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -225,7 +247,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.16.7.7.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.17.8.7.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -283,12 +305,53 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-compositor.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstCompositor-struct"></a><h3>struct GstCompositor</h3>
+<pre class="programlisting">struct GstCompositor;</pre>
+<p>The opaque <a class="link" href="gst-plugins-bad-plugins-compositor.html#GstCompositor"><span class="type">GstCompositor</span></a> structure.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstCompositorBackground"></a><h3>enum GstCompositorBackground</h3>
+<div class="refsect3">
+<a name="GstCompositorBackground.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" 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="COMPOSITOR-BACKGROUND-CHECKER:CAPS"></a>COMPOSITOR_BACKGROUND_CHECKER</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="COMPOSITOR-BACKGROUND-BLACK:CAPS"></a>COMPOSITOR_BACKGROUND_BLACK</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="COMPOSITOR-BACKGROUND-WHITE:CAPS"></a>COMPOSITOR_BACKGROUND_WHITE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="COMPOSITOR-BACKGROUND-TRANSPARENT:CAPS"></a>COMPOSITOR_BACKGROUND_TRANSPARENT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-compositor.property-details"></a><h2>Property Details</h2>
<div class="refsect2">
<a name="GstCompositor--background"></a><h3>The <code class="literal">“background”</code> property</h3>
-<pre class="programlisting"> “background” <span class="type">GstCompositorBackground</span></pre>
+<pre class="programlisting"> “background” <a class="link" href="gst-plugins-bad-plugins-compositor.html#GstCompositorBackground" title="enum GstCompositorBackground"><span class="type">GstCompositorBackground</span></a></pre>
<p>Background type.</p>
<p>Flags: Read / Write</p>
<p>Default value: Checker pattern</p>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-cvdilate.html b/docs/plugins/html/gst-plugins-bad-plugins-cvdilate.html
index 42110b0..e740efd 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-cvdilate.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-cvdilate.html
@@ -60,10 +60,25 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-cvdilate.description"></a><h2>Description</h2>
+<p>Dilates the image with the cvDilate OpenCV function.</p>
+<div class="refsect2">
+<a name="id-1.2.18.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> videotestsrc <span class="gtkdoc opt">!</span> cvdilate <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.17.6.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.18.6.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -89,7 +104,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.17.6.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.18.6.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-cvequalizehist.html b/docs/plugins/html/gst-plugins-bad-plugins-cvequalizehist.html
index 46ddef6..cabaa3c 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-cvequalizehist.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-cvequalizehist.html
@@ -59,10 +59,26 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-cvequalizehist.description"></a><h2>Description</h2>
+<p>Equalizes the histogram of a grayscale image with the cvEqualizeHist OpenCV
+function.</p>
+<div class="refsect2">
+<a name="id-1.2.20.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> videotestsrc pattern<span class="gtkdoc opt">=</span><span class="number">23</span> <span class="gtkdoc opt">!</span> cvequalizehist <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.19.6.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.20.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.19.6.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.20.6.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-cverode.html b/docs/plugins/html/gst-plugins-bad-plugins-cverode.html
index 90c28fb..b2fe282 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-cverode.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-cverode.html
@@ -60,10 +60,25 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-cverode.description"></a><h2>Description</h2>
+<p>Erodes the image with the cvErode OpenCV function.</p>
+<div class="refsect2">
+<a name="id-1.2.19.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> videotestsrc <span class="gtkdoc opt">!</span> cverode <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.18.6.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.19.6.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -89,7 +104,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.18.6.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.19.6.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-cvlaplace.html b/docs/plugins/html/gst-plugins-bad-plugins-cvlaplace.html
index 692e54b..22d241c 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-cvlaplace.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-cvlaplace.html
@@ -92,10 +92,25 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-cvlaplace.description"></a><h2>Description</h2>
+<p>Applies cvLaplace OpenCV function to the image.</p>
+<div class="refsect2">
+<a name="id-1.2.21.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> videotestsrc <span class="gtkdoc opt">!</span> cvlaplace <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.20.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.21.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -121,7 +136,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.20.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.21.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-cvsmooth.html b/docs/plugins/html/gst-plugins-bad-plugins-cvsmooth.html
index 1bea917..271f3ab 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-cvsmooth.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-cvsmooth.html
@@ -117,10 +117,25 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-cvsmooth.description"></a><h2>Description</h2>
+<p>Smooths the image using thes cvSmooth OpenCV function.</p>
+<div class="refsect2">
+<a name="id-1.2.22.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> videotestsrc <span class="gtkdoc opt">!</span> cvsmooth <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.21.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.22.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -146,7 +161,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.21.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.22.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-cvsobel.html b/docs/plugins/html/gst-plugins-bad-plugins-cvsobel.html
index b1ad4da..b761de3 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-cvsobel.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-cvsobel.html
@@ -92,10 +92,25 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-cvsobel.description"></a><h2>Description</h2>
+<p>Applies the cvSobel OpenCV function to the image.</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> videotestsrc <span class="gtkdoc opt">!</span> cvsobel <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.22.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">
@@ -121,7 +136,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.22.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">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-dataurisrc.html b/docs/plugins/html/gst-plugins-bad-plugins-dataurisrc.html
index baa0ce1..2365ca4 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-dataurisrc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-dataurisrc.html
@@ -83,7 +83,7 @@
<a name="gst-plugins-bad-plugins-dataurisrc.description"></a><h2>Description</h2>
<p>dataurisrc handles data: URIs, see <a class="ulink" href="http://tools.ietf.org/html/rfc2397" target="_top">RFC 2397</a> for more information.</p>
<div class="refsect2">
-<a name="id-1.2.23.8.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.24.8.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -99,7 +99,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.23.8.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.24.8.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -125,7 +125,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.23.8.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.24.8.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-diffuse.html b/docs/plugins/html/gst-plugins-bad-plugins-diffuse.html
index 81a0a83..4713000 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-diffuse.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-diffuse.html
@@ -78,7 +78,7 @@
<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.24.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.25.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -94,7 +94,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.24.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.25.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -120,7 +120,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.24.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.25.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-dilate.html b/docs/plugins/html/gst-plugins-bad-plugins-dilate.html
index 85a5b4d..6d8d482 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-dilate.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-dilate.html
@@ -83,7 +83,7 @@
<a name="gst-plugins-bad-plugins-dilate.description"></a><h2>Description</h2>
<p>Dilate adjusts the colors of a video stream in realtime.</p>
<div class="refsect2">
-<a name="id-1.2.25.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.26.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -99,7 +99,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.25.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.26.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -125,7 +125,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.25.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.26.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-dodge.html b/docs/plugins/html/gst-plugins-bad-plugins-dodge.html
index 21a0ec1..0b69182 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-dodge.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-dodge.html
@@ -76,7 +76,7 @@
<a name="gst-plugins-bad-plugins-dodge.description"></a><h2>Description</h2>
<p>Dodge saturates the colors of a video stream in realtime.</p>
<div class="refsect2">
-<a name="id-1.2.26.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.27.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -92,7 +92,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.26.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.27.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -118,7 +118,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.26.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.27.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-dtmfdetect.html b/docs/plugins/html/gst-plugins-bad-plugins-dtmfdetect.html
index 29c6103..f804dd8 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-dtmfdetect.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-dtmfdetect.html
@@ -28,7 +28,7 @@
<div class="refnamediv"><table width="100%"><tr>
<td valign="top">
<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-dtmfdetect.top_of_page"></a>dtmfdetect</span></h2>
-<p>dtmfdetect</p>
+<p>dtmfdetect — Detects DTMF tones</p>
</td>
<td class="gallery_image" valign="top" align="right"></td>
</tr></table></div>
@@ -57,10 +57,31 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-dtmfdetect.description"></a><h2>Description</h2>
+<p>This element will detect DTMF tones and emit messages.</p>
+<p>The message is called <code class="classname">"dtmf-event"</code> and has
+the following fields:</p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem"><p>
+ gint <code class="classname">type</code> (0-1):
+ The application uses this field to specify which of the two methods
+ specified in RFC 2833 to use. The value should be 0 for tones and 1 for
+ named events. Tones are specified by their frequencies and events are
+ specfied by their number. This element can only take events as input.
+ Do not confuse with "method" which specified the output.
+ </p></li>
+<li class="listitem"><p>
+ gint <code class="classname">number</code> (0-16):
+ The event number.
+ </p></li>
+<li class="listitem"><p>
+ gint <code class="classname">method</code> (2):
+ This field will always been 2 (ie sound) from this element.
+ </p></li>
+</ul></div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.27.6.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.28.6.5.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -86,7 +107,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.27.6.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.28.6.5.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-dtsdec.html b/docs/plugins/html/gst-plugins-bad-plugins-dtsdec.html
index 5924ce1..d67f234 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-dtsdec.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-dtsdec.html
@@ -73,10 +73,36 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-dtsdec.description"></a><h2>Description</h2>
+<p>Digital Theatre System (DTS) audio decoder</p>
+<div class="refsect2">
+<a name="id-1.2.29.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> dvdreadsrc title<span class="gtkdoc opt">=</span><span class="number">1</span> <span class="gtkdoc opt">!</span> mpegpsdemux <span class="gtkdoc opt">!</span> dtsdec <span class="gtkdoc opt">!</span> audioresample <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> alsasink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Play a DTS audio track from a dvd.
+<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> filesrc location<span class="gtkdoc opt">=</span>abc<span class="gtkdoc opt">.</span>dts <span class="gtkdoc opt">!</span> dtsdec <span class="gtkdoc opt">!</span> audioresample <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> alsasink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Decode a standalone file and play it.
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.28.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.29.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -102,7 +128,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.28.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.29.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-dvbsrc.html b/docs/plugins/html/gst-plugins-bad-plugins-dvbsrc.html
index d431f36..200f335 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-dvbsrc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-dvbsrc.html
@@ -366,10 +366,70 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-dvbsrc.description"></a><h2>Description</h2>
+<p>dvbsrc can be used to capture media from DVB cards. Supported DTV
+broadcasting standards include DVB-T/C/S, ATSC, ISDB-T and DTMB.</p>
+<div class="refsect2">
+<a name="id-1.2.30.8.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> dvbsrc modulation<span class="gtkdoc opt">=</span><span class="string">"QAM 64"</span> trans<span class="gtkdoc opt">-</span>mode<span class="gtkdoc opt">=</span><span class="number">8</span>k bandwidth<span class="gtkdoc opt">=</span><span class="number">8</span> frequency<span class="gtkdoc opt">=</span><span class="number">514000000</span> code<span class="gtkdoc opt">-</span>rate<span class="gtkdoc opt">-</span>lp<span class="gtkdoc opt">=</span>AUTO code<span class="gtkdoc opt">-</span>rate<span class="gtkdoc opt">-</span>hp<span class="gtkdoc opt">=</span><span class="number">2</span><span class="gtkdoc opt">/</span><span class="number">3</span> guard<span class="gtkdoc opt">=</span><span class="number">4</span> hierarchy<span class="gtkdoc opt">=</span><span class="number">0</span> <span class="gtkdoc opt">!</span> mpegtsdemux name<span class="gtkdoc opt">=</span>demux <span class="gtkdoc opt">!</span> queue max<span class="gtkdoc opt">-</span>size<span class="gtkdoc opt">-</span>buffers<span class="gtkdoc opt">=</span><span class="number">0</span> max<span class="gtkdoc opt">-</span>size<span class="gtkdoc opt">-</span>time<span class="gtkdoc opt">=</span><span class="number">0</span> <span class="gtkdoc opt">!</span> mpeg2dec <span class="gtkdoc opt">!</span> xvimagesink demux<span class="gtkdoc opt">. !</span> queue max<span class="gtkdoc opt">-</span>size<span class="gtkdoc opt">-</span>buffers<span class="gtkdoc opt">=</span><span class="number">0</span> max<span class="gtkdoc opt">-</span>size<span class="gtkdoc opt">-</span>time<span class="gtkdoc opt">=</span><span class="number">0</span> <span class="gtkdoc opt">!</span> mad <span class="gtkdoc opt">!</span> alsasink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ 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.
+<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> dvbsrc modulation<span class="gtkdoc opt">=</span><span class="string">"QAM 64"</span> trans<span class="gtkdoc opt">-</span>mode<span class="gtkdoc opt">=</span><span class="number">8</span>k bandwidth<span class="gtkdoc opt">=</span><span class="number">8</span> frequency<span class="gtkdoc opt">=</span><span class="number">514000000</span> code<span class="gtkdoc opt">-</span>rate<span class="gtkdoc opt">-</span>lp<span class="gtkdoc opt">=</span>AUTO code<span class="gtkdoc opt">-</span>rate<span class="gtkdoc opt">-</span>hp<span class="gtkdoc opt">=</span><span class="number">2</span><span class="gtkdoc opt">/</span><span class="number">3</span> guard<span class="gtkdoc opt">=</span><span class="number">4</span> hierarchy<span class="gtkdoc opt">=</span><span class="number">0</span> pids<span class="gtkdoc opt">=</span><span class="number">100</span><span class="gtkdoc opt">:</span><span class="number">256</span><span class="gtkdoc opt">:</span><span class="number">257</span> <span class="gtkdoc opt">!</span> mpegtsdemux name<span class="gtkdoc opt">=</span>demux <span class="gtkdoc opt">!</span> queue max<span class="gtkdoc opt">-</span>size<span class="gtkdoc opt">-</span>buffers<span class="gtkdoc opt">=</span><span class="number">0</span> max<span class="gtkdoc opt">-</span>size<span class="gtkdoc opt">-</span>time<span class="gtkdoc opt">=</span><span class="number">0</span> <span class="gtkdoc opt">!</span> mpeg2dec <span class="gtkdoc opt">!</span> xvimagesink demux<span class="gtkdoc opt">. !</span> queue max<span class="gtkdoc opt">-</span>size<span class="gtkdoc opt">-</span>buffers<span class="gtkdoc opt">=</span><span class="number">0</span> max<span class="gtkdoc opt">-</span>size<span class="gtkdoc opt">-</span>time<span class="gtkdoc opt">=</span><span class="number">0</span> <span class="gtkdoc opt">!</span> mad <span class="gtkdoc opt">!</span> alsasink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ 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.
+<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> dvbsrc polarity<span class="gtkdoc opt">=</span><span class="string">"h"</span> frequency<span class="gtkdoc opt">=</span><span class="number">11302000</span> symbol<span class="gtkdoc opt">-</span>rate<span class="gtkdoc opt">=</span><span class="number">27500</span> diseqc<span class="gtkdoc opt">-</span>source<span class="gtkdoc opt">=</span><span class="number">0</span> pids<span class="gtkdoc opt">=</span><span class="number">50</span><span class="gtkdoc opt">:</span><span class="number">102</span><span class="gtkdoc opt">:</span><span class="number">103</span> <span class="gtkdoc opt">!</span> mpegtsdemux name<span class="gtkdoc opt">=</span>demux <span class="gtkdoc opt">!</span> queue max<span class="gtkdoc opt">-</span>size<span class="gtkdoc opt">-</span>buffers<span class="gtkdoc opt">=</span><span class="number">0</span> max<span class="gtkdoc opt">-</span>size<span class="gtkdoc opt">-</span>time<span class="gtkdoc opt">=</span><span class="number">0</span> <span class="gtkdoc opt">!</span> mpeg2dec <span class="gtkdoc opt">!</span> xvimagesink demux<span class="gtkdoc opt">. !</span> queue max<span class="gtkdoc opt">-</span>size<span class="gtkdoc opt">-</span>buffers<span class="gtkdoc opt">=</span><span class="number">0</span> max<span class="gtkdoc opt">-</span>size<span class="gtkdoc opt">-</span>time<span class="gtkdoc opt">=</span><span class="number">0</span> <span class="gtkdoc opt">!</span> mad <span class="gtkdoc opt">!</span> alsasink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ 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.
+<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> dvbsrc frequency<span class="gtkdoc opt">=</span><span class="number">515142857</span> guard<span class="gtkdoc opt">=</span><span class="number">16</span> trans<span class="gtkdoc opt">-</span>mode<span class="gtkdoc opt">=</span><span class="string">"8k"</span> isdbt<span class="gtkdoc opt">-</span>layer<span class="gtkdoc opt">-</span>enabled<span class="gtkdoc opt">=</span><span class="number">7</span> isdbt<span class="gtkdoc opt">-</span>partial<span class="gtkdoc opt">-</span>reception<span class="gtkdoc opt">=</span><span class="number">1</span> isdbt<span class="gtkdoc opt">-</span>layera<span class="gtkdoc opt">-</span>fec<span class="gtkdoc opt">=</span><span class="string">"2/3"</span> isdbt<span class="gtkdoc opt">-</span>layera<span class="gtkdoc opt">-</span>modulation<span class="gtkdoc opt">=</span><span class="string">"QPSK"</span> isdbt<span class="gtkdoc opt">-</span>layera<span class="gtkdoc opt">-</span>segment<span class="gtkdoc opt">-</span>count<span class="gtkdoc opt">=</span><span class="number">1</span> isdbt<span class="gtkdoc opt">-</span>layera<span class="gtkdoc opt">-</span>time<span class="gtkdoc opt">-</span>interleaving<span class="gtkdoc opt">=</span><span class="number">4</span> isdbt<span class="gtkdoc opt">-</span>layerb<span class="gtkdoc opt">-</span>fec<span class="gtkdoc opt">=</span><span class="string">"3/4"</span> isdbt<span class="gtkdoc opt">-</span>layerb<span class="gtkdoc opt">-</span>modulation<span class="gtkdoc opt">=</span><span class="string">"qam-64"</span> isdbt<span class="gtkdoc opt">-</span>layerb<span class="gtkdoc opt">-</span>segment<span class="gtkdoc opt">-</span>count<span class="gtkdoc opt">=</span><span class="number">12</span> isdbt<span class="gtkdoc opt">-</span>layerb<span class="gtkdoc opt">-</span>time<span class="gtkdoc opt">-</span>interleaving<span class="gtkdoc opt">=</span><span class="number">2</span> isdbt<span class="gtkdoc opt">-</span>layerc<span class="gtkdoc opt">-</span>fec<span class="gtkdoc opt">=</span><span class="string">"1/2"</span> isdbt<span class="gtkdoc opt">-</span>layerc<span class="gtkdoc opt">-</span>modulation<span class="gtkdoc opt">=</span><span class="string">"qam-64"</span> isdbt<span class="gtkdoc opt">-</span>layerc<span class="gtkdoc opt">-</span>segment<span class="gtkdoc opt">-</span>count<span class="gtkdoc opt">=</span><span class="number">0</span> isdbt<span class="gtkdoc opt">-</span>layerc<span class="gtkdoc opt">-</span>time<span class="gtkdoc opt">-</span>interleaving<span class="gtkdoc opt">=</span><span class="number">0</span> delsys<span class="gtkdoc opt">=</span><span class="string">"isdb-t"</span> <span class="gtkdoc opt">!</span> tsdemux <span class="gtkdoc opt">!</span> <span class="string">"video/x-h264"</span> <span class="gtkdoc opt">!</span> h264parse <span class="gtkdoc opt">!</span> queue <span class="gtkdoc opt">!</span> avdec_h264 <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> queue <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ 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.
+<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> dvbsrc frequency<span class="gtkdoc opt">=</span><span class="number">503000000</span> delsys<span class="gtkdoc opt">=</span><span class="string">"atsc"</span> modulation<span class="gtkdoc opt">=</span><span class="string">"8vsb"</span> pids<span class="gtkdoc opt">=</span><span class="number">48</span><span class="gtkdoc opt">:</span><span class="number">49</span><span class="gtkdoc opt">:</span><span class="number">52</span> <span class="gtkdoc opt">!</span> decodebin name<span class="gtkdoc opt">=</span>dec dec<span class="gtkdoc opt">. !</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink dec<span class="gtkdoc opt">. !</span> audioconvert <span class="gtkdoc opt">!</span> autoaudiosink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Captures and renders KOFY-HD in San Jose, California. This is an ATSC broadcast, PMT ID 48, Audio/Video elementary stream PIDs 49 and 52 respectively.
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.29.8.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.30.8.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -396,7 +456,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.29.8.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.30.8.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -440,7 +500,7 @@
<div class="refsect2">
<a name="GstDvbSrc--bandwidth-hz"></a><h3>The <code class="literal">“bandwidth-hz”</code> property</h3>
<pre class="programlisting"> “bandwidth-hz” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a></pre>
-<p>(DVB-T) Bandwidth in Hz.</p>
+<p>Channel bandwidth in Hz.</p>
<p>Flags: Read / Write</p>
<p>Default value: 8000000</p>
</div>
@@ -530,7 +590,7 @@
<div class="refsect2">
<a name="GstDvbSrc--pids"></a><h3>The <code class="literal">“pids”</code> property</h3>
<pre class="programlisting"> “pids” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
-<p>Colon seperated list of pids (eg. 110:120).</p>
+<p>Colon-separated list of PIDs (eg. 110:120) to capture. ACT and CAT are automatically included but PMT should be added explicitly. Special value 8192 gets full MPEG-TS.</p>
<p>Flags: Write</p>
<p>Default value: "8192"</p>
</div>
@@ -878,6 +938,29 @@
<pre class="programlisting"><span class="returnvalue">void</span>
user_function (<a class="link" href="gst-plugins-bad-plugins-dvbsrc.html#GstDvbSrc"><span class="type">GstDvbSrc</span></a> *gstdvbsrc,
<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data)</pre>
+<p>Signal emited when the tunner has successfully got a lock on a signal.</p>
+<div class="refsect3">
+<a name="GstDvbSrc-tuning-done.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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>gstdvbsrc</p></td>
+<td class="parameter_description"><p>the element on which the signal is emitted</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: <a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></p>
</div>
<hr>
@@ -886,6 +969,30 @@
<pre class="programlisting"><span class="returnvalue">void</span>
user_function (<a class="link" href="gst-plugins-bad-plugins-dvbsrc.html#GstDvbSrc"><span class="type">GstDvbSrc</span></a> *gstdvbsrc,
<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data)</pre>
+<p>Signal emited when the tunner failed to get a lock on the
+signal.</p>
+<div class="refsect3">
+<a name="GstDvbSrc-tuning-fail.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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>gstdvbsrc</p></td>
+<td class="parameter_description"><p>the element on which the signal is emitted</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: <a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></p>
</div>
<hr>
@@ -894,6 +1001,30 @@
<pre class="programlisting"><span class="returnvalue">void</span>
user_function (<a class="link" href="gst-plugins-bad-plugins-dvbsrc.html#GstDvbSrc"><span class="type">GstDvbSrc</span></a> *gstdvbsrc,
<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data)</pre>
+<p>Signal emited when the element first attempts to tune the
+frontend tunner to a given frequency.</p>
+<div class="refsect3">
+<a name="GstDvbSrc-tuning-start.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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>gstdvbsrc</p></td>
+<td class="parameter_description"><p>the element on which the signal is emitted</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: <a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></p>
</div>
<hr>
@@ -902,6 +1033,30 @@
<pre class="programlisting"><span class="returnvalue">void</span>
user_function (<a class="link" href="gst-plugins-bad-plugins-dvbsrc.html#GstDvbSrc"><span class="type">GstDvbSrc</span></a> *gstdvbsrc,
<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data)</pre>
+<p>Signal emited from the application to the element, instructing it
+to tune.</p>
+<div class="refsect3">
+<a name="GstDvbSrc-tune.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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>gstdvbsrc</p></td>
+<td class="parameter_description"><p>the element on which the signal is emitted</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: <a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-ACTION:CAPS">Action</a></p>
</div>
</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-dvdspu.html b/docs/plugins/html/gst-plugins-bad-plugins-dvdspu.html
index 3c2c75c..17629d0 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-dvdspu.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-dvdspu.html
@@ -58,7 +58,7 @@
<a name="gst-plugins-bad-plugins-dvdspu.description"></a><h2>Description</h2>
<p>DVD sub picture overlay element.</p>
<div class="refsect2">
-<a name="id-1.2.30.6.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.31.6.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -74,7 +74,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.30.6.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.31.6.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -100,7 +100,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.30.6.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.31.6.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-edgedetect.html b/docs/plugins/html/gst-plugins-bad-plugins-edgedetect.html
index 9e781a7..f105b6a 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-edgedetect.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-edgedetect.html
@@ -15,7 +15,9 @@
<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-edgedetect.description" class="shortcut">Description</a></span>
+ <a href="#gst-plugins-bad-plugins-edgedetect.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-edgedetect.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-edgedetect.properties" class="shortcut">Properties</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>
@@ -32,11 +34,83 @@
<td class="gallery_image" valign="top" align="right"></td>
</tr></table></div>
<div class="refsect1">
+<a name="gst-plugins-bad-plugins-edgedetect.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-edgedetect.html#GstEdgeDetect--aperture" title="The “aperture” property">aperture</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-edgedetect.html#GstEdgeDetect--mask" title="The “mask” property">mask</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-edgedetect.html#GstEdgeDetect--threshold1" title="The “threshold1” property">threshold1</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-edgedetect.html#GstEdgeDetect--threshold2" title="The “threshold2” property">threshold2</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="GstEdgeDetect"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-edgedetect.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-edgedetect.html#GstEdgeDetect-struct" title="struct GstEdgeDetect">GstEdgeDetect</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-edgedetect.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseTransform.html#GstBaseTransform-struct">GstBaseTransform</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideofilter.html#GstVideoFilter-struct">GstVideoFilter</a>
+ <span class="lineart">╰──</span> GstOpencvVideoFilter
+ <span class="lineart">╰──</span> GstEdgeDetect
+</pre>
+</div>
+<div class="refsect1">
<a name="gst-plugins-bad-plugins-edgedetect.description"></a><h2>Description</h2>
+<p>Performs canny edge detection on videos and images</p>
+<div class="refsect2">
+<a name="id-1.2.33.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> videotestsrc <span class="gtkdoc opt">!</span> decodebin <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> edgedetect <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> xvimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.32.3.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.33.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -62,7 +136,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.32.3.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.33.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -120,6 +194,47 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-edgedetect.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstEdgeDetect-struct"></a><h3>struct GstEdgeDetect</h3>
+<pre class="programlisting">struct GstEdgeDetect;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-edgedetect.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstEdgeDetect--aperture"></a><h3>The <code class="literal">“aperture”</code> property</h3>
+<pre class="programlisting"> “aperture” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Aperture size for Sobel operator (Must be either 3, 5 or 7.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [3,7]</p>
+<p>Default value: 3</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstEdgeDetect--mask"></a><h3>The <code class="literal">“mask”</code> property</h3>
+<pre class="programlisting"> “mask” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Sets whether the detected edges should be used as a mask on the original input or not.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstEdgeDetect--threshold1"></a><h3>The <code class="literal">“threshold1”</code> property</h3>
+<pre class="programlisting"> “threshold1” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Threshold value for canny edge detection.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,1000]</p>
+<p>Default value: 50</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstEdgeDetect--threshold2"></a><h3>The <code class="literal">“threshold2”</code> property</h3>
+<pre class="programlisting"> “threshold2” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Second threshold value for canny edge detection.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,1000]</p>
+<p>Default value: 150</p>
+</div>
</div>
</div>
<div class="footer">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-exclusion.html b/docs/plugins/html/gst-plugins-bad-plugins-exclusion.html
index 23fac6e..d34c0e9 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-exclusion.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-exclusion.html
@@ -83,7 +83,7 @@
<a name="gst-plugins-bad-plugins-exclusion.description"></a><h2>Description</h2>
<p>Exclusion saturates the colors of a video stream in realtime.</p>
<div class="refsect2">
-<a name="id-1.2.31.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.32.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -99,7 +99,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.31.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.32.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -125,7 +125,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.31.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.32.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-faac.html b/docs/plugins/html/gst-plugins-bad-plugins-faac.html
index 7c1c563..082180e 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-faac.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-faac.html
@@ -117,10 +117,25 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-faac.description"></a><h2>Description</h2>
+<p>faac encodes raw audio to AAC (MPEG-4 part 3) streams.</p>
+<div class="refsect2">
+<a name="id-1.2.34.8.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> audiotestsrc wave<span class="gtkdoc opt">=</span>sine num<span class="gtkdoc opt">-</span>buffers<span class="gtkdoc opt">=</span><span class="number">100</span> <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> faac <span class="gtkdoc opt">!</span> matroskamux <span class="gtkdoc opt">!</span> filesink location<span class="gtkdoc opt">=</span>sine<span class="gtkdoc opt">.</span>mkv</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Encode a sine beep as aac and write to matroska container.
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.33.8.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.34.8.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -146,7 +161,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.33.8.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.34.8.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -301,6 +316,10 @@
<p>Default value: VBR</p>
</div>
</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-faac.see-also"></a><h2>See Also</h2>
+<p>faad</p>
+</div>
</div>
<div class="footer">
<hr>Generated by GTK-Doc V1.25</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-faad.html b/docs/plugins/html/gst-plugins-bad-plugins-faad.html
index cb2f509..b29896b 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-faad.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-faad.html
@@ -57,10 +57,36 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-faad.description"></a><h2>Description</h2>
+<p>faad decodes AAC (MPEG-4 part 3) stream.</p>
+<div class="refsect2">
+<a name="id-1.2.35.6.3"></a><h3>Example launch lines</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> filesrc location<span class="gtkdoc opt">=</span>example<span class="gtkdoc opt">.</span>mp4 <span class="gtkdoc opt">!</span> qtdemux <span class="gtkdoc opt">!</span> faad <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> audioresample <span class="gtkdoc opt">!</span> autoaudiosink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Play aac from mp4 file.
+<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> filesrc location<span class="gtkdoc opt">=</span>example<span class="gtkdoc opt">.</span>adts <span class="gtkdoc opt">!</span> faad <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> audioresample <span class="gtkdoc opt">!</span> autoaudiosink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Play standalone aac bitstream.
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.34.6.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.35.6.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -86,7 +112,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.34.6.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.35.6.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-faceblur.html b/docs/plugins/html/gst-plugins-bad-plugins-faceblur.html
index 814a222..c51e369 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-faceblur.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-faceblur.html
@@ -15,7 +15,9 @@
<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-faceblur.description" class="shortcut">Description</a></span>
+ <a href="#gst-plugins-bad-plugins-faceblur.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-faceblur.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-faceblur.properties" class="shortcut">Properties</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>
@@ -32,11 +34,94 @@
<td class="gallery_image" valign="top" align="right"></td>
</tr></table></div>
<div class="refsect1">
+<a name="gst-plugins-bad-plugins-faceblur.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-faceblur.html#GstFaceBlur--profile" title="The “profile” property">profile</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><span class="type">GstOpencvFaceBlurFlags</span></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-faceblur.html#GstFaceBlur--flags" title="The “flags” property">flags</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-faceblur.html#GstFaceBlur--min-neighbors" title="The “min-neighbors” property">min-neighbors</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-faceblur.html#GstFaceBlur--min-size-height" title="The “min-size-height” property">min-size-height</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-faceblur.html#GstFaceBlur--min-size-width" title="The “min-size-width” property">min-size-width</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-faceblur.html#GstFaceBlur--scale-factor" title="The “scale-factor” property">scale-factor</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="GstFaceBlur"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-faceblur.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-faceblur.html#GstFaceBlur-struct" title="struct GstFaceBlur">GstFaceBlur</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-faceblur.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseTransform.html#GstBaseTransform-struct">GstBaseTransform</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideofilter.html#GstVideoFilter-struct">GstVideoFilter</a>
+ <span class="lineart">╰──</span> GstOpencvVideoFilter
+ <span class="lineart">╰──</span> GstFaceBlur
+</pre>
+</div>
+<div class="refsect1">
<a name="gst-plugins-bad-plugins-faceblur.description"></a><h2>Description</h2>
+<p>Blurs faces in images and videos.</p>
+<div class="refsect2">
+<a name="id-1.2.36.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> autovideosrc <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> faceblur <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.35.3.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.36.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -62,7 +147,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.35.3.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.36.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -120,6 +205,64 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-faceblur.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstFaceBlur-struct"></a><h3>struct GstFaceBlur</h3>
+<pre class="programlisting">struct GstFaceBlur;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-faceblur.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstFaceBlur--profile"></a><h3>The <code class="literal">“profile”</code> property</h3>
+<pre class="programlisting"> “profile” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
+<p>Location of Haar cascade file to use for face blurion.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: "/usr/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml"</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFaceBlur--flags"></a><h3>The <code class="literal">“flags”</code> property</h3>
+<pre class="programlisting"> “flags” <span class="type">GstOpencvFaceBlurFlags</span></pre>
+<p>Flags to cvHaarDetectObjects.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: Do Canny edge detection to discard some regions</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFaceBlur--min-neighbors"></a><h3>The <code class="literal">“min-neighbors”</code> property</h3>
+<pre class="programlisting"> “min-neighbors” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Minimum number (minus 1) of neighbor rectangles that makes up an object.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: >= 0</p>
+<p>Default value: 3</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFaceBlur--min-size-height"></a><h3>The <code class="literal">“min-size-height”</code> property</h3>
+<pre class="programlisting"> “min-size-height” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Minimum window height size.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: >= 0</p>
+<p>Default value: 30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFaceBlur--min-size-width"></a><h3>The <code class="literal">“min-size-width”</code> property</h3>
+<pre class="programlisting"> “min-size-width” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Minimum window width size.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: >= 0</p>
+<p>Default value: 30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFaceBlur--scale-factor"></a><h3>The <code class="literal">“scale-factor”</code> property</h3>
+<pre class="programlisting"> “scale-factor” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>Factor by which the windows is scaled after each scan.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [1.1,10]</p>
+<p>Default value: 1.25</p>
+</div>
</div>
</div>
<div class="footer">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-facedetect.html b/docs/plugins/html/gst-plugins-bad-plugins-facedetect.html
index b997939..b2e77fa 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-facedetect.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-facedetect.html
@@ -15,7 +15,9 @@
<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-facedetect.description" class="shortcut">Description</a></span>
+ <a href="#gst-plugins-bad-plugins-facedetect.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-facedetect.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-facedetect.properties" class="shortcut">Properties</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>
@@ -32,11 +34,149 @@
<td class="gallery_image" valign="top" align="right"></td>
</tr></table></div>
<div class="refsect1">
+<a name="gst-plugins-bad-plugins-facedetect.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--display" title="The “display” property">display</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--eyes-profile" title="The “eyes-profile” property">eyes-profile</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><span class="type">GstOpencvFaceDetectFlags</span></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--flags" title="The “flags” property">flags</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--min-neighbors" title="The “min-neighbors” property">min-neighbors</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--min-size-height" title="The “min-size-height” property">min-size-height</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--min-size-width" title="The “min-size-width” property">min-size-width</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--mouth-profile" title="The “mouth-profile” property">mouth-profile</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--nose-profile" title="The “nose-profile” property">nose-profile</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--profile" title="The “profile” property">profile</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--scale-factor" title="The “scale-factor” property">scale-factor</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a class="link" href="gst-plugins-bad-plugins-facedetect.html#GstFaceDetectUpdates" title="enum GstFaceDetectUpdates"><span class="type">GstFaceDetectUpdates</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--updates" title="The “updates” property">updates</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-facedetect.html#GstFaceDetect--min-stddev" title="The “min-stddev” property">min-stddev</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="GstFaceDetect"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-facedetect.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-facedetect.html#GstFaceDetect-struct" title="struct GstFaceDetect">GstFaceDetect</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-plugins-facedetect.html#GstFaceDetectUpdates" title="enum GstFaceDetectUpdates">GstFaceDetectUpdates</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-facedetect.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseTransform.html#GstBaseTransform-struct">GstBaseTransform</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideofilter.html#GstVideoFilter-struct">GstVideoFilter</a>
+ <span class="lineart">╰──</span> GstOpencvVideoFilter
+ <span class="lineart">╰──</span> GstFaceDetect
+</pre>
+</div>
+<div class="refsect1">
<a name="gst-plugins-bad-plugins-facedetect.description"></a><h2>Description</h2>
+<p>Performs face detection on videos and images.
+If you have high cpu load you need to use videoscale with capsfilter and reduce the video resolution.</p>
+<p>The image is scaled down multiple times using the GstFaceDetect::scale-factor
+until the size is <= GstFaceDetect::min-size-width or
+GstFaceDetect::min-size-height.</p>
+<div class="refsect2">
+<a name="id-1.2.37.7.4"></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> autovideosrc <span class="gtkdoc opt">!</span> decodebin <span class="gtkdoc opt">!</span> colorspace <span class="gtkdoc opt">!</span> facedetect <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> xvimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Detect and show faces
+<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> autovideosrc <span class="gtkdoc opt">!</span> video<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw<span class="gtkdoc opt">,</span>width<span class="gtkdoc opt">=</span><span class="number">320</span><span class="gtkdoc opt">,</span>height<span class="gtkdoc opt">=</span><span class="number">240</span> <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> facedetect min<span class="gtkdoc opt">-</span>size<span class="gtkdoc opt">-</span>width<span class="gtkdoc opt">=</span><span class="number">60</span> min<span class="gtkdoc opt">-</span>size<span class="gtkdoc opt">-</span>height<span class="gtkdoc opt">=</span><span class="number">60</span> <span class="gtkdoc opt">!</span> colorspace <span class="gtkdoc opt">!</span> xvimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Detect large faces on a smaller image
+
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.36.3.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.37.7.5.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -62,7 +202,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.36.3.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.37.7.5.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -120,6 +260,158 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-facedetect.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstFaceDetect-struct"></a><h3>struct GstFaceDetect</h3>
+<pre class="programlisting">struct GstFaceDetect;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFaceDetectUpdates"></a><h3>enum GstFaceDetectUpdates</h3>
+<p>Bus messages update scheme</p>
+<div class="refsect3">
+<a name="GstFaceDetectUpdates.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" 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-FACEDETECT-UPDATES-EVERY-FRAME:CAPS"></a>GST_FACEDETECT_UPDATES_EVERY_FRAME</p></td>
+<td class="enum_member_description">
+<p>Send bus update messages for every frame</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-FACEDETECT-UPDATES-ON-CHANGE:CAPS"></a>GST_FACEDETECT_UPDATES_ON_CHANGE</p></td>
+<td class="enum_member_description">
+<p>Send bus update messages on change (face detected/not detected)</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-FACEDETECT-UPDATES-ON-FACE:CAPS"></a>GST_FACEDETECT_UPDATES_ON_FACE</p></td>
+<td class="enum_member_description">
+<p>Send bus update messages when a face is detected</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-FACEDETECT-UPDATES-NONE:CAPS"></a>GST_FACEDETECT_UPDATES_NONE</p></td>
+<td class="enum_member_description">
+<p>No bus update messages</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-facedetect.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstFaceDetect--display"></a><h3>The <code class="literal">“display”</code> property</h3>
+<pre class="programlisting"> “display” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Sets whether the detected faces should be highlighted in the output.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFaceDetect--eyes-profile"></a><h3>The <code class="literal">“eyes-profile”</code> property</h3>
+<pre class="programlisting"> “eyes-profile” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
+<p>Location of Haar cascade file to use for eye-pair detection.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: "/usr/share/OpenCV/haarcascades/haarcascade_mcs_eyepair_small.xml"</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFaceDetect--flags"></a><h3>The <code class="literal">“flags”</code> property</h3>
+<pre class="programlisting"> “flags” <span class="type">GstOpencvFaceDetectFlags</span></pre>
+<p>Flags to cvHaarDetectObjects.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: Do Canny edge detection to discard some regions</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFaceDetect--min-neighbors"></a><h3>The <code class="literal">“min-neighbors”</code> property</h3>
+<pre class="programlisting"> “min-neighbors” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Minimum number (minus 1) of neighbor rectangles that makes up an object.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: >= 0</p>
+<p>Default value: 3</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFaceDetect--min-size-height"></a><h3>The <code class="literal">“min-size-height”</code> property</h3>
+<pre class="programlisting"> “min-size-height” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Minimum area height to be recognized as a face.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: >= 0</p>
+<p>Default value: 30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFaceDetect--min-size-width"></a><h3>The <code class="literal">“min-size-width”</code> property</h3>
+<pre class="programlisting"> “min-size-width” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Minimum area width to be recognized as a face.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: >= 0</p>
+<p>Default value: 30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFaceDetect--mouth-profile"></a><h3>The <code class="literal">“mouth-profile”</code> property</h3>
+<pre class="programlisting"> “mouth-profile” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
+<p>Location of Haar cascade file to use for mouth detection.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: "/usr/share/OpenCV/haarcascades/haarcascade_mcs_mouth.xml"</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFaceDetect--nose-profile"></a><h3>The <code class="literal">“nose-profile”</code> property</h3>
+<pre class="programlisting"> “nose-profile” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
+<p>Location of Haar cascade file to use for nose detection.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: "/usr/share/OpenCV/haarcascades/haarcascade_mcs_nose.xml"</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFaceDetect--profile"></a><h3>The <code class="literal">“profile”</code> property</h3>
+<pre class="programlisting"> “profile” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
+<p>Location of Haar cascade file to use for face detection.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: "/usr/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml"</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFaceDetect--scale-factor"></a><h3>The <code class="literal">“scale-factor”</code> property</h3>
+<pre class="programlisting"> “scale-factor” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>Factor by which the frame is scaled after each object scan.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [1.1,10]</p>
+<p>Default value: 1.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFaceDetect--updates"></a><h3>The <code class="literal">“updates”</code> property</h3>
+<pre class="programlisting"> “updates” <a class="link" href="gst-plugins-bad-plugins-facedetect.html#GstFaceDetectUpdates" title="enum GstFaceDetectUpdates"><span class="type">GstFaceDetectUpdates</span></a></pre>
+<p>When send update bus messages, if at all.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: Send update messages on every frame</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFaceDetect--min-stddev"></a><h3>The <code class="literal">“min-stddev”</code> property</h3>
+<pre class="programlisting"> “min-stddev” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Minimum image average standard deviation: on images with standard deviation lesser than this value facedetection will not be performed. Setting this property help to save cpu and reduce false positives not performing face detection on images with little changes.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,255]</p>
+<p>Default value: 0</p>
+</div>
</div>
</div>
<div class="footer">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-festival.html b/docs/plugins/html/gst-plugins-bad-plugins-festival.html
index 367e450..7c970e5 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-festival.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-festival.html
@@ -61,7 +61,7 @@
in server mode, started as </p>
<pre class="screen">festival --server</pre>
<div class="refsect2">
-<a name="id-1.2.37.6.5"></a><h3>Example pipeline</h3>
+<a name="id-1.2.38.6.5"></a><h3>Example pipeline</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -77,7 +77,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.37.6.6.1"></a><h3>Element Information</h3>
+<a name="id-1.2.38.6.6.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -103,7 +103,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.37.6.6.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.38.6.6.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-fisheye.html b/docs/plugins/html/gst-plugins-bad-plugins-fisheye.html
index f6ed0e8..2de95f9 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-fisheye.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-fisheye.html
@@ -62,7 +62,7 @@
<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.38.6.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.39.6.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -78,7 +78,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.38.6.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.39.6.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -104,7 +104,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.38.6.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.39.6.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-fpsdisplaysink.html b/docs/plugins/html/gst-plugins-bad-plugins-fpsdisplaysink.html
index 0955f02..68b482a 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-fpsdisplaysink.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-fpsdisplaysink.html
@@ -152,7 +152,7 @@
<a name="gst-plugins-bad-plugins-fpsdisplaysink.description"></a><h2>Description</h2>
<p>Can display the current and average framerate as a testoverlay or on stdout.</p>
<div class="refsect2">
-<a name="id-1.2.39.9.3"></a><h3>Example launch lines</h3>
+<a name="id-1.2.40.9.3"></a><h3>Example launch lines</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -174,7 +174,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.39.9.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.40.9.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -200,7 +200,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.39.9.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.40.9.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gaussianblur.html b/docs/plugins/html/gst-plugins-bad-plugins-gaussianblur.html
index da74357..e56bb7c 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-gaussianblur.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gaussianblur.html
@@ -7,7 +7,7 @@
<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
<link rel="prev" href="gst-plugins-bad-plugins-fpsdisplaysink.html" title="fpsdisplaysink">
-<link rel="next" href="gst-plugins-bad-plugins-jpegparse.html" title="jpegparse">
+<link rel="next" href="gst-plugins-bad-plugins-glcolorbalance.html" title="glcolorbalance">
<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
@@ -15,12 +15,14 @@
<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-gaussianblur.description" class="shortcut">Description</a></span>
+ <a href="#gst-plugins-bad-plugins-gaussianblur.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-gaussianblur.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-gaussianblur.properties" class="shortcut">Properties</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>
<td><a accesskey="p" href="gst-plugins-bad-plugins-fpsdisplaysink.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gst-plugins-bad-plugins-jpegparse.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-glcolorbalance.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-gaussianblur"></a><div class="titlepage"></div>
@@ -32,10 +34,49 @@
<td class="gallery_image" valign="top" align="right"></td>
</tr></table></div>
<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gaussianblur.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gaussianblur.html#GstGaussianBlur--sigma" title="The “sigma” property">sigma</a></td>
+<td class="property_flags">Read / Write</td>
+</tr></tbody>
+</table></div>
+</div>
+<a name="GstGaussianBlur"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-gaussianblur.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-gaussianblur.html#GstGaussianBlur-struct" title="struct GstGaussianBlur">GstGaussianBlur</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gaussianblur.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseTransform.html#GstBaseTransform-struct">GstBaseTransform</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideofilter.html#GstVideoFilter-struct">GstVideoFilter</a>
+ <span class="lineart">╰──</span> GstGaussianBlur
+</pre>
+</div>
+<div class="refsect1">
<a name="gst-plugins-bad-plugins-gaussianblur.description"></a><h2>Description</h2>
<p>Gaussianblur blurs the video stream in realtime.</p>
<div class="refsect2">
-<a name="id-1.2.40.3.3"></a><h3>Example launch line</h3>
+<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>
@@ -51,7 +92,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.40.3.4.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">
@@ -77,7 +118,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.40.3.4.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">
@@ -135,6 +176,21 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-gaussianblur.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGaussianBlur-struct"></a><h3>struct GstGaussianBlur</h3>
+<pre class="programlisting">struct GstGaussianBlur;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gaussianblur.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGaussianBlur--sigma"></a><h3>The <code class="literal">“sigma”</code> property</h3>
+<pre class="programlisting"> “sigma” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>Sigma value for gaussian blur (negative for sharpen).</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [-20,20]</p>
+<p>Default value: 1.2</p>
+</div>
</div>
</div>
<div class="footer">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-glcolorbalance.html b/docs/plugins/html/gst-plugins-bad-plugins-glcolorbalance.html
new file mode 100644
index 0000000..39f9b61
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-glcolorbalance.html
@@ -0,0 +1,261 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>glcolorbalance: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gaussianblur.html" title="gaussianblur">
+<link rel="next" href="gst-plugins-bad-plugins-glcolorconvert.html" title="glcolorconvert">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-glcolorbalance.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glcolorbalance.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_interfaces"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glcolorbalance.implemented-interfaces" class="shortcut">Implemented Interfaces</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glcolorbalance.properties" class="shortcut">Properties</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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gaussianblur.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-glcolorconvert.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-glcolorbalance"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-glcolorbalance.top_of_page"></a>glcolorbalance</span></h2>
+<p>glcolorbalance</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glcolorbalance.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glcolorbalance.html#GstGLColorBalance--brightness" title="The “brightness” property">brightness</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glcolorbalance.html#GstGLColorBalance--contrast" title="The “contrast” property">contrast</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glcolorbalance.html#GstGLColorBalance--hue" title="The “hue” property">hue</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glcolorbalance.html#GstGLColorBalance--saturation" title="The “saturation” property">saturation</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="GstGLColorBalance"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-glcolorbalance.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-glcolorbalance.html#GstGLColorBalance-struct" title="struct GstGLColorBalance">GstGLColorBalance</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glcolorbalance.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseTransform.html#GstBaseTransform-struct">GstBaseTransform</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLBaseFilter.html#GstGLBaseFilter-struct">GstGLBaseFilter</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLFilter.html#GstGLFilter-struct">GstGLFilter</a>
+ <span class="lineart">╰──</span> GstGLColorBalance
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glcolorbalance.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstGLColorBalance implements
+ <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance-struct">GstColorBalance</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glcolorbalance.description"></a><h2>Description</h2>
+<p>Adjusts brightness, contrast, hue, saturation on a video stream.</p>
+<div class="refsect2">
+<a name="id-1.2.42.8.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> videotestsrc <span class="gtkdoc opt">!</span> glupload <span class="gtkdoc opt">!</span> glcolorbalance saturation<span class="gtkdoc opt">=</span><span class="number">0.0</span> <span class="gtkdoc opt">!</span> glcolorconvert <span class="gtkdoc opt">!</span> gldownload <span class="gtkdoc opt">!</span> ximagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ This pipeline converts the image to black and white by setting the
+saturation to 0.0.
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.42.8.4.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Matthew Waters <matthew@centricular.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.42.8.4.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glcolorbalance.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glcolorbalance.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLColorBalance-struct"></a><h3>struct GstGLColorBalance</h3>
+<pre class="programlisting">struct GstGLColorBalance;</pre>
+<p>Opaque data structure.</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glcolorbalance.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGLColorBalance--brightness"></a><h3>The <code class="literal">“brightness”</code> property</h3>
+<pre class="programlisting"> “brightness” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>brightness.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [-1,1]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLColorBalance--contrast"></a><h3>The <code class="literal">“contrast”</code> property</h3>
+<pre class="programlisting"> “contrast” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>contrast.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,2]</p>
+<p>Default value: 1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLColorBalance--hue"></a><h3>The <code class="literal">“hue”</code> property</h3>
+<pre class="programlisting"> “hue” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>hue.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [-1,1]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLColorBalance--saturation"></a><h3>The <code class="literal">“saturation”</code> property</h3>
+<pre class="programlisting"> “saturation” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>saturation.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,2]</p>
+<p>Default value: 1</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-glcolorconvert.html b/docs/plugins/html/gst-plugins-bad-plugins-glcolorconvert.html
new file mode 100644
index 0000000..5734d16
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-glcolorconvert.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>glcolorconvert: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-glcolorbalance.html" title="glcolorbalance">
+<link rel="next" href="gst-plugins-bad-plugins-glcolorscale.html" title="glcolorscale">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-glcolorconvert.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glcolorconvert.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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-glcolorbalance.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-glcolorscale.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-glcolorconvert"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-glcolorconvert.top_of_page"></a>glcolorconvert</span></h2>
+<p>glcolorconvert</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<a name="GstGLColorConvertElement"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-glcolorconvert.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-glcolorconvert.html#GstGLColorConvertElement-struct" title="struct GstGLColorConvertElement">GstGLColorConvertElement</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glcolorconvert.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseTransform.html#GstBaseTransform-struct">GstBaseTransform</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLBaseFilter.html#GstGLBaseFilter-struct">GstGLBaseFilter</a>
+ <span class="lineart">╰──</span> GstGLColorConvertElement
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glcolorconvert.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.43.6.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Matthew Waters <matthew@centricular.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Converter/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.43.6.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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 }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 }</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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 }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 }</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glcolorconvert.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glcolorconvert.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLColorConvertElement-struct"></a><h3>struct GstGLColorConvertElement</h3>
+<pre class="programlisting">struct GstGLColorConvertElement;</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-glcolorscale.html b/docs/plugins/html/gst-plugins-bad-plugins-glcolorscale.html
new file mode 100644
index 0000000..8de053d
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-glcolorscale.html
@@ -0,0 +1,204 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>glcolorscale: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-glcolorconvert.html" title="glcolorconvert">
+<link rel="next" href="gst-plugins-bad-plugins-gldeinterlace.html" title="gldeinterlace">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-glcolorscale.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glcolorscale.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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-glcolorconvert.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gldeinterlace.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-glcolorscale"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-glcolorscale.top_of_page"></a>glcolorscale</span></h2>
+<p>glcolorscale</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<a name="GstGLColorscale"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-glcolorscale.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-glcolorscale.html#GstGLColorscale-struct" title="struct GstGLColorscale">GstGLColorscale</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glcolorscale.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseTransform.html#GstBaseTransform-struct">GstBaseTransform</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLBaseFilter.html#GstGLBaseFilter-struct">GstGLBaseFilter</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLFilter.html#GstGLFilter-struct">GstGLFilter</a>
+ <span class="lineart">╰──</span> GstGLColorscale
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glcolorscale.description"></a><h2>Description</h2>
+<p>video frame scaling and colorspace conversion.</p>
+<div class="refsect2">
+<a name="id-1.2.44.6.3"></a><h3>Scaling and Color space conversion</h3>
+<p>
+Equivalent to glupload ! gldownload.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.44.6.4"></a><h3>Examples</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> video<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw <span class="gtkdoc opt">!</span> glcolorscale <span class="gtkdoc opt">!</span> ximagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ A pipeline to test colorspace conversion.
+FBO is required.
+ <div class="informalexample">
+ <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+ <tbody>
+ <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">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> video<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw<span class="gtkdoc opt">,</span> width<span class="gtkdoc opt">=</span><span class="number">640</span><span class="gtkdoc opt">,</span> height<span class="gtkdoc opt">=</span><span class="number">480</span><span class="gtkdoc opt">,</span> format<span class="gtkdoc opt">=</span>AYUV <span class="gtkdoc opt">!</span> glcolorscale <span class="gtkdoc opt">!</span> \
+ video<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw<span class="gtkdoc opt">,</span> width<span class="gtkdoc opt">=</span><span class="number">320</span><span class="gtkdoc opt">,</span> height<span class="gtkdoc opt">=</span><span class="number">240</span><span class="gtkdoc opt">,</span> format<span class="gtkdoc opt">=</span>YV12 <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ A pipeline to test hardware scaling and colorspace conversion.
+FBO and GLSL are required.
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.44.6.5.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Julien Isorce <julien.isorce@gmail.com>
+Matthew Waters <matthew@centricular.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.44.6.5.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glcolorscale.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glcolorscale.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLColorscale-struct"></a><h3>struct GstGLColorscale</h3>
+<pre class="programlisting">struct GstGLColorscale;</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gldeinterlace.html b/docs/plugins/html/gst-plugins-bad-plugins-gldeinterlace.html
new file mode 100644
index 0000000..6ef5cd8
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gldeinterlace.html
@@ -0,0 +1,192 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gldeinterlace: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-glcolorscale.html" title="glcolorscale">
+<link rel="next" href="gst-plugins-bad-plugins-gldifferencematte.html" title="gldifferencematte">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gldeinterlace.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-gldeinterlace.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-gldeinterlace.properties" class="shortcut">Properties</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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-glcolorscale.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gldifferencematte.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-gldeinterlace"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gldeinterlace.top_of_page"></a>gldeinterlace</span></h2>
+<p>gldeinterlace</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gldeinterlace.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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"><span class="type">GstGLDeinterlaceMethod</span></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gldeinterlace.html#GstGLDeinterlace--method" title="The “method” property">method</a></td>
+<td class="property_flags">Read / Write</td>
+</tr></tbody>
+</table></div>
+</div>
+<a name="GstGLDeinterlace"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-gldeinterlace.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-gldeinterlace.html#GstGLDeinterlace-struct" title="struct GstGLDeinterlace">GstGLDeinterlace</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gldeinterlace.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseTransform.html#GstBaseTransform-struct">GstBaseTransform</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLBaseFilter.html#GstGLBaseFilter-struct">GstGLBaseFilter</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLFilter.html#GstGLFilter-struct">GstGLFilter</a>
+ <span class="lineart">╰──</span> GstGLDeinterlace
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gldeinterlace.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.45.7.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Julien Isorce <julien.isorce@mail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Deinterlace</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.45.7.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gldeinterlace.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gldeinterlace.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLDeinterlace-struct"></a><h3>struct GstGLDeinterlace</h3>
+<pre class="programlisting">struct GstGLDeinterlace;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gldeinterlace.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGLDeinterlace--method"></a><h3>The <code class="literal">“method”</code> property</h3>
+<pre class="programlisting"> “method” <span class="type">GstGLDeinterlaceMethod</span></pre>
+<p>Select which deinterlace method apply to GL video texture.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: Blur Vertical</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gldifferencematte.html b/docs/plugins/html/gst-plugins-bad-plugins-gldifferencematte.html
new file mode 100644
index 0000000..b07fa82
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gldifferencematte.html
@@ -0,0 +1,193 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gldifferencematte: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gldeinterlace.html" title="gldeinterlace">
+<link rel="next" href="gst-plugins-bad-plugins-gldownload.html" title="gldownload">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gldifferencematte.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-gldifferencematte.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-gldifferencematte.properties" class="shortcut">Properties</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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gldeinterlace.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gldownload.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-gldifferencematte"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gldifferencematte.top_of_page"></a>gldifferencematte</span></h2>
+<p>gldifferencematte</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gldifferencematte.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gldifferencematte.html#GstGLDifferenceMatte--location" title="The “location” property">location</a></td>
+<td class="property_flags">Read / Write</td>
+</tr></tbody>
+</table></div>
+</div>
+<a name="GstGLDifferenceMatte"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-gldifferencematte.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-gldifferencematte.html#GstGLDifferenceMatte-struct" title="struct GstGLDifferenceMatte">GstGLDifferenceMatte</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gldifferencematte.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseTransform.html#GstBaseTransform-struct">GstBaseTransform</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLBaseFilter.html#GstGLBaseFilter-struct">GstGLBaseFilter</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLFilter.html#GstGLFilter-struct">GstGLFilter</a>
+ <span class="lineart">╰──</span> GstGLDifferenceMatte
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gldifferencematte.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.46.7.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.46.7.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gldifferencematte.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gldifferencematte.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLDifferenceMatte-struct"></a><h3>struct GstGLDifferenceMatte</h3>
+<pre class="programlisting">struct GstGLDifferenceMatte;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gldifferencematte.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGLDifferenceMatte--location"></a><h3>The <code class="literal">“location”</code> property</h3>
+<pre class="programlisting"> “location” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
+<p>Background image location.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: NULL</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gldownload.html b/docs/plugins/html/gst-plugins-bad-plugins-gldownload.html
new file mode 100644
index 0000000..56f2e65
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gldownload.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gldownload: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gldifferencematte.html" title="gldifferencematte">
+<link rel="next" href="gst-plugins-bad-plugins-gleffects-blur.html" title="gleffects_blur">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gldownload.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-gldownload.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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gldifferencematte.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gleffects-blur.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-gldownload"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gldownload.top_of_page"></a>gldownload</span></h2>
+<p>gldownload</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<a name="GstGLDownloadElement"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-gldownload.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-gldownload.html#GstGLDownloadElement-struct" title="struct GstGLDownloadElement">GstGLDownloadElement</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gldownload.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseTransform.html#GstBaseTransform-struct">GstBaseTransform</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLBaseFilter.html#GstGLBaseFilter-struct">GstGLBaseFilter</a>
+ <span class="lineart">╰──</span> GstGLDownloadElement
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gldownload.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.47.6.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Matthew Waters <matthew@centricular.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.47.6.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(memory:GLMemory)</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(memory:GLMemory)</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gldownload.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gldownload.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLDownloadElement-struct"></a><h3>struct GstGLDownloadElement</h3>
+<pre class="programlisting">struct GstGLDownloadElement;</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gleffects-blur.html b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-blur.html
new file mode 100644
index 0000000..0ed343a
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-blur.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gleffects_blur: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gldownload.html" title="gldownload">
+<link rel="next" href="gst-plugins-bad-plugins-gleffects-bulge.html" title="gleffects_bulge">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gleffects-blur.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gldownload.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gleffects-bulge.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-gleffects-blur"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gleffects-blur.top_of_page"></a>gleffects_blur</span></h2>
+<p>gleffects_blur</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-blur.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.48.3.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.48.3.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-blur.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-blur.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gleffects-bulge.html b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-bulge.html
new file mode 100644
index 0000000..4ff2f7a
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-bulge.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gleffects_bulge: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gleffects-blur.html" title="gleffects_blur">
+<link rel="next" href="gst-plugins-bad-plugins-gleffects-fisheye.html" title="gleffects_fisheye">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gleffects-bulge.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gleffects-blur.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gleffects-fisheye.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-gleffects-bulge"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gleffects-bulge.top_of_page"></a>gleffects_bulge</span></h2>
+<p>gleffects_bulge</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-bulge.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.49.3.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.49.3.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-bulge.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-bulge.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gleffects-fisheye.html b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-fisheye.html
new file mode 100644
index 0000000..e586924
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-fisheye.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gleffects_fisheye: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gleffects-bulge.html" title="gleffects_bulge">
+<link rel="next" href="gst-plugins-bad-plugins-gleffects-glow.html" title="gleffects_glow">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gleffects-fisheye.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gleffects-bulge.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gleffects-glow.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-gleffects-fisheye"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gleffects-fisheye.top_of_page"></a>gleffects_fisheye</span></h2>
+<p>gleffects_fisheye</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-fisheye.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.50.3.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.50.3.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-fisheye.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-fisheye.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gleffects-glow.html b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-glow.html
new file mode 100644
index 0000000..1101a65
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-glow.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gleffects_glow: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gleffects-fisheye.html" title="gleffects_fisheye">
+<link rel="next" href="gst-plugins-bad-plugins-gleffects-heat.html" title="gleffects_heat">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gleffects-glow.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gleffects-fisheye.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gleffects-heat.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-gleffects-glow"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gleffects-glow.top_of_page"></a>gleffects_glow</span></h2>
+<p>gleffects_glow</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-glow.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.51.3.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.51.3.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-glow.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-glow.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gleffects-heat.html b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-heat.html
new file mode 100644
index 0000000..9028b1e
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-heat.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gleffects_heat: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gleffects-glow.html" title="gleffects_glow">
+<link rel="next" href="gst-plugins-bad-plugins-gleffects-identity.html" title="gleffects_identity">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gleffects-heat.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gleffects-glow.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gleffects-identity.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-gleffects-heat"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gleffects-heat.top_of_page"></a>gleffects_heat</span></h2>
+<p>gleffects_heat</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-heat.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.52.3.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.52.3.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-heat.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-heat.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gleffects-identity.html b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-identity.html
new file mode 100644
index 0000000..2996e5f
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-identity.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gleffects_identity: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gleffects-heat.html" title="gleffects_heat">
+<link rel="next" href="gst-plugins-bad-plugins-gleffects-laplacian.html" title="gleffects_laplacian">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gleffects-identity.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gleffects-heat.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gleffects-laplacian.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-gleffects-identity"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gleffects-identity.top_of_page"></a>gleffects_identity</span></h2>
+<p>gleffects_identity</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-identity.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.53.3.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.53.3.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-identity.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-identity.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gleffects-laplacian.html b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-laplacian.html
new file mode 100644
index 0000000..27ee98a
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-laplacian.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gleffects_laplacian: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gleffects-identity.html" title="gleffects_identity">
+<link rel="next" href="gst-plugins-bad-plugins-gleffects-lumaxpro.html" title="gleffects_lumaxpro">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gleffects-laplacian.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gleffects-identity.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gleffects-lumaxpro.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-gleffects-laplacian"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gleffects-laplacian.top_of_page"></a>gleffects_laplacian</span></h2>
+<p>gleffects_laplacian</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-laplacian.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.54.3.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.54.3.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-laplacian.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-laplacian.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gleffects-lumaxpro.html b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-lumaxpro.html
new file mode 100644
index 0000000..c9d4d29
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-lumaxpro.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gleffects_lumaxpro: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gleffects-laplacian.html" title="gleffects_laplacian">
+<link rel="next" href="gst-plugins-bad-plugins-gleffects-mirror.html" title="gleffects_mirror">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gleffects-lumaxpro.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gleffects-laplacian.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gleffects-mirror.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-gleffects-lumaxpro"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gleffects-lumaxpro.top_of_page"></a>gleffects_lumaxpro</span></h2>
+<p>gleffects_lumaxpro</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-lumaxpro.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.55.3.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.55.3.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-lumaxpro.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-lumaxpro.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gleffects-mirror.html b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-mirror.html
new file mode 100644
index 0000000..a77116b
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-mirror.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gleffects_mirror: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gleffects-lumaxpro.html" title="gleffects_lumaxpro">
+<link rel="next" href="gst-plugins-bad-plugins-gleffects-sepia.html" title="gleffects_sepia">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gleffects-mirror.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gleffects-lumaxpro.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gleffects-sepia.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-gleffects-mirror"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gleffects-mirror.top_of_page"></a>gleffects_mirror</span></h2>
+<p>gleffects_mirror</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-mirror.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.56.3.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.56.3.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-mirror.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-mirror.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gleffects-sepia.html b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-sepia.html
new file mode 100644
index 0000000..5ada4f9
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-sepia.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gleffects_sepia: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gleffects-mirror.html" title="gleffects_mirror">
+<link rel="next" href="gst-plugins-bad-plugins-gleffects-sin.html" title="gleffects_sin">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gleffects-sepia.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gleffects-mirror.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gleffects-sin.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-gleffects-sepia"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gleffects-sepia.top_of_page"></a>gleffects_sepia</span></h2>
+<p>gleffects_sepia</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-sepia.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.57.3.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.57.3.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-sepia.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-sepia.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gleffects-sin.html b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-sin.html
new file mode 100644
index 0000000..5fd68f9
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-sin.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gleffects_sin: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gleffects-sepia.html" title="gleffects_sepia">
+<link rel="next" href="gst-plugins-bad-plugins-gleffects-sobel.html" title="gleffects_sobel">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gleffects-sin.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gleffects-sepia.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gleffects-sobel.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-gleffects-sin"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gleffects-sin.top_of_page"></a>gleffects_sin</span></h2>
+<p>gleffects_sin</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-sin.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.58.3.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.58.3.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-sin.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-sin.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gleffects-sobel.html b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-sobel.html
new file mode 100644
index 0000000..796814c
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-sobel.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gleffects_sobel: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gleffects-sin.html" title="gleffects_sin">
+<link rel="next" href="gst-plugins-bad-plugins-gleffects-square.html" title="gleffects_square">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gleffects-sobel.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gleffects-sin.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gleffects-square.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-gleffects-sobel"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gleffects-sobel.top_of_page"></a>gleffects_sobel</span></h2>
+<p>gleffects_sobel</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-sobel.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.59.3.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.59.3.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-sobel.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-sobel.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gleffects-square.html b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-square.html
new file mode 100644
index 0000000..e7c9315
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-square.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gleffects_square: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gleffects-sobel.html" title="gleffects_sobel">
+<link rel="next" href="gst-plugins-bad-plugins-gleffects-squeeze.html" title="gleffects_squeeze">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gleffects-square.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gleffects-sobel.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gleffects-squeeze.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-gleffects-square"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gleffects-square.top_of_page"></a>gleffects_square</span></h2>
+<p>gleffects_square</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-square.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.60.3.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.60.3.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-square.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-square.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gleffects-squeeze.html b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-squeeze.html
new file mode 100644
index 0000000..b12ba9d
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-squeeze.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gleffects_squeeze: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gleffects-square.html" title="gleffects_square">
+<link rel="next" href="gst-plugins-bad-plugins-gleffects-stretch.html" title="gleffects_stretch">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gleffects-squeeze.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gleffects-square.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gleffects-stretch.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-gleffects-squeeze"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gleffects-squeeze.top_of_page"></a>gleffects_squeeze</span></h2>
+<p>gleffects_squeeze</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-squeeze.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.61.3.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.61.3.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-squeeze.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-squeeze.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gleffects-stretch.html b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-stretch.html
new file mode 100644
index 0000000..95c6e4f
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-stretch.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gleffects_stretch: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gleffects-squeeze.html" title="gleffects_squeeze">
+<link rel="next" href="gst-plugins-bad-plugins-gleffects-tunnel.html" title="gleffects_tunnel">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gleffects-stretch.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gleffects-squeeze.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gleffects-tunnel.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-gleffects-stretch"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gleffects-stretch.top_of_page"></a>gleffects_stretch</span></h2>
+<p>gleffects_stretch</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-stretch.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.62.3.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.62.3.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-stretch.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-stretch.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gleffects-tunnel.html b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-tunnel.html
new file mode 100644
index 0000000..2141769
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-tunnel.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gleffects_tunnel: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gleffects-stretch.html" title="gleffects_stretch">
+<link rel="next" href="gst-plugins-bad-plugins-gleffects-twirl.html" title="gleffects_twirl">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gleffects-tunnel.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gleffects-stretch.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gleffects-twirl.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-gleffects-tunnel"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gleffects-tunnel.top_of_page"></a>gleffects_tunnel</span></h2>
+<p>gleffects_tunnel</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-tunnel.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.63.3.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.63.3.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-tunnel.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-tunnel.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gleffects-twirl.html b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-twirl.html
new file mode 100644
index 0000000..5750612
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-twirl.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gleffects_twirl: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gleffects-tunnel.html" title="gleffects_tunnel">
+<link rel="next" href="gst-plugins-bad-plugins-gleffects.html" title="gleffects">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gleffects-twirl.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gleffects-tunnel.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gleffects.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-gleffects-twirl"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gleffects-twirl.top_of_page"></a>gleffects_twirl</span></h2>
+<p>gleffects_twirl</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-twirl.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.64.3.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.64.3.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-twirl.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-twirl.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gleffects-xpro.html b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-xpro.html
new file mode 100644
index 0000000..ac5b6ab
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-xpro.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gleffects_xpro: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gleffects.html" title="gleffects">
+<link rel="next" href="gst-plugins-bad-plugins-gleffects-xray.html" title="gleffects_xray">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gleffects-xpro.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gleffects.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gleffects-xray.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-gleffects-xpro"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gleffects-xpro.top_of_page"></a>gleffects_xpro</span></h2>
+<p>gleffects_xpro</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-xpro.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.66.3.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.66.3.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-xpro.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-xpro.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gleffects-xray.html b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-xray.html
new file mode 100644
index 0000000..d5b93fa
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gleffects-xray.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gleffects_xray: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gleffects-xpro.html" title="gleffects_xpro">
+<link rel="next" href="gst-plugins-bad-plugins-glfilterapp.html" title="glfilterapp">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gleffects-xray.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gleffects-xpro.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-glfilterapp.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-gleffects-xray"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gleffects-xray.top_of_page"></a>gleffects_xray</span></h2>
+<p>gleffects_xray</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-xray.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.67.3.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.67.3.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-xray.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects-xray.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gleffects.html b/docs/plugins/html/gst-plugins-bad-plugins-gleffects.html
new file mode 100644
index 0000000..55c21dd
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gleffects.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gleffects: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gleffects-twirl.html" title="gleffects_twirl">
+<link rel="next" href="gst-plugins-bad-plugins-gleffects-xpro.html" title="gleffects_xpro">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gleffects.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gleffects-twirl.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gleffects-xpro.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-gleffects"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gleffects.top_of_page"></a>gleffects</span></h2>
+<p>gleffects</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.65.3.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.65.3.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gleffects.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-glfilterapp.html b/docs/plugins/html/gst-plugins-bad-plugins-glfilterapp.html
new file mode 100644
index 0000000..ccfd928
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-glfilterapp.html
@@ -0,0 +1,306 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>glfilterapp: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gleffects-xray.html" title="gleffects_xray">
+<link rel="next" href="gst-plugins-bad-plugins-glfilterbin.html" title="glfilterbin">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-glfilterapp.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glfilterapp.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glfilterapp.properties" class="shortcut">Properties</a></span><span id="nav_signals"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glfilterapp.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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gleffects-xray.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-glfilterbin.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-glfilterapp"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-glfilterapp.top_of_page"></a>glfilterapp</span></h2>
+<p>glfilterapp</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterapp.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glfilterapp.html#GstGLFilterApp--client-data" title="The “client-data” property">client-data</a></td>
+<td class="property_flags">Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glfilterapp.html#GstGLFilterApp--client-draw-callback" title="The “client-draw-callback” property">client-draw-callback</a></td>
+<td class="property_flags">Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glfilterapp.html#GstGLFilterApp--client-reshape-callback" title="The “client-reshape-callback” property">client-reshape-callback</a></td>
+<td class="property_flags">Write</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterapp.signals"></a><h2>Signals</h2>
+<div class="informaltable"><table class="informaltable" 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"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a></td>
+<td class="signal_name"><a class="link" href="gst-plugins-bad-plugins-glfilterapp.html#GstGLFilterApp-client-draw" title="The “client-draw” signal">client-draw</a></td>
+<td class="signal_flags"><a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<a name="GstGLFilterApp"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterapp.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-glfilterapp.html#GstGLFilterApp-struct" title="struct GstGLFilterApp">GstGLFilterApp</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterapp.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseTransform.html#GstBaseTransform-struct">GstBaseTransform</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLBaseFilter.html#GstGLBaseFilter-struct">GstGLBaseFilter</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLFilter.html#GstGLFilter-struct">GstGLFilter</a>
+ <span class="lineart">╰──</span> GstGLFilterApp
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterapp.description"></a><h2>Description</h2>
+<p>The resize and redraw callbacks can be set from a client code.</p>
+<div class="refsect2">
+<a name="id-1.2.68.8.3"></a><h3>CLient callbacks</h3>
+<p>
+The graphic scene can be written from a client code through the
+two glfilterapp properties.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.68.8.4"></a><h3>Examples</h3>
+see gst-plugins-gl/tests/examples/generic/recordgraphic
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.68.8.5.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Julien Isorce <julien.isorce@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.68.8.5.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterapp.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterapp.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLFilterApp-struct"></a><h3>struct GstGLFilterApp</h3>
+<pre class="programlisting">struct GstGLFilterApp;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterapp.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGLFilterApp--client-data"></a><h3>The <code class="literal">“client-data”</code> property</h3>
+<pre class="programlisting"> “client-data” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a></pre>
+<p>Pass data to the draw and reshape callbacks.</p>
+<p>Flags: Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLFilterApp--client-draw-callback"></a><h3>The <code class="literal">“client-draw-callback”</code> property</h3>
+<pre class="programlisting"> “client-draw-callback” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a></pre>
+<p>Define a custom draw callback in a client code.</p>
+<p>Flags: Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLFilterApp--client-reshape-callback"></a><h3>The <code class="literal">“client-reshape-callback”</code> property</h3>
+<pre class="programlisting"> “client-reshape-callback” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a></pre>
+<p>Define a custom reshape callback in a client code.</p>
+<p>Flags: Write</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterapp.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstGLFilterApp-client-draw"></a><h3>The <code class="literal">“client-draw”</code> signal</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+user_function (<a class="link" href="gst-plugins-bad-plugins-glfilterapp.html#GstGLFilterApp"><span class="type">GstGLFilterApp</span></a> *object,
+ <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> texture,
+ <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> width,
+ <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> height,
+ <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data)</pre>
+<p>Will be emitted before to draw the texture. The client should
+redraw the surface/contents with the <em class="parameter"><code>texture</code></em>
+, <em class="parameter"><code>width</code></em>
+ and <em class="parameter"><code>height</code></em>
+.</p>
+<div class="refsect3">
+<a name="GstGLFilterApp-client-draw.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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>object</p></td>
+<td class="parameter_description"><p>the <a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink"><span class="type">GstGLImageSink</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>texture</p></td>
+<td class="parameter_description"><p>the <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> id of the texture.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>width</p></td>
+<td class="parameter_description"><p>the <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> width of the texture.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>height</p></td>
+<td class="parameter_description"><p>the <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> height of the texture.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="GstGLFilterApp-client-draw.returns"></a><h4>Returns</h4>
+<p> whether the texture was redrawn by the signal. If not, a
+default redraw will occur.</p>
+</div>
+<p>Flags: <a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-glfilterbin.html b/docs/plugins/html/gst-plugins-bad-plugins-glfilterbin.html
new file mode 100644
index 0000000..f258653
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-glfilterbin.html
@@ -0,0 +1,247 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>glfilterbin: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-glfilterapp.html" title="glfilterapp">
+<link rel="next" href="gst-plugins-bad-plugins-glfiltercube.html" title="glfiltercube">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-glfilterbin.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glfilterbin.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_interfaces"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glfilterbin.implemented-interfaces" class="shortcut">Implemented Interfaces</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glfilterbin.properties" class="shortcut">Properties</a></span><span id="nav_signals"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glfilterbin.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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-glfilterapp.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-glfiltercube.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-glfilterbin"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-glfilterbin.top_of_page"></a>glfilterbin</span></h2>
+<p>glfilterbin</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterbin.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct"><span class="type">GstElement</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glfilterbin.html#GstGLFilterBin--filter" title="The “filter” property">filter</a></td>
+<td class="property_flags">Read / Write</td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterbin.signals"></a><h2>Signals</h2>
+<div class="informaltable"><table class="informaltable" 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">
+<a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct"><span class="returnvalue">GstElement</span></a>*</td>
+<td class="signal_name"><a class="link" href="gst-plugins-bad-plugins-glfilterbin.html#GstGLFilterBin-create-element" title="The “create-element” signal">create-element</a></td>
+<td class="signal_flags"><a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<a name="GstGLFilterBin"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterbin.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-glfilterbin.html#GstGLFilterBin-struct" title="struct GstGLFilterBin">GstGLFilterBin</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterbin.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstBin.html#GstBin-struct">GstBin</a>
+ <span class="lineart">╰──</span> GstGLFilterBin
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterbin.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstGLFilterBin implements
+ <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstChildProxy.html#GstChildProxy-struct">GstChildProxy</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterbin.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.69.9.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Matthew Waters <matthew@centricular.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.69.9.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(meta:GstVideoGLTextureUploadMeta, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY)</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterbin.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterbin.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLFilterBin-struct"></a><h3>struct GstGLFilterBin</h3>
+<pre class="programlisting">struct GstGLFilterBin;</pre>
+<div class="refsect3">
+<a name="GstGLFilterBin.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" 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></tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterbin.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGLFilterBin--filter"></a><h3>The <code class="literal">“filter”</code> property</h3>
+<pre class="programlisting"> “filter” <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct"><span class="type">GstElement</span></a> *</pre>
+<p>The GL filter chain to use.</p>
+<p>Flags: Read / Write</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterbin.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstGLFilterBin-create-element"></a><h3>The <code class="literal">“create-element”</code> signal</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct"><span class="returnvalue">GstElement</span></a>*
+user_function (<a class="link" href="gst-plugins-bad-plugins-glfilterbin.html#GstGLFilterBin"><span class="type">GstGLFilterBin</span></a> *gstglfilterbin,
+ <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data)</pre>
+<p>Flags: <a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-glfiltercube.html b/docs/plugins/html/gst-plugins-bad-plugins-glfiltercube.html
new file mode 100644
index 0000000..e201760
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-glfiltercube.html
@@ -0,0 +1,319 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>glfiltercube: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-glfilterbin.html" title="glfilterbin">
+<link rel="next" href="gst-plugins-bad-plugins-glfilterglass.html" title="glfilterglass">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-glfiltercube.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glfiltercube.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glfiltercube.properties" class="shortcut">Properties</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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-glfilterbin.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-glfilterglass.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-glfiltercube"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-glfiltercube.top_of_page"></a>glfiltercube</span></h2>
+<p>glfiltercube</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfiltercube.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glfiltercube.html#GstGLFilterCube--aspect" title="The “aspect” property">aspect</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glfiltercube.html#GstGLFilterCube--blue" title="The “blue” property">blue</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glfiltercube.html#GstGLFilterCube--fovy" title="The “fovy” property">fovy</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glfiltercube.html#GstGLFilterCube--green" title="The “green” property">green</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glfiltercube.html#GstGLFilterCube--red" title="The “red” property">red</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glfiltercube.html#GstGLFilterCube--zfar" title="The “zfar” property">zfar</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glfiltercube.html#GstGLFilterCube--znear" title="The “znear” property">znear</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="GstGLFilterCube"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfiltercube.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-glfiltercube.html#GstGLFilterCube-struct" title="struct GstGLFilterCube">GstGLFilterCube</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfiltercube.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseTransform.html#GstBaseTransform-struct">GstBaseTransform</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLBaseFilter.html#GstGLBaseFilter-struct">GstGLBaseFilter</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLFilter.html#GstGLFilter-struct">GstGLFilter</a>
+ <span class="lineart">╰──</span> GstGLFilterCube
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfiltercube.description"></a><h2>Description</h2>
+<p>The resize and redraw callbacks can be set from a client code.</p>
+<div class="refsect2">
+<a name="id-1.2.70.7.3"></a><h3>Examples</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> glfiltercube <span class="gtkdoc opt">!</span> glimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ A pipeline to mpa textures on the 6 cube faces..
+FBO is required.
+<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> glfiltercube <span class="gtkdoc opt">!</span> video<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw<span class="gtkdoc opt">,</span> width<span class="gtkdoc opt">=</span><span class="number">640</span><span class="gtkdoc opt">,</span> height<span class="gtkdoc opt">=</span><span class="number">480</span> <span class="gtkdoc opt">!</span> glimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Resize scene after drawing the cube.
+The scene size is greater than the input video size.
+ <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> video<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw<span class="gtkdoc opt">,</span> width<span class="gtkdoc opt">=</span><span class="number">640</span><span class="gtkdoc opt">,</span> height<span class="gtkdoc opt">=</span><span class="number">480</span> <span class="gtkdoc opt">!</span> glfiltercube <span class="gtkdoc opt">!</span> glimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Resize scene before drawing the cube.
+The scene size is greater than the input video size.
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.70.7.4.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Julien Isorce <julien.isorce@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.70.7.4.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfiltercube.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfiltercube.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLFilterCube-struct"></a><h3>struct GstGLFilterCube</h3>
+<pre class="programlisting">struct GstGLFilterCube;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfiltercube.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGLFilterCube--aspect"></a><h3>The <code class="literal">“aspect”</code> property</h3>
+<pre class="programlisting"> “aspect” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>Field of view in the x direction.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,100]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLFilterCube--blue"></a><h3>The <code class="literal">“blue”</code> property</h3>
+<pre class="programlisting"> “blue” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a></pre>
+<p>Background blue color.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,1]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLFilterCube--fovy"></a><h3>The <code class="literal">“fovy”</code> property</h3>
+<pre class="programlisting"> “fovy” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>Field of view angle in degrees.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,180]</p>
+<p>Default value: 45</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLFilterCube--green"></a><h3>The <code class="literal">“green”</code> property</h3>
+<pre class="programlisting"> “green” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a></pre>
+<p>Background green color.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,1]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLFilterCube--red"></a><h3>The <code class="literal">“red”</code> property</h3>
+<pre class="programlisting"> “red” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a></pre>
+<p>Background red color.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,1]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLFilterCube--zfar"></a><h3>The <code class="literal">“zfar”</code> property</h3>
+<pre class="programlisting"> “zfar” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>Specifies the distance from the viewer to the far clipping plane.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,1000]</p>
+<p>Default value: 100</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLFilterCube--znear"></a><h3>The <code class="literal">“znear”</code> property</h3>
+<pre class="programlisting"> “znear” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>Specifies the distance from the viewer to the near clipping plane.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,100]</p>
+<p>Default value: 0.1</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-glfilterglass.html b/docs/plugins/html/gst-plugins-bad-plugins-glfilterglass.html
new file mode 100644
index 0000000..5986ead
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-glfilterglass.html
@@ -0,0 +1,193 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>glfilterglass: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-glfiltercube.html" title="glfiltercube">
+<link rel="next" href="gst-plugins-bad-plugins-glimagesinkelement.html" title="glimagesinkelement">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-glfilterglass.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glfilterglass.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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-glfiltercube.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-glimagesinkelement.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-glfilterglass"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-glfilterglass.top_of_page"></a>glfilterglass</span></h2>
+<p>glfilterglass</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<a name="GstGLFilterGlass"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterglass.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-glfilterglass.html#GstGLFilterGlass-struct" title="struct GstGLFilterGlass">GstGLFilterGlass</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterglass.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseTransform.html#GstBaseTransform-struct">GstBaseTransform</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLBaseFilter.html#GstGLBaseFilter-struct">GstGLBaseFilter</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLFilter.html#GstGLFilter-struct">GstGLFilter</a>
+ <span class="lineart">╰──</span> GstGLFilterGlass
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterglass.description"></a><h2>Description</h2>
+<p>Map textures on moving glass.</p>
+<div class="refsect2">
+<a name="id-1.2.71.6.3"></a><h3>Examples</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> glfilterglass <span class="gtkdoc opt">!</span> glimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ A pipeline inspired from http://www.mdk.org.pl/2007/11/17/gl-colorspace-conversions
+FBO is required.
+<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> glfilterglass <span class="gtkdoc opt">!</span> video<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw<span class="gtkdoc opt">,</span> width<span class="gtkdoc opt">=</span><span class="number">640</span><span class="gtkdoc opt">,</span> height<span class="gtkdoc opt">=</span><span class="number">480</span> <span class="gtkdoc opt">!</span> glimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ The scene is greater than the input size.
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.71.6.4.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Julien Isorce <julien.isorce@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.71.6.4.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterglass.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glfilterglass.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLFilterGlass-struct"></a><h3>struct GstGLFilterGlass</h3>
+<pre class="programlisting">struct GstGLFilterGlass;</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-glimagesink.html b/docs/plugins/html/gst-plugins-bad-plugins-glimagesink.html
new file mode 100644
index 0000000..a7398c3
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-glimagesink.html
@@ -0,0 +1,213 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>glimagesink: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-glimagesinkelement.html" title="glimagesinkelement">
+<link rel="next" href="gst-plugins-bad-plugins-glmixerbin.html" title="glmixerbin">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-glimagesink.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-glimagesinkelement.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-glmixerbin.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-glimagesink"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-glimagesink.top_of_page"></a>glimagesink</span></h2>
+<p>glimagesink</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glimagesink.description"></a><h2>Description</h2>
+<p>glimagesink renders video frames to a drawable on a local or remote
+display using OpenGL. This element can receive a Window ID from the
+application through the VideoOverlay interface and will then render video
+frames in this drawable.
+If no Window ID was provided by the application, the element will
+create its own internal window and render into it.</p>
+<p>See the <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLDisplay.html#GstGLDisplay-struct"><span class="type">GstGLDisplay</span></a> documentation for a list of environment variables that
+can override window/platform detection.</p>
+<div class="refsect2">
+<a name="id-1.2.73.3.4"></a><h3>Scaling</h3>
+<p>
+Depends on the driver, OpenGL handles hardware accelerated
+scaling of video frames. This means that the element will just accept
+incoming video frames no matter their geometry and will then put them to the
+drawable scaling them on the fly. Using the <a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--force-aspect-ratio" title="The “force-aspect-ratio” property"><span class="type">“force-aspect-ratio”</span></a>
+property it is possible to enforce scaling with a constant aspect ratio,
+which means drawing black borders around the video frame.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.73.3.5"></a><h3>Events</h3>
+<p>
+Through the gl thread, glimagesink handle some events coming from the drawable
+to manage its appearance even when the data is not flowing (GST_STATE_PAUSED).
+That means that even when the element is paused, it will receive expose events
+from the drawable and draw the latest frame with correct borders/aspect-ratio.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.73.3.6"></a><h3>Examples</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> video<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw <span class="gtkdoc opt">!</span> glimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ A pipeline to test hardware scaling.
+No special opengl extension is used in this pipeline, that's why it should work
+with OpenGL >= 1.1. That's the case if you are using the MESA3D driver v1.3.
+<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> video<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw<span class="gtkdoc opt">,</span>format<span class="gtkdoc opt">=</span>I420 <span class="gtkdoc opt">!</span> glimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ A pipeline to test hardware scaling and hardware colorspace conversion.
+When your driver supports GLSL (OpenGL Shading Language needs OpenGL >= 2.1),
+the 4 following format YUY2, UYVY, I420, YV12 and AYUV are converted to RGB32
+through some fragment shaders and using one framebuffer (FBO extension OpenGL >= 1.4).
+If your driver does not support GLSL but supports MESA_YCbCr extension then
+the you can use YUY2 and UYVY. In this case the colorspace conversion is automatically
+made when loading the texture and therefore no framebuffer is used.
+<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 gltestsrc <span class="gtkdoc opt">!</span> glimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ A pipeline 100% OpenGL.
+No special opengl extension is used in this pipeline, that's why it should work
+with OpenGL >= 1.1. That's the case if you are using the MESA3D driver v1.3.
+<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>plugins<span class="gtkdoc opt">-</span>bas<span class="gtkdoc opt">/</span>tests<span class="gtkdoc opt">/</span>examples<span class="gtkdoc opt">/</span>gl<span class="gtkdoc opt">/</span>generic<span class="gtkdoc opt">/</span>cube</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ The graphic FPS scene can be greater than the input video FPS.
+The graphic scene can be written from a client code through the
+two glfilterapp properties.
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.73.3.7.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Matthew Waters <matthew@centricular.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Sink/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.73.3.7.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(meta:GstVideoGLTextureUploadMeta, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glimagesink.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glimagesink.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-glimagesinkelement.html b/docs/plugins/html/gst-plugins-bad-plugins-glimagesinkelement.html
new file mode 100644
index 0000000..a735f9e
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-glimagesinkelement.html
@@ -0,0 +1,472 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>glimagesinkelement: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-glfilterglass.html" title="glfilterglass">
+<link rel="next" href="gst-plugins-bad-plugins-glimagesink.html" title="glimagesink">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-glimagesinkelement.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glimagesinkelement.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_interfaces"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glimagesinkelement.implemented-interfaces" class="shortcut">Implemented Interfaces</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glimagesinkelement.properties" class="shortcut">Properties</a></span><span id="nav_signals"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glimagesinkelement.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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-glfilterglass.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-glimagesink.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-glimagesinkelement"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-glimagesinkelement.top_of_page"></a>glimagesinkelement</span></h2>
+<p>glimagesinkelement</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glimagesinkelement.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--display" title="The “display” property">display</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--client-data" title="The “client-data” property">client-data</a></td>
+<td class="property_flags">Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--client-draw-callback" title="The “client-draw-callback” property">client-draw-callback</a></td>
+<td class="property_flags">Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--client-reshape-callback" title="The “client-reshape-callback” property">client-reshape-callback</a></td>
+<td class="property_flags">Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--force-aspect-ratio" title="The “force-aspect-ratio” property">force-aspect-ratio</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLContext.html#GstGLContext-struct"><span class="type">GstGLContext</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--other-context" title="The “other-context” property">other-context</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><span class="type">GstFraction</span></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--pixel-aspect-ratio" title="The “pixel-aspect-ratio” property">pixel-aspect-ratio</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLContext.html#GstGLContext-struct"><span class="type">GstGLContext</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--context" title="The “context” property">context</a></td>
+<td class="property_flags">Read</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--handle-events" title="The “handle-events” property">handle-events</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--ignore-alpha" title="The “ignore-alpha” property">ignore-alpha</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><span class="type">GstGLStereoDownmix</span></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--output-multiview-downmix-mode" title="The “output-multiview-downmix-mode” property">output-multiview-downmix-mode</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewFlags"><span class="type">GstVideoMultiviewFlags</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--output-multiview-flags" title="The “output-multiview-flags” property">output-multiview-flags</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewMode"><span class="type">GstVideoMultiviewMode</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--output-multiview-mode" title="The “output-multiview-mode” property">output-multiview-mode</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><span class="type">GstGLRotateMethod</span></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink--rotate-method" title="The “rotate-method” property">rotate-method</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glimagesinkelement.signals"></a><h2>Signals</h2>
+<div class="informaltable"><table class="informaltable" 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"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a></td>
+<td class="signal_name"><a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink-client-draw" title="The “client-draw” signal">client-draw</a></td>
+<td class="signal_flags"><a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></td>
+</tr>
+<tr>
+<td class="signal_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a></td>
+<td class="signal_name"><a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink-client-reshape" title="The “client-reshape” signal">client-reshape</a></td>
+<td class="signal_flags"><a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="GstGLImageSink"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-glimagesinkelement.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-glimagesinkelement.html#GstGLImageSink-struct" title="struct GstGLImageSink">GstGLImageSink</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glimagesinkelement.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseSink.html#GstBaseSink-struct">GstBaseSink</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideosink.html#GstVideoSink-struct">GstVideoSink</a>
+ <span class="lineart">╰──</span> GstGLImageSink
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glimagesinkelement.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstGLImageSink implements
+ <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideooverlay.html#GstVideoOverlay-struct">GstVideoOverlay</a> and <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstnavigation.html#GstNavigation-struct">GstNavigation</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glimagesinkelement.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.72.9.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Julien Isorce <julien.isorce@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Sink/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.72.9.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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 }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 }</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glimagesinkelement.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glimagesinkelement.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLImageSink-struct"></a><h3>struct GstGLImageSink</h3>
+<pre class="programlisting">struct GstGLImageSink;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glimagesinkelement.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGLImageSink--display"></a><h3>The <code class="literal">“display”</code> property</h3>
+<pre class="programlisting"> “display” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
+<p>Display name.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLImageSink--client-data"></a><h3>The <code class="literal">“client-data”</code> property</h3>
+<pre class="programlisting"> “client-data” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a></pre>
+<p>Pass data to the draw and reshape callbacks.</p>
+<p>Flags: Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLImageSink--client-draw-callback"></a><h3>The <code class="literal">“client-draw-callback”</code> property</h3>
+<pre class="programlisting"> “client-draw-callback” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a></pre>
+<p>Define a custom draw callback in a client code.</p>
+<p>Flags: Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLImageSink--client-reshape-callback"></a><h3>The <code class="literal">“client-reshape-callback”</code> property</h3>
+<pre class="programlisting"> “client-reshape-callback” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a></pre>
+<p>Define a custom reshape callback in a client code.</p>
+<p>Flags: Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLImageSink--force-aspect-ratio"></a><h3>The <code class="literal">“force-aspect-ratio”</code> property</h3>
+<pre class="programlisting"> “force-aspect-ratio” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>When enabled, scaling will respect original aspect ratio.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLImageSink--other-context"></a><h3>The <code class="literal">“other-context”</code> property</h3>
+<pre class="programlisting"> “other-context” <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLContext.html#GstGLContext-struct"><span class="type">GstGLContext</span></a> *</pre>
+<p>Give an external OpenGL context with which to share textures.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLImageSink--pixel-aspect-ratio"></a><h3>The <code class="literal">“pixel-aspect-ratio”</code> property</h3>
+<pre class="programlisting"> “pixel-aspect-ratio” <span class="type">GstFraction</span></pre>
+<p>The pixel aspect ratio of the device.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLImageSink--context"></a><h3>The <code class="literal">“context”</code> property</h3>
+<pre class="programlisting"> “context” <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLContext.html#GstGLContext-struct"><span class="type">GstGLContext</span></a> *</pre>
+<p>Get OpenGL context.</p>
+<p>Flags: Read</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLImageSink--handle-events"></a><h3>The <code class="literal">“handle-events”</code> property</h3>
+<pre class="programlisting"> “handle-events” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>When enabled, XEvents will be selected and handled.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLImageSink--ignore-alpha"></a><h3>The <code class="literal">“ignore-alpha”</code> property</h3>
+<pre class="programlisting"> “ignore-alpha” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>When enabled, alpha will be ignored and converted to black.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLImageSink--output-multiview-downmix-mode"></a><h3>The <code class="literal">“output-multiview-downmix-mode”</code> property</h3>
+<pre class="programlisting"> “output-multiview-downmix-mode” <span class="type">GstGLStereoDownmix</span></pre>
+<p>Output anaglyph type to generate when downmixing to mono.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: Dubois optimised Green-Magenta anaglyph</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLImageSink--output-multiview-flags"></a><h3>The <code class="literal">“output-multiview-flags”</code> property</h3>
+<pre class="programlisting"> “output-multiview-flags” <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewFlags"><span class="type">GstVideoMultiviewFlags</span></a></pre>
+<p>Output multiview layout modifier flags.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLImageSink--output-multiview-mode"></a><h3>The <code class="literal">“output-multiview-mode”</code> property</h3>
+<pre class="programlisting"> “output-multiview-mode” <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewMode"><span class="type">GstVideoMultiviewMode</span></a></pre>
+<p>Choose output mode for multiview/3D video.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: GST_VIDEO_MULTIVIEW_MODE_MONO</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLImageSink--rotate-method"></a><h3>The <code class="literal">“rotate-method”</code> property</h3>
+<pre class="programlisting"> “rotate-method” <span class="type">GstGLRotateMethod</span></pre>
+<p>rotate method.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: Identity (no rotation)</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glimagesinkelement.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstGLImageSink-client-draw"></a><h3>The <code class="literal">“client-draw”</code> signal</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+user_function (<a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink"><span class="type">GstGLImageSink</span></a> *object,
+ <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLContext.html#GstGLContext-struct"><span class="type">GstGLContext</span></a> *texture,
+ <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstSample.html#GstSample-struct"><span class="type">GstSample</span></a> *width,
+ <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data)</pre>
+<p>Will be emitted before actually drawing the texture. The client should
+redraw the surface/contents with the <em class="parameter"><code>texture</code></em>
+, <em class="parameter"><code>width</code></em>
+ and <em class="parameter"><code>height</code></em>
+ and
+and return <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>.</p>
+<div class="refsect3">
+<a name="GstGLImageSink-client-draw.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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>object</p></td>
+<td class="parameter_description"><p>the <a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink"><span class="type">GstGLImageSink</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>texture</p></td>
+<td class="parameter_description"><p>the <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> id of the texture.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>width</p></td>
+<td class="parameter_description"><p>the <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> width of the texture.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>height</p></td>
+<td class="parameter_description"><p>the <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> height of the texture.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="GstGLImageSink-client-draw.returns"></a><h4>Returns</h4>
+<p> whether the texture was redrawn by the signal. If not, a
+default redraw will occur.</p>
+</div>
+<p>Flags: <a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLImageSink-client-reshape"></a><h3>The <code class="literal">“client-reshape”</code> signal</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+user_function (<a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink"><span class="type">GstGLImageSink</span></a> *object,
+ <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLContext.html#GstGLContext-struct"><span class="type">GstGLContext</span></a> *width,
+ <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> height,
+ <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> Returns,
+ <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data)</pre>
+<p>The client should resize the surface/window/viewport with the <em class="parameter"><code>width</code></em>
+ and
+<em class="parameter"><code>height</code></em>
+ and return <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>.</p>
+<div class="refsect3">
+<a name="GstGLImageSink-client-reshape.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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>object</p></td>
+<td class="parameter_description"><p>the <a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html#GstGLImageSink"><span class="type">GstGLImageSink</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>width</p></td>
+<td class="parameter_description"><p>the <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> width of the texture.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>height</p></td>
+<td class="parameter_description"><p>the <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> height of the texture.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="GstGLImageSink-client-reshape.returns"></a><h4>Returns</h4>
+<p> whether the content area was resized by the signal. If not, a
+default viewport resize will occur.</p>
+</div>
+<p>Flags: <a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-glmixerbin.html b/docs/plugins/html/gst-plugins-bad-plugins-glmixerbin.html
new file mode 100644
index 0000000..46b821c
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-glmixerbin.html
@@ -0,0 +1,279 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>glmixerbin: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-glimagesink.html" title="glimagesink">
+<link rel="next" href="gst-plugins-bad-plugins-glmosaic.html" title="glmosaic">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-glmixerbin.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glmixerbin.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_interfaces"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glmixerbin.implemented-interfaces" class="shortcut">Implemented Interfaces</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glmixerbin.properties" class="shortcut">Properties</a></span><span id="nav_signals"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glmixerbin.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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-glimagesink.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-glmosaic.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-glmixerbin"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-glmixerbin.top_of_page"></a>glmixerbin</span></h2>
+<p>glmixerbin</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glmixerbin.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint64"><span class="type">gint64</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glmixerbin.html#GstGLMixerBin--latency" title="The “latency” property">latency</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct"><span class="type">GstElement</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glmixerbin.html#GstGLMixerBin--mixer" title="The “mixer” property">mixer</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint64"><span class="type">guint64</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glmixerbin.html#GstGLMixerBin--start-time" title="The “start-time” property">start-time</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><span class="type">GstGLMixerBinStartTimeSelection</span></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glmixerbin.html#GstGLMixerBin--start-time-selection" title="The “start-time-selection” property">start-time-selection</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glmixerbin.signals"></a><h2>Signals</h2>
+<div class="informaltable"><table class="informaltable" 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">
+<a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct"><span class="returnvalue">GstElement</span></a>*</td>
+<td class="signal_name"><a class="link" href="gst-plugins-bad-plugins-glmixerbin.html#GstGLMixerBin-create-element" title="The “create-element” signal">create-element</a></td>
+<td class="signal_flags"><a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<a name="GstGLMixerBin"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-glmixerbin.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-glmixerbin.html#GstGLMixerBin-struct" title="struct GstGLMixerBin">GstGLMixerBin</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glmixerbin.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstBin.html#GstBin-struct">GstBin</a>
+ <span class="lineart">╰──</span> GstGLMixerBin
+ <span class="lineart">╰──</span> GstGLVideoMixerBin
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glmixerbin.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstGLMixerBin implements
+ <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstChildProxy.html#GstChildProxy-struct">GstChildProxy</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glmixerbin.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.74.9.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Matthew Waters <matthew@centricular.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Bin/Filter/Effect/Video/Mixer</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.74.9.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink_%u</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>request</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(meta:GstVideoGLTextureUploadMeta, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY)</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glmixerbin.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glmixerbin.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLMixerBin-struct"></a><h3>struct GstGLMixerBin</h3>
+<pre class="programlisting">struct GstGLMixerBin;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glmixerbin.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGLMixerBin--latency"></a><h3>The <code class="literal">“latency”</code> property</h3>
+<pre class="programlisting"> “latency” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint64"><span class="type">gint64</span></a></pre>
+<p>Additional latency in live mode to allow upstream to take longer to produce buffers for the current position.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: >= 0</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLMixerBin--mixer"></a><h3>The <code class="literal">“mixer”</code> property</h3>
+<pre class="programlisting"> “mixer” <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct"><span class="type">GstElement</span></a> *</pre>
+<p>The GL mixer chain to use.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLMixerBin--start-time"></a><h3>The <code class="literal">“start-time”</code> property</h3>
+<pre class="programlisting"> “start-time” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint64"><span class="type">guint64</span></a></pre>
+<p>Start time to use if start-time-selection=set.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: 18446744073709551615</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLMixerBin--start-time-selection"></a><h3>The <code class="literal">“start-time-selection”</code> property</h3>
+<pre class="programlisting"> “start-time-selection” <span class="type">GstGLMixerBinStartTimeSelection</span></pre>
+<p>Decides which start time is output.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: Start at 0 running time (default)</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glmixerbin.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstGLMixerBin-create-element"></a><h3>The <code class="literal">“create-element”</code> signal</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct"><span class="returnvalue">GstElement</span></a>*
+user_function (<a class="link" href="gst-plugins-bad-plugins-glmixerbin.html#GstGLMixerBin"><span class="type">GstGLMixerBin</span></a> *gstglmixerbin,
+ <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data)</pre>
+<p>Flags: <a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-glmosaic.html b/docs/plugins/html/gst-plugins-bad-plugins-glmosaic.html
new file mode 100644
index 0000000..eb8ec85
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-glmosaic.html
@@ -0,0 +1,195 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>glmosaic: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-glmixerbin.html" title="glmixerbin">
+<link rel="next" href="gst-plugins-bad-plugins-gloverlay.html" title="gloverlay">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-glmosaic.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glmosaic.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_interfaces"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glmosaic.implemented-interfaces" class="shortcut">Implemented Interfaces</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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-glmixerbin.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gloverlay.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-glmosaic"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-glmosaic.top_of_page"></a>glmosaic</span></h2>
+<p>glmosaic</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<a name="GstGLMosaic"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-glmosaic.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-glmosaic.html#GstGLMosaic-struct" title="struct GstGLMosaic">GstGLMosaic</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glmosaic.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0gst-plugins-bad-libs-GstAggregator.html#GstAggregator">GstAggregator</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0gst-plugins-bad-libs-GstVideoAggregator.html#GstVideoAggregator">GstVideoAggregator</a>
+ <span class="lineart">╰──</span> GstGLBaseMixer
+ <span class="lineart">╰──</span> GstGLMixer
+ <span class="lineart">╰──</span> GstGLMosaic
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glmosaic.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstGLMosaic implements
+ <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstChildProxy.html#GstChildProxy-struct">GstChildProxy</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glmosaic.description"></a><h2>Description</h2>
+<p>glmixer sub element. N gl sink pads to 1 source pad.
+N + 1 OpenGL contexts shared together.
+N <= 6 because the rendering is more a like a cube than a mosaic
+Each opengl input stream is rendered on a cube face</p>
+<div class="refsect2">
+<a name="id-1.2.75.7.3"></a><h3>Examples</h3>
+<div class="informalexample">
+ <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+ <tbody>
+ <tr>
+ <td class="listing_lines" align="right"><pre>1
+2
+3
+4
+5
+6</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> video<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw<span class="gtkdoc opt">,</span> format<span class="gtkdoc opt">=</span>YUY2 <span class="gtkdoc opt">!</span> queue <span class="gtkdoc opt">!</span> glmosaic name<span class="gtkdoc opt">=</span>m <span class="gtkdoc opt">!</span> glimagesink \
+ videotestsrc pattern<span class="gtkdoc opt">=</span><span class="number">12</span> <span class="gtkdoc opt">!</span> video<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw<span class="gtkdoc opt">,</span> format<span class="gtkdoc opt">=</span>I420<span class="gtkdoc opt">,</span> framerate<span class="gtkdoc opt">=</span><span class="number">5</span><span class="gtkdoc opt">/</span><span class="number">1</span><span class="gtkdoc opt">,</span> width<span class="gtkdoc opt">=</span><span class="number">100</span><span class="gtkdoc opt">,</span> height<span class="gtkdoc opt">=</span><span class="number">200</span> <span class="gtkdoc opt">!</span> queue <span class="gtkdoc opt">!</span> m<span class="gtkdoc opt">.</span> \
+ videotestsrc <span class="gtkdoc opt">!</span> video<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw<span class="gtkdoc opt">,</span> framerate<span class="gtkdoc opt">=</span><span class="number">15</span><span class="gtkdoc opt">/</span><span class="number">1</span><span class="gtkdoc opt">,</span> width<span class="gtkdoc opt">=</span><span class="number">1500</span><span class="gtkdoc opt">,</span> height<span class="gtkdoc opt">=</span><span class="number">1500</span> <span class="gtkdoc opt">!</span> gleffects effect<span class="gtkdoc opt">=</span><span class="number">3</span> <span class="gtkdoc opt">!</span> queue <span class="gtkdoc opt">!</span> m<span class="gtkdoc opt">.</span> \
+ videotestsrc <span class="gtkdoc opt">!</span> gleffects effect<span class="gtkdoc opt">=</span><span class="number">2</span> <span class="gtkdoc opt">!</span> queue <span class="gtkdoc opt">!</span> m<span class="gtkdoc opt">.</span> \
+ videotestsrc <span class="gtkdoc opt">!</span> glfiltercube <span class="gtkdoc opt">!</span> queue <span class="gtkdoc opt">!</span> m<span class="gtkdoc opt">.</span> \
+ videotestsrc <span class="gtkdoc opt">!</span> gleffects effect<span class="gtkdoc opt">=</span><span class="number">6</span> <span class="gtkdoc opt">!</span> queue <span class="gtkdoc opt">!</span> m<span class="gtkdoc opt">.</span></pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+
+FBO (Frame Buffer Object) is required.
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.75.7.4.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Julien Isorce <julien.isorce@gmail.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.75.7.4.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink_%u</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>request</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glmosaic.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glmosaic.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLMosaic-struct"></a><h3>struct GstGLMosaic</h3>
+<pre class="programlisting">struct GstGLMosaic;</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gloverlay.html b/docs/plugins/html/gst-plugins-bad-plugins-gloverlay.html
new file mode 100644
index 0000000..17c4ce0
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gloverlay.html
@@ -0,0 +1,473 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gloverlay: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-glmosaic.html" title="glmosaic">
+<link rel="next" href="gst-plugins-bad-plugins-glshader.html" title="glshader">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gloverlay.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-gloverlay.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-gloverlay.properties" class="shortcut">Properties</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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-glmosaic.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-glshader.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-gloverlay"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gloverlay.top_of_page"></a>gloverlay</span></h2>
+<p>gloverlay</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gloverlay.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--angle-png" title="The “angle-png” property">angle-png</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--angle-video" title="The “angle-video” property">angle-video</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--location" title="The “location” property">location</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--proportion-png" title="The “proportion-png” property">proportion-png</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--proportion-video" title="The “proportion-video” property">proportion-video</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--ratio-video" title="The “ratio-video” property">ratio-video</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--rotate-png" title="The “rotate-png” property">rotate-png</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--rotate-video" title="The “rotate-video” property">rotate-video</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--video-top" title="The “video-top” property">video-top</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--xpos-png" title="The “xpos-png” property">xpos-png</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--xpos-video" title="The “xpos-video” property">xpos-video</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--ypos-png" title="The “ypos-png” property">ypos-png</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--ypos-video" title="The “ypos-video” property">ypos-video</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--alpha" title="The “alpha” property">alpha</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--offset-x" title="The “offset-x” property">offset-x</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--offset-y" title="The “offset-y” property">offset-y</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--overlay-height" title="The “overlay-height” property">overlay-height</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--overlay-width" title="The “overlay-width” property">overlay-width</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--relative-x" title="The “relative-x” property">relative-x</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html#GstGLOverlay--relative-y" title="The “relative-y” property">relative-y</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="GstGLOverlay"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-gloverlay.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-gloverlay.html#GstGLOverlay-struct" title="struct GstGLOverlay">GstGLOverlay</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gloverlay.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseTransform.html#GstBaseTransform-struct">GstBaseTransform</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLBaseFilter.html#GstGLBaseFilter-struct">GstGLBaseFilter</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLFilter.html#GstGLFilter-struct">GstGLFilter</a>
+ <span class="lineart">╰──</span> GstGLOverlay
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gloverlay.description"></a><h2>Description</h2>
+<p>Overlay GL video texture with a PNG image</p>
+<div class="refsect2">
+<a name="id-1.2.76.7.3"></a><h3>Examples</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> videotestsrc <span class="gtkdoc opt">!</span> gloverlay location<span class="gtkdoc opt">=</span>image<span class="gtkdoc opt">.</span>jpg <span class="gtkdoc opt">!</span> glimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+
+FBO (Frame Buffer Object) is required.
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<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">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Filippo Argiolas <filippo.argiolas@gmail.com>, Matthew Waters <matthew@centricular.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<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">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gloverlay.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gloverlay.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLOverlay-struct"></a><h3>struct GstGLOverlay</h3>
+<pre class="programlisting">struct GstGLOverlay;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gloverlay.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGLOverlay--angle-png"></a><h3>The <code class="literal">“angle-png”</code> property</h3>
+<pre class="programlisting"> “angle-png” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>choose angle in axis to choosen between -90 and 90.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [-90,90]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLOverlay--angle-video"></a><h3>The <code class="literal">“angle-video”</code> property</h3>
+<pre class="programlisting"> “angle-video” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>choose angle in axis to choosen between -90 and 90.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [-90,90]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLOverlay--location"></a><h3>The <code class="literal">“location”</code> property</h3>
+<pre class="programlisting"> “location” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
+<p>Location of image file to overlay.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLOverlay--proportion-png"></a><h3>The <code class="literal">“proportion-png”</code> property</h3>
+<pre class="programlisting"> “proportion-png” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Relative size of iverlay image, in percents.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,100]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLOverlay--proportion-video"></a><h3>The <code class="literal">“proportion-video”</code> property</h3>
+<pre class="programlisting"> “proportion-video” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Relative size of iverlay video, in percents.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,100]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLOverlay--ratio-video"></a><h3>The <code class="literal">“ratio-video”</code> property</h3>
+<pre class="programlisting"> “ratio-video” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,3]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLOverlay--rotate-png"></a><h3>The <code class="literal">“rotate-png”</code> property</h3>
+<pre class="programlisting"> “rotate-png” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>choose rotation axis for the moment only Y axis is implemented.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,3]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLOverlay--rotate-video"></a><h3>The <code class="literal">“rotate-video”</code> property</h3>
+<pre class="programlisting"> “rotate-video” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>choose rotation axis for the moment only Y axis is implemented.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,3]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLOverlay--video-top"></a><h3>The <code class="literal">“video-top”</code> property</h3>
+<pre class="programlisting"> “video-top” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Video is over png image.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLOverlay--xpos-png"></a><h3>The <code class="literal">“xpos-png”</code> property</h3>
+<pre class="programlisting"> “xpos-png” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>X position of overlay image in percents.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,100]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLOverlay--xpos-video"></a><h3>The <code class="literal">“xpos-video”</code> property</h3>
+<pre class="programlisting"> “xpos-video” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>X position of overlay video in percents.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,100]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLOverlay--ypos-png"></a><h3>The <code class="literal">“ypos-png”</code> property</h3>
+<pre class="programlisting"> “ypos-png” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Y position of overlay image in percents.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,100]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLOverlay--ypos-video"></a><h3>The <code class="literal">“ypos-video”</code> property</h3>
+<pre class="programlisting"> “ypos-video” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Y position of overlay video in percents.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,100]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLOverlay--alpha"></a><h3>The <code class="literal">“alpha”</code> property</h3>
+<pre class="programlisting"> “alpha” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>Global alpha of overlay image.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,1]</p>
+<p>Default value: 1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLOverlay--offset-x"></a><h3>The <code class="literal">“offset-x”</code> property</h3>
+<pre class="programlisting"> “offset-x” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>For positive value, horizontal offset of overlay image in pixels from left of video image. For negative value, horizontal offset of overlay image in pixels from right of video image.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLOverlay--offset-y"></a><h3>The <code class="literal">“offset-y”</code> property</h3>
+<pre class="programlisting"> “offset-y” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>For positive value, vertical offset of overlay image in pixels from top of video image. For negative value, vertical offset of overlay image in pixels from bottom of video image.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLOverlay--overlay-height"></a><h3>The <code class="literal">“overlay-height”</code> property</h3>
+<pre class="programlisting"> “overlay-height” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Height of overlay image in pixels (0 = same as overlay image).</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: >= 0</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLOverlay--overlay-width"></a><h3>The <code class="literal">“overlay-width”</code> property</h3>
+<pre class="programlisting"> “overlay-width” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Width of overlay image in pixels (0 = same as overlay image).</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: >= 0</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLOverlay--relative-x"></a><h3>The <code class="literal">“relative-x”</code> property</h3>
+<pre class="programlisting"> “relative-x” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>Horizontal offset of overlay image in fractions of video image width, from top-left corner of video image.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,1]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLOverlay--relative-y"></a><h3>The <code class="literal">“relative-y”</code> property</h3>
+<pre class="programlisting"> “relative-y” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>Vertical offset of overlay image in fractions of video image height, from top-left corner of video image.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,1]</p>
+<p>Default value: 0</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-glshader.html b/docs/plugins/html/gst-plugins-bad-plugins-glshader.html
new file mode 100644
index 0000000..e448081
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-glshader.html
@@ -0,0 +1,333 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>glshader: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gloverlay.html" title="gloverlay">
+<link rel="next" href="gst-plugins-bad-plugins-glsinkbin.html" title="glsinkbin">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-glshader.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glshader.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glshader.properties" class="shortcut">Properties</a></span><span id="nav_signals"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glshader.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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gloverlay.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-glsinkbin.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-glshader"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-glshader.top_of_page"></a>glshader</span></h2>
+<p>glshader</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glshader.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glshader.html#GstGLFilterShader--location" title="The “location” property">location</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glshader.html#GstGLFilterShader--preset" title="The “preset” property">preset</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glshader.html#GstGLFilterShader--vars" title="The “vars” property">vars</a></td>
+<td class="property_flags">Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glshader.html#GstGLFilterShader--fragment" title="The “fragment” property">fragment</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLShader.html#GstGLShader-struct"><span class="type">GstGLShader</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glshader.html#GstGLFilterShader--shader" title="The “shader” property">shader</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/gstreamer-1.0GstStructure.html#GstStructure-struct"><span class="type">GstStructure</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glshader.html#GstGLFilterShader--uniforms" title="The “uniforms” property">uniforms</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glshader.html#GstGLFilterShader--update-shader" title="The “update-shader” property">update-shader</a></td>
+<td class="property_flags">Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glshader.html#GstGLFilterShader--vertex" title="The “vertex” property">vertex</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glshader.signals"></a><h2>Signals</h2>
+<div class="informaltable"><table class="informaltable" 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">
+<a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLShader.html#GstGLShader-struct"><span class="returnvalue">GstGLShader</span></a>*</td>
+<td class="signal_name"><a class="link" href="gst-plugins-bad-plugins-glshader.html#GstGLFilterShader-create-shader" title="The “create-shader” signal">create-shader</a></td>
+<td class="signal_flags"><a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<a name="GstGLFilterShader"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-glshader.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-glshader.html#GstGLFilterShader-struct" title="struct GstGLFilterShader">GstGLFilterShader</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glshader.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseTransform.html#GstBaseTransform-struct">GstBaseTransform</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLBaseFilter.html#GstGLBaseFilter-struct">GstGLBaseFilter</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLFilter.html#GstGLFilter-struct">GstGLFilter</a>
+ <span class="lineart">╰──</span> GstGLFilterShader
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glshader.description"></a><h2>Description</h2>
+<p>OpenGL fragment shader filter</p>
+<div class="refsect2">
+<a name="id-1.2.77.8.3"></a><h3>Examples</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> videotestsrc <span class="gtkdoc opt">!</span> glupload <span class="gtkdoc opt">!</span> glshader fragment<span class="gtkdoc opt">=</span><span class="string">"</span><span class="gtkdoc esc">\"</span><span class="string">`cat myshader.frag`</span><span class="gtkdoc esc">\"</span><span class="string">"</span> <span class="gtkdoc opt">!</span> glimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+
+FBO (Frame Buffer Object) and GLSL (OpenGL Shading Language) are required. A <span class="type">version</span> header is required
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.77.8.4.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td><matthew@centricular.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.77.8.4.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glshader.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glshader.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLFilterShader-struct"></a><h3>struct GstGLFilterShader</h3>
+<pre class="programlisting">struct GstGLFilterShader;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glshader.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGLFilterShader--location"></a><h3>The <code class="literal">“location”</code> property</h3>
+<pre class="programlisting"> “location” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
+<p>Location of the GLSL file to load.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLFilterShader--preset"></a><h3>The <code class="literal">“preset”</code> property</h3>
+<pre class="programlisting"> “preset” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
+<p>Location of the shader uniform variables preset file.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLFilterShader--vars"></a><h3>The <code class="literal">“vars”</code> property</h3>
+<pre class="programlisting"> “vars” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
+<p>Set the shader uniform variables.</p>
+<p>Flags: Write</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLFilterShader--fragment"></a><h3>The <code class="literal">“fragment”</code> property</h3>
+<pre class="programlisting"> “fragment” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
+<p>GLSL fragment source.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLFilterShader--shader"></a><h3>The <code class="literal">“shader”</code> property</h3>
+<pre class="programlisting"> “shader” <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLShader.html#GstGLShader-struct"><span class="type">GstGLShader</span></a> *</pre>
+<p>GstGLShader to use.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLFilterShader--uniforms"></a><h3>The <code class="literal">“uniforms”</code> property</h3>
+<pre class="programlisting"> “uniforms” <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstStructure.html#GstStructure-struct"><span class="type">GstStructure</span></a> *</pre>
+<p>GLSL Uniforms.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLFilterShader--update-shader"></a><h3>The <code class="literal">“update-shader”</code> property</h3>
+<pre class="programlisting"> “update-shader” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Emit the 'create-shader' signal for the next frame.</p>
+<p>Flags: Write</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLFilterShader--vertex"></a><h3>The <code class="literal">“vertex”</code> property</h3>
+<pre class="programlisting"> “vertex” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
+<p>GLSL vertex source.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: NULL</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glshader.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstGLFilterShader-create-shader"></a><h3>The <code class="literal">“create-shader”</code> signal</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLShader.html#GstGLShader-struct"><span class="returnvalue">GstGLShader</span></a>*
+user_function (<a class="link" href="gst-plugins-bad-plugins-glshader.html#GstGLFilterShader"><span class="type">GstGLFilterShader</span></a> *gstglfiltershader,
+ <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data)</pre>
+<p>Flags: <a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-glsinkbin.html b/docs/plugins/html/gst-plugins-bad-plugins-glsinkbin.html
new file mode 100644
index 0000000..bca73ca
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-glsinkbin.html
@@ -0,0 +1,455 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>glsinkbin: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-glshader.html" title="glshader">
+<link rel="next" href="gst-plugins-bad-plugins-glsrcbin.html" title="glsrcbin">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-glsinkbin.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glsinkbin.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_interfaces"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glsinkbin.implemented-interfaces" class="shortcut">Implemented Interfaces</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glsinkbin.properties" class="shortcut">Properties</a></span><span id="nav_signals"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glsinkbin.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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-glshader.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-glsrcbin.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-glsinkbin"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-glsinkbin.top_of_page"></a>glsinkbin</span></h2>
+<p>glsinkbin</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glsinkbin.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--force-aspect-ratio" title="The “force-aspect-ratio” property">force-aspect-ratio</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct"><span class="type">GstElement</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--sink" title="The “sink” property">sink</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--async" title="The “async” property">async</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--blocksize" title="The “blocksize” property">blocksize</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--enable-last-sample" title="The “enable-last-sample” property">enable-last-sample</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/gstreamer-1.0GstSample.html#GstSample-struct"><span class="type">GstSample</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--last-sample" title="The “last-sample” property">last-sample</a></td>
+<td class="property_flags">Read</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint64"><span class="type">guint64</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--max-bitrate" title="The “max-bitrate” property">max-bitrate</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint64"><span class="type">gint64</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--max-lateness" title="The “max-lateness” property">max-lateness</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--qos" title="The “qos” property">qos</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint64"><span class="type">guint64</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--render-delay" title="The “render-delay” property">render-delay</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--sync" title="The “sync” property">sync</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint64"><span class="type">guint64</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--throttle-time" title="The “throttle-time” property">throttle-time</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint64"><span class="type">gint64</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--ts-offset" title="The “ts-offset” property">ts-offset</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--brightness" title="The “brightness” property">brightness</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--contrast" title="The “contrast” property">contrast</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--hue" title="The “hue” property">hue</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin--saturation" title="The “saturation” property">saturation</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glsinkbin.signals"></a><h2>Signals</h2>
+<div class="informaltable"><table class="informaltable" 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">
+<a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct"><span class="returnvalue">GstElement</span></a>*</td>
+<td class="signal_name"><a class="link" href="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin-create-element" title="The “create-element” signal">create-element</a></td>
+<td class="signal_flags"><a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<a name="GstGLSinkBin"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-glsinkbin.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-glsinkbin.html#GstGLSinkBin-struct" title="struct GstGLSinkBin">GstGLSinkBin</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glsinkbin.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstBin.html#GstBin-struct">GstBin</a>
+ <span class="lineart">╰──</span> GstGLSinkBin
+ <span class="lineart">╰──</span> GstGLImageSinkBin
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glsinkbin.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstGLSinkBin implements
+ <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstChildProxy.html#GstChildProxy-struct">GstChildProxy</a>, <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideooverlay.html#GstVideoOverlay-struct">GstVideoOverlay</a>, <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstnavigation.html#GstNavigation-struct">GstNavigation</a> and <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance-struct">GstColorBalance</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glsinkbin.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.78.9.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Matthew Waters <matthew@centricular.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Sink/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.78.9.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(meta:GstVideoGLTextureUploadMeta, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glsinkbin.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glsinkbin.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLSinkBin-struct"></a><h3>struct GstGLSinkBin</h3>
+<pre class="programlisting">struct GstGLSinkBin;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glsinkbin.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGLSinkBin--force-aspect-ratio"></a><h3>The <code class="literal">“force-aspect-ratio”</code> property</h3>
+<pre class="programlisting"> “force-aspect-ratio” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>When enabled, scaling will respect original aspect ratio.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLSinkBin--sink"></a><h3>The <code class="literal">“sink”</code> property</h3>
+<pre class="programlisting"> “sink” <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct"><span class="type">GstElement</span></a> *</pre>
+<p>The GL sink chain to use.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLSinkBin--async"></a><h3>The <code class="literal">“async”</code> property</h3>
+<pre class="programlisting"> “async” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Go asynchronously to PAUSED.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLSinkBin--blocksize"></a><h3>The <code class="literal">“blocksize”</code> property</h3>
+<pre class="programlisting"> “blocksize” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a></pre>
+<p>Size in bytes to pull per buffer (0 = default).</p>
+<p>Flags: Read / Write</p>
+<p>Default value: 4096</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLSinkBin--enable-last-sample"></a><h3>The <code class="literal">“enable-last-sample”</code> property</h3>
+<pre class="programlisting"> “enable-last-sample” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Enable the last-sample property.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLSinkBin--last-sample"></a><h3>The <code class="literal">“last-sample”</code> property</h3>
+<pre class="programlisting"> “last-sample” <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstSample.html#GstSample-struct"><span class="type">GstSample</span></a> *</pre>
+<p>The last sample received in the sink.</p>
+<p>Flags: Read</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLSinkBin--max-bitrate"></a><h3>The <code class="literal">“max-bitrate”</code> property</h3>
+<pre class="programlisting"> “max-bitrate” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint64"><span class="type">guint64</span></a></pre>
+<p>The maximum bits per second to render (0 = disabled).</p>
+<p>Flags: Read / Write</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLSinkBin--max-lateness"></a><h3>The <code class="literal">“max-lateness”</code> property</h3>
+<pre class="programlisting"> “max-lateness” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint64"><span class="type">gint64</span></a></pre>
+<p>Maximum number of nanoseconds that a buffer can be late before it is dropped (-1 unlimited).</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: >= G_MAXULONG</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLSinkBin--qos"></a><h3>The <code class="literal">“qos”</code> property</h3>
+<pre class="programlisting"> “qos” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Generate Quality-of-Service events upstream.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLSinkBin--render-delay"></a><h3>The <code class="literal">“render-delay”</code> property</h3>
+<pre class="programlisting"> “render-delay” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint64"><span class="type">guint64</span></a></pre>
+<p>Additional render delay of the sink in nanoseconds.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLSinkBin--sync"></a><h3>The <code class="literal">“sync”</code> property</h3>
+<pre class="programlisting"> “sync” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Sync on the clock.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLSinkBin--throttle-time"></a><h3>The <code class="literal">“throttle-time”</code> property</h3>
+<pre class="programlisting"> “throttle-time” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint64"><span class="type">guint64</span></a></pre>
+<p>The time to keep between rendered buffers (0 = disabled).</p>
+<p>Flags: Read / Write</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLSinkBin--ts-offset"></a><h3>The <code class="literal">“ts-offset”</code> property</h3>
+<pre class="programlisting"> “ts-offset” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint64"><span class="type">gint64</span></a></pre>
+<p>Timestamp offset in nanoseconds.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLSinkBin--brightness"></a><h3>The <code class="literal">“brightness”</code> property</h3>
+<pre class="programlisting"> “brightness” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>brightness.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [-1,1]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLSinkBin--contrast"></a><h3>The <code class="literal">“contrast”</code> property</h3>
+<pre class="programlisting"> “contrast” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>contrast.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,2]</p>
+<p>Default value: 1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLSinkBin--hue"></a><h3>The <code class="literal">“hue”</code> property</h3>
+<pre class="programlisting"> “hue” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>hue.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [-1,1]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLSinkBin--saturation"></a><h3>The <code class="literal">“saturation”</code> property</h3>
+<pre class="programlisting"> “saturation” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>saturation.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,2]</p>
+<p>Default value: 1</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glsinkbin.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstGLSinkBin-create-element"></a><h3>The <code class="literal">“create-element”</code> signal</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct"><span class="returnvalue">GstElement</span></a>*
+user_function (<a class="link" href="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin"><span class="type">GstGLSinkBin</span></a> *object,
+ <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data)</pre>
+<p>Will be emitted when we need the processing element/s that this bin will use</p>
+<div class="refsect3">
+<a name="GstGLSinkBin-create-element.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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>object</p></td>
+<td class="parameter_description"><p>the <a class="link" href="gst-plugins-bad-plugins-glsinkbin.html#GstGLSinkBin"><span class="type">GstGLSinkBin</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="GstGLSinkBin-create-element.returns"></a><h4>Returns</h4>
+<p> a new <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct"><span class="type">GstElement</span></a></p>
+</div>
+<p>Flags: <a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-glsrcbin.html b/docs/plugins/html/gst-plugins-bad-plugins-glsrcbin.html
new file mode 100644
index 0000000..195818d
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-glsrcbin.html
@@ -0,0 +1,219 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>glsrcbin: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-glsinkbin.html" title="glsinkbin">
+<link rel="next" href="gst-plugins-bad-plugins-glstereomix.html" title="glstereomix">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-glsrcbin.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glsrcbin.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_interfaces"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glsrcbin.implemented-interfaces" class="shortcut">Implemented Interfaces</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glsrcbin.properties" class="shortcut">Properties</a></span><span id="nav_signals"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glsrcbin.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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-glsinkbin.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-glstereomix.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-glsrcbin"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-glsrcbin.top_of_page"></a>glsrcbin</span></h2>
+<p>glsrcbin</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glsrcbin.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct"><span class="type">GstElement</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glsrcbin.html#GstGLSrcBin--src" title="The “src” property">src</a></td>
+<td class="property_flags">Read / Write</td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glsrcbin.signals"></a><h2>Signals</h2>
+<div class="informaltable"><table class="informaltable" 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">
+<a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct"><span class="returnvalue">GstElement</span></a>*</td>
+<td class="signal_name"><a class="link" href="gst-plugins-bad-plugins-glsrcbin.html#GstGLSrcBin-create-element" title="The “create-element” signal">create-element</a></td>
+<td class="signal_flags"><a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<a name="GstGLSrcBin"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-glsrcbin.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-glsrcbin.html#GstGLSrcBin-struct" title="struct GstGLSrcBin">GstGLSrcBin</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glsrcbin.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstBin.html#GstBin-struct">GstBin</a>
+ <span class="lineart">╰──</span> GstGLSrcBin
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glsrcbin.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstGLSrcBin implements
+ <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstChildProxy.html#GstChildProxy-struct">GstChildProxy</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glsrcbin.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.79.9.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Matthew Waters <matthew@centricular.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Src/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.79.9.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY)</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glsrcbin.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glsrcbin.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLSrcBin-struct"></a><h3>struct GstGLSrcBin</h3>
+<pre class="programlisting">struct GstGLSrcBin;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glsrcbin.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGLSrcBin--src"></a><h3>The <code class="literal">“src”</code> property</h3>
+<pre class="programlisting"> “src” <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct"><span class="type">GstElement</span></a> *</pre>
+<p>The GL src chain to use.</p>
+<p>Flags: Read / Write</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glsrcbin.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstGLSrcBin-create-element"></a><h3>The <code class="literal">“create-element”</code> signal</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct"><span class="returnvalue">GstElement</span></a>*
+user_function (<a class="link" href="gst-plugins-bad-plugins-glsrcbin.html#GstGLSrcBin"><span class="type">GstGLSrcBin</span></a> *object,
+ <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data)</pre>
+<p>Will be emitted when we need the processing element/s that this bin will use</p>
+<div class="refsect3">
+<a name="GstGLSrcBin-create-element.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" 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>object</p></td>
+<td class="parameter_description"><p>the <a class="link" href="gst-plugins-bad-plugins-glsrcbin.html#GstGLSrcBin"><span class="type">GstGLSrcBin</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="GstGLSrcBin-create-element.returns"></a><h4>Returns</h4>
+<p> a new <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct"><span class="type">GstElement</span></a></p>
+</div>
+<p>Flags: <a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-glstereomix.html b/docs/plugins/html/gst-plugins-bad-plugins-glstereomix.html
new file mode 100644
index 0000000..f6e4334
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-glstereomix.html
@@ -0,0 +1,265 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>glstereomix: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-glsrcbin.html" title="glsrcbin">
+<link rel="next" href="gst-plugins-bad-plugins-glstereosplit.html" title="glstereosplit">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-glstereomix.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glstereomix.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_interfaces"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glstereomix.implemented-interfaces" class="shortcut">Implemented Interfaces</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glstereomix.properties" class="shortcut">Properties</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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-glsrcbin.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-glstereosplit.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-glstereomix"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-glstereomix.top_of_page"></a>glstereomix</span></h2>
+<p>glstereomix</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glstereomix.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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"><span class="type">GstGLStereoDownmix</span></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glstereomix.html#GstGLStereoMix--downmix-mode" title="The “downmix-mode” property">downmix-mode</a></td>
+<td class="property_flags">Read / Write</td>
+</tr></tbody>
+</table></div>
+</div>
+<a name="GstGLStereoMix"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-glstereomix.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-glstereomix.html#GstGLStereoMix-struct" title="struct GstGLStereoMix">GstGLStereoMix</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glstereomix.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0gst-plugins-bad-libs-GstAggregator.html#GstAggregator">GstAggregator</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0gst-plugins-bad-libs-GstVideoAggregator.html#GstVideoAggregator">GstVideoAggregator</a>
+ <span class="lineart">╰──</span> GstGLBaseMixer
+ <span class="lineart">╰──</span> GstGLMixer
+ <span class="lineart">╰──</span> GstGLStereoMix
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glstereomix.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstGLStereoMix implements
+ <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstChildProxy.html#GstChildProxy-struct">GstChildProxy</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glstereomix.description"></a><h2>Description</h2>
+<p>Combine 2 input streams to produce a stereoscopic output
+stream. Input views are taken from the left pad and right pad
+respectively, and mixed according to their timelines.</p>
+<p>If either input stream is stereoscopic, the approproriate view
+(left or right) is taken from each stream and placed into the output.</p>
+<p>The multiview representation on the output is chosen according to
+the downstream caps.</p>
+<div class="refsect2">
+<a name="id-1.2.80.8.5"></a><h3>Examples</h3>
+<div class="informalexample">
+ <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+ <tbody>
+ <tr>
+ <td class="listing_lines" align="right"><pre>1
+2
+3
+4
+5
+6</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 pattern<span class="gtkdoc opt">=</span>ball name<span class="gtkdoc opt">=</span>left \
+ videotestsrc name<span class="gtkdoc opt">=</span>right glstereomix name<span class="gtkdoc opt">=</span>mix \
+ left<span class="gtkdoc opt">. !</span> vid<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw<span class="gtkdoc opt">,</span>width<span class="gtkdoc opt">=</span><span class="number">640</span><span class="gtkdoc opt">,</span>height<span class="gtkdoc opt">=</span><span class="number">480</span><span class="gtkdoc opt">!</span> glupload <span class="gtkdoc opt">!</span> mix<span class="gtkdoc opt">.</span> \
+ right<span class="gtkdoc opt">. !</span> video<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw<span class="gtkdoc opt">,</span>width<span class="gtkdoc opt">=</span><span class="number">640</span><span class="gtkdoc opt">,</span>height<span class="gtkdoc opt">=</span><span class="number">480</span><span class="gtkdoc opt">!</span> glupload <span class="gtkdoc opt">!</span> mix<span class="gtkdoc opt">.</span> \
+ mix<span class="gtkdoc opt">. !</span> video<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw<span class="string">'(memory:GLMemory)'</span><span class="gtkdoc opt">,</span>multiview<span class="gtkdoc opt">-</span>mode<span class="gtkdoc opt">=</span>side<span class="gtkdoc opt">-</span>by<span class="gtkdoc opt">-</span>side <span class="gtkdoc opt">!</span> \
+ queue <span class="gtkdoc opt">!</span> glimagesink output<span class="gtkdoc opt">-</span>multiview<span class="gtkdoc opt">-</span>mode<span class="gtkdoc opt">=</span>side<span class="gtkdoc opt">-</span>by<span class="gtkdoc opt">-</span>side</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Mix 2 different videotestsrc patterns into a side-by-side stereo image and display it.
+<div class="informalexample">
+ <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+ <tbody>
+ <tr>
+ <td class="listing_lines" align="right"><pre>1
+2
+3
+4
+5
+6
+7
+8</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>ev v4l2src name<span class="gtkdoc opt">=</span>left \
+ videotestsrc name<span class="gtkdoc opt">=</span>right \
+ glstereomix name<span class="gtkdoc opt">=</span>mix \
+ left<span class="gtkdoc opt">. !</span> video<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw<span class="gtkdoc opt">,</span>width<span class="gtkdoc opt">=</span><span class="number">640</span><span class="gtkdoc opt">,</span>height<span class="gtkdoc opt">=</span><span class="number">480</span> <span class="gtkdoc opt">!</span> glupload <span class="gtkdoc opt">!</span> glcolorconvert <span class="gtkdoc opt">!</span> mix<span class="gtkdoc opt">.</span> \
+ right<span class="gtkdoc opt">. !</span> video<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw<span class="gtkdoc opt">,</span>width<span class="gtkdoc opt">=</span><span class="number">640</span><span class="gtkdoc opt">,</span>height<span class="gtkdoc opt">=</span><span class="number">480</span> <span class="gtkdoc opt">!</span> glupload <span class="gtkdoc opt">!</span> mix<span class="gtkdoc opt">.</span> \
+ mix<span class="gtkdoc opt">. !</span> video<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw<span class="string">'(memory:GLMemory)'</span><span class="gtkdoc opt">,</span>multiview<span class="gtkdoc opt">-</span>mode<span class="gtkdoc opt">=</span>top<span class="gtkdoc opt">-</span>bottom <span class="gtkdoc opt">!</span> \
+ glcolorconvert <span class="gtkdoc opt">!</span> gldownload <span class="gtkdoc opt">!</span> queue <span class="gtkdoc opt">!</span> x264enc <span class="gtkdoc opt">!</span> h264parse <span class="gtkdoc opt">!</span> \
+ mp4mux <span class="gtkdoc opt">!</span> progressreport <span class="gtkdoc opt">!</span> filesink location<span class="gtkdoc opt">=</span>output<span class="gtkdoc opt">.</span>mp4</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Mix the input from a camera to the left view, and videotestsrc to the right view,
+ and encode as a top-bottom frame packed H.264 video.
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.80.8.6.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Jan Schmidt <jan@centricular.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.80.8.6.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink_%u</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>request</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glstereomix.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glstereomix.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLStereoMix-struct"></a><h3>struct GstGLStereoMix</h3>
+<pre class="programlisting">struct GstGLStereoMix;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glstereomix.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGLStereoMix--downmix-mode"></a><h3>The <code class="literal">“downmix-mode”</code> property</h3>
+<pre class="programlisting"> “downmix-mode” <span class="type">GstGLStereoDownmix</span></pre>
+<p>Output anaglyph type to generate when downmixing to mono.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: Dubois optimised Green-Magenta anaglyph</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-glstereosplit.html b/docs/plugins/html/gst-plugins-bad-plugins-glstereosplit.html
new file mode 100644
index 0000000..d1df6b9
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-glstereosplit.html
@@ -0,0 +1,196 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>glstereosplit: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-glstereomix.html" title="glstereomix">
+<link rel="next" href="gst-plugins-bad-plugins-gltestsrc.html" title="gltestsrc">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-glstereosplit.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glstereosplit.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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-glstereomix.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gltestsrc.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-glstereosplit"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-glstereosplit.top_of_page"></a>glstereosplit</span></h2>
+<p>glstereosplit</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<a name="GstGLStereoSplit"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-glstereosplit.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-glstereosplit.html#GstGLStereoSplit-struct" title="struct GstGLStereoSplit">GstGLStereoSplit</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glstereosplit.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> GstGLStereoSplit
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glstereosplit.description"></a><h2>Description</h2>
+<p>Receive a stereoscopic video stream and split into left/right</p>
+<div class="refsect2">
+<a name="id-1.2.81.6.3"></a><h3>Examples</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> videotestsrc <span class="gtkdoc opt">!</span> glstereosplit name<span class="gtkdoc opt">=</span>s <span class="gtkdoc opt">!</span> queue <span class="gtkdoc opt">!</span> glimagesink s<span class="gtkdoc opt">. !</span> queue <span class="gtkdoc opt">!</span> glimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+
+FBO (Frame Buffer Object) and GLSL (OpenGL Shading Language) are required.
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<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">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Jan Schmidt <jan@centricular.com>
+Matthew Waters <matthew@centricular.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Codec/Converter</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<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">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>left</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>right</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glstereosplit.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glstereosplit.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLStereoSplit-struct"></a><h3>struct GstGLStereoSplit</h3>
+<pre class="programlisting">struct GstGLStereoSplit;</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gltestsrc.html b/docs/plugins/html/gst-plugins-bad-plugins-gltestsrc.html
new file mode 100644
index 0000000..06f747e
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gltestsrc.html
@@ -0,0 +1,323 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gltestsrc: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-glstereosplit.html" title="glstereosplit">
+<link rel="next" href="gst-plugins-bad-plugins-gltransformation.html" title="gltransformation">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gltestsrc.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-gltestsrc.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-gltestsrc.properties" class="shortcut">Properties</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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-glstereosplit.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-gltransformation.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-gltestsrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gltestsrc.top_of_page"></a>gltestsrc</span></h2>
+<p>gltestsrc</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gltestsrc.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gltestsrc.html#GstGLTestSrc--is-live" title="The “is-live” property">is-live</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a class="link" href="gst-plugins-bad-plugins-gltestsrc.html#GstGLTestSrcPattern" title="enum GstGLTestSrcPattern"><span class="type">GstGLTestSrcPattern</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gltestsrc.html#GstGLTestSrc--pattern" title="The “pattern” property">pattern</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint64"><span class="type">gint64</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-gltestsrc.html#GstGLTestSrc--timestamp-offset" title="The “timestamp-offset” property">timestamp-offset</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="GstGLTestSrc"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-gltestsrc.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-plugins-gltestsrc.html#GstGLTestSrc-struct" title="GstGLTestSrc">GstGLTestSrc</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-plugins-gltestsrc.html#GstGLTestSrcPattern" title="enum GstGLTestSrcPattern">GstGLTestSrcPattern</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gltestsrc.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseSrc.html#GstBaseSrc-struct">GstBaseSrc</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstPushSrc.html#GstPushSrc-struct">GstPushSrc</a>
+ <span class="lineart">╰──</span> GstGLTestSrc
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gltestsrc.description"></a><h2>Description</h2>
+<div class="refsect2">
+<a name="id-1.2.82.7.2"></a><h3>Example launch line</h3>
+<p>
+The gltestsrc element is used to produce test video texture.
+The video test produced can be controlled with the "pattern"
+property.
+</p>
+<p>
+</p>
+<pre class="programlisting">
+gst-launch-1.0 -v gltestsrc pattern=smpte ! glimagesink
+</pre>
+<p>
+Shows original SMPTE color bars in a window.
+</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.82.7.3.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>David A. Schleef <ds@schleef.org></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Source/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.82.7.3.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gltestsrc.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gltestsrc.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLTestSrc-struct"></a><h3>GstGLTestSrc</h3>
+<pre class="programlisting">typedef struct _GstGLTestSrc GstGLTestSrc;</pre>
+<p>Opaque data structure.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLTestSrcPattern"></a><h3>enum GstGLTestSrcPattern</h3>
+<p>The test pattern to produce.</p>
+<div class="refsect3">
+<a name="GstGLTestSrcPattern.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" 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-TEST-SRC-SMPTE:CAPS"></a>GST_GL_TEST_SRC_SMPTE</p></td>
+<td class="enum_member_description">
+<p>A standard SMPTE test pattern</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-TEST-SRC-SNOW:CAPS"></a>GST_GL_TEST_SRC_SNOW</p></td>
+<td class="enum_member_description">
+<p>Random noise</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-TEST-SRC-BLACK:CAPS"></a>GST_GL_TEST_SRC_BLACK</p></td>
+<td class="enum_member_description">
+<p>A black image</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-TEST-SRC-WHITE:CAPS"></a>GST_GL_TEST_SRC_WHITE</p></td>
+<td class="enum_member_description">
+<p>A white image</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-TEST-SRC-RED:CAPS"></a>GST_GL_TEST_SRC_RED</p></td>
+<td class="enum_member_description">
+<p>A red image</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-TEST-SRC-GREEN:CAPS"></a>GST_GL_TEST_SRC_GREEN</p></td>
+<td class="enum_member_description">
+<p>A green image</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-TEST-SRC-BLUE:CAPS"></a>GST_GL_TEST_SRC_BLUE</p></td>
+<td class="enum_member_description">
+<p>A blue image</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-TEST-SRC-CHECKERS1:CAPS"></a>GST_GL_TEST_SRC_CHECKERS1</p></td>
+<td class="enum_member_description">
+<p>Checkers pattern (1px)</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-TEST-SRC-CHECKERS2:CAPS"></a>GST_GL_TEST_SRC_CHECKERS2</p></td>
+<td class="enum_member_description">
+<p>Checkers pattern (2px)</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-TEST-SRC-CHECKERS4:CAPS"></a>GST_GL_TEST_SRC_CHECKERS4</p></td>
+<td class="enum_member_description">
+<p>Checkers pattern (4px)</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-TEST-SRC-CHECKERS8:CAPS"></a>GST_GL_TEST_SRC_CHECKERS8</p></td>
+<td class="enum_member_description">
+<p>Checkers pattern (8px)</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-TEST-SRC-CIRCULAR:CAPS"></a>GST_GL_TEST_SRC_CIRCULAR</p></td>
+<td class="enum_member_description">
+<p>Circular pattern</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-TEST-SRC-BLINK:CAPS"></a>GST_GL_TEST_SRC_BLINK</p></td>
+<td class="enum_member_description">
+<p>Alternate between black and white</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-TEST-SRC-MANDELBROT:CAPS"></a>GST_GL_TEST_SRC_MANDELBROT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gltestsrc.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGLTestSrc--is-live"></a><h3>The <code class="literal">“is-live”</code> property</h3>
+<pre class="programlisting"> “is-live” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Whether to act as a live source.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLTestSrc--pattern"></a><h3>The <code class="literal">“pattern”</code> property</h3>
+<pre class="programlisting"> “pattern” <a class="link" href="gst-plugins-bad-plugins-gltestsrc.html#GstGLTestSrcPattern" title="enum GstGLTestSrcPattern"><span class="type">GstGLTestSrcPattern</span></a></pre>
+<p>Type of test pattern to generate.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: SMPTE 100% color bars</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLTestSrc--timestamp-offset"></a><h3>The <code class="literal">“timestamp-offset”</code> property</h3>
+<pre class="programlisting"> “timestamp-offset” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint64"><span class="type">gint64</span></a></pre>
+<p>An offset added to timestamps set on buffers (in ns).</p>
+<p>Flags: Read / Write</p>
+<p>Default value: 0</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gltransformation.html b/docs/plugins/html/gst-plugins-bad-plugins-gltransformation.html
new file mode 100644
index 0000000..b8147cf
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gltransformation.html
@@ -0,0 +1,161 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gltransformation: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gltestsrc.html" title="gltestsrc">
+<link rel="next" href="gst-plugins-bad-plugins-glupload.html" title="glupload">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-gltransformation.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gltestsrc.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-glupload.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-gltransformation"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-gltransformation.top_of_page"></a>gltransformation</span></h2>
+<p>gltransformation</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gltransformation.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-gltransformation.html#GstGLTransformation" title="struct GstGLTransformation">GstGLTransformation</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gltransformation.description"></a><h2>Description</h2>
+<p>Transforms video on the GPU.</p>
+<div class="refsect2">
+<a name="id-1.2.83.4.3"></a><h3>Examples</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> gltestsrc <span class="gtkdoc opt">!</span> gltransformation rotation<span class="gtkdoc opt">-</span>z<span class="gtkdoc opt">=</span><span class="number">45</span> <span class="gtkdoc opt">!</span> glimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ A pipeline to rotate by 45 degrees
+<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> gltestsrc <span class="gtkdoc opt">!</span> gltransformation translation<span class="gtkdoc opt">-</span>x<span class="gtkdoc opt">=</span><span class="number">0.5</span> <span class="gtkdoc opt">!</span> glimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Translate the video by 0.5
+<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> gltestsrc <span class="gtkdoc opt">!</span> gltransformation scale<span class="gtkdoc opt">-</span>y<span class="gtkdoc opt">=</span><span class="number">0.5</span> scale<span class="gtkdoc opt">-</span>x<span class="gtkdoc opt">=</span><span class="number">0.5</span> <span class="gtkdoc opt">!</span> glimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Resize the video by 0.5
+<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> gltestsrc <span class="gtkdoc opt">!</span> gltransformation rotation<span class="gtkdoc opt">-</span>x<span class="gtkdoc opt">=-</span><span class="number">45</span> ortho<span class="gtkdoc opt">=</span>True <span class="gtkdoc opt">!</span> glimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Rotate the video around the X-Axis by -45° with an orthographic projection
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gltransformation.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-gltransformation.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLTransformation"></a><h3>struct GstGLTransformation</h3>
+<pre class="programlisting">struct GstGLTransformation {
+ GstGLFilter filter;
+
+ GstGLShader *shader;
+ GLuint vao;
+ GLuint vbo_indices;
+ GLuint vertex_buffer;
+ GLint attr_position;
+ GLint attr_texture;
+
+ GstGLMemory *in_tex;
+ GstGLMemory *out_tex;
+
+ gfloat xrotation;
+ gfloat yrotation;
+ gfloat zrotation;
+
+ gfloat xscale;
+ gfloat yscale;
+
+ gfloat xtranslation;
+ gfloat ytranslation;
+ gfloat ztranslation;
+
+ gfloat xpivot;
+ gfloat ypivot;
+ gfloat zpivot;
+
+ /* perspective */
+ gfloat fov;
+ gfloat aspect;
+ gfloat znear;
+ gfloat zfar;
+ gboolean ortho;
+
+ graphene_matrix_t model_matrix;
+ graphene_matrix_t view_matrix;
+ graphene_matrix_t projection_matrix;
+ graphene_matrix_t inv_model_matrix;
+ graphene_matrix_t inv_view_matrix;
+ graphene_matrix_t inv_projection_matrix;
+ graphene_matrix_t mvp_matrix;
+
+ graphene_vec3_t camera_position;
+
+ gboolean downstream_supports_affine_meta;
+ gboolean caps_change;
+};
+</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-glupload.html b/docs/plugins/html/gst-plugins-bad-plugins-glupload.html
new file mode 100644
index 0000000..757e026
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-glupload.html
@@ -0,0 +1,178 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>glupload: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-gltransformation.html" title="gltransformation">
+<link rel="next" href="gst-plugins-bad-plugins-glvideomixerelement.html" title="glvideomixerelement">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-glupload.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glupload.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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-gltransformation.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-glvideomixerelement.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-glupload"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-glupload.top_of_page"></a>glupload</span></h2>
+<p>glupload</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<a name="GstGLUploadElement"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-glupload.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-glupload.html#GstGLUploadElement-struct" title="struct GstGLUploadElement">GstGLUploadElement</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glupload.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseTransform.html#GstBaseTransform-struct">GstBaseTransform</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLBaseFilter.html#GstGLBaseFilter-struct">GstGLBaseFilter</a>
+ <span class="lineart">╰──</span> GstGLUploadElement
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glupload.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.84.6.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Matthew Waters <matthew@centricular.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.84.6.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(meta:GstVideoGLTextureUploadMeta, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY)</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glupload.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glupload.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLUploadElement-struct"></a><h3>struct GstGLUploadElement</h3>
+<pre class="programlisting">struct GstGLUploadElement;</pre>
+<p>Opaque <a class="link" href="gst-plugins-bad-plugins-glupload.html#GstGLUploadElement"><span class="type">GstGLUploadElement</span></a> object</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-glvideomixer.html b/docs/plugins/html/gst-plugins-bad-plugins-glvideomixer.html
new file mode 100644
index 0000000..f40b62b
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-glvideomixer.html
@@ -0,0 +1,177 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>glvideomixer: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-glvideomixerelement.html" title="glvideomixerelement">
+<link rel="next" href="gst-plugins-bad-plugins-glviewconvert.html" title="glviewconvert">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-glvideomixer.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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-glvideomixerelement.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-glviewconvert.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-glvideomixer"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-glvideomixer.top_of_page"></a>glvideomixer</span></h2>
+<p>glvideomixer</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glvideomixer.description"></a><h2>Description</h2>
+<p>Composites a number of streams into a single output scene using OpenGL in
+a similar fashion to compositor and videomixer. See the compositor plugin
+for documentation about the <span class="type">GstGLVideoMixerPad</span> properties.</p>
+<div class="refsect2">
+<a name="id-1.2.86.3.3"></a><h3>Examples</h3>
+<div class="informalexample">
+ <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+ <tbody>
+ <tr>
+ <td class="listing_lines" align="right"><pre>1
+2
+3
+4
+5
+6
+7</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> glvideomixer name<span class="gtkdoc opt">=</span>m <span class="gtkdoc opt">!</span> glimagesink \
+ videotestsrc <span class="gtkdoc opt">!</span> video<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw<span class="gtkdoc opt">,</span> format<span class="gtkdoc opt">=</span>YUY2 <span class="gtkdoc opt">!</span> glupload <span class="gtkdoc opt">!</span> glcolorconvert <span class="gtkdoc opt">!</span> m<span class="gtkdoc opt">.</span> \
+ videotestsrc pattern<span class="gtkdoc opt">=</span><span class="number">12</span> <span class="gtkdoc opt">!</span> video<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw<span class="gtkdoc opt">,</span> format<span class="gtkdoc opt">=</span>I420<span class="gtkdoc opt">,</span> framerate<span class="gtkdoc opt">=</span><span class="number">5</span><span class="gtkdoc opt">/</span><span class="number">1</span><span class="gtkdoc opt">,</span> width<span class="gtkdoc opt">=</span><span class="number">100</span><span class="gtkdoc opt">,</span> height<span class="gtkdoc opt">=</span><span class="number">200</span> <span class="gtkdoc opt">!</span> queue <span class="gtkdoc opt">!</span> \
+ glupload <span class="gtkdoc opt">!</span> glcolorconvert <span class="gtkdoc opt">!</span> m<span class="gtkdoc opt">.</span> \
+ videotestsrc <span class="gtkdoc opt">!</span> glupload <span class="gtkdoc opt">!</span> gleffects effect<span class="gtkdoc opt">=</span><span class="number">2</span> <span class="gtkdoc opt">!</span> queue <span class="gtkdoc opt">!</span> m<span class="gtkdoc opt">.</span> \
+ videotestsrc <span class="gtkdoc opt">!</span> glupload <span class="gtkdoc opt">!</span> glfiltercube <span class="gtkdoc opt">!</span> queue <span class="gtkdoc opt">!</span> m<span class="gtkdoc opt">.</span> \
+ videotestsrc <span class="gtkdoc opt">!</span> glupload <span class="gtkdoc opt">!</span> gleffects effect<span class="gtkdoc opt">=</span><span class="number">6</span> <span class="gtkdoc opt">!</span> queue <span class="gtkdoc opt">!</span> m<span class="gtkdoc opt">.</span>gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> glvideomixer name<span class="gtkdoc opt">=</span>m <span class="gtkdoc opt">!</span> glimagesink \</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.86.3.4.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Matthew Waters <matthew@centricular.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Bin/Filter/Effect/Video/Compositor</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.86.3.4.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink_%u</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>request</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(meta:GstVideoGLTextureUploadMeta, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY)</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glvideomixer.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glvideomixer.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-glvideomixerelement.html b/docs/plugins/html/gst-plugins-bad-plugins-glvideomixerelement.html
new file mode 100644
index 0000000..eb8f613
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-glvideomixerelement.html
@@ -0,0 +1,243 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>glvideomixerelement: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-glupload.html" title="glupload">
+<link rel="next" href="gst-plugins-bad-plugins-glvideomixer.html" title="glvideomixer">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-glvideomixerelement.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glvideomixerelement.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_interfaces"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glvideomixerelement.implemented-interfaces" class="shortcut">Implemented Interfaces</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glvideomixerelement.properties" class="shortcut">Properties</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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-glupload.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-glvideomixer.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-glvideomixerelement"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-glvideomixerelement.top_of_page"></a>glvideomixerelement</span></h2>
+<p>glvideomixerelement</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glvideomixerelement.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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-plugins-glvideomixerelement.html#GstGLVideoMixerBackground" title="enum GstGLVideoMixerBackground"><span class="type">GstGLVideoMixerBackground</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glvideomixerelement.html#GstGLVideoMixer--background" title="The “background” property">background</a></td>
+<td class="property_flags">Read / Write</td>
+</tr></tbody>
+</table></div>
+</div>
+<a name="GstGLVideoMixer"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-glvideomixerelement.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-glvideomixerelement.html#GstGLVideoMixer-struct" title="struct GstGLVideoMixer">GstGLVideoMixer</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-plugins-glvideomixerelement.html#GstGLVideoMixerBackground" title="enum GstGLVideoMixerBackground">GstGLVideoMixerBackground</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glvideomixerelement.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0gst-plugins-bad-libs-GstAggregator.html#GstAggregator">GstAggregator</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0gst-plugins-bad-libs-GstVideoAggregator.html#GstVideoAggregator">GstVideoAggregator</a>
+ <span class="lineart">╰──</span> GstGLBaseMixer
+ <span class="lineart">╰──</span> GstGLMixer
+ <span class="lineart">╰──</span> GstGLVideoMixer
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glvideomixerelement.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstGLVideoMixer implements
+ <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstChildProxy.html#GstChildProxy-struct">GstChildProxy</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glvideomixerelement.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.85.8.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Matthew Waters <matthew@centricular.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video/Compositor</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.85.8.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink_%u</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>request</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glvideomixerelement.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glvideomixerelement.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLVideoMixer-struct"></a><h3>struct GstGLVideoMixer</h3>
+<pre class="programlisting">struct GstGLVideoMixer;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLVideoMixerBackground"></a><h3>enum GstGLVideoMixerBackground</h3>
+<p>The different backgrounds compositor can blend over.</p>
+<div class="refsect3">
+<a name="GstGLVideoMixerBackground.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" 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-VIDEO-MIXER-BACKGROUND-CHECKER:CAPS"></a>GST_GL_VIDEO_MIXER_BACKGROUND_CHECKER</p></td>
+<td class="enum_member_description">
+<p>checker pattern background</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-VIDEO-MIXER-BACKGROUND-BLACK:CAPS"></a>GST_GL_VIDEO_MIXER_BACKGROUND_BLACK</p></td>
+<td class="enum_member_description">
+<p>solid color black background</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-VIDEO-MIXER-BACKGROUND-WHITE:CAPS"></a>GST_GL_VIDEO_MIXER_BACKGROUND_WHITE</p></td>
+<td class="enum_member_description">
+<p>solid color white background</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-VIDEO-MIXER-BACKGROUND-TRANSPARENT:CAPS"></a>GST_GL_VIDEO_MIXER_BACKGROUND_TRANSPARENT</p></td>
+<td class="enum_member_description">
+<p>background is left transparent and layers are composited using "A OVER B" composition rules. This is only applicable to AYUV and ARGB (and variants) as it preserves the alpha channel and allows for further mixing.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glvideomixerelement.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGLVideoMixer--background"></a><h3>The <code class="literal">“background”</code> property</h3>
+<pre class="programlisting"> “background” <a class="link" href="gst-plugins-bad-plugins-glvideomixerelement.html#GstGLVideoMixerBackground" title="enum GstGLVideoMixerBackground"><span class="type">GstGLVideoMixerBackground</span></a></pre>
+<p>Background type.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: Checker pattern</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-glviewconvert.html b/docs/plugins/html/gst-plugins-bad-plugins-glviewconvert.html
new file mode 100644
index 0000000..abb8b4a
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-glviewconvert.html
@@ -0,0 +1,277 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>glviewconvert: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-glvideomixer.html" title="glvideomixer">
+<link rel="next" href="gst-plugins-bad-plugins-jpegparse.html" title="jpegparse">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-glviewconvert.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glviewconvert.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-glviewconvert.properties" class="shortcut">Properties</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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-glvideomixer.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-jpegparse.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-glviewconvert"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-glviewconvert.top_of_page"></a>glviewconvert</span></h2>
+<p>glviewconvert</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glviewconvert.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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"><span class="type">GstGLStereoDownmix</span></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glviewconvert.html#GstGLViewConvertElement--downmix-mode" title="The “downmix-mode” property">downmix-mode</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewFlags"><span class="type">GstVideoMultiviewFlags</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glviewconvert.html#GstGLViewConvertElement--input-flags-override" title="The “input-flags-override” property">input-flags-override</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewFramePacking"><span class="type">GstVideoMultiviewFramePacking</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glviewconvert.html#GstGLViewConvertElement--input-mode-override" title="The “input-mode-override” property">input-mode-override</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewFlags"><span class="type">GstVideoMultiviewFlags</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glviewconvert.html#GstGLViewConvertElement--output-flags-override" title="The “output-flags-override” property">output-flags-override</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewMode"><span class="type">GstVideoMultiviewMode</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-glviewconvert.html#GstGLViewConvertElement--output-mode-override" title="The “output-mode-override” property">output-mode-override</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="GstGLViewConvertElement"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-glviewconvert.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-glviewconvert.html#GstGLViewConvertElement-struct" title="struct GstGLViewConvertElement">GstGLViewConvertElement</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glviewconvert.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseTransform.html#GstBaseTransform-struct">GstBaseTransform</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLBaseFilter.html#GstGLBaseFilter-struct">GstGLBaseFilter</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-bad-libs-1.0GstGLFilter.html#GstGLFilter-struct">GstGLFilter</a>
+ <span class="lineart">╰──</span> GstGLViewConvertElement
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glviewconvert.description"></a><h2>Description</h2>
+<p>Convert stereoscopic video between different representations using fragment shaders.</p>
+<p>The element can use either property settings or caps negotiation to choose the
+input and output formats to process.</p>
+<div class="refsect2">
+<a name="id-1.2.87.7.4"></a><h3>Examples</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> videotestsrc <span class="gtkdoc opt">!</span> glupload <span class="gtkdoc opt">!</span> glviewconvert <span class="gtkdoc opt">!</span> glimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Simple placebo example demonstrating identity passthrough of mono video
+<div class="informalexample">
+ <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+ <tbody>
+ <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">1.0</span> videotestsrc pattern<span class="gtkdoc opt">=</span>checkers<span class="gtkdoc opt">-</span><span class="number">1</span> <span class="gtkdoc opt">!</span> glupload <span class="gtkdoc opt">!</span> \
+ glviewconvert input<span class="gtkdoc opt">-</span>mode<span class="gtkdoc opt">-</span>override<span class="gtkdoc opt">=</span>side<span class="gtkdoc opt">-</span>by<span class="gtkdoc opt">-</span>side <span class="gtkdoc opt">!</span> glimagesink <span class="gtkdoc opt">-</span>v</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Force re-interpretation of the input checkers pattern as a side-by-side stereoscopic
+ image and display in glimagesink.
+FBO (Frame Buffer Object) and GLSL (OpenGL Shading Language) are required.
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.87.7.5.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-opengl.html#plugin-opengl">opengl</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Jan Schmidt <jan@centricular.com>
+Matthew Waters <matthew@centricular.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.87.7.5.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw(ANY), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glviewconvert.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glviewconvert.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstGLViewConvertElement-struct"></a><h3>struct GstGLViewConvertElement</h3>
+<pre class="programlisting">struct GstGLViewConvertElement;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-glviewconvert.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGLViewConvertElement--downmix-mode"></a><h3>The <code class="literal">“downmix-mode”</code> property</h3>
+<pre class="programlisting"> “downmix-mode” <span class="type">GstGLStereoDownmix</span></pre>
+<p>Output anaglyph type to generate when downmixing to mono.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: Dubois optimised Green-Magenta anaglyph</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLViewConvertElement--input-flags-override"></a><h3>The <code class="literal">“input-flags-override”</code> property</h3>
+<pre class="programlisting"> “input-flags-override” <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewFlags"><span class="type">GstVideoMultiviewFlags</span></a></pre>
+<p>Override any input information about multiview layout flags.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLViewConvertElement--input-mode-override"></a><h3>The <code class="literal">“input-mode-override”</code> property</h3>
+<pre class="programlisting"> “input-mode-override” <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewFramePacking"><span class="type">GstVideoMultiviewFramePacking</span></a></pre>
+<p>Override any input information about multiview layout.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: GST_VIDEO_MULTIVIEW_FRAME_PACKING_NONE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLViewConvertElement--output-flags-override"></a><h3>The <code class="literal">“output-flags-override”</code> property</h3>
+<pre class="programlisting"> “output-flags-override” <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewFlags"><span class="type">GstVideoMultiviewFlags</span></a></pre>
+<p>Override automatic negotiation for output multiview layout flags.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGLViewConvertElement--output-mode-override"></a><h3>The <code class="literal">“output-mode-override”</code> property</h3>
+<pre class="programlisting"> “output-mode-override” <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoMultiviewMode"><span class="type">GstVideoMultiviewMode</span></a></pre>
+<p>Override automatic output mode selection for multiview layout.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: GST_VIDEO_MULTIVIEW_MODE_NONE</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-jpegparse.html b/docs/plugins/html/gst-plugins-bad-plugins-jpegparse.html
index 9de33f6..784175a 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-jpegparse.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-jpegparse.html
@@ -6,7 +6,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
-<link rel="prev" href="gst-plugins-bad-plugins-gaussianblur.html" title="gaussianblur">
+<link rel="prev" href="gst-plugins-bad-plugins-glviewconvert.html" title="glviewconvert">
<link rel="next" href="gst-plugins-bad-plugins-kaleidoscope.html" title="kaleidoscope">
<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
@@ -20,7 +20,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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gst-plugins-bad-plugins-gaussianblur.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-glviewconvert.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
<td><a accesskey="n" href="gst-plugins-bad-plugins-kaleidoscope.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
</tr></table>
<div class="refentry">
@@ -32,49 +32,6 @@
</td>
<td class="gallery_image" valign="top" align="right"></td>
</tr></table></div>
-<div class="refsect1">
-<a name="gst-plugins-bad-plugins-jpegparse.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table class="informaltable" width="100%" border="0">
-<colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
-</colgroup>
-<tbody>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-plugins-jpegparse.html#GST-JPEG-PARSE:CAPS" title="GST_JPEG_PARSE()">GST_JPEG_PARSE</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-plugins-jpegparse.html#GST-JPEG-PARSE-CLASS:CAPS" title="GST_JPEG_PARSE_CLASS()">GST_JPEG_PARSE_CLASS</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-plugins-jpegparse.html#GST-IS-JPEG-PARSE:CAPS" title="GST_IS_JPEG_PARSE()">GST_IS_JPEG_PARSE</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-plugins-jpegparse.html#GST-IS-JPEG-PARSE-CLASS:CAPS" title="GST_IS_JPEG_PARSE_CLASS()">GST_IS_JPEG_PARSE_CLASS</a><span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="/usr/share/gtk-doc/html/gobjectgobject-Type-Information.html#GType"><span class="returnvalue">GType</span></a>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-plugins-jpegparse.html#gst-jpeg-parse-get-type" title="gst_jpeg_parse_get_type ()">gst_jpeg_parse_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-</tbody>
-</table></div>
-</div>
<a name="GstJpegParse"></a><div class="refsect1">
<a name="gst-plugins-bad-plugins-jpegparse.other"></a><h2>Types and Values</h2>
<div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -82,20 +39,10 @@
<col width="150px" class="name">
<col class="description">
</colgroup>
-<tbody>
-<tr>
+<tbody><tr>
<td class="datatype_keyword">struct</td>
<td class="function_name"><a class="link" href="gst-plugins-bad-plugins-jpegparse.html#GstJpegParse-struct" title="struct GstJpegParse">GstJpegParse</a></td>
-</tr>
-<tr>
-<td class="datatype_keyword">struct</td>
-<td class="function_name"><a class="link" href="gst-plugins-bad-plugins-jpegparse.html#GstJpegParseClass" title="struct GstJpegParseClass">GstJpegParseClass</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="gst-plugins-bad-plugins-jpegparse.html#GST-TYPE-JPEG-PARSE:CAPS" title="GST_TYPE_JPEG_PARSE">GST_TYPE_JPEG_PARSE</a></td>
-</tr>
-</tbody>
+</tr></tbody>
</table></div>
</div>
<div class="refsect1">
@@ -115,7 +62,7 @@
image header searching for image properties such as width and height
among others. Jpegparse can also extract metadata (e.g. xmp).</p>
<div class="refsect2">
-<a name="id-1.2.41.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.88.6.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -133,7 +80,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.41.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.88.6.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -159,7 +106,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.41.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.88.6.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -213,31 +160,7 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-jpegparse.functions_details"></a><h2>Functions</h2>
-<div class="refsect2">
-<a name="GST-JPEG-PARSE:CAPS"></a><h3>GST_JPEG_PARSE()</h3>
-<pre class="programlisting">#define GST_JPEG_PARSE(obj)</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GST-JPEG-PARSE-CLASS:CAPS"></a><h3>GST_JPEG_PARSE_CLASS()</h3>
-<pre class="programlisting">#define GST_JPEG_PARSE_CLASS(klass)</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GST-IS-JPEG-PARSE:CAPS"></a><h3>GST_IS_JPEG_PARSE()</h3>
-<pre class="programlisting">#define GST_IS_JPEG_PARSE(obj)</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GST-IS-JPEG-PARSE-CLASS:CAPS"></a><h3>GST_IS_JPEG_PARSE_CLASS()</h3>
-<pre class="programlisting">#define GST_IS_JPEG_PARSE_CLASS(klass)</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-jpeg-parse-get-type"></a><h3>gst_jpeg_parse_get_type ()</h3>
-<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gobjectgobject-Type-Information.html#GType"><span class="returnvalue">GType</span></a>
-gst_jpeg_parse_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-</div>
+<p></p>
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-jpegparse.other_details"></a><h2>Types and Values</h2>
@@ -245,19 +168,6 @@
<a name="GstJpegParse-struct"></a><h3>struct GstJpegParse</h3>
<pre class="programlisting">struct GstJpegParse;</pre>
</div>
-<hr>
-<div class="refsect2">
-<a name="GstJpegParseClass"></a><h3>struct GstJpegParseClass</h3>
-<pre class="programlisting">struct GstJpegParseClass {
- GstBaseParseClass parent_class;
-};
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GST-TYPE-JPEG-PARSE:CAPS"></a><h3>GST_TYPE_JPEG_PARSE</h3>
-<pre class="programlisting">#define GST_TYPE_JPEG_PARSE</pre>
-</div>
</div>
</div>
<div class="footer">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-kaleidoscope.html b/docs/plugins/html/gst-plugins-bad-plugins-kaleidoscope.html
index d8ed12f..ad87e02 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-kaleidoscope.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-kaleidoscope.html
@@ -91,7 +91,7 @@
<p>The kaleidscope element applies 'kaleidoscope' geometric transform to the
image.</p>
<div class="refsect2">
-<a name="id-1.2.42.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.89.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -107,7 +107,7 @@
<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.89.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -133,7 +133,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.89.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-liveadder.html b/docs/plugins/html/gst-plugins-bad-plugins-liveadder.html
index af6748e..a0b78dc 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-liveadder.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-liveadder.html
@@ -36,7 +36,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.43.3.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.90.3.2.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -62,7 +62,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.43.3.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.90.3.2.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-marble.html b/docs/plugins/html/gst-plugins-bad-plugins-marble.html
index 2200032..f3882af 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-marble.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-marble.html
@@ -95,7 +95,7 @@
<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.44.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.91.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -111,7 +111,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.44.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.91.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -137,7 +137,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.44.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.91.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-mimdec.html b/docs/plugins/html/gst-plugins-bad-plugins-mimdec.html
index eb82f2d..1ef1b35 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-mimdec.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-mimdec.html
@@ -56,10 +56,13 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-mimdec.description"></a><h2>Description</h2>
+<p>The MIMIC codec is used by MSN Messenger's webcam support. It consumes the
+TCP header for the MIMIC codec.</p>
+<p>Its fourcc is ML20.</p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.46.6.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.93.6.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -85,7 +88,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.46.6.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.93.6.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -152,6 +155,10 @@
<pre class="programlisting">struct GstMimDec;</pre>
</div>
</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-mimdec.see-also"></a><h2>See Also</h2>
+<p>mimenc</p>
+</div>
</div>
<div class="footer">
<hr>Generated by GTK-Doc V1.25</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-mimenc.html b/docs/plugins/html/gst-plugins-bad-plugins-mimenc.html
index 529b3a3..c277718 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-mimenc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-mimenc.html
@@ -72,10 +72,19 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-mimenc.description"></a><h2>Description</h2>
+<p>The MIMIC codec is used by MSN Messenger's webcam support. It creates the
+TCP header for the MIMIC codec.</p>
+<p>When using it to communicate directly with MSN Messenger, if the sender
+wants to stop sending, he has to send a special buffer every 4 seconds.
+When the "paused-mode" property is set to TRUE, if the element receives no
+buffer on its sink pad for 4 seconds, it will produced a special paused
+frame and will continue doing so every 4 seconds until a new buffer is
+u received on its sink pad.</p>
+<p>Its fourcc is ML20.</p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.45.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.92.7.5.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -101,7 +110,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.45.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.92.7.5.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -178,6 +187,10 @@
<p>Default value: FALSE</p>
</div>
</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-mimenc.see-also"></a><h2>See Also</h2>
+<p>mimdec</p>
+</div>
</div>
<div class="footer">
<hr>Generated by GTK-Doc V1.25</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-mirror.html b/docs/plugins/html/gst-plugins-bad-plugins-mirror.html
index 594a684..e5d5bf2 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-mirror.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-mirror.html
@@ -42,7 +42,7 @@
<col width="200px" class="properties_flags">
</colgroup>
<tbody><tr>
-<td class="property_type"><span class="type">GstMirrorMode</span></td>
+<td class="property_type"><a class="link" href="gst-plugins-bad-plugins-mirror.html#GstMirrorMode" title="enum GstMirrorMode"><span class="type">GstMirrorMode</span></a></td>
<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-mirror.html#GstMirror--mode" title="The “mode” property">mode</a></td>
<td class="property_flags">Read / Write</td>
</tr></tbody>
@@ -55,10 +55,16 @@
<col width="150px" class="name">
<col class="description">
</colgroup>
-<tbody><tr>
+<tbody>
+<tr>
<td class="datatype_keyword">struct</td>
<td class="function_name"><a class="link" href="gst-plugins-bad-plugins-mirror.html#GstMirror-struct" title="struct GstMirror">GstMirror</a></td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-plugins-mirror.html#GstMirrorMode" title="enum GstMirrorMode">GstMirrorMode</a></td>
+</tr>
+</tbody>
</table></div>
</div>
<div class="refsect1">
@@ -78,7 +84,7 @@
<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.47.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.94.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -94,7 +100,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.47.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.94.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -120,7 +126,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.47.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.94.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -182,12 +188,48 @@
<a name="GstMirror-struct"></a><h3>struct GstMirror</h3>
<pre class="programlisting">struct GstMirror;</pre>
</div>
+<hr>
+<div class="refsect2">
+<a name="GstMirrorMode"></a><h3>enum GstMirrorMode</h3>
+<div class="refsect3">
+<a name="GstMirrorMode.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" 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-MIRROR-MODE-LEFT:CAPS"></a>GST_MIRROR_MODE_LEFT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-MIRROR-MODE-RIGHT:CAPS"></a>GST_MIRROR_MODE_RIGHT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-MIRROR-MODE-TOP:CAPS"></a>GST_MIRROR_MODE_TOP</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-MIRROR-MODE-BOTTOM:CAPS"></a>GST_MIRROR_MODE_BOTTOM</p></td>
+<td> </td>
+<td> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-mirror.property-details"></a><h2>Property Details</h2>
<div class="refsect2">
<a name="GstMirror--mode"></a><h3>The <code class="literal">“mode”</code> property</h3>
-<pre class="programlisting"> “mode” <span class="type">GstMirrorMode</span></pre>
+<pre class="programlisting"> “mode” <a class="link" href="gst-plugins-bad-plugins-mirror.html#GstMirrorMode" title="enum GstMirrorMode"><span class="type">GstMirrorMode</span></a></pre>
<p>How to split the video frame and which side reflect.</p>
<p>Flags: Read / Write</p>
<p>Default value: Split horizontally and reflect left into right</p>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-modplug.html b/docs/plugins/html/gst-plugins-bad-plugins-modplug.html
index 547fcbb..5fdd666 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-modplug.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-modplug.html
@@ -130,10 +130,26 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-modplug.description"></a><h2>Description</h2>
+<p>Modplug uses the <a class="ulink" href="http://modplug-xmms.sourceforge.net/" target="_top">modplug</a>
+library to decode tracked music in the MOD/S3M/XM/IT and related formats.</p>
+<div class="refsect2">
+<a name="id-1.2.95.7.3"></a><h3>Example pipeline</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 filesrc location<span class="gtkdoc opt">=</span><span class="number">1990</span>s<span class="gtkdoc opt">-</span>nostalgia<span class="gtkdoc opt">.</span>xm <span class="gtkdoc opt">!</span> modplug <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> alsasink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Play a FastTracker xm file.
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.48.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.95.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -159,7 +175,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.48.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.95.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-mpeg2enc.html b/docs/plugins/html/gst-plugins-bad-plugins-mpeg2enc.html
index 2d391f1..5751283 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-mpeg2enc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-mpeg2enc.html
@@ -246,10 +246,51 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-mpeg2enc.description"></a><h2>Description</h2>
+<p>This element encodes raw video into an MPEG-1/2 elementary stream using the</p>
+<a class="ulink" href="http://mjpeg.sourceforge.net/" target="_top">mjpegtools</a> library.
+<p>Documentation on MPEG encoding in general can be found in the </p>
+<a class="ulink" href="https://sourceforge.net/docman/display_doc.php?docid=3456&group_id=5776" target="_top">MJPEG Howto</a><p>and on the various available parameters in the documentation
+of the mpeg2enc tool in particular, which shares options with this element.</p>
+<div class="refsect2">
+<a name="id-1.2.96.8.7"></a><h3>Example pipeline</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> videotestsrc num<span class="gtkdoc opt">-</span>buffers<span class="gtkdoc opt">=</span><span class="number">1000</span> <span class="gtkdoc opt">!</span> mpeg2enc <span class="gtkdoc opt">!</span> filesink location<span class="gtkdoc opt">=</span>videotestsrc<span class="gtkdoc opt">.</span>m1v</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ This example pipeline will encode a test video source to a an MPEG1
+elementary stream (with Generic MPEG1 profile).
+<p>
+Likely, the <a class="link" href="gst-plugins-bad-plugins-mpeg2enc.html#GstMpeg2enc--format" title="The “format” property"><span class="type">“format”</span></a> property
+is most important, as it selects the type of MPEG stream that is produced.
+In particular, default property values are dependent on the format,
+and can even be forcibly restrained to certain pre-sets (and thereby ignored).
+Note that the (S)VCD profiles also restrict the image size, so some scaling
+may be needed to accomodate this. The so-called generic profiles (as used
+in the example above) allow most parameters to be adjusted.
+</p>
+<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> videotestsrc num<span class="gtkdoc opt">-</span>buffers<span class="gtkdoc opt">=</span><span class="number">1000</span> <span class="gtkdoc opt">!</span> videoscale <span class="gtkdoc opt">!</span> mpeg2enc format<span class="gtkdoc opt">=</span><span class="number">1</span> norm<span class="gtkdoc opt">=</span>p <span class="gtkdoc opt">!</span> filesink location<span class="gtkdoc opt">=</span>videotestsrc<span class="gtkdoc opt">.</span>m1v</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ This will produce an MPEG1 profile stream according to VCD2.0 specifications
+for PAL <a class="link" href="gst-plugins-bad-plugins-mpeg2enc.html#GstMpeg2enc--norm" title="The “norm” property"><span class="type">“norm”</span></a> (as the image height is dependent on video norm).
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.49.8.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.96.8.8.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -276,7 +317,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.49.8.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.96.8.8.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -630,6 +671,10 @@
<p>Default value: 0</p>
</div>
</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-mpeg2enc.see-also"></a><h2>See Also</h2>
+<p>mpeg2dec</p>
+</div>
</div>
<div class="footer">
<hr>Generated by GTK-Doc V1.25</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-mpegpsmux.html b/docs/plugins/html/gst-plugins-bad-plugins-mpegpsmux.html
index a1cb9e4..b3045b1 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-mpegpsmux.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-mpegpsmux.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-mpegpsmux.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
- <a href="#gst-plugins-bad-plugins-mpegpsmux.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
- <a href="#gst-plugins-bad-plugins-mpegpsmux.properties" class="shortcut">Properties</a></span>
+ <a href="#gst-plugins-bad-plugins-mpegpsmux.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,35 +32,11 @@
<td class="gallery_image" valign="top" align="right"></td>
</tr></table></div>
<div class="refsect1">
-<a name="gst-plugins-bad-plugins-mpegpsmux.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
-<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-mpegpsmux.html#MpegPsMux--aggregate-gops" title="The “aggregate-gops” property">aggregate-gops</a></td>
-<td class="property_flags">Read / Write</td>
-</tr></tbody>
-</table></div>
-</div>
-<a name="MpegPsMux"></a><div class="refsect1">
-<a name="gst-plugins-bad-plugins-mpegpsmux.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
- <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
- <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
- <span class="lineart">╰──</span> MpegPsMux
-</pre>
-</div>
-<div class="refsect1">
<a name="gst-plugins-bad-plugins-mpegpsmux.description"></a><h2>Description</h2>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.50.6.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.97.3.2.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -88,7 +62,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.50.6.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.97.3.2.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -167,16 +141,6 @@
<div class="refsect1">
<a name="gst-plugins-bad-plugins-mpegpsmux.other_details"></a><h2>Types and Values</h2>
</div>
-<div class="refsect1">
-<a name="gst-plugins-bad-plugins-mpegpsmux.property-details"></a><h2>Property Details</h2>
-<div class="refsect2">
-<a name="MpegPsMux--aggregate-gops"></a><h3>The <code class="literal">“aggregate-gops”</code> property</h3>
-<pre class="programlisting"> “aggregate-gops” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
-<p>Whether to aggregate GOPs and push them out as buffer lists.</p>
-<p>Flags: Read / Write</p>
-<p>Default value: FALSE</p>
-</div>
-</div>
</div>
<div class="footer">
<hr>Generated by GTK-Doc V1.25</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-mpegtsmux.html b/docs/plugins/html/gst-plugins-bad-plugins-mpegtsmux.html
index 1b6e324..c06b0c0 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-mpegtsmux.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-mpegtsmux.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-mpegtsmux.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
- <a href="#gst-plugins-bad-plugins-mpegtsmux.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
- <a href="#gst-plugins-bad-plugins-mpegtsmux.properties" class="shortcut">Properties</a></span>
+ <a href="#gst-plugins-bad-plugins-mpegtsmux.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,63 +32,11 @@
<td class="gallery_image" valign="top" align="right"></td>
</tr></table></div>
<div class="refsect1">
-<a name="gst-plugins-bad-plugins-mpegtsmux.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
-<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-mpegtsmux.html#MpegTsMux--m2ts-mode" title="The “m2ts-mode” property">m2ts-mode</a></td>
-<td class="property_flags">Read / Write</td>
-</tr>
-<tr>
-<td class="property_type">
-<a href="/usr/share/gtk-doc/html/gstreamer-1.0GstStructure.html#GstStructure-struct"><span class="type">GstStructure</span></a> *</td>
-<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-mpegtsmux.html#MpegTsMux--prog-map" title="The “prog-map” property">prog-map</a></td>
-<td class="property_flags">Read / Write</td>
-</tr>
-<tr>
-<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a></td>
-<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-mpegtsmux.html#MpegTsMux--pat-interval" title="The “pat-interval” property">pat-interval</a></td>
-<td class="property_flags">Read / Write</td>
-</tr>
-<tr>
-<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a></td>
-<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-mpegtsmux.html#MpegTsMux--pmt-interval" title="The “pmt-interval” property">pmt-interval</a></td>
-<td class="property_flags">Read / Write</td>
-</tr>
-<tr>
-<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
-<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-mpegtsmux.html#MpegTsMux--alignment" title="The “alignment” property">alignment</a></td>
-<td class="property_flags">Read / Write</td>
-</tr>
-<tr>
-<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a></td>
-<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-mpegtsmux.html#MpegTsMux--si-interval" title="The “si-interval” property">si-interval</a></td>
-<td class="property_flags">Read / Write</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<a name="MpegTsMux"></a><div class="refsect1">
-<a name="gst-plugins-bad-plugins-mpegtsmux.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
- <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
- <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
- <span class="lineart">╰──</span> MpegTsMux
-</pre>
-</div>
-<div class="refsect1">
<a name="gst-plugins-bad-plugins-mpegtsmux.description"></a><h2>Description</h2>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.51.6.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.98.3.2.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -116,7 +62,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.51.6.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.98.3.2.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -227,59 +173,6 @@
<div class="refsect1">
<a name="gst-plugins-bad-plugins-mpegtsmux.other_details"></a><h2>Types and Values</h2>
</div>
-<div class="refsect1">
-<a name="gst-plugins-bad-plugins-mpegtsmux.property-details"></a><h2>Property Details</h2>
-<div class="refsect2">
-<a name="MpegTsMux--m2ts-mode"></a><h3>The <code class="literal">“m2ts-mode”</code> property</h3>
-<pre class="programlisting"> “m2ts-mode” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
-<p>Set to TRUE to output Blu-Ray disc format with 192 byte packets. FALSE for standard TS format with 188 byte packets.</p>
-<p>Flags: Read / Write</p>
-<p>Default value: FALSE</p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="MpegTsMux--prog-map"></a><h3>The <code class="literal">“prog-map”</code> property</h3>
-<pre class="programlisting"> “prog-map” <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstStructure.html#GstStructure-struct"><span class="type">GstStructure</span></a> *</pre>
-<p>A GstStructure specifies the mapping from elementary streams to programs.</p>
-<p>Flags: Read / Write</p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="MpegTsMux--pat-interval"></a><h3>The <code class="literal">“pat-interval”</code> property</h3>
-<pre class="programlisting"> “pat-interval” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a></pre>
-<p>Set the interval (in ticks of the 90kHz clock) for writing out the PAT table.</p>
-<p>Flags: Read / Write</p>
-<p>Allowed values: >= 1</p>
-<p>Default value: 9000</p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="MpegTsMux--pmt-interval"></a><h3>The <code class="literal">“pmt-interval”</code> property</h3>
-<pre class="programlisting"> “pmt-interval” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a></pre>
-<p>Set the interval (in ticks of the 90kHz clock) for writing out the PMT table.</p>
-<p>Flags: Read / Write</p>
-<p>Allowed values: >= 1</p>
-<p>Default value: 9000</p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="MpegTsMux--alignment"></a><h3>The <code class="literal">“alignment”</code> property</h3>
-<pre class="programlisting"> “alignment” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
-<p>Number of packets per buffer (padded with dummy packets on EOS) (-1 = auto, 0 = all available packets, 7 for UDP streaming).</p>
-<p>Flags: Read / Write</p>
-<p>Allowed values: >= G_MAXULONG</p>
-<p>Default value: -1</p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="MpegTsMux--si-interval"></a><h3>The <code class="literal">“si-interval”</code> property</h3>
-<pre class="programlisting"> “si-interval” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a></pre>
-<p>Set the interval (in ticks of the 90kHz clock) for writing out the ServiceInformation tables.</p>
-<p>Flags: Read / Write</p>
-<p>Allowed values: >= 1</p>
-<p>Default value: 9000</p>
-</div>
-</div>
</div>
<div class="footer">
<hr>Generated by GTK-Doc V1.25</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-mplex.html b/docs/plugins/html/gst-plugins-bad-plugins-mplex.html
index 0fa961e..3a9967c 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-mplex.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-mplex.html
@@ -104,10 +104,37 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-mplex.description"></a><h2>Description</h2>
+<p>This element is an audio/video multiplexer for MPEG-1/2 video streams
+and (un)compressed audio streams such as AC3, MPEG layer I/II/III.
+It is based on the <a class="ulink" href="http://mjpeg.sourceforge.net/" target="_top">mjpegtools</a> library.
+Documentation on creating MPEG videos in general can be found in the</p>
+<a class="ulink" href="https://sourceforge.net/docman/display_doc.php?docid=3456&group_id=5776" target="_top">MJPEG Howto</a><p>and the man-page of the mplex tool documents the properties of this element,
+which are shared with the mplex tool.</p>
+<div class="refsect2">
+<a name="id-1.2.99.7.5"></a><h3>Example pipeline</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 num<span class="gtkdoc opt">-</span>buffers<span class="gtkdoc opt">=</span><span class="number">1000</span> <span class="gtkdoc opt">!</span> mpeg2enc <span class="gtkdoc opt">!</span> mplex <span class="gtkdoc opt">!</span> filesink location<span class="gtkdoc opt">=</span>videotestsrc<span class="gtkdoc opt">.</span>mpg</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ This example pipeline will encode a test video source to an
+MPEG1 elementary stream and multiplexes this to an MPEG system stream.
+<p>
+If several streams are being multiplexed, there should (as usual) be
+a queue in each stream, and due to mplex' buffering the capacities of these
+may have to be set to a few times the default settings to prevent the
+pipeline stalling.
+</p>
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.52.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.99.7.6.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -135,7 +162,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.52.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.99.7.6.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -296,6 +323,10 @@
<p>Default value: FALSE</p>
</div>
</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-mplex.see-also"></a><h2>See Also</h2>
+<p>mpeg2enc</p>
+</div>
</div>
<div class="footer">
<hr>Generated by GTK-Doc V1.25</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-neonhttpsrc.html b/docs/plugins/html/gst-plugins-bad-plugins-neonhttpsrc.html
index 5e62e66..3dc3a75 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-neonhttpsrc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-neonhttpsrc.html
@@ -145,7 +145,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.53.6.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.100.6.2.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -171,7 +171,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.53.6.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.100.6.2.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-ofa.html b/docs/plugins/html/gst-plugins-bad-plugins-ofa.html
index e38327c..7b80764 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-ofa.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-ofa.html
@@ -78,7 +78,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.54.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.101.7.2.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -104,7 +104,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.54.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.101.7.2.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -165,6 +165,7 @@
<div class="refsect2">
<a name="GstOFA-struct"></a><h3>struct GstOFA</h3>
<pre class="programlisting">struct GstOFA;</pre>
+<p>Opaque <a class="link" href="gst-plugins-bad-plugins-ofa.html#GstOFA"><span class="type">GstOFA</span></a> data structure</p>
</div>
</div>
<div class="refsect1">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-openalsink.html b/docs/plugins/html/gst-plugins-bad-plugins-openalsink.html
index de88f4a..0842d94 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-openalsink.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-openalsink.html
@@ -15,7 +15,9 @@
<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-openalsink.description" class="shortcut">Description</a></span>
+ <a href="#gst-plugins-bad-plugins-openalsink.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-openalsink.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-openalsink.properties" class="shortcut">Properties</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>
@@ -27,16 +29,133 @@
<div class="refnamediv"><table width="100%"><tr>
<td valign="top">
<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-openalsink.top_of_page"></a>openalsink</span></h2>
-<p>openalsink</p>
+<p>openalsink — capture raw audio samples through OpenAL</p>
</td>
<td class="gallery_image" valign="top" align="right"></td>
</tr></table></div>
<div class="refsect1">
+<a name="gst-plugins-bad-plugins-openalsink.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-openalsink.html#GstOpenALSink--context-handle" title="The “context-handle” property">context-handle</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-openalsink.html#GstOpenALSink--device" title="The “device” property">device</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-openalsink.html#GstOpenALSink--device-handle" title="The “device-handle” property">device-handle</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-openalsink.html#GstOpenALSink--device-name" title="The “device-name” property">device-name</a></td>
+<td class="property_flags">Read</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-openalsink.html#GstOpenALSink--source-id" title="The “source-id” property">source-id</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-openalsink.html#GstOpenALSink--user-context" title="The “user-context” property">user-context</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-openalsink.html#GstOpenALSink--user-device" title="The “user-device” property">user-device</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-openalsink.html#GstOpenALSink--user-source" title="The “user-source” property">user-source</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="GstOpenALSink"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-openalsink.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-openalsink.html#GstOpenALSink-struct" title="struct GstOpenALSink">GstOpenALSink</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-openalsink.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseSink.html#GstBaseSink-struct">GstBaseSink</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstaudiobasesink.html#GstAudioBaseSink-struct">GstAudioBaseSink</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstaudiosink.html#GstAudioSink-struct">GstAudioSink</a>
+ <span class="lineart">╰──</span> GstOpenALSink
+</pre>
+</div>
+<div class="refsect1">
<a name="gst-plugins-bad-plugins-openalsink.description"></a><h2>Description</h2>
+<p>This element plays raw audio samples through OpenAL.</p>
+<p>Unfortunately the capture API doesn't have a format enumeration/check. all you can do is try opening it and see if it works.</p>
+<div class="refsect2">
+<a name="id-1.2.103.7.4"></a><h3>Example pipelines</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> audiotestsrc <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> volume volume<span class="gtkdoc opt">=</span><span class="number">0.5</span> <span class="gtkdoc opt">!</span> openalsink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ will play a sine wave (continuous beep sound) through OpenAL.
+<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> filesrc location<span class="gtkdoc opt">=</span>stream<span class="gtkdoc opt">.</span>wav <span class="gtkdoc opt">!</span> decodebin <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> openalsink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ will play a wav audio file through OpenAL.
+<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> openalsrc <span class="gtkdoc opt">!</span> <span class="string">"audio/x-raw,format=S16LE,rate=44100"</span> <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> volume volume<span class="gtkdoc opt">=</span><span class="number">0.25</span> <span class="gtkdoc opt">!</span> openalsink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ will capture and play audio through OpenAL.
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.56.3.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.103.7.5.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -62,7 +181,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.56.3.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.103.7.5.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -108,6 +227,76 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-openalsink.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstOpenALSink-struct"></a><h3>struct GstOpenALSink</h3>
+<pre class="programlisting">struct GstOpenALSink;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-openalsink.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstOpenALSink--context-handle"></a><h3>The <code class="literal">“context-handle”</code> property</h3>
+<pre class="programlisting"> “context-handle” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a></pre>
+<p>Custom playback context.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstOpenALSink--device"></a><h3>The <code class="literal">“device”</code> property</h3>
+<pre class="programlisting"> “device” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
+<p>Human-readable name of the device.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstOpenALSink--device-handle"></a><h3>The <code class="literal">“device-handle”</code> property</h3>
+<pre class="programlisting"> “device-handle” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a></pre>
+<p>Custom playback device.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstOpenALSink--device-name"></a><h3>The <code class="literal">“device-name”</code> property</h3>
+<pre class="programlisting"> “device-name” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
+<p>Human-readable name of the opened device.</p>
+<p>Flags: Read</p>
+<p>Default value: ""</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstOpenALSink--source-id"></a><h3>The <code class="literal">“source-id”</code> property</h3>
+<pre class="programlisting"> “source-id” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a></pre>
+<p>Custom playback sID.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstOpenALSink--user-context"></a><h3>The <code class="literal">“user-context”</code> property</h3>
+<pre class="programlisting"> “user-context” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a></pre>
+<p>User context.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstOpenALSink--user-device"></a><h3>The <code class="literal">“user-device”</code> property</h3>
+<pre class="programlisting"> “user-device” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a></pre>
+<p>User device.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstOpenALSink--user-source"></a><h3>The <code class="literal">“user-source”</code> property</h3>
+<pre class="programlisting"> “user-source” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a></pre>
+<p>User source.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: 0</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-openalsink.see-also"></a><h2>See Also</h2>
+<p>openalsrc</p>
</div>
</div>
<div class="footer">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-openalsrc.html b/docs/plugins/html/gst-plugins-bad-plugins-openalsrc.html
index ccb707e..e44e55c 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-openalsrc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-openalsrc.html
@@ -29,7 +29,7 @@
<div class="refnamediv"><table width="100%"><tr>
<td valign="top">
<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-openalsrc.top_of_page"></a>openalsrc</span></h2>
-<p>openalsrc</p>
+<p>openalsrc — capture raw audio samples through OpenAL</p>
</td>
<td class="gallery_image" valign="top" align="right"></td>
</tr></table></div>
@@ -85,10 +85,36 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-openalsrc.description"></a><h2>Description</h2>
+<p>This element captures raw audio samples through OpenAL.</p>
+<div class="refsect2">
+<a name="id-1.2.102.7.3"></a><h3>Example pipelines</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 openalsrc <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> wavenc <span class="gtkdoc opt">!</span> filesink location<span class="gtkdoc opt">=</span>stream<span class="gtkdoc opt">.</span>wav</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ * will capture sound through OpenAL and encode it to a wav file.
+<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> openalsrc <span class="gtkdoc opt">!</span> <span class="string">"audio/x-raw,format=S16LE,rate=44100"</span> <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> volume volume<span class="gtkdoc opt">=</span><span class="number">0.25</span> <span class="gtkdoc opt">!</span> openalsink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ will capture and play audio through OpenAL.
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.55.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.102.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -114,7 +140,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.55.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.102.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -175,6 +201,10 @@
<p>Default value: NULL</p>
</div>
</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-openalsrc.see-also"></a><h2>See Also</h2>
+<p>openalsink</p>
+</div>
</div>
<div class="footer">
<hr>Generated by GTK-Doc V1.25</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-opencvtextoverlay.html b/docs/plugins/html/gst-plugins-bad-plugins-opencvtextoverlay.html
index 06dd2d7..37ab32d 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-opencvtextoverlay.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-opencvtextoverlay.html
@@ -91,7 +91,7 @@
</tbody>
</table></div>
</div>
-<a name="GstOpenalSrc"></a><a name="GstOpencvTextOverlay"></a><div class="refsect1">
+<a name="GstOpencvTextOverlay"></a><div class="refsect1">
<a name="gst-plugins-bad-plugins-opencvtextoverlay.other"></a><h2>Types and Values</h2>
<div class="informaltable"><table class="informaltable" width="100%" border="0">
<colgroup>
@@ -118,10 +118,25 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-opencvtextoverlay.description"></a><h2>Description</h2>
+<p>opencvtextoverlay renders the text on top of the video frames</p>
+<div class="refsect2">
+<a name="id-1.2.123.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> videotestsrc <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> opencvtextoverlay text<span class="gtkdoc opt">=</span><span class="string">"Opencv Text Overlay "</span> <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> xvimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.75.8.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.123.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -147,7 +162,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.75.8.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.123.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-pcapparse.html b/docs/plugins/html/gst-plugins-bad-plugins-pcapparse.html
index fd4a848..1f3aed0 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-pcapparse.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-pcapparse.html
@@ -107,7 +107,7 @@
<a class="link" href="gst-plugins-bad-plugins-pcapparse.html#GstPcapParse--src-port" title="The “src-port” property"><span class="type">“src-port”</span></a> and <a class="link" href="gst-plugins-bad-plugins-pcapparse.html#GstPcapParse--dst-port" title="The “dst-port” property"><span class="type">“dst-port”</span></a> to restrict which packets
should be included.</p>
<div class="refsect2">
-<a name="id-1.2.57.7.3"></a><h3>Example pipelines</h3>
+<a name="id-1.2.104.7.3"></a><h3>Example pipelines</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -126,7 +126,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.57.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.104.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -152,7 +152,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.57.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.104.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-pinch.html b/docs/plugins/html/gst-plugins-bad-plugins-pinch.html
index 98c87d4..65925b2 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-pinch.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-pinch.html
@@ -7,7 +7,7 @@
<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
<link rel="prev" href="gst-plugins-bad-plugins-pcapparse.html" title="pcapparse">
-<link rel="next" href="gst-plugins-bad-plugins-pyramidsegment.html" title="pyramidsegment">
+<link rel="next" href="gst-plugins-bad-plugins-rawaudioparse.html" title="rawaudioparse">
<meta name="generator" content="GTK-Doc V1.25 (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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
<td><a accesskey="p" href="gst-plugins-bad-plugins-pcapparse.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gst-plugins-bad-plugins-pyramidsegment.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-rawaudioparse.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-pinch"></a><div class="titlepage"></div>
@@ -78,7 +78,7 @@
<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.58.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.105.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -94,7 +94,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.58.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.105.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -120,7 +120,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.58.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.105.7.4.2"></a><h3>Element Pads</h3>
<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-aiff.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-aiff.html
index 8019fad..6e327dd 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.8.3</td>
+<td>1.9.90</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 5036103..ee5d10a 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.8.3</td>
+<td>1.9.90</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 27f05a2..d256d43 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.8.3</td>
+<td>1.9.90</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-audiovisualizers.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-audiovisualizers.html
index 4a1e00e..d3f4cfb 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.8.3</td>
+<td>1.9.90</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 eb7136c..9722137 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.8.3</td>
+<td>1.9.90</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 2818cf7..2544cc9 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.8.3</td>
+<td>1.9.90</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-bs2b.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-bs2b.html
index 79e4ca6..a76b16a 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-bs2b.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-bs2b.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.8.3</td>
+<td>1.9.90</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 03a0abf..a67543f 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.8.3</td>
+<td>1.9.90</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 987dc5e..51b318b 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.8.3</td>
+<td>1.9.90</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 e6c890c..2ba036c 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.8.3</td>
+<td>1.9.90</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 d4254d2..148e9a6 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.8.3</td>
+<td>1.9.90</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 261e1c1..ed4791b 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.8.3</td>
+<td>1.9.90</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 6dc93fe..6275c4f 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.8.3</td>
+<td>1.9.90</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 f090d6e..109c6cc 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.8.3</td>
+<td>1.9.90</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 c2c95dc..2c53c08 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.8.3</td>
+<td>1.9.90</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 6b2c245..a2426f3 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.8.3</td>
+<td>1.9.90</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 96cf9d5..c035d4b 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.8.3</td>
+<td>1.9.90</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 9fd3cab..1fc0441 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.8.3</td>
+<td>1.9.90</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 c1ba0fe..1d1fb62 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.8.3</td>
+<td>1.9.90</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 2cae289..6d0882f 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.8.3</td>
+<td>1.9.90</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 e32af49..b98cdc8 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.8.3</td>
+<td>1.9.90</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 b8626d1..f311365 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.8.3</td>
+<td>1.9.90</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 23be040..ae48467 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-jpegformat.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-jpegformat.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.8.3</td>
+<td>1.9.90</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-mimic.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mimic.html
index e478bbe..7269da0 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mimic.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mimic.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.8.3</td>
+<td>1.9.90</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-mms.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mms.html
index c5c391f..56ab726 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mms.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mms.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.8.3</td>
+<td>1.9.90</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-modplug.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-modplug.html
index 2068b65..7ed88c4 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-modplug.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-modplug.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.8.3</td>
+<td>1.9.90</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-mpeg2enc.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpeg2enc.html
index 8785340..49929e9 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpeg2enc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpeg2enc.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.8.3</td>
+<td>1.9.90</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-mpegpsmux.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpegpsmux.html
index 5716ae4..91fb6c5 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpegpsmux.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpegpsmux.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.8.3</td>
+<td>1.9.90</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-mpegtsmux.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpegtsmux.html
index acecf9d..03e1d51 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpegtsmux.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpegtsmux.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.8.3</td>
+<td>1.9.90</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-mplex.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mplex.html
index 7966a67..fbf186f 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mplex.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mplex.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.8.3</td>
+<td>1.9.90</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-neon.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-neon.html
index 0f67c78..b9bf5bd 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-neon.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-neon.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.7.1</td>
+<td>1.9.0.1</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
@@ -50,7 +50,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>
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 840400f..6fc9cbc 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-ofa.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-ofa.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.8.3</td>
+<td>1.9.90</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-openal.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-openal.html
index 56e5982..0873040 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-openal.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-openal.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-ofa.html" title="ofa">
-<link rel="next" href="gst-plugins-bad-plugins-plugin-opencv.html" title="opencv">
+<link rel="next" href="gst-plugins-bad-plugins-plugin-opengl.html" title="opengl">
<meta name="generator" content="GTK-Doc V1.25 (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-ofa.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-opencv.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-opengl.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-openal"></a><div class="titlepage"></div>
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.8.3</td>
+<td>1.9.90</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-opencv.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-opencv.html
index 3d1fa5b..0c4871e 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-opencv.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-opencv.html
@@ -6,7 +6,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.79.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-openal.html" title="openal">
+<link rel="prev" href="gst-plugins-bad-plugins-plugin-opengl.html" title="opengl">
<link rel="next" href="gst-plugins-bad-plugins-plugin-pcapparse.html" title="pcapparse">
<meta name="generator" content="GTK-Doc V1.25 (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-openal.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-opengl.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-pcapparse.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.35.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.8.3</td>
+<td>1.9.90</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.36.4"></a><h2>Elements</h2>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -126,10 +126,6 @@
<td>Write text on the top of video</td>
</tr>
<tr>
-<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-pyramidsegment.html" title="pyramidsegment">pyramidsegment</a></span></p></td>
-<td>Applies pyramid segmentation to a video or image.</td>
-</tr>
-<tr>
<td><p><span class="term">retinex</span></p></td>
<td>Multiscale retinex for colour image enhancement</td>
</tr>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-opengl.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-opengl.html
new file mode 100644
index 0000000..dcb49bd
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-opengl.html
@@ -0,0 +1,257 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>opengl: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.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-openal.html" title="openal">
+<link rel="next" href="gst-plugins-bad-plugins-plugin-opencv.html" title="opencv">
+<meta name="generator" content="GTK-Doc V1.25 (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-openal.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-opencv.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-opengl"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">opengl</span></h2>
+<p>opengl — <a name="plugin-opengl"></a>OpenGL plugin</p>
+</td>
+<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>
+<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>libgstopengl.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>1.9.90</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.35.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-glcolorbalance.html" title="glcolorbalance">glcolorbalance</a></span></p></td>
+<td>Adjusts brightness, contrast, hue, saturation on a video stream</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-glcolorconvert.html" title="glcolorconvert">glcolorconvert</a></span></p></td>
+<td>Converts between color spaces using OpenGL shaders</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-glcolorscale.html" title="glcolorscale">glcolorscale</a></span></p></td>
+<td>Colorspace converter and video scaler</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-gldeinterlace.html" title="gldeinterlace">gldeinterlace</a></span></p></td>
+<td>Deinterlacing based on fragment shaders</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-gldifferencematte.html" title="gldifferencematte">gldifferencematte</a></span></p></td>
+<td>Saves a background frame and replace it with a pixbuf</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-gldownload.html" title="gldownload">gldownload</a></span></p></td>
+<td>Downloads data from OpenGL</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-gleffects.html" title="gleffects">gleffects</a></span></p></td>
+<td>GL Shading Language effects</td>
+</tr>
+<tr>
+<td><p><span class="term">gleffects_blur</span></p></td>
+<td>GL Shading Language effects - Blur with 9x9 separable convolution Effect</td>
+</tr>
+<tr>
+<td><p><span class="term">gleffects_bulge</span></p></td>
+<td>GL Shading Language effects - Bulge Effect</td>
+</tr>
+<tr>
+<td><p><span class="term">gleffects_fisheye</span></p></td>
+<td>GL Shading Language effects - FishEye Effect</td>
+</tr>
+<tr>
+<td><p><span class="term">gleffects_glow</span></p></td>
+<td>GL Shading Language effects - Glow Lighting Effect</td>
+</tr>
+<tr>
+<td><p><span class="term">gleffects_heat</span></p></td>
+<td>GL Shading Language effects - Heat Signature Effect</td>
+</tr>
+<tr>
+<td><p><span class="term">gleffects_identity</span></p></td>
+<td>GL Shading Language effects - Do nothing Effect</td>
+</tr>
+<tr>
+<td><p><span class="term">gleffects_laplacian</span></p></td>
+<td>GL Shading Language effects - Laplacian Convolution Demo Effect</td>
+</tr>
+<tr>
+<td><p><span class="term">gleffects_lumaxpro</span></p></td>
+<td>GL Shading Language effects - Luma Cross Processing Effect</td>
+</tr>
+<tr>
+<td><p><span class="term">gleffects_mirror</span></p></td>
+<td>GL Shading Language effects - Mirror Effect</td>
+</tr>
+<tr>
+<td><p><span class="term">gleffects_sepia</span></p></td>
+<td>GL Shading Language effects - Sepia Toning Effect</td>
+</tr>
+<tr>
+<td><p><span class="term">gleffects_sin</span></p></td>
+<td>GL Shading Language effects - All Grey but Red Effect</td>
+</tr>
+<tr>
+<td><p><span class="term">gleffects_sobel</span></p></td>
+<td>GL Shading Language effects - Sobel edge detection Effect</td>
+</tr>
+<tr>
+<td><p><span class="term">gleffects_square</span></p></td>
+<td>GL Shading Language effects - Square Effect</td>
+</tr>
+<tr>
+<td><p><span class="term">gleffects_squeeze</span></p></td>
+<td>GL Shading Language effects - Squeeze Effect</td>
+</tr>
+<tr>
+<td><p><span class="term">gleffects_stretch</span></p></td>
+<td>GL Shading Language effects - Stretch Effect</td>
+</tr>
+<tr>
+<td><p><span class="term">gleffects_tunnel</span></p></td>
+<td>GL Shading Language effects - Light Tunnel Effect</td>
+</tr>
+<tr>
+<td><p><span class="term">gleffects_twirl</span></p></td>
+<td>GL Shading Language effects - Twirl Effect</td>
+</tr>
+<tr>
+<td><p><span class="term">gleffects_xpro</span></p></td>
+<td>GL Shading Language effects - Cross Processing Effect</td>
+</tr>
+<tr>
+<td><p><span class="term">gleffects_xray</span></p></td>
+<td>GL Shading Language effects - Glowing negative effect</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-glfilterapp.html" title="glfilterapp">glfilterapp</a></span></p></td>
+<td>Use client callbacks to define the scene</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-glfilterbin.html" title="glfilterbin">glfilterbin</a></span></p></td>
+<td>Infrastructure to process GL textures</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-glfiltercube.html" title="glfiltercube">glfiltercube</a></span></p></td>
+<td>Map input texture on the 6 cube faces</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-glfilterglass.html" title="glfilterglass">glfilterglass</a></span></p></td>
+<td>Glass Filter</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-glimagesink.html" title="glimagesink">glimagesink</a></span></p></td>
+<td>Infrastructure to process GL textures</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-glimagesinkelement.html" title="glimagesinkelement">glimagesinkelement</a></span></p></td>
+<td>A videosink based on OpenGL</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-glmixerbin.html" title="glmixerbin">glmixerbin</a></span></p></td>
+<td>OpenGL video_mixer empty bin</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-glmosaic.html" title="glmosaic">glmosaic</a></span></p></td>
+<td>OpenGL mosaic</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-gloverlay.html" title="gloverlay">gloverlay</a></span></p></td>
+<td>Overlay GL video texture with a JPEG/PNG image</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-glshader.html" title="glshader">glshader</a></span></p></td>
+<td>Perform operations with a GLSL shader</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-glsinkbin.html" title="glsinkbin">glsinkbin</a></span></p></td>
+<td>Infrastructure to process GL textures</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-glsrcbin.html" title="glsrcbin">glsrcbin</a></span></p></td>
+<td>Infrastructure to process GL textures</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-glstereomix.html" title="glstereomix">glstereomix</a></span></p></td>
+<td>OpenGL stereo video combiner</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-glstereosplit.html" title="glstereosplit">glstereosplit</a></span></p></td>
+<td>Splits a stereoscopic stream into separate left/right streams</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-gltestsrc.html" title="gltestsrc">gltestsrc</a></span></p></td>
+<td>Creates a test video stream</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-glupload.html" title="glupload">glupload</a></span></p></td>
+<td>Uploads data into OpenGL</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-glvideomixer.html" title="glvideomixer">glvideomixer</a></span></p></td>
+<td>OpenGL video_mixer bin</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-glvideomixerelement.html" title="glvideomixerelement">glvideomixerelement</a></span></p></td>
+<td>OpenGL video_mixer</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-glviewconvert.html" title="glviewconvert">glviewconvert</a></span></p></td>
+<td>Convert stereoscopic/multiview video formats</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
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 52ed304..c3bb0d8 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.36.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.8.3</td>
+<td>1.9.90</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.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 3d2f471..8047c5d 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.37.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.8.3</td>
+<td>1.9.90</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.38.4"></a><h2>Elements</h2>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -68,12 +68,28 @@
</colgroup>
<tbody>
<tr>
-<td><p><span class="term">audioparse</span></p></td>
-<td>Converts stream into audio frames</td>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-audioparse.html" title="audioparse">audioparse</a></span></p></td>
+<td>Converts stream into audio frames (deprecated: use rawaudioparse instead)</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-rawaudioparse.html" title="rawaudioparse">rawaudioparse</a></span></p></td>
+<td>Converts unformatted data streams into timestamped raw audio frames</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-rawvideoparse.html" title="rawvideoparse">rawvideoparse</a></span></p></td>
+<td>Converts unformatted data streams into timestamped raw video frames</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-unalignedaudioparse.html" title="unalignedaudioparse">unalignedaudioparse</a></span></p></td>
+<td>Parse unaligned raw audio data</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-unalignedvideoparse.html" title="unalignedvideoparse">unalignedvideoparse</a></span></p></td>
+<td>Parse unaligned raw video data</td>
</tr>
<tr>
<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-videoparse.html" title="videoparse">videoparse</a></span></p></td>
-<td>Converts stream into video frames</td>
+<td>Converts stream into video frames (deprecated: use rawvideoparse instead)</td>
</tr>
</tbody>
</table></div>
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 c8f7bcd..2944369 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.38.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.8.3</td>
+<td>1.9.90</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.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 969e3dc..cefdd06 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.39.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.8.3</td>
+<td>1.9.90</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.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 e96c50b..cd13383 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.40.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.8.3</td>
+<td>1.9.90</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
@@ -60,16 +60,22 @@
</table></div>
</div>
<div class="refsect1">
-<a name="id-1.3.40.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">
<col>
</colgroup>
-<tbody><tr>
+<tbody>
+<tr>
<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-sdpdemux.html" title="sdpdemux">sdpdemux</a></span></p></td>
<td>Receive data over the network via SDP</td>
-</tr></tbody>
+</tr>
+<tr>
+<td><p><span class="term">sdpsrc</span></p></td>
+<td>Stream RTP based on an SDP</td>
+</tr>
+</tbody>
</table></div>
</div>
</div>
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 1125dc8..a164b64 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.41.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.8.3</td>
+<td>1.9.90</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.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 1462be3..77d8ff7 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.42.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.8.3</td>
+<td>1.9.90</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.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 c725eef..186f130 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.43.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.8.3</td>
+<td>1.9.90</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.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 6ca1d36..a5325a0 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.44.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.8.3</td>
+<td>1.9.90</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.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 6944786..6a7cae4 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-voamrwbenc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-voamrwbenc.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-voaacenc.html" title="voaacenc">
-<link rel="next" href="gst-plugins-bad-plugins-plugin-zbar.html" title="zbar">
+<link rel="next" href="gst-plugins-bad-plugins-plugin-webrtcdsp.html" title="webrtcdsp">
<meta name="generator" content="GTK-Doc V1.25 (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-voaacenc.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-zbar.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-webrtcdsp.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-voamrwbenc"></a><div class="titlepage"></div>
@@ -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.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.8.3</td>
+<td>1.9.90</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.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-webrtcdsp.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-webrtcdsp.html
new file mode 100644
index 0000000..fcdcb55
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-webrtcdsp.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>webrtcdsp: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.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-voamrwbenc.html" title="voamrwbenc">
+<link rel="next" href="gst-plugins-bad-plugins-plugin-zbar.html" title="zbar">
+<meta name="generator" content="GTK-Doc V1.25 (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-voamrwbenc.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-zbar.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-webrtcdsp"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">webrtcdsp</span></h2>
+<p>webrtcdsp — <a name="plugin-webrtcdsp"></a>Voice pre-processing using WebRTC Audio Processing Library</p>
+</td>
+<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>
+<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>libgstwebrtcdsp.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>1.9.90</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>WebRTCDsp</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>http://git.collabora.com</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<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">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-webrtcdsp.html" title="webrtcdsp">webrtcdsp</a></span></p></td>
+<td>Pre-processes voice with WebRTC Audio Processing Library</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-webrtcechoprobe.html" title="webrtcechoprobe">webrtcechoprobe</a></span></p></td>
+<td>Gathers playback buffers for webrtcdsp</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
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 172b238..aa8399c 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-zbar.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-zbar.html
@@ -6,7 +6,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.79.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-voamrwbenc.html" title="voamrwbenc">
+<link rel="prev" href="gst-plugins-bad-plugins-plugin-webrtcdsp.html" title="webrtcdsp">
<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
@@ -15,7 +15,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-voamrwbenc.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-webrtcdsp.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
<td><img src="right-insensitive.png" width="16" height="16" border="0"></td>
</tr></table>
<div class="refentry">
@@ -28,7 +28,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.48.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.8.3</td>
+<td>1.9.90</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
@@ -59,7 +59,7 @@
</table></div>
</div>
<div class="refsect1">
-<a name="id-1.3.46.4"></a><h2>Elements</h2>
+<a name="id-1.3.48.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-pyramidsegment.html b/docs/plugins/html/gst-plugins-bad-plugins-pyramidsegment.html
deleted file mode 100644
index 441d404..0000000
--- a/docs/plugins/html/gst-plugins-bad-plugins-pyramidsegment.html
+++ /dev/null
@@ -1,128 +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>pyramidsegment: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
-<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
-<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
-<link rel="prev" href="gst-plugins-bad-plugins-pinch.html" title="pinch">
-<link rel="next" href="gst-plugins-bad-plugins-rfbsrc.html" title="rfbsrc">
-<meta name="generator" content="GTK-Doc V1.25 (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-plugins-pyramidsegment.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>
-<td><a accesskey="p" href="gst-plugins-bad-plugins-pinch.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gst-plugins-bad-plugins-rfbsrc.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-pyramidsegment"></a><div class="titlepage"></div>
-<div class="refnamediv"><table width="100%"><tr>
-<td valign="top">
-<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-pyramidsegment.top_of_page"></a>pyramidsegment</span></h2>
-<p>pyramidsegment</p>
-</td>
-<td class="gallery_image" valign="top" align="right"></td>
-</tr></table></div>
-<a name="GstPinch"></a><div class="refsect1">
-<a name="gst-plugins-bad-plugins-pyramidsegment.description"></a><h2>Description</h2>
-<div class="refsynopsisdiv">
-<h2>Synopsis</h2>
-<div class="refsect2">
-<a name="id-1.2.59.4.2.1"></a><h3>Element Information</h3>
-<div class="variablelist"><table border="0" class="variablelist">
-<colgroup>
-<col align="left" valign="top">
-<col>
-</colgroup>
-<tbody>
-<tr>
-<td><p><span class="term">plugin</span></p></td>
-<td>
- <a class="link" href="gst-plugins-bad-plugins-plugin-opencv.html#plugin-opencv">opencv</a>
- </td>
-</tr>
-<tr>
-<td><p><span class="term">author</span></p></td>
-<td>Michael Sheldon <mike@mikeasoft.com></td>
-</tr>
-<tr>
-<td><p><span class="term">class</span></p></td>
-<td>Filter/Effect/Video</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="id-1.2.59.4.2.2"></a><h3>Element Pads</h3>
-<div class="variablelist"><table border="0" class="variablelist">
-<colgroup>
-<col align="left" valign="top">
-<col>
-</colgroup>
-<tbody>
-<tr>
-<td><p><span class="term">name</span></p></td>
-<td>sink</td>
-</tr>
-<tr>
-<td><p><span class="term">direction</span></p></td>
-<td>sink</td>
-</tr>
-<tr>
-<td><p><span class="term">presence</span></p></td>
-<td>always</td>
-</tr>
-<tr>
-<td><p><span class="term">details</span></p></td>
-<td>video/x-raw, format=(string)RGB, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
-</tr>
-</tbody>
-</table></div>
-<div class="variablelist"><table border="0" class="variablelist">
-<colgroup>
-<col align="left" valign="top">
-<col>
-</colgroup>
-<tbody>
-<tr>
-<td><p><span class="term">name</span></p></td>
-<td>src</td>
-</tr>
-<tr>
-<td><p><span class="term">direction</span></p></td>
-<td>source</td>
-</tr>
-<tr>
-<td><p><span class="term">presence</span></p></td>
-<td>always</td>
-</tr>
-<tr>
-<td><p><span class="term">details</span></p></td>
-<td>video/x-raw, format=(string)RGB, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-</div>
-</div>
-<div class="refsect1">
-<a name="gst-plugins-bad-plugins-pyramidsegment.functions_details"></a><h2>Functions</h2>
-<p></p>
-</div>
-<div class="refsect1">
-<a name="gst-plugins-bad-plugins-pyramidsegment.other_details"></a><h2>Types and Values</h2>
-</div>
-</div>
-<div class="footer">
-<hr>Generated by GTK-Doc V1.25</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-rawaudioparse.html b/docs/plugins/html/gst-plugins-bad-plugins-rawaudioparse.html
new file mode 100644
index 0000000..9aea9a4
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-rawaudioparse.html
@@ -0,0 +1,335 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>rawaudioparse: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-pinch.html" title="pinch">
+<link rel="next" href="gst-plugins-bad-plugins-rawvideoparse.html" title="rawvideoparse">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-rawaudioparse.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-rawaudioparse.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-rawaudioparse.properties" class="shortcut">Properties</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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-pinch.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-rawvideoparse.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-rawaudioparse"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-rawaudioparse.top_of_page"></a>rawaudioparse</span></h2>
+<p>rawaudioparse</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-rawaudioparse.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/gobjectgobject-Value-arrays.html#GValueArray"><span class="type">GValueArray</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-rawaudioparse.html#GstRawAudioParse--channel-positions" title="The “channel-positions” property">channel-positions</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><span class="type">GstRawAudioParseFormat</span></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-rawaudioparse.html#GstRawAudioParse--format" title="The “format” property">format</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-rawaudioparse.html#GstRawAudioParse--interleaved" title="The “interleaved” property">interleaved</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-rawaudioparse.html#GstRawAudioParse--num-channels" title="The “num-channels” property">num-channels</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstaudio.html#GstAudioFormat"><span class="type">GstAudioFormat</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-rawaudioparse.html#GstRawAudioParse--pcm-format" title="The “pcm-format” property">pcm-format</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-rawaudioparse.html#GstRawAudioParse--sample-rate" title="The “sample-rate” property">sample-rate</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="GstRawAudioParse"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-rawaudioparse.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-rawaudioparse.html#GstRawAudioParse-struct" title="struct GstRawAudioParse">GstRawAudioParse</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-rawaudioparse.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseParse.html#GstBaseParse-struct">GstBaseParse</a>
+ <span class="lineart">╰──</span> GstRawBaseParse
+ <span class="lineart">╰──</span> GstRawAudioParse
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-rawaudioparse.description"></a><h2>Description</h2>
+<p>This element parses incoming data as raw audio samples and timestamps it.
+It also handles seek queries in said raw audio data, and ensures that output
+buffers contain an integer number of samples, even if the input buffers don't.
+For example, with sample format S16LE and 2 channels, an input buffer of 411
+bytes contains 102.75 samples. rawaudioparse will then output 102 samples
+(= 408 bytes) and keep the remaining 3 bytes. These will then be prepended to
+the next input data.</p>
+<p>The element implements the properties and sink caps configuration as specified
+in the <span class="type">GstRawBaseParse</span> documentation. The properties configuration can be
+modified by using the sample-rate, num-channels, channel-positions, format,
+and pcm-format properties.</p>
+<p>Currently, this parser supports raw data in a-law, mu-law, or linear PCM format.</p>
+<p>To facilitate operation with the unalignedaudioparse element, rawaudioparse
+supports the "audio/x-unaligned-raw" media type. This is treated identically to
+"audio/x-raw", except that it is used by source elements which do not guarantee
+that the buffers they push out are timestamped and contain an integer amount of
+samples (see the 411 bytes example above). By using a different media type, it
+is guaranteed that unalignedaudioparse is autoplugged, making sure that the
+autoplugged chain does not push unparsed content downstream. The source caps'
+media type with linear PCM data is always "audio/x-raw", even if the sink caps
+use "audio/x-unaligned-raw".</p>
+<p>The channel-positions property can be used to set explicit position information
+for each channel. If the array that is passed to this property does not match
+the number of channels indicated by num-channels, then said number of channels
+is updated to the array length. If channel-positions is NULL, then the default
+GStreamer positioning is used. This property is also useful for swapping left
+and right in a stereo signal for example.</p>
+<div class="refsect2">
+<a name="id-1.2.106.7.7"></a><h3>Example pipelines</h3>
+<div class="informalexample">
+ <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+ <tbody>
+ <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">1.0</span> souphttpsrc http<span class="gtkdoc opt">:</span><span class="gtkdoc slc">//my-dlna-server/track.l16 \</span>
+ rawaudioparse <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> audioresample <span class="gtkdoc opt">!</span> autoaudiosink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Receive L16 data from a DLNA server, parse and timestamp it with
+rawaudioparse, and play it. use-sink-caps is set to true since souphttpsrc
+will set its source pad's caps to audio/x-unaligned-raw for the L16 stream.
+<div class="informalexample">
+ <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+ <tbody>
+ <tr>
+ <td class="listing_lines" align="right"><pre>1
+2
+3</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>audio<span class="gtkdoc opt">.</span>raw <span class="gtkdoc opt">!</span> rawaudioparse use<span class="gtkdoc opt">-</span>sink<span class="gtkdoc opt">-</span>caps<span class="gtkdoc opt">=</span><span class="keyword">false</span> \
+ format<span class="gtkdoc opt">=</span>pcm pcm<span class="gtkdoc opt">-</span>format<span class="gtkdoc opt">=</span>s16le sample<span class="gtkdoc opt">-</span>rate<span class="gtkdoc opt">=</span><span class="number">48000</span> num<span class="gtkdoc opt">-</span>channels<span class="gtkdoc opt">=</span><span class="number">2</span> \
+ audioconvert <span class="gtkdoc opt">!</span> audioresample <span class="gtkdoc opt">!</span> autoaudiosink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Read raw data from a local file and parse it as PCM data with 48000 Hz sample
+rate, signed 16 bit integer samples, and 2 channels. use-sink-caps is set to
+false to ensure the property information is used and the parser does not expect
+audio/x-raw or audio/x-unaligned-raw caps.
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.106.7.8.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-rawparse.html#plugin-rawparse">rawparse</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Carlos Rafael Giani <dv@pseudoterminal.org></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Codec/Parser/Audio</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.106.7.8.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-unaligned-raw, format=(string){ S8, U8, S16LE, S16BE, U16LE, U16BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S32LE, S32BE, U32LE, U32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, F32LE, F32BE, F64LE, F64BE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string){ interleaved, non-interleaved }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw, format=(string){ S8, U8, S16LE, S16BE, U16LE, U16BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S32LE, S32BE, U32LE, U32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, F32LE, F32BE, F64LE, F64BE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string){ interleaved, non-interleaved }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw, format=(string){ S8, U8, S16LE, S16BE, U16LE, U16BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S32LE, S32BE, U32LE, U32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, F32LE, F32BE, F64LE, F64BE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string){ interleaved, non-interleaved }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-rawaudioparse.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-rawaudioparse.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstRawAudioParse-struct"></a><h3>struct GstRawAudioParse</h3>
+<pre class="programlisting">struct GstRawAudioParse;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-rawaudioparse.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstRawAudioParse--channel-positions"></a><h3>The <code class="literal">“channel-positions”</code> property</h3>
+<pre class="programlisting"> “channel-positions” <a href="/usr/share/gtk-doc/html/gobjectgobject-Value-arrays.html#GValueArray"><span class="type">GValueArray</span></a> *</pre>
+<p>Channel positions used on the output.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRawAudioParse--format"></a><h3>The <code class="literal">“format”</code> property</h3>
+<pre class="programlisting"> “format” <span class="type">GstRawAudioParseFormat</span></pre>
+<p>Format of the raw audio stream.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: PCM</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRawAudioParse--interleaved"></a><h3>The <code class="literal">“interleaved”</code> property</h3>
+<pre class="programlisting"> “interleaved” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>True if audio has interleaved layout.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRawAudioParse--num-channels"></a><h3>The <code class="literal">“num-channels”</code> property</h3>
+<pre class="programlisting"> “num-channels” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Number of channels in raw stream.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: >= 1</p>
+<p>Default value: 2</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRawAudioParse--pcm-format"></a><h3>The <code class="literal">“pcm-format”</code> property</h3>
+<pre class="programlisting"> “pcm-format” <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstaudio.html#GstAudioFormat"><span class="type">GstAudioFormat</span></a></pre>
+<p>Format of audio samples in PCM stream (ignored if format property is not set to pcm).</p>
+<p>Flags: Read / Write</p>
+<p>Default value: GST_AUDIO_FORMAT_UNKNOWN</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRawAudioParse--sample-rate"></a><h3>The <code class="literal">“sample-rate”</code> property</h3>
+<pre class="programlisting"> “sample-rate” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Rate of audio samples in raw stream.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: >= 1</p>
+<p>Default value: 44100</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-rawvideoparse.html b/docs/plugins/html/gst-plugins-bad-plugins-rawvideoparse.html
new file mode 100644
index 0000000..2778cd1
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-rawvideoparse.html
@@ -0,0 +1,372 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>rawvideoparse: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-rawaudioparse.html" title="rawaudioparse">
+<link rel="next" href="gst-plugins-bad-plugins-rfbsrc.html" title="rfbsrc">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-rawvideoparse.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-rawvideoparse.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-rawvideoparse.properties" class="shortcut">Properties</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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-rawaudioparse.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-rfbsrc.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-rawvideoparse"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-rawvideoparse.top_of_page"></a>rawvideoparse</span></h2>
+<p>rawvideoparse</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-rawvideoparse.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoFormat"><span class="type">GstVideoFormat</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse--format" title="The “format” property">format</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse--frame-stride" title="The “frame-stride” property">frame-stride</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><span class="type">GstFraction</span></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse--framerate" title="The “framerate” property">framerate</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse--height" title="The “height” property">height</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse--interlaced" title="The “interlaced” property">interlaced</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><span class="type">GstFraction</span></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse--pixel-aspect-ratio" title="The “pixel-aspect-ratio” property">pixel-aspect-ratio</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/gobjectgobject-Value-arrays.html#GValueArray"><span class="type">GValueArray</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse--plane-offsets" title="The “plane-offsets” property">plane-offsets</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/gobjectgobject-Value-arrays.html#GValueArray"><span class="type">GValueArray</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse--plane-strides" title="The “plane-strides” property">plane-strides</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse--top-field-first" title="The “top-field-first” property">top-field-first</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse--width" title="The “width” property">width</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="GstRawVideoParse"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-rawvideoparse.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-rawvideoparse.html#GstRawVideoParse-struct" title="struct GstRawVideoParse">GstRawVideoParse</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-rawvideoparse.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseParse.html#GstBaseParse-struct">GstBaseParse</a>
+ <span class="lineart">╰──</span> GstRawBaseParse
+ <span class="lineart">╰──</span> GstRawVideoParse
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-rawvideoparse.description"></a><h2>Description</h2>
+<p>This element parses incoming data as raw video frames and timestamps these.
+It also handles seek queries in said raw video data, and ensures that output
+buffers contain exactly one frame, even if the input buffers contain only
+partial frames or multiple frames. In the former case, it will continue to
+receive buffers until there is enough input data to output one frame. In the
+latter case, it will extract the first frame in the buffer and output it, then
+the second one etc. until the remaining unparsed bytes aren't enough to form
+a complete frame, and it will then continue as described in the earlier case.</p>
+<p>The element implements the properties and sink caps configuration as specified
+in the <span class="type">GstRawBaseParse</span> documentation. The properties configuration can be
+modified by using the width, height, pixel-aspect-ratio, framerate, interlaced,
+top-field-first, plane-strides, plane-offsets, and frame-stride properties.</p>
+<p>If the properties configuration is used, plane strides and offsets will be
+computed by using <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#gst-video-info-set-format"><code class="function">gst_video_info_set_format()</code></a>. This can be overridden by passing
+GValueArrays to the plane-offsets and plane-strides properties. When this is
+done, these custom offsets and strides are used later even if new width,
+height, format etc. property values might be set. To switch back to computed
+plane strides & offsets, pass NULL to one or both of the plane-offset and
+plane-array properties.</p>
+<p>The frame stride property is useful in cases where there is extra data between
+the frames (for example, trailing metadata, or headers). The parser calculates
+the actual frame size out of the other properties and compares it with this
+frame-stride value. If the frame stride is larger than the calculated size,
+then the extra bytes after the end of the frame are skipped. For example, with
+8-bit grayscale frames and a frame size of 100x10 pixels and a frame stride of
+1500 bytes, there are 500 excess bytes at the end of the actual frame which
+are then skipped. It is safe to set the frame stride to a value that is smaller
+than the actual frame size (in fact, its default value is 0); if it is smaller,
+then no trailing data will be skipped.</p>
+<p>If a framerate of 0 Hz is set (for example, 0/1), then output buffers will have
+no duration set. The first output buffer will have a PTS 0, all subsequent ones
+an unset PTS.</p>
+<div class="refsect2">
+<a name="id-1.2.107.7.7"></a><h3>Example pipelines</h3>
+<div class="informalexample">
+ <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+ <tbody>
+ <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">1.0</span> filesrc location<span class="gtkdoc opt">=</span>video<span class="gtkdoc opt">.</span>raw <span class="gtkdoc opt">!</span> rawvideoparse use<span class="gtkdoc opt">-</span>sink<span class="gtkdoc opt">-</span>caps<span class="gtkdoc opt">=</span><span class="keyword">false</span> \
+ width<span class="gtkdoc opt">=</span><span class="number">500</span> height<span class="gtkdoc opt">=</span><span class="number">400</span> format<span class="gtkdoc opt">=</span>y444 <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Read raw data from a local file and parse it as video data with 500x400 pixels
+and Y444 video format.
+<div class="informalexample">
+ <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+ <tbody>
+ <tr>
+ <td class="listing_lines" align="right"><pre>1
+2
+3</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>video<span class="gtkdoc opt">.</span>raw <span class="gtkdoc opt">!</span> queue <span class="gtkdoc opt">!</span> <span class="string">"video/x-raw, width=320, \</span>
+<span class="string"> height=240, format=I420, framerate=1/1"</span> <span class="gtkdoc opt">!</span> rawvideoparse \
+ use<span class="gtkdoc opt">-</span>sink<span class="gtkdoc opt">-</span>caps<span class="gtkdoc opt">=</span><span class="keyword">true</span> <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Read raw data from a local file and parse it as video data with 320x240 pixels
+and I420 video format. The queue element here is to force push based scheduling.
+See the documentation in <span class="type">GstRawBaseParse</span> for the reason why.
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.107.7.8.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-rawparse.html#plugin-rawparse">rawparse</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Carlos Rafael Giani <dv@pseudoterminal.org></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Codec/Parser/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.107.7.8.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-unaligned-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-rawvideoparse.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-rawvideoparse.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstRawVideoParse-struct"></a><h3>struct GstRawVideoParse</h3>
+<pre class="programlisting">struct GstRawVideoParse;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-rawvideoparse.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstRawVideoParse--format"></a><h3>The <code class="literal">“format”</code> property</h3>
+<pre class="programlisting"> “format” <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstvideo.html#GstVideoFormat"><span class="type">GstVideoFormat</span></a></pre>
+<p>Format of frames in raw stream.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: GST_VIDEO_FORMAT_I420</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRawVideoParse--frame-stride"></a><h3>The <code class="literal">“frame-stride”</code> property</h3>
+<pre class="programlisting"> “frame-stride” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a></pre>
+<p>Stride between whole frames (0 = frames are tightly packed together).</p>
+<p>Flags: Read / Write</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRawVideoParse--framerate"></a><h3>The <code class="literal">“framerate”</code> property</h3>
+<pre class="programlisting"> “framerate” <span class="type">GstFraction</span></pre>
+<p>Rate of frames in raw stream.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRawVideoParse--height"></a><h3>The <code class="literal">“height”</code> property</h3>
+<pre class="programlisting"> “height” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Height of frames in raw stream.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: >= 0</p>
+<p>Default value: 240</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRawVideoParse--interlaced"></a><h3>The <code class="literal">“interlaced”</code> property</h3>
+<pre class="programlisting"> “interlaced” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>True if frames in raw stream are interlaced.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRawVideoParse--pixel-aspect-ratio"></a><h3>The <code class="literal">“pixel-aspect-ratio”</code> property</h3>
+<pre class="programlisting"> “pixel-aspect-ratio” <span class="type">GstFraction</span></pre>
+<p>Pixel aspect ratio of frames in raw stream.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRawVideoParse--plane-offsets"></a><h3>The <code class="literal">“plane-offsets”</code> property</h3>
+<pre class="programlisting"> “plane-offsets” <a href="/usr/share/gtk-doc/html/gobjectgobject-Value-arrays.html#GValueArray"><span class="type">GValueArray</span></a> *</pre>
+<p>Offsets of the planets in bytes.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRawVideoParse--plane-strides"></a><h3>The <code class="literal">“plane-strides”</code> property</h3>
+<pre class="programlisting"> “plane-strides” <a href="/usr/share/gtk-doc/html/gobjectgobject-Value-arrays.html#GValueArray"><span class="type">GValueArray</span></a> *</pre>
+<p>Strides of the planets in bytes.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRawVideoParse--top-field-first"></a><h3>The <code class="literal">“top-field-first”</code> property</h3>
+<pre class="programlisting"> “top-field-first” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>True if top field in frames in raw stream come first (not used if frames aren't interlaced).</p>
+<p>Flags: Read / Write</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRawVideoParse--width"></a><h3>The <code class="literal">“width”</code> property</h3>
+<pre class="programlisting"> “width” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Width of frames in raw stream.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: >= 0</p>
+<p>Default value: 320</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-rfbsrc.html b/docs/plugins/html/gst-plugins-bad-plugins-rfbsrc.html
index 55d8fff..eb5f0cb 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-rfbsrc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-rfbsrc.html
@@ -6,7 +6,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
-<link rel="prev" href="gst-plugins-bad-plugins-pyramidsegment.html" title="pyramidsegment">
+<link rel="prev" href="gst-plugins-bad-plugins-rawvideoparse.html" title="rawvideoparse">
<link rel="next" href="gst-plugins-bad-plugins-rtmpsink.html" title="rtmpsink">
<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
@@ -21,7 +21,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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gst-plugins-bad-plugins-pyramidsegment.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-rawvideoparse.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
<td><a accesskey="n" href="gst-plugins-bad-plugins-rtmpsink.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
</tr></table>
<div class="refentry">
@@ -137,7 +137,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.60.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.108.7.2.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -163,7 +163,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.60.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.108.7.2.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-rtmpsink.html b/docs/plugins/html/gst-plugins-bad-plugins-rtmpsink.html
index 87df730..72e8b15 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-rtmpsink.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-rtmpsink.html
@@ -81,10 +81,29 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-rtmpsink.description"></a><h2>Description</h2>
+<p>This element delivers data to a streaming server via RTMP. It uses
+librtmp, and supports any protocols/urls that librtmp supports.
+The URL/location can contain extra connection or session parameters
+for librtmp, such as 'flashver=version'. See the librtmp documentation
+for more detail</p>
+<div class="refsect2">
+<a name="id-1.2.109.8.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> ffenc_flv <span class="gtkdoc opt">!</span> flvmux <span class="gtkdoc opt">!</span> rtmpsink location<span class="gtkdoc opt">=</span><span class="string">'rtmp://localhost/path/to/stream live=1'</span></pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Encode a test video stream to FLV video format and stream it via RTMP.
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.61.8.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.109.8.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -110,7 +129,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.61.8.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.109.8.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-rtmpsrc.html b/docs/plugins/html/gst-plugins-bad-plugins-rtmpsrc.html
index 8d36145..d43e9da 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-rtmpsrc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-rtmpsrc.html
@@ -42,12 +42,19 @@
<col width="300px" class="properties_name">
<col width="200px" class="properties_flags">
</colgroup>
-<tbody><tr>
+<tbody>
+<tr>
<td class="property_type">
<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-rtmpsrc.html#GstRTMPSrc--location" title="The “location” property">location</a></td>
<td class="property_flags">Read / Write</td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-rtmpsrc.html#GstRTMPSrc--timeout" title="The “timeout” property">timeout</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+</tbody>
</table></div>
</div>
<a name="GstRTMPSrc"></a><div class="refsect1">
@@ -82,10 +89,27 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-rtmpsrc.description"></a><h2>Description</h2>
+<p>This plugin reads data from a local or remote location specified
+by an URI. This location can be specified using any protocol supported by
+the RTMP library, i.e. rtmp, rtmpt, rtmps, rtmpe, rtmfp, rtmpte and rtmpts.</p>
+<div class="refsect2">
+<a name="id-1.2.110.8.3"></a><h3>Example launch lines</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 rtmpsrc location<span class="gtkdoc opt">=</span>rtmp<span class="gtkdoc opt">:</span><span class="gtkdoc slc">//somehost/someurl ! fakesink</span></pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Open an RTMP location and pass its content to fakesink.
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.62.8.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.110.8.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -111,7 +135,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.62.8.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.110.8.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -148,6 +172,7 @@
<div class="refsect2">
<a name="GstRTMPSrc-struct"></a><h3>struct GstRTMPSrc</h3>
<pre class="programlisting">struct GstRTMPSrc;</pre>
+<p>Opaque data structure.</p>
</div>
</div>
<div class="refsect1">
@@ -159,6 +184,15 @@
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTMPSrc--timeout"></a><h3>The <code class="literal">“timeout”</code> property</h3>
+<pre class="programlisting"> “timeout” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
+<p>Time without receiving any data from the server to wait before to timeout the session.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: >= 0</p>
+<p>Default value: 120</p>
+</div>
</div>
</div>
<div class="footer">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-sdpdemux.html b/docs/plugins/html/gst-plugins-bad-plugins-sdpdemux.html
index f6e9eb4..349fe2d 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-sdpdemux.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-sdpdemux.html
@@ -108,7 +108,7 @@
<p>sdpdemux acts like a live element and will therefore only generate data in the
PLAYING state.</p>
<div class="refsect2">
-<a name="id-1.2.65.8.5"></a><h3>Example launch line</h3>
+<a name="id-1.2.113.8.5"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -125,7 +125,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.65.8.6.1"></a><h3>Element Information</h3>
+<a name="id-1.2.113.8.6.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -151,7 +151,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.65.8.6.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.113.8.6.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-shmsink.html b/docs/plugins/html/gst-plugins-bad-plugins-shmsink.html
index 791d2be..6731357 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-shmsink.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-shmsink.html
@@ -119,10 +119,25 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-shmsink.description"></a><h2>Description</h2>
+<p>Send data over shared memory to the matching source.</p>
+<div class="refsect2">
+<a name="id-1.2.111.8.3"></a><h3>Example launch lines</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> shmsink socket<span class="gtkdoc opt">-</span>path<span class="gtkdoc opt">=/</span>tmp<span class="gtkdoc opt">/</span>blah shm<span class="gtkdoc opt">-</span>size<span class="gtkdoc opt">=</span><span class="number">1000000</span></pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Send video to shm buffers.
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.63.8.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.111.8.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -148,7 +163,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.63.8.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.111.8.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-shmsrc.html b/docs/plugins/html/gst-plugins-bad-plugins-shmsrc.html
index 2361a73..51a963d 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-shmsrc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-shmsrc.html
@@ -88,10 +88,29 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-shmsrc.description"></a><h2>Description</h2>
+<p>Receive data from the shared memory sink.</p>
+<div class="refsect2">
+<a name="id-1.2.112.7.3"></a><h3>Example launch lines</h3>
+<div class="informalexample">
+ <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+ <tbody>
+ <tr>
+ <td class="listing_lines" align="right"><pre>1
+2
+3</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> shmsrc socket<span class="gtkdoc opt">-</span>path<span class="gtkdoc opt">=/</span>tmp<span class="gtkdoc opt">/</span>blah <span class="gtkdoc opt">!</span> \
+<span class="string">"video/x-yuv, format=YUY2, color-matrix=sdtv, \</span>
+<span class="string">chroma-site=mpeg2, width=(int)320, height=(int)240, framerate=(fraction)30/1"</span> <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Render video from shm buffers.
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.64.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.112.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -117,7 +136,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.64.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.112.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-solarize.html b/docs/plugins/html/gst-plugins-bad-plugins-solarize.html
index 60a28e3..4921938 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-solarize.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-solarize.html
@@ -93,7 +93,7 @@
<a name="gst-plugins-bad-plugins-solarize.description"></a><h2>Description</h2>
<p>Solarize does a smart inverse in a video stream in realtime.</p>
<div class="refsect2">
-<a name="id-1.2.66.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.114.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -109,7 +109,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.66.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.114.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -135,7 +135,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.66.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.114.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-spacescope.html b/docs/plugins/html/gst-plugins-bad-plugins-spacescope.html
index 6b42299..324dfc3 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-spacescope.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-spacescope.html
@@ -76,7 +76,7 @@
<p>Spacescope is a simple audio visualisation element. It maps the left and
right channel to x and y coordinates.</p>
<div class="refsect2">
-<a name="id-1.2.67.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.115.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -92,7 +92,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.67.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.115.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -118,7 +118,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.67.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.115.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-spectrascope.html b/docs/plugins/html/gst-plugins-bad-plugins-spectrascope.html
index 4fa8dc7..9e61ec3 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-spectrascope.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-spectrascope.html
@@ -60,7 +60,7 @@
<p>Spectrascope is a simple spectrum visualisation element. It renders the
frequency spectrum as a series of bars.</p>
<div class="refsect2">
-<a name="id-1.2.68.6.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.116.6.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -76,7 +76,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.68.6.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.116.6.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -102,7 +102,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.68.6.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.116.6.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-speed.html b/docs/plugins/html/gst-plugins-bad-plugins-speed.html
index 589073e..d702c0c 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-speed.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-speed.html
@@ -78,7 +78,7 @@
element (but relies on the decoder/demuxer to handle this correctly, also
requires a fairly up-to-date gst-plugins-base, as of February 2007).</p>
<div class="refsect2">
-<a name="id-1.2.70.7.4"></a><h3>Example launch line</h3>
+<a name="id-1.2.118.7.4"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -94,7 +94,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.70.7.5.1"></a><h3>Element Information</h3>
+<a name="id-1.2.118.7.5.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -120,7 +120,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.70.7.5.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.118.7.5.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-sphere.html b/docs/plugins/html/gst-plugins-bad-plugins-sphere.html
index c37c2c6..7286e3b 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-sphere.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-sphere.html
@@ -78,7 +78,7 @@
<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.71.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.119.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -94,7 +94,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.71.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.119.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -120,7 +120,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.71.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.119.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-square.html b/docs/plugins/html/gst-plugins-bad-plugins-square.html
index d80e942..e499746 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-square.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-square.html
@@ -89,7 +89,7 @@
<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.72.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.120.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -105,7 +105,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.72.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.120.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -131,7 +131,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.72.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.120.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-stretch.html b/docs/plugins/html/gst-plugins-bad-plugins-stretch.html
index 2efd75b..e81cd5f 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-stretch.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-stretch.html
@@ -78,7 +78,7 @@
<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.73.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.121.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -94,7 +94,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.73.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.121.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -120,7 +120,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.73.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.121.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-synaescope.html b/docs/plugins/html/gst-plugins-bad-plugins-synaescope.html
index 2c8b34e..c937736 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-synaescope.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-synaescope.html
@@ -60,7 +60,7 @@
<p>Synaescope is an audio visualisation element. It analyzes frequencies and
out-of phase properties of audio and draws this as clouds of stars.</p>
<div class="refsect2">
-<a name="id-1.2.69.6.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.117.6.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -76,7 +76,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.69.6.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.117.6.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -102,7 +102,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.69.6.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.117.6.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-templatematch.html b/docs/plugins/html/gst-plugins-bad-plugins-templatematch.html
index f0e306f..f6644dc 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-templatematch.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-templatematch.html
@@ -61,7 +61,7 @@
</tbody>
</table></div>
</div>
-<a name="GstSynaeScope"></a><a name="GstTemplateMatch"></a><div class="refsect1">
+<a name="GstTemplateMatch"></a><div class="refsect1">
<a name="gst-plugins-bad-plugins-templatematch.other"></a><h2>Types and Values</h2>
<div class="informaltable"><table class="informaltable" width="100%" border="0">
<colgroup>
@@ -88,10 +88,25 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-templatematch.description"></a><h2>Description</h2>
+<p>Performs template matching on videos and images, providing detected positions via bus messages.</p>
+<div class="refsect2">
+<a name="id-1.2.122.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> videotestsrc <span class="gtkdoc opt">!</span> decodebin <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> templatematch <span class="gtkdoc kwc">template</span><span class="gtkdoc opt">=/</span>path<span class="gtkdoc opt">/</span>to<span class="gtkdoc opt">/</span>file<span class="gtkdoc opt">.</span>jpg <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> xvimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.74.8.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.122.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.74.8.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.122.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-tunnel.html b/docs/plugins/html/gst-plugins-bad-plugins-tunnel.html
index 891d87b..f8d39b6 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-tunnel.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-tunnel.html
@@ -63,7 +63,7 @@
<p>Tunnel is a geometric image transform element. It applies a light tunnel
effect.</p>
<div class="refsect2">
-<a name="id-1.2.76.6.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.124.6.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -79,7 +79,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.76.6.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.124.6.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -105,7 +105,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.76.6.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.124.6.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-twirl.html b/docs/plugins/html/gst-plugins-bad-plugins-twirl.html
index ec9e38b..375cb1d 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-twirl.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-twirl.html
@@ -7,7 +7,7 @@
<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
<link rel="prev" href="gst-plugins-bad-plugins-tunnel.html" title="tunnel">
-<link rel="next" href="gst-plugins-bad-plugins-videoparse.html" title="videoparse">
+<link rel="next" href="gst-plugins-bad-plugins-unalignedaudioparse.html" title="unalignedaudioparse">
<meta name="generator" content="GTK-Doc V1.25 (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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
<td><a accesskey="p" href="gst-plugins-bad-plugins-tunnel.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gst-plugins-bad-plugins-videoparse.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-unalignedaudioparse.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-twirl"></a><div class="titlepage"></div>
@@ -78,7 +78,7 @@
<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.77.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.125.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -94,7 +94,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.77.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.125.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -120,7 +120,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.77.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.125.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-unalignedaudioparse.html b/docs/plugins/html/gst-plugins-bad-plugins-unalignedaudioparse.html
new file mode 100644
index 0000000..5cd72e3
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-unalignedaudioparse.html
@@ -0,0 +1,163 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>unalignedaudioparse: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-twirl.html" title="twirl">
+<link rel="next" href="gst-plugins-bad-plugins-unalignedvideoparse.html" title="unalignedvideoparse">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-unalignedaudioparse.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-unalignedaudioparse.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_interfaces"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-unalignedaudioparse.implemented-interfaces" class="shortcut">Implemented Interfaces</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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-twirl.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-unalignedvideoparse.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-unalignedaudioparse"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-unalignedaudioparse.top_of_page"></a>unalignedaudioparse</span></h2>
+<p>unalignedaudioparse</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<a name="GstUnalignedAudioParse"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-unalignedaudioparse.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-plugins-unalignedaudioparse.html#GstUnalignedAudioParse-struct" title="GstUnalignedAudioParse">GstUnalignedAudioParse</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-unalignedaudioparse.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstBin.html#GstBin-struct">GstBin</a>
+ <span class="lineart">╰──</span> GstUnalignedAudioParse
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-unalignedaudioparse.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstUnalignedAudioParse implements
+ <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstChildProxy.html#GstChildProxy-struct">GstChildProxy</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-unalignedaudioparse.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.126.7.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-rawparse.html#plugin-rawparse">rawparse</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Carlos Rafael Giani <dv@pseudoterminal.org></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Codec/Parser/Bin/Audio</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.126.7.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-unaligned-raw, format=(string){ S8, U8, S16LE, S16BE, U16LE, U16BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S32LE, S32BE, U32LE, U32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, F32LE, F32BE, F64LE, F64BE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string){ interleaved, non-interleaved }</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw, format=(string){ S8, U8, S16LE, S16BE, U16LE, U16BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S32LE, S32BE, U32LE, U32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, F32LE, F32BE, F64LE, F64BE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string){ interleaved, non-interleaved }</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-unalignedaudioparse.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-unalignedaudioparse.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstUnalignedAudioParse-struct"></a><h3>GstUnalignedAudioParse</h3>
+<pre class="programlisting">typedef struct _GstUnalignedAudioParse GstUnalignedAudioParse;</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-unalignedvideoparse.html b/docs/plugins/html/gst-plugins-bad-plugins-unalignedvideoparse.html
new file mode 100644
index 0000000..11f0152
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-unalignedvideoparse.html
@@ -0,0 +1,163 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>unalignedvideoparse: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-unalignedaudioparse.html" title="unalignedaudioparse">
+<link rel="next" href="gst-plugins-bad-plugins-videoparse.html" title="videoparse">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-unalignedvideoparse.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-unalignedvideoparse.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_interfaces"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-unalignedvideoparse.implemented-interfaces" class="shortcut">Implemented Interfaces</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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-unalignedaudioparse.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-videoparse.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-unalignedvideoparse"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-unalignedvideoparse.top_of_page"></a>unalignedvideoparse</span></h2>
+<p>unalignedvideoparse</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<a name="GstUnalignedVideoParse"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-unalignedvideoparse.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-plugins-unalignedvideoparse.html#GstUnalignedVideoParse-struct" title="GstUnalignedVideoParse">GstUnalignedVideoParse</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-unalignedvideoparse.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstBin.html#GstBin-struct">GstBin</a>
+ <span class="lineart">╰──</span> GstUnalignedVideoParse
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-unalignedvideoparse.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstUnalignedVideoParse implements
+ <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstChildProxy.html#GstChildProxy-struct">GstChildProxy</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-unalignedvideoparse.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.127.7.2.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-rawparse.html#plugin-rawparse">rawparse</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Carlos Rafael Giani <dv@pseudoterminal.org></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Codec/Parser/Bin/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.127.7.2.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-unaligned-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-unalignedvideoparse.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-unalignedvideoparse.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstUnalignedVideoParse-struct"></a><h3>GstUnalignedVideoParse</h3>
+<pre class="programlisting">typedef struct _GstUnalignedVideoParse GstUnalignedVideoParse;</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-videoparse.html b/docs/plugins/html/gst-plugins-bad-plugins-videoparse.html
index 8ef7792..8538b5f 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-videoparse.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-videoparse.html
@@ -6,7 +6,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
-<link rel="prev" href="gst-plugins-bad-plugins-twirl.html" title="twirl">
+<link rel="prev" href="gst-plugins-bad-plugins-unalignedvideoparse.html" title="unalignedvideoparse">
<link rel="next" href="gst-plugins-bad-plugins-waterripple.html" title="waterripple">
<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
@@ -16,12 +16,13 @@
<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-videoparse.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
- <a href="#gst-plugins-bad-plugins-videoparse.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-videoparse.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_interfaces"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-videoparse.implemented-interfaces" class="shortcut">Implemented Interfaces</a></span><span id="nav_properties"> <span class="dim">|</span>
<a href="#gst-plugins-bad-plugins-videoparse.properties" class="shortcut">Properties</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>
-<td><a accesskey="p" href="gst-plugins-bad-plugins-twirl.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-unalignedvideoparse.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
<td><a accesskey="n" href="gst-plugins-bad-plugins-waterripple.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
</tr></table>
<div class="refentry">
@@ -151,17 +152,24 @@
<span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
<span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
<span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
- <span class="lineart">╰──</span> GstRawParse
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstBin.html#GstBin-struct">GstBin</a>
<span class="lineart">╰──</span> GstVideoParse
</pre>
</div>
<div class="refsect1">
+<a name="gst-plugins-bad-plugins-videoparse.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstVideoParse implements
+ <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstChildProxy.html#GstChildProxy-struct">GstChildProxy</a>.</p>
+</div>
+<div class="refsect1">
<a name="gst-plugins-bad-plugins-videoparse.description"></a><h2>Description</h2>
<p>Converts a byte stream into video frames.</p>
+<div class="note">This element is deprecated. Use <a class="link" href="gst-plugins-bad-plugins-rawvideoparse.html#GstRawVideoParse"><span class="type">GstRawVideoParse</span></a> instead.</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.78.7.3.1"></a><h3>Element Information</h3>
+<a name="id-1.2.128.8.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -187,7 +195,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.78.7.3.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.128.8.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -234,10 +242,6 @@
<td><p><span class="term">details</span></p></td>
<td>video/x-raw</td>
</tr>
-<tr>
-<td><p><span class="term"></span></p></td>
-<td> video/x-bayer</td>
-</tr>
</tbody>
</table></div>
</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-voaacenc.html b/docs/plugins/html/gst-plugins-bad-plugins-voaacenc.html
index 6d37c53..76f2201 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-voaacenc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-voaacenc.html
@@ -80,10 +80,26 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-voaacenc.description"></a><h2>Description</h2>
+<p>AAC audio encoder based on vo-aacenc library </p>
+<a class="ulink" href="http://sourceforge.net/projects/opencore-amr/files/vo-aacenc/" target="_top">vo-aacenc library source file</a>.
+<div class="refsect2">
+<a name="id-1.2.131.8.4"></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> filesrc location<span class="gtkdoc opt">=</span>abc<span class="gtkdoc opt">.</span>wav <span class="gtkdoc opt">!</span> wavparse <span class="gtkdoc opt">!</span> audioresample <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> voaacenc <span class="gtkdoc opt">!</span> filesink location<span class="gtkdoc opt">=</span>abc<span class="gtkdoc opt">.</span>aac</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.81.8.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.131.8.5.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -109,7 +125,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.81.8.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.131.8.5.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-voamrwbenc.html b/docs/plugins/html/gst-plugins-bad-plugins-voamrwbenc.html
index 4458aeb..0a8e5a6 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-voamrwbenc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-voamrwbenc.html
@@ -15,7 +15,10 @@
<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-voamrwbenc.description" class="shortcut">Description</a></span>
+ <a href="#gst-plugins-bad-plugins-voamrwbenc.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-voamrwbenc.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_interfaces"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-voamrwbenc.implemented-interfaces" class="shortcut">Implemented Interfaces</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-voamrwbenc.properties" class="shortcut">Properties</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>
@@ -32,11 +35,73 @@
<td class="gallery_image" valign="top" align="right"></td>
</tr></table></div>
<div class="refsect1">
+<a name="gst-plugins-bad-plugins-voamrwbenc.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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"><span class="type">GstVoAmrWbEncBandMode</span></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-voamrwbenc.html#GstVoAmrWbEnc--band-mode" title="The “band-mode” property">band-mode</a></td>
+<td class="property_flags">Read / Write / Construct</td>
+</tr></tbody>
+</table></div>
+</div>
+<a name="GstVoAmrWbEnc"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-voamrwbenc.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-voamrwbenc.html#GstVoAmrWbEnc-struct" title="struct GstVoAmrWbEnc">GstVoAmrWbEnc</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-voamrwbenc.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder-struct">GstAudioEncoder</a>
+ <span class="lineart">╰──</span> GstVoAmrWbEnc
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-voamrwbenc.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstVoAmrWbEnc implements
+ <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstPreset.html#GstPreset-struct">GstPreset</a>.</p>
+</div>
+<div class="refsect1">
<a name="gst-plugins-bad-plugins-voamrwbenc.description"></a><h2>Description</h2>
+<p>AMR wideband encoder based on the </p>
+<a class="ulink" href="http://www.penguin.cz/~utx/amr" target="_top">reference codec implementation</a>.
+<div class="refsect2">
+<a name="id-1.2.132.8.4"></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 filesrc location<span class="gtkdoc opt">=</span>abc<span class="gtkdoc opt">.</span>wav <span class="gtkdoc opt">!</span> wavparse <span class="gtkdoc opt">!</span> audioresample <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> voamrwbenc <span class="gtkdoc opt">!</span> filesink location<span class="gtkdoc opt">=</span>abc<span class="gtkdoc opt">.</span>amr</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+
+Please note that the above stream misses the header, that is needed to play
+the stream.
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.82.3.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.132.8.5.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -62,7 +127,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.82.3.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.132.8.5.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -120,6 +185,24 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-voamrwbenc.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstVoAmrWbEnc-struct"></a><h3>struct GstVoAmrWbEnc</h3>
+<pre class="programlisting">struct GstVoAmrWbEnc;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-voamrwbenc.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstVoAmrWbEnc--band-mode"></a><h3>The <code class="literal">“band-mode”</code> property</h3>
+<pre class="programlisting"> “band-mode” <span class="type">GstVoAmrWbEncBandMode</span></pre>
+<p>Encoding Band Mode (Kbps).</p>
+<p>Flags: Read / Write / Construct</p>
+<p>Default value: MR660</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-voamrwbenc.see-also"></a><h2>See Also</h2>
+<p><span class="type">GstAmrWbDec</span>, <span class="type">GstAmrWbParse</span></p>
</div>
</div>
<div class="footer">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-waterripple.html b/docs/plugins/html/gst-plugins-bad-plugins-waterripple.html
index 9df7ce9..4cabdf0 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-waterripple.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-waterripple.html
@@ -90,7 +90,7 @@
<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.79.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.129.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -106,7 +106,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.79.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.129.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -132,7 +132,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.79.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.129.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-wavescope.html b/docs/plugins/html/gst-plugins-bad-plugins-wavescope.html
index dcbbce4..2ab700d 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-wavescope.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-wavescope.html
@@ -7,7 +7,7 @@
<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
<link rel="prev" href="gst-plugins-bad-plugins-voamrwbenc.html" title="voamrwbenc">
-<link rel="next" href="ch02.html" title="gst-plugins-bad Plugins">
+<link rel="next" href="gst-plugins-bad-plugins-webrtcdsp.html" title="webrtcdsp">
<meta name="generator" content="GTK-Doc V1.25 (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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
<td><a accesskey="p" href="gst-plugins-bad-plugins-voamrwbenc.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="ch02.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-webrtcdsp.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-wavescope"></a><div class="titlepage"></div>
@@ -76,7 +76,7 @@
<p>Wavescope is a simple audio visualisation element. It renders the waveforms
like on an oscilloscope.</p>
<div class="refsect2">
-<a name="id-1.2.83.7.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.133.7.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -92,7 +92,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.83.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.133.7.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -118,7 +118,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.83.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.133.7.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-webrtcdsp.html b/docs/plugins/html/gst-plugins-bad-plugins-webrtcdsp.html
new file mode 100644
index 0000000..96ddfc0
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-webrtcdsp.html
@@ -0,0 +1,355 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>webrtcdsp: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-wavescope.html" title="wavescope">
+<link rel="next" href="gst-plugins-bad-plugins-webrtcechoprobe.html" title="webrtcechoprobe">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-webrtcdsp.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-webrtcdsp.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-webrtcdsp.properties" class="shortcut">Properties</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>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-wavescope.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-webrtcechoprobe.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-webrtcdsp"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-webrtcdsp.top_of_page"></a>webrtcdsp</span></h2>
+<p>webrtcdsp — Audio Filter using WebRTC Audio Processing library</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-webrtcdsp.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" 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="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp--echo-cancel" title="The “echo-cancel” property">echo-cancel</a></td>
+<td class="property_flags">Read / Write / Construct</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp--experimental-agc" title="The “experimental-agc” property">experimental-agc</a></td>
+<td class="property_flags">Read / Write / Construct</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp--extended-filter" title="The “extended-filter” property">extended-filter</a></td>
+<td class="property_flags">Read / Write / Construct</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp--gain-control" title="The “gain-control” property">gain-control</a></td>
+<td class="property_flags">Read / Write / Construct</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp--high-pass-filter" title="The “high-pass-filter” property">high-pass-filter</a></td>
+<td class="property_flags">Read / Write / Construct</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp--noise-suppression" title="The “noise-suppression” property">noise-suppression</a></td>
+<td class="property_flags">Read / Write / Construct</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp--probe" title="The “probe” property">probe</a></td>
+<td class="property_flags">Read / Write / Construct</td>
+</tr>
+<tr>
+<td class="property_type"><span class="type">GstWebrtcEchoSuppressionLevel</span></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp--echo-suppression-level" title="The “echo-suppression-level” property">echo-suppression-level</a></td>
+<td class="property_flags">Read / Write / Construct</td>
+</tr>
+<tr>
+<td class="property_type"><span class="type">GstWebrtcNoiseSuppressionLevel</span></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp--noise-suppression-level" title="The “noise-suppression-level” property">noise-suppression-level</a></td>
+<td class="property_flags">Read / Write / Construct</td>
+</tr>
+<tr>
+<td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-webrtcdsp.html#GstWebrtcDsp--delay-agnostic" title="The “delay-agnostic” property">delay-agnostic</a></td>
+<td class="property_flags">Read / Write / Construct</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="GstWebrtcDsp"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-webrtcdsp.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-plugins-webrtcdsp.html#GstWebrtcDsp-struct" title="GstWebrtcDsp">GstWebrtcDsp</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-webrtcdsp.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseTransform.html#GstBaseTransform-struct">GstBaseTransform</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilter-struct">GstAudioFilter</a>
+ <span class="lineart">╰──</span> GstWebrtcDsp
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-webrtcdsp.description"></a><h2>Description</h2>
+<p>A voice enhancement filter based on WebRTC Audio Processing library. This
+library provides a whide variety of enhancement algorithms. This element
+tries to enable as much as possible. The currently enabled enhancements are
+High Pass Filter, Echo Canceller, Noise Suppression, Automatic Gain Control,
+and some extended filters.</p>
+<p>While webrtcdsp element can be used alone, there is an exception for the
+echo canceller. The audio canceller need to be aware of the far end streams
+that are played to loud speakers. For this, you must place a webrtcechoprobe
+element at that far end. Note that the sample rate must match between
+webrtcdsp and the webrtechoprobe. Though, the number of channels can differ.
+The probe is found by the DSP element using it's object name. By default,
+webrtcdsp looks for webrtcechoprobe0, which means it just work if you have
+a single probe and DSP.</p>
+<p>The probe can only be used within the same top level GstPipeline.
+Additonally, to simplify the code, the probe element must be created
+before the DSP sink pad is activated. It does not need to be in any
+particular state and does not even need to be added to the pipeline yet.</p>
+<div class="refsect2">
+<a name="id-1.2.134.7.5"></a><h3>Example launch line</h3>
+<p>As a conveniance, the echo canceller can be tested using an echo loop. In
+this configuration, one would expect a single echo to be heard.</p>
+<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> pulsesrc <span class="gtkdoc opt">!</span> webrtcdsp <span class="gtkdoc opt">!</span> webrtcechoprobe <span class="gtkdoc opt">!</span> pulsesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+
+<p></p>
+<p>In real environment, you'll place the probe before the playback, but only
+process the far end streams. The DSP should be placed as close as possible
+to the audio capture. The following pipeline is astracted and does not
+represent a real pipeline.</p>
+<div class="informalexample">
+ <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+ <tbody>
+ <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">1.0</span> far<span class="gtkdoc opt">-</span>end<span class="gtkdoc opt">-</span>src <span class="gtkdoc opt">!</span> audio<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw<span class="gtkdoc opt">,</span>rate<span class="gtkdoc opt">=</span><span class="number">48000</span> <span class="gtkdoc opt">!</span> webrtcechoprobe <span class="gtkdoc opt">!</span> pulsesink \
+ pulsesrc <span class="gtkdoc opt">!</span> audio<span class="gtkdoc opt">/</span>x<span class="gtkdoc opt">-</span>raw<span class="gtkdoc opt">,</span>rate<span class="gtkdoc opt">=</span><span class="number">48000</span> <span class="gtkdoc opt">!</span> webrtcdsp <span class="gtkdoc opt">!</span> far<span class="gtkdoc opt">-</span>end<span class="gtkdoc opt">-</span>sink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+
+<p></p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.134.7.6.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-webrtcdsp.html#plugin-webrtcdsp">webrtcdsp</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Nicolas Dufresne <nicolas.dufresne@collabora.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Generic/Audio</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.134.7.6.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 48000, 32000, 16000, 8000 }, channels=(int)[ 1, 2147483647 ]</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 48000, 32000, 16000, 8000 }, channels=(int)[ 1, 2147483647 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-webrtcdsp.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-webrtcdsp.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstWebrtcDsp-struct"></a><h3>GstWebrtcDsp</h3>
+<pre class="programlisting">typedef struct _GstWebrtcDsp GstWebrtcDsp;</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-webrtcdsp.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstWebrtcDsp--echo-cancel"></a><h3>The <code class="literal">“echo-cancel”</code> property</h3>
+<pre class="programlisting"> “echo-cancel” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Enable or disable echo canceller, note that it will be disabled if no webrtcechoprobe has been found.</p>
+<p>Flags: Read / Write / Construct</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstWebrtcDsp--experimental-agc"></a><h3>The <code class="literal">“experimental-agc”</code> property</h3>
+<pre class="programlisting"> “experimental-agc” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Enable or disable experimental automatic gain control.</p>
+<p>Flags: Read / Write / Construct</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstWebrtcDsp--extended-filter"></a><h3>The <code class="literal">“extended-filter”</code> property</h3>
+<pre class="programlisting"> “extended-filter” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Enable or disable the extended filter.</p>
+<p>Flags: Read / Write / Construct</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstWebrtcDsp--gain-control"></a><h3>The <code class="literal">“gain-control”</code> property</h3>
+<pre class="programlisting"> “gain-control” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Enable or disable automatic digital gain control.</p>
+<p>Flags: Read / Write / Construct</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstWebrtcDsp--high-pass-filter"></a><h3>The <code class="literal">“high-pass-filter”</code> property</h3>
+<pre class="programlisting"> “high-pass-filter” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Enable or disable high pass filtering.</p>
+<p>Flags: Read / Write / Construct</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstWebrtcDsp--noise-suppression"></a><h3>The <code class="literal">“noise-suppression”</code> property</h3>
+<pre class="programlisting"> “noise-suppression” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Enable or disable noise suppression.</p>
+<p>Flags: Read / Write / Construct</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstWebrtcDsp--probe"></a><h3>The <code class="literal">“probe”</code> property</h3>
+<pre class="programlisting"> “probe” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
+<p>The name of the webrtcechoprobe element that record the audio being played through loud speakers. Must be set before PAUSED state.</p>
+<p>Flags: Read / Write / Construct</p>
+<p>Default value: "webrtcechoprobe0"</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstWebrtcDsp--echo-suppression-level"></a><h3>The <code class="literal">“echo-suppression-level”</code> property</h3>
+<pre class="programlisting"> “echo-suppression-level” <span class="type">GstWebrtcEchoSuppressionLevel</span></pre>
+<p>Controls the aggressiveness of the suppressor. A higher level trades off double-talk performance for increased echo suppression.</p>
+<p>Flags: Read / Write / Construct</p>
+<p>Default value: Moderate Suppression</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstWebrtcDsp--noise-suppression-level"></a><h3>The <code class="literal">“noise-suppression-level”</code> property</h3>
+<pre class="programlisting"> “noise-suppression-level” <span class="type">GstWebrtcNoiseSuppressionLevel</span></pre>
+<p>Controls the aggressiveness of the suppression. Increasing the level will reduce the noise level at the expense of a higher speech distortion.</p>
+<p>Flags: Read / Write / Construct</p>
+<p>Default value: Moderate Suppression</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstWebrtcDsp--delay-agnostic"></a><h3>The <code class="literal">“delay-agnostic”</code> property</h3>
+<pre class="programlisting"> “delay-agnostic” <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Enable or disable the delay agnostic mode.</p>
+<p>Flags: Read / Write / Construct</p>
+<p>Default value: FALSE</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-webrtcechoprobe.html b/docs/plugins/html/gst-plugins-bad-plugins-webrtcechoprobe.html
new file mode 100644
index 0000000..e1041d5
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-bad-plugins-webrtcechoprobe.html
@@ -0,0 +1,160 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>webrtcechoprobe: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-bad Elements">
+<link rel="prev" href="gst-plugins-bad-plugins-webrtcdsp.html" title="webrtcdsp">
+<link rel="next" href="ch02.html" title="gst-plugins-bad Plugins">
+<meta name="generator" content="GTK-Doc V1.25 (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-plugins-webrtcechoprobe.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
+ <a href="#gst-plugins-bad-plugins-webrtcechoprobe.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="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-webrtcdsp.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="ch02.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-webrtcechoprobe"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-plugins-webrtcechoprobe.top_of_page"></a>webrtcechoprobe</span></h2>
+<p>webrtcechoprobe</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<a name="GstWebrtcEchoProbe"></a><div class="refsect1">
+<a name="gst-plugins-bad-plugins-webrtcechoprobe.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" 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-webrtcechoprobe.html#GstWebrtcEchoProbe-struct" title="struct GstWebrtcEchoProbe">GstWebrtcEchoProbe</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-webrtcechoprobe.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseTransform.html#GstBaseTransform-struct">GstBaseTransform</a>
+ <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilter-struct">GstAudioFilter</a>
+ <span class="lineart">╰──</span> GstWebrtcEchoProbe
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-webrtcechoprobe.description"></a><h2>Description</h2>
+<p>This echo probe is to be used with the webrtcdsp element. See <a class="link" href="gst-plugins-bad-plugins-webrtcdsp.html" title="webrtcdsp"><span class="type">gst-plugins-bad-plugins-webrtcdsp</span></a>
+documentation for more details.</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id-1.2.135.6.3.1"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-bad-plugins-plugin-webrtcdsp.html#plugin-webrtcdsp">webrtcdsp</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Nicolas Dufresne <nicolas.dufrsesne@collabora.com></td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Generic/Audio</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id-1.2.135.6.3.2"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 48000, 32000, 16000, 8000 }, channels=(int)[ 1, 2147483647 ]</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 48000, 32000, 16000, 8000 }, channels=(int)[ 1, 2147483647 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-webrtcechoprobe.functions_details"></a><h2>Functions</h2>
+<p></p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-webrtcechoprobe.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstWebrtcEchoProbe-struct"></a><h3>struct GstWebrtcEchoProbe</h3>
+<pre class="programlisting">struct GstWebrtcEchoProbe;</pre>
+<p>The adder object structure.</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.25</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-zbar.html b/docs/plugins/html/gst-plugins-bad-plugins-zbar.html
index 1a7b0a1..134c3a1 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-zbar.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-zbar.html
@@ -86,10 +86,71 @@
</div>
<div class="refsect1">
<a name="gst-plugins-bad-plugins-zbar.description"></a><h2>Description</h2>
+<p>Detect bar codes in the video streams and send them as element messages to
+the <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstBus.html#GstBus-struct"><span class="type">GstBus</span></a> if .<a class="link" href="gst-plugins-bad-plugins-zbar.html#GstZBar--message" title="The “message” property"><span class="type">“message”</span></a> property is <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>.
+If the .<a class="link" href="gst-plugins-bad-plugins-zbar.html#GstZBar--attach-frame" title="The “attach-frame” property"><span class="type">“attach-frame”</span></a> property is <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, the posted barcode message
+includes a sample of the frame where the barcode was detected (Since 1.6).</p>
+<p>The element generate messages named</p>
+<code class="classname">"barcode"</code>. The structure containes these
+<p>fields:</p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem"><p>
+ <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a>
+ <code class="classname">"timestamp"</code>:
+ the timestamp of the buffer that triggered the message.
+ </p></li>
+<li class="listitem"><p>
+ gchar*
+ <code class="classname">"type"</code>:
+ the symbol type.
+ </p></li>
+<li class="listitem"><p>
+ gchar*
+ <code class="classname">"symbol"</code>:
+ the deteted bar code data.
+ </p></li>
+<li class="listitem"><p>
+ gint
+ <code class="classname">"quality"</code>:
+ an unscaled, relative quantity: larger values are better than smaller
+ values.
+ </p></li>
+<li class="listitem"><p>
+ GstSample
+ <code class="classname">"frame"</code>:
+ the frame in which the barcode message was detected, if
+ the .<a class="link" href="gst-plugins-bad-plugins-zbar.html#GstZBar--attach-frame" title="The “attach-frame” property"><span class="type">“attach-frame”</span></a> property was set to <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> (Since 1.6)
+ </p></li>
+</ul></div>
+<div class="refsect2">
+<a name="id-1.2.130.7.7"></a><h3>Example launch lines</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>m v4l2src <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> zbar <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> xvimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ This pipeline will detect barcodes and send them as messages.
+<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>m v4l2src <span class="gtkdoc opt">!</span> tee name<span class="gtkdoc opt">=</span>t <span class="gtkdoc opt">!</span> queue <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> zbar <span class="gtkdoc opt">!</span> fakesink t<span class="gtkdoc opt">. !</span> queue <span class="gtkdoc opt">!</span> xvimagesink</pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+ Same as above, but running the filter on a branch to keep the display in color
+</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.80.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.130.7.8.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -115,7 +176,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.80.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.130.7.8.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -176,6 +237,7 @@
<div class="refsect2">
<a name="GstZBar-struct"></a><h3>struct GstZBar</h3>
<pre class="programlisting">struct GstZBar;</pre>
+<p>Opaque data structure.</p>
</div>
</div>
<div class="refsect1">
diff --git a/docs/plugins/html/index.html b/docs/plugins/html/index.html
index a6fe5e0..377c722 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.8.3)
+ for GStreamer Bad Plugins 1.0 (1.9.90)
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>
@@ -44,6 +44,9 @@
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-audiomixer.html">audiomixer</a></span><span class="refpurpose"></span>
</dt>
<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-audioparse.html">audioparse</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-autoconvert.html">autoconvert</a></span><span class="refpurpose"></span>
</dt>
<dt>
@@ -101,7 +104,7 @@
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-dodge.html">dodge</a></span><span class="refpurpose"></span>
</dt>
<dt>
-<span class="refentrytitle"><a href="gst-plugins-bad-plugins-dtmfdetect.html">dtmfdetect</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-dtmfdetect.html">dtmfdetect</a></span><span class="refpurpose"> — Detects DTMF tones</span>
</dt>
<dt>
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-dtsdec.html">dtsdec</a></span><span class="refpurpose"></span>
@@ -143,6 +146,144 @@
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gaussianblur.html">gaussianblur</a></span><span class="refpurpose"></span>
</dt>
<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glcolorbalance.html">glcolorbalance</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glcolorconvert.html">glcolorconvert</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glcolorscale.html">glcolorscale</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gldeinterlace.html">gldeinterlace</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gldifferencematte.html">gldifferencematte</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gldownload.html">gldownload</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-blur.html">gleffects_blur</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-bulge.html">gleffects_bulge</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-fisheye.html">gleffects_fisheye</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-glow.html">gleffects_glow</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-heat.html">gleffects_heat</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-identity.html">gleffects_identity</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-laplacian.html">gleffects_laplacian</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-lumaxpro.html">gleffects_lumaxpro</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-mirror.html">gleffects_mirror</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-sepia.html">gleffects_sepia</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-sin.html">gleffects_sin</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-sobel.html">gleffects_sobel</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-square.html">gleffects_square</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-squeeze.html">gleffects_squeeze</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-stretch.html">gleffects_stretch</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-tunnel.html">gleffects_tunnel</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-twirl.html">gleffects_twirl</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects.html">gleffects</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-xpro.html">gleffects_xpro</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gleffects-xray.html">gleffects_xray</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glfilterapp.html">glfilterapp</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glfilterbin.html">glfilterbin</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glfiltercube.html">glfiltercube</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glfilterglass.html">glfilterglass</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glimagesinkelement.html">glimagesinkelement</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glimagesink.html">glimagesink</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glmixerbin.html">glmixerbin</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glmosaic.html">glmosaic</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gloverlay.html">gloverlay</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glshader.html">glshader</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glsinkbin.html">glsinkbin</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glsrcbin.html">glsrcbin</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glstereomix.html">glstereomix</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glstereosplit.html">glstereosplit</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gltestsrc.html">gltestsrc</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-gltransformation.html">gltransformation</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glupload.html">glupload</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glvideomixerelement.html">glvideomixerelement</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glvideomixer.html">glvideomixer</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-glviewconvert.html">glviewconvert</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-jpegparse.html">jpegparse</a></span><span class="refpurpose"> — JPEG parser</span>
</dt>
<dt>
@@ -185,10 +326,10 @@
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-ofa.html">ofa</a></span><span class="refpurpose"></span>
</dt>
<dt>
-<span class="refentrytitle"><a href="gst-plugins-bad-plugins-openalsrc.html">openalsrc</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-openalsrc.html">openalsrc</a></span><span class="refpurpose"> — capture raw audio samples through OpenAL</span>
</dt>
<dt>
-<span class="refentrytitle"><a href="gst-plugins-bad-plugins-openalsink.html">openalsink</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-openalsink.html">openalsink</a></span><span class="refpurpose"> — capture raw audio samples through OpenAL</span>
</dt>
<dt>
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-pcapparse.html">pcapparse</a></span><span class="refpurpose"></span>
@@ -197,7 +338,10 @@
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-pinch.html">pinch</a></span><span class="refpurpose"></span>
</dt>
<dt>
-<span class="refentrytitle"><a href="gst-plugins-bad-plugins-pyramidsegment.html">pyramidsegment</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-rawaudioparse.html">rawaudioparse</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-rawvideoparse.html">rawvideoparse</a></span><span class="refpurpose"></span>
</dt>
<dt>
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-rfbsrc.html">rfbsrc</a></span><span class="refpurpose"></span>
@@ -254,6 +398,12 @@
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-twirl.html">twirl</a></span><span class="refpurpose"></span>
</dt>
<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-unalignedaudioparse.html">unalignedaudioparse</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-unalignedvideoparse.html">unalignedvideoparse</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-videoparse.html">videoparse</a></span><span class="refpurpose"></span>
</dt>
<dt>
@@ -271,6 +421,12 @@
<dt>
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-wavescope.html">wavescope</a></span><span class="refpurpose"></span>
</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-webrtcdsp.html">webrtcdsp</a></span><span class="refpurpose"> — Audio Filter using WebRTC Audio Processing library</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-webrtcechoprobe.html">webrtcechoprobe</a></span><span class="refpurpose"></span>
+</dt>
</dl></dd>
<dt><span class="chapter"><a href="ch02.html">gst-plugins-bad Plugins</a></span></dt>
<dd><dl>
@@ -374,6 +530,9 @@
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-plugin-openal.html">openal</a></span><span class="refpurpose"> — OpenAL plugin library</span>
</dt>
<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-plugin-opengl.html">opengl</a></span><span class="refpurpose"> — OpenGL plugin</span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-plugin-opencv.html">opencv</a></span><span class="refpurpose"> — GStreamer OpenCV Plugins</span>
</dt>
<dt>
@@ -407,6 +566,9 @@
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-plugin-voamrwbenc.html">voamrwbenc</a></span><span class="refpurpose"> — Adaptive Multi-Rate Wide-Band Encoder</span>
</dt>
<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-plugins-plugin-webrtcdsp.html">webrtcdsp</a></span><span class="refpurpose"> — Voice pre-processing using WebRTC Audio Processing Library</span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="gst-plugins-bad-plugins-plugin-zbar.html">zbar</a></span><span class="refpurpose"> — zbar barcode scanner</span>
</dt>
</dl></dd>
diff --git a/docs/plugins/inspect/plugin-accurip.xml b/docs/plugins/inspect/plugin-accurip.xml
index 8bb176d..9729820 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.8.3</version>
+ <version>1.9.90</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 448f009..8181e9d 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.8.3</version>
+ <version>1.9.90</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 e46af5b..c72a003 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.8.3</version>
+ <version>1.9.90</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 50ceef9..7690007 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-androidcamera.xml b/docs/plugins/inspect/plugin-androidcamera.xml
deleted file mode 100644
index c9417ca..0000000
--- a/docs/plugins/inspect/plugin-androidcamera.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<plugin>
- <name>androidcamera</name>
- <description>Capture from Android cameras</description>
- <filename>../../sys/androidcamera/.libs/libgstandroidcamera.so</filename>
- <basename>libgstandroidcamera.so</basename>
- <version>0.10.22.1</version>
- <license>LGPL</license>
- <source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins git</package>
- <origin>Unknown package origin</origin>
- <elements>
- <element>
- <name>ahcsrc</name>
- <longname>Android Camera Source</longname>
- <class>Source/Video</class>
- <description>Reads frames from android.hardware.Camera class into buffers</description>
- <author>Youness Alaoui <youness.alaoui@collabora.co.uk></author>
- <pads>
- <caps>
- <name>src</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>video/x-raw-yuv, format=(fourcc) { YV12 , YUY2 , NV21 , NV16 }, width=(int) [ 1, 2147483647 ], height=(int) [ 1, 2147483647 ], framerate=(fraction) [ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)16, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int) [ 1, 2147483647 ], height=(int) [ 1, 2147483647 ], framerate=(fraction) [ 0/1, 2147483647/1 ] </details>
- </caps>
- </pads>
- </element>
- </elements>
-</plugin>
diff --git a/docs/plugins/inspect/plugin-asfmux.xml b/docs/plugins/inspect/plugin-asfmux.xml
index 32c1b8e..962c5c2 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.8.3</version>
+ <version>1.9.90</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 dc6152c..7197bc2 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
@@ -26,13 +26,13 @@
<name>video_sink</name>
<direction>sink</direction>
<presence>always</presence>
- <details>video/x-raw, format=(string){ BGRx, RGBx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, I420, YV12, AYUV, YUY2, UYVY, v308, Y41B, Y42B, Y444, NV12, NV21, A420, YUV9, YVU9, IYU1, GRAY8 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(ANY), format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ <details>video/x-raw, format=(string){ BGRx, RGBx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, I420, YV12, AYUV, YUY2, UYVY, v308, Y41B, Y42B, Y444, NV12, NV21, A420, YUV9, YVU9, IYU1, GRAY8 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(ANY), format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, 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, format=(string){ BGRx, RGBx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, I420, YV12, AYUV, YUY2, UYVY, v308, Y41B, Y42B, Y444, NV12, NV21, A420, YUV9, YVU9, IYU1, GRAY8 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(ANY), format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ <details>video/x-raw, format=(string){ BGRx, RGBx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, I420, YV12, AYUV, YUY2, UYVY, v308, Y41B, Y42B, Y444, NV12, NV21, A420, YUV9, YVU9, IYU1, GRAY8 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(ANY), format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
</caps>
</pads>
</element>
diff --git a/docs/plugins/inspect/plugin-audiofxbad.xml b/docs/plugins/inspect/plugin-audiofxbad.xml
index 4c8d895..24420b7 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.8.3</version>
+ <version>1.9.90</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 91aa6b5..c4389ac 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-audiovisualizers.xml b/docs/plugins/inspect/plugin-audiovisualizers.xml
index dbbff16..5eb954a 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.8.3</version>
+ <version>1.9.90</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 7c020d6..3dd5e3c 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.8.3</version>
+ <version>1.9.90</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 df17423..be37ae7 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-bluez.xml b/docs/plugins/inspect/plugin-bluez.xml
index 3b970ef..2d82903 100644
--- a/docs/plugins/inspect/plugin-bluez.xml
+++ b/docs/plugins/inspect/plugin-bluez.xml
@@ -3,7 +3,7 @@
<description>Bluez-based bluetooth support</description>
<filename>../../sys/bluez/.libs/libgstbluez.so</filename>
<basename>libgstbluez.so</basename>
- <version>1.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-bs2b.xml b/docs/plugins/inspect/plugin-bs2b.xml
index 62ad93a..7730094 100644
--- a/docs/plugins/inspect/plugin-bs2b.xml
+++ b/docs/plugins/inspect/plugin-bs2b.xml
@@ -3,7 +3,7 @@
<description>Improve headphone listening of stereo audio recordsusing the bs2b library.</description>
<filename>../../ext/bs2b/.libs/libgstbs2b.so</filename>
<basename>libgstbs2b.so</basename>
- <version>1.8.3</version>
+ <version>1.9.90</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 3352abc..2222b52 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.8.3</version>
+ <version>1.9.90</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 2025f68..44328b6 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.8.3</version>
+ <version>1.9.90</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 8d0709e..c1c6339 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.8.3</version>
+ <version>1.9.90</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 6fdd87e..88f560b 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.8.3</version>
+ <version>1.9.90</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 d03a8a5..e062cae 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.8.3</version>
+ <version>1.9.90</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 3f086a9..3c4d289 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.8.3</version>
+ <version>1.9.90</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 160f865..2600781 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-dataurisrc.xml b/docs/plugins/inspect/plugin-dataurisrc.xml
index f003df6..5b2b024 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-dc1394.xml b/docs/plugins/inspect/plugin-dc1394.xml
new file mode 100644
index 0000000..ce07d4c
--- /dev/null
+++ b/docs/plugins/inspect/plugin-dc1394.xml
@@ -0,0 +1,28 @@
+<plugin>
+ <name>dc1394</name>
+ <description>1394 IIDC video source</description>
+ <filename>../../ext/dc1394/.libs/libgstdc1394.so</filename>
+ <basename>libgstdc1394.so</basename>
+ <version>1.9.90</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>dc1394src</name>
+ <longname>1394 IIDC Video Source</longname>
+ <class>Source/Video</class>
+ <description>libdc1394 based source for IIDC cameras</description>
+ <author>Antoine Tremblay <hexa00@gmail.com></author>
+ <pads>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw, format=(string)IYU2, width=(int)160, height=(int)120, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)UYVY, width=(int)320, height=(int)240, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)IYU1, width=(int)640, height=(int)480, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)UYVY, width=(int)640, height=(int)480, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)RGB, width=(int)640, height=(int)480, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)GRAY8, width=(int)640, height=(int)480, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-bayer, format=(string){ bggr, rggb, grbg, gbrg }, width=(int)640, height=(int)480, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)GRAY16_BE, width=(int)640, height=(int)480, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)UYVY, width=(int)800, height=(int)600, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)RGB, width=(int)800, height=(int)600, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)GRAY8, width=(int)800, height=(int)600, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-bayer, format=(string){ bggr, rggb, grbg, gbrg }, width=(int)800, height=(int)600, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)UYVY, width=(int)1024, height=(int)768, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)RGB, width=(int)1024, height=(int)768, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)GRAY8, width=(int)1024, height=(int)768, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-bayer, format=(string){ bggr, rggb, grbg, gbrg }, width=(int)1024, height=(int)768, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)GRAY16_BE, width=(int)800, height=(int)600, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)GRAY16_BE, width=(int)1024, height=(int)768, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)UYVY, width=(int)1280, height=(int)960, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)RGB, width=(int)1280, height=(int)960, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)GRAY8, width=(int)1280, height=(int)960, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-bayer, format=(string){ bggr, rggb, grbg, gbrg }, width=(int)1280, height=(int)960, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)UYVY, width=(int)1600, height=(int)1200, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)RGB, width=(int)1600, height=(int)1200, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)GRAY8, width=(int)1600, height=(int)1200, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-bayer, format=(string){ bggr, rggb, grbg, gbrg }, width=(int)1600, height=(int)1200, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)GRAY16_BE, width=(int)1280, height=(int)960, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)GRAY16_BE, width=(int)1600, height=(int)1200, framerate=(fraction){ 15/8, 15/4, 15/2, 15/1, 30/1, 60/1, 120/1, 240/1 }; video/x-raw, format=(string)RGB, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 1/2147483647, 2147483647/1 ]; video/x-raw, format=(string)IYU2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 1/2147483647, 2147483647/1 ]; video/x-raw, format=(string)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 1/2147483647, 2147483647/1 ]; video/x-raw, format=(string)IYU1, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 1/2147483647, 2147483647/1 ]; video/x-raw, format=(string)GRAY16_BE, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 1/2147483647, 2147483647/1 ]; video/x-bayer, format=(string){ bggr, rggb, grbg, gbrg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 1/2147483647, 2147483647/1 ]; video/x-raw, format=(string)GRAY8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 1/2147483647, 2147483647/1 ]; video/x-bayer, format=(string){ bggr, rggb, grbg, gbrg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 1/2147483647, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
\ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-debugutilsbad.xml b/docs/plugins/inspect/plugin-debugutilsbad.xml
index bd92d71..6b1cbbf 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.8.3</version>
+ <version>1.9.90</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 9bffaa4..595f04b 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins</package>
@@ -20,7 +20,7 @@
<name>sink</name>
<direction>sink</direction>
<presence>always</presence>
- <details>audio/x-raw, format=(string){ S16LE, S32LE }, channels=(int)2, rate=(int)48000, layout=(string)interleaved</details>
+ <details>audio/x-raw, format=(string){ S16LE, S32LE }, channels=(int){ 2, 8, 16 }, rate=(int)48000, layout=(string)interleaved</details>
</caps>
</pads>
</element>
@@ -50,7 +50,7 @@
<name>sink</name>
<direction>sink</direction>
<presence>always</presence>
- <details>video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt601, chroma-site=(string)mpeg2; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt601, chroma-site=(string)mpeg2; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt601, chroma-site=(string)mpeg2; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt601, chroma-site=(string)mpeg2; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt601, chroma-site=(string)mpeg2; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB</details>
+ <details>video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt601, chroma-site=(string)mpeg2; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt601, chroma-site=(string)mpeg2; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt601, chroma-site=(string)mpeg2; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt601, chroma-site=(string)mpeg2; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt601, chroma-site=(string)mpeg2; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)v210; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)[ 0/1, 2147483647/1 ], format=(string)BGRA</details>
</caps>
</pads>
</element>
@@ -65,7 +65,7 @@
<name>src</name>
<direction>source</direction>
<presence>always</presence>
- <details>video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)30000/1001, format=(string)UYVY, colorimetry=(string)bt601, chroma-site=(string)mpeg2; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)30000/1001, format=(string)ARGB; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)24000/1001, format=(string)UYVY, colorimetry=(string)bt601, chroma-site=(string)mpeg2; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)24000/1001, format=(string)ARGB; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)interleaved, framerate=(fraction)25/1, format=(string)UYVY, colorimetry=(string)bt601, chroma-site=(string)mpeg2; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)interleaved, framerate=(fraction)25/1, format=(string)ARGB; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)progressive, framerate=(fraction)30000/1001, format=(string)UYVY, colorimetry=(string)bt601, chroma-site=(string)mpeg2; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)progressive, framerate=(fraction)30000/1001, format=(string)ARGB; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)UYVY, colorimetry=(string)bt601, chroma-site=(string)mpeg2; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24000/1001, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24000/1001, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24/1, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30000/1001, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30000/1001, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30/1, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)25/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)25/1, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)30000/1001, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)30000/1001, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)30/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)30/1, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)50/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)50/1, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60000/1001, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60000/1001, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60/1, format=(string)ARGB; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)50/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)50/1, format=(string)ARGB; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60000/1001, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60000/1001, format=(string)ARGB; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60/1, format=(string)ARGB; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24000/1001, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24000/1001, format=(string)ARGB; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24/1, format=(string)ARGB; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24000/1001, format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24000/1001, format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24/1, format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24/1, format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30000/1001, format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30000/1001, format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30/1, format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30/1, format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)50/1, format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)50/1, format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60000/1001, format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60000/1001, format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60/1, format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60/1, format=(string)ARGB</details>
+ <details>video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)30000/1001, format=(string)UYVY, colorimetry=(string)bt601, chroma-site=(string)mpeg2; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)30000/1001, format=(string)v210; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)30000/1001, format=(string)ARGB; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)30000/1001, format=(string)BGRA; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)24000/1001, format=(string)UYVY, colorimetry=(string)bt601, chroma-site=(string)mpeg2; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)24000/1001, format=(string)v210; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)24000/1001, format=(string)ARGB; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)interleaved, framerate=(fraction)24000/1001, format=(string)BGRA; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)interleaved, framerate=(fraction)25/1, format=(string)UYVY, colorimetry=(string)bt601, chroma-site=(string)mpeg2; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)interleaved, framerate=(fraction)25/1, format=(string)v210; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)interleaved, framerate=(fraction)25/1, format=(string)ARGB; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)interleaved, framerate=(fraction)25/1, format=(string)BGRA; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)progressive, framerate=(fraction)30000/1001, format=(string)UYVY, colorimetry=(string)bt601, chroma-site=(string)mpeg2; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)progressive, framerate=(fraction)30000/1001, format=(string)v210; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)progressive, framerate=(fraction)30000/1001, format=(string)ARGB; video/x-raw, width=(int)720, height=(int)486, pixel-aspect-ratio=(fraction)10/11, interlace-mode=(string)progressive, framerate=(fraction)30000/1001, format=(string)BGRA; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)UYVY, colorimetry=(string)bt601, chroma-site=(string)mpeg2; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)v210; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)ARGB; video/x-raw, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)12/11, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24000/1001, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24000/1001, format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24000/1001, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24000/1001, format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24/1, format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24/1, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24/1, format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30000/1001, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30000/1001, format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30000/1001, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30000/1001, format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30/1, format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30/1, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30/1, format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)25/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)25/1, format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)25/1, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)25/1, format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)30000/1001, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)30000/1001, format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)30000/1001, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)30000/1001, format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)30/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)30/1, format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)30/1, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)interleaved, framerate=(fraction)30/1, format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)50/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)50/1, format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)50/1, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)50/1, format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60000/1001, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60000/1001, format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60000/1001, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60000/1001, format=(string)BGRA; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60/1, format=(string)v210; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60/1, format=(string)ARGB; video/x-raw, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60/1, format=(string)BGRA; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)50/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)50/1, format=(string)v210; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)50/1, format=(string)ARGB; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)50/1, format=(string)BGRA; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60000/1001, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60000/1001, format=(string)v210; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60000/1001, format=(string)ARGB; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60000/1001, format=(string)BGRA; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60/1, format=(string)v210; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60/1, format=(string)ARGB; video/x-raw, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60/1, format=(string)BGRA; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24000/1001, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24000/1001, format=(string)v210; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24000/1001, format=(string)ARGB; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24000/1001, format=(string)BGRA; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24/1, format=(string)v210; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24/1, format=(string)ARGB; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24/1, format=(string)BGRA; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)UYVY, colorimetry=(string)bt709, chroma-site=(string)mpeg2; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)v210; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)ARGB; video/x-raw, width=(int)2048, height=(int)1556, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)BGRA; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24000/1001, format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24000/1001, format=(string)v210; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24000/1001, format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24000/1001, format=(string)BGRA; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24/1, format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24/1, format=(string)v210; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24/1, format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)24/1, format=(string)BGRA; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)v210; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)25/1, format=(string)BGRA; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30000/1001, format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30000/1001, format=(string)v210; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30000/1001, format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30000/1001, format=(string)BGRA; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30/1, format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30/1, format=(string)v210; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30/1, format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)30/1, format=(string)BGRA; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)50/1, format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)50/1, format=(string)v210; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)50/1, format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)50/1, format=(string)BGRA; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60000/1001, format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60000/1001, format=(string)v210; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60000/1001, format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60000/1001, format=(string)BGRA; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60/1, format=(string)UYVY, colorimetry=(string)bt2020, chroma-site=(string)mpeg2; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60/1, format=(string)v210; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60/1, format=(string)ARGB; video/x-raw, width=(int)3840, height=(int)2160, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)60/1, format=(string)BGRA</details>
</caps>
</pads>
</element>
diff --git a/docs/plugins/inspect/plugin-dfbvideosink.xml b/docs/plugins/inspect/plugin-dfbvideosink.xml
index eab6276..6b8aad1 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.8.3</version>
+ <version>1.9.90</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 4b92e49..11e57eb 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.8.3</version>
+ <version>1.9.90</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 3e027f4..f22f4d4 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.8.3</version>
+ <version>1.9.90</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 0a6273a..496fd3f 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.8.3</version>
+ <version>1.9.90</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 07050f1..67fde65 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
@@ -26,13 +26,13 @@
<name>video_sink</name>
<direction>sink</direction>
<presence>always</presence>
- <details>video/x-raw, format=(string){ BGRx, RGBx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, I420, YV12, AYUV, YUY2, UYVY, v308, Y41B, Y42B, Y444, NV12, NV21, A420, YUV9, YVU9, IYU1, GRAY8 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(ANY), format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ <details>video/x-raw, format=(string){ BGRx, RGBx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, I420, YV12, AYUV, YUY2, UYVY, v308, Y41B, Y42B, Y444, NV12, NV21, A420, YUV9, YVU9, IYU1, GRAY8 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(ANY), format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, 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, format=(string){ BGRx, RGBx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, I420, YV12, AYUV, YUY2, UYVY, v308, Y41B, Y42B, Y444, NV12, NV21, A420, YUV9, YVU9, IYU1, GRAY8 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(ANY), format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ <details>video/x-raw, format=(string){ BGRx, RGBx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, I420, YV12, AYUV, YUY2, UYVY, v308, Y41B, Y42B, Y444, NV12, NV21, A420, YUV9, YVU9, IYU1, GRAY8 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(ANY), format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
</caps>
</pads>
</element>
diff --git a/docs/plugins/inspect/plugin-dvdspu.xml b/docs/plugins/inspect/plugin-dvdspu.xml
index 9ce622c..6a348d3 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.8.3</version>
+ <version>1.9.90</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 9f11d23..dc3829d 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-faad.xml b/docs/plugins/inspect/plugin-faad.xml
index a510ccb..e0ee1e2 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.8.3</version>
+ <version>1.9.90</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 b313358..da67c24 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-fdkaac.xml b/docs/plugins/inspect/plugin-fdkaac.xml
new file mode 100644
index 0000000..4365715
--- /dev/null
+++ b/docs/plugins/inspect/plugin-fdkaac.xml
@@ -0,0 +1,55 @@
+<plugin>
+ <name>fdkaac</name>
+ <description>Fraunhofer FDK AAC Codec plugin</description>
+ <filename>../../ext/fdkaac/.libs/libgstfdkaac.so</filename>
+ <basename>libgstfdkaac.so</basename>
+ <version>1.9.90</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>fdkaacdec</name>
+ <longname>FDK AAC audio decoder</longname>
+ <class>Codec/Decoder/Audio</class>
+ <description>FDK AAC audio decoder</description>
+ <author>Sebastian Dröge <sebastian@centricular.com></author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/mpeg, mpegversion=(int)4, stream-format=(string){ adts, adif, raw }</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 8 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>fdkaacenc</name>
+ <longname>FDK AAC audio encoder</longname>
+ <class>Codec/Encoder/Audio</class>
+ <description>FDK AAC audio encoder</description>
+ <author>Sebastian Dröge <sebastian@centricular.com></author>
+ <pads>
+ <caps>
+ <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, 2, 3, 4, 5, 6, 8 }</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/mpeg, mpegversion=(int)4, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 }, channels=(int){ 1, 2, 3, 4, 5, 6, 8 }, stream-format=(string){ adts, adif, raw }, base-profile=(string)lc, framed=(boolean)true</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
\ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-festival.xml b/docs/plugins/inspect/plugin-festival.xml
index 51094f6..6b0151d 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.8.3</version>
+ <version>1.9.90</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 8b812bd..e7f5c68 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.8.3</version>
+ <version>1.9.90</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 d694dbf..92ea44b 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.8.3</version>
+ <version>1.9.90</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 8db334c..30d5654 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.8.3</version>
+ <version>1.9.90</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 7369e70..7acd8b2 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.8.3</version>
+ <version>1.9.90</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 c9cc134..622fe38 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.8.3</version>
+ <version>1.9.90</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 a4cb374..6156ff5 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.8.3</version>
+ <version>1.9.90</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 e6d76e8..041ef87 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.8.3</version>
+ <version>1.9.90</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 acc9580..2ab3a93 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.8.3</version>
+ <version>1.9.90</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 914fc1f..1f7b6bd 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.8.3</version>
+ <version>1.9.90</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 7e1aa88..11d0a92 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.8.3</version>
+ <version>1.9.90</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 db5814e..90999f5 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.8.3</version>
+ <version>1.9.90</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 25568bc..d18d8e5 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-hls.xml b/docs/plugins/inspect/plugin-hls.xml
index 4e92050..ffdfbaa 100644
--- a/docs/plugins/inspect/plugin-hls.xml
+++ b/docs/plugins/inspect/plugin-hls.xml
@@ -3,7 +3,7 @@
<description>HTTP Live Streaming (HLS)</description>
<filename>../../ext/hls/.libs/libgsthls.so</filename>
<basename>libgsthls.so</basename>
- <version>1.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-id3tag.xml b/docs/plugins/inspect/plugin-id3tag.xml
index 6f8770c..5b28a22 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.8.3</version>
+ <version>1.9.90</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 1b56b50..c672970 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins</package>
@@ -80,7 +80,7 @@
<name>sink</name>
<direction>sink</direction>
<presence>always</presence>
- <details>video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ <details>video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
</caps>
</pads>
</element>
@@ -95,7 +95,7 @@
<name>src</name>
<direction>source</direction>
<presence>always</presence>
- <details>video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ <details>video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
</caps>
</pads>
</element>
diff --git a/docs/plugins/inspect/plugin-interlace.xml b/docs/plugins/inspect/plugin-interlace.xml
index 791fcd8..cfb1597 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.8.3</version>
+ <version>1.9.90</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>video/x-raw, format=(string){ AYUV, YUY2, UYVY, I420, YV12, Y42B, Y444, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], interlace-mode=(string)progressive</details>
+ <details>video/x-raw, format=(string){ AYUV, YUY2, UYVY, I420, YV12, Y42B, Y444, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
</caps>
<caps>
<name>src</name>
diff --git a/docs/plugins/inspect/plugin-ivfparse.xml b/docs/plugins/inspect/plugin-ivfparse.xml
index 193d251..283c6d5 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.8.3</version>
+ <version>1.9.90</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 842b73c..d5f5ee3 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.8.3</version>
+ <version>1.9.90</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 9710128..14d2946 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.8.3</version>
+ <version>1.9.90</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 69a88c8..3ee62d4 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.8.3</version>
+ <version>1.9.90</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 dd12efa..0d2f12f 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-kms.xml b/docs/plugins/inspect/plugin-kms.xml
new file mode 100644
index 0000000..dd8cac0
--- /dev/null
+++ b/docs/plugins/inspect/plugin-kms.xml
@@ -0,0 +1,28 @@
+<plugin>
+ <name>kms</name>
+ <description>Video sink using the Linux kernel mode setting API</description>
+ <filename>../../sys/kms/.libs/libgstkmssink.so</filename>
+ <basename>libgstkmssink.so</basename>
+ <version>1.9.0.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-bad</source>
+ <package>GStreamer Bad Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>kmssink</name>
+ <longname>KMS video sink</longname>
+ <class>Sink/Video</class>
+ <description>Video sink using the Linux kernel mode setting API</description>
+ <author>Víctor Jáquez <vjaquez@igalia.com></author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw, format=(string){ BGRA, BGRx, RGBA, RGBx, UYVY, YUY2, YVYU, I420, YV12, Y42B, NV12, NV21, NV16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
\ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-ladspa.xml b/docs/plugins/inspect/plugin-ladspa.xml
index 5639475..44f1cb5 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.8.3</version>
+ <version>1.9.90</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 350ffa0..d0ebbd7 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-midi.xml b/docs/plugins/inspect/plugin-midi.xml
index eb592fa..eb3c2fb 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.8.3</version>
+ <version>1.9.90</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 f0d1c80..3f92873 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.8.3</version>
+ <version>1.9.90</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 e0b5e2d..82e5caf 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.8.3</version>
+ <version>1.9.90</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 1dffedb..2807757 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.8.3</version>
+ <version>1.9.90</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 c8fe1f9..ba3edcc 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.8.3</version>
+ <version>1.9.90</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 7863583..9aaefd1 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.8.3</version>
+ <version>1.9.90</version>
<license>unknown</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
@@ -11,7 +11,7 @@
<elements>
<element>
<name>mpegpsdemux</name>
- <longname>The Fluendo MPEG Program Stream Demuxer</longname>
+ <longname>MPEG Program Stream Demuxer</longname>
<class>Codec/Demuxer</class>
<description>Demultiplexes MPEG Program Streams</description>
<author>Wim Taymans <wim@fluendo.com></author>
diff --git a/docs/plugins/inspect/plugin-mpegpsmux.xml b/docs/plugins/inspect/plugin-mpegpsmux.xml
index f111b6d..6d2f3b6 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.8.3</version>
+ <version>1.9.90</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 eb3d178..21c3f61 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
@@ -24,25 +24,25 @@
<details>video/mpegts, systemstream=(boolean)true</details>
</caps>
<caps>
- <name>audio_%04x</name>
+ <name>audio_%01x_%05x</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-opus; audio/x-private-ts-lpcm</details>
</caps>
<caps>
- <name>private_%04x</name>
+ <name>private_%01x_%05x</name>
<direction>source</direction>
<presence>sometimes</presence>
<details>ANY</details>
</caps>
<caps>
- <name>subpicture_%04x</name>
+ <name>subpicture_%01x_%05x</name>
<direction>source</direction>
<presence>sometimes</presence>
<details>subpicture/x-pgs; subpicture/x-dvd; subpicture/x-dvb</details>
</caps>
<caps>
- <name>video_%04x</name>
+ <name>video_%01x_%05x</name>
<direction>source</direction>
<presence>sometimes</presence>
<details>video/mpeg, mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false; video/x-h264, stream-format=(string)byte-stream, alignment=(string)nal; video/x-h265, stream-format=(string)byte-stream, alignment=(string)nal; video/x-dirac; video/x-cavs; video/x-wmv, wmvversion=(int)3, format=(string)WVC1</details>
diff --git a/docs/plugins/inspect/plugin-mpegtsmux.xml b/docs/plugins/inspect/plugin-mpegtsmux.xml
index a45a9ae..282221d 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.8.3</version>
+ <version>1.9.90</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 c630c3a..80e5f10 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.8.3</version>
+ <version>1.9.90</version>
<license>GPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-musepack.xml b/docs/plugins/inspect/plugin-musepack.xml
new file mode 100644
index 0000000..a72faed
--- /dev/null
+++ b/docs/plugins/inspect/plugin-musepack.xml
@@ -0,0 +1,34 @@
+<plugin>
+ <name>musepack</name>
+ <description>Musepack decoder</description>
+ <filename>../../ext/musepack/.libs/libgstmusepack.so</filename>
+ <basename>libgstmusepack.so</basename>
+ <version>1.9.90</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>musepackdec</name>
+ <longname>Musepack decoder</longname>
+ <class>Codec/Decoder/Audio</class>
+ <description>Musepack decoder</description>
+ <author>Ronald Bultje <rbultje@ronald.bitfreak.net></author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-musepack, streamversion=(int){ 7, 8 }</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw, format=(string)F32LE, layout=(string)interleaved, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
\ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-mxf.xml b/docs/plugins/inspect/plugin-mxf.xml
index 8e982f8..6ad04ae 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-neon.xml b/docs/plugins/inspect/plugin-neon.xml
index c53fcd4..896d1aa 100644
--- a/docs/plugins/inspect/plugin-neon.xml
+++ b/docs/plugins/inspect/plugin-neon.xml
@@ -3,10 +3,10 @@
<description>lib neon http client src</description>
<filename>../../ext/neon/.libs/libgstneonhttpsrc.so</filename>
<basename>libgstneonhttpsrc.so</basename>
- <version>1.7.1</version>
+ <version>1.9.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/docs/plugins/inspect/plugin-netsim.xml b/docs/plugins/inspect/plugin-netsim.xml
index ec353c2..67f751a 100644
--- a/docs/plugins/inspect/plugin-netsim.xml
+++ b/docs/plugins/inspect/plugin-netsim.xml
@@ -3,7 +3,7 @@
<description>Network Simulator</description>
<filename>../../gst/netsim/.libs/libgstnetsim.so</filename>
<basename>libgstnetsim.so</basename>
- <version>1.8.3</version>
+ <version>1.9.90</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 651ec70..2a02549 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.8.3</version>
+ <version>1.9.90</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 455003b..37dea49 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.8.3</version>
+ <version>1.9.90</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 1fbee75..3d26a3a 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
@@ -306,27 +306,6 @@
</pads>
</element>
<element>
- <name>pyramidsegment</name>
- <longname>pyramidsegment</longname>
- <class>Filter/Effect/Video</class>
- <description>Applies pyramid segmentation to a video or image.</description>
- <author>Michael Sheldon <mike@mikeasoft.com></author>
- <pads>
- <caps>
- <name>sink</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>video/x-raw, format=(string)RGB, 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, format=(string)RGB, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>retinex</name>
<longname>Retinex image colour enhacement</longname>
<class>Filter/Effect/Video</class>
diff --git a/docs/plugins/inspect/plugin-openexr.xml b/docs/plugins/inspect/plugin-openexr.xml
index 7e62ee1..481dbde 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.8.3</version>
+ <version>1.9.90</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 1283532..bb24b3c 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
@@ -588,7 +588,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(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>
+ <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: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, 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>
@@ -651,7 +651,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(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>
+ <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: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, 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>
@@ -681,7 +681,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(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>
+ <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: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, 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>
@@ -765,7 +765,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(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>
+ <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: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, 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>
@@ -817,7 +817,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){ 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>
+ <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
</caps>
<caps>
<name>left</name>
@@ -859,7 +859,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(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>
+ <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: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, 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>
@@ -880,7 +880,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(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>
+ <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: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, 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>
diff --git a/docs/plugins/inspect/plugin-openh264.xml b/docs/plugins/inspect/plugin-openh264.xml
index a515cdd..a6d162f 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.8.3</version>
+ <version>1.9.90</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 15bc47d..55650b7 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.8.3</version>
+ <version>1.9.90</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>image/x-j2c, colorspace=(string){ sRGB, sYUV, GRAY }; image/x-jpc, colorspace=(string){ sRGB, sYUV, GRAY }; image/jp2</details>
+ <details>image/x-j2c, sampling=(string){ RGB, BGR, RGBA, BGRA, YCbCr-4:4:4, YCbCr-4:2:2, YCbCr-4:2:0, YCbCr-4:1:1, GRAYSCALE, YCbCrA-4:4:4:4 }; image/x-jpc, sampling=(string){ RGB, BGR, RGBA, BGRA, YCbCr-4:4:4, YCbCr-4:2:2, YCbCr-4:2:0, YCbCr-4:1:1, GRAYSCALE, YCbCrA-4:4:4:4 }; image/jp2</details>
</caps>
<caps>
<name>src</name>
@@ -47,7 +47,7 @@
<name>src</name>
<direction>source</direction>
<presence>always</presence>
- <details>image/x-j2c, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], num-components=(int)[ 1, 4 ], colorspace=(string){ sRGB, sYUV, GRAY }; image/x-jpc, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], num-components=(int)[ 1, 4 ], colorspace=(string){ sRGB, sYUV, GRAY }; image/jp2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]</details>
+ <details>image/x-j2c, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], num-components=(int)[ 1, 4 ], sampling=(string){ RGB, BGR, RGBA, BGRA, YCbCr-4:4:4, YCbCr-4:2:2, YCbCr-4:2:0, YCbCr-4:1:1, GRAYSCALE, YCbCrA-4:4:4:4 }, colorspace=(string){ sRGB, sYUV, GRAY }; image/x-jpc, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], num-components=(int)[ 1, 4 ], sampling=(string){ RGB, BGR, RGBA, BGRA, YCbCr-4:4:4, YCbCr-4:2:2, YCbCr-4:2:0, YCbCr-4:1:1, GRAYSCALE, YCbCrA-4:4:4:4 }, colorspace=(string){ sRGB, sYUV, GRAY }; image/jp2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]</details>
</caps>
</pads>
</element>
diff --git a/docs/plugins/inspect/plugin-opusparse.xml b/docs/plugins/inspect/plugin-opusparse.xml
index cab358e..7b79224 100644
--- a/docs/plugins/inspect/plugin-opusparse.xml
+++ b/docs/plugins/inspect/plugin-opusparse.xml
@@ -3,7 +3,7 @@
<description>OPUS parse plugin</description>
<filename>../../ext/opus/.libs/libgstopusparse.so</filename>
<basename>libgstopusparse.so</basename>
- <version>1.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-pcapparse.xml b/docs/plugins/inspect/plugin-pcapparse.xml
index 408d638..125a414 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.8.3</version>
+ <version>1.9.90</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 1e76eae..63dd52c 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
@@ -26,7 +26,7 @@
<name>src</name>
<direction>source</direction>
<presence>always</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)GRAY8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ <details>video/x-raw, format=(string){ RGB, GRAY8, GRAY16_BE, GRAY16_LE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
</caps>
</pads>
</element>
@@ -41,7 +41,7 @@
<name>sink</name>
<direction>sink</direction>
<presence>always</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)GRAY8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ <details>video/x-raw, format=(string){ RGB, GRAY8, GRAY16_BE, GRAY16_LE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
</caps>
<caps>
<name>src</name>
diff --git a/docs/plugins/inspect/plugin-qt.xml b/docs/plugins/inspect/plugin-qt.xml
index d3b76d1..4520a55 100644
--- a/docs/plugins/inspect/plugin-qt.xml
+++ b/docs/plugins/inspect/plugin-qt.xml
@@ -3,7 +3,7 @@
<description>Qt gl plugin</description>
<filename>../../ext/qt/.libs/libgstqmlgl.so</filename>
<basename>libgstqmlgl.so</basename>
- <version>1.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
@@ -24,5 +24,20 @@
</caps>
</pads>
</element>
+ <element>
+ <name>qmlglsrc</name>
+ <longname>Qt Video Source</longname>
+ <class>Source/Video</class>
+ <description>A video src the grab window from a qml view</description>
+ <author>Multimedia Team <shmmmw@freescale.com></author>
+ <pads>
+ <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 ], texture-target=(string)2D</details>
+ </caps>
+ </pads>
+ </element>
</elements>
</plugin>
\ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-rawparse.xml b/docs/plugins/inspect/plugin-rawparse.xml
index 52ea997..12561f2 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
@@ -13,7 +13,7 @@
<name>audioparse</name>
<longname>Audio Parse</longname>
<class>Filter/Audio</class>
- <description>Converts stream into audio frames</description>
+ <description>Converts stream into audio frames (deprecated: use rawaudioparse instead)</description>
<author>Sebastian Dröge <sebastian.droege@collabora.co.uk></author>
<pads>
<caps>
@@ -26,15 +26,99 @@
<name>src</name>
<direction>source</direction>
<presence>always</presence>
+ <details>audio/x-raw, format=(string){ S8, U8, S16LE, S16BE, U16LE, U16BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S32LE, S32BE, U32LE, U32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, F32LE, F32BE, F64LE, F64BE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string){ interleaved, non-interleaved }; audio/x-unaligned-raw, format=(string){ S8, U8, S16LE, S16BE, U16LE, U16BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S32LE, S32BE, U32LE, U32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, F32LE, F32BE, F64LE, F64BE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string){ interleaved, non-interleaved }; audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>rawaudioparse</name>
+ <longname>rawaudioparse</longname>
+ <class>Codec/Parser/Audio</class>
+ <description>Converts unformatted data streams into timestamped raw audio frames</description>
+ <author>Carlos Rafael Giani <dv@pseudoterminal.org></author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-unaligned-raw, format=(string){ S8, U8, S16LE, S16BE, U16LE, U16BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S32LE, S32BE, U32LE, U32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, F32LE, F32BE, F64LE, F64BE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string){ interleaved, non-interleaved }; audio/x-raw, format=(string){ S8, U8, S16LE, S16BE, U16LE, U16BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S32LE, S32BE, U32LE, U32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, F32LE, F32BE, F64LE, F64BE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string){ interleaved, non-interleaved }; audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-mulaw, 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, S16BE, U16LE, U16BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S32LE, S32BE, U32LE, U32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, F32LE, F32BE, F64LE, F64BE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string){ interleaved, non-interleaved }; audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</details>
</caps>
</pads>
</element>
<element>
+ <name>rawvideoparse</name>
+ <longname>rawvideoparse</longname>
+ <class>Codec/Parser/Video</class>
+ <description>Converts unformatted data streams into timestamped raw video frames</description>
+ <author>Carlos Rafael Giani <dv@pseudoterminal.org></author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-unaligned-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, 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, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>unalignedaudioparse</name>
+ <longname>unalignedaudioparse</longname>
+ <class>Codec/Parser/Bin/Audio</class>
+ <description>Parse unaligned raw audio data</description>
+ <author>Carlos Rafael Giani <dv@pseudoterminal.org></author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-unaligned-raw, format=(string){ S8, U8, S16LE, S16BE, U16LE, U16BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S32LE, S32BE, U32LE, U32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, F32LE, F32BE, F64LE, F64BE }, 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){ S8, U8, S16LE, S16BE, U16LE, U16BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S32LE, S32BE, U32LE, U32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, F32LE, F32BE, F64LE, F64BE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string){ interleaved, non-interleaved }</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>unalignedvideoparse</name>
+ <longname>unalignedvideoparse</longname>
+ <class>Codec/Parser/Bin/Video</class>
+ <description>Parse unaligned raw video data</description>
+ <author>Carlos Rafael Giani <dv@pseudoterminal.org></author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-unaligned-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, 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, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
<name>videoparse</name>
<longname>Video Parse</longname>
<class>Filter/Video</class>
- <description>Converts stream into video frames</description>
+ <description>Converts stream into video frames (deprecated: use rawvideoparse instead)</description>
<author>David Schleef <ds@schleef.org>, Sebastian Dröge <sebastian.droege@collabora.co.uk></author>
<pads>
<caps>
@@ -47,7 +131,7 @@
<name>src</name>
<direction>source</direction>
<presence>always</presence>
- <details>video/x-raw; video/x-bayer</details>
+ <details>video/x-raw</details>
</caps>
</pads>
</element>
diff --git a/docs/plugins/inspect/plugin-removesilence.xml b/docs/plugins/inspect/plugin-removesilence.xml
index 638ee00..a42f5a1 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.8.3</version>
+ <version>1.9.90</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 043eee6..ea7d78d 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.8.3</version>
+ <version>1.9.90</version>
<license>GPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer</package>
@@ -32,7 +32,7 @@
<name>video</name>
<direction>source</direction>
<presence>sometimes</presence>
- <details>video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ <details>video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
</caps>
</pads>
</element>
diff --git a/docs/plugins/inspect/plugin-rfbsrc.xml b/docs/plugins/inspect/plugin-rfbsrc.xml
index fd86b9f..4eceeb4 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.8.3</version>
+ <version>1.9.90</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 1074e4c..114b381 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.8.3</version>
+ <version>1.9.90</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 0728de3..b00032a 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.8.3</version>
+ <version>1.9.90</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
new file mode 100644
index 0000000..b4a1b7f
--- /dev/null
+++ b/docs/plugins/inspect/plugin-rtpbad.xml
@@ -0,0 +1,55 @@
+<plugin>
+ <name>rtpbad</name>
+ <description>Real-time protocol plugins</description>
+ <filename>../../gst/rtp/.libs/libgstrtpbad.so</filename>
+ <basename>libgstrtpbad.so</basename>
+ <version>1.6.0</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>rtph265depay</name>
+ <longname>RTP H265 depayloader</longname>
+ <class>Codec/Depayloader/Network/RTP</class>
+ <description>Extracts H265 video from RTP packets (draft-ietf-payload-rtp-h265-03.txt)</description>
+ <author>Jurgen Slowack <jurgenslowack@gmail.com></author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H265</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-h265, stream-format=(string)byte-stream, alignment=(string){ nal, au }</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>rtph265pay</name>
+ <longname>RTP H265 payloader</longname>
+ <class>Codec/Payloader/Network/RTP</class>
+ <description>Payload-encode H265 video into RTP packets (based on draft-ietf-payload-rtp-h265-03.txt)</description>
+ <author>Jurgen Slowack <jurgenslowack@gmail.com></author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-h265, stream-format=(string)byte-stream, alignment=(string){ nal, au }</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)H265</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
\ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-rtponvif.xml b/docs/plugins/inspect/plugin-rtponvif.xml
index 23477ea..0be0859 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.8.3</version>
+ <version>1.9.90</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 fd88ead..1fc4802 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.8.3</version>
+ <version>1.9.90</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 ac1e8c9..895408a 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.8.3</version>
+ <version>1.9.90</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 f35296d..9213522 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
@@ -30,5 +30,20 @@
</caps>
</pads>
</element>
+ <element>
+ <name>sdpsrc</name>
+ <longname>SDP Source</longname>
+ <class>Source/Network/RTP</class>
+ <description>Stream RTP based on an SDP</description>
+ <author>Sebastian Dröge <sebastian@centricular.com></author>
+ <pads>
+ <caps>
+ <name>stream_%u</name>
+ <direction>source</direction>
+ <presence>sometimes</presence>
+ <details>application/x-rtp</details>
+ </caps>
+ </pads>
+ </element>
</elements>
</plugin>
\ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-segmentclip.xml b/docs/plugins/inspect/plugin-segmentclip.xml
index 5810811..0ddc74b 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.8.3</version>
+ <version>1.9.90</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 d91c3ae..6eec4e9 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.8.3</version>
+ <version>1.9.90</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 34bd935..b61c704 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.8.3</version>
+ <version>1.9.90</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 c3ce29e..5bdbf5d 100644
--- a/docs/plugins/inspect/plugin-smoothstreaming.xml
+++ b/docs/plugins/inspect/plugin-smoothstreaming.xml
@@ -3,7 +3,7 @@
<description>Microsoft's Smooth Streaming format support </description>
<filename>../../ext/smoothstreaming/.libs/libgstsmoothstreaming.so</filename>
<basename>libgstsmoothstreaming.so</basename>
- <version>1.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-sndfile.xml b/docs/plugins/inspect/plugin-sndfile.xml
index 43821c0..e395b55 100644
--- a/docs/plugins/inspect/plugin-sndfile.xml
+++ b/docs/plugins/inspect/plugin-sndfile.xml
@@ -3,7 +3,7 @@
<description>use libsndfile to read and write various audio formats</description>
<filename>../../ext/sndfile/.libs/libgstsndfile.so</filename>
<basename>libgstsndfile.so</basename>
- <version>1.8.3</version>
+ <version>1.9.90</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 1400c0e..d58527a 100644
--- a/docs/plugins/inspect/plugin-soundtouch.xml
+++ b/docs/plugins/inspect/plugin-soundtouch.xml
@@ -3,7 +3,7 @@
<description>Audio Pitch Controller & BPM Detection</description>
<filename>../../ext/soundtouch/.libs/libgstsoundtouch.so</filename>
<basename>libgstsoundtouch.so</basename>
- <version>1.8.3</version>
+ <version>1.9.90</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 0650f7e..9a28b4d 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.8.3</version>
+ <version>1.9.90</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 cad19cd..23061c9 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.8.3</version>
+ <version>1.9.90</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 906091c..f199aa4 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.8.3</version>
+ <version>1.9.90</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 8f817fb..7d9b11c 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's 'stereo-ness'</description>
<filename>../../gst/stereo/.libs/libgststereo.so</filename>
<basename>libgststereo.so</basename>
- <version>1.8.3</version>
+ <version>1.9.90</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 87a526e..4f9be08 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.8.3</version>
+ <version>1.9.90</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
index 3490f99..efa22a5 100644
--- a/docs/plugins/inspect/plugin-teletext.xml
+++ b/docs/plugins/inspect/plugin-teletext.xml
@@ -3,7 +3,7 @@
<description>Teletext plugin</description>
<filename>../../ext/teletextdec/.libs/libgstteletextdec.so</filename>
<basename>libgstteletextdec.so</basename>
- <version>1.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer</package>
diff --git a/docs/plugins/inspect/plugin-timecode.xml b/docs/plugins/inspect/plugin-timecode.xml
new file mode 100644
index 0000000..3fa3d28
--- /dev/null
+++ b/docs/plugins/inspect/plugin-timecode.xml
@@ -0,0 +1,67 @@
+<plugin>
+ <name>timecode</name>
+ <description>Timecode-related elements</description>
+ <filename>../../gst/timecode/.libs/libgsttimecode.so</filename>
+ <basename>libgsttimecode.so</basename>
+ <version>1.9.90</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>timecodestamper</name>
+ <longname>Timecode stamper</longname>
+ <class>Filter/Video</class>
+ <description>Attaches a timecode meta into each video frame</description>
+ <author>Vivia Nikolaidou <vivia@toolsonair.com</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>timecodewait</name>
+ <longname>Timecode Wait</longname>
+ <class>Filter/Audio/Video</class>
+ <description>Drops all audio/video until a specific timecode has been reached</description>
+ <author>Vivia Nikolaidou <vivia@toolsonair.com></author>
+ <pads>
+ <caps>
+ <name>asink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw</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</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-uvch264.xml b/docs/plugins/inspect/plugin-uvch264.xml
index 8fe8233..ff1f16c 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
@@ -65,13 +65,13 @@
<name>vfsrc</name>
<direction>source</direction>
<presence>always</presence>
- <details>video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; image/jpeg, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ <details>video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; image/jpeg, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
</caps>
<caps>
<name>vidsrc</name>
<direction>source</direction>
<presence>always</presence>
- <details>video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; image/jpeg, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-h264, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], stream-format=(string){ byte-stream, avc }, alignment=(string)au, profile=(string){ high, main, baseline, constrained-baseline }</details>
+ <details>video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, IYU2, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE, P010_10LE, P010_10BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; image/jpeg, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-h264, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], stream-format=(string){ byte-stream, avc }, alignment=(string)au, profile=(string){ high, main, baseline, constrained-baseline }</details>
</caps>
</pads>
</element>
diff --git a/docs/plugins/inspect/plugin-vcdsrc.xml b/docs/plugins/inspect/plugin-vcdsrc.xml
index cc859a3..485eb6e 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-vdpau.xml b/docs/plugins/inspect/plugin-vdpau.xml
new file mode 100644
index 0000000..964c1a9
--- /dev/null
+++ b/docs/plugins/inspect/plugin-vdpau.xml
@@ -0,0 +1,34 @@
+<plugin>
+ <name>vdpau</name>
+ <description>Various elements utilizing VDPAU</description>
+ <filename>../../sys/vdpau/.libs/libgstvdpau.so</filename>
+ <basename>libgstvdpau.so</basename>
+ <version>1.9.0.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-bad</source>
+ <package>GStreamer</package>
+ <origin>http://gstreamer.net/</origin>
+ <elements>
+ <element>
+ <name>vdpaumpegdec</name>
+ <longname>VDPAU Mpeg Decoder</longname>
+ <class>Decoder</class>
+ <description>Decode mpeg stream with vdpau</description>
+ <author>Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com></author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/mpeg, mpegversion=(int)[ 1, 2 ], systemstream=(boolean)false</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw(memory:VdpVideoSurface), format=(string){ YV12 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ YV12 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
\ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-videofiltersbad.xml b/docs/plugins/inspect/plugin-videofiltersbad.xml
index f9fb62c..43ecbc2 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins</package>
@@ -32,22 +32,22 @@
</element>
<element>
<name>videodiff</name>
- <longname>FIXME Long name</longname>
- <class>Generic</class>
- <description>FIXME Description</description>
- <author>FIXME <fixme@example.com></author>
+ <longname>Video Diff</longname>
+ <class>Video/Filter</class>
+ <description>Visualize differences between adjacent video frames</description>
+ <author>David Schleef <ds@schleef.org></author>
<pads>
<caps>
<name>sink</name>
<direction>sink</direction>
<presence>always</presence>
- <details>video/x-raw, format=(string){ I420, Y444, Y42B, UYVY, RGBA }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ <details>video/x-raw, format=(string){ I420, Y444, Y42B, Y41B }, 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, format=(string){ I420, Y444, Y42B, UYVY, RGBA }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ <details>video/x-raw, format=(string){ I420, Y444, Y42B, Y41B }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
</caps>
</pads>
</element>
diff --git a/docs/plugins/inspect/plugin-videoframe_audiolevel.xml b/docs/plugins/inspect/plugin-videoframe_audiolevel.xml
index b2d3643..870e41f 100644
--- a/docs/plugins/inspect/plugin-videoframe_audiolevel.xml
+++ b/docs/plugins/inspect/plugin-videoframe_audiolevel.xml
@@ -3,7 +3,7 @@
<description>Video frame-synchronized audio level</description>
<filename>../../gst/videoframe_audiolevel/.libs/libgstvideoframe_audiolevel.so</filename>
<basename>libgstvideoframe_audiolevel.so</basename>
- <version>1.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-videoparsersbad.xml b/docs/plugins/inspect/plugin-videoparsersbad.xml
index ddd0736..a78dab5 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
@@ -94,6 +94,27 @@
</pads>
</element>
<element>
+ <name>jpeg2000parse</name>
+ <longname>JPEG 2000 parser</longname>
+ <class>Codec/Parser/Video/Image</class>
+ <description>Parses JPEG 2000 files</description>
+ <author>Aaron Boxer <boxerab@gmail.com></author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>image/x-jpc, sampling=(string){ RGB, BGR, RGBA, BGRA, YCbCr-4:4:4, YCbCr-4:2:2, YCbCr-4:2:0, YCbCr-4:1:1, GRAYSCALE, YCbCrA-4:4:4:4 }; image/x-jpc, colorspace=(string){ sRGB, sYUV, GRAY }; image/x-j2c, sampling=(string){ RGB, BGR, RGBA, BGRA, YCbCr-4:4:4, YCbCr-4:2:2, YCbCr-4:2:0, YCbCr-4:1:1, GRAYSCALE, YCbCrA-4:4:4:4 }; image/x-j2c, colorspace=(string){ sRGB, sYUV, GRAY }</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>image/x-jpc, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], sampling=(string){ RGB, BGR, RGBA, BGRA, YCbCr-4:4:4, YCbCr-4:2:2, YCbCr-4:2:0, YCbCr-4:1:1, GRAYSCALE, YCbCrA-4:4:4:4 }, colorspace=(string){ sRGB, sYUV, GRAY }, parsed=(boolean)true; image/x-j2c, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], sampling=(string){ RGB, BGR, RGBA, BGRA, YCbCr-4:4:4, YCbCr-4:2:2, YCbCr-4:2:0, YCbCr-4:1:1, GRAYSCALE, YCbCrA-4:4:4:4 }, colorspace=(string){ sRGB, sYUV, GRAY }, parsed=(boolean)true</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
<name>mpeg4videoparse</name>
<longname>MPEG 4 video elementary stream parser</longname>
<class>Codec/Parser/Video</class>
diff --git a/docs/plugins/inspect/plugin-videosignal.xml b/docs/plugins/inspect/plugin-videosignal.xml
index 22f438d..e4ff947 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.8.3</version>
+ <version>1.9.90</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 d379341..9d8642d 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.8.3</version>
+ <version>1.9.90</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 09f31d9..1ae9bc7 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.8.3</version>
+ <version>1.9.90</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 a838f0c..a7fed37 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.8.3</version>
+ <version>1.9.90</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 5033ee0..cb600c0 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.8.3</version>
+ <version>1.9.90</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 95de8f3..b20639c 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.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-webrtcdsp.xml b/docs/plugins/inspect/plugin-webrtcdsp.xml
new file mode 100644
index 0000000..1c6dab8
--- /dev/null
+++ b/docs/plugins/inspect/plugin-webrtcdsp.xml
@@ -0,0 +1,55 @@
+<plugin>
+ <name>webrtcdsp</name>
+ <description>Voice pre-processing using WebRTC Audio Processing Library</description>
+ <filename>../../ext/webrtcdsp/.libs/libgstwebrtcdsp.so</filename>
+ <basename>libgstwebrtcdsp.so</basename>
+ <version>1.9.90</version>
+ <license>LGPL</license>
+ <source>gst-plugins-bad</source>
+ <package>WebRTCDsp</package>
+ <origin>http://git.collabora.com</origin>
+ <elements>
+ <element>
+ <name>webrtcdsp</name>
+ <longname>Voice Processor (AGC, AEC, filters, etc.)</longname>
+ <class>Generic/Audio</class>
+ <description>Pre-processes voice with WebRTC Audio Processing Library</description>
+ <author>Nicolas Dufresne <nicolas.dufresne@collabora.com></author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 48000, 32000, 16000, 8000 }, channels=(int)[ 1, 2147483647 ]</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 48000, 32000, 16000, 8000 }, channels=(int)[ 1, 2147483647 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>webrtcechoprobe</name>
+ <longname>Accoustic Echo Canceller probe</longname>
+ <class>Generic/Audio</class>
+ <description>Gathers playback buffers for webrtcdsp</description>
+ <author>Nicolas Dufresne <nicolas.dufrsesne@collabora.com></author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 48000, 32000, 16000, 8000 }, channels=(int)[ 1, 2147483647 ]</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 48000, 32000, 16000, 8000 }, channels=(int)[ 1, 2147483647 ]</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
\ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-wildmidi.xml b/docs/plugins/inspect/plugin-wildmidi.xml
index acdf64f..980616d 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.8.3</version>
+ <version>1.9.90</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 2414751..35096e0 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.8.3</version>
+ <version>1.9.90</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 cd28de4..89347c8 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.8.3</version>
+ <version>1.9.90</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 b56fba5..06ee672 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.8.3</version>
+ <version>1.9.90</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 9ef8672..f640b2e 100644
--- a/docs/plugins/inspect/plugin-zbar.xml
+++ b/docs/plugins/inspect/plugin-zbar.xml
@@ -3,7 +3,7 @@
<description>zbar barcode scanner</description>
<filename>../../ext/zbar/.libs/libgstzbar.so</filename>
<basename>libgstzbar.so</basename>
- <version>1.8.3</version>
+ <version>1.9.90</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
diff --git a/ext/Makefile.am b/ext/Makefile.am
index f97ef44..bae25c2 100644
--- a/ext/Makefile.am
+++ b/ext/Makefile.am
@@ -112,6 +112,12 @@
FAAD_DIR=
endif
+if USE_FDK_AAC
+ FDK_AAC_DIR=fdkaac
+else
+ FDK_AAC_DIR=
+endif
+
if USE_VOAACENC
VOAACENC_DIR=voaacenc
else
@@ -412,6 +418,12 @@
VULKAN_DIR=
endif
+if USE_WEBRTCDSP
+WEBRTCDSP_DIR=webrtcdsp
+else
+WEBRTCDSP_DIR=
+endif
+
SUBDIRS=\
$(VOAACENC_DIR) \
$(ASSRENDER_DIR) \
@@ -434,6 +446,7 @@
$(QT_DIR) \
$(FAAC_DIR) \
$(FAAD_DIR) \
+ $(FDK_AAC_DIR) \
$(FLITE_DIR) \
$(FLUIDSYNTH_DIR) \
$(GSM_DIR) \
@@ -481,7 +494,8 @@
$(WEBP_DIR) \
$(X265_DIR) \
$(DTLS_DIR) \
- $(VULKAN_DIR)
+ $(VULKAN_DIR) \
+ $(WEBRTCDSP_DIR)
DIST_SUBDIRS = \
assrender \
@@ -496,6 +510,7 @@
wayland \
faac \
faad \
+ fdkaac \
flite \
fluidsynth \
gsm \
@@ -549,6 +564,7 @@
webp \
x265 \
dtls \
- vulkan
+ vulkan \
+ webrtcdsp
include $(top_srcdir)/common/parallel-subdirs.mak
diff --git a/ext/Makefile.in b/ext/Makefile.in
index 698e244..092571d 100644
--- a/ext/Makefile.in
+++ b/ext/Makefile.in
@@ -281,6 +281,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -302,6 +304,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -351,6 +355,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -496,6 +502,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -622,8 +630,6 @@
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@
@@ -666,8 +672,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -794,6 +805,8 @@
@USE_FAAC_TRUE@FAAC_DIR = faac
@USE_FAAD_FALSE@FAAD_DIR =
@USE_FAAD_TRUE@FAAD_DIR = faad
+@USE_FDK_AAC_FALSE@FDK_AAC_DIR =
+@USE_FDK_AAC_TRUE@FDK_AAC_DIR = fdkaac
@USE_VOAACENC_FALSE@VOAACENC_DIR =
@USE_VOAACENC_TRUE@VOAACENC_DIR = voaacenc
@USE_FLITE_FALSE@FLITE_DIR =
@@ -900,6 +913,8 @@
@USE_DTLS_TRUE@DTLS_DIR = dtls
@USE_VULKAN_FALSE@VULKAN_DIR =
@USE_VULKAN_TRUE@VULKAN_DIR = vulkan
+@USE_WEBRTCDSP_FALSE@WEBRTCDSP_DIR =
+@USE_WEBRTCDSP_TRUE@WEBRTCDSP_DIR = webrtcdsp
SUBDIRS = \
$(VOAACENC_DIR) \
$(ASSRENDER_DIR) \
@@ -922,6 +937,7 @@
$(QT_DIR) \
$(FAAC_DIR) \
$(FAAD_DIR) \
+ $(FDK_AAC_DIR) \
$(FLITE_DIR) \
$(FLUIDSYNTH_DIR) \
$(GSM_DIR) \
@@ -969,7 +985,8 @@
$(WEBP_DIR) \
$(X265_DIR) \
$(DTLS_DIR) \
- $(VULKAN_DIR)
+ $(VULKAN_DIR) \
+ $(WEBRTCDSP_DIR)
DIST_SUBDIRS = \
assrender \
@@ -984,6 +1001,7 @@
wayland \
faac \
faad \
+ fdkaac \
flite \
fluidsynth \
gsm \
@@ -1037,7 +1055,8 @@
webp \
x265 \
dtls \
- vulkan
+ vulkan \
+ webrtcdsp
all: all-recursive
diff --git a/ext/apexsink/Makefile.in b/ext/apexsink/Makefile.in
index ca42489..5c52e2c 100644
--- a/ext/apexsink/Makefile.in
+++ b/ext/apexsink/Makefile.in
@@ -305,6 +305,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -326,6 +328,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -375,6 +379,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -520,6 +526,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -646,8 +654,6 @@
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@
@@ -690,8 +696,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/apexsink/gstapexsink.c b/ext/apexsink/gstapexsink.c
index c008e18..df5c5f2 100644
--- a/ext/apexsink/gstapexsink.c
+++ b/ext/apexsink/gstapexsink.c
@@ -265,8 +265,8 @@
"Apple AirPort Express Audio Sink", "Sink/Audio/Wireless",
"Output stream to an AirPort Express",
"Jérémie Bernard [GRemi] <gremimail@gmail.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_apexsink_sink_factory));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_apexsink_sink_factory);
}
/* sink class init */
diff --git a/ext/assrender/Makefile.in b/ext/assrender/Makefile.in
index 62c6bff..d646cdb 100644
--- a/ext/assrender/Makefile.in
+++ b/ext/assrender/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/assrender/gstassrender.c b/ext/assrender/gstassrender.c
index 913beb5..b4e385b 100644
--- a/ext/assrender/gstassrender.c
+++ b/ext/assrender/gstassrender.c
@@ -170,12 +170,11 @@
gstelement_class->change_state =
GST_DEBUG_FUNCPTR (gst_ass_render_change_state);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&video_sink_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&text_sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &video_sink_factory);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &text_sink_factory);
gst_element_class_set_static_metadata (gstelement_class, "ASS/SSA Render",
"Mixer/Video/Overlay/Subtitle",
diff --git a/ext/bs2b/Makefile.in b/ext/bs2b/Makefile.in
index fbb3abb..1cd6ea0 100644
--- a/ext/bs2b/Makefile.in
+++ b/ext/bs2b/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/bz2/Makefile.in b/ext/bz2/Makefile.in
index d912d8f..dbfc633 100644
--- a/ext/bz2/Makefile.in
+++ b/ext/bz2/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/bz2/gstbz2dec.c b/ext/bz2/gstbz2dec.c
index 5a06b19..ad3eef0 100644
--- a/ext/bz2/gstbz2dec.c
+++ b/ext/bz2/gstbz2dec.c
@@ -296,10 +296,8 @@
1, G_MAXUINT, DEFAULT_BUFFER_SIZE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class, &src_template);
gst_element_class_set_static_metadata (gstelement_class, "BZ2 decoder",
"Codec/Decoder", "Decodes compressed streams",
"Lutz Mueller <lutz@users.sourceforge.net>");
diff --git a/ext/bz2/gstbz2enc.c b/ext/bz2/gstbz2enc.c
index c1c1ee1..05ec767 100644
--- a/ext/bz2/gstbz2enc.c
+++ b/ext/bz2/gstbz2enc.c
@@ -320,10 +320,8 @@
1, G_MAXUINT, DEFAULT_BUFFER_SIZE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class, &src_template);
gst_element_class_set_static_metadata (gstelement_class, "BZ2 encoder",
"Codec/Encoder", "Compresses streams",
"Lutz Mueller <lutz@users.sourceforge.net>");
diff --git a/ext/chromaprint/Makefile.in b/ext/chromaprint/Makefile.in
index e562df9..eed293f 100644
--- a/ext/chromaprint/Makefile.in
+++ b/ext/chromaprint/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/chromaprint/gstchromaprint.c b/ext/chromaprint/gstchromaprint.c
index b7217a6..95600d6 100644
--- a/ext/chromaprint/gstchromaprint.c
+++ b/ext/chromaprint/gstchromaprint.c
@@ -87,7 +87,6 @@
gobject_class->set_property = gst_chromaprint_set_property;
gobject_class->get_property = gst_chromaprint_get_property;
- /* FIXME: do we need this in addition to the tag message ? */
g_object_class_install_property (gobject_class, PROP_FINGERPRINT,
g_param_spec_string ("fingerprint", "Resulting fingerprint",
"Resulting fingerprint", NULL, G_PARAM_READABLE));
@@ -147,6 +146,8 @@
chromaprint_get_fingerprint (chromaprint->context, &chromaprint->fingerprint);
chromaprint->record = FALSE;
+ g_object_notify ((GObject *) chromaprint, "fingerprint");
+
tags = gst_tag_list_new (GST_TAG_CHROMAPRINT_FINGERPRINT,
chromaprint->fingerprint, NULL);
diff --git a/ext/curl/Makefile.in b/ext/curl/Makefile.in
index 31d09a9..0f01b0b 100644
--- a/ext/curl/Makefile.in
+++ b/ext/curl/Makefile.in
@@ -316,6 +316,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -337,6 +339,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -386,6 +390,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -531,6 +537,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -657,8 +665,6 @@
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@
@@ -701,8 +707,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/curl/gstcurlbasesink.c b/ext/curl/gstcurlbasesink.c
index 013839d..5728ab2 100644
--- a/ext/curl/gstcurlbasesink.c
+++ b/ext/curl/gstcurlbasesink.c
@@ -235,8 +235,7 @@
DSCP_MIN, DSCP_MAX, DEFAULT_QOS_DSCP,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sinktemplate));
+ gst_element_class_add_static_pad_template (element_class, &sinktemplate);
}
static void
diff --git a/ext/curl/gstcurlsmtpsink.c b/ext/curl/gstcurlsmtpsink.c
index 40ab016..07a1474 100644
--- a/ext/curl/gstcurlsmtpsink.c
+++ b/ext/curl/gstcurlsmtpsink.c
@@ -202,21 +202,16 @@
GST_OBJECT_LOCK (sink);
sink->eos = TRUE;
- GST_OBJECT_UNLOCK (sink);
-
- if (sink->base64_chunk != NULL && !sink->final_boundary_added) {
+ if (bcsink->flow_ret == GST_FLOW_OK && sink->base64_chunk != NULL
+ && !sink->final_boundary_added) {
add_final_boundary_unlocked (sink);
-
gst_curl_base_sink_transfer_thread_notify_unlocked (bcsink);
-
- GST_OBJECT_LOCK (sink);
- if (sink->base64_chunk != NULL && bcsink->flow_ret == GST_FLOW_OK) {
- gst_curl_smtp_sink_wait_for_transfer_end_unlocked (sink);
- }
- GST_OBJECT_UNLOCK (sink);
+ GST_FIXME_OBJECT (sink, "if gstpoll errors in transfer thread, then "
+ "this wait will never timeout because the transfer thread does "
+ "not signal it upon errors");
+ gst_curl_smtp_sink_wait_for_transfer_end_unlocked (sink);
}
- gst_curl_base_sink_transfer_thread_close (bcsink);
-
+ GST_OBJECT_UNLOCK (sink);
break;
default:
diff --git a/ext/daala/Makefile.in b/ext/daala/Makefile.in
index 34aadd0..e921388 100644
--- a/ext/daala/Makefile.in
+++ b/ext/daala/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/daala/gstdaaladec.c b/ext/daala/gstdaaladec.c
index d40537d..90fb38f 100644
--- a/ext/daala/gstdaaladec.c
+++ b/ext/daala/gstdaaladec.c
@@ -103,13 +103,12 @@
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
GstVideoDecoderClass *video_decoder_class = GST_VIDEO_DECODER_CLASS (klass);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&daala_dec_src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&daala_dec_sink_factory));
- gst_element_class_set_static_metadata (element_class,
- "Daala video decoder", "Codec/Decoder/Video",
- "Decode raw Daala streams to raw YUV video",
+ gst_element_class_add_static_pad_template (element_class,
+ &daala_dec_src_factory);
+ gst_element_class_add_static_pad_template (element_class,
+ &daala_dec_sink_factory);
+ gst_element_class_set_static_metadata (element_class, "Daala video decoder",
+ "Codec/Decoder/Video", "Decode raw Daala streams to raw YUV video",
"Sebastian Dröge <slomo@circular-chaos.org>");
video_decoder_class->start = GST_DEBUG_FUNCPTR (daala_dec_start);
@@ -122,7 +121,7 @@
GST_DEBUG_FUNCPTR (daala_dec_decide_allocation);
GST_DEBUG_CATEGORY_INIT (daaladec_debug, "daaladec", 0, "Daala decoder");
- GST_DEBUG_CATEGIRY_GET (CAT_PERFORMANCE, "GST_PERFORMANCE");
+ GST_DEBUG_CATEGORY_GET (CAT_PERFORMANCE, "GST_PERFORMANCE");
}
static void
diff --git a/ext/daala/gstdaalaenc.c b/ext/daala/gstdaalaenc.c
index 705c7e6..7209ddf 100644
--- a/ext/daala/gstdaalaenc.c
+++ b/ext/daala/gstdaalaenc.c
@@ -212,13 +212,12 @@
1, G_MAXINT, DEFAULT_KEYFRAME_RATE,
(GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&daala_enc_src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&daala_enc_sink_factory));
- gst_element_class_set_static_metadata (element_class,
- "Daala video encoder", "Codec/Encoder/Video",
- "Encode raw YUV video to a Daala stream",
+ gst_element_class_add_static_pad_template (element_class,
+ &daala_enc_src_factory);
+ gst_element_class_add_static_pad_template (element_class,
+ &daala_enc_sink_factory);
+ gst_element_class_set_static_metadata (element_class, "Daala video encoder",
+ "Codec/Encoder/Video", "Encode raw YUV video to a Daala stream",
"Sebastian Dröge <slomo@circular-chaos.org>");
gstvideo_encoder_class->start = GST_DEBUG_FUNCPTR (daala_enc_start);
diff --git a/ext/dash/Makefile.in b/ext/dash/Makefile.in
index 3fbad07..f954b03 100644
--- a/ext/dash/Makefile.in
+++ b/ext/dash/Makefile.in
@@ -307,6 +307,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -328,6 +330,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -377,6 +381,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -522,6 +528,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -648,8 +656,6 @@
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@
@@ -692,8 +698,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/dash/gstdashdemux.c b/ext/dash/gstdashdemux.c
index 4c1f999..6e24747 100644
--- a/ext/dash/gstdashdemux.c
+++ b/ext/dash/gstdashdemux.c
@@ -189,6 +189,9 @@
PROP_MAX_BUFFERING_TIME,
PROP_BANDWIDTH_USAGE,
PROP_MAX_BITRATE,
+ PROP_MAX_VIDEO_WIDTH,
+ PROP_MAX_VIDEO_HEIGHT,
+ PROP_MAX_VIDEO_FRAMERATE,
PROP_PRESENTATION_DELAY,
PROP_LAST
};
@@ -196,7 +199,11 @@
/* Default values for properties */
#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_MAX_BITRATE 0 /* in bit/s */
+#define DEFAULT_MAX_VIDEO_WIDTH 0
+#define DEFAULT_MAX_VIDEO_HEIGHT 0
+#define DEFAULT_MAX_VIDEO_FRAMERATE_N 0
+#define DEFAULT_MAX_VIDEO_FRAMERATE_D 1
#define DEFAULT_PRESENTATION_DELAY NULL /* zero */
/* Clock drift compensation for live streams */
@@ -216,6 +223,12 @@
GstClock *ntp_clock;
};
+typedef struct
+{
+ guint64 start_offset, end_offset;
+ /* TODO: Timestamp and duration */
+} GstDashStreamSyncSample;
+
/* GObject */
static void gst_dash_demux_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
@@ -253,10 +266,15 @@
static void gst_dash_demux_advance_period (GstAdaptiveDemux * demux);
static gboolean gst_dash_demux_has_next_period (GstAdaptiveDemux * demux);
static GstFlowReturn gst_dash_demux_data_received (GstAdaptiveDemux * demux,
+ GstAdaptiveDemuxStream * stream, GstBuffer * buffer);
+static gboolean
+gst_dash_demux_stream_fragment_start (GstAdaptiveDemux * demux,
GstAdaptiveDemuxStream * stream);
static GstFlowReturn
gst_dash_demux_stream_fragment_finished (GstAdaptiveDemux * demux,
GstAdaptiveDemuxStream * stream);
+static gboolean gst_dash_demux_need_another_chunk (GstAdaptiveDemuxStream *
+ stream);
/* GstDashDemux */
static gboolean gst_dash_demux_setup_all_streams (GstDashDemux * demux);
@@ -266,7 +284,8 @@
GstActiveStream * stream);
static GstPad *gst_dash_demux_create_pad (GstDashDemux * demux,
GstActiveStream * stream);
-static GstDashDemuxClockDrift *gst_dash_demux_clock_drift_new (void);
+static GstDashDemuxClockDrift *gst_dash_demux_clock_drift_new (GstDashDemux *
+ demux);
static void gst_dash_demux_clock_drift_free (GstDashDemuxClockDrift *);
static gboolean gst_dash_demux_poll_clock_drift (GstDashDemux * demux);
static GTimeSpan gst_dash_demux_get_clock_compensation (GstDashDemux * demux);
@@ -313,10 +332,12 @@
GDateTime *now;
GDateTime *mstart;
GTimeSpan stream_now;
+ GstClockTime seg_duration;
if (self->client->mpd_node->availabilityStartTime == NULL)
return FALSE;
+ seg_duration = gst_mpd_client_get_maximum_segment_duration (self->client);
now = gst_dash_demux_get_server_now_utc (self);
mstart =
gst_date_time_to_g_date_time (self->client->
@@ -337,6 +358,17 @@
if (*start < 0)
*start = 0;
}
+
+ /* As defined in 5.3.9.5.3 of the DASH specification, a segment does
+ not become available until the sum of:
+ * the value of the MPD@availabilityStartTime,
+ * the PeriodStart time of the containing Period
+ * the MPD start time of the Media Segment, and
+ * the MPD duration of the Media Segment.
+ Therefore we need to subtract the media segment duration from the stop
+ time.
+ */
+ *stop -= seg_duration;
return TRUE;
}
@@ -393,8 +425,27 @@
g_object_class_install_property (gobject_class, PROP_MAX_BITRATE,
g_param_spec_uint ("max-bitrate", "Max bitrate",
- "Max of bitrate supported by target decoder",
- 1000, G_MAXUINT, DEFAULT_MAX_BITRATE,
+ "Max of bitrate supported by target video decoder (0 = no maximum)",
+ 0, G_MAXUINT, DEFAULT_MAX_BITRATE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_MAX_VIDEO_WIDTH,
+ g_param_spec_uint ("max-video-width", "Max video width",
+ "Max video width to select (0 = no maximum)",
+ 0, G_MAXUINT, DEFAULT_MAX_VIDEO_WIDTH,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_MAX_VIDEO_HEIGHT,
+ g_param_spec_uint ("max-video-height", "Max video height",
+ "Max video height to select (0 = no maximum)",
+ 0, G_MAXUINT, DEFAULT_MAX_VIDEO_HEIGHT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_MAX_VIDEO_FRAMERATE,
+ gst_param_spec_fraction ("max-video-framerate", "Max video framerate",
+ "Max video framerate to select (0/1 = no maximum)",
+ 0, 1, G_MAXINT, 1, DEFAULT_MAX_VIDEO_FRAMERATE_N,
+ DEFAULT_MAX_VIDEO_FRAMERATE_D,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_PRESENTATION_DELAY,
@@ -403,15 +454,14 @@
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_static_pad_template (gstelement_class,
+ &gst_dash_demux_audiosrc_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_dash_demux_videosrc_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_dash_demux_subtitlesrc_template);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sinktemplate));
+ gst_element_class_add_static_pad_template (gstelement_class, &sinktemplate);
gst_element_class_set_static_metadata (gstelement_class,
"DASH Demuxer",
@@ -454,9 +504,12 @@
gstadaptivedemux_class->get_period_start_time =
gst_dash_demux_get_period_start_time;
+ gstadaptivedemux_class->start_fragment = gst_dash_demux_stream_fragment_start;
gstadaptivedemux_class->finish_fragment =
gst_dash_demux_stream_fragment_finished;
gstadaptivedemux_class->data_received = gst_dash_demux_data_received;
+ gstadaptivedemux_class->need_another_chunk =
+ gst_dash_demux_need_another_chunk;
}
static void
@@ -465,6 +518,10 @@
/* Properties */
demux->max_buffering_time = DEFAULT_MAX_BUFFERING_TIME * GST_SECOND;
demux->max_bitrate = DEFAULT_MAX_BITRATE;
+ demux->max_video_width = DEFAULT_MAX_VIDEO_WIDTH;
+ demux->max_video_height = DEFAULT_MAX_VIDEO_HEIGHT;
+ demux->max_video_framerate_n = DEFAULT_MAX_VIDEO_FRAMERATE_N;
+ demux->max_video_framerate_d = DEFAULT_MAX_VIDEO_FRAMERATE_D;
demux->default_presentation_delay = DEFAULT_PRESENTATION_DELAY;
g_mutex_init (&demux->client_lock);
@@ -490,6 +547,16 @@
case PROP_MAX_BITRATE:
demux->max_bitrate = g_value_get_uint (value);
break;
+ case PROP_MAX_VIDEO_WIDTH:
+ demux->max_video_width = g_value_get_uint (value);
+ break;
+ case PROP_MAX_VIDEO_HEIGHT:
+ demux->max_video_height = g_value_get_uint (value);
+ break;
+ case PROP_MAX_VIDEO_FRAMERATE:
+ demux->max_video_framerate_n = gst_value_get_fraction_numerator (value);
+ demux->max_video_framerate_d = gst_value_get_fraction_denominator (value);
+ break;
case PROP_PRESENTATION_DELAY:
g_free (demux->default_presentation_delay);
demux->default_presentation_delay = g_value_dup_string (value);
@@ -517,6 +584,16 @@
case PROP_MAX_BITRATE:
g_value_set_uint (value, demux->max_bitrate);
break;
+ case PROP_MAX_VIDEO_WIDTH:
+ g_value_set_uint (value, demux->max_video_width);
+ break;
+ case PROP_MAX_VIDEO_HEIGHT:
+ g_value_set_uint (value, demux->max_video_height);
+ break;
+ case PROP_MAX_VIDEO_FRAMERATE:
+ gst_value_set_fraction (value, demux->max_video_framerate_n,
+ demux->max_video_framerate_d);
+ break;
case PROP_PRESENTATION_DELAY:
if (demux->default_presentation_delay == NULL)
g_value_set_static_string (value, "");
@@ -571,6 +648,7 @@
GstDashDemuxStream *stream;
GstActiveStream *active_stream;
GstCaps *caps;
+ GstStructure *s;
GstPad *srcpad;
gchar *lang = NULL;
GstTagList *tags = NULL;
@@ -579,6 +657,13 @@
if (active_stream == NULL)
continue;
+ if (demux->trickmode_no_audio
+ && active_stream->mimeType == GST_STREAM_AUDIO) {
+ GST_DEBUG_OBJECT (demux,
+ "Skipping audio stream %d because of TRICKMODE_NO_AUDIO flag", i);
+ continue;
+ }
+
srcpad = gst_dash_demux_create_pad (demux, active_stream);
if (srcpad == NULL)
continue;
@@ -614,6 +699,11 @@
stream = (GstDashDemuxStream *)
gst_adaptive_demux_stream_new (GST_ADAPTIVE_DEMUX_CAST (demux), srcpad);
stream->active_stream = active_stream;
+ s = gst_caps_get_structure (caps, 0);
+ stream->is_isobmff = gst_structure_has_name (s, "video/quicktime");
+ stream->first_sync_sample_always_after_moof = TRUE;
+ if (stream->is_isobmff)
+ stream->isobmff_adapter = gst_adapter_new ();
gst_adaptive_demux_stream_set_caps (GST_ADAPTIVE_DEMUX_STREAM_CAST (stream),
caps);
if (tags)
@@ -631,6 +721,8 @@
}
gst_isoff_sidx_parser_init (&stream->sidx_parser);
+ if (gst_mpd_client_has_isoff_ondemand_profile (demux->client))
+ stream->sidx_adapter = gst_adapter_new ();
}
return TRUE;
@@ -712,7 +804,7 @@
SUPPORTED_CLOCK_FORMATS, NULL);
if (urls) {
GST_DEBUG_OBJECT (dashdemux, "Found a supported UTCTiming element");
- dashdemux->clock_drift = gst_dash_demux_clock_drift_new ();
+ dashdemux->clock_drift = gst_dash_demux_clock_drift_new (dashdemux);
gst_dash_demux_poll_clock_drift (dashdemux);
}
}
@@ -878,6 +970,10 @@
demux->n_audio_streams = 0;
demux->n_video_streams = 0;
+ demux->n_subtitle_streams = 0;
+
+ demux->trickmode_no_audio = FALSE;
+ demux->allow_trickmode_key_units = TRUE;
}
static GstCaps *
@@ -1020,6 +1116,9 @@
isombff = gst_mpd_client_has_isoff_ondemand_profile (dashdemux->client);
+ /* Reset chunk size if any */
+ stream->fragment.chunk_size = 0;
+
if (GST_ADAPTIVE_DEMUX_STREAM_NEED_HEADER (stream) && isombff) {
gst_dash_demux_stream_update_headers_info (stream);
dashstream->sidx_base_offset = stream->fragment.index_range_end + 1;
@@ -1030,6 +1129,24 @@
}
}
+ if (dashstream->moof_sync_samples
+ && GST_ADAPTIVE_DEMUX (dashdemux)->
+ segment.flags & GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS) {
+ GstDashStreamSyncSample *sync_sample =
+ &g_array_index (dashstream->moof_sync_samples, GstDashStreamSyncSample,
+ dashstream->current_sync_sample);
+
+ gst_mpd_client_get_next_fragment (dashdemux->client, dashstream->index,
+ &fragment);
+ stream->fragment.uri = fragment.uri;
+ stream->fragment.timestamp = GST_CLOCK_TIME_NONE;
+ stream->fragment.duration = GST_CLOCK_TIME_NONE;
+ stream->fragment.range_start = sync_sample->start_offset;
+ stream->fragment.range_end = sync_sample->end_offset;
+
+ return GST_FLOW_OK;
+ }
+
if (gst_mpd_client_get_next_fragment_timestamp (dashdemux->client,
dashstream->index, &ts)) {
if (GST_ADAPTIVE_DEMUX_STREAM_NEED_HEADER (stream)) {
@@ -1090,9 +1207,7 @@
gint idx = sidx->entries_count;
/* 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 {
+ if (sidx->entries[idx - 1].pts + sidx->entries[idx - 1].duration >= ts) {
GstSearchMode mode = GST_SEARCH_MODE_BEFORE;
if ((flags & GST_SEEK_FLAG_SNAP_NEAREST) == GST_SEEK_FLAG_SNAP_NEAREST) {
@@ -1120,8 +1235,6 @@
ABS (sidx->entries[idx].pts - ts))
idx += 1;
}
-
- dashstream->sidx_current_remaining = sidx->entries[idx].size;
}
sidx->entry_index = idx;
@@ -1142,6 +1255,14 @@
GstDashDemuxStream *dashstream = (GstDashDemuxStream *) stream;
GstDashDemux *dashdemux = GST_DASH_DEMUX_CAST (stream->demux);
+ if (dashstream->moof)
+ gst_isoff_moof_box_free (dashstream->moof);
+ dashstream->moof = NULL;
+ if (dashstream->moof_sync_samples)
+ g_array_free (dashstream->moof_sync_samples, TRUE);
+ dashstream->moof_sync_samples = NULL;
+ dashstream->current_sync_sample = -1;
+
if (gst_mpd_client_has_isoff_ondemand_profile (dashdemux->client)) {
if (dashstream->sidx_parser.status == GST_ISOFF_SIDX_PARSER_FINISHED) {
gst_dash_demux_stream_sidx_seek (dashstream, forward, flags, ts,
@@ -1151,6 +1272,8 @@
/* FIXME - the final_ts won't be correct here */
dashstream->pending_seek_ts = ts;
}
+
+ return GST_FLOW_OK;
}
gst_mpd_client_stream_seek (dashdemux->client, dashstream->active_stream,
@@ -1159,6 +1282,26 @@
}
static gboolean
+gst_dash_demux_stream_has_next_sync_sample (GstAdaptiveDemuxStream * stream)
+{
+ GstDashDemuxStream *dashstream = (GstDashDemuxStream *) stream;
+
+ if (dashstream->moof_sync_samples
+ && GST_ADAPTIVE_DEMUX (stream->demux)->
+ segment.flags & GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS) {
+ if (stream->demux->segment.rate > 0.0) {
+ if (dashstream->current_sync_sample + 1 <
+ dashstream->moof_sync_samples->len)
+ return TRUE;
+ } else {
+ if (dashstream->current_sync_sample >= 1)
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static gboolean
gst_dash_demux_stream_has_next_subfragment (GstAdaptiveDemuxStream * stream)
{
GstDashDemuxStream *dashstream = (GstDashDemuxStream *) stream;
@@ -1177,6 +1320,43 @@
}
static gboolean
+gst_dash_demux_stream_advance_sync_sample (GstAdaptiveDemuxStream * stream)
+{
+ GstDashDemuxStream *dashstream = (GstDashDemuxStream *) stream;
+ gboolean fragment_finished = FALSE;
+
+ if (dashstream->moof_sync_samples
+ && GST_ADAPTIVE_DEMUX (stream->demux)->
+ segment.flags & GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS) {
+ if (stream->demux->segment.rate > 0.0) {
+ dashstream->current_sync_sample++;
+ if (dashstream->current_sync_sample >= dashstream->moof_sync_samples->len) {
+ fragment_finished = TRUE;
+ }
+ } else {
+ if (dashstream->current_sync_sample == -1) {
+ dashstream->current_sync_sample =
+ dashstream->moof_sync_samples->len - 1;
+ } else if (dashstream->current_sync_sample == 0) {
+ dashstream->current_sync_sample = -1;
+ fragment_finished = TRUE;
+ } else {
+ dashstream->current_sync_sample--;
+ }
+ }
+ }
+
+ GST_DEBUG_OBJECT (stream->pad,
+ "Advancing sync sample #%d fragment_finished:%d",
+ dashstream->current_sync_sample, fragment_finished);
+
+ if (!fragment_finished)
+ stream->discont = TRUE;
+
+ return !fragment_finished;
+}
+
+static gboolean
gst_dash_demux_stream_advance_subfragment (GstAdaptiveDemuxStream * stream)
{
GstDashDemuxStream *dashstream = (GstDashDemuxStream *) stream;
@@ -1190,8 +1370,10 @@
if (sidx->entry_index < sidx->entries_count) {
fragment_finished = FALSE;
}
+ dashstream->sidx_index++;
} else {
sidx->entry_index--;
+ dashstream->sidx_index--;
if (sidx->entry_index >= 0) {
fragment_finished = FALSE;
}
@@ -1202,9 +1384,6 @@
"Finished fragment: %d", sidx->entry_index, sidx->entries_count,
fragment_finished);
- if (!fragment_finished) {
- dashstream->sidx_current_remaining = sidx->entries[sidx->entry_index].size;
- }
return !fragment_finished;
}
@@ -1214,6 +1393,13 @@
GstDashDemux *dashdemux = GST_DASH_DEMUX_CAST (stream->demux);
GstDashDemuxStream *dashstream = (GstDashDemuxStream *) stream;
+ if (dashstream->moof_sync_samples
+ && GST_ADAPTIVE_DEMUX (dashdemux)->
+ segment.flags & GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS) {
+ if (gst_dash_demux_stream_has_next_sync_sample (stream))
+ return TRUE;
+ }
+
if (gst_mpd_client_has_isoff_ondemand_profile (dashdemux->client)) {
if (gst_dash_demux_stream_has_next_subfragment (stream))
return TRUE;
@@ -1223,6 +1409,32 @@
dashstream->active_stream, stream->demux->segment.rate > 0.0);
}
+static void
+gst_dash_demux_clear_pending_stream_data (GstDashDemux * dashdemux,
+ GstDashDemuxStream * dashstream)
+{
+ gst_isoff_sidx_parser_clear (&dashstream->sidx_parser);
+ gst_isoff_sidx_parser_init (&dashstream->sidx_parser);
+ if (dashstream->sidx_adapter)
+ gst_adapter_clear (dashstream->sidx_adapter);
+
+ /* Reset ISOBMFF box parsing state */
+ if (dashstream->isobmff_adapter)
+ gst_adapter_clear (dashstream->isobmff_adapter);
+ dashstream->isobmff_parser.current_fourcc = 0;
+ dashstream->isobmff_parser.current_start_offset = 0;
+ dashstream->isobmff_parser.current_offset = 0;
+ dashstream->isobmff_parser.current_size = 0;
+
+ if (dashstream->moof)
+ gst_isoff_moof_box_free (dashstream->moof);
+ dashstream->moof = NULL;
+ if (dashstream->moof_sync_samples)
+ g_array_free (dashstream->moof_sync_samples, TRUE);
+ dashstream->moof_sync_samples = NULL;
+ dashstream->current_sync_sample = -1;
+}
+
static GstFlowReturn
gst_dash_demux_stream_advance_fragment (GstAdaptiveDemuxStream * stream)
{
@@ -1231,11 +1443,39 @@
GST_DEBUG_OBJECT (stream->pad, "Advance fragment");
+ /* If downloading only keyframes, switch to the next one or fall through */
+ if (dashstream->moof_sync_samples
+ && GST_ADAPTIVE_DEMUX (dashdemux)->
+ segment.flags & GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS) {
+ if (gst_dash_demux_stream_advance_sync_sample (stream))
+ return GST_FLOW_OK;
+ }
+
+ if (dashstream->isobmff_adapter)
+ gst_adapter_clear (dashstream->isobmff_adapter);
+ dashstream->isobmff_parser.current_fourcc = 0;
+ dashstream->isobmff_parser.current_start_offset = 0;
+ dashstream->isobmff_parser.current_offset = 0;
+ dashstream->isobmff_parser.current_size = 0;
+
+ if (dashstream->moof)
+ gst_isoff_moof_box_free (dashstream->moof);
+ dashstream->moof = NULL;
+ if (dashstream->moof_sync_samples)
+ g_array_free (dashstream->moof_sync_samples, TRUE);
+ dashstream->moof_sync_samples = NULL;
+ dashstream->current_sync_sample = -1;
+
if (gst_mpd_client_has_isoff_ondemand_profile (dashdemux->client)) {
if (gst_dash_demux_stream_advance_subfragment (stream))
return GST_FLOW_OK;
}
+ gst_isoff_sidx_parser_clear (&dashstream->sidx_parser);
+ gst_isoff_sidx_parser_init (&dashstream->sidx_parser);
+ if (dashstream->sidx_adapter)
+ gst_adapter_clear (dashstream->sidx_adapter);
+
return gst_mpd_client_advance_segment (dashdemux->client,
dashstream->active_stream, stream->demux->segment.rate > 0.0);
}
@@ -1247,6 +1487,7 @@
GstActiveStream *active_stream = NULL;
GList *rep_list = NULL;
gint new_index;
+ GstAdaptiveDemux *base_demux = stream->demux;
GstDashDemux *demux = GST_DASH_DEMUX_CAST (stream->demux);
GstDashDemuxStream *dashstream = (GstDashDemuxStream *) stream;
gboolean ret = FALSE;
@@ -1266,8 +1507,24 @@
GST_DEBUG_OBJECT (stream->pad,
"Trying to change to bitrate: %" G_GUINT64_FORMAT, bitrate);
+ if (active_stream->mimeType == GST_STREAM_VIDEO && demux->max_bitrate) {
+ bitrate = MIN (demux->max_bitrate, bitrate);
+ }
+
/* get representation index with current max_bandwidth */
- new_index = gst_mpdparser_get_rep_idx_with_max_bandwidth (rep_list, bitrate);
+ if ((base_demux->segment.flags & GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS) ||
+ ABS (base_demux->segment.rate) <= 1.0) {
+ new_index =
+ gst_mpdparser_get_rep_idx_with_max_bandwidth (rep_list, bitrate,
+ demux->max_video_width, demux->max_video_height,
+ demux->max_video_framerate_n, demux->max_video_framerate_d);
+ } else {
+ new_index =
+ gst_mpdparser_get_rep_idx_with_max_bandwidth (rep_list,
+ bitrate / ABS (base_demux->segment.rate), demux->max_video_width,
+ demux->max_video_height, demux->max_video_framerate_n,
+ demux->max_video_framerate_d);
+ }
/* if no representation has the required bandwidth, take the lowest one */
if (new_index == -1)
@@ -1291,16 +1548,13 @@
}
}
- if (gst_mpd_client_has_isoff_ondemand_profile (demux->client)) {
+ if (ret) {
+ gst_dash_demux_clear_pending_stream_data (demux, dashstream);
- /* store our current position to change to the same one in a different
- * representation if needed */
- dashstream->sidx_index = SIDX (dashstream)->entry_index;
- if (ret) {
- /* TODO cache indexes to avoid re-downloading and parsing */
- /* if we switched, we need a new index */
- gst_isoff_sidx_parser_clear (&dashstream->sidx_parser);
- gst_isoff_sidx_parser_init (&dashstream->sidx_parser);
+ if (gst_mpd_client_has_isoff_ondemand_profile (demux->client)) {
+ /* store our current position to change to the same one in a different
+ * representation if needed */
+ dashstream->sidx_index = SIDX (dashstream)->entry_index;
}
}
@@ -1324,9 +1578,9 @@
GstClockTime current_pos, target_pos;
guint current_period;
GstStreamPeriod *period;
- GList *iter;
+ GList *iter, *streams = NULL;
GstDashDemux *dashdemux = GST_DASH_DEMUX_CAST (demux);
- gboolean switched_period = FALSE;
+ gboolean trickmode_no_audio;
gst_event_parse_seek (seek, &rate, &format, &flags, &start_type, &start,
&stop_type, &stop);
@@ -1367,27 +1621,39 @@
GST_WARNING_OBJECT (demux, "Could not find seeked Period");
return FALSE;
}
+
+ trickmode_no_audio = ! !(flags & GST_SEEK_FLAG_TRICKMODE_NO_AUDIO);
+
+ streams = demux->streams;
if (current_period != gst_mpd_client_get_period_index (dashdemux->client)) {
GST_DEBUG_OBJECT (demux, "Seeking to Period %d", current_period);
/* clean old active stream list, if any */
gst_active_streams_free (dashdemux->client);
+ dashdemux->trickmode_no_audio = trickmode_no_audio;
/* setup video, audio and subtitle streams, starting from the new Period */
if (!gst_mpd_client_set_period_index (dashdemux->client, current_period)
|| !gst_dash_demux_setup_all_streams (dashdemux))
return FALSE;
- switched_period = TRUE;
+ streams = demux->next_streams;
+ } else if (dashdemux->trickmode_no_audio != trickmode_no_audio) {
+ /* clean old active stream list, if any */
+ gst_active_streams_free (dashdemux->client);
+ dashdemux->trickmode_no_audio = trickmode_no_audio;
+
+ /* setup video, audio and subtitle streams, starting from the new Period */
+ if (!gst_dash_demux_setup_all_streams (dashdemux))
+ return FALSE;
+ streams = demux->next_streams;
}
/* Update the current sequence on all streams */
- for (iter = (switched_period ? demux->next_streams : demux->streams); iter;
- iter = g_list_next (iter)) {
+ for (iter = streams; iter; iter = g_list_next (iter)) {
GstDashDemuxStream *dashstream = iter->data;
if (flags & GST_SEEK_FLAG_FLUSH) {
- gst_isoff_sidx_parser_clear (&dashstream->sidx_parser);
- gst_isoff_sidx_parser_init (&dashstream->sidx_parser);
+ gst_dash_demux_clear_pending_stream_data (dashdemux, dashstream);
}
gst_dash_demux_stream_seek (iter->data, rate >= 0, 0, target_pos, NULL);
}
@@ -1541,8 +1807,12 @@
gint64 diff;
GstDateTime *cur_time;
- cur_time = gst_date_time_new_now_utc ();
- diff = gst_mpd_client_calculate_time_difference (cur_time,
+ cur_time =
+ gst_date_time_new_from_g_date_time
+ (gst_adaptive_demux_get_client_now_utc (GST_ADAPTIVE_DEMUX_CAST
+ (dashdemux)));
+ diff =
+ gst_mpd_client_calculate_time_difference (cur_time,
segmentAvailability);
gst_date_time_unref (segmentAvailability);
gst_date_time_unref (cur_time);
@@ -1603,6 +1873,33 @@
return newbuf;
}
+static gboolean
+gst_dash_demux_stream_fragment_start (GstAdaptiveDemux * demux,
+ GstAdaptiveDemuxStream * stream)
+{
+ GstDashDemux *dashdemux = GST_DASH_DEMUX_CAST (demux);
+ GstDashDemuxStream *dashstream = (GstDashDemuxStream *) stream;
+
+ dashstream->sidx_index_header_or_data = 0;
+ dashstream->sidx_current_offset = -1;
+
+ dashstream->isobmff_parser.index_header_or_data = 0;
+ dashstream->isobmff_parser.current_offset = -1;
+
+ /* We need to mark every first buffer of a key unit as discont,
+ * and also every first buffer of a moov and moof. This ensures
+ * that qtdemux takes note of our buffer offsets for each of those
+ * buffers instead of keeping track of them itself from the first
+ * buffer. We need offsets to be consistent between moof and mdat
+ */
+ if (dashstream->is_isobmff && dashdemux->allow_trickmode_key_units
+ && (demux->segment.flags & GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS)
+ && dashstream->active_stream->mimeType == GST_STREAM_VIDEO)
+ stream->discont = TRUE;
+
+ return TRUE;
+}
+
static GstFlowReturn
gst_dash_demux_stream_fragment_finished (GstAdaptiveDemux * demux,
GstAdaptiveDemuxStream * stream)
@@ -1610,8 +1907,24 @@
GstDashDemux *dashdemux = GST_DASH_DEMUX_CAST (demux);
GstDashDemuxStream *dashstream = (GstDashDemuxStream *) stream;
- if (gst_mpd_client_has_isoff_ondemand_profile (dashdemux->client) &&
- dashstream->sidx_parser.status == GST_ISOFF_SIDX_PARSER_FINISHED) {
+ /* We need to mark every first buffer of a key unit as discont,
+ * and also every first buffer of a moov and moof. This ensures
+ * that qtdemux takes note of our buffer offsets for each of those
+ * buffers instead of keeping track of them itself from the first
+ * buffer. We need offsets to be consistent between moof and mdat
+ */
+ if (dashstream->is_isobmff && dashdemux->allow_trickmode_key_units
+ && (demux->segment.flags & GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS)
+ && dashstream->active_stream->mimeType == GST_STREAM_VIDEO)
+ stream->discont = TRUE;
+
+ /* Only handle fragment advancing specifically for SIDX if we're not
+ * in key unit mode */
+ if (!(dashstream->moof_sync_samples
+ && GST_ADAPTIVE_DEMUX (dashdemux)->
+ segment.flags & GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS)
+ && gst_mpd_client_has_isoff_ondemand_profile (dashdemux->client)
+ && dashstream->sidx_parser.status == GST_ISOFF_SIDX_PARSER_FINISHED) {
/* fragment is advanced on data_received when byte limits are reached */
if (gst_dash_demux_stream_has_next_fragment (stream))
return GST_FLOW_OK;
@@ -1625,26 +1938,617 @@
stream->fragment.duration);
}
-static GstFlowReturn
-gst_dash_demux_data_received (GstAdaptiveDemux * demux,
+static gboolean
+gst_dash_demux_need_another_chunk (GstAdaptiveDemuxStream * stream)
+{
+ GstDashDemux *dashdemux = (GstDashDemux *) stream->demux;
+ GstDashDemuxStream *dashstream = (GstDashDemuxStream *) stream;
+
+ /* We're chunked downloading for ISOBMFF in KEY_UNITS mode for the actual
+ * fragment until we parsed the moof and arrived at the mdat. 8192 is a
+ * random guess for the moof size
+ */
+ if (dashstream->is_isobmff
+ && (GST_ADAPTIVE_DEMUX (stream->demux)->
+ segment.flags & GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS)
+ && dashstream->active_stream->mimeType == GST_STREAM_VIDEO
+ && !stream->downloading_header && !stream->downloading_index
+ && dashdemux->allow_trickmode_key_units) {
+ if (dashstream->isobmff_parser.current_fourcc != GST_ISOFF_FOURCC_MDAT) {
+ /* Need to download the moof first to know anything */
+
+ stream->fragment.chunk_size = 8192;
+ /* Do we have the first fourcc already or are we in the middle */
+ if (dashstream->isobmff_parser.current_fourcc == 0) {
+ stream->fragment.chunk_size += dashstream->moof_average_size;
+ if (dashstream->first_sync_sample_always_after_moof)
+ stream->fragment.chunk_size +=
+ dashstream->first_sync_sample_average_size;
+ }
+
+ if (gst_mpd_client_has_isoff_ondemand_profile (dashdemux->client) &&
+ dashstream->sidx_parser.sidx.entries) {
+ guint64 sidx_end_offset =
+ dashstream->sidx_base_offset +
+ SIDX_CURRENT_ENTRY (dashstream)->offset +
+ SIDX_CURRENT_ENTRY (dashstream)->size;
+
+ if (stream->fragment.chunk_size +
+ dashstream->isobmff_parser.current_offset > sidx_end_offset) {
+ stream->fragment.chunk_size =
+ sidx_end_offset - dashstream->isobmff_parser.current_offset;
+ }
+ }
+ } else if (dashstream->moof && dashstream->moof_sync_samples) {
+ /* Have the moof, either we're done now or we want to download the
+ * directly following sync sample */
+ if (dashstream->first_sync_sample_after_moof
+ && dashstream->current_sync_sample == 0) {
+ GstDashStreamSyncSample *sync_sample =
+ &g_array_index (dashstream->moof_sync_samples,
+ GstDashStreamSyncSample, 0);
+ guint64 end_offset = sync_sample->end_offset + 1;
+
+ if (gst_mpd_client_has_isoff_ondemand_profile (dashdemux->client) &&
+ dashstream->sidx_parser.sidx.entries) {
+ guint64 sidx_end_offset =
+ dashstream->sidx_base_offset +
+ SIDX_CURRENT_ENTRY (dashstream)->offset +
+ SIDX_CURRENT_ENTRY (dashstream)->size;
+
+ if (end_offset > sidx_end_offset) {
+ end_offset = sidx_end_offset;
+ }
+ }
+
+ if (dashstream->isobmff_parser.current_offset < end_offset) {
+ stream->fragment.chunk_size =
+ end_offset - dashstream->isobmff_parser.current_offset;
+ } else {
+ stream->fragment.chunk_size = 0;
+ }
+ } else {
+ stream->fragment.chunk_size = 0;
+ }
+ } else {
+ /* Have moof but can't do key-units mode, just download until the end */
+ stream->fragment.chunk_size = -1;
+ }
+ } else {
+ /* We might've decided that we can't allow key-unit only
+ * trickmodes while doing chunked downloading. In that case
+ * just download from here to the end now */
+ if (dashstream->moof
+ && (GST_ADAPTIVE_DEMUX (stream->demux)->
+ segment.flags & GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS))
+ stream->fragment.chunk_size = -1;
+ else
+ stream->fragment.chunk_size = 0;
+ }
+
+ return stream->fragment.chunk_size != 0;
+}
+
+static GstBuffer *
+gst_dash_demux_parse_isobmff (GstAdaptiveDemux * demux,
+ GstDashDemuxStream * dash_stream, GstBuffer * buffer)
+{
+ GstAdaptiveDemuxStream *stream = (GstAdaptiveDemuxStream *) dash_stream;
+ gsize available;
+ guint index_header_or_data;
+ GstMapInfo map;
+ GstByteReader reader;
+ guint32 fourcc;
+ guint header_size;
+ guint64 size, buffer_offset;
+
+ /* This must not be called when we're in the mdat. We only look at the mdat
+ * header and then stop parsing the boxes as we're only interested in the
+ * metadata! Handling mdat is the job of the surrounding code, as well as
+ * stopping or starting the next fragment when mdat is over (=> sidx)
+ */
+ g_assert (dash_stream->isobmff_parser.current_fourcc !=
+ GST_ISOFF_FOURCC_MDAT);
+
+ if (stream->downloading_index)
+ index_header_or_data = 1;
+ else if (stream->downloading_header)
+ index_header_or_data = 2;
+ else
+ index_header_or_data = 3;
+
+ if (dash_stream->isobmff_parser.index_header_or_data != index_header_or_data) {
+ /* Clear pending data */
+ if (gst_adapter_available (dash_stream->isobmff_adapter) != 0)
+ GST_ERROR_OBJECT (stream->pad,
+ "Had pending ISOBMFF data after switch between index/header/data");
+ gst_adapter_clear (dash_stream->isobmff_adapter);
+ dash_stream->isobmff_parser.current_fourcc = 0;
+ dash_stream->isobmff_parser.current_start_offset = 0;
+ dash_stream->isobmff_parser.current_offset = -1;
+ dash_stream->isobmff_parser.current_size = 0;
+ dash_stream->isobmff_parser.index_header_or_data = index_header_or_data;
+ }
+
+ if (dash_stream->isobmff_parser.current_offset == -1) {
+ dash_stream->isobmff_parser.current_offset =
+ GST_BUFFER_OFFSET_IS_VALID (buffer) ? GST_BUFFER_OFFSET (buffer) : 0;
+ }
+
+ gst_adapter_push (dash_stream->isobmff_adapter, buffer);
+
+ available = gst_adapter_available (dash_stream->isobmff_adapter);
+ buffer = gst_adapter_take_buffer (dash_stream->isobmff_adapter, available);
+ buffer_offset = dash_stream->isobmff_parser.current_offset;
+
+ /* Always at the start of a box here */
+ g_assert (dash_stream->isobmff_parser.current_size == 0);
+
+ /* At the start of a box => Parse it */
+ gst_buffer_map (buffer, &map, GST_MAP_READ);
+ gst_byte_reader_init (&reader, map.data, map.size);
+
+ /* While there are more boxes left to parse ... */
+ dash_stream->isobmff_parser.current_start_offset =
+ dash_stream->isobmff_parser.current_offset;
+ do {
+ dash_stream->isobmff_parser.current_fourcc = 0;
+ dash_stream->isobmff_parser.current_size = 0;
+
+ if (!gst_isoff_parse_box_header (&reader, &fourcc, NULL, &header_size,
+ &size)) {
+ break;
+ }
+
+ dash_stream->isobmff_parser.current_fourcc = fourcc;
+ if (size == 0) {
+ /* We assume this is mdat, anything else with "size until end"
+ * does not seem to make sense */
+ g_assert (dash_stream->isobmff_parser.current_fourcc ==
+ GST_ISOFF_FOURCC_MDAT);
+ dash_stream->isobmff_parser.current_size = -1;
+ break;
+ }
+
+ dash_stream->isobmff_parser.current_size = size;
+
+ /* Do we have the complete box or are at MDAT */
+ if (gst_byte_reader_get_remaining (&reader) < size - header_size ||
+ dash_stream->isobmff_parser.current_fourcc == GST_ISOFF_FOURCC_MDAT) {
+ /* Reset byte reader to the beginning of the box */
+ gst_byte_reader_set_pos (&reader,
+ gst_byte_reader_get_pos (&reader) - header_size);
+ break;
+ }
+
+ GST_LOG_OBJECT (stream->pad,
+ "box %" GST_FOURCC_FORMAT " at offset %" G_GUINT64_FORMAT " size %"
+ G_GUINT64_FORMAT, GST_FOURCC_ARGS (fourcc),
+ dash_stream->isobmff_parser.current_offset +
+ gst_byte_reader_get_pos (&reader) - header_size, size);
+
+ if (dash_stream->isobmff_parser.current_fourcc == GST_ISOFF_FOURCC_MOOF) {
+ GstByteReader sub_reader;
+
+ g_assert (dash_stream->moof == NULL);
+ g_assert (dash_stream->moof_sync_samples == NULL);
+ gst_byte_reader_get_sub_reader (&reader, &sub_reader, size - header_size);
+ dash_stream->moof = gst_isoff_moof_box_parse (&sub_reader);
+ dash_stream->moof_offset =
+ dash_stream->isobmff_parser.current_start_offset;
+ dash_stream->moof_size = size;
+ dash_stream->current_sync_sample = -1;
+
+ if (dash_stream->moof_average_size) {
+ if (dash_stream->moof_average_size < size)
+ dash_stream->moof_average_size =
+ (size * 3 + dash_stream->moof_average_size) / 4;
+ else
+ dash_stream->moof_average_size =
+ (size + dash_stream->moof_average_size + 3) / 4;
+ } else {
+ dash_stream->moof_average_size = size;
+ }
+ } else {
+ gst_byte_reader_skip (&reader, size - header_size);
+ }
+
+ dash_stream->isobmff_parser.current_fourcc = 0;
+ dash_stream->isobmff_parser.current_start_offset += size;
+ dash_stream->isobmff_parser.current_size = 0;
+ } while (gst_byte_reader_get_remaining (&reader) > 0);
+
+ gst_buffer_unmap (buffer, &map);
+
+ /* mdat? Push all we have and wait for it to be over */
+ if (dash_stream->isobmff_parser.current_fourcc == GST_ISOFF_FOURCC_MDAT) {
+ GstBuffer *pending;
+
+ GST_LOG_OBJECT (stream->pad,
+ "box %" GST_FOURCC_FORMAT " at offset %" G_GUINT64_FORMAT " size %"
+ G_GUINT64_FORMAT, GST_FOURCC_ARGS (fourcc),
+ dash_stream->isobmff_parser.current_offset +
+ gst_byte_reader_get_pos (&reader) - header_size,
+ dash_stream->isobmff_parser.current_size);
+
+ /* At mdat. Move the start of the mdat to the adapter and have everything
+ * else be pushed. We parsed all header boxes at this point and are not
+ * supposed to be called again until the next moof */
+ pending = _gst_buffer_split (buffer, gst_byte_reader_get_pos (&reader), -1);
+ gst_adapter_push (dash_stream->isobmff_adapter, pending);
+ dash_stream->isobmff_parser.current_offset +=
+ gst_byte_reader_get_pos (&reader);
+ dash_stream->isobmff_parser.current_size = 0;
+
+ GST_BUFFER_OFFSET (buffer) = buffer_offset;
+ GST_BUFFER_OFFSET_END (buffer) =
+ buffer_offset + gst_buffer_get_size (buffer);
+ return buffer;
+ } else if (gst_byte_reader_get_pos (&reader) != 0) {
+ GstBuffer *pending;
+
+ /* Multiple complete boxes and no mdat? Push them and keep the remainder,
+ * which is the start of the next box if any remainder */
+
+ pending = _gst_buffer_split (buffer, gst_byte_reader_get_pos (&reader), -1);
+ gst_adapter_push (dash_stream->isobmff_adapter, pending);
+ dash_stream->isobmff_parser.current_offset +=
+ gst_byte_reader_get_pos (&reader);
+ dash_stream->isobmff_parser.current_size = 0;
+
+ GST_BUFFER_OFFSET (buffer) = buffer_offset;
+ GST_BUFFER_OFFSET_END (buffer) =
+ buffer_offset + gst_buffer_get_size (buffer);
+ return buffer;
+ }
+
+ /* Not even a single complete, non-mdat box, wait */
+ dash_stream->isobmff_parser.current_size = 0;
+ gst_adapter_push (dash_stream->isobmff_adapter, buffer);
+
+ return NULL;
+}
+
+static gboolean
+gst_dash_demux_find_sync_samples (GstAdaptiveDemux * demux,
GstAdaptiveDemuxStream * stream)
{
+ GstDashDemux *dashdemux = (GstDashDemux *) stream->demux;
+ GstDashDemuxStream *dash_stream = (GstDashDemuxStream *) stream;
+ guint i;
+ guint32 track_id = 0;
+ guint64 prev_traf_end;
+ gboolean trex_sample_flags = FALSE;
+
+ if (!dash_stream->moof) {
+ dashdemux->allow_trickmode_key_units = FALSE;
+ return FALSE;
+ }
+
+ dash_stream->current_sync_sample = -1;
+ dash_stream->moof_sync_samples =
+ g_array_new (FALSE, FALSE, sizeof (GstDashStreamSyncSample));
+
+ prev_traf_end = dash_stream->moof_offset;
+
+ /* generate table of keyframes and offsets */
+ for (i = 0; i < dash_stream->moof->traf->len; i++) {
+ GstTrafBox *traf = &g_array_index (dash_stream->moof->traf, GstTrafBox, i);
+ guint64 traf_offset = 0, prev_trun_end;
+ guint j;
+
+ if (i == 0) {
+ track_id = traf->tfhd.track_id;
+ } else if (track_id != traf->tfhd.track_id) {
+ GST_ERROR_OBJECT (stream->pad,
+ "moof with trafs of different track ids (%u != %u)", track_id,
+ traf->tfhd.track_id);
+ g_array_free (dash_stream->moof_sync_samples, TRUE);
+ dash_stream->moof_sync_samples = NULL;
+ dashdemux->allow_trickmode_key_units = FALSE;
+ return FALSE;
+ }
+
+ if (traf->tfhd.flags & GST_TFHD_FLAGS_BASE_DATA_OFFSET_PRESENT) {
+ traf_offset = traf->tfhd.base_data_offset;
+ } else if (traf->tfhd.flags & GST_TFHD_FLAGS_DEFAULT_BASE_IS_MOOF) {
+ traf_offset = dash_stream->moof_offset;
+ } else {
+ traf_offset = prev_traf_end;
+ }
+
+ prev_trun_end = traf_offset;
+
+ for (j = 0; j < traf->trun->len; j++) {
+ GstTrunBox *trun = &g_array_index (traf->trun, GstTrunBox, j);
+ guint64 trun_offset, prev_sample_end;
+ guint k;
+
+ if (trun->flags & GST_TRUN_FLAGS_DATA_OFFSET_PRESENT) {
+ trun_offset = traf_offset + trun->data_offset;
+ } else {
+ trun_offset = prev_trun_end;
+ }
+
+ prev_sample_end = trun_offset;
+ for (k = 0; k < trun->samples->len; k++) {
+ GstTrunSample *sample =
+ &g_array_index (trun->samples, GstTrunSample, k);
+ guint64 sample_offset;
+ guint32 sample_flags;
+#if 0
+ guint32 sample_duration;
+#endif
+
+ sample_offset = prev_sample_end;
+
+ if (trun->flags & GST_TRUN_FLAGS_SAMPLE_FLAGS_PRESENT) {
+ sample_flags = sample->sample_flags;
+ } else if ((trun->flags & GST_TRUN_FLAGS_FIRST_SAMPLE_FLAGS_PRESENT)
+ && k == 0) {
+ sample_flags = trun->first_sample_flags;
+ } else if (traf->
+ tfhd.flags & GST_TFHD_FLAGS_DEFAULT_SAMPLE_FLAGS_PRESENT) {
+ sample_flags = traf->tfhd.default_sample_flags;
+ } else {
+ trex_sample_flags = TRUE;
+ continue;
+ }
+
+#if 0
+ if (trun->flags & GST_TRUN_FLAGS_SAMPLE_DURATION_PRESENT) {
+ sample_duration = sample->sample_duration;
+ } else if (traf->
+ tfhd.flags & GST_TFHD_FLAGS_DEFAULT_SAMPLE_DURATION_PRESENT) {
+ sample_duration = traf->tfhd.default_sample_duration;
+ } else {
+ GST_FIXME_OBJECT (stream->pad,
+ "Sample duration given by trex - can't download only keyframes");
+ g_array_free (dash_stream->moof_sync_samples, TRUE);
+ dash_stream->moof_sync_samples = NULL;
+ return FALSE;
+ }
+#endif
+
+ if (trun->flags & GST_TRUN_FLAGS_SAMPLE_SIZE_PRESENT) {
+ prev_sample_end += sample->sample_size;
+ } else if (traf->
+ tfhd.flags & GST_TFHD_FLAGS_DEFAULT_SAMPLE_SIZE_PRESENT) {
+ prev_sample_end += traf->tfhd.default_sample_size;
+ } else {
+ GST_FIXME_OBJECT (stream->pad,
+ "Sample size given by trex - can't download only keyframes");
+ g_array_free (dash_stream->moof_sync_samples, TRUE);
+ dash_stream->moof_sync_samples = NULL;
+ dashdemux->allow_trickmode_key_units = FALSE;
+ return FALSE;
+ }
+
+ /* Non-non-sync sample aka sync sample */
+ if (!GST_ISOFF_SAMPLE_FLAGS_SAMPLE_IS_NON_SYNC_SAMPLE (sample_flags) ||
+ GST_ISOFF_SAMPLE_FLAGS_SAMPLE_DEPENDS_ON (sample_flags) == 2) {
+ GstDashStreamSyncSample sync_sample =
+ { sample_offset, prev_sample_end - 1 };
+ /* TODO: need timestamps so we can decide to download or not */
+ g_array_append_val (dash_stream->moof_sync_samples, sync_sample);
+ }
+ }
+
+ prev_trun_end = prev_sample_end;
+ }
+
+ prev_traf_end = prev_trun_end;
+ }
+
+ if (trex_sample_flags) {
+ if (dash_stream->moof_sync_samples->len > 0) {
+ GST_LOG_OBJECT (stream->pad,
+ "Some sample flags given by trex but still found sync samples");
+ } else {
+ GST_FIXME_OBJECT (stream->pad,
+ "Sample flags given by trex - can't download only keyframes");
+ g_array_free (dash_stream->moof_sync_samples, TRUE);
+ dash_stream->moof_sync_samples = NULL;
+ dashdemux->allow_trickmode_key_units = FALSE;
+ return FALSE;
+ }
+ }
+
+ if (dash_stream->moof_sync_samples->len == 0) {
+ GST_LOG_OBJECT (stream->pad, "No sync samples found in fragment");
+ g_array_free (dash_stream->moof_sync_samples, TRUE);
+ dash_stream->moof_sync_samples = NULL;
+ dashdemux->allow_trickmode_key_units = FALSE;
+ return FALSE;
+ }
+
+ {
+ GstDashStreamSyncSample *sync_sample =
+ &g_array_index (dash_stream->moof_sync_samples, GstDashStreamSyncSample,
+ 0);
+ guint size = sync_sample->end_offset + 1 - sync_sample->start_offset;
+
+ if (dash_stream->first_sync_sample_average_size) {
+ if (dash_stream->first_sync_sample_average_size < size)
+ dash_stream->first_sync_sample_average_size =
+ (size * 3 + dash_stream->first_sync_sample_average_size) / 4;
+ else
+ dash_stream->first_sync_sample_average_size =
+ (size + dash_stream->first_sync_sample_average_size * 3) / 4;
+ } else {
+ dash_stream->first_sync_sample_average_size = size;
+ }
+
+ if (dash_stream->moof_offset + dash_stream->moof_size + 8 <
+ sync_sample->start_offset) {
+ dash_stream->first_sync_sample_after_moof = FALSE;
+ dash_stream->first_sync_sample_always_after_moof = FALSE;
+ } else {
+ dash_stream->first_sync_sample_after_moof =
+ (dash_stream->moof_sync_samples->len == 1
+ || demux->segment.rate > 0.0);
+ }
+ }
+
+ return TRUE;
+}
+
+
+static GstFlowReturn
+gst_dash_demux_handle_isobmff_buffer (GstAdaptiveDemux * demux,
+ GstAdaptiveDemuxStream * stream, GstBuffer * buffer)
+{
GstDashDemuxStream *dash_stream = (GstDashDemuxStream *) stream;
GstDashDemux *dashdemux = GST_DASH_DEMUX_CAST (demux);
GstFlowReturn ret = GST_FLOW_OK;
- GstBuffer *buffer;
- gsize available;
- if (!gst_mpd_client_has_isoff_ondemand_profile (dashdemux->client))
- return GST_ADAPTIVE_DEMUX_CLASS (parent_class)->data_received (demux,
- stream);
+ if (dashdemux->allow_trickmode_key_units) {
+ if (dash_stream->isobmff_parser.current_fourcc != GST_ISOFF_FOURCC_MDAT) {
+ buffer = gst_dash_demux_parse_isobmff (demux, dash_stream, buffer);
+
+ if (buffer
+ && (ret =
+ gst_adaptive_demux_stream_push_buffer (stream,
+ buffer)) != GST_FLOW_OK)
+ return ret;
+ if (dash_stream->isobmff_parser.current_fourcc != GST_ISOFF_FOURCC_MDAT)
+ return ret;
+
+ /* Jump to the next sync sample. As we're doing chunked downloading
+ * here, just drop data until our chunk is over so we can reuse the
+ * HTTP connection instead of having to create a new one or
+ * reuse the data if the sync sample follows the moof */
+ if (dash_stream->active_stream->mimeType == GST_STREAM_VIDEO
+ && gst_dash_demux_find_sync_samples (demux, stream) &&
+ GST_ADAPTIVE_DEMUX (stream->demux)->
+ segment.flags & GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS) {
+
+ if (dash_stream->first_sync_sample_after_moof) {
+ /* If we're here, don't throw away data but collect sync
+ * sample while we're at it below. We're doing chunked
+ * downloading so might need to adjust the next chunk size for
+ * the remainder */
+ dash_stream->current_sync_sample = 0;
+ } else {
+ gst_adapter_clear (dash_stream->isobmff_adapter);
+ }
+ }
+
+ if (gst_adapter_available (dash_stream->isobmff_adapter) == 0)
+ return ret;
+
+ /* We have some data from the mdat available in the adapter, handle it
+ * below in the push code */
+ buffer =
+ gst_adapter_take_buffer (dash_stream->isobmff_adapter,
+ gst_adapter_available (dash_stream->isobmff_adapter));
+ } else {
+ if (dash_stream->isobmff_parser.current_offset == -1) {
+ dash_stream->isobmff_parser.current_offset =
+ GST_BUFFER_OFFSET_IS_VALID (buffer) ? GST_BUFFER_OFFSET (buffer) :
+ 0;
+ }
+ }
+
+ /* At mdat and isobmff and trick modes are allowed */
+
+ /* We're actually running in key-units trick mode */
+ if (dash_stream->active_stream->mimeType == GST_STREAM_VIDEO
+ && dash_stream->moof_sync_samples
+ && GST_ADAPTIVE_DEMUX (stream->demux)->
+ segment.flags & GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS) {
+
+ if (dash_stream->current_sync_sample == -1) {
+ /* We're doing chunked downloading and wait for finishing the current
+ * chunk so we can jump to the first keyframe */
+ gst_buffer_unref (buffer);
+ return GST_FLOW_OK;
+ } else if (dash_stream->first_sync_sample_after_moof
+ && dash_stream->current_sync_sample == 0) {
+ GstDashStreamSyncSample *sync_sample =
+ &g_array_index (dash_stream->moof_sync_samples,
+ GstDashStreamSyncSample, 0);
+ guint64 end_offset =
+ dash_stream->isobmff_parser.current_offset +
+ gst_buffer_get_size (buffer);
+
+ /* If the first keyframe follows directly the moof and we're
+ * downloading it here, make sure to not download too much */
+
+ if (end_offset > sync_sample->end_offset + 1) {
+ guint64 remaining =
+ sync_sample->end_offset + 1 -
+ dash_stream->isobmff_parser.current_offset;
+
+ if (remaining) {
+ GstBuffer *sub =
+ gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, 0,
+ remaining);
+ gst_buffer_unref (buffer);
+ buffer = sub;
+ } else {
+ gst_buffer_unref (buffer);
+ return GST_FLOW_OK;
+ }
+ }
+ }
+ }
+
+ GST_BUFFER_OFFSET (buffer) = dash_stream->isobmff_parser.current_offset;
+ dash_stream->isobmff_parser.current_offset += gst_buffer_get_size (buffer);
+ GST_BUFFER_OFFSET_END (buffer) = dash_stream->isobmff_parser.current_offset;
+ }
+
+ return gst_adaptive_demux_stream_push_buffer (stream, buffer);
+}
+
+static GstFlowReturn
+gst_dash_demux_data_received (GstAdaptiveDemux * demux,
+ GstAdaptiveDemuxStream * stream, GstBuffer * buffer)
+{
+ GstDashDemuxStream *dash_stream = (GstDashDemuxStream *) stream;
+ GstDashDemux *dashdemux = GST_DASH_DEMUX_CAST (demux);
+ GstFlowReturn ret = GST_FLOW_OK;
+ guint index_header_or_data;
+
+ if (!gst_mpd_client_has_isoff_ondemand_profile (dashdemux->client)) {
+ if (dash_stream->is_isobmff)
+ return gst_dash_demux_handle_isobmff_buffer (demux, stream, buffer);
+ else
+ return gst_adaptive_demux_stream_push_buffer (stream, buffer);
+ }
+
+ if (stream->downloading_index)
+ index_header_or_data = 1;
+ else if (stream->downloading_header)
+ index_header_or_data = 2;
+ else
+ index_header_or_data = 3;
+
+ if (dash_stream->sidx_index_header_or_data != index_header_or_data) {
+ /* Clear pending data */
+ if (gst_adapter_available (dash_stream->sidx_adapter) != 0)
+ GST_ERROR_OBJECT (stream->pad,
+ "Had pending SIDX data after switch between index/header/data");
+ gst_adapter_clear (dash_stream->sidx_adapter);
+ dash_stream->sidx_index_header_or_data = index_header_or_data;
+ dash_stream->sidx_current_offset = -1;
+ }
+
+ if (dash_stream->sidx_current_offset == -1)
+ dash_stream->sidx_current_offset =
+ GST_BUFFER_OFFSET_IS_VALID (buffer) ? GST_BUFFER_OFFSET (buffer) : 0;
+
+ gst_adapter_push (dash_stream->sidx_adapter, buffer);
+ buffer = NULL;
if (stream->downloading_index) {
GstIsoffParserResult res;
guint consumed;
+ gsize available;
- available = gst_adapter_available (stream->adapter);
- buffer = gst_adapter_take_buffer (stream->adapter, available);
+ available = gst_adapter_available (dash_stream->sidx_adapter);
+ buffer = gst_adapter_take_buffer (dash_stream->sidx_adapter, available);
if (dash_stream->sidx_parser.status != GST_ISOFF_SIDX_PARSER_FINISHED) {
res =
@@ -1666,52 +2570,97 @@
} else {
SIDX (dash_stream)->entry_index = dash_stream->sidx_index;
}
- dash_stream->sidx_current_remaining =
- SIDX_CURRENT_ENTRY (dash_stream)->size;
} else if (consumed < available) {
GstBuffer *pending;
/* we still need to keep some data around for the next parsing round
* so just push what was already processed by the parser */
pending = _gst_buffer_split (buffer, consumed, -1);
- gst_adapter_push (stream->adapter, pending);
+ gst_adapter_push (dash_stream->sidx_adapter, pending);
}
}
}
+ GST_BUFFER_OFFSET (buffer) = dash_stream->sidx_current_offset;
+ GST_BUFFER_OFFSET_END (buffer) =
+ GST_BUFFER_OFFSET (buffer) + gst_buffer_get_size (buffer);
+ dash_stream->sidx_current_offset = GST_BUFFER_OFFSET_END (buffer);
ret = gst_adaptive_demux_stream_push_buffer (stream, buffer);
} else if (dash_stream->sidx_parser.status == GST_ISOFF_SIDX_PARSER_FINISHED) {
+ gsize available;
while (ret == GST_FLOW_OK
- && ((available = gst_adapter_available (stream->adapter)) > 0)) {
+ && ((available =
+ gst_adapter_available (dash_stream->sidx_adapter)) > 0)) {
gboolean advance = FALSE;
+ guint64 sidx_end_offset =
+ dash_stream->sidx_base_offset +
+ SIDX_CURRENT_ENTRY (dash_stream)->offset +
+ SIDX_CURRENT_ENTRY (dash_stream)->size;
- if (available < dash_stream->sidx_current_remaining) {
- buffer = gst_adapter_take_buffer (stream->adapter, available);
- dash_stream->sidx_current_remaining -= available;
+ if (dash_stream->sidx_current_offset + available < sidx_end_offset) {
+ buffer = gst_adapter_take_buffer (dash_stream->sidx_adapter, available);
} else {
- buffer =
- gst_adapter_take_buffer (stream->adapter,
- dash_stream->sidx_current_remaining);
- dash_stream->sidx_current_remaining = 0;
- advance = TRUE;
+ /* In key-units mode, we advance the fragments manually once the
+ * current key-unit is over but throw away all data that is after
+ * the current sidx entry end */
+ if (dash_stream->moof_sync_samples
+ && (GST_ADAPTIVE_DEMUX (stream->demux)->
+ segment.flags & GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS)) {
+ if (sidx_end_offset <= dash_stream->sidx_current_offset) {
+ buffer = NULL;
+ gst_adapter_clear (dash_stream->sidx_adapter);
+ } else {
+ buffer =
+ gst_adapter_take_buffer (dash_stream->sidx_adapter,
+ sidx_end_offset - dash_stream->sidx_current_offset);
+ }
+ } else {
+ buffer =
+ gst_adapter_take_buffer (dash_stream->sidx_adapter,
+ sidx_end_offset - dash_stream->sidx_current_offset);
+ advance = TRUE;
+ }
}
- ret = gst_adaptive_demux_stream_push_buffer (stream, buffer);
- if (advance) {
- GstFlowReturn new_ret;
- new_ret =
- gst_adaptive_demux_stream_advance_fragment (demux, stream,
- SIDX_CURRENT_ENTRY (dash_stream)->duration);
- /* only overwrite if it was OK before */
- if (ret == GST_FLOW_OK)
- ret = new_ret;
+ if (buffer != NULL) {
+ GST_BUFFER_OFFSET (buffer) = dash_stream->sidx_current_offset;
+ GST_BUFFER_OFFSET_END (buffer) =
+ GST_BUFFER_OFFSET (buffer) + gst_buffer_get_size (buffer);
+ dash_stream->sidx_current_offset = GST_BUFFER_OFFSET_END (buffer);
+
+ if (dash_stream->is_isobmff)
+ ret = gst_dash_demux_handle_isobmff_buffer (demux, stream, buffer);
+ else
+ ret = gst_adaptive_demux_stream_push_buffer (stream, buffer);
+
+ if (!(dash_stream->moof_sync_samples
+ && (GST_ADAPTIVE_DEMUX (stream->demux)->
+ segment.flags & GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS))
+ && advance) {
+ GstFlowReturn new_ret;
+ new_ret =
+ gst_adaptive_demux_stream_advance_fragment (demux, stream,
+ SIDX_CURRENT_ENTRY (dash_stream)->duration);
+
+ /* only overwrite if it was OK before */
+ if (ret == GST_FLOW_OK)
+ ret = new_ret;
+ }
}
}
} else {
/* this should be the main header, just push it all */
- ret =
- gst_adaptive_demux_stream_push_buffer (stream,
- gst_adapter_take_buffer (stream->adapter,
- gst_adapter_available (stream->adapter)));
+ buffer = gst_adapter_take_buffer (dash_stream->sidx_adapter,
+ gst_adapter_available (dash_stream->sidx_adapter));
+
+ GST_BUFFER_OFFSET (buffer) = dash_stream->sidx_current_offset;
+ GST_BUFFER_OFFSET_END (buffer) =
+ GST_BUFFER_OFFSET (buffer) + gst_buffer_get_size (buffer);
+ dash_stream->sidx_current_offset = GST_BUFFER_OFFSET_END (buffer);
+
+ if (dash_stream->is_isobmff)
+ return gst_dash_demux_handle_isobmff_buffer (demux, stream, buffer);
+ else
+ return gst_adaptive_demux_stream_push_buffer (stream, buffer);
}
return ret;
@@ -1723,16 +2672,22 @@
GstDashDemuxStream *dash_stream = (GstDashDemuxStream *) stream;
gst_isoff_sidx_parser_clear (&dash_stream->sidx_parser);
+ if (dash_stream->sidx_adapter)
+ g_object_unref (dash_stream->sidx_adapter);
+ if (dash_stream->isobmff_adapter)
+ g_object_unref (dash_stream->isobmff_adapter);
}
static GstDashDemuxClockDrift *
-gst_dash_demux_clock_drift_new (void)
+gst_dash_demux_clock_drift_new (GstDashDemux * demux)
{
GstDashDemuxClockDrift *clock_drift;
clock_drift = g_slice_new0 (GstDashDemuxClockDrift);
g_mutex_init (&clock_drift->clock_lock);
- clock_drift->next_update = g_get_monotonic_time ();
+ clock_drift->next_update =
+ GST_TIME_AS_USECONDS (gst_adaptive_demux_get_monotonic_time
+ (GST_ADAPTIVE_DEMUX_CAST (demux)));
return clock_drift;
}
@@ -2021,7 +2976,9 @@
g_return_val_if_fail (demux != NULL, FALSE);
g_return_val_if_fail (demux->clock_drift != NULL, FALSE);
clock_drift = demux->clock_drift;
- now = g_get_monotonic_time ();
+ now =
+ GST_TIME_AS_USECONDS (gst_adaptive_demux_get_monotonic_time
+ (GST_ADAPTIVE_DEMUX_CAST (demux)));
if (now < clock_drift->next_update) {
/*TODO: If a fragment fails to download in adaptivedemux, it waits
for a manifest reload before another attempt to fetch a fragment.
@@ -2051,7 +3008,8 @@
goto quit;
}
}
- start = g_date_time_new_now_utc ();
+ start =
+ gst_adaptive_demux_get_client_now_utc (GST_ADAPTIVE_DEMUX_CAST (demux));
if (!value) {
GstFragment *download;
gint64 range_start = 0, range_end = -1;
@@ -2079,7 +3037,7 @@
urls[clock_drift->selected_url]);
goto quit;
}
- end = g_date_time_new_now_utc ();
+ end = gst_adaptive_demux_get_client_now_utc (GST_ADAPTIVE_DEMUX_CAST (demux));
if (!value && method == GST_MPD_UTCTIMING_TYPE_HTTP_NTP) {
value = gst_dash_demux_parse_http_ntp (clock_drift, buffer);
} else if (!value) {
@@ -2156,8 +3114,13 @@
static GDateTime *
gst_dash_demux_get_server_now_utc (GstDashDemux * demux)
{
- GDateTime *client_now = g_date_time_new_now_utc ();
- GDateTime *server_now = g_date_time_add (client_now,
+ GDateTime *client_now;
+ GDateTime *server_now;
+
+ client_now =
+ gst_adaptive_demux_get_client_now_utc (GST_ADAPTIVE_DEMUX_CAST (demux));
+ server_now =
+ g_date_time_add (client_now,
gst_dash_demux_get_clock_compensation (demux));
g_date_time_unref (client_now);
return server_now;
diff --git a/ext/dash/gstdashdemux.h b/ext/dash/gstdashdemux.h
index 5ed9620..0757d76 100644
--- a/ext/dash/gstdashdemux.h
+++ b/ext/dash/gstdashdemux.h
@@ -67,11 +67,35 @@
GstMediaFragmentInfo current_fragment;
/* index parsing */
+ GstAdapter *sidx_adapter;
GstSidxParser sidx_parser;
- gsize sidx_current_remaining;
gint sidx_index;
gint64 sidx_base_offset;
GstClockTime pending_seek_ts;
+ /* sidx offset tracking */
+ guint64 sidx_current_offset;
+ /* index = 1, header = 2, data = 3 */
+ guint sidx_index_header_or_data;
+
+ /* ISOBMFF box parsing */
+ gboolean is_isobmff;
+ GstAdapter *isobmff_adapter;
+ struct {
+ /* index = 1, header = 2, data = 3 */
+ guint index_header_or_data;
+ guint32 current_fourcc;
+ guint64 current_start_offset;
+ guint64 current_offset;
+ guint64 current_size;
+ } isobmff_parser;
+
+ GstMoofBox *moof;
+ guint64 moof_offset, moof_size;
+ GArray *moof_sync_samples;
+ guint current_sync_sample;
+
+ guint64 moof_average_size, first_sync_sample_average_size;
+ gboolean first_sync_sample_after_moof, first_sync_sample_always_after_moof;
};
/**
@@ -96,11 +120,16 @@
/* Properties */
GstClockTime max_buffering_time; /* Maximum buffering time accumulated during playback */
guint64 max_bitrate; /* max of bitrate supported by target decoder */
+ gint max_video_width, max_video_height;
+ gint max_video_framerate_n, max_video_framerate_d;
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;
+
+ gboolean trickmode_no_audio;
+ gboolean allow_trickmode_key_units;
};
struct _GstDashDemuxClass
diff --git a/ext/dash/gstisoff.c b/ext/dash/gstisoff.c
index 3c30393..38e3ddc 100644
--- a/ext/dash/gstisoff.c
+++ b/ext/dash/gstisoff.c
@@ -25,6 +25,328 @@
#include "gstisoff.h"
#include <gst/base/gstbytereader.h>
+#include <string.h>
+
+/* gst_isoff_parse_box:
+ * @reader:
+ * @type: type that was found at the current position
+ * @extended_type: (allow-none): extended type if type=='uuid'
+ * @header_size: (allow-none): size of the box header (type, extended type and size)
+ * @size: size of the complete box including type, extended type and size
+ *
+ * Advances the byte reader to the start of the box content. To skip
+ * over the complete box, skip size - header_size bytes.
+ *
+ * Returns: TRUE if a box header could be parsed, FALSE if more data is needed
+ */
+gboolean
+gst_isoff_parse_box_header (GstByteReader * reader, guint32 * type,
+ guint8 extended_type[16], guint * header_size, guint64 * size)
+{
+ guint header_start_offset;
+ guint32 size_field;
+
+ header_start_offset = gst_byte_reader_get_pos (reader);
+
+ if (gst_byte_reader_get_remaining (reader) < 8)
+ goto not_enough_data;
+
+ size_field = gst_byte_reader_get_uint32_be_unchecked (reader);
+ *type = gst_byte_reader_get_uint32_le_unchecked (reader);
+
+ if (size_field == 1) {
+ if (gst_byte_reader_get_remaining (reader) < 8)
+ goto not_enough_data;
+ *size = gst_byte_reader_get_uint64_be_unchecked (reader);
+ } else {
+ *size = size_field;
+ }
+
+ if (*type == GST_ISOFF_FOURCC_UUID) {
+ if (gst_byte_reader_get_remaining (reader) < 16)
+ goto not_enough_data;
+
+ if (extended_type)
+ memcpy (extended_type, gst_byte_reader_get_data_unchecked (reader, 16),
+ 16);
+ }
+
+ if (header_size)
+ *header_size = gst_byte_reader_get_pos (reader) - header_start_offset;
+
+ return TRUE;
+
+not_enough_data:
+ gst_byte_reader_set_pos (reader, header_start_offset);
+ return FALSE;
+}
+
+static void
+gst_isoff_trun_box_clear (GstTrunBox * trun)
+{
+ if (trun->samples)
+ g_array_free (trun->samples, TRUE);
+}
+
+static void
+gst_isoff_traf_box_clear (GstTrafBox * traf)
+{
+ if (traf->trun)
+ g_array_free (traf->trun, TRUE);
+}
+
+static gboolean
+gst_isoff_mfhd_box_parse (GstMfhdBox * mfhd, GstByteReader * reader)
+{
+ guint8 version;
+ guint32 flags;
+
+ if (gst_byte_reader_get_remaining (reader) != 8)
+ return FALSE;
+
+ version = gst_byte_reader_get_uint8_unchecked (reader);
+ if (version != 0)
+ return FALSE;
+
+ flags = gst_byte_reader_get_uint24_be_unchecked (reader);
+ if (flags != 0)
+ return FALSE;
+
+ mfhd->sequence_number = gst_byte_reader_get_uint32_be_unchecked (reader);
+
+ return TRUE;
+}
+
+static gboolean
+gst_isoff_tfhd_box_parse (GstTfhdBox * tfhd, GstByteReader * reader)
+{
+ memset (tfhd, 0, sizeof (*tfhd));
+
+ if (gst_byte_reader_get_remaining (reader) < 4)
+ return FALSE;
+
+ tfhd->version = gst_byte_reader_get_uint8_unchecked (reader);
+ if (tfhd->version != 0)
+ return FALSE;
+
+ tfhd->flags = gst_byte_reader_get_uint24_be_unchecked (reader);
+
+ if (!gst_byte_reader_get_uint32_be (reader, &tfhd->track_id))
+ return FALSE;
+
+ if ((tfhd->flags & GST_TFHD_FLAGS_BASE_DATA_OFFSET_PRESENT) &&
+ !gst_byte_reader_get_uint64_be (reader, &tfhd->base_data_offset))
+ return FALSE;
+
+ if ((tfhd->flags & GST_TFHD_FLAGS_SAMPLE_DESCRIPTION_INDEX_PRESENT) &&
+ !gst_byte_reader_get_uint32_be (reader, &tfhd->sample_description_index))
+ return FALSE;
+
+ if ((tfhd->flags & GST_TFHD_FLAGS_DEFAULT_SAMPLE_DURATION_PRESENT) &&
+ !gst_byte_reader_get_uint32_be (reader, &tfhd->default_sample_duration))
+ return FALSE;
+
+ if ((tfhd->flags & GST_TFHD_FLAGS_DEFAULT_SAMPLE_SIZE_PRESENT) &&
+ !gst_byte_reader_get_uint32_be (reader, &tfhd->default_sample_size))
+ return FALSE;
+
+ if ((tfhd->flags & GST_TFHD_FLAGS_DEFAULT_SAMPLE_FLAGS_PRESENT) &&
+ !gst_byte_reader_get_uint32_be (reader, &tfhd->default_sample_flags))
+ return FALSE;
+
+ return TRUE;
+}
+
+static gboolean
+gst_isoff_trun_box_parse (GstTrunBox * trun, GstByteReader * reader)
+{
+ gint i;
+
+ memset (trun, 0, sizeof (*trun));
+
+ if (gst_byte_reader_get_remaining (reader) < 4)
+ return FALSE;
+
+ trun->version = gst_byte_reader_get_uint8_unchecked (reader);
+ if (trun->version != 0 && trun->version != 1)
+ return FALSE;
+
+ trun->flags = gst_byte_reader_get_uint24_be_unchecked (reader);
+
+ if (!gst_byte_reader_get_uint32_be (reader, &trun->sample_count))
+ return FALSE;
+
+ trun->samples =
+ g_array_sized_new (FALSE, FALSE, sizeof (GstTrunSample),
+ trun->sample_count);
+
+ if ((trun->flags & GST_TRUN_FLAGS_DATA_OFFSET_PRESENT) &&
+ !gst_byte_reader_get_uint32_be (reader, (guint32 *) & trun->data_offset))
+ return FALSE;
+
+ if ((trun->flags & GST_TRUN_FLAGS_FIRST_SAMPLE_FLAGS_PRESENT) &&
+ !gst_byte_reader_get_uint32_be (reader, &trun->first_sample_flags))
+ return FALSE;
+
+ for (i = 0; i < trun->sample_count; i++) {
+ GstTrunSample sample = { 0, };
+
+ if ((trun->flags & GST_TRUN_FLAGS_SAMPLE_DURATION_PRESENT) &&
+ !gst_byte_reader_get_uint32_be (reader, &sample.sample_duration))
+ goto error;
+
+ if ((trun->flags & GST_TRUN_FLAGS_SAMPLE_SIZE_PRESENT) &&
+ !gst_byte_reader_get_uint32_be (reader, &sample.sample_size))
+ goto error;
+
+ if ((trun->flags & GST_TRUN_FLAGS_SAMPLE_FLAGS_PRESENT) &&
+ !gst_byte_reader_get_uint32_be (reader, &sample.sample_flags))
+ goto error;
+
+ if ((trun->flags & GST_TRUN_FLAGS_SAMPLE_COMPOSITION_TIME_OFFSETS_PRESENT)
+ && !gst_byte_reader_get_uint32_be (reader,
+ &sample.sample_composition_time_offset.u))
+ goto error;
+
+ g_array_append_val (trun->samples, sample);
+ }
+
+ return TRUE;
+
+error:
+ gst_isoff_trun_box_clear (trun);
+ return FALSE;
+}
+
+static gboolean
+gst_isoff_traf_box_parse (GstTrafBox * traf, GstByteReader * reader)
+{
+ gboolean had_tfhd = FALSE;
+
+ memset (traf, 0, sizeof (*traf));
+ traf->trun = g_array_new (FALSE, FALSE, sizeof (GstTrunBox));
+ g_array_set_clear_func (traf->trun,
+ (GDestroyNotify) gst_isoff_trun_box_clear);
+
+ while (gst_byte_reader_get_remaining (reader) > 0) {
+ guint32 fourcc;
+ guint header_size;
+ guint64 size;
+
+ if (!gst_isoff_parse_box_header (reader, &fourcc, NULL, &header_size,
+ &size))
+ goto error;
+ if (gst_byte_reader_get_remaining (reader) < size - header_size)
+ goto error;
+
+ switch (fourcc) {
+ case GST_ISOFF_FOURCC_TFHD:{
+ GstByteReader sub_reader;
+
+ gst_byte_reader_get_sub_reader (reader, &sub_reader,
+ size - header_size);
+ if (!gst_isoff_tfhd_box_parse (&traf->tfhd, &sub_reader))
+ goto error;
+ had_tfhd = TRUE;
+ break;
+ }
+ case GST_ISOFF_FOURCC_TRUN:{
+ GstByteReader sub_reader;
+ GstTrunBox trun;
+
+ gst_byte_reader_get_sub_reader (reader, &sub_reader,
+ size - header_size);
+ if (!gst_isoff_trun_box_parse (&trun, &sub_reader))
+ goto error;
+
+ g_array_append_val (traf->trun, trun);
+ break;
+ }
+ default:
+ gst_byte_reader_skip (reader, size - header_size);
+ break;
+ }
+ }
+
+ if (!had_tfhd)
+ goto error;
+
+ return TRUE;
+
+error:
+ gst_isoff_traf_box_clear (traf);
+
+ return FALSE;
+}
+
+GstMoofBox *
+gst_isoff_moof_box_parse (GstByteReader * reader)
+{
+ GstMoofBox *moof;
+ gboolean had_mfhd = FALSE;
+
+ moof = g_new0 (GstMoofBox, 1);
+ moof->traf = g_array_new (FALSE, FALSE, sizeof (GstTrafBox));
+ g_array_set_clear_func (moof->traf,
+ (GDestroyNotify) gst_isoff_traf_box_clear);
+
+ while (gst_byte_reader_get_remaining (reader) > 0) {
+ guint32 fourcc;
+ guint header_size;
+ guint64 size;
+
+ if (!gst_isoff_parse_box_header (reader, &fourcc, NULL, &header_size,
+ &size))
+ goto error;
+ if (gst_byte_reader_get_remaining (reader) < size - header_size)
+ goto error;
+
+ switch (fourcc) {
+ case GST_ISOFF_FOURCC_MFHD:{
+ GstByteReader sub_reader;
+
+ gst_byte_reader_get_sub_reader (reader, &sub_reader,
+ size - header_size);
+ if (!gst_isoff_mfhd_box_parse (&moof->mfhd, &sub_reader))
+ goto error;
+ had_mfhd = TRUE;
+ break;
+ }
+ case GST_ISOFF_FOURCC_TRAF:{
+ GstByteReader sub_reader;
+ GstTrafBox traf;
+
+ gst_byte_reader_get_sub_reader (reader, &sub_reader,
+ size - header_size);
+ if (!gst_isoff_traf_box_parse (&traf, &sub_reader))
+ goto error;
+
+ g_array_append_val (moof->traf, traf);
+ break;
+ }
+ default:
+ gst_byte_reader_skip (reader, size - header_size);
+ break;
+ }
+ }
+
+ if (!had_mfhd)
+ goto error;
+
+ return moof;
+
+error:
+ gst_isoff_moof_box_free (moof);
+ return NULL;
+}
+
+void
+gst_isoff_moof_box_free (GstMoofBox * moof)
+{
+ g_array_free (moof->traf, TRUE);
+ g_free (moof);
+}
+
void
gst_isoff_sidx_parser_init (GstSidxParser * parser)
{
@@ -75,30 +397,27 @@
switch (parser->status) {
case GST_ISOFF_SIDX_PARSER_INIT:
- if (gst_byte_reader_get_remaining (&reader) < GST_ISOFF_FULL_BOX_SIZE) {
+ if (!gst_isoff_parse_box_header (&reader, &fourcc, NULL, NULL,
+ &parser->size))
break;
- }
- parser->size = gst_byte_reader_get_uint32_be_unchecked (&reader);
- fourcc = gst_byte_reader_get_uint32_le_unchecked (&reader);
if (fourcc != GST_ISOFF_FOURCC_SIDX) {
res = GST_ISOFF_PARSER_UNEXPECTED;
gst_byte_reader_set_pos (&reader, 0);
break;
}
- if (parser->size == 1) {
- if (gst_byte_reader_get_remaining (&reader) < 12) {
- gst_byte_reader_set_pos (&reader, 0);
- break;
- }
- parser->size = gst_byte_reader_get_uint64_be_unchecked (&reader);
- }
if (parser->size == 0) {
res = GST_ISOFF_PARSER_ERROR;
gst_byte_reader_set_pos (&reader, 0);
break;
}
+
+ /* Try again once we have enough data for the FullBox header */
+ if (gst_byte_reader_get_remaining (&reader) < 4) {
+ gst_byte_reader_set_pos (&reader, 0);
+ break;
+ }
parser->sidx.version = gst_byte_reader_get_uint8_unchecked (&reader);
parser->sidx.flags = gst_byte_reader_get_uint24_le_unchecked (&reader);
diff --git a/ext/dash/gstisoff.h b/ext/dash/gstisoff.h
index e535c69..ca7663a 100644
--- a/ext/dash/gstisoff.h
+++ b/ext/dash/gstisoff.h
@@ -26,6 +26,7 @@
#define __GST_ISOFF_H__
#include <gst/gst.h>
+#include <gst/base/base.h>
G_BEGIN_DECLS
@@ -36,11 +37,106 @@
GST_ISOFF_PARSER_ERROR
} GstIsoffParserResult;
-/* this is the minimum size, it can be larger if it
- * uses extended size or type */
-#define GST_ISOFF_FULL_BOX_SIZE 12
+gboolean gst_isoff_parse_box_header (GstByteReader * reader, guint32 * type, guint8 extended_type[16], guint * header_size, guint64 * size);
+#define GST_ISOFF_FOURCC_UUID GST_MAKE_FOURCC('u','u','i','d')
+#define GST_ISOFF_FOURCC_MOOF GST_MAKE_FOURCC('m','o','o','f')
+#define GST_ISOFF_FOURCC_MFHD GST_MAKE_FOURCC('m','f','h','d')
+#define GST_ISOFF_FOURCC_TFHD GST_MAKE_FOURCC('t','f','h','d')
+#define GST_ISOFF_FOURCC_TRUN GST_MAKE_FOURCC('t','r','u','n')
+#define GST_ISOFF_FOURCC_TRAF GST_MAKE_FOURCC('t','r','a','f')
+#define GST_ISOFF_FOURCC_MDAT GST_MAKE_FOURCC('m','d','a','t')
#define GST_ISOFF_FOURCC_SIDX GST_MAKE_FOURCC('s','i','d','x')
+
+#define GST_ISOFF_SAMPLE_FLAGS_IS_LEADING(flags) (((flags) >> 26) & 0x03)
+#define GST_ISOFF_SAMPLE_FLAGS_SAMPLE_DEPENDS_ON(flags) (((flags) >> 24) & 0x03)
+#define GST_ISOFF_SAMPLE_FLAGS_SAMPLE_IS_DEPENDED_ON(flags) (((flags) >> 22) & 0x03)
+#define GST_ISOFF_SAMPLE_FLAGS_SAMPLE_HAS_REDUNDANCY(flags) (((flags) >> 20) & 0x03)
+#define GST_ISOFF_SAMPLE_FLAGS_SAMPLE_PADDING_VALUE(flags) (((flags) >> 17) & 0x07)
+#define GST_ISOFF_SAMPLE_FLAGS_SAMPLE_IS_NON_SYNC_SAMPLE(flags) (((flags) >> 16) & 0x01)
+#define GST_ISOFF_SAMPLE_FLAGS_SAMPLE_DEGRADATION_PRIORITY(flags) (((flags) >> 0) & 0x0f)
+
+typedef struct _GstMfhdBox
+{
+ guint32 sequence_number;
+} GstMfhdBox;
+
+typedef enum
+{
+ GST_TFHD_FLAGS_BASE_DATA_OFFSET_PRESENT = 0x000001,
+ GST_TFHD_FLAGS_SAMPLE_DESCRIPTION_INDEX_PRESENT = 0x000002,
+ GST_TFHD_FLAGS_DEFAULT_SAMPLE_DURATION_PRESENT = 0x000008,
+ GST_TFHD_FLAGS_DEFAULT_SAMPLE_SIZE_PRESENT = 0x000010,
+ GST_TFHD_FLAGS_DEFAULT_SAMPLE_FLAGS_PRESENT = 0x000020,
+ GST_TFHD_FLAGS_DURATION_IS_EMPTY = 0x010000,
+ GST_TFHD_FLAGS_DEFAULT_BASE_IS_MOOF = 0x020000
+} GstTfhdFlags;
+
+typedef struct _GstTfhdBox
+{
+ guint8 version;
+ GstTfhdFlags flags;
+
+ guint32 track_id;
+
+ /* optional */
+ guint64 base_data_offset;
+ guint32 sample_description_index;
+ guint32 default_sample_duration;
+ guint32 default_sample_size;
+ guint32 default_sample_flags;
+} GstTfhdBox;
+
+typedef enum
+{
+ GST_TRUN_FLAGS_DATA_OFFSET_PRESENT = 0x000001,
+ GST_TRUN_FLAGS_FIRST_SAMPLE_FLAGS_PRESENT = 0x000004,
+ GST_TRUN_FLAGS_SAMPLE_DURATION_PRESENT = 0x000100,
+ GST_TRUN_FLAGS_SAMPLE_SIZE_PRESENT = 0x000200,
+ GST_TRUN_FLAGS_SAMPLE_FLAGS_PRESENT = 0x000400,
+ GST_TRUN_FLAGS_SAMPLE_COMPOSITION_TIME_OFFSETS_PRESENT = 0x000800
+} GstTrunFlags;
+
+typedef struct _GstTrunBox
+{
+ guint8 version;
+ GstTrunFlags flags;
+
+ guint32 sample_count;
+
+ /* optional */
+ gint32 data_offset;
+ guint32 first_sample_flags;
+ GArray *samples;
+} GstTrunBox;
+
+typedef struct _GstTrunSample
+{
+ guint32 sample_duration;
+ guint32 sample_size;
+ guint32 sample_flags;
+
+ union {
+ guint32 u; /* version 0 */
+ gint32 s; /* others */
+ } sample_composition_time_offset;
+} GstTrunSample;
+
+typedef struct _GstTrafBox
+{
+ GstTfhdBox tfhd;
+ GArray *trun;
+} GstTrafBox;
+
+typedef struct _GstMoofBox
+{
+ GstMfhdBox mfhd;
+ GArray *traf;
+} GstMoofBox;
+
+GstMoofBox * gst_isoff_moof_box_parse (GstByteReader *reader);
+void gst_isoff_moof_box_free (GstMoofBox *moof);
+
typedef struct _GstSidxBoxEntry
{
gboolean ref_type;
diff --git a/ext/dash/gstmpdparser.c b/ext/dash/gstmpdparser.c
index 778ab2e..10f0149 100644
--- a/ext/dash/gstmpdparser.c
+++ b/ext/dash/gstmpdparser.c
@@ -38,6 +38,8 @@
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_prop_string_stripped (xmlNode * a_node,
+ const gchar * property_name, gchar ** property_value);
static gboolean gst_mpdparser_get_xml_ns_prop_string (xmlNode * a_node,
const gchar * ns_name, const gchar * property_name,
gchar ** property_value);
@@ -311,6 +313,18 @@
}
static gboolean
+gst_mpdparser_get_xml_prop_string_stripped (xmlNode * a_node,
+ const gchar * property_name, gchar ** property_value)
+{
+ gboolean ret;
+ ret =
+ gst_mpdparser_get_xml_prop_string (a_node, property_name, property_value);
+ if (ret)
+ *property_value = g_strstrip (*property_value);
+ return ret;
+}
+
+static gboolean
gst_mpdparser_validate_no_whitespace (const char *s)
{
return !strpbrk (s, "\r\n\t ");
@@ -1291,7 +1305,7 @@
*list = g_list_append (*list, new_descriptor);
GST_LOG ("attributes of %s node:", a_node->name);
- gst_mpdparser_get_xml_prop_string (a_node, "schemeIdUri",
+ gst_mpdparser_get_xml_prop_string_stripped (a_node, "schemeIdUri",
&new_descriptor->schemeIdUri);
if (!gst_mpdparser_get_xml_prop_string (a_node, "value",
&new_descriptor->value)) {
@@ -2439,7 +2453,8 @@
gint
gst_mpdparser_get_rep_idx_with_max_bandwidth (GList * Representations,
- gint max_bandwidth)
+ gint max_bandwidth, gint max_video_width, gint max_video_height, gint
+ max_video_framerate_n, gint max_video_framerate_d)
{
GList *list = NULL, *best = NULL;
GstRepresentationNode *representation;
@@ -2454,8 +2469,32 @@
return gst_mpdparser_get_rep_idx_with_min_bandwidth (Representations);
for (list = g_list_first (Representations); list; list = g_list_next (list)) {
+ GstFrameRate *framerate = NULL;
+
representation = (GstRepresentationNode *) list->data;
- if (representation && representation->bandwidth <= max_bandwidth &&
+
+ /* FIXME: Really? */
+ if (!representation)
+ continue;
+
+ framerate = representation->RepresentationBase->frameRate;
+ if (!framerate)
+ framerate = representation->RepresentationBase->maxFrameRate;
+
+ if (framerate && max_video_framerate_n > 0) {
+ if (gst_util_fraction_compare (framerate->num, framerate->den,
+ max_video_framerate_n, max_video_framerate_d) > 0)
+ continue;
+ }
+
+ if (max_video_width > 0
+ && representation->RepresentationBase->width > max_video_width)
+ continue;
+ if (max_video_height > 0
+ && representation->RepresentationBase->height > max_video_height)
+ continue;
+
+ if (representation->bandwidth <= max_bandwidth &&
representation->bandwidth > best_bandwidth) {
best = list;
best_bandwidth = representation->bandwidth;
@@ -4054,18 +4093,47 @@
}
}
- /* check duration of last segment */
- last_media_segment = (stream->segments && stream->segments->len) ?
- g_ptr_array_index (stream->segments, stream->segments->len - 1) : NULL;
+ /* clip duration of segments to stop at period end */
+ if (stream->segments && stream->segments->len) {
+ if (GST_CLOCK_TIME_IS_VALID (PeriodEnd)) {
+ for (guint n = 0; n < stream->segments->len; ++n) {
+ GstMediaSegment *media_segment =
+ g_ptr_array_index (stream->segments, n);
+ if (media_segment) {
+ if (media_segment->start + media_segment->duration >
+ PeriodEnd - PeriodStart) {
+ GstClockTime stop = PeriodEnd - PeriodStart;
+ if (n < stream->segments->len - 1) {
+ GstMediaSegment *next_segment =
+ g_ptr_array_index (stream->segments, n + 1);
+ if (next_segment && next_segment->start < PeriodEnd - PeriodStart)
+ stop = next_segment->start;
+ }
+ media_segment->duration =
+ media_segment->start > stop ? 0 : stop - media_segment->start;
+ GST_LOG ("Fixed duration of segment %u: %" GST_TIME_FORMAT, n,
+ GST_TIME_ARGS (media_segment->duration));
- if (last_media_segment && GST_CLOCK_TIME_IS_VALID (PeriodEnd)) {
- if (last_media_segment->start + last_media_segment->duration > PeriodEnd) {
- last_media_segment->duration =
- PeriodEnd - PeriodStart - last_media_segment->start;
- GST_LOG ("Fixed duration of last segment: %" GST_TIME_FORMAT,
- GST_TIME_ARGS (last_media_segment->duration));
+ /* If the segment was clipped entirely, we discard it and all
+ * subsequent ones */
+ if (media_segment->duration == 0) {
+ GST_WARNING ("Discarding %u segments outside period",
+ stream->segments->len - n);
+ /* _set_size should properly unref elements */
+ g_ptr_array_set_size (stream->segments, n);
+ break;
+ }
+ }
+ }
+ }
}
- GST_LOG ("Built a list of %d segments", last_media_segment->number);
+ if (stream->segments->len > 0) {
+ last_media_segment =
+ g_ptr_array_index (stream->segments, stream->segments->len - 1);
+ GST_LOG ("Built a list of %d segments", last_media_segment->number);
+ } else {
+ GST_LOG ("All media segments were clipped");
+ }
}
g_free (stream->baseURL);
@@ -5946,3 +6014,29 @@
}
return value;
}
+
+GstClockTime
+gst_mpd_client_get_maximum_segment_duration (GstMpdClient * client)
+{
+ GstClockTime ret = GST_CLOCK_TIME_NONE, dur;
+ GList *stream;
+
+ g_return_val_if_fail (client != NULL, GST_CLOCK_TIME_NONE);
+ g_return_val_if_fail (client->mpd_node != NULL, GST_CLOCK_TIME_NONE);
+
+ if (client->mpd_node->maxSegmentDuration != GST_MPD_DURATION_NONE) {
+ return client->mpd_node->maxSegmentDuration * GST_MSECOND;
+ }
+
+ /* According to the DASH specification, if maxSegmentDuration is not present:
+ "If not present, then the maximum Segment duration shall be the maximum
+ duration of any Segment documented in this MPD"
+ */
+ for (stream = client->active_streams; stream; stream = g_list_next (stream)) {
+ dur = gst_mpd_client_get_segment_duration (client, stream->data, NULL);
+ if (dur != GST_CLOCK_TIME_NONE && (dur > ret || ret == GST_CLOCK_TIME_NONE)) {
+ ret = dur;
+ }
+ }
+ return ret;
+}
diff --git a/ext/dash/gstmpdparser.h b/ext/dash/gstmpdparser.h
index 1b303aa..85b97ea 100644
--- a/ext/dash/gstmpdparser.h
+++ b/ext/dash/gstmpdparser.h
@@ -538,6 +538,7 @@
gboolean gst_mpd_client_setup_representation (GstMpdClient *client, GstActiveStream *stream, GstRepresentationNode *representation);
GstClockTime gst_mpd_client_get_next_fragment_duration (GstMpdClient * client, GstActiveStream * stream);
GstClockTime gst_mpd_client_get_media_presentation_duration (GstMpdClient *client);
+GstClockTime gst_mpd_client_get_maximum_segment_duration (GstMpdClient * client);
gboolean gst_mpd_client_get_last_fragment_timestamp_end (GstMpdClient * client, guint stream_idx, GstClockTime * ts);
gboolean gst_mpd_client_get_next_fragment_timestamp (GstMpdClient * client, guint stream_idx, GstClockTime * ts);
gboolean gst_mpd_client_get_next_fragment (GstMpdClient *client, guint indexStream, GstMediaFragmentInfo * fragment);
@@ -560,7 +561,7 @@
gboolean gst_mpd_client_has_previous_period (GstMpdClient * client);
/* Representation selection */
-gint gst_mpdparser_get_rep_idx_with_max_bandwidth (GList *Representations, gint max_bandwidth);
+gint gst_mpdparser_get_rep_idx_with_max_bandwidth (GList *Representations, gint max_bandwidth, gint max_video_width, gint max_video_height, gint max_video_framerate_n, gint max_video_framerate_d);
gint gst_mpdparser_get_rep_idx_with_min_bandwidth (GList * Representations);
/* URL management */
diff --git a/ext/dc1394/Makefile.am b/ext/dc1394/Makefile.am
index eb1a4f7..985f63d 100644
--- a/ext/dc1394/Makefile.am
+++ b/ext/dc1394/Makefile.am
@@ -1,16 +1,22 @@
+plugin_LTLIBRARIES = \
+ libgstdc1394.la
-plugin_LTLIBRARIES = libgstdc1394.la
+libgstdc1394_la_SOURCES = \
+ gstdc1394src.c
+libgstdc1394_la_CFLAGS = \
+ $(LIBDC1394_CFLAGS) \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(GST_CFLAGS)
+libgstdc1394_la_LIBADD = \
+ $(LIBDC1394_LIBS) \
+ $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) \
+ $(GST_BASE_LIBS) \
+ $(GST_LIBS)
+libgstdc1394_la_LDFLAGS = \
+ $(GST_PLUGIN_LDFLAGS)
+libgstdc1394_la_LIBTOOLFLAGS = \
+ $(GST_PLUGIN_LIBTOOLFLAGS)
-libgstdc1394_la_SOURCES = gstdc1394.c
-
-
-libgstdc1394_la_CFLAGS = $(GST_CFLAGS) \
- $(LIBDC1394_CFLAGS)
-
-libgstdc1394_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libgstdc1394_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
-
-libgstdc1394_la_LIBADD = $(GST_BASE_LIBS) \
- $(LIBDC1394_LIBS)
-
-noinst_HEADERS = gstdc1394.h
+noinst_HEADERS = \
+ gstdc1394src.h
diff --git a/ext/dc1394/Makefile.in b/ext/dc1394/Makefile.in
index 7f1c184..c085c2f 100644
--- a/ext/dc1394/Makefile.in
+++ b/ext/dc1394/Makefile.in
@@ -164,8 +164,9 @@
LTLIBRARIES = $(plugin_LTLIBRARIES)
am__DEPENDENCIES_1 =
libgstdc1394_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1)
-am_libgstdc1394_la_OBJECTS = libgstdc1394_la-gstdc1394.lo
+am_libgstdc1394_la_OBJECTS = libgstdc1394_la-gstdc1394src.lo
libgstdc1394_la_OBJECTS = $(am_libgstdc1394_la_OBJECTS)
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
@@ -302,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +652,6 @@
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@
@@ -687,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -777,17 +789,33 @@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
wayland_scanner = @wayland_scanner@
-plugin_LTLIBRARIES = libgstdc1394.la
-libgstdc1394_la_SOURCES = gstdc1394.c
-libgstdc1394_la_CFLAGS = $(GST_CFLAGS) \
- $(LIBDC1394_CFLAGS)
+plugin_LTLIBRARIES = \
+ libgstdc1394.la
-libgstdc1394_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libgstdc1394_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
-libgstdc1394_la_LIBADD = $(GST_BASE_LIBS) \
- $(LIBDC1394_LIBS)
+libgstdc1394_la_SOURCES = \
+ gstdc1394src.c
-noinst_HEADERS = gstdc1394.h
+libgstdc1394_la_CFLAGS = \
+ $(LIBDC1394_CFLAGS) \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(GST_CFLAGS)
+
+libgstdc1394_la_LIBADD = \
+ $(LIBDC1394_LIBS) \
+ $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) \
+ $(GST_BASE_LIBS) \
+ $(GST_LIBS)
+
+libgstdc1394_la_LDFLAGS = \
+ $(GST_PLUGIN_LDFLAGS)
+
+libgstdc1394_la_LIBTOOLFLAGS = \
+ $(GST_PLUGIN_LIBTOOLFLAGS)
+
+noinst_HEADERS = \
+ gstdc1394src.h
+
all: all-am
.SUFFIXES:
@@ -866,7 +894,7 @@
distclean-compile:
-rm -f *.tab.c
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdc1394_la-gstdc1394.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdc1394_la-gstdc1394src.Plo@am__quote@
.c.o:
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@@ -892,12 +920,12 @@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
-libgstdc1394_la-gstdc1394.lo: gstdc1394.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdc1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdc1394_la_CFLAGS) $(CFLAGS) -MT libgstdc1394_la-gstdc1394.lo -MD -MP -MF $(DEPDIR)/libgstdc1394_la-gstdc1394.Tpo -c -o libgstdc1394_la-gstdc1394.lo `test -f 'gstdc1394.c' || echo '$(srcdir)/'`gstdc1394.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdc1394_la-gstdc1394.Tpo $(DEPDIR)/libgstdc1394_la-gstdc1394.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdc1394.c' object='libgstdc1394_la-gstdc1394.lo' libtool=yes @AMDEPBACKSLASH@
+libgstdc1394_la-gstdc1394src.lo: gstdc1394src.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdc1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdc1394_la_CFLAGS) $(CFLAGS) -MT libgstdc1394_la-gstdc1394src.lo -MD -MP -MF $(DEPDIR)/libgstdc1394_la-gstdc1394src.Tpo -c -o libgstdc1394_la-gstdc1394src.lo `test -f 'gstdc1394src.c' || echo '$(srcdir)/'`gstdc1394src.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdc1394_la-gstdc1394src.Tpo $(DEPDIR)/libgstdc1394_la-gstdc1394src.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdc1394src.c' object='libgstdc1394_la-gstdc1394src.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 $(libgstdc1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdc1394_la_CFLAGS) $(CFLAGS) -c -o libgstdc1394_la-gstdc1394.lo `test -f 'gstdc1394.c' || echo '$(srcdir)/'`gstdc1394.c
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdc1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdc1394_la_CFLAGS) $(CFLAGS) -c -o libgstdc1394_la-gstdc1394src.lo `test -f 'gstdc1394src.c' || echo '$(srcdir)/'`gstdc1394src.c
mostlyclean-libtool:
-rm -f *.lo
diff --git a/ext/dc1394/gstdc1394.c b/ext/dc1394/gstdc1394.c
deleted file mode 100644
index 4a403b4..0000000
--- a/ext/dc1394/gstdc1394.c
+++ /dev/null
@@ -1,1335 +0,0 @@
-/* GStreamer
- * Copyright (C) <2006> Eric Jonas <jonas@mit.edu>
- * Copyright (C) <2006> Antoine Tremblay <hexa00@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:element-dc1394
- *
- * Source for IIDC (Instrumentation & Industrial Digital Camera) firewire
- * cameras.
- *
- * <refsect2>
- * <title>Example launch line</title>
- * |[
- * gst-launch -v dc1394 camera-number=0 ! xvimagesink
- * ]|
- * </refsect2>
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include "gstdc1394.h"
-#include <sys/time.h>
-#include <time.h>
-#include <string.h>
-
-GST_DEBUG_CATEGORY (dc1394_debug);
-#define GST_CAT_DEFAULT dc1394_debug
-
-enum
-{
- PROP_0,
- PROP_TIMESTAMP_OFFSET,
- PROP_CAMNUM,
- PROP_BUFSIZE,
- PROP_ISO_SPEED
- /* FILL ME */
-};
-
-
-GST_BOILERPLATE (GstDc1394, gst_dc1394, GstPushSrc, GST_TYPE_PUSH_SRC);
-
-static void gst_dc1394_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec);
-static void gst_dc1394_get_property (GObject * object, guint prop_id,
- GValue * value, GParamSpec * pspec);
-
-static GstCaps *gst_dc1394_getcaps (GstBaseSrc * bsrc);
-static gboolean gst_dc1394_setcaps (GstBaseSrc * bsrc, GstCaps * caps);
-static void gst_dc1394_src_fixate (GstPad * pad, GstCaps * caps);
-
-static void gst_dc1394_get_times (GstBaseSrc * basesrc,
- GstBuffer * buffer, GstClockTime * start, GstClockTime * end);
-
-static GstFlowReturn gst_dc1394_create (GstPushSrc * psrc, GstBuffer ** buffer);
-
-static GstStateChangeReturn
-gst_dc1394_change_state (GstElement * element, GstStateChange transition);
-
-static gboolean gst_dc1394_parse_caps (const GstCaps * caps,
- gint * width,
- gint * height,
- gint * rate_numerator, gint * rate_denominator, gint * vmode, gint * bpp);
-
-static gint gst_dc1394_caps_set_format_vmode_caps (GstStructure * st,
- gint mode);
-static gboolean gst_dc1394_set_caps_color (GstStructure * gs, gint mc);
-static void gst_dc1394_set_caps_framesize (GstStructure * gs, gint width,
- gint height);
-static void gst_dc1394_set_caps_framesize_range (GstStructure * gs,
- gint minwidth, gint maxwidth, gint incwidth,
- gint minheight, gint maxheight, gint incheight);
-
-static gint gst_dc1394_caps_set_framerate_list (GstStructure * gs,
- dc1394framerates_t * framerates);
-
-static GstCaps *gst_dc1394_get_all_dc1394_caps (void);
-static GstCaps *gst_dc1394_get_cam_caps (GstDc1394 * src);
-static gboolean gst_dc1394_open_cam_with_best_caps (GstDc1394 * src);
-static gint gst_dc1394_framerate_frac_to_const (gint num, gint denom);
-static void gst_dc1394_framerate_const_to_frac (gint framerateconst,
- GValue * framefrac);
-static gboolean
-gst_dc1394_change_camera_transmission (GstDc1394 * src, gboolean on);
-static gboolean gst_dc1394_query (GstBaseSrc * bsrc, GstQuery * query);
-
-static void
-gst_dc1394_base_init (gpointer g_class)
-{
- GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
-
- gst_element_class_set_static_metadata (element_class,
- "1394 IIDC Video Source", "Source/Video",
- "libdc1394 based source, supports 1394 IIDC cameras",
- "Antoine Tremblay <hexa00@gmail.com>");
-
- gst_element_class_add_pad_template (element_class,
- gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
- gst_dc1394_get_all_dc1394_caps ()));
-
-}
-
-static void
-gst_dc1394_class_init (GstDc1394Class * klass)
-{
- GObjectClass *gobject_class;
- GstBaseSrcClass *gstbasesrc_class;
- GstPushSrcClass *gstpushsrc_class;
- GstElementClass *gstelement_class;
-
- gobject_class = (GObjectClass *) klass;
- gstbasesrc_class = (GstBaseSrcClass *) klass;
- gstpushsrc_class = (GstPushSrcClass *) klass;
- gstelement_class = (GstElementClass *) klass;
-
- gobject_class->set_property = gst_dc1394_set_property;
- gobject_class->get_property = gst_dc1394_get_property;
-
- g_object_class_install_property (G_OBJECT_CLASS (klass),
- PROP_TIMESTAMP_OFFSET, g_param_spec_int64 ("timestamp-offset",
- "Timestamp offset",
- "An offset added to timestamps set on buffers (in ns)", G_MININT64,
- G_MAXINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (G_OBJECT_CLASS (klass),
- PROP_CAMNUM, g_param_spec_int ("camera-number",
- "The number of the camera on the firewire bus",
- "The number of the camera on the firewire bus", 0,
- G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (G_OBJECT_CLASS (klass),
- PROP_BUFSIZE, g_param_spec_int ("buffer-size",
- "The number of frames in the dma ringbuffer",
- "The number of frames in the dma ringbuffer", 1,
- G_MAXINT, 10, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (G_OBJECT_CLASS (klass),
- PROP_ISO_SPEED, g_param_spec_int ("iso-speed",
- "The iso bandwidth in Mbps (100, 200, 400, 800, 1600, 3200)",
- "The iso bandwidth in Mbps (100, 200, 400, 800, 1600, 3200)", 100,
- 3200, 400, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- gstbasesrc_class->get_caps = gst_dc1394_getcaps;
- gstbasesrc_class->set_caps = gst_dc1394_setcaps;
- gstbasesrc_class->query = gst_dc1394_query;
-
- gstbasesrc_class->get_times = gst_dc1394_get_times;
- gstpushsrc_class->create = gst_dc1394_create;
-
- gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_dc1394_change_state);
-}
-
-static void
-gst_dc1394_init (GstDc1394 * src, GstDc1394Class * g_class)
-{
-
- src->segment_start_frame = -1;
- src->segment_end_frame = -1;
- src->timestamp_offset = 0;
- src->caps = gst_dc1394_get_all_dc1394_caps ();
- src->bufsize = 10;
- src->iso_speed = 400;
- src->camnum = 0;
- src->n_frames = 0;
-
- gst_pad_set_fixatecaps_function (GST_BASE_SRC_PAD (src),
- gst_dc1394_src_fixate);
-
- gst_base_src_set_live (GST_BASE_SRC (src), TRUE);
-}
-
-static void
-gst_dc1394_src_fixate (GstPad * pad, GstCaps * caps)
-{
-
- GstDc1394 *src = GST_DC1394 (gst_pad_get_parent (pad));
- GstStructure *structure;
- int i;
-
- GST_LOG_OBJECT (src, " fixating caps to closest to 320x240 , 30 fps");
-
- for (i = 0; i < gst_caps_get_size (caps); ++i) {
- structure = gst_caps_get_structure (caps, i);
-
- gst_structure_fixate_field_nearest_int (structure, "width", 320);
- gst_structure_fixate_field_nearest_int (structure, "height", 240);
- gst_structure_fixate_field_nearest_fraction (structure, "framerate", 30, 1);
- }
- gst_object_unref (GST_OBJECT (src));
-}
-
-static gboolean
-gst_dc1394_query (GstBaseSrc * bsrc, GstQuery * query)
-{
- gboolean res = TRUE;
- GstDc1394 *src = GST_DC1394 (bsrc);
-
- switch (GST_QUERY_TYPE (query)) {
- case GST_QUERY_LATENCY:
- {
- GstClockTime min_latency, max_latency;
-
- if (!src->camera) {
- GST_WARNING_OBJECT (src,
- "Can't give latency since device isn't open !");
- res = FALSE;
- goto done;
- }
-
- if (src->rate_denominator <= 0 || src->rate_numerator <= 0) {
- GST_WARNING_OBJECT (bsrc,
- "Can't give latency since framerate isn't fixated !");
- res = FALSE;
- goto done;
- }
-
- /* min latency is the time to capture one frame */
- min_latency = gst_util_uint64_scale (GST_SECOND,
- src->rate_denominator, src->rate_numerator);
-
- /* max latency is total duration of the frame buffer */
- max_latency = gst_util_uint64_scale (src->bufsize,
- GST_SECOND * src->rate_denominator, src->rate_numerator);
-
- GST_DEBUG_OBJECT (bsrc,
- "report latency min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT,
- GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency));
-
- /* we are always live, the min latency is 1 frame and the max latency is
- * the complete buffer of frames. */
- gst_query_set_latency (query, TRUE, min_latency, max_latency);
-
- res = TRUE;
- break;
- }
- default:
- res = GST_BASE_SRC_CLASS (parent_class)->query (bsrc, query);
- break;
- }
-
-done:
- return res;
-}
-
-static void
-gst_dc1394_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec)
-{
- GstDc1394 *src = GST_DC1394 (object);
-
- switch (prop_id) {
- case PROP_TIMESTAMP_OFFSET:
- src->timestamp_offset = g_value_get_int64 (value);
- break;
- case PROP_CAMNUM:
- src->camnum = g_value_get_int (value);
- break;
- case PROP_BUFSIZE:
- src->bufsize = g_value_get_int (value);
- break;
- case PROP_ISO_SPEED:
- switch (g_value_get_int (value)) {
- case 100:
- case 200:
- case 300:
- case 400:
- case 800:
- case 1600:
- case 3200:
- // fallthrough
- src->iso_speed = g_value_get_int (value);
- break;
- default:
- g_warning ("%s: Invalid iso speed %d, ignoring",
- GST_ELEMENT_NAME (src), g_value_get_int (value));
- break;
- }
- default:
- break;
- }
-}
-
-static void
-gst_dc1394_get_property (GObject * object, guint prop_id, GValue * value,
- GParamSpec * pspec)
-{
- GstDc1394 *src = GST_DC1394 (object);
-
- switch (prop_id) {
- case PROP_TIMESTAMP_OFFSET:
- g_value_set_int64 (value, src->timestamp_offset);
- break;
- case PROP_CAMNUM:
- g_value_set_int (value, src->camnum);
- break;
- case PROP_BUFSIZE:
- g_value_set_int (value, src->bufsize);
- break;
- case PROP_ISO_SPEED:
- g_value_set_int (value, src->iso_speed);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static GstCaps *
-gst_dc1394_getcaps (GstBaseSrc * bsrc)
-{
- GstDc1394 *gsrc;
-
- gsrc = GST_DC1394 (bsrc);
-
- g_return_val_if_fail (gsrc->caps, NULL);
-
- return gst_caps_copy (gsrc->caps);
-}
-
-static gboolean
-gst_dc1394_setcaps (GstBaseSrc * bsrc, GstCaps * caps)
-{
- gboolean res = TRUE;
- GstDc1394 *dc1394;
- gint width, height, rate_denominator, rate_numerator;
- gint bpp, vmode;
-
- dc1394 = GST_DC1394 (bsrc);
-
- if (dc1394->caps) {
- gst_caps_unref (dc1394->caps);
- }
-
- dc1394->caps = gst_caps_copy (caps);
-
- res = gst_dc1394_parse_caps (caps, &width, &height,
- &rate_numerator, &rate_denominator, &vmode, &bpp);
-
- if (res) {
- /* looks ok here */
- dc1394->width = width;
- dc1394->height = height;
- dc1394->vmode = vmode;
- dc1394->rate_numerator = rate_numerator;
- dc1394->rate_denominator = rate_denominator;
- dc1394->bpp = bpp;
- }
-
- return res;
-}
-
-static void
-gst_dc1394_get_times (GstBaseSrc * basesrc, GstBuffer * buffer,
- GstClockTime * start, GstClockTime * end)
-{
- /* for live sources, sync on the timestamp of the buffer */
- if (gst_base_src_is_live (basesrc)) {
- GstClockTime timestamp = GST_BUFFER_TIMESTAMP (buffer);
-
- if (GST_CLOCK_TIME_IS_VALID (timestamp)) {
- /* get duration to calculate end time */
- GstClockTime duration = GST_BUFFER_DURATION (buffer);
-
- if (GST_CLOCK_TIME_IS_VALID (duration)) {
- *end = timestamp + duration;
- }
- *start = timestamp;
- }
- } else {
- *start = -1;
- *end = -1;
- }
-}
-
-static GstFlowReturn
-gst_dc1394_create (GstPushSrc * psrc, GstBuffer ** buffer)
-{
- GstDc1394 *src;
- GstBuffer *outbuf;
- GstCaps *caps;
- dc1394video_frame_t *frame[1];
- GstFlowReturn res = GST_FLOW_OK;
- dc1394error_t err;
-
- src = GST_DC1394 (psrc);
-
- err = dc1394_capture_dequeue (src->camera, DC1394_CAPTURE_POLICY_WAIT, frame);
-
- if (err != DC1394_SUCCESS) {
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED,
- ("failed to dequeue frame"), ("failed to dequeue frame"));
- goto error;
- }
-
- outbuf = gst_buffer_new_and_alloc (frame[0]->image_bytes);
-
- memcpy (GST_BUFFER_MALLOCDATA (outbuf), (guchar *) frame[0]->image,
- frame[0]->image_bytes * sizeof (guchar));
-
- GST_BUFFER_DATA (outbuf) = GST_BUFFER_MALLOCDATA (outbuf);
-
- caps = gst_pad_get_caps (GST_BASE_SRC_PAD (psrc));
- gst_buffer_set_caps (outbuf, caps);
- gst_caps_unref (caps);
-
- GST_BUFFER_TIMESTAMP (outbuf) = src->timestamp_offset + src->running_time;
- if (src->rate_numerator != 0) {
- GST_BUFFER_DURATION (outbuf) = gst_util_uint64_scale_int (GST_SECOND,
- src->rate_denominator, src->rate_numerator);
- }
-
- src->n_frames++;
- if (src->rate_numerator != 0) {
- src->running_time = gst_util_uint64_scale_int (src->n_frames * GST_SECOND,
- src->rate_denominator, src->rate_numerator);
- }
-
- if (dc1394_capture_enqueue (src->camera, frame[0]) != DC1394_SUCCESS) {
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED, ("failed to enqueue frame"),
- ("failed to enqueue frame"));
- goto error;
- }
-
- *buffer = outbuf;
-
- return res;
-
-error:
- {
- return GST_FLOW_ERROR;
- }
-}
-
-
-static gboolean
-gst_dc1394_parse_caps (const GstCaps * caps,
- gint * width,
- gint * height,
- gint * rate_numerator, gint * rate_denominator, gint * vmode, gint * bpp)
-{
- const GstStructure *structure;
- GstPadLinkReturn ret;
- const GValue *framerate;
-
- if (gst_caps_get_size (caps) < 1)
- return FALSE;
-
- structure = gst_caps_get_structure (caps, 0);
-
- ret = gst_structure_get_int (structure, "width", width);
- ret &= gst_structure_get_int (structure, "height", height);
-
- framerate = gst_structure_get_value (structure, "framerate");
-
- ret &= gst_structure_get_int (structure, "vmode", vmode);
-
- ret &= gst_structure_get_int (structure, "bpp", bpp);
-
-
- if (framerate) {
- *rate_numerator = gst_value_get_fraction_numerator (framerate);
- *rate_denominator = gst_value_get_fraction_denominator (framerate);
- } else {
- ret = FALSE;
- }
-
- return ret;
-}
-
-static GstStateChangeReturn
-gst_dc1394_change_state (GstElement * element, GstStateChange transition)
-{
- GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
- GstDc1394 *src = GST_DC1394 (element);
-
- switch (transition) {
- case GST_STATE_CHANGE_NULL_TO_READY:
- GST_LOG_OBJECT (src, "State change null to ready");
- src->dc1394 = dc1394_new ();
- break;
- case GST_STATE_CHANGE_READY_TO_PAUSED:
- GST_LOG_OBJECT (src, "State ready to paused");
-
- if (src->caps) {
- gst_caps_unref (src->caps);
- src->caps = NULL;
- }
- src->caps = gst_dc1394_get_cam_caps (src);
- if (src->caps == NULL) {
- GST_LOG_OBJECT (src,
- "Error : Set property could not get cam caps ! , reverting to default");
- src->caps = gst_dc1394_get_all_dc1394_caps ();
- ret = GST_STATE_CHANGE_FAILURE;
- }
-
- break;
- case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
- GST_LOG_OBJECT (src, "State change paused to playing");
-
- if (!gst_dc1394_open_cam_with_best_caps (src)) {
- ret = GST_STATE_CHANGE_FAILURE;
- }
-
- if (src->camera && !gst_dc1394_change_camera_transmission (src, TRUE)) {
- ret = GST_STATE_CHANGE_FAILURE;
- }
-
- break;
- default:
- break;
- }
- if (ret == GST_STATE_CHANGE_FAILURE)
- return ret;
-
- ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
-
- switch (transition) {
- case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
- GST_LOG_OBJECT (src, "State change playing to paused");
- break;
- case GST_STATE_CHANGE_PAUSED_TO_READY:
- GST_LOG_OBJECT (src, "State change paused to ready");
-
- if (src->camera && !gst_dc1394_change_camera_transmission (src, FALSE)) {
-
- if (src->camera) {
- dc1394_camera_free (src->camera);
- }
- src->camera = NULL;
-
- if (src->caps) {
- gst_caps_unref (src->caps);
- src->caps = NULL;
- }
-
- ret = GST_STATE_CHANGE_FAILURE;
- }
-
- break;
- case GST_STATE_CHANGE_READY_TO_NULL:
- GST_LOG_OBJECT (src, "State change ready to null");
- if (src->camera) {
- dc1394_camera_free (src->camera);
- }
- src->camera = NULL;
-
- if (src->dc1394) {
- dc1394_free (src->dc1394);
- }
- src->dc1394 = NULL;
-
- if (src->caps) {
- gst_caps_unref (src->caps);
- src->caps = NULL;
- }
- break;
- default:
- break;
- }
-
- return ret;
-}
-
-
-static gint
-gst_dc1394_caps_set_format_vmode_caps (GstStructure * gs, gint mode)
-{
- gint retval = 0;
-
- switch (mode) {
- case DC1394_VIDEO_MODE_160x120_YUV444:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_YUV444);
- gst_dc1394_set_caps_framesize (gs, 160, 120);
- break;
- case DC1394_VIDEO_MODE_320x240_YUV422:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_YUV422);
- gst_dc1394_set_caps_framesize (gs, 320, 240);
- break;
- case DC1394_VIDEO_MODE_640x480_YUV411:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_YUV411);
- gst_dc1394_set_caps_framesize (gs, 640, 480);
- break;
- case DC1394_VIDEO_MODE_640x480_YUV422:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_YUV422);
- gst_dc1394_set_caps_framesize (gs, 640, 480);
- break;
- case DC1394_VIDEO_MODE_640x480_RGB8:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_RGB8);
- gst_dc1394_set_caps_framesize (gs, 640, 480);
- break;
- case DC1394_VIDEO_MODE_640x480_MONO8:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_MONO8);
- gst_dc1394_set_caps_framesize (gs, 640, 480);
- break;
- case DC1394_VIDEO_MODE_640x480_MONO16:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_MONO16);
- gst_dc1394_set_caps_framesize (gs, 640, 480);
- break;
- case DC1394_VIDEO_MODE_800x600_YUV422:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_YUV422);
- gst_dc1394_set_caps_framesize (gs, 800, 600);
- break;
- case DC1394_VIDEO_MODE_800x600_RGB8:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_RGB8);
- gst_dc1394_set_caps_framesize (gs, 800, 600);
- break;
- case DC1394_VIDEO_MODE_800x600_MONO8:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_MONO8);
- gst_dc1394_set_caps_framesize (gs, 800, 600);
- break;
- case DC1394_VIDEO_MODE_1024x768_YUV422:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_YUV422);
- gst_dc1394_set_caps_framesize (gs, 1024, 768);
- break;
- case DC1394_VIDEO_MODE_1024x768_RGB8:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_RGB8);
- gst_dc1394_set_caps_framesize (gs, 1024, 768);
- break;
- case DC1394_VIDEO_MODE_1024x768_MONO8:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_MONO8);
- gst_dc1394_set_caps_framesize (gs, 1024, 768);
- break;
- case DC1394_VIDEO_MODE_800x600_MONO16:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_MONO16);
- gst_dc1394_set_caps_framesize (gs, 800, 600);
- break;
- case DC1394_VIDEO_MODE_1024x768_MONO16:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_MONO16);
- gst_dc1394_set_caps_framesize (gs, 1024, 768);
- break;
- case DC1394_VIDEO_MODE_1280x960_YUV422:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_YUV422);
- gst_dc1394_set_caps_framesize (gs, 1280, 960);
- break;
- case DC1394_VIDEO_MODE_1280x960_RGB8:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_RGB8);
- gst_dc1394_set_caps_framesize (gs, 1280, 960);
- break;
- case DC1394_VIDEO_MODE_1280x960_MONO8:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_MONO8);
- gst_dc1394_set_caps_framesize (gs, 1280, 960);
- break;
- case DC1394_VIDEO_MODE_1600x1200_YUV422:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_YUV422);
- gst_dc1394_set_caps_framesize (gs, 1600, 1200);
- break;
- case DC1394_VIDEO_MODE_1600x1200_RGB8:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_RGB8);
- gst_dc1394_set_caps_framesize (gs, 1600, 1200);
- break;
- case DC1394_VIDEO_MODE_1600x1200_MONO8:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_MONO8);
- gst_dc1394_set_caps_framesize (gs, 1600, 1200);
- break;
- case DC1394_VIDEO_MODE_1280x960_MONO16:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_MONO16);
- gst_dc1394_set_caps_framesize (gs, 1280, 960);
- break;
- case DC1394_VIDEO_MODE_1600x1200_MONO16:
- gst_dc1394_set_caps_color (gs, DC1394_COLOR_CODING_MONO8);
- gst_dc1394_set_caps_framesize (gs, 1600, 1200);
- break;
-
- default:
- retval = -1;
- }
-
- return retval;
-
-}
-
-
-static gboolean
-gst_dc1394_set_caps_color (GstStructure * gs, gint mc)
-{
- gboolean ret = TRUE;
- gint fourcc;
-
- switch (mc) {
- case DC1394_COLOR_CODING_YUV444:
- gst_structure_set_name (gs, "video/x-raw-yuv");
-
- fourcc = GST_MAKE_FOURCC ('I', 'Y', 'U', '2');
- gst_structure_set (gs,
- "format", GST_TYPE_FOURCC, fourcc, "bpp", G_TYPE_INT, 16, NULL);
- break;
-
- case DC1394_COLOR_CODING_YUV422:
- gst_structure_set_name (gs, "video/x-raw-yuv");
- fourcc = GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y');
- gst_structure_set (gs,
- "format", GST_TYPE_FOURCC, fourcc, "bpp", G_TYPE_INT, 16, NULL);
- break;
-
- case DC1394_COLOR_CODING_YUV411:
- gst_structure_set_name (gs, "video/x-raw-yuv");
- fourcc = GST_MAKE_FOURCC ('I', 'Y', 'U', '1');
- gst_structure_set (gs,
- "format", GST_TYPE_FOURCC, fourcc, "bpp", G_TYPE_INT, 12, NULL);
- break;
- case DC1394_COLOR_CODING_RGB8:
- gst_structure_set_name (gs, "video/x-raw-rgb");
- gst_structure_set (gs,
- "bpp", G_TYPE_INT, 24,
- "depth", G_TYPE_INT, 24,
- "endianness", G_TYPE_INT, G_BIG_ENDIAN,
- "red_mask", G_TYPE_INT, 0xFF0000,
- "green_mask", G_TYPE_INT, 0x00FF00,
- "blue_mask", G_TYPE_INT, 0x0000FF, NULL);
- break;
- case DC1394_COLOR_CODING_MONO8:
- gst_structure_set_name (gs, "video/x-raw-gray");
- gst_structure_set (gs,
- "bpp", G_TYPE_INT, 8, "depth", G_TYPE_INT, 8, NULL);
-
- break;
- case DC1394_COLOR_CODING_MONO16:
- gst_structure_set_name (gs, "video/x-raw-gray");
- gst_structure_set (gs,
- "bpp", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, NULL);
- // there is no fourcc for this format
- break;
- default:
- GST_DEBUG ("Ignoring unsupported color format %d", mc);
- ret = FALSE;
- break;
- }
- return ret;
-}
-
-
-static void
-gst_dc1394_set_caps_framesize (GstStructure * gs, gint width, gint height)
-{
- gst_structure_set (gs,
- "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL);
-}
-
-static void
-gst_dc1394_set_caps_framesize_range (GstStructure * gs,
- gint minwidth,
- gint maxwidth,
- gint incwidth, gint minheight, gint maxheight, gint incheight)
-{
- /*
- Format 7 cameras allow you to change the camera width/height in multiples
- of incwidth/incheight up to some max. This sets the necessary
- list structure in the gst caps structure
- */
-
- GValue widthlist = { 0 };
- GValue widthval = { 0 };
- GValue heightlist = { 0 };
- GValue heightval = { 0 };
- gint x = 0;
-
- g_value_init (&widthlist, GST_TYPE_LIST);
- g_value_init (&widthval, G_TYPE_INT);
- for (x = minwidth; x <= maxwidth; x += incwidth) {
- g_value_set_int (&widthval, x);
- gst_value_list_append_value (&widthlist, &widthval);
- }
- gst_structure_set_value (gs, "width", &widthlist);
-
- g_value_unset (&widthlist);
- g_value_unset (&widthval);
-
- g_value_init (&heightlist, GST_TYPE_LIST);
- g_value_init (&heightval, G_TYPE_INT);
- for (x = minheight; x <= maxheight; x += incheight) {
- g_value_set_int (&heightval, x);
- gst_value_list_append_value (&heightlist, &heightval);
- }
-
- gst_structure_set_value (gs, "height", &heightlist);
-
- g_value_unset (&heightlist);
- g_value_unset (&heightval);
-}
-
-
-static gint
-gst_dc1394_caps_set_framerate_list (GstStructure * gs,
- dc1394framerates_t * framerates)
-{
- GValue framefrac = { 0 };
- GValue frameratelist = { 0 };
- gint f;
-
- g_value_init (&frameratelist, GST_TYPE_LIST);
- g_value_init (&framefrac, GST_TYPE_FRACTION);
-
- // figure out the frame rate
- for (f = framerates->num - 1; f >= 0; f--) {
- /* reverse order so we place the faster frame rates higher in
- the sequence */
- if (framerates->framerates[f]) {
- gst_dc1394_framerate_const_to_frac (framerates->framerates[f],
- &framefrac);
-
- gst_value_list_append_value (&frameratelist, &framefrac);
- }
- }
- gst_structure_set_value (gs, "framerate", &frameratelist);
-
- g_value_unset (&framefrac);
- g_value_unset (&frameratelist);
- return 0;
-}
-
-
-
-static void
-gst_dc1394_framerate_const_to_frac (gint framerateconst, GValue * framefrac)
-{
-
- // frac must have been already initialized
-
- switch (framerateconst) {
- case DC1394_FRAMERATE_1_875:
- gst_value_set_fraction (framefrac, 15, 8);
- break;
- case DC1394_FRAMERATE_3_75:
- gst_value_set_fraction (framefrac, 15, 4);
- break;
- case DC1394_FRAMERATE_7_5:
- gst_value_set_fraction (framefrac, 15, 2);
- break;
- case DC1394_FRAMERATE_15:
- gst_value_set_fraction (framefrac, 15, 1);
- break;
- case DC1394_FRAMERATE_30:
- gst_value_set_fraction (framefrac, 30, 1);
- break;
- case DC1394_FRAMERATE_60:
- gst_value_set_fraction (framefrac, 60, 1);
- break;
- case DC1394_FRAMERATE_120:
- gst_value_set_fraction (framefrac, 120, 1);
- break;
- case DC1394_FRAMERATE_240:
- gst_value_set_fraction (framefrac, 240, 1);
- break;
- }
-}
-
-static GstCaps *
-gst_dc1394_get_all_dc1394_caps (void)
-{
- /*
- generate all possible caps
-
- */
-
- GstCaps *gcaps;
- gint i = 0;
-
- gcaps = gst_caps_new_empty ();
- // first, the fixed mode caps
- for (i = DC1394_VIDEO_MODE_MIN; i < DC1394_VIDEO_MODE_EXIF; i++) {
- GstStructure *gs = gst_structure_empty_new ("video");
- gint ret = gst_dc1394_caps_set_format_vmode_caps (gs, i);
-
- gst_structure_set (gs,
- "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
- gst_structure_set (gs, "vmode", G_TYPE_INT, i, NULL);
- if (ret >= 0) {
- gst_caps_append_structure (gcaps, gs);
- }
- }
-
- // then Format 7 options
-
- for (i = DC1394_COLOR_CODING_MIN; i <= DC1394_COLOR_CODING_MAX; i++) {
- GstStructure *gs = gst_structure_empty_new ("video");
-
- //int ret = gst_dc1394_caps_set_format_vmode_caps(gs, i);
-
- gst_structure_set (gs, "vmode", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
-
- gst_structure_set (gs,
- "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
- gst_structure_set (gs,
- "width", GST_TYPE_INT_RANGE, 1, G_MAXINT,
- "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
-
- if (gst_dc1394_set_caps_color (gs, i)) {
- gst_caps_append_structure (gcaps, gs);
- }
- }
- return gcaps;
-
-}
-
-GstCaps *
-gst_dc1394_get_cam_caps (GstDc1394 * src)
-{
-
- dc1394camera_t *camera = NULL;
- dc1394camera_list_t *cameras = NULL;
- dc1394error_t camerr;
- gint i, j;
- dc1394video_modes_t modes;
- dc1394framerates_t framerates;
- GstCaps *gcaps = NULL;
-
- gcaps = gst_caps_new_empty ();
-
- camerr = dc1394_camera_enumerate (src->dc1394, &cameras);
-
- if (camerr != DC1394_SUCCESS || cameras == NULL) {
- GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND,
- ("Can't find cameras error : %d", camerr),
- ("Can't find cameras error : %d", camerr));
- goto error;
- }
-
- if (cameras->num == 0) {
- GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, ("There were no cameras"),
- ("There were no cameras"));
- goto error;
- }
-
- if (src->camnum > (cameras->num - 1)) {
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED, ("Invalid camera number"),
- ("Invalid camera number %d", src->camnum));
- goto error;
- }
-
- camera =
- dc1394_camera_new_unit (src->dc1394, cameras->ids[src->camnum].guid,
- cameras->ids[src->camnum].unit);
-
- dc1394_camera_free_list (cameras);
- cameras = NULL;
-
- camerr = dc1394_video_get_supported_modes (camera, &modes);
- if (camerr != DC1394_SUCCESS) {
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED, ("Error getting supported modes"),
- ("Error getting supported modes"));
- goto error;
- }
-
- for (i = modes.num - 1; i >= 0; i--) {
- int m = modes.modes[i];
-
- if (m < DC1394_VIDEO_MODE_EXIF) {
-
- GstStructure *gs = gst_structure_empty_new ("video");
-
- gst_structure_set (gs, "vmode", G_TYPE_INT, m, NULL);
-
- if (gst_dc1394_caps_set_format_vmode_caps (gs, m) < 0) {
- GST_ELEMENT_ERROR (src, STREAM, FAILED,
- ("attempt to set mode to %d failed", m),
- ("attempt to set mode to %d failed", m));
- goto error;
- } else {
-
- camerr = dc1394_video_get_supported_framerates (camera, m, &framerates);
- gst_dc1394_caps_set_framerate_list (gs, &framerates);
- gst_caps_append_structure (gcaps, gs);
-
- }
- } else {
- // FORMAT 7
- guint maxx, maxy;
- GstStructure *gs = gst_structure_empty_new ("video");
- dc1394color_codings_t colormodes;
- guint xunit, yunit;
-
- gst_structure_set (gs, "vmode", G_TYPE_INT, m, NULL);
-
- // Get the maximum frame size
- camerr = dc1394_format7_get_max_image_size (camera, m, &maxx, &maxy);
- if (camerr != DC1394_SUCCESS) {
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED,
- ("Error getting format 7 max image size"),
- ("Error getting format 7 max image size"));
- goto error;
- }
- GST_LOG_OBJECT (src, "Format 7 maxx=%d maxy=%d", maxx, maxy);
-
- camerr = dc1394_format7_get_unit_size (camera, m, &xunit, &yunit);
- if (camerr != DC1394_SUCCESS) {
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED,
- ("Error getting format 7 image unit size"),
- ("Error getting format 7 image unit size"));
- goto error;
- }
- GST_LOG_OBJECT (src, "Format 7 unitx=%d unity=%d", xunit, yunit);
-
- gst_dc1394_set_caps_framesize_range (gs, xunit, maxx, xunit,
- yunit, maxy, yunit);
-
- // note that format 7 has no concept of a framerate, so we pass the
- // full range
- gst_structure_set (gs,
- "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
-
- // get the available color codings
- camerr = dc1394_format7_get_color_codings (camera, m, &colormodes);
- if (camerr != DC1394_SUCCESS) {
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED,
- ("Error getting format 7 color modes"),
- ("Error getting format 7 color modes"));
- goto error;
- }
-
- for (j = 0; j < colormodes.num; j++) {
- GstStructure *newgs = gst_structure_copy (gs);
-
- gst_dc1394_set_caps_color (newgs, colormodes.codings[j]);
- GST_LOG_OBJECT (src, "Format 7 colormode set : %d",
- colormodes.codings[j]);
- // note that since there are multiple color modes, we append
- // multiple structures.
- gst_caps_append_structure (gcaps, newgs);
- }
- }
- }
-
- if (camera) {
- dc1394_camera_free (camera);
- }
-
- return gcaps;
-
-error:
-
- if (gcaps) {
- gst_caps_unref (gcaps);
- }
-
- if (cameras) {
- dc1394_camera_free_list (cameras);
- cameras = NULL;
- }
-
- if (camera) {
- dc1394_camera_free (camera);
- camera = NULL;
- }
-
- return NULL;
-}
-
-static gint
-gst_dc1394_framerate_frac_to_const (gint num, gint denom)
-{
- // frac must have been already initialized
- int retvalue = -1;
-
- if (num == 15 && denom == 8)
- retvalue = DC1394_FRAMERATE_1_875;
-
- if (num == 15 && denom == 4)
- retvalue = DC1394_FRAMERATE_3_75;
-
- if (num == 15 && denom == 2)
- retvalue = DC1394_FRAMERATE_7_5;
-
- if (num == 15 && denom == 1)
- retvalue = DC1394_FRAMERATE_15;
-
-
- if (num == 30 && denom == 1)
- retvalue = DC1394_FRAMERATE_30;
-
- if (num == 60 && denom == 1)
- retvalue = DC1394_FRAMERATE_60;
-
- return retvalue;
-}
-
-
-static gboolean
-gst_dc1394_open_cam_with_best_caps (GstDc1394 * src)
-{
- dc1394camera_list_t *cameras = NULL;
- gint err = 0;
- int framerateconst;
-
- GST_LOG_OBJECT (src, "Opening the camera!!!");
-
-
- if (dc1394_camera_enumerate (src->dc1394, &cameras) != DC1394_SUCCESS) {
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED, ("Can't find cameras"),
- ("Can't find cameras"));
- goto error;
- }
-
- GST_LOG_OBJECT (src, "Found %d cameras", cameras->num);
-
- if (src->camnum > (cameras->num - 1)) {
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED, ("Invalid camera number"),
- ("Invalid camera number"));
- goto error;
- }
-
- GST_LOG_OBJECT (src, "Opening camera : %d", src->camnum);
-
- src->camera =
- dc1394_camera_new_unit (src->dc1394, cameras->ids[src->camnum].guid,
- cameras->ids[src->camnum].unit);
-
- dc1394_camera_free_list (cameras);
- cameras = NULL;
-
- // figure out mode
- framerateconst = gst_dc1394_framerate_frac_to_const (src->rate_numerator,
- src->rate_denominator);
-
- GST_LOG_OBJECT (src, "The dma buffer queue size is %d buffers",
- src->bufsize);
-
- switch (src->iso_speed) {
- case 100:
- err = dc1394_video_set_iso_speed (src->camera, DC1394_ISO_SPEED_100);
- break;
- case 200:
- err = dc1394_video_set_iso_speed (src->camera, DC1394_ISO_SPEED_200);
- break;
- case 400:
- err = dc1394_video_set_iso_speed (src->camera, DC1394_ISO_SPEED_400);
- break;
- case 800:
- if (src->camera->bmode_capable > 0) {
- dc1394_video_set_operation_mode (src->camera,
- DC1394_OPERATION_MODE_1394B);
- err = dc1394_video_set_iso_speed (src->camera, DC1394_ISO_SPEED_800);
- }
- break;
- case 1600:
- if (src->camera->bmode_capable > 0) {
- dc1394_video_set_operation_mode (src->camera,
- DC1394_OPERATION_MODE_1394B);
- err = dc1394_video_set_iso_speed (src->camera, DC1394_ISO_SPEED_1600);
- }
- break;
- case 3200:
- if (src->camera->bmode_capable > 0) {
- dc1394_video_set_operation_mode (src->camera,
- DC1394_OPERATION_MODE_1394B);
- err = dc1394_video_set_iso_speed (src->camera, DC1394_ISO_SPEED_3200);
- }
- break;
- default:
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED, ("Invalid ISO speed"),
- ("Invalid ISO speed"));
- goto error;
- break;
- }
-
- if (err != DC1394_SUCCESS) {
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED, ("Could not set ISO speed"),
- ("Could not set ISO speed"));
- goto error;
- }
-
- GST_LOG_OBJECT (src, "Setting mode : %d", src->vmode);
- err = dc1394_video_set_mode (src->camera, src->vmode);
-
- if (err != DC1394_SUCCESS) {
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED, ("Could not set video mode %d",
- src->vmode), ("Could not set video mode %d", src->vmode));
- goto error;
- }
-
- GST_LOG_OBJECT (src, "Setting framerate : %d", framerateconst);
- dc1394_video_set_framerate (src->camera, framerateconst);
-
- if (err != DC1394_SUCCESS) {
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED, ("Could not set framerate to %d",
- framerateconst), ("Could not set framerate to %d", framerateconst));
- goto error;
- }
- // set any format-7 parameters if this is a format-7 mode
- if (src->vmode >= DC1394_VIDEO_MODE_FORMAT7_MIN &&
- src->vmode <= DC1394_VIDEO_MODE_FORMAT7_MAX) {
- // the big thing we care about right now is frame size
- err = dc1394_format7_set_image_size (src->camera, src->vmode,
- src->width, src->height);
- if (err != DC1394_SUCCESS) {
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED,
- ("Could not set format 7 image size to %d x %d", src->width,
- src->height), ("Could not set format 7 image size to %d x %d",
- src->width, src->height));
-
- goto error;
- }
-
- }
- err = dc1394_capture_setup (src->camera, src->bufsize,
- DC1394_CAPTURE_FLAGS_DEFAULT);
- if (err != DC1394_SUCCESS) {
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED, ("Error setting capture mode"),
- ("Error setting capture mode"));
- }
- if (err != DC1394_SUCCESS) {
- if (err == DC1394_NO_BANDWIDTH) {
- GST_LOG_OBJECT (src, "Capture setup_dma failed."
- "Trying to cleanup the iso_channels_and_bandwidth and retrying");
-
- // try to cleanup the bandwidth and retry
- err = dc1394_iso_release_all (src->camera);
- if (err != DC1394_SUCCESS) {
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED,
- ("Could not cleanup bandwidth"), ("Could not cleanup bandwidth"));
- goto error;
- } else {
- err =
- dc1394_capture_setup (src->camera, src->bufsize,
- DC1394_CAPTURE_FLAGS_DEFAULT);
- if (err != DC1394_SUCCESS) {
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED,
- ("unable to setup camera error %d", err),
- ("unable to setup camera error %d", err));
- goto error;
- }
- }
- } else {
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED,
- ("unable to setup camera error %d", err),
- ("unable to setup camera error %d", err));
- goto error;
-
- }
- }
-
-
- return TRUE;
-
-error:
-
- if (src->camera) {
- dc1394_camera_free (src->camera);
- src->camera = NULL;
- }
-
- return FALSE;
-
-}
-
-
-gboolean
-gst_dc1394_change_camera_transmission (GstDc1394 * src, gboolean on)
-{
- dc1394switch_t status = DC1394_OFF;
- dc1394error_t err = DC1394_FAILURE;
- gint i = 0;
-
- g_return_val_if_fail (src->camera, FALSE);
-
- if (on) {
-
- status = dc1394_video_set_transmission (src->camera, DC1394_ON);
-
- i = 0;
- while (status == DC1394_OFF && i++ < 5) {
- g_usleep (50000);
- if (dc1394_video_get_transmission (src->camera,
- &status) != DC1394_SUCCESS) {
- if (status == DC1394_OFF) {
- GST_LOG_OBJECT (src, "camera is still off , retrying");
- }
- }
- }
-
- if (i == 5) {
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED,
- ("Camera doesn't seem to want to turn on!"),
- ("Camera doesn't seem to want to turn on!"));
- return FALSE;
- }
-
- GST_LOG_OBJECT (src, "got transmision status ON");
-
- } else {
-
- if (dc1394_video_set_transmission (src->camera,
- DC1394_OFF) != DC1394_SUCCESS) {
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED, ("Unable to stop transmision"),
- ("Unable to stop transmision"));
- return FALSE;
- }
-
- GST_LOG_OBJECT (src, "Stopping capture");
-
- err = dc1394_capture_stop (src->camera);
- if (err > 0) {
- GST_ELEMENT_ERROR (src, RESOURCE, FAILED, ("Capture stop error : %d ",
- err), ("Capture stop error : %d ", err));
- return FALSE;
- } else {
- GST_LOG_OBJECT (src, "Capture stoped successfully");
- }
- }
-
- return TRUE;
-}
-
-
-static gboolean
-plugin_init (GstPlugin * plugin)
-{
- GST_DEBUG_CATEGORY_INIT (dc1394_debug, "dc1394", 0, "DC1394 interface");
-
- return gst_element_register (plugin, "dc1394src", GST_RANK_NONE,
- GST_TYPE_DC1394);
-
-}
-
-
-GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
- GST_VERSION_MINOR,
- dc1394,
- "1394 IIDC Video Source",
- plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/ext/dc1394/gstdc1394.h b/ext/dc1394/gstdc1394.h
deleted file mode 100644
index a27b1f8..0000000
--- a/ext/dc1394/gstdc1394.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* GStreamer
- * Copyright (C) <2006> Eric Jonas <jonas@mit.edu>
- * Copyright (C) <2006> Antoine Tremblay <hexa00@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_DC1394_H__
-#define __GST_DC1394_H__
-
-#include <gst/gst.h>
-#include <gst/base/gstpushsrc.h>
-#include <dc1394/control.h>
-
-G_BEGIN_DECLS
-
-#define GST_TYPE_DC1394 \
- (gst_dc1394_get_type())
-#define GST_DC1394(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DC1394,GstDc1394))
-#define GST_DC1394_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DC1394,GstDc1394))
-#define GST_IS_DC1394(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DC1394))
-#define GST_IS_DC1394_CLASS(obj) \
- (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DC1394))
-
-typedef struct _GstDc1394 GstDc1394;
-typedef struct _GstDc1394Class GstDc1394Class;
-
-struct _GstDc1394 {
- GstPushSrc element;
-
- /* video state */
- gint width;
- gint height;
- gint vmode;
-
- gint bpp;
- gint rate_numerator;
- gint rate_denominator;
-
- /* private */
- gint64 timestamp_offset; /* base offset */
- GstClockTime running_time; /* total running time */
- gint64 n_frames; /* total frames sent */
- gint64 segment_start_frame;
- gint64 segment_end_frame;
- gboolean segment;
- gint camnum;
- gint bufsize;
- gint iso_speed;
-
- dc1394_t * dc1394;
- dc1394camera_t * camera;
-
- GstCaps *caps;
-};
-
-struct _GstDc1394Class {
- GstPushSrcClass parent_class;
-};
-
-GType gst_dc1394_get_type (void);
-
-G_END_DECLS
-
-#endif /* __GST_DC1394_H__ */
diff --git a/ext/dc1394/gstdc1394src.c b/ext/dc1394/gstdc1394src.c
new file mode 100644
index 0000000..3ab3026
--- /dev/null
+++ b/ext/dc1394/gstdc1394src.c
@@ -0,0 +1,1247 @@
+/* GStreamer
+ * Copyright (C) <2006> Eric Jonas <jonas@mit.edu>
+ * Copyright (C) <2006> Antoine Tremblay <hexa00@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:element-dc1394src
+ *
+ * Source for IIDC (Instrumentation & Industrial Digital Camera) firewire
+ * cameras. If several cameras are connected to the system, the desired one
+ * can be selected by its GUID and an optional unit number (most cameras are
+ * single unit and do not require it). The frame size, rate and format are set
+ * from capabilities. Although the IIDC specification includes a raw video
+ * mode, many cameras use mono video modes to capture in Bayer format.
+ * Thus, for each mono video mode supported by a camera, both gray raw and Bayer
+ * corresponding video formats are exposed in the capabilities.
+ * The Bayer pattern is left unspecified.
+ *
+ * <refsect2>
+ * <title>Example launch lines</title>
+ * |[
+ * gst-launch-1.0 -v dc1394src ! videoconvert ! autovideosink
+ * ]| Capture and display frames from the first camera available in the system.
+ * |[
+ * gst-launch-1.0 dc1394src guid=00074813004DF937 \
+ * ! "video/x-bayer,format=gbrg,width=1280,height=960,framerate=15/2" \
+ * ! bayer2rgb ! videoconvert ! autovideosink
+ * ]| Capture and display frames from a specific camera in the desired format.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "gstdc1394src.h"
+#include <gst/video/video.h>
+
+GST_DEBUG_CATEGORY_STATIC (dc1394_debug);
+#define GST_CAT_DEFAULT dc1394_debug
+
+
+enum
+{
+ PROP_0,
+ PROP_CAMERA_GUID,
+ PROP_CAMERA_UNIT,
+ PROP_ISO_SPEED,
+ PROP_DMA_BUFFER_SIZE
+};
+
+
+#define GST_TYPE_DC1394_ISO_SPEED (gst_dc1394_iso_speed_get_type ())
+static GType
+gst_dc1394_iso_speed_get_type (void)
+{
+ static const GEnumValue iso_speeds[] = {
+ {100, "DC1394 ISO speed 100", "100"},
+ {200, "DC1394 ISO speed 200", "200"},
+ {400, "DC1394 ISO speed 400", "400"},
+ {800, "DC1394 ISO speed 800", "800"},
+ {1600, "DC1394 ISO speed 1600", "1600"},
+ {3200, "DC1394 ISO speed 3200", "3200"},
+ {0, NULL, NULL}
+ };
+ static GType type = 0;
+
+ if (!type) {
+ type = g_enum_register_static ("GstDC1394ISOSpeed", iso_speeds);
+ }
+ return type;
+}
+
+
+#define gst_dc1394_src_parent_class parent_class
+G_DEFINE_TYPE (GstDC1394Src, gst_dc1394_src, GST_TYPE_PUSH_SRC);
+
+static void gst_dc1394_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_dc1394_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static gboolean gst_dc1394_src_start (GstBaseSrc * bsrc);
+static gboolean gst_dc1394_src_stop (GstBaseSrc * bsrc);
+static gboolean gst_dc1394_src_set_caps (GstBaseSrc * bsrc, GstCaps * caps);
+static GstCaps *gst_dc1394_src_get_caps (GstBaseSrc * bsrc, GstCaps * filter);
+static GstFlowReturn gst_dc1394_src_create (GstPushSrc * psrc,
+ GstBuffer ** buffer);
+
+static void gst_dc1394_src_set_prop_camera_guid (GstDC1394Src * src,
+ const gchar * guid);
+static gchar *gst_dc1394_src_get_prop_camera_guid (GstDC1394Src * src);
+static void gst_dc1394_src_set_prop_camera_unit (GstDC1394Src * src, gint unit);
+static gint gst_dc1394_src_get_prop_camera_unit (GstDC1394Src * src);
+static void gst_dc1394_src_set_prop_iso_speed (GstDC1394Src * src, guint speed);
+static guint gst_dc1394_src_get_prop_iso_speed (GstDC1394Src * src);
+static void gst_dc1394_src_set_prop_dma_buffer_size (GstDC1394Src * src,
+ guint size);
+static guint gst_dc1394_src_get_prop_dma_buffer_size (GstDC1394Src * src);
+static gboolean gst_dc1394_src_open_cam (GstDC1394Src * src);
+static void gst_dc1394_src_close_cam (GstDC1394Src * src);
+static gboolean gst_dc1394_src_start_cam (GstDC1394Src * src);
+static gboolean gst_dc1394_src_stop_cam (GstDC1394Src * src);
+static gboolean gst_dc1394_src_set_cam_caps (GstDC1394Src * src,
+ GstCaps * caps);
+static GstCaps *gst_dc1394_src_get_cam_caps (GstDC1394Src * src);
+static GstCaps *gst_dc1394_src_get_all_caps (void);
+
+static GstCaps *gst_dc1394_src_build_caps (const dc1394color_codings_t *
+ supported_codings, const dc1394framerates_t * supported_rates,
+ guint width_min, guint width_max, guint width_step, guint height_min,
+ guint height_max, guint height_step);
+static gboolean gst_dc1394_src_parse_caps (const GstCaps * caps,
+ dc1394color_codings_t * color_codings, dc1394framerate_t * rate,
+ gdouble * rate_decimal, guint * width, guint * height);
+
+static void
+gst_dc1394_src_class_init (GstDC1394SrcClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *element_class;
+ GstBaseSrcClass *basesrc_class;
+ GstPushSrcClass *pushsrc_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ element_class = GST_ELEMENT_CLASS (klass);
+ basesrc_class = GST_BASE_SRC_CLASS (klass);
+ pushsrc_class = GST_PUSH_SRC_CLASS (klass);
+
+ gobject_class->set_property = gst_dc1394_src_set_property;
+ gobject_class->get_property = gst_dc1394_src_get_property;
+ g_object_class_install_property (gobject_class, PROP_CAMERA_GUID,
+ g_param_spec_string ("guid", "Camera GUID",
+ "The hexadecimal representation of the GUID of the camera"
+ " (use first camera available if null)",
+ NULL,
+ G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE |
+ GST_PARAM_MUTABLE_READY));
+ g_object_class_install_property (gobject_class, PROP_CAMERA_UNIT,
+ g_param_spec_int ("unit", "Camera unit",
+ "The unit number of the camera (-1 if no unit number is used)",
+ -1, G_MAXINT, -1,
+ G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE |
+ GST_PARAM_MUTABLE_READY));
+ g_object_class_install_property (gobject_class, PROP_ISO_SPEED,
+ g_param_spec_enum ("iso", "ISO bandwidth",
+ "The ISO bandwidth in Mbps",
+ GST_TYPE_DC1394_ISO_SPEED, 400,
+ G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE |
+ GST_PARAM_MUTABLE_READY));
+ g_object_class_install_property (gobject_class, PROP_DMA_BUFFER_SIZE,
+ g_param_spec_uint ("dma", "DMA ring buffer size",
+ "The number of frames in the Direct Memory Access ring buffer",
+ 1, G_MAXUINT, 10,
+ G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE |
+ GST_PARAM_MUTABLE_READY));
+
+ gst_element_class_set_static_metadata (element_class,
+ "1394 IIDC Video Source", "Source/Video",
+ "libdc1394 based source for IIDC cameras",
+ "Antoine Tremblay <hexa00@gmail.com>");
+ gst_element_class_add_pad_template (element_class,
+ gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
+ gst_dc1394_src_get_all_caps ()));
+
+ basesrc_class->start = GST_DEBUG_FUNCPTR (gst_dc1394_src_start);
+ basesrc_class->stop = GST_DEBUG_FUNCPTR (gst_dc1394_src_stop);
+ basesrc_class->set_caps = GST_DEBUG_FUNCPTR (gst_dc1394_src_set_caps);
+ basesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_dc1394_src_get_caps);
+
+ pushsrc_class->create = GST_DEBUG_FUNCPTR (gst_dc1394_src_create);
+}
+
+
+static void
+gst_dc1394_src_init (GstDC1394Src * src)
+{
+ src->guid = -1;
+ src->unit = -1;
+ src->iso_speed = DC1394_ISO_SPEED_400;
+ src->dma_buffer_size = 10;
+ src->dc1394 = NULL;
+ src->camera = NULL;
+ src->caps = NULL;
+
+ gst_base_src_set_live (GST_BASE_SRC (src), TRUE);
+ gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_TIME);
+ gst_base_src_set_do_timestamp (GST_BASE_SRC (src), TRUE);
+}
+
+
+static void
+gst_dc1394_src_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstDC1394Src *src;
+
+ src = GST_DC1394_SRC (object);
+ switch (prop_id) {
+ case PROP_CAMERA_GUID:
+ g_value_take_string (value, gst_dc1394_src_get_prop_camera_guid (src));
+ break;
+ case PROP_CAMERA_UNIT:
+ g_value_set_int (value, gst_dc1394_src_get_prop_camera_unit (src));
+ break;
+ case PROP_ISO_SPEED:
+ g_value_set_enum (value, gst_dc1394_src_get_prop_iso_speed (src));
+ break;
+ case PROP_DMA_BUFFER_SIZE:
+ g_value_set_uint (value, gst_dc1394_src_get_prop_dma_buffer_size (src));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+
+static void
+gst_dc1394_src_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec)
+{
+ GstDC1394Src *src;
+
+ src = GST_DC1394_SRC (object);
+ switch (prop_id) {
+ case PROP_CAMERA_GUID:
+ gst_dc1394_src_set_prop_camera_guid (src, g_value_get_string (value));
+ break;
+ case PROP_CAMERA_UNIT:
+ gst_dc1394_src_set_prop_camera_unit (src, g_value_get_int (value));
+ break;
+ case PROP_ISO_SPEED:
+ gst_dc1394_src_set_prop_iso_speed (src, g_value_get_enum (value));
+ break;
+ case PROP_DMA_BUFFER_SIZE:
+ gst_dc1394_src_set_prop_dma_buffer_size (src, g_value_get_uint (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+
+static gboolean
+gst_dc1394_src_start (GstBaseSrc * bsrc)
+{
+ GstDC1394Src *src;
+
+ src = GST_DC1394_SRC (bsrc);
+ return gst_dc1394_src_open_cam (src);
+}
+
+
+static gboolean
+gst_dc1394_src_stop (GstBaseSrc * bsrc)
+{
+ GstDC1394Src *src;
+
+ src = GST_DC1394_SRC (bsrc);
+ if (!gst_dc1394_src_stop_cam (src))
+ return FALSE;
+ gst_dc1394_src_close_cam (src);
+ return TRUE;
+}
+
+
+static GstCaps *
+gst_dc1394_src_get_caps (GstBaseSrc * bsrc, GstCaps * filter)
+{
+ GstDC1394Src *src;
+ GstCaps *caps, *ret;
+
+ src = GST_DC1394_SRC (bsrc);
+ if (src->camera) {
+ caps = gst_dc1394_src_get_cam_caps (src);
+ } else {
+ caps = gst_dc1394_src_get_all_caps ();
+ }
+ if (caps && filter) {
+ ret = gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (caps);
+ } else {
+ ret = caps;
+ }
+ return ret;
+}
+
+
+static gboolean
+gst_dc1394_src_set_caps (GstBaseSrc * bsrc, GstCaps * caps)
+{
+ GstDC1394Src *src;
+
+ src = GST_DC1394_SRC (bsrc);
+ return gst_dc1394_src_stop_cam (src)
+ && gst_dc1394_src_set_cam_caps (src, caps)
+ && gst_dc1394_src_start_cam (src);
+}
+
+
+static GstFlowReturn
+gst_dc1394_src_create (GstPushSrc * psrc, GstBuffer ** obuf)
+{
+ GstDC1394Src *src;
+ GstBuffer *buffer;
+ dc1394video_frame_t *frame;
+ dc1394error_t ret;
+
+ src = GST_DC1394_SRC (psrc);
+ buffer = NULL;
+ ret = dc1394_capture_dequeue (src->camera, DC1394_CAPTURE_POLICY_WAIT,
+ &frame);
+ if (ret != DC1394_SUCCESS) {
+ GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL),
+ ("Could not dequeue frame: %s.", dc1394_error_get_string (ret)));
+ goto error;
+ }
+ /*
+ * TODO: We could create the buffer by wrapping the image bytes in the frame
+ * (enqueing the frame in the notify function) to save the copy operation.
+ * It will only work if all the buffers are disposed before closing the camera
+ * when state changes from PAUSED to READY.
+ */
+ buffer = gst_buffer_new_allocate (NULL, frame->image_bytes, NULL);
+ gst_buffer_fill (buffer, 0, frame->image, frame->image_bytes);
+ /*
+ * TODO: There is a field timestamp in the frame structure,
+ * It is not sure if it could be used as PTS or DTS:
+ * we are not sure if it comes from a monotonic clock,
+ * and it seems to be left undefined under MS Windows.
+ */
+ ret = dc1394_capture_enqueue (src->camera, frame);
+ if (ret != DC1394_SUCCESS) {
+ GST_ELEMENT_WARNING (src, RESOURCE, READ, (NULL),
+ ("Could not enqueue frame: %s.", dc1394_error_get_string (ret)));
+ }
+ *obuf = buffer;
+ return GST_FLOW_OK;
+
+error:
+ if (buffer)
+ gst_buffer_unref (buffer);
+ return GST_FLOW_ERROR;
+}
+
+
+static void
+gst_dc1394_src_set_prop_camera_guid (GstDC1394Src * src, const gchar * guid)
+{
+ gchar *end;
+
+ if (!guid) {
+ GST_DEBUG_OBJECT (src, "Null camera GUID value: %s.",
+ "first camera available will be used");
+ src->guid = -1;
+ return;
+ }
+ errno = 0;
+ src->guid = g_ascii_strtoull (guid, &end, 16);
+ if (errno == ERANGE || end == guid || *end != '\0') {
+ GST_ERROR_OBJECT (src, "Invalid camera GUID value: %s.", guid);
+ return;
+ }
+}
+
+
+static gchar *
+gst_dc1394_src_get_prop_camera_guid (GstDC1394Src * src)
+{
+ if (src->guid == -1) {
+ return NULL;
+ }
+ return g_strdup_printf ("%016" G_GINT64_MODIFIER "X", src->guid);
+}
+
+
+static void
+gst_dc1394_src_set_prop_camera_unit (GstDC1394Src * src, gint unit)
+{
+ src->unit = unit;
+}
+
+
+static gint
+gst_dc1394_src_get_prop_camera_unit (GstDC1394Src * src)
+{
+ return src->unit;
+}
+
+
+static void
+gst_dc1394_src_set_prop_iso_speed (GstDC1394Src * src, guint speed)
+{
+ switch (speed) {
+ case 100:
+ src->iso_speed = DC1394_ISO_SPEED_100;
+ break;
+ case 200:
+ src->iso_speed = DC1394_ISO_SPEED_200;
+ break;
+ case 400:
+ src->iso_speed = DC1394_ISO_SPEED_400;
+ break;
+ case 800:
+ src->iso_speed = DC1394_ISO_SPEED_800;
+ break;
+ case 1600:
+ src->iso_speed = DC1394_ISO_SPEED_1600;
+ break;
+ case 3200:
+ src->iso_speed = DC1394_ISO_SPEED_3200;
+ break;
+ default:
+ GST_ERROR_OBJECT (src, "Invalid ISO speed value: %d.", speed);
+ }
+}
+
+
+static guint
+gst_dc1394_src_get_prop_iso_speed (GstDC1394Src * src)
+{
+ switch (src->iso_speed) {
+ case DC1394_ISO_SPEED_100:
+ return 100;
+ case DC1394_ISO_SPEED_200:
+ return 200;
+ case DC1394_ISO_SPEED_400:
+ return 400;
+ case DC1394_ISO_SPEED_800:
+ return 800;
+ case DC1394_ISO_SPEED_1600:
+ return 1600;
+ case DC1394_ISO_SPEED_3200:
+ return 3200;
+ default: /* never reached */
+ return DC1394_ISO_SPEED_MIN - 1;
+ }
+}
+
+
+static void
+gst_dc1394_src_set_prop_dma_buffer_size (GstDC1394Src * src, guint size)
+{
+ src->dma_buffer_size = size;
+}
+
+
+static guint
+gst_dc1394_src_get_prop_dma_buffer_size (GstDC1394Src * src)
+{
+ return src->dma_buffer_size;
+}
+
+
+static gboolean
+gst_dc1394_src_open_cam (GstDC1394Src * src)
+{
+ dc1394camera_list_t *cameras;
+ dc1394error_t ret;
+ int number;
+ uint64_t guid;
+ int unit, i;
+
+ src->dc1394 = dc1394_new ();
+ if (!src->dc1394) {
+ GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL),
+ ("Could not initialize dc1394 library."));
+ goto error;
+ }
+
+ number = -1;
+ guid = -1;
+ unit = -1;
+ ret = dc1394_camera_enumerate (src->dc1394, &cameras);
+ if (ret != DC1394_SUCCESS) {
+ GST_ELEMENT_ERROR (src, LIBRARY, FAILED, (NULL),
+ ("Could not enumerate cameras: %s.", dc1394_error_get_string (ret)));
+ goto error;
+ }
+ for (i = 0; i < cameras->num; i++) {
+ GST_DEBUG_OBJECT (src, "Camera %2d is %016" G_GINT64_MODIFIER "X %d.",
+ i, cameras->ids[i].guid, cameras->ids[i].unit);
+ if ((src->guid == -1 || src->guid == cameras->ids[i].guid) &&
+ (src->unit == -1 || src->unit == cameras->ids[i].unit)) {
+ number = i;
+ guid = cameras->ids[i].guid;
+ unit = cameras->ids[i].unit;
+ }
+ }
+ dc1394_camera_free_list (cameras);
+ if (number < 0) {
+ if (src->guid == -1) {
+ GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL),
+ ("No cameras found."));
+ } else {
+ GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL),
+ ("Camera %016" G_GINT64_MODIFIER "X %d not found.",
+ src->guid, src->unit));
+ }
+ goto error;
+ }
+
+ GST_DEBUG_OBJECT (src, "Open camera %016" G_GINT64_MODIFIER "X %d.",
+ guid, unit);
+ src->camera = dc1394_camera_new_unit (src->dc1394, guid, unit);
+ if (!src->camera) {
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE, (NULL),
+ ("Could not open camera %016" G_GINT64_MODIFIER "X %d.", guid, unit));
+ goto error;
+ }
+ GST_DEBUG_OBJECT (src,
+ "Camera %016" G_GINT64_MODIFIER "X %d opened: \"%s %s\".",
+ src->camera->guid, src->camera->unit,
+ src->camera->vendor, src->camera->model);
+
+ if (src->iso_speed > DC1394_ISO_SPEED_400) {
+ ret = dc1394_video_set_operation_mode (src->camera,
+ DC1394_OPERATION_MODE_1394B);
+ if (ret != DC1394_SUCCESS) {
+ GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL),
+ ("Could not set 1394B operation mode: %s.",
+ dc1394_error_get_string (ret)));
+ goto error;
+ }
+ }
+ ret = dc1394_video_set_iso_speed (src->camera, src->iso_speed);
+ if (ret != DC1394_SUCCESS) {
+ GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL),
+ ("Could not set ISO speed %d: %s.", src->iso_speed,
+ dc1394_error_get_string (ret)));
+ goto error;
+ }
+
+ return TRUE;
+
+error:
+ if (src->camera) {
+ dc1394_camera_free (src->camera);
+ src->camera = NULL;
+ }
+ if (src->dc1394) {
+ dc1394_free (src->dc1394);
+ src->dc1394 = NULL;
+ }
+ return FALSE;
+}
+
+
+static void
+gst_dc1394_src_close_cam (GstDC1394Src * src)
+{
+ GST_DEBUG_OBJECT (src,
+ "Close camera %016" G_GINT64_MODIFIER "X %d: \"%s %s\".",
+ src->camera->guid, src->camera->unit,
+ src->camera->vendor, src->camera->model);
+ if (src->caps) {
+ gst_caps_unref (src->caps);
+ src->caps = NULL;
+ }
+ dc1394_camera_free (src->camera);
+ src->camera = NULL;
+ dc1394_free (src->dc1394);
+ src->dc1394 = NULL;
+ GST_DEBUG_OBJECT (src, "Camera closed.");
+}
+
+
+static gboolean
+gst_dc1394_src_start_cam (GstDC1394Src * src)
+{
+ dc1394error_t ret;
+ dc1394switch_t status;
+ guint trials;
+
+ GST_DEBUG_OBJECT (src, "Setup capture with a DMA buffer of %d frames",
+ src->dma_buffer_size);
+ ret = dc1394_capture_setup (src->camera, src->dma_buffer_size,
+ DC1394_CAPTURE_FLAGS_DEFAULT);
+ if (ret == DC1394_NO_BANDWIDTH) {
+ GST_DEBUG_OBJECT (src,
+ "Could not setup capture with available ISO bandwidth,"
+ "releasing channels and bandwidth and retrying...");
+ ret = dc1394_iso_release_all (src->camera);
+ if (ret != DC1394_SUCCESS) {
+ GST_ELEMENT_WARNING (src, RESOURCE, FAILED, (NULL),
+ ("Could not release ISO channels and bandwidth: %s",
+ dc1394_error_get_string (ret)));
+ }
+ ret = dc1394_capture_setup (src->camera, src->dma_buffer_size,
+ DC1394_CAPTURE_FLAGS_DEFAULT);
+ }
+ if (ret != DC1394_SUCCESS) {
+ GST_ELEMENT_ERROR (src, RESOURCE, FAILED, (NULL),
+ ("Could not setup capture: %s", dc1394_error_get_string (ret)));
+ goto error_capture;
+ }
+
+ /*
+ * TODO: dc1394_capture_setup/stop can start/stop the transmission
+ * when called with DC1394_CAPTURE_FLAGS_AUTO_ISO in the flags.
+ * The repeated trials check is a leftover of the original code,
+ * and might not be needed.
+ */
+ GST_DEBUG_OBJECT (src, "Enable camera transmission.");
+ ret = dc1394_video_set_transmission (src->camera, DC1394_ON);
+ if (ret != DC1394_SUCCESS) {
+ GST_ELEMENT_ERROR (src, RESOURCE, FAILED, (NULL),
+ ("Could not set transmission status: %s.",
+ dc1394_error_get_string (ret)));
+ goto error_transmission;
+ }
+ ret = dc1394_video_get_transmission (src->camera, &status);
+ for (trials = 10;
+ (trials > 0) && !(ret == DC1394_SUCCESS && status == DC1394_ON);
+ trials--) {
+ GST_DEBUG_OBJECT (src,
+ "Wait for camera to start transmission (%d trials left).", trials);
+ g_usleep (50000);
+ ret = dc1394_video_get_transmission (src->camera, &status);
+ }
+ if (!(ret == DC1394_SUCCESS && status == DC1394_ON)) {
+ GST_ELEMENT_ERROR (src, RESOURCE, FAILED, (NULL),
+ ("Could not get positive transmission status: %s.",
+ dc1394_error_get_string (ret)));
+ goto error_transmission;
+ }
+
+ GST_DEBUG_OBJECT (src, "Capture successfully started.");
+ return TRUE;
+
+error_transmission:
+ ret = dc1394_capture_stop (src->camera);
+ if (ret != DC1394_SUCCESS) {
+ GST_ELEMENT_WARNING (src, RESOURCE, FAILED, (NULL),
+ ("Could not stop capture: %s.", dc1394_error_get_string (ret)));
+ }
+error_capture:
+ return FALSE;
+}
+
+
+static gboolean
+gst_dc1394_src_stop_cam (GstDC1394Src * src)
+{
+ dc1394error_t ret;
+ dc1394switch_t status;
+ guint trials;
+
+ /*
+ * TODO: dc1394_capture_setup/stop can start/stop the transmission
+ * when called with DC1394_CAPTURE_FLAGS_AUTO_ISO in the flags.
+ * The repeated trials check is a leftover of the original code,
+ * and might not be needed.
+ */
+ GST_DEBUG_OBJECT (src, "Disable camera transmission.");
+ ret = dc1394_video_set_transmission (src->camera, DC1394_OFF);
+ if (ret != DC1394_SUCCESS) {
+ GST_ELEMENT_ERROR (src, RESOURCE, FAILED, (NULL),
+ ("Could not set transmission status: %s.",
+ dc1394_error_get_string (ret)));
+ return FALSE;
+ }
+ ret = dc1394_video_get_transmission (src->camera, &status);
+ for (trials = 10;
+ (trials > 0) && !(ret == DC1394_SUCCESS && status == DC1394_OFF);
+ trials--) {
+ GST_DEBUG_OBJECT (src,
+ "Wait for camera to stop transmission (%d trials left).", trials);
+ g_usleep (50000);
+ ret = dc1394_video_get_transmission (src->camera, &status);
+ }
+ if (!(ret == DC1394_SUCCESS && status == DC1394_OFF)) {
+ GST_WARNING_OBJECT (src,
+ "Could not get negative transmission status: %s.",
+ dc1394_error_get_string (ret));
+ }
+
+ GST_DEBUG_OBJECT (src, "Clear capture resources.");
+ ret = dc1394_capture_stop (src->camera);
+ if (ret != DC1394_SUCCESS && ret != DC1394_CAPTURE_IS_NOT_SET) {
+ GST_ELEMENT_ERROR (src, RESOURCE, FAILED, (NULL),
+ ("Could not clear capture: %s.", dc1394_error_get_string (ret)));
+ return FALSE;
+ }
+
+ switch (ret) {
+ case DC1394_CAPTURE_IS_NOT_SET:
+ GST_DEBUG_OBJECT (src, "Capture was not set up.");
+ break;
+ case DC1394_SUCCESS:
+ GST_DEBUG_OBJECT (src, "Capture successfully stopped.");
+ break;
+ default:
+ break;
+ }
+
+ return TRUE;
+}
+
+
+static gboolean
+gst_dc1394_src_set_cam_caps (GstDC1394Src * src, GstCaps * caps)
+{
+ GstCaps *mode_caps;
+ gboolean ok, supported;
+ dc1394video_modes_t supported_modes;
+ dc1394video_mode_t mode;
+ dc1394color_codings_t supported_codings;
+ dc1394color_coding_t coding;
+ dc1394framerates_t supported_rates;
+ dc1394framerate_t rate;
+ double rate_decimal;
+ uint64_t total_bytes;
+ uint32_t width, width_step, height, height_step;
+ guint m, c;
+
+ ok = dc1394_video_get_supported_modes (src->camera,
+ &supported_modes) == DC1394_SUCCESS;
+ if (!ok) {
+ GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL),
+ ("Could not get supported modes."));
+ goto error;
+ }
+ supported = FALSE;
+ for (m = 0; m < supported_modes.num && !supported; m++) {
+ mode = supported_modes.modes[m];
+ mode_caps = gst_caps_new_empty ();
+ if (dc1394_is_video_mode_scalable (mode)) {
+ ok &= dc1394_format7_get_color_codings (src->camera, mode,
+ &supported_codings) == DC1394_SUCCESS;
+ ok &= dc1394_format7_get_max_image_size (src->camera, mode,
+ &width, &height) == DC1394_SUCCESS;
+ ok &= dc1394_format7_get_unit_size (src->camera, mode,
+ &width_step, &height_step) == DC1394_SUCCESS;
+ } else {
+ ok &= dc1394_get_color_coding_from_video_mode (src->camera, mode,
+ &coding) == DC1394_SUCCESS;
+ ok &= dc1394_get_image_size_from_video_mode (src->camera, mode,
+ &width, &height) == DC1394_SUCCESS;
+ ok &= dc1394_video_get_supported_framerates (src->camera, mode,
+ &supported_rates) == DC1394_SUCCESS;
+ }
+ if (!ok) {
+ GST_ELEMENT_WARNING (src, RESOURCE, SETTINGS, (NULL),
+ ("Could not get video mode %d parameters.", mode));
+ } else if (dc1394_is_video_mode_scalable (mode)) {
+ gst_caps_append (mode_caps,
+ gst_dc1394_src_build_caps (&supported_codings, NULL,
+ width_step, width, width_step, height_step, height, height_step));
+ } else {
+ supported_codings.num = 1;
+ supported_codings.codings[0] = coding;
+ gst_caps_append (mode_caps,
+ gst_dc1394_src_build_caps (&supported_codings, &supported_rates,
+ width, width, 1, height, height, 1));
+ }
+ supported = gst_caps_can_intersect (caps, mode_caps);
+ gst_caps_unref (mode_caps);
+ }
+ ok = supported && gst_dc1394_src_parse_caps (caps, &supported_codings, &rate,
+ &rate_decimal, &width, &height);
+ if (!ok) {
+ GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL),
+ ("Unsupported caps %" GST_PTR_FORMAT, caps));
+ goto error;
+ }
+ GST_DEBUG_OBJECT (src, "Set video mode %d.", mode);
+ ok = dc1394_video_set_mode (src->camera, mode) == DC1394_SUCCESS;
+ if (!ok) {
+ GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL),
+ ("Could not set video mode %d.", mode));
+ goto error;
+ }
+ if (dc1394_is_video_mode_scalable (mode)) {
+ ok = FALSE;
+ for (c = 0; c < supported_codings.num && !ok; c++) {
+ coding = supported_codings.codings[c];
+ GST_DEBUG_OBJECT (src,
+ "Try format7 video mode %d with coding %d, size %d %d, and rate %.4f Hz.",
+ mode, coding, width, height, rate_decimal);
+ ok = (dc1394_format7_set_color_coding (src->camera, mode,
+ coding) == DC1394_SUCCESS)
+ && (dc1394_format7_set_image_size (src->camera, mode,
+ width, height) == DC1394_SUCCESS)
+ && (dc1394_format7_get_total_bytes (src->camera, mode,
+ &total_bytes) == DC1394_SUCCESS)
+ && (dc1394_format7_set_packet_size (src->camera, mode,
+ total_bytes * rate_decimal * 0.000125) == DC1394_SUCCESS);
+ }
+ } else {
+ GST_DEBUG_OBJECT (src, "Set fixed video mode %d rate %.4f Hz (%d).",
+ mode, rate_decimal, rate);
+ ok = dc1394_video_set_framerate (src->camera, rate) == DC1394_SUCCESS;
+ }
+ /* TODO: check feature framerate */
+ if (!ok) {
+ GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL),
+ ("Could not set video mode %d parameters.", mode));
+ goto error;
+ }
+ return TRUE;
+
+error:
+ return FALSE;
+}
+
+
+GstCaps *
+gst_dc1394_src_get_cam_caps (GstDC1394Src * src)
+{
+ gboolean ok;
+ dc1394video_modes_t supported_modes;
+ dc1394video_mode_t mode;
+ dc1394color_codings_t supported_codings;
+ dc1394color_coding_t coding;
+ dc1394framerates_t supported_rates;
+ uint32_t width, width_step, height, height_step;
+ guint m;
+
+ if (src->caps)
+ return gst_caps_ref (src->caps);
+
+ ok = dc1394_video_get_supported_modes (src->camera,
+ &supported_modes) == DC1394_SUCCESS;
+ if (!ok) {
+ GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL),
+ ("Could not get supported modes."));
+ return NULL;
+ }
+
+ src->caps = gst_caps_new_empty ();
+ for (m = 0; m < supported_modes.num; m++) {
+ mode = supported_modes.modes[m];
+ if (dc1394_is_video_mode_scalable (mode)) {
+ ok &= dc1394_format7_get_color_codings (src->camera, mode,
+ &supported_codings) == DC1394_SUCCESS;
+ ok &= dc1394_format7_get_max_image_size (src->camera, mode,
+ &width, &height) == DC1394_SUCCESS;
+ ok &= dc1394_format7_get_unit_size (src->camera, mode,
+ &width_step, &height_step) == DC1394_SUCCESS;
+ if (!ok) {
+ GST_ELEMENT_WARNING (src, RESOURCE, SETTINGS, (NULL),
+ ("Could not get format7 video mode %d parameters.", mode));
+ } else {
+ gst_caps_append (src->caps,
+ gst_dc1394_src_build_caps (&supported_codings, NULL,
+ width_step, width, width_step, height_step, height,
+ height_step));
+ }
+ } else {
+ ok &= dc1394_get_image_size_from_video_mode (src->camera, mode,
+ &width, &height) == DC1394_SUCCESS;
+ ok &= dc1394_video_get_supported_framerates (src->camera, mode,
+ &supported_rates) == DC1394_SUCCESS;
+ ok &= dc1394_get_color_coding_from_video_mode (src->camera, mode,
+ &coding) == DC1394_SUCCESS;
+ if (!ok) {
+ GST_ELEMENT_WARNING (src, RESOURCE, SETTINGS, (NULL),
+ ("Could not get fixed video mode %d parameters.", mode));
+ } else {
+ supported_codings.num = 1;
+ supported_codings.codings[0] = coding;
+ gst_caps_append (src->caps,
+ gst_dc1394_src_build_caps (&supported_codings, &supported_rates,
+ width, width, 1, height, height, 1));
+ }
+ }
+ }
+ GST_DEBUG_OBJECT (src, "Camera capabilities: \"%" GST_PTR_FORMAT "\".",
+ src->caps);
+ return gst_caps_ref (src->caps);
+}
+
+
+static GstCaps *
+gst_dc1394_src_get_all_caps (void)
+{
+ GstCaps *caps;
+ dc1394color_coding_t coding;
+ dc1394color_codings_t video_codings;
+ uint32_t width, height;
+
+ const dc1394color_codings_t supported_codings = { 7, {
+ /* DC1394_COLOR_CODING_RGB16S, DC1394_COLOR_CODING_RGB16, */
+ DC1394_COLOR_CODING_RGB8, DC1394_COLOR_CODING_YUV444,
+ DC1394_COLOR_CODING_YUV422, DC1394_COLOR_CODING_YUV411,
+ /* DC1394_COLOR_CODING_RAW16, DC1394_COLOR_CODING_MONO16S */
+ DC1394_COLOR_CODING_MONO16, DC1394_COLOR_CODING_RAW8,
+ DC1394_COLOR_CODING_MONO8}
+ };
+ const dc1394framerates_t all_rates = { 8, {
+ DC1394_FRAMERATE_1_875, DC1394_FRAMERATE_3_75, DC1394_FRAMERATE_7_5,
+ DC1394_FRAMERATE_15, DC1394_FRAMERATE_30, DC1394_FRAMERATE_60,
+ DC1394_FRAMERATE_120, DC1394_FRAMERATE_240}
+ };
+ dc1394video_mode_t mode;
+
+ caps = gst_caps_new_empty ();
+ /* First caps for fixed video modes */
+ for (mode = DC1394_VIDEO_MODE_MIN; mode < DC1394_VIDEO_MODE_EXIF; mode++) {
+ dc1394_get_image_size_from_video_mode (NULL, mode, &width, &height);
+ dc1394_get_color_coding_from_video_mode (NULL, mode, &coding);
+ video_codings.codings[0] = coding;
+ video_codings.num = 1;
+ gst_caps_append (caps,
+ gst_dc1394_src_build_caps (&video_codings, &all_rates,
+ width, width, 1, height, height, 1));
+ }
+ /* Then caps for Format 7 modes */
+ gst_caps_append (caps,
+ gst_dc1394_src_build_caps (&supported_codings, NULL,
+ 1, G_MAXINT, 1, 1, G_MAXINT, 1));
+ return caps;
+}
+
+
+static GstCaps *
+gst_dc1394_src_build_caps (const dc1394color_codings_t * supported_codings,
+ const dc1394framerates_t * supported_rates,
+ uint32_t width_min, uint32_t width_max, uint32_t width_step,
+ uint32_t height_min, uint32_t height_max, uint32_t height_step)
+{
+ GstCaps *caps;
+ GstStructure *structure;
+ GstVideoFormat video_format;
+ dc1394color_coding_t coding;
+ dc1394framerate_t rate;
+ GValue format = { 0 };
+ GValue formats = { 0 };
+ GValue width = { 0 };
+ GValue widths = { 0 };
+ GValue height = { 0 };
+ GValue heights = { 0 };
+ GValue framerate = { 0 };
+ GValue framerates = { 0 };
+ guint c, w, h, r;
+
+ caps = gst_caps_new_empty ();
+ for (c = 0; c < supported_codings->num; c++) {
+ coding = supported_codings->codings[c];
+ switch (coding) {
+ case DC1394_COLOR_CODING_MONO8:
+ video_format = GST_VIDEO_FORMAT_GRAY8;
+ break;
+ case DC1394_COLOR_CODING_YUV411:
+ video_format = GST_VIDEO_FORMAT_IYU1;
+ break;
+ case DC1394_COLOR_CODING_YUV422:
+ video_format = GST_VIDEO_FORMAT_UYVY;
+ break;
+ case DC1394_COLOR_CODING_YUV444:
+ video_format = GST_VIDEO_FORMAT_IYU2;
+ break;
+ case DC1394_COLOR_CODING_RGB8:
+ video_format = GST_VIDEO_FORMAT_RGB;
+ break;
+ case DC1394_COLOR_CODING_RAW8:
+ video_format = GST_VIDEO_FORMAT_UNKNOWN; /* GST_BAYER_FORMAT_XXXX8 */
+ break;
+ case DC1394_COLOR_CODING_MONO16:
+ video_format = GST_VIDEO_FORMAT_GRAY16_BE;
+ break;
+ /*
+ * The following formats do not exist in Gstreamer:
+ *case DC1394_COLOR_CODING_RGB16: // Unsigned RGB 16 bits per channel
+ * video_format = GST_VIDEO_FORMAT_RGB48;
+ * break;
+ *case DC1394_COLOR_CODING_MONO16S: // Signed grayscale 16 bits
+ * video_format = GST_VIDEO_FORMAT_GRAY16_BE_SIGNED;
+ * break;
+ *case DC1394_COLOR_CODING_RGB16S: // Signed RGB 16 bits per channel
+ * video_format = GST_VIDEO_FORMAT_RGB48_SIGNED;
+ * break;
+ *case DC1394_COLOR_CODING_RAW16: // Raw sensor output (bayer) 16 bits
+ * video_format = GST_VIDEO_FORMAT_UNKNOWN; // GST_BAYER_FORMAT_XXXX16_BE
+ * break;
+ */
+ default:
+ video_format = GST_VIDEO_FORMAT_UNKNOWN;
+ GST_DEBUG ("unsupported dc1394 video coding %d", coding);
+ }
+ if (video_format != GST_VIDEO_FORMAT_UNKNOWN) {
+ g_value_init (&formats, G_TYPE_STRING);
+ g_value_set_string (&formats, gst_video_format_to_string (video_format));
+ structure = gst_structure_new_empty ("video/x-raw");
+ gst_structure_set_value (structure, "format", &formats);
+ gst_caps_append_structure (caps, structure);
+ g_value_unset (&formats);
+ }
+ if (coding == DC1394_COLOR_CODING_MONO8 ||
+ coding == DC1394_COLOR_CODING_RAW8) {
+ g_value_init (&formats, GST_TYPE_LIST);
+ g_value_init (&format, G_TYPE_STRING);
+ g_value_set_static_string (&format, "bggr");
+ gst_value_list_append_value (&formats, &format);
+ g_value_set_static_string (&format, "rggb");
+ gst_value_list_append_value (&formats, &format);
+ g_value_set_static_string (&format, "grbg");
+ gst_value_list_append_value (&formats, &format);
+ g_value_set_static_string (&format, "gbrg");
+ gst_value_list_append_value (&formats, &format);
+ structure = gst_structure_new_empty ("video/x-bayer");
+ gst_structure_set_value (structure, "format", &formats);
+ gst_caps_append_structure (caps, structure);
+ g_value_unset (&format);
+ g_value_unset (&formats);
+ }
+ }
+
+ if (width_min == width_max) {
+ g_value_init (&widths, G_TYPE_INT);
+ g_value_set_int (&widths, width_min);
+ } else if (width_step == 1) {
+ g_value_init (&widths, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&widths, width_min, width_max);
+ } else {
+ g_value_init (&widths, GST_TYPE_LIST);
+ g_value_init (&width, G_TYPE_INT);
+ for (w = width_min; w <= width_max; w += width_step) {
+ g_value_set_int (&width, w);
+ gst_value_list_append_value (&widths, &width);
+ }
+ g_value_unset (&width);
+ }
+ if (height_min == height_max) {
+ g_value_init (&heights, G_TYPE_INT);
+ g_value_set_int (&heights, height_min);
+ } else if (height_step == 1) {
+ g_value_init (&heights, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&heights, height_min, height_max);
+ } else {
+ g_value_init (&heights, GST_TYPE_LIST);
+ g_value_init (&height, G_TYPE_INT);
+ for (h = height_min; h <= height_max; h += height_step) {
+ g_value_set_int (&height, h);
+ gst_value_list_append_value (&heights, &height);
+ }
+ g_value_unset (&height);
+ }
+ gst_caps_set_value (caps, "width", &widths);
+ gst_caps_set_value (caps, "height", &heights);
+ g_value_unset (&widths);
+ g_value_unset (&heights);
+
+ if (supported_rates) {
+ g_value_init (&framerates, GST_TYPE_LIST);
+ g_value_init (&framerate, GST_TYPE_FRACTION);
+ for (r = 0; r < supported_rates->num; r++) {
+ rate = supported_rates->framerates[r];
+ switch (rate) {
+ case DC1394_FRAMERATE_1_875:
+ gst_value_set_fraction (&framerate, 240, 128);
+ break;
+ case DC1394_FRAMERATE_3_75:
+ gst_value_set_fraction (&framerate, 240, 64);
+ break;
+ case DC1394_FRAMERATE_7_5:
+ gst_value_set_fraction (&framerate, 240, 32);
+ break;
+ case DC1394_FRAMERATE_15:
+ gst_value_set_fraction (&framerate, 240, 16);
+ break;
+ case DC1394_FRAMERATE_30:
+ gst_value_set_fraction (&framerate, 240, 8);
+ break;
+ case DC1394_FRAMERATE_60:
+ gst_value_set_fraction (&framerate, 240, 4);
+ break;
+ case DC1394_FRAMERATE_120:
+ gst_value_set_fraction (&framerate, 240, 2);
+ break;
+ case DC1394_FRAMERATE_240:
+ gst_value_set_fraction (&framerate, 240, 1);
+ break;
+ }
+ gst_value_list_append_value (&framerates, &framerate);
+ }
+ g_value_unset (&framerate);
+ } else {
+ g_value_init (&framerates, GST_TYPE_FRACTION_RANGE);
+ gst_value_set_fraction_range_full (&framerates, 1, G_MAXINT, G_MAXINT, 1);
+ }
+ gst_caps_set_value (caps, "framerate", &framerates);
+ g_value_unset (&framerates);
+ return caps;
+}
+
+
+static gboolean
+gst_dc1394_src_parse_caps (const GstCaps * caps,
+ dc1394color_codings_t * color_codings,
+ dc1394framerate_t * rate, double *rate_decimal,
+ uint32_t * width, uint32_t * height)
+{
+ const GstStructure *structure;
+ const gchar *format;
+ gint w, h, num, den;
+ gdouble dec;
+
+ structure = gst_caps_get_structure (caps, 0);
+ if (!structure)
+ goto error;
+
+ if (!gst_structure_get_int (structure, "width", &w)
+ || !gst_structure_get_int (structure, "height", &h))
+ goto error;
+
+ *width = w;
+ *height = h;
+
+ if (!gst_structure_get_fraction (structure, "framerate", &num, &den))
+ goto error;
+
+ if (gst_util_fraction_compare (num, den, 240, 128) <= 0) {
+ *rate = DC1394_FRAMERATE_1_875;
+ } else if (gst_util_fraction_compare (num, den, 240, 64) <= 0) {
+ *rate = DC1394_FRAMERATE_3_75;
+ } else if (gst_util_fraction_compare (num, den, 240, 32) <= 0) {
+ *rate = DC1394_FRAMERATE_7_5;
+ } else if (gst_util_fraction_compare (num, den, 240, 16) <= 0) {
+ *rate = DC1394_FRAMERATE_15;
+ } else if (gst_util_fraction_compare (num, den, 240, 8) <= 0) {
+ *rate = DC1394_FRAMERATE_30;
+ } else if (gst_util_fraction_compare (num, den, 240, 4) <= 0) {
+ *rate = DC1394_FRAMERATE_60;
+ } else if (gst_util_fraction_compare (num, den, 240, 2) <= 0) {
+ *rate = DC1394_FRAMERATE_120;
+ } else if (gst_util_fraction_compare (num, den, 240, 1) <= 0) {
+ *rate = DC1394_FRAMERATE_240;
+ } else {
+ *rate = DC1394_FRAMERATE_240;
+ }
+
+ gst_util_fraction_to_double (num, den, &dec);
+ *rate_decimal = dec;
+
+ if (gst_structure_has_name (structure, "video/x-raw")) {
+ format = gst_structure_get_string (structure, "format");
+ switch (gst_video_format_from_string (format)) {
+ case GST_VIDEO_FORMAT_GRAY8:
+ color_codings->num = 1;
+ color_codings->codings[0] = DC1394_COLOR_CODING_MONO8;
+ break;
+ case GST_VIDEO_FORMAT_IYU1:
+ color_codings->num = 1;
+ color_codings->codings[0] = DC1394_COLOR_CODING_YUV411;
+ break;
+ case GST_VIDEO_FORMAT_UYVY:
+ color_codings->num = 1;
+ color_codings->codings[0] = DC1394_COLOR_CODING_YUV422;
+ break;
+ case GST_VIDEO_FORMAT_IYU2:
+ color_codings->num = 1;
+ color_codings->codings[0] = DC1394_COLOR_CODING_YUV444;
+ break;
+ case GST_VIDEO_FORMAT_RGB:
+ color_codings->num = 1;
+ color_codings->codings[0] = DC1394_COLOR_CODING_RGB8;
+ break;
+ case GST_VIDEO_FORMAT_GRAY16_BE:
+ color_codings->num = 1;
+ color_codings->codings[0] = DC1394_COLOR_CODING_MONO16;
+ break;
+ /*
+ * The following formats do not exist in Gstreamer:
+ *case GST_VIDEO_FORMAT_RGB48: // Unsigned RGB format 16 bits per channel
+ * color_codings->num = 1
+ * color_codings->codings[0] = DC1394_COLOR_CODING_RGB16;
+ * break;
+ *case GST_VIDEO_FORMAT_GRAY16_BE_SIGNED: // Signed grayscale format 16 bits
+ * color_codings->num = 1
+ * color_codings->codings[0] = DC1394_COLOR_CODING_MONO16S;
+ * break;
+ *case GST_VIDEO_FORMAT_RGB48_SIGNED: // Signed RGB format 16 bits per channel
+ * color_codings->num = 1
+ * color_codings->codings[0] = DC1394_COLOR_CODING_RGB16S;
+ * break;
+ */
+ default:
+ GST_ERROR ("unsupported raw video format %s", format);
+ goto error;
+ }
+ } else if (gst_structure_has_name (structure, "video/x-bayer")) {
+ /*
+ * The following formats do not exist in Gstreamer:
+ *switch (gst_bayer_format_from_string(format)) {
+ * case GST_BAYER_FORMAT_BGGR8:
+ * case GST_BAYER_FORMAT_GBRG8:
+ * case GST_BAYER_FORMAT_GRBG8:
+ * case GST_BAYER_FORMAT_BGGR8:
+ * *coding = DC1394_COLOR_CODING_RAW8;
+ * break;
+ * case GST_BAYER_FORMAT_BGGR16_BE:
+ * case GST_BAYER_FORMAT_GBRG16_BE:
+ * case GST_BAYER_FORMAT_GRBG16_BE:
+ * case GST_BAYER_FORMAT_BGGR16_BE:
+ * *coding = DC1394_COLOR_CODING_RAW16;
+ * break;
+ * default:
+ * GST_ERROR("unsupported raw video format %s", format);
+ * goto error;
+ *}
+ */
+ color_codings->num = 2;
+ color_codings->codings[0] = DC1394_COLOR_CODING_RAW8;
+ color_codings->codings[1] = DC1394_COLOR_CODING_MONO8;
+ } else {
+ goto error;
+ }
+
+ return TRUE;
+
+error:
+ return FALSE;
+}
+
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ GST_DEBUG_CATEGORY_INIT (dc1394_debug, "dc1394", 0, "DC1394 interface");
+
+ return gst_element_register (plugin, "dc1394src", GST_RANK_NONE,
+ GST_TYPE_DC1394_SRC);
+}
+
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ dc1394,
+ "1394 IIDC video source",
+ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/ext/dc1394/gstdc1394src.h b/ext/dc1394/gstdc1394src.h
new file mode 100644
index 0000000..8767826
--- /dev/null
+++ b/ext/dc1394/gstdc1394src.h
@@ -0,0 +1,60 @@
+/* GStreamer
+ * Copyright (C) <2006> Eric Jonas <jonas@mit.edu>
+ * Copyright (C) <2006> Antoine Tremblay <hexa00@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_DC1394_H__
+#define __GST_DC1394_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstpushsrc.h>
+#include <dc1394/control.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_DC1394_SRC (gst_dc1394_src_get_type())
+#define GST_DC1394_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DC1394_SRC,GstDC1394Src))
+#define GST_DC1394_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DC1394_SRC,GstDC1394SrcClass))
+#define GST_IS_DC1394_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DC1394_SRC))
+#define GST_IS_DC1394_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DC1394_SRC))
+
+typedef struct _GstDC1394Src GstDC1394Src;
+typedef struct _GstDC1394SrcClass GstDC1394SrcClass;
+
+struct _GstDC1394Src {
+ GstPushSrc pushsrc;
+
+ GstCaps * caps;
+
+ uint64_t guid;
+ int unit;
+ dc1394speed_t iso_speed;
+ uint32_t dma_buffer_size;
+ dc1394camera_t * camera;
+ dc1394_t * dc1394;
+};
+
+struct _GstDC1394SrcClass {
+ GstPushSrcClass parent_class;
+};
+
+GType gst_dc1394_src_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_DC1394_H__ */
diff --git a/ext/directfb/Makefile.in b/ext/directfb/Makefile.in
index 0d4c313..3146226 100644
--- a/ext/directfb/Makefile.in
+++ b/ext/directfb/Makefile.in
@@ -312,6 +312,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -333,6 +335,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -382,6 +386,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -527,6 +533,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -653,8 +661,6 @@
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@
@@ -697,8 +703,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/directfb/dfbvideosink.c b/ext/directfb/dfbvideosink.c
index 7ef617f..a6f433b 100644
--- a/ext/directfb/dfbvideosink.c
+++ b/ext/directfb/dfbvideosink.c
@@ -168,6 +168,19 @@
return type;
}
+static gboolean
+gst_meta_dfbsurface_init (GstMetaDfbSurface * meta, gpointer params,
+ GstBuffer * buf)
+{
+ meta->surface = NULL;
+ meta->width = meta->height = 0;
+ meta->locked = FALSE;
+ meta->pixel_format = 0;
+ meta->dfbvideosink = NULL;
+
+ return TRUE;
+}
+
/* our metadata */
const GstMetaInfo *
gst_meta_dfbsurface_get_info (void)
@@ -178,7 +191,8 @@
const GstMetaInfo *meta =
gst_meta_register (gst_meta_dfbsurface_api_get_type (),
"GstMetaDfbSurface", sizeof (GstMetaDfbSurface),
- (GstMetaInitFunction) NULL, (GstMetaFreeFunction) NULL,
+ (GstMetaInitFunction) gst_meta_dfbsurface_init,
+ (GstMetaFreeFunction) NULL,
(GstMetaTransformFunction) NULL);
g_once_init_leave (&meta_info, meta);
}
@@ -2420,8 +2434,8 @@
"DirectFB video sink", "Sink/Video", "A DirectFB based videosink",
"Julien Moutte <julien@moutte.net>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_dfbvideosink_sink_template_factory));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_dfbvideosink_sink_template_factory);
gstelement_class->change_state = gst_dfbvideosink_change_state;
diff --git a/ext/dtls/Makefile.in b/ext/dtls/Makefile.in
index c92a0a0..ea4d400 100644
--- a/ext/dtls/Makefile.in
+++ b/ext/dtls/Makefile.in
@@ -243,7 +243,7 @@
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
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
@@ -309,6 +309,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -330,6 +332,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -379,6 +383,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -524,6 +530,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -650,8 +658,6 @@
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@
@@ -694,8 +700,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/dtls/README b/ext/dtls/README
new file mode 100644
index 0000000..8d165ec
--- /dev/null
+++ b/ext/dtls/README
@@ -0,0 +1,153 @@
+INTRODUCTION
+============
+This document is an attempt to describe the basics of the DTLS element.
+It hasn't been written by the author(s) and so, besides being incomplete,
+*IT MIGHT ALSO BE INCORRECT*. So take it with a pinch of salt.
+
+As always, if in doubt ask the #gstreamer IRC channel.
+
+THE INTERNALS
+=============
+This plugin provides two main elements (dtlssrtpdec and dtlssrtpenc) and a few
+minor elements necessary to implement them. The two elements dtlssrtpdec and
+dtlssrtpenc are the only ones you are supposed to include in, respectively, the
+RX and TX pipelines of your DTLS-enabled application. This means you're not
+supposed to directly include those minor elements in your pipelines.
+
+dtlssrtpenc
+-----------
+This element is to be included in the TX pipeline and will initiate the DTLS
+handshake if configured to be the client. Its main configuration parameters are:
+
+ - connection-id: a string that must match the connection-id in dtlssrtpdec;
+ - is-client: a boolean that indicates whether this is going to be the client
+ or the server during the DTLS handshake.
+
+Internally this element comprises the standard srtpenc element, the dtlsenc
+element and a funnel to connect both these elements to one single output.
+The srtpenc can be used to encrypt SRTP/SRTCP packets while the dtlsenc can be
+used to encrypt generic data, e.g. for non-SRTP applications.
+
+NB With the current implementation the TX pipeline containing the dtlssrtpenc
+ must be created *AFTER* the RX pipeline.
+
+dtlssrtpdec
+-----------
+It is to be included in the RX pipeline. Its main configuration parameters are:
+
+ - connection-id: a string that must match the connection-id in dtlssrtpenc;
+ - pem: a string that can be used to provide your own certificate *AND* private
+ key in PEM format. The private key is required to carry out the
+ handshake so do not forget it or the DTLS negotiation will fail;
+ - peer_pem: a read only parameter that can be used to retrieve the
+ certificate sent from the other party in PEM format once the
+ handshake is completed.
+
+Internally this element comprises a dtlssrtpdemux, a standard srtpdec element
+and the dtlsdec element. The dtlssrtpdemux element switches SRT(C)P packets to
+the srtpdec element and DTLS packets to the dtlsdec element and discards any
+other unknown packet. So, similarly for the dtlssrtpenc case, DTLS-SRTP
+applications would exercise the srtpdec element and any other non-SRTP
+application would exercise the dtlsdec element.
+
+NB With the current implementation the RX pipeline containing the dtlssrtpdec
+ must be created *BEFORE* the TX pipeline.
+
+EXAMPLE PIPELINE
+================
+The following is an example usage of the DTLS plugin. It is a python script that
+creates two endpoints that exchange encrypted audio using DTLS to exchange the
+encryption keys.
+
+NB In theory we would show an example gst-launch command. However that would not
+ be enough because you need two pairs of TX/RX pipelines for a proper
+ handshake and you can't use gst-launch two start 4 different pipelines.
+ This why there is a python script in here.
+
+```
+#!/usr/bin/env python3
+
+# create two endpoints, each with tx and rx pipelines using the DTLS
+# elements and let audio flowing for a while to give time for a packet capture
+
+import time
+from gi.repository import Gst, GObject, GLib
+GObject.threads_init()
+Gst.init(None)
+
+
+def _start_pipeline(pipeline):
+ pipeline.set_state(Gst.State.PLAYING)
+ pipeline.get_state(Gst.CLOCK_TIME_NONE)
+
+
+def _sleep_while_iterating_gloop(secs):
+ """ block for secs seconds but iterate the gloop while you do """
+ for _ in range(10 * secs):
+ gloop = GLib.MainLoop()
+ gloop_context = gloop.get_context()
+ gloop_context.iteration(may_block=False)
+ time.sleep(0.1)
+
+def dtls_tx_pipeline_description(name, is_client, port):
+ return ' ! '.join([
+ 'audiotestsrc is-live=true',
+ 'audio/x-raw, rate=8000, format=S16LE, channels=1',
+ 'opusenc frame-size=10',
+ 'rtpopuspay pt=103',
+ '.rtp_sink_0 dtlssrtpenc connection-id={name} is-client={client} .src',
+ 'udpsink port={port}'
+ ]).format(name=name, client=is_client, port=port)
+
+
+def dtls_rx_pipeline_description(name, port):
+ return ' ! '.join([
+ 'udpsrc port={port}',
+ '.sink dtlssrtpdec connection-id={name} .rtp_src',
+ 'queue',
+ 'fakesink async=false'
+ ]).format(name=name, port=port)
+
+
+class Endpoint:
+ def __init__(self, name, is_client, tx_port, rx_port):
+ self.name = name
+ tx_pipeline_description = dtls_tx_pipeline_description(
+ name, is_client, tx_port
+ )
+ rx_pipeline_description = dtls_rx_pipeline_description(name, rx_port)
+ print(rx_pipeline_description)
+ print(tx_pipeline_description)
+
+ self.rx_pipeline = Gst.parse_launch(rx_pipeline_description)
+ self.tx_pipeline = Gst.parse_launch(tx_pipeline_description)
+
+ def start(self):
+ # Start RX first, otherwise it fails due to the current implementation
+ self.start_rx_pipeline()
+ self.start_tx_pipeline()
+
+ def start_rx_pipeline(self):
+ _start_pipeline(self.rx_pipeline)
+
+ def start_tx_pipeline(self):
+ _start_pipeline(self.tx_pipeline)
+
+ def stop(self):
+ def stop_pipeline(p):
+ p.set_state(Gst.State.NULL)
+ p.get_state(Gst.CLOCK_TIME_NONE)
+ stop_pipeline(self.tx_pipeline)
+ stop_pipeline(self.rx_pipeline)
+
+blue = Endpoint("blue", is_client=True, tx_port=23000, rx_port=23002)
+red = Endpoint("red", is_client=False, tx_port=23002, rx_port=23000)
+
+red.start()
+blue.start()
+
+_sleep_while_iterating_gloop(3)
+
+red.stop()
+blue.stop()
+```
diff --git a/ext/dtls/gstdtlsdec.c b/ext/dtls/gstdtlsdec.c
index f05b4f1..3770de0 100644
--- a/ext/dtls/gstdtlsdec.c
+++ b/ext/dtls/gstdtlsdec.c
@@ -173,10 +173,8 @@
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
- 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));
+ gst_element_class_add_static_pad_template (element_class, &src_template);
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_set_static_metadata (element_class,
"DTLS Decoder",
diff --git a/ext/dtls/gstdtlsenc.c b/ext/dtls/gstdtlsenc.c
index 060f053..9c64935 100644
--- a/ext/dtls/gstdtlsenc.c
+++ b/ext/dtls/gstdtlsenc.c
@@ -162,10 +162,8 @@
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
- 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));
+ gst_element_class_add_static_pad_template (element_class, &src_template);
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_set_static_metadata (element_class,
"DTLS Encoder",
diff --git a/ext/dtls/gstdtlssrtpdec.c b/ext/dtls/gstdtlssrtpdec.c
index 5e29a0f..300fb9c 100644
--- a/ext/dtls/gstdtlssrtpdec.c
+++ b/ext/dtls/gstdtlssrtpdec.c
@@ -133,14 +133,10 @@
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&rtp_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&rtcp_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&data_src_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
+ gst_element_class_add_static_pad_template (element_class, &rtp_src_template);
+ gst_element_class_add_static_pad_template (element_class, &rtcp_src_template);
+ gst_element_class_add_static_pad_template (element_class, &data_src_template);
gst_element_class_set_static_metadata (element_class,
"DTLS-SRTP Decoder",
@@ -169,19 +165,19 @@
+-----------+
*/
- self->srtp_dec = gst_element_factory_make ("srtpdec", "srtp-decoder");
+ self->srtp_dec = gst_element_factory_make ("srtpdec", NULL);
if (!self->srtp_dec) {
GST_ERROR_OBJECT (self,
"failed to create srtp_dec, is the srtp plugin registered?");
return;
}
self->dtls_srtp_demux =
- gst_element_factory_make ("dtlssrtpdemux", "dtls-srtp-demux");
+ gst_element_factory_make ("dtlssrtpdemux", NULL);
if (!self->dtls_srtp_demux) {
GST_ERROR_OBJECT (self, "failed to create dtls_srtp_demux");
return;
}
- self->bin.dtls_element = gst_element_factory_make ("dtlsdec", "dtls-decoder");
+ self->bin.dtls_element = gst_element_factory_make ("dtlsdec", NULL);
if (!self->bin.dtls_element) {
GST_ERROR_OBJECT (self, "failed to create dtls_dec");
return;
diff --git a/ext/dtls/gstdtlssrtpdemux.c b/ext/dtls/gstdtlssrtpdemux.c
index f52d5fb..ab1ef70 100644
--- a/ext/dtls/gstdtlssrtpdemux.c
+++ b/ext/dtls/gstdtlssrtpdemux.c
@@ -69,12 +69,9 @@
element_class = (GstElementClass *) klass;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&rtp_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&dtls_src_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
+ gst_element_class_add_static_pad_template (element_class, &rtp_src_template);
+ gst_element_class_add_static_pad_template (element_class, &dtls_src_template);
gst_element_class_set_static_metadata (element_class,
"DTLS SRTP Demultiplexer",
diff --git a/ext/dtls/gstdtlssrtpenc.c b/ext/dtls/gstdtlssrtpenc.c
index 941afac..237aec5 100644
--- a/ext/dtls/gstdtlssrtpenc.c
+++ b/ext/dtls/gstdtlssrtpenc.c
@@ -139,14 +139,12 @@
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&rtp_sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&rtcp_sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&data_sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (element_class, &rtp_sink_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &rtcp_sink_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &data_sink_template);
+ gst_element_class_add_static_pad_template (element_class, &src_template);
gst_element_class_set_static_metadata (element_class,
"DTLS-SRTP Encoder",
@@ -174,19 +172,19 @@
+--------------------+ +-----------------+
*/
- self->srtp_enc = gst_element_factory_make ("srtpenc", "srtp-encoder");
+ self->srtp_enc = gst_element_factory_make ("srtpenc", NULL);
if (!self->srtp_enc) {
GST_ERROR_OBJECT (self,
"failed to create srtp encoder, is the srtp plugin registered?");
return;
}
g_return_if_fail (self->srtp_enc);
- self->bin.dtls_element = gst_element_factory_make ("dtlsenc", "dtls-encoder");
+ self->bin.dtls_element = gst_element_factory_make ("dtlsenc", NULL);
if (!self->bin.dtls_element) {
GST_ERROR_OBJECT (self, "failed to create dtls encoder");
return;
}
- self->funnel = gst_element_factory_make ("funnel", "funnel");
+ self->funnel = gst_element_factory_make ("funnel", NULL);
if (!self->funnel) {
GST_ERROR_OBJECT (self, "failed to create funnel");
return;
diff --git a/ext/dts/Makefile.in b/ext/dts/Makefile.in
index e5f7fa7..1e08d81 100644
--- a/ext/dts/Makefile.in
+++ b/ext/dts/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/dts/gstdtsdec.c b/ext/dts/gstdtsdec.c
index 767b6bf..70ffbc7 100644
--- a/ext/dts/gstdtsdec.c
+++ b/ext/dts/gstdtsdec.c
@@ -38,8 +38,11 @@
#include "config.h"
#endif
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+
#include <string.h>
-#include "_stdint.h"
#include <stdlib.h>
#include <gst/gst.h>
@@ -156,10 +159,8 @@
gobject_class->set_property = gst_dtsdec_set_property;
gobject_class->get_property = gst_dtsdec_get_property;
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_factory);
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
gst_element_class_set_static_metadata (gstelement_class, "DTS audio decoder",
"Codec/Decoder/Audio",
"Decodes DTS audio streams",
diff --git a/ext/faac/Makefile.in b/ext/faac/Makefile.in
index 09b85a3..1a73219 100644
--- a/ext/faac/Makefile.in
+++ b/ext/faac/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/faac/gstfaac.c b/ext/faac/gstfaac.c
index 6804cbf..7e3cf41 100644
--- a/ext/faac/gstfaac.c
+++ b/ext/faac/gstfaac.c
@@ -191,8 +191,7 @@
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));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_template);
sink_caps = gst_faac_enc_generate_sink_caps ();
sink_templ = gst_pad_template_new ("sink",
diff --git a/ext/faad/Makefile.in b/ext/faad/Makefile.in
index 86ddefa..0d8f095 100644
--- a/ext/faad/Makefile.in
+++ b/ext/faad/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/faad/gstfaad.c b/ext/faad/gstfaad.c
index b72b42d..07cca30 100644
--- a/ext/faad/gstfaad.c
+++ b/ext/faad/gstfaad.c
@@ -111,10 +111,8 @@
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
GstAudioDecoderClass *base_class = GST_AUDIO_DECODER_CLASS (klass);
- 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));
+ gst_element_class_add_static_pad_template (element_class, &src_template);
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_set_static_metadata (element_class, "AAC audio decoder",
"Codec/Decoder/Audio",
diff --git a/ext/fdkaac/Makefile.am b/ext/fdkaac/Makefile.am
new file mode 100644
index 0000000..95cae3e
--- /dev/null
+++ b/ext/fdkaac/Makefile.am
@@ -0,0 +1,13 @@
+plugin_LTLIBRARIES = libgstfdkaac.la
+
+libgstfdkaac_la_SOURCES = plugin.c gstfdkaacenc.c gstfdkaacdec.c
+libgstfdkaac_la_CFLAGS = -DGST_USE_UNSTABLE_API \
+ $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) \
+ $(GST_CFLAGS) $(FDK_AAC_CFLAGS)
+libgstfdkaac_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \
+ -lgstaudio-@GST_API_VERSION@ -lgstpbutils-@GST_API_VERSION@ \
+ $(GST_BASE_LIBS) $(FDK_AAC_LIBS)
+libgstfdkaac_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstfdkaac_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
+
+noinst_HEADERS = gstfdkaacenc.h gstfdkaacdec.h
diff --git a/tests/examples/gl/gtk/gtkvideooverlay/Makefile.in b/ext/fdkaac/Makefile.in
similarity index 71%
copy from tests/examples/gl/gtk/gtkvideooverlay/Makefile.in
copy to ext/fdkaac/Makefile.in
index aef9ed4..1f4bbb4 100644
--- a/tests/examples/gl/gtk/gtkvideooverlay/Makefile.in
+++ b/ext/fdkaac/Makefile.in
@@ -14,6 +14,7 @@
@SET_MAKE@
+
VPATH = @srcdir@
am__is_gnu_make = { \
if test -z '$(MAKELEVEL)'; then \
@@ -89,8 +90,7 @@
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
-noinst_PROGRAMS = gtkvideooverlay$(EXEEXT)
-subdir = tests/examples/gl/gtk/gtkvideooverlay
+subdir = ext/fdkaac
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 \
@@ -127,27 +127,56 @@
$(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 $(am__DIST_COMMON)
+DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \
+ $(am__DIST_COMMON)
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
-PROGRAMS = $(noinst_PROGRAMS)
-am_gtkvideooverlay_OBJECTS = gtkvideooverlay-main.$(OBJEXT)
-gtkvideooverlay_OBJECTS = $(am_gtkvideooverlay_OBJECTS)
+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)
am__DEPENDENCIES_1 =
-gtkvideooverlay_DEPENDENCIES = ../libgstgtkhelper.la \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
+libgstfdkaac_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libgstfdkaac_la_OBJECTS = libgstfdkaac_la-plugin.lo \
+ libgstfdkaac_la-gstfdkaacenc.lo \
+ libgstfdkaac_la-gstfdkaacdec.lo
+libgstfdkaac_la_OBJECTS = $(am_libgstfdkaac_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 =
-gtkvideooverlay_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
- $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
- $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
+libgstfdkaac_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstfdkaac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstfdkaac_la_CFLAGS) $(CFLAGS) \
+ $(libgstfdkaac_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
@@ -164,31 +193,32 @@
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
am__mv = mv -f
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+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_CXXFLAGS) $(CXXFLAGS)
-AM_V_CXX = $(am__v_CXX_@AM_V@)
-am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
-am__v_CXX_0 = @echo " CXX " $@;
-am__v_CXX_1 =
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
- $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
-am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
-am__v_CXXLD_0 = @echo " CXXLD " $@;
-am__v_CXXLD_1 =
-SOURCES = $(gtkvideooverlay_SOURCES)
-DIST_SOURCES = $(gtkvideooverlay_SOURCES)
+ $(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 = $(libgstfdkaac_la_SOURCES)
+DIST_SOURCES = $(libgstfdkaac_la_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 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -295,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -344,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -489,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -615,8 +653,6 @@
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@
@@ -659,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -749,19 +790,23 @@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
wayland_scanner = @wayland_scanner@
-gtkvideooverlay_SOURCES = main.cpp
-gtkvideooverlay_CXXFLAGS = -I$(top_srcdir)/gst-libs -I$(top_builddir)/gst-libs \
- $(GST_PLUGINS_BASE_CFLAGS) $(GST_CXXFLAGS) \
- $(GL_CFLAGS) $(GTK3_CFLAGS) $(X11_CFLAGS)
+plugin_LTLIBRARIES = libgstfdkaac.la
+libgstfdkaac_la_SOURCES = plugin.c gstfdkaacenc.c gstfdkaacdec.c
+libgstfdkaac_la_CFLAGS = -DGST_USE_UNSTABLE_API \
+ $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) \
+ $(GST_CFLAGS) $(FDK_AAC_CFLAGS)
-gtkvideooverlay_LDADD = ../libgstgtkhelper.la \
- $(GTK3_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \
- $(GL_LIBS) -lgstvideo-$(GST_API_VERSION) $(X11_LIBS)
+libgstfdkaac_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \
+ -lgstaudio-@GST_API_VERSION@ -lgstpbutils-@GST_API_VERSION@ \
+ $(GST_BASE_LIBS) $(FDK_AAC_LIBS)
+libgstfdkaac_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstfdkaac_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
+noinst_HEADERS = gstfdkaacenc.h gstfdkaacdec.h
all: all-am
.SUFFIXES:
-.SUFFIXES: .cpp .lo .o .obj
+.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 \
@@ -771,9 +816,9 @@
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/gl/gtk/gtkvideooverlay/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/fdkaac/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu tests/examples/gl/gtk/gtkvideooverlay/Makefile
+ $(AUTOMAKE) --gnu ext/fdkaac/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
@@ -792,18 +837,43 @@
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
-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
+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)"; \
+ }
-gtkvideooverlay$(EXEEXT): $(gtkvideooverlay_OBJECTS) $(gtkvideooverlay_DEPENDENCIES) $(EXTRA_gtkvideooverlay_DEPENDENCIES)
- @rm -f gtkvideooverlay$(EXEEXT)
- $(AM_V_CXXLD)$(gtkvideooverlay_LINK) $(gtkvideooverlay_OBJECTS) $(gtkvideooverlay_LDADD) $(LIBS)
+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}; \
+ }
+
+libgstfdkaac.la: $(libgstfdkaac_la_OBJECTS) $(libgstfdkaac_la_DEPENDENCIES) $(EXTRA_libgstfdkaac_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstfdkaac_la_LINK) -rpath $(plugindir) $(libgstfdkaac_la_OBJECTS) $(libgstfdkaac_la_LIBADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@@ -811,45 +881,54 @@
distclean-compile:
-rm -f *.tab.c
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtkvideooverlay-main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfdkaac_la-gstfdkaacdec.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfdkaac_la-gstfdkaacenc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfdkaac_la-plugin.Plo@am__quote@
-.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 $@ $< &&\
-@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+.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 $@ $<
-.cpp.obj:
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
-@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
-@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+.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) '$<'`
-.cpp.lo:
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
-@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
-@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+.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 $@ $<
-gtkvideooverlay-main.o: main.cpp
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) -MT gtkvideooverlay-main.o -MD -MP -MF $(DEPDIR)/gtkvideooverlay-main.Tpo -c -o gtkvideooverlay-main.o `test -f 'main.cpp' || echo '$(srcdir)/'`main.cpp
-@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gtkvideooverlay-main.Tpo $(DEPDIR)/gtkvideooverlay-main.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='main.cpp' object='gtkvideooverlay-main.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) -c -o gtkvideooverlay-main.o `test -f 'main.cpp' || echo '$(srcdir)/'`main.cpp
+libgstfdkaac_la-plugin.lo: plugin.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstfdkaac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfdkaac_la_CFLAGS) $(CFLAGS) -MT libgstfdkaac_la-plugin.lo -MD -MP -MF $(DEPDIR)/libgstfdkaac_la-plugin.Tpo -c -o libgstfdkaac_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstfdkaac_la-plugin.Tpo $(DEPDIR)/libgstfdkaac_la-plugin.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='plugin.c' object='libgstfdkaac_la-plugin.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 $(libgstfdkaac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfdkaac_la_CFLAGS) $(CFLAGS) -c -o libgstfdkaac_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c
-gtkvideooverlay-main.obj: main.cpp
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) -MT gtkvideooverlay-main.obj -MD -MP -MF $(DEPDIR)/gtkvideooverlay-main.Tpo -c -o gtkvideooverlay-main.obj `if test -f 'main.cpp'; then $(CYGPATH_W) 'main.cpp'; else $(CYGPATH_W) '$(srcdir)/main.cpp'; fi`
-@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gtkvideooverlay-main.Tpo $(DEPDIR)/gtkvideooverlay-main.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='main.cpp' object='gtkvideooverlay-main.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) -c -o gtkvideooverlay-main.obj `if test -f 'main.cpp'; then $(CYGPATH_W) 'main.cpp'; else $(CYGPATH_W) '$(srcdir)/main.cpp'; fi`
+libgstfdkaac_la-gstfdkaacenc.lo: gstfdkaacenc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstfdkaac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfdkaac_la_CFLAGS) $(CFLAGS) -MT libgstfdkaac_la-gstfdkaacenc.lo -MD -MP -MF $(DEPDIR)/libgstfdkaac_la-gstfdkaacenc.Tpo -c -o libgstfdkaac_la-gstfdkaacenc.lo `test -f 'gstfdkaacenc.c' || echo '$(srcdir)/'`gstfdkaacenc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstfdkaac_la-gstfdkaacenc.Tpo $(DEPDIR)/libgstfdkaac_la-gstfdkaacenc.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstfdkaacenc.c' object='libgstfdkaac_la-gstfdkaacenc.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 $(libgstfdkaac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfdkaac_la_CFLAGS) $(CFLAGS) -c -o libgstfdkaac_la-gstfdkaacenc.lo `test -f 'gstfdkaacenc.c' || echo '$(srcdir)/'`gstfdkaacenc.c
+
+libgstfdkaac_la-gstfdkaacdec.lo: gstfdkaacdec.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstfdkaac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfdkaac_la_CFLAGS) $(CFLAGS) -MT libgstfdkaac_la-gstfdkaacdec.lo -MD -MP -MF $(DEPDIR)/libgstfdkaac_la-gstfdkaacdec.Tpo -c -o libgstfdkaac_la-gstfdkaacdec.lo `test -f 'gstfdkaacdec.c' || echo '$(srcdir)/'`gstfdkaacdec.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstfdkaac_la-gstfdkaacdec.Tpo $(DEPDIR)/libgstfdkaac_la-gstfdkaacdec.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstfdkaacdec.c' object='libgstfdkaac_la-gstfdkaacdec.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 $(libgstfdkaac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfdkaac_la_CFLAGS) $(CFLAGS) -c -o libgstfdkaac_la-gstfdkaacdec.lo `test -f 'gstfdkaacdec.c' || echo '$(srcdir)/'`gstfdkaacdec.c
mostlyclean-libtool:
-rm -f *.lo
@@ -941,8 +1020,11 @@
done
check-am: all-am
check: check-am
-all-am: Makefile $(PROGRAMS)
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
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
@@ -975,7 +1057,7 @@
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
-clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \
mostlyclean-am
distclean: distclean-am
@@ -996,7 +1078,7 @@
info-am:
-install-data-am:
+install-data-am: install-pluginLTLIBRARIES
install-dvi: install-dvi-am
@@ -1042,23 +1124,24 @@
ps-am:
-uninstall-am:
+uninstall-am: uninstall-pluginLTLIBRARIES
.MAKE: install-am install-strip
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
- clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \
+ 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 \
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-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
+ 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
.PRECIOUS: Makefile
diff --git a/ext/fdkaac/gstfdkaacdec.c b/ext/fdkaac/gstfdkaacdec.c
new file mode 100644
index 0000000..c271837
--- /dev/null
+++ b/ext/fdkaac/gstfdkaacdec.c
@@ -0,0 +1,450 @@
+/*
+ * Copyright (C) 2016 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 "gstfdkaacdec.h"
+
+#include <gst/pbutils/pbutils.h>
+
+#include <string.h>
+
+/* TODO:
+ * - LOAS / LATM support
+ * - Error concealment
+ */
+
+static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/mpeg, "
+ "mpegversion = (int) 4, "
+ "stream-format = (string) { adts, adif, raw }")
+ );
+
+static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-raw, "
+ "format = (string) " GST_AUDIO_NE (S16) ", "
+ "layout = (string) interleaved, "
+ "rate = (int) [8000, 96000], " "channels = (int) [1, 8]")
+ );
+
+GST_DEBUG_CATEGORY_STATIC (gst_fdkaacdec_debug);
+#define GST_CAT_DEFAULT gst_fdkaacdec_debug
+
+static gboolean gst_fdkaacdec_start (GstAudioDecoder * dec);
+static gboolean gst_fdkaacdec_stop (GstAudioDecoder * dec);
+static gboolean gst_fdkaacdec_set_format (GstAudioDecoder * dec,
+ GstCaps * caps);
+static GstFlowReturn gst_fdkaacdec_handle_frame (GstAudioDecoder * dec,
+ GstBuffer * in_buf);
+static void gst_fdkaacdec_flush (GstAudioDecoder * dec, gboolean hard);
+
+G_DEFINE_TYPE (GstFdkAacDec, gst_fdkaacdec, GST_TYPE_AUDIO_DECODER);
+
+static gboolean
+gst_fdkaacdec_start (GstAudioDecoder * dec)
+{
+ GstFdkAacDec *self = GST_FDKAACDEC (dec);
+
+ GST_DEBUG_OBJECT (self, "start");
+
+ return TRUE;
+}
+
+static gboolean
+gst_fdkaacdec_stop (GstAudioDecoder * dec)
+{
+ GstFdkAacDec *self = GST_FDKAACDEC (dec);
+
+ GST_DEBUG_OBJECT (self, "stop");
+
+ g_free (self->decode_buffer);
+ self->decode_buffer = NULL;
+
+ if (self->dec)
+ aacDecoder_Close (self->dec);
+ self->dec = NULL;
+
+ return TRUE;
+}
+
+static gboolean
+gst_fdkaacdec_set_format (GstAudioDecoder * dec, GstCaps * caps)
+{
+ GstFdkAacDec *self = GST_FDKAACDEC (dec);
+ TRANSPORT_TYPE transport_format;
+ GstStructure *s;
+ const gchar *stream_format;
+ AAC_DECODER_ERROR err;
+
+ if (self->dec) {
+ /* drain */
+ gst_fdkaacdec_handle_frame (dec, NULL);
+ aacDecoder_Close (self->dec);
+ self->dec = NULL;
+ }
+
+ s = gst_caps_get_structure (caps, 0);
+ stream_format = gst_structure_get_string (s, "stream-format");
+ if (strcmp (stream_format, "raw") == 0) {
+ transport_format = TT_MP4_RAW;
+ } else if (strcmp (stream_format, "adif") == 0) {
+ transport_format = TT_MP4_ADIF;
+ } else if (strcmp (stream_format, "adts") == 0) {
+ transport_format = TT_MP4_ADTS;
+ } else {
+ g_assert_not_reached ();
+ }
+
+ self->dec = aacDecoder_Open (transport_format, 1);
+ if (!self->dec) {
+ GST_ERROR_OBJECT (self, "Failed to open decoder");
+ return FALSE;
+ }
+
+ if (transport_format == TT_MP4_RAW) {
+ GstBuffer *codec_data = NULL;
+ GstMapInfo map;
+ guint8 *data;
+ guint size;
+
+ gst_structure_get (s, "codec_data", GST_TYPE_BUFFER, &codec_data, NULL);
+
+ if (!codec_data) {
+ GST_ERROR_OBJECT (self, "Raw AAC without codec_data not supported");
+ return FALSE;
+ }
+
+ gst_buffer_map (codec_data, &map, GST_MAP_READ);
+ data = map.data;
+ size = map.size;
+
+ if ((err = aacDecoder_ConfigRaw (self->dec, &data, &size)) != AAC_DEC_OK) {
+ gst_buffer_unmap (codec_data, &map);
+ gst_buffer_unref (codec_data);
+ GST_ERROR_OBJECT (self, "Invalid codec_data: %d", err);
+ return FALSE;
+ }
+
+ gst_buffer_unmap (codec_data, &map);
+ gst_buffer_unref (codec_data);
+ }
+
+ if ((err =
+ aacDecoder_SetParam (self->dec, AAC_PCM_OUTPUT_CHANNEL_MAPPING,
+ 0)) != AAC_DEC_OK) {
+ GST_ERROR_OBJECT (self, "Failed to set output channel mapping: %d", err);
+ return FALSE;
+ }
+
+ if ((err =
+ aacDecoder_SetParam (self->dec, AAC_PCM_OUTPUT_INTERLEAVED,
+ 1)) != AAC_DEC_OK) {
+ GST_ERROR_OBJECT (self, "Failed to set interleaved output: %d", err);
+ return FALSE;
+ }
+
+ /* 8 channels * 2 bytes per sample * 2048 samples */
+ if (!self->decode_buffer) {
+ self->decode_buffer_size = 8 * 2048;
+ self->decode_buffer = g_new (gint16, self->decode_buffer_size);
+ }
+
+ return TRUE;
+}
+
+static GstFlowReturn
+gst_fdkaacdec_handle_frame (GstAudioDecoder * dec, GstBuffer * inbuf)
+{
+ GstFdkAacDec *self = GST_FDKAACDEC (dec);
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstBuffer *outbuf;
+ GstMapInfo imap;
+ AAC_DECODER_ERROR err;
+ guint size, valid;
+ CStreamInfo *stream_info;
+ GstAudioInfo info;
+ guint flags = 0, i;
+ GstAudioChannelPosition pos[64], gst_pos[64];
+ gboolean need_reorder;
+
+ if (inbuf) {
+ gst_buffer_ref (inbuf);
+ gst_buffer_map (inbuf, &imap, GST_MAP_READ);
+ valid = size = imap.size;
+
+ if ((err =
+ aacDecoder_Fill (self->dec, (guint8 **) & imap.data, &size,
+ &valid)) != AAC_DEC_OK) {
+ GST_AUDIO_DECODER_ERROR (self, 1, STREAM, DECODE, (NULL),
+ ("filling error: %d", err), ret);
+ goto out;
+ }
+
+ if (GST_BUFFER_IS_DISCONT (inbuf))
+ flags |= AACDEC_INTR;
+ } else {
+ flags |= AACDEC_FLUSH;
+ }
+
+ if ((err =
+ aacDecoder_DecodeFrame (self->dec, self->decode_buffer,
+ self->decode_buffer_size, flags)) != AAC_DEC_OK) {
+ if (err == AAC_DEC_TRANSPORT_SYNC_ERROR) {
+ ret = GST_FLOW_OK;
+ outbuf = NULL;
+ goto finish;
+ }
+ GST_AUDIO_DECODER_ERROR (self, 1, STREAM, DECODE, (NULL),
+ ("decoding error: %d", err), ret);
+ goto out;
+ }
+
+ stream_info = aacDecoder_GetStreamInfo (self->dec);
+ if (!stream_info) {
+ GST_AUDIO_DECODER_ERROR (self, 1, STREAM, DECODE, (NULL),
+ ("failed to get stream info"), ret);
+ goto out;
+ }
+
+ /* FIXME: Don't recalculate this on every buffer */
+ if (stream_info->numChannels == 1) {
+ pos[0] = GST_AUDIO_CHANNEL_POSITION_MONO;
+ } else {
+ gint n_front = 0, n_side = 0, n_back = 0, n_lfe = 0;
+
+ /* FIXME: Can this be simplified somehow? */
+ for (i = 0; i < stream_info->numChannels; i++) {
+ if (stream_info->pChannelType[i] == ACT_FRONT) {
+ n_front++;
+ } else if (stream_info->pChannelType[i] == ACT_SIDE) {
+ n_side++;
+ } else if (stream_info->pChannelType[i] == ACT_BACK) {
+ n_back++;
+ } else if (stream_info->pChannelType[i] == ACT_LFE) {
+ n_lfe++;
+ } else {
+ GST_ERROR_OBJECT (self, "Channel type %d not supported",
+ stream_info->pChannelType[i]);
+ ret = GST_FLOW_NOT_NEGOTIATED;
+ goto out;
+ }
+ }
+
+ for (i = 0; i < stream_info->numChannels; i++) {
+ if (stream_info->pChannelType[i] == ACT_FRONT) {
+ if (stream_info->pChannelIndices[i] == 0) {
+ if (n_front & 1)
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER;
+ else if (n_front > 2)
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER;
+ else
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
+ } else if (stream_info->pChannelIndices[i] == 1) {
+ if ((n_front & 1) && n_front > 3)
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER;
+ else if (n_front & 1)
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
+ else if (n_front > 2)
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER;
+ else
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
+ } else if (stream_info->pChannelIndices[i] == 2) {
+ if ((n_front & 1) && n_front > 3)
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER;
+ else if (n_front & 1)
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
+ else if (n_front > 2)
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
+ else
+ g_assert_not_reached ();
+ } else if (stream_info->pChannelIndices[i] == 3) {
+ if ((n_front & 1) && n_front > 3)
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
+ else if (n_front & 1)
+ g_assert_not_reached ();
+ else if (n_front > 2)
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
+ else
+ g_assert_not_reached ();
+ } else if (stream_info->pChannelIndices[i] == 4) {
+ if ((n_front & 1) && n_front > 2)
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
+ else if (n_front & 1)
+ g_assert_not_reached ();
+ else if (n_front > 2)
+ g_assert_not_reached ();
+ else
+ g_assert_not_reached ();
+ } else {
+ GST_ERROR_OBJECT (self, "Front channel index %d not supported",
+ stream_info->pChannelIndices[i]);
+ ret = GST_FLOW_NOT_NEGOTIATED;
+ goto out;
+ }
+ } else if (stream_info->pChannelType[i] == ACT_SIDE) {
+ if (n_side & 1) {
+ GST_ERROR_OBJECT (self, "Odd number of side channels not supported");
+ ret = GST_FLOW_NOT_NEGOTIATED;
+ goto out;
+ } else if (stream_info->pChannelIndices[i] == 0) {
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT;
+ } else if (stream_info->pChannelIndices[i] == 1) {
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT;
+ } else {
+ GST_ERROR_OBJECT (self, "Side channel index %d not supported",
+ stream_info->pChannelIndices[i]);
+ ret = GST_FLOW_NOT_NEGOTIATED;
+ goto out;
+ }
+ } else if (stream_info->pChannelType[i] == ACT_BACK) {
+ if (stream_info->pChannelIndices[i] == 0) {
+ if (n_back & 1)
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_REAR_CENTER;
+ else
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_REAR_LEFT;
+ } else if (stream_info->pChannelIndices[i] == 1) {
+ if (n_back & 1)
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_REAR_LEFT;
+ else
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT;
+ } else if (stream_info->pChannelIndices[i] == 2) {
+ if (n_back & 1)
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT;
+ else
+ g_assert_not_reached ();
+ } else {
+ GST_ERROR_OBJECT (self, "Side channel index %d not supported",
+ stream_info->pChannelIndices[i]);
+ ret = GST_FLOW_NOT_NEGOTIATED;
+ goto out;
+ }
+ } else if (stream_info->pChannelType[i] == ACT_LFE) {
+ if (stream_info->pChannelIndices[i] == 0) {
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_LFE1;
+ } else {
+ GST_ERROR_OBJECT (self, "LFE channel index %d not supported",
+ stream_info->pChannelIndices[i]);
+ ret = GST_FLOW_NOT_NEGOTIATED;
+ goto out;
+ }
+ } else {
+ GST_ERROR_OBJECT (self, "Channel type %d not supported",
+ stream_info->pChannelType[i]);
+ ret = GST_FLOW_NOT_NEGOTIATED;
+ goto out;
+ }
+ }
+ }
+
+ memcpy (gst_pos, pos,
+ sizeof (GstAudioChannelPosition) * stream_info->numChannels);
+ if (!gst_audio_channel_positions_to_valid_order (gst_pos,
+ stream_info->numChannels)) {
+ ret = GST_FLOW_NOT_NEGOTIATED;
+ goto out;
+ }
+
+ need_reorder =
+ memcmp (pos, gst_pos,
+ sizeof (GstAudioChannelPosition) * stream_info->numChannels) != 0;
+
+ gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_S16,
+ stream_info->sampleRate, stream_info->numChannels, gst_pos);
+ if (!gst_audio_decoder_set_output_format (dec, &info)) {
+ GST_ERROR_OBJECT (self, "Failed to set output format");
+ ret = GST_FLOW_NOT_NEGOTIATED;
+ goto out;
+ }
+
+ outbuf =
+ gst_audio_decoder_allocate_output_buffer (dec,
+ stream_info->frameSize * GST_AUDIO_INFO_BPF (&info));
+ gst_buffer_fill (outbuf, 0, self->decode_buffer,
+ gst_buffer_get_size (outbuf));
+
+ if (need_reorder) {
+ gst_audio_buffer_reorder_channels (outbuf, GST_AUDIO_INFO_FORMAT (&info),
+ GST_AUDIO_INFO_CHANNELS (&info), pos, gst_pos);
+ }
+
+finish:
+ ret = gst_audio_decoder_finish_frame (dec, outbuf, 1);
+
+out:
+
+ if (inbuf) {
+ gst_buffer_unmap (inbuf, &imap);
+ gst_buffer_unref (inbuf);
+ }
+
+ return ret;
+}
+
+static void
+gst_fdkaacdec_flush (GstAudioDecoder * dec, gboolean hard)
+{
+ GstFdkAacDec *self = GST_FDKAACDEC (dec);
+
+ if (self->dec) {
+ AAC_DECODER_ERROR err;
+ if ((err =
+ aacDecoder_DecodeFrame (self->dec, self->decode_buffer,
+ self->decode_buffer_size, AACDEC_FLUSH)) != AAC_DEC_OK) {
+ GST_ERROR_OBJECT (self, "flushing error: %d", err);
+ }
+ }
+}
+
+static void
+gst_fdkaacdec_init (GstFdkAacDec * self)
+{
+ self->dec = NULL;
+
+ gst_audio_decoder_set_drainable (GST_AUDIO_DECODER (self), TRUE);
+ gst_audio_decoder_set_needs_format (GST_AUDIO_DECODER (self), TRUE);
+}
+
+static void
+gst_fdkaacdec_class_init (GstFdkAacDecClass * klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ GstAudioDecoderClass *base_class = GST_AUDIO_DECODER_CLASS (klass);
+
+ base_class->start = GST_DEBUG_FUNCPTR (gst_fdkaacdec_start);
+ base_class->stop = GST_DEBUG_FUNCPTR (gst_fdkaacdec_stop);
+ base_class->set_format = GST_DEBUG_FUNCPTR (gst_fdkaacdec_set_format);
+ base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_fdkaacdec_handle_frame);
+ base_class->flush = GST_DEBUG_FUNCPTR (gst_fdkaacdec_flush);
+
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
+ gst_element_class_add_static_pad_template (element_class, &src_template);
+
+ gst_element_class_set_static_metadata (element_class, "FDK AAC audio decoder",
+ "Codec/Decoder/Audio", "FDK AAC audio decoder",
+ "Sebastian Dröge <sebastian@centricular.com>");
+
+ GST_DEBUG_CATEGORY_INIT (gst_fdkaacdec_debug, "fdkaacdec", 0,
+ "fdkaac decoder");
+}
diff --git a/ext/fdkaac/gstfdkaacdec.h b/ext/fdkaac/gstfdkaacdec.h
new file mode 100644
index 0000000..5f766bc
--- /dev/null
+++ b/ext/fdkaac/gstfdkaacdec.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2016 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_FDKAACDEC_H__
+#define __GST_FDKAACDEC_H__
+
+#include <gst/gst.h>
+#include <gst/audio/gstaudiodecoder.h>
+
+#include <fdk-aac/aacdecoder_lib.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_FDKAACDEC \
+ (gst_fdkaacdec_get_type())
+#define GST_FDKAACDEC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_FDKAACDEC, GstFdkAacDec))
+#define GST_FDKAACDEC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_FDKAACDEC, GstFdkAacDecClass))
+#define GST_IS_FDKAACDEC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_FDKAACDEC))
+#define GST_IS_FDKAACDEC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_FDKAACDEC))
+
+typedef struct _GstFdkAacDec GstFdkAacDec;
+typedef struct _GstFdkAacDecClass GstFdkAacDecClass;
+
+struct _GstFdkAacDec {
+ GstAudioDecoder element;
+
+ HANDLE_AACDECODER dec;
+ gint16 *decode_buffer;
+ gint decode_buffer_size;
+};
+
+struct _GstFdkAacDecClass {
+ GstAudioDecoderClass parent_class;
+};
+
+GType gst_fdkaacdec_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_FDKAACDEC_H__ */
diff --git a/ext/fdkaac/gstfdkaacenc.c b/ext/fdkaac/gstfdkaacenc.c
new file mode 100644
index 0000000..8c6ff8b
--- /dev/null
+++ b/ext/fdkaac/gstfdkaacenc.c
@@ -0,0 +1,611 @@
+/*
+ * Copyright (C) 2016 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 "gstfdkaacenc.h"
+
+#include <gst/pbutils/pbutils.h>
+
+#include <string.h>
+
+/* TODO:
+ * - Add support for other AOT / profiles
+ * - Expose more properties, e.g. afterburner and vbr
+ * - Signal encoder delay
+ * - LOAS / LATM support
+ */
+
+enum
+{
+ PROP_0,
+ PROP_BITRATE
+};
+
+#define DEFAULT_BITRATE (0)
+
+#define SAMPLE_RATES " 8000, " \
+ "11025, " \
+ "12000, " \
+ "16000, " \
+ "22050, " \
+ "24000, " \
+ "32000, " \
+ "44100, " \
+ "48000, " \
+ "64000, " \
+ "88200, " \
+ "96000"
+
+static const struct
+{
+ gint channels;
+ CHANNEL_MODE mode;
+ GstAudioChannelPosition positions[8];
+} channel_layouts[] = {
+ {
+ 1, MODE_1, {
+ GST_AUDIO_CHANNEL_POSITION_MONO}}, {
+ 2, MODE_2, {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}}, {
+ 3, MODE_1_2, {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}}, {
+ 3, MODE_2_1, {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_LFE1}}, {
+ 4, MODE_1_2_1, {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_CENTER}}, {
+ 5, MODE_1_2_2, {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT}}, {
+ 6, MODE_1_2_2_1, {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_LFE1}}, {
+ 8, MODE_7_1_REAR_SURROUND, {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_LFE1}}, {
+ 8, MODE_7_1_FRONT_CENTER, {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_LFE1}}
+};
+
+static GstStaticPadTemplate 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, "
+ "rate = (int) { " SAMPLE_RATES " }, "
+ "channels = (int) {1, 2, 3, 4, 5, 6, 8}")
+ );
+
+static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/mpeg, "
+ "mpegversion = (int) 4, "
+ "rate = (int) { " SAMPLE_RATES " }, "
+ "channels = (int) {1, 2, 3, 4, 5, 6, 8}, "
+ "stream-format = (string) { adts, adif, raw }, "
+ "base-profile = (string) lc, " "framed = (boolean) true")
+ );
+
+GST_DEBUG_CATEGORY_STATIC (gst_fdkaacenc_debug);
+#define GST_CAT_DEFAULT gst_fdkaacenc_debug
+
+static void gst_fdkaacenc_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_fdkaacenc_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static gboolean gst_fdkaacenc_start (GstAudioEncoder * enc);
+static gboolean gst_fdkaacenc_stop (GstAudioEncoder * enc);
+static gboolean gst_fdkaacenc_set_format (GstAudioEncoder * enc,
+ GstAudioInfo * info);
+static GstFlowReturn gst_fdkaacenc_handle_frame (GstAudioEncoder * enc,
+ GstBuffer * in_buf);
+static GstCaps *gst_fdkaacenc_get_caps (GstAudioEncoder * enc,
+ GstCaps * filter);
+
+G_DEFINE_TYPE (GstFdkAacEnc, gst_fdkaacenc, GST_TYPE_AUDIO_ENCODER);
+
+static void
+gst_fdkaacenc_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstFdkAacEnc *self = GST_FDKAACENC (object);
+
+ switch (prop_id) {
+ case PROP_BITRATE:
+ self->bitrate = g_value_get_int (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ return;
+}
+
+static void
+gst_fdkaacenc_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstFdkAacEnc *self = GST_FDKAACENC (object);
+
+ switch (prop_id) {
+ case PROP_BITRATE:
+ g_value_set_int (value, self->bitrate);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ return;
+}
+
+static gboolean
+gst_fdkaacenc_start (GstAudioEncoder * enc)
+{
+ GstFdkAacEnc *self = GST_FDKAACENC (enc);
+
+ GST_DEBUG_OBJECT (self, "start");
+
+ return TRUE;
+}
+
+static gboolean
+gst_fdkaacenc_stop (GstAudioEncoder * enc)
+{
+ GstFdkAacEnc *self = GST_FDKAACENC (enc);
+
+ GST_DEBUG_OBJECT (self, "stop");
+
+ if (self->enc)
+ aacEncClose (&self->enc);
+
+ return TRUE;
+}
+
+static GstCaps *
+gst_fdkaacenc_get_caps (GstAudioEncoder * enc, GstCaps * filter)
+{
+ GstCaps *res, *caps;
+ gint i;
+
+ caps = gst_caps_new_empty ();
+
+ for (i = 0; i < G_N_ELEMENTS (channel_layouts); i++) {
+ guint64 channel_mask;
+ GstCaps *tmp =
+ gst_caps_make_writable (gst_pad_get_pad_template_caps
+ (GST_AUDIO_ENCODER_SINK_PAD (enc)));
+
+ if (channel_layouts[i].channels == 1) {
+ gst_caps_set_simple (tmp, "channels", G_TYPE_INT,
+ channel_layouts[i].channels, NULL);
+ } else {
+ gst_audio_channel_positions_to_mask (channel_layouts[i].positions,
+ channel_layouts[i].channels, FALSE, &channel_mask);
+ gst_caps_set_simple (tmp, "channels", G_TYPE_INT,
+ channel_layouts[i].channels, "channel-mask", GST_TYPE_BITMASK,
+ channel_mask, NULL);
+ }
+
+ gst_caps_append (caps, tmp);
+ }
+
+ res = gst_audio_encoder_proxy_getcaps (enc, caps, filter);
+ gst_caps_unref (caps);
+
+ return res;
+}
+
+static gboolean
+gst_fdkaacenc_set_format (GstAudioEncoder * enc, GstAudioInfo * info)
+{
+ GstFdkAacEnc *self = GST_FDKAACENC (enc);
+ gboolean ret = FALSE;
+ GstCaps *allowed_caps;
+ GstCaps *src_caps;
+ AACENC_ERROR err;
+ gint transmux = 0, aot = AOT_AAC_LC;
+ gint mpegversion = 4;
+ CHANNEL_MODE channel_mode;
+ AACENC_InfoStruct enc_info = { 0 };
+ gint bitrate;
+
+ if (self->enc) {
+ /* drain */
+ gst_fdkaacenc_handle_frame (enc, NULL);
+ aacEncClose (&self->enc);
+ }
+
+ allowed_caps = gst_pad_get_allowed_caps (GST_AUDIO_ENCODER_SRC_PAD (self));
+
+ GST_DEBUG_OBJECT (self, "allowed caps: %" GST_PTR_FORMAT, allowed_caps);
+
+ if (allowed_caps && gst_caps_get_size (allowed_caps) > 0) {
+ GstStructure *s = gst_caps_get_structure (allowed_caps, 0);
+ const gchar *str = NULL;
+
+ if ((str = gst_structure_get_string (s, "stream-format"))) {
+ if (strcmp (str, "adts") == 0) {
+ GST_DEBUG_OBJECT (self, "use ADTS format for output");
+ transmux = 2;
+ } else if (strcmp (str, "adif") == 0) {
+ GST_DEBUG_OBJECT (self, "use ADIF format for output");
+ transmux = 1;
+ } else if (strcmp (str, "raw") == 0) {
+ GST_DEBUG_OBJECT (self, "use RAW format for output");
+ transmux = 0;
+ }
+ }
+
+ gst_structure_get_int (s, "mpegversion", &mpegversion);
+ }
+ if (allowed_caps)
+ gst_caps_unref (allowed_caps);
+
+ if ((err =
+ aacEncOpen (&self->enc, 0,
+ GST_AUDIO_INFO_CHANNELS (info))) != AACENC_OK) {
+ GST_ERROR_OBJECT (self, "Unable to open encoder: %d\n", err);
+ return FALSE;
+ }
+
+ aot = AOT_AAC_LC;
+
+ if ((err = aacEncoder_SetParam (self->enc, AACENC_AOT, aot)) != AACENC_OK) {
+ GST_ERROR_OBJECT (self, "Unable to set AOT %d: %d\n", aot, err);
+ return FALSE;
+ }
+
+ if ((err = aacEncoder_SetParam (self->enc, AACENC_SAMPLERATE,
+ GST_AUDIO_INFO_RATE (info))) != AACENC_OK) {
+ GST_ERROR_OBJECT (self, "Unable to set sample rate %d: %d\n",
+ GST_AUDIO_INFO_RATE (info), err);
+ return FALSE;
+ }
+
+ if (GST_AUDIO_INFO_CHANNELS (info) == 1) {
+ channel_mode = MODE_1;
+ self->need_reorder = FALSE;
+ self->aac_positions = NULL;
+ } else {
+ guint64 in_channel_mask, out_channel_mask;
+ gint i;
+
+ for (i = 0; i < G_N_ELEMENTS (channel_layouts); i++) {
+ if (channel_layouts[i].channels != GST_AUDIO_INFO_CHANNELS (info))
+ continue;
+
+ gst_audio_channel_positions_to_mask (&GST_AUDIO_INFO_POSITION (info, 0),
+ GST_AUDIO_INFO_CHANNELS (info), FALSE, &in_channel_mask);
+ gst_audio_channel_positions_to_mask (channel_layouts[i].positions,
+ channel_layouts[i].channels, FALSE, &out_channel_mask);
+ if (in_channel_mask == out_channel_mask) {
+ channel_mode = channel_layouts[i].mode;
+ self->need_reorder =
+ memcmp (channel_layouts[i].positions,
+ &GST_AUDIO_INFO_POSITION (info, 0),
+ GST_AUDIO_INFO_CHANNELS (info) *
+ sizeof (GstAudioChannelPosition)) != 0;
+ self->aac_positions = channel_layouts[i].positions;
+ break;
+ }
+ }
+
+ if (i == G_N_ELEMENTS (channel_layouts)) {
+ GST_ERROR_OBJECT (self, "Couldn't find a valid channel layout");
+ return FALSE;
+ }
+ }
+
+ if ((err = aacEncoder_SetParam (self->enc, AACENC_CHANNELMODE,
+ channel_mode)) != AACENC_OK) {
+ GST_ERROR_OBJECT (self, "Unable to set channel mode %d: %d", channel_mode,
+ err);
+ return FALSE;
+ }
+
+ /* MPEG channel order */
+ if ((err = aacEncoder_SetParam (self->enc, AACENC_CHANNELORDER,
+ 0)) != AACENC_OK) {
+ GST_ERROR_OBJECT (self, "Unable to set channel order %d: %d", channel_mode,
+ err);
+ return FALSE;
+ }
+
+ bitrate = self->bitrate;
+ /* See
+ * http://wiki.hydrogenaud.io/index.php?title=Fraunhofer_FDK_AAC#Recommended_Sampling_Rate_and_Bitrate_Combinations
+ */
+ if (bitrate == 0) {
+ if (GST_AUDIO_INFO_CHANNELS (info) == 1) {
+ if (GST_AUDIO_INFO_RATE (info) < 16000) {
+ bitrate = 8000;
+ } else if (GST_AUDIO_INFO_RATE (info) == 16000) {
+ bitrate = 16000;
+ } else if (GST_AUDIO_INFO_RATE (info) < 32000) {
+ bitrate = 24000;
+ } else if (GST_AUDIO_INFO_RATE (info) == 32000) {
+ bitrate = 32000;
+ } else if (GST_AUDIO_INFO_RATE (info) <= 44100) {
+ bitrate = 56000;
+ } else {
+ bitrate = 160000;
+ }
+ } else if (GST_AUDIO_INFO_CHANNELS (info) == 2) {
+ if (GST_AUDIO_INFO_RATE (info) < 16000) {
+ bitrate = 16000;
+ } else if (GST_AUDIO_INFO_RATE (info) == 16000) {
+ bitrate = 24000;
+ } else if (GST_AUDIO_INFO_RATE (info) < 22050) {
+ bitrate = 32000;
+ } else if (GST_AUDIO_INFO_RATE (info) < 32000) {
+ bitrate = 40000;
+ } else if (GST_AUDIO_INFO_RATE (info) == 32000) {
+ bitrate = 96000;
+ } else if (GST_AUDIO_INFO_RATE (info) <= 44100) {
+ bitrate = 112000;
+ } else {
+ bitrate = 320000;
+ }
+ } else {
+ /* 5, 5.1 */
+ if (GST_AUDIO_INFO_RATE (info) < 32000) {
+ bitrate = 160000;
+ } else if (GST_AUDIO_INFO_RATE (info) <= 44100) {
+ bitrate = 240000;
+ } else {
+ bitrate = 320000;
+ }
+ }
+ }
+
+ if ((err = aacEncoder_SetParam (self->enc, AACENC_TRANSMUX,
+ transmux)) != AACENC_OK) {
+ GST_ERROR_OBJECT (self, "Unable to set transmux %d: %d", transmux, err);
+ return FALSE;
+ }
+
+ if ((err = aacEncoder_SetParam (self->enc, AACENC_BITRATE,
+ bitrate)) != AACENC_OK) {
+ GST_ERROR_OBJECT (self, "Unable to set bitrate %d: %d", bitrate, err);
+ return FALSE;
+ }
+
+ if ((err = aacEncEncode (self->enc, NULL, NULL, NULL, NULL)) != AACENC_OK) {
+ GST_ERROR_OBJECT (self, "Unable to initialize encoder: %d", err);
+ return FALSE;
+ }
+
+ if ((err = aacEncInfo (self->enc, &enc_info)) != AACENC_OK) {
+ GST_ERROR_OBJECT (self, "Unable to get encoder info: %d", err);
+ return FALSE;
+ }
+
+ gst_audio_encoder_set_frame_max (enc, 1);
+ gst_audio_encoder_set_frame_samples_min (enc, enc_info.frameLength);
+ gst_audio_encoder_set_frame_samples_max (enc, enc_info.frameLength);
+ gst_audio_encoder_set_hard_min (enc, FALSE);
+ self->outbuf_size = enc_info.maxOutBufBytes;
+ self->samples_per_frame = enc_info.frameLength;
+
+ src_caps = gst_caps_new_simple ("audio/mpeg",
+ "mpegversion", G_TYPE_INT, mpegversion,
+ "channels", G_TYPE_INT, GST_AUDIO_INFO_CHANNELS (info),
+ "framed", G_TYPE_BOOLEAN, TRUE,
+ "rate", G_TYPE_INT, GST_AUDIO_INFO_RATE (info), NULL);
+
+ /* raw */
+ if (transmux == 0) {
+ GstBuffer *codec_data =
+ gst_buffer_new_wrapped (g_memdup (enc_info.confBuf, enc_info.confSize),
+ enc_info.confSize);
+ gst_caps_set_simple (src_caps, "codec_data", GST_TYPE_BUFFER, codec_data,
+ "stream-format", G_TYPE_STRING, "raw", NULL);
+ gst_buffer_unref (codec_data);
+ } else if (transmux == 1) {
+ gst_caps_set_simple (src_caps, "stream-format", G_TYPE_STRING, "adif",
+ NULL);
+ } else if (transmux == 2) {
+ gst_caps_set_simple (src_caps, "stream-format", G_TYPE_STRING, "adts",
+ NULL);
+ } else {
+ g_assert_not_reached ();
+ }
+
+ gst_codec_utils_aac_caps_set_level_and_profile (src_caps, enc_info.confBuf,
+ enc_info.confSize);
+
+ ret = gst_audio_encoder_set_output_format (enc, src_caps);
+ gst_caps_unref (src_caps);
+
+ return ret;
+}
+
+static GstFlowReturn
+gst_fdkaacenc_handle_frame (GstAudioEncoder * enc, GstBuffer * inbuf)
+{
+ GstFdkAacEnc *self = GST_FDKAACENC (enc);
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstAudioInfo *info;
+ GstMapInfo imap, omap;
+ GstBuffer *outbuf;
+ AACENC_BufDesc in_desc = { 0 };
+ AACENC_BufDesc out_desc = { 0 };
+ AACENC_InArgs in_args = { 0 };
+ AACENC_OutArgs out_args = { 0 };
+ gint in_id = IN_AUDIO_DATA, out_id = OUT_BITSTREAM_DATA;
+ gint in_sizes, out_sizes;
+ gint in_el_sizes, out_el_sizes;
+ AACENC_ERROR err;
+
+ info = gst_audio_encoder_get_audio_info (enc);
+
+ if (!inbuf) {
+ in_args.numInSamples = -1;
+ } else {
+ if (self->need_reorder) {
+ inbuf = gst_buffer_copy (inbuf);
+ gst_buffer_map (inbuf, &imap, GST_MAP_READWRITE);
+ gst_audio_reorder_channels (imap.data, imap.size,
+ GST_AUDIO_INFO_FORMAT (info), GST_AUDIO_INFO_CHANNELS (info),
+ &GST_AUDIO_INFO_POSITION (info, 0), self->aac_positions);
+ } else {
+ gst_buffer_map (inbuf, &imap, GST_MAP_READ);
+ }
+
+ in_args.numInSamples = imap.size / GST_AUDIO_INFO_BPS (info);
+
+ in_sizes = imap.size;
+ in_el_sizes = 2;
+ in_desc.bufferIdentifiers = &in_id;
+ in_desc.numBufs = 1;
+ in_desc.bufs = (void *) &imap.data;
+ in_desc.bufSizes = &in_sizes;
+ in_desc.bufElSizes = &in_el_sizes;
+ }
+
+ outbuf = gst_audio_encoder_allocate_output_buffer (enc, self->outbuf_size);
+ if (!outbuf) {
+ ret = GST_FLOW_ERROR;
+ goto out;
+ }
+
+ gst_buffer_map (outbuf, &omap, GST_MAP_WRITE);
+ out_sizes = omap.size;
+ out_el_sizes = 1;
+ out_desc.bufferIdentifiers = &out_id;
+ out_desc.numBufs = 1;
+ out_desc.bufs = (void *) &omap.data;
+ out_desc.bufSizes = &out_sizes;
+ out_desc.bufElSizes = &out_el_sizes;
+
+ if ((err = aacEncEncode (self->enc, &in_desc, &out_desc, &in_args,
+ &out_args)) != AACENC_OK) {
+ if (!inbuf && err == AACENC_ENCODE_EOF)
+ goto out;
+
+ GST_ERROR_OBJECT (self, "Failed to encode data: %d", err);
+ ret = GST_FLOW_ERROR;
+ goto out;
+ }
+
+ if (inbuf) {
+ gst_buffer_unmap (inbuf, &imap);
+ if (self->need_reorder)
+ gst_buffer_unref (inbuf);
+ inbuf = NULL;
+ }
+
+ if (!out_args.numOutBytes)
+ goto out;
+
+ gst_buffer_unmap (outbuf, &omap);
+ gst_buffer_set_size (outbuf, out_args.numOutBytes);
+
+ ret = gst_audio_encoder_finish_frame (enc, outbuf, self->samples_per_frame);
+ outbuf = NULL;
+
+out:
+ if (outbuf) {
+ gst_buffer_unmap (outbuf, &omap);
+ gst_buffer_unref (outbuf);
+ }
+ if (inbuf) {
+ gst_buffer_unmap (inbuf, &imap);
+ if (self->need_reorder)
+ gst_buffer_unref (inbuf);
+ }
+
+ return ret;
+}
+
+static void
+gst_fdkaacenc_init (GstFdkAacEnc * self)
+{
+ self->bitrate = DEFAULT_BITRATE;
+ self->enc = NULL;
+
+ gst_audio_encoder_set_drainable (GST_AUDIO_ENCODER (self), TRUE);
+}
+
+static void
+gst_fdkaacenc_class_init (GstFdkAacEncClass * klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ GstAudioEncoderClass *base_class = GST_AUDIO_ENCODER_CLASS (klass);
+
+ object_class->set_property = GST_DEBUG_FUNCPTR (gst_fdkaacenc_set_property);
+ object_class->get_property = GST_DEBUG_FUNCPTR (gst_fdkaacenc_get_property);
+
+ base_class->start = GST_DEBUG_FUNCPTR (gst_fdkaacenc_start);
+ base_class->stop = GST_DEBUG_FUNCPTR (gst_fdkaacenc_stop);
+ base_class->set_format = GST_DEBUG_FUNCPTR (gst_fdkaacenc_set_format);
+ base_class->getcaps = GST_DEBUG_FUNCPTR (gst_fdkaacenc_get_caps);
+ base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_fdkaacenc_handle_frame);
+
+ g_object_class_install_property (object_class, PROP_BITRATE,
+ g_param_spec_int ("bitrate",
+ "Bitrate",
+ "Target Audio Bitrate (0 = fixed value based on "
+ " sample rate and channel count)",
+ 0, G_MAXINT, DEFAULT_BITRATE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
+ gst_element_class_add_static_pad_template (element_class, &src_template);
+
+ gst_element_class_set_static_metadata (element_class, "FDK AAC audio encoder",
+ "Codec/Encoder/Audio", "FDK AAC audio encoder",
+ "Sebastian Dröge <sebastian@centricular.com>");
+
+ GST_DEBUG_CATEGORY_INIT (gst_fdkaacenc_debug, "fdkaacenc", 0,
+ "fdkaac encoder");
+}
diff --git a/ext/fdkaac/gstfdkaacenc.h b/ext/fdkaac/gstfdkaacenc.h
new file mode 100644
index 0000000..8c3df47
--- /dev/null
+++ b/ext/fdkaac/gstfdkaacenc.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2016 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_FDKAACENC_H__
+#define __GST_FDKAACENC_H__
+
+#include <gst/gst.h>
+#include <gst/audio/gstaudioencoder.h>
+
+#include <fdk-aac/aacenc_lib.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_FDKAACENC \
+ (gst_fdkaacenc_get_type())
+#define GST_FDKAACENC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_FDKAACENC, GstFdkAacEnc))
+#define GST_FDKAACENC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_FDKAACENC, GstFdkAacEncClass))
+#define GST_IS_FDKAACENC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_FDKAACENC))
+#define GST_IS_FDKAACENC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_FDKAACENC))
+
+typedef struct _GstFdkAacEnc GstFdkAacEnc;
+typedef struct _GstFdkAacEncClass GstFdkAacEncClass;
+
+struct _GstFdkAacEnc {
+ GstAudioEncoder element;
+
+ HANDLE_AACENCODER enc;
+ gint bitrate;
+
+ guint outbuf_size, samples_per_frame;
+ gboolean need_reorder;
+ const GstAudioChannelPosition *aac_positions;
+};
+
+struct _GstFdkAacEncClass {
+ GstAudioEncoderClass parent_class;
+};
+
+GType gst_fdkaacenc_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_FDKAACENC_H__ */
diff --git a/ext/fdkaac/plugin.c b/ext/fdkaac/plugin.c
new file mode 100644
index 0000000..e3aadec
--- /dev/null
+++ b/ext/fdkaac/plugin.c
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2016 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 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gst/gst.h>
+#include "gstfdkaacenc.h"
+#include "gstfdkaacdec.h"
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ return gst_element_register (plugin, "fdkaacenc", GST_RANK_PRIMARY,
+ GST_TYPE_FDKAACENC)
+ && gst_element_register (plugin, "fdkaacdec", GST_RANK_MARGINAL,
+ GST_TYPE_FDKAACDEC);
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ fdkaac,
+ "Fraunhofer FDK AAC Codec plugin",
+ plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/ext/flite/Makefile.in b/ext/flite/Makefile.in
index c53146e..8bb2029 100644
--- a/ext/flite/Makefile.in
+++ b/ext/flite/Makefile.in
@@ -301,6 +301,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -322,6 +324,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -371,6 +375,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -516,6 +522,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -642,8 +650,6 @@
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@
@@ -686,8 +692,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/flite/gstflitetestsrc.c b/ext/flite/gstflitetestsrc.c
index b6c5667..63ed90d 100644
--- a/ext/flite/gstflitetestsrc.c
+++ b/ext/flite/gstflitetestsrc.c
@@ -126,8 +126,8 @@
1, G_MAXINT, DEFAULT_SAMPLES_PER_BUFFER,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_flite_test_src_src_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_flite_test_src_src_template);
gst_element_class_set_static_metadata (gstelement_class,
"Flite speech test source", "Source/Audio",
diff --git a/ext/fluidsynth/Makefile.in b/ext/fluidsynth/Makefile.in
index 8fd5276..9a2541a 100644
--- a/ext/fluidsynth/Makefile.in
+++ b/ext/fluidsynth/Makefile.in
@@ -310,6 +310,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -331,6 +333,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -380,6 +384,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -525,6 +531,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -651,8 +659,6 @@
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@
@@ -695,8 +701,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/fluidsynth/gstfluiddec.c b/ext/fluidsynth/gstfluiddec.c
index 124825b..62262ec 100644
--- a/ext/fluidsynth/gstfluiddec.c
+++ b/ext/fluidsynth/gstfluiddec.c
@@ -177,10 +177,8 @@
"Synth Polyphony", "The number of simultaneous voices", 1, 65535,
DEFAULT_SYNTH_POLYPHONY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_factory);
gst_element_class_set_static_metadata (gstelement_class, "Fluidsynth",
"Codec/Decoder/Audio",
diff --git a/ext/gl/Makefile.am b/ext/gl/Makefile.am
index 5d55f54..5a82853 100644
--- a/ext/gl/Makefile.am
+++ b/ext/gl/Makefile.am
@@ -40,7 +40,10 @@
gstglfilterapp.c \
gstglviewconvert.c \
gstglstereosplit.c \
- gstglstereomix.c
+ gstgldeinterlace.c \
+ gstglstereomix.c \
+ gltestsrc.c \
+ gstgltestsrc.c
noinst_HEADERS = \
gstglbasemixer.h \
@@ -63,22 +66,19 @@
gstglfilterapp.h \
gstglstereosplit.h \
gstglstereomix.h \
- gstglviewconvert.h
+ gstgldeinterlace.h \
+ gstglviewconvert.h \
+ gltestsrc.h \
+ gstgltestsrc.h
# full opengl required
if USE_OPENGL
libgstopengl_la_SOURCES += \
gstglfilterglass.c \
- gstgldeinterlace.c \
- gltestsrc.c \
- gstgltestsrc.c \
gstglmosaic.c
noinst_HEADERS += \
gstglfilterglass.h \
- gstgldeinterlace.h \
- gltestsrc.h \
- gstgltestsrc.h \
gstglmosaic.h \
effects/gstgleffectscurves.h \
effects/gstgleffectlumatocurve.h
diff --git a/ext/gl/Makefile.in b/ext/gl/Makefile.in
index 2b2ecdf..beffad6 100644
--- a/ext/gl/Makefile.in
+++ b/ext/gl/Makefile.in
@@ -94,16 +94,10 @@
# full opengl required
@USE_OPENGL_TRUE@am__append_1 = \
@USE_OPENGL_TRUE@ gstglfilterglass.c \
-@USE_OPENGL_TRUE@ gstgldeinterlace.c \
-@USE_OPENGL_TRUE@ gltestsrc.c \
-@USE_OPENGL_TRUE@ gstgltestsrc.c \
@USE_OPENGL_TRUE@ gstglmosaic.c
@USE_OPENGL_TRUE@am__append_2 = \
@USE_OPENGL_TRUE@ gstglfilterglass.h \
-@USE_OPENGL_TRUE@ gstgldeinterlace.h \
-@USE_OPENGL_TRUE@ gltestsrc.h \
-@USE_OPENGL_TRUE@ gstgltestsrc.h \
@USE_OPENGL_TRUE@ gstglmosaic.h \
@USE_OPENGL_TRUE@ effects/gstgleffectscurves.h \
@USE_OPENGL_TRUE@ effects/gstgleffectlumatocurve.h
@@ -231,15 +225,12 @@
effects/gstgleffectlaplacian.c gstglcolorscale.c \
gstglcolorbalance.c gstglmixer.c gstglvideomixer.c \
gstglfiltershader.c gstglfilterapp.c gstglviewconvert.c \
- gstglstereosplit.c gstglstereomix.c gstglfilterglass.c \
- gstgldeinterlace.c gltestsrc.c gstgltestsrc.c gstglmosaic.c \
+ gstglstereosplit.c gstgldeinterlace.c gstglstereomix.c \
+ gltestsrc.c gstgltestsrc.c gstglfilterglass.c gstglmosaic.c \
gstgldifferencematte.c gstgltransformation.c gstglvideoflip.c \
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-gltestsrc.lo \
-@USE_OPENGL_TRUE@ libgstopengl_la-gstgltestsrc.lo \
@USE_OPENGL_TRUE@ libgstopengl_la-gstglmosaic.lo
@HAVE_PNG_TRUE@@USE_OPENGL_TRUE@am__objects_2 = libgstopengl_la-gstgldifferencematte.lo
@HAVE_GRAPHENE_TRUE@am__objects_3 = \
@@ -286,7 +277,9 @@
libgstopengl_la-gstglfilterapp.lo \
libgstopengl_la-gstglviewconvert.lo \
libgstopengl_la-gstglstereosplit.lo \
- libgstopengl_la-gstglstereomix.lo $(am__objects_1) \
+ libgstopengl_la-gstgldeinterlace.lo \
+ libgstopengl_la-gstglstereomix.lo libgstopengl_la-gltestsrc.lo \
+ libgstopengl_la-gstgltestsrc.lo $(am__objects_1) \
$(am__objects_2) $(am__objects_3) $(am__objects_4) \
$(am__objects_5)
libgstopengl_la_OBJECTS = $(am_libgstopengl_la_OBJECTS)
@@ -364,8 +357,8 @@
effects/gstgleffectssources.h gstglcolorscale.h \
gstglcolorbalance.h gstglmixer.h gstglvideomixer.h \
gstglfiltershader.h gstglfilterapp.h gstglstereosplit.h \
- gstglstereomix.h gstglviewconvert.h gstglfilterglass.h \
- gstgldeinterlace.h gltestsrc.h gstgltestsrc.h gstglmosaic.h \
+ gstglstereomix.h gstgldeinterlace.h gstglviewconvert.h \
+ gltestsrc.h gstgltestsrc.h gstglfilterglass.h gstglmosaic.h \
effects/gstgleffectscurves.h effects/gstgleffectlumatocurve.h \
gstgldifferencematte.h gstgltransformation.h gstglvideoflip.h \
gstgloverlay.h caopengllayersink.h
@@ -455,6 +448,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -476,6 +471,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -525,6 +522,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -670,6 +669,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -796,8 +797,6 @@
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@
@@ -840,8 +839,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -948,9 +952,9 @@
effects/gstgleffectlaplacian.c gstglcolorscale.c \
gstglcolorbalance.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_7) \
- $(am__append_9)
+ gstglstereosplit.c gstgldeinterlace.c gstglstereomix.c \
+ gltestsrc.c gstgltestsrc.c $(am__append_1) $(am__append_3) \
+ $(am__append_5) $(am__append_7) $(am__append_9)
noinst_HEADERS = gstglbasemixer.h gstgluploadelement.h \
gstgldownloadelement.h gstglcolorconvertelement.h \
gstglfilterbin.h gstglmixerbin.h gstglsinkbin.h gstglsrcbin.h \
@@ -958,9 +962,9 @@
effects/gstgleffectssources.h gstglcolorscale.h \
gstglcolorbalance.h gstglmixer.h gstglvideomixer.h \
gstglfiltershader.h gstglfilterapp.h gstglstereosplit.h \
- gstglstereomix.h gstglviewconvert.h $(am__append_2) \
- $(am__append_4) $(am__append_6) $(am__append_8) \
- $(am__append_10)
+ gstglstereomix.h gstgldeinterlace.h gstglviewconvert.h \
+ gltestsrc.h gstgltestsrc.h $(am__append_2) $(am__append_4) \
+ $(am__append_6) $(am__append_8) $(am__append_10)
libgstopengl_la_OBJCFLAGS = \
-I$(top_srcdir)/gst-libs \
-I$(top_builddir)/gst-libs \
@@ -1469,20 +1473,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-gstglstereosplit.lo `test -f 'gstglstereosplit.c' || echo '$(srcdir)/'`gstglstereosplit.c
-libgstopengl_la-gstglstereomix.lo: gstglstereomix.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-gstglstereomix.lo -MD -MP -MF $(DEPDIR)/libgstopengl_la-gstglstereomix.Tpo -c -o libgstopengl_la-gstglstereomix.lo `test -f 'gstglstereomix.c' || echo '$(srcdir)/'`gstglstereomix.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstopengl_la-gstglstereomix.Tpo $(DEPDIR)/libgstopengl_la-gstglstereomix.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstglstereomix.c' object='libgstopengl_la-gstglstereomix.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-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
@@ -1490,6 +1480,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 $(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-gstglstereomix.lo: gstglstereomix.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-gstglstereomix.lo -MD -MP -MF $(DEPDIR)/libgstopengl_la-gstglstereomix.Tpo -c -o libgstopengl_la-gstglstereomix.lo `test -f 'gstglstereomix.c' || echo '$(srcdir)/'`gstglstereomix.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstopengl_la-gstglstereomix.Tpo $(DEPDIR)/libgstopengl_la-gstglstereomix.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstglstereomix.c' object='libgstopengl_la-gstglstereomix.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-gstglstereomix.lo `test -f 'gstglstereomix.c' || echo '$(srcdir)/'`gstglstereomix.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
@@ -1504,6 +1501,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 $(libgstopengl_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopengl_la_CFLAGS) $(CFLAGS) -c -o libgstopengl_la-gstgltestsrc.lo `test -f 'gstgltestsrc.c' || echo '$(srcdir)/'`gstgltestsrc.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-gstglmosaic.lo: gstglmosaic.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-gstglmosaic.lo -MD -MP -MF $(DEPDIR)/libgstopengl_la-gstglmosaic.Tpo -c -o libgstopengl_la-gstglmosaic.lo `test -f 'gstglmosaic.c' || echo '$(srcdir)/'`gstglmosaic.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstopengl_la-gstglmosaic.Tpo $(DEPDIR)/libgstopengl_la-gstglmosaic.Plo
diff --git a/ext/gl/caopengllayersink.h b/ext/gl/caopengllayersink.h
index e3de325..3507154 100644
--- a/ext/gl/caopengllayersink.h
+++ b/ext/gl/caopengllayersink.h
@@ -63,7 +63,6 @@
GstGLCAOpenGLLayer *layer;
- volatile gint to_quit;
gboolean keep_aspect_ratio;
/* avoid replacing the stored_buffer while drawing */
diff --git a/ext/gl/caopengllayersink.m b/ext/gl/caopengllayersink.m
index 367b59a..f547c73 100644
--- a/ext/gl/caopengllayersink.m
+++ b/ext/gl/caopengllayersink.m
@@ -227,8 +227,7 @@
"Sink/Video", "A video sink based on CAOpenGLLayer",
"Matthew Waters <matthew@centricular.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_ca_opengl_layer_sink_template));
+ gst_element_class_add_static_pad_template (element_class, &gst_ca_opengl_layer_sink_template);
gobject_class->finalize = gst_ca_opengl_layer_sink_finalize;
@@ -384,7 +383,6 @@
gst_ca_opengl_layer_sink_query (GstBaseSink * bsink, GstQuery * query)
{
GstCAOpenGLLayerSink *ca_sink = GST_CA_OPENGL_LAYER_SINK (bsink);
- gboolean res = FALSE;
switch (GST_QUERY_TYPE (query)) {
case GST_QUERY_CONTEXT:
@@ -494,7 +492,6 @@
_ensure_gl_setup (ca_sink);
break;
case GST_STATE_CHANGE_READY_TO_PAUSED:
- g_atomic_int_set (&ca_sink->to_quit, 0);
break;
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
break;
@@ -742,12 +739,6 @@
if (old_sync)
gst_buffer_unref (old_sync);
- if (g_atomic_int_get (&ca_sink->to_quit) != 0) {
- GST_ELEMENT_ERROR (ca_sink, RESOURCE, NOT_FOUND,
- ("%s", gst_gl_context_get_error ()), (NULL));
- return GST_FLOW_ERROR;
- }
-
return GST_FLOW_OK;
}
diff --git a/ext/gl/effects/gstgleffectblur.c b/ext/gl/effects/gstgleffectblur.c
index f03af37..074519a 100644
--- a/ext/gl/effects/gstgleffectblur.c
+++ b/ext/gl/effects/gstgleffectblur.c
@@ -40,79 +40,29 @@
return kernel;
}
-static void
-gst_gl_effects_blur_callback_hconv (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader = NULL;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
-
- if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "hconv0",
- hconv7_fragment_source_gles2))) {
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
- gst_gl_shader_set_uniform_1f (shader, "gauss_width", width);
- gst_gl_shader_set_uniform_1fv (shader, "kernel", 7,
- gst_gl_effects_blur_kernel ());
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
- }
-}
-
-static void
-gst_gl_effects_blur_callback_vconv (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader = NULL;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "vconv0",
- vconv7_fragment_source_gles2))) {
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
- gst_gl_shader_set_uniform_1f (shader, "gauss_height", height);
- gst_gl_shader_set_uniform_1fv (shader, "kernel", 7,
- gst_gl_effects_blur_kernel ());
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
- }
-}
-
void
gst_gl_effects_blur (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->midtexture[0], gst_gl_effects_blur_callback_hconv, effects);
- gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[0],
- effects->outtexture, gst_gl_effects_blur_callback_vconv, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "hconv0",
+ hconv7_fragment_source_gles2);
+ gst_gl_shader_use (shader);
+ gst_gl_shader_set_uniform_1f (shader, "gauss_width",
+ GST_VIDEO_INFO_WIDTH (&filter->in_info));
+ gst_gl_shader_set_uniform_1fv (shader, "kernel", 7,
+ gst_gl_effects_blur_kernel ());
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->midtexture[0], shader);
+
+ shader = gst_gl_effects_get_fragment_shader (effects, "vconv0",
+ vconv7_fragment_source_gles2);
+ gst_gl_shader_use (shader);
+ gst_gl_shader_set_uniform_1f (shader, "gauss_height",
+ GST_VIDEO_INFO_HEIGHT (&filter->in_info));
+ gst_gl_shader_set_uniform_1fv (shader, "kernel", 7,
+ gst_gl_effects_blur_kernel ());
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[0],
+ effects->outtexture, shader);
}
diff --git a/ext/gl/effects/gstgleffectbulge.c b/ext/gl/effects/gstgleffectbulge.c
index 9856321..d2a9a14 100644
--- a/ext/gl/effects/gstgleffectbulge.c
+++ b/ext/gl/effects/gstgleffectbulge.c
@@ -23,44 +23,14 @@
#include "../gstgleffects.h"
-static void
-gst_gl_effects_bulge_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "bulge",
- bulge_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
void
gst_gl_effects_bulge (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_bulge_callback, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "bulge",
+ bulge_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
diff --git a/ext/gl/effects/gstgleffectfisheye.c b/ext/gl/effects/gstgleffectfisheye.c
index 285deb3..fe3ebdc 100644
--- a/ext/gl/effects/gstgleffectfisheye.c
+++ b/ext/gl/effects/gstgleffectfisheye.c
@@ -23,44 +23,14 @@
#include "../gstgleffects.h"
-static void
-gst_gl_effects_fisheye_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "fisheye",
- fisheye_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
void
gst_gl_effects_fisheye (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_fisheye_callback, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "fisheye",
+ fisheye_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
diff --git a/ext/gl/effects/gstgleffectglow.c b/ext/gl/effects/gstgleffectglow.c
index 9fc09e0..6309ce7 100644
--- a/ext/gl/effects/gstgleffectglow.c
+++ b/ext/gl/effects/gstgleffectglow.c
@@ -26,170 +26,61 @@
static gboolean kernel_ready = FALSE;
static float gauss_kernel[7];
-static void
-gst_gl_effects_glow_step_one (gint width, gint height, guint texture,
- gpointer data)
+void
+gst_gl_effects_glow (GstGLEffects * effects)
{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
+ const GstGLFuncs *gl = GST_GL_BASE_FILTER (effects)->context->gl_vtable;
GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "luma_threshold",
- luma_threshold_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
-static void
-gst_gl_effects_glow_step_two (gint width, gint height, guint texture,
- gpointer data)
-{
GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "hconv7",
- hconv7_fragment_source_gles2);
-
- if (!shader)
- return;
if (!kernel_ready) {
fill_gaussian_kernel (gauss_kernel, 7, 10.0);
kernel_ready = TRUE;
}
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
+ /* threshold */
+ shader = gst_gl_effects_get_fragment_shader (effects, "luma_threshold",
+ luma_threshold_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->midtexture[0], shader);
+
+ /* blur */
+ shader = gst_gl_effects_get_fragment_shader (effects, "hconv7",
+ hconv7_fragment_source_gles2);
gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 1);
gst_gl_shader_set_uniform_1fv (shader, "kernel", 7, gauss_kernel);
- gst_gl_shader_set_uniform_1f (shader, "gauss_width", width);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
-static void
-gst_gl_effects_glow_step_three (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
+ gst_gl_shader_set_uniform_1f (shader, "gauss_width",
+ GST_VIDEO_INFO_WIDTH (&filter->out_info));
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[0],
+ effects->midtexture[1], shader);
shader = gst_gl_effects_get_fragment_shader (effects, "vconv7",
vconv7_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 1);
gst_gl_shader_set_uniform_1fv (shader, "kernel", 7, gauss_kernel);
- gst_gl_shader_set_uniform_1f (shader, "gauss_height", height);
+ gst_gl_shader_set_uniform_1f (shader, "gauss_height",
+ GST_VIDEO_INFO_HEIGHT (&filter->out_info));
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[1],
+ effects->midtexture[2], shader);
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
-static void
-gst_gl_effects_glow_step_four (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
+ /* add blurred luma to intexture */
shader = gst_gl_effects_get_fragment_shader (effects, "sum",
sum_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
gst_gl_shader_use (shader);
gl->ActiveTexture (GL_TEXTURE2);
- gl->BindTexture (GL_TEXTURE_2D, effects->intexture);
+ gl->BindTexture (GL_TEXTURE_2D,
+ gst_gl_memory_get_texture_id (effects->intexture));
gst_gl_shader_set_uniform_1f (shader, "alpha", 1.0f);
gst_gl_shader_set_uniform_1i (shader, "base", 2);
gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ gl->BindTexture (GL_TEXTURE_2D,
+ gst_gl_memory_get_texture_id (effects->midtexture[2]));
gst_gl_shader_set_uniform_1f (shader, "beta", (gfloat) 1 / 3.5f);
gst_gl_shader_set_uniform_1i (shader, "blend", 1);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
-void
-gst_gl_effects_glow (GstGLEffects * effects)
-{
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- /* threshold */
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->midtexture[0], gst_gl_effects_glow_step_one, effects);
-
- /* blur */
- gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[0],
- effects->midtexture[1], gst_gl_effects_glow_step_two, effects);
-
- gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[1],
- effects->midtexture[2], gst_gl_effects_glow_step_three, effects);
-
- /* add blurred luma to intexture */
- gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[2],
- effects->outtexture, gst_gl_effects_glow_step_four, effects);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[2],
+ effects->outtexture, shader);
}
diff --git a/ext/gl/effects/gstgleffectidentity.c b/ext/gl/effects/gstgleffectidentity.c
index 5687d64..b81c32d 100644
--- a/ext/gl/effects/gstgleffectidentity.c
+++ b/ext/gl/effects/gstgleffectidentity.c
@@ -23,23 +23,13 @@
#include "../gstgleffects.h"
-static void
-gst_gl_effects_identity_callback (gint width, gint height, guint texture,
- gpointer data)
+void
+gst_gl_effects_identity (GstGLEffects * effects)
{
- GstGLEffects *effects = GST_GL_EFFECTS (data);
+ GstGLContext *context = GST_GL_BASE_FILTER (effects)->context;
GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
GstGLShader *shader;
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
shader = g_hash_table_lookup (effects->shaderstable, "identity0");
if (!shader) {
GError *error = NULL;
@@ -50,28 +40,10 @@
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");
-
g_hash_table_insert (effects->shaderstable, (gchar *) "identity0", shader);
}
gst_gl_shader_use (shader);
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
-void
-gst_gl_effects_identity (GstGLEffects * effects)
-{
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_identity_callback, effects);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
diff --git a/ext/gl/effects/gstgleffectlaplacian.c b/ext/gl/effects/gstgleffectlaplacian.c
index ca5b88c..4652b0f 100644
--- a/ext/gl/effects/gstgleffectlaplacian.c
+++ b/ext/gl/effects/gstgleffectlaplacian.c
@@ -25,48 +25,28 @@
#include "../gstgleffects.h"
-static void
-gst_gl_effects_laplacian_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader = NULL;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "conv0",
- conv9_fragment_source_gles2))) {
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
- static gfloat kernel[9] = { 0.0, -1.0, 0.0,
- -1.0, 4.0, -1.0,
- 0.0, -1.0, 0.0
- };
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
- gst_gl_shader_set_uniform_1f (shader, "height", height);
- gst_gl_shader_set_uniform_1f (shader, "width", width);
- gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, kernel);
- gst_gl_shader_set_uniform_1i (shader, "invert", effects->invert);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
- }
-}
+static gfloat kernel[9] = {
+ 0.0, -1.0, 0.0,
+ -1.0, 4.0, -1.0,
+ 0.0, -1.0, 0.0
+};
void
gst_gl_effects_laplacian (GstGLEffects * effects)
{
- gst_gl_filter_render_to_target (GST_GL_FILTER (effects), TRUE,
- effects->intexture, effects->outtexture,
- gst_gl_effects_laplacian_callback, effects);
+ GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
+
+ shader = gst_gl_effects_get_fragment_shader (effects, "conv0",
+ conv9_fragment_source_gles2);
+ gst_gl_shader_use (shader);
+ gst_gl_shader_set_uniform_1f (shader, "height",
+ GST_VIDEO_INFO_HEIGHT (&filter->in_info));
+ gst_gl_shader_set_uniform_1f (shader, "width",
+ GST_VIDEO_INFO_WIDTH (&filter->in_info));
+ gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, kernel);
+ gst_gl_shader_set_uniform_1i (shader, "invert", effects->invert);
+
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
diff --git a/ext/gl/effects/gstgleffectlumatocurve.c b/ext/gl/effects/gstgleffectlumatocurve.c
index 158fda0..a9c2a5b 100644
--- a/ext/gl/effects/gstgleffectlumatocurve.c
+++ b/ext/gl/effects/gstgleffectlumatocurve.c
@@ -26,13 +26,13 @@
void
gst_gl_effects_luma_to_curve (GstGLEffects * effects,
- const GstGLEffectsCurve * curve,
- gint curve_index, gint width, gint height, GLuint texture)
+ const GstGLEffectsCurve * curve, gint curve_index, GstGLMemory * in_tex,
+ GstGLMemory * out_tex)
{
- GstGLShader *shader;
+ GstGLContext *context = GST_GL_BASE_FILTER (effects)->context;
GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
+ const GstGLFuncs *gl = context->gl_vtable;
+ GstGLShader *shader;
shader = gst_gl_effects_get_fragment_shader (effects, "luma_to_curve",
luma_to_curve_fragment_source_gles2);
@@ -47,112 +47,46 @@
}
#endif
- gst_gl_shader_use (shader);
-
if (effects->curve[curve_index] == 0) {
/* this parameters are needed to have a right, predictable, mapping */
gl->GenTextures (1, &effects->curve[curve_index]);
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->BindTexture (GL_TEXTURE_1D, effects->curve[curve_index]);
- gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);
- gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_CLAMP);
-
- gl->TexImage1D (GL_TEXTURE_1D, 0, curve->bytes_per_pixel,
- curve->width, 0, GL_RGB, GL_UNSIGNED_BYTE, curve->pixel_data);
- }
-#endif
- if (USING_GLES2 (context) || USING_OPENGL3 (context)) {
- gl->BindTexture (GL_TEXTURE_2D, effects->curve[curve_index]);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
- gl->TexImage2D (GL_TEXTURE_2D, 0, GL_RGB,
- curve->width, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, curve->pixel_data);
- }
- }
-
- gl->ActiveTexture (GL_TEXTURE2);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 2);
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_1D, effects->curve[curve_index]);
-
- gst_gl_shader_set_uniform_1i (shader, "curve", 1);
- }
-#endif
- if (USING_GLES2 (context) || USING_OPENGL3 (context)) {
- gl->ActiveTexture (GL_TEXTURE1);
gl->BindTexture (GL_TEXTURE_2D, effects->curve[curve_index]);
+ gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- gst_gl_shader_set_uniform_1i (shader, "curve", 1);
+ gl->TexImage2D (GL_TEXTURE_2D, 0, GL_RGB,
+ curve->width, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, curve->pixel_data);
}
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
+ gst_gl_shader_use (shader);
+ gl->ActiveTexture (GL_TEXTURE2);
+ gl->BindTexture (GL_TEXTURE_2D, effects->curve[curve_index]);
-static void
-gst_gl_effects_heat_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLEffects *effects = GST_GL_EFFECTS (data);
+ gst_gl_shader_set_uniform_1i (shader, "curve", 2);
- gst_gl_effects_luma_to_curve (effects, &heat_curve, GST_GL_EFFECTS_CURVE_HEAT,
- width, height, texture);
+ gst_gl_filter_render_to_target_with_shader (filter, in_tex, out_tex, shader);
}
void
gst_gl_effects_heat (GstGLEffects * effects)
{
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_heat_callback, effects);
-}
-
-static void
-gst_gl_effects_sepia_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLEffects *effects = GST_GL_EFFECTS (data);
-
- gst_gl_effects_luma_to_curve (effects, &sepia_curve,
- GST_GL_EFFECTS_CURVE_SEPIA, width, height, texture);
+ gst_gl_effects_luma_to_curve (effects, &heat_curve,
+ GST_GL_EFFECTS_CURVE_HEAT, effects->intexture, effects->outtexture);
}
void
gst_gl_effects_sepia (GstGLEffects * effects)
{
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_sepia_callback, effects);
-}
-
-static void
-gst_gl_effects_luma_xpro_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLEffects *effects = GST_GL_EFFECTS (data);
-
- gst_gl_effects_luma_to_curve (effects, &luma_xpro_curve,
- GST_GL_EFFECTS_CURVE_LUMA_XPRO, width, height, texture);
+ gst_gl_effects_luma_to_curve (effects, &sepia_curve,
+ GST_GL_EFFECTS_CURVE_SEPIA, effects->intexture, effects->outtexture);
}
void
gst_gl_effects_luma_xpro (GstGLEffects * effects)
{
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_luma_xpro_callback, effects);
+ gst_gl_effects_luma_to_curve (effects, &luma_xpro_curve,
+ GST_GL_EFFECTS_CURVE_LUMA_XPRO, effects->intexture, effects->outtexture);
}
diff --git a/ext/gl/effects/gstgleffectlumatocurve.h b/ext/gl/effects/gstgleffectlumatocurve.h
index 509b45b..f90577f 100644
--- a/ext/gl/effects/gstgleffectlumatocurve.h
+++ b/ext/gl/effects/gstgleffectlumatocurve.h
@@ -28,8 +28,8 @@
void gst_gl_effects_luma_to_curve (GstGLEffects *effects,
const GstGLEffectsCurve *curve,
gint curve_index,
- gint width, gint height,
- GLuint texture);
+ GstGLMemory *in_tex,
+ GstGLMemory *out_tex);
G_END_DECLS
#endif /* __GST_GL_LUMA_TO_CURVE_H__ */
diff --git a/ext/gl/effects/gstgleffectmirror.c b/ext/gl/effects/gstgleffectmirror.c
index 5080099..a25d874 100644
--- a/ext/gl/effects/gstgleffectmirror.c
+++ b/ext/gl/effects/gstgleffectmirror.c
@@ -23,44 +23,14 @@
#include "../gstgleffects.h"
-static void
-gst_gl_effects_mirror_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLFilter *filter = GST_GL_FILTER (data);
- GstGLEffects *effects = GST_GL_EFFECTS (filter);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "mirror",
- mirror_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
void
gst_gl_effects_mirror (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_mirror_callback, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "mirror",
+ mirror_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
diff --git a/ext/gl/effects/gstgleffectrgbtocurve.c b/ext/gl/effects/gstgleffectrgbtocurve.c
index e2b6bdb..5bead68 100644
--- a/ext/gl/effects/gstgleffectrgbtocurve.c
+++ b/ext/gl/effects/gstgleffectrgbtocurve.c
@@ -26,13 +26,13 @@
static void
gst_gl_effects_rgb_to_curve (GstGLEffects * effects,
- const GstGLEffectsCurve * curve,
- gint curve_index, gint width, gint height, GLuint texture)
+ const GstGLEffectsCurve * curve, gint curve_index, GstGLMemory * in_tex,
+ GstGLMemory * out_tex)
{
- GstGLShader *shader;
+ GstGLContext *context = GST_GL_BASE_FILTER (effects)->context;
GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
+ const GstGLFuncs *gl = context->gl_vtable;
+ GstGLShader *shader;
shader = gst_gl_effects_get_fragment_shader (effects, "rgb_to_curve",
rgb_to_curve_fragment_source_gles2);
@@ -47,73 +47,32 @@
}
#endif
- gst_gl_shader_use (shader);
-
if (effects->curve[curve_index] == 0) {
/* this parameters are needed to have a right, predictable, mapping */
gl->GenTextures (1, &effects->curve[curve_index]);
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->BindTexture (GL_TEXTURE_1D, effects->curve[curve_index]);
- gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);
- gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_CLAMP);
- gl->TexImage1D (GL_TEXTURE_1D, 0, GL_RGB,
- curve->width, 0, GL_RGB, GL_UNSIGNED_BYTE, curve->pixel_data);
- }
-#endif
- if (USING_GLES2 (context) || USING_OPENGL3 (context)) {
- gl->BindTexture (GL_TEXTURE_2D, effects->curve[curve_index]);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
- gl->TexImage2D (GL_TEXTURE_2D, 0, GL_RGB,
- curve->width, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, curve->pixel_data);
- }
- }
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_1D, effects->curve[curve_index]);
-
- gst_gl_shader_set_uniform_1i (shader, "curve", 1);
- }
-#endif
- if (USING_GLES2 (context) || USING_OPENGL3 (context)) {
- gl->ActiveTexture (GL_TEXTURE1);
gl->BindTexture (GL_TEXTURE_2D, effects->curve[curve_index]);
+ gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- gst_gl_shader_set_uniform_1i (shader, "curve", 1);
+ gl->TexImage2D (GL_TEXTURE_2D, 0, GL_RGB,
+ curve->width, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, curve->pixel_data);
}
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
+ gst_gl_shader_use (shader);
+ gl->ActiveTexture (GL_TEXTURE2);
+ gl->BindTexture (GL_TEXTURE_2D, effects->curve[curve_index]);
-static void
-gst_gl_effects_xpro_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLEffects *effects = GST_GL_EFFECTS (data);
+ gst_gl_shader_set_uniform_1i (shader, "curve", 2);
- gst_gl_effects_rgb_to_curve (effects, &xpro_curve, GST_GL_EFFECTS_CURVE_XPRO,
- width, height, texture);
+ gst_gl_filter_render_to_target_with_shader (filter, in_tex, out_tex, shader);
}
void
gst_gl_effects_xpro (GstGLEffects * effects)
{
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_xpro_callback, effects);
+ gst_gl_effects_rgb_to_curve (effects, &xpro_curve, GST_GL_EFFECTS_CURVE_XPRO,
+ effects->intexture, effects->outtexture);
}
diff --git a/ext/gl/effects/gstgleffectsin.c b/ext/gl/effects/gstgleffectsin.c
index 5c09e8b..24b6613 100644
--- a/ext/gl/effects/gstgleffectsin.c
+++ b/ext/gl/effects/gstgleffectsin.c
@@ -23,44 +23,14 @@
#include "../gstgleffects.h"
-static void
-gst_gl_effects_sin_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "sin",
- sin_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
void
gst_gl_effects_sin (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_sin_callback, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "sin",
+ sin_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
diff --git a/ext/gl/effects/gstgleffectsobel.c b/ext/gl/effects/gstgleffectsobel.c
index 8996b93..4fbe60f 100644
--- a/ext/gl/effects/gstgleffectsobel.c
+++ b/ext/gl/effects/gstgleffectsobel.c
@@ -25,144 +25,37 @@
#include "../gstgleffects.h"
-static void
-gst_gl_effects_sobel_callback_desaturate (gint width, gint height,
- guint texture, gpointer data)
-{
- GstGLShader *shader = NULL;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "desat0",
- desaturate_fragment_source_gles2))) {
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
- }
-}
-
-static void
-gst_gl_effects_sobel_callback_hconv (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader = NULL;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "hconv0",
- sep_sobel_hconv3_fragment_source_gles2))) {
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
- gst_gl_shader_set_uniform_1f (shader, "width", width);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
- }
-}
-
-static void
-gst_gl_effects_sobel_callback_vconv (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader = NULL;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "vconv0",
- sep_sobel_vconv3_fragment_source_gles2))) {
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
- gst_gl_shader_set_uniform_1f (shader, "height", height);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
- }
-}
-
-static void
-gst_gl_effects_sobel_callback_length (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader = NULL;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "len0",
- sep_sobel_length_fragment_source_gles2))) {
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
- gst_gl_shader_set_uniform_1i (shader, "invert", effects->invert);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
- }
-}
-
void
gst_gl_effects_sobel (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
- gst_gl_filter_render_to_target (filter, TRUE,
- effects->intexture, effects->midtexture[0],
- gst_gl_effects_sobel_callback_desaturate, effects);
- gst_gl_filter_render_to_target (filter, FALSE,
- effects->midtexture[0], effects->midtexture[1],
- gst_gl_effects_sobel_callback_hconv, effects);
- gst_gl_filter_render_to_target (filter, FALSE,
- effects->midtexture[1], effects->midtexture[0],
- gst_gl_effects_sobel_callback_vconv, effects);
- gst_gl_filter_render_to_target (filter, FALSE,
- effects->midtexture[0], effects->outtexture,
- gst_gl_effects_sobel_callback_length, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "desat0",
+ desaturate_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->midtexture[0], shader);
+
+ shader = gst_gl_effects_get_fragment_shader (effects, "hconv0",
+ sep_sobel_hconv3_fragment_source_gles2);
+ gst_gl_shader_use (shader);
+ gst_gl_shader_set_uniform_1f (shader, "height",
+ GST_VIDEO_INFO_HEIGHT (&filter->out_info));
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[0],
+ effects->midtexture[1], shader);
+
+ shader = gst_gl_effects_get_fragment_shader (effects, "vconv0",
+ sep_sobel_vconv3_fragment_source_gles2);
+ gst_gl_shader_use (shader);
+ gst_gl_shader_set_uniform_1f (shader, "width",
+ GST_VIDEO_INFO_WIDTH (&filter->out_info));
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[1],
+ effects->midtexture[0], shader);
+
+ shader = gst_gl_effects_get_fragment_shader (effects, "len0",
+ sep_sobel_length_fragment_source_gles2);
+ gst_gl_shader_use (shader);
+ gst_gl_shader_set_uniform_1i (shader, "invert", effects->invert);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[0],
+ effects->outtexture, shader);
}
diff --git a/ext/gl/effects/gstgleffectsquare.c b/ext/gl/effects/gstgleffectsquare.c
index e74c943..911d30f 100644
--- a/ext/gl/effects/gstgleffectsquare.c
+++ b/ext/gl/effects/gstgleffectsquare.c
@@ -23,44 +23,14 @@
#include "../gstgleffects.h"
-static void
-gst_gl_effects_square_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "square",
- square_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
void
gst_gl_effects_square (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_square_callback, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "square",
+ square_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
diff --git a/ext/gl/effects/gstgleffectsqueeze.c b/ext/gl/effects/gstgleffectsqueeze.c
index 2dbded5..1999978 100644
--- a/ext/gl/effects/gstgleffectsqueeze.c
+++ b/ext/gl/effects/gstgleffectsqueeze.c
@@ -23,44 +23,14 @@
#include "../gstgleffects.h"
-static void
-gst_gl_effects_squeeze_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLFilter *filter = GST_GL_FILTER (data);
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "squeeze",
- squeeze_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
void
gst_gl_effects_squeeze (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_squeeze_callback, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "squeeze",
+ squeeze_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
diff --git a/ext/gl/effects/gstgleffectssources.c b/ext/gl/effects/gstgleffectssources.c
index 3e87b8b..b83e1d7 100644
--- a/ext/gl/effects/gstgleffectssources.c
+++ b/ext/gl/effects/gstgleffectssources.c
@@ -468,32 +468,44 @@
"}";
const gchar *interpolate_fragment_source =
+ "#ifdef GL_ES\n"
+ "precision mediump float;\n"
+ "#endif\n"
+ "varying vec2 v_texcoord;"
"uniform sampler2D base;"
"uniform sampler2D blend;"
"void main () {"
- "vec4 basecolor = texture2D (base, gl_TexCoord[0].st);"
- "vec4 blendcolor = texture2D (blend, gl_TexCoord[0].st);"
+ "vec4 basecolor = texture2D (base, v_texcoord);"
+ "vec4 blendcolor = texture2D (blend, v_texcoord);"
"vec4 white = vec4(1.0);"
"gl_FragColor = blendcolor + (1.0 - blendcolor.a) * basecolor;"
"}";
const gchar *texture_interp_fragment_source =
+ "#ifdef GL_ES\n"
+ "precision mediump float;\n"
+ "#endif\n"
+ "varying vec2 v_texcoord;"
"uniform sampler2D base;"
"uniform sampler2D blend;"
"uniform sampler2D alpha;"
"void main () {"
- " vec4 basecolor = texture2D (base, gl_TexCoord[0].st);"
- " vec4 blendcolor = texture2D (blend, gl_TexCoord[0].st);"
- " vec4 alphacolor = texture2D (alpha, gl_TexCoord[0].st);"
+ " vec4 basecolor = texture2D (base, v_texcoord);"
+ " vec4 blendcolor = texture2D (blend, v_texcoord);"
+ " vec4 alphacolor = texture2D (alpha, v_texcoord);"
" gl_FragColor = (alphacolor * blendcolor) + (1.0 - alphacolor) * basecolor;"
"}";
const gchar *difference_fragment_source =
+ "#ifdef GL_ES\n"
+ "precision mediump float;\n"
+ "#endif\n"
+ "varying vec2 v_texcoord;"
"uniform sampler2D saved;"
"uniform sampler2D current;"
"void main () {"
- "vec4 savedcolor = texture2D (saved, gl_TexCoord[0].st);"
- "vec4 currentcolor = texture2D (current, gl_TexCoord[0].st);"
+ "vec4 savedcolor = texture2D (saved, v_texcoord);"
+ "vec4 currentcolor = texture2D (current, v_texcoord);"
"gl_FragColor = vec4 (step (0.12, length (savedcolor - currentcolor)));"
"}";
diff --git a/ext/gl/effects/gstgleffectstretch.c b/ext/gl/effects/gstgleffectstretch.c
index d132bd0..bbc0c4c 100644
--- a/ext/gl/effects/gstgleffectstretch.c
+++ b/ext/gl/effects/gstgleffectstretch.c
@@ -23,43 +23,14 @@
#include "../gstgleffects.h"
-static void
-gst_gl_effects_stretch_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "stretch",
- stretch_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
void
gst_gl_effects_stretch (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_stretch_callback, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "stretch",
+ stretch_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
diff --git a/ext/gl/effects/gstgleffecttunnel.c b/ext/gl/effects/gstgleffecttunnel.c
index 5029c51..4990b83 100644
--- a/ext/gl/effects/gstgleffecttunnel.c
+++ b/ext/gl/effects/gstgleffecttunnel.c
@@ -23,44 +23,14 @@
#include "../gstgleffects.h"
-static void
-gst_gl_effects_tunnel_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "tunnel",
- tunnel_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
void
gst_gl_effects_tunnel (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_tunnel_callback, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "tunnel",
+ tunnel_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
diff --git a/ext/gl/effects/gstgleffecttwirl.c b/ext/gl/effects/gstgleffecttwirl.c
index 6c73f19..57a9b53 100644
--- a/ext/gl/effects/gstgleffecttwirl.c
+++ b/ext/gl/effects/gstgleffecttwirl.c
@@ -23,44 +23,14 @@
#include "../gstgleffects.h"
-static void
-gst_gl_effects_twirl_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "twirl",
- twirl_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
void
gst_gl_effects_twirl (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_twirl_callback, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "twirl",
+ twirl_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
diff --git a/ext/gl/effects/gstgleffectxray.c b/ext/gl/effects/gstgleffectxray.c
index c045cb6..a7c9b36 100644
--- a/ext/gl/effects/gstgleffectxray.c
+++ b/ext/gl/effects/gstgleffectxray.c
@@ -28,297 +28,97 @@
static gboolean kernel_ready = FALSE;
static float gauss_kernel[7];
-static void
-gst_gl_effects_xray_step_one (gint width, gint height, guint texture,
- gpointer data)
+void
+gst_gl_effects_xray (GstGLEffects * effects)
{
- GstGLEffects *effects = GST_GL_EFFECTS (data);
-
- gst_gl_effects_luma_to_curve (effects, &xray_curve, GST_GL_EFFECTS_CURVE_XRAY,
- width, height, texture);
-}
-
-static void
-gst_gl_effects_xray_step_two (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
+ const GstGLFuncs *gl = GST_GL_BASE_FILTER (effects)->context->gl_vtable;
GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "hconv7",
- hconv7_fragment_source_gles2);
-
- if (!shader)
- return;
+ GstGLShader *shader;
if (!kernel_ready) {
fill_gaussian_kernel (gauss_kernel, 7, 1.5);
kernel_ready = TRUE;
}
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 1);
- gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, gauss_kernel);
- gst_gl_shader_set_uniform_1f (shader, "gauss_width", width);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
-static void
-gst_gl_effects_xray_step_three (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "vconv7",
- vconv7_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 1);
- gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, gauss_kernel);
- gst_gl_shader_set_uniform_1f (shader, "gauss_height", height);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
-/* multipass separable sobel */
-static void
-gst_gl_effects_xray_desaturate (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "desaturate",
- desaturate_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 1);
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
-static void
-gst_gl_effects_xray_sobel_hconv (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "sobel_hconv3",
- sep_sobel_hconv3_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 1);
- gst_gl_shader_set_uniform_1f (shader, "width", width);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
-static void
-gst_gl_effects_xray_sobel_vconv (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "sobel_vconv3",
- sep_sobel_vconv3_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 1);
- gst_gl_shader_set_uniform_1f (shader, "height", height);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
-static void
-gst_gl_effects_xray_sobel_length (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "sobel_length",
- sep_sobel_length_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 1);
- gst_gl_shader_set_uniform_1i (shader, "invert", TRUE);
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
-/* end of sobel passes */
-
-static void
-gst_gl_effects_xray_step_five (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "multiply",
- multiply_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE2);
- gl->BindTexture (GL_TEXTURE_2D, effects->midtexture[2]);
-
- gst_gl_shader_set_uniform_1i (shader, "base", 2);
-
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1f (shader, "alpha", (gfloat) 0.5f);
- gst_gl_shader_set_uniform_1i (shader, "blend", 1);
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
-
-void
-gst_gl_effects_xray (GstGLEffects * effects)
-{
- GstGLFilter *filter = GST_GL_FILTER (effects);
/* map luma to xray curve */
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->midtexture[0], gst_gl_effects_xray_step_one, effects);
+ gst_gl_effects_luma_to_curve (effects, &xray_curve, GST_GL_EFFECTS_CURVE_XRAY,
+ effects->intexture, effects->midtexture[0]);
+
/* horizontal blur */
- gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[0],
- effects->midtexture[1], gst_gl_effects_xray_step_two, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "hconv7",
+ hconv7_fragment_source_gles2);
+ gst_gl_shader_use (shader);
+ gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, gauss_kernel);
+ gst_gl_shader_set_uniform_1f (shader, "gauss_width",
+ GST_VIDEO_INFO_WIDTH (&filter->in_info));
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[0],
+ effects->midtexture[1], shader);
+
/* vertical blur */
- gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[1],
- effects->midtexture[2], gst_gl_effects_xray_step_three, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "vconv7",
+ vconv7_fragment_source_gles2);
+ gst_gl_shader_use (shader);
+ gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, gauss_kernel);
+ gst_gl_shader_set_uniform_1f (shader, "gauss_height",
+ GST_VIDEO_INFO_HEIGHT (&filter->out_info));
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[1],
+ effects->midtexture[2], shader);
+
/* detect edges with Sobel */
/* the old version used edges from the blurred texture, this uses
* the ones from original texture, still not sure what I like
* more. This one gives better edges obviously but behaves badly
* with noise */
/* desaturate */
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->midtexture[3], gst_gl_effects_xray_desaturate, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "desaturate",
+ desaturate_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->midtexture[3], shader);
+
/* horizonal convolution */
- gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[3],
- effects->midtexture[4], gst_gl_effects_xray_sobel_hconv, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "sobel_hconv3",
+ sep_sobel_hconv3_fragment_source_gles2);
+ gst_gl_shader_use (shader);
+ gst_gl_shader_set_uniform_1f (shader, "width",
+ GST_VIDEO_INFO_WIDTH (&filter->out_info));
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[3],
+ effects->midtexture[4], shader);
+
/* vertical convolution */
- gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[4],
- effects->midtexture[3], gst_gl_effects_xray_sobel_vconv, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "sobel_vconv3",
+ sep_sobel_vconv3_fragment_source_gles2);
+ gst_gl_shader_use (shader);
+ gst_gl_shader_set_uniform_1f (shader, "height",
+ GST_VIDEO_INFO_HEIGHT (&filter->out_info));
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[4],
+ effects->midtexture[3], shader);
+
/* gradient length */
- gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[3],
- effects->midtexture[4], gst_gl_effects_xray_sobel_length, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "sobel_length",
+ sep_sobel_length_fragment_source_gles2);
+ gst_gl_shader_use (shader);
+ gst_gl_shader_set_uniform_1i (shader, "invert", TRUE);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[3],
+ effects->midtexture[4], shader);
+
/* multiply edges with the blurred image */
- gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[4],
- effects->outtexture, gst_gl_effects_xray_step_five, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "multiply",
+ multiply_fragment_source_gles2);
+ gst_gl_shader_use (shader);
+
+ gl->ActiveTexture (GL_TEXTURE2);
+ gl->BindTexture (GL_TEXTURE_2D,
+ gst_gl_memory_get_texture_id (effects->midtexture[2]));
+
+ gst_gl_shader_set_uniform_1i (shader, "base", 2);
+
+ gl->ActiveTexture (GL_TEXTURE1);
+ gl->BindTexture (GL_TEXTURE_2D,
+ gst_gl_memory_get_texture_id (effects->midtexture[4]));
+
+ gst_gl_shader_set_uniform_1f (shader, "alpha", (gfloat) 0.5f);
+ gst_gl_shader_set_uniform_1i (shader, "blend", 1);
+
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[4],
+ effects->outtexture, shader);
}
diff --git a/ext/gl/gltestsrc.c b/ext/gl/gltestsrc.c
index c4a2765..80e3c55 100644
--- a/ext/gl/gltestsrc.c
+++ b/ext/gl/gltestsrc.c
@@ -1,5 +1,6 @@
/* GStreamer
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2016> 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
@@ -21,17 +22,19 @@
#include "config.h"
#endif
-/* non-GST-specific stuff */
-
#include "gltestsrc.h"
-#include <string.h>
-#include <stdlib.h>
-#include <math.h>
+#define MAX_ATTRIBUTES 4
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
+struct vts_color_struct
+{
+ gfloat R, G, B;
+};
+
+struct XYZWRGB
+{
+ gfloat X, Y, Z, W, R, G, B;
+};
enum
{
@@ -51,408 +54,1115 @@
static const struct vts_color_struct vts_colors[] = {
/* 100% white */
- {255, 128, 128, 255, 255, 255, 255},
+ {1.0f, 1.0f, 1.0f},
/* yellow */
- {226, 0, 155, 255, 255, 0, 255},
+ {1.0f, 1.0f, 0.0f},
/* cyan */
- {179, 170, 0, 0, 255, 255, 255},
+ {0.0f, 1.0f, 1.0f},
/* green */
- {150, 46, 21, 0, 255, 0, 255},
+ {0.0f, 1.0f, 0.0f},
/* magenta */
- {105, 212, 235, 255, 0, 255, 255},
+ {1.0f, 0.0f, 1.0f},
/* red */
- {76, 85, 255, 255, 0, 0, 255},
+ {1.0f, 0.0f, 0.0f},
/* blue */
- {29, 255, 107, 0, 0, 255, 255},
+ {0.0f, 0.0f, 1.0f},
/* black */
- {16, 128, 128, 0, 0, 0, 255},
+ {0.0f, 0.0f, 0.0f},
/* -I */
- {16, 198, 21, 0, 0, 128, 255},
+ {0.0, 0.0f, 0.5f},
/* +Q */
- {16, 235, 198, 0, 128, 255, 255},
+ {0.0f, 0.5, 1.0f},
/* superblack */
- {0, 128, 128, 0, 0, 0, 255},
- /* 5% grey */
- {32, 128, 128, 32, 32, 32, 255},
+ {0.0f, 0.0f, 0.0f},
+ /* 7.421875% grey */
+ {19. / 256.0f, 19. / 256.0f, 19. / 256.0},
};
-static void
-gst_gl_test_src_unicolor (GstGLTestSrc * v, GstBuffer * buffer, int w,
- int h, const struct vts_color_struct *color);
-
-void
-gst_gl_test_src_smpte (GstGLTestSrc * v, GstBuffer * buffer, int w, int h)
-{
-#if GST_GL_HAVE_OPENGL
- int i;
-
- if (gst_gl_context_get_gl_api (v->context) & GST_GL_API_OPENGL) {
-
- glClearColor (0.0, 0.0, 0.0, 1.0);
- glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glDisable (GL_CULL_FACE);
-
- glMatrixMode (GL_PROJECTION);
- glLoadIdentity ();
-
- for (i = 0; i < 7; i++) {
- glColor4f (vts_colors[i].R * (1 / 255.0f), vts_colors[i].G * (1 / 255.0f),
- vts_colors[i].B * (1 / 255.0f), 1.0f);
- glBegin (GL_QUADS);
- glVertex3f (-1.0f + i * (2.0f / 7.0f), -1.0f + 2.0 * (2.0f / 3.0f), 0);
- glVertex3f (-1.0f + (i + 1.0f) * (2.0f / 7.0f),
- -1.0f + 2.0f * (2.0f / 3.0f), 0);
- glVertex3f (-1.0f + (i + 1.0f) * (2.0f / 7.0f), -1.0f, 0);
- glVertex3f (-1.0f + i * (2.0f / 7.0f), -1.0f, 0);
- glEnd ();
- }
-
- for (i = 0; i < 7; i++) {
- int k;
-
- if (i & 1) {
- k = 7;
- } else {
- k = 6 - i;
- }
-
- glColor4f (vts_colors[k].R * (1 / 255.0f), vts_colors[k].G * (1 / 255.0f),
- vts_colors[k].B * (1 / 255.0f), 1.0f);
- glBegin (GL_QUADS);
- glVertex3f (-1.0f + i * (2.0f / 7.0f), -1.0f + 2.0f * (3.0f / 4.0f), 0);
- glVertex3f (-1.0f + (i + 1) * (2.0f / 7.0f), -1.0f + 2.0f * (3.0f / 4.0f),
- 0);
- glVertex3f (-1.0f + (i + 1) * (2.0f / 7.0f), -1.0f + 2.0f * (2.0f / 3.0f),
- 0);
- glVertex3f (-1.0f + i * (2.0f / 7.0f), -1.0f + 2.0f * (2.0f / 3.0f), 0);
- glEnd ();
- }
-
- for (i = 0; i < 3; i++) {
- int k;
-
- if (i == 0) {
- k = 8;
- } else if (i == 1) {
- k = 0;
- } else {
- k = 9;
- }
-
- glColor4f (vts_colors[k].R * (1 / 255.0f), vts_colors[k].G * (1 / 255.0f),
- vts_colors[k].B * (1 / 255.0f), 1.0f);
- glBegin (GL_QUADS);
- glVertex3f (-1.0f + i * (2.0f / 6.0f), -1.0f + 2.0f * 1, 0);
- glVertex3f (-1.0f + (i + 1) * (2.0f / 6.0f), -1.0f + 2.0f * 1, 0);
- glVertex3f (-1.0f + (i + 1) * (2.0f / 6.0f), -1.0f + 2.0f * (3.0f / 4.0f),
- 0);
- glVertex3f (-1.0f + i * (2.0f / 6.0f), -1.0f + 2.0f * (3.0f / 4.0f), 0);
- glEnd ();
- }
-
- for (i = 0; i < 3; i++) {
- int k;
-
- if (i == 0) {
- k = COLOR_SUPER_BLACK;
- } else if (i == 1) {
- k = COLOR_BLACK;
- } else {
- k = COLOR_DARK_GREY;
- }
-
- glColor4f (vts_colors[k].R * (1 / 255.0f), vts_colors[k].G * (1 / 255.0f),
- vts_colors[k].B * (1 / 255.0f), 1.0f);
- glBegin (GL_QUADS);
- glVertex3f (-1.0f + 2.0f * (0.5f + i * (1.0f / 12.0f)), -1.0 + 2.0f * 1,
- 0);
- glVertex3f (-1.0f + 2.0f * (0.5f + (i + 1) * (1.0f / 12.0f)),
- -1.0f + 2.0f * 1, 0);
- glVertex3f (-1.0f + 2.0f * (0.5f + (i + 1) * (1.0f / 12.0f)),
- -1.0f + 2.0f * (3.0f / 4.0f), 0);
- glVertex3f (-1.0f + 2.0f * (0.5f + i * (1.0f / 12.0f)),
- -1.0f + 2.0f * (3.0f / 4.0f), 0);
- glEnd ();
- }
-
- glColor4f (1.0, 1.0, 1.0, 1.0);
- glBegin (GL_QUADS);
- glVertex3f (-1.0 + 2.0 * (0.75), -1.0 + 2.0 * 1, 0);
- glVertex3f (-1.0 + 2.0 * (1.0), -1.0 + 2.0 * 1, 0);
- glVertex3f (-1.0 + 2.0 * (1.0), -1.0 + 2.0 * (3.0 / 4.0), 0);
- glVertex3f (-1.0 + 2.0 * (0.75), -1.0 + 2.0 * (3.0 / 4.0), 0);
- glEnd ();
- }
-#endif
-}
-
/* *INDENT-OFF* */
-
static const GLfloat positions[] = {
-1.0, 1.0, 0.0, 1.0,
1.0, 1.0, 0.0, 1.0,
1.0, -1.0, 0.0, 1.0,
-1.0, -1.0, 0.0, 1.0,
- };
-static const GLfloat identitiy_matrix[] = {
- 1.0, 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0, 0.0,
- 0.0, 0.0, 1.0, 0.0,
- 0.0, 0.0, 0.0, 1.0,
- };
+};
+static const GLushort indices_quad[] = { 0, 1, 2, 0, 2, 3 };
/* *INDENT-ON* */
-void
-gst_gl_test_src_shader (GstGLTestSrc * v, GstBuffer * buffer, int w, int h)
+struct attribute
{
+ const gchar *name;
+ gint location;
+ guint n_elements;
+ GLenum element_type;
+ guint offset; /* in bytes */
+ guint stride; /* in bytes */
+};
- GstGLFuncs *gl = v->context->gl_vtable;
+struct SrcShader
+{
+ struct BaseSrcImpl base;
+
+ GstGLShader *shader;
+
+ guint vao;
+ guint vbo;
+ guint vbo_indices;
+
+ guint n_attributes;
+ struct attribute attributes[MAX_ATTRIBUTES];
+
+ gconstpointer vertices;
+ gsize vertices_size;
+ const gushort *indices;
+ guint index_offset;
+ guint n_indices;
+};
+
+static void
+_bind_buffer (struct SrcShader *src)
+{
+ GstGLContext *context = src->base.context;
+ const GstGLFuncs *gl = context->gl_vtable;
+ gint i;
+
+ gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, src->vbo_indices);
+ gl->BindBuffer (GL_ARRAY_BUFFER, src->vbo);
+
+ /* Load the vertex position */
+ for (i = 0; i < src->n_attributes; i++) {
+ struct attribute *attr = &src->attributes[i];
+
+ if (attr->location == -1)
+ attr->location =
+ gst_gl_shader_get_attribute_location (src->shader, attr->name);
+
+ gl->VertexAttribPointer (attr->location, attr->n_elements,
+ attr->element_type, GL_FALSE, attr->stride,
+ (void *) (gintptr) attr->offset);
+
+ gl->EnableVertexAttribArray (attr->location);
+ }
+}
+
+static void
+_unbind_buffer (struct SrcShader *src)
+{
+ GstGLContext *context = src->base.context;
+ const GstGLFuncs *gl = context->gl_vtable;
+ gint i;
+
+ gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0);
+ gl->BindBuffer (GL_ARRAY_BUFFER, 0);
+
+ for (i = 0; i < src->n_attributes; i++) {
+ struct attribute *attr = &src->attributes[i];
+
+ gl->DisableVertexAttribArray (attr->location);
+ }
+}
+
+static gboolean
+_src_shader_init (gpointer impl, GstGLContext * context, GstVideoInfo * v_info)
+{
+ struct SrcShader *src = impl;
+ const GstGLFuncs *gl = context->gl_vtable;
+
+ src->base.context = context;
+
+ if (!src->vbo) {
+ if (gl->GenVertexArrays) {
+ gl->GenVertexArrays (1, &src->vao);
+ gl->BindVertexArray (src->vao);
+ }
+
+ gl->GenBuffers (1, &src->vbo);
+ gl->BindBuffer (GL_ARRAY_BUFFER, src->vbo);
+ gl->BufferData (GL_ARRAY_BUFFER, src->vertices_size,
+ src->vertices, GL_STATIC_DRAW);
+
+ gl->GenBuffers (1, &src->vbo_indices);
+ gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, src->vbo_indices);
+ gl->BufferData (GL_ELEMENT_ARRAY_BUFFER, src->n_indices * sizeof (gushort),
+ src->indices, GL_STATIC_DRAW);
+
+ if (gl->GenVertexArrays) {
+ _bind_buffer (src);
+ gl->BindVertexArray (0);
+ }
+
+ gl->BindBuffer (GL_ARRAY_BUFFER, 0);
+ gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0);
+ }
+
+ return TRUE;
+}
+
+static gboolean
+_src_shader_fill_bound_fbo (gpointer impl)
+{
+ struct SrcShader *src = impl;
+ const GstGLFuncs *gl;
+
+ g_return_val_if_fail (src->base.context, FALSE);
+ g_return_val_if_fail (src->shader, FALSE);
+ gl = src->base.context->gl_vtable;
+
+ gst_gl_shader_use (src->shader);
+
+ if (gl->GenVertexArrays)
+ gl->BindVertexArray (src->vao);
+ else
+ _bind_buffer (src);
+
+ gl->DrawElements (GL_TRIANGLES, src->n_indices, GL_UNSIGNED_SHORT,
+ (gpointer) (gintptr) src->index_offset);
+
+ if (gl->GenVertexArrays)
+ gl->BindVertexArray (0);
+ else
+ _unbind_buffer (src);
+
+ gst_gl_context_clear_shader (src->base.context);
+
+ return TRUE;
+}
+
+static void
+_src_shader_deinit (gpointer impl)
+{
+ struct SrcShader *src = impl;
+ const GstGLFuncs *gl = src->base.context->gl_vtable;
+
+ if (src->shader)
+ gst_object_unref (src->shader);
+ src->shader = NULL;
+
+ if (src->vao)
+ gl->DeleteVertexArrays (1, &src->vao);
+ src->vao = 0;
+
+ if (src->vbo)
+ gl->DeleteBuffers (1, &src->vbo);
+ src->vbo = 0;
+
+ if (src->vbo_indices)
+ gl->DeleteBuffers (1, &src->vbo_indices);
+ src->vbo_indices = 0;
+}
/* *INDENT-OFF* */
- const GLfloat uvs[] = {
- 0.0, 1.0,
- 1.0, 1.0,
- 1.0, 0.0,
- 0.0, 0.0,
- };
+static const gchar *smpte_vertex_src =
+ "attribute vec4 position;\n"
+ "attribute vec4 a_color;\n"
+ "varying vec4 color;\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = position;\n"
+ " color = a_color;\n"
+ "}";
+
+static const gchar *smpte_fragment_src =
+ "#ifdef GL_ES\n"
+ "precision mediump float;\n"
+ "#endif\n"
+ "varying vec4 color;\n"
+ "void main()\n"
+ "{\n"
+ " gl_FragColor = color;\n"
+ "}";
+
+static const gchar *snow_vertex_src =
+ "attribute vec4 position;\n"
+ "varying vec2 out_uv;\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = position;\n"
+ " out_uv = position.xy;\n"
+ "}";
+
+static const gchar *snow_fragment_src =
+ "#ifdef GL_ES\n"
+ "precision mediump float;\n"
+ "#endif\n"
+ "uniform float time;\n"
+ "varying vec2 out_uv;\n"
+ "\n"
+ "float rand(vec2 co){\n"
+ " return fract(sin(dot(co.xy, vec2(12.9898,78.233))) * 43758.5453);\n"
+ "}\n"
+ "void main()\n"
+ "{\n"
+ " gl_FragColor = vec4(rand(time * out_uv));\n"
+ "}";
/* *INDENT-ON* */
- GLushort indices[] = { 0, 1, 2, 3, 0 };
+#define N_QUADS 21
+struct SrcSMPTE
+{
+ struct SrcShader base;
- GLint attr_position_loc = -1;
- GLint attr_uv_loc = -1;
+ GstGLShader *snow_shader;
+ GstGLShader *color_shader;
+ gint attr_snow_position;
+};
- if (gst_gl_context_get_gl_api (v->context)) {
+static gpointer
+_src_smpte_new (GstGLTestSrc * test)
+{
+ struct SrcSMPTE *src = g_new0 (struct SrcSMPTE, 1);
- gst_gl_context_clear_shader (v->context);
- gl->BindTexture (GL_TEXTURE_2D, 0);
+ src->base.base.src = test;
- gst_gl_shader_use (v->shader);
-
- attr_position_loc =
- gst_gl_shader_get_attribute_location (v->shader, "position");
-
- attr_uv_loc = gst_gl_shader_get_attribute_location (v->shader, "uv");
-
- /* Load the vertex position */
- gl->VertexAttribPointer (attr_position_loc, 4, GL_FLOAT,
- GL_FALSE, 0, positions);
- /* Load the texture coordinate */
- gl->VertexAttribPointer (attr_uv_loc, 2, GL_FLOAT, GL_FALSE, 0, uvs);
-
- gl->EnableVertexAttribArray (attr_position_loc);
- gl->EnableVertexAttribArray (attr_uv_loc);
-
- gst_gl_shader_set_uniform_matrix_4fv (v->shader, "mvp",
- 1, GL_FALSE, identitiy_matrix);
-
- gst_gl_shader_set_uniform_1f (v->shader, "time",
- (gfloat) v->running_time / GST_SECOND);
-
- gst_gl_shader_set_uniform_1f (v->shader, "aspect_ratio",
- (gfloat) w / (gfloat) h);
-
- gl->DrawElements (GL_TRIANGLE_STRIP, 5, GL_UNSIGNED_SHORT, indices);
-
- gl->DisableVertexAttribArray (attr_position_loc);
- gl->DisableVertexAttribArray (attr_uv_loc);
-
- gst_gl_context_clear_shader (v->context);
- }
+ return src;
}
-static void
-gst_gl_test_src_unicolor (GstGLTestSrc * v, GstBuffer * buffer, int w,
- int h, const struct vts_color_struct *color)
+static gboolean
+_src_smpte_init (gpointer impl, GstGLContext * context, GstVideoInfo * v_info)
{
-#if GST_GL_HAVE_OPENGL
- if (gst_gl_context_get_gl_api (v->context) & GST_GL_API_OPENGL) {
- glClearColor (color->R * (1 / 255.0f), color->G * (1 / 255.0f),
- color->B * (1 / 255.0f), 1.0f);
- glClear (GL_COLOR_BUFFER_BIT);
- }
-#endif
-}
-
-void
-gst_gl_test_src_black (GstGLTestSrc * v, GstBuffer * buffer, int w, int h)
-{
- gst_gl_test_src_unicolor (v, buffer, w, h, vts_colors + COLOR_BLACK);
-}
-
-void
-gst_gl_test_src_white (GstGLTestSrc * v, GstBuffer * buffer, int w, int h)
-{
- gst_gl_test_src_unicolor (v, buffer, w, h, vts_colors + COLOR_WHITE);
-}
-
-void
-gst_gl_test_src_red (GstGLTestSrc * v, GstBuffer * buffer, int w, int h)
-{
- gst_gl_test_src_unicolor (v, buffer, w, h, vts_colors + COLOR_RED);
-}
-
-void
-gst_gl_test_src_green (GstGLTestSrc * v, GstBuffer * buffer, int w, int h)
-{
- gst_gl_test_src_unicolor (v, buffer, w, h, vts_colors + COLOR_GREEN);
-}
-
-void
-gst_gl_test_src_blue (GstGLTestSrc * v, GstBuffer * buffer, int w, int h)
-{
- gst_gl_test_src_unicolor (v, buffer, w, h, vts_colors + COLOR_BLUE);
-}
-
-static void
-gst_gl_test_src_checkers (GstGLTestSrc * v, gint checker_width)
-{
-
- GstGLFuncs *gl = v->context->gl_vtable;
-
- GLushort indices[] = { 0, 1, 2, 3, 0 };
-
- GLint attr_position_loc = -1;
-
- if (gst_gl_context_get_gl_api (v->context)) {
-
- gst_gl_context_clear_shader (v->context);
- gl->BindTexture (GL_TEXTURE_2D, 0);
-
- gst_gl_shader_use (v->shader);
-
- attr_position_loc =
- gst_gl_shader_get_attribute_location (v->shader, "position");
-
- /* Load the vertex position */
- gl->VertexAttribPointer (attr_position_loc, 4, GL_FLOAT,
- GL_FALSE, 0, positions);
-
- gl->EnableVertexAttribArray (attr_position_loc);
-
- gst_gl_shader_set_uniform_matrix_4fv (v->shader, "mvp",
- 1, GL_FALSE, identitiy_matrix);
-
- gst_gl_shader_set_uniform_1f (v->shader, "checker_width", checker_width);
-
- gl->DrawElements (GL_TRIANGLE_STRIP, 5, GL_UNSIGNED_SHORT, indices);
-
- gl->DisableVertexAttribArray (attr_position_loc);
-
- gst_gl_context_clear_shader (v->context);
- }
-}
-
-
-void
-gst_gl_test_src_checkers1 (GstGLTestSrc * v, GstBuffer * buffer, int w, int h)
-{
- gst_gl_test_src_checkers (v, 1);
-}
-
-
-void
-gst_gl_test_src_checkers2 (GstGLTestSrc * v, GstBuffer * buffer, int w, int h)
-{
- gst_gl_test_src_checkers (v, 2);
-}
-
-void
-gst_gl_test_src_checkers4 (GstGLTestSrc * v, GstBuffer * buffer, int w, int h)
-{
- gst_gl_test_src_checkers (v, 4);
-
-}
-
-void
-gst_gl_test_src_checkers8 (GstGLTestSrc * v, GstBuffer * buffer, int w, int h)
-{
- gst_gl_test_src_checkers (v, 8);
-}
-
-void
-gst_gl_test_src_circular (GstGLTestSrc * v, GstBuffer * buffer, int w, int h)
-{
-#if 0
+ struct SrcSMPTE *src = impl;
+ struct XYZWRGB *coord;
+ gushort *plane_indices;
+ GError *error = NULL;
+ int color_idx = 0;
int i;
- int j;
- paintinfo pi = { NULL, };
- paintinfo *p = π
- struct fourcc_list_struct *fourcc;
- struct vts_color_struct color;
- static uint8_t sine_array[256];
- static int sine_array_inited = FALSE;
- double freq[8];
-#ifdef SCALE_AMPLITUDE
- double ampl[8];
-#endif
- int d;
+ src->base.base.context = context;
- if (!sine_array_inited) {
- for (i = 0; i < 256; i++) {
- sine_array[i] =
- floor (255 * (0.5 + 0.5 * sin (i * 2 * M_PI / 256)) + 0.5);
- }
- sine_array_inited = TRUE;
+ coord = g_new0 (struct XYZWRGB, N_QUADS * 4);
+ plane_indices = g_new0 (gushort, N_QUADS * 6);
+
+ /* top row */
+ for (int i = 0; i < 7; i++) {
+ coord[color_idx * 4 + 0].X = -1.0f + i * (2.0f / 7.0f);
+ coord[color_idx * 4 + 0].Y = 1.0f / 3.0f;
+ coord[color_idx * 4 + 1].X = -1.0f + (i + 1) * (2.0f / 7.0f);
+ coord[color_idx * 4 + 1].Y = 1.0f / 3.0f;
+ coord[color_idx * 4 + 2].X = -1.0f + (i + 1) * (2.0f / 7.0f);
+ coord[color_idx * 4 + 2].Y = -1.0f;
+ coord[color_idx * 4 + 3].X = -1.0f + i * (2.0f / 7.0f);
+ coord[color_idx * 4 + 3].Y = -1.0f;
+ color_idx++;
}
- p->width = w;
- p->height = h;
- fourcc = v->fourcc;
- if (fourcc == NULL)
+ /* middle row */
+ for (int i = 0; i < 7; i++) {
+ coord[color_idx * 4 + 0].X = -1.0f + i * (2.0f / 7.0f);
+ coord[color_idx * 4 + 0].Y = 0.5f;
+ coord[color_idx * 4 + 1].X = -1.0f + (i + 1) * (2.0f / 7.0f);
+ coord[color_idx * 4 + 1].Y = 0.5f;
+ coord[color_idx * 4 + 2].X = -1.0f + (i + 1) * (2.0f / 7.0f);
+ coord[color_idx * 4 + 2].Y = 1.0f / 3.0f;
+ coord[color_idx * 4 + 3].X = -1.0f + i * (2.0f / 7.0f);
+ coord[color_idx * 4 + 3].Y = 1.0f / 3.0f;
+ color_idx++;
+ }
+
+ /* bottom row, left three */
+ for (int i = 0; i < 3; i++) {
+ coord[color_idx * 4 + 0].X = -1.0f + i / 3.0f;
+ coord[color_idx * 4 + 0].Y = 1.0f;
+ coord[color_idx * 4 + 1].X = -1.0f + (i + 1) / 3.0f;
+ coord[color_idx * 4 + 1].Y = 1.0f;
+ coord[color_idx * 4 + 2].X = -1.0f + (i + 1) / 3.0f;
+ coord[color_idx * 4 + 2].Y = 0.5f;
+ coord[color_idx * 4 + 3].X = -1.0f + i / 3.0f;
+ coord[color_idx * 4 + 3].Y = 0.5f;
+ color_idx++;
+ }
+
+ /* bottom row, middle three (the blacks) */
+ for (int i = 0; i < 3; i++) {
+ coord[color_idx * 4 + 0].X = i / 6.0f;
+ coord[color_idx * 4 + 0].Y = 1.0f;
+ coord[color_idx * 4 + 1].X = (i + 1) / 6.0f;
+ coord[color_idx * 4 + 1].Y = 1.0f;
+ coord[color_idx * 4 + 2].X = (i + 1) / 6.0f;
+ coord[color_idx * 4 + 2].Y = 0.5f;
+ coord[color_idx * 4 + 3].X = i / 6.0f;
+ coord[color_idx * 4 + 3].Y = 0.5f;
+ color_idx++;
+ }
+
+ g_assert (color_idx < N_QUADS);
+
+ for (i = 0; i < N_QUADS - 1; i++) {
+ int j, k;
+ if (i < 7) {
+ k = i;
+ } else if ((i - 7) & 1) {
+ k = COLOR_BLACK;
+ } else {
+ k = 13 - i;
+ }
+
+ if (i == 14) {
+ k = COLOR_NEG_I;
+ } else if (i == 15) {
+ k = COLOR_WHITE;
+ } else if (i == 16) {
+ k = COLOR_POS_Q;
+ } else if (i == 17) {
+ k = COLOR_SUPER_BLACK;
+ } else if (i == 18) {
+ k = COLOR_BLACK;
+ } else if (i == 19) {
+ k = COLOR_DARK_GREY;
+ }
+
+ for (j = 0; j < 4; j++) {
+ coord[i * 4 + j].Z = 0.0f;
+ coord[i * 4 + j].W = 1.0f;
+ coord[i * 4 + j].R = vts_colors[k].R;
+ coord[i * 4 + j].G = vts_colors[k].G;
+ coord[i * 4 + j].B = vts_colors[k].B;
+ }
+
+ for (j = 0; j < 6; j++)
+ plane_indices[i * 6 + j] = i * 4 + indices_quad[j];
+ }
+
+ /* snow */
+ coord[color_idx * 4 + 0].X = 0.5f;
+ coord[color_idx * 4 + 0].Y = 1.0f;
+ coord[color_idx * 4 + 0].Z = 0.0f;
+ coord[color_idx * 4 + 0].W = 1.0f;
+ coord[color_idx * 4 + 1].X = 1.0f;
+ coord[color_idx * 4 + 1].Y = 1.0f;
+ coord[color_idx * 4 + 1].Z = 0.0f;
+ coord[color_idx * 4 + 1].W = 1.0f;
+ coord[color_idx * 4 + 2].X = 1.0f;
+ coord[color_idx * 4 + 2].Y = 0.5f;
+ coord[color_idx * 4 + 2].Z = 0.0f;
+ coord[color_idx * 4 + 2].W = 1.0f;
+ coord[color_idx * 4 + 3].X = 0.5f;
+ coord[color_idx * 4 + 3].Y = 0.5f;
+ coord[color_idx * 4 + 3].Z = 0.0f;
+ coord[color_idx * 4 + 3].W = 1.0f;
+ for (i = 0; i < 6; i++)
+ plane_indices[color_idx * 6 + i] = color_idx * 4 + indices_quad[i];
+ color_idx++;
+
+ if (src->color_shader)
+ gst_object_unref (src->color_shader);
+ src->color_shader = gst_gl_shader_new_link_with_stages (context, &error,
+ gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER,
+ GST_GLSL_VERSION_NONE,
+ GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
+ smpte_vertex_src),
+ gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
+ GST_GLSL_VERSION_NONE,
+ GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
+ smpte_fragment_src), NULL);
+ if (!src->color_shader) {
+ GST_ERROR_OBJECT (src->base.base.src, "%s", error->message);
+ return FALSE;
+ }
+
+ if (src->snow_shader)
+ gst_object_unref (src->snow_shader);
+ src->snow_shader = gst_gl_shader_new_link_with_stages (context, &error,
+ gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER,
+ GST_GLSL_VERSION_NONE,
+ GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
+ snow_vertex_src),
+ gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
+ GST_GLSL_VERSION_NONE,
+ GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
+ snow_fragment_src), NULL);
+ if (!src->snow_shader) {
+ GST_ERROR_OBJECT (src->base.base.src, "%s", error->message);
+ return FALSE;
+ }
+
+ src->attr_snow_position = -1;
+
+ src->base.n_attributes = 2;
+
+ src->base.attributes[0].name = "position";
+ src->base.attributes[0].location = -1;
+ src->base.attributes[0].n_elements = 4;
+ src->base.attributes[0].element_type = GL_FLOAT;
+ src->base.attributes[0].offset = 0;
+ src->base.attributes[0].stride = sizeof (struct XYZWRGB);
+
+ src->base.attributes[1].name = "a_color";
+ src->base.attributes[1].location = -1;
+ src->base.attributes[1].n_elements = 3;
+ src->base.attributes[1].element_type = GL_FLOAT;
+ src->base.attributes[1].offset = 4 * sizeof (gfloat);
+ src->base.attributes[1].stride = sizeof (struct XYZWRGB);
+
+ if (src->base.shader)
+ gst_object_unref (src->base.shader);
+ src->base.shader = gst_object_ref (src->color_shader);
+ src->base.vertices = (gfloat *) coord;
+ src->base.vertices_size = sizeof (struct XYZWRGB) * N_QUADS * 4;
+ src->base.indices = plane_indices;
+ src->base.n_indices = N_QUADS * 6;
+
+ return _src_shader_init (impl, context, v_info);
+}
+
+static gboolean
+_src_smpte_fill_bound_fbo (gpointer impl)
+{
+ struct SrcSMPTE *src = impl;
+ gint attr_color_position = -1;
+
+ src->base.n_attributes = 2;
+ if (src->base.shader)
+ gst_object_unref (src->base.shader);
+ src->base.shader = gst_object_ref (src->color_shader);
+ src->base.n_indices = (N_QUADS - 1) * 6;
+ src->base.index_offset = 0;
+ if (!_src_shader_fill_bound_fbo (impl))
+ return FALSE;
+ attr_color_position = src->base.attributes[0].location;
+
+ src->base.attributes[0].location = src->attr_snow_position;
+ src->base.n_attributes = 1;
+ if (src->base.shader)
+ gst_object_unref (src->base.shader);
+ src->base.shader = gst_object_ref (src->snow_shader);
+ src->base.n_indices = 6;
+ src->base.index_offset = (N_QUADS - 1) * 6 * sizeof (gushort);
+ gst_gl_shader_use (src->snow_shader);
+ gst_gl_shader_set_uniform_1f (src->snow_shader, "time",
+ (gfloat) src->base.base.src->running_time / GST_SECOND);
+ if (!_src_shader_fill_bound_fbo (impl))
+ return FALSE;
+ src->attr_snow_position = src->base.attributes[0].location;
+ src->base.attributes[0].location = attr_color_position;
+
+ return TRUE;
+}
+
+static void
+_src_smpte_free (gpointer impl)
+{
+ struct SrcSMPTE *src = impl;
+
+ if (!impl)
return;
- fourcc->paint_setup (p, dest);
- p->paint_hline = fourcc->paint_hline;
+ _src_shader_deinit (impl);
- color = vts_colors[COLOR_BLACK];
- p->color = &color;
+ g_free ((gpointer) src->base.vertices);
+ g_free ((gpointer) src->base.indices);
- for (i = 1; i < 8; i++) {
- freq[i] = 200 * pow (2.0, -(i - 1) / 4.0);
-#ifdef SCALE_AMPLITUDE
- {
- double x;
+ if (src->snow_shader)
+ gst_object_unref (src->snow_shader);
+ if (src->color_shader)
+ gst_object_unref (src->color_shader);
- x = 2 * M_PI * freq[i] / w;
- ampl[i] = sin (x) / x;
- }
-#endif
+ g_free (impl);
+}
+
+static const struct SrcFuncs src_smpte = {
+ GST_GL_TEST_SRC_SMPTE,
+ _src_smpte_new,
+ _src_smpte_init,
+ _src_smpte_fill_bound_fbo,
+ _src_smpte_free,
+};
+
+#undef N_QUADS
+
+struct SrcUniColor
+{
+ struct BaseSrcImpl base;
+
+ struct vts_color_struct color;
+};
+
+static gpointer
+_src_uni_color_new (GstGLTestSrc * test)
+{
+ struct SrcUniColor *src = g_new0 (struct SrcUniColor, 1);
+
+ src->base.src = test;
+
+ return src;
+}
+
+static gboolean
+_src_uni_color_init (gpointer impl, GstGLContext * context,
+ GstVideoInfo * v_info)
+{
+ struct SrcUniColor *src = impl;
+
+ src->base.context = context;
+ src->base.v_info = *v_info;
+
+ return TRUE;
+}
+
+static gboolean
+_src_uni_color_fill_bound_fbo (gpointer impl)
+{
+ struct SrcUniColor *src = impl;
+ const GstGLFuncs *gl = src->base.context->gl_vtable;
+
+ gl->ClearColor (src->color.R, src->color.G, src->color.B, 1.0f);
+ gl->Clear (GL_COLOR_BUFFER_BIT);
+
+ return TRUE;
+}
+
+static void
+_src_uni_color_free (gpointer impl)
+{
+ g_free (impl);
+}
+
+#define SRC_UNICOLOR(name, cap_name) \
+static gpointer \
+G_PASTE(G_PASTE(_src_unicolor_,name),_new) (GstGLTestSrc * test) \
+{ \
+ struct SrcUniColor *src = _src_uni_color_new (test); \
+ src->color = vts_colors[G_PASTE(COLOR_,cap_name)]; \
+ return src; \
+} \
+static const struct SrcFuncs G_PASTE (src_,name) = { \
+ G_PASTE(GST_GL_TEST_SRC_,cap_name), \
+ G_PASTE(G_PASTE(_src_unicolor_,name),_new), \
+ _src_uni_color_init, \
+ _src_uni_color_fill_bound_fbo, \
+ _src_uni_color_free, \
+}
+
+SRC_UNICOLOR (white, WHITE);
+SRC_UNICOLOR (black, BLACK);
+SRC_UNICOLOR (red, RED);
+SRC_UNICOLOR (green, GREEN);
+SRC_UNICOLOR (blue, BLUE);
+
+static gpointer
+_src_blink_new (GstGLTestSrc * test)
+{
+ struct SrcUniColor *src = _src_uni_color_new (test);
+
+ src->color = vts_colors[COLOR_WHITE];
+
+ return src;
+}
+
+static gboolean
+_src_blink_fill_bound_fbo (gpointer impl)
+{
+ struct SrcUniColor *src = impl;
+
+ if (src->color.R > 0.5) {
+ src->color = vts_colors[COLOR_BLACK];
+ } else {
+ src->color = vts_colors[COLOR_WHITE];
}
- for (i = 0; i < w; i++) {
- for (j = 0; j < h; j++) {
- double dist;
- int seg;
+ return _src_uni_color_fill_bound_fbo (impl);
+}
- dist =
- sqrt ((2 * i - w) * (2 * i - w) + (2 * j - h) * (2 * j -
- h)) / (2 * w);
- seg = floor (dist * 16);
- if (seg == 0 || seg >= 8) {
- color.Y = 255;
- } else {
-#ifdef SCALE_AMPLITUDE
- double a;
-#endif
- d = floor (256 * dist * freq[seg] + 0.5);
-#ifdef SCALE_AMPLITUDE
- a = ampl[seg];
- if (a < 0)
- a = 0;
- color.Y = 128 + a * (sine_array[d & 0xff] - 128);
-#else
- color.Y = sine_array[d & 0xff];
-#endif
- }
- color.R = color.Y;
- color.G = color.Y;
- color.B = color.Y;
- p->paint_hline (p, i, j, 1);
- }
+static const struct SrcFuncs src_blink = {
+ GST_GL_TEST_SRC_BLINK,
+ _src_blink_new,
+ _src_uni_color_init,
+ _src_blink_fill_bound_fbo,
+ _src_uni_color_free,
+};
+
+/* *INDENT-OFF* */
+static const gchar *checkers_vertex_src = "attribute vec4 position;\n"
+ "varying vec2 uv;\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = position;\n"
+ /* RPi gives incorrect results for positive uv (plus it makes us start on
+ * the right pixel color i.e. red) */
+ " uv = position.xy - 1.0;\n"
+ "}";
+
+static const gchar *checkers_fragment_src =
+ "#ifdef GL_ES\n"
+ "precision mediump float;\n"
+ "#endif\n"
+ "uniform float checker_width;\n"
+ "uniform float width;\n"
+ "uniform float height;\n"
+ "varying vec2 uv;\n"
+ "void main()\n"
+ "{\n"
+ " vec2 xy_mod = floor (0.5 * uv * vec2(width, height) / (checker_width));\n"
+ " float result = mod (xy_mod.x + xy_mod.y, 2.0);\n"
+ " gl_FragColor.r = step (result, 0.5);\n"
+ " gl_FragColor.g = 1.0 - gl_FragColor.r;\n"
+ " gl_FragColor.ba = vec2(0.0, 1.0);\n"
+ "}";
+/* *INDENT-ON* */
+
+struct SrcCheckers
+{
+ struct SrcShader base;
+
+ guint checker_width;
+};
+
+static gboolean
+_src_checkers_init (gpointer impl, GstGLContext * context,
+ GstVideoInfo * v_info)
+{
+ struct SrcCheckers *src = impl;
+ GError *error = NULL;
+
+ src->base.base.context = context;
+
+ if (src->base.shader)
+ gst_object_unref (src->base.shader);
+ src->base.shader = gst_gl_shader_new_link_with_stages (context, &error,
+ gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER,
+ GST_GLSL_VERSION_NONE,
+ GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
+ checkers_vertex_src),
+ gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
+ GST_GLSL_VERSION_NONE,
+ GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
+ checkers_fragment_src), NULL);
+ if (!src->base.shader) {
+ GST_ERROR_OBJECT (src->base.base.src, "%s", error->message);
+ return FALSE;
}
-#endif
+
+ src->base.n_attributes = 1;
+
+ src->base.attributes[0].name = "position";
+ src->base.attributes[0].location = -1;
+ src->base.attributes[0].n_elements = 4;
+ src->base.attributes[0].element_type = GL_FLOAT;
+ src->base.attributes[0].offset = 0;
+ src->base.attributes[0].stride = 4 * sizeof (gfloat);
+
+ src->base.vertices = positions;
+ src->base.vertices_size = sizeof (positions);
+ src->base.indices = indices_quad;
+ src->base.n_indices = 6;
+
+ gst_gl_shader_use (src->base.shader);
+ gst_gl_shader_set_uniform_1f (src->base.shader, "checker_width",
+ src->checker_width);
+ gst_gl_shader_set_uniform_1f (src->base.shader, "width",
+ (gfloat) GST_VIDEO_INFO_WIDTH (v_info));
+ gst_gl_shader_set_uniform_1f (src->base.shader, "height",
+ (gfloat) GST_VIDEO_INFO_HEIGHT (v_info));
+ gst_gl_context_clear_shader (src->base.base.context);
+
+ return _src_shader_init (impl, context, v_info);
+}
+
+static void
+_src_checkers_free (gpointer impl)
+{
+ struct SrcCheckers *src = impl;
+
+ if (!src)
+ return;
+
+ _src_shader_deinit (impl);
+
+ g_free (impl);
+}
+
+static gpointer
+_src_checkers_new (GstGLTestSrc * test)
+{
+ struct SrcCheckers *src = g_new0 (struct SrcCheckers, 1);
+
+ src->base.base.src = test;
+
+ return src;
+}
+
+#define SRC_CHECKERS(spacing) \
+static gpointer \
+G_PASTE(G_PASTE(_src_checkers,spacing),_new) (GstGLTestSrc * test) \
+{ \
+ struct SrcCheckers *src = _src_checkers_new (test); \
+ src->checker_width = spacing; \
+ return src; \
+} \
+static const struct SrcFuncs G_PASTE(src_checkers,spacing) = { \
+ G_PASTE(GST_GL_TEST_SRC_CHECKERS,spacing), \
+ G_PASTE(G_PASTE(_src_checkers,spacing),_new), \
+ _src_checkers_init, \
+ _src_shader_fill_bound_fbo, \
+ _src_checkers_free, \
+}
+
+SRC_CHECKERS (1);
+SRC_CHECKERS (2);
+SRC_CHECKERS (4);
+SRC_CHECKERS (8);
+
+static gboolean
+_src_snow_init (gpointer impl, GstGLContext * context, GstVideoInfo * v_info)
+{
+ struct SrcShader *src = impl;
+ GError *error = NULL;
+
+ src->base.context = context;
+
+ if (src->shader)
+ gst_object_unref (src->shader);
+ src->shader = gst_gl_shader_new_link_with_stages (context, &error,
+ gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER,
+ GST_GLSL_VERSION_NONE,
+ GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
+ snow_vertex_src),
+ gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
+ GST_GLSL_VERSION_NONE,
+ GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
+ snow_fragment_src), NULL);
+ if (!src->shader) {
+ GST_ERROR_OBJECT (src->base.src, "%s", error->message);
+ return FALSE;
+ }
+
+ src->n_attributes = 1;
+
+ src->attributes[0].name = "position";
+ src->attributes[0].location = -1;
+ src->attributes[0].n_elements = 4;
+ src->attributes[0].element_type = GL_FLOAT;
+ src->attributes[0].offset = 0;
+ src->attributes[0].stride = 4 * sizeof (gfloat);
+
+ src->vertices = positions;
+ src->vertices_size = sizeof (positions);
+ src->indices = indices_quad;
+ src->n_indices = 6;
+
+ return _src_shader_init (impl, context, v_info);
+}
+
+static gboolean
+_src_snow_fill_bound_fbo (gpointer impl)
+{
+ struct SrcShader *src = impl;
+
+ g_return_val_if_fail (src->base.context, FALSE);
+ g_return_val_if_fail (src->shader, FALSE);
+
+ gst_gl_shader_use (src->shader);
+ gst_gl_shader_set_uniform_1f (src->shader, "time",
+ (gfloat) src->base.src->running_time / GST_SECOND);
+
+ return _src_shader_fill_bound_fbo (impl);
+}
+
+static void
+_src_snow_free (gpointer impl)
+{
+ struct SrcShader *src = impl;
+
+ if (!src)
+ return;
+
+ _src_shader_deinit (impl);
+
+ g_free (impl);
+}
+
+static gpointer
+_src_snow_new (GstGLTestSrc * test)
+{
+ struct SrcShader *src = g_new0 (struct SrcShader, 1);
+
+ src->base.src = test;
+
+ return src;
+}
+
+static const struct SrcFuncs src_snow = {
+ GST_GL_TEST_SRC_SNOW,
+ _src_snow_new,
+ _src_snow_init,
+ _src_snow_fill_bound_fbo,
+ _src_snow_free,
+};
+
+/* *INDENT-OFF* */
+static const gchar *mandelbrot_vertex_src = "attribute vec4 position;\n"
+ "uniform float aspect_ratio;\n"
+ "varying vec2 fractal_position;\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = position;\n"
+ " fractal_position = vec2(position.y * 0.5 - 0.3, aspect_ratio * position.x * 0.5);\n"
+ " fractal_position *= 2.5;\n"
+ "}";
+
+static const gchar *mandelbrot_fragment_src =
+ "#ifdef GL_ES\n"
+ "precision mediump float;\n"
+ "#endif\n"
+ "uniform float time;\n"
+ "varying vec2 fractal_position;\n"
+ "const vec4 K = vec4(1.0, 0.66, 0.33, 3.0);\n"
+ "vec4 hsv_to_rgb(float hue, float saturation, float value) {\n"
+ " vec4 p = abs(fract(vec4(hue) + K) * 6.0 - K.wwww);\n"
+ " return value * mix(K.xxxx, clamp(p - K.xxxx, 0.0, 1.0), saturation);\n"
+ "}\n"
+ "vec4 i_to_rgb(int i) {\n"
+ " float hue = float(i) / 100.0 + sin(time);\n"
+ " return hsv_to_rgb(hue, 0.5, 0.8);\n"
+ "}\n"
+ "vec2 pow_2_complex(vec2 c) {\n"
+ " return vec2(c.x*c.x - c.y*c.y, 2.0 * c.x * c.y);\n"
+ "}\n"
+ "vec2 mandelbrot(vec2 c, vec2 c0) {\n"
+ " return pow_2_complex(c) + c0;\n"
+ "}\n"
+ "vec4 iterate_pixel(vec2 position) {\n"
+ " vec2 c = vec2(0);\n"
+ " for (int i=0; i < 20; i++) {\n"
+ " if (c.x*c.x + c.y*c.y > 2.0*2.0)\n"
+ " return i_to_rgb(i);\n"
+ " c = mandelbrot(c, position);\n"
+ " }\n"
+ " return vec4(0, 0, 0, 1);\n"
+ "}\n"
+ "void main() {\n"
+ " gl_FragColor = iterate_pixel(fractal_position);\n"
+ "}";
+/* *INDENT-ON* */
+
+static gboolean
+_src_mandelbrot_init (gpointer impl, GstGLContext * context,
+ GstVideoInfo * v_info)
+{
+ struct SrcShader *src = impl;
+ GError *error = NULL;
+
+ src->base.context = context;
+
+ if (src->shader)
+ gst_object_unref (src->shader);
+ src->shader = gst_gl_shader_new_link_with_stages (context, &error,
+ gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER,
+ GST_GLSL_VERSION_NONE,
+ GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
+ mandelbrot_vertex_src),
+ gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
+ GST_GLSL_VERSION_NONE,
+ GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
+ mandelbrot_fragment_src), NULL);
+ if (!src->shader) {
+ GST_ERROR_OBJECT (src->base.src, "%s", error->message);
+ return FALSE;
+ }
+
+ src->n_attributes = 1;
+
+ src->attributes[0].name = "position";
+ src->attributes[0].location = -1;
+ src->attributes[0].n_elements = 4;
+ src->attributes[0].element_type = GL_FLOAT;
+ src->attributes[0].offset = 0;
+ src->attributes[0].stride = 4 * sizeof (gfloat);
+
+ src->vertices = positions;
+ src->vertices_size = sizeof (positions);
+ src->indices = indices_quad;
+ src->n_indices = 6;
+
+ gst_gl_shader_use (src->shader);
+ gst_gl_shader_set_uniform_1f (src->shader, "aspect_ratio",
+ (gfloat) GST_VIDEO_INFO_WIDTH (v_info) /
+ (gfloat) GST_VIDEO_INFO_HEIGHT (v_info));
+ gst_gl_context_clear_shader (src->base.context);
+
+ return _src_shader_init (impl, context, v_info);
+}
+
+static gboolean
+_src_mandelbrot_fill_bound_fbo (gpointer impl)
+{
+ struct SrcShader *src = impl;
+
+ g_return_val_if_fail (src->base.context, FALSE);
+ g_return_val_if_fail (src->shader, FALSE);
+
+ gst_gl_shader_use (src->shader);
+ gst_gl_shader_set_uniform_1f (src->shader, "time",
+ (gfloat) src->base.src->running_time / GST_SECOND);
+
+ return _src_shader_fill_bound_fbo (impl);
+}
+
+static void
+_src_mandelbrot_free (gpointer impl)
+{
+ struct SrcShader *src = impl;
+
+ if (!src)
+ return;
+
+ _src_shader_deinit (impl);
+
+ g_free (impl);
+}
+
+static gpointer
+_src_mandelbrot_new (GstGLTestSrc * test)
+{
+ struct SrcShader *src = g_new0 (struct SrcShader, 1);
+
+ src->base.src = test;
+
+ return src;
+}
+
+static const struct SrcFuncs src_mandelbrot = {
+ GST_GL_TEST_SRC_MANDELBROT,
+ _src_mandelbrot_new,
+ _src_mandelbrot_init,
+ _src_mandelbrot_fill_bound_fbo,
+ _src_mandelbrot_free,
+};
+
+/* *INDENT-OFF* */
+static const gchar *circular_vertex_src =
+ "attribute vec4 position;\n"
+ "varying vec2 uv;\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = position;\n"
+ " uv = position.xy;\n"
+ "}";
+
+static const gchar *circular_fragment_src =
+ "#ifdef GL_ES\n"
+ "precision mediump float;\n"
+ "#endif\n"
+ "uniform float aspect_ratio;\n"
+ "varying vec2 uv;\n"
+ "#define PI 3.14159265\n"
+ "void main() {\n"
+ " float dist = 0.5 * sqrt(uv.x * uv.x + uv.y / aspect_ratio * uv.y / aspect_ratio);\n"
+ " float seg = floor(dist * 16.0);\n"
+ " if (seg <= 0.0 || seg >= 8.0) {\n"
+ " gl_FragColor = vec4(vec3(0.0), 1.0);\n"
+ " } else {\n"
+ " float d = floor (256.0 * dist * 200.0 * pow (2.0, - (seg - 1.0) / 4.0) + 0.5) / 128.0;\n"
+ " gl_FragColor = vec4 (vec3(sin (d * PI) * 0.5 + 0.5), 1.0);\n"
+ " }\n"
+ "}";
+/* *INDENT-ON* */
+
+static gboolean
+_src_circular_init (gpointer impl, GstGLContext * context,
+ GstVideoInfo * v_info)
+{
+ struct SrcShader *src = impl;
+ GError *error = NULL;
+
+ src->base.context = context;
+
+ if (src->shader)
+ gst_object_unref (src->shader);
+ src->shader = gst_gl_shader_new_link_with_stages (context, &error,
+ gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER,
+ GST_GLSL_VERSION_NONE,
+ GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
+ circular_vertex_src),
+ gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
+ GST_GLSL_VERSION_NONE,
+ GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
+ circular_fragment_src), NULL);
+ if (!src->shader) {
+ GST_ERROR_OBJECT (src->base.src, "%s", error->message);
+ return FALSE;
+ }
+
+ src->n_attributes = 1;
+
+ src->attributes[0].name = "position";
+ src->attributes[0].location = -1;
+ src->attributes[0].n_elements = 4;
+ src->attributes[0].element_type = GL_FLOAT;
+ src->attributes[0].offset = 0;
+ src->attributes[0].stride = 4 * sizeof (gfloat);
+
+ src->vertices = positions;
+ src->vertices_size = sizeof (positions);
+ src->indices = indices_quad;
+ src->n_indices = 6;
+
+ gst_gl_shader_use (src->shader);
+ gst_gl_shader_set_uniform_1f (src->shader, "aspect_ratio",
+ (gfloat) GST_VIDEO_INFO_WIDTH (v_info) /
+ (gfloat) GST_VIDEO_INFO_HEIGHT (v_info));
+ gst_gl_context_clear_shader (src->base.context);
+
+ return _src_shader_init (impl, context, v_info);
+}
+
+static void
+_src_circular_free (gpointer impl)
+{
+ struct SrcShader *src = impl;
+
+ if (!src)
+ return;
+
+ _src_shader_deinit (impl);
+
+ g_free (impl);
+}
+
+static gpointer
+_src_circular_new (GstGLTestSrc * test)
+{
+ struct SrcShader *src = g_new0 (struct SrcShader, 1);
+
+ src->base.src = test;
+
+ return src;
+}
+
+static const struct SrcFuncs src_circular = {
+ GST_GL_TEST_SRC_CIRCULAR,
+ _src_circular_new,
+ _src_circular_init,
+ _src_mandelbrot_fill_bound_fbo,
+ _src_circular_free,
+};
+
+static const struct SrcFuncs *src_impls[] = {
+ &src_smpte,
+ &src_snow,
+ &src_black,
+ &src_white,
+ &src_red,
+ &src_green,
+ &src_blue,
+ &src_checkers1,
+ &src_checkers2,
+ &src_checkers4,
+ &src_checkers8,
+ &src_circular,
+ &src_blink,
+ &src_mandelbrot,
+};
+
+const struct SrcFuncs *
+gst_gl_test_src_get_src_funcs_for_pattern (GstGLTestSrcPattern pattern)
+{
+ gint i;
+
+ for (i = 0; i < G_N_ELEMENTS (src_impls); i++) {
+ if (src_impls[i]->pattern == pattern)
+ return src_impls[i];
+ }
+
+ return NULL;
}
diff --git a/ext/gl/gltestsrc.h b/ext/gl/gltestsrc.h
index 102109e..dbcab0c 100644
--- a/ext/gl/gltestsrc.h
+++ b/ext/gl/gltestsrc.h
@@ -22,37 +22,60 @@
#include <glib.h>
+typedef struct _GstGLTestSrc GstGLTestSrc;
+
+/**
+ * GstGLTestSrcPattern:
+ * @GST_GL_TEST_SRC_SMPTE: A standard SMPTE test pattern
+ * @GST_GL_TEST_SRC_SNOW: Random noise
+ * @GST_GL_TEST_SRC_BLACK: A black image
+ * @GST_GL_TEST_SRC_WHITE: A white image
+ * @GST_GL_TEST_SRC_RED: A red image
+ * @GST_GL_TEST_SRC_GREEN: A green image
+ * @GST_GL_TEST_SRC_BLUE: A blue image
+ * @GST_GL_TEST_SRC_CHECKERS1: Checkers pattern (1px)
+ * @GST_GL_TEST_SRC_CHECKERS2: Checkers pattern (2px)
+ * @GST_GL_TEST_SRC_CHECKERS4: Checkers pattern (4px)
+ * @GST_GL_TEST_SRC_CHECKERS8: Checkers pattern (8px)
+ * @GST_GL_TEST_SRC_CIRCULAR: Circular pattern
+ * @GST_GL_TEST_SRC_BLINK: Alternate between black and white
+ *
+ * The test pattern to produce.
+ */
+typedef enum {
+ GST_GL_TEST_SRC_SMPTE,
+ GST_GL_TEST_SRC_SNOW,
+ GST_GL_TEST_SRC_BLACK,
+ GST_GL_TEST_SRC_WHITE,
+ GST_GL_TEST_SRC_RED,
+ GST_GL_TEST_SRC_GREEN,
+ GST_GL_TEST_SRC_BLUE,
+ GST_GL_TEST_SRC_CHECKERS1,
+ GST_GL_TEST_SRC_CHECKERS2,
+ GST_GL_TEST_SRC_CHECKERS4,
+ GST_GL_TEST_SRC_CHECKERS8,
+ GST_GL_TEST_SRC_CIRCULAR,
+ GST_GL_TEST_SRC_BLINK,
+ GST_GL_TEST_SRC_MANDELBROT
+} GstGLTestSrcPattern;
+
#include "gstgltestsrc.h"
-struct vts_color_struct {
- guint8 Y, U, V;
- guint8 R, G, B;
- guint8 A;
+struct BaseSrcImpl {
+ GstGLTestSrc *src;
+ GstGLContext *context;
+ GstVideoInfo v_info;
};
-void gst_gl_test_src_smpte (GstGLTestSrc * v,
- GstBuffer *buffer, int w, int h);
-void gst_gl_test_src_shader (GstGLTestSrc * v,
- GstBuffer *buffer, int w, int h);
-void gst_gl_test_src_black (GstGLTestSrc * v,
- GstBuffer *buffer, int w, int h);
-void gst_gl_test_src_white (GstGLTestSrc * v,
- GstBuffer *buffer, int w, int h);
-void gst_gl_test_src_red (GstGLTestSrc * v,
- GstBuffer *buffer, int w, int h);
-void gst_gl_test_src_green (GstGLTestSrc * v,
- GstBuffer *buffer, int w, int h);
-void gst_gl_test_src_blue (GstGLTestSrc * v,
- GstBuffer *buffer, int w, int h);
-void gst_gl_test_src_checkers1 (GstGLTestSrc * v,
- GstBuffer *buffer, int w, int h);
-void gst_gl_test_src_checkers2 (GstGLTestSrc * v,
- GstBuffer *buffer, int w, int h);
-void gst_gl_test_src_checkers4 (GstGLTestSrc * v,
- GstBuffer *buffer, int w, int h);
-void gst_gl_test_src_checkers8 (GstGLTestSrc * v,
- GstBuffer *buffer, int w, int h);
-void gst_gl_test_src_circular (GstGLTestSrc * v,
- GstBuffer *buffer, int w, int h);
+struct SrcFuncs
+{
+ GstGLTestSrcPattern pattern;
+ gpointer (*new) (GstGLTestSrc * src);
+ gboolean (*init) (gpointer impl, GstGLContext * context, GstVideoInfo * v_info);
+ gboolean (*fill_bound_fbo) (gpointer impl);
+ void (*free) (gpointer impl);
+};
+
+const struct SrcFuncs * gst_gl_test_src_get_src_funcs_for_pattern (GstGLTestSrcPattern pattern);
#endif
diff --git a/ext/gl/gstglbasemixer.c b/ext/gl/gstglbasemixer.c
index d207883..410a420 100644
--- a/ext/gl/gstglbasemixer.c
+++ b/ext/gl/gstglbasemixer.c
@@ -123,6 +123,131 @@
}
static gboolean
+gst_gl_base_mixer_sink_event (GstAggregator * agg, GstAggregatorPad * bpad,
+ GstEvent * event)
+{
+ GstGLBaseMixerPad *pad = GST_GL_BASE_MIXER_PAD (bpad);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ if (!GST_AGGREGATOR_CLASS (parent_class)->sink_event (agg, bpad, event))
+ return FALSE;
+
+ pad->negotiated = TRUE;
+ return TRUE;
+ default:
+ break;
+ }
+
+ return GST_AGGREGATOR_CLASS (parent_class)->sink_event (agg, bpad, event);
+}
+
+static gboolean
+_find_local_gl_context (GstGLBaseMixer * mix)
+{
+ GstQuery *query;
+ GstContext *context;
+ const GstStructure *s;
+
+ if (mix->context)
+ return TRUE;
+
+ query = gst_query_new_context ("gst.gl.local_context");
+ if (!mix->context && gst_gl_run_query (GST_ELEMENT (mix), 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, &mix->context,
+ NULL);
+ }
+ }
+ if (!mix->context
+ && gst_gl_run_query (GST_ELEMENT (mix), query, GST_PAD_SINK)) {
+ gst_query_parse_context (query, &context);
+ if (context) {
+ s = gst_context_get_structure (context);
+ gst_structure_get (s, "context", GST_GL_TYPE_CONTEXT, &mix->context,
+ NULL);
+ }
+ }
+
+ GST_DEBUG_OBJECT (mix, "found local context %p", mix->context);
+
+ gst_query_unref (query);
+
+ if (mix->context)
+ return TRUE;
+
+ return FALSE;
+}
+
+static gboolean
+_get_gl_context (GstGLBaseMixer * mix)
+{
+ GstGLBaseMixerClass *mix_class = GST_GL_BASE_MIXER_GET_CLASS (mix);
+ GError *error = NULL;
+
+ if (!gst_gl_ensure_element_data (mix, &mix->display,
+ &mix->priv->other_context))
+ return FALSE;
+
+ gst_gl_display_filter_gl_api (mix->display, mix_class->supported_gl_api);
+
+ _find_local_gl_context (mix);
+
+ GST_OBJECT_LOCK (mix->display);
+ if (!mix->context) {
+ do {
+ if (mix->context) {
+ gst_object_unref (mix->context);
+ mix->context = NULL;
+ }
+ /* just get a GL context. we don't care */
+ mix->context =
+ gst_gl_display_get_gl_context_for_thread (mix->display, NULL);
+ if (!mix->context) {
+ if (!gst_gl_display_create_context (mix->display,
+ mix->priv->other_context, &mix->context, &error)) {
+ GST_OBJECT_UNLOCK (mix->display);
+ goto context_error;
+ }
+ }
+ } while (!gst_gl_display_add_context (mix->display, mix->context));
+ }
+ GST_OBJECT_UNLOCK (mix->display);
+
+ {
+ GstGLAPI current_gl_api = gst_gl_context_get_gl_api (mix->context);
+ if ((current_gl_api & mix_class->supported_gl_api) == 0)
+ goto unsupported_gl_api;
+ }
+
+ return TRUE;
+
+unsupported_gl_api:
+ {
+ GstGLAPI gl_api = gst_gl_context_get_gl_api (mix->context);
+ gchar *gl_api_str = gst_gl_api_to_string (gl_api);
+ gchar *supported_gl_api_str =
+ gst_gl_api_to_string (mix_class->supported_gl_api);
+ GST_ELEMENT_ERROR (mix, RESOURCE, BUSY,
+ ("GL API's not compatible context: %s supported: %s", gl_api_str,
+ supported_gl_api_str), (NULL));
+
+ g_free (supported_gl_api_str);
+ g_free (gl_api_str);
+ return FALSE;
+ }
+context_error:
+ {
+ GST_ELEMENT_ERROR (mix, RESOURCE, NOT_FOUND, ("%s", error->message),
+ (NULL));
+ g_clear_error (&error);
+ return FALSE;
+ }
+}
+
+static gboolean
gst_gl_base_mixer_sink_query (GstAggregator * agg, GstAggregatorPad * bpad,
GstQuery * query)
{
@@ -139,16 +264,20 @@
GstQuery *decide_query = NULL;
GST_OBJECT_LOCK (mix);
- if (G_UNLIKELY (!mix->priv->negotiated)) {
+ if (G_UNLIKELY (!pad->negotiated)) {
GST_DEBUG_OBJECT (mix,
"not negotiated yet, can't answer ALLOCATION query");
GST_OBJECT_UNLOCK (mix);
return FALSE;
}
+
if ((decide_query = mix->priv->query))
gst_query_ref (decide_query);
GST_OBJECT_UNLOCK (mix);
+ if (!_get_gl_context (mix))
+ return FALSE;
+
GST_DEBUG_OBJECT (mix,
"calling propose allocation with query %" GST_PTR_FORMAT,
decide_query);
@@ -273,6 +402,7 @@
agg_class->sinkpads_type = GST_TYPE_GL_BASE_MIXER_PAD;
agg_class->sink_query = gst_gl_base_mixer_sink_query;
+ agg_class->sink_event = gst_gl_base_mixer_sink_event;
agg_class->src_query = gst_gl_base_mixer_src_query;
agg_class->src_activate = gst_gl_base_mixer_src_activate_mode;
agg_class->stop = gst_gl_base_mixer_stop;
@@ -294,11 +424,24 @@
klass->supported_gl_api = GST_GL_API_ANY;
}
+static gboolean
+_reset_pad (GstAggregator * self, GstAggregatorPad * base_pad,
+ gpointer user_data)
+{
+ GstGLBaseMixerPad *mix_pad = GST_GL_BASE_MIXER_PAD (base_pad);
+
+ mix_pad->negotiated = FALSE;
+
+ return TRUE;
+}
+
static void
gst_gl_base_mixer_reset (GstGLBaseMixer * mix)
{
/* clean up collect data */
- mix->priv->negotiated = FALSE;
+
+ gst_aggregator_iterate_sinkpads (GST_AGGREGATOR (mix),
+ (GstAggregatorPadForeachFunc) _reset_pad, NULL);
}
static void
@@ -415,112 +558,18 @@
}
static gboolean
-_find_local_gl_context (GstGLBaseMixer * mix)
-{
- GstQuery *query;
- GstContext *context;
- const GstStructure *s;
-
- if (mix->context)
- return TRUE;
-
- query = gst_query_new_context ("gst.gl.local_context");
- if (!mix->context && gst_gl_run_query (GST_ELEMENT (mix), 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, &mix->context,
- NULL);
- }
- }
- if (!mix->context
- && gst_gl_run_query (GST_ELEMENT (mix), query, GST_PAD_SINK)) {
- gst_query_parse_context (query, &context);
- if (context) {
- s = gst_context_get_structure (context);
- gst_structure_get (s, "context", GST_GL_TYPE_CONTEXT, &mix->context,
- NULL);
- }
- }
-
- GST_DEBUG_OBJECT (mix, "found local context %p", mix->context);
-
- gst_query_unref (query);
-
- if (mix->context)
- return TRUE;
-
- return FALSE;
-}
-
-static gboolean
gst_gl_base_mixer_decide_allocation (GstGLBaseMixer * mix, GstQuery * query)
{
GstGLBaseMixerClass *mix_class = GST_GL_BASE_MIXER_GET_CLASS (mix);
- GError *error = NULL;
- gboolean ret = TRUE;
- if (!gst_gl_ensure_element_data (mix, &mix->display,
- &mix->priv->other_context))
+ if (!_get_gl_context (mix))
return FALSE;
- gst_gl_display_filter_gl_api (mix->display, mix_class->supported_gl_api);
-
- _find_local_gl_context (mix);
-
- if (!mix->context) {
- GST_OBJECT_LOCK (mix->display);
- do {
- if (mix->context) {
- gst_object_unref (mix->context);
- mix->context = NULL;
- }
- /* just get a GL context. we don't care */
- mix->context =
- gst_gl_display_get_gl_context_for_thread (mix->display, NULL);
- if (!mix->context) {
- if (!gst_gl_display_create_context (mix->display,
- mix->priv->other_context, &mix->context, &error)) {
- GST_OBJECT_UNLOCK (mix->display);
- goto context_error;
- }
- }
- } while (!gst_gl_display_add_context (mix->display, mix->context));
- GST_OBJECT_UNLOCK (mix->display);
- }
-
- {
- GstGLAPI current_gl_api = gst_gl_context_get_gl_api (mix->context);
- if ((current_gl_api & mix_class->supported_gl_api) == 0)
- goto unsupported_gl_api;
- }
-
if (mix_class->decide_allocation)
- ret = mix_class->decide_allocation (mix, query);
+ if (!mix_class->decide_allocation (mix, query))
+ return FALSE;
- return ret;
-
-unsupported_gl_api:
- {
- GstGLAPI gl_api = gst_gl_context_get_gl_api (mix->context);
- gchar *gl_api_str = gst_gl_api_to_string (gl_api);
- gchar *supported_gl_api_str =
- gst_gl_api_to_string (mix_class->supported_gl_api);
- GST_ELEMENT_ERROR (mix, RESOURCE, BUSY,
- ("GL API's not compatible context: %s supported: %s", gl_api_str,
- supported_gl_api_str), (NULL));
-
- g_free (supported_gl_api_str);
- g_free (gl_api_str);
- return FALSE;
- }
-context_error:
- {
- GST_ELEMENT_ERROR (mix, RESOURCE, NOT_FOUND, ("%s", error->message),
- (NULL));
- g_clear_error (&error);
- return FALSE;
- }
+ return TRUE;
}
/* takes ownership of the pool, allocator and query */
@@ -665,7 +714,7 @@
static gboolean
gst_gl_base_mixer_start (GstAggregator * agg)
{
- return TRUE;
+ return GST_AGGREGATOR_CLASS (parent_class)->start (agg);;
}
static gboolean
diff --git a/ext/gl/gstglbasemixer.h b/ext/gl/gstglbasemixer.h
index 6282ccb..cba8184 100644
--- a/ext/gl/gstglbasemixer.h
+++ b/ext/gl/gstglbasemixer.h
@@ -47,6 +47,8 @@
struct _GstGLBaseMixerPad
{
GstVideoAggregatorPad parent; /* subclass the pad */
+
+ gboolean negotiated;
};
struct _GstGLBaseMixerPadClass
diff --git a/ext/gl/gstglcolorbalance.c b/ext/gl/gstglcolorbalance.c
index 27dcb00..33b5a50 100644
--- a/ext/gl/gstglcolorbalance.c
+++ b/ext/gl/gstglcolorbalance.c
@@ -150,14 +150,17 @@
static void
gst_gl_color_balance_update_properties (GstGLColorBalance * glcolorbalance)
{
- gboolean passthrough;
+ gboolean current_passthrough, passthrough;
GstBaseTransform *base = GST_BASE_TRANSFORM (glcolorbalance);
GST_OBJECT_LOCK (glcolorbalance);
passthrough = gst_gl_color_balance_is_passthrough (glcolorbalance);
GST_OBJECT_UNLOCK (glcolorbalance);
+ current_passthrough = gst_base_transform_is_passthrough (base);
gst_base_transform_set_passthrough (base, passthrough);
+ if (current_passthrough != passthrough)
+ gst_base_transform_reconfigure_src (base);
}
static gboolean
@@ -231,13 +234,11 @@
gst_object_sync_values (GST_OBJECT (balance), stream_time);
}
-static void
-gst_gl_color_balance_callback (gint width, gint height, guint tex_id,
- gpointer data)
+static gboolean
+gst_gl_color_balance_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex,
+ GstGLMemory * out_tex)
{
- GstGLColorBalance *balance = GST_GL_COLOR_BALANCE (data);
- GstGLFilter *filter = GST_GL_FILTER (data);
- const GstGLFuncs *gl = GST_GL_BASE_FILTER (data)->context->gl_vtable;
+ GstGLColorBalance *balance = GST_GL_COLOR_BALANCE (filter);
if (!balance->shader)
_create_shader (balance);
@@ -252,17 +253,8 @@
gst_gl_shader_set_uniform_1f (balance->shader, "hue", balance->hue);
GST_OBJECT_UNLOCK (balance);
- gl->BindTexture (GL_TEXTURE_2D, tex_id);
-
- gst_gl_filter_draw_texture (filter, tex_id, width, height);
-}
-
-static gboolean
-gst_gl_color_balance_filter_texture (GstGLFilter * filter, guint in_tex,
- guint out_tex)
-{
- gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
- (GLCB) gst_gl_color_balance_callback, filter);
+ gst_gl_filter_render_to_target_with_shader (filter, in_tex, out_tex,
+ balance->shader);
return TRUE;
}
diff --git a/ext/gl/gstglcolorconvertelement.c b/ext/gl/gstglcolorconvertelement.c
index bd4fbeb..642b494 100644
--- a/ext/gl/gstglcolorconvertelement.c
+++ b/ext/gl/gstglcolorconvertelement.c
@@ -103,12 +103,10 @@
bt_class->passthrough_on_same_caps = TRUE;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get
- (&gst_gl_color_convert_element_src_pad_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get
- (&gst_gl_color_convert_element_sink_pad_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_gl_color_convert_element_src_pad_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_gl_color_convert_element_sink_pad_template);
gst_element_class_set_metadata (element_class,
"OpenGL color converter", "Filter/Converter/Video",
diff --git a/ext/gl/gstglcolorscale.c b/ext/gl/gstglcolorscale.c
index c7df0a8..2ca5480 100644
--- a/ext/gl/gstglcolorscale.c
+++ b/ext/gl/gstglcolorscale.c
@@ -74,7 +74,7 @@
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);
+ GstGLMemory * in_tex, GstGLMemory * out_tex);
static void
gst_gl_colorscale_class_init (GstGLColorscaleClass * klass)
@@ -175,13 +175,13 @@
}
static gboolean
-gst_gl_colorscale_filter_texture (GstGLFilter * filter, guint in_tex,
- guint out_tex)
+gst_gl_colorscale_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex,
+ GstGLMemory * out_tex)
{
GstGLColorscale *colorscale = GST_GL_COLORSCALE (filter);
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,
+ gst_gl_filter_render_to_target_with_shader (filter, in_tex, out_tex,
colorscale->shader);
return TRUE;
diff --git a/ext/gl/gstgldeinterlace.c b/ext/gl/gstgldeinterlace.c
index bd0eff0..fe207cc 100644
--- a/ext/gl/gstgldeinterlace.c
+++ b/ext/gl/gstgldeinterlace.c
@@ -43,7 +43,8 @@
enum
{
- PROP_0
+ PROP_0,
+ PROP_METHOD
};
#define DEBUG_INIT \
@@ -57,17 +58,23 @@
static void gst_gl_deinterlace_get_property (GObject * object,
guint prop_id, GValue * value, GParamSpec * pspec);
+static gboolean gst_gl_deinterlace_start (GstBaseTransform * trans);
static gboolean gst_gl_deinterlace_reset (GstBaseTransform * trans);
-static gboolean gst_gl_deinterlace_init_shader (GstGLFilter * filter);
+static gboolean gst_gl_deinterlace_init_fbo (GstGLFilter * filter);
static gboolean gst_gl_deinterlace_filter (GstGLFilter * filter,
GstBuffer * inbuf, GstBuffer * outbuf);
static gboolean gst_gl_deinterlace_filter_texture (GstGLFilter * filter,
- guint in_tex, guint out_tex);
-static void gst_gl_deinterlace_callback (gint width, gint height,
- guint texture, gpointer stuff);
+ GstGLMemory * in_tex, GstGLMemory * out_tex);
+static gboolean gst_gl_deinterlace_vfir_callback (GstGLFilter * filter,
+ GstGLMemory * in_tex, gpointer stuff);
+static gboolean gst_gl_deinterlace_greedyh_callback (GstGLFilter * filter,
+ GstGLMemory * in_tex, gpointer stuff);
/* *INDENT-OFF* */
static const gchar *greedyh_fragment_source =
+ "#ifdef GL_ES\n"
+ "precision mediump float;\n"
+ "#endif\n"
"uniform sampler2D tex;\n"
"uniform sampler2D tex_prev;\n"
"uniform float max_comb;\n"
@@ -75,35 +82,35 @@
"uniform float motion_sense;\n"
"uniform float width;\n"
"uniform float height;\n"
+ "varying vec2 v_texcoord;\n"
"void main () {\n"
- " vec2 texcoord = gl_TexCoord[0].xy;\n"
- " if (int(mod(texcoord.y * height, 2.0)) == 0) {\n"
- " gl_FragColor = vec4(texture2D(tex_prev, texcoord).rgb, 1.0);\n"
+ " if (int(mod(v_texcoord.y * height, 2.0)) == 0) {\n"
+ " gl_FragColor = vec4(texture2D(tex_prev, v_texcoord).rgb, 1.0);\n"
" } else {\n"
" vec2 texcoord_L1_a1, texcoord_L3_a1, texcoord_L1, texcoord_L3, texcoord_L1_1, texcoord_L3_1;\n"
" vec3 L1_a1, L3_a1, L1, L3, L1_1, L3_1;\n"
- " texcoord_L1 = vec2(texcoord.x, texcoord.y - 1.0 / height);\n"
- " texcoord_L3 = vec2(texcoord.x, texcoord.y + 1.0 / height);\n"
+ " texcoord_L1 = vec2(v_texcoord.x, v_texcoord.y - 1.0 / height);\n"
+ " texcoord_L3 = vec2(v_texcoord.x, v_texcoord.y + 1.0 / height);\n"
" L1 = texture2D(tex_prev, texcoord_L1).rgb;\n"
" L3 = texture2D(tex_prev, texcoord_L3).rgb;\n"
- " if (texcoord.x == 1.0 && texcoord.y == 1.0) {\n"
+ " if (v_texcoord.x == 1.0 && v_texcoord.y == 1.0) {\n"
" L1_1 = L1;\n"
" L3_1 = L3;\n"
" } else {\n"
- " texcoord_L1_1 = vec2(texcoord.x + 1.0 / width, texcoord.y - 1.0 / height);\n"
- " texcoord_L3_1 = vec2(texcoord.x + 1.0 / width, texcoord.y + 1.0 / height);\n"
+ " texcoord_L1_1 = vec2(v_texcoord.x + 1.0 / width, v_texcoord.y - 1.0 / height);\n"
+ " texcoord_L3_1 = vec2(v_texcoord.x + 1.0 / width, v_texcoord.y + 1.0 / height);\n"
" L1_1 = texture2D(tex_prev, texcoord_L1_1).rgb;\n"
" L3_1 = texture2D(tex_prev, texcoord_L3_1).rgb;\n"
" }\n"
- " if (int(ceil(texcoord.x + texcoord.y)) == 0) {\n"
+ " if (int(ceil(v_texcoord.x + v_texcoord.y)) == 0) {\n"
" L1_a1 = L1;\n"
" L3_a1 = L3;\n"
" } else {\n"
- " texcoord_L1_a1 = vec2(texcoord.x - 1.0 / width, texcoord.y - 1.0 / height);\n"
- " texcoord_L3_a1 = vec2(texcoord.x - 1.0 / width, texcoord.y + 1.0 / height);\n"
+ " texcoord_L1_a1 = vec2(v_texcoord.x - 1.0 / width, v_texcoord.y - 1.0 / height);\n"
+ " texcoord_L3_a1 = vec2(v_texcoord.x - 1.0 / width, v_texcoord.y + 1.0 / height);\n"
" L1_a1 = texture2D(tex_prev, texcoord_L1_a1).rgb;\n"
" L3_a1 = texture2D(tex_prev, texcoord_L3_a1).rgb;\n"
" }\n"
@@ -113,8 +120,8 @@
" vec3 avg_1 = (L1_1 + L3_1) / 2.0;\n"
" vec3 avg_s = (avg_a1 + avg_1) / 2.0;\n"
" vec3 avg_sc = (avg_s + avg) / 2.0;\n"
- " vec3 L2 = texture2D(tex, texcoord).rgb;\n"
- " vec3 LP2 = texture2D(tex_prev, texcoord).rgb;\n"
+ " vec3 L2 = texture2D(tex, v_texcoord).rgb;\n"
+ " vec3 LP2 = texture2D(tex_prev, v_texcoord).rgb;\n"
" vec3 best;\n"
" if (abs(L2.r - avg_sc.r) < abs(LP2.r - avg_sc.r)) {\n"
" best.r = L2.r;\n" " } else {\n"
@@ -144,8 +151,87 @@
" gl_FragColor = vec4(last, 1.0);\n"
" }\n"
"}\n";
+
+const gchar *vfir_fragment_source =
+ "#ifdef GL_ES\n"
+ "precision mediump float;\n"
+ "#endif\n"
+ "uniform sampler2D tex;\n"
+ "uniform float width;\n"
+ "uniform float height;\n"
+ "varying vec2 v_texcoord;\n"
+ "void main()\n"
+ "{\n"
+ " vec2 topcoord, botcoord;\n"
+ " vec4 cur_color, top_color, bot_color;\n"
+ " topcoord.x = v_texcoord.x;\n"
+ " botcoord.x = v_texcoord.x;\n"
+ " if (v_texcoord.y == 0.0 || v_texcoord.y == 1.0) {\n"
+ " topcoord.y = v_texcoord.y ;\n"
+ " botcoord.y = v_texcoord.y ;\n"
+ " }\n"
+ " else {\n"
+ " topcoord.y = v_texcoord.y - 1.0/height;\n"
+ " botcoord.y = v_texcoord.y + 1.0/height;\n"
+ " }\n"
+ " cur_color = texture2D(tex, v_texcoord);\n"
+ " top_color = texture2D(tex, topcoord);\n"
+ " bot_color = texture2D(tex, botcoord);\n"
+ " gl_FragColor = 0.5*cur_color + 0.25*top_color + 0.25*bot_color;\n"
+ "}";
/* *INDENT-ON* */
+/* dont' forget to edit the following when a new method is added */
+typedef enum
+{
+ GST_GL_DEINTERLACE_VFIR,
+ GST_GL_DEINTERLACE_GREEDYH
+} GstGLDeinterlaceMethod;
+
+static const GEnumValue *
+gst_gl_deinterlace_get_methods (void)
+{
+ static const GEnumValue method_types[] = {
+ {GST_GL_DEINTERLACE_VFIR, "Blur Vertical", "vfir"},
+ {GST_GL_DEINTERLACE_GREEDYH, "Motion Adaptive: Advanced Detection",
+ "greedyh"},
+ {0, NULL, NULL}
+ };
+ return method_types;
+}
+
+#define GST_TYPE_GL_DEINTERLACE_METHODS (gst_gl_deinterlace_method_get_type ())
+static GType
+gst_gl_deinterlace_method_get_type (void)
+{
+ static GType gl_deinterlace_method_type = 0;
+ if (!gl_deinterlace_method_type) {
+ gl_deinterlace_method_type =
+ g_enum_register_static ("GstGLDeinterlaceMethod",
+ gst_gl_deinterlace_get_methods ());
+ }
+ return gl_deinterlace_method_type;
+}
+
+static void
+gst_gl_deinterlace_set_method (GstGLDeinterlace * deinterlace,
+ guint method_types)
+{
+ switch (method_types) {
+ case GST_GL_DEINTERLACE_VFIR:
+ deinterlace->deinterlacefunc = gst_gl_deinterlace_vfir_callback;
+ deinterlace->current_method = method_types;
+ break;
+ case GST_GL_DEINTERLACE_GREEDYH:
+ deinterlace->deinterlacefunc = gst_gl_deinterlace_greedyh_callback;
+ deinterlace->current_method = method_types;
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+}
+
static void
gst_gl_deinterlace_class_init (GstGLDeinterlaceClass * klass)
{
@@ -163,22 +249,57 @@
"Deinterlacing based on fragment shaders",
"Julien Isorce <julien.isorce@mail.com>");
+ g_object_class_install_property (gobject_class,
+ PROP_METHOD,
+ g_param_spec_enum ("method",
+ "Deinterlace Method",
+ "Select which deinterlace method apply to GL video texture",
+ GST_TYPE_GL_DEINTERLACE_METHODS,
+ GST_GL_DEINTERLACE_VFIR, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ GST_BASE_TRANSFORM_CLASS (klass)->start = gst_gl_deinterlace_start;
GST_BASE_TRANSFORM_CLASS (klass)->stop = gst_gl_deinterlace_reset;
GST_GL_FILTER_CLASS (klass)->filter = gst_gl_deinterlace_filter;
GST_GL_FILTER_CLASS (klass)->filter_texture =
gst_gl_deinterlace_filter_texture;
- GST_GL_FILTER_CLASS (klass)->init_fbo = gst_gl_deinterlace_init_shader;
+ GST_GL_FILTER_CLASS (klass)->init_fbo = gst_gl_deinterlace_init_fbo;
- GST_GL_BASE_FILTER_CLASS (klass)->supported_gl_api = GST_GL_API_OPENGL;
+ GST_GL_BASE_FILTER_CLASS (klass)->supported_gl_api =
+ GST_GL_API_OPENGL | GST_GL_API_GLES2 | GST_GL_API_OPENGL3;
}
static void
gst_gl_deinterlace_init (GstGLDeinterlace * filter)
{
- filter->shader = NULL;
+ filter->shaderstable = NULL;
+ filter->deinterlacefunc = gst_gl_deinterlace_vfir_callback;
+ filter->current_method = GST_GL_DEINTERLACE_VFIR;
filter->prev_buffer = NULL;
- filter->prev_tex = 0;
+ filter->prev_tex = NULL;
+}
+
+static gboolean
+gst_gl_deinterlace_start (GstBaseTransform * trans)
+{
+ GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (trans);
+
+ deinterlace_filter->shaderstable = g_hash_table_new (g_str_hash, g_str_equal);
+
+ return GST_BASE_TRANSFORM_CLASS (parent_class)->start (trans);
+}
+
+static void
+gst_gl_deinterlace_ghash_func_clean (gpointer key, gpointer value,
+ gpointer data)
+{
+ GstGLShader *shader = (GstGLShader *) value;
+ GstGLFilter *filter = (GstGLFilter *) data;
+
+ //blocking call, wait the opengl thread has destroyed the shader
+ gst_gl_context_del_shader (GST_GL_BASE_FILTER (filter)->context, shader);
+
+ value = NULL;
}
static gboolean
@@ -189,10 +310,17 @@
gst_buffer_replace (&deinterlace_filter->prev_buffer, NULL);
//blocking call, wait the opengl thread has destroyed the shader
- if (deinterlace_filter->shader)
- gst_gl_context_del_shader (GST_GL_BASE_FILTER (trans)->context,
- deinterlace_filter->shader);
- deinterlace_filter->shader = NULL;
+ if (deinterlace_filter->shaderstable) {
+ /* release shaders in the gl thread */
+ g_hash_table_foreach (deinterlace_filter->shaderstable,
+ gst_gl_deinterlace_ghash_func_clean, deinterlace_filter);
+
+ /* clean the htable without calling values destructors
+ * because shaders have been released in the glthread
+ * through the foreach func */
+ g_hash_table_unref (deinterlace_filter->shaderstable);
+ deinterlace_filter->shaderstable = NULL;
+ }
return GST_BASE_TRANSFORM_CLASS (parent_class)->stop (trans);
}
@@ -201,9 +329,12 @@
gst_gl_deinterlace_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
{
- //GstGLDeinterlace *filter = GST_GL_DEINTERLACE (object);
+ GstGLDeinterlace *filter = GST_GL_DEINTERLACE (object);
switch (prop_id) {
+ case PROP_METHOD:
+ gst_gl_deinterlace_set_method (filter, g_value_get_enum (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -214,9 +345,12 @@
gst_gl_deinterlace_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec)
{
- //GstGLDeinterlace *filter = GST_GL_DEINTERLACE (object);
+ GstGLDeinterlace *filter = GST_GL_DEINTERLACE (object);
switch (prop_id) {
+ case PROP_METHOD:
+ g_value_set_enum (value, filter->current_method);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -224,24 +358,20 @@
}
static gboolean
-gst_gl_deinterlace_init_shader (GstGLFilter * filter)
+gst_gl_deinterlace_init_fbo (GstGLFilter * filter)
{
- GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (filter);
-
- //blocking call, wait the opengl thread has compiled the shader
- return gst_gl_context_gen_shader (GST_GL_BASE_FILTER (filter)->context, 0,
- greedyh_fragment_source, &deinterlace_filter->shader);
+ return TRUE;
}
static gboolean
-gst_gl_deinterlace_filter_texture (GstGLFilter * filter, guint in_tex,
- guint out_tex)
+gst_gl_deinterlace_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex,
+ GstGLMemory * out_tex)
{
GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (filter);
//blocking call, use a FBO
- gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
- gst_gl_deinterlace_callback, deinterlace_filter);
+ gst_gl_filter_render_to_target (filter, in_tex, out_tex,
+ deinterlace_filter->deinterlacefunc, deinterlace_filter);
return TRUE;
}
@@ -259,89 +389,127 @@
return TRUE;
}
-//opengl scene, params: input texture (not the output filter->texture)
-static void
-gst_gl_deinterlace_callback (gint width, gint height, guint texture,
- gpointer stuff)
+static GstGLShader *
+gst_gl_deinterlace_get_fragment_shader (GstGLFilter * filter,
+ const gchar * shader_name, const gchar * shader_source)
{
- GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (stuff);
- GstGLFilter *filter = GST_GL_FILTER (stuff);
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
- guint temp;
+ GstGLShader *shader = NULL;
+ GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (filter);
+ GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GLfloat verts[] = { -1.0, -1.0,
- 1.0, -1.0,
- 1.0, 1.0,
- -1.0, 1.0
- };
- GLfloat texcoords0[] = { 0.0f, 0.0f,
- 1.0f, 0.0f,
- 1.0f, 1.0f,
- 0.0f, 1.0f
- };
- GLfloat texcoords1[] = { 0.0f, 0.0f,
- 1.0f, 0.0f,
- 1.0f, 1.0f,
- 0.0f, 1.0f
- };
+ shader = g_hash_table_lookup (deinterlace_filter->shaderstable, shader_name);
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
+ if (!shader) {
+ GError *error = NULL;
- gst_gl_shader_use (deinterlace_filter->shader);
+ 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 | GST_GLSL_PROFILE_COMPATIBILITY,
+ shader_source), NULL))) {
+ GST_ELEMENT_ERROR (deinterlace_filter, RESOURCE, NOT_FOUND,
+ ("Failed to initialize %s shader", shader_name), (NULL));
+ }
- if (G_UNLIKELY (deinterlace_filter->prev_tex == 0)) {
- gst_gl_context_gen_texture (GST_GL_BASE_FILTER (filter)->context,
- &deinterlace_filter->prev_tex,
- GST_VIDEO_INFO_FORMAT (&filter->out_info),
- GST_VIDEO_INFO_WIDTH (&filter->out_info),
- GST_VIDEO_INFO_HEIGHT (&filter->out_info));
- } else {
+ 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 (deinterlace_filter->shaderstable, (gchar *) shader_name,
+ shader);
+
+ return shader;
+}
+
+static gboolean
+gst_gl_deinterlace_vfir_callback (GstGLFilter * filter, GstGLMemory * in_tex,
+ gpointer user_data)
+{
+ GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
+ const GstGLFuncs *gl = context->gl_vtable;
+ GstGLShader *shader;
+
+ shader = gst_gl_deinterlace_get_fragment_shader (filter, "vfir",
+ vfir_fragment_source);
+
+ if (!shader)
+ return FALSE;
+
+#if GST_GL_HAVE_OPENGL
+ if (USING_OPENGL (context)) {
+ gl->MatrixMode (GL_PROJECTION);
+ gl->LoadIdentity ();
+ }
+#endif
+
+ gst_gl_shader_use (shader);
+
+ gl->ActiveTexture (GL_TEXTURE0);
+ gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
+
+ gst_gl_shader_set_uniform_1i (shader, "tex", 0);
+ gst_gl_shader_set_uniform_1f (shader, "width",
+ GST_VIDEO_INFO_WIDTH (&filter->out_info));
+ gst_gl_shader_set_uniform_1f (shader, "height",
+ GST_VIDEO_INFO_HEIGHT (&filter->out_info));
+
+ gst_gl_filter_draw_fullscreen_quad (filter);
+
+ return TRUE;
+}
+
+static gboolean
+gst_gl_deinterlace_greedyh_callback (GstGLFilter * filter, GstGLMemory * in_tex,
+ gpointer user_data)
+{
+ GstGLShader *shader;
+ GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (filter);
+ GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
+ GstGLFuncs *gl = context->gl_vtable;
+
+ shader =
+ gst_gl_deinterlace_get_fragment_shader (filter, "greedhy",
+ greedyh_fragment_source);
+
+ if (!shader)
+ return FALSE;
+
+#if GST_GL_HAVE_OPENGL
+ if (USING_OPENGL (context)) {
+ gl->MatrixMode (GL_PROJECTION);
+ gl->LoadIdentity ();
+ }
+#endif
+
+ gst_gl_shader_use (shader);
+
+ if (G_LIKELY (deinterlace_filter->prev_tex != NULL)) {
gl->ActiveTexture (GL_TEXTURE1);
- gst_gl_shader_set_uniform_1i (deinterlace_filter->shader, "tex_prev", 1);
- gl->BindTexture (GL_TEXTURE_2D, deinterlace_filter->prev_tex);
+ gst_gl_shader_set_uniform_1i (shader, "tex_prev", 1);
+ gl->BindTexture (GL_TEXTURE_2D,
+ gst_gl_memory_get_texture_id (deinterlace_filter->prev_tex));
}
gl->ActiveTexture (GL_TEXTURE0);
- gst_gl_shader_set_uniform_1i (deinterlace_filter->shader, "tex", 0);
+ gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
- gst_gl_shader_set_uniform_1f (deinterlace_filter->shader, "max_comb",
- 5.0f / 255.0f);
- gst_gl_shader_set_uniform_1f (deinterlace_filter->shader, "motion_threshold",
- 25.0f / 255.0f);
- gst_gl_shader_set_uniform_1f (deinterlace_filter->shader, "motion_sense",
- 30.0f / 255.0f);
+ gst_gl_shader_set_uniform_1i (shader, "tex", 0);
+ gst_gl_shader_set_uniform_1f (shader, "max_comb", 5.0f / 255.0f);
+ gst_gl_shader_set_uniform_1f (shader, "motion_threshold", 25.0f / 255.0f);
+ gst_gl_shader_set_uniform_1f (shader, "motion_sense", 30.0f / 255.0f);
- gst_gl_shader_set_uniform_1f (deinterlace_filter->shader, "width",
+ gst_gl_shader_set_uniform_1f (shader, "width",
GST_VIDEO_INFO_WIDTH (&filter->out_info));
- gst_gl_shader_set_uniform_1f (deinterlace_filter->shader, "height",
+ gst_gl_shader_set_uniform_1f (shader, "height",
GST_VIDEO_INFO_HEIGHT (&filter->out_info));
- gl->ClientActiveTexture (GL_TEXTURE0);
+ gst_gl_filter_draw_fullscreen_quad (filter);
- gl->EnableClientState (GL_TEXTURE_COORD_ARRAY);
- gl->EnableClientState (GL_VERTEX_ARRAY);
+ /* we keep the previous buffer around so this is safe */
+ deinterlace_filter->prev_tex = in_tex;
- gl->VertexPointer (2, GL_FLOAT, 0, &verts);
- gl->TexCoordPointer (2, GL_FLOAT, 0, &texcoords0);
-
- gl->ClientActiveTexture (GL_TEXTURE1);
- gl->EnableClientState (GL_TEXTURE_COORD_ARRAY);
- gl->TexCoordPointer (2, GL_FLOAT, 0, &texcoords1);
-
- gl->DrawArrays (GL_TRIANGLE_FAN, 0, 4);
-
- gl->DisableClientState (GL_VERTEX_ARRAY);
- gl->DisableClientState (GL_TEXTURE_COORD_ARRAY);
-
- gl->ClientActiveTexture (GL_TEXTURE0);
- gl->DisableClientState (GL_TEXTURE_COORD_ARRAY);
-
- if (texture == filter->in_tex_id) {
- temp = filter->in_tex_id;
- filter->in_tex_id = deinterlace_filter->prev_tex;
- deinterlace_filter->prev_tex = temp;
- } else {
- deinterlace_filter->prev_tex = texture;
- }
+ return TRUE;
}
diff --git a/ext/gl/gstgldeinterlace.h b/ext/gl/gstgldeinterlace.h
index a81a2e7..3d78d66 100644
--- a/ext/gl/gstgldeinterlace.h
+++ b/ext/gl/gstgldeinterlace.h
@@ -32,15 +32,21 @@
#define GST_IS_GL_DEINTERLACE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_GL_DEINTERLACE))
#define GST_GL_DEINTERLACE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_GL_DEINTERLACE,GstGLDeinterlaceClass))
+#define USING_OPENGL(context) (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL, 1, 0))
+
typedef struct _GstGLDeinterlace GstGLDeinterlace;
typedef struct _GstGLDeinterlaceClass GstGLDeinterlaceClass;
struct _GstGLDeinterlace
{
- GstGLFilter filter;
- GstGLShader *shader;
- GstBuffer *prev_buffer;
- guint prev_tex;
+ GstGLFilter filter;
+
+ GstGLFilterRenderFunc deinterlacefunc;
+ GHashTable *shaderstable;
+ GstBuffer *prev_buffer;
+ GstGLMemory * prev_tex;
+
+ gint current_method;
};
struct _GstGLDeinterlaceClass
diff --git a/ext/gl/gstgldifferencematte.c b/ext/gl/gstgldifferencematte.c
index 6304c6d..d726c2e 100644
--- a/ext/gl/gstgldifferencematte.c
+++ b/ext/gl/gstgldifferencematte.c
@@ -62,7 +62,7 @@
guint prop_id, GValue * value, GParamSpec * pspec);
static gboolean gst_gl_differencematte_filter_texture (GstGLFilter * filter,
- guint in_tex, guint out_tex);
+ GstGLMemory * in_tex, GstGLMemory * out_tex);
static gboolean gst_gl_differencematte_loader (GstGLFilter * filter);
@@ -79,33 +79,40 @@
{
GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (filter);
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- const GstGLFuncs *gl = context->gl_vtable;
+ GstGLBaseMemoryAllocator *tex_alloc;
+ GstGLAllocationParams *params;
GError *error = NULL;
gint i;
- for (i = 0; i < 4; i++) {
- gl->GenTextures (1, &differencematte->midtexture[i]);
- gl->BindTexture (GL_TEXTURE_2D, differencematte->midtexture[i]);
- gl->TexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8,
- GST_VIDEO_INFO_WIDTH (&filter->out_info),
- GST_VIDEO_INFO_HEIGHT (&filter->out_info),
- 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- differencematte->shader[i] =
- gst_gl_shader_new (GST_GL_BASE_FILTER (filter)->context);
+ tex_alloc = (GstGLBaseMemoryAllocator *)
+ gst_gl_memory_allocator_get_default (context);
+ params =
+ (GstGLAllocationParams *) gst_gl_video_allocation_params_new (context,
+ NULL, &filter->out_info, 0, NULL, GST_GL_TEXTURE_TARGET_2D,
+ GST_VIDEO_GL_TEXTURE_TYPE_RGBA);
+
+ for (i = 0; i < 4; i++)
+ differencematte->midtexture[i] =
+ (GstGLMemory *) gst_gl_base_memory_alloc (tex_alloc, params);
+ gst_gl_allocation_params_free (params);
+ gst_object_unref (tex_alloc);
+
+ if (!(differencematte->identity_shader =
+ gst_gl_shader_new_default (context, &error))) {
+ GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, ("%s",
+ "Failed to compile identity shader"), ("%s", error->message));
+ return;
}
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,
+ GST_GLSL_VERSION_NONE,
+ GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
difference_fragment_source), NULL))) {
GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, ("%s",
- gst_gl_context_get_error ()), (NULL));
+ "Failed to compile difference shader"), ("%s", error->message));
return;
}
@@ -113,10 +120,11 @@
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_VERSION_NONE,
+ GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
hconv7_fragment_source_gles2), NULL))) {
GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, ("%s",
- gst_gl_context_get_error ()), (NULL));
+ "Failed to compile convolution shader"), ("%s", error->message));
return;
}
@@ -124,10 +132,11 @@
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_VERSION_NONE,
+ GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
vconv7_fragment_source_gles2), NULL))) {
GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, ("%s",
- gst_gl_context_get_error ()), (NULL));
+ "Failed to compile convolution shader"), ("%s", error->message));
return;
}
@@ -135,19 +144,20 @@
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_VERSION_NONE,
+ GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
texture_interp_fragment_source), NULL))) {
GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, ("%s",
- gst_gl_context_get_error ()), (NULL));
+ "Failed to compile interpolation shader"), ("%s", error->message));
return;
}
/* FIXME: this should really be per shader */
filter->draw_attr_position_loc =
- gst_gl_shader_get_attribute_location (differencematte->shader[3],
+ gst_gl_shader_get_attribute_location (differencematte->shader[2],
"a_position");
filter->draw_attr_texture_loc =
- gst_gl_shader_get_attribute_location (differencematte->shader[3],
+ gst_gl_shader_get_attribute_location (differencematte->shader[2],
"a_texcoord");
}
@@ -156,25 +166,36 @@
gst_gl_differencematte_reset_gl_resources (GstGLFilter * filter)
{
GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (filter);
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
gint i;
- gl->DeleteTextures (1, &differencematte->savedbgtexture);
- gl->DeleteTextures (1, &differencematte->newbgtexture);
+ if (differencematte->savedbgtexture) {
+ gst_memory_unref (GST_MEMORY_CAST (differencematte->savedbgtexture));
+ differencematte->savedbgtexture = NULL;
+ }
+
+ if (differencematte->newbgtexture) {
+ gst_memory_unref (GST_MEMORY_CAST (differencematte->newbgtexture));
+ differencematte->newbgtexture = NULL;
+ }
+
for (i = 0; i < 4; i++) {
+ if (differencematte->identity_shader) {
+ gst_object_unref (differencematte->identity_shader);
+ differencematte->identity_shader = NULL;
+ }
+
if (differencematte->shader[i]) {
gst_object_unref (differencematte->shader[i]);
differencematte->shader[i] = NULL;
}
+
if (differencematte->midtexture[i]) {
- gl->DeleteTextures (1, &differencematte->midtexture[i]);
- differencematte->midtexture[i] = 0;
+ gst_memory_unref (GST_MEMORY_CAST (differencematte->midtexture[i]));
+ differencematte->midtexture[i] = NULL;
}
}
differencematte->location = NULL;
differencematte->pixbuf = NULL;
- differencematte->savedbgtexture = 0;
- differencematte->newbgtexture = 0;
differencematte->bg_has_changed = FALSE;
}
@@ -263,174 +284,146 @@
}
static void
-gst_gl_differencematte_save_texture (gint width, gint height, guint texture,
- gpointer stuff)
+init_pixbuf_texture (GstGLDifferenceMatte * differencematte)
{
- GstGLFilter *filter = GST_GL_FILTER (stuff);
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
+ GstGLContext *context = GST_GL_BASE_FILTER (differencematte)->context;
+ GstGLFilter *filter = GST_GL_FILTER (differencematte);
+ GstGLBaseMemoryAllocator *tex_alloc;
+ GstGLAllocationParams *params;
+ GstVideoInfo v_info;
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
+ tex_alloc = (GstGLBaseMemoryAllocator *)
+ gst_gl_memory_allocator_get_default (context);
+ gst_video_info_set_format (&v_info, GST_VIDEO_FORMAT_RGBA,
+ differencematte->pbuf_width, differencematte->pbuf_height);
+ params =
+ (GstGLAllocationParams *) gst_gl_video_allocation_params_new (context,
+ NULL, &v_info, 0, NULL, GST_GL_TEXTURE_TARGET_2D,
+ GST_VIDEO_GL_TEXTURE_TYPE_RGBA);
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
+ differencematte->newbgtexture =
+ (GstGLMemory *) gst_gl_base_memory_alloc (tex_alloc, params);
+ gst_gl_allocation_params_free (params);
-static void
-init_pixbuf_texture (GstGLContext * context, gpointer data)
-{
- GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (data);
- GstGLFilter *filter = GST_GL_FILTER (data);
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
+ if (differencematte->savedbgtexture == NULL) {
+ params =
+ (GstGLAllocationParams *) gst_gl_video_allocation_params_new (context,
+ NULL, &filter->out_info, 0, NULL, GST_GL_TEXTURE_TARGET_2D,
+ GST_VIDEO_GL_TEXTURE_TYPE_RGBA);
- gl->DeleteTextures (1, &differencematte->newbgtexture);
- gl->GenTextures (1, &differencematte->newbgtexture);
- gl->BindTexture (GL_TEXTURE_2D, differencematte->newbgtexture);
- gl->TexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
- (gint) differencematte->pbuf_width, (gint) differencematte->pbuf_height,
- 0, GL_RGBA, GL_UNSIGNED_BYTE, differencematte->pixbuf);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
- if (differencematte->savedbgtexture == 0) {
- gl->GenTextures (1, &differencematte->savedbgtexture);
- gl->BindTexture (GL_TEXTURE_2D, differencematte->savedbgtexture);
- gl->TexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8,
- GST_VIDEO_INFO_WIDTH (&filter->out_info),
- GST_VIDEO_INFO_HEIGHT (&filter->out_info),
- 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ differencematte->savedbgtexture =
+ (GstGLMemory *) gst_gl_base_memory_alloc (tex_alloc, params);
+ gst_gl_allocation_params_free (params);
}
+
+ gst_object_unref (tex_alloc);
}
-static void
-gst_gl_differencematte_diff (gint width, gint height, guint texture,
+static gboolean
+gst_gl_differencematte_diff (GstGLFilter * filter, GstGLMemory * in_tex,
gpointer stuff)
{
- GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (stuff);
- GstGLFilter *filter = GST_GL_FILTER (stuff);
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
-
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
+ GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (filter);
+ const GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
gst_gl_shader_use (differencematte->shader[0]);
gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
gst_gl_shader_set_uniform_1i (differencematte->shader[0], "current", 0);
gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, differencematte->savedbgtexture);
+ gl->BindTexture (GL_TEXTURE_2D,
+ gst_gl_memory_get_texture_id (differencematte->savedbgtexture));
gst_gl_shader_set_uniform_1i (differencematte->shader[0], "saved", 1);
- gst_gl_filter_draw_texture (filter, texture, width, height);
+ gst_gl_filter_draw_fullscreen_quad (filter);
+
+ return TRUE;
}
-static void
-gst_gl_differencematte_hblur (gint width, gint height, guint texture,
+static gboolean
+gst_gl_differencematte_hblur (GstGLFilter * filter, GstGLMemory * in_tex,
gpointer stuff)
{
- GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (stuff);
- GstGLFilter *filter = GST_GL_FILTER (stuff);
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
-
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
+ GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (filter);
+ const GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
gst_gl_shader_use (differencematte->shader[1]);
gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
gst_gl_shader_set_uniform_1i (differencematte->shader[1], "tex", 0);
gst_gl_shader_set_uniform_1fv (differencematte->shader[1], "kernel", 7,
differencematte->kernel);
- gst_gl_shader_set_uniform_1f (differencematte->shader[1], "width", width);
+ gst_gl_shader_set_uniform_1f (differencematte->shader[1], "gauss_width",
+ GST_VIDEO_INFO_WIDTH (&filter->out_info));
- gst_gl_filter_draw_texture (filter, texture, width, height);
+ gst_gl_filter_draw_fullscreen_quad (filter);
+
+ return TRUE;
}
-static void
-gst_gl_differencematte_vblur (gint width, gint height, guint texture,
+static gboolean
+gst_gl_differencematte_vblur (GstGLFilter * filter, GstGLMemory * in_tex,
gpointer stuff)
{
- GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (stuff);
- GstGLFilter *filter = GST_GL_FILTER (stuff);
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
-
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
+ GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (filter);
+ const GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
gst_gl_shader_use (differencematte->shader[2]);
gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
gst_gl_shader_set_uniform_1i (differencematte->shader[2], "tex", 0);
gst_gl_shader_set_uniform_1fv (differencematte->shader[2], "kernel", 7,
differencematte->kernel);
- gst_gl_shader_set_uniform_1f (differencematte->shader[2], "height", height);
+ gst_gl_shader_set_uniform_1f (differencematte->shader[2], "gauss_height",
+ GST_VIDEO_INFO_HEIGHT (&filter->out_info));
- gst_gl_filter_draw_texture (filter, texture, width, height);
+ gst_gl_filter_draw_fullscreen_quad (filter);
+
+ return TRUE;
}
-static void
-gst_gl_differencematte_interp (gint width, gint height, guint texture,
+static gboolean
+gst_gl_differencematte_interp (GstGLFilter * filter, GstGLMemory * in_tex,
gpointer stuff)
{
- GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (stuff);
- GstGLFilter *filter = GST_GL_FILTER (stuff);
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
-
- gl->MatrixMode (GL_PROJECTION);
- glLoadIdentity ();
+ GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (filter);
+ const GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
gst_gl_shader_use (differencematte->shader[3]);
gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
gst_gl_shader_set_uniform_1i (differencematte->shader[3], "blend", 0);
gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, differencematte->newbgtexture);
+ gl->BindTexture (GL_TEXTURE_2D, differencematte->newbgtexture->tex_id);
gst_gl_shader_set_uniform_1i (differencematte->shader[3], "base", 1);
gl->ActiveTexture (GL_TEXTURE2);
- gl->BindTexture (GL_TEXTURE_2D, differencematte->midtexture[2]);
+ gl->BindTexture (GL_TEXTURE_2D, differencematte->midtexture[2]->tex_id);
gst_gl_shader_set_uniform_1i (differencematte->shader[3], "alpha", 2);
- gst_gl_filter_draw_texture (filter, texture, width, height);
-}
+ gst_gl_filter_draw_fullscreen_quad (filter);
-static void
-gst_gl_differencematte_identity (gint width, gint height, guint texture,
- gpointer stuff)
-{
- GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (stuff);
- GstGLFilter *filter = GST_GL_FILTER (differencematte);
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
-
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
-
- gst_gl_filter_draw_texture (filter, texture, width, height);
+ return TRUE;
}
static gboolean
-gst_gl_differencematte_filter_texture (GstGLFilter * filter, guint in_tex,
- guint out_tex)
+gst_gl_differencematte_filter_texture (GstGLFilter * filter,
+ GstGLMemory * in_tex, GstGLMemory * out_tex)
{
GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (filter);
@@ -441,15 +434,12 @@
if (!gst_gl_differencematte_loader (filter))
differencematte->pixbuf = NULL;
- /* if loader failed then context is turned off */
- gst_gl_context_thread_add (GST_GL_BASE_FILTER (filter)->context,
- init_pixbuf_texture, differencematte);
+ init_pixbuf_texture (differencematte);
/* save current frame, needed to calculate difference between
* this frame and next ones */
- gst_gl_filter_render_to_target (filter, TRUE, in_tex,
- differencematte->savedbgtexture,
- gst_gl_differencematte_save_texture, differencematte);
+ gst_gl_filter_render_to_target_with_shader (filter, in_tex,
+ differencematte->savedbgtexture, differencematte->identity_shader);
if (differencematte->pixbuf) {
free (differencematte->pixbuf);
@@ -459,21 +449,18 @@
differencematte->bg_has_changed = FALSE;
}
- if (differencematte->savedbgtexture != 0) {
- gst_gl_filter_render_to_target (filter, TRUE, in_tex,
- differencematte->midtexture[0], gst_gl_differencematte_diff,
- differencematte);
- gst_gl_filter_render_to_target (filter, FALSE,
- differencematte->midtexture[0], differencematte->midtexture[1],
- gst_gl_differencematte_hblur, differencematte);
- gst_gl_filter_render_to_target (filter, FALSE,
- differencematte->midtexture[1], differencematte->midtexture[2],
- gst_gl_differencematte_vblur, differencematte);
- gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
- gst_gl_differencematte_interp, differencematte);
+ if (differencematte->savedbgtexture != NULL) {
+ gst_gl_filter_render_to_target (filter, in_tex,
+ differencematte->midtexture[0], gst_gl_differencematte_diff, NULL);
+ gst_gl_filter_render_to_target (filter, differencematte->midtexture[0],
+ differencematte->midtexture[1], gst_gl_differencematte_hblur, NULL);
+ gst_gl_filter_render_to_target (filter, differencematte->midtexture[1],
+ differencematte->midtexture[2], gst_gl_differencematte_vblur, NULL);
+ gst_gl_filter_render_to_target (filter, in_tex, out_tex,
+ gst_gl_differencematte_interp, NULL);
} else {
- gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
- gst_gl_differencematte_identity, differencematte);
+ gst_gl_filter_render_to_target_with_shader (filter, in_tex, out_tex,
+ differencematte->identity_shader);
}
return TRUE;
diff --git a/ext/gl/gstgldifferencematte.h b/ext/gl/gstgldifferencematte.h
index 0cd122f..a4fd275 100644
--- a/ext/gl/gstgldifferencematte.h
+++ b/ext/gl/gstgldifferencematte.h
@@ -37,6 +37,7 @@
{
GstGLFilter filter;
+ GstGLShader *identity_shader;
GstGLShader *shader[4];
gchar *location;
@@ -44,10 +45,10 @@
guchar *pixbuf;
gint pbuf_width, pbuf_height;
- GLuint savedbgtexture;
- GLuint newbgtexture;
- GLuint midtexture[4];
- GLuint intexture;
+ GstGLMemory *savedbgtexture;
+ GstGLMemory *newbgtexture;
+ GstGLMemory *midtexture[4];
+ GstGLMemory *intexture;
float kernel[7];
};
diff --git a/ext/gl/gstgldownloadelement.c b/ext/gl/gstgldownloadelement.c
index ff931fa..058398b 100644
--- a/ext/gl/gstgldownloadelement.c
+++ b/ext/gl/gstgldownloadelement.c
@@ -73,10 +73,10 @@
bt_class->passthrough_on_same_caps = TRUE;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_gl_download_element_src_pad_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_gl_download_element_sink_pad_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_gl_download_element_src_pad_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_gl_download_element_sink_pad_template);
gst_element_class_set_metadata (element_class,
"OpenGL uploader", "Filter/Video",
diff --git a/ext/gl/gstgleffects.c b/ext/gl/gstgleffects.c
index 1518a64..458d95a 100644
--- a/ext/gl/gstgleffects.c
+++ b/ext/gl/gstgleffects.c
@@ -71,7 +71,7 @@
gpointer data);
static gboolean gst_gl_effects_filter_texture (GstGLFilter * filter,
- guint in_tex, guint out_tex);
+ GstGLMemory * in_tex, GstGLMemory * out_tex);
static gboolean gst_gl_effects_filters_is_property_supported (const
GstGLEffectsFilterDescriptor *, gint property);
@@ -232,7 +232,7 @@
effects->current_effect = effect_type;
break;
case GST_GL_EFFECT_XRAY:
- effects->effect = (GstGLEffectProcessFunc) gst_gl_effects_sin;
+ effects->effect = (GstGLEffectProcessFunc) gst_gl_effects_xray;
filter_class->supported_gl_api =
GST_GL_API_GLES2 | GST_GL_API_OPENGL | GST_GL_API_OPENGL3;
effects->current_effect = effect_type;
@@ -274,31 +274,27 @@
{
GstGLEffects *effects = GST_GL_EFFECTS (filter);
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
- guint internal_format;
- gint i = 0;
+ GstGLBaseMemoryAllocator *base_alloc;
+ GstGLAllocationParams *params;
+ gint i;
+
+ base_alloc = (GstGLBaseMemoryAllocator *)
+ gst_gl_memory_allocator_get_default (context);
+ params =
+ (GstGLAllocationParams *) gst_gl_video_allocation_params_new (context,
+ NULL, &filter->out_info, 0, NULL, GST_GL_TEXTURE_TARGET_2D,
+ GST_VIDEO_GL_TEXTURE_TYPE_RGBA);
for (i = 0; i < NEEDED_TEXTURES; i++) {
+ if (effects->midtexture[i])
+ gst_memory_unref (GST_MEMORY_CAST (effects->midtexture[i]));
- if (effects->midtexture[i]) {
- gl->DeleteTextures (1, &effects->midtexture[i]);
- effects->midtexture[i] = 0;
- }
-
- gl->GenTextures (1, &effects->midtexture[i]);
- gl->BindTexture (GL_TEXTURE_2D, effects->midtexture[i]);
- internal_format =
- gst_gl_sized_gl_format_from_gl_format_type (context, GL_RGBA,
- GL_UNSIGNED_BYTE);
- gl->TexImage2D (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);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ effects->midtexture[i] =
+ (GstGLMemory *) gst_gl_base_memory_alloc (base_alloc, params);
}
+
+ gst_object_unref (base_alloc);
+ gst_gl_allocation_params_free (params);
}
/* free resources that need a gl context */
@@ -310,8 +306,7 @@
gint i = 0;
for (i = 0; i < NEEDED_TEXTURES; i++) {
- gl->DeleteTextures (1, &effects->midtexture[i]);
- effects->midtexture[i] = 0;
+ gst_memory_unref (GST_MEMORY_CAST (effects->midtexture[i]));
}
for (i = 0; i < GST_GL_EFFECTS_N_CURVES; i++) {
gl->DeleteTextures (1, &effects->curve[i]);
@@ -396,10 +391,11 @@
}
static void
-set_horizontal_swap (GstGLContext * context, gpointer data)
+set_horizontal_swap (GstGLEffects * effects)
{
#if GST_GL_HAVE_OPENGL
- GstGLFuncs *gl = context->gl_vtable;
+ GstGLContext *context = GST_GL_BASE_FILTER (effects)->context;
+ const GstGLFuncs *gl = context->gl_vtable;
if (gst_gl_context_get_gl_api (context) & GST_GL_API_OPENGL) {
const gfloat mirrormatrix[16] = {
@@ -527,8 +523,8 @@
}
static gboolean
-gst_gl_effects_filter_texture (GstGLFilter * filter, guint in_tex,
- guint out_tex)
+gst_gl_effects_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex,
+ GstGLMemory * out_tex)
{
GstGLEffects *effects = GST_GL_EFFECTS (filter);
@@ -536,8 +532,7 @@
effects->outtexture = out_tex;
if (effects->horizontal_swap == TRUE)
- gst_gl_context_thread_add (GST_GL_BASE_FILTER (filter)->context,
- set_horizontal_swap, effects);
+ set_horizontal_swap (effects);
effects->effect (effects);
diff --git a/ext/gl/gstgleffects.h b/ext/gl/gstgleffects.h
index ddd2292..151ab78 100644
--- a/ext/gl/gstgleffects.h
+++ b/ext/gl/gstgleffects.h
@@ -69,9 +69,9 @@
GstGLEffectProcessFunc effect;
gint current_effect;
- GLuint intexture;
- GLuint midtexture[NEEDED_TEXTURES];
- GLuint outtexture;
+ GstGLMemory *intexture;
+ GstGLMemory *midtexture[NEEDED_TEXTURES];
+ GstGLMemory *outtexture;
GLuint curve[GST_GL_EFFECTS_N_CURVES];
diff --git a/ext/gl/gstglfilterapp.c b/ext/gl/gstglfilterapp.c
index 715f6f3..925373b 100644
--- a/ext/gl/gstglfilterapp.c
+++ b/ext/gl/gstglfilterapp.c
@@ -69,7 +69,7 @@
static gboolean gst_gl_filter_app_set_caps (GstGLFilter * filter,
GstCaps * incaps, GstCaps * outcaps);
static gboolean gst_gl_filter_app_filter_texture (GstGLFilter * filter,
- guint in_tex, guint out_tex);
+ GstGLMemory * in_tex, GstGLMemory * out_tex);
static gboolean gst_gl_filter_app_gl_start (GstGLBaseFilter * base_filter);
static void gst_gl_filter_app_gl_stop (GstGLBaseFilter * base_filter);
@@ -184,57 +184,44 @@
return TRUE;
}
-static void
-_emit_draw_signal (guint tex, gint width, gint height, gpointer data)
-{
- GstGLFilterApp *app_filter = GST_GL_FILTER_APP (data);
- gboolean drawn;
-
- g_signal_emit (app_filter, gst_gl_filter_app_signals[CLIENT_DRAW_SIGNAL], 0,
- tex, width, height, &drawn);
-
- app_filter->default_draw = !drawn;
-}
-
struct glcb2
{
- GLCB func;
- gpointer data;
- guint texture;
- guint width;
- guint height;
+ GstGLFilterApp *app;
+ GstGLMemory *in_tex;
+ GstGLMemory *out_tex;
};
-/* convenience functions to simplify filter development */
-static void
-_glcb2 (gpointer data)
+static gboolean
+_emit_draw_signal (gpointer data)
{
struct glcb2 *cb = data;
+ gboolean drawn;
- cb->func (cb->width, cb->height, cb->texture, cb->data);
+ g_signal_emit (cb->app, gst_gl_filter_app_signals[CLIENT_DRAW_SIGNAL], 0,
+ cb->in_tex->tex_id, gst_gl_memory_get_texture_width (cb->out_tex),
+ gst_gl_memory_get_texture_height (cb->out_tex), &drawn);
+
+ return !drawn;
}
static gboolean
-gst_gl_filter_app_filter_texture (GstGLFilter * filter, guint in_tex,
- guint out_tex)
+gst_gl_filter_app_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex,
+ GstGLMemory * out_tex)
{
GstGLFilterApp *app_filter = GST_GL_FILTER_APP (filter);
+ gboolean default_draw;
struct glcb2 cb;
- cb.func = (GLCB) _emit_draw_signal;
- cb.data = filter;
- cb.texture = in_tex;
- cb.width = GST_VIDEO_INFO_WIDTH (&filter->in_info);
- cb.height = GST_VIDEO_INFO_HEIGHT (&filter->in_info);
+ cb.app = app_filter;
+ cb.in_tex = in_tex;
+ cb.out_tex = out_tex;
- //blocking call, use a FBO
- gst_gl_context_use_fbo_v2 (GST_GL_BASE_FILTER (filter)->context,
- GST_VIDEO_INFO_WIDTH (&filter->out_info),
- GST_VIDEO_INFO_HEIGHT (&filter->out_info),
- filter->fbo, filter->depthbuffer, out_tex, _glcb2, &cb);
+ default_draw =
+ gst_gl_framebuffer_draw_to_texture (filter->fbo,
+ out_tex, _emit_draw_signal, &cb);
- if (app_filter->default_draw) {
- gst_gl_filter_render_to_target_with_shader (filter, TRUE, in_tex, out_tex,
+ if (default_draw) {
+ gst_gl_filter_render_to_target_with_shader (filter, in_tex, out_tex,
filter->default_shader);
}
diff --git a/ext/gl/gstglfilterapp.h b/ext/gl/gstglfilterapp.h
index a8978c5..d7e9a6f 100644
--- a/ext/gl/gstglfilterapp.h
+++ b/ext/gl/gstglfilterapp.h
@@ -37,8 +37,6 @@
struct _GstGLFilterApp
{
GstGLFilter filter;
-
- gboolean default_draw;
};
struct _GstGLFilterAppClass
diff --git a/ext/gl/gstglfilterbin.c b/ext/gl/gstglfilterbin.c
index 946d66c..a3621ec 100644
--- a/ext/gl/gstglfilterbin.c
+++ b/ext/gl/gstglfilterbin.c
@@ -73,8 +73,7 @@
gobject_class->set_property = gst_gl_filter_bin_set_property;
gobject_class->get_property = gst_gl_filter_bin_get_property;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&_src_pad_template));
+ gst_element_class_add_static_pad_template (element_class, &_src_pad_template);
upload_caps = gst_gl_upload_get_input_template_caps ();
gst_element_class_add_pad_template (element_class,
diff --git a/ext/gl/gstglfiltercube.c b/ext/gl/gstglfiltercube.c
index d389310..717eba6 100644
--- a/ext/gl/gstglfiltercube.c
+++ b/ext/gl/gstglfiltercube.c
@@ -79,9 +79,9 @@
GstCaps * incaps, GstCaps * outcaps);
static void gst_gl_filter_cube_reset_gl (GstGLFilter * filter);
static gboolean gst_gl_filter_cube_init_shader (GstGLFilter * filter);
-static void _callback (gpointer stuff);
+static gboolean _callback (gpointer stuff);
static gboolean gst_gl_filter_cube_filter_texture (GstGLFilter * filter,
- guint in_tex, guint out_tex);
+ GstGLMemory * in_tex, GstGLMemory * out_tex);
/* vertex source */
static const gchar *cube_v_src =
@@ -335,20 +335,15 @@
}
static gboolean
-gst_gl_filter_cube_filter_texture (GstGLFilter * filter, guint in_tex,
- guint out_tex)
+gst_gl_filter_cube_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex,
+ GstGLMemory * out_tex)
{
GstGLFilterCube *cube_filter = GST_GL_FILTER_CUBE (filter);
cube_filter->in_tex = in_tex;
- /* blocking call, use a FBO */
- gst_gl_context_use_fbo_v2 (GST_GL_BASE_FILTER (filter)->context,
- GST_VIDEO_INFO_WIDTH (&filter->out_info),
- GST_VIDEO_INFO_HEIGHT (&filter->out_info), filter->fbo,
- filter->depthbuffer, out_tex, _callback, (gpointer) cube_filter);
-
- return TRUE;
+ return gst_gl_framebuffer_draw_to_texture (filter->fbo, out_tex, _callback,
+ cube_filter);
}
/* *INDENT-OFF* */
@@ -440,7 +435,7 @@
gl->DisableVertexAttribArray (cube_filter->attr_texture);
}
-static void
+static gboolean
_callback (gpointer stuff)
{
GstGLFilter *filter = GST_GL_FILTER (stuff);
@@ -466,7 +461,7 @@
gst_gl_shader_use (cube_filter->shader);
gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, cube_filter->in_tex);
+ gl->BindTexture (GL_TEXTURE_2D, cube_filter->in_tex->tex_id);
gst_gl_shader_set_uniform_1i (cube_filter->shader, "s_texture", 0);
gst_gl_shader_set_uniform_1f (cube_filter->shader, "xrot_degree", xrot);
gst_gl_shader_set_uniform_1f (cube_filter->shader, "yrot_degree", yrot);
@@ -516,4 +511,6 @@
xrot += 0.3f;
yrot += 0.2f;
zrot += 0.4f;
+
+ return TRUE;
}
diff --git a/ext/gl/gstglfiltercube.h b/ext/gl/gstglfiltercube.h
index 88b51a6..ee25048 100644
--- a/ext/gl/gstglfiltercube.h
+++ b/ext/gl/gstglfiltercube.h
@@ -40,6 +40,7 @@
GstGLFilter filter;
GstGLShader *shader;
+ GstGLMemory *in_tex;
/* background color */
gfloat red;
@@ -52,7 +53,6 @@
gdouble znear;
gdouble zfar;
- guint in_tex;
GLuint vao;
GLuint vbo_indices;
GLuint vertex_buffer;
diff --git a/ext/gl/gstglfilterglass.c b/ext/gl/gstglfilterglass.c
index 863793c..28bc485 100644
--- a/ext/gl/gstglfilterglass.c
+++ b/ext/gl/gstglfilterglass.c
@@ -66,14 +66,14 @@
static gboolean gst_gl_filter_glass_init_shader (GstGLFilter * filter);
static gboolean gst_gl_filter_glass_filter_texture (GstGLFilter * filter,
- guint in_tex, guint out_tex);
+ GstGLMemory * in_tex, GstGLMemory * out_tex);
static void gst_gl_filter_glass_draw_background_gradient ();
static void gst_gl_filter_glass_draw_video_plane (GstGLFilter * filter,
gint width, gint height, guint texture, gfloat center_x, gfloat center_y,
gfloat start_alpha, gfloat stop_alpha, gboolean reversed, gfloat rotation);
-static void gst_gl_filter_glass_callback (gpointer stuff);
+static gboolean gst_gl_filter_glass_callback (gpointer stuff);
/* *INDENT-OFF* */
static const gchar *glass_fragment_source =
@@ -238,18 +238,15 @@
}
static gboolean
-gst_gl_filter_glass_filter_texture (GstGLFilter * filter, guint in_tex,
- guint out_tex)
+gst_gl_filter_glass_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex,
+ GstGLMemory * out_tex)
{
GstGLFilterGlass *glass_filter = GST_GL_FILTER_GLASS (filter);
+
glass_filter->in_tex = in_tex;
- //blocking call, use a FBO
- gst_gl_context_use_fbo_v2 (GST_GL_BASE_FILTER (filter)->context,
- GST_VIDEO_INFO_WIDTH (&filter->out_info),
- GST_VIDEO_INFO_HEIGHT (&filter->out_info),
- filter->fbo, filter->depthbuffer, out_tex,
- gst_gl_filter_glass_callback, (gpointer) glass_filter);
+ gst_gl_framebuffer_draw_to_texture (filter->fbo, out_tex,
+ gst_gl_filter_glass_callback, glass_filter);
return TRUE;
}
@@ -352,8 +349,7 @@
gl->DisableClientState (GL_COLOR_ARRAY);
}
-//opengl scene, params: input texture (not the output filter->texture)
-static void
+static gboolean
gst_gl_filter_glass_callback (gpointer stuff)
{
static gint64 start_time = 0;
@@ -365,7 +361,7 @@
gint width = GST_VIDEO_INFO_WIDTH (&filter->out_info);
gint height = GST_VIDEO_INFO_HEIGHT (&filter->out_info);
- guint texture = glass_filter->in_tex;
+ guint texture = glass_filter->in_tex->tex_id;
if (start_time == 0)
start_time = get_time ();
@@ -375,7 +371,7 @@
time_left -= 1000000 / 25;
if (time_left > 2000) {
GST_LOG ("escape");
- return;
+ return FALSE;
}
}
@@ -407,4 +403,6 @@
gst_gl_context_clear_shader (GST_GL_BASE_FILTER (filter)->context);
gl->Disable (GL_BLEND);
+
+ return TRUE;
}
diff --git a/ext/gl/gstglfilterglass.h b/ext/gl/gstglfilterglass.h
index 3897d02..1f1c91d 100644
--- a/ext/gl/gstglfilterglass.h
+++ b/ext/gl/gstglfilterglass.h
@@ -41,7 +41,8 @@
GstGLShader *passthrough_shader;
GstGLShader *shader;
gint64 timestamp;
- guint in_tex;
+ GstGLMemory *in_tex;
+ GstGLMemory *out_tex;
};
struct _GstGLFilterGlassClass
diff --git a/ext/gl/gstglfiltershader.c b/ext/gl/gstglfiltershader.c
index 2117388..93962f9 100644
--- a/ext/gl/gstglfiltershader.c
+++ b/ext/gl/gstglfiltershader.c
@@ -82,9 +82,9 @@
static gboolean gst_gl_filtershader_filter (GstGLFilter * filter,
GstBuffer * inbuf, GstBuffer * outbuf);
static gboolean gst_gl_filtershader_filter_texture (GstGLFilter * filter,
- guint in_tex, guint out_tex);
-static void gst_gl_filtershader_hcallback (gint width, gint height,
- guint texture, gpointer stuff);
+ GstGLMemory * in_tex, GstGLMemory * out_tex);
+static gboolean gst_gl_filtershader_hcallback (GstGLFilter * filter,
+ GstGLMemory * in_tex, gpointer stuff);
static void
gst_gl_filtershader_class_init (GstGLFilterShaderClass * klass)
@@ -313,13 +313,13 @@
}
static gboolean
-gst_gl_filtershader_filter_texture (GstGLFilter * filter, guint in_tex,
- guint out_tex)
+gst_gl_filtershader_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex,
+ GstGLMemory * out_tex)
{
GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (filter);
- gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
- gst_gl_filtershader_hcallback, filtershader);
+ gst_gl_filter_render_to_target (filter, in_tex, out_tex,
+ gst_gl_filtershader_hcallback, NULL);
if (!filtershader->shader)
return FALSE;
@@ -493,17 +493,16 @@
return NULL;
}
-static void
-gst_gl_filtershader_hcallback (gint width, gint height, guint texture,
+static gboolean
+gst_gl_filtershader_hcallback (GstGLFilter * filter, GstGLMemory * in_tex,
gpointer stuff)
{
- GstGLFilter *filter = GST_GL_FILTER (stuff);
GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (filter);
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
GstGLShader *shader;
if (!(shader = _maybe_recompile_shader (filtershader)))
- return;
+ return FALSE;
gl->ClearColor (0.0, 0.0, 0.0, 1.0);
gl->Clear (GL_COLOR_BUFFER_BIT);
@@ -512,8 +511,10 @@
/* 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, "width",
+ GST_VIDEO_INFO_WIDTH (&filter->out_info));
+ gst_gl_shader_set_uniform_1f (shader, "height",
+ GST_VIDEO_INFO_HEIGHT (&filter->out_info));
gst_gl_shader_set_uniform_1f (shader, "time", filtershader->time);
/* FIXME: propertise these */
@@ -523,9 +524,11 @@
gst_gl_shader_get_attribute_location (shader, "a_texcoord");
gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
- gst_gl_filter_draw_texture (filter, texture, width, height);
+ gst_gl_filter_draw_fullscreen_quad (filter);
gst_object_unref (shader);
+
+ return TRUE;
}
diff --git a/ext/gl/gstglimagesink.c b/ext/gl/gstglimagesink.c
index 14ddeee..385e3e4 100644
--- a/ext/gl/gstglimagesink.c
+++ b/ext/gl/gstglimagesink.c
@@ -94,10 +94,6 @@
#include "gstglimagesink.h"
#include "gstglsinkbin.h"
-#if GST_GL_HAVE_PLATFORM_EGL
-#include <gst/gl/egl/gsteglimagememory.h>
-#endif
-
#include <gst/gl/gstglviewconvert.h>
GST_DEBUG_CATEGORY (gst_debug_glimage_sink);
@@ -120,6 +116,7 @@
enum
{
PROP_BIN_0,
+ PROP_BIN_ROTATE_METHOD,
PROP_BIN_FORCE_ASPECT_RATIO,
PROP_BIN_PIXEL_ASPECT_RATIO,
PROP_BIN_HANDLE_EVENTS,
@@ -181,6 +178,39 @@
return ret;
}
+#define DEFAULT_ROTATE_METHOD GST_GL_ROTATE_METHOD_IDENTITY
+
+#define GST_TYPE_GL_ROTATE_METHOD (gst_gl_rotate_method_get_type())
+
+static const GEnumValue rotate_methods[] = {
+ {GST_GL_ROTATE_METHOD_IDENTITY, "Identity (no rotation)", "none"},
+ {GST_GL_ROTATE_METHOD_90R, "Rotate clockwise 90 degrees", "clockwise"},
+ {GST_GL_ROTATE_METHOD_180, "Rotate 180 degrees", "rotate-180"},
+ {GST_GL_ROTATE_METHOD_90L, "Rotate counter-clockwise 90 degrees",
+ "counterclockwise"},
+ {GST_GL_ROTATE_METHOD_FLIP_HORIZ, "Flip horizontally", "horizontal-flip"},
+ {GST_GL_ROTATE_METHOD_FLIP_VERT, "Flip vertically", "vertical-flip"},
+ {GST_GL_ROTATE_METHOD_FLIP_UL_LR,
+ "Flip across upper left/lower right diagonal", "upper-left-diagonal"},
+ {GST_GL_ROTATE_METHOD_FLIP_UR_LL,
+ "Flip across upper right/lower left diagonal", "upper-right-diagonal"},
+ {GST_GL_ROTATE_METHOD_AUTO,
+ "Select rotate method based on image-orientation tag", "automatic"},
+ {0, NULL, NULL},
+};
+
+static GType
+gst_gl_rotate_method_get_type (void)
+{
+ static GType rotate_method_type = 0;
+
+ if (!rotate_method_type) {
+ rotate_method_type = g_enum_register_static ("GstGLRotateMethod",
+ rotate_methods);
+ }
+ return rotate_method_type;
+}
+
static void
gst_gl_image_sink_bin_init (GstGLImageSinkBin * self)
{
@@ -203,6 +233,12 @@
gobject_class->set_property = gst_gl_image_sink_bin_set_property;
/* gl sink */
+ g_object_class_install_property (gobject_class, PROP_BIN_ROTATE_METHOD,
+ g_param_spec_enum ("rotate-method",
+ "rotate method",
+ "rotate method",
+ GST_TYPE_GL_ROTATE_METHOD, DEFAULT_ROTATE_METHOD,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_BIN_FORCE_ASPECT_RATIO,
g_param_spec_boolean ("force-aspect-ratio",
"Force aspect ratio",
@@ -291,6 +327,7 @@
static void gst_glimage_sink_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * param_spec);
+static gboolean gst_glimage_sink_event (GstBaseSink * sink, GstEvent * event);
static gboolean gst_glimage_sink_query (GstBaseSink * bsink, GstQuery * query);
static void gst_glimage_sink_set_context (GstElement * element,
GstContext * context);
@@ -347,6 +384,7 @@
{
ARG_0,
ARG_DISPLAY,
+ PROP_ROTATE_METHOD,
PROP_FORCE_ASPECT_RATIO,
PROP_PIXEL_ASPECT_RATIO,
PROP_CONTEXT,
@@ -404,6 +442,126 @@
GST_TRACE ("transform %fx%f into %fx%f", x, y, *stream_x, *stream_y);
}
+/* rotate 90 */
+static const gfloat clockwise_matrix[] = {
+ 0.0f, -1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f,
+};
+
+/* rotate 180 */
+static const gfloat clockwise_180_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,
+};
+
+/* rotate 270 */
+static const gfloat counterclockwise_matrix[] = {
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ -1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f,
+};
+
+/* horizontal-flip */
+static const gfloat horizontal_flip_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,
+};
+
+/* vertical-flip */
+static const gfloat vertical_flip_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,
+};
+
+/* upper-left-diagonal */
+static const gfloat upper_left_matrix[] = {
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f,
+};
+
+/* upper-right-diagonal */
+static const gfloat upper_right_matrix[] = {
+ 0.0f, -1.0f, 0.0f, 0.0f,
+ -1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f,
+};
+
+static void
+gst_glimage_sink_set_rotate_method (GstGLImageSink * gl_sink,
+ GstGLRotateMethod method, gboolean from_tag)
+{
+ GstGLRotateMethod tag_method = DEFAULT_ROTATE_METHOD;
+ GST_GLIMAGE_SINK_LOCK (gl_sink);
+ if (from_tag)
+ tag_method = method;
+ else
+ gl_sink->rotate_method = method;
+
+ if (gl_sink->rotate_method == GST_GL_ROTATE_METHOD_AUTO)
+ method = tag_method;
+ else
+ method = gl_sink->rotate_method;
+
+ if (method != gl_sink->current_rotate_method) {
+ GST_DEBUG_OBJECT (gl_sink, "Changing method from %s to %s",
+ rotate_methods[gl_sink->current_rotate_method].value_nick,
+ rotate_methods[method].value_nick);
+
+ switch (method) {
+ case GST_GL_ROTATE_METHOD_IDENTITY:
+ gl_sink->transform_matrix = NULL;
+ gl_sink->output_mode_changed = TRUE;
+ break;
+ case GST_GL_ROTATE_METHOD_90R:
+ gl_sink->transform_matrix = clockwise_matrix;
+ gl_sink->output_mode_changed = TRUE;
+ break;
+ case GST_GL_ROTATE_METHOD_180:
+ gl_sink->transform_matrix = clockwise_180_matrix;
+ gl_sink->output_mode_changed = TRUE;
+ break;
+ case GST_GL_ROTATE_METHOD_90L:
+ gl_sink->transform_matrix = counterclockwise_matrix;
+ gl_sink->output_mode_changed = TRUE;
+ break;
+ case GST_GL_ROTATE_METHOD_FLIP_HORIZ:
+ gl_sink->transform_matrix = horizontal_flip_matrix;
+ gl_sink->output_mode_changed = TRUE;
+ break;
+ case GST_GL_ROTATE_METHOD_FLIP_VERT:
+ gl_sink->transform_matrix = vertical_flip_matrix;
+ gl_sink->output_mode_changed = TRUE;
+ break;
+ case GST_GL_ROTATE_METHOD_FLIP_UL_LR:
+ gl_sink->transform_matrix = upper_left_matrix;
+ gl_sink->output_mode_changed = TRUE;
+ break;
+ case GST_GL_ROTATE_METHOD_FLIP_UR_LL:
+ gl_sink->transform_matrix = upper_right_matrix;
+ gl_sink->output_mode_changed = TRUE;
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ gl_sink->current_rotate_method = method;
+ }
+ GST_GLIMAGE_SINK_UNLOCK (gl_sink);
+}
+
static void
gst_glimage_sink_navigation_send_event (GstNavigation * navigation, GstStructure
* structure)
@@ -485,6 +643,13 @@
gobject_class->set_property = gst_glimage_sink_set_property;
gobject_class->get_property = gst_glimage_sink_get_property;
+ g_object_class_install_property (gobject_class, PROP_ROTATE_METHOD,
+ g_param_spec_enum ("rotate-method",
+ "rotate method",
+ "rotate method",
+ GST_TYPE_GL_ROTATE_METHOD, DEFAULT_ROTATE_METHOD,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
g_object_class_install_property (gobject_class, PROP_FORCE_ASPECT_RATIO,
g_param_spec_boolean ("force-aspect-ratio", "Force aspect ratio",
"When enabled, scaling will respect original aspect ratio",
@@ -570,13 +735,14 @@
G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_generic,
G_TYPE_BOOLEAN, 3, GST_GL_TYPE_CONTEXT, G_TYPE_UINT, G_TYPE_UINT);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_glimage_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_glimage_sink_template);
gobject_class->finalize = gst_glimage_sink_finalize;
gstelement_class->change_state = gst_glimage_sink_change_state;
gstelement_class->set_context = gst_glimage_sink_set_context;
+ gstbasesink_class->event = gst_glimage_sink_event;
gstbasesink_class->query = GST_DEBUG_FUNCPTR (gst_glimage_sink_query);
gstbasesink_class->set_caps = gst_glimage_sink_set_caps;
gstbasesink_class->get_caps = gst_glimage_sink_get_caps;
@@ -606,6 +772,9 @@
glimage_sink->mview_output_flags = DEFAULT_MULTIVIEW_FLAGS;
glimage_sink->mview_downmix_mode = DEFAULT_MULTIVIEW_DOWNMIX;
+ glimage_sink->current_rotate_method = DEFAULT_ROTATE_METHOD;
+ glimage_sink->transform_matrix = NULL;
+
g_mutex_init (&glimage_sink->drawing_lock);
}
@@ -620,6 +789,10 @@
glimage_sink = GST_GLIMAGE_SINK (object);
switch (prop_id) {
+ case PROP_ROTATE_METHOD:
+ gst_glimage_sink_set_rotate_method (glimage_sink,
+ g_value_get_enum (value), FALSE);
+ break;
case PROP_FORCE_ASPECT_RATIO:
{
glimage_sink->keep_aspect_ratio = g_value_get_boolean (value);
@@ -687,6 +860,9 @@
glimage_sink = GST_GLIMAGE_SINK (object);
switch (prop_id) {
+ case PROP_ROTATE_METHOD:
+ g_value_set_enum (value, glimage_sink->current_rotate_method);
+ break;
case PROP_FORCE_ASPECT_RATIO:
g_value_set_boolean (value, glimage_sink->keep_aspect_ratio);
break;
@@ -844,6 +1020,58 @@
}
static gboolean
+gst_glimage_sink_event (GstBaseSink * sink, GstEvent * event)
+{
+ GstGLImageSink *gl_sink = GST_GLIMAGE_SINK (sink);
+ GstTagList *taglist;
+ gchar *orientation;
+ gboolean ret;
+
+ GST_DEBUG_OBJECT (gl_sink, "handling %s event", GST_EVENT_TYPE_NAME (event));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_TAG:
+ gst_event_parse_tag (event, &taglist);
+
+ if (gst_tag_list_get_string (taglist, "image-orientation", &orientation)) {
+ if (!g_strcmp0 ("rotate-0", orientation))
+ gst_glimage_sink_set_rotate_method (gl_sink,
+ GST_GL_ROTATE_METHOD_IDENTITY, TRUE);
+ else if (!g_strcmp0 ("rotate-90", orientation))
+ gst_glimage_sink_set_rotate_method (gl_sink, GST_GL_ROTATE_METHOD_90R,
+ TRUE);
+ else if (!g_strcmp0 ("rotate-180", orientation))
+ gst_glimage_sink_set_rotate_method (gl_sink, GST_GL_ROTATE_METHOD_180,
+ TRUE);
+ else if (!g_strcmp0 ("rotate-270", orientation))
+ gst_glimage_sink_set_rotate_method (gl_sink, GST_GL_ROTATE_METHOD_90L,
+ TRUE);
+ else if (!g_strcmp0 ("flip-rotate-0", orientation))
+ gst_glimage_sink_set_rotate_method (gl_sink,
+ GST_GL_ROTATE_METHOD_FLIP_HORIZ, TRUE);
+ else if (!g_strcmp0 ("flip-rotate-90", orientation))
+ gst_glimage_sink_set_rotate_method (gl_sink,
+ GST_GL_ROTATE_METHOD_FLIP_UR_LL, TRUE);
+ else if (!g_strcmp0 ("flip-rotate-180", orientation))
+ gst_glimage_sink_set_rotate_method (gl_sink,
+ GST_GL_ROTATE_METHOD_FLIP_VERT, TRUE);
+ else if (!g_strcmp0 ("flip-rotate-270", orientation))
+ gst_glimage_sink_set_rotate_method (gl_sink,
+ GST_GL_ROTATE_METHOD_FLIP_UL_LR, TRUE);
+
+ g_free (orientation);
+ }
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_BASE_SINK_CLASS (parent_class)->event (sink, event);
+
+ return ret;
+}
+
+static gboolean
gst_glimage_sink_query (GstBaseSink * bsink, GstQuery * query)
{
GstGLImageSink *glimage_sink = GST_GLIMAGE_SINK (bsink);
@@ -1549,7 +1777,7 @@
if (g_atomic_int_get (&glimage_sink->to_quit) != 0) {
GST_ELEMENT_ERROR (glimage_sink, RESOURCE, NOT_FOUND,
- ("%s", gst_gl_context_get_error ()), (NULL));
+ ("%s", "Quit requested"), (NULL));
return GST_FLOW_ERROR;
}
@@ -1559,7 +1787,7 @@
redisplay_failed:
{
GST_ELEMENT_ERROR (glimage_sink, RESOURCE, NOT_FOUND,
- ("%s", gst_gl_context_get_error ()), (NULL));
+ ("%s", "Window redisplay failed"), (NULL));
return GST_FLOW_ERROR;
}
}
@@ -1702,6 +1930,8 @@
gst_query_add_allocation_meta (query,
GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, allocation_meta);
+ gst_query_add_allocation_meta (query,
+ GST_VIDEO_AFFINE_TRANSFORMATION_META_API_TYPE, 0);
if (allocation_meta)
gst_structure_free (allocation_meta);
@@ -1777,17 +2007,16 @@
GError *error = NULL;
GstGLSLStage *frag_stage, *vert_stage;
+ 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_vertex_transform);
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) {
@@ -1913,8 +2142,17 @@
src.x = 0;
src.y = 0;
- src.w = GST_VIDEO_SINK_WIDTH (gl_sink);
- src.h = GST_VIDEO_SINK_HEIGHT (gl_sink);
+ if (gl_sink->current_rotate_method == GST_GL_ROTATE_METHOD_90R
+ || gl_sink->current_rotate_method == GST_GL_ROTATE_METHOD_90L
+ || gl_sink->current_rotate_method == GST_GL_ROTATE_METHOD_FLIP_UL_LR
+ || gl_sink->current_rotate_method ==
+ GST_GL_ROTATE_METHOD_FLIP_UR_LL) {
+ src.h = GST_VIDEO_SINK_WIDTH (gl_sink);
+ src.w = GST_VIDEO_SINK_HEIGHT (gl_sink);
+ } else {
+ src.w = GST_VIDEO_SINK_WIDTH (gl_sink);
+ src.h = GST_VIDEO_SINK_HEIGHT (gl_sink);
+ }
dst.x = 0;
dst.y = 0;
@@ -1944,13 +2182,6 @@
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)
{
@@ -2031,18 +2262,21 @@
gl->ActiveTexture (GL_TEXTURE0);
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;
+ gfloat matrix[16];
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);
+
+ gst_gl_get_affine_transformation_meta_as_ndc (af_meta, matrix);
+
+ if (gl_sink->transform_matrix)
+ gst_gl_multiply_matrix4 (gl_sink->transform_matrix, matrix, matrix);
+
+ gst_gl_shader_set_uniform_matrix_4fv (gl_sink->redisplay_shader,
+ "u_transformation", 1, FALSE, matrix);
}
gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
@@ -2072,7 +2306,7 @@
{
GstGLWindow *window;
- gst_gl_context_set_error (gl_sink->context, "Output window was closed");
+ GST_WARNING_OBJECT (gl_sink, "Output window was closed");
window = gst_gl_context_get_window (gl_sink->context);
diff --git a/ext/gl/gstglimagesink.h b/ext/gl/gstglimagesink.h
index 6e9b98e..8833103 100644
--- a/ext/gl/gstglimagesink.h
+++ b/ext/gl/gstglimagesink.h
@@ -44,6 +44,19 @@
#define GST_IS_GLIMAGE_SINK_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GLIMAGE_SINK))
+typedef enum
+{
+ GST_GL_ROTATE_METHOD_IDENTITY,
+ GST_GL_ROTATE_METHOD_90R,
+ GST_GL_ROTATE_METHOD_180,
+ GST_GL_ROTATE_METHOD_90L,
+ GST_GL_ROTATE_METHOD_FLIP_HORIZ,
+ GST_GL_ROTATE_METHOD_FLIP_VERT,
+ GST_GL_ROTATE_METHOD_FLIP_UL_LR,
+ GST_GL_ROTATE_METHOD_FLIP_UR_LL,
+ GST_GL_ROTATE_METHOD_AUTO,
+}GstGLRotateMethod;
+
typedef struct _GstGLImageSink GstGLImageSink;
typedef struct _GstGLImageSinkClass GstGLImageSinkClass;
@@ -122,6 +135,11 @@
GstGLStereoDownmix mview_downmix_mode;
GstGLOverlayCompositor *overlay_compositor;
+
+ /* current video flip method */
+ GstGLRotateMethod current_rotate_method;
+ GstGLRotateMethod rotate_method;
+ const gfloat *transform_matrix;
};
struct _GstGLImageSinkClass
diff --git a/ext/gl/gstglmixer.c b/ext/gl/gstglmixer.c
index 5ca1316..3fc5aa6 100644
--- a/ext/gl/gstglmixer.c
+++ b/ext/gl/gstglmixer.c
@@ -28,10 +28,6 @@
#include "gstglmixer.h"
-#if GST_GL_HAVE_PLATFORM_EGL
-#include <gst/gl/egl/gsteglimagememory.h>
-#endif
-
#define gst_gl_mixer_parent_class parent_class
G_DEFINE_ABSTRACT_TYPE (GstGLMixer, gst_gl_mixer, GST_TYPE_GL_BASE_MIXER);
@@ -380,10 +376,8 @@
gobject_class->get_property = gst_gl_mixer_get_property;
gobject_class->set_property = gst_gl_mixer_set_property;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
agg_class->sinkpads_type = GST_TYPE_GL_MIXER_PAD;
agg_class->sink_query = gst_gl_mixer_sink_query;
@@ -416,8 +410,6 @@
gst_gl_mixer_init (GstGLMixer * mix)
{
mix->priv = GST_GL_MIXER_GET_PRIVATE (mix);
- mix->fbo = 0;
- mix->depthbuffer = 0;
mix->priv->gl_resource_ready = FALSE;
g_mutex_init (&mix->priv->gl_resource_lock);
@@ -518,33 +510,38 @@
return ret;
}
+static void
+_mixer_create_fbo (GstGLContext * context, GstGLMixer * mix)
+{
+ GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (mix);
+ guint out_width = GST_VIDEO_INFO_WIDTH (&vagg->info);
+ guint out_height = GST_VIDEO_INFO_HEIGHT (&vagg->info);
+
+ mix->fbo =
+ gst_gl_framebuffer_new_with_default_depth (context, out_width,
+ out_height);
+}
+
static gboolean
gst_gl_mixer_decide_allocation (GstGLBaseMixer * base_mix, GstQuery * query)
{
GstGLMixer *mix = GST_GL_MIXER (base_mix);
GstGLMixerClass *mixer_class = GST_GL_MIXER_GET_CLASS (mix);
- GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (mix);
GstGLContext *context = base_mix->context;
GstBufferPool *pool = NULL;
GstStructure *config;
GstCaps *caps;
guint min, max, size;
gboolean update_pool;
- guint out_width, out_height;
-
- out_width = GST_VIDEO_INFO_WIDTH (&vagg->info);
- out_height = GST_VIDEO_INFO_HEIGHT (&vagg->info);
g_mutex_lock (&mix->priv->gl_resource_lock);
mix->priv->gl_resource_ready = FALSE;
- if (mix->fbo) {
- gst_gl_context_del_fbo (context, mix->fbo, mix->depthbuffer);
- mix->fbo = 0;
- mix->depthbuffer = 0;
- }
+ if (mix->fbo)
+ gst_object_unref (mix->fbo);
- if (!gst_gl_context_gen_fbo (context, out_width, out_height,
- &mix->fbo, &mix->depthbuffer)) {
+ gst_gl_context_thread_add (context,
+ (GstGLContextThreadFunc) _mixer_create_fbo, mix);
+ if (!mix->fbo) {
g_cond_signal (&mix->priv->gl_resource_cond);
g_mutex_unlock (&mix->priv->gl_resource_lock);
goto context_error;
@@ -606,6 +603,7 @@
GstGLMixerPad *pad = GST_GL_MIXER_PAD (agg_pad);
GstGLMixer *mix = GST_GL_MIXER (agg);
+ pad->current_texture = 0;
if (vaggpad->buffer != NULL) {
GstVideoInfo gl_info;
GstVideoFrame gl_frame;
@@ -636,7 +634,7 @@
gboolean
gst_gl_mixer_process_textures (GstGLMixer * mix, GstBuffer * outbuf)
{
- guint out_tex;
+ GstGLMemory *out_tex;
gboolean res = TRUE;
GstVideoFrame out_frame;
GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (mix);
@@ -650,7 +648,7 @@
return FALSE;
}
- out_tex = *(guint *) out_frame.data[0];
+ out_tex = (GstGLMemory *) out_frame.map[0].memory;
if (!gst_aggregator_iterate_sinkpads (GST_AGGREGATOR (mix),
(GstAggregatorPadForeachFunc) _upload_frames, NULL))
@@ -740,14 +738,13 @@
{
GstGLMixer *mix = GST_GL_MIXER (agg);
GstGLMixerClass *mixer_class = GST_GL_MIXER_GET_CLASS (mix);
- GstGLContext *context = GST_GL_BASE_MIXER (mix)->context;
if (mixer_class->reset)
mixer_class->reset (mix);
+
if (mix->fbo) {
- gst_gl_context_del_fbo (context, mix->fbo, mix->depthbuffer);
- mix->fbo = 0;
- mix->depthbuffer = 0;
+ gst_object_unref (mix->fbo);
+ mix->fbo = NULL;
}
gst_gl_mixer_reset (mix);
diff --git a/ext/gl/gstglmixer.h b/ext/gl/gstglmixer.h
index 81976a7..309f6bb 100644
--- a/ext/gl/gstglmixer.h
+++ b/ext/gl/gstglmixer.h
@@ -78,14 +78,13 @@
GstCaps* outcaps);
typedef void (*GstGLMixerReset) (GstGLMixer *mixer);
typedef gboolean (*GstGLMixerProcessFunc) (GstGLMixer *mix, GstBuffer *outbuf);
-typedef gboolean (*GstGLMixerProcessTextures) (GstGLMixer *mix, guint out_tex);
+typedef gboolean (*GstGLMixerProcessTextures) (GstGLMixer *mix, GstGLMemory *out_tex);
struct _GstGLMixer
{
GstGLBaseMixer vaggregator;
- GLuint fbo;
- GLuint depthbuffer;
+ GstGLFramebuffer *fbo;
GstCaps *out_caps;
diff --git a/ext/gl/gstglmixerbin.c b/ext/gl/gstglmixerbin.c
index 6f83f82..1e6ebeb 100644
--- a/ext/gl/gstglmixerbin.c
+++ b/ext/gl/gstglmixerbin.c
@@ -31,6 +31,36 @@
GST_DEBUG_CATEGORY (gst_gl_mixer_bin_debug);
#define DEFAULT_LATENCY 0
+#define DEFAULT_START_TIME_SELECTION 0
+#define DEFAULT_START_TIME (-1)
+
+typedef enum
+{
+ GST_GL_MIXER_BIN_START_TIME_SELECTION_ZERO,
+ GST_GL_MIXER_BIN_START_TIME_SELECTION_FIRST,
+ GST_GL_MIXER_BIN_START_TIME_SELECTION_SET
+} GstGLMixerBinStartTimeSelection;
+
+static GType
+gst_gl_mixer_bin_start_time_selection_get_type (void)
+{
+ static GType gtype = 0;
+
+ if (gtype == 0) {
+ static const GEnumValue values[] = {
+ {GST_GL_MIXER_BIN_START_TIME_SELECTION_ZERO,
+ "Start at 0 running time (default)", "zero"},
+ {GST_GL_MIXER_BIN_START_TIME_SELECTION_FIRST,
+ "Start at first observed input running time", "first"},
+ {GST_GL_MIXER_BIN_START_TIME_SELECTION_SET,
+ "Set start time with start-time property", "set"},
+ {0, NULL, NULL}
+ };
+
+ gtype = g_enum_register_static ("GstGLMixerBinStartTimeSelection", values);
+ }
+ return gtype;
+}
struct input_chain
{
@@ -82,6 +112,8 @@
PROP_0,
PROP_MIXER,
PROP_LATENCY,
+ PROP_START_TIME_SELECTION,
+ PROP_START_TIME,
};
enum
@@ -156,6 +188,19 @@
(G_MAXLONG == G_MAXINT64) ? G_MAXINT64 : (G_MAXLONG * GST_SECOND - 1),
DEFAULT_LATENCY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_START_TIME_SELECTION,
+ g_param_spec_enum ("start-time-selection", "Start Time Selection",
+ "Decides which start time is output",
+ gst_gl_mixer_bin_start_time_selection_get_type (),
+ DEFAULT_START_TIME_SELECTION,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_START_TIME,
+ g_param_spec_uint64 ("start-time", "Start Time",
+ "Start time to use if start-time-selection=set", 0,
+ G_MAXUINT64,
+ DEFAULT_START_TIME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
/**
* GstMixerBin::create-element:
* @object: the #GstGLMixerBin
@@ -169,8 +214,7 @@
G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_generic,
GST_TYPE_ELEMENT, 0);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
upload_caps = gst_gl_upload_get_input_template_caps ();
gst_element_class_add_pad_template (element_class,
diff --git a/ext/gl/gstglmosaic.c b/ext/gl/gstglmosaic.c
index bcf3833..41441b0 100644
--- a/ext/gl/gstglmosaic.c
+++ b/ext/gl/gstglmosaic.c
@@ -70,8 +70,8 @@
GstCaps * outcaps);
static gboolean gst_gl_mosaic_process_textures (GstGLMixer * mixer,
- guint out_tex);
-static void gst_gl_mosaic_callback (gpointer stuff);
+ GstGLMemory * out_tex);
+static gboolean gst_gl_mosaic_callback (gpointer stuff);
//vertex source
static const gchar *mosaic_v_src =
@@ -193,22 +193,31 @@
mosaic_v_src, mosaic_f_src, &mosaic->shader);
}
+static void
+_mosaic_render (GstGLContext * context, GstGLMosaic * mosaic)
+{
+ GstGLMixer *mixer = GST_GL_MIXER (mosaic);
+
+ gst_gl_framebuffer_draw_to_texture (mixer->fbo, mosaic->out_tex,
+ gst_gl_mosaic_callback, mosaic);
+}
+
static gboolean
-gst_gl_mosaic_process_textures (GstGLMixer * mix, guint out_tex)
+gst_gl_mosaic_process_textures (GstGLMixer * mix, GstGLMemory * out_tex)
{
GstGLMosaic *mosaic = GST_GL_MOSAIC (mix);
+ GstGLContext *context = GST_GL_BASE_MIXER (mix)->context;
- //blocking call, use a FBO
- gst_gl_context_use_fbo_v2 (GST_GL_BASE_MIXER (mix)->context,
- GST_VIDEO_INFO_WIDTH (&GST_VIDEO_AGGREGATOR (mix)->info),
- GST_VIDEO_INFO_HEIGHT (&GST_VIDEO_AGGREGATOR (mix)->info), mix->fbo,
- mix->depthbuffer, out_tex, gst_gl_mosaic_callback, (gpointer) mosaic);
+ mosaic->out_tex = out_tex;
+
+ gst_gl_context_thread_add (context, (GstGLContextThreadFunc) _mosaic_render,
+ mosaic);
return TRUE;
}
/* opengl scene, params: input texture (not the output mixer->texture) */
-static void
+static gboolean
gst_gl_mosaic_callback (gpointer stuff)
{
GstGLMosaic *mosaic = GST_GL_MOSAIC (stuff);
@@ -344,4 +353,6 @@
xrot += 0.6f;
yrot += 0.4f;
zrot += 0.8f;
+
+ return TRUE;
}
diff --git a/ext/gl/gstglmosaic.h b/ext/gl/gstglmosaic.h
index e0b340c..40f5d6c 100644
--- a/ext/gl/gstglmosaic.h
+++ b/ext/gl/gstglmosaic.h
@@ -40,6 +40,7 @@
GstGLMixer mixer;
GstGLShader *shader;
+ GstGLMemory *out_tex;
};
struct _GstGLMosaicClass
diff --git a/ext/gl/gstgloverlay.c b/ext/gl/gstgloverlay.c
index fa6c6c1..e7b4c0a 100644
--- a/ext/gl/gstgloverlay.c
+++ b/ext/gl/gstgloverlay.c
@@ -72,7 +72,7 @@
static void gst_gl_overlay_before_transform (GstBaseTransform * trans,
GstBuffer * outbuf);
static gboolean gst_gl_overlay_filter_texture (GstGLFilter * filter,
- guint in_tex, guint out_tex);
+ GstGLMemory * in_tex, GstGLMemory * out_tex);
static gboolean gst_gl_overlay_load_png (GstGLOverlay * overlay, FILE * fp);
static gboolean gst_gl_overlay_load_jpeg (GstGLOverlay * overlay, FILE * fp);
@@ -372,29 +372,31 @@
static void
_unbind_buffer (GstGLOverlay * overlay)
{
+ GstGLFilter *filter = GST_GL_FILTER (overlay);
const GstGLFuncs *gl = GST_GL_BASE_FILTER (overlay)->context->gl_vtable;
gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0);
gl->BindBuffer (GL_ARRAY_BUFFER, 0);
- gl->DisableVertexAttribArray (overlay->attr_position);
- gl->DisableVertexAttribArray (overlay->attr_texture);
+ gl->DisableVertexAttribArray (filter->draw_attr_position_loc);
+ gl->DisableVertexAttribArray (filter->draw_attr_texture_loc);
}
static void
_bind_buffer (GstGLOverlay * overlay, GLuint vbo)
{
+ GstGLFilter *filter = GST_GL_FILTER (overlay);
const GstGLFuncs *gl = GST_GL_BASE_FILTER (overlay)->context->gl_vtable;
gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, overlay->vbo_indices);
gl->BindBuffer (GL_ARRAY_BUFFER, vbo);
- gl->EnableVertexAttribArray (overlay->attr_position);
- gl->EnableVertexAttribArray (overlay->attr_texture);
+ gl->EnableVertexAttribArray (filter->draw_attr_position_loc);
+ gl->EnableVertexAttribArray (filter->draw_attr_texture_loc);
- gl->VertexAttribPointer (overlay->attr_position, 3, GL_FLOAT,
+ gl->VertexAttribPointer (filter->draw_attr_position_loc, 3, GL_FLOAT,
GL_FALSE, 5 * sizeof (GLfloat), (void *) 0);
- gl->VertexAttribPointer (overlay->attr_texture, 2, GL_FLOAT,
+ gl->VertexAttribPointer (filter->draw_attr_texture_loc, 2, GL_FLOAT,
GL_FALSE, 5 * sizeof (GLfloat), (void *) (3 * sizeof (GLfloat)));
}
@@ -410,15 +412,16 @@
static const GLushort indices[] = { 0, 1, 2, 0, 2, 3, };
/* *INDENT-ON* */
-static void
-gst_gl_overlay_callback (gint width, gint height, guint texture, gpointer stuff)
+static gboolean
+gst_gl_overlay_callback (GstGLFilter * filter, GstGLMemory * in_tex,
+ gpointer stuff)
{
- GstGLOverlay *overlay = GST_GL_OVERLAY (stuff);
- GstGLFilter *filter = GST_GL_FILTER (overlay);
+ GstGLOverlay *overlay = GST_GL_OVERLAY (filter);
GstMapInfo map_info;
guint image_tex;
gboolean memory_mapped = FALSE;
const GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
+ gboolean ret = FALSE;
#if GST_GL_HAVE_OPENGL
if (gst_gl_context_get_gl_api (GST_GL_BASE_FILTER (filter)->context) &
@@ -430,49 +433,19 @@
#endif
gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
gst_gl_shader_use (overlay->shader);
gst_gl_shader_set_uniform_1f (overlay->shader, "alpha", 1.0f);
gst_gl_shader_set_uniform_1i (overlay->shader, "texture", 0);
- overlay->attr_position =
+ filter->draw_attr_position_loc =
gst_gl_shader_get_attribute_location (overlay->shader, "a_position");
- overlay->attr_texture =
+ filter->draw_attr_texture_loc =
gst_gl_shader_get_attribute_location (overlay->shader, "a_texcoord");
- if (!overlay->vbo) {
- if (gl->GenVertexArrays) {
- gl->GenVertexArrays (1, &overlay->vao);
- gl->BindVertexArray (overlay->vao);
- }
-
- gl->GenBuffers (1, &overlay->vbo);
- gl->BindBuffer (GL_ARRAY_BUFFER, overlay->vbo);
- gl->BufferData (GL_ARRAY_BUFFER, 4 * 5 * sizeof (GLfloat), v_vertices,
- GL_STATIC_DRAW);
-
- gl->GenBuffers (1, &overlay->vbo_indices);
- gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, overlay->vbo_indices);
- gl->BufferData (GL_ELEMENT_ARRAY_BUFFER, sizeof (indices), indices,
- GL_STATIC_DRAW);
-
- if (gl->GenVertexArrays) {
- _bind_buffer (overlay, overlay->vbo);
- gl->BindVertexArray (0);
- }
-
- gl->BindBuffer (GL_ARRAY_BUFFER, 0);
- gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0);
- }
-
- if (gl->GenVertexArrays)
- gl->BindVertexArray (overlay->vao);
- else
- _bind_buffer (overlay, overlay->vbo);
-
- gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
+ gst_gl_filter_draw_fullscreen_quad (filter);
if (!overlay->image_memory)
goto out;
@@ -490,6 +463,11 @@
gl->BindVertexArray (overlay->overlay_vao);
}
+ gl->GenBuffers (1, &overlay->vbo_indices);
+ gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, overlay->vbo_indices);
+ gl->BufferData (GL_ELEMENT_ARRAY_BUFFER, sizeof (indices), indices,
+ GL_STATIC_DRAW);
+
gl->GenBuffers (1, &overlay->overlay_vbo);
gl->BindBuffer (GL_ARRAY_BUFFER, overlay->overlay_vbo);
gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, overlay->vbo_indices);
@@ -553,6 +531,7 @@
gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
gl->Disable (GL_BLEND);
+ ret = TRUE;
out:
if (gl->GenVertexArrays) {
@@ -567,6 +546,8 @@
gst_memory_unmap ((GstMemory *) overlay->image_memory, &map_info);
overlay->geometry_change = FALSE;
+
+ return ret;
}
static gboolean
@@ -624,8 +605,8 @@
}
static gboolean
-gst_gl_overlay_filter_texture (GstGLFilter * filter, guint in_tex,
- guint out_tex)
+gst_gl_overlay_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex,
+ GstGLMemory * out_tex)
{
GstGLOverlay *overlay = GST_GL_OVERLAY (filter);
@@ -641,7 +622,7 @@
overlay->location_has_changed = FALSE;
}
- gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
+ gst_gl_filter_render_to_target (filter, in_tex, out_tex,
gst_gl_overlay_callback, overlay);
return TRUE;
@@ -702,7 +683,8 @@
(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);
+ NULL, &v_info, 0, &v_align, GST_GL_TEXTURE_TARGET_2D,
+ GST_VIDEO_GL_TEXTURE_TYPE_RGBA);
overlay->image_memory = (GstGLMemory *)
gst_gl_base_memory_alloc (mem_allocator,
(GstGLAllocationParams *) params);
@@ -817,7 +799,8 @@
(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);
+ NULL, &v_info, 0, NULL, GST_GL_TEXTURE_TARGET_2D,
+ GST_VIDEO_GL_TEXTURE_TYPE_RGBA);
overlay->image_memory = (GstGLMemory *)
gst_gl_base_memory_alloc (mem_allocator,
(GstGLAllocationParams *) params);
diff --git a/ext/gl/gstglsrcbin.c b/ext/gl/gstglsrcbin.c
index 9eb66d3..da74aaa 100644
--- a/ext/gl/gstglsrcbin.c
+++ b/ext/gl/gstglsrcbin.c
@@ -102,8 +102,8 @@
"Infrastructure to process GL textures",
"Matthew Waters <matthew@centricular.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_gl_src_bin_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_gl_src_bin_template);
}
static void
diff --git a/ext/gl/gstglstereomix.c b/ext/gl/gstglstereomix.c
index 989d7f6..18e7111 100644
--- a/ext/gl/gstglstereomix.c
+++ b/ext/gl/gstglstereomix.c
@@ -21,6 +21,42 @@
* Boston, MA 02110-1301, USA.
*/
+/**
+ * SECTION:element-glstereomix
+ *
+ * Combine 2 input streams to produce a stereoscopic output
+ * stream. Input views are taken from the left pad and right pad
+ * respectively, and mixed according to their timelines.
+ *
+ * If either input stream is stereoscopic, the approproriate view
+ * (left or right) is taken from each stream and placed into the output.
+ *
+ * The multiview representation on the output is chosen according to
+ * the downstream caps.
+ *
+ * <refsect2>
+ * <title>Examples</title>
+ * |[
+ * gst-launch-1.0 -v videotestsrc pattern=ball name=left \
+ * videotestsrc name=right glstereomix name=mix \
+ * left. ! vid/x-raw,width=640,height=480! glupload ! mix. \
+ * right. ! video/x-raw,width=640,height=480! glupload ! mix. \
+ * mix. ! video/x-raw'(memory:GLMemory)',multiview-mode=side-by-side ! \
+ * queue ! glimagesink output-multiview-mode=side-by-side
+ * ]| Mix 2 different videotestsrc patterns into a side-by-side stereo image and display it.
+ * |[
+ * gst-launch-1.0 -ev v4l2src name=left \
+ * videotestsrc name=right \
+ * glstereomix name=mix \
+ * left. ! video/x-raw,width=640,height=480 ! glupload ! glcolorconvert ! mix. \
+ * right. ! video/x-raw,width=640,height=480 ! glupload ! mix. \
+ * mix. ! video/x-raw'(memory:GLMemory)',multiview-mode=top-bottom ! \
+ * glcolorconvert ! gldownload ! queue ! x264enc ! h264parse ! \
+ * mp4mux ! progressreport ! filesink location=output.mp4
+ * ]| Mix the input from a camera to the left view, and videotestsrc to the right view,
+ * and encode as a top-bottom frame packed H.264 video.
+ * </refsect2>
+ */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
@@ -106,11 +142,6 @@
static gboolean gst_gl_stereo_mix_src_query (GstAggregator * agg,
GstQuery * query);
-static void
-gst_gl_stereo_mix_find_best_format (GstVideoAggregator * vagg,
- GstCaps * downstream_caps, GstVideoInfo * best_info,
- gboolean * at_least_one_alpha);
-
static void gst_gl_stereo_mix_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_gl_stereo_mix_get_property (GObject * object, guint prop_id,
@@ -150,10 +181,8 @@
GST_TYPE_GL_STEREO_DOWNMIX_MODE_TYPE, DEFAULT_DOWNMIX,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
agg_class->sinkpads_type = GST_TYPE_GL_STEREO_MIX_PAD;
agg_class->stop = gst_gl_stereo_mix_stop;
@@ -165,7 +194,6 @@
videoaggregator_class->negotiated_caps = _negotiated_caps;
videoaggregator_class->get_output_buffer =
gst_gl_stereo_mix_get_output_buffer;
- videoaggregator_class->find_best_format = gst_gl_stereo_mix_find_best_format;
base_mix_class->supported_gl_api =
GST_GL_API_GLES2 | GST_GL_API_OPENGL | GST_GL_API_OPENGL3;
@@ -440,13 +468,97 @@
return result;
}
-/* Return the possible output caps we decided in find_best_format() */
+/* Return the possible output caps based on inputs and downstream prefs */
static GstCaps *
_update_caps (GstVideoAggregator * vagg, GstCaps * caps, GstCaps * filter)
{
GstGLStereoMix *mix = GST_GL_STEREO_MIX (vagg);
+ GList *l;
+ gint best_width = -1, best_height = -1;
+ gdouble best_fps = -1, cur_fps;
+ gint best_fps_n = 0, best_fps_d = 1;
+ GstVideoInfo *mix_info;
+ GstCaps *blend_caps, *tmp_caps;
+ GstCaps *out_caps;
- return gst_caps_ref (mix->out_caps);
+ GST_OBJECT_LOCK (vagg);
+
+ for (l = GST_ELEMENT (vagg)->sinkpads; l; l = l->next) {
+ GstVideoAggregatorPad *pad = l->data;
+ GstVideoInfo tmp = pad->info;
+ gint this_width, this_height;
+ gint fps_n, fps_d;
+
+ if (!pad->info.finfo)
+ continue;
+
+ /* This can happen if we release a pad and another pad hasn't been negotiated_caps yet */
+ if (GST_VIDEO_INFO_FORMAT (&pad->info) == GST_VIDEO_FORMAT_UNKNOWN)
+ continue;
+
+ /* Convert to per-view width/height for unpacked forms */
+ gst_video_multiview_video_info_change_mode (&tmp,
+ GST_VIDEO_MULTIVIEW_MODE_SEPARATED, GST_VIDEO_MULTIVIEW_FLAGS_NONE);
+
+ this_width = GST_VIDEO_INFO_WIDTH (&tmp);
+ this_height = GST_VIDEO_INFO_HEIGHT (&tmp);
+ fps_n = GST_VIDEO_INFO_FPS_N (&tmp);
+ fps_d = GST_VIDEO_INFO_FPS_D (&tmp);
+
+ GST_INFO_OBJECT (vagg, "Input pad %" GST_PTR_FORMAT
+ " w %u h %u", pad, this_width, this_height);
+
+ if (this_width == 0 || this_height == 0)
+ continue;
+
+ if (best_width < this_width)
+ best_width = this_width;
+ if (best_height < this_height)
+ best_height = this_height;
+
+ if (fps_d == 0)
+ cur_fps = 0.0;
+ else
+ gst_util_fraction_to_double (fps_n, fps_d, &cur_fps);
+
+ if (best_fps < cur_fps) {
+ best_fps = cur_fps;
+ best_fps_n = fps_n;
+ best_fps_d = fps_d;
+ }
+
+ /* FIXME: Preserve PAR for at least one input when different sized inputs */
+ }
+ GST_OBJECT_UNLOCK (vagg);
+
+ mix_info = &mix->mix_info;
+ gst_video_info_set_format (mix_info, GST_VIDEO_FORMAT_RGBA, best_width,
+ best_height);
+
+ GST_VIDEO_INFO_FPS_N (mix_info) = best_fps_n;
+ GST_VIDEO_INFO_FPS_D (mix_info) = best_fps_d;
+
+ GST_VIDEO_INFO_MULTIVIEW_MODE (mix_info) = GST_VIDEO_MULTIVIEW_MODE_SEPARATED;
+ GST_VIDEO_INFO_VIEWS (mix_info) = 2;
+
+ /* FIXME: If input is marked as flipped or flopped, preserve those flags */
+ GST_VIDEO_INFO_MULTIVIEW_FLAGS (mix_info) = GST_VIDEO_MULTIVIEW_FLAGS_NONE;
+
+ /* Choose our output format based on downstream preferences */
+ blend_caps = gst_video_info_to_caps (mix_info);
+
+ gst_caps_set_features (blend_caps, 0,
+ gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_GL_MEMORY));
+
+ tmp_caps = get_converted_caps (GST_GL_STEREO_MIX (vagg), blend_caps);
+ gst_caps_unref (blend_caps);
+
+ out_caps = gst_caps_intersect (caps, tmp_caps);
+ gst_caps_unref (tmp_caps);
+
+ GST_DEBUG_OBJECT (vagg, "Possible output caps %" GST_PTR_FORMAT, out_caps);
+
+ return out_caps;
}
/* Called after videoaggregator fixates our caps */
@@ -464,8 +576,6 @@
return FALSE;
/* Update the glview_convert output */
- if (!gst_video_info_from_caps (&mix->out_info, caps))
- return FALSE;
/* We can configure the view_converter now */
gst_gl_view_convert_set_context (mix->viewconvert,
@@ -587,108 +697,3 @@
return TRUE;
}
-
-/* Iterate the input sink pads, and choose the blend format
- * we will generate before output conversion, which is RGBA
- * at some suitable size */
-static void
-gst_gl_stereo_mix_find_best_format (GstVideoAggregator * vagg,
- GstCaps * downstream_caps, GstVideoInfo * best_info,
- gboolean * at_least_one_alpha)
-{
- GstGLStereoMix *mix = GST_GL_STEREO_MIX (vagg);
- GList *l;
- gint best_width = -1, best_height = -1;
- gdouble best_fps = -1, cur_fps;
- gint best_fps_n = 0, best_fps_d = 1;
- GstVideoInfo *mix_info;
- GstCaps *blend_caps, *tmp_caps;
-
- /* We'll deal with alpha internally, so just tell aggregator to
- * be quiet */
- *at_least_one_alpha = FALSE;
-
- GST_OBJECT_LOCK (vagg);
-
- for (l = GST_ELEMENT (vagg)->sinkpads; l; l = l->next) {
- GstVideoAggregatorPad *pad = l->data;
- GstVideoInfo tmp = pad->info;
- gint this_width, this_height;
- gint fps_n, fps_d;
-
- if (!pad->info.finfo)
- continue;
-
- /* This can happen if we release a pad and another pad hasn't been negotiated_caps yet */
- if (GST_VIDEO_INFO_FORMAT (&pad->info) == GST_VIDEO_FORMAT_UNKNOWN)
- continue;
-
- /* Convert to per-view width/height for unpacked forms */
- gst_video_multiview_video_info_change_mode (&tmp,
- GST_VIDEO_MULTIVIEW_MODE_SEPARATED, GST_VIDEO_MULTIVIEW_FLAGS_NONE);
-
- this_width = GST_VIDEO_INFO_WIDTH (&tmp);
- this_height = GST_VIDEO_INFO_HEIGHT (&tmp);
- fps_n = GST_VIDEO_INFO_FPS_N (&tmp);
- fps_d = GST_VIDEO_INFO_FPS_D (&tmp);
-
- GST_INFO_OBJECT (vagg, "Input pad %" GST_PTR_FORMAT
- " w %u h %u", pad, this_width, this_height);
-
- if (this_width == 0 || this_height == 0)
- continue;
-
- if (best_width < this_width)
- best_width = this_width;
- if (best_height < this_height)
- best_height = this_height;
-
- if (fps_d == 0)
- cur_fps = 0.0;
- else
- gst_util_fraction_to_double (fps_n, fps_d, &cur_fps);
-
- if (best_fps < cur_fps) {
- best_fps = cur_fps;
- best_fps_n = fps_n;
- best_fps_d = fps_d;
- }
-
- /* FIXME: Preserve PAR for at least one input when different sized inputs */
- }
- GST_OBJECT_UNLOCK (vagg);
-
- mix_info = &mix->mix_info;
- gst_video_info_set_format (mix_info, GST_VIDEO_FORMAT_RGBA, best_width,
- best_height);
-
- GST_VIDEO_INFO_FPS_N (mix_info) = best_fps_n;
- GST_VIDEO_INFO_FPS_D (mix_info) = best_fps_d;
-
- GST_VIDEO_INFO_MULTIVIEW_MODE (mix_info) = GST_VIDEO_MULTIVIEW_MODE_SEPARATED;
- GST_VIDEO_INFO_VIEWS (mix_info) = 2;
-
- /* FIXME: If input is marked as flipped or flopped, preserve those flags */
- GST_VIDEO_INFO_MULTIVIEW_FLAGS (mix_info) = GST_VIDEO_MULTIVIEW_FLAGS_NONE;
-
- /* Choose our output format based on downstream preferences */
- blend_caps = gst_video_info_to_caps (mix_info);
-
- gst_caps_set_features (blend_caps, 0,
- gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_GL_MEMORY));
-
- tmp_caps = get_converted_caps (GST_GL_STEREO_MIX (vagg), blend_caps);
- gst_caps_unref (blend_caps);
-
- if (mix->out_caps)
- gst_caps_unref (mix->out_caps);
-
- mix->out_caps = gst_caps_intersect (downstream_caps, tmp_caps);
- gst_caps_unref (tmp_caps);
-
- GST_DEBUG_OBJECT (vagg, "Possible output caps %" GST_PTR_FORMAT,
- mix->out_caps);
- /* Tell videoaggregator our preferred size. Actual info gets
- * overridden during caps nego */
- *best_info = *mix_info;
-}
diff --git a/ext/gl/gstglstereomix.h b/ext/gl/gstglstereomix.h
index b0f1bd2..9971a89 100644
--- a/ext/gl/gstglstereomix.h
+++ b/ext/gl/gstglstereomix.h
@@ -69,9 +69,6 @@
GstGLViewConvert *viewconvert;
GstGLStereoDownmix downmix_mode;
- GstCaps *out_caps;
- GstVideoInfo out_info;
-
GstVideoInfo mix_info;
GPtrArray *input_frames;
diff --git a/ext/gl/gstglstereosplit.c b/ext/gl/gstglstereosplit.c
index eba713c..1eaa440 100644
--- a/ext/gl/gstglstereosplit.c
+++ b/ext/gl/gstglstereosplit.c
@@ -38,10 +38,6 @@
#include "gstglstereosplit.h"
-#if GST_GL_HAVE_PLATFORM_EGL
-#include <gst/gl/egl/gsteglimagememory.h>
-#endif
-
#define GST_CAT_DEFAULT gst_gl_stereosplit_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
@@ -55,53 +51,21 @@
static GstStaticPadTemplate sink_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") "; "
-#if GST_GL_HAVE_PLATFORM_EGL
- GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_EGL_IMAGE,
- "RGBA") "; "
-#endif
- GST_VIDEO_CAPS_MAKE_WITH_FEATURES
- (GST_CAPS_FEATURE_META_GST_VIDEO_GL_TEXTURE_UPLOAD_META, "RGBA") "; "
- GST_VIDEO_CAPS_MAKE (GST_GL_COLOR_CONVERT_FORMATS)
- )
+ (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, "RGBA"))
);
static GstStaticPadTemplate src_left_template = GST_STATIC_PAD_TEMPLATE ("left",
GST_PAD_SRC, GST_PAD_ALWAYS,
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
- (GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
- "RGBA")
-#if 0
- "; "
-#if GST_GL_HAVE_PLATFORM_EGL
- GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_EGL_IMAGE,
- "RGBA") "; "
-#endif
- GST_VIDEO_CAPS_MAKE_WITH_FEATURES
- (GST_CAPS_FEATURE_META_GST_VIDEO_GL_TEXTURE_UPLOAD_META, "RGBA") "; "
- GST_VIDEO_CAPS_MAKE (GST_GL_COLOR_CONVERT_FORMATS)
-#endif
- )
+ (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, "RGBA"))
);
static GstStaticPadTemplate src_right_template =
- GST_STATIC_PAD_TEMPLATE ("right",
+GST_STATIC_PAD_TEMPLATE ("right",
GST_PAD_SRC, GST_PAD_ALWAYS,
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
(GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
- "RGBA")
-#if 0
- "; "
-#if GST_GL_HAVE_PLATFORM_EGL
- GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_EGL_IMAGE,
- "RGBA") "; "
-#endif
- GST_VIDEO_CAPS_MAKE_WITH_FEATURES
- (GST_CAPS_FEATURE_META_GST_VIDEO_GL_TEXTURE_UPLOAD_META, "RGBA") "; "
- GST_VIDEO_CAPS_MAKE (GST_GL_COLOR_CONVERT_FORMATS)
-#endif
- )
+ "RGBA"))
);
static void stereosplit_reset (GstGLStereoSplit * self);
@@ -139,12 +103,10 @@
element_class->change_state = stereosplit_change_state;
element_class->set_context = stereosplit_set_context;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_left_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_right_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
+ gst_element_class_add_static_pad_template (element_class, &src_left_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &src_right_template);
}
static void
@@ -179,10 +141,6 @@
static void
stereosplit_reset (GstGLStereoSplit * self)
{
- if (self->upload)
- gst_object_replace ((GstObject **) & self->upload, NULL);
- if (self->convert)
- gst_object_replace ((GstObject **) & self->convert, NULL);
if (self->context)
gst_object_replace ((GstObject **) & self->context, NULL);
if (self->display)
@@ -269,37 +227,9 @@
if (!ensure_context (self))
return NULL;
- if (direction == GST_PAD_SINK) {
- next_caps =
- gst_gl_upload_transform_caps (self->context, direction, caps, filter);
- caps = next_caps;
-
- next_caps =
- gst_gl_color_convert_transform_caps (self->context, direction, caps,
- NULL);
- gst_caps_unref (caps);
- caps = next_caps;
-
- next_caps =
- gst_gl_view_convert_transform_caps (self->viewconvert, direction, caps,
- NULL);
- gst_caps_unref (caps);
- } else {
- next_caps =
- gst_gl_view_convert_transform_caps (self->viewconvert, direction, caps,
- filter);
- caps = next_caps;
-
- next_caps =
- gst_gl_color_convert_transform_caps (self->context, direction, caps,
- NULL);
- gst_caps_unref (caps);
- caps = next_caps;
-
- next_caps =
- gst_gl_upload_transform_caps (self->context, direction, caps, NULL);
- gst_caps_unref (caps);
- }
+ next_caps =
+ gst_gl_view_convert_transform_caps (self->viewconvert, direction, caps,
+ NULL);
return next_caps;
}
@@ -453,6 +383,18 @@
goto fail;
}
+ gst_gl_view_convert_set_context (split->viewconvert, split->context);
+
+ tridcaps = gst_caps_make_writable (tridcaps);
+ gst_caps_set_simple (tridcaps, "multiview-mode", G_TYPE_STRING,
+ "separated", "views", G_TYPE_INT, 2, NULL);
+ tridcaps = gst_caps_fixate (tridcaps);
+
+ if (!gst_gl_view_convert_set_caps (split->viewconvert, sinkcaps, tridcaps)) {
+ GST_ERROR_OBJECT (split, "Failed to set caps on converter");
+ goto fail;
+ }
+
/* FIXME: Provide left and right caps to do_bufferpool */
stereosplit_do_bufferpool (split, left);
@@ -508,51 +450,6 @@
return FALSE;
}
-static void
-_init_upload (GstGLStereoSplit * split)
-{
- GstGLContext *context = split->context;
-
- if (!split->upload) {
- GstCaps *in_caps = gst_pad_get_current_caps (GST_PAD (split->sink_pad));
- GstCaps *split_caps = gst_pad_get_current_caps (split->left_pad);
- GstCaps *upload_caps = gst_caps_copy (in_caps);
- GstCapsFeatures *gl_features =
- gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_GL_MEMORY);
- GstCaps *gl_caps;
-
- split->upload = gst_gl_upload_new (context);
-
- gst_caps_set_features (upload_caps, 0,
- gst_caps_features_copy (gl_features));
- gst_gl_upload_set_caps (split->upload, in_caps, upload_caps);
- gst_caps_unref (in_caps);
-
- gl_caps = gst_caps_copy (upload_caps);
- gst_caps_set_simple (gl_caps, "format", G_TYPE_STRING, "RGBA", NULL);
- gst_caps_set_features (gl_caps, 0, gst_caps_features_copy (gl_features));
-
- if (!split->convert) {
- split->convert = gst_gl_color_convert_new (context);
- gst_gl_color_convert_set_caps (split->convert, upload_caps, gl_caps);
- }
-
- gst_caps_unref (upload_caps);
- gst_caps_features_free (gl_features);
-
- gst_gl_view_convert_set_context (split->viewconvert, split->context);
-
- split_caps = gst_caps_make_writable (split_caps);
- gst_caps_set_simple (split_caps, "multiview-mode", G_TYPE_STRING,
- "separated", "views", G_TYPE_INT, 2, NULL);
-
- gst_gl_view_convert_set_caps (split->viewconvert, gl_caps, split_caps);
-
- gst_caps_unref (split_caps);
- gst_caps_unref (gl_caps);
- }
-}
-
static gboolean
ensure_context (GstGLStereoSplit * self)
{
@@ -619,10 +516,6 @@
{
if (!ensure_context (self))
return FALSE;
- if (self->upload)
- gst_object_replace ((GstObject **) & self->upload, NULL);
- if (self->convert)
- gst_object_replace ((GstObject **) & self->convert, NULL);
return TRUE;
@@ -635,10 +528,6 @@
if (!gst_gl_ensure_element_data (self, &self->display, &self->other_context))
return FALSE;
- _init_upload (self);
-
- gst_gl_upload_propose_allocation (self->upload, NULL, query);
-
return TRUE;
}
@@ -666,39 +555,17 @@
static GstFlowReturn
stereosplit_chain (GstPad * pad, GstGLStereoSplit * split, GstBuffer * buf)
{
- GstBuffer *uploaded_buffer, *converted_buffer, *left, *right;
+ GstBuffer *left, *right;
GstBuffer *split_buffer = NULL;
GstFlowReturn ret;
gint i, n_planes;
- if (!split->upload)
- _init_upload (split);
-
n_planes = GST_VIDEO_INFO_N_PLANES (&split->viewconvert->out_info);
GST_LOG_OBJECT (split, "chaining buffer %" GST_PTR_FORMAT, buf);
- if (GST_GL_UPLOAD_DONE != gst_gl_upload_perform_with_buffer (split->upload,
- buf, &uploaded_buffer)) {
- gst_buffer_unref (buf);
- GST_ELEMENT_ERROR (split, RESOURCE, NOT_FOUND, ("%s",
- "Failed to upload buffer"), (NULL));
- return GST_FLOW_ERROR;
- }
- gst_buffer_unref (buf);
-
- if (!(converted_buffer =
- gst_gl_color_convert_perform (split->convert, uploaded_buffer))) {
- GST_ELEMENT_ERROR (split, RESOURCE, NOT_FOUND, ("%s",
- "Failed to convert buffer"), (NULL));
- gst_buffer_unref (uploaded_buffer);
- return GST_FLOW_ERROR;
- }
- gst_buffer_unref (uploaded_buffer);
-
if (gst_gl_view_convert_submit_input_buffer (split->viewconvert,
- GST_BUFFER_IS_DISCONT (converted_buffer),
- converted_buffer) != GST_FLOW_OK) {
+ GST_BUFFER_IS_DISCONT (buf), buf) != GST_FLOW_OK) {
GST_ELEMENT_ERROR (split, RESOURCE, NOT_FOUND, ("%s",
"Failed to 3d convert buffer"),
("Could not get submit input buffer"));
diff --git a/ext/gl/gstglstereosplit.h b/ext/gl/gstglstereosplit.h
index 5a1e3c6..279bd26 100644
--- a/ext/gl/gstglstereosplit.h
+++ b/ext/gl/gstglstereosplit.h
@@ -49,8 +49,6 @@
GstGLContext *context;
GstGLContext *other_context;
- GstGLUpload *upload;
- GstGLColorConvert *convert;
GstGLViewConvert *viewconvert;
};
diff --git a/ext/gl/gstgltestsrc.c b/ext/gl/gstgltestsrc.c
index 95c7321..62d231f 100644
--- a/ext/gl/gstgltestsrc.c
+++ b/ext/gl/gstgltestsrc.c
@@ -49,7 +49,7 @@
#include <gst/gst-i18n-plugin.h>
#define USE_PEER_BUFFERALLOC
-#define SUPPORTED_GL_APIS GST_GL_API_OPENGL
+#define SUPPORTED_GL_APIS (GST_GL_API_OPENGL | GST_GL_API_OPENGL3 | GST_GL_API_GLES2)
GST_DEBUG_CATEGORY_STATIC (gl_test_src_debug);
#define GST_CAT_DEFAULT gl_test_src_debug
@@ -107,7 +107,7 @@
static gboolean gst_gl_test_src_decide_allocation (GstBaseSrc * basesrc,
GstQuery * query);
-static void gst_gl_test_src_callback (gpointer stuff);
+static gboolean gst_gl_test_src_callback (gpointer stuff);
static gboolean gst_gl_test_src_init_shader (GstGLTestSrc * gltestsrc);
@@ -178,8 +178,7 @@
"Source/Video", "Creates a test video stream",
"David A. Schleef <ds@schleef.org>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
element_class->set_context = gst_gl_test_src_set_context;
element_class->change_state = gst_gl_test_src_change_state;
@@ -229,162 +228,10 @@
return caps;
}
-const gchar *snow_vertex_src = "attribute vec4 position; \
- attribute vec2 uv; \
- uniform mat4 mvp; \
- varying vec2 out_uv; \
- void main() \
- { \
- gl_Position = mvp * position; \
- out_uv = uv; \
- }";
-
-const gchar *snow_fragment_src = "uniform float time; \
- varying vec2 out_uv; \
- \
- float rand(vec2 co){ \
- return fract(sin(dot(co.xy, vec2(12.9898,78.233))) * 43758.5453); \
- } \
- void main() \
- { \
- gl_FragColor = rand(time * out_uv) * vec4(1); \
- }";
-
-const gchar *mandelbrot_vertex_src = "attribute vec4 position; \
- attribute vec2 uv; \
- uniform mat4 mvp; \
- uniform float aspect_ratio; \
- varying vec2 fractal_position; \
- \
- void main() \
- { \
- gl_Position = mvp * position; \
- fractal_position = vec2(uv.y - 0.8, aspect_ratio * (uv.x - 0.5)); \
- fractal_position *= 2.5; \
- }";
-
-const gchar *mandelbrot_fragment_src = "uniform float time; \
- varying vec2 fractal_position; \
- \
- const vec4 K = vec4(1.0, 0.66, 0.33, 3.0); \
- \
- vec4 hsv_to_rgb(float hue, float saturation, float value) { \
- vec4 p = abs(fract(vec4(hue) + K) * 6.0 - K.wwww); \
- return value * mix(K.xxxx, clamp(p - K.xxxx, 0.0, 1.0), saturation); \
- } \
- \
- vec4 i_to_rgb(int i) { \
- float hue = float(i) / 100.0 + sin(time); \
- return hsv_to_rgb(hue, 0.5, 0.8); \
- } \
- \
- vec2 pow_2_complex(vec2 c) { \
- return vec2(c.x*c.x - c.y*c.y, 2.0 * c.x * c.y); \
- } \
- \
- vec2 mandelbrot(vec2 c, vec2 c0) { \
- return pow_2_complex(c) + c0; \
- } \
- \
- vec4 iterate_pixel(vec2 position) { \
- vec2 c = vec2(0); \
- for (int i=0; i < 100; i++) { \
- if (c.x*c.x + c.y*c.y > 2.0*2.0) \
- return i_to_rgb(i); \
- c = mandelbrot(c, position); \
- } \
- return vec4(0, 0, 0, 1); \
- } \
- \
- void main() { \
- gl_FragColor = iterate_pixel(fractal_position); \
- }";
-
-
-const gchar *checkers_vertex_src = "attribute vec4 position; \
- uniform mat4 mvp; \
- void main() \
- { \
- gl_Position = mvp * position; \
- }";
-
-const gchar *checkers_fragment_src = "uniform float checker_width; \
- void main() \
- { \
- vec2 xy_index= floor((gl_FragCoord.xy-vec2(0.5,0.5))/checker_width); \
- vec2 xy_mod=mod(xy_index,vec2(2.0,2.0)); \
- float result=mod(xy_mod.x+xy_mod.y,2.0); \
- gl_FragColor.r=step(result,0.5); \
- gl_FragColor.g=1.0-gl_FragColor.r; \
- gl_FragColor.ba=vec2(0,1); \
- }";
-
-
static void
gst_gl_test_src_set_pattern (GstGLTestSrc * gltestsrc, gint pattern_type)
{
- gltestsrc->pattern_type = pattern_type;
-
- GST_DEBUG_OBJECT (gltestsrc, "setting pattern to %d", pattern_type);
-
- switch (pattern_type) {
- case GST_GL_TEST_SRC_SMPTE:
- gltestsrc->make_image = gst_gl_test_src_smpte;
- break;
- case GST_GL_TEST_SRC_SNOW:
- gltestsrc->vertex_src = snow_vertex_src;
- gltestsrc->fragment_src = snow_fragment_src;
- gltestsrc->make_image = gst_gl_test_src_shader;
- break;
- case GST_GL_TEST_SRC_BLACK:
- gltestsrc->make_image = gst_gl_test_src_black;
- break;
- case GST_GL_TEST_SRC_WHITE:
- gltestsrc->make_image = gst_gl_test_src_white;
- break;
- case GST_GL_TEST_SRC_RED:
- gltestsrc->make_image = gst_gl_test_src_red;
- break;
- case GST_GL_TEST_SRC_GREEN:
- gltestsrc->make_image = gst_gl_test_src_green;
- break;
- case GST_GL_TEST_SRC_BLUE:
- gltestsrc->make_image = gst_gl_test_src_blue;
- break;
- case GST_GL_TEST_SRC_CHECKERS1:
- gltestsrc->vertex_src = checkers_vertex_src;
- gltestsrc->fragment_src = checkers_fragment_src;
- gltestsrc->make_image = gst_gl_test_src_checkers1;
- break;
- case GST_GL_TEST_SRC_CHECKERS2:
- gltestsrc->vertex_src = checkers_vertex_src;
- gltestsrc->fragment_src = checkers_fragment_src;
- gltestsrc->make_image = gst_gl_test_src_checkers2;
- break;
- case GST_GL_TEST_SRC_CHECKERS4:
- gltestsrc->vertex_src = checkers_vertex_src;
- gltestsrc->fragment_src = checkers_fragment_src;
- gltestsrc->make_image = gst_gl_test_src_checkers4;
- break;
- case GST_GL_TEST_SRC_CHECKERS8:
- gltestsrc->vertex_src = checkers_vertex_src;
- gltestsrc->fragment_src = checkers_fragment_src;
- gltestsrc->make_image = gst_gl_test_src_checkers8;
- break;
- case GST_GL_TEST_SRC_CIRCULAR:
- gltestsrc->make_image = gst_gl_test_src_circular;
- break;
- case GST_GL_TEST_SRC_BLINK:
- gltestsrc->make_image = gst_gl_test_src_black;
- break;
- case GST_GL_TEST_SRC_MANDELBROT:
- gltestsrc->vertex_src = mandelbrot_vertex_src;
- gltestsrc->fragment_src = mandelbrot_fragment_src;
- gltestsrc->make_image = gst_gl_test_src_shader;
- break;
- default:
- g_assert_not_reached ();
- }
+ gltestsrc->set_pattern = pattern_type;
}
static void
@@ -416,7 +263,7 @@
switch (prop_id) {
case PROP_PATTERN:
- g_value_set_enum (value, src->pattern_type);
+ g_value_set_enum (value, src->set_pattern);
break;
case PROP_TIMESTAMP_OFFSET:
g_value_set_int64 (value, src->timestamp_offset);
@@ -599,58 +446,53 @@
{
if (gst_gl_context_get_gl_api (gltestsrc->context)) {
/* blocking call, wait until the opengl thread has compiled the shader */
- if (gltestsrc->vertex_src == NULL)
- return FALSE;
- return gst_gl_context_gen_shader (gltestsrc->context, gltestsrc->vertex_src,
- gltestsrc->fragment_src, &gltestsrc->shader);
+// if (gltestsrc->vertex_src == NULL)
+// return FALSE;
+// return gst_gl_context_gen_shader (gltestsrc->context, gltestsrc->vertex_src,
+// gltestsrc->fragment_src, &gltestsrc->shader);
}
return TRUE;
}
+static void
+_fill_gl (GstGLContext * context, GstGLTestSrc * src)
+{
+ src->gl_result = gst_gl_framebuffer_draw_to_texture (src->fbo, src->out_tex,
+ gst_gl_test_src_callback, src);
+}
+
static GstFlowReturn
gst_gl_test_src_fill (GstPushSrc * psrc, GstBuffer * buffer)
{
GstGLTestSrc *src = GST_GL_TEST_SRC (psrc);
GstClockTime next_time;
- gint width, height;
GstVideoFrame out_frame;
GstGLSyncMeta *sync_meta;
- guint out_tex;
if (G_UNLIKELY (!src->negotiated || !src->context))
goto not_negotiated;
- width = GST_VIDEO_INFO_WIDTH (&src->out_info);
- height = GST_VIDEO_INFO_HEIGHT (&src->out_info);
-
/* 0 framerate and we are at the second frame, eos */
if (G_UNLIKELY (GST_VIDEO_INFO_FPS_N (&src->out_info) == 0
&& src->n_frames == 1))
goto eos;
- if (src->pattern_type == GST_GL_TEST_SRC_BLINK) {
- if (src->n_frames & 0x1)
- src->make_image = gst_gl_test_src_white;
- else
- src->make_image = gst_gl_test_src_black;
- }
-
if (!gst_video_frame_map (&out_frame, &src->out_info, buffer,
GST_MAP_WRITE | GST_MAP_GL)) {
return GST_FLOW_NOT_NEGOTIATED;
}
- out_tex = *(guint *) out_frame.data[0];
+ src->out_tex = (GstGLMemory *) out_frame.map[0].memory;
- gst_buffer_replace (&src->buffer, buffer);
-
- if (!gst_gl_context_use_fbo_v2 (src->context, width, height, src->fbo,
- src->depthbuffer, out_tex, gst_gl_test_src_callback,
- (gpointer) src)) {
- goto not_negotiated;
+ gst_gl_context_thread_add (src->context, (GstGLContextThreadFunc) _fill_gl,
+ src);
+ if (!src->gl_result) {
+ gst_video_frame_unmap (&out_frame);
+ goto gl_error;
}
-
gst_video_frame_unmap (&out_frame);
+ if (!src->gl_result)
+ goto gl_error;
sync_meta = gst_buffer_get_gl_sync_meta (buffer);
if (sync_meta)
@@ -674,6 +516,12 @@
return GST_FLOW_OK;
+gl_error:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (_("failed to draw pattern")),
+ (_("A GL error occured")));
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
not_negotiated:
{
GST_ELEMENT_ERROR (src, CORE, NEGOTIATION, (NULL),
@@ -716,12 +564,20 @@
gst_object_unref (src->shader);
src->shader = NULL;
}
- //blocking call, delete the FBO
- gst_gl_context_del_fbo (src->context, src->fbo, src->depthbuffer);
+
+ if (src->fbo)
+ gst_object_unref (src->fbo);
+ src->fbo = NULL;
+
gst_object_unref (src->context);
src->context = NULL;
}
+ if (src->src_impl) {
+ src->src_funcs->free (src->src_impl);
+ src->src_impl = NULL;
+ }
+
return TRUE;
}
@@ -764,6 +620,14 @@
return FALSE;
}
+static void
+_src_generate_fbo_gl (GstGLContext * context, GstGLTestSrc * src)
+{
+ src->fbo = gst_gl_framebuffer_new_with_default_depth (src->context,
+ GST_VIDEO_INFO_WIDTH (&src->out_info),
+ GST_VIDEO_INFO_HEIGHT (&src->out_info));
+}
+
static gboolean
gst_gl_test_src_decide_allocation (GstBaseSrc * basesrc, GstQuery * query)
{
@@ -774,7 +638,6 @@
guint min, max, size;
gboolean update_pool;
GError *error = NULL;
- guint out_width, out_height;
if (!gst_gl_ensure_element_data (src, &src->display, &src->other_context))
return FALSE;
@@ -807,11 +670,9 @@
if ((gst_gl_context_get_gl_api (src->context) & SUPPORTED_GL_APIS) == 0)
goto unsupported_gl_api;
- out_width = GST_VIDEO_INFO_WIDTH (&src->out_info);
- out_height = GST_VIDEO_INFO_HEIGHT (&src->out_info);
-
- if (!gst_gl_context_gen_fbo (src->context, out_width, out_height,
- &src->fbo, &src->depthbuffer))
+ gst_gl_context_thread_add (src->context,
+ (GstGLContextThreadFunc) _src_generate_fbo_gl, src);
+ if (!src->fbo)
goto context_error;
gst_query_parse_allocation (query, &caps, NULL);
@@ -884,17 +745,34 @@
}
}
-//opengl scene
-static void
+static gboolean
gst_gl_test_src_callback (gpointer stuff)
{
GstGLTestSrc *src = GST_GL_TEST_SRC (stuff);
+ const struct SrcFuncs *funcs;
- src->make_image (src, src->buffer, GST_VIDEO_INFO_WIDTH (&src->out_info),
- GST_VIDEO_INFO_HEIGHT (&src->out_info));
+ funcs = src->src_funcs;
- gst_buffer_unref (src->buffer);
- src->buffer = NULL;
+ if (!funcs || src->set_pattern != src->active_pattern) {
+ if (src->src_impl && funcs)
+ funcs->free (src->src_impl);
+ src->src_funcs = funcs =
+ gst_gl_test_src_get_src_funcs_for_pattern (src->set_pattern);
+ if (funcs == NULL) {
+ GST_ERROR_OBJECT (src, "Could not find an implementation of the "
+ "requested pattern");
+ return FALSE;
+ }
+ src->src_impl = funcs->new (src);
+ if (!(src->gl_result =
+ funcs->init (src->src_impl, src->context, &src->out_info))) {
+ GST_ERROR_OBJECT (src, "Failed to initialize pattern");
+ return FALSE;
+ }
+ src->active_pattern = src->set_pattern;
+ }
+
+ return funcs->fill_bound_fbo (src->src_impl);
}
static GstStateChangeReturn
diff --git a/ext/gl/gstgltestsrc.h b/ext/gl/gstgltestsrc.h
index 1c045c7..df4abb7 100644
--- a/ext/gl/gstgltestsrc.h
+++ b/ext/gl/gstgltestsrc.h
@@ -28,6 +28,8 @@
#include <gst/gl/gl.h>
+#include "gltestsrc.h"
+
G_BEGIN_DECLS
#define GST_TYPE_GL_TEST_SRC \
@@ -41,42 +43,6 @@
#define GST_IS_GL_TEST_SRC_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GL_TEST_SRC))
-/**
- * GstGLTestSrcPattern:
- * @GST_GL_TEST_SRC_SMPTE: A standard SMPTE test pattern
- * @GST_GL_TEST_SRC_SNOW: Random noise
- * @GST_GL_TEST_SRC_BLACK: A black image
- * @GST_GL_TEST_SRC_WHITE: A white image
- * @GST_GL_TEST_SRC_RED: A red image
- * @GST_GL_TEST_SRC_GREEN: A green image
- * @GST_GL_TEST_SRC_BLUE: A blue image
- * @GST_GL_TEST_SRC_CHECKERS1: Checkers pattern (1px)
- * @GST_GL_TEST_SRC_CHECKERS2: Checkers pattern (2px)
- * @GST_GL_TEST_SRC_CHECKERS4: Checkers pattern (4px)
- * @GST_GL_TEST_SRC_CHECKERS8: Checkers pattern (8px)
- * @GST_GL_TEST_SRC_CIRCULAR: Circular pattern
- * @GST_GL_TEST_SRC_BLINK: Alternate between black and white
- *
- * The test pattern to produce.
- */
-typedef enum {
- GST_GL_TEST_SRC_SMPTE,
- GST_GL_TEST_SRC_SNOW,
- GST_GL_TEST_SRC_BLACK,
- GST_GL_TEST_SRC_WHITE,
- GST_GL_TEST_SRC_RED,
- GST_GL_TEST_SRC_GREEN,
- GST_GL_TEST_SRC_BLUE,
- GST_GL_TEST_SRC_CHECKERS1,
- GST_GL_TEST_SRC_CHECKERS2,
- GST_GL_TEST_SRC_CHECKERS4,
- GST_GL_TEST_SRC_CHECKERS8,
- GST_GL_TEST_SRC_CIRCULAR,
- GST_GL_TEST_SRC_BLINK,
- GST_GL_TEST_SRC_MANDELBROT
-} GstGLTestSrcPattern;
-
-typedef struct _GstGLTestSrc GstGLTestSrc;
typedef struct _GstGLTestSrcClass GstGLTestSrcClass;
/**
@@ -90,18 +56,17 @@
/*< private >*/
/* type of output */
- GstGLTestSrcPattern pattern_type;
+ GstGLTestSrcPattern set_pattern;
+ GstGLTestSrcPattern active_pattern;
/* video state */
- char *format_name;
GstVideoInfo out_info;
- GLuint fbo;
- GLuint depthbuffer;
+ GstGLFramebuffer *fbo;
+ GstGLMemory *out_tex;
GstGLShader *shader;
- GstBuffer* buffer;
GstBufferPool *pool;
GstGLDisplay *display;
@@ -111,10 +76,9 @@
gint64 n_frames; /* total frames sent */
gboolean negotiated;
- const gchar *vertex_src;
- const gchar *fragment_src;
-
- void (*make_image) (GstGLTestSrc* v, GstBuffer* buffer, gint w, gint h);
+ gboolean gl_result;
+ const struct SrcFuncs *src_funcs;
+ gpointer src_impl;
GstCaps *out_caps;
};
diff --git a/ext/gl/gstgltransformation.c b/ext/gl/gstgltransformation.c
index 779447c..a4df304 100644
--- a/ext/gl/gstgltransformation.c
+++ b/ext/gl/gstgltransformation.c
@@ -55,6 +55,15 @@
#define gst_gl_transformation_parent_class parent_class
+#define VEC4_FORMAT "%f,%f,%f,%f"
+#define VEC4_ARGS(v) graphene_vec4_get_x (v), graphene_vec4_get_y (v), graphene_vec4_get_z (v), graphene_vec4_get_w (v)
+#define VEC3_FORMAT "%f,%f,%f"
+#define VEC3_ARGS(v) graphene_vec3_get_x (v), graphene_vec3_get_y (v), graphene_vec3_get_z (v)
+#define VEC2_FORMAT "%f,%f"
+#define VEC2_ARGS(v) graphene_vec2_get_x (v), graphene_vec2_get_y (v)
+#define POINT3D_FORMAT "%f,%f,%f"
+#define POINT3D_ARGS(p) (p)->x, (p)->y, (p)->z
+
enum
{
PROP_0,
@@ -89,40 +98,25 @@
GstCaps * incaps, GstCaps * outcaps);
static gboolean gst_gl_transformation_src_event (GstBaseTransform * trans,
GstEvent * event);
+static gboolean gst_gl_transformation_filter_meta (GstBaseTransform * trans,
+ GstQuery * query, GType api, const GstStructure * params);
+static gboolean gst_gl_transformation_decide_allocation (GstBaseTransform *
+ trans, GstQuery * query);
static void gst_gl_transformation_reset_gl (GstGLFilter * filter);
static gboolean gst_gl_transformation_stop (GstBaseTransform * trans);
static gboolean gst_gl_transformation_init_shader (GstGLFilter * filter);
-static void gst_gl_transformation_callback (gpointer stuff);
+static gboolean gst_gl_transformation_callback (gpointer stuff);
static void gst_gl_transformation_build_mvp (GstGLTransformation *
transformation);
+static GstFlowReturn
+gst_gl_transformation_prepare_output_buffer (GstBaseTransform * trans,
+ GstBuffer * inbuf, GstBuffer ** outbuf);
+static gboolean gst_gl_transformation_filter (GstGLFilter * filter,
+ GstBuffer * inbuf, GstBuffer * outbuf);
static gboolean gst_gl_transformation_filter_texture (GstGLFilter * filter,
- guint in_tex, guint out_tex);
-
-/* vertex source */
-static const gchar *cube_v_src =
- "attribute vec4 position; \n"
- "attribute vec2 uv; \n"
- "uniform mat4 mvp; \n"
- "varying vec2 out_uv; \n"
- "void main() \n"
- "{ \n"
- " gl_Position = mvp * position; \n"
- " out_uv = uv; \n"
- "} \n";
-
-/* fragment source */
-static const gchar *cube_f_src =
- "#ifdef GL_ES \n"
- " precision mediump float; \n"
- "#endif \n"
- "varying vec2 out_uv; \n"
- "uniform sampler2D texture; \n"
- "void main() \n"
- "{ \n"
- " gl_FragColor = texture2D (texture, out_uv);\n"
- "} \n";
+ GstGLMemory * in_tex, GstGLMemory * out_tex);
static void
gst_gl_transformation_class_init (GstGLTransformationClass * klass)
@@ -139,14 +133,20 @@
gobject_class->get_property = gst_gl_transformation_get_property;
base_transform_class->src_event = gst_gl_transformation_src_event;
+ base_transform_class->decide_allocation =
+ gst_gl_transformation_decide_allocation;
+ base_transform_class->filter_meta = gst_gl_transformation_filter_meta;
GST_GL_FILTER_CLASS (klass)->init_fbo = gst_gl_transformation_init_shader;
GST_GL_FILTER_CLASS (klass)->display_reset_cb =
gst_gl_transformation_reset_gl;
GST_GL_FILTER_CLASS (klass)->set_caps = gst_gl_transformation_set_caps;
+ GST_GL_FILTER_CLASS (klass)->filter = gst_gl_transformation_filter;
GST_GL_FILTER_CLASS (klass)->filter_texture =
gst_gl_transformation_filter_texture;
GST_BASE_TRANSFORM_CLASS (klass)->stop = gst_gl_transformation_stop;
+ GST_BASE_TRANSFORM_CLASS (klass)->prepare_output_buffer =
+ gst_gl_transformation_prepare_output_buffer;
g_object_class_install_property (gobject_class, PROP_FOV,
g_param_spec_float ("fov", "Fov", "Field of view angle in degrees",
@@ -212,14 +212,14 @@
g_object_class_install_property (gobject_class, PROP_PIVOT_X,
g_param_spec_float ("pivot-x", "X Pivot",
"Rotation pivot point X coordinate, where 0 is the center,"
- " -1 the lef +1 the right boarder and <-1, >1 outside.",
+ " -1 the left border, +1 the right border and <-1, >1 outside.",
-G_MAXFLOAT, G_MAXFLOAT, 0.0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_PIVOT_Y,
g_param_spec_float ("pivot-y", "Y Pivot",
"Rotation pivot point X coordinate, where 0 is the center,"
- " -1 the lef +1 the right boarder and <-1, >1 outside.",
+ " -1 the left border, +1 the right border and <-1, >1 outside.",
-G_MAXFLOAT, G_MAXFLOAT, 0.0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
@@ -227,7 +227,7 @@
g_param_spec_float ("pivot-z", "Z Pivot",
"Relevant for rotation in 3D space. You look into the negative Z axis direction",
-G_MAXFLOAT, G_MAXFLOAT, 0.0,
- G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/* MVP */
g_object_class_install_property (gobject_class, PROP_MVP,
@@ -286,14 +286,13 @@
graphene_point3d_t negative_pivot_vector;
- graphene_vec3_t eye;
graphene_vec3_t center;
graphene_vec3_t up;
gboolean current_passthrough;
gboolean passthrough;
- graphene_vec3_init (&eye, 0.f, 0.f, 1.f);
+ graphene_vec3_init (&transformation->camera_position, 0.f, 0.f, 1.f);
graphene_vec3_init (¢er, 0.f, 0.f, 0.f);
graphene_vec3_init (&up, 0.f, 1.f, 0.f);
@@ -332,8 +331,8 @@
transformation->aspect, transformation->znear, transformation->zfar);
}
- graphene_matrix_init_look_at (&transformation->view_matrix, &eye, ¢er,
- &up);
+ graphene_matrix_init_look_at (&transformation->view_matrix,
+ &transformation->camera_position, ¢er, &up);
current_passthrough =
gst_base_transform_is_passthrough (GST_BASE_TRANSFORM (transformation));
@@ -354,6 +353,13 @@
&transformation->view_matrix, &modelview_matrix);
graphene_matrix_multiply (&modelview_matrix,
&transformation->projection_matrix, &transformation->mvp_matrix);
+
+ graphene_matrix_inverse (&transformation->model_matrix,
+ &transformation->inv_model_matrix);
+ graphene_matrix_inverse (&transformation->view_matrix,
+ &transformation->inv_view_matrix);
+ graphene_matrix_inverse (&transformation->projection_matrix,
+ &transformation->inv_projection_matrix);
}
static void
@@ -456,6 +462,7 @@
g_value_set_float (value, filter->zpivot);
break;
case PROP_MVP:
+ /* FIXME: need to decompose this to support navigation events */
g_value_set_boxed (value, (gconstpointer) & filter->mvp_matrix);
break;
default:
@@ -482,142 +489,198 @@
}
static void
-_find_plane_normal (const graphene_point3d_t * A, const graphene_point3d_t * B,
- const graphene_point3d_t * C, graphene_vec3_t * plane_normal)
+_intersect_plane_and_ray (graphene_plane_t * video_plane, graphene_ray_t * ray,
+ graphene_point3d_t * result)
{
- graphene_vec3_t U, V, A_v, B_v, C_v;
-
- graphene_point3d_to_vec3 (A, &A_v);
- graphene_point3d_to_vec3 (B, &B_v);
- graphene_point3d_to_vec3 (C, &C_v);
-
- graphene_vec3_subtract (&B_v, &A_v, &U);
- graphene_vec3_subtract (&C_v, &A_v, &V);
-
- graphene_vec3_cross (&U, &V, plane_normal);
- graphene_vec3_normalize (plane_normal, plane_normal);
+ float t = graphene_ray_get_distance_to_plane (ray, video_plane);
+ GST_TRACE ("Calculated a distance of %f to the plane", t);
+ graphene_ray_get_position_at (ray, t, result);
}
static void
-_find_model_coords (GstGLTransformation * transformation,
- const graphene_point3d_t * screen_coords, graphene_point3d_t * res)
+_screen_coord_to_world_ray (GstGLTransformation * transformation, float x,
+ float y, graphene_ray_t * ray)
{
- graphene_matrix_t modelview, inverse_proj, inverse_modelview;
- graphene_vec4_t v1, v2;
- graphene_point3d_t p1;
- gfloat w;
+ GstGLFilter *filter = GST_GL_FILTER (transformation);
+ gfloat w = (gfloat) GST_VIDEO_INFO_WIDTH (&filter->in_info);
+ gfloat h = (gfloat) GST_VIDEO_INFO_HEIGHT (&filter->in_info);
+ graphene_vec3_t ray_eye_vec3, ray_world_dir, *ray_origin, *ray_direction;
+ graphene_vec3_t ray_ortho_dir;
+ graphene_point3d_t ray_clip, ray_eye;
+ graphene_vec2_t screen_coord;
- graphene_vec4_init (&v1, screen_coords->x, screen_coords->y, screen_coords->z,
- 1.);
- graphene_matrix_inverse (&transformation->projection_matrix, &inverse_proj);
- graphene_matrix_transform_vec4 (&inverse_proj, &v1, &v2);
+ /* GL is y-flipped. i.e. 0, 0 is the bottom left corner in screen space */
+ graphene_vec2_init (&screen_coord, (2. * x / w - 1.) / transformation->aspect,
+ 1. - 2. * y / h);
- /* perspective division */
- w = graphene_vec4_get_w (&v2);
- p1.x = graphene_vec4_get_x (&v2) / w;
- p1.y = graphene_vec4_get_y (&v2) / w;
- p1.z = graphene_vec4_get_z (&v2) / w;
+ graphene_point3d_init (&ray_clip, graphene_vec2_get_x (&screen_coord),
+ graphene_vec2_get_y (&screen_coord), -1.);
+ graphene_matrix_transform_point3d (&transformation->inv_projection_matrix,
+ &ray_clip, &ray_eye);
- graphene_matrix_multiply (&transformation->model_matrix,
- &transformation->view_matrix, &modelview);
- graphene_matrix_inverse (&modelview, &inverse_modelview);
- graphene_matrix_transform_point3d (&inverse_modelview, &p1, res);
+ graphene_vec3_init (&ray_eye_vec3, ray_eye.x, ray_eye.y, -1.);
+
+ if (transformation->ortho) {
+ graphene_vec3_init (&ray_ortho_dir, 0., 0., 1.);
+
+ ray_origin = &ray_eye_vec3;
+ ray_direction = &ray_ortho_dir;
+ } else {
+ graphene_matrix_transform_vec3 (&transformation->inv_view_matrix,
+ &ray_eye_vec3, &ray_world_dir);
+ graphene_vec3_normalize (&ray_world_dir, &ray_world_dir);
+
+ ray_origin = &transformation->camera_position;
+ ray_direction = &ray_world_dir;
+ }
+
+ graphene_ray_init_from_vec3 (ray, ray_origin, ray_direction);
+
+ GST_TRACE_OBJECT (transformation, "Calculated ray origin: " VEC3_FORMAT
+ " direction: " VEC3_FORMAT " from screen coordinates: " VEC2_FORMAT
+ " with %s projection",
+ VEC3_ARGS (ray_origin), VEC3_ARGS (ray_direction),
+ VEC2_ARGS (&screen_coord),
+ transformation->ortho ? "ortho" : "perspection");
}
+static void
+_init_world_video_plane (GstGLTransformation * transformation,
+ graphene_plane_t * video_plane)
+{
+ graphene_point3d_t bottom_left, bottom_right, top_left, top_right;
+ graphene_point3d_t world_bottom_left, world_bottom_right;
+ graphene_point3d_t world_top_left, world_top_right;
+
+ graphene_point3d_init (&top_left, -transformation->aspect, 1., 0.);
+ graphene_point3d_init (&top_right, transformation->aspect, 1., 0.);
+ graphene_point3d_init (&bottom_left, -transformation->aspect, -1., 0.);
+ graphene_point3d_init (&bottom_right, transformation->aspect, -1., 0.);
+
+ graphene_matrix_transform_point3d (&transformation->model_matrix,
+ &bottom_left, &world_bottom_left);
+ graphene_matrix_transform_point3d (&transformation->model_matrix,
+ &bottom_right, &world_bottom_right);
+ graphene_matrix_transform_point3d (&transformation->model_matrix,
+ &top_left, &world_top_left);
+ graphene_matrix_transform_point3d (&transformation->model_matrix,
+ &top_right, &world_top_right);
+
+ graphene_plane_init_from_points (video_plane, &world_bottom_left,
+ &world_top_right, &world_top_left);
+}
+
+static gboolean
+_screen_coord_to_model_coord (GstGLTransformation * transformation,
+ double x, double y, double *res_x, double *res_y)
+{
+ GstGLFilter *filter = GST_GL_FILTER (transformation);
+ double w = (double) GST_VIDEO_INFO_WIDTH (&filter->in_info);
+ double h = (double) GST_VIDEO_INFO_HEIGHT (&filter->in_info);
+ graphene_point3d_t world_point, model_coord;
+ graphene_plane_t video_plane;
+ graphene_ray_t ray;
+ double new_x, new_y;
+
+ _init_world_video_plane (transformation, &video_plane);
+ _screen_coord_to_world_ray (transformation, x, y, &ray);
+ _intersect_plane_and_ray (&video_plane, &ray, &world_point);
+ graphene_matrix_transform_point3d (&transformation->inv_model_matrix,
+ &world_point, &model_coord);
+
+ /* ndc to pixels. We render the frame Y-flipped so need to unflip the
+ * y coordinate */
+ new_x = (model_coord.x + 1.) * w / 2;
+ new_y = (1. - model_coord.y) * h / 2;
+
+ if (new_x < 0. || new_x > w || new_y < 0. || new_y > h)
+ /* coords off video surface */
+ return FALSE;
+
+ GST_DEBUG_OBJECT (transformation, "converted %f,%f to %f,%f", x, y, new_x,
+ new_y);
+
+ if (res_x)
+ *res_x = new_x;
+ if (res_y)
+ *res_y = new_y;
+
+ return TRUE;
+}
+
+#if 0
+/* debugging facilities for transforming vertices from model space to screen
+ * space */
+static void
+_ndc_to_viewport (GstGLTransformation * transformation, graphene_vec3_t * ndc,
+ int x, int y, int w, int h, float near, float far, graphene_vec3_t * result)
+{
+ GstGLFilter *filter = GST_GL_FILTER (transformation);
+ /* center of the viewport */
+ int o_x = x + w / 2;
+ int o_y = y + h / 2;
+
+ graphene_vec3_init (result, graphene_vec3_get_x (ndc) * w / 2 + o_x,
+ graphene_vec3_get_y (ndc) * h / 2 + o_y,
+ (far - near) * graphene_vec3_get_z (ndc) / 2 + (far + near) / 2);
+}
+
+static void
+_perspective_division (graphene_vec4_t * clip, graphene_vec3_t * result)
+{
+ float w = graphene_vec4_get_w (clip);
+
+ graphene_vec3_init (result, graphene_vec4_get_x (clip) / w,
+ graphene_vec4_get_y (clip) / w, graphene_vec4_get_z (clip) / w);
+}
+
+static void
+_vertex_to_screen_coord (GstGLTransformation * transformation,
+ graphene_vec4_t * vertex, graphene_vec3_t * view)
+{
+ GstGLFilter *filter = GST_GL_FILTER (transformation);
+ gint w = GST_VIDEO_INFO_WIDTH (&filter->in_info);
+ gint h = GST_VIDEO_INFO_HEIGHT (&filter->in_info);
+ graphene_vec4_t clip;
+ graphene_vec3_t ndc;
+
+ graphene_matrix_transform_vec4 (&transformation->mvp_matrix, vertex, &clip);
+ _perspective_division (&clip, &ndc);
+ _ndc_to_viewport (transformation, &ndc, 0, 0, w, h, 0., 1., view);
+}
+#endif
+
static gboolean
gst_gl_transformation_src_event (GstBaseTransform * trans, GstEvent * event)
{
GstGLTransformation *transformation = GST_GL_TRANSFORMATION (trans);
- GstGLFilter *filter = GST_GL_FILTER (trans);
- gdouble new_x, new_y, x, y;
GstStructure *structure;
gboolean ret;
GST_DEBUG_OBJECT (trans, "handling %s event", GST_EVENT_TYPE_NAME (event));
switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_NAVIGATION:
+ case GST_EVENT_NAVIGATION:{
+ gdouble x, y;
event =
GST_EVENT (gst_mini_object_make_writable (GST_MINI_OBJECT (event)));
structure = (GstStructure *) gst_event_get_structure (event);
if (gst_structure_get_double (structure, "pointer_x", &x) &&
gst_structure_get_double (structure, "pointer_y", &y)) {
- gfloat w = (gfloat) GST_VIDEO_INFO_WIDTH (&filter->in_info);
- gfloat h = (gfloat) GST_VIDEO_INFO_HEIGHT (&filter->in_info);
- graphene_point3d_t screen_point_near, screen_point_far;
- graphene_point3d_t model_coord_near, model_coord_far;
- graphene_point3d_t bottom_left, bottom_right, top_left, top_right;
- graphene_point3d_t result;
- graphene_vec3_t plane_normal;
- graphene_plane_t video_plane;
- gfloat d;
+ gdouble new_x, new_y;
- GST_DEBUG_OBJECT (trans, "converting %f,%f", x, y);
-
- graphene_point3d_init (&top_left, -1., 1., 0.);
- graphene_point3d_init (&top_right, 1., 1., 0.);
- graphene_point3d_init (&bottom_left, -1., -1., 0.);
- graphene_point3d_init (&bottom_right, 1., -1., 0.);
- /* to NDC */
- graphene_point3d_init (&screen_point_near, 2. * x / w - 1.,
- 2. * y / h - 1., -1.);
- graphene_point3d_init (&screen_point_far, 2. * x / w - 1.,
- 2. * y / h - 1., 1.);
-
- _find_plane_normal (&bottom_left, &top_left, &top_right, &plane_normal);
- graphene_plane_init_from_point (&video_plane, &plane_normal, &top_left);
- d = graphene_plane_get_constant (&video_plane);
-
- /* get the closest and furthest points in the viewing area for the
- * specified screen coordinate in order to construct a ray */
- _find_model_coords (transformation, &screen_point_near,
- &model_coord_near);
- _find_model_coords (transformation, &screen_point_far,
- &model_coord_far);
-
- {
- graphene_vec3_t model_coord_near_vec3, model_coord_far_vec3;
- graphene_vec3_t tmp, intersection, coord_dir;
- gfloat num, denom, t;
-
- /* get the direction of the ray */
- graphene_point3d_to_vec3 (&model_coord_near, &model_coord_near_vec3);
- graphene_point3d_to_vec3 (&model_coord_far, &model_coord_far_vec3);
- graphene_vec3_subtract (&model_coord_near_vec3, &model_coord_far_vec3,
- &coord_dir);
-
- /* Intersect the ray with the video plane to find the distance, t:
- * Ray: P = P0 + t Pdir
- * Plane: P dot N + d = 0
- *
- * Substituting for P and rearranging gives:
- *
- * t = (P0 dot N + d) / (Pdir dot N) */
- denom = graphene_vec3_dot (&coord_dir, &plane_normal);
- num = graphene_vec3_dot (&model_coord_near_vec3, &plane_normal);
- t = -(num + d) / denom;
-
- /* video coord = P0 + t Pdir */
- graphene_vec3_scale (&coord_dir, t, &tmp);
- graphene_vec3_add (&tmp, &model_coord_near_vec3, &intersection);
- graphene_point3d_init_from_vec3 (&result, &intersection);
- }
-
- new_x = (result.x / transformation->aspect + 1.) * w / 2;
- new_y = (result.y + 1.) * h / 2;
-
- if (new_x < 0. || new_x > w || new_y < 0 || new_y > h) {
- /* coords off video surface */
+ if (!_screen_coord_to_model_coord (transformation, x, y, &new_x,
+ &new_y)) {
gst_event_unref (event);
return TRUE;
}
- GST_DEBUG_OBJECT (trans, "to %fx%f", new_x, new_y);
gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, new_x,
"pointer_y", G_TYPE_DOUBLE, new_y, NULL);
}
break;
+ }
default:
break;
}
@@ -627,6 +690,39 @@
return ret;
}
+static gboolean
+gst_gl_transformation_filter_meta (GstBaseTransform * trans, GstQuery * query,
+ GType api, const GstStructure * params)
+{
+ if (api == GST_VIDEO_AFFINE_TRANSFORMATION_META_API_TYPE)
+ return TRUE;
+
+ if (api == GST_GL_SYNC_META_API_TYPE)
+ return TRUE;
+
+ return FALSE;
+}
+
+static gboolean
+gst_gl_transformation_decide_allocation (GstBaseTransform * trans,
+ GstQuery * query)
+{
+ GstGLTransformation *transformation = GST_GL_TRANSFORMATION (trans);
+
+ if (!GST_BASE_TRANSFORM_CLASS (parent_class)->decide_allocation (trans,
+ query))
+ return FALSE;
+
+ if (gst_query_find_allocation_meta (query,
+ GST_VIDEO_AFFINE_TRANSFORMATION_META_API_TYPE, NULL)) {
+ transformation->downstream_supports_affine_meta = TRUE;
+ } else {
+ transformation->downstream_supports_affine_meta = FALSE;
+ }
+
+ return TRUE;
+}
+
static void
gst_gl_transformation_reset_gl (GstGLFilter * filter)
{
@@ -682,25 +778,91 @@
if (gst_gl_context_get_gl_api (GST_GL_BASE_FILTER (filter)->context)) {
/* blocking call, wait until the opengl thread has compiled the shader */
return gst_gl_context_gen_shader (GST_GL_BASE_FILTER (filter)->context,
- cube_v_src, cube_f_src, &transformation->shader);
+ gst_gl_shader_string_vertex_mat4_vertex_transform,
+ gst_gl_shader_string_fragment_default, &transformation->shader);
}
return TRUE;
}
+static const gfloat from_ndc_matrix[] = {
+ 0.5f, 0.0f, 0.0, 0.5f,
+ 0.0f, 0.5f, 0.0, 0.5f,
+ 0.0f, 0.0f, 0.5, 0.5f,
+ 0.0f, 0.0f, 0.0, 1.0f,
+};
+
+static const gfloat to_ndc_matrix[] = {
+ 2.0f, 0.0f, 0.0, -1.0f,
+ 0.0f, 2.0f, 0.0, -1.0f,
+ 0.0f, 0.0f, 2.0, -1.0f,
+ 0.0f, 0.0f, 0.0, 1.0f,
+};
+
+static GstFlowReturn
+gst_gl_transformation_prepare_output_buffer (GstBaseTransform * trans,
+ GstBuffer * inbuf, GstBuffer ** outbuf)
+{
+ GstGLTransformation *transformation = GST_GL_TRANSFORMATION (trans);
+ GstGLFilter *filter = GST_GL_FILTER (trans);
+
+ if (transformation->downstream_supports_affine_meta &&
+ gst_video_info_is_equal (&filter->in_info, &filter->out_info)) {
+ GstVideoAffineTransformationMeta *af_meta;
+ graphene_matrix_t upstream_matrix, from_ndc, to_ndc, tmp, tmp2, inv_aspect;
+
+ *outbuf = gst_buffer_make_writable (inbuf);
+
+ af_meta = gst_buffer_get_video_affine_transformation_meta (inbuf);
+ if (!af_meta)
+ af_meta = gst_buffer_add_video_affine_transformation_meta (*outbuf);
+
+ GST_LOG_OBJECT (trans, "applying transformation to existing affine "
+ "transformation meta");
+
+ /* apply the transformation to the existing affine meta */
+ graphene_matrix_init_from_float (&from_ndc, from_ndc_matrix);
+ graphene_matrix_init_from_float (&to_ndc, to_ndc_matrix);
+ graphene_matrix_init_from_float (&upstream_matrix, af_meta->matrix);
+
+ graphene_matrix_init_scale (&inv_aspect, transformation->aspect, 1., 1.);
+
+ graphene_matrix_multiply (&from_ndc, &upstream_matrix, &tmp);
+ graphene_matrix_multiply (&tmp, &transformation->mvp_matrix, &tmp2);
+ graphene_matrix_multiply (&tmp2, &inv_aspect, &tmp);
+ graphene_matrix_multiply (&tmp, &to_ndc, &tmp2);
+
+ graphene_matrix_to_float (&tmp2, af_meta->matrix);
+ return GST_FLOW_OK;
+ }
+
+ return GST_BASE_TRANSFORM_CLASS (parent_class)->prepare_output_buffer (trans,
+ inbuf, outbuf);
+}
+
static gboolean
-gst_gl_transformation_filter_texture (GstGLFilter * filter, guint in_tex,
- guint out_tex)
+gst_gl_transformation_filter (GstGLFilter * filter,
+ GstBuffer * inbuf, GstBuffer * outbuf)
+{
+ GstGLTransformation *transformation = GST_GL_TRANSFORMATION (filter);
+
+ if (transformation->downstream_supports_affine_meta &&
+ gst_video_info_is_equal (&filter->in_info, &filter->out_info)) {
+ return TRUE;
+ } else {
+ return gst_gl_filter_filter_texture (filter, inbuf, outbuf);
+ }
+}
+
+static gboolean
+gst_gl_transformation_filter_texture (GstGLFilter * filter,
+ GstGLMemory * in_tex, GstGLMemory * out_tex)
{
GstGLTransformation *transformation = GST_GL_TRANSFORMATION (filter);
transformation->in_tex = in_tex;
- /* blocking call, use a FBO */
- gst_gl_context_use_fbo_v2 (GST_GL_BASE_FILTER (filter)->context,
- GST_VIDEO_INFO_WIDTH (&filter->out_info),
- GST_VIDEO_INFO_HEIGHT (&filter->out_info),
- filter->fbo, filter->depthbuffer,
- out_tex, gst_gl_transformation_callback, (gpointer) transformation);
+ gst_gl_framebuffer_draw_to_texture (filter->fbo, out_tex,
+ (GstGLFramebufferFunc) gst_gl_transformation_callback, transformation);
return TRUE;
}
@@ -762,7 +924,7 @@
gl->DisableVertexAttribArray (transformation->attr_texture);
}
-static void
+static gboolean
gst_gl_transformation_callback (gpointer stuff)
{
GstGLFilter *filter = GST_GL_FILTER (stuff);
@@ -780,20 +942,21 @@
gst_gl_shader_use (transformation->shader);
gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, transformation->in_tex);
+ gl->BindTexture (GL_TEXTURE_2D, transformation->in_tex->tex_id);
gst_gl_shader_set_uniform_1i (transformation->shader, "texture", 0);
graphene_matrix_to_float (&transformation->mvp_matrix, temp_matrix);
- gst_gl_shader_set_uniform_matrix_4fv (transformation->shader, "mvp",
- 1, GL_FALSE, temp_matrix);
+ gst_gl_shader_set_uniform_matrix_4fv (transformation->shader,
+ "u_transformation", 1, GL_FALSE, temp_matrix);
if (!transformation->vertex_buffer) {
transformation->attr_position =
gst_gl_shader_get_attribute_location (transformation->shader,
- "position");
+ "a_position");
transformation->attr_texture =
- gst_gl_shader_get_attribute_location (transformation->shader, "uv");
+ gst_gl_shader_get_attribute_location (transformation->shader,
+ "a_texcoord");
if (gl->GenVertexArrays) {
gl->GenVertexArrays (1, &transformation->vao);
@@ -829,4 +992,6 @@
gst_gl_context_clear_shader (GST_GL_BASE_FILTER (filter)->context);
transformation->caps_change = FALSE;
+
+ return TRUE;
}
diff --git a/ext/gl/gstgltransformation.h b/ext/gl/gstgltransformation.h
index 7d41c61..a767be2 100644
--- a/ext/gl/gstgltransformation.h
+++ b/ext/gl/gstgltransformation.h
@@ -47,7 +47,8 @@
GLint attr_position;
GLint attr_texture;
- guint in_tex;
+ GstGLMemory *in_tex;
+ GstGLMemory *out_tex;
gfloat xrotation;
gfloat yrotation;
@@ -74,8 +75,14 @@
graphene_matrix_t model_matrix;
graphene_matrix_t view_matrix;
graphene_matrix_t projection_matrix;
+ graphene_matrix_t inv_model_matrix;
+ graphene_matrix_t inv_view_matrix;
+ graphene_matrix_t inv_projection_matrix;
graphene_matrix_t mvp_matrix;
+ graphene_vec3_t camera_position;
+
+ gboolean downstream_supports_affine_meta;
gboolean caps_change;
};
diff --git a/ext/gl/gstgluploadelement.c b/ext/gl/gstgluploadelement.c
index 86e8b01..d3ed276 100644
--- a/ext/gl/gstgluploadelement.c
+++ b/ext/gl/gstgluploadelement.c
@@ -80,8 +80,8 @@
bt_class->passthrough_on_same_caps = TRUE;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_gl_upload_element_src_pad_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_gl_upload_element_src_pad_template);
upload_caps = gst_gl_upload_get_input_template_caps ();
gst_element_class_add_pad_template (element_class,
@@ -133,9 +133,14 @@
_gst_gl_upload_element_transform_caps (GstBaseTransform * bt,
GstPadDirection direction, GstCaps * caps, GstCaps * filter)
{
+ GstGLUploadElement *upload = GST_GL_UPLOAD_ELEMENT (bt);
GstGLContext *context = GST_GL_BASE_FILTER (bt)->context;
- return gst_gl_upload_transform_caps (context, direction, caps, filter);
+ if (upload->upload == NULL)
+ upload->upload = gst_gl_upload_new (NULL);
+
+ return gst_gl_upload_transform_caps (upload->upload, context, direction, caps,
+ filter);
}
static gboolean
@@ -177,10 +182,10 @@
if (!ret)
return FALSE;
+ /* GstGLBaseFilter populates ->context in ::decide_allocation so now it's the
+ * time to set the ->upload context */
context = GST_GL_BASE_FILTER (trans)->context;
-
- if (!upload->upload)
- upload->upload = gst_gl_upload_new (context);
+ gst_gl_upload_set_context (upload->upload, context);
return gst_gl_upload_set_caps (upload->upload, upload->in_caps,
upload->out_caps);
@@ -220,6 +225,10 @@
return GST_FLOW_NOT_NEGOTIATED;
ret = gst_gl_upload_perform_with_buffer (upload->upload, buffer, outbuf);
+ if (ret == GST_GL_UPLOAD_RECONFIGURE) {
+ gst_base_transform_reconfigure_src (bt);
+ return GST_FLOW_OK;
+ }
if (ret != GST_GL_UPLOAD_DONE || *outbuf == NULL) {
GST_ELEMENT_ERROR (bt, RESOURCE, NOT_FOUND, ("%s",
diff --git a/ext/gl/gstglvideoflip.c b/ext/gl/gstglvideoflip.c
index caae79e..5d2dac5 100644
--- a/ext/gl/gstglvideoflip.c
+++ b/ext/gl/gstglvideoflip.c
@@ -46,6 +46,7 @@
{
PROP_0,
PROP_METHOD,
+ PROP_VIDEO_DIRECTION
};
static GstStaticPadTemplate _sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
@@ -98,11 +99,6 @@
return video_flip_method_type;
}
-#define gst_gl_video_flip_parent_class parent_class
-G_DEFINE_TYPE_WITH_CODE (GstGLVideoFlip, gst_gl_video_flip,
- GST_TYPE_BIN, GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT,
- "glvideoflip", 0, "glvideoflip element"););
-
static void gst_gl_video_flip_finalize (GObject * object);
static void gst_gl_video_flip_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
@@ -115,6 +111,24 @@
gpointer user_data);
static void
+gst_gl_video_flip_video_direction_interface_init (GstVideoDirectionInterface
+ * iface);
+
+#define gst_gl_video_flip_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstGLVideoFlip, gst_gl_video_flip,
+ GST_TYPE_BIN, GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT,
+ "glvideoflip", 0, "glvideoflip element");
+ G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_DIRECTION,
+ gst_gl_video_flip_video_direction_interface_init););
+
+static void
+gst_gl_video_flip_video_direction_interface_init (GstVideoDirectionInterface
+ * iface)
+{
+ /* We implement the video-direction property */
+}
+
+static void
gst_gl_video_flip_class_init (GstGLVideoFlipClass * klass)
{
GObjectClass *gobject_class;
@@ -128,15 +142,16 @@
gobject_class->get_property = gst_gl_video_flip_get_property;
g_object_class_install_property (gobject_class, PROP_METHOD,
- g_param_spec_enum ("method", "method", "method",
+ g_param_spec_enum ("method", "method",
+ "method (deprecated, use video-direction instead)",
GST_TYPE_GL_VIDEO_FLIP_METHOD, DEFAULT_METHOD,
GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS));
+ g_object_class_override_property (gobject_class, PROP_VIDEO_DIRECTION,
+ "video-direction");
- 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));
+ gst_element_class_add_static_pad_template (element_class, &_src_template);
+ gst_element_class_add_static_pad_template (element_class, &_sink_template);
gst_element_class_set_metadata (element_class, "OpenGL video flip filter",
"Filter/Effect/Video", "Flip video on the GPU",
@@ -235,10 +250,10 @@
gst_structure_get_int (structure, "height", &height)) {
switch (vf->active_method) {
- case GST_GL_VIDEO_FLIP_METHOD_90R:
- case GST_GL_VIDEO_FLIP_METHOD_90L:
- case GST_GL_VIDEO_FLIP_METHOD_FLIP_UL_LR:
- case GST_GL_VIDEO_FLIP_METHOD_FLIP_UR_LL:
+ case GST_VIDEO_ORIENTATION_90R:
+ case GST_VIDEO_ORIENTATION_90L:
+ case GST_VIDEO_ORIENTATION_UL_LR:
+ case GST_VIDEO_ORIENTATION_UR_LL:
gst_structure_set (structure, "width", G_TYPE_INT, height,
"height", G_TYPE_INT, width, NULL);
if (gst_structure_get_fraction (structure, "pixel-aspect-ratio",
@@ -253,10 +268,10 @@
}
}
break;
- case GST_GL_VIDEO_FLIP_METHOD_IDENTITY:
- case GST_GL_VIDEO_FLIP_METHOD_180:
- case GST_GL_VIDEO_FLIP_METHOD_FLIP_HORIZ:
- case GST_GL_VIDEO_FLIP_METHOD_FLIP_VERT:
+ case GST_VIDEO_ORIENTATION_IDENTITY:
+ case GST_VIDEO_ORIENTATION_180:
+ case GST_VIDEO_ORIENTATION_HORIZ:
+ case GST_VIDEO_ORIENTATION_VERT:
break;
default:
g_assert_not_reached ();
@@ -270,7 +285,7 @@
/* with object lock */
static void
-_set_active_method (GstGLVideoFlip * vf, GstGLVideoFlipMethod method,
+_set_active_method (GstGLVideoFlip * vf, GstVideoOrientationMethod method,
GstCaps * caps)
{
gfloat rot_z = 0., scale_x = 1.0, scale_y = 1.0;
@@ -278,34 +293,34 @@
GstPad *srcpad;
switch (method) {
- case GST_GL_VIDEO_FLIP_METHOD_IDENTITY:
+ case GST_VIDEO_ORIENTATION_IDENTITY:
break;
- case GST_GL_VIDEO_FLIP_METHOD_90R:
+ case GST_VIDEO_ORIENTATION_90R:
scale_x *= vf->aspect;
scale_y *= 1. / vf->aspect;
rot_z = 90.;
break;
- case GST_GL_VIDEO_FLIP_METHOD_180:
+ case GST_VIDEO_ORIENTATION_180:
rot_z = 180.;
break;
- case GST_GL_VIDEO_FLIP_METHOD_90L:
+ case GST_VIDEO_ORIENTATION_90L:
scale_x *= vf->aspect;
scale_y *= 1. / vf->aspect;
rot_z = 270.;
break;
- case GST_GL_VIDEO_FLIP_METHOD_FLIP_HORIZ:
+ case GST_VIDEO_ORIENTATION_HORIZ:
scale_x *= -1.;
break;
- case GST_GL_VIDEO_FLIP_METHOD_FLIP_UR_LL:
+ case GST_VIDEO_ORIENTATION_UR_LL:
scale_x *= -vf->aspect;
scale_y *= 1. / vf->aspect;
rot_z = 90.;
break;
- case GST_GL_VIDEO_FLIP_METHOD_FLIP_VERT:
+ case GST_VIDEO_ORIENTATION_VERT:
scale_x *= -1.;
rot_z = 180.;
break;
- case GST_GL_VIDEO_FLIP_METHOD_FLIP_UL_LR:
+ case GST_VIDEO_ORIENTATION_UL_LR:
scale_x *= -vf->aspect;
scale_y *= 1. / vf->aspect;
rot_z = 270.;
@@ -333,10 +348,17 @@
}
static void
-gst_gl_video_flip_set_method (GstGLVideoFlip * vf, GstGLVideoFlipMethod method,
- gboolean from_tag)
+gst_gl_video_flip_set_method (GstGLVideoFlip * vf,
+ GstVideoOrientationMethod method, gboolean from_tag)
{
GST_OBJECT_LOCK (vf);
+
+ if (method == GST_VIDEO_ORIENTATION_CUSTOM) {
+ GST_WARNING_OBJECT (vf, "unsupported custom orientation");
+ GST_OBJECT_UNLOCK (vf);
+ return;
+ }
+
/* Store updated method */
if (from_tag)
vf->tag_method = method;
@@ -344,7 +366,7 @@
vf->method = method;
/* Get the new method */
- if (vf->method == GST_GL_VIDEO_FLIP_METHOD_AUTO)
+ if (vf->method == GST_VIDEO_ORIENTATION_AUTO)
method = vf->tag_method;
else
method = vf->method;
@@ -369,6 +391,7 @@
switch (prop_id) {
case PROP_METHOD:
+ case PROP_VIDEO_DIRECTION:
gst_gl_video_flip_set_method (vf, g_value_get_enum (value), FALSE);
break;
default:
@@ -385,6 +408,7 @@
switch (prop_id) {
case PROP_METHOD:
+ case PROP_VIDEO_DIRECTION:
g_value_set_enum (value, vf->method);
break;
default:
@@ -411,29 +435,25 @@
if (gst_tag_list_get_string (taglist, "image-orientation",
&orientation)) {
if (!g_strcmp0 ("rotate-0", orientation))
- gst_gl_video_flip_set_method (vf, GST_GL_VIDEO_FLIP_METHOD_IDENTITY,
+ gst_gl_video_flip_set_method (vf, GST_VIDEO_ORIENTATION_IDENTITY,
TRUE);
else if (!g_strcmp0 ("rotate-90", orientation))
- gst_gl_video_flip_set_method (vf, GST_GL_VIDEO_FLIP_METHOD_90R,
- TRUE);
+ gst_gl_video_flip_set_method (vf, GST_VIDEO_ORIENTATION_90R, TRUE);
else if (!g_strcmp0 ("rotate-180", orientation))
- gst_gl_video_flip_set_method (vf, GST_GL_VIDEO_FLIP_METHOD_180,
- TRUE);
+ gst_gl_video_flip_set_method (vf, GST_VIDEO_ORIENTATION_180, TRUE);
else if (!g_strcmp0 ("rotate-270", orientation))
- gst_gl_video_flip_set_method (vf, GST_GL_VIDEO_FLIP_METHOD_90L,
- TRUE);
+ gst_gl_video_flip_set_method (vf, GST_VIDEO_ORIENTATION_90L, TRUE);
else if (!g_strcmp0 ("flip-rotate-0", orientation))
gst_gl_video_flip_set_method (vf,
- GST_GL_VIDEO_FLIP_METHOD_FLIP_HORIZ, TRUE);
+ GST_VIDEO_ORIENTATION_HORIZ, TRUE);
else if (!g_strcmp0 ("flip-rotate-90", orientation))
gst_gl_video_flip_set_method (vf,
- GST_GL_VIDEO_FLIP_METHOD_FLIP_UR_LL, TRUE);
+ GST_VIDEO_ORIENTATION_UR_LL, TRUE);
else if (!g_strcmp0 ("flip-rotate-180", orientation))
- gst_gl_video_flip_set_method (vf,
- GST_GL_VIDEO_FLIP_METHOD_FLIP_VERT, TRUE);
+ gst_gl_video_flip_set_method (vf, GST_VIDEO_ORIENTATION_VERT, TRUE);
else if (!g_strcmp0 ("flip-rotate-270", orientation))
gst_gl_video_flip_set_method (vf,
- GST_GL_VIDEO_FLIP_METHOD_FLIP_UL_LR, TRUE);
+ GST_VIDEO_ORIENTATION_UL_LR, TRUE);
g_free (orientation);
}
diff --git a/ext/gl/gstglvideoflip.h b/ext/gl/gstglvideoflip.h
index 3b8e81b..36f8da0 100644
--- a/ext/gl/gstglvideoflip.h
+++ b/ext/gl/gstglvideoflip.h
@@ -78,9 +78,9 @@
GstCaps *input_caps;
/* properties */
- GstGLVideoFlipMethod method;
- GstGLVideoFlipMethod tag_method;
- GstGLVideoFlipMethod active_method;
+ GstVideoOrientationMethod method;
+ GstVideoOrientationMethod tag_method;
+ GstVideoOrientationMethod active_method;
gfloat aspect;
};
diff --git a/ext/gl/gstglvideomixer.c b/ext/gl/gstglvideomixer.c
index e27ebc0..04fab6f 100644
--- a/ext/gl/gstglvideomixer.c
+++ b/ext/gl/gstglvideomixer.c
@@ -29,12 +29,12 @@
* <title>Examples</title>
* |[
* gst-launch-1.0 glvideomixer name=m ! glimagesink \
- * videotestsrc ! video/x-raw, format=YUY2 ! m. \
- * videotestsrc pattern=12 ! video/x-raw, format=I420, framerate=5/1, width=100, height=200 ! queue ! m. \
- * videotestsrc ! video/x-raw, format=RGB, framerate=15/1, width=1500, height=1500 ! gleffects effect=3 ! queue ! m. \
- * videotestsrc ! gleffects effect=2 ! queue ! m. \
- * videotestsrc ! glfiltercube ! queue ! m. \
- * videotestsrc ! gleffects effect=6 ! queue ! m.
+ * videotestsrc ! video/x-raw, format=YUY2 ! glupload ! glcolorconvert ! m. \
+ * videotestsrc pattern=12 ! video/x-raw, format=I420, framerate=5/1, width=100, height=200 ! queue ! \
+ * glupload ! glcolorconvert ! m. \
+ * videotestsrc ! glupload ! gleffects effect=2 ! queue ! m. \
+ * videotestsrc ! glupload ! glfiltercube ! queue ! m. \
+ * videotestsrc ! glupload ! gleffects effect=6 ! queue ! m.gst-launch-1.0 glvideomixer name=m ! glimagesink \
* ]|
* </refsect2>
*/
@@ -43,6 +43,8 @@
#include "config.h"
#endif
+#include <gst/video/gstvideoaffinetransformationmeta.h>
+
#include "gstglvideomixer.h"
#include "gstglmixerbin.h"
@@ -452,6 +454,7 @@
#define DEBUG_INIT \
GST_DEBUG_CATEGORY_INIT (gst_gl_video_mixer_debug, "glvideomixer", 0, "glvideomixer element");
+#define gst_gl_video_mixer_parent_class parent_class
G_DEFINE_TYPE_WITH_CODE (GstGLVideoMixer, gst_gl_video_mixer, GST_TYPE_GL_MIXER,
DEBUG_INIT);
@@ -463,24 +466,18 @@
static GstCaps *_update_caps (GstVideoAggregator * vagg, GstCaps * caps,
GstCaps * filter);
static GstCaps *_fixate_caps (GstVideoAggregator * vagg, GstCaps * caps);
+static gboolean gst_gl_video_mixer_propose_allocation (GstGLBaseMixer *
+ base_mix, GstGLBaseMixerPad * base_pad, GstQuery * decide_query,
+ GstQuery * query);
static void gst_gl_video_mixer_reset (GstGLMixer * mixer);
static gboolean gst_gl_video_mixer_init_shader (GstGLMixer * mixer,
GstCaps * outcaps);
static gboolean gst_gl_video_mixer_process_textures (GstGLMixer * mixer,
- guint out_tex);
-static void gst_gl_video_mixer_callback (gpointer stuff);
+ GstGLMemory * out_tex);
+static gboolean gst_gl_video_mixer_callback (gpointer stuff);
/* *INDENT-OFF* */
-/* vertex source */
-static const gchar *video_mixer_v_src =
- "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" "}";
/* fragment source */
static const gchar *video_mixer_f_src =
@@ -489,10 +486,10 @@
"#endif\n"
"uniform sampler2D texture; \n"
"uniform float alpha;\n"
- "varying vec2 v_texCoord; \n"
+ "varying vec2 v_texcoord; \n"
"void main() \n"
"{ \n"
- " vec4 rgba = texture2D( texture, v_texCoord );\n"
+ " vec4 rgba = texture2D(texture, v_texcoord);\n"
" gl_FragColor = vec4(rgba.rgb, rgba.a * alpha);\n"
"} \n";
@@ -863,6 +860,7 @@
GstElementClass *element_class;
GstAggregatorClass *agg_class = (GstAggregatorClass *) klass;
GstVideoAggregatorClass *vagg_class = (GstVideoAggregatorClass *) klass;
+ GstGLBaseMixerClass *mix_class = GST_GL_BASE_MIXER_CLASS (klass);
gobject_class = (GObjectClass *) klass;
element_class = GST_ELEMENT_CLASS (klass);
@@ -890,6 +888,8 @@
agg_class->sinkpads_type = GST_TYPE_GL_VIDEO_MIXER_PAD;
+ mix_class->propose_allocation = gst_gl_video_mixer_propose_allocation;
+
GST_GL_BASE_MIXER_CLASS (klass)->supported_gl_api =
GST_GL_API_OPENGL | GST_GL_API_OPENGL3 | GST_GL_API_GLES2;
}
@@ -933,6 +933,20 @@
}
}
+static gboolean
+gst_gl_video_mixer_propose_allocation (GstGLBaseMixer * base_mix,
+ GstGLBaseMixerPad * base_pad, GstQuery * decide_query, GstQuery * query)
+{
+ if (!GST_GL_BASE_MIXER_CLASS (parent_class)->propose_allocation (base_mix,
+ base_pad, decide_query, query))
+ return FALSE;
+
+ gst_query_add_allocation_meta (query,
+ GST_VIDEO_AFFINE_TRANSFORMATION_META_API_TYPE, 0);
+
+ return TRUE;
+}
+
static void
_mixer_pad_get_output_size (GstGLVideoMixer * mix,
GstGLVideoMixerPad * mix_pad, gint out_par_n, gint out_par_d, gint * width,
@@ -1137,19 +1151,29 @@
video_mixer->shader);
return gst_gl_context_gen_shader (GST_GL_BASE_MIXER (mixer)->context,
- video_mixer_v_src, video_mixer_f_src, &video_mixer->shader);
+ gst_gl_shader_string_vertex_mat4_vertex_transform,
+ video_mixer_f_src, &video_mixer->shader);
+}
+
+static void
+_video_mixer_process_gl (GstGLContext * context, GstGLVideoMixer * video_mixer)
+{
+ GstGLMixer *mixer = GST_GL_MIXER (video_mixer);
+
+ gst_gl_framebuffer_draw_to_texture (mixer->fbo, video_mixer->out_tex,
+ gst_gl_video_mixer_callback, video_mixer);
}
static gboolean
-gst_gl_video_mixer_process_textures (GstGLMixer * mix, guint out_tex)
+gst_gl_video_mixer_process_textures (GstGLMixer * mix, GstGLMemory * out_tex)
{
GstGLVideoMixer *video_mixer = GST_GL_VIDEO_MIXER (mix);
+ GstGLContext *context = GST_GL_BASE_MIXER (mix)->context;
- gst_gl_context_use_fbo_v2 (GST_GL_BASE_MIXER (mix)->context,
- GST_VIDEO_INFO_WIDTH (&GST_VIDEO_AGGREGATOR (mix)->info),
- GST_VIDEO_INFO_HEIGHT (&GST_VIDEO_AGGREGATOR (mix)->info),
- mix->fbo, mix->depthbuffer,
- out_tex, gst_gl_video_mixer_callback, (gpointer) video_mixer);
+ video_mixer->out_tex = out_tex;
+
+ gst_gl_context_thread_add (context,
+ (GstGLContextThreadFunc) _video_mixer_process_gl, video_mixer);
return TRUE;
}
@@ -1368,7 +1392,7 @@
}
/* opengl scene, params: input texture (not the output mixer->texture) */
-static void
+static gboolean
gst_gl_video_mixer_callback (gpointer stuff)
{
GstGLVideoMixer *video_mixer = GST_GL_VIDEO_MIXER (stuff);
@@ -1396,14 +1420,14 @@
}
if (!_draw_background (video_mixer))
- return;
+ return FALSE;
gst_gl_shader_use (video_mixer->shader);
attr_position_loc =
gst_gl_shader_get_attribute_location (video_mixer->shader, "a_position");
attr_texture_loc =
- gst_gl_shader_get_attribute_location (video_mixer->shader, "a_texCoord");
+ gst_gl_shader_get_attribute_location (video_mixer->shader, "a_texcoord");
gl->Enable (GL_BLEND);
@@ -1412,6 +1436,7 @@
while (walk) {
GstGLMixerPad *mix_pad = walk->data;
GstGLVideoMixerPad *pad = walk->data;
+ GstVideoAggregatorPad *vagg_pad = walk->data;
GstVideoInfo *v_info;
guint in_tex;
guint in_width, in_height;
@@ -1491,6 +1516,17 @@
gst_gl_shader_set_uniform_1i (video_mixer->shader, "texture", 0);
gst_gl_shader_set_uniform_1f (video_mixer->shader, "alpha", pad->alpha);
+ {
+ GstVideoAffineTransformationMeta *af_meta;
+ gfloat matrix[16];
+
+ af_meta =
+ gst_buffer_get_video_affine_transformation_meta (vagg_pad->buffer);
+ gst_gl_get_affine_transformation_meta_as_ndc (af_meta, matrix);
+ gst_gl_shader_set_uniform_matrix_4fv (video_mixer->shader,
+ "u_transformation", 1, FALSE, matrix);
+ }
+
gl->EnableVertexAttribArray (attr_position_loc);
gl->EnableVertexAttribArray (attr_texture_loc);
@@ -1519,4 +1555,6 @@
gl->Disable (GL_BLEND);
gst_gl_context_clear_shader (GST_GL_BASE_MIXER (mixer)->context);
+
+ return TRUE;
}
diff --git a/ext/gl/gstglvideomixer.h b/ext/gl/gstglvideomixer.h
index a0776fd..f352646 100644
--- a/ext/gl/gstglvideomixer.h
+++ b/ext/gl/gstglvideomixer.h
@@ -125,6 +125,7 @@
GLuint vao;
GLuint vbo_indices;
GLuint checker_vbo;
+ GstGLMemory *out_tex;
};
struct _GstGLVideoMixerClass
diff --git a/ext/gl/gstglviewconvert.c b/ext/gl/gstglviewconvert.c
index 5a3c9fe..ba05a11 100644
--- a/ext/gl/gstglviewconvert.c
+++ b/ext/gl/gstglviewconvert.c
@@ -31,11 +31,13 @@
* <refsect2>
* <title>Examples</title>
* |[
- * gst-launch-1.0 videotestsrc ! glviewconvert ! glimagesink
- * ]|
+ * gst-launch-1.0 videotestsrc ! glupload ! glviewconvert ! glimagesink
+ * ]| Simple placebo example demonstrating identity passthrough of mono video
* |[
- * gst-launch-1.0 videotestsrc pattern=checkers-1 ! glviewconvert input-mode-override=side-by-side ! glimagesink -v
- * ]|
+ * gst-launch-1.0 videotestsrc pattern=checkers-1 ! glupload ! \
+ * glviewconvert input-mode-override=side-by-side ! glimagesink -v
+ * ]| Force re-interpretation of the input checkers pattern as a side-by-side stereoscopic
+ * image and display in glimagesink.
* FBO (Frame Buffer Object) and GLSL (OpenGL Shading Language) are required.
* </refsect2>
*/
diff --git a/ext/gl/gstopengl.c b/ext/gl/gstopengl.c
index 50676c4..9bd754d 100644
--- a/ext/gl/gstopengl.c
+++ b/ext/gl/gstopengl.c
@@ -62,6 +62,8 @@
#include "gstglstereosplit.h"
#include "gstglstereomix.h"
#include "gstglviewconvert.h"
+#include "gstgltestsrc.h"
+#include "gstgldeinterlace.h"
#if HAVE_GRAPHENE
#include "gstgltransformation.h"
@@ -74,10 +76,8 @@
#endif /* HAVE_JPEG */
#if GST_GL_HAVE_OPENGL
-#include "gstgltestsrc.h"
#include "gstglfilterglass.h"
/* #include "gstglfilterreflectedscreen.h" */
-#include "gstgldeinterlace.h"
#include "gstglmosaic.h"
#if HAVE_PNG
#include "gstgldifferencematte.h"
@@ -226,6 +226,17 @@
GST_RANK_NONE, GST_TYPE_GL_STEREO_MIX)) {
return FALSE;
}
+
+ if (!gst_element_register (plugin, "gltestsrc",
+ GST_RANK_NONE, GST_TYPE_GL_TEST_SRC)) {
+ return FALSE;
+ }
+
+ if (!gst_element_register (plugin, "gldeinterlace",
+ GST_RANK_NONE, GST_TYPE_GL_DEINTERLACE)) {
+ return FALSE;
+ }
+
#if HAVE_JPEG
#if HAVE_PNG
if (!gst_element_register (plugin, "gloverlay",
@@ -235,11 +246,6 @@
#endif /* HAVE_PNG */
#endif /* HAVE_JPEG */
#if GST_GL_HAVE_OPENGL
- if (!gst_element_register (plugin, "gltestsrc",
- GST_RANK_NONE, GST_TYPE_GL_TEST_SRC)) {
- return FALSE;
- }
-
if (!gst_element_register (plugin, "glfilterglass",
GST_RANK_NONE, GST_TYPE_GL_FILTER_GLASS)) {
return FALSE;
@@ -250,11 +256,6 @@
return FALSE;
}
#endif
- if (!gst_element_register (plugin, "gldeinterlace",
- GST_RANK_NONE, GST_TYPE_GL_DEINTERLACE)) {
- return FALSE;
- }
-
if (!gst_element_register (plugin, "glmosaic",
GST_RANK_NONE, GST_TYPE_GL_MOSAIC)) {
return FALSE;
diff --git a/ext/gme/Makefile.in b/ext/gme/Makefile.in
index 1f4bc08..8f712bc 100644
--- a/ext/gme/Makefile.in
+++ b/ext/gme/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/gme/gstgme.c b/ext/gme/gstgme.c
index 1e149ac..4fb4429 100644
--- a/ext/gme/gstgme.c
+++ b/ext/gme/gstgme.c
@@ -92,10 +92,8 @@
"Chris Lee <clee@kde.org>, Brian Koropoff <bkoropoff@gmail.com>, "
"Michael Pyne <mpyne@kde.org>, Sebastian Dröge <sebastian.droege@collabora.co.uk>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
element_class->change_state = GST_DEBUG_FUNCPTR (gst_gme_dec_change_state);
}
@@ -355,9 +353,7 @@
if (flow_return == GST_FLOW_EOS) {
gst_pad_push_event (pad, gst_event_new_eos ());
} else if (flow_return < GST_FLOW_EOS || flow_return == GST_FLOW_NOT_LINKED) {
- GST_ELEMENT_ERROR (gme, STREAM, FAILED, ("Internal data stream error."),
- ("stream stopped, reason %s", gst_flow_get_name (flow_return)));
-
+ GST_ELEMENT_FLOW_ERROR (gme, flow_return);
gst_pad_push_event (pad, gst_event_new_eos ());
}
}
diff --git a/ext/gsm/Makefile.in b/ext/gsm/Makefile.in
index 1313c41..2f553f8 100644
--- a/ext/gsm/Makefile.in
+++ b/ext/gsm/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/gsm/gstgsmdec.c b/ext/gsm/gstgsmdec.c
index e02631f..0f3e49f 100644
--- a/ext/gsm/gstgsmdec.c
+++ b/ext/gsm/gstgsmdec.c
@@ -84,13 +84,13 @@
element_class = (GstElementClass *) klass;
base_class = (GstAudioDecoderClass *) klass;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gsmdec_sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gsmdec_src_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gsmdec_sink_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gsmdec_src_template);
gst_element_class_set_static_metadata (element_class, "GSM audio decoder",
- "Codec/Decoder/Audio",
- "Decodes GSM encoded audio", "Philippe Khalaf <burger@speedy.org>");
+ "Codec/Decoder/Audio", "Decodes GSM encoded audio",
+ "Philippe Khalaf <burger@speedy.org>");
base_class->start = GST_DEBUG_FUNCPTR (gst_gsmdec_start);
base_class->stop = GST_DEBUG_FUNCPTR (gst_gsmdec_stop);
diff --git a/ext/gsm/gstgsmenc.c b/ext/gsm/gstgsmenc.c
index 54ede2e..11c3d74 100644
--- a/ext/gsm/gstgsmenc.c
+++ b/ext/gsm/gstgsmenc.c
@@ -78,13 +78,13 @@
element_class = (GstElementClass *) klass;
base_class = (GstAudioEncoderClass *) klass;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gsmenc_sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gsmenc_src_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gsmenc_sink_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gsmenc_src_template);
gst_element_class_set_static_metadata (element_class, "GSM audio encoder",
- "Codec/Encoder/Audio",
- "Encodes GSM audio", "Philippe Khalaf <burger@speedy.org>");
+ "Codec/Encoder/Audio", "Encodes GSM audio",
+ "Philippe Khalaf <burger@speedy.org>");
base_class->start = GST_DEBUG_FUNCPTR (gst_gsmenc_start);
base_class->stop = GST_DEBUG_FUNCPTR (gst_gsmenc_stop);
diff --git a/ext/gtk/Makefile.in b/ext/gtk/Makefile.in
index 2e93d6c..af84c98 100644
--- a/ext/gtk/Makefile.in
+++ b/ext/gtk/Makefile.in
@@ -316,6 +316,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -337,6 +339,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -386,6 +390,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -531,6 +537,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -657,8 +665,6 @@
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@
@@ -701,8 +707,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/gtk/gstgtkglsink.c b/ext/gtk/gstgtkglsink.c
index 5f36fa2..4081754 100644
--- a/ext/gtk/gstgtkglsink.c
+++ b/ext/gtk/gstgtkglsink.c
@@ -80,8 +80,8 @@
"Sink/Video", "A video sink that renders to a GtkWidget using OpenGL",
"Matthew Waters <matthew@centricular.com>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_gtk_gl_sink_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_gtk_gl_sink_template);
}
static void
diff --git a/ext/gtk/gstgtksink.c b/ext/gtk/gstgtksink.c
index 950beab..e9f9d0c 100644
--- a/ext/gtk/gstgtksink.c
+++ b/ext/gtk/gstgtksink.c
@@ -67,8 +67,8 @@
"Sink/Video", "A video sink that renders to a GtkWidget",
"Matthew Waters <matthew@centricular.com>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_gtk_sink_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_gtk_sink_template);
}
static void
diff --git a/ext/hls/Makefile.am b/ext/hls/Makefile.am
index 189f9e6..8314ff0 100644
--- a/ext/hls/Makefile.am
+++ b/ext/hls/Makefile.am
@@ -4,6 +4,7 @@
libgsthls_la_SOURCES = \
m3u8.c \
gsthlsdemux.c \
+ gsthlsdemux-util.c \
gsthlsplugin.c \
gsthlssink.c \
gstm3u8playlist.c
@@ -12,7 +13,7 @@
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_PLUGINS_BASE_LIBS) -lgstpbutils-$(GST_API_VERSION) -lgstvideo-$(GST_API_VERSION) -lgsttag-$(GST_API_VERSION) \
$(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)
diff --git a/ext/hls/Makefile.in b/ext/hls/Makefile.in
index dded051..21d9463 100644
--- a/ext/hls/Makefile.in
+++ b/ext/hls/Makefile.in
@@ -170,8 +170,9 @@
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
$(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-gsthlsdemux.lo libgsthls_la-gsthlsdemux-util.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@)
@@ -308,6 +309,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -329,6 +332,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -378,6 +383,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -523,6 +530,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -649,8 +658,6 @@
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@
@@ -693,8 +700,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -787,6 +799,7 @@
libgsthls_la_SOURCES = \
m3u8.c \
gsthlsdemux.c \
+ gsthlsdemux-util.c \
gsthlsplugin.c \
gsthlssink.c \
gstm3u8playlist.c
@@ -795,7 +808,7 @@
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_PLUGINS_BASE_LIBS) -lgstpbutils-$(GST_API_VERSION) -lgstvideo-$(GST_API_VERSION) -lgsttag-$(GST_API_VERSION) \
$(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) $(LIBGCRYPT_LIBS) $(NETTLE_LIBS) $(OPENSSL_LIBS)
libgsthls_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -no-undefined
@@ -887,6 +900,7 @@
distclean-compile:
-rm -f *.tab.c
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsthls_la-gsthlsdemux-util.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@
@@ -931,6 +945,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 $(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
+libgsthls_la-gsthlsdemux-util.lo: gsthlsdemux-util.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-util.lo -MD -MP -MF $(DEPDIR)/libgsthls_la-gsthlsdemux-util.Tpo -c -o libgsthls_la-gsthlsdemux-util.lo `test -f 'gsthlsdemux-util.c' || echo '$(srcdir)/'`gsthlsdemux-util.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsthls_la-gsthlsdemux-util.Tpo $(DEPDIR)/libgsthls_la-gsthlsdemux-util.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsthlsdemux-util.c' object='libgsthls_la-gsthlsdemux-util.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 $(libgsthls_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthls_la_CFLAGS) $(CFLAGS) -c -o libgsthls_la-gsthlsdemux-util.lo `test -f 'gsthlsdemux-util.c' || echo '$(srcdir)/'`gsthlsdemux-util.c
+
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
diff --git a/ext/hls/gsthlsdemux-util.c b/ext/hls/gsthlsdemux-util.c
new file mode 100644
index 0000000..252f042
--- /dev/null
+++ b/ext/hls/gsthlsdemux-util.c
@@ -0,0 +1,348 @@
+/* GStreamer
+ * Copyright (C) 2016 Jan Schmidt <jan@centricular.com>
+ * Copyright (C) 2016 Tim-Philipp Müller <tim@centricular.com>
+ *
+ * gsthlsdemux-util.c:
+ *
+ * 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/gst.h>
+#include <gst/tag/tag.h>
+#include <string.h>
+
+#include "gsthlsdemux.h"
+
+GST_DEBUG_CATEGORY_EXTERN (gst_hls_demux_debug);
+#define GST_CAT_DEFAULT gst_hls_demux_debug
+
+/* Check for sync byte, error_indicator == 0 and packet has payload.
+ * Adaptation control field (data[3] & 0x30) may be zero for TS packets with
+ * null PIDs. Still, these streams are valid TS streams (for null packets,
+ * AFC is supposed to be 0x1, but the spec also says decoders should just
+ * discard any packets with AFC = 0x00) */
+#define IS_MPEGTS_HEADER(data) (data[0] == 0x47 && \
+ (data[1] & 0x80) == 0x00 && \
+ ((data[3] & 0x30) != 0x00 || \
+ ((data[3] & 0x30) == 0x00 && (data[1] & 0x1f) == 0x1f && (data[2] & 0xff) == 0xff)))
+
+#define PCRTIME_TO_GSTTIME(t) (((t) * (guint64)1000) / 27)
+#define MPEGTIME_TO_GSTTIME(t) (((t) * (guint64)100000) / 9)
+
+static gboolean
+have_ts_sync (const guint8 * data, guint size, guint packet_size, guint num)
+{
+ while (num-- > 0) {
+ if (size < packet_size)
+ return FALSE;
+ if (!IS_MPEGTS_HEADER (data))
+ return FALSE;
+ data += packet_size;
+ size -= packet_size;
+ }
+ return TRUE;
+}
+
+static gint
+find_offset (GstHLSTSReader * r, const guint8 * data, guint size)
+{
+ guint sync_points = CLAMP (size / 188, 25, 100);
+ guint off;
+ const gint packet_size = 188;
+
+ /* FIXME: check 192 as well, and maybe also 204, 208 */
+ for (off = 0; off < MIN (size, packet_size); ++off) {
+ if (have_ts_sync (data + off, size - off, packet_size, sync_points)) {
+ r->packet_size = packet_size;
+ return off;
+ }
+ }
+ return -1;
+}
+
+static gboolean
+handle_pcr (GstHLSTSReader * r, const guint8 * data, guint size)
+{
+ const guint8 *p = data;
+ guint32 hdr = GST_READ_UINT32_BE (p);
+ guint af_len, flags;
+
+ guint64 pcr_base, pcr_ext, pcr, ts;
+
+ data = p + 4;
+ if ((hdr & 0x00000020) == 0) /* has_adaptation_field */
+ return FALSE;
+ af_len = p[4]; /* adaptation_field_len */
+ ++data;
+ if (af_len < (1 + 6) || af_len > r->packet_size - (4 + 1))
+ return FALSE;
+ flags = data[0];
+ /* Does the packet have a PCR? */
+ if ((flags & 0x10) == 0)
+ return FALSE;
+ ++data;
+ --af_len;
+ pcr_base = (GST_READ_UINT64_BE (data) >> 16) >> (6 + 9);
+ pcr_ext = (GST_READ_UINT64_BE (data) >> 16) & 0x1ff;
+ pcr = pcr_base * 300 + pcr_ext;
+ ts = PCRTIME_TO_GSTTIME (pcr);
+ GST_LOG ("have PCR! %" G_GUINT64_FORMAT "\t%" GST_TIME_FORMAT,
+ pcr, GST_TIME_ARGS (ts));
+ if (r->first_pcr == GST_CLOCK_TIME_NONE)
+ r->first_pcr = ts;
+ r->last_pcr = ts;
+
+ return TRUE;
+}
+
+static gboolean
+handle_pmt (GstHLSTSReader * r, const guint8 * data, guint size)
+{
+ const guint8 *p = data;
+ guint32 hdr = GST_READ_UINT32_BE (p);
+ guint slen, pcr_pid;
+
+ data = p + 4;
+ if ((hdr & 0x00000020) != 0) /* has_adaptation_field */
+ data += 1 + p[4]; /* adaptation_field_len */
+ data += 1 + data[0]; /* pointer_field */
+ if (data[0] != 0x02) /* table_id */
+ return FALSE;
+ //gst_util_dump_mem (data, 8);
+ /* we assume the entire PMT fits into a single packet and this is it */
+ if (data[6] != 0 || data[6] != data[7])
+ return FALSE;
+ slen = GST_READ_UINT16_BE (data + 1) & 0x0FFF;
+ if (slen > (gsize) (p + r->packet_size - (data + 1 + 2)) || slen < 5 + 2 + 4)
+ return FALSE;
+ data += 3 + 5;
+ slen -= 5; /* bytes after section_length field itself */
+ slen -= 4; /* crc at end */
+ pcr_pid = GST_READ_UINT16_BE (data) & 0x1fff;
+ if (pcr_pid != 0x1fff) {
+ GST_DEBUG ("pcr_pid now: %04x", pcr_pid);
+ r->pcr_pid = pcr_pid;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+handle_pat (GstHLSTSReader * r, const guint8 * data, guint size)
+{
+ const guint8 *p = data;
+ guint32 hdr = GST_READ_UINT32_BE (p);
+ guint slen;
+
+ data = p + 4;
+ if ((hdr & 0x00000020) != 0) /* has_adaptation_field */
+ data += 1 + p[4]; /* adaptation_field_len */
+ data += 1 + data[0]; /* pointer_field */
+ if (data[0] != 0) /* table_id */
+ return FALSE;
+ /* we assume the entire PAT fits into a single packet and this is it */
+ if (data[6] != 0 || data[6] != data[7])
+ return FALSE;
+ slen = GST_READ_UINT16_BE (data + 1) & 0x0FFF;
+ if (slen > (gsize) (p + r->packet_size - (data + 1 + 2)) || slen < 5 + 4 + 4)
+ return FALSE;
+ data += 3 + 5;
+ slen -= 5; /* bytes after section_length field itself */
+ slen -= 4; /* crc at end */
+ while (slen >= 4) {
+ guint program_num = GST_READ_UINT16_BE (data);
+ guint val = GST_READ_UINT16_BE (data + 2) & 0x1fff;
+ if (program_num != 0) {
+ GST_DEBUG (" program %04x: pmt_pid : %04x\n", program_num, val);
+ r->pmt_pid = val;
+ return TRUE;
+ }
+ data += 4;
+ slen -= 4;
+ }
+
+ return FALSE;
+}
+
+void
+gst_hlsdemux_tsreader_init (GstHLSTSReader * r)
+{
+ r->rtype = GST_HLS_TSREADER_NONE;
+ r->packet_size = 188;
+ r->pmt_pid = r->pcr_pid = -1;
+ r->first_pcr = GST_CLOCK_TIME_NONE;
+ r->last_pcr = GST_CLOCK_TIME_NONE;
+}
+
+void
+gst_hlsdemux_tsreader_set_type (GstHLSTSReader * r, GstHLSTSReaderType rtype)
+{
+ r->rtype = rtype;
+ r->have_id3 = FALSE;
+}
+
+static gboolean
+gst_hlsdemux_tsreader_find_pcrs_mpegts (GstHLSTSReader * r,
+ GstBuffer * buffer, GstClockTime * first_pcr, GstClockTime * last_pcr)
+{
+ GstMapInfo info;
+ gint offset;
+ const guint8 *p;
+ const guint8 *data;
+ gsize size;
+
+ if (!gst_buffer_map (buffer, &info, GST_MAP_READ))
+ return FALSE;
+
+ data = info.data;
+ size = info.size;
+
+ *first_pcr = *last_pcr = GST_CLOCK_TIME_NONE;
+
+ offset = find_offset (r, data, size);
+ if (offset < 0) {
+ gst_buffer_unmap (buffer, &info);
+ return FALSE;
+ }
+
+ GST_LOG ("TS packet start offset: %d", offset);
+
+ /* We don't store a partial packet at the end,
+ * and just assume that the final PCR is
+ * going to be completely inside the last data
+ * segment passed to us */
+ data += offset;
+ size -= offset;
+
+ for (p = data; size >= r->packet_size;
+ p += r->packet_size, size -= r->packet_size) {
+ guint32 hdr = GST_READ_UINT32_BE (p);
+
+ /* sync byte (0x47), error indicator (TEI) not set, PID 0, has_payload */
+ if ((hdr & 0xFF9FFF10) == 0x47000010) {
+ GST_LOG ("Found packet for PID 0000 (PAT)");
+ handle_pat (r, p, size);
+ }
+ /* sync byte (0x47), error indicator (TEI) not set, has_payload, PID = PMT_pid */
+ else if ((hdr & 0xFF800010) == 0x47000010
+ && ((hdr >> 8) & 0x1fff) == r->pmt_pid) {
+ GST_LOG ("Found packet for PID %04x (PMT)", r->pmt_pid);
+ handle_pmt (r, p, size);
+ }
+ /* sync byte (0x47), error indicator (TEI) not set, has_payload */
+ else if ((hdr & 0xFF800010) == 0x47000010
+ && ((hdr >> 8) & 0x1fff) == r->pcr_pid) {
+ GST_LOG ("Found packet for PID %04x (PCR)", r->pcr_pid);
+ handle_pcr (r, p, size);
+ }
+ }
+
+ gst_buffer_unmap (buffer, &info);
+
+ *first_pcr = r->first_pcr;
+ *last_pcr = r->last_pcr;
+
+ /* Return TRUE if this piece was big enough to get a PCR from */
+ return (r->first_pcr != GST_CLOCK_TIME_NONE);
+}
+
+static gboolean
+gst_hlsdemux_tsreader_find_pcrs_id3 (GstHLSTSReader * r,
+ GstBuffer * buffer, GstClockTime * first_pcr, GstClockTime * last_pcr)
+{
+ GstMapInfo info;
+ guint32 tag_size;
+ gsize size;
+ GstTagList *taglist;
+ GstSample *priv_data = NULL;
+ GstBuffer *tag_buf;
+ guint64 pts;
+
+ *first_pcr = r->first_pcr;
+ *last_pcr = r->last_pcr;
+
+ if (r->have_id3)
+ return TRUE;
+
+ /* We need at least 10 bytes, starting with "ID3" for the header */
+ size = gst_buffer_get_size (buffer);
+ if (size < 10)
+ return FALSE;
+
+ /* Read the tag size */
+ tag_size = gst_tag_get_id3v2_tag_size (buffer);
+
+ /* Check we've collected that much */
+ if (size < tag_size)
+ return FALSE;
+
+ /* From here, whether the tag is valid or not we'll
+ * not try and read again */
+ r->have_id3 = TRUE;
+
+ /* Parse the tag */
+ taglist = gst_tag_list_from_id3v2_tag (buffer);
+ if (taglist == NULL)
+ return TRUE; /* Invalid tag, stop trying */
+
+ /* Extract the timestamps */
+ if (!gst_tag_list_get_sample (taglist, GST_TAG_PRIVATE_DATA, &priv_data))
+ goto out;
+
+ if (!g_str_equal ("com.apple.streaming.transportStreamTimestamp",
+ gst_structure_get_string (gst_sample_get_info (priv_data), "owner")))
+ goto out;
+
+ /* OK, now as per section 3, the tag contains a 33-bit PCR inside a 64-bit
+ * BE-word */
+ tag_buf = gst_sample_get_buffer (priv_data);
+ if (tag_buf == NULL)
+ goto out;
+
+ if (!gst_buffer_map (tag_buf, &info, GST_MAP_READ))
+ goto out;
+
+ pts = GST_READ_UINT64_BE (info.data);
+ *first_pcr = r->first_pcr = MPEGTIME_TO_GSTTIME (pts);
+
+ GST_LOG ("Got AAC TS PTS %" G_GUINT64_FORMAT " (%" G_GUINT64_FORMAT ")",
+ pts, r->first_pcr);
+
+ gst_buffer_unmap (tag_buf, &info);
+
+out:
+ if (priv_data)
+ gst_sample_unref (priv_data);
+
+ gst_tag_list_unref (taglist);
+
+ return TRUE;
+}
+
+gboolean
+gst_hlsdemux_tsreader_find_pcrs (GstHLSTSReader * r,
+ GstBuffer * buffer, GstClockTime * first_pcr, GstClockTime * last_pcr)
+{
+ if (r->rtype == GST_HLS_TSREADER_MPEGTS)
+ return gst_hlsdemux_tsreader_find_pcrs_mpegts (r, buffer, first_pcr,
+ last_pcr);
+
+ return gst_hlsdemux_tsreader_find_pcrs_id3 (r, buffer, first_pcr, last_pcr);
+}
diff --git a/ext/hls/gsthlsdemux.c b/ext/hls/gsthlsdemux.c
index cf51d99..a4eaacd 100644
--- a/ext/hls/gsthlsdemux.c
+++ b/ext/hls/gsthlsdemux.c
@@ -5,6 +5,7 @@
* Author: Youness Alaoui <youness.alaoui@collabora.co.uk>, Collabora Ltd.
* Author: Sebastian Dröge <sebastian.droege@collabora.co.uk>, Collabora Ltd.
* Copyright (C) 2014 Sebastian Dröge <sebastian@centricular.com>
+ * Copyright (C) 2015 Tim-Philipp Müller <tim@centricular.com>
*
* Gsthlsdemux.c:
*
@@ -54,9 +55,12 @@
GST_PAD_ALWAYS,
GST_STATIC_CAPS ("application/x-hls"));
-GST_DEBUG_CATEGORY_STATIC (gst_hls_demux_debug);
+GST_DEBUG_CATEGORY (gst_hls_demux_debug);
#define GST_CAT_DEFAULT gst_hls_demux_debug
+#define GST_M3U8_CLIENT_LOCK(l) /* FIXME */
+#define GST_M3U8_CLIENT_UNLOCK(l) /* FIXME */
+
/* GObject */
static void gst_hls_demux_finalize (GObject * obj);
@@ -72,11 +76,11 @@
static gboolean gst_hls_demux_change_playlist (GstHLSDemux * demux,
guint max_bitrate, gboolean * changed);
static GstBuffer *gst_hls_demux_decrypt_fragment (GstHLSDemux * demux,
- GstBuffer * encrypted_buffer, GError ** err);
+ GstHLSDemuxStream * stream, GstBuffer * encrypted_buffer, GError ** err);
static gboolean
-gst_hls_demux_decrypt_start (GstHLSDemux * demux, const guint8 * key_data,
- const guint8 * iv_data);
-static void gst_hls_demux_decrypt_end (GstHLSDemux * demux);
+gst_hls_demux_stream_decrypt_start (GstHLSDemuxStream * stream,
+ const guint8 * key_data, const guint8 * iv_data);
+static void gst_hls_demux_stream_decrypt_end (GstHLSDemuxStream * stream);
static gboolean gst_hls_demux_is_live (GstAdaptiveDemux * demux);
static GstClockTime gst_hls_demux_get_duration (GstAdaptiveDemux * demux);
@@ -92,7 +96,8 @@
static GstFlowReturn gst_hls_demux_finish_fragment (GstAdaptiveDemux * demux,
GstAdaptiveDemuxStream * stream);
static GstFlowReturn gst_hls_demux_data_received (GstAdaptiveDemux * demux,
- GstAdaptiveDemuxStream * stream);
+ GstAdaptiveDemuxStream * stream, GstBuffer * buffer);
+static void gst_hls_demux_stream_free (GstAdaptiveDemuxStream * stream);
static gboolean gst_hls_demux_stream_has_next_fragment (GstAdaptiveDemuxStream *
stream);
static GstFlowReturn gst_hls_demux_advance_fragment (GstAdaptiveDemuxStream *
@@ -104,6 +109,9 @@
static void gst_hls_demux_reset (GstAdaptiveDemux * demux);
static gboolean gst_hls_demux_get_live_seek_range (GstAdaptiveDemux * demux,
gint64 * start, gint64 * stop);
+static GstM3U8 *gst_hls_demux_stream_get_m3u8 (GstHLSDemuxStream * hls_stream);
+static void gst_hls_demux_set_current_variant (GstHLSDemux * hlsdemux,
+ GstHLSVariantStream * variant);
#define gst_hls_demux_parent_class parent_class
G_DEFINE_TYPE (GstHLSDemux, gst_hls_demux, GST_TYPE_ADAPTIVE_DEMUX);
@@ -114,7 +122,7 @@
GstHLSDemux *demux = GST_HLS_DEMUX (obj);
gst_hls_demux_reset (GST_ADAPTIVE_DEMUX_CAST (demux));
- gst_m3u8_client_free (demux->client);
+ g_mutex_clear (&demux->keys_lock);
G_OBJECT_CLASS (parent_class)->finalize (obj);
}
@@ -134,11 +142,8 @@
element_class->change_state = GST_DEBUG_FUNCPTR (gst_hls_demux_change_state);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&srctemplate));
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sinktemplate));
+ gst_element_class_add_static_pad_template (element_class, &srctemplate);
+ gst_element_class_add_static_pad_template (element_class, &sinktemplate);
gst_element_class_set_static_metadata (element_class,
"HLS Demuxer",
@@ -162,6 +167,7 @@
adaptivedemux_class->stream_update_fragment_info =
gst_hls_demux_update_fragment_info;
adaptivedemux_class->stream_select_bitrate = gst_hls_demux_select_bitrate;
+ adaptivedemux_class->stream_free = gst_hls_demux_stream_free;
adaptivedemux_class->start_fragment = gst_hls_demux_start_fragment;
adaptivedemux_class->finish_fragment = gst_hls_demux_finish_fragment;
@@ -174,7 +180,11 @@
static void
gst_hls_demux_init (GstHLSDemux * demux)
{
- demux->do_typefind = TRUE;
+ gst_adaptive_demux_set_stream_struct_size (GST_ADAPTIVE_DEMUX_CAST (demux),
+ sizeof (GstHLSDemuxStream));
+
+ demux->keys = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+ g_mutex_init (&demux->keys_lock);
}
static GstStateChangeReturn
@@ -196,6 +206,7 @@
switch (transition) {
case GST_STATE_CHANGE_PAUSED_TO_READY:
gst_hls_demux_reset (GST_ADAPTIVE_DEMUX_CAST (demux));
+ g_hash_table_remove_all (demux->keys);
break;
default:
break;
@@ -230,6 +241,55 @@
return 0;
}
+static void
+gst_hls_demux_stream_clear_pending_data (GstHLSDemuxStream * hls_stream)
+{
+ if (hls_stream->pending_encrypted_data)
+ gst_adapter_clear (hls_stream->pending_encrypted_data);
+ gst_buffer_replace (&hls_stream->pending_decrypted_buffer, NULL);
+ gst_buffer_replace (&hls_stream->pending_typefind_buffer, NULL);
+ gst_buffer_replace (&hls_stream->pending_pcr_buffer, NULL);
+ hls_stream->current_offset = -1;
+ gst_hls_demux_stream_decrypt_end (hls_stream);
+}
+
+static void
+gst_hls_demux_clear_all_pending_data (GstHLSDemux * hlsdemux)
+{
+ GstAdaptiveDemux *demux = (GstAdaptiveDemux *) hlsdemux;
+ GList *walk;
+
+ for (walk = demux->streams; walk != NULL; walk = walk->next) {
+ GstHLSDemuxStream *hls_stream = GST_HLS_DEMUX_STREAM_CAST (walk->data);
+ gst_hls_demux_stream_clear_pending_data (hls_stream);
+ }
+}
+
+#if 0
+static void
+gst_hls_demux_set_current (GstHLSDemux * self, GstM3U8 * m3u8)
+{
+ GST_M3U8_CLIENT_LOCK (self);
+ if (m3u8 != self->current) {
+ self->current = m3u8;
+ self->current->duration = GST_CLOCK_TIME_NONE;
+ self->current->current_file = NULL;
+
+#if 0
+ // FIXME: this makes no sense after we just set self->current=m3u8 above (tpm)
+ // also, these values don't necessarily align between different lists
+ m3u8->current_file_duration = self->current->current_file_duration;
+ m3u8->sequence = self->current->sequence;
+ m3u8->sequence_position = self->current->sequence_position;
+ m3u8->highest_sequence_number = self->current->highest_sequence_number;
+ m3u8->first_file_start = self->current->first_file_start;
+ m3u8->last_file_end = self->current->last_file_end;
+#endif
+ }
+ GST_M3U8_CLIENT_UNLOCK (self);
+}
+#endif
+
static gboolean
gst_hls_demux_seek (GstAdaptiveDemux * demux, GstEvent * seek)
{
@@ -238,15 +298,16 @@
GstSeekFlags flags;
GstSeekType start_type, stop_type;
gint64 start, stop;
- gdouble rate;
- GList *walk, *current_file = NULL;
+ gdouble rate, old_rate;
+ GList *walk, *stream_walk;
GstClockTime current_pos, target_pos;
gint64 current_sequence;
- GstM3U8MediaFile *file;
guint64 bitrate;
gboolean snap_before, snap_after, snap_nearest, keyunit;
gboolean reverse;
+ old_rate = demux->segment.rate;
+
gst_event_parse_seek (seek, &rate, &format, &flags, &start_type, &start,
&stop_type, &stop);
@@ -254,114 +315,110 @@
/* properly cleanup pending decryption status */
if (flags & GST_SEEK_FLAG_FLUSH) {
- gst_hls_demux_decrypt_end (hlsdemux);
+ gst_hls_demux_clear_all_pending_data (hlsdemux);
}
/* Use I-frame variants for trick modes */
- if (hlsdemux->client->main->iframe_lists && rate < -1.0
- && demux->segment.rate >= -1.0 && demux->segment.rate <= 1.0) {
+ if (hlsdemux->master->iframe_variants != NULL
+ && rate < -1.0 && old_rate >= -1.0 && old_rate <= 1.0) {
GError *err = NULL;
- GST_M3U8_CLIENT_LOCK (hlsdemux->client);
/* Switch to I-frame variant */
- hlsdemux->client->main->current_variant =
- hlsdemux->client->main->iframe_lists;
- GST_M3U8_CLIENT_UNLOCK (hlsdemux->client);
- gst_m3u8_client_set_current (hlsdemux->client,
- hlsdemux->client->main->iframe_lists->data);
+ gst_hls_demux_set_current_variant (hlsdemux,
+ hlsdemux->master->iframe_variants->data);
gst_uri_downloader_reset (demux->downloader);
if (!gst_hls_demux_update_playlist (hlsdemux, FALSE, &err)) {
GST_ELEMENT_ERROR_FROM_ERROR (hlsdemux, "Could not switch playlist", err);
return FALSE;
}
//hlsdemux->discont = TRUE;
- hlsdemux->do_typefind = TRUE;
gst_hls_demux_change_playlist (hlsdemux, bitrate / ABS (rate), NULL);
- } else if (rate > -1.0 && rate <= 1.0 && (demux->segment.rate < -1.0
- || demux->segment.rate > 1.0)) {
+ } else if (rate > -1.0 && rate <= 1.0 && (old_rate < -1.0 || old_rate > 1.0)) {
GError *err = NULL;
- GST_M3U8_CLIENT_LOCK (hlsdemux->client);
/* Switch to normal variant */
- hlsdemux->client->main->current_variant = hlsdemux->client->main->lists;
- GST_M3U8_CLIENT_UNLOCK (hlsdemux->client);
- gst_m3u8_client_set_current (hlsdemux->client,
- hlsdemux->client->main->lists->data);
+ gst_hls_demux_set_current_variant (hlsdemux,
+ hlsdemux->master->variants->data);
gst_uri_downloader_reset (demux->downloader);
if (!gst_hls_demux_update_playlist (hlsdemux, FALSE, &err)) {
GST_ELEMENT_ERROR_FROM_ERROR (hlsdemux, "Could not switch playlist", err);
return FALSE;
}
//hlsdemux->discont = TRUE;
- hlsdemux->do_typefind = TRUE;
/* TODO why not continue using the same? that was being used up to now? */
gst_hls_demux_change_playlist (hlsdemux, bitrate, NULL);
}
+ for (stream_walk = demux->streams; stream_walk != NULL;
+ stream_walk = stream_walk->next) {
+ GstHLSDemuxStream *hls_stream =
+ GST_HLS_DEMUX_STREAM_CAST (stream_walk->data);
+ GstM3U8MediaFile *file = NULL;
- GST_M3U8_CLIENT_LOCK (hlsdemux->client);
- file = GST_M3U8_MEDIA_FILE (hlsdemux->client->current->files->data);
- current_sequence = file->sequence;
- current_pos = 0;
- reverse = rate < 0;
- target_pos = reverse ? stop : start;
+ current_sequence = 0;
+ current_pos = 0;
+ reverse = rate < 0;
+ target_pos = reverse ? stop : start;
- /* Snap to segment boundary. Improves seek performance on slow machines. */
- keyunit = ! !(flags & GST_SEEK_FLAG_KEY_UNIT);
- snap_nearest =
- (flags & GST_SEEK_FLAG_SNAP_NEAREST) == GST_SEEK_FLAG_SNAP_NEAREST;
- snap_before = ! !(flags & GST_SEEK_FLAG_SNAP_BEFORE);
- snap_after = ! !(flags & GST_SEEK_FLAG_SNAP_AFTER);
+ /* Snap to segment boundary. Improves seek performance on slow machines. */
+ keyunit = ! !(flags & GST_SEEK_FLAG_KEY_UNIT);
+ snap_nearest =
+ (flags & GST_SEEK_FLAG_SNAP_NEAREST) == GST_SEEK_FLAG_SNAP_NEAREST;
+ snap_before = ! !(flags & GST_SEEK_FLAG_SNAP_BEFORE);
+ snap_after = ! !(flags & GST_SEEK_FLAG_SNAP_AFTER);
- /* FIXME: Here we need proper discont handling */
- for (walk = hlsdemux->client->current->files; walk; walk = walk->next) {
- file = walk->data;
+ GST_M3U8_CLIENT_LOCK (hlsdemux->client);
+ /* FIXME: Here we need proper discont handling */
+ for (walk = hls_stream->playlist->files; walk; walk = walk->next) {
+ file = walk->data;
- current_sequence = file->sequence;
- current_file = walk;
- if ((!reverse && snap_after) || snap_nearest) {
- if (current_pos >= target_pos)
- break;
- if (snap_nearest && target_pos - current_pos < file->duration / 2)
- break;
- } else if (reverse && snap_after) {
- /* check if the next fragment is our target, in this case we want to
- * start from the previous fragment */
- GstClockTime next_pos = current_pos + file->duration;
+ current_sequence = file->sequence;
+ if ((!reverse && snap_after) || snap_nearest) {
+ if (current_pos >= target_pos)
+ break;
+ if (snap_nearest && target_pos - current_pos < file->duration / 2)
+ break;
+ } else if (reverse && snap_after) {
+ /* check if the next fragment is our target, in this case we want to
+ * start from the previous fragment */
+ GstClockTime next_pos = current_pos + file->duration;
- if (next_pos <= target_pos && target_pos < next_pos + file->duration) {
+ if (next_pos <= target_pos && target_pos < next_pos + file->duration) {
+ break;
+ }
+ } else if (current_pos <= target_pos
+ && target_pos < current_pos + file->duration) {
break;
}
- } else if (current_pos <= target_pos
- && target_pos < current_pos + file->duration) {
- break;
+ current_pos += file->duration;
}
- current_pos += file->duration;
- }
- if (walk == NULL) {
- GST_DEBUG_OBJECT (demux, "seeking further than track duration");
- current_sequence++;
- }
+ if (walk == NULL) {
+ GST_DEBUG_OBJECT (demux, "seeking further than track duration");
+ current_sequence++;
+ }
- GST_DEBUG_OBJECT (demux, "seeking to sequence %u", (guint) current_sequence);
- hlsdemux->reset_pts = TRUE;
- hlsdemux->client->sequence = current_sequence;
- hlsdemux->client->current_file =
- current_file ? current_file : hlsdemux->client->current->files;
- hlsdemux->client->sequence_position = current_pos;
- GST_M3U8_CLIENT_UNLOCK (hlsdemux->client);
+ GST_DEBUG_OBJECT (demux, "seeking to sequence %u",
+ (guint) current_sequence);
+ hls_stream->reset_pts = TRUE;
+ hls_stream->playlist->sequence = current_sequence;
+ hls_stream->playlist->current_file = walk;
+ hls_stream->playlist->sequence_position = current_pos;
+ GST_M3U8_CLIENT_UNLOCK (hlsdemux->client);
- /* Play from the end of the current selected segment */
- if (reverse && (snap_before || snap_after || snap_nearest))
- current_pos += file->duration;
+ /* Play from the end of the current selected segment */
+ if (file) {
+ if (reverse && (snap_before || snap_after || snap_nearest))
+ current_pos += file->duration;
+ }
- if (keyunit || snap_before || snap_after || snap_nearest) {
- if (!reverse)
- gst_segment_do_seek (&demux->segment, rate, format, flags, start_type,
- current_pos, stop_type, stop, NULL);
- else
- gst_segment_do_seek (&demux->segment, rate, format, flags, start_type,
- start, stop_type, current_pos, NULL);
+ if (keyunit || snap_before || snap_after || snap_nearest) {
+ if (!reverse)
+ gst_segment_do_seek (&demux->segment, rate, format, flags, start_type,
+ current_pos, stop_type, stop, NULL);
+ else
+ gst_segment_do_seek (&demux->segment, rate, format, flags, start_type,
+ start, stop_type, current_pos, NULL);
+ }
}
return TRUE;
@@ -377,74 +434,185 @@
return GST_FLOW_OK;
}
+static void
+create_stream_for_playlist (GstAdaptiveDemux * demux, GstM3U8 * playlist,
+ gboolean is_primary_playlist, gboolean selected)
+{
+ GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (demux);
+ GstHLSDemuxStream *hlsdemux_stream;
+ GstAdaptiveDemuxStream *stream;
+
+ if (!selected) {
+ /* FIXME: Later, create the stream but mark not-selected */
+ GST_LOG_OBJECT (demux, "Ignoring not-selected stream");
+ return;
+ }
+
+ stream = gst_adaptive_demux_stream_new (demux,
+ gst_hls_demux_create_pad (hlsdemux));
+
+ hlsdemux_stream = GST_HLS_DEMUX_STREAM_CAST (stream);
+
+ hlsdemux_stream->stream_type = GST_HLS_TSREADER_NONE;
+
+ hlsdemux_stream->playlist = gst_m3u8_ref (playlist);
+ hlsdemux_stream->is_primary_playlist = is_primary_playlist;
+
+ hlsdemux_stream->do_typefind = TRUE;
+ hlsdemux_stream->reset_pts = TRUE;
+}
+
static gboolean
gst_hls_demux_setup_streams (GstAdaptiveDemux * demux)
{
GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (demux);
+ GstHLSVariantStream *playlist = hlsdemux->current_variant;
+ gint i;
- /* only 1 output supported */
- gst_adaptive_demux_stream_new (demux, gst_hls_demux_create_pad (hlsdemux));
+ if (playlist == NULL) {
+ GST_WARNING_OBJECT (demux, "Can't configure streams - no variant selected");
+ return FALSE;
+ }
- hlsdemux->reset_pts = TRUE;
+ gst_hls_demux_clear_all_pending_data (hlsdemux);
+
+ /* 1 output for the main playlist */
+ create_stream_for_playlist (demux, playlist->m3u8, TRUE, TRUE);
+
+ for (i = 0; i < GST_HLS_N_MEDIA_TYPES; ++i) {
+ GList *mlist = playlist->media[i];
+ while (mlist != NULL) {
+ GstHLSMedia *media = mlist->data;
+
+ if (media->uri == NULL /* || media->mtype != GST_HLS_MEDIA_TYPE_AUDIO */ ) {
+ /* No uri means this is a placeholder for a stream
+ * contained in another mux */
+ GST_LOG_OBJECT (demux, "Skipping stream %s type %d with no URI",
+ media->name, media->mtype);
+ mlist = mlist->next;
+ continue;
+ }
+ GST_LOG_OBJECT (demux, "media of type %d - %s, uri: %s", i,
+ media->name, media->uri);
+ create_stream_for_playlist (demux, media->playlist, FALSE,
+ (media->mtype == GST_HLS_MEDIA_TYPE_VIDEO ||
+ media->mtype == GST_HLS_MEDIA_TYPE_AUDIO));
+
+ mlist = mlist->next;
+ }
+ }
return TRUE;
}
+static const gchar *
+gst_adaptive_demux_get_manifest_ref_uri (GstAdaptiveDemux * d)
+{
+ return d->manifest_base_uri ? d->manifest_base_uri : d->manifest_uri;
+}
+
+static void
+gst_hls_demux_set_current_variant (GstHLSDemux * hlsdemux,
+ GstHLSVariantStream * variant)
+{
+ if (hlsdemux->current_variant == variant || variant == NULL)
+ return;
+
+ if (hlsdemux->current_variant != NULL) {
+ gint i;
+
+ //#warning FIXME: Synching fragments across variants
+ // should be done based on media timestamps, and
+ // discont-sequence-numbers not sequence numbers.
+ variant->m3u8->sequence_position =
+ hlsdemux->current_variant->m3u8->sequence_position;
+ variant->m3u8->sequence = hlsdemux->current_variant->m3u8->sequence;
+
+ GST_DEBUG_OBJECT (hlsdemux,
+ "Switching Variant. Copying over sequence %" G_GINT64_FORMAT
+ " and sequence_pos %" GST_TIME_FORMAT, variant->m3u8->sequence,
+ GST_TIME_ARGS (variant->m3u8->sequence_position));
+
+ for (i = 0; i < GST_HLS_N_MEDIA_TYPES; ++i) {
+ GList *mlist = hlsdemux->current_variant->media[i];
+
+ while (mlist != NULL) {
+ GstHLSMedia *old_media = mlist->data;
+ GstHLSMedia *new_media =
+ gst_hls_variant_find_matching_media (variant, old_media);
+
+ if (new_media) {
+ new_media->playlist->sequence = old_media->playlist->sequence;
+ new_media->playlist->sequence_position =
+ old_media->playlist->sequence_position;
+ }
+ mlist = mlist->next;
+ }
+ }
+
+ gst_hls_variant_stream_unref (hlsdemux->current_variant);
+ }
+
+ hlsdemux->current_variant = gst_hls_variant_stream_ref (variant);
+
+}
static gboolean
gst_hls_demux_process_manifest (GstAdaptiveDemux * demux, GstBuffer * buf)
{
+ GstHLSVariantStream *variant;
GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (demux);
gchar *playlist = NULL;
- 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));
+ GST_INFO_OBJECT (demux, "Initial playlist location: %s (base uri: %s)",
+ demux->manifest_uri, demux->manifest_base_uri);
playlist = gst_hls_src_buf_to_utf8_playlist (buf);
if (playlist == NULL) {
- GST_WARNING_OBJECT (demux, "Error validating first playlist.");
+ GST_WARNING_OBJECT (demux, "Error validating initial playlist");
return FALSE;
- } else if (!gst_m3u8_client_update (hlsdemux->client, playlist)) {
+ }
+
+ GST_M3U8_CLIENT_LOCK (self);
+ hlsdemux->master = gst_hls_master_playlist_new_from_data (playlist,
+ gst_adaptive_demux_get_manifest_ref_uri (demux));
+
+ if (hlsdemux->master == NULL || hlsdemux->master->variants == NULL) {
/* In most cases, this will happen if we set a wrong url in the
* source element and we have received the 404 HTML response instead of
* the playlist */
- GST_ELEMENT_ERROR (demux, STREAM, DECODE, ("Invalid playlist."), (NULL));
+ GST_ELEMENT_ERROR (demux, STREAM, DECODE, ("Invalid playlist."),
+ ("Could not parse playlist. Check if the URL is correct."));
+ GST_M3U8_CLIENT_UNLOCK (self);
return FALSE;
}
- /* If this playlist is a variant playlist, select the first one
- * and update it */
- if (gst_m3u8_client_has_variant_playlist (hlsdemux->client)) {
- GstM3U8 *child = NULL;
+ /* select the initial variant stream */
+ if (demux->connection_speed == 0) {
+ variant = hlsdemux->master->default_variant;
+ } else {
+ variant =
+ gst_hls_master_playlist_get_variant_for_bitrate (hlsdemux->master,
+ NULL, demux->connection_speed);
+ }
+
+ if (variant) {
+ GST_INFO_OBJECT (hlsdemux, "selected %s", variant->name);
+ gst_hls_demux_set_current_variant (hlsdemux, variant); // FIXME: inline?
+ }
+
+ /* get the selected media playlist (unless the inital list was one already) */
+ if (!hlsdemux->master->is_simple) {
GError *err = NULL;
- if (demux->connection_speed == 0) {
- GST_M3U8_CLIENT_LOCK (hlsdemux->client);
- child = hlsdemux->client->main->current_variant->data;
- GST_M3U8_CLIENT_UNLOCK (hlsdemux->client);
- } 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);
- }
-
- gst_m3u8_client_set_current (hlsdemux->client, child);
if (!gst_hls_demux_update_playlist (hlsdemux, FALSE, &err)) {
- GST_ELEMENT_ERROR_FROM_ERROR (demux, "Could not fetch the child playlist",
+ GST_ELEMENT_ERROR_FROM_ERROR (demux, "Could not fetch media playlist",
err);
+ GST_M3U8_CLIENT_UNLOCK (self);
return FALSE;
}
}
+ GST_M3U8_CLIENT_UNLOCK (self);
return gst_hls_demux_setup_streams (demux);
}
@@ -453,64 +621,111 @@
gst_hls_demux_get_duration (GstAdaptiveDemux * demux)
{
GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (demux);
+ GstClockTime duration = GST_CLOCK_TIME_NONE;
- return gst_m3u8_client_get_duration (hlsdemux->client);
+ if (hlsdemux->current_variant != NULL)
+ duration = gst_m3u8_get_duration (hlsdemux->current_variant->m3u8);
+
+ return duration;
}
static gboolean
gst_hls_demux_is_live (GstAdaptiveDemux * demux)
{
GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (demux);
+ gboolean is_live = FALSE;
- return gst_m3u8_client_is_live (hlsdemux->client);
+ if (hlsdemux->current_variant)
+ is_live = gst_hls_variant_stream_is_live (hlsdemux->current_variant);
+
+ return is_live;
+}
+
+static const GstHLSKey *
+gst_hls_demux_get_key (GstHLSDemux * demux, const gchar * key_url,
+ const gchar * referer, gboolean allow_cache)
+{
+ GstFragment *key_fragment;
+ GstBuffer *key_buffer;
+ GstHLSKey *key;
+ GError *err = NULL;
+
+ GST_LOG_OBJECT (demux, "Looking up key for key url %s", key_url);
+
+ g_mutex_lock (&demux->keys_lock);
+
+ key = g_hash_table_lookup (demux->keys, key_url);
+
+ if (key != NULL) {
+ GST_LOG_OBJECT (demux, "Found key for key url %s in key cache", key_url);
+ goto out;
+ }
+
+ GST_INFO_OBJECT (demux, "Fetching key %s", key_url);
+
+ key_fragment =
+ gst_uri_downloader_fetch_uri (GST_ADAPTIVE_DEMUX (demux)->downloader,
+ key_url, referer, FALSE, FALSE, allow_cache, &err);
+
+ if (key_fragment == NULL) {
+ GST_WARNING_OBJECT (demux, "Failed to download key to decrypt data: %s",
+ err ? err->message : "error");
+ g_clear_error (&err);
+ goto out;
+ }
+
+ key_buffer = gst_fragment_get_buffer (key_fragment);
+
+ key = g_new0 (GstHLSKey, 1);
+ if (gst_buffer_extract (key_buffer, 0, key->data, 16) < 16)
+ GST_WARNING_OBJECT (demux, "Download decryption key is too short!");
+
+ g_hash_table_insert (demux->keys, g_strdup (key_url), key);
+
+ gst_buffer_unref (key_buffer);
+ g_object_unref (key_fragment);
+
+out:
+
+ g_mutex_unlock (&demux->keys_lock);
+
+ if (key != NULL)
+ GST_MEMDUMP_OBJECT (demux, "Key", key->data, 16);
+
+ return key;
}
static gboolean
gst_hls_demux_start_fragment (GstAdaptiveDemux * demux,
GstAdaptiveDemuxStream * stream)
{
+ GstHLSDemuxStream *hls_stream = GST_HLS_DEMUX_STREAM_CAST (stream);
GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (demux);
+ const GstHLSKey *key;
+ GstM3U8 *m3u8;
- if (hlsdemux->current_key) {
- GError *err = NULL;
- GstFragment *key_fragment;
- GstBuffer *key_buffer;
- GstMapInfo key_info;
+ gst_hls_demux_stream_clear_pending_data (hls_stream);
- /* new key? */
- if (hlsdemux->key_url
- && strcmp (hlsdemux->key_url, hlsdemux->current_key) == 0) {
- key_fragment = g_object_ref (hlsdemux->key_fragment);
- } else {
- g_free (hlsdemux->key_url);
- hlsdemux->key_url = NULL;
+ /* Init the timestamp reader for this fragment */
+ gst_hlsdemux_tsreader_init (&hls_stream->tsreader);
+ /* Reset the stream type if we already know it */
+ gst_hlsdemux_tsreader_set_type (&hls_stream->tsreader,
+ hls_stream->stream_type);
- if (hlsdemux->key_fragment)
- g_object_unref (hlsdemux->key_fragment);
- hlsdemux->key_fragment = NULL;
+ /* If no decryption is needed, there's nothing to be done here */
+ if (hls_stream->current_key == NULL)
+ return TRUE;
- GST_INFO_OBJECT (demux, "Fetching key %s", hlsdemux->current_key);
- key_fragment =
- gst_uri_downloader_fetch_uri (demux->downloader,
- hlsdemux->current_key, hlsdemux->client->main ?
- hlsdemux->client->main->uri : NULL, FALSE, FALSE,
- hlsdemux->client->current ? hlsdemux->client->current->
- allowcache : TRUE, &err);
- if (key_fragment == NULL)
- goto key_failed;
- hlsdemux->key_url = g_strdup (hlsdemux->current_key);
- hlsdemux->key_fragment = g_object_ref (key_fragment);
- }
+ m3u8 = gst_hls_demux_stream_get_m3u8 (hls_stream);
- key_buffer = gst_fragment_get_buffer (key_fragment);
- gst_buffer_map (key_buffer, &key_info, GST_MAP_READ);
+ key = gst_hls_demux_get_key (hlsdemux, hls_stream->current_key,
+ m3u8->uri, m3u8->allowcache);
- gst_hls_demux_decrypt_start (hlsdemux, key_info.data, hlsdemux->current_iv);
+ if (key == NULL)
+ goto key_failed;
- gst_buffer_unmap (key_buffer, &key_info);
- gst_buffer_unref (key_buffer);
- g_object_unref (key_fragment);
- }
+ gst_hls_demux_stream_decrypt_start (hls_stream, key->data,
+ hls_stream->current_iv);
return TRUE;
@@ -523,57 +738,107 @@
}
}
+static GstHLSTSReaderType
+caps_to_reader (const GstCaps * caps)
+{
+ const GstStructure *s = gst_caps_get_structure (caps, 0);
+
+ if (gst_structure_has_name (s, "video/mpegts"))
+ return GST_HLS_TSREADER_MPEGTS;
+ if (gst_structure_has_name (s, "application/x-id3"))
+ return GST_HLS_TSREADER_ID3;
+
+ return GST_HLS_TSREADER_NONE;
+}
+
static GstFlowReturn
gst_hls_demux_handle_buffer (GstAdaptiveDemux * demux,
- GstAdaptiveDemuxStream * stream, GstBuffer * buffer, gboolean force)
+ GstAdaptiveDemuxStream * stream, GstBuffer * buffer, gboolean at_eos)
{
+ GstHLSDemuxStream *hls_stream = GST_HLS_DEMUX_STREAM_CAST (stream); // FIXME: pass HlsStream into function
GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (demux);
+ GstMapInfo info;
+ GstClockTime first_pcr, last_pcr;
- if (G_UNLIKELY (hlsdemux->do_typefind && buffer != NULL)) {
+ if (buffer == NULL)
+ return GST_FLOW_OK;
+
+ gst_buffer_map (buffer, &info, GST_MAP_READ);
+
+ if (G_UNLIKELY (hls_stream->do_typefind)) {
GstCaps *caps = NULL;
- GstMapInfo info;
guint buffer_size;
GstTypeFindProbability prob = GST_TYPE_FIND_NONE;
+ if (hls_stream->pending_typefind_buffer)
+ buffer = gst_buffer_append (hls_stream->pending_typefind_buffer, buffer);
+ hls_stream->pending_typefind_buffer = NULL;
+
gst_buffer_map (buffer, &info, GST_MAP_READ);
buffer_size = info.size;
/* Typefind could miss if buffer is too small. In this case we
* will retry later */
- if (buffer_size >= (2 * 1024)) {
+ if (buffer_size >= (2 * 1024) || at_eos) {
caps =
gst_type_find_helper_for_data (GST_OBJECT_CAST (hlsdemux), info.data,
info.size, &prob);
}
- gst_buffer_unmap (buffer, &info);
if (G_UNLIKELY (!caps)) {
+ /* Won't need this mapping any more all paths return inside this if() */
+ gst_buffer_unmap (buffer, &info);
+
/* Only fail typefinding if we already a good amount of data
* and we still don't know the type */
- if (buffer_size > (2 * 1024 * 1024) || force) {
+ if (buffer_size > (2 * 1024 * 1024) || at_eos) {
GST_ELEMENT_ERROR (hlsdemux, STREAM, TYPE_NOT_FOUND,
("Could not determine type of stream"), (NULL));
gst_buffer_unref (buffer);
return GST_FLOW_NOT_NEGOTIATED;
- } else {
- if (hlsdemux->pending_buffer)
- hlsdemux->pending_buffer =
- gst_buffer_append (buffer, hlsdemux->pending_buffer);
- else
- hlsdemux->pending_buffer = buffer;
- return GST_FLOW_OK;
}
+
+ hls_stream->pending_typefind_buffer = buffer;
+
+ return GST_FLOW_OK;
}
GST_DEBUG_OBJECT (hlsdemux, "Typefind result: %" GST_PTR_FORMAT " prob:%d",
caps, prob);
+ hls_stream->stream_type = caps_to_reader (caps);
+ gst_hlsdemux_tsreader_set_type (&hls_stream->tsreader,
+ hls_stream->stream_type);
+
gst_adaptive_demux_stream_set_caps (stream, caps);
- hlsdemux->do_typefind = FALSE;
+
+ hls_stream->do_typefind = FALSE;
+ }
+ g_assert (hls_stream->pending_typefind_buffer == NULL);
+
+ gst_buffer_unmap (buffer, &info);
+
+ // Accumulate this buffer
+ if (hls_stream->pending_pcr_buffer) {
+ buffer = gst_buffer_append (hls_stream->pending_pcr_buffer, buffer);
+ hls_stream->pending_pcr_buffer = NULL;
}
- if (buffer)
+ if (!gst_hlsdemux_tsreader_find_pcrs (&hls_stream->tsreader, buffer,
+ &first_pcr, &last_pcr)
+ && !at_eos) {
+ // Store this buffer for later
+ hls_stream->pending_pcr_buffer = buffer;
+ return GST_FLOW_OK;
+ }
+
+ if (buffer) {
+ buffer = gst_buffer_make_writable (buffer);
+ GST_BUFFER_OFFSET (buffer) = hls_stream->current_offset;
+ hls_stream->current_offset += gst_buffer_get_size (buffer);
+ GST_BUFFER_OFFSET_END (buffer) = hls_stream->current_offset;
return gst_adaptive_demux_stream_push_buffer (stream, buffer);
+ }
return GST_FLOW_OK;
}
@@ -581,43 +846,51 @@
gst_hls_demux_finish_fragment (GstAdaptiveDemux * demux,
GstAdaptiveDemuxStream * stream)
{
- GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (demux);
+ GstHLSDemuxStream *hls_stream = GST_HLS_DEMUX_STREAM_CAST (stream); // FIXME: pass HlsStream into function
GstFlowReturn ret = GST_FLOW_OK;
- if (hlsdemux->current_key)
- gst_hls_demux_decrypt_end (hlsdemux);
-
- /* ideally this should be empty, but this eos might have been
- * caused by an error on the source element */
- GST_DEBUG_OBJECT (demux, "Data still on the adapter when EOS was received"
- ": %" G_GSIZE_FORMAT, gst_adapter_available (stream->adapter));
- gst_adapter_clear (stream->adapter);
+ if (hls_stream->current_key)
+ gst_hls_demux_stream_decrypt_end (hls_stream);
if (stream->last_ret == GST_FLOW_OK) {
- if (hlsdemux->pending_buffer) {
- if (hlsdemux->current_key) {
+ if (hls_stream->pending_decrypted_buffer) {
+ if (hls_stream->current_key) {
GstMapInfo info;
gssize unpadded_size;
/* Handle pkcs7 unpadding here */
- gst_buffer_map (hlsdemux->pending_buffer, &info, GST_MAP_READ);
+ gst_buffer_map (hls_stream->pending_decrypted_buffer, &info,
+ GST_MAP_READ);
unpadded_size = info.size - info.data[info.size - 1];
- gst_buffer_unmap (hlsdemux->pending_buffer, &info);
+ gst_buffer_unmap (hls_stream->pending_decrypted_buffer, &info);
- gst_buffer_resize (hlsdemux->pending_buffer, 0, unpadded_size);
+ gst_buffer_resize (hls_stream->pending_decrypted_buffer, 0,
+ unpadded_size);
}
ret =
- gst_hls_demux_handle_buffer (demux, stream, hlsdemux->pending_buffer,
- TRUE);
- hlsdemux->pending_buffer = NULL;
+ gst_hls_demux_handle_buffer (demux, stream,
+ hls_stream->pending_decrypted_buffer, TRUE);
+ hls_stream->pending_decrypted_buffer = NULL;
}
- } else {
- if (hlsdemux->pending_buffer)
- gst_buffer_unref (hlsdemux->pending_buffer);
- hlsdemux->pending_buffer = NULL;
+
+ if (ret == GST_FLOW_OK || ret == GST_FLOW_NOT_LINKED) {
+ if (hls_stream->pending_pcr_buffer) {
+ GstBuffer *buf = hls_stream->pending_pcr_buffer;
+ hls_stream->pending_pcr_buffer = NULL;
+
+ ret = gst_hls_demux_handle_buffer (demux, stream, buf, TRUE);
+ }
+
+ GST_LOG_OBJECT (stream,
+ "Fragment PCRs were %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (hls_stream->tsreader.first_pcr),
+ GST_TIME_ARGS (hls_stream->tsreader.last_pcr));
+ }
}
+ gst_hls_demux_stream_clear_pending_data (hls_stream);
+
if (ret == GST_FLOW_OK || ret == GST_FLOW_NOT_LINKED)
return gst_adaptive_demux_stream_advance_fragment (demux, stream,
stream->fragment.duration);
@@ -626,28 +899,36 @@
static GstFlowReturn
gst_hls_demux_data_received (GstAdaptiveDemux * demux,
- GstAdaptiveDemuxStream * stream)
+ GstAdaptiveDemuxStream * stream, GstBuffer * buffer)
{
+ GstHLSDemuxStream *hls_stream = GST_HLS_DEMUX_STREAM_CAST (stream);
GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (demux);
- gsize available;
- GstBuffer *buffer = NULL;
- available = gst_adapter_available (stream->adapter);
+ if (hls_stream->current_offset == -1)
+ hls_stream->current_offset = 0;
/* Is it encrypted? */
- if (hlsdemux->current_key) {
+ if (hls_stream->current_key) {
GError *err = NULL;
+ gsize size;
GstBuffer *tmp_buffer;
- /* must be a multiple of 16 */
- available = available & (~0xF);
+ if (hls_stream->pending_encrypted_data == NULL)
+ hls_stream->pending_encrypted_data = gst_adapter_new ();
- if (available == 0) {
+ gst_adapter_push (hls_stream->pending_encrypted_data, buffer);
+ size = gst_adapter_available (hls_stream->pending_encrypted_data);
+
+ /* must be a multiple of 16 */
+ size &= (~0xF);
+
+ if (size == 0) {
return GST_FLOW_OK;
}
- buffer = gst_adapter_take_buffer (stream->adapter, available);
- buffer = gst_hls_demux_decrypt_fragment (hlsdemux, buffer, &err);
+ buffer = gst_adapter_take_buffer (hls_stream->pending_encrypted_data, size);
+ buffer =
+ gst_hls_demux_decrypt_fragment (hlsdemux, hls_stream, buffer, &err);
if (buffer == NULL) {
GST_ELEMENT_ERROR (demux, STREAM, DECODE, ("Failed to decrypt buffer"),
("decryption failed %s", err->message));
@@ -655,55 +936,95 @@
return GST_FLOW_ERROR;
}
- tmp_buffer = hlsdemux->pending_buffer;
- hlsdemux->pending_buffer = buffer;
+ tmp_buffer = hls_stream->pending_decrypted_buffer;
+ hls_stream->pending_decrypted_buffer = buffer;
buffer = tmp_buffer;
- } else {
- buffer = gst_adapter_take_buffer (stream->adapter, available);
- if (hlsdemux->pending_buffer) {
- buffer = gst_buffer_append (hlsdemux->pending_buffer, buffer);
- hlsdemux->pending_buffer = NULL;
- }
}
return gst_hls_demux_handle_buffer (demux, stream, buffer, FALSE);
}
+static void
+gst_hls_demux_stream_free (GstAdaptiveDemuxStream * stream)
+{
+ GstHLSDemuxStream *hls_stream = GST_HLS_DEMUX_STREAM_CAST (stream);
+
+ if (hls_stream->playlist) {
+ gst_m3u8_unref (hls_stream->playlist);
+ hls_stream->playlist = NULL;
+ }
+
+ if (hls_stream->pending_encrypted_data)
+ g_object_unref (hls_stream->pending_encrypted_data);
+
+ gst_buffer_replace (&hls_stream->pending_decrypted_buffer, NULL);
+ gst_buffer_replace (&hls_stream->pending_typefind_buffer, NULL);
+ gst_buffer_replace (&hls_stream->pending_pcr_buffer, NULL);
+
+ if (hls_stream->current_key) {
+ g_free (hls_stream->current_key);
+ hls_stream->current_key = NULL;
+ }
+ if (hls_stream->current_iv) {
+ g_free (hls_stream->current_iv);
+ hls_stream->current_iv = NULL;
+ }
+ gst_hls_demux_stream_decrypt_end (hls_stream);
+}
+
+static GstM3U8 *
+gst_hls_demux_stream_get_m3u8 (GstHLSDemuxStream * hlsdemux_stream)
+{
+ GstM3U8 *m3u8;
+
+ m3u8 = hlsdemux_stream->playlist;
+
+ return m3u8;
+}
+
static gboolean
gst_hls_demux_stream_has_next_fragment (GstAdaptiveDemuxStream * stream)
{
- GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (stream->demux);
+ gboolean has_next;
+ GstM3U8 *m3u8;
- return gst_m3u8_client_has_next_fragment (hlsdemux->client,
- stream->demux->segment.rate > 0);
+ m3u8 = gst_hls_demux_stream_get_m3u8 (GST_HLS_DEMUX_STREAM_CAST (stream));
+
+ has_next = gst_m3u8_has_next_fragment (m3u8, stream->demux->segment.rate > 0);
+
+ return has_next;
}
static GstFlowReturn
gst_hls_demux_advance_fragment (GstAdaptiveDemuxStream * stream)
{
- GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (stream->demux);
+ GstHLSDemuxStream *hlsdemux_stream = GST_HLS_DEMUX_STREAM_CAST (stream);
+ GstM3U8 *m3u8;
- gst_m3u8_client_advance_fragment (hlsdemux->client,
- stream->demux->segment.rate > 0);
- hlsdemux->reset_pts = FALSE;
+ m3u8 = gst_hls_demux_stream_get_m3u8 (hlsdemux_stream);
+
+ gst_m3u8_advance_fragment (m3u8, stream->demux->segment.rate > 0);
+ hlsdemux_stream->reset_pts = FALSE;
+
return GST_FLOW_OK;
}
static GstFlowReturn
gst_hls_demux_update_fragment_info (GstAdaptiveDemuxStream * stream)
{
+ GstHLSDemuxStream *hlsdemux_stream = GST_HLS_DEMUX_STREAM_CAST (stream);
GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (stream->demux);
- gchar *next_fragment_uri;
- GstClockTime duration;
- GstClockTime timestamp;
- gboolean discont;
- gint64 range_start, range_end;
- gchar *key = NULL;
- guint8 *iv = NULL;
+ GstM3U8MediaFile *file;
+ GstClockTime sequence_pos;
+ gboolean discont, forward;
+ GstM3U8 *m3u8;
- if (!gst_m3u8_client_get_next_fragment (hlsdemux->client, &discont,
- &next_fragment_uri, &duration, ×tamp, &range_start, &range_end,
- &key, &iv, stream->demux->segment.rate > 0)) {
+ m3u8 = gst_hls_demux_stream_get_m3u8 (hlsdemux_stream);
+
+ forward = (stream->demux->segment.rate > 0);
+ file = gst_m3u8_get_next_fragment (m3u8, forward, &sequence_pos, &discont);
+
+ if (file == NULL) {
GST_INFO_OBJECT (hlsdemux, "This playlist doesn't contain more fragments");
return GST_FLOW_EOS;
}
@@ -712,23 +1033,33 @@
discont = TRUE;
/* set up our source for download */
- if (hlsdemux->reset_pts || discont || stream->demux->segment.rate < 0.0) {
- stream->fragment.timestamp = timestamp;
+ if (hlsdemux_stream->reset_pts || discont
+ || stream->demux->segment.rate < 0.0) {
+ stream->fragment.timestamp = sequence_pos;
} else {
stream->fragment.timestamp = GST_CLOCK_TIME_NONE;
}
- g_free (hlsdemux->current_key);
- hlsdemux->current_key = key;
- g_free (hlsdemux->current_iv);
- hlsdemux->current_iv = iv;
+ g_free (hlsdemux_stream->current_key);
+ hlsdemux_stream->current_key = g_strdup (file->key);
+ g_free (hlsdemux_stream->current_iv);
+ hlsdemux_stream->current_iv = g_memdup (file->iv, sizeof (file->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;
+ stream->fragment.uri = g_strdup (file->uri);
+
+ GST_DEBUG_OBJECT (hlsdemux, "Stream %p URI now %s", stream, file->uri);
+
+ stream->fragment.range_start = file->offset;
+ if (file->size != -1)
+ stream->fragment.range_end = file->offset + file->size - 1;
+ else
+ stream->fragment.range_end = -1;
+
+ stream->fragment.duration = file->duration;
+
if (discont)
- stream->discont = discont;
+ stream->discont = TRUE;
return GST_FLOW_OK;
}
@@ -738,22 +1069,25 @@
{
GstAdaptiveDemux *demux = GST_ADAPTIVE_DEMUX_CAST (stream->demux);
GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (stream->demux);
+ GstHLSDemuxStream *hls_stream = GST_HLS_DEMUX_STREAM_CAST (stream);
+
gboolean changed = FALSE;
GST_M3U8_CLIENT_LOCK (hlsdemux->client);
- if (!hlsdemux->client->main->lists) {
+ if (hlsdemux->master == NULL || hlsdemux->master->is_simple) {
GST_M3U8_CLIENT_UNLOCK (hlsdemux->client);
return FALSE;
}
GST_M3U8_CLIENT_UNLOCK (hlsdemux->client);
- /* FIXME: Currently several issues have be found when letting bitrate adaptation
- * happen using trick modes (such as 'All streams finished without buffers') and
- * the adaptive algorithm does not properly behave. */
- if (demux->segment.rate != 1.0)
+ if (hls_stream->is_primary_playlist == FALSE) {
+ GST_LOG_OBJECT (hlsdemux,
+ "Stream %p Not choosing new bitrate - not the primary stream", stream);
return FALSE;
+ }
- gst_hls_demux_change_playlist (hlsdemux, bitrate, &changed);
+ gst_hls_demux_change_playlist (hlsdemux, bitrate / MAX (1.0,
+ ABS (demux->segment.rate)), &changed);
if (changed)
gst_hls_demux_setup_streams (GST_ADAPTIVE_DEMUX_CAST (hlsdemux));
return changed;
@@ -764,37 +1098,19 @@
{
GstHLSDemux *demux = GST_HLS_DEMUX_CAST (ademux);
- demux->do_typefind = TRUE;
- demux->reset_pts = TRUE;
-
- g_free (demux->key_url);
- demux->key_url = NULL;
-
- if (demux->key_fragment)
- g_object_unref (demux->key_fragment);
- demux->key_fragment = NULL;
-
- if (demux->client) {
- gst_m3u8_client_free (demux->client);
- demux->client = NULL;
+ GST_M3U8_CLIENT_LOCK (hlsdemux->client);
+ if (demux->master) {
+ gst_hls_master_playlist_unref (demux->master);
+ demux->master = NULL;
}
- /* TODO recreated on hls only if reset was not for disposing */
- demux->client = gst_m3u8_client_new ("", NULL);
-
+ if (demux->current_variant != NULL) {
+ gst_hls_variant_stream_unref (demux->current_variant);
+ demux->current_variant = NULL;
+ }
demux->srcpad_counter = 0;
- if (demux->pending_buffer)
- gst_buffer_unref (demux->pending_buffer);
- demux->pending_buffer = NULL;
- if (demux->current_key) {
- g_free (demux->current_key);
- demux->current_key = NULL;
- }
- if (demux->current_iv) {
- g_free (demux->current_iv);
- demux->current_iv = NULL;
- }
- gst_hls_demux_decrypt_end (demux);
+ gst_hls_demux_clear_all_pending_data (demux);
+ GST_M3U8_CLIENT_UNLOCK (hlsdemux->client);
}
static gchar *
@@ -822,6 +1138,163 @@
return NULL;
}
+static gint
+gst_hls_demux_find_variant_match (const GstHLSVariantStream * a,
+ const GstHLSVariantStream * b)
+{
+ if (g_strcmp0 (a->name, b->name) == 0 &&
+ a->bandwidth == b->bandwidth &&
+ a->program_id == b->program_id &&
+ g_strcmp0 (a->codecs, b->codecs) == 0 &&
+ a->width == b->width &&
+ a->height == b->height && a->iframe == b->iframe) {
+ return 0;
+ }
+
+ return 1;
+}
+
+/* Update the master playlist, which contains the list of available
+ * variants */
+static gboolean
+gst_hls_demux_update_variant_playlist (GstHLSDemux * hlsdemux, gchar * data,
+ const gchar * uri, const gchar * base_uri)
+{
+ GstHLSMasterPlaylist *new_master, *old;
+ gboolean ret = FALSE;
+ GList *l, *unmatched_lists;
+ GstHLSVariantStream *new_variant;
+
+ new_master = gst_hls_master_playlist_new_from_data (data, base_uri ? base_uri : uri); // FIXME: check which uri to use here
+
+ if (new_master == NULL)
+ return ret;
+
+ if (new_master->is_simple) {
+ // FIXME: we should be able to support this though, in the unlikely
+ // case that it changed?
+ GST_ERROR
+ ("Cannot update variant playlist: New playlist is not a variant playlist");
+ gst_hls_master_playlist_unref (new_master);
+ return FALSE;
+ }
+
+ GST_M3U8_CLIENT_LOCK (self);
+
+ if (hlsdemux->master->is_simple) {
+ GST_ERROR
+ ("Cannot update variant playlist: Current playlist is not a variant playlist");
+ goto out;
+ }
+
+ /* Now see if the variant playlist still has the same lists */
+ unmatched_lists = g_list_copy (hlsdemux->master->variants);
+ for (l = new_master->variants; l != NULL; l = l->next) {
+ GList *match = g_list_find_custom (unmatched_lists, l->data,
+ (GCompareFunc) gst_hls_demux_find_variant_match);
+
+ if (match) {
+ GstHLSVariantStream *variant = l->data;
+ GstHLSVariantStream *old = match->data;
+
+ unmatched_lists = g_list_delete_link (unmatched_lists, match);
+ /* FIXME: Deal with losing position due to missing an update */
+ variant->m3u8->sequence_position = old->m3u8->sequence_position;
+ variant->m3u8->sequence = old->m3u8->sequence;
+ }
+ }
+
+ if (unmatched_lists != NULL) {
+ GST_WARNING ("Unable to match all playlists");
+
+ for (l = unmatched_lists; l != NULL; l = l->next) {
+ if (l->data == hlsdemux->current_variant) {
+ GST_WARNING ("Unable to match current playlist");
+ }
+ }
+
+ g_list_free (unmatched_lists);
+ }
+
+ /* Switch out the variant playlist */
+ old = hlsdemux->master;
+
+ // FIXME: check all this and also switch of variants, if anything needs updating
+ hlsdemux->master = new_master;
+
+ if (hlsdemux->current_variant == NULL) {
+ new_variant = new_master->default_variant;
+ } else {
+ /* Find the same variant in the new playlist */
+ new_variant =
+ gst_hls_master_playlist_get_matching_variant (new_master,
+ hlsdemux->current_variant);
+ }
+
+ /* Use the function to set the current variant, as it copies over data */
+ if (new_variant != NULL)
+ gst_hls_demux_set_current_variant (hlsdemux, new_variant);
+
+ gst_hls_master_playlist_unref (old);
+
+ ret = (hlsdemux->current_variant != NULL);
+out:
+ GST_M3U8_CLIENT_UNLOCK (self);
+
+ return ret;
+}
+
+static gboolean
+gst_hls_demux_update_rendition_manifest (GstHLSDemux * demux,
+ GstHLSMedia * media, GError ** err)
+{
+ GstAdaptiveDemux *adaptive_demux = GST_ADAPTIVE_DEMUX (demux);
+ GstFragment *download;
+ GstBuffer *buf;
+ gchar *playlist;
+ const gchar *main_uri;
+ GstM3U8 *m3u8;
+ gchar *uri = media->uri;
+
+ main_uri = gst_adaptive_demux_get_manifest_ref_uri (adaptive_demux);
+ download =
+ gst_uri_downloader_fetch_uri (adaptive_demux->downloader, uri, main_uri,
+ TRUE, TRUE, TRUE, err);
+
+ if (download == NULL)
+ return FALSE;
+
+ m3u8 = media->playlist;
+
+ /* Set the base URI of the playlist to the redirect target if any */
+ if (download->redirect_permanent && download->redirect_uri) {
+ gst_m3u8_set_uri (m3u8, download->redirect_uri, NULL, media->name);
+ } else {
+ gst_m3u8_set_uri (m3u8, download->uri, download->redirect_uri, media->name);
+ }
+
+ buf = gst_fragment_get_buffer (download);
+ playlist = gst_hls_src_buf_to_utf8_playlist (buf);
+ gst_buffer_unref (buf);
+ g_object_unref (download);
+
+ if (playlist == NULL) {
+ GST_WARNING_OBJECT (demux, "Couldn't validate playlist encoding");
+ g_set_error (err, GST_STREAM_ERROR, GST_STREAM_ERROR_WRONG_TYPE,
+ "Couldn't validate playlist encoding");
+ return FALSE;
+ }
+
+ if (!gst_m3u8_update (m3u8, playlist)) {
+ GST_WARNING_OBJECT (demux, "Couldn't update playlist");
+ g_set_error (err, GST_STREAM_ERROR, GST_STREAM_ERROR_FAILED,
+ "Couldn't update playlist");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
static gboolean
gst_hls_demux_update_playlist (GstHLSDemux * demux, gboolean update,
GError ** err)
@@ -830,34 +1303,32 @@
GstFragment *download;
GstBuffer *buf;
gchar *playlist;
- gboolean main_checked = FALSE, updated = FALSE;
- gchar *uri, *main_uri;
+ gboolean main_checked = FALSE;
+ const gchar *main_uri;
+ GstM3U8 *m3u8;
+ gchar *uri;
+ gint i;
retry:
- uri = gst_m3u8_client_get_current_uri (demux->client);
- main_uri = gst_m3u8_client_get_uri (demux->client);
+ uri = gst_m3u8_get_uri (demux->current_variant->m3u8);
+ main_uri = gst_adaptive_demux_get_manifest_ref_uri (adaptive_demux);
download =
gst_uri_downloader_fetch_uri (adaptive_demux->downloader, uri, main_uri,
TRUE, TRUE, TRUE, err);
- g_free (main_uri);
if (download == NULL) {
gchar *base_uri;
- if (!update || main_checked
- || !gst_m3u8_client_has_variant_playlist (demux->client)) {
+ if (!update || main_checked || demux->master->is_simple) {
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;
@@ -886,8 +1357,7 @@
base_uri = download->redirect_uri;
}
- if (!gst_m3u8_client_update_variant_playlist (demux->client, playlist,
- uri, base_uri)) {
+ if (!gst_hls_demux_update_variant_playlist (demux, 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,
@@ -902,18 +1372,16 @@
}
g_free (uri);
+ m3u8 = demux->current_variant->m3u8;
+
/* Set the base URI of the playlist to the redirect target if any */
- GST_M3U8_CLIENT_LOCK (demux->client);
- g_free (demux->client->current->uri);
- g_free (demux->client->current->base_uri);
if (download->redirect_permanent && download->redirect_uri) {
- demux->client->current->uri = g_strdup (download->redirect_uri);
- demux->client->current->base_uri = NULL;
+ gst_m3u8_set_uri (m3u8, download->redirect_uri, NULL,
+ demux->current_variant->name);
} else {
- demux->client->current->uri = g_strdup (download->uri);
- demux->client->current->base_uri = g_strdup (download->redirect_uri);
+ gst_m3u8_set_uri (m3u8, download->uri, download->redirect_uri,
+ demux->current_variant->name);
}
- GST_M3U8_CLIENT_UNLOCK (demux->client);
buf = gst_fragment_get_buffer (download);
playlist = gst_hls_src_buf_to_utf8_playlist (buf);
@@ -927,41 +1395,61 @@
return FALSE;
}
- updated = gst_m3u8_client_update (demux->client, playlist);
- if (!updated) {
+ if (!gst_m3u8_update (m3u8, playlist)) {
GST_WARNING_OBJECT (demux, "Couldn't update playlist");
g_set_error (err, GST_STREAM_ERROR, GST_STREAM_ERROR_FAILED,
"Couldn't update playlist");
return FALSE;
}
+ for (i = 0; i < GST_HLS_N_MEDIA_TYPES; ++i) {
+ GList *mlist = demux->current_variant->media[i];
+
+ while (mlist != NULL) {
+ GstHLSMedia *media = mlist->data;
+
+ if (media->uri == NULL) {
+ /* No uri means this is a placeholder for a stream
+ * contained in another mux */
+ mlist = mlist->next;
+ continue;
+ }
+ GST_LOG_OBJECT (demux,
+ "Updating playlist for media of type %d - %s, uri: %s", i,
+ media->name, media->uri);
+
+ if (!gst_hls_demux_update_rendition_manifest (demux, media, err))
+ return FALSE;
+
+ mlist = mlist->next;
+ }
+ }
+
/* If it's a live source, do not let the sequence number go beyond
* three fragments before the end of the list */
- if (update == FALSE && demux->client->current &&
- gst_m3u8_client_is_live (demux->client)) {
+ if (update == FALSE && gst_m3u8_is_live (m3u8)) {
gint64 last_sequence, first_sequence;
GST_M3U8_CLIENT_LOCK (demux->client);
last_sequence =
- GST_M3U8_MEDIA_FILE (g_list_last (demux->client->current->
- files)->data)->sequence;
+ GST_M3U8_MEDIA_FILE (g_list_last (m3u8->files)->data)->sequence;
first_sequence =
- GST_M3U8_MEDIA_FILE (demux->client->current->files->data)->sequence;
+ GST_M3U8_MEDIA_FILE (g_list_first (m3u8->files)->data)->sequence;
GST_DEBUG_OBJECT (demux,
"sequence:%" G_GINT64_FORMAT " , first_sequence:%" G_GINT64_FORMAT
- " , last_sequence:%" G_GINT64_FORMAT, demux->client->sequence,
+ " , last_sequence:%" G_GINT64_FORMAT, m3u8->sequence,
first_sequence, last_sequence);
- if (demux->client->sequence >= last_sequence - 3) {
+ if (m3u8->sequence >= last_sequence - 3) {
//demux->need_segment = TRUE;
/* Make sure we never go below the minimum sequence number */
- demux->client->sequence = MAX (first_sequence, last_sequence - 3);
+ m3u8->sequence = MAX (first_sequence, last_sequence - 3);
GST_DEBUG_OBJECT (demux,
"Sequence is beyond playlist. Moving back to %" G_GINT64_FORMAT,
- demux->client->sequence);
+ m3u8->sequence);
}
GST_M3U8_CLIENT_UNLOCK (demux->client);
- } else if (demux->client->current && !gst_m3u8_client_is_live (demux->client)) {
+ } else if (!gst_m3u8_is_live (m3u8)) {
GstClockTime current_pos, target_pos;
guint sequence = 0;
GList *walk;
@@ -980,15 +1468,15 @@
} else {
target_pos = 0;
}
- if (GST_CLOCK_TIME_IS_VALID (demux->client->sequence_position)) {
- target_pos = MAX (target_pos, demux->client->sequence_position);
+ if (GST_CLOCK_TIME_IS_VALID (m3u8->sequence_position)) {
+ target_pos = MAX (target_pos, m3u8->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) {
+ for (walk = m3u8->files; walk; walk = walk->next) {
GstM3U8MediaFile *file = walk->data;
sequence = file->sequence;
@@ -1001,19 +1489,20 @@
/* End of playlist */
if (!walk)
sequence++;
- demux->client->sequence = sequence;
- demux->client->sequence_position = current_pos;
+ m3u8->sequence = sequence;
+ m3u8->sequence_position = current_pos;
GST_M3U8_CLIENT_UNLOCK (demux->client);
}
- return updated;
+ return TRUE;
}
static gboolean
gst_hls_demux_change_playlist (GstHLSDemux * demux, guint max_bitrate,
gboolean * changed)
{
- GList *previous_variant, *current_variant;
+ GstHLSVariantStream *lowest_variant, *lowest_ivariant;
+ GstHLSVariantStream *previous_variant, *new_variant;
gint old_bandwidth, new_bandwidth;
GstAdaptiveDemux *adaptive_demux = GST_ADAPTIVE_DEMUX_CAST (demux);
GstAdaptiveDemuxStream *stream;
@@ -1022,15 +1511,16 @@
stream = adaptive_demux->streams->data;
- previous_variant = demux->client->main->current_variant;
- current_variant = gst_m3u8_client_get_playlist_for_bitrate (demux->client,
- max_bitrate);
+ previous_variant = demux->current_variant;
+ new_variant =
+ gst_hls_master_playlist_get_variant_for_bitrate (demux->master,
+ demux->current_variant, max_bitrate);
GST_M3U8_CLIENT_LOCK (demux->client);
retry_failover_protection:
- old_bandwidth = GST_M3U8 (previous_variant->data)->bandwidth;
- new_bandwidth = GST_M3U8 (current_variant->data)->bandwidth;
+ old_bandwidth = previous_variant->bandwidth;
+ new_bandwidth = new_variant->bandwidth;
/* Don't do anything else if the playlist is the same */
if (new_bandwidth == old_bandwidth) {
@@ -1038,19 +1528,19 @@
return TRUE;
}
- demux->client->main->current_variant = current_variant;
GST_M3U8_CLIENT_UNLOCK (demux->client);
- gst_m3u8_client_set_current (demux->client, current_variant->data);
+ gst_hls_demux_set_current_variant (demux, new_variant);
GST_INFO_OBJECT (demux, "Client was on %dbps, max allowed is %dbps, switching"
" to bitrate %dbps", old_bandwidth, max_bitrate, new_bandwidth);
if (gst_hls_demux_update_playlist (demux, TRUE, NULL)) {
+ const gchar *main_uri;
gchar *uri;
- gchar *main_uri;
- uri = gst_m3u8_client_get_current_uri (demux->client);
- main_uri = gst_m3u8_client_get_uri (demux->client);
+
+ uri = gst_m3u8_get_uri (new_variant->m3u8);
+ main_uri = gst_adaptive_demux_get_manifest_ref_uri (adaptive_demux);
gst_element_post_message (GST_ELEMENT_CAST (demux),
gst_message_new_element (GST_OBJECT_CAST (demux),
gst_structure_new (GST_ADAPTIVE_DEMUX_STATISTICS_MESSAGE_NAME,
@@ -1058,58 +1548,60 @@
main_uri, "uri", G_TYPE_STRING,
uri, "bitrate", G_TYPE_INT, new_bandwidth, NULL)));
g_free (uri);
- g_free (main_uri);
if (changed)
*changed = TRUE;
stream->discont = TRUE;
} else {
- GList *failover = NULL;
+ GstHLSVariantStream *failover_variant = NULL;
+ GList *failover;
GST_INFO_OBJECT (demux, "Unable to update playlist. Switching back");
GST_M3U8_CLIENT_LOCK (demux->client);
- failover = g_list_previous (current_variant);
- if (failover && new_bandwidth == GST_M3U8 (failover->data)->bandwidth) {
- current_variant = failover;
+ /* we find variants by bitrate by going from highest to lowest, so it's
+ * possible that there's another variant with the same bitrate before the
+ * one selected which we can use as failover */
+ failover = g_list_find (demux->master->variants, new_variant);
+ if (failover != NULL)
+ failover = failover->prev;
+ if (failover != NULL)
+ failover_variant = failover->data;
+ if (failover_variant && new_bandwidth == failover_variant->bandwidth) {
+ new_variant = failover_variant;
goto retry_failover_protection;
}
- demux->client->main->current_variant = previous_variant;
GST_M3U8_CLIENT_UNLOCK (demux->client);
- gst_m3u8_client_set_current (demux->client, previous_variant->data);
+ gst_hls_demux_set_current_variant (demux, previous_variant);
/* Try a lower bitrate (or stop if we just tried the lowest) */
- if (GST_M3U8 (previous_variant->data)->iframe && new_bandwidth ==
- GST_M3U8 (g_list_first (demux->client->main->iframe_lists)->data)->
- bandwidth)
+ lowest_variant = demux->master->variants->data;
+ lowest_ivariant = demux->master->iframe_variants->data;
+ if (previous_variant->iframe && new_bandwidth == lowest_ivariant->bandwidth)
return FALSE;
- else if (!GST_M3U8 (previous_variant->data)->iframe && new_bandwidth ==
- GST_M3U8 (g_list_first (demux->client->main->lists)->data)->bandwidth)
+ if (!previous_variant->iframe && new_bandwidth == lowest_variant->bandwidth)
return FALSE;
else
return gst_hls_demux_change_playlist (demux, new_bandwidth - 1, changed);
}
- /* Force typefinding since we might have changed media type */
- demux->do_typefind = TRUE;
-
return TRUE;
}
#if defined(HAVE_OPENSSL)
static gboolean
-gst_hls_demux_decrypt_start (GstHLSDemux * demux, const guint8 * key_data,
- const guint8 * iv_data)
+gst_hls_demux_stream_decrypt_start (GstHLSDemuxStream * stream,
+ const guint8 * key_data, const guint8 * iv_data)
{
- EVP_CIPHER_CTX_init (&demux->aes_ctx);
- if (!EVP_DecryptInit_ex (&demux->aes_ctx, EVP_aes_128_cbc (), NULL, key_data,
+ EVP_CIPHER_CTX_init (&stream->aes_ctx);
+ if (!EVP_DecryptInit_ex (&stream->aes_ctx, EVP_aes_128_cbc (), NULL, key_data,
iv_data))
return FALSE;
- EVP_CIPHER_CTX_set_padding (&demux->aes_ctx, 0);
+ EVP_CIPHER_CTX_set_padding (&stream->aes_ctx, 0);
return TRUE;
}
static gboolean
-decrypt_fragment (GstHLSDemux * demux, gsize length,
+decrypt_fragment (GstHLSDemuxStream * stream, gsize length,
const guint8 * encrypted_data, guint8 * decrypted_data)
{
int len, flen = 0;
@@ -1118,102 +1610,102 @@
return FALSE;
len = (int) length;
- if (!EVP_DecryptUpdate (&demux->aes_ctx, decrypted_data, &len, encrypted_data,
- len))
+ if (!EVP_DecryptUpdate (&stream->aes_ctx, decrypted_data, &len,
+ encrypted_data, len))
return FALSE;
- EVP_DecryptFinal_ex (&demux->aes_ctx, decrypted_data + len, &flen);
+ EVP_DecryptFinal_ex (&stream->aes_ctx, decrypted_data + len, &flen);
g_return_val_if_fail (len + flen == length, FALSE);
return TRUE;
}
static void
-gst_hls_demux_decrypt_end (GstHLSDemux * demux)
+gst_hls_demux_stream_decrypt_end (GstHLSDemuxStream * stream)
{
- EVP_CIPHER_CTX_cleanup (&demux->aes_ctx);
+ EVP_CIPHER_CTX_cleanup (&stream->aes_ctx);
}
#elif defined(HAVE_NETTLE)
static gboolean
-gst_hls_demux_decrypt_start (GstHLSDemux * demux, const guint8 * key_data,
- const guint8 * iv_data)
+gst_hls_demux_stream_decrypt_start (GstHLSDemuxStream * stream,
+ const guint8 * key_data, const guint8 * iv_data)
{
- aes_set_decrypt_key (&demux->aes_ctx.ctx, 16, key_data);
- CBC_SET_IV (&demux->aes_ctx, iv_data);
+ aes_set_decrypt_key (&stream->aes_ctx.ctx, 16, key_data);
+ CBC_SET_IV (&stream->aes_ctx, iv_data);
return TRUE;
}
static gboolean
-decrypt_fragment (GstHLSDemux * demux, gsize length,
+decrypt_fragment (GstHLSDemuxStream * stream, gsize length,
const guint8 * encrypted_data, guint8 * decrypted_data)
{
if (length % 16 != 0)
return FALSE;
- CBC_DECRYPT (&demux->aes_ctx, aes_decrypt, length, decrypted_data,
+ CBC_DECRYPT (&stream->aes_ctx, aes_decrypt, length, decrypted_data,
encrypted_data);
return TRUE;
}
static void
-gst_hls_demux_decrypt_end (GstHLSDemux * demux)
+gst_hls_demux_stream_decrypt_end (GstHLSDemuxStream * stream)
{
/* NOP */
}
#else
static gboolean
-gst_hls_demux_decrypt_start (GstHLSDemux * demux, const guint8 * key_data,
- const guint8 * iv_data)
+gst_hls_demux_stream_decrypt_start (GstHLSDemuxStream * stream,
+ const guint8 * key_data, const guint8 * iv_data)
{
gcry_error_t err = 0;
gboolean ret = FALSE;
err =
- gcry_cipher_open (&demux->aes_ctx, GCRY_CIPHER_AES128,
+ gcry_cipher_open (&stream->aes_ctx, GCRY_CIPHER_AES128,
GCRY_CIPHER_MODE_CBC, 0);
if (err)
goto out;
- err = gcry_cipher_setkey (demux->aes_ctx, key_data, 16);
+ err = gcry_cipher_setkey (stream->aes_ctx, key_data, 16);
if (err)
goto out;
- err = gcry_cipher_setiv (demux->aes_ctx, iv_data, 16);
+ err = gcry_cipher_setiv (stream->aes_ctx, iv_data, 16);
if (!err)
ret = TRUE;
out:
if (!ret)
- if (demux->aes_ctx)
- gcry_cipher_close (demux->aes_ctx);
+ if (stream->aes_ctx)
+ gcry_cipher_close (stream->aes_ctx);
return ret;
}
static gboolean
-decrypt_fragment (GstHLSDemux * demux, gsize length,
+decrypt_fragment (GstHLSDemuxStream * stream, gsize length,
const guint8 * encrypted_data, guint8 * decrypted_data)
{
gcry_error_t err = 0;
- err = gcry_cipher_decrypt (demux->aes_ctx, decrypted_data, length,
+ err = gcry_cipher_decrypt (stream->aes_ctx, decrypted_data, length,
encrypted_data, length);
return err == 0;
}
static void
-gst_hls_demux_decrypt_end (GstHLSDemux * demux)
+gst_hls_demux_stream_decrypt_end (GstHLSDemuxStream * stream)
{
- if (demux->aes_ctx) {
- gcry_cipher_close (demux->aes_ctx);
- demux->aes_ctx = NULL;
+ if (stream->aes_ctx) {
+ gcry_cipher_close (stream->aes_ctx);
+ stream->aes_ctx = NULL;
}
}
#endif
static GstBuffer *
-gst_hls_demux_decrypt_fragment (GstHLSDemux * demux,
+gst_hls_demux_decrypt_fragment (GstHLSDemux * demux, GstHLSDemuxStream * stream,
GstBuffer * encrypted_buffer, GError ** err)
{
GstBuffer *decrypted_buffer = NULL;
@@ -1226,7 +1718,7 @@
gst_buffer_map (encrypted_buffer, &encrypted_info, GST_MAP_READ);
gst_buffer_map (decrypted_buffer, &decrypted_info, GST_MAP_WRITE);
- if (!decrypt_fragment (demux, encrypted_info.size,
+ if (!decrypt_fragment (stream, encrypted_info.size,
encrypted_info.data, decrypted_info.data))
goto decrypt_error;
@@ -1256,9 +1748,16 @@
gst_hls_demux_get_manifest_update_interval (GstAdaptiveDemux * demux)
{
GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (demux);
+ GstClockTime target_duration;
- return gst_util_uint64_scale (gst_m3u8_client_get_target_duration
- (hlsdemux->client), G_USEC_PER_SEC, GST_SECOND);
+ if (hlsdemux->current_variant) {
+ target_duration =
+ gst_m3u8_get_target_duration (hlsdemux->current_variant->m3u8);
+ } else {
+ target_duration = 5 * GST_SECOND;
+ }
+
+ return gst_util_uint64_scale (target_duration, G_USEC_PER_SEC, GST_SECOND);
}
static gboolean
@@ -1266,6 +1765,12 @@
gint64 * stop)
{
GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (demux);
+ gboolean ret = FALSE;
- return gst_m3u8_client_get_seek_range (hlsdemux->client, start, stop);
+ if (hlsdemux->current_variant) {
+ ret =
+ gst_m3u8_get_seek_range (hlsdemux->current_variant->m3u8, start, stop);
+ }
+
+ return ret;
}
diff --git a/ext/hls/gsthlsdemux.h b/ext/hls/gsthlsdemux.h
index 1154236..3b6a4c0 100644
--- a/ext/hls/gsthlsdemux.h
+++ b/ext/hls/gsthlsdemux.h
@@ -1,6 +1,7 @@
/* GStreamer
* Copyright (C) 2010 Marc-Andre Lureau <marcandre.lureau@gmail.com>
* Copyright (C) 2010 Andoni Morales Alastruey <ylatuya@gmail.com>
+ * Copyright (C) 2015 Tim-Philipp Müller <tim@centricular.com>
*
* gsthlsdemux.h:
*
@@ -38,6 +39,7 @@
#endif
G_BEGIN_DECLS
+
#define GST_TYPE_HLS_DEMUX \
(gst_hls_demux_get_type())
#define GST_HLS_DEMUX(obj) \
@@ -52,8 +54,74 @@
(G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_HLS_DEMUX,GstHLSDemuxClass))
#define GST_HLS_DEMUX_CAST(obj) \
((GstHLSDemux *)obj)
+
typedef struct _GstHLSDemux GstHLSDemux;
typedef struct _GstHLSDemuxClass GstHLSDemuxClass;
+typedef struct _GstHLSDemuxStream GstHLSDemuxStream;
+typedef struct _GstHLSTSReader GstHLSTSReader;
+
+#define GST_HLS_DEMUX_STREAM_CAST(stream) ((GstHLSDemuxStream *)(stream))
+
+typedef enum {
+ GST_HLS_TSREADER_NONE,
+ GST_HLS_TSREADER_MPEGTS,
+ GST_HLS_TSREADER_ID3
+} GstHLSTSReaderType;
+
+struct _GstHLSTSReader
+{
+ GstHLSTSReaderType rtype;
+ gboolean have_id3;
+
+ gint packet_size;
+ gint pmt_pid;
+ gint pcr_pid;
+
+ GstClockTime last_pcr;
+ GstClockTime first_pcr;
+};
+
+struct _GstHLSDemuxStream
+{
+ GstAdaptiveDemux adaptive_demux_stream;
+
+ GstHLSTSReaderType stream_type;
+
+ GstM3U8 *playlist;
+ gboolean is_primary_playlist;
+
+ gboolean do_typefind; /* Whether we need to typefind the next buffer */
+ GstBuffer *pending_typefind_buffer; /* for collecting data until typefind succeeds */
+
+ GstAdapter *pending_encrypted_data; /* for chunking data into 16 byte multiples for decryption */
+ GstBuffer *pending_decrypted_buffer; /* last decrypted buffer for pkcs7 unpadding.
+ We only know that it is the last at EOS */
+ guint64 current_offset; /* offset we're currently at */
+ gboolean reset_pts;
+
+ /* decryption tooling */
+#if defined(HAVE_OPENSSL)
+ EVP_CIPHER_CTX aes_ctx;
+#elif defined(HAVE_NETTLE)
+ struct CBC_CTX (struct aes_ctx, AES_BLOCK_SIZE) aes_ctx;
+#else
+ gcry_cipher_hd_t aes_ctx;
+#endif
+
+ gchar *current_key;
+ guint8 *current_iv;
+
+ /* Accumulator for reading PAT/PMT/PCR from
+ * the stream so we can set timestamps/segments
+ * and switch cleanly */
+ GstBuffer *pending_pcr_buffer;
+
+ GstHLSTSReader tsreader;
+};
+
+typedef struct {
+ guint8 data[16];
+} GstHLSKey;
/**
* GstHLSDemux:
@@ -66,30 +134,15 @@
gint srcpad_counter;
- gchar *uri; /* Original playlist URI */
- GstM3U8Client *client; /* M3U8 client */
- gboolean do_typefind; /* Whether we need to typefind the next buffer */
+ /* Decryption key cache: url => GstHLSKey */
+ GHashTable *keys;
+ GMutex keys_lock;
- /* Cache for the last key */
- gchar *key_url;
- GstFragment *key_fragment;
+ /* FIXME: check locking, protected automatically by manifest_lock already? */
+ /* The master playlist with the available variant streams */
+ GstHLSMasterPlaylist *master;
- /* decryption tooling */
-#if defined(HAVE_OPENSSL)
- EVP_CIPHER_CTX aes_ctx;
-#elif defined(HAVE_NETTLE)
- struct CBC_CTX (struct aes_ctx, AES_BLOCK_SIZE) aes_ctx;
-#else
- gcry_cipher_hd_t aes_ctx;
-#endif
- gchar *current_key;
- guint8 *current_iv;
- GstBuffer *pending_buffer; /* decryption scenario:
- * the last buffer can only be pushed when
- * resized, so need to store and wait for
- * EOS to know it is the last */
-
- gboolean reset_pts;
+ GstHLSVariantStream *current_variant;
};
struct _GstHLSDemuxClass
@@ -97,6 +150,13 @@
GstAdaptiveDemuxClass parent_class;
};
+
+void gst_hlsdemux_tsreader_init (GstHLSTSReader *r);
+void gst_hlsdemux_tsreader_set_type (GstHLSTSReader *r, GstHLSTSReaderType rtype);
+
+gboolean gst_hlsdemux_tsreader_find_pcrs (GstHLSTSReader *r, GstBuffer *buffer,
+ GstClockTime *first_pcr, GstClockTime *last_pcr);
+
GType gst_hls_demux_get_type (void);
G_END_DECLS
diff --git a/ext/hls/gsthlssink.c b/ext/hls/gsthlssink.c
index 03671d0..b56ef6c 100644
--- a/ext/hls/gsthlssink.c
+++ b/ext/hls/gsthlssink.c
@@ -120,8 +120,7 @@
element_class = GST_ELEMENT_CLASS (klass);
bin_class = GST_BIN_CLASS (klass);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_set_static_metadata (element_class,
"HTTP Live Streaming sink", "Sink", "HTTP Live Streaming sink",
diff --git a/ext/hls/m3u8.c b/ext/hls/m3u8.c
index df267f7..bdb4acf 100644
--- a/ext/hls/m3u8.c
+++ b/ext/hls/m3u8.c
@@ -1,5 +1,6 @@
/* GStreamer
* Copyright (C) 2010 Marc-Andre Lureau <marcandre.lureau@gmail.com>
+ * Copyright (C) 2015 Tim-Philipp Müller <tim@centricular.com>
*
* m3u8.c:
*
@@ -30,60 +31,85 @@
#define GST_CAT_DEFAULT hls_debug
-static GstM3U8 *gst_m3u8_new (void);
-static void gst_m3u8_free (GstM3U8 * m3u8);
-static gboolean gst_m3u8_update (GstM3U8Client * client, GstM3U8 * m3u8,
- gchar * data, gboolean * updated);
static GstM3U8MediaFile *gst_m3u8_media_file_new (gchar * uri,
gchar * title, GstClockTime duration, guint sequence);
-static void gst_m3u8_media_file_free (GstM3U8MediaFile * self);
gchar *uri_join (const gchar * uri, const gchar * path);
-static GstM3U8 *
+GstM3U8 *
gst_m3u8_new (void)
{
GstM3U8 *m3u8;
m3u8 = g_new0 (GstM3U8, 1);
+ m3u8->current_file = NULL;
+ m3u8->current_file_duration = GST_CLOCK_TIME_NONE;
+ m3u8->sequence = -1;
+ m3u8->sequence_position = 0;
+ m3u8->highest_sequence_number = -1;
+ m3u8->duration = GST_CLOCK_TIME_NONE;
+
+ g_mutex_init (&m3u8->lock);
+ m3u8->ref_count = 1;
+
return m3u8;
}
+/* call with M3U8_LOCK held */
static void
-gst_m3u8_set_uri (GstM3U8 * self, gchar * uri, gchar * base_uri, gchar * name)
+gst_m3u8_take_uri (GstM3U8 * self, gchar * uri, gchar * base_uri, gchar * name)
{
g_return_if_fail (self != NULL);
- g_free (self->uri);
- self->uri = uri;
-
- g_free (self->base_uri);
- self->base_uri = base_uri;
-
- g_free (self->name);
- self->name = name;
+ if (self->uri != uri) {
+ g_free (self->uri);
+ self->uri = uri;
+ }
+ if (self->base_uri != base_uri) {
+ g_free (self->base_uri);
+ self->base_uri = base_uri;
+ }
+ if (self->name != name) {
+ g_free (self->name);
+ self->name = name;
+ }
}
-static void
-gst_m3u8_free (GstM3U8 * self)
+void
+gst_m3u8_set_uri (GstM3U8 * m3u8, const gchar * uri, const gchar * base_uri,
+ const gchar * name)
{
- g_return_if_fail (self != NULL);
+ GST_M3U8_LOCK (m3u8);
+ gst_m3u8_take_uri (m3u8, g_strdup (uri), g_strdup (base_uri),
+ g_strdup (name));
+ GST_M3U8_UNLOCK (m3u8);
+}
- g_free (self->uri);
- g_free (self->base_uri);
- g_free (self->name);
- g_free (self->codecs);
+GstM3U8 *
+gst_m3u8_ref (GstM3U8 * m3u8)
+{
+ g_assert (m3u8 != NULL && m3u8->ref_count > 0);
- g_list_foreach (self->files, (GFunc) gst_m3u8_media_file_free, NULL);
- g_list_free (self->files);
+ g_atomic_int_add (&m3u8->ref_count, 1);
+ return m3u8;
+}
- g_free (self->last_data);
- g_list_foreach (self->lists, (GFunc) gst_m3u8_free, NULL);
- g_list_free (self->lists);
- g_list_foreach (self->iframe_lists, (GFunc) gst_m3u8_free, NULL);
- g_list_free (self->iframe_lists);
+void
+gst_m3u8_unref (GstM3U8 * self)
+{
+ g_return_if_fail (self != NULL && self->ref_count > 0);
- g_free (self);
+ if (g_atomic_int_dec_and_test (&self->ref_count)) {
+ g_free (self->uri);
+ g_free (self->base_uri);
+ g_free (self->name);
+
+ g_list_foreach (self->files, (GFunc) gst_m3u8_media_file_unref, NULL);
+ g_list_free (self->files);
+
+ g_free (self->last_data);
+ g_free (self);
+ }
}
static GstM3U8MediaFile *
@@ -97,19 +123,31 @@
file->title = title;
file->duration = duration;
file->sequence = sequence;
+ file->ref_count = 1;
return file;
}
-static void
-gst_m3u8_media_file_free (GstM3U8MediaFile * self)
+GstM3U8MediaFile *
+gst_m3u8_media_file_ref (GstM3U8MediaFile * mfile)
{
- g_return_if_fail (self != NULL);
+ g_assert (mfile != NULL && mfile->ref_count > 0);
- g_free (self->title);
- g_free (self->uri);
- g_free (self->key);
- g_free (self);
+ g_atomic_int_add (&mfile->ref_count, 1);
+ return mfile;
+}
+
+void
+gst_m3u8_media_file_unref (GstM3U8MediaFile * self)
+{
+ g_return_if_fail (self != NULL && self->ref_count > 0);
+
+ if (g_atomic_int_dec_and_test (&self->ref_count)) {
+ g_free (self->title);
+ g_free (self->uri);
+ g_free (self->key);
+ g_free (self);
+ }
}
static gboolean
@@ -257,32 +295,27 @@
}
static gint
-_m3u8_compare_uri (GstM3U8 * a, gchar * uri)
+gst_hls_variant_stream_compare_by_bitrate (gconstpointer a, gconstpointer b)
{
- g_return_val_if_fail (a != NULL, 0);
- g_return_val_if_fail (uri != NULL, 0);
+ const GstHLSVariantStream *vs_a = (const GstHLSVariantStream *) a;
+ const GstHLSVariantStream *vs_b = (const GstHLSVariantStream *) b;
- return g_strcmp0 (a->uri, uri);
-}
+ if (vs_a->bandwidth == vs_b->bandwidth)
+ return g_strcmp0 (vs_a->name, vs_b->name);
-static gint
-gst_m3u8_compare_playlist_by_bitrate (gconstpointer a, gconstpointer b)
-{
- return ((GstM3U8 *) (a))->bandwidth - ((GstM3U8 *) (b))->bandwidth;
+ return vs_a->bandwidth - vs_b->bandwidth;
}
/*
* @data: a m3u8 playlist text data, taking ownership
*/
-static gboolean
-gst_m3u8_update (GstM3U8Client * client, GstM3U8 * self, gchar * data,
- gboolean * updated)
+gboolean
+gst_m3u8_update (GstM3U8 * self, gchar * data)
{
gint val;
GstClockTime duration;
gchar *title, *end;
gboolean discontinuity = FALSE;
- GstM3U8 *list;
gchar *current_key = NULL;
gboolean have_iv = FALSE;
guint8 iv[16] = { 0, };
@@ -291,22 +324,27 @@
g_return_val_if_fail (self != NULL, FALSE);
g_return_val_if_fail (data != NULL, FALSE);
- g_return_val_if_fail (updated != NULL, FALSE);
- *updated = TRUE;
+ GST_M3U8_LOCK (self);
/* check if the data changed since last update */
if (self->last_data && g_str_equal (self->last_data, data)) {
GST_DEBUG ("Playlist is the same as previous one");
- *updated = FALSE;
g_free (data);
+ GST_M3U8_UNLOCK (self);
return TRUE;
}
if (!g_str_has_prefix (data, "#EXTM3U")) {
GST_WARNING ("Data doesn't start with #EXTM3U");
- *updated = FALSE;
g_free (data);
+ GST_M3U8_UNLOCK (self);
+ return FALSE;
+ }
+
+ if (g_strrstr (data, "\n#EXT-X-STREAM-INF:") != NULL) {
+ GST_WARNING ("Not a media playlist, but a master playlist!");
+ GST_M3U8_UNLOCK (self);
return FALSE;
}
@@ -315,19 +353,18 @@
g_free (self->last_data);
self->last_data = data;
- client->current_file = NULL;
+ self->current_file = NULL;
if (self->files) {
- g_list_foreach (self->files, (GFunc) gst_m3u8_media_file_free, NULL);
+ g_list_foreach (self->files, (GFunc) gst_m3u8_media_file_unref, NULL);
g_list_free (self->files);
self->files = NULL;
}
- client->duration = GST_CLOCK_TIME_NONE;
+ self->duration = GST_CLOCK_TIME_NONE;
mediasequence = 0;
/* By default, allow caching */
self->allowcache = TRUE;
- list = NULL;
duration = 0;
title = NULL;
data += 7;
@@ -343,28 +380,13 @@
*r = '\0';
if (data[0] != '#' && data[0] != '\0') {
- gchar *name = data;
- if (duration <= 0 && list == NULL) {
- GST_LOG ("%s: got line without EXTINF or EXTSTREAMINF, dropping", data);
+ if (duration <= 0) {
+ GST_LOG ("%s: got line without EXTINF, dropping", data);
goto next_line;
}
data = uri_join (self->base_uri ? self->base_uri : self->uri, data);
- if (data == NULL)
- goto next_line;
-
- if (list != NULL) {
- if (g_list_find_custom (self->lists, data,
- (GCompareFunc) _m3u8_compare_uri)) {
- GST_DEBUG ("Already have a list with this URI");
- gst_m3u8_free (list);
- g_free (data);
- } else {
- gst_m3u8_set_uri (list, data, NULL, g_strdup (name));
- self->lists = g_list_append (self->lists, list);
- }
- list = NULL;
- } else {
+ if (data != NULL) {
GstM3U8MediaFile *file;
file = gst_m3u8_media_file_new (data, title, duration, mediasequence++);
@@ -435,62 +457,6 @@
} else if (g_str_has_prefix (data_ext_x, "VERSION:")) {
if (int_from_string (data + 15, &data, &val))
self->version = val;
- } else if (g_str_has_prefix (data_ext_x, "STREAM-INF:") ||
- g_str_has_prefix (data_ext_x, "I-FRAME-STREAM-INF:")) {
- gchar *v, *a;
- gboolean iframe = g_str_has_prefix (data_ext_x, "I-FRAME-STREAM-INF:");
- GstM3U8 *new_list;
-
- new_list = gst_m3u8_new ();
- new_list->iframe = iframe;
- data = data + (iframe ? 26 : 18);
- while (data && parse_attributes (&data, &a, &v)) {
- if (g_str_equal (a, "BANDWIDTH")) {
- if (!int_from_string (v, NULL, &new_list->bandwidth))
- GST_WARNING ("Error while reading BANDWIDTH");
- } else if (g_str_equal (a, "PROGRAM-ID")) {
- if (!int_from_string (v, NULL, &new_list->program_id))
- GST_WARNING ("Error while reading PROGRAM-ID");
- } else if (g_str_equal (a, "CODECS")) {
- g_free (new_list->codecs);
- new_list->codecs = g_strdup (v);
- } else if (g_str_equal (a, "RESOLUTION")) {
- if (!int_from_string (v, &v, &new_list->width))
- GST_WARNING ("Error while reading RESOLUTION width");
- if (!v || *v != 'x') {
- GST_WARNING ("Missing height");
- } else {
- v = g_utf8_next_char (v);
- if (!int_from_string (v, NULL, &new_list->height))
- GST_WARNING ("Error while reading RESOLUTION height");
- }
- } else if (iframe && g_str_equal (a, "URI")) {
- gchar *name;
- gchar *uri;
-
- uri = uri_join (self->base_uri ? self->base_uri : self->uri, v);
- if (uri) {
- name = g_strdup (uri);
- gst_m3u8_set_uri (new_list, uri, NULL, name);
- }
- }
- }
-
- if (iframe) {
- if (g_list_find_custom (self->iframe_lists, new_list->uri,
- (GCompareFunc) _m3u8_compare_uri)) {
- GST_DEBUG ("Already have a list with this URI");
- gst_m3u8_free (new_list);
- } else {
- self->iframe_lists = g_list_append (self->iframe_lists, new_list);
- }
- } else {
- if (list != NULL) {
- GST_WARNING ("Found a list without a uri..., dropping");
- gst_m3u8_free (list);
- }
- list = new_list;
- }
} else if (g_str_has_prefix (data_ext_x, "TARGETDURATION:")) {
if (int_from_string (data + 22, &data, &val))
self->targetduration = val * GST_SECOND;
@@ -579,38 +545,16 @@
g_free (current_key);
current_key = NULL;
+ if (self->files == NULL) {
+ GST_ERROR ("Invalid media playlist, it does not contain any media files");
+ GST_M3U8_UNLOCK (self);
+ return FALSE;
+ }
+
self->files = g_list_reverse (self->files);
- /* reorder playlists by bitrate */
- if (self->lists) {
- gchar *top_variant_uri = NULL;
- gboolean iframe = FALSE;
-
- if (!self->current_variant) {
- top_variant_uri = GST_M3U8 (self->lists->data)->uri;
- } else {
- top_variant_uri = GST_M3U8 (self->current_variant->data)->uri;
- iframe = GST_M3U8 (self->current_variant->data)->iframe;
- }
-
- self->lists =
- g_list_sort (self->lists,
- (GCompareFunc) gst_m3u8_compare_playlist_by_bitrate);
-
- self->iframe_lists =
- g_list_sort (self->iframe_lists,
- (GCompareFunc) gst_m3u8_compare_playlist_by_bitrate);
-
- if (iframe)
- self->current_variant =
- g_list_find_custom (self->iframe_lists, top_variant_uri,
- (GCompareFunc) _m3u8_compare_uri);
- else
- self->current_variant = g_list_find_custom (self->lists, top_variant_uri,
- (GCompareFunc) _m3u8_compare_uri);
- }
/* calculate the start and end times of this media playlist. */
- if (self->files) {
+ {
GList *walk;
GstM3U8MediaFile *file;
GstClockTime duration = 0;
@@ -618,231 +562,75 @@
for (walk = self->files; walk; walk = walk->next) {
file = walk->data;
duration += file->duration;
- if (file->sequence > client->highest_sequence_number) {
- if (client->highest_sequence_number >= 0) {
+ if (file->sequence > self->highest_sequence_number) {
+ if (self->highest_sequence_number >= 0) {
/* if an update of the media playlist has been missed, there
will be a gap between self->highest_sequence_number and the
first sequence number in this media playlist. In this situation
assume that the missing fragments had a duration of
targetduration each */
- client->last_file_end +=
- (file->sequence - client->highest_sequence_number -
+ self->last_file_end +=
+ (file->sequence - self->highest_sequence_number -
1) * self->targetduration;
}
- client->last_file_end += file->duration;
- client->highest_sequence_number = file->sequence;
+ self->last_file_end += file->duration;
+ self->highest_sequence_number = file->sequence;
}
}
- if (GST_M3U8_CLIENT_IS_LIVE (client)) {
- client->first_file_start = client->last_file_end - duration;
+ if (GST_M3U8_IS_LIVE (self)) {
+ self->first_file_start = self->last_file_end - duration;
GST_DEBUG ("Live playlist range %" GST_TIME_FORMAT " -> %"
- GST_TIME_FORMAT, GST_TIME_ARGS (client->first_file_start),
- GST_TIME_ARGS (client->last_file_end));
+ GST_TIME_FORMAT, GST_TIME_ARGS (self->first_file_start),
+ GST_TIME_ARGS (self->last_file_end));
}
- client->duration = duration;
+ self->duration = duration;
}
+ /* first-time setup */
+ if (self->files && self->sequence == -1) {
+ GList *file;
+
+ if (GST_M3U8_IS_LIVE (self)) {
+ gint i;
+
+ file = g_list_last (self->files);
+
+ /* for live streams, start GST_M3U8_LIVE_MIN_FRAGMENT_DISTANCE from
+ * the end of the playlist. See section 6.3.3 of HLS draft. Note
+ * the -1, because GST_M3U8_LIVE_MIN_FRAGMENT_DISTANCE = 1 means
+ * start 1 target-duration from the end */
+ for (i = 0; i < GST_M3U8_LIVE_MIN_FRAGMENT_DISTANCE - 1 && file->prev;
+ ++i)
+ file = file->prev;
+ } else {
+ file = g_list_first (self->files);
+ }
+ self->current_file = file;
+ self->sequence = GST_M3U8_MEDIA_FILE (file->data)->sequence;
+ self->sequence_position = 0;
+ GST_DEBUG ("first sequence: %u", (guint) self->sequence);
+ }
+
+ GST_LOG ("processed media playlist %s, %u fragments", self->name,
+ g_list_length (self->files));
+
+ GST_M3U8_UNLOCK (self);
+
return TRUE;
}
-GstM3U8Client *
-gst_m3u8_client_new (const gchar * uri, const gchar * base_uri)
-{
- GstM3U8Client *client;
-
- g_return_val_if_fail (uri != NULL, NULL);
-
- client = g_new0 (GstM3U8Client, 1);
- client->main = gst_m3u8_new ();
- client->current = NULL;
- client->current_file = NULL;
- client->current_file_duration = GST_CLOCK_TIME_NONE;
- client->sequence = -1;
- client->sequence_position = 0;
- client->highest_sequence_number = -1;
- client->duration = GST_CLOCK_TIME_NONE;
- g_mutex_init (&client->lock);
- gst_m3u8_set_uri (client->main, g_strdup (uri), g_strdup (base_uri), NULL);
-
- return client;
-}
-
-void
-gst_m3u8_client_free (GstM3U8Client * self)
-{
- g_return_if_fail (self != NULL);
-
- gst_m3u8_free (self->main);
- g_mutex_clear (&self->lock);
- g_free (self);
-}
-
-void
-gst_m3u8_client_set_current (GstM3U8Client * self, GstM3U8 * m3u8)
-{
- g_return_if_fail (self != NULL);
-
- GST_M3U8_CLIENT_LOCK (self);
- if (m3u8 != self->current) {
- self->current = m3u8;
- self->duration = GST_CLOCK_TIME_NONE;
- self->current_file = NULL;
- }
- GST_M3U8_CLIENT_UNLOCK (self);
-}
-
-gboolean
-gst_m3u8_client_update (GstM3U8Client * self, gchar * data)
-{
- GstM3U8 *m3u8;
- gboolean updated = FALSE;
- gboolean ret = FALSE;
-
- g_return_val_if_fail (self != NULL, FALSE);
-
- GST_M3U8_CLIENT_LOCK (self);
- m3u8 = self->current ? self->current : self->main;
-
- if (!gst_m3u8_update (self, m3u8, data, &updated))
- goto out;
-
- if (!updated)
- goto out;
-
- if (self->current && !self->current->files) {
- GST_ERROR ("Invalid media playlist, it does not contain any media files");
- goto out;
- }
-
- /* select the first playlist, for now */
- if (!self->current) {
- if (self->main->lists) {
- self->current = self->main->current_variant->data;
- } else {
- self->current = self->main;
- }
- }
-
- if (m3u8->files && self->sequence == -1) {
- if (GST_M3U8_CLIENT_IS_LIVE (self)) {
- /* 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 (m3u8->files) - GST_M3U8_LIVE_MIN_FRAGMENT_DISTANCE;
- self->current_file = g_list_nth (m3u8->files, pos >= 0 ? pos : 0);
- } else {
- self->current_file = g_list_first (m3u8->files);
- }
- self->sequence = GST_M3U8_MEDIA_FILE (self->current_file->data)->sequence;
- self->sequence_position = 0;
- GST_DEBUG ("Setting first sequence at %u", (guint) self->sequence);
- }
-
- ret = TRUE;
-out:
- GST_M3U8_CLIENT_UNLOCK (self);
- return ret;
-}
-
-static gint
-_find_m3u8_list_match (const GstM3U8 * a, const GstM3U8 * b)
-{
- if (g_strcmp0 (a->name, b->name) == 0 &&
- a->bandwidth == b->bandwidth &&
- a->program_id == b->program_id &&
- g_strcmp0 (a->codecs, b->codecs) == 0 &&
- a->width == b->width &&
- a->height == b->height && a->iframe == b->iframe) {
- return 0;
- }
-
- return 1;
-}
-
-gboolean
-gst_m3u8_client_update_variant_playlist (GstM3U8Client * self, gchar * data,
- const gchar * uri, const gchar * base_uri)
-{
- gboolean ret = FALSE;
- GList *list_entry, *unmatched_lists;
- GstM3U8Client *new_client;
- GstM3U8 *old;
-
- g_return_val_if_fail (self != NULL, FALSE);
-
- new_client = gst_m3u8_client_new (uri, base_uri);
- if (gst_m3u8_client_update (new_client, data)) {
- if (!new_client->main->lists) {
- GST_ERROR
- ("Cannot update variant playlist: New playlist is not a variant playlist");
- gst_m3u8_client_free (new_client);
- return FALSE;
- }
-
- GST_M3U8_CLIENT_LOCK (self);
-
- if (!self->main->lists) {
- GST_ERROR
- ("Cannot update variant playlist: Current playlist is not a variant playlist");
- goto out;
- }
-
- /* Now see if the variant playlist still has the same lists */
- unmatched_lists = g_list_copy (self->main->lists);
- for (list_entry = new_client->main->lists; list_entry;
- list_entry = list_entry->next) {
- GList *match = g_list_find_custom (unmatched_lists, list_entry->data,
- (GCompareFunc) _find_m3u8_list_match);
- if (match)
- unmatched_lists = g_list_delete_link (unmatched_lists, match);
- }
-
- if (unmatched_lists != NULL) {
- GST_WARNING ("Unable to match all playlists");
-
- for (list_entry = unmatched_lists; list_entry;
- list_entry = list_entry->next) {
- if (list_entry->data == self->current) {
- GST_WARNING ("Unable to match current playlist");
- }
- }
-
- g_list_free (unmatched_lists);
- }
-
- /* Switch out the variant playlist, steal it from new_client */
- old = self->main;
-
- self->main = new_client->main;
- new_client->main = gst_m3u8_new ();
-
- if (self->main->lists)
- self->current = self->main->current_variant->data;
- else
- self->current = self->main;
-
- gst_m3u8_free (old);
-
- ret = TRUE;
-
- out:
- GST_M3U8_CLIENT_UNLOCK (self);
- }
-
- gst_m3u8_client_free (new_client);
- return ret;
-}
-
+/* call with M3U8_LOCK held */
static GList *
-find_next_fragment (GstM3U8Client * client, GList * l, gboolean forward)
+m3u8_find_next_fragment (GstM3U8 * m3u8, gboolean forward)
{
GstM3U8MediaFile *file;
+ GList *l = m3u8->files;
if (forward) {
while (l) {
file = l->data;
- if (file->sequence >= client->sequence)
+ if (file->sequence >= m3u8->sequence)
break;
l = l->next;
@@ -853,7 +641,7 @@
while (l) {
file = l->data;
- if (file->sequence <= client->sequence)
+ if (file->sequence <= m3u8->sequence)
break;
l = l->prev;
@@ -863,102 +651,78 @@
return l;
}
-static gboolean
-has_next_fragment (GstM3U8Client * client, GList * l, gboolean forward)
+GstM3U8MediaFile *
+gst_m3u8_get_next_fragment (GstM3U8 * m3u8, gboolean forward,
+ GstClockTime * sequence_position, gboolean * discont)
{
- l = find_next_fragment (client, l, forward);
+ GstM3U8MediaFile *file = NULL;
- if (l) {
- return (forward && l->next) || (!forward && l->prev);
- }
+ g_return_val_if_fail (m3u8 != NULL, NULL);
- return FALSE;
+ GST_M3U8_LOCK (m3u8);
+
+ GST_DEBUG ("Looking for fragment %" G_GINT64_FORMAT, m3u8->sequence);
+
+ if (m3u8->sequence < 0) /* can't happen really */
+ goto out;
+
+ if (m3u8->current_file == NULL)
+ m3u8->current_file = m3u8_find_next_fragment (m3u8, forward);
+
+ if (m3u8->current_file == NULL)
+ goto out;
+
+ file = gst_m3u8_media_file_ref (m3u8->current_file->data);
+
+ GST_DEBUG ("Got fragment with sequence %u (current sequence %u)",
+ (guint) file->sequence, (guint) m3u8->sequence);
+
+ if (sequence_position)
+ *sequence_position = m3u8->sequence_position;
+ if (discont)
+ *discont = file->discont || (m3u8->sequence != file->sequence);
+
+ m3u8->current_file_duration = file->duration;
+ m3u8->sequence = file->sequence;
+
+out:
+
+ GST_M3U8_UNLOCK (m3u8);
+
+ return file;
}
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)
+gst_m3u8_has_next_fragment (GstM3U8 * m3u8, gboolean forward)
{
- GstM3U8MediaFile *file;
+ gboolean have_next;
+ GList *cur;
- g_return_val_if_fail (client != NULL, FALSE);
- g_return_val_if_fail (client->current != NULL, FALSE);
+ g_return_val_if_fail (m3u8 != NULL, FALSE);
- GST_M3U8_CLIENT_LOCK (client);
- GST_DEBUG ("Looking for fragment %" G_GINT64_FORMAT, client->sequence);
- if (client->sequence < 0) {
- GST_M3U8_CLIENT_UNLOCK (client);
- return FALSE;
- }
- if (!client->current_file) {
- client->current_file =
- find_next_fragment (client, client->current->files, forward);
- }
+ GST_M3U8_LOCK (m3u8);
- if (!client->current_file) {
- GST_M3U8_CLIENT_UNLOCK (client);
- return FALSE;
- }
+ GST_DEBUG ("Checking next fragment %" G_GINT64_FORMAT,
+ m3u8->sequence + (forward ? 1 : -1));
- file = GST_M3U8_MEDIA_FILE (client->current_file->data);
- GST_DEBUG ("Got fragment with sequence %u (client sequence %u)",
- (guint) file->sequence, (guint) client->sequence);
-
- client->current_file_duration = file->duration;
- if (timestamp)
- *timestamp = client->sequence_position;
-
- if (discontinuity)
- *discontinuity = client->sequence != file->sequence || file->discont;
- if (uri)
- *uri = g_strdup (file->uri);
- if (duration)
- *duration = file->duration;
- if (range_start)
- *range_start = file->offset;
- if (range_end)
- *range_end = file->size != -1 ? file->offset + file->size - 1 : -1;
- if (key)
- *key = g_strdup (file->key);
- if (iv) {
- *iv = g_new (guint8, sizeof (file->iv));
- memcpy (*iv, file->iv, sizeof (file->iv));
- }
-
- client->sequence = file->sequence;
-
- GST_M3U8_CLIENT_UNLOCK (client);
- return TRUE;
-}
-
-gboolean
-gst_m3u8_client_has_next_fragment (GstM3U8Client * client, gboolean forward)
-{
- gboolean ret;
-
- g_return_val_if_fail (client != NULL, FALSE);
- g_return_val_if_fail (client->current != NULL, FALSE);
-
- GST_M3U8_CLIENT_LOCK (client);
- GST_DEBUG ("Checking if has next fragment %" G_GINT64_FORMAT,
- client->sequence + (forward ? 1 : -1));
- if (client->current_file) {
- ret =
- (forward ? client->current_file->next : client->current_file->prev) !=
- NULL;
+ if (m3u8->current_file) {
+ cur = m3u8->current_file;
} else {
- ret = has_next_fragment (client, client->current->files, forward);
+ cur = m3u8_find_next_fragment (m3u8, forward);
}
- GST_M3U8_CLIENT_UNLOCK (client);
- return ret;
+
+ have_next = (forward && cur->next) || (!forward && cur->prev);
+
+ GST_M3U8_UNLOCK (m3u8);
+
+ return have_next;
}
+/* call with M3U8_LOCK held */
static void
-alternate_advance (GstM3U8Client * client, gboolean forward)
+m3u8_alternate_advance (GstM3U8 * m3u8, gboolean forward)
{
- gint targetnum = client->sequence;
+ gint targetnum = m3u8->sequence;
GList *tmp;
GstM3U8MediaFile *mf;
@@ -968,7 +732,7 @@
else
targetnum -= 1;
- for (tmp = client->current->files; tmp; tmp = tmp->next) {
+ for (tmp = m3u8->files; tmp; tmp = tmp->next) {
mf = (GstM3U8MediaFile *) tmp->data;
if (mf->sequence == targetnum)
break;
@@ -977,218 +741,161 @@
GST_WARNING ("Can't find next fragment");
return;
}
- client->current_file = tmp;
- client->sequence = targetnum;
- client->current_file_duration =
- GST_M3U8_MEDIA_FILE (client->current_file->data)->duration;
+ m3u8->current_file = tmp;
+ m3u8->sequence = targetnum;
+ m3u8->current_file_duration = GST_M3U8_MEDIA_FILE (tmp->data)->duration;
}
void
-gst_m3u8_client_advance_fragment (GstM3U8Client * client, gboolean forward)
+gst_m3u8_advance_fragment (GstM3U8 * m3u8, gboolean forward)
{
GstM3U8MediaFile *file;
- g_return_if_fail (client != NULL);
- g_return_if_fail (client->current != NULL);
+ g_return_if_fail (m3u8 != NULL);
- GST_M3U8_CLIENT_LOCK (client);
+ GST_M3U8_LOCK (m3u8);
+
GST_DEBUG ("Sequence position was %" GST_TIME_FORMAT,
- GST_TIME_ARGS (client->sequence_position));
- if (GST_CLOCK_TIME_IS_VALID (client->current_file_duration)) {
+ GST_TIME_ARGS (m3u8->sequence_position));
+ if (GST_CLOCK_TIME_IS_VALID (m3u8->current_file_duration)) {
/* Advance our position based on the previous fragment we played */
if (forward)
- client->sequence_position += client->current_file_duration;
- else if (client->current_file_duration < client->sequence_position)
- client->sequence_position -= client->current_file_duration;
+ m3u8->sequence_position += m3u8->current_file_duration;
+ else if (m3u8->current_file_duration < m3u8->sequence_position)
+ m3u8->sequence_position -= m3u8->current_file_duration;
else
- client->sequence_position = 0;
- client->current_file_duration = GST_CLOCK_TIME_NONE;
+ m3u8->sequence_position = 0;
+ m3u8->current_file_duration = GST_CLOCK_TIME_NONE;
GST_DEBUG ("Sequence position now %" GST_TIME_FORMAT,
- GST_TIME_ARGS (client->sequence_position));
+ GST_TIME_ARGS (m3u8->sequence_position));
}
- if (!client->current_file) {
+ if (!m3u8->current_file) {
GList *l;
- GST_DEBUG ("Looking for fragment %" G_GINT64_FORMAT, client->sequence);
- for (l = client->current->files; l != NULL; l = l->next) {
- if (GST_M3U8_MEDIA_FILE (l->data)->sequence == client->sequence) {
- client->current_file = l;
+ GST_DEBUG ("Looking for fragment %" G_GINT64_FORMAT, m3u8->sequence);
+ for (l = m3u8->files; l != NULL; l = l->next) {
+ if (GST_M3U8_MEDIA_FILE (l->data)->sequence == m3u8->sequence) {
+ m3u8->current_file = l;
break;
}
}
- if (client->current_file == NULL) {
+ if (m3u8->current_file == NULL) {
GST_DEBUG
("Could not find current fragment, trying next fragment directly");
- alternate_advance (client, forward);
+ m3u8_alternate_advance (m3u8, forward);
/* Resync sequence number if the above has failed for live streams */
- if (client->current_file == NULL && GST_M3U8_CLIENT_IS_LIVE (client)) {
+ if (m3u8->current_file == NULL && GST_M3U8_IS_LIVE (m3u8)) {
/* 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;
+ g_list_length (m3u8->files) - GST_M3U8_LIVE_MIN_FRAGMENT_DISTANCE;
+ m3u8->current_file = g_list_nth (m3u8->files, pos >= 0 ? pos : 0);
+ m3u8->current_file_duration =
+ GST_M3U8_MEDIA_FILE (m3u8->current_file->data)->duration;
GST_WARNING ("Resyncing live playlist");
}
- GST_M3U8_CLIENT_UNLOCK (client);
- return;
+ goto out;
}
}
- file = GST_M3U8_MEDIA_FILE (client->current_file->data);
+ file = GST_M3U8_MEDIA_FILE (m3u8->current_file->data);
GST_DEBUG ("Advancing from sequence %u", (guint) file->sequence);
if (forward) {
- client->current_file = client->current_file->next;
- if (client->current_file) {
- client->sequence =
- GST_M3U8_MEDIA_FILE (client->current_file->data)->sequence;
+ m3u8->current_file = m3u8->current_file->next;
+ if (m3u8->current_file) {
+ m3u8->sequence = GST_M3U8_MEDIA_FILE (m3u8->current_file->data)->sequence;
} else {
- client->sequence = file->sequence + 1;
+ m3u8->sequence = file->sequence + 1;
}
} else {
- client->current_file = client->current_file->prev;
- if (client->current_file) {
- client->sequence =
- GST_M3U8_MEDIA_FILE (client->current_file->data)->sequence;
+ m3u8->current_file = m3u8->current_file->prev;
+ if (m3u8->current_file) {
+ m3u8->sequence = GST_M3U8_MEDIA_FILE (m3u8->current_file->data)->sequence;
} else {
- client->sequence = file->sequence - 1;
+ m3u8->sequence = file->sequence - 1;
}
}
- if (client->current_file) {
+ if (m3u8->current_file) {
/* Store duration of the fragment we're using to update the position
* the next time we advance */
- client->current_file_duration =
- GST_M3U8_MEDIA_FILE (client->current_file->data)->duration;
+ m3u8->current_file_duration =
+ GST_M3U8_MEDIA_FILE (m3u8->current_file->data)->duration;
}
- GST_M3U8_CLIENT_UNLOCK (client);
-}
-static void
-_sum_duration (GstM3U8MediaFile * self, GstClockTime * duration)
-{
- *duration += self->duration;
+out:
+
+ GST_M3U8_UNLOCK (m3u8);
}
GstClockTime
-gst_m3u8_client_get_duration (GstM3U8Client * client)
+gst_m3u8_get_duration (GstM3U8 * m3u8)
{
GstClockTime duration = GST_CLOCK_TIME_NONE;
- g_return_val_if_fail (client != NULL, GST_CLOCK_TIME_NONE);
+ g_return_val_if_fail (m3u8 != NULL, GST_CLOCK_TIME_NONE);
- GST_M3U8_CLIENT_LOCK (client);
+ GST_M3U8_LOCK (m3u8);
+
/* We can only get the duration for on-demand streams */
- if (!client->current || !client->current->endlist) {
- GST_M3U8_CLIENT_UNLOCK (client);
- return GST_CLOCK_TIME_NONE;
- }
+ if (!m3u8->endlist)
+ goto out;
- if (!GST_CLOCK_TIME_IS_VALID (client->duration) && client->current->files) {
- client->duration = 0;
- g_list_foreach (client->current->files, (GFunc) _sum_duration,
- &client->duration);
+ if (!GST_CLOCK_TIME_IS_VALID (m3u8->duration) && m3u8->files != NULL) {
+ GList *f;
+
+ m3u8->duration = 0;
+ for (f = m3u8->files; f != NULL; f = f->next)
+ m3u8->duration += GST_M3U8_MEDIA_FILE (f)->duration;
}
- duration = client->duration;
- GST_M3U8_CLIENT_UNLOCK (client);
+ duration = m3u8->duration;
+
+out:
+
+ GST_M3U8_UNLOCK (m3u8);
return duration;
}
GstClockTime
-gst_m3u8_client_get_target_duration (GstM3U8Client * client)
+gst_m3u8_get_target_duration (GstM3U8 * m3u8)
{
- GstClockTime duration = 0;
+ GstClockTime target_duration;
- g_return_val_if_fail (client != NULL, GST_CLOCK_TIME_NONE);
+ g_return_val_if_fail (m3u8 != NULL, GST_CLOCK_TIME_NONE);
- GST_M3U8_CLIENT_LOCK (client);
- duration = client->current->targetduration;
- GST_M3U8_CLIENT_UNLOCK (client);
- return duration;
+ GST_M3U8_LOCK (m3u8);
+ target_duration = m3u8->targetduration;
+ GST_M3U8_UNLOCK (m3u8);
+
+ return target_duration;
}
gchar *
-gst_m3u8_client_get_uri (GstM3U8Client * client)
+gst_m3u8_get_uri (GstM3U8 * m3u8)
{
gchar *uri;
- g_return_val_if_fail (client != NULL, NULL);
+ GST_M3U8_LOCK (m3u8);
+ uri = g_strdup (m3u8->uri);
+ GST_M3U8_UNLOCK (m3u8);
- GST_M3U8_CLIENT_LOCK (client);
- uri = client->main ? g_strdup (client->main->uri) : NULL;
- GST_M3U8_CLIENT_UNLOCK (client);
- return uri;
-}
-
-gchar *
-gst_m3u8_client_get_current_uri (GstM3U8Client * client)
-{
- gchar *uri;
-
- g_return_val_if_fail (client != NULL, NULL);
-
- GST_M3U8_CLIENT_LOCK (client);
- uri = g_strdup (client->current->uri);
- GST_M3U8_CLIENT_UNLOCK (client);
return uri;
}
gboolean
-gst_m3u8_client_has_variant_playlist (GstM3U8Client * client)
+gst_m3u8_is_live (GstM3U8 * m3u8)
{
- gboolean ret;
+ gboolean is_live;
- g_return_val_if_fail (client != NULL, FALSE);
+ g_return_val_if_fail (m3u8 != NULL, FALSE);
- GST_M3U8_CLIENT_LOCK (client);
- ret = (client->main->lists != NULL);
- GST_M3U8_CLIENT_UNLOCK (client);
- return ret;
-}
+ GST_M3U8_LOCK (m3u8);
+ is_live = GST_M3U8_IS_LIVE (m3u8);
+ GST_M3U8_UNLOCK (m3u8);
-gboolean
-gst_m3u8_client_is_live (GstM3U8Client * client)
-{
- gboolean ret;
-
- g_return_val_if_fail (client != NULL, FALSE);
-
- GST_M3U8_CLIENT_LOCK (client);
- ret = GST_M3U8_CLIENT_IS_LIVE (client);
- GST_M3U8_CLIENT_UNLOCK (client);
- return ret;
-}
-
-GList *
-gst_m3u8_client_get_playlist_for_bitrate (GstM3U8Client * client, guint bitrate)
-{
- GList *list, *current_variant;
-
- GST_M3U8_CLIENT_LOCK (client);
- current_variant = client->main->current_variant;
-
- /* Go to the highest possible bandwidth allowed */
- while (GST_M3U8 (current_variant->data)->bandwidth <= bitrate) {
- list = g_list_next (current_variant);
- if (!list)
- break;
- current_variant = list;
- }
-
- while (GST_M3U8 (current_variant->data)->bandwidth > bitrate) {
- list = g_list_previous (current_variant);
- if (!list)
- break;
- current_variant = list;
- }
- GST_M3U8_CLIENT_UNLOCK (client);
-
- return current_variant;
+ return is_live;
}
gchar *
@@ -1248,8 +955,7 @@
}
gboolean
-gst_m3u8_client_get_seek_range (GstM3U8Client * client, gint64 * start,
- gint64 * stop)
+gst_m3u8_get_seek_range (GstM3U8 * m3u8, gint64 * start, gint64 * stop)
{
GstClockTime duration = 0;
GList *walk;
@@ -1257,36 +963,641 @@
guint count;
guint min_distance = 0;
- g_return_val_if_fail (client != NULL, FALSE);
+ g_return_val_if_fail (m3u8 != NULL, FALSE);
- GST_M3U8_CLIENT_LOCK (client);
+ GST_M3U8_LOCK (m3u8);
- if (client->current == NULL || client->current->files == NULL) {
- GST_M3U8_CLIENT_UNLOCK (client);
- return FALSE;
- }
+ if (m3u8->files == NULL)
+ goto out;
- if (GST_M3U8_CLIENT_IS_LIVE (client)) {
+ if (GST_M3U8_IS_LIVE (m3u8)) {
/* 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 = g_list_length (m3u8->files);
- for (walk = client->current->files;
- walk && count >= min_distance; walk = walk->next) {
+ for (walk = m3u8->files; walk && count >= min_distance; walk = walk->next) {
file = walk->data;
--count;
duration += file->duration;
}
- if (duration <= 0) {
- GST_M3U8_CLIENT_UNLOCK (client);
- return FALSE;
- }
- *start = client->first_file_start;
+ if (duration <= 0)
+ goto out;
+
+ *start = m3u8->first_file_start;
*stop = *start + duration;
- GST_M3U8_CLIENT_UNLOCK (client);
- return TRUE;
+
+out:
+
+ GST_M3U8_UNLOCK (m3u8);
+ return (duration > 0);
+}
+
+GstHLSMedia *
+gst_hls_media_ref (GstHLSMedia * media)
+{
+ g_assert (media != NULL && media->ref_count > 0);
+ g_atomic_int_add (&media->ref_count, 1);
+ return media;
+}
+
+void
+gst_hls_media_unref (GstHLSMedia * media)
+{
+ g_assert (media != NULL && media->ref_count > 0);
+ if (g_atomic_int_dec_and_test (&media->ref_count)) {
+ g_free (media->group_id);
+ g_free (media->name);
+ g_free (media->uri);
+ g_free (media);
+ }
+}
+
+static GstHLSMediaType
+gst_m3u8_get_hls_media_type_from_string (const gchar * type_name)
+{
+ if (strcmp (type_name, "AUDIO") == 0)
+ return GST_HLS_MEDIA_TYPE_AUDIO;
+ if (strcmp (type_name, "VIDEO") == 0)
+ return GST_HLS_MEDIA_TYPE_VIDEO;
+ if (strcmp (type_name, "SUBTITLES") == 0)
+ return GST_HLS_MEDIA_TYPE_SUBTITLES;
+ if (strcmp (type_name, "CLOSED_CAPTIONS") == 0)
+ return GST_HLS_MEDIA_TYPE_CLOSED_CAPTIONS;
+
+ return GST_HLS_MEDIA_TYPE_INVALID;
+}
+
+#define GST_HLS_MEDIA_TYPE_NAME(mtype) gst_m3u8_hls_media_type_get_nick(mtype)
+static inline const gchar *
+gst_m3u8_hls_media_type_get_nick (GstHLSMediaType mtype)
+{
+ static const gchar *nicks[GST_HLS_N_MEDIA_TYPES] = { "audio", "video",
+ "subtitle", "closed-captions"
+ };
+
+ if (mtype < 0 || mtype >= GST_HLS_N_MEDIA_TYPES)
+ return "invalid";
+
+ return nicks[mtype];
+}
+
+/* returns unquoted copy of string */
+static gchar *
+gst_m3u8_unquote (const gchar * str)
+{
+ const gchar *start, *end;
+
+ start = strchr (str, '"');
+ if (start == NULL)
+ return g_strdup (str);
+ end = strchr (start + 1, '"');
+ if (end == NULL) {
+ GST_WARNING ("Broken quoted string [%s] - can't find end quote", str);
+ return g_strdup (start + 1);
+ }
+ return g_strndup (start + 1, (gsize) (end - (start + 1)));
+}
+
+static GstHLSMedia *
+gst_m3u8_parse_media (gchar * desc, const gchar * base_uri)
+{
+ GstHLSMediaType mtype = GST_HLS_MEDIA_TYPE_INVALID;
+ GstHLSMedia *media;
+ gchar *a, *v;
+
+ media = g_new0 (GstHLSMedia, 1);
+ media->ref_count = 1;
+ media->playlist = gst_m3u8_new ();
+
+ GST_LOG ("parsing %s", desc);
+ while (desc != NULL && parse_attributes (&desc, &a, &v)) {
+ if (strcmp (a, "TYPE") == 0) {
+ media->mtype = gst_m3u8_get_hls_media_type_from_string (v);
+ } else if (strcmp (a, "GROUP-ID") == 0) {
+ g_free (media->group_id);
+ media->group_id = gst_m3u8_unquote (v);
+ } else if (strcmp (a, "NAME") == 0) {
+ g_free (media->name);
+ media->name = gst_m3u8_unquote (v);
+ } else if (strcmp (a, "URI") == 0) {
+ gchar *uri;
+
+ g_free (media->uri);
+ uri = gst_m3u8_unquote (v);
+ media->uri = uri_join (base_uri, uri);
+ g_free (uri);
+ } else if (strcmp (a, "LANGUAGE") == 0) {
+ g_free (media->lang);
+ media->lang = gst_m3u8_unquote (v);
+ } else if (strcmp (a, "DEFAULT") == 0) {
+ media->is_default = g_ascii_strcasecmp (v, "yes") == 0;
+ } else if (strcmp (a, "FORCED") == 0) {
+ media->forced = g_ascii_strcasecmp (v, "yes") == 0;
+ } else if (strcmp (a, "AUTOSELECT") == 0) {
+ media->autoselect = g_ascii_strcasecmp (v, "yes") == 0;
+ } else {
+ /* unhandled: ASSOC-LANGUAGE, INSTREAM-ID, CHARACTERISTICS */
+ GST_FIXME ("EXT-X-MEDIA: unhandled attribute: %s = %s", a, v);
+ }
+ }
+
+ if (media->mtype == GST_HLS_MEDIA_TYPE_INVALID)
+ goto required_attributes_missing;
+
+ if (media->uri == NULL)
+ goto existing_stream;
+
+ if (media->group_id == NULL || media->name == NULL)
+ goto required_attributes_missing;
+
+ if (mtype == GST_HLS_MEDIA_TYPE_CLOSED_CAPTIONS)
+ goto uri_with_cc;
+
+ GST_DEBUG ("media: %s, group '%s', name '%s', uri '%s', %s %s %s, lang=%s",
+ GST_HLS_MEDIA_TYPE_NAME (media->mtype), media->group_id, media->name,
+ media->uri, media->is_default ? "default" : "-",
+ media->autoselect ? "autoselect" : "-",
+ media->forced ? "forced" : "-", media->lang ? media->lang : "??");
+
+ return media;
+
+uri_with_cc:
+ {
+ GST_WARNING ("closed captions EXT-X-MEDIA should not have URI specified");
+ goto out_error;
+ }
+required_attributes_missing:
+ {
+ GST_WARNING ("EXT-X-MEDIA description is missing required attributes");
+ goto out_error;
+ /* fall through */
+ }
+existing_stream:
+ {
+ GST_DEBUG ("EXT-X-MEDIA without URI, describes embedded stream, skipping");
+ /* fall through */
+ }
+
+out_error:
+ {
+ gst_hls_media_unref (media);
+ return NULL;
+ }
+}
+
+static GstHLSVariantStream *
+gst_hls_variant_stream_new (void)
+{
+ GstHLSVariantStream *stream;
+
+ stream = g_new0 (GstHLSVariantStream, 1);
+ stream->m3u8 = gst_m3u8_new ();
+ stream->refcount = 1;
+ return stream;
+}
+
+GstHLSVariantStream *
+gst_hls_variant_stream_ref (GstHLSVariantStream * stream)
+{
+ g_atomic_int_inc (&stream->refcount);
+ return stream;
+}
+
+void
+gst_hls_variant_stream_unref (GstHLSVariantStream * stream)
+{
+ if (g_atomic_int_dec_and_test (&stream->refcount)) {
+ gint i;
+
+ g_free (stream->name);
+ g_free (stream->uri);
+ g_free (stream->codecs);
+ gst_m3u8_unref (stream->m3u8);
+ for (i = 0; i < GST_HLS_N_MEDIA_TYPES; ++i) {
+ g_free (stream->media_groups[i]);
+ g_list_free_full (stream->media[i], (GDestroyNotify) gst_hls_media_unref);
+ }
+ g_free (stream);
+ }
+}
+
+static GstHLSVariantStream *
+find_variant_stream_by_name (GList * list, const gchar * name)
+{
+ for (; list != NULL; list = list->next) {
+ GstHLSVariantStream *variant_stream = list->data;
+
+ if (variant_stream->name != NULL && !strcmp (variant_stream->name, name))
+ return variant_stream;
+ }
+ return NULL;
+}
+
+static GstHLSVariantStream *
+find_variant_stream_by_uri (GList * list, const gchar * uri)
+{
+ for (; list != NULL; list = list->next) {
+ GstHLSVariantStream *variant_stream = list->data;
+
+ if (variant_stream->uri != NULL && !strcmp (variant_stream->uri, uri))
+ return variant_stream;
+ }
+ return NULL;
+}
+
+static GstHLSMasterPlaylist *
+gst_hls_master_playlist_new (void)
+{
+ GstHLSMasterPlaylist *playlist;
+
+ playlist = g_new0 (GstHLSMasterPlaylist, 1);
+ playlist->refcount = 1;
+ playlist->is_simple = FALSE;
+
+ return playlist;
+}
+
+void
+gst_hls_master_playlist_unref (GstHLSMasterPlaylist * playlist)
+{
+ if (g_atomic_int_dec_and_test (&playlist->refcount)) {
+ g_list_free_full (playlist->variants,
+ (GDestroyNotify) gst_hls_variant_stream_unref);
+ g_list_free_full (playlist->iframe_variants,
+ (GDestroyNotify) gst_hls_variant_stream_unref);
+ g_free (playlist->last_data);
+ g_free (playlist);
+ }
+}
+
+static gint
+hls_media_name_compare_func (gconstpointer media, gconstpointer name)
+{
+ return strcmp (((GstHLSMedia *) media)->name, (const gchar *) name);
+}
+
+/* Takes ownership of @data */
+GstHLSMasterPlaylist *
+gst_hls_master_playlist_new_from_data (gchar * data, const gchar * base_uri)
+{
+ GHashTable *media_groups[GST_HLS_N_MEDIA_TYPES] = { NULL, };
+ GstHLSMasterPlaylist *playlist;
+ GstHLSVariantStream *pending_stream;
+ gchar *end, *free_data = data;
+ gint val, i;
+ GList *l;
+
+ if (!g_str_has_prefix (data, "#EXTM3U")) {
+ GST_WARNING ("Data doesn't start with #EXTM3U");
+ g_free (free_data);
+ return NULL;
+ }
+
+ playlist = gst_hls_master_playlist_new ();
+
+ /* store data before we modify it for parsing */
+ playlist->last_data = g_strdup (data);
+
+ GST_TRACE ("data:\n%s", data);
+
+ if (strstr (data, "\n#EXTINF:") != NULL) {
+ GST_INFO ("This is a simple media playlist, not a master playlist");
+
+ pending_stream = gst_hls_variant_stream_new ();
+ pending_stream->name = g_strdup (base_uri);
+ pending_stream->uri = g_strdup (base_uri);
+ gst_m3u8_set_uri (pending_stream->m3u8, base_uri, NULL, base_uri);
+ playlist->variants = g_list_append (playlist->variants, pending_stream);
+ playlist->default_variant = gst_hls_variant_stream_ref (pending_stream);
+ playlist->is_simple = TRUE;
+
+ if (!gst_m3u8_update (pending_stream->m3u8, data)) {
+ GST_WARNING ("Failed to parse media playlist");
+ gst_hls_master_playlist_unref (playlist);
+ playlist = NULL;
+ }
+ return playlist;
+ }
+
+ pending_stream = NULL;
+ data += 7;
+ while (TRUE) {
+ gchar *r;
+
+ end = g_utf8_strchr (data, -1, '\n');
+ if (end)
+ *end = '\0';
+
+ r = g_utf8_strchr (data, -1, '\r');
+ if (r)
+ *r = '\0';
+
+ if (data[0] != '#' && data[0] != '\0') {
+ gchar *name, *uri;
+
+ if (pending_stream == NULL) {
+ GST_LOG ("%s: got line without EXT-STREAM-INF, dropping", data);
+ goto next_line;
+ }
+
+ name = data;
+ uri = uri_join (base_uri, name);
+ if (uri == NULL)
+ goto next_line;
+
+ pending_stream->name = g_strdup (name);
+ pending_stream->uri = uri;
+
+ if (find_variant_stream_by_name (playlist->variants, name)
+ || find_variant_stream_by_uri (playlist->variants, uri)) {
+ GST_DEBUG ("Already have a list with this name or URI: %s", name);
+ gst_hls_variant_stream_unref (pending_stream);
+ } else {
+ GST_INFO ("stream %s @ %u: %s", name, pending_stream->bandwidth, uri);
+ gst_m3u8_set_uri (pending_stream->m3u8, uri, NULL, name);
+ playlist->variants = g_list_append (playlist->variants, pending_stream);
+ /* use first stream in the playlist as default */
+ if (playlist->default_variant == NULL) {
+ playlist->default_variant =
+ gst_hls_variant_stream_ref (pending_stream);
+ }
+ }
+ pending_stream = NULL;
+ } else if (g_str_has_prefix (data, "#EXT-X-VERSION:")) {
+ if (int_from_string (data + 15, &data, &val))
+ playlist->version = val;
+ } else if (g_str_has_prefix (data, "#EXT-X-STREAM-INF:") ||
+ g_str_has_prefix (data, "#EXT-X-I-FRAME-STREAM-INF:")) {
+ GstHLSVariantStream *stream;
+ gchar *v, *a;
+
+ stream = gst_hls_variant_stream_new ();
+ stream->iframe = g_str_has_prefix (data, "#EXT-X-I-FRAME-STREAM-INF:");
+ data += stream->iframe ? 26 : 18;
+ while (data && parse_attributes (&data, &a, &v)) {
+ if (g_str_equal (a, "BANDWIDTH")) {
+ if (!int_from_string (v, NULL, &stream->bandwidth))
+ GST_WARNING ("Error while reading BANDWIDTH");
+ } else if (g_str_equal (a, "PROGRAM-ID")) {
+ if (!int_from_string (v, NULL, &stream->program_id))
+ GST_WARNING ("Error while reading PROGRAM-ID");
+ } else if (g_str_equal (a, "CODECS")) {
+ g_free (stream->codecs);
+ stream->codecs = g_strdup (v);
+ } else if (g_str_equal (a, "RESOLUTION")) {
+ if (!int_from_string (v, &v, &stream->width))
+ GST_WARNING ("Error while reading RESOLUTION width");
+ if (!v || *v != 'x') {
+ GST_WARNING ("Missing height");
+ } else {
+ v = g_utf8_next_char (v);
+ if (!int_from_string (v, NULL, &stream->height))
+ GST_WARNING ("Error while reading RESOLUTION height");
+ }
+ } else if (stream->iframe && g_str_equal (a, "URI")) {
+ stream->uri = uri_join (base_uri, v);
+ if (stream->uri != NULL) {
+ stream->name = g_strdup (stream->uri);
+ gst_m3u8_set_uri (stream->m3u8, stream->uri, NULL, stream->name);
+ } else {
+ gst_hls_variant_stream_unref (stream);
+ }
+ } else if (g_str_equal (a, "AUDIO")) {
+ g_free (stream->media_groups[GST_HLS_MEDIA_TYPE_AUDIO]);
+ stream->media_groups[GST_HLS_MEDIA_TYPE_AUDIO] = gst_m3u8_unquote (v);
+ } else if (g_str_equal (a, "SUBTITLES")) {
+ g_free (stream->media_groups[GST_HLS_MEDIA_TYPE_SUBTITLES]);
+ stream->media_groups[GST_HLS_MEDIA_TYPE_SUBTITLES] =
+ gst_m3u8_unquote (v);
+ } else if (g_str_equal (a, "VIDEO")) {
+ g_free (stream->media_groups[GST_HLS_MEDIA_TYPE_VIDEO]);
+ stream->media_groups[GST_HLS_MEDIA_TYPE_VIDEO] = gst_m3u8_unquote (v);
+ } else if (g_str_equal (a, "CLOSED-CAPTIONS")) {
+ /* closed captions will be embedded inside the video stream, ignore */
+ }
+ }
+
+ if (stream->iframe) {
+ if (find_variant_stream_by_uri (playlist->iframe_variants, stream->uri)) {
+ GST_DEBUG ("Already have a list with this URI");
+ gst_hls_variant_stream_unref (stream);
+ } else {
+ playlist->iframe_variants =
+ g_list_append (playlist->iframe_variants, stream);
+ }
+ } else {
+ if (pending_stream != NULL) {
+ GST_WARNING ("variant stream without uri, dropping");
+ gst_hls_variant_stream_unref (pending_stream);
+ }
+ pending_stream = stream;
+ }
+ } else if (g_str_has_prefix (data, "#EXT-X-MEDIA:")) {
+ GstHLSMedia *media;
+ GList *list;
+
+ media = gst_m3u8_parse_media (data + strlen ("#EXT-X-MEDIA:"), base_uri);
+
+ if (media == NULL)
+ goto next_line;
+
+ if (media_groups[media->mtype] == NULL) {
+ media_groups[media->mtype] =
+ g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+ }
+
+ list = g_hash_table_lookup (media_groups[media->mtype], media->group_id);
+
+ /* make sure there isn't already a media with the same name */
+ if (!g_list_find_custom (list, media->name, hls_media_name_compare_func)) {
+ g_hash_table_replace (media_groups[media->mtype],
+ g_strdup (media->group_id), g_list_append (list, media));
+ GST_INFO ("Added media %s to group %s", media->name, media->group_id);
+ } else {
+ GST_WARNING (" media with name '%s' already exists in group '%s'!",
+ media->name, media->group_id);
+ gst_hls_media_unref (media);
+ }
+ } else if (*data != '\0') {
+ GST_LOG ("Ignored line: %s", data);
+ }
+
+ next_line:
+ if (!end)
+ break;
+ data = g_utf8_next_char (end); /* skip \n */
+ }
+
+ if (pending_stream != NULL) {
+ GST_WARNING ("#EXT-X-STREAM-INF without uri, dropping");
+ gst_hls_variant_stream_unref (pending_stream);
+ }
+
+ g_free (free_data);
+
+ /* Add alternative renditions media to variant streams */
+ for (l = playlist->variants; l != NULL; l = l->next) {
+ GstHLSVariantStream *stream = l->data;
+ GList *mlist;
+
+ for (i = 0; i < GST_HLS_N_MEDIA_TYPES; ++i) {
+ if (stream->media_groups[i] != NULL && media_groups[i] != NULL) {
+ GST_INFO ("Adding %s group '%s' to stream '%s'",
+ GST_HLS_MEDIA_TYPE_NAME (i), stream->media_groups[i], stream->name);
+
+ mlist = g_hash_table_lookup (media_groups[i], stream->media_groups[i]);
+
+ if (mlist == NULL)
+ GST_WARNING ("Group '%s' does not exist!", stream->media_groups[i]);
+
+ while (mlist != NULL) {
+ GstHLSMedia *media = mlist->data;
+
+ GST_DEBUG (" %s media %s, uri: %s", GST_HLS_MEDIA_TYPE_NAME (i),
+ media->name, media->uri);
+
+ stream->media[i] =
+ g_list_append (stream->media[i], gst_hls_media_ref (media));
+ mlist = mlist->next;
+ }
+ }
+ }
+ }
+
+ /* clean up our temporary alternative rendition groups hash tables */
+ for (i = 0; i < GST_HLS_N_MEDIA_TYPES; ++i) {
+ if (media_groups[i] != NULL) {
+ GList *groups, *mlist;
+
+ groups = g_hash_table_get_keys (media_groups[i]);
+ for (l = groups; l != NULL; l = l->next) {
+ mlist = g_hash_table_lookup (media_groups[i], l->data);
+ g_list_free_full (mlist, (GDestroyNotify) gst_hls_media_unref);
+ }
+ g_list_free (groups);
+ g_hash_table_unref (media_groups[i]);
+ }
+ }
+
+ if (playlist->variants == NULL) {
+ GST_WARNING ("Master playlist without any media playlists!");
+ gst_hls_master_playlist_unref (playlist);
+ return NULL;
+ }
+
+ /* reorder variants by bitrate */
+ playlist->variants =
+ g_list_sort (playlist->variants,
+ (GCompareFunc) gst_hls_variant_stream_compare_by_bitrate);
+
+ playlist->iframe_variants =
+ g_list_sort (playlist->iframe_variants,
+ (GCompareFunc) gst_hls_variant_stream_compare_by_bitrate);
+
+ /* FIXME: restore old current_variant after master playlist update
+ * (move into code that does that update) */
+#if 0
+ {
+ gchar *top_variant_uri = NULL;
+ gboolean iframe = FALSE;
+
+ if (!self->current_variant) {
+ top_variant_uri = GST_M3U8 (self->lists->data)->uri;
+ } else {
+ top_variant_uri = GST_M3U8 (self->current_variant->data)->uri;
+ iframe = GST_M3U8 (self->current_variant->data)->iframe;
+ }
+
+ /* here we sorted the lists */
+
+ if (iframe)
+ playlist->current_variant =
+ find_variant_stream_by_uri (playlist->iframe_variants,
+ top_variant_uri);
+ else
+ playlist->current_variant =
+ find_variant_stream_by_uri (playlist->variants, top_variant_uri);
+ }
+#endif
+
+ GST_DEBUG ("parsed master playlist with %d streams and %d I-frame streams",
+ g_list_length (playlist->variants),
+ g_list_length (playlist->iframe_variants));
+
+
+ return playlist;
+}
+
+gboolean
+gst_hls_variant_stream_is_live (GstHLSVariantStream * variant)
+{
+ gboolean is_live;
+
+ g_return_val_if_fail (variant != NULL, FALSE);
+
+ is_live = gst_m3u8_is_live (variant->m3u8);
+
+ return is_live;
+}
+
+static gint
+compare_media (const GstHLSMedia * a, const GstHLSMedia * b)
+{
+ return strcmp (a->name, b->name);
+}
+
+GstHLSMedia *
+gst_hls_variant_find_matching_media (GstHLSVariantStream * stream,
+ GstHLSMedia * media)
+{
+ GList *mlist = stream->media[media->mtype];
+ GList *match;
+
+ if (mlist == NULL)
+ return NULL;
+
+ match = g_list_find_custom (mlist, media, (GCompareFunc) compare_media);
+ if (match == NULL)
+ return NULL;
+
+ return match->data;
+}
+
+GstHLSVariantStream *
+gst_hls_master_playlist_get_variant_for_bitrate (GstHLSMasterPlaylist *
+ playlist, GstHLSVariantStream * current_variant, guint bitrate)
+{
+ GstHLSVariantStream *variant = current_variant;
+ GList *l;
+
+ /* variant lists are sorted low to high, so iterate from highest to lowest */
+ if (current_variant == NULL || !current_variant->iframe)
+ l = g_list_last (playlist->variants);
+ else
+ l = g_list_last (playlist->iframe_variants);
+
+ while (l != NULL) {
+ variant = l->data;
+ if (variant->bandwidth <= bitrate)
+ break;
+ l = l->prev;
+ }
+
+ return variant;
+}
+
+GstHLSVariantStream *
+gst_hls_master_playlist_get_matching_variant (GstHLSMasterPlaylist * playlist,
+ GstHLSVariantStream * current_variant)
+{
+ if (current_variant->iframe) {
+ return find_variant_stream_by_uri (playlist->iframe_variants,
+ current_variant->uri);
+ }
+
+ return find_variant_stream_by_uri (playlist->variants, current_variant->uri);
}
diff --git a/ext/hls/m3u8.h b/ext/hls/m3u8.h
index 24eaaa1..3a5023b 100644
--- a/ext/hls/m3u8.h
+++ b/ext/hls/m3u8.h
@@ -1,6 +1,7 @@
/* GStreamer
* Copyright (C) 2010 Marc-Andre Lureau <marcandre.lureau@gmail.com>
* Copyright (C) 2010 Andoni Morales Alastruey <ylatuya@gmail.com>
+ * Copyright (C) 2015 Tim-Philipp Müller <tim@centricular.com>
*
* m3u8.h:
*
@@ -29,15 +30,18 @@
typedef struct _GstM3U8 GstM3U8;
typedef struct _GstM3U8MediaFile GstM3U8MediaFile;
+typedef struct _GstHLSMedia GstHLSMedia;
typedef struct _GstM3U8Client GstM3U8Client;
+typedef struct _GstHLSVariantStream GstHLSVariantStream;
+typedef struct _GstHLSMasterPlaylist GstHLSMasterPlaylist;
#define GST_M3U8(m) ((GstM3U8*)m)
#define GST_M3U8_MEDIA_FILE(f) ((GstM3U8MediaFile*)f)
-#define GST_M3U8_CLIENT_LOCK(c) g_mutex_lock (&c->lock);
-#define GST_M3U8_CLIENT_UNLOCK(c) g_mutex_unlock (&c->lock);
+#define GST_M3U8_LOCK(m) g_mutex_lock (&m->lock);
+#define GST_M3U8_UNLOCK(m) g_mutex_unlock (&m->lock);
-#define GST_M3U8_CLIENT_IS_LIVE(c) ((!(c)->current || (c)->current->endlist) ? FALSE : TRUE)
+#define GST_M3U8_IS_LIVE(m) ((m)->endlist == FALSE)
/* hlsdemux must not get closer to the end of a live stream than
GST_M3U8_LIVE_MIN_FRAGMENT_DISTANCE fragments. Section 6.3.3
@@ -53,26 +57,36 @@
gchar *name; /* This will be the "name" of the playlist, the original
* relative/absolute uri in a variant playlist */
+ /* parsed info */
gboolean endlist; /* if ENDLIST has been reached */
gint version; /* last EXT-X-VERSION */
GstClockTime targetduration; /* last EXT-X-TARGETDURATION */
gboolean allowcache; /* last EXT-X-ALLOWCACHE */
- gint bandwidth;
- gint program_id;
- gchar *codecs;
- gint width;
- gint height;
- gboolean iframe;
GList *files;
+ /* state */
+ GList *current_file;
+ GstClockTime current_file_duration; /* Duration of current fragment */
+ gint64 sequence; /* the next sequence for this client */
+ GstClockTime sequence_position; /* position of this sequence */
+ gint64 highest_sequence_number; /* largest seen sequence number */
+ GstClockTime first_file_start; /* timecode of the start of the first fragment in the current media playlist */
+ GstClockTime last_file_end; /* timecode of the end of the last fragment in the current media playlist */
+ GstClockTime duration; /* cached total duration */
+
/*< private > */
gchar *last_data;
- 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 */
+ GMutex lock;
+
+ gint ref_count; /* ATOMIC */
};
+GstM3U8 * gst_m3u8_ref (GstM3U8 * m3u8);
+
+void gst_m3u8_unref (GstM3U8 * m3u8);
+
+
struct _GstM3U8MediaFile
{
gchar *title;
@@ -83,73 +97,136 @@
gchar *key;
guint8 iv[16];
gint64 offset, size;
+ gint ref_count; /* ATOMIC */
};
-struct _GstM3U8Client
+GstM3U8MediaFile * gst_m3u8_media_file_ref (GstM3U8MediaFile * mfile);
+
+void gst_m3u8_media_file_unref (GstM3U8MediaFile * mfile);
+
+GstM3U8 * gst_m3u8_new (void);
+
+gboolean gst_m3u8_update (GstM3U8 * m3u8,
+ gchar * data);
+
+void gst_m3u8_set_uri (GstM3U8 * m3u8,
+ const gchar * uri,
+ const gchar * base_uri,
+ const gchar * name);
+
+GstM3U8MediaFile * gst_m3u8_get_next_fragment (GstM3U8 * m3u8,
+ gboolean forward,
+ GstClockTime * sequence_position,
+ gboolean * discont);
+
+gboolean gst_m3u8_has_next_fragment (GstM3U8 * m3u8,
+ gboolean forward);
+
+void gst_m3u8_advance_fragment (GstM3U8 * m3u8,
+ gboolean forward);
+
+GstClockTime gst_m3u8_get_duration (GstM3U8 * m3u8);
+
+GstClockTime gst_m3u8_get_target_duration (GstM3U8 * m3u8);
+
+gchar * gst_m3u8_get_uri (GstM3U8 * m3u8);
+
+gboolean gst_m3u8_is_live (GstM3U8 * m3u8);
+
+gboolean gst_m3u8_get_seek_range (GstM3U8 * m3u8,
+ gint64 * start,
+ gint64 * stop);
+
+typedef enum
{
- GstM3U8 *main; /* main playlist */
- GstM3U8 *current;
- GList *current_file;
- GstClockTime current_file_duration; /* Duration of current fragment */
- gint64 sequence; /* the next sequence for this client */
- GstClockTime sequence_position; /* position of this sequence */
- gint64 highest_sequence_number; /* largest seen sequence number */
- GstClockTime first_file_start; /* timecode of the start of the first fragment in the current media playlist */
- GstClockTime last_file_end; /* timecode of the end of the last fragment in the current media playlist */
- GstClockTime duration; /* cached total duration */
- GMutex lock;
+ GST_HLS_MEDIA_TYPE_INVALID = -1,
+ GST_HLS_MEDIA_TYPE_AUDIO,
+ GST_HLS_MEDIA_TYPE_VIDEO,
+ GST_HLS_MEDIA_TYPE_SUBTITLES,
+ GST_HLS_MEDIA_TYPE_CLOSED_CAPTIONS,
+ GST_HLS_N_MEDIA_TYPES
+} GstHLSMediaType;
+
+struct _GstHLSMedia {
+ GstHLSMediaType mtype;
+ gchar *group_id;
+ gchar *name;
+ gchar *lang;
+ gchar *uri;
+ gboolean is_default;
+ gboolean autoselect;
+ gboolean forced;
+
+ GstM3U8 *playlist; /* media playlist */
+
+ gint ref_count; /* ATOMIC */
};
+GstHLSMedia * gst_hls_media_ref (GstHLSMedia * media);
-GstM3U8Client * gst_m3u8_client_new (const gchar * uri, const gchar * base_uri);
+void gst_hls_media_unref (GstHLSMedia * media);
-void gst_m3u8_client_free (GstM3U8Client * client);
-gboolean gst_m3u8_client_update (GstM3U8Client * client, gchar * data);
+struct _GstHLSVariantStream {
+ gchar *name; /* This will be the "name" of the playlist, the original
+ * relative/absolute uri in a variant playlist */
+ gchar *uri;
+ gchar *codecs;
+ gint bandwidth;
+ gint program_id;
+ gint width;
+ gint height;
+ gboolean iframe;
-gboolean gst_m3u8_client_update_variant_playlist (GstM3U8Client * client,
- gchar * data,
- const gchar * uri,
- const gchar * base_uri);
+ gint refcount; /* ATOMIC */
-void gst_m3u8_client_set_current (GstM3U8Client * client,
- GstM3U8 * m3u8);
+ GstM3U8 *m3u8; /* media playlist */
-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);
+ /* alternative renditions */
+ gchar *media_groups[GST_HLS_N_MEDIA_TYPES];
+ GList *media[GST_HLS_N_MEDIA_TYPES];
+};
-gboolean gst_m3u8_client_has_next_fragment (GstM3U8Client * client,
- gboolean forward);
+GstHLSVariantStream * gst_hls_variant_stream_ref (GstHLSVariantStream * stream);
-void gst_m3u8_client_advance_fragment (GstM3U8Client * client,
- gboolean forward);
+void gst_hls_variant_stream_unref (GstHLSVariantStream * stream);
-GstClockTime gst_m3u8_client_get_duration (GstM3U8Client * client);
+gboolean gst_hls_variant_stream_is_live (GstHLSVariantStream * stream);
-GstClockTime gst_m3u8_client_get_target_duration (GstM3U8Client * client);
+GstHLSMedia * gst_hls_variant_find_matching_media (GstHLSVariantStream * stream,
+ GstHLSMedia *media);
-gchar * gst_m3u8_client_get_uri (GstM3U8Client * client);
-gchar * gst_m3u8_client_get_current_uri (GstM3U8Client * client);
+struct _GstHLSMasterPlaylist
+{
+ /* Available variant streams, sorted by bitrate (low -> high) */
+ GList *variants;
+ GList *iframe_variants;
-gboolean gst_m3u8_client_has_variant_playlist (GstM3U8Client * client);
+ GstHLSVariantStream *default_variant; /* first in the list */
-gboolean gst_m3u8_client_is_live (GstM3U8Client * client);
+ gint version; /* EXT-X-VERSION */
-GList * gst_m3u8_client_get_playlist_for_bitrate (GstM3U8Client * client,
- guint bitrate);
+ gint refcount; /* ATOMIC */
-gboolean gst_m3u8_client_get_seek_range (GstM3U8Client * client,
- gint64 * start,
- gint64 * stop);
+ gboolean is_simple; /* TRUE if simple main media playlist,
+ * FALSE if variant playlist (either
+ * way the variants list will be set) */
+
+ /*< private > */
+ gchar *last_data;
+};
+
+GstHLSMasterPlaylist * gst_hls_master_playlist_new_from_data (gchar * data,
+ const gchar * base_uri);
+
+GstHLSVariantStream * gst_hls_master_playlist_get_variant_for_bitrate (GstHLSMasterPlaylist * playlist,
+ GstHLSVariantStream * current_variant,
+ guint bitrate);
+GstHLSVariantStream * gst_hls_master_playlist_get_matching_variant (GstHLSMasterPlaylist * playlist,
+ GstHLSVariantStream * current_variant);
+
+void gst_hls_master_playlist_unref (GstHLSMasterPlaylist * playlist);
G_END_DECLS
diff --git a/ext/kate/Makefile.in b/ext/kate/Makefile.in
index 9cc80ac..70879e9 100644
--- a/ext/kate/Makefile.in
+++ b/ext/kate/Makefile.in
@@ -308,6 +308,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -329,6 +331,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -378,6 +382,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -523,6 +529,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -649,8 +657,6 @@
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@
@@ -693,8 +699,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/kate/gstkatedec.c b/ext/kate/gstkatedec.c
index c61d514..88a5666 100644
--- a/ext/kate/gstkatedec.c
+++ b/ext/kate/gstkatedec.c
@@ -162,10 +162,8 @@
gstelement_class->change_state =
GST_DEBUG_FUNCPTR (gst_kate_dec_change_state);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_factory);
gst_element_class_set_static_metadata (gstelement_class,
"Kate stream text decoder", "Codec/Decoder/Subtitle",
diff --git a/ext/kate/gstkateenc.c b/ext/kate/gstkateenc.c
index d88914a..12bd1c8 100644
--- a/ext/kate/gstkateenc.c
+++ b/ext/kate/gstkateenc.c
@@ -214,10 +214,8 @@
gstelement_class->change_state =
GST_DEBUG_FUNCPTR (gst_kate_enc_change_state);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_factory);
gst_element_class_set_static_metadata (gstelement_class,
"Kate stream encoder", "Codec/Encoder/Subtitle",
diff --git a/ext/kate/gstkateparse.c b/ext/kate/gstkateparse.c
index 99ea0c8..0cb9db0 100644
--- a/ext/kate/gstkateparse.c
+++ b/ext/kate/gstkateparse.c
@@ -109,10 +109,10 @@
gstelement_class->change_state = gst_kate_parse_change_state;
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_kate_parse_src_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_kate_parse_sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_kate_parse_src_factory);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_kate_parse_sink_factory);
gst_element_class_set_static_metadata (gstelement_class, "Kate stream parser",
"Codec/Parser/Subtitle",
diff --git a/ext/ladspa/Makefile.in b/ext/ladspa/Makefile.in
index 27d850a..274d3db 100644
--- a/ext/ladspa/Makefile.in
+++ b/ext/ladspa/Makefile.in
@@ -307,6 +307,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -328,6 +330,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -377,6 +381,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -522,6 +528,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -648,8 +656,6 @@
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@
@@ -692,8 +698,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/ladspa/gstladspa.c b/ext/ladspa/gstladspa.c
index df06693..624cbd8 100644
--- a/ext/ladspa/gstladspa.c
+++ b/ext/ladspa/gstladspa.c
@@ -24,21 +24,21 @@
* SECTION:element-ladspa
* @short_description: bridge for LADSPA (Linux Audio Developer's Simple Plugin API)
* @see_also: #GstAudioConvert #GstAudioResample, #GstAudioTestSrc, #GstAutoAudioSink
- *
+ *
* The LADSPA (Linux Audio Developer's Simple Plugin API) element is a bridge
* for plugins using the <ulink url="http://www.ladspa.org/">LADSPA</ulink> API.
* It scans all installed LADSPA plugins and registers them as gstreamer
* elements. If available it can also parse LRDF files and use the metadata for
* element classification. The functionality you get depends on the LADSPA plugins
* you have installed.
- *
+ *
* <refsect2>
* <title>Example LADSPA line without this plugins</title>
* |[
* (padsp) listplugins
* (padsp) analyseplugin cmt.so amp_mono
* 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
+ * (padsp) applyplugin testin.wav testout.wav cmt.so amp_mono 2
* 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>
@@ -76,7 +76,7 @@
* ]| List details of the plugin, parameters, range and defaults included.
* </refsect2>
*
- * The elements categorize in:
+ * The elements categorize in:
* <itemizedlist>
* <listitem><para>Filter/Effect/Audio/LADSPA:</para>
* <refsect2>
@@ -86,7 +86,7 @@
* ]| Decode any audio file, filter it through Calf Reverb LADSPA then TAP Stereo Echo, and play it.
* </refsect2>
* </listitem>
- * <listitem><para>Source/Audio/LADSPA:</para>
+ * <listitem><para>Source/Audio/LADSPA:</para>
* <refsect2>
* <title>Example Source/Audio/LADSPA line with this plugins</title>
* |[
@@ -236,8 +236,7 @@
continue;
}
- ladspa_meta = gst_structure_new_empty ("ladspa");
- gst_structure_set (ladspa_meta,
+ ladspa_meta = gst_structure_new ("ladspa",
"plugin-filename", G_TYPE_STRING, file_name,
"element-ix", G_TYPE_UINT, i,
"element-type-name", G_TYPE_STRING, type_name,
@@ -360,7 +359,7 @@
}
if (skip)
break;
- /*
+ /*
* transform path: /usr/lib/ladspa -> /usr/share/ladspa/rdf/
* yes, this is ugly, but lrdf has not searchpath
*/
@@ -402,8 +401,8 @@
GST_DEBUG_CATEGORY_INIT (ladspa_debug, "ladspa", 0, "LADSPA plugins");
#ifdef ENABLE_NLS
- GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE,
- LOCALEDIR);
+ GST_DEBUG_OBJECT (plugin, "binding text domain %s to locale dir %s",
+ GETTEXT_PACKAGE, LOCALEDIR);
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
#endif
@@ -420,13 +419,12 @@
if (ladspa_meta_all) {
n = gst_structure_n_fields (ladspa_meta_all);
}
- GST_INFO ("%d entries in cache", n);
+ GST_INFO_OBJECT (plugin, "%d entries in cache", n);
if (!n) {
ladspa_meta_all = gst_structure_new_empty ("ladspa");
- res = ladspa_plugin_path_search (plugin);
- if (res) {
+ if ((res = ladspa_plugin_path_search (plugin))) {
n = gst_structure_n_fields (ladspa_meta_all);
- GST_INFO ("%d entries after scanning", n);
+ GST_INFO_OBJECT (plugin, "%d entries after scanning", n);
gst_plugin_set_cache_data (plugin, ladspa_meta_all);
}
} else {
@@ -438,7 +436,7 @@
const gchar *name;
const GValue *value;
- GST_INFO ("register types");
+ GST_INFO_OBJECT (plugin, "register types");
for (i = 0; i < n; i++) {
name = gst_structure_nth_field_name (ladspa_meta_all, i);
@@ -452,7 +450,7 @@
}
if (!res) {
- GST_WARNING ("no LADSPA plugins found, check LADSPA_PATH");
+ GST_WARNING_OBJECT (plugin, "no LADSPA plugins found, check LADSPA_PATH");
}
/* we don't want to fail, even if there are no elements registered */
diff --git a/ext/ladspa/gstladspasource.c b/ext/ladspa/gstladspasource.c
index 943da62..c078664 100644
--- a/ext/ladspa/gstladspasource.c
+++ b/ext/ladspa/gstladspasource.c
@@ -256,7 +256,7 @@
gst_ladspa_source_type_fill (GstBaseSrc * base, guint64 offset,
guint length, GstBuffer * buffer)
{
- GstLADSPASource *ladspa;
+ GstLADSPASource *ladspa = GST_LADSPA_SOURCE (base);
GstClockTime next_time;
gint64 next_sample, next_byte;
gint bytes, samples;
@@ -264,8 +264,6 @@
GstMapInfo map;
gint samplerate, bpf;
- ladspa = GST_LADSPA_SOURCE (base);
-
/* example for tagging generated data */
if (!ladspa->tags_pushed) {
GstTagList *taglist;
diff --git a/ext/ladspa/gstladspautils.c b/ext/ladspa/gstladspautils.c
index c358b5e..d55db6f 100644
--- a/ext/ladspa/gstladspautils.c
+++ b/ext/ladspa/gstladspautils.c
@@ -1,4 +1,4 @@
-/* GStreamer LADSPA utils
+/* GStreamer LADSPA utils
* Copyright (C) 1999 Erik Walthinsen <omega@cse.ogi.edu>
* 2001 Steve Baker <stevebaker_org@yahoo.co.uk>
* 2003 Andy Wingo <wingo at pobox.com>
@@ -21,7 +21,7 @@
* Boston, MA 02110-1301, USA.
*/
-/*
+/*
* This module is smartly shared between the source, transform and
* sink elements. Handling any specific LADSPA <-> gstreamer interaction.
*
@@ -65,7 +65,7 @@
GST_DEBUG_CATEGORY_EXTERN (ladspa_debug);
#define GST_CAT_DEFAULT ladspa_debug
-/*
+/*
* Interleaved buffer: (c1c2c1c2...)
* De-interleaved buffer: (c1c1...c2c2...)
*/
@@ -81,7 +81,7 @@
outdata[i * samples + j] = ((LADSPA_Data *) indata)[j * audio_in + i];
}
-/*
+/*
* Interleaved buffer: (c1c2c1c2...)
* De-interleaved buffer: (c1c1...c2c2...)
*/
@@ -517,24 +517,20 @@
GObjectClass * object_class, guint offset)
{
GParamSpec *p;
- gint i, ix;
+ gint i;
ladspa_class->properties = offset;
- /* properties have an offset */
- ix = ladspa_class->properties;
-
/* register properties */
-
- for (i = 0; i < ladspa_class->count.control.in; i++, ix++) {
+ for (i = 0; i < ladspa_class->count.control.in; i++, offset++) {
p = gst_ladspa_object_class_get_param_spec (ladspa_class, object_class,
ladspa_class->map.control.in[i]);
- g_object_class_install_property (object_class, ix, p);
+ g_object_class_install_property (object_class, offset, p);
}
- for (i = 0; i < ladspa_class->count.control.out; i++, ix++) {
+ for (i = 0; i < ladspa_class->count.control.out; i++, offset++) {
p = gst_ladspa_object_class_get_param_spec (ladspa_class, object_class,
ladspa_class->map.control.out[i]);
- g_object_class_install_property (object_class, ix, p);
+ g_object_class_install_property (object_class, offset, p);
}
}
@@ -577,7 +573,7 @@
GST_DEBUG ("LADSPA uri (id=%lu) : %s", desc->UniqueID, uri);
/* we can take this directly from 'desc', keep this example for future
- attributes.
+ attributes.
if ((str = lrdf_get_setting_metadata (uri, "title"))) {
GST_DEBUG ("LADSPA title : %s", str);
@@ -730,15 +726,14 @@
ladspa->activated = FALSE;
ladspa->rate = 0;
- ladspa->ports.audio.in =
- g_new0 (LADSPA_Data *, ladspa->klass->count.audio.in);
+ ladspa->ports.audio.in = g_new0 (LADSPA_Data *, ladspa_class->count.audio.in);
ladspa->ports.audio.out =
- g_new0 (LADSPA_Data *, ladspa->klass->count.audio.out);
+ g_new0 (LADSPA_Data *, ladspa_class->count.audio.out);
ladspa->ports.control.in =
- g_new0 (LADSPA_Data, ladspa->klass->count.control.in);
+ g_new0 (LADSPA_Data, ladspa_class->count.control.in);
ladspa->ports.control.out =
- g_new0 (LADSPA_Data, ladspa->klass->count.control.out);
+ g_new0 (LADSPA_Data, ladspa_class->count.control.out);
}
void
@@ -840,7 +835,7 @@
ladspa_class->plugin = NULL;
}
-/*
+/*
* Create the type & register the element.
*/
void
diff --git a/ext/libde265/Makefile.in b/ext/libde265/Makefile.in
index c6c4676..484db3b 100644
--- a/ext/libde265/Makefile.in
+++ b/ext/libde265/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/libde265/libde265-dec.c b/ext/libde265/libde265-dec.c
index e11f12c..8053168 100644
--- a/ext/libde265/libde265-dec.c
+++ b/ext/libde265/libde265-dec.c
@@ -117,10 +117,8 @@
decoder_class->handle_frame =
GST_DEBUG_FUNCPTR (gst_libde265_dec_handle_frame);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class, &src_template);
gst_element_class_set_static_metadata (gstelement_class,
"HEVC/H.265 decoder",
diff --git a/ext/libmms/Makefile.in b/ext/libmms/Makefile.in
index 80f2ed8..02fadaa 100644
--- a/ext/libmms/Makefile.in
+++ b/ext/libmms/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/libmms/gstmms.c b/ext/libmms/gstmms.c
index 5e3ff38..56243a2 100644
--- a/ext/libmms/gstmms.c
+++ b/ext/libmms/gstmms.c
@@ -100,8 +100,7 @@
0, G_MAXINT / 1000, DEFAULT_CONNECTION_SPEED,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
gst_element_class_set_static_metadata (gstelement_class,
"MMS streaming source", "Source/Network",
diff --git a/ext/libvisual/Makefile.in b/ext/libvisual/Makefile.in
index e53a246..4fd8b2d 100644
--- a/ext/libvisual/Makefile.in
+++ b/ext/libvisual/Makefile.in
@@ -300,6 +300,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -321,6 +323,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -370,6 +374,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -515,6 +521,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -641,8 +649,6 @@
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@
@@ -685,8 +691,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/libvisual/visual-gl.c b/ext/libvisual/visual-gl.c
index 85c91e0..c796d4b 100644
--- a/ext/libvisual/visual-gl.c
+++ b/ext/libvisual/visual-gl.c
@@ -216,10 +216,8 @@
klass->plugin->info->name, klass->plugin->info->version);
/* FIXME: improve to only register what plugin supports? */
- 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));
+ gst_element_class_add_static_pad_template (element_class, &src_template);
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_set_metadata (element_class,
longname, "Visualization", klass->plugin->info->about,
diff --git a/ext/lv2/Makefile.am b/ext/lv2/Makefile.am
index ea4517f..844823c 100644
--- a/ext/lv2/Makefile.am
+++ b/ext/lv2/Makefile.am
@@ -1,15 +1,18 @@
plugin_LTLIBRARIES = libgstlv2.la
-libgstlv2_la_SOURCES = gstlv2.c
+libgstlv2_la_SOURCES = gstlv2.c gstlv2utils.c gstlv2filter.c gstlv2source.c
libgstlv2_la_CFLAGS = \
-I$(top_srcdir)/gst-libs \
+ $(GST_AUDIO_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
$(GST_PLUGINS_BASE_CFLAGS) \
- $(GST_CFLAGS) $(SLV2_CFLAGS)
+ $(GST_CFLAGS) $(LILV_CFLAGS)
libgstlv2_la_LIBADD = \
- $(top_builddir)/gst-libs/gst/signalprocessor/libgstsignalprocessor-@GST_API_VERSION@.la \
+ $(GST_AUDIO_LIBS) \
+ $(GST_BASE_LIBS) \
$(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_API_VERSION) \
- $(LIBM) $(SLV2_LIBS)
+ $(LIBM) $(LILV_LIBS)
libgstlv2_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
libgstlv2_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
-noinst_HEADERS = gstlv2.h
+noinst_HEADERS = gstlv2.h gstlv2utils.h
diff --git a/ext/lv2/Makefile.in b/ext/lv2/Makefile.in
index f8d6a08..24389e9 100644
--- a/ext/lv2/Makefile.in
+++ b/ext/lv2/Makefile.in
@@ -163,10 +163,12 @@
am__installdirs = "$(DESTDIR)$(plugindir)"
LTLIBRARIES = $(plugin_LTLIBRARIES)
am__DEPENDENCIES_1 =
-libgstlv2_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/signalprocessor/libgstsignalprocessor-@GST_API_VERSION@.la \
+libgstlv2_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-am_libgstlv2_la_OBJECTS = libgstlv2_la-gstlv2.lo
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libgstlv2_la_OBJECTS = libgstlv2_la-gstlv2.lo \
+ libgstlv2_la-gstlv2utils.lo libgstlv2_la-gstlv2filter.lo \
+ libgstlv2_la-gstlv2source.lo
libgstlv2_la_OBJECTS = $(am_libgstlv2_la_OBJECTS)
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
@@ -303,6 +305,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +328,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +379,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +526,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +654,6 @@
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@
@@ -688,8 +696,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -779,20 +792,23 @@
top_srcdir = @top_srcdir@
wayland_scanner = @wayland_scanner@
plugin_LTLIBRARIES = libgstlv2.la
-libgstlv2_la_SOURCES = gstlv2.c
+libgstlv2_la_SOURCES = gstlv2.c gstlv2utils.c gstlv2filter.c gstlv2source.c
libgstlv2_la_CFLAGS = \
-I$(top_srcdir)/gst-libs \
+ $(GST_AUDIO_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
$(GST_PLUGINS_BASE_CFLAGS) \
- $(GST_CFLAGS) $(SLV2_CFLAGS)
+ $(GST_CFLAGS) $(LILV_CFLAGS)
libgstlv2_la_LIBADD = \
- $(top_builddir)/gst-libs/gst/signalprocessor/libgstsignalprocessor-@GST_API_VERSION@.la \
+ $(GST_AUDIO_LIBS) \
+ $(GST_BASE_LIBS) \
$(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_API_VERSION) \
- $(LIBM) $(SLV2_LIBS)
+ $(LIBM) $(LILV_LIBS)
libgstlv2_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
libgstlv2_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
-noinst_HEADERS = gstlv2.h
+noinst_HEADERS = gstlv2.h gstlv2utils.h
all: all-am
.SUFFIXES:
@@ -872,6 +888,9 @@
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstlv2_la-gstlv2.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstlv2_la-gstlv2filter.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstlv2_la-gstlv2source.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstlv2_la-gstlv2utils.Plo@am__quote@
.c.o:
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@@ -904,6 +923,27 @@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstlv2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstlv2_la_CFLAGS) $(CFLAGS) -c -o libgstlv2_la-gstlv2.lo `test -f 'gstlv2.c' || echo '$(srcdir)/'`gstlv2.c
+libgstlv2_la-gstlv2utils.lo: gstlv2utils.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstlv2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstlv2_la_CFLAGS) $(CFLAGS) -MT libgstlv2_la-gstlv2utils.lo -MD -MP -MF $(DEPDIR)/libgstlv2_la-gstlv2utils.Tpo -c -o libgstlv2_la-gstlv2utils.lo `test -f 'gstlv2utils.c' || echo '$(srcdir)/'`gstlv2utils.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstlv2_la-gstlv2utils.Tpo $(DEPDIR)/libgstlv2_la-gstlv2utils.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstlv2utils.c' object='libgstlv2_la-gstlv2utils.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 $(libgstlv2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstlv2_la_CFLAGS) $(CFLAGS) -c -o libgstlv2_la-gstlv2utils.lo `test -f 'gstlv2utils.c' || echo '$(srcdir)/'`gstlv2utils.c
+
+libgstlv2_la-gstlv2filter.lo: gstlv2filter.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstlv2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstlv2_la_CFLAGS) $(CFLAGS) -MT libgstlv2_la-gstlv2filter.lo -MD -MP -MF $(DEPDIR)/libgstlv2_la-gstlv2filter.Tpo -c -o libgstlv2_la-gstlv2filter.lo `test -f 'gstlv2filter.c' || echo '$(srcdir)/'`gstlv2filter.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstlv2_la-gstlv2filter.Tpo $(DEPDIR)/libgstlv2_la-gstlv2filter.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstlv2filter.c' object='libgstlv2_la-gstlv2filter.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 $(libgstlv2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstlv2_la_CFLAGS) $(CFLAGS) -c -o libgstlv2_la-gstlv2filter.lo `test -f 'gstlv2filter.c' || echo '$(srcdir)/'`gstlv2filter.c
+
+libgstlv2_la-gstlv2source.lo: gstlv2source.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstlv2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstlv2_la_CFLAGS) $(CFLAGS) -MT libgstlv2_la-gstlv2source.lo -MD -MP -MF $(DEPDIR)/libgstlv2_la-gstlv2source.Tpo -c -o libgstlv2_la-gstlv2source.lo `test -f 'gstlv2source.c' || echo '$(srcdir)/'`gstlv2source.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstlv2_la-gstlv2source.Tpo $(DEPDIR)/libgstlv2_la-gstlv2source.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstlv2source.c' object='libgstlv2_la-gstlv2source.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 $(libgstlv2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstlv2_la_CFLAGS) $(CFLAGS) -c -o libgstlv2_la-gstlv2source.lo `test -f 'gstlv2source.c' || echo '$(srcdir)/'`gstlv2source.c
+
mostlyclean-libtool:
-rm -f *.lo
diff --git a/ext/lv2/README b/ext/lv2/README
index 5a409ff..10c6a8e 100644
--- a/ext/lv2/README
+++ b/ext/lv2/README
@@ -2,26 +2,70 @@
Dependencies:
-SLV2 0.6.* <http://drobilla.net/software/slv2>
+Lilv 0.6.6 <http://drobilla.net/software/lilv/>
-Which in turn depends on:
-librdf (redland) >= 1.0.6 <http://librdf.org>
+Features:
+The plugin wrapper support the following plugin features:
+http://lv2plug.in/ns/lv2core
+http://lv2plug.in/ns/ext/event
+http://lv2plug.in/ns/ext/port-groups
+
+and these host features:
+http://lv2plug.in/ns/ext/log
+http://lv2plug.in/ns/ext/urid
Example Pipeline:
Requires swh-lv2 <http://plugin.org.uk/releases/>
-gst-launch-0.10 -v filesrc location=/usr/share/sounds/login.wav ! wavparse ! audioconvert ! plugin-org-uk-swh-plugins-djFlanger ! audioconvert ! alsasink
-
+gst-launch-1.0 -v filesrc location=/usr/share/sounds/login.wav ! wavparse ! audioconvert ! plugin-org-uk-swh-plugins-djFlanger ! audioconvert ! autoaudiosink
(A longer wav will be a better example)
+gst-launch-1.0 plugin-org-uk-swh-plugins-analogueOsc num-buffers=100 wave=1 ! wavenc ! filesink location="/tmp/lv2.wav"
Requires calf <http://calf.sourceforge.net/>
-GST_DEBUG="*:2,signalprocessor:5,lv2:5"
-gst-launch calf-sourceforge-net-plugins-Monosynth event-in="C-3" ! pulsesink
-gst-launch calf-sourceforge-net-plugins-Monosynth event-in="C-3" name=ms ! pulsesink ms. ! fakesink
-gst-launch calf-sourceforge-net-plugins-Organ event-in="C-3" name=s ! interleave name=i ! pulsesink s. ! i.
+GST_DEBUG="*:2,lv2:5"
+gst-launch-1.0 calf-sourceforge-net-plugins-Monosynth event-in="C-3" ! autoaudiosink
+gst-launch-1.0 calf-sourceforge-net-plugins-Monosynth event-in="C-3" name=ms ! autoaudiosink ms. ! fakesink
+gst-launch-1.0 calf-sourceforge-net-plugins-Organ event-in="C-3" name=s ! interleave name=i ! autoaudiosink s. ! i.
+
+TODO
+* make filters gap-aware
+* report latency
+ lilv_plugin_has_latency(), lilv_plugin_get_latency_port_index()
+* support more host features
+ GST_DEBUG="lv2:4" GST_DEBUG_FILE=/tmp/gst.log gst-inspect lv2
+ grep -o "needs host feature: .*$" /tmp/gst.log | sort | uniq -c | sort -n
+* make source elements useful
+ Most source elements use Atom port where they accept midi events. Since it is
+ full fledged midi, we should only ever use channel-0 and instead use multiple
+ instances
+ 1) We could expose those as "audio/x-midi-event" sink pads, but then those are
+ not sources anymore.
+ 2) We could expose those as properties using a new type like GST_FOURCC. If we
+ ignore "System Exclusive" messages, all other midi messages are 1-3 bytes.
+ We stuff the bytes right to left. E.g: the lowest byte is the status byte
+ 3) We could use the GstBtNote enum + the toneconversion classes
+ https://www.midi.org/specifications/item/table-1-summary-of-midi-message
+ Open questions:
+ - with one property, we can't handle polyphony
+ - we can't query lv2 plugins for their polyphony :/
+
+ If lv2 gets a polyphony extension it would be a single non-negative integer:
+ 0: unbound, 1 monophonic, > 1 N-polyphonic
+ I've checked a few synths and they all have an upper limit. Still the way
+ voices work in trackers is not the same as they work in synths - e.g. in a
+ tracker one can play a note twice
+
+ Or we just play them monophonic and try to implement a polychildbin. The bin
+ takes a GstElement to be used as a voice. For each new voice it would create a
+ new instance and it uses a built-in mixer. Downside is that all properties
+ would be per voice.
+
+* example sources:
+ http://svn.drobilla.net/lad/trunk/lilv/utils/lv2info.c
+ http://svn.drobilla.net/lad/trunk/jalv/src/jalv.c
diff --git a/ext/lv2/gstlv2.c b/ext/lv2/gstlv2.c
index 41fcc21..acad443 100644
--- a/ext/lv2/gstlv2.c
+++ b/ext/lv2/gstlv2.c
@@ -2,6 +2,7 @@
* Copyright (C) 1999 Erik Walthinsen <omega@cse.ogi.edu>
* 2001 Steve Baker <stevebaker_org@yahoo.co.uk>
* 2003 Andy Wingo <wingo at pobox.com>
+ * 2016 Thibault Saunier <thibault.saunier@collabora.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -35,785 +36,104 @@
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
-#include <string.h>
-#include <math.h>
-#include <glib.h>
-#include <gst/audio/audio.h>
-#include <gst/audio/multichannel.h>
+#include <string.h>
#include "gstlv2.h"
-#include <slv2/slv2.h>
+
+#include <gst/audio/audio-channels.h>
+#include <lv2/lv2plug.in/ns/ext/port-groups/port-groups.h>
+#include "lv2/lv2plug.in/ns/ext/event/event.h"
+#include "lv2/lv2plug.in/ns/ext/presets/presets.h"
+#include "lv2/lv2plug.in/ns/ext/state/state.h"
+
+GST_DEBUG_CATEGORY (lv2_debug);
+#define GST_CAT_DEFAULT lv2_debug
#define GST_LV2_DEFAULT_PATH \
"/usr/lib/lv2" G_SEARCHPATH_SEPARATOR_S \
"/usr/local/lib/lv2" G_SEARCHPATH_SEPARATOR_S \
LIBDIR "/lv2"
-static void gst_lv2_set_property (GObject * object,
- guint prop_id, const GValue * value, GParamSpec * pspec);
-
-static void gst_lv2_get_property (GObject * object,
- guint prop_id, GValue * value, GParamSpec * pspec);
-
-static gboolean gst_lv2_setup (GstSignalProcessor * sigproc, GstCaps * caps);
-static gboolean gst_lv2_start (GstSignalProcessor * sigproc);
-static void gst_lv2_stop (GstSignalProcessor * sigproc);
-static void gst_lv2_cleanup (GstSignalProcessor * sigproc);
-static void gst_lv2_process (GstSignalProcessor * sigproc, guint nframes);
-
-static SLV2World world;
-static SLV2Value audio_class;
-static SLV2Value control_class;
-static SLV2Value input_class;
-static SLV2Value output_class;
-static SLV2Value integer_prop;
-static SLV2Value toggled_prop;
-static SLV2Value in_place_broken_pred;
-static SLV2Value in_group_pred;
-static SLV2Value has_role_pred;
-static SLV2Value lv2_symbol_pred;
-
-static SLV2Value center_role;
-static SLV2Value left_role;
-static SLV2Value right_role;
-static SLV2Value rear_center_role;
-static SLV2Value rear_left_role;
-static SLV2Value rear_right_role;
-static SLV2Value lfe_role;
-static SLV2Value center_left_role;
-static SLV2Value center_right_role;
-static SLV2Value side_left_role;
-static SLV2Value side_right_role;
-
-static GstSignalProcessorClass *parent_class;
-
-static GstPlugin *gst_lv2_plugin;
-
-GST_DEBUG_CATEGORY_STATIC (lv2_debug);
-#define GST_CAT_DEFAULT lv2_debug
-
-static GQuark descriptor_quark = 0;
-
-
-/* Convert an LV2 port role to a Gst channel positon
- * WARNING: If the group has only a single port,
- * GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER will be returned for pg:centerRole
- * (which is used by LV2 for mono groups), but this is not correct. In this
- * case the value must be changed to GST_AUDIO_CHANNEL_POSITION_FRONT_MONO
- * (this can't be done by this function because this information isn't known
- * at the time it is used).
- */
-static GstAudioChannelPosition
-gst_lv2_role_to_position (SLV2Value role)
-{
- /* Front. Mono and left/right are mututally exclusive */
- if (slv2_value_equals (role, center_role)) {
-
- return GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER;
- } else if (slv2_value_equals (role, left_role)) {
- return GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
- } else if (slv2_value_equals (role, right_role)) {
- return GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
-
- /* Rear. Left/right and center are mututally exclusive */
- } else if (slv2_value_equals (role, rear_center_role)) {
- return GST_AUDIO_CHANNEL_POSITION_REAR_CENTER;
- } else if (slv2_value_equals (role, rear_left_role)) {
- return GST_AUDIO_CHANNEL_POSITION_REAR_LEFT;
- } else if (slv2_value_equals (role, rear_right_role)) {
- return GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT;
-
- /* Subwoofer/low-frequency-effects */
- } else if (slv2_value_equals (role, lfe_role)) {
- return GST_AUDIO_CHANNEL_POSITION_LFE;
-
- /* Center front speakers. Center and left/right_of_center
- * are mutually exclusive */
- } else if (slv2_value_equals (role, center_left_role)) {
- return GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER;
- } else if (slv2_value_equals (role, center_right_role)) {
- return GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER;
-
- /* sides */
- } else if (slv2_value_equals (role, side_left_role)) {
- return GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT;
- } else if (slv2_value_equals (role, side_right_role)) {
- return GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT;
- }
-
- return GST_AUDIO_CHANNEL_POSITION_INVALID;
-}
-
-/* Find and return the group @a uri in @a groups, or NULL if not found */
-static GstLV2Group *
-gst_lv2_class_find_group (GArray * groups, SLV2Value uri)
-{
- int i = 0;
- for (; i < groups->len; ++i)
- if (slv2_value_equals (g_array_index (groups, GstLV2Group, i).uri, uri))
- return &g_array_index (groups, GstLV2Group, i);
- return NULL;
-}
-
-static GstAudioChannelPosition *
-gst_lv2_build_positions (GstLV2Group * group)
-{
- GstAudioChannelPosition *positions = NULL;
-
- /* don't do anything for mono */
- if (group->ports->len > 1) {
- gint i;
-
- positions = g_new (GstAudioChannelPosition, group->ports->len);
- for (i = 0; i < group->ports->len; ++i)
- positions[i] = g_array_index (group->ports, GstLV2Port, i).position;
- }
- return positions;
-}
+GstStructure *lv2_meta_all = NULL;
static void
-gst_lv2_base_init (gpointer g_class)
+lv2_plugin_register_element (GstPlugin * plugin, GstStructure * lv2_meta)
{
- GstLV2Class *klass = (GstLV2Class *) g_class;
- GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- GstSignalProcessorClass *gsp_class = GST_SIGNAL_PROCESSOR_CLASS (g_class);
- SLV2Plugin lv2plugin;
- SLV2Value val;
- SLV2Values values, sub_values;
- GstLV2Group *group = NULL;
- GstAudioChannelPosition position = GST_AUDIO_CHANNEL_POSITION_INVALID;
- guint j, in_pad_index = 0, out_pad_index = 0;
- const gchar *klass_tags;
- gchar *longname, *author;
+ guint audio_in, audio_out;
- lv2plugin = (SLV2Plugin) g_type_get_qdata (G_OBJECT_CLASS_TYPE (klass),
- descriptor_quark);
+ gst_structure_get_uint (lv2_meta, "audio-in", &audio_in);
+ gst_structure_get_uint (lv2_meta, "audio-out", &audio_out);
- g_assert (lv2plugin);
-
- GST_DEBUG ("base_init %p, plugin %s", g_class,
- slv2_value_as_string (slv2_plugin_get_uri (lv2plugin)));
-
- gsp_class->num_group_in = 0;
- gsp_class->num_group_out = 0;
- gsp_class->num_audio_in = 0;
- gsp_class->num_audio_out = 0;
- gsp_class->num_control_in = 0;
- gsp_class->num_control_out = 0;
-
- klass->in_groups = g_array_new (FALSE, TRUE, sizeof (GstLV2Group));
- klass->out_groups = g_array_new (FALSE, TRUE, sizeof (GstLV2Group));
- klass->audio_in_ports = g_array_new (FALSE, TRUE, sizeof (GstLV2Port));
- klass->audio_out_ports = g_array_new (FALSE, TRUE, sizeof (GstLV2Port));
- klass->control_in_ports = g_array_new (FALSE, TRUE, sizeof (GstLV2Port));
- klass->control_out_ports = g_array_new (FALSE, TRUE, sizeof (GstLV2Port));
-
- /* find ports and groups */
- for (j = 0; j < slv2_plugin_get_num_ports (lv2plugin); j++) {
- const SLV2Port port = slv2_plugin_get_port_by_index (lv2plugin, j);
- const gboolean is_input = slv2_port_is_a (lv2plugin, port, input_class);
- gboolean in_group = FALSE;
- struct _GstLV2Port desc = { j, 0, };
- values = slv2_port_get_value (lv2plugin, port, in_group_pred);
-
- if (slv2_values_size (values) > 0) {
- /* port is part of a group */
- SLV2Value group_uri = slv2_values_get_at (values, 0);
- GArray *groups = is_input ? klass->in_groups : klass->out_groups;
- GstLV2Group *group = gst_lv2_class_find_group (groups, group_uri);
- in_group = TRUE;
- if (group == NULL) {
- GstLV2Group g;
- g.uri = slv2_value_duplicate (group_uri);
- g.pad = is_input ? in_pad_index++ : out_pad_index++;
- g.ports = g_array_new (FALSE, TRUE, sizeof (GstLV2Port));
- g.has_roles = TRUE;
- g.symbol = NULL;
- sub_values = slv2_plugin_get_value_for_subject (lv2plugin, group_uri,
- lv2_symbol_pred);
- /* symbol is mandatory */
- if (slv2_values_size (sub_values) > 0) {
- g.symbol = slv2_value_duplicate (slv2_values_get_at (sub_values, 0));
- if (!gst_element_class_get_pad_template (element_class,
- slv2_value_as_string (g.symbol))) {
- g_array_append_val (groups, g);
- group = &g_array_index (groups, GstLV2Group, groups->len - 1);
- assert (group);
- assert (slv2_value_equals (group->uri, group_uri));
- } else {
- GST_WARNING ("plugin %s has duplicate group symbol '%s'",
- slv2_value_as_string (slv2_plugin_get_uri (lv2plugin)),
- slv2_value_as_string (g.symbol));
- in_group = FALSE;
- }
- } else {
- GST_WARNING ("plugin %s has illegal group with no symbol",
- slv2_value_as_string (slv2_plugin_get_uri (lv2plugin)));
- in_group = FALSE;
- }
- }
-
- if (in_group) {
- position = GST_AUDIO_CHANNEL_POSITION_INVALID;
- sub_values = slv2_port_get_value (lv2plugin, port, has_role_pred);
- if (slv2_values_size (sub_values) > 0) {
- SLV2Value role = slv2_values_get_at (sub_values, 0);
- position = gst_lv2_role_to_position (role);
- }
- slv2_values_free (sub_values);
- if (position != GST_AUDIO_CHANNEL_POSITION_INVALID) {
- desc.position = position;
- g_array_append_val (group->ports, desc);
- } else {
- in_group = FALSE;
- }
- }
- }
-
- if (!in_group) {
- /* port is not part of a group, or it is part of a group but that group
- * is illegal so we just ignore it */
- if (slv2_port_is_a (lv2plugin, port, audio_class)) {
- desc.pad = is_input ? in_pad_index++ : out_pad_index++;
- if (is_input)
- g_array_append_val (klass->audio_in_ports, desc);
- else
- g_array_append_val (klass->audio_out_ports, desc);
- } else if (slv2_port_is_a (lv2plugin, port, control_class)) {
- if (is_input)
- g_array_append_val (klass->control_in_ports, desc);
- else
- g_array_append_val (klass->control_out_ports, desc);
- } else {
- /* unknown port type */
- GST_INFO ("unhandled port %d", j);
- continue;
- }
- }
- slv2_values_free (values);
- }
-
- gsp_class->num_group_in = klass->in_groups->len;
- gsp_class->num_group_out = klass->out_groups->len;
- gsp_class->num_audio_in = klass->audio_in_ports->len;
- gsp_class->num_audio_out = klass->audio_out_ports->len;
- gsp_class->num_control_in = klass->control_in_ports->len;
- gsp_class->num_control_out = klass->control_out_ports->len;
-
- /* add input group pad templates */
- for (j = 0; j < gsp_class->num_group_in; ++j) {
- group = &g_array_index (klass->in_groups, GstLV2Group, j);
-
- gst_signal_processor_class_add_pad_template (gsp_class,
- slv2_value_as_string (group->symbol), GST_PAD_SINK, j,
- group->ports->len);
- }
-
- /* add output group pad templates */
- for (j = 0; j < gsp_class->num_group_out; ++j) {
- group = &g_array_index (klass->out_groups, GstLV2Group, j);
-
- gst_signal_processor_class_add_pad_template (gsp_class,
- slv2_value_as_string (group->symbol), GST_PAD_SRC, j,
- group->ports->len);
- }
-
- /* add non-grouped input port pad templates */
- for (j = 0; j < gsp_class->num_audio_in; ++j) {
- struct _GstLV2Port *desc =
- &g_array_index (klass->audio_in_ports, GstLV2Port, j);
- SLV2Port port = slv2_plugin_get_port_by_index (lv2plugin, desc->index);
- const gchar *name =
- slv2_value_as_string (slv2_port_get_symbol (lv2plugin, port));
- gst_signal_processor_class_add_pad_template (gsp_class, name, GST_PAD_SINK,
- j, 1);
- }
-
- /* add non-grouped output port pad templates */
- for (j = 0; j < gsp_class->num_audio_out; ++j) {
- struct _GstLV2Port *desc =
- &g_array_index (klass->audio_out_ports, GstLV2Port, j);
- SLV2Port port = slv2_plugin_get_port_by_index (lv2plugin, desc->index);
- const gchar *name =
- slv2_value_as_string (slv2_port_get_symbol (lv2plugin, port));
- gst_signal_processor_class_add_pad_template (gsp_class, name, GST_PAD_SRC,
- j, 1);
- }
-
- val = slv2_plugin_get_name (lv2plugin);
- if (val) {
- longname = g_strdup (slv2_value_as_string (val));
- slv2_value_free (val);
+ if (audio_in == 0) {
+ gst_lv2_source_register_element (plugin, lv2_meta);
} else {
- longname = g_strdup ("no description available");
- }
- val = slv2_plugin_get_author_name (lv2plugin);
- if (val) {
- author = g_strdup (slv2_value_as_string (val));
- slv2_value_free (val);
- } else {
- author = g_strdup ("no author available");
- }
-
- if (gsp_class->num_audio_in == 0)
- klass_tags = "Source/Audio/LV2";
- else if (gsp_class->num_audio_out == 0) {
- if (gsp_class->num_control_out == 0)
- klass_tags = "Sink/Audio/LV2";
- else
- klass_tags = "Sink/Analyzer/Audio/LV2";
- } else
- klass_tags = "Filter/Effect/Audio/LV2";
-
- GST_INFO ("tags : %s", klass_tags);
- gst_element_class_set_metadata (element_class, longname,
- klass_tags, longname, author);
- g_free (longname);
- g_free (author);
-
- if (!slv2_plugin_has_feature (lv2plugin, in_place_broken_pred))
- GST_SIGNAL_PROCESSOR_CLASS_SET_CAN_PROCESS_IN_PLACE (klass);
-
- klass->plugin = lv2plugin;
-}
-
-static gchar *
-gst_lv2_class_get_param_name (GstLV2Class * klass, SLV2Port port)
-{
- SLV2Plugin lv2plugin = klass->plugin;
- gchar *ret;
-
- ret = g_strdup (slv2_value_as_string (slv2_port_get_symbol (lv2plugin,
- port)));
-
- /* this is the same thing that param_spec_* will do */
- g_strcanon (ret, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-", '-');
- /* satisfy glib2 (argname[0] must be [A-Za-z]) */
- if (!((ret[0] >= 'a' && ret[0] <= 'z') || (ret[0] >= 'A' && ret[0] <= 'Z'))) {
- gchar *tempstr = ret;
-
- ret = g_strconcat ("param-", ret, NULL);
- g_free (tempstr);
- }
-
- /* check for duplicate property names */
- if (g_object_class_find_property (G_OBJECT_CLASS (klass), ret)) {
- gint n = 1;
- gchar *nret = g_strdup_printf ("%s-%d", ret, n++);
-
- while (g_object_class_find_property (G_OBJECT_CLASS (klass), nret)) {
- g_free (nret);
- nret = g_strdup_printf ("%s-%d", ret, n++);
- }
- g_free (ret);
- ret = nret;
- }
-
- GST_DEBUG ("built property name '%s' from port name '%s'", ret,
- slv2_value_as_string (slv2_port_get_symbol (lv2plugin, port)));
-
- return ret;
-}
-
-static gchar *
-gst_lv2_class_get_param_nick (GstLV2Class * klass, SLV2Port port)
-{
- SLV2Plugin lv2plugin = klass->plugin;
-
- return g_strdup (slv2_value_as_string (slv2_port_get_name (lv2plugin, port)));
-}
-
-static GParamSpec *
-gst_lv2_class_get_param_spec (GstLV2Class * klass, gint portnum)
-{
- SLV2Plugin lv2plugin = klass->plugin;
- SLV2Port port = slv2_plugin_get_port_by_index (lv2plugin, portnum);
- SLV2Value lv2def, lv2min, lv2max;
- GParamSpec *ret;
- gchar *name, *nick;
- gint perms;
- gfloat lower = 0.0f, upper = 1.0f, def = 0.0f;
-
- nick = gst_lv2_class_get_param_nick (klass, port);
- name = gst_lv2_class_get_param_name (klass, port);
-
- GST_DEBUG ("%s trying port %s : %s",
- slv2_value_as_string (slv2_plugin_get_uri (lv2plugin)), name, nick);
-
- perms = G_PARAM_READABLE;
- if (slv2_port_is_a (lv2plugin, port, input_class))
- perms |= G_PARAM_WRITABLE | G_PARAM_CONSTRUCT;
- if (slv2_port_is_a (lv2plugin, port, control_class))
- perms |= GST_PARAM_CONTROLLABLE;
-
- if (slv2_port_has_property (lv2plugin, port, toggled_prop)) {
- ret = g_param_spec_boolean (name, nick, nick, FALSE, perms);
- goto done;
- }
-
- slv2_port_get_range (lv2plugin, port, &lv2def, &lv2min, &lv2max);
-
- if (lv2def)
- def = slv2_value_as_float (lv2def);
- if (lv2min)
- lower = slv2_value_as_float (lv2min);
- if (lv2max)
- upper = slv2_value_as_float (lv2max);
-
- slv2_value_free (lv2def);
- slv2_value_free (lv2min);
- slv2_value_free (lv2max);
-
- if (def < lower) {
- GST_WARNING ("%s has lower bound %f > default %f",
- slv2_value_as_string (slv2_plugin_get_uri (lv2plugin)), lower, def);
- lower = def;
- }
-
- if (def > upper) {
- GST_WARNING ("%s has upper bound %f < default %f",
- slv2_value_as_string (slv2_plugin_get_uri (lv2plugin)), upper, def);
- upper = def;
- }
-
- if (slv2_port_has_property (lv2plugin, port, integer_prop))
- ret = g_param_spec_int (name, nick, nick, lower, upper, def, perms);
- else
- ret = g_param_spec_float (name, nick, nick, lower, upper, def, perms);
-
-done:
- g_free (name);
- g_free (nick);
-
- return ret;
-}
-
-static void
-gst_lv2_class_init (GstLV2Class * klass, SLV2Plugin lv2plugin)
-{
- GObjectClass *gobject_class;
- GstSignalProcessorClass *gsp_class;
- GParamSpec *p;
- gint i, ix;
-
- GST_DEBUG ("class_init %p", klass);
-
- gobject_class = (GObjectClass *) klass;
- gobject_class->set_property = gst_lv2_set_property;
- gobject_class->get_property = gst_lv2_get_property;
-
- gsp_class = GST_SIGNAL_PROCESSOR_CLASS (klass);
- gsp_class->setup = gst_lv2_setup;
- gsp_class->start = gst_lv2_start;
- gsp_class->stop = gst_lv2_stop;
- gsp_class->cleanup = gst_lv2_cleanup;
- gsp_class->process = gst_lv2_process;
-
- klass->plugin = lv2plugin;
-
- /* properties have an offset of 1 */
- ix = 1;
-
- /* register properties */
-
- for (i = 0; i < gsp_class->num_control_in; i++, ix++) {
- p = gst_lv2_class_get_param_spec (klass,
- g_array_index (klass->control_in_ports, GstLV2Port, i).index);
-
- g_object_class_install_property (gobject_class, ix, p);
- }
-
- for (i = 0; i < gsp_class->num_control_out; i++, ix++) {
- p = gst_lv2_class_get_param_spec (klass,
- g_array_index (klass->control_out_ports, GstLV2Port, i).index);
-
- g_object_class_install_property (gobject_class, ix, p);
+ gst_lv2_filter_register_element (plugin, lv2_meta);
}
}
static void
-gst_lv2_init (GstLV2 * lv2, GstLV2Class * klass)
+lv2_count_ports (const LilvPlugin * lv2plugin, guint * audio_in,
+ guint * audio_out, guint * control)
{
- lv2->plugin = klass->plugin;
- lv2->instance = NULL;
- lv2->activated = FALSE;
-}
+ GHashTable *port_groups = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, NULL);
+ guint i;
-static void
-gst_lv2_set_property (GObject * object, guint prop_id, const GValue * value,
- GParamSpec * pspec)
-{
- GstSignalProcessor *gsp;
- GstSignalProcessorClass *gsp_class;
+ *audio_in = *audio_out = *control = 0;
+ for (i = 0; i < lilv_plugin_get_num_ports (lv2plugin); i++) {
+ const LilvPort *port = lilv_plugin_get_port_by_index (lv2plugin, i);
- gsp = GST_SIGNAL_PROCESSOR (object);
- gsp_class = GST_SIGNAL_PROCESSOR_GET_CLASS (object);
+ if (lilv_port_is_a (lv2plugin, port, audio_class)) {
+ const gboolean is_input = lilv_port_is_a (lv2plugin, port, input_class);
+ LilvNodes *lv2group = lilv_port_get (lv2plugin, port, group_pred);
- /* remember, properties have an offset of 1 */
- prop_id--;
+ if (lv2group) {
+ const gchar *uri = lilv_node_as_uri (lv2group);
- /* only input ports */
- g_return_if_fail (prop_id < gsp_class->num_control_in);
+ if (g_hash_table_contains (port_groups, uri))
+ continue;
- /* now see what type it is */
- switch (pspec->value_type) {
- case G_TYPE_BOOLEAN:
- gsp->control_in[prop_id] = g_value_get_boolean (value) ? 0.0f : 1.0f;
- break;
- case G_TYPE_INT:
- gsp->control_in[prop_id] = g_value_get_int (value);
- break;
- case G_TYPE_FLOAT:
- gsp->control_in[prop_id] = g_value_get_float (value);
- break;
- default:
- g_assert_not_reached ();
- }
-}
-
-static void
-gst_lv2_get_property (GObject * object, guint prop_id, GValue * value,
- GParamSpec * pspec)
-{
- GstSignalProcessor *gsp;
- GstSignalProcessorClass *gsp_class;
- gfloat *controls;
-
- gsp = GST_SIGNAL_PROCESSOR (object);
- gsp_class = GST_SIGNAL_PROCESSOR_GET_CLASS (object);
-
- /* remember, properties have an offset of 1 */
- prop_id--;
-
- if (prop_id < gsp_class->num_control_in) {
- controls = gsp->control_in;
- } else if (prop_id < gsp_class->num_control_in + gsp_class->num_control_out) {
- controls = gsp->control_out;
- prop_id -= gsp_class->num_control_in;
- } else {
- g_return_if_reached ();
- }
-
- /* now see what type it is */
- switch (pspec->value_type) {
- case G_TYPE_BOOLEAN:
- g_value_set_boolean (value, controls[prop_id] > 0.0f);
- break;
- case G_TYPE_INT:
- g_value_set_int (value, CLAMP (controls[prop_id], G_MININT, G_MAXINT));
- break;
- case G_TYPE_FLOAT:
- g_value_set_float (value, controls[prop_id]);
- break;
- default:
- g_return_if_reached ();
- }
-}
-
-static gboolean
-gst_lv2_setup (GstSignalProcessor * gsp, GstCaps * caps)
-{
- GstLV2 *lv2;
- GstLV2Class *oclass;
- GstSignalProcessorClass *gsp_class;
- GstStructure *s;
- gint i;
- GstLV2Group *group = NULL;
- GstAudioChannelPosition *positions = NULL;
- GstPad *pad;
-
- gsp_class = GST_SIGNAL_PROCESSOR_GET_CLASS (gsp);
- lv2 = (GstLV2 *) gsp;
- oclass = (GstLV2Class *) gsp_class;
-
- g_return_val_if_fail (lv2->activated == FALSE, FALSE);
-
- GST_DEBUG_OBJECT (lv2, "instantiating the plugin at %d Hz", gsp->sample_rate);
-
- if (!(lv2->instance =
- slv2_plugin_instantiate (oclass->plugin, gsp->sample_rate, NULL)))
- goto no_instance;
-
- /* connect the control ports */
- for (i = 0; i < gsp_class->num_control_in; i++)
- slv2_instance_connect_port (lv2->instance,
- g_array_index (oclass->control_in_ports, GstLV2Port, i).index,
- &(gsp->control_in[i]));
- for (i = 0; i < gsp_class->num_control_out; i++)
- slv2_instance_connect_port (lv2->instance,
- g_array_index (oclass->control_out_ports, GstLV2Port, i).index,
- &(gsp->control_out[i]));
-
- /* set input group pad audio channel position */
- for (i = 0; i < gsp_class->num_group_in; ++i) {
- group = &g_array_index (oclass->in_groups, GstLV2Group, i);
- if (group->has_roles) {
- if ((positions = gst_lv2_build_positions (group))) {
- if ((pad = gst_element_get_static_pad (GST_ELEMENT (gsp),
- slv2_value_as_string (group->symbol)))) {
- GST_INFO_OBJECT (lv2, "set audio channel positions on sink pad %s",
- slv2_value_as_string (group->symbol));
- s = gst_caps_get_structure (caps, 0);
- gst_audio_set_channel_positions (s, positions);
- gst_object_unref (pad);
- }
- g_free (positions);
- positions = NULL;
+ g_hash_table_add (port_groups, g_strdup (uri));
+ lilv_node_free (lv2group);
}
- }
- }
- /* set output group pad audio channel position */
- for (i = 0; i < gsp_class->num_group_out; ++i) {
- group = &g_array_index (oclass->out_groups, GstLV2Group, i);
- if (group->has_roles) {
- if ((positions = gst_lv2_build_positions (group))) {
- if ((pad = gst_element_get_static_pad (GST_ELEMENT (gsp),
- slv2_value_as_string (group->symbol)))) {
- GST_INFO_OBJECT (lv2, "set audio channel positions on src pad %s",
- slv2_value_as_string (group->symbol));
- s = gst_caps_get_structure (caps, 0);
- gst_audio_set_channel_positions (s, positions);
- gst_object_unref (pad);
- }
- g_free (positions);
- positions = NULL;
- }
- }
- }
- return TRUE;
-no_instance:
- {
- GST_WARNING_OBJECT (gsp, "could not create instance");
- return FALSE;
+ if (is_input)
+ (*audio_in)++;
+ else
+ (*audio_out)++;
+ } else if (lilv_port_is_a (lv2plugin, port, control_class) ||
+ lilv_port_is_a (lv2plugin, port, cv_class)) {
+ (*control)++;
+ }
}
+ g_hash_table_unref (port_groups);
}
+/* search the plugin path */
static gboolean
-gst_lv2_start (GstSignalProcessor * gsp)
+lv2_plugin_discover (GstPlugin * plugin)
{
- GstLV2 *lv2 = (GstLV2 *) gsp;
+ guint audio_in, audio_out, control;
+ LilvIter *i;
+ const LilvPlugins *plugins = lilv_world_get_all_plugins (world);
- g_return_val_if_fail (lv2->activated == FALSE, FALSE);
- g_return_val_if_fail (lv2->instance != NULL, FALSE);
-
- GST_DEBUG_OBJECT (lv2, "activating");
-
- slv2_instance_activate (lv2->instance);
-
- lv2->activated = TRUE;
-
- return TRUE;
-}
-
-static void
-gst_lv2_stop (GstSignalProcessor * gsp)
-{
- GstLV2 *lv2 = (GstLV2 *) gsp;
-
- g_return_if_fail (lv2->activated == TRUE);
- g_return_if_fail (lv2->instance != NULL);
-
- GST_DEBUG_OBJECT (lv2, "deactivating");
-
- slv2_instance_deactivate (lv2->instance);
-
- lv2->activated = FALSE;
-}
-
-static void
-gst_lv2_cleanup (GstSignalProcessor * gsp)
-{
- GstLV2 *lv2 = (GstLV2 *) gsp;
-
- g_return_if_fail (lv2->activated == FALSE);
- g_return_if_fail (lv2->instance != NULL);
-
- GST_DEBUG_OBJECT (lv2, "cleaning up");
-
- slv2_instance_free (lv2->instance);
-
- lv2->instance = NULL;
-}
-
-static void
-gst_lv2_process (GstSignalProcessor * gsp, guint nframes)
-{
- GstSignalProcessorClass *gsp_class;
- GstLV2 *lv2;
- GstLV2Class *lv2_class;
- GstLV2Group *lv2_group;
- GstLV2Port *lv2_port;
- GstSignalProcessorGroup *gst_group;
- guint i, j;
-
- gsp_class = GST_SIGNAL_PROCESSOR_GET_CLASS (gsp);
- lv2 = (GstLV2 *) gsp;
- lv2_class = (GstLV2Class *) gsp_class;
-
- /* multi channel inputs */
- for (i = 0; i < gsp_class->num_group_in; i++) {
- lv2_group = &g_array_index (lv2_class->in_groups, GstLV2Group, i);
- gst_group = &gsp->group_in[i];
- for (j = 0; j < lv2_group->ports->len; ++j) {
- lv2_port = &g_array_index (lv2_group->ports, GstLV2Port, j);
- slv2_instance_connect_port (lv2->instance, lv2_port->index,
- gst_group->buffer + (j * nframes));
- }
- }
- /* mono inputs */
- for (i = 0; i < gsp_class->num_audio_in; i++) {
- lv2_port = &g_array_index (lv2_class->audio_in_ports, GstLV2Port, i);
- slv2_instance_connect_port (lv2->instance, lv2_port->index,
- gsp->audio_in[i]);
- }
- /* multi channel outputs */
- for (i = 0; i < gsp_class->num_group_out; i++) {
- lv2_group = &g_array_index (lv2_class->out_groups, GstLV2Group, i);
- gst_group = &gsp->group_out[i];
- for (j = 0; j < lv2_group->ports->len; ++j) {
- lv2_port = &g_array_index (lv2_group->ports, GstLV2Port, j);
- slv2_instance_connect_port (lv2->instance, lv2_port->index,
- gst_group->buffer + (j * nframes));
- }
- }
- /* mono outputs */
- for (i = 0; i < gsp_class->num_audio_out; i++) {
- lv2_port = &g_array_index (lv2_class->audio_out_ports, GstLV2Port, i);
- slv2_instance_connect_port (lv2->instance, lv2_port->index,
- gsp->audio_out[i]);
- }
-
- slv2_instance_run (lv2->instance, nframes);
-}
-
-/* search the plugin path
- */
-static gboolean
-lv2_plugin_discover (void)
-{
- guint i, j;
- SLV2Plugins plugins = slv2_world_get_all_plugins (world);
-
- for (i = 0; i < slv2_plugins_size (plugins); ++i) {
- SLV2Plugin lv2plugin = slv2_plugins_get_at (plugins, i);
- gint num_audio_ports = 0;
+ for (i = lilv_plugins_begin (plugins); !lilv_plugins_is_end (plugins, i);
+ i = lilv_plugins_next (plugins, i)) {
+ GstStructure *lv2_meta = NULL;
+ GValue value = { 0, };
+ const LilvPlugin *lv2plugin = lilv_plugins_get (plugins, i);
const gchar *plugin_uri, *p;
gchar *type_name;
- GTypeInfo typeinfo = {
- sizeof (GstLV2Class),
- (GBaseInitFunc) gst_lv2_base_init,
- NULL,
- (GClassInitFunc) gst_lv2_class_init,
- NULL,
- lv2plugin,
- sizeof (GstLV2),
- 0,
- (GInstanceInitFunc) gst_lv2_init,
- };
- GType type;
+ gboolean can_do_presets;
- plugin_uri = slv2_value_as_uri (slv2_plugin_get_uri (lv2plugin));
+ plugin_uri = lilv_node_as_uri (lilv_plugin_get_uri (lv2plugin));
+
+ /* check if we support the required host features */
+ if (!gst_lv2_check_required_features (lv2plugin)) {
+ GST_FIXME ("lv2 plugin %s needs host features", plugin_uri);
+ continue;
+ }
+
/* construct the type name from plugin URI */
if ((p = strstr (plugin_uri, "://"))) {
/* cut off the protocol (e.g. http://) */
@@ -828,85 +148,154 @@
goto next;
/* check if this has any audio ports */
- for (j = 0; j < slv2_plugin_get_num_ports (lv2plugin); j++) {
- const SLV2Port port = slv2_plugin_get_port_by_index (lv2plugin, j);
- if (slv2_port_is_a (lv2plugin, port, audio_class)) {
- num_audio_ports++;
+ lv2_count_ports (lv2plugin, &audio_in, &audio_out, &control);
+
+ if (audio_in == 0 && audio_out == 0) {
+ GST_FIXME ("plugin %s has no audio pads", type_name);
+ goto next;
+ } else if (audio_in == 0) {
+ if (audio_out != 1) {
+ GST_FIXME ("plugin %s is not a GstBaseSrc (num_src_pads: %d)",
+ type_name, audio_out);
+ goto next;
+ }
+ } else if (audio_out == 0) {
+ GST_FIXME ("plugin %s is a sink element (num_sink_pads: %d"
+ " num_src_pads: %d)", type_name, audio_in, audio_out);
+ goto next;
+ } else {
+ if (audio_in != 1 || audio_out != 1) {
+ GST_FIXME ("plugin %s is not a GstAudioFilter (num_sink_pads: %d"
+ " num_src_pads: %d)", type_name, audio_in, audio_out);
+ goto next;
}
}
- if (!num_audio_ports) {
- GST_INFO ("plugin %s has no audio ports", type_name);
- goto next;
- }
- /* create the type */
- type =
- g_type_register_static (GST_TYPE_SIGNAL_PROCESSOR, type_name, &typeinfo,
- 0);
+ /* check supported extensions */
+ can_do_presets = lilv_plugin_has_extension_data (lv2plugin, state_iface)
+ || lilv_plugin_has_feature (lv2plugin, state_uri)
+ || (control > 0);
+ GST_INFO ("plugin %s can%s do presets", type_name,
+ (can_do_presets ? "" : "'t"));
- /* FIXME: not needed anymore when we can add pad templates, etc in class_init
- * as class_data contains the LADSPA_Descriptor too */
- g_type_set_qdata (type, descriptor_quark, (gpointer) lv2plugin);
+ lv2_meta = gst_structure_new ("lv2",
+ "element-uri", G_TYPE_STRING, plugin_uri,
+ "element-type-name", G_TYPE_STRING, type_name,
+ "audio-in", G_TYPE_UINT, audio_in,
+ "audio-out", G_TYPE_UINT, audio_out,
+ "can-do-presets", G_TYPE_BOOLEAN, can_do_presets, NULL);
- if (!gst_element_register (gst_lv2_plugin, type_name, GST_RANK_NONE, type))
- goto next;
+ g_value_init (&value, GST_TYPE_STRUCTURE);
+ g_value_set_boxed (&value, lv2_meta);
+ gst_structure_set_value (lv2_meta_all, type_name, &value);
+ g_value_unset (&value);
+
+ // don't free type_name
+ continue;
next:
g_free (type_name);
}
+
return TRUE;
}
static gboolean
plugin_init (GstPlugin * plugin)
{
+ gboolean res = FALSE;
+ gint n = 0;
+
GST_DEBUG_CATEGORY_INIT (lv2_debug, "lv2",
GST_DEBUG_FG_GREEN | GST_DEBUG_BG_BLACK | GST_DEBUG_BOLD, "LV2");
- world = slv2_world_new ();
- slv2_world_load_all (world);
+ world = lilv_world_new ();
+ lilv_world_load_all (world);
+ gst_lv2_host_init ();
- audio_class = slv2_value_new_uri (world, SLV2_PORT_CLASS_AUDIO);
- control_class = slv2_value_new_uri (world, SLV2_PORT_CLASS_CONTROL);
- input_class = slv2_value_new_uri (world, SLV2_PORT_CLASS_INPUT);
- output_class = slv2_value_new_uri (world, SLV2_PORT_CLASS_OUTPUT);
+/* have been added after lilv-0.22.0, which is the last release */
+#ifndef LILV_URI_ATOM_PORT
+#define LILV_URI_ATOM_PORT "http://lv2plug.in/ns/ext/atom#AtomPort"
+#endif
+#ifndef LILV_URI_CV_PORT
+#define LILV_URI_CV_PORT "http://lv2plug.in/ns/lv2core#CVPort"
+#endif
-#define NS_LV2 "http://lv2plug.in/ns/lv2core#"
-#define NS_PG "http://lv2plug.in/ns/ext/port-groups"
+ atom_class = lilv_new_uri (world, LILV_URI_ATOM_PORT);
+ audio_class = lilv_new_uri (world, LILV_URI_AUDIO_PORT);
+ control_class = lilv_new_uri (world, LILV_URI_CONTROL_PORT);
+ cv_class = lilv_new_uri (world, LILV_URI_CV_PORT);
+ event_class = lilv_new_uri (world, LILV_URI_EVENT_PORT);
+ input_class = lilv_new_uri (world, LILV_URI_INPUT_PORT);
+ output_class = lilv_new_uri (world, LILV_URI_OUTPUT_PORT);
+ preset_class = lilv_new_uri (world, LV2_PRESETS__Preset);
+ state_iface = lilv_new_uri (world, LV2_STATE__interface);
+ state_uri = lilv_new_uri (world, LV2_STATE_URI);
- integer_prop = slv2_value_new_uri (world, NS_LV2 "integer");
- toggled_prop = slv2_value_new_uri (world, NS_LV2 "toggled");
- in_place_broken_pred = slv2_value_new_uri (world, NS_LV2 "inPlaceBroken");
- in_group_pred = slv2_value_new_uri (world, NS_PG "inGroup");
- has_role_pred = slv2_value_new_uri (world, NS_PG "role");
- lv2_symbol_pred = slv2_value_new_string (world, NS_LV2 "symbol");
+ integer_prop = lilv_new_uri (world, LV2_CORE__integer);
+ toggled_prop = lilv_new_uri (world, LV2_CORE__toggled);
+ designation_pred = lilv_new_uri (world, LV2_CORE__designation);
+ in_place_broken_pred = lilv_new_uri (world, LV2_CORE__inPlaceBroken);
+ optional_pred = lilv_new_uri (world, LV2_CORE__optionalFeature);
+ group_pred = lilv_new_uri (world, LV2_PORT_GROUPS__group);
+ supports_event_pred = lilv_new_uri (world, LV2_EVENT__supportsEvent);
+ label_pred = lilv_new_uri (world, LILV_NS_RDFS "label");
- center_role = slv2_value_new_uri (world, NS_PG "centerChannel");
- left_role = slv2_value_new_uri (world, NS_PG "leftChannel");
- right_role = slv2_value_new_uri (world, NS_PG "rightChannel");
- rear_center_role = slv2_value_new_uri (world, NS_PG "rearCenterChannel");
- rear_left_role = slv2_value_new_uri (world, NS_PG "rearLeftChannel");
- rear_right_role = slv2_value_new_uri (world, NS_PG "rearRightChannel");
- lfe_role = slv2_value_new_uri (world, NS_PG "lfeChannel");
- center_left_role = slv2_value_new_uri (world, NS_PG "centerLeftChannel");
- center_right_role = slv2_value_new_uri (world, NS_PG "centerRightChannel");
- side_left_role = slv2_value_new_uri (world, NS_PG "sideLeftChannel");
- side_right_role = slv2_value_new_uri (world, NS_PG "sideRightChannel");
+ center_role = lilv_new_uri (world, LV2_PORT_GROUPS__center);
+ left_role = lilv_new_uri (world, LV2_PORT_GROUPS__left);
+ right_role = lilv_new_uri (world, LV2_PORT_GROUPS__right);
+ rear_center_role = lilv_new_uri (world, LV2_PORT_GROUPS__rearCenter);
+ rear_left_role = lilv_new_uri (world, LV2_PORT_GROUPS__rearLeft);
+ rear_right_role = lilv_new_uri (world, LV2_PORT_GROUPS__rearLeft);
+ lfe_role = lilv_new_uri (world, LV2_PORT_GROUPS__lowFrequencyEffects);
+ center_left_role = lilv_new_uri (world, LV2_PORT_GROUPS__centerLeft);
+ center_right_role = lilv_new_uri (world, LV2_PORT_GROUPS__centerRight);
+ side_left_role = lilv_new_uri (world, LV2_PORT_GROUPS__sideLeft);
+ side_right_role = lilv_new_uri (world, LV2_PORT_GROUPS__sideRight);
gst_plugin_add_dependency_simple (plugin,
"LV2_PATH", GST_LV2_DEFAULT_PATH, NULL, GST_PLUGIN_DEPENDENCY_FLAG_NONE);
- parent_class = g_type_class_ref (GST_TYPE_SIGNAL_PROCESSOR);
-
- gst_lv2_plugin = plugin;
- descriptor_quark = g_quark_from_static_string ("slv2-plugin");
-
/* ensure GstAudioChannelPosition type is registered */
if (!gst_audio_channel_position_get_type ())
return FALSE;
- if (!lv2_plugin_discover ()) {
- GST_WARNING ("no lv2 plugins found, check LV2_PATH");
+ lv2_meta_all = (GstStructure *) gst_plugin_get_cache_data (plugin);
+ if (lv2_meta_all) {
+ n = gst_structure_n_fields (lv2_meta_all);
+ }
+ GST_INFO_OBJECT (plugin, "%d entries in cache", n);
+ if (!n) {
+ lv2_meta_all = gst_structure_new_empty ("lv2");
+ if ((res = lv2_plugin_discover (plugin))) {
+ n = gst_structure_n_fields (lv2_meta_all);
+ GST_INFO_OBJECT (plugin, "%d entries after scanning", n);
+ gst_plugin_set_cache_data (plugin, lv2_meta_all);
+ }
+ } else {
+ res = TRUE;
+ }
+
+ if (n) {
+ gint i;
+ const gchar *name;
+ const GValue *value;
+
+ GST_INFO_OBJECT (plugin, "register types");
+
+ for (i = 0; i < n; i++) {
+ name = gst_structure_nth_field_name (lv2_meta_all, i);
+ value = gst_structure_get_value (lv2_meta_all, name);
+ if (G_VALUE_TYPE (value) == GST_TYPE_STRUCTURE) {
+ GstStructure *lv2_meta = g_value_get_boxed (value);
+
+ lv2_plugin_register_element (plugin, lv2_meta);
+ }
+ }
+ }
+
+ if (!res) {
+ GST_WARNING_OBJECT (plugin, "no lv2 plugins found, check LV2_PATH");
}
/* we don't want to fail, even if there are no elements registered */
@@ -918,31 +307,39 @@
#endif
static void plugin_cleanup (GstPlugin * plugin)
{
- slv2_value_free (audio_class);
- slv2_value_free (control_class);
- slv2_value_free (input_class);
- slv2_value_free (output_class);
+ lilv_node_free (atom_class);
+ lilv_node_free (audio_class);
+ lilv_node_free (control_class);
+ lilv_node_free (cv_class);
+ lilv_node_free (event_class);
+ lilv_node_free (input_class);
+ lilv_node_free (output_class);
+ lilv_node_free (preset_class);
+ lilv_node_free (state_iface);
+ lilv_node_free (state_uri);
- slv2_value_free (integer_prop);
- slv2_value_free (toggled_prop);
- slv2_value_free (in_place_broken_pred);
- slv2_value_free (in_group_pred);
- slv2_value_free (has_role_pred);
- slv2_value_free (lv2_symbol_pred);
+ lilv_node_free (integer_prop);
+ lilv_node_free (toggled_prop);
+ lilv_node_free (designation_pred);
+ lilv_node_free (in_place_broken_pred);
+ lilv_node_free (optional_pred);
+ lilv_node_free (group_pred);
+ lilv_node_free (supports_event_pred);
+ lilv_node_free (label_pred);
- slv2_value_free (center_role);
- slv2_value_free (left_role);
- slv2_value_free (right_role);
- slv2_value_free (rear_center_role);
- slv2_value_free (rear_left_role);
- slv2_value_free (rear_right_role);
- slv2_value_free (lfe_role);
- slv2_value_free (center_left_role);
- slv2_value_free (center_right_role);
- slv2_value_free (side_left_role);
- slv2_value_free (side_right_role);
+ lilv_node_free (center_role);
+ lilv_node_free (left_role);
+ lilv_node_free (right_role);
+ lilv_node_free (rear_center_role);
+ lilv_node_free (rear_left_role);
+ lilv_node_free (rear_right_role);
+ lilv_node_free (lfe_role);
+ lilv_node_free (center_left_role);
+ lilv_node_free (center_right_role);
+ lilv_node_free (side_left_role);
+ lilv_node_free (side_right_role);
- slv2_world_free (world);
+ lilv_world_free (world);
}
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
diff --git a/ext/lv2/gstlv2.h b/ext/lv2/gstlv2.h
index 6f0b466..177f9b2 100644
--- a/ext/lv2/gstlv2.h
+++ b/ext/lv2/gstlv2.h
@@ -1,7 +1,8 @@
/* GStreamer
- * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
- *
- * gstladspa.h: Header for LV2 plugin
+ * Copyright (C) 1999 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2001 Steve Baker <stevebaker_org@yahoo.co.uk>
+ * 2003 Andy Wingo <wingo at pobox.com>
+ * 2016 Thibault Saunier <thibault.saunier@collabora.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -19,77 +20,51 @@
* Boston, MA 02110-1301, USA.
*/
-
#ifndef __GST_LV2_H__
#define __GST_LV2_H__
-
-#include <slv2/slv2.h>
-
+#include <lilv/lilv.h>
#include <gst/gst.h>
-#include <gst/signalprocessor/gstsignalprocessor.h>
+#include "gstlv2utils.h"
+LilvWorld *world;
+LilvNode *atom_class;
+LilvNode *audio_class;
+LilvNode *control_class;
+LilvNode *cv_class;
+LilvNode *event_class;
+LilvNode *input_class;
+LilvNode *output_class;
+LilvNode *preset_class;
+LilvNode *state_iface;
+LilvNode *state_uri;
-G_BEGIN_DECLS
+LilvNode *integer_prop;
+LilvNode *toggled_prop;
+LilvNode *designation_pred;
+LilvNode *in_place_broken_pred;
+LilvNode *optional_pred;
+LilvNode *group_pred;
+LilvNode *supports_event_pred;
+LilvNode *label_pred;
+LilvNode *center_role;
+LilvNode *left_role;
+LilvNode *right_role;
+LilvNode *rear_center_role;
+LilvNode *rear_left_role;
+LilvNode *rear_right_role;
+LilvNode *lfe_role;
+LilvNode *center_left_role;
+LilvNode *center_right_role;
+LilvNode *side_left_role;
+LilvNode *side_right_role;
-typedef struct _lv2_control_info {
- gchar *name;
- gchar *param_name;
- gfloat lowerbound, upperbound;
- gfloat def;
- gboolean lower, upper, samplerate;
- gboolean toggled, logarithmic, integer, writable;
-} lv2_control_info;
+GstStructure *lv2_meta_all;
-
-typedef struct _GstLV2 GstLV2;
-typedef struct _GstLV2Class GstLV2Class;
-typedef struct _GstLV2Group GstLV2Group;
-typedef struct _GstLV2Port GstLV2Port;
-
-
-struct _GstLV2 {
- GstSignalProcessor parent;
-
- SLV2Plugin plugin;
- SLV2Instance instance;
-
- gboolean activated;
-};
-
-struct _GstLV2Group {
- SLV2Value uri; /**< RDF resource (URI or blank node) */
- guint pad; /**< Gst pad index */
- SLV2Value symbol; /**< Gst pad name / LV2 group symbol */
- GArray *ports; /**< Array of GstLV2Port */
- gboolean has_roles; /**< TRUE iff all ports have a known role */
-};
-
-struct _GstLV2Port {
- gint index; /**< LV2 port index (on LV2 plugin) */
- gint pad; /**< Gst pad index (iff not part of a group) */
- SLV2Value role; /**< Channel position / port role */
- GstAudioChannelPosition position; /**< Channel position */
-};
-
-struct _GstLV2Class {
- GstSignalProcessorClass parent_class;
-
- SLV2Plugin plugin;
-
- GArray *in_groups; /**< Array of GstLV2Group */
- GArray *out_groups; /**< Array of GstLV2Group */
- GArray *audio_in_ports; /**< Array of GstLV2Port */
- GArray *audio_out_ports; /**< Array of GstLV2Port */
- GArray *control_in_ports; /**< Array of GstLV2Port */
- GArray *control_out_ports; /**< Array of GstLV2Port */
-
-};
-
-
-G_END_DECLS
-
-
+void gst_lv2_filter_register_element (GstPlugin *plugin,
+ GstStructure * lv2_meta);
+void gst_lv2_source_register_element (GstPlugin *plugin,
+ GstStructure * lv2_meta);
#endif /* __GST_LV2_H__ */
diff --git a/ext/lv2/gstlv2filter.c b/ext/lv2/gstlv2filter.c
new file mode 100644
index 0000000..03181e5
--- /dev/null
+++ b/ext/lv2/gstlv2filter.c
@@ -0,0 +1,574 @@
+/* GStreamer
+ * Copyright (C) 1999 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2001 Steve Baker <stevebaker_org@yahoo.co.uk>
+ * 2003 Andy Wingo <wingo at pobox.com>
+ * 2016 Thibault Saunier <thibault.saunier@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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "gstlv2.h"
+#include "gstlv2utils.h"
+
+#include <string.h>
+#include <math.h>
+#include <glib.h>
+
+#include <lilv/lilv.h>
+
+#include <gst/audio/audio.h>
+#include <gst/audio/gstaudiofilter.h>
+#include <gst/audio/audio-channels.h>
+
+GST_DEBUG_CATEGORY_EXTERN (lv2_debug);
+#define GST_CAT_DEFAULT lv2_debug
+
+typedef struct _lv2_control_info
+{
+ gchar *name;
+ gchar *param_name;
+ gfloat lowerbound, upperbound;
+ gfloat def;
+ gboolean lower, upper, samplerate;
+ gboolean toggled, logarithmic, integer, writable;
+} lv2_control_info;
+
+
+typedef struct _GstLV2Filter GstLV2Filter;
+typedef struct _GstLV2FilterClass GstLV2FilterClass;
+
+
+struct _GstLV2Filter
+{
+ GstAudioFilter parent;
+
+ GstLV2 lv2;
+};
+
+struct _GstLV2FilterClass
+{
+ GstAudioFilterClass parent_class;
+
+ GstLV2Class lv2;
+};
+
+static GstAudioFilter *parent_class = NULL;
+
+/* preset interface */
+
+static gchar **
+gst_lv2_filter_get_preset_names (GstPreset * preset)
+{
+ GstLV2Filter *self = (GstLV2Filter *) preset;
+
+ return gst_lv2_get_preset_names (&self->lv2, (GstObject *) self);
+}
+
+static gboolean
+gst_lv2_filter_load_preset (GstPreset * preset, const gchar * name)
+{
+ GstLV2Filter *self = (GstLV2Filter *) preset;
+
+ return gst_lv2_load_preset (&self->lv2, (GstObject *) self, name);
+}
+
+static gboolean
+gst_lv2_filter_save_preset (GstPreset * preset, const gchar * name)
+{
+ GstLV2Filter *self = (GstLV2Filter *) preset;
+
+ return gst_lv2_save_preset (&self->lv2, (GstObject *) self, name);
+}
+
+static gboolean
+gst_lv2_filter_rename_preset (GstPreset * preset, const gchar * old_name,
+ const gchar * new_name)
+{
+ return FALSE;
+}
+
+static gboolean
+gst_lv2_filter_delete_preset (GstPreset * preset, const gchar * name)
+{
+ GstLV2Filter *self = (GstLV2Filter *) preset;
+
+ return gst_lv2_delete_preset (&self->lv2, (GstObject *) self, name);
+}
+
+static gboolean
+gst_lv2_filter_set_meta (GstPreset * preset, const gchar * name,
+ const gchar * tag, const gchar * value)
+{
+ return FALSE;
+}
+
+static gboolean
+gst_lv2_filter_get_meta (GstPreset * preset, const gchar * name,
+ const gchar * tag, gchar ** value)
+{
+ *value = NULL;
+ return FALSE;
+}
+
+static void
+gst_lv2_filter_preset_interface_init (gpointer g_iface, gpointer iface_data)
+{
+ GstPresetInterface *iface = g_iface;
+
+ iface->get_preset_names = gst_lv2_filter_get_preset_names;
+ iface->load_preset = gst_lv2_filter_load_preset;
+ iface->save_preset = gst_lv2_filter_save_preset;
+ iface->rename_preset = gst_lv2_filter_rename_preset;
+ iface->delete_preset = gst_lv2_filter_delete_preset;
+ iface->set_meta = gst_lv2_filter_set_meta;
+ iface->get_meta = gst_lv2_filter_get_meta;
+}
+
+
+/* GObject vmethods implementation */
+static void
+gst_lv2_filter_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstLV2Filter *self = (GstLV2Filter *) object;
+
+ gst_lv2_object_set_property (&self->lv2, object, prop_id, value, pspec);
+}
+
+static void
+gst_lv2_filter_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstLV2Filter *self = (GstLV2Filter *) object;
+
+ gst_lv2_object_get_property (&self->lv2, object, prop_id, value, pspec);
+}
+
+static void
+gst_lv2_filter_finalize (GObject * object)
+{
+ GstLV2Filter *self = (GstLV2Filter *) object;
+
+ gst_lv2_finalize (&self->lv2);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+#if 0
+/* Convert an LV2 port role to a Gst channel positon
+ * WARNING: If the group has only a single port,
+ * GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER will be returned for pg:centerRole
+ * (which is used by LV2 for mono groups), but this is not correct. In this
+ * case the value must be changed to GST_AUDIO_CHANNEL_POSITION_FRONT_MONO
+ * (this can't be done by this function because this information isn't known
+ * at the time it is used).
+ */
+static GstAudioChannelPosition
+gst_lv2_filter_role_to_position (LilvNode * role)
+{
+ /* Front. Mono and left/right are mututally exclusive */
+ if (lilv_node_equals (role, center_role)) {
+
+ return GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER;
+ } else if (lilv_node_equals (role, left_role)) {
+ return GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
+ } else if (lilv_node_equals (role, right_role)) {
+ return GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
+
+ /* Rear. Left/right and center are mututally exclusive */
+ } else if (lilv_node_equals (role, rear_center_role)) {
+ return GST_AUDIO_CHANNEL_POSITION_REAR_CENTER;
+ } else if (lilv_node_equals (role, rear_left_role)) {
+ return GST_AUDIO_CHANNEL_POSITION_REAR_LEFT;
+ } else if (lilv_node_equals (role, rear_right_role)) {
+ return GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT;
+
+ /* Subwoofer/low-frequency-effects */
+ } else if (lilv_node_equals (role, lfe_role)) {
+ return GST_AUDIO_CHANNEL_POSITION_LFE1;
+
+ /* Center front speakers. Center and left/right_of_center
+ * are mutually exclusive */
+ } else if (lilv_node_equals (role, center_left_role)) {
+ return GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER;
+ } else if (lilv_node_equals (role, center_right_role)) {
+ return GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER;
+
+ /* sides */
+ } else if (lilv_node_equals (role, side_left_role)) {
+ return GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT;
+ } else if (lilv_node_equals (role, side_right_role)) {
+ return GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT;
+ }
+
+ return GST_AUDIO_CHANNEL_POSITION_INVALID;
+}
+
+static GstAudioChannelPosition *
+gst_lv2_filter_build_positions (GstLV2Group * group)
+{
+ GstAudioChannelPosition *positions = NULL;
+
+ /* don't do anything for mono */
+ if (group->ports->len > 1) {
+ gint i;
+
+ positions = g_new (GstAudioChannelPosition, group->ports->len);
+ for (i = 0; i < group->ports->len; ++i)
+ positions[i] = g_array_index (group->ports, GstLV2Port, i).position;
+ }
+ return positions;
+}
+#endif
+
+/* Find and return the group @a uri in @a groups, or NULL if not found */
+static void
+gst_lv2_filter_type_class_add_pad_templates (GstLV2FilterClass * klass)
+{
+ GstCaps *srccaps, *sinkcaps;
+ GstPadTemplate *pad_template;
+ GstElementClass *elem_class = GST_ELEMENT_CLASS (klass);
+
+ gint in_channels = 1, out_channels = 1;
+
+ in_channels = klass->lv2.in_group.ports->len;
+
+ out_channels = klass->lv2.out_group.ports->len;
+
+ /* FIXME Implement deintereleaved audio support */
+ sinkcaps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, GST_AUDIO_NE (F32),
+ "channels", G_TYPE_INT, in_channels,
+ "rate", GST_TYPE_INT_RANGE, 1, G_MAXINT,
+ "layout", G_TYPE_STRING, "interleaved", NULL);
+
+ srccaps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, GST_AUDIO_NE (F32),
+ "channels", G_TYPE_INT, out_channels,
+ "rate", GST_TYPE_INT_RANGE, 1, G_MAXINT,
+ "layout", G_TYPE_STRING, "interleaved", NULL);
+
+ pad_template =
+ gst_pad_template_new (GST_BASE_TRANSFORM_SINK_NAME, GST_PAD_SINK,
+ GST_PAD_ALWAYS, sinkcaps);
+ gst_element_class_add_pad_template (elem_class, pad_template);
+
+ pad_template =
+ gst_pad_template_new (GST_BASE_TRANSFORM_SRC_NAME, GST_PAD_SRC,
+ GST_PAD_ALWAYS, srccaps);
+ gst_element_class_add_pad_template (elem_class, pad_template);
+
+ gst_caps_unref (sinkcaps);
+ gst_caps_unref (srccaps);
+}
+
+static gboolean
+gst_lv2_filter_setup (GstAudioFilter * gsp, const GstAudioInfo * info)
+{
+ GstLV2Filter *self = (GstLV2Filter *) gsp;
+
+ g_return_val_if_fail (self->lv2.activated == FALSE, FALSE);
+
+ GST_DEBUG_OBJECT (self, "instantiating the plugin at %d Hz",
+ GST_AUDIO_INFO_RATE (info));
+
+ if (!gst_lv2_setup (&self->lv2, GST_AUDIO_INFO_RATE (info)))
+ goto no_instance;
+
+ /* FIXME Handle audio channel positionning while negotiating CAPS */
+#if 0
+ gint i;
+ /* set input group pad audio channel position */
+ for (i = 0; i < oclass->lv2.in_groups->len; ++i) {
+ group = &g_array_index (oclass->lv2.in_groups, GstLV2Group, i);
+ if (group->has_roles) {
+ if ((positions = gst_lv2_filter_build_positions (group))) {
+ if ((pad = gst_element_get_static_pad (GST_ELEMENT (gsp),
+ lilv_node_as_string (group->symbol)))) {
+ GST_INFO_OBJECT (self, "set audio channel positions on sink pad %s",
+ lilv_node_as_string (group->symbol));
+ s = gst_caps_get_structure (caps, 0);
+ gst_audio_set_channel_positions (s, positions);
+ gst_object_unref (pad);
+ }
+ g_free (positions);
+ positions = NULL;
+ }
+ }
+ }
+ /* set output group pad audio channel position */
+ for (i = 0; i < oclass->lv2.out_groups->len; ++i) {
+ group = &g_array_index (oclass->lv2.out_groups, GstLV2Group, i);
+ if (group->has_roles) {
+ if ((positions = gst_lv2_filter_build_positions (group))) {
+ if ((pad = gst_element_get_static_pad (GST_ELEMENT (gsp),
+ lilv_node_as_string (group->symbol)))) {
+ GST_INFO_OBJECT (self, "set audio channel positions on src pad %s",
+ lilv_node_as_string (group->symbol));
+ s = gst_caps_get_structure (caps, 0);
+ gst_audio_set_channel_positions (s, positions);
+ gst_object_unref (pad);
+ }
+ g_free (positions);
+ positions = NULL;
+ }
+ }
+ }
+#endif
+
+ return TRUE;
+
+no_instance:
+ {
+ GST_ERROR_OBJECT (gsp, "could not create instance");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_lv2_filter_stop (GstBaseTransform * transform)
+{
+ GstLV2Filter *lv2 = (GstLV2Filter *) transform;
+
+ return gst_lv2_cleanup (&lv2->lv2, (GstObject *) lv2);
+}
+
+static inline void
+gst_lv2_filter_deinterleave_data (guint n_channels, gfloat * outdata,
+ guint samples, gfloat * indata)
+{
+ guint i, j;
+
+ for (i = 0; i < n_channels; i++)
+ for (j = 0; j < samples; j++)
+ outdata[i * samples + j] = indata[j * n_channels + i];
+}
+
+static inline void
+gst_lv2_filter_interleave_data (guint n_channels, gfloat * outdata,
+ guint samples, gfloat * indata)
+{
+ guint i, j;
+
+ for (i = 0; i < n_channels; i++)
+ for (j = 0; j < samples; j++) {
+ outdata[j * n_channels + i] = indata[i * samples + j];
+ }
+}
+
+static GstFlowReturn
+gst_lv2_filter_transform_data (GstLV2Filter * self,
+ GstMapInfo * in_map, GstMapInfo * out_map)
+{
+ GstLV2FilterClass *klass =
+ (GstLV2FilterClass *) GST_AUDIO_FILTER_GET_CLASS (self);
+ GstLV2Class *lv2_class = &klass->lv2;
+ GstLV2Group *lv2_group;
+ GstLV2Port *lv2_port;
+ guint j, k, l, nframes, samples, out_samples;
+ gfloat *in = NULL, *out = NULL, *cv = NULL, *mem;
+ gfloat val;
+
+ nframes = in_map->size / sizeof (float);
+
+ /* multi channel inputs */
+ lv2_group = &lv2_class->in_group;
+ samples = nframes / lv2_group->ports->len;
+ GST_LOG_OBJECT (self, "in : samples=%u, nframes=%u, ports=%d", samples,
+ nframes, lv2_group->ports->len);
+
+ if (lv2_group->ports->len > 1) {
+ in = g_new0 (gfloat, nframes);
+ out = g_new0 (gfloat, samples * lv2_group->ports->len);
+ gst_lv2_filter_deinterleave_data (lv2_group->ports->len, in,
+ samples, (gfloat *) in_map->data);
+ } else {
+ in = (gfloat *) in_map->data;
+ out = (gfloat *) out_map->data;
+ }
+
+ for (j = 0; j < lv2_group->ports->len; ++j) {
+ lv2_port = &g_array_index (lv2_group->ports, GstLV2Port, j);
+ lilv_instance_connect_port (self->lv2.instance, lv2_port->index,
+ in + (j * samples));
+ }
+
+ /* multi channel outputs */
+ lv2_group = &lv2_class->out_group;
+ out_samples = nframes / lv2_group->ports->len;
+
+ GST_LOG_OBJECT (self, "out: samples=%u, nframes=%u, ports=%d", out_samples,
+ nframes, lv2_group->ports->len);
+ for (j = 0; j < lv2_group->ports->len; ++j) {
+ lv2_port = &g_array_index (lv2_group->ports, GstLV2Port, j);
+ lilv_instance_connect_port (self->lv2.instance, lv2_port->index,
+ out + (j * out_samples));
+ }
+
+ /* cv ports */
+ cv = g_new (gfloat, samples * lv2_class->num_cv_in);
+ for (j = k = 0; j < lv2_class->control_in_ports->len; j++) {
+ lv2_port = &g_array_index (lv2_class->control_in_ports, GstLV2Port, j);
+ if (lv2_port->type != GST_LV2_PORT_CV)
+ continue;
+
+ mem = cv + (k * samples);
+ val = self->lv2.ports.control.in[j];
+ /* FIXME: use gst_control_binding_get_value_array */
+ for (l = 0; l < samples; l++)
+ mem[l] = val;
+ lilv_instance_connect_port (self->lv2.instance, lv2_port->index, mem);
+ k++;
+ }
+
+ lilv_instance_run (self->lv2.instance, samples);
+
+ if (lv2_group->ports->len > 1) {
+ gst_lv2_filter_interleave_data (lv2_group->ports->len,
+ (gfloat *) out_map->data, out_samples, out);
+ g_free (out);
+ g_free (in);
+ }
+ g_free (cv);
+
+ return GST_FLOW_OK;
+}
+
+static GstFlowReturn
+gst_lv2_filter_transform_ip (GstBaseTransform * transform, GstBuffer * buf)
+{
+ GstFlowReturn ret;
+ GstMapInfo map;
+
+ gst_buffer_map (buf, &map, GST_MAP_READWRITE);
+
+ ret = gst_lv2_filter_transform_data ((GstLV2Filter *) transform, &map, &map);
+
+ gst_buffer_unmap (buf, &map);
+
+ return ret;
+}
+
+static GstFlowReturn
+gst_lv2_filter_transform (GstBaseTransform * transform,
+ GstBuffer * inbuf, GstBuffer * outbuf)
+{
+ GstMapInfo in_map, out_map;
+ GstFlowReturn ret;
+
+ gst_buffer_map (inbuf, &in_map, GST_MAP_READ);
+ gst_buffer_map (outbuf, &out_map, GST_MAP_WRITE);
+
+ ret = gst_lv2_filter_transform_data ((GstLV2Filter *) transform,
+ &in_map, &out_map);
+
+ gst_buffer_unmap (inbuf, &in_map);
+ gst_buffer_unmap (outbuf, &out_map);
+
+ return ret;
+}
+
+static void
+gst_lv2_filter_base_init (gpointer g_class)
+{
+ GstLV2FilterClass *klass = (GstLV2FilterClass *) g_class;
+ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
+
+ gst_lv2_class_init (&klass->lv2, G_TYPE_FROM_CLASS (klass));
+
+ gst_lv2_element_class_set_metadata (&klass->lv2, element_class,
+ "Filter/Effect/Audio/LV2");
+
+ gst_lv2_filter_type_class_add_pad_templates (klass);
+}
+
+static void
+gst_lv2_filter_base_finalize (GstLV2FilterClass * lv2_class)
+{
+ gst_lv2_class_finalize (&lv2_class->lv2);
+}
+
+static void
+gst_lv2_filter_class_init (GstLV2FilterClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstBaseTransformClass *transform_class = GST_BASE_TRANSFORM_CLASS (klass);
+ GstAudioFilterClass *audiofilter_class = GST_AUDIO_FILTER_CLASS (klass);
+
+ GST_DEBUG ("class_init %p", klass);
+
+ gobject_class->set_property = gst_lv2_filter_set_property;
+ gobject_class->get_property = gst_lv2_filter_get_property;
+ gobject_class->finalize = gst_lv2_filter_finalize;
+
+ audiofilter_class->setup = gst_lv2_filter_setup;
+
+ transform_class->stop = gst_lv2_filter_stop;
+ transform_class->transform = gst_lv2_filter_transform;
+ transform_class->transform_ip = gst_lv2_filter_transform_ip;
+
+ gst_lv2_class_install_properties (&klass->lv2, gobject_class, 1);
+}
+
+static void
+gst_lv2_filter_init (GstLV2Filter * self, GstLV2FilterClass * klass)
+{
+ gst_lv2_init (&self->lv2, &klass->lv2);
+
+ if (!lilv_plugin_has_feature (klass->lv2.plugin, in_place_broken_pred))
+ gst_base_transform_set_in_place (GST_BASE_TRANSFORM (self), TRUE);
+}
+
+void
+gst_lv2_filter_register_element (GstPlugin * plugin, GstStructure * lv2_meta)
+{
+ GTypeInfo info = {
+ sizeof (GstLV2FilterClass),
+ (GBaseInitFunc) gst_lv2_filter_base_init,
+ (GBaseFinalizeFunc) gst_lv2_filter_base_finalize,
+ (GClassInitFunc) gst_lv2_filter_class_init,
+ NULL,
+ NULL,
+ sizeof (GstLV2Filter),
+ 0,
+ (GInstanceInitFunc) gst_lv2_filter_init,
+ };
+ const gchar *type_name =
+ gst_structure_get_string (lv2_meta, "element-type-name");
+ GType element_type =
+ g_type_register_static (GST_TYPE_AUDIO_FILTER, type_name, &info, 0);
+ gboolean can_do_presets;
+
+ /* register interfaces */
+ gst_structure_get_boolean (lv2_meta, "can-do-presets", &can_do_presets);
+ if (can_do_presets) {
+ const GInterfaceInfo preset_interface_info = {
+ (GInterfaceInitFunc) gst_lv2_filter_preset_interface_init,
+ NULL,
+ NULL
+ };
+ g_type_add_interface_static (element_type, GST_TYPE_PRESET,
+ &preset_interface_info);
+ }
+
+ gst_element_register (plugin, type_name, GST_RANK_NONE, element_type);
+
+ if (!parent_class)
+ parent_class = g_type_class_ref (GST_TYPE_AUDIO_FILTER);
+}
diff --git a/ext/lv2/gstlv2source.c b/ext/lv2/gstlv2source.c
new file mode 100644
index 0000000..56f9911
--- /dev/null
+++ b/ext/lv2/gstlv2source.c
@@ -0,0 +1,755 @@
+/* GStreamer
+ * Copyright (C) 1999 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2001 Steve Baker <stevebaker_org@yahoo.co.uk>
+ * 2003 Andy Wingo <wingo at pobox.com>
+ * 2016 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * 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 "gstlv2.h"
+#include "gstlv2utils.h"
+
+#include <string.h>
+#include <math.h>
+#include <glib.h>
+
+#include <lilv/lilv.h>
+
+#include <gst/audio/audio.h>
+#include <gst/audio/audio-channels.h>
+#include <gst/base/gstbasesrc.h>
+
+GST_DEBUG_CATEGORY_EXTERN (lv2_debug);
+#define GST_CAT_DEFAULT lv2_debug
+
+
+typedef struct _GstLV2Source GstLV2Source;
+typedef struct _GstLV2SourceClass GstLV2SourceClass;
+
+struct _GstLV2Source
+{
+ GstBaseSrc parent;
+
+ GstLV2 lv2;
+
+ /* audio parameters */
+ GstAudioInfo info;
+ gint samples_per_buffer;
+
+ /*< private > */
+ gboolean tags_pushed; /* send tags just once ? */
+ GstClockTimeDiff timestamp_offset; /* base offset */
+ GstClockTime next_time; /* next timestamp */
+ gint64 next_sample; /* next sample to send */
+ gint64 next_byte; /* next byte to send */
+ gint64 sample_stop;
+ gboolean check_seek_stop;
+ gboolean eos_reached;
+ gint generate_samples_per_buffer; /* used to generate a partial buffer */
+ gboolean can_activate_pull;
+ gboolean reverse; /* play backwards */
+};
+
+struct _GstLV2SourceClass
+{
+ GstBaseSrcClass parent_class;
+
+ GstLV2Class lv2;
+};
+
+enum
+{
+ GST_LV2_SOURCE_PROP_0,
+ GST_LV2_SOURCE_PROP_SAMPLES_PER_BUFFER,
+ GST_LV2_SOURCE_PROP_IS_LIVE,
+ GST_LV2_SOURCE_PROP_TIMESTAMP_OFFSET,
+ GST_LV2_SOURCE_PROP_CAN_ACTIVATE_PUSH,
+ GST_LV2_SOURCE_PROP_CAN_ACTIVATE_PULL,
+ GST_LV2_SOURCE_PROP_LAST
+};
+
+static GstBaseSrc *parent_class = NULL;
+
+/* preset interface */
+
+static gchar **
+gst_lv2_source_get_preset_names (GstPreset * preset)
+{
+ GstLV2Source *self = (GstLV2Source *) preset;
+
+ return gst_lv2_get_preset_names (&self->lv2, (GstObject *) self);
+}
+
+static gboolean
+gst_lv2_source_load_preset (GstPreset * preset, const gchar * name)
+{
+ GstLV2Source *self = (GstLV2Source *) preset;
+
+ return gst_lv2_load_preset (&self->lv2, (GstObject *) self, name);
+}
+
+static gboolean
+gst_lv2_source_save_preset (GstPreset * preset, const gchar * name)
+{
+ GstLV2Source *self = (GstLV2Source *) preset;
+
+ return gst_lv2_save_preset (&self->lv2, (GstObject *) self, name);
+}
+
+static gboolean
+gst_lv2_source_rename_preset (GstPreset * preset, const gchar * old_name,
+ const gchar * new_name)
+{
+ return FALSE;
+}
+
+static gboolean
+gst_lv2_source_delete_preset (GstPreset * preset, const gchar * name)
+{
+ GstLV2Source *self = (GstLV2Source *) preset;
+
+ return gst_lv2_delete_preset (&self->lv2, (GstObject *) self, name);
+}
+
+static gboolean
+gst_lv2_source_set_meta (GstPreset * preset, const gchar * name,
+ const gchar * tag, const gchar * value)
+{
+ return FALSE;
+}
+
+static gboolean
+gst_lv2_source_get_meta (GstPreset * preset, const gchar * name,
+ const gchar * tag, gchar ** value)
+{
+ *value = NULL;
+ return FALSE;
+}
+
+static void
+gst_lv2_source_preset_interface_init (gpointer g_iface, gpointer iface_data)
+{
+ GstPresetInterface *iface = g_iface;
+
+ iface->get_preset_names = gst_lv2_source_get_preset_names;
+ iface->load_preset = gst_lv2_source_load_preset;
+ iface->save_preset = gst_lv2_source_save_preset;
+ iface->rename_preset = gst_lv2_source_rename_preset;
+ iface->delete_preset = gst_lv2_source_delete_preset;
+ iface->set_meta = gst_lv2_source_set_meta;
+ iface->get_meta = gst_lv2_source_get_meta;
+}
+
+
+/* GstBasesrc vmethods implementation */
+
+static gboolean
+gst_lv2_source_set_caps (GstBaseSrc * base, GstCaps * caps)
+{
+ GstLV2Source *lv2 = (GstLV2Source *) base;
+ GstAudioInfo info;
+
+ if (!gst_audio_info_from_caps (&info, caps)) {
+ GST_ERROR_OBJECT (base, "received invalid caps");
+ return FALSE;
+ }
+
+ GST_DEBUG_OBJECT (lv2, "negotiated to caps %" GST_PTR_FORMAT, caps);
+
+ lv2->info = info;
+
+ gst_base_src_set_blocksize (base,
+ GST_AUDIO_INFO_BPF (&info) * lv2->samples_per_buffer);
+
+ if (!gst_lv2_setup (&lv2->lv2, GST_AUDIO_INFO_RATE (&info)))
+ goto no_instance;
+
+ return TRUE;
+
+no_instance:
+ {
+ GST_ERROR_OBJECT (lv2, "could not create instance");
+ return FALSE;
+ }
+}
+
+static GstCaps *
+gst_lv2_source_fixate (GstBaseSrc * base, GstCaps * caps)
+{
+ GstLV2Source *lv2 = (GstLV2Source *) base;
+ GstStructure *structure;
+
+ caps = gst_caps_make_writable (caps);
+
+ structure = gst_caps_get_structure (caps, 0);
+
+ GST_DEBUG_OBJECT (lv2, "fixating samplerate to %d", GST_AUDIO_DEF_RATE);
+
+ gst_structure_fixate_field_nearest_int (structure, "rate",
+ GST_AUDIO_DEF_RATE);
+
+ gst_structure_fixate_field_string (structure, "format", GST_AUDIO_NE (F32));
+
+ gst_structure_fixate_field_nearest_int (structure, "channels",
+ lv2->lv2.klass->out_group.ports->len);
+
+ caps = GST_BASE_SRC_CLASS (parent_class)->fixate (base, caps);
+
+ return caps;
+}
+
+static void
+gst_lv2_source_get_times (GstBaseSrc * base, GstBuffer * buffer,
+ GstClockTime * start, GstClockTime * end)
+{
+ /* for live sources, sync on the timestamp of the buffer */
+ if (gst_base_src_is_live (base)) {
+ GstClockTime timestamp = GST_BUFFER_TIMESTAMP (buffer);
+
+ if (GST_CLOCK_TIME_IS_VALID (timestamp)) {
+ /* get duration to calculate end time */
+ GstClockTime duration = GST_BUFFER_DURATION (buffer);
+
+ if (GST_CLOCK_TIME_IS_VALID (duration)) {
+ *end = timestamp + duration;
+ }
+ *start = timestamp;
+ }
+ } else {
+ *start = -1;
+ *end = -1;
+ }
+}
+
+/* seek to time, will be called when we operate in push mode. In pull mode we
+ * get the requested byte offset. */
+static gboolean
+gst_lv2_source_do_seek (GstBaseSrc * base, GstSegment * segment)
+{
+ GstLV2Source *lv2 = (GstLV2Source *) base;
+ GstClockTime time;
+ gint samplerate, bpf;
+ gint64 next_sample;
+
+ GST_DEBUG_OBJECT (lv2, "seeking %" GST_SEGMENT_FORMAT, segment);
+
+ time = segment->position;
+ lv2->reverse = (segment->rate < 0.0);
+
+ samplerate = GST_AUDIO_INFO_RATE (&lv2->info);
+ bpf = GST_AUDIO_INFO_BPF (&lv2->info);
+
+ /* now move to the time indicated, don't seek to the sample *after* the time */
+ next_sample = gst_util_uint64_scale_int (time, samplerate, GST_SECOND);
+ lv2->next_byte = next_sample * bpf;
+ if (samplerate == 0)
+ lv2->next_time = 0;
+ else
+ lv2->next_time =
+ gst_util_uint64_scale_round (next_sample, GST_SECOND, samplerate);
+
+ GST_DEBUG_OBJECT (lv2, "seeking next_sample=%" G_GINT64_FORMAT
+ " next_time=%" GST_TIME_FORMAT, next_sample,
+ GST_TIME_ARGS (lv2->next_time));
+
+ g_assert (lv2->next_time <= time);
+
+ lv2->next_sample = next_sample;
+
+ if (!lv2->reverse) {
+ if (GST_CLOCK_TIME_IS_VALID (segment->start)) {
+ segment->time = segment->start;
+ }
+ } else {
+ if (GST_CLOCK_TIME_IS_VALID (segment->stop)) {
+ segment->time = segment->stop;
+ }
+ }
+
+ if (GST_CLOCK_TIME_IS_VALID (segment->stop)) {
+ time = segment->stop;
+ lv2->sample_stop =
+ gst_util_uint64_scale_round (time, samplerate, GST_SECOND);
+ lv2->check_seek_stop = TRUE;
+ } else {
+ lv2->check_seek_stop = FALSE;
+ }
+ lv2->eos_reached = FALSE;
+
+ return TRUE;
+}
+
+static gboolean
+gst_lv2_source_is_seekable (GstBaseSrc * base)
+{
+ /* we're seekable... */
+ return TRUE;
+}
+
+static gboolean
+gst_lv2_source_query (GstBaseSrc * base, GstQuery * query)
+{
+ GstLV2Source *lv2 = (GstLV2Source *) base;
+ gboolean res = FALSE;
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_CONVERT:
+ {
+ GstFormat src_fmt, dest_fmt;
+ gint64 src_val, dest_val;
+
+ gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val);
+
+ if (!gst_audio_info_convert (&lv2->info, src_fmt, src_val, dest_fmt,
+ &dest_val)) {
+ GST_DEBUG_OBJECT (lv2, "query failed");
+ return FALSE;
+ }
+
+ gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
+ res = TRUE;
+ break;
+ }
+ case GST_QUERY_SCHEDULING:
+ {
+ /* if we can operate in pull mode */
+ gst_query_set_scheduling (query, GST_SCHEDULING_FLAG_SEEKABLE, 1, -1, 0);
+ gst_query_add_scheduling_mode (query, GST_PAD_MODE_PUSH);
+ if (lv2->can_activate_pull)
+ gst_query_add_scheduling_mode (query, GST_PAD_MODE_PULL);
+
+ res = TRUE;
+ break;
+ }
+ default:
+ res = GST_BASE_SRC_CLASS (parent_class)->query (base, query);
+ break;
+ }
+
+ return res;
+}
+
+static inline void
+gst_lv2_source_interleave_data (guint n_channels, gfloat * outdata,
+ guint samples, gfloat * indata)
+{
+ guint i, j;
+
+ for (i = 0; i < n_channels; i++)
+ for (j = 0; j < samples; j++) {
+ outdata[j * n_channels + i] = indata[i * samples + j];
+ }
+}
+
+static GstFlowReturn
+gst_lv2_source_fill (GstBaseSrc * base, guint64 offset,
+ guint length, GstBuffer * buffer)
+{
+ GstLV2Source *lv2 = (GstLV2Source *) base;
+ GstLV2SourceClass *klass = (GstLV2SourceClass *) GST_BASE_SRC_GET_CLASS (lv2);
+ GstLV2Class *lv2_class = &klass->lv2;
+ GstLV2Group *lv2_group;
+ GstLV2Port *lv2_port;
+ GstClockTime next_time;
+ gint64 next_sample, next_byte;
+ guint bytes, samples;
+ GstElementClass *eclass;
+ GstMapInfo map;
+ gint samplerate, bpf;
+ guint j, k, l;
+ gfloat *out = NULL, *cv = NULL, *mem;
+ gfloat val;
+
+ /* example for tagging generated data */
+ if (!lv2->tags_pushed) {
+ GstTagList *taglist;
+
+ taglist = gst_tag_list_new (GST_TAG_DESCRIPTION, "lv2 wave", NULL);
+
+ eclass = GST_ELEMENT_CLASS (parent_class);
+ if (eclass->send_event)
+ eclass->send_event (GST_ELEMENT (base), gst_event_new_tag (taglist));
+ else
+ gst_tag_list_unref (taglist);
+ lv2->tags_pushed = TRUE;
+ }
+
+ if (lv2->eos_reached) {
+ GST_INFO_OBJECT (lv2, "eos");
+ return GST_FLOW_EOS;
+ }
+
+ samplerate = GST_AUDIO_INFO_RATE (&lv2->info);
+ bpf = GST_AUDIO_INFO_BPF (&lv2->info);
+
+ /* if no length was given, use our default length in samples otherwise convert
+ * the length in bytes to samples. */
+ if (length == -1)
+ samples = lv2->samples_per_buffer;
+ else
+ samples = length / bpf;
+
+ /* if no offset was given, use our next logical byte */
+ if (offset == -1)
+ offset = lv2->next_byte;
+
+ /* now see if we are at the byteoffset we think we are */
+ if (offset != lv2->next_byte) {
+ GST_DEBUG_OBJECT (lv2, "seek to new offset %" G_GUINT64_FORMAT, offset);
+ /* we have a discont in the expected sample offset, do a 'seek' */
+ lv2->next_sample = offset / bpf;
+ lv2->next_time =
+ gst_util_uint64_scale_int (lv2->next_sample, GST_SECOND, samplerate);
+ lv2->next_byte = offset;
+ }
+
+ /* check for eos */
+ if (lv2->check_seek_stop &&
+ (lv2->sample_stop > lv2->next_sample) &&
+ (lv2->sample_stop < lv2->next_sample + samples)
+ ) {
+ /* calculate only partial buffer */
+ lv2->generate_samples_per_buffer = lv2->sample_stop - lv2->next_sample;
+ next_sample = lv2->sample_stop;
+ lv2->eos_reached = TRUE;
+
+ GST_INFO_OBJECT (lv2, "eos reached");
+ } else {
+ /* calculate full buffer */
+ lv2->generate_samples_per_buffer = samples;
+ next_sample = lv2->next_sample + (lv2->reverse ? (-samples) : samples);
+ }
+
+ bytes = lv2->generate_samples_per_buffer * bpf;
+
+ next_byte = lv2->next_byte + (lv2->reverse ? (-bytes) : bytes);
+ next_time = gst_util_uint64_scale_int (next_sample, GST_SECOND, samplerate);
+
+ GST_LOG_OBJECT (lv2, "samplerate %d", samplerate);
+ GST_LOG_OBJECT (lv2,
+ "next_sample %" G_GINT64_FORMAT ", ts %" GST_TIME_FORMAT, next_sample,
+ GST_TIME_ARGS (next_time));
+
+ gst_buffer_set_size (buffer, bytes);
+
+ GST_BUFFER_OFFSET (buffer) = lv2->next_sample;
+ GST_BUFFER_OFFSET_END (buffer) = next_sample;
+ if (!lv2->reverse) {
+ GST_BUFFER_TIMESTAMP (buffer) = lv2->timestamp_offset + lv2->next_time;
+ GST_BUFFER_DURATION (buffer) = next_time - lv2->next_time;
+ } else {
+ GST_BUFFER_TIMESTAMP (buffer) = lv2->timestamp_offset + next_time;
+ GST_BUFFER_DURATION (buffer) = lv2->next_time - next_time;
+ }
+
+ gst_object_sync_values (GST_OBJECT (lv2), GST_BUFFER_TIMESTAMP (buffer));
+
+ lv2->next_time = next_time;
+ lv2->next_sample = next_sample;
+ lv2->next_byte = next_byte;
+
+ GST_LOG_OBJECT (lv2, "generating %u samples at ts %" GST_TIME_FORMAT,
+ samples, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)));
+
+ gst_buffer_map (buffer, &map, GST_MAP_WRITE);
+
+ /* multi channel outputs */
+ lv2_group = &lv2_class->out_group;
+ if (lv2_group->ports->len > 1) {
+ out = g_new0 (gfloat, samples * lv2_group->ports->len);
+ for (j = 0; j < lv2_group->ports->len; ++j) {
+ lv2_port = &g_array_index (lv2_group->ports, GstLV2Port, j);
+ lilv_instance_connect_port (lv2->lv2.instance, lv2_port->index,
+ out + (j * samples));
+ GST_LOG_OBJECT (lv2, "connected port %d/%d", j, lv2_group->ports->len);
+ }
+ } else {
+ lv2_port = &g_array_index (lv2_group->ports, GstLV2Port, 0);
+ lilv_instance_connect_port (lv2->lv2.instance, lv2_port->index,
+ (gfloat *) map.data);
+ GST_LOG_OBJECT (lv2, "connected port 0");
+ }
+
+ /* cv ports */
+ cv = g_new (gfloat, samples * lv2_class->num_cv_in);
+ for (j = k = 0; j < lv2_class->control_in_ports->len; j++) {
+ lv2_port = &g_array_index (lv2_class->control_in_ports, GstLV2Port, j);
+ if (lv2_port->type != GST_LV2_PORT_CV)
+ continue;
+
+ mem = cv + (k * samples);
+ val = lv2->lv2.ports.control.in[j];
+ /* FIXME: use gst_control_binding_get_value_array */
+ for (l = 0; l < samples; l++)
+ mem[l] = val;
+ lilv_instance_connect_port (lv2->lv2.instance, lv2_port->index, mem);
+ k++;
+ }
+
+ lilv_instance_run (lv2->lv2.instance, samples);
+
+ if (lv2_group->ports->len > 1) {
+ gst_lv2_source_interleave_data (lv2_group->ports->len,
+ (gfloat *) map.data, samples, out);
+ g_free (out);
+ }
+
+ g_free (cv);
+
+ gst_buffer_unmap (buffer, &map);
+
+ return GST_FLOW_OK;
+}
+
+static gboolean
+gst_lv2_source_start (GstBaseSrc * base)
+{
+ GstLV2Source *lv2 = (GstLV2Source *) base;
+
+ lv2->next_sample = 0;
+ lv2->next_byte = 0;
+ lv2->next_time = 0;
+ lv2->check_seek_stop = FALSE;
+ lv2->eos_reached = FALSE;
+ lv2->tags_pushed = FALSE;
+
+ GST_INFO_OBJECT (base, "starting");
+
+ return TRUE;
+}
+
+static gboolean
+gst_lv2_source_stop (GstBaseSrc * base)
+{
+ GstLV2Source *lv2 = (GstLV2Source *) base;
+
+ GST_INFO_OBJECT (base, "stopping");
+ return gst_lv2_cleanup (&lv2->lv2, (GstObject *) lv2);
+}
+
+/* GObject vmethods implementation */
+static void
+gst_lv2_source_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstLV2Source *self = (GstLV2Source *) object;
+
+ switch (prop_id) {
+ case GST_LV2_SOURCE_PROP_SAMPLES_PER_BUFFER:
+ self->samples_per_buffer = g_value_get_int (value);
+ gst_base_src_set_blocksize (GST_BASE_SRC (self),
+ GST_AUDIO_INFO_BPF (&self->info) * self->samples_per_buffer);
+ break;
+ case GST_LV2_SOURCE_PROP_IS_LIVE:
+ gst_base_src_set_live (GST_BASE_SRC (self), g_value_get_boolean (value));
+ break;
+ case GST_LV2_SOURCE_PROP_TIMESTAMP_OFFSET:
+ self->timestamp_offset = g_value_get_int64 (value);
+ break;
+ case GST_LV2_SOURCE_PROP_CAN_ACTIVATE_PUSH:
+ GST_BASE_SRC (self)->can_activate_push = g_value_get_boolean (value);
+ break;
+ case GST_LV2_SOURCE_PROP_CAN_ACTIVATE_PULL:
+ self->can_activate_pull = g_value_get_boolean (value);
+ break;
+ default:
+ gst_lv2_object_set_property (&self->lv2, object, prop_id, value, pspec);
+ break;
+ }
+}
+
+static void
+gst_lv2_source_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstLV2Source *self = (GstLV2Source *) object;
+
+ switch (prop_id) {
+ case GST_LV2_SOURCE_PROP_SAMPLES_PER_BUFFER:
+ g_value_set_int (value, self->samples_per_buffer);
+ break;
+ case GST_LV2_SOURCE_PROP_IS_LIVE:
+ g_value_set_boolean (value, gst_base_src_is_live (GST_BASE_SRC (self)));
+ break;
+ case GST_LV2_SOURCE_PROP_TIMESTAMP_OFFSET:
+ g_value_set_int64 (value, self->timestamp_offset);
+ break;
+ case GST_LV2_SOURCE_PROP_CAN_ACTIVATE_PUSH:
+ g_value_set_boolean (value, GST_BASE_SRC (self)->can_activate_push);
+ break;
+ case GST_LV2_SOURCE_PROP_CAN_ACTIVATE_PULL:
+ g_value_set_boolean (value, self->can_activate_pull);
+ break;
+ default:
+ gst_lv2_object_get_property (&self->lv2, object, prop_id, value, pspec);
+ break;
+ }
+}
+
+static void
+gst_lv2_source_finalize (GObject * object)
+{
+ GstLV2Source *self = (GstLV2Source *) object;
+
+ gst_lv2_finalize (&self->lv2);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+
+static void
+gst_lv2_source_base_init (gpointer g_class)
+{
+ GstLV2SourceClass *klass = (GstLV2SourceClass *) g_class;
+ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
+ GstPadTemplate *pad_template;
+ GstCaps *srccaps;
+
+ gst_lv2_class_init (&klass->lv2, G_TYPE_FROM_CLASS (klass));
+
+ gst_lv2_element_class_set_metadata (&klass->lv2, element_class,
+ "Source/Audio/LV2");
+
+ srccaps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, GST_AUDIO_NE (F32),
+ "channels", G_TYPE_INT, klass->lv2.out_group.ports->len,
+ "rate", GST_TYPE_INT_RANGE, 1, G_MAXINT,
+ "layout", G_TYPE_STRING, "interleaved", NULL);
+
+ pad_template =
+ gst_pad_template_new (GST_BASE_TRANSFORM_SRC_NAME, GST_PAD_SRC,
+ GST_PAD_ALWAYS, srccaps);
+ gst_element_class_add_pad_template (element_class, pad_template);
+
+ gst_caps_unref (srccaps);
+}
+
+static void
+gst_lv2_source_base_finalize (GstLV2SourceClass * lv2_class)
+{
+ gst_lv2_class_finalize (&lv2_class->lv2);
+}
+
+static void
+gst_lv2_source_class_init (GstLV2SourceClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstBaseSrcClass *src_class = (GstBaseSrcClass *) klass;
+
+ GST_DEBUG ("class_init %p", klass);
+
+ gobject_class->set_property = gst_lv2_source_set_property;
+ gobject_class->get_property = gst_lv2_source_get_property;
+ gobject_class->finalize = gst_lv2_source_finalize;
+
+ src_class->set_caps = gst_lv2_source_set_caps;
+ src_class->fixate = gst_lv2_source_fixate;
+ src_class->is_seekable = gst_lv2_source_is_seekable;
+ src_class->do_seek = gst_lv2_source_do_seek;
+ src_class->query = gst_lv2_source_query;
+ src_class->get_times = gst_lv2_source_get_times;
+ src_class->start = gst_lv2_source_start;
+ src_class->stop = gst_lv2_source_stop;
+ src_class->fill = gst_lv2_source_fill;
+
+ g_object_class_install_property (gobject_class,
+ GST_LV2_SOURCE_PROP_SAMPLES_PER_BUFFER,
+ g_param_spec_int ("samplesperbuffer", "Samples per buffer",
+ "Number of samples in each outgoing buffer", 1, G_MAXINT, 1024,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, GST_LV2_SOURCE_PROP_IS_LIVE,
+ g_param_spec_boolean ("is-live", "Is Live",
+ "Whether to act as a live source", FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class,
+ GST_LV2_SOURCE_PROP_TIMESTAMP_OFFSET,
+ g_param_spec_int64 ("timestamp-offset", "Timestamp offset",
+ "An offset added to timestamps set on buffers (in ns)", G_MININT64,
+ G_MAXINT64, G_GINT64_CONSTANT (0),
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class,
+ GST_LV2_SOURCE_PROP_CAN_ACTIVATE_PUSH,
+ g_param_spec_boolean ("can-activate-push", "Can activate push",
+ "Can activate in push mode", TRUE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class,
+ GST_LV2_SOURCE_PROP_CAN_ACTIVATE_PULL,
+ g_param_spec_boolean ("can-activate-pull", "Can activate pull",
+ "Can activate in pull mode", FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_lv2_class_install_properties (&klass->lv2, gobject_class,
+ GST_LV2_SOURCE_PROP_LAST);
+}
+
+static void
+gst_lv2_source_init (GstLV2Source * self, GstLV2SourceClass * klass)
+{
+ gst_lv2_init (&self->lv2, &klass->lv2);
+
+ gst_base_src_set_format (GST_BASE_SRC (self), GST_FORMAT_TIME);
+ gst_base_src_set_blocksize (GST_BASE_SRC (self), -1);
+
+ self->samples_per_buffer = 1024;
+ self->generate_samples_per_buffer = self->samples_per_buffer;
+}
+
+void
+gst_lv2_source_register_element (GstPlugin * plugin, GstStructure * lv2_meta)
+{
+ GTypeInfo info = {
+ sizeof (GstLV2SourceClass),
+ (GBaseInitFunc) gst_lv2_source_base_init,
+ (GBaseFinalizeFunc) gst_lv2_source_base_finalize,
+ (GClassInitFunc) gst_lv2_source_class_init,
+ NULL,
+ NULL,
+ sizeof (GstLV2Source),
+ 0,
+ (GInstanceInitFunc) gst_lv2_source_init,
+ };
+ const gchar *type_name =
+ gst_structure_get_string (lv2_meta, "element-type-name");
+ GType element_type =
+ g_type_register_static (GST_TYPE_BASE_SRC, type_name, &info, 0);
+ gboolean can_do_presets;
+
+ /* register interfaces */
+ gst_structure_get_boolean (lv2_meta, "can-do-presets", &can_do_presets);
+ if (can_do_presets) {
+ const GInterfaceInfo preset_interface_info = {
+ (GInterfaceInitFunc) gst_lv2_source_preset_interface_init,
+ NULL,
+ NULL
+ };
+
+ g_type_add_interface_static (element_type, GST_TYPE_PRESET,
+ &preset_interface_info);
+ }
+
+ gst_element_register (plugin, type_name, GST_RANK_NONE, element_type);
+
+ if (!parent_class)
+ parent_class = g_type_class_ref (GST_TYPE_BASE_SRC);
+}
diff --git a/ext/lv2/gstlv2utils.c b/ext/lv2/gstlv2utils.c
new file mode 100644
index 0000000..fc30595
--- /dev/null
+++ b/ext/lv2/gstlv2utils.c
@@ -0,0 +1,963 @@
+/* GStreamer
+ * Copyright (C) 2016 Thibault Saunier <thibault.saunier@collabora.com>
+ * 2016 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * 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 "stdlib.h"
+
+#include "gstlv2.h"
+#include "gstlv2utils.h"
+
+#include "lv2/lv2plug.in/ns/ext/atom/atom.h"
+#include "lv2/lv2plug.in/ns/ext/atom/forge.h"
+#include <lv2/lv2plug.in/ns/ext/log/log.h>
+#include <lv2/lv2plug.in/ns/ext/state/state.h>
+#include <lv2/lv2plug.in/ns/ext/urid/urid.h>
+
+GST_DEBUG_CATEGORY_EXTERN (lv2_debug);
+#define GST_CAT_DEFAULT lv2_debug
+
+/* host features */
+
+/* - log extension */
+
+static int
+lv2_log_printf (LV2_Log_Handle handle, LV2_URID type, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start (ap, fmt);
+ gst_debug_log_valist (lv2_debug, GST_LEVEL_INFO, "", "", 0, NULL, fmt, ap);
+ va_end (ap);
+ return 1;
+}
+
+static int
+lv2_log_vprintf (LV2_Log_Handle handle, LV2_URID type,
+ const char *fmt, va_list ap)
+{
+ gst_debug_log_valist (lv2_debug, GST_LEVEL_INFO, "", "", 0, NULL, fmt, ap);
+ return 1;
+}
+
+static LV2_Log_Log lv2_log = {
+ /* handle = */ NULL, lv2_log_printf, lv2_log_vprintf
+};
+
+
+static const LV2_Feature lv2_log_feature = { LV2_LOG__log, &lv2_log };
+
+/* - urid map/unmap extension */
+
+static LV2_URID
+lv2_urid_map (LV2_URID_Map_Handle handle, const char *uri)
+{
+ return (LV2_URID) g_quark_from_string (uri);
+}
+
+static const char *
+lv2_urid_unmap (LV2_URID_Unmap_Handle handle, LV2_URID urid)
+{
+ return g_quark_to_string ((GQuark) urid);
+}
+
+static LV2_URID_Map lv2_map = {
+ /* handle = */ NULL, lv2_urid_map
+};
+
+static LV2_URID_Unmap lv2_unmap = {
+ /* handle = */ NULL, lv2_urid_unmap
+};
+
+static const LV2_Feature lv2_map_feature = { LV2_URID__map, &lv2_map };
+static const LV2_Feature lv2_unmap_feature = { LV2_URID__unmap, &lv2_unmap };
+
+/* feature list */
+
+static const LV2_Feature *lv2_features[] = {
+ &lv2_log_feature,
+ &lv2_map_feature,
+ &lv2_unmap_feature,
+ NULL
+};
+
+gboolean
+gst_lv2_check_required_features (const LilvPlugin * lv2plugin)
+{
+ LilvNodes *required_features = lilv_plugin_get_required_features (lv2plugin);
+ if (required_features) {
+ LilvIter *i;
+ gint j;
+ gboolean missing = FALSE;
+
+ for (i = lilv_nodes_begin (required_features);
+ !lilv_nodes_is_end (required_features, i);
+ i = lilv_nodes_next (required_features, i)) {
+ const LilvNode *required_feature = lilv_nodes_get (required_features, i);
+ const char *required_feature_uri = lilv_node_as_uri (required_feature);
+ missing = TRUE;
+
+ for (j = 0; lv2_features[j]; j++) {
+ if (!strcmp (lv2_features[j]->URI, required_feature_uri)) {
+ missing = FALSE;
+ break;
+ }
+ }
+ if (missing) {
+ GST_FIXME ("lv2 plugin %s needs host feature: %s",
+ lilv_node_as_uri (lilv_plugin_get_uri (lv2plugin)),
+ required_feature_uri);
+ break;
+ }
+ }
+ lilv_nodes_free (required_features);
+ return (!missing);
+ }
+ return TRUE;
+}
+
+static LV2_Atom_Forge forge;
+
+void
+gst_lv2_host_init (void)
+{
+ lv2_atom_forge_init (&forge, &lv2_map);
+}
+
+/* preset interface */
+
+static char *
+make_bundle_name (GstObject * obj, const gchar * name)
+{
+ GstElementFactory *factory;
+ gchar *basename, *s, *bundle;
+
+ factory = gst_element_get_factory ((GstElement *) obj);
+ basename = g_strdup (gst_element_factory_get_metadata (factory,
+ GST_ELEMENT_METADATA_LONGNAME));
+ s = basename;
+ while ((s = strchr (s, ' '))) {
+ *s = '_';
+ }
+ bundle = g_strjoin (NULL, basename, "_", name, ".preset.lv2", NULL);
+
+ g_free (basename);
+
+ return bundle;
+}
+
+gchar **
+gst_lv2_get_preset_names (GstLV2 * lv2, GstObject * obj)
+{
+ /* lazily scan for presets when first called */
+ if (!lv2->presets) {
+ LilvNodes *presets;
+
+ if ((presets = lilv_plugin_get_related (lv2->klass->plugin, preset_class))) {
+ LilvIter *j;
+
+ lv2->presets = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
+ (GDestroyNotify) lilv_node_free);
+
+ for (j = lilv_nodes_begin (presets);
+ !lilv_nodes_is_end (presets, j); j = lilv_nodes_next (presets, j)) {
+ const LilvNode *preset = lilv_nodes_get (presets, j);
+ LilvNodes *titles;
+
+ lilv_world_load_resource (world, preset);
+ titles = lilv_world_find_nodes (world, preset, label_pred, NULL);
+ if (titles) {
+ const LilvNode *title = lilv_nodes_get_first (titles);
+ g_hash_table_insert (lv2->presets,
+ g_strdup (lilv_node_as_string (title)),
+ lilv_node_duplicate (preset));
+ lilv_nodes_free (titles);
+ } else {
+ GST_WARNING_OBJECT (obj, "plugin has preset '%s' without rdfs:label",
+ lilv_node_as_string (preset));
+ }
+ }
+ lilv_nodes_free (presets);
+ }
+ }
+ if (lv2->presets) {
+ GList *node, *keys = g_hash_table_get_keys (lv2->presets);
+ gchar **names = g_new0 (gchar *, g_hash_table_size (lv2->presets) + 1);
+ gint i = 0;
+
+ for (node = keys; node; node = g_list_next (node)) {
+ names[i++] = g_strdup (node->data);
+ }
+ g_list_free (keys);
+ return names;
+ }
+ return NULL;
+}
+
+static void
+set_port_value (const char *port_symbol, void *data, const void *value,
+ uint32_t size, uint32_t type)
+{
+ gpointer *user_data = (gpointer *) data;
+ GstLV2Class *klass = user_data[0];
+ GstObject *obj = user_data[1];
+ gchar *prop_name = g_hash_table_lookup (klass->sym_to_name, port_symbol);
+ gfloat fvalue;
+
+ if (!prop_name) {
+ GST_WARNING_OBJECT (obj, "Preset port '%s' is missing", port_symbol);
+ return;
+ }
+
+ if (type == forge.Float) {
+ fvalue = *(const gfloat *) value;
+ } else if (type == forge.Double) {
+ fvalue = *(const gdouble *) value;
+ } else if (type == forge.Int) {
+ fvalue = *(const gint32 *) value;
+ } else if (type == forge.Long) {
+ fvalue = *(const gint64 *) value;
+ } else {
+ GST_WARNING_OBJECT (obj, "Preset '%s' value has bad type '%s'",
+ port_symbol, lv2_unmap.unmap (lv2_unmap.handle, type));
+ return;
+ }
+ g_object_set (obj, prop_name, fvalue, NULL);
+}
+
+gboolean
+gst_lv2_load_preset (GstLV2 * lv2, GstObject * obj, const gchar * name)
+{
+ LilvNode *preset = g_hash_table_lookup (lv2->presets, name);
+ LilvState *state = lilv_state_new_from_world (world, &lv2_map, preset);
+ gpointer user_data[] = { lv2->klass, obj };
+
+ GST_INFO_OBJECT (obj, "loading preset <%s>", lilv_node_as_string (preset));
+
+ lilv_state_restore (state, lv2->instance, set_port_value,
+ (gpointer) user_data, 0, NULL);
+
+ lilv_state_free (state);
+ return FALSE;
+}
+
+static const void *
+get_port_value (const char *port_symbol, void *data, uint32_t * size,
+ uint32_t * type)
+{
+ gpointer *user_data = (gpointer *) data;
+ GstLV2Class *klass = user_data[0];
+ GstObject *obj = user_data[1];
+ gchar *prop_name = g_hash_table_lookup (klass->sym_to_name, port_symbol);
+ static gfloat fvalue;
+
+ if (!prop_name) {
+ GST_WARNING_OBJECT (obj, "Preset port '%s' is missing", port_symbol);
+ *size = *type = 0;
+ return NULL;
+ }
+
+ *size = sizeof (float);
+ *type = forge.Float;
+ g_object_get (obj, prop_name, &fvalue, NULL);
+ /* FIXME: can we return &lv2->ports.{in,out}[x]; */
+ return &fvalue;
+}
+
+gboolean
+gst_lv2_save_preset (GstLV2 * lv2, GstObject * obj, const gchar * name)
+{
+ gchar *filename, *bundle, *dir, *tmp_dir;
+ gpointer user_data[] = { lv2->klass, obj };
+ LilvState *state;
+ LilvNode *bundle_dir;
+ const LilvNode *state_uri;
+ LilvInstance *instance = lv2->instance;
+ gboolean res;
+#ifndef HAVE_LILV_0_22
+ gchar *filepath;
+#endif
+
+ filename = g_strjoin (NULL, name, ".ttl", NULL);
+ bundle = make_bundle_name (obj, name);
+ /* dir needs to end on a dir separator for the lilv_new_file_uri() to work */
+ dir =
+ g_build_filename (g_get_home_dir (), ".lv2", bundle, G_DIR_SEPARATOR_S,
+ NULL);
+ tmp_dir = g_dir_make_tmp ("gstlv2-XXXXXX", NULL);
+ g_mkdir_with_parents (dir, 0750);
+
+ if (!instance) {
+ /* instance is NULL until we play!! */
+ instance = lilv_plugin_instantiate (lv2->klass->plugin, GST_AUDIO_DEF_RATE,
+ lv2_features);
+ }
+
+ state = lilv_state_new_from_instance (lv2->klass->plugin, instance, &lv2_map,
+ tmp_dir, dir, dir, dir, get_port_value, user_data,
+ LV2_STATE_IS_POD | LV2_STATE_IS_PORTABLE, NULL);
+
+ lilv_state_set_label (state, name);
+
+ res = lilv_state_save (world, &lv2_map, &lv2_unmap, state, /*uri */ NULL, dir,
+ filename) != 0;
+
+ /* reload bundle into the world */
+ bundle_dir = lilv_new_file_uri (world, NULL, dir);
+ lilv_world_unload_bundle (world, bundle_dir);
+ lilv_world_load_bundle (world, bundle_dir);
+ lilv_node_free (bundle_dir);
+
+#ifdef HAVE_LILV_0_22
+ state_uri = lilv_state_get_uri (state);
+#else
+ filepath = g_build_filename (dir, filename, NULL);
+ state_uri = lilv_new_uri (world, filepath);
+ g_free (filepath);
+#endif
+ lilv_world_load_resource (world, state_uri);
+ g_hash_table_insert (lv2->presets, g_strdup (name),
+ lilv_node_duplicate (state_uri));
+#ifndef HAVE_LILV_0_22
+ lilv_node_free ((LilvNode *) state_uri);
+#endif
+
+ lilv_state_free (state);
+ if (!lv2->instance) {
+ lilv_instance_free (instance);
+ }
+
+ g_free (tmp_dir);
+ g_free (dir);
+ g_free (bundle);
+ g_free (filename);
+
+ return res;
+}
+
+#if 0
+gboolean
+gst_lv2_rename_preset (GstLV2 * lv2, GstObject * obj,
+ const gchar * old_name, const gchar * new_name)
+{
+ /* need to relabel the preset */
+ return FALSE;
+}
+#endif
+
+gboolean
+gst_lv2_delete_preset (GstLV2 * lv2, GstObject * obj, const gchar * name)
+{
+#ifdef HAVE_LILV_0_22
+ LilvNode *preset = g_hash_table_lookup (lv2->presets, name);
+ LilvState *state = lilv_state_new_from_world (world, &lv2_map, preset);
+
+ lilv_world_unload_resource (world, lilv_state_get_uri (state));
+ lilv_state_delete (world, state);
+ lilv_state_free (state);
+#endif
+ g_hash_table_remove (lv2->presets, name);
+
+ return FALSE;
+}
+
+/* api helpers */
+
+void
+gst_lv2_init (GstLV2 * lv2, GstLV2Class * lv2_class)
+{
+ lv2->klass = lv2_class;
+
+ lv2->instance = NULL;
+ lv2->activated = FALSE;
+
+ lv2->ports.control.in = g_new0 (gfloat, lv2_class->control_in_ports->len);
+ lv2->ports.control.out = g_new0 (gfloat, lv2_class->control_out_ports->len);
+}
+
+void
+gst_lv2_finalize (GstLV2 * lv2)
+{
+ if (lv2->presets) {
+ g_hash_table_destroy (lv2->presets);
+ }
+ g_free (lv2->ports.control.in);
+ g_free (lv2->ports.control.out);
+}
+
+gboolean
+gst_lv2_setup (GstLV2 * lv2, unsigned long rate)
+{
+ GstLV2Class *lv2_class = lv2->klass;
+ GstLV2Port *port;
+ GArray *ports;
+ gint i;
+
+ if (lv2->instance)
+ lilv_instance_free (lv2->instance);
+
+ if (!(lv2->instance =
+ lilv_plugin_instantiate (lv2_class->plugin, rate, lv2_features)))
+ return FALSE;
+
+ /* connect the control ports */
+ ports = lv2_class->control_in_ports;
+ for (i = 0; i < ports->len; i++) {
+ port = &g_array_index (ports, GstLV2Port, i);
+ if (port->type != GST_LV2_PORT_CONTROL)
+ continue;
+ lilv_instance_connect_port (lv2->instance, port->index,
+ &(lv2->ports.control.in[i]));
+ }
+ ports = lv2_class->control_out_ports;
+ for (i = 0; i < ports->len; i++) {
+ port = &g_array_index (ports, GstLV2Port, i);
+ if (port->type != GST_LV2_PORT_CONTROL)
+ continue;
+ lilv_instance_connect_port (lv2->instance, port->index,
+ &(lv2->ports.control.out[i]));
+ }
+
+ lilv_instance_activate (lv2->instance);
+ lv2->activated = TRUE;
+
+ return TRUE;
+}
+
+gboolean
+gst_lv2_cleanup (GstLV2 * lv2, GstObject * obj)
+{
+ if (lv2->activated == FALSE) {
+ GST_ERROR_OBJECT (obj, "Deactivating but LV2 plugin not activated");
+ return TRUE;
+ }
+
+ if (lv2->instance == NULL) {
+ GST_ERROR_OBJECT (obj, "Deactivating but no LV2 plugin set");
+ return TRUE;
+ }
+
+ GST_DEBUG_OBJECT (obj, "deactivating");
+
+ lilv_instance_deactivate (lv2->instance);
+
+ lv2->activated = FALSE;
+
+ lilv_instance_free (lv2->instance);
+ lv2->instance = NULL;
+
+ return TRUE;
+}
+
+void
+gst_lv2_object_set_property (GstLV2 * lv2, GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec)
+{
+ GType base, type = pspec->value_type;
+ /* remember, properties have an offset */
+ prop_id -= lv2->klass->properties;
+
+ /* only input ports */
+ g_return_if_fail (prop_id < lv2->klass->control_in_ports->len);
+
+ while ((base = g_type_parent (type)))
+ type = base;
+
+ /* now see what type it is */
+ switch (type) {
+ case G_TYPE_BOOLEAN:
+ lv2->ports.control.in[prop_id] =
+ g_value_get_boolean (value) ? 0.0f : 1.0f;
+ break;
+ case G_TYPE_INT:
+ lv2->ports.control.in[prop_id] = g_value_get_int (value);
+ break;
+ case G_TYPE_FLOAT:
+ lv2->ports.control.in[prop_id] = g_value_get_float (value);
+ break;
+ case G_TYPE_ENUM:
+ lv2->ports.control.in[prop_id] = g_value_get_enum (value);
+ break;
+ default:
+ GST_WARNING_OBJECT (object, "unhandled type: %s",
+ g_type_name (pspec->value_type));
+ g_assert_not_reached ();
+ }
+}
+
+void
+gst_lv2_object_get_property (GstLV2 * lv2, GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec)
+{
+ GType base, type = pspec->value_type;
+ gfloat *controls;
+
+ /* remember, properties have an offset */
+ prop_id -= lv2->klass->properties;
+
+ if (prop_id < lv2->klass->control_in_ports->len) {
+ controls = lv2->ports.control.in;
+ } else if (prop_id < lv2->klass->control_in_ports->len +
+ lv2->klass->control_out_ports->len) {
+ controls = lv2->ports.control.out;
+ prop_id -= lv2->klass->control_in_ports->len;
+ } else {
+ g_return_if_reached ();
+ }
+
+ while ((base = g_type_parent (type)))
+ type = base;
+
+ /* now see what type it is */
+ switch (type) {
+ case G_TYPE_BOOLEAN:
+ g_value_set_boolean (value, controls[prop_id] > 0.0f);
+ break;
+ case G_TYPE_INT:
+ g_value_set_int (value, CLAMP (controls[prop_id], G_MININT, G_MAXINT));
+ break;
+ case G_TYPE_FLOAT:
+ g_value_set_float (value, controls[prop_id]);
+ break;
+ case G_TYPE_ENUM:
+ g_value_set_enum (value, (gint) controls[prop_id]);
+ break;
+ default:
+ GST_WARNING_OBJECT (object, "unhandled type: %s",
+ g_type_name (pspec->value_type));
+ g_return_if_reached ();
+ }
+}
+
+
+static gchar *
+gst_lv2_class_get_param_name (GstLV2Class * klass, GObjectClass * object_class,
+ const gchar * port_symbol)
+{
+ gchar *ret = g_strdup (port_symbol);
+
+ /* this is the same thing that param_spec_* will do */
+ g_strcanon (ret, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-", '-');
+ /* satisfy glib2 (argname[0] must be [A-Za-z]) */
+ if (!((ret[0] >= 'a' && ret[0] <= 'z') || (ret[0] >= 'A' && ret[0] <= 'Z'))) {
+ gchar *tempstr = ret;
+
+ ret = g_strconcat ("param-", ret, NULL);
+ g_free (tempstr);
+ }
+
+ /* check for duplicate property names */
+ if (g_object_class_find_property (object_class, ret)) {
+ gint n = 1;
+ gchar *nret = g_strdup_printf ("%s-%d", ret, n++);
+
+ while (g_object_class_find_property (object_class, nret)) {
+ g_free (nret);
+ nret = g_strdup_printf ("%s-%d", ret, n++);
+ }
+ g_free (ret);
+ ret = nret;
+ }
+
+ GST_DEBUG ("built property name '%s' from port name '%s'", ret, port_symbol);
+ return ret;
+}
+
+static gchar *
+gst_lv2_class_get_param_nick (GstLV2Class * klass, const LilvPort * port)
+{
+ const LilvPlugin *lv2plugin = klass->plugin;
+
+ return g_strdup (lilv_node_as_string (lilv_port_get_name (lv2plugin, port)));
+}
+
+static int
+enum_val_cmp (GEnumValue * p1, GEnumValue * p2)
+{
+ return p1->value - p2->value;
+}
+
+static GParamSpec *
+gst_lv2_class_get_param_spec (GstLV2Class * klass, GObjectClass * object_class,
+ gint portnum)
+{
+ const LilvPlugin *lv2plugin = klass->plugin;
+ const LilvPort *port = lilv_plugin_get_port_by_index (lv2plugin, portnum);
+ LilvNode *lv2def, *lv2min, *lv2max;
+ LilvScalePoints *points;
+ GParamSpec *ret;
+ gchar *name, *nick;
+ gint perms;
+ gfloat lower = 0.0f, upper = 1.0f, def = 0.0f;
+ GType enum_type = G_TYPE_INVALID;
+ const gchar *port_symbol =
+ lilv_node_as_string (lilv_port_get_symbol (lv2plugin, port));
+
+ nick = gst_lv2_class_get_param_nick (klass, port);
+ name = gst_lv2_class_get_param_name (klass, object_class, port_symbol);
+
+ GST_DEBUG ("%s trying port %s : %s",
+ lilv_node_as_string (lilv_plugin_get_uri (lv2plugin)), name, nick);
+
+ perms = G_PARAM_READABLE;
+ if (lilv_port_is_a (lv2plugin, port, input_class))
+ perms |= G_PARAM_WRITABLE | G_PARAM_CONSTRUCT;
+ if (lilv_port_is_a (lv2plugin, port, control_class) ||
+ lilv_port_is_a (lv2plugin, port, cv_class))
+ perms |= GST_PARAM_CONTROLLABLE;
+
+ if (lilv_port_has_property (lv2plugin, port, toggled_prop)) {
+ ret = g_param_spec_boolean (name, nick, nick, FALSE, perms);
+ goto done;
+ }
+
+ lilv_port_get_range (lv2plugin, port, &lv2def, &lv2min, &lv2max);
+
+ if (lv2def)
+ def = lilv_node_as_float (lv2def);
+ if (lv2min)
+ lower = lilv_node_as_float (lv2min);
+ if (lv2max)
+ upper = lilv_node_as_float (lv2max);
+
+ lilv_node_free (lv2def);
+ lilv_node_free (lv2min);
+ lilv_node_free (lv2max);
+
+ if (def < lower) {
+ if (lv2def && lv2min) {
+ GST_WARNING ("%s:%s has lower bound %f > default %f",
+ lilv_node_as_string (lilv_plugin_get_uri (lv2plugin)), name, lower,
+ def);
+ }
+ lower = def;
+ }
+
+ if (def > upper) {
+ if (lv2def && lv2max) {
+ GST_WARNING ("%s:%s has upper bound %f < default %f",
+ lilv_node_as_string (lilv_plugin_get_uri (lv2plugin)), name, upper,
+ def);
+ }
+ upper = def;
+ }
+
+ if ((points = lilv_port_get_scale_points (lv2plugin, port))) {
+ GEnumValue *enums;
+ LilvIter *i;
+ gint j = 0, n, def_ix = -1;
+
+ n = lilv_scale_points_size (points);
+ enums = g_new (GEnumValue, n + 1);
+
+ for (i = lilv_scale_points_begin (points);
+ !lilv_scale_points_is_end (points, i);
+ i = lilv_scale_points_next (points, i)) {
+ const LilvScalePoint *point = lilv_scale_points_get (points, i);
+ gfloat v = lilv_node_as_float (lilv_scale_point_get_value (point));
+ const gchar *l = lilv_node_as_string (lilv_scale_point_get_label (point));
+
+ /* check if value can be safely converted to int */
+ if (v != (gint) v) {
+ GST_INFO ("%s:%s non integer scale point %lf, %s",
+ lilv_node_as_string (lilv_plugin_get_uri (lv2plugin)), name, v, l);
+ break;
+ }
+ if (v == def) {
+ def_ix = j;
+ }
+ enums[j].value = (gint) v;
+ enums[j].value_nick = enums[j].value_name = l;
+ GST_LOG ("%s:%s enum: %lf, %s",
+ lilv_node_as_string (lilv_plugin_get_uri (lv2plugin)), name, v, l);
+ j++;
+ }
+ if (j == n) {
+ gchar *type_name;
+
+ /* scalepoints are not sorted */
+ qsort (enums, n, sizeof (GEnumValue),
+ (int (*)(const void *, const void *)) enum_val_cmp);
+
+ if (def_ix == -1) {
+ if (lv2def) {
+ GST_WARNING ("%s:%s has default %f outside of scalepoints",
+ lilv_node_as_string (lilv_plugin_get_uri (lv2plugin)), name, def);
+ }
+ def = enums[0].value;
+ }
+ /* terminator */
+ enums[j].value = 0;
+ enums[j].value_name = enums[j].value_nick = NULL;
+
+ type_name = g_strdup_printf ("%s%s",
+ g_type_name (G_TYPE_FROM_CLASS (object_class)), name);
+ enum_type = g_enum_register_static (type_name, enums);
+ g_free (type_name);
+ } else {
+ g_free (enums);
+ }
+ lilv_scale_points_free (points);
+ }
+
+ if (enum_type != G_TYPE_INVALID) {
+ ret = g_param_spec_enum (name, nick, nick, enum_type, def, perms);
+ } else if (lilv_port_has_property (lv2plugin, port, integer_prop))
+ ret = g_param_spec_int (name, nick, nick, lower, upper, def, perms);
+ else
+ ret = g_param_spec_float (name, nick, nick, lower, upper, def, perms);
+
+done:
+ // build a map of (port_symbol to ret->name) for extensions
+ g_hash_table_insert (klass->sym_to_name, (gchar *) port_symbol,
+ (gchar *) ret->name);
+
+ g_free (name);
+ g_free (nick);
+
+ return ret;
+}
+
+void
+gst_lv2_class_install_properties (GstLV2Class * lv2_class,
+ GObjectClass * object_class, guint offset)
+{
+ GParamSpec *p;
+ guint i;
+
+ lv2_class->properties = offset;
+
+ for (i = 0; i < lv2_class->control_in_ports->len; i++, offset++) {
+ p = gst_lv2_class_get_param_spec (lv2_class, object_class,
+ g_array_index (lv2_class->control_in_ports, GstLV2Port, i).index);
+
+ g_object_class_install_property (object_class, offset, p);
+ }
+
+ for (i = 0; i < lv2_class->control_out_ports->len; i++, offset++) {
+ p = gst_lv2_class_get_param_spec (lv2_class, object_class,
+ g_array_index (lv2_class->control_out_ports, GstLV2Port, i).index);
+
+ g_object_class_install_property (object_class, offset, p);
+ }
+}
+
+void
+gst_lv2_element_class_set_metadata (GstLV2Class * lv2_class,
+ GstElementClass * elem_class, const gchar * lv2_class_tags)
+{
+ const LilvPlugin *lv2plugin = lv2_class->plugin;
+ LilvNode *val;
+ const LilvPluginClass *lv2plugin_class;
+ const LilvNode *cval;
+ gchar *longname, *author, *class_tags = NULL;
+
+ val = lilv_plugin_get_name (lv2plugin);
+ if (val) {
+ longname = g_strdup (lilv_node_as_string (val));
+ lilv_node_free (val);
+ } else {
+ longname = g_strdup ("no description available");
+ }
+ val = lilv_plugin_get_author_name (lv2plugin);
+ if (val) {
+ // TODO: check lilv_plugin_get_author_email(lv2plugin);
+ author = g_strdup (lilv_node_as_string (val));
+ lilv_node_free (val);
+ } else {
+ author = g_strdup ("no author available");
+ }
+
+ // TODO: better description from:
+ // lilv_plugin_get_author_homepage() and lilv_plugin_get_project()
+
+ lv2plugin_class = lilv_plugin_get_class (lv2plugin);
+ cval = lilv_plugin_class_get_label (lv2plugin_class);
+ if (cval) {
+ class_tags = g_strconcat (lv2_class_tags, "/", lilv_node_as_string (cval),
+ NULL);
+ }
+
+ gst_element_class_set_metadata (elem_class, longname,
+ (class_tags ? class_tags : lv2_class_tags), longname, author);
+ g_free (longname);
+ g_free (author);
+ g_free (class_tags);
+}
+
+
+void
+gst_lv2_class_init (GstLV2Class * lv2_class, GType type)
+{
+ const GValue *value =
+ gst_structure_get_value (lv2_meta_all, g_type_name (type));
+ GstStructure *lv2_meta = g_value_get_boxed (value);
+ const LilvPlugin *lv2plugin;
+ guint j, in_pad_index = 0, out_pad_index = 0;
+ const LilvPlugins *plugins = lilv_world_get_all_plugins (world);
+ LilvNode *plugin_uri;
+ const gchar *element_uri;
+
+ GST_DEBUG ("LV2 initializing class");
+
+ element_uri = gst_structure_get_string (lv2_meta, "element-uri");
+ plugin_uri = lilv_new_uri (world, element_uri);
+ g_assert (plugin_uri);
+ lv2plugin = lilv_plugins_get_by_uri (plugins, plugin_uri);
+ g_assert (lv2plugin);
+ lv2_class->plugin = lv2plugin;
+ lilv_node_free (plugin_uri);
+
+ lv2_class->sym_to_name = g_hash_table_new (g_str_hash, g_str_equal);
+
+ lv2_class->in_group.ports = g_array_new (FALSE, TRUE, sizeof (GstLV2Port));
+ lv2_class->out_group.ports = g_array_new (FALSE, TRUE, sizeof (GstLV2Port));
+ lv2_class->control_in_ports = g_array_new (FALSE, TRUE, sizeof (GstLV2Port));
+ lv2_class->control_out_ports = g_array_new (FALSE, TRUE, sizeof (GstLV2Port));
+
+ /* find ports and groups */
+ for (j = 0; j < lilv_plugin_get_num_ports (lv2plugin); j++) {
+ const LilvPort *port = lilv_plugin_get_port_by_index (lv2plugin, j);
+ const gboolean is_input = lilv_port_is_a (lv2plugin, port, input_class);
+ const gboolean is_optional = lilv_port_has_property (lv2plugin, port,
+ optional_pred);
+ GstLV2Port desc = { j, GST_LV2_PORT_AUDIO, -1, };
+ LilvNodes *lv2group = lilv_port_get (lv2plugin, port, group_pred);
+ /* FIXME Handle channels positionning
+ * GstAudioChannelPosition position = GST_AUDIO_CHANNEL_POSITION_INVALID; */
+
+ if (lv2group) {
+ /* port is part of a group */
+ const gchar *group_uri = lilv_node_as_uri (lv2group);
+ GstLV2Group *group = is_input
+ ? &lv2_class->in_group : &lv2_class->out_group;
+
+ if (group->uri == NULL) {
+ group->uri = g_strdup (group_uri);
+ group->pad = is_input ? in_pad_index++ : out_pad_index++;
+ group->ports = g_array_new (FALSE, TRUE, sizeof (GstLV2Port));
+ }
+
+ /* FIXME Handle channels positionning
+ position = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
+ sub_values = lilv_port_get_value (lv2plugin, port, designation_pred);
+ if (lilv_nodes_size (sub_values) > 0) {
+ LilvNode *role = lilv_nodes_get_at (sub_values, 0);
+ position = gst_lv2_filter_role_to_position (role);
+ }
+ lilv_nodes_free (sub_values);
+
+ if (position != GST_AUDIO_CHANNEL_POSITION_INVALID) {
+ desc.position = position;
+ } */
+
+ g_array_append_val (group->ports, desc);
+ } else {
+ /* port is not part of a group, or it is part of a group but that group
+ * is illegal so we just ignore it */
+ if (lilv_port_is_a (lv2plugin, port, audio_class)) {
+ if (is_input) {
+ desc.pad = in_pad_index++;
+ g_array_append_val (lv2_class->in_group.ports, desc);
+ } else {
+ desc.pad = out_pad_index++;
+ g_array_append_val (lv2_class->out_group.ports, desc);
+ }
+ } else if (lilv_port_is_a (lv2plugin, port, control_class)) {
+ desc.type = GST_LV2_PORT_CONTROL;
+ if (is_input) {
+ lv2_class->num_control_in++;
+ g_array_append_val (lv2_class->control_in_ports, desc);
+ } else {
+ lv2_class->num_control_out++;
+ g_array_append_val (lv2_class->control_out_ports, desc);
+ }
+ } else if (lilv_port_is_a (lv2plugin, port, cv_class)) {
+ desc.type = GST_LV2_PORT_CV;
+ if (is_input) {
+ lv2_class->num_cv_in++;
+ g_array_append_val (lv2_class->control_in_ports, desc);
+ } else {
+ lv2_class->num_cv_out++;
+ g_array_append_val (lv2_class->control_out_ports, desc);
+ }
+ } else if (lilv_port_is_a (lv2plugin, port, event_class)) {
+ LilvNodes *supported = lilv_port_get_value (lv2plugin, port,
+ supports_event_pred);
+
+ GST_INFO ("%s: unhandled event port %d: %s, optional=%d, input=%d",
+ element_uri, j,
+ lilv_node_as_string (lilv_port_get_symbol (lv2plugin, port)),
+ is_optional, is_input);
+
+ if (lilv_nodes_size (supported) > 0) {
+ LilvIter *i;
+
+ for (i = lilv_nodes_begin (supported);
+ !lilv_nodes_is_end (supported, i);
+ i = lilv_nodes_next (supported, i)) {
+ const LilvNode *value = lilv_nodes_get (supported, i);
+ GST_INFO (" type = %s", lilv_node_as_uri (value));
+ }
+ }
+ lilv_nodes_free (supported);
+ // FIXME: handle them
+ } else {
+ /* unhandled port type */
+ const LilvNodes *classes = lilv_port_get_classes (lv2plugin, port);
+ GST_INFO ("%s: unhandled port %d: %s, optional=%d, input=%d",
+ element_uri, j,
+ lilv_node_as_string (lilv_port_get_symbol (lv2plugin, port)),
+ is_optional, is_input);
+ if (classes && lilv_nodes_size (classes) > 0) {
+ LilvIter *i;
+
+ // FIXME: we getting the same classe multiple times
+ for (i = lilv_nodes_begin (classes);
+ !lilv_nodes_is_end (classes, i);
+ i = lilv_nodes_next (classes, i)) {
+ const LilvNode *value = lilv_nodes_get (classes, i);
+ GST_INFO (" class = %s", lilv_node_as_uri (value));
+ }
+ }
+ }
+ }
+ }
+}
+
+void
+gst_lv2_class_finalize (GstLV2Class * lv2_class)
+{
+ GST_DEBUG ("LV2 finalizing class");
+
+ g_hash_table_destroy (lv2_class->sym_to_name);
+
+ g_array_free (lv2_class->in_group.ports, TRUE);
+ lv2_class->in_group.ports = NULL;
+ g_array_free (lv2_class->out_group.ports, TRUE);
+ lv2_class->out_group.ports = NULL;
+ g_array_free (lv2_class->control_in_ports, TRUE);
+ lv2_class->control_in_ports = NULL;
+ g_array_free (lv2_class->control_out_ports, TRUE);
+ lv2_class->control_out_ports = NULL;
+}
diff --git a/ext/lv2/gstlv2utils.h b/ext/lv2/gstlv2utils.h
new file mode 100644
index 0000000..b179e36
--- /dev/null
+++ b/ext/lv2/gstlv2utils.h
@@ -0,0 +1,134 @@
+/* GStreamer
+ * Copyright (C) 2016 Thibault Saunier <thibault.saunier@collabora.com>
+ * 2016 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gstlv2utils.h: Header for LV2 plugin utils
+ *
+ * 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_LV2_UTILS_H__
+#define __GST_LV2_UTILS_H__
+
+#include <gst/gst.h>
+#include <gst/audio/audio.h>
+#include <gst/audio/audio-channels.h>
+
+#include <lilv/lilv.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstLV2Group GstLV2Group;
+typedef struct _GstLV2Port GstLV2Port;
+
+typedef struct _GstLV2 GstLV2;
+typedef struct _GstLV2Class GstLV2Class;
+
+struct _GstLV2Group
+{
+ gchar *uri; /**< RDF resource (URI or blank node) */
+ guint pad; /**< Gst pad index */
+ gchar *symbol; /**< Gst pad name / LV2 group symbol */
+ GArray *ports; /**< Array of GstLV2Port */
+ /* FIXME: not set as of now */
+ gboolean has_roles; /**< TRUE iff all ports have a known role */
+};
+
+typedef enum {
+ GST_LV2_PORT_AUDIO = 0,
+ GST_LV2_PORT_CONTROL,
+ GST_LV2_PORT_CV
+} GstLV2PortType;
+
+struct _GstLV2Port
+{
+ gint index; /**< LV2 port index (on LV2 plugin) */
+ GstLV2PortType type; /**< Port type */
+ /**< Gst pad index (iff not part of a group), only for audio ports */
+ gint pad;
+ /* FIXME: not set as of now */
+ LilvNode *role; /**< Channel position / port role */
+ GstAudioChannelPosition position; /**< Channel position */
+};
+
+struct _GstLV2
+{
+ GstLV2Class *klass;
+
+ LilvInstance *instance;
+ GHashTable *presets;
+
+ gboolean activated;
+ unsigned long rate;
+
+ struct
+ {
+ struct
+ {
+ gfloat *in;
+ gfloat *out;
+ } control;
+ } ports;
+};
+
+struct _GstLV2Class
+{
+ guint properties;
+
+ const LilvPlugin *plugin;
+ GHashTable *sym_to_name;
+
+ gint num_control_in, num_control_out;
+ gint num_cv_in, num_cv_out;
+
+ GstLV2Group in_group; /**< Array of GstLV2Group */
+ GstLV2Group out_group; /**< Array of GstLV2Group */
+ GArray *control_in_ports; /**< Array of GstLV2Port */
+ GArray *control_out_ports; /**< Array of GstLV2Port */
+};
+
+gboolean gst_lv2_check_required_features (const LilvPlugin * lv2plugin);
+
+void gst_lv2_host_init (void);
+
+gchar **gst_lv2_get_preset_names (GstLV2 * lv2, GstObject * obj);
+gboolean gst_lv2_load_preset (GstLV2 * lv2, GstObject * obj, const gchar * name);
+gboolean gst_lv2_save_preset (GstLV2 * lv2, GstObject * obj, const gchar * name);
+gboolean gst_lv2_delete_preset (GstLV2 * lv2, GstObject * obj, const gchar * name);
+
+
+void gst_lv2_init (GstLV2 * lv2, GstLV2Class * lv2_class);
+void gst_lv2_finalize (GstLV2 * lv2);
+
+gboolean gst_lv2_setup (GstLV2 * lv2, unsigned long rate);
+gboolean gst_lv2_cleanup (GstLV2 * lv2, GstObject *obj);
+
+void gst_lv2_object_set_property (GstLV2 * lv2, GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+void gst_lv2_object_get_property (GstLV2 * lv2, GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+void gst_lv2_class_install_properties (GstLV2Class * lv2_class,
+ GObjectClass * object_class, guint offset);
+void gst_lv2_element_class_set_metadata (GstLV2Class * lv2_class,
+ GstElementClass * elem_class, const gchar * lv2_class_tags);
+
+void gst_lv2_class_init (GstLV2Class * lv2_class, GType type);
+void gst_lv2_class_finalize (GstLV2Class * lv2_class);
+
+G_END_DECLS
+
+#endif /* __GST_LV2_UTILS_H__ */
diff --git a/ext/mimic/Makefile.in b/ext/mimic/Makefile.in
index 75d2f6c..2289d2c 100644
--- a/ext/mimic/Makefile.in
+++ b/ext/mimic/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/mimic/gstmimdec.c b/ext/mimic/gstmimdec.c
index c7ad022..4ad38f9 100644
--- a/ext/mimic/gstmimdec.c
+++ b/ext/mimic/gstmimdec.c
@@ -80,10 +80,8 @@
gstelement_class = (GstElementClass *) klass;
gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_mim_dec_change_state);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_factory);
gst_element_class_set_static_metadata (gstelement_class,
"Mimic Decoder",
diff --git a/ext/mimic/gstmimenc.c b/ext/mimic/gstmimenc.c
index c94c411..3232ca5 100644
--- a/ext/mimic/gstmimenc.c
+++ b/ext/mimic/gstmimenc.c
@@ -122,10 +122,8 @@
" when no data is received",
FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_factory);
gst_element_class_set_static_metadata (gstelement_class,
"Mimic Encoder",
"Codec/Encoder/Video",
diff --git a/ext/modplug/Makefile.in b/ext/modplug/Makefile.in
index ebd6793..b34fa04 100644
--- a/ext/modplug/Makefile.in
+++ b/ext/modplug/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/modplug/gstmodplug.cc b/ext/modplug/gstmodplug.cc
index ff3641d..b5fbcb2 100644
--- a/ext/modplug/gstmodplug.cc
+++ b/ext/modplug/gstmodplug.cc
@@ -205,10 +205,8 @@
gstelement_class->change_state = gst_modplug_change_state;
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&modplug_sink_template_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&modplug_src_template_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &modplug_sink_template_factory);
+ gst_element_class_add_static_pad_template (gstelement_class, &modplug_src_template_factory);
gst_element_class_set_static_metadata (gstelement_class, "ModPlug",
"Codec/Decoder/Audio", "Module decoder based on modplug engine",
diff --git a/ext/mpeg2enc/Makefile.in b/ext/mpeg2enc/Makefile.in
index 56c7db7..7506150 100644
--- a/ext/mpeg2enc/Makefile.in
+++ b/ext/mpeg2enc/Makefile.in
@@ -306,6 +306,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -327,6 +329,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -376,6 +380,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -521,6 +527,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -647,8 +655,6 @@
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@
@@ -691,8 +697,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/mpeg2enc/gstmpeg2enc.cc b/ext/mpeg2enc/gstmpeg2enc.cc
index 5c686cc..b974826 100644
--- a/ext/mpeg2enc/gstmpeg2enc.cc
+++ b/ext/mpeg2enc/gstmpeg2enc.cc
@@ -126,10 +126,8 @@
element_class->change_state = GST_DEBUG_FUNCPTR (gst_mpeg2enc_change_state);
- 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));
+ gst_element_class_add_static_pad_template (element_class, &src_template);
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_set_static_metadata (element_class,
"mpeg2enc video encoder", "Codec/Encoder/Video",
diff --git a/ext/mplex/Makefile.in b/ext/mplex/Makefile.in
index cfcd330..2eee97f 100644
--- a/ext/mplex/Makefile.in
+++ b/ext/mplex/Makefile.in
@@ -306,6 +306,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -327,6 +329,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -376,6 +380,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -521,6 +527,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -647,8 +655,6 @@
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@
@@ -691,8 +697,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/mplex/gstmplex.cc b/ext/mplex/gstmplex.cc
index ae50bea..7f7b4ec 100644
--- a/ext/mplex/gstmplex.cc
+++ b/ext/mplex/gstmplex.cc
@@ -149,12 +149,9 @@
"Ronald Bultje <rbultje@ronald.bitfreak.net>\n"
"Mark Nauwelaerts <mnauw@users.sourceforge.net>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_templ));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&video_sink_templ));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&audio_sink_templ));
+ gst_element_class_add_static_pad_template (element_class, &src_templ);
+ gst_element_class_add_static_pad_template (element_class, &video_sink_templ);
+ gst_element_class_add_static_pad_template (element_class, &audio_sink_templ);
}
static void
@@ -679,7 +676,8 @@
g_free (padname);
/* may now be up to us to get things going */
- gst_mplex_start_task (mplex);
+ if (GST_STATE (element) > GST_STATE_READY)
+ gst_mplex_start_task (mplex);
GST_MPLEX_MUTEX_UNLOCK (mplex);
}
}
diff --git a/ext/musepack/Makefile.in b/ext/musepack/Makefile.in
index fc7c2f1..ade1322 100644
--- a/ext/musepack/Makefile.in
+++ b/ext/musepack/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/musepack/gstmusepackdec.c b/ext/musepack/gstmusepackdec.c
index bf08b1d..5b68200 100644
--- a/ext/musepack/gstmusepackdec.c
+++ b/ext/musepack/gstmusepackdec.c
@@ -19,10 +19,6 @@
* Boston, MA 02110-1301, USA.
*/
-/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex
- * with newer GLib versions (>= 2.31.0) */
-#define GLIB_DISABLE_DEPRECATION_WARNINGS
-
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
@@ -44,66 +40,67 @@
);
#ifdef MPC_FIXED_POINT
-#define BASE_CAPS \
- "audio/x-raw-int, " \
- "signed = (bool) TRUE, " \
- "width = (int) 32, " \
- "depth = (int) 32"
+# if G_BYTE_ORDER == G_LITTLE_ENDIAN
+# define GST_MPC_FORMAT "S32LE"
+# else
+# define GST_MPC_FORMAT "S32BE"
+# endif
#else
-#define BASE_CAPS \
- "audio/x-raw-float, " \
- "width = (int) 32"
+# if G_BYTE_ORDER == G_LITTLE_ENDIAN
+# define GST_MPC_FORMAT "F32LE"
+# else
+# define GST_MPC_FORMAT "F32BE"
+# endif
#endif
static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
- GST_STATIC_CAPS (BASE_CAPS ", "
- "endianness = (int) BYTE_ORDER, "
+ GST_STATIC_CAPS ("audio/x-raw, "
+ "format = (string) " GST_MPC_FORMAT ", "
+ "layout = (string) interleaved, "
"rate = (int) [ 8000, 96000 ], " "channels = (int) [ 1, 2 ]")
);
static void gst_musepackdec_dispose (GObject * obj);
-static gboolean gst_musepackdec_src_event (GstPad * pad, GstEvent * event);
-static const GstQueryType *gst_musepackdec_get_src_query_types (GstPad * pad);
-static gboolean gst_musepackdec_src_query (GstPad * pad, GstQuery * query);
-static gboolean gst_musepackdec_sink_activate (GstPad * sinkpad);
-static gboolean
-gst_musepackdec_sink_activate_pull (GstPad * sinkpad, gboolean active);
+static gboolean gst_musepackdec_src_event (GstPad * pad, GstObject * parent,
+ GstEvent * event);
+static gboolean gst_musepackdec_src_query (GstPad * pad, GstObject * parent,
+ GstQuery * query);
+static gboolean gst_musepackdec_sink_activate (GstPad * sinkpad,
+ GstObject * parent);
+static gboolean gst_musepackdec_sink_activate_mode (GstPad * sinkpad,
+ GstObject * parent, GstPadMode mode, gboolean active);
static void gst_musepackdec_loop (GstPad * sinkpad);
static GstStateChangeReturn
gst_musepackdec_change_state (GstElement * element, GstStateChange transition);
-GST_BOILERPLATE (GstMusepackDec, gst_musepackdec, GstElement, GST_TYPE_ELEMENT);
-
-static void
-gst_musepackdec_base_init (gpointer klass)
-{
- GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
-
- 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));
-
- gst_element_class_set_static_metadata (element_class, "Musepack decoder",
- "Codec/Decoder/Audio",
- "Musepack decoder", "Ronald Bultje <rbultje@ronald.bitfreak.net>");
-}
+#define parent_class gst_musepackdec_parent_class
+G_DEFINE_TYPE (GstMusepackDec, gst_musepackdec, GST_TYPE_ELEMENT);
static void
gst_musepackdec_class_init (GstMusepackDecClass * klass)
{
- GST_ELEMENT_CLASS (klass)->change_state =
- GST_DEBUG_FUNCPTR (gst_musepackdec_change_state);
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
- G_OBJECT_CLASS (klass)->dispose = GST_DEBUG_FUNCPTR (gst_musepackdec_dispose);
+ gst_element_class_add_static_pad_template (element_class, &src_template);
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
+
+ gst_element_class_set_static_metadata (element_class, "Musepack decoder",
+ "Codec/Decoder/Audio",
+ "Musepack decoder", "Ronald Bultje <rbultje@ronald.bitfreak.net>");
+
+ gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_musepackdec_dispose);
+
+ element_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_musepackdec_change_state);
}
static void
-gst_musepackdec_init (GstMusepackDec * musepackdec, GstMusepackDecClass * klass)
+gst_musepackdec_init (GstMusepackDec * musepackdec)
{
musepackdec->offset = 0;
musepackdec->rate = 0;
@@ -118,8 +115,8 @@
gst_pad_new_from_static_template (&sink_template, "sink");
gst_pad_set_activate_function (musepackdec->sinkpad,
GST_DEBUG_FUNCPTR (gst_musepackdec_sink_activate));
- gst_pad_set_activatepull_function (musepackdec->sinkpad,
- GST_DEBUG_FUNCPTR (gst_musepackdec_sink_activate_pull));
+ gst_pad_set_activatemode_function (musepackdec->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_musepackdec_sink_activate_mode));
gst_element_add_pad (GST_ELEMENT (musepackdec), musepackdec->sinkpad);
musepackdec->srcpad = gst_pad_new_from_static_template (&src_template, "src");
@@ -127,8 +124,6 @@
GST_DEBUG_FUNCPTR (gst_musepackdec_src_event));
gst_pad_set_query_function (musepackdec->srcpad,
GST_DEBUG_FUNCPTR (gst_musepackdec_src_query));
- gst_pad_set_query_type_function (musepackdec->srcpad,
- GST_DEBUG_FUNCPTR (gst_musepackdec_get_src_query_types));
gst_pad_use_fixed_caps (musepackdec->srcpad);
gst_element_add_pad (GST_ELEMENT (musepackdec), musepackdec->srcpad);
}
@@ -157,22 +152,19 @@
static void
gst_musepackdec_send_newsegment (GstMusepackDec * dec)
{
- GstSegment *s = &dec->segment;
- gint64 stop_time = GST_CLOCK_TIME_NONE;
- gint64 start_time = 0;
+ GstSegment os = dec->segment;
- start_time = gst_util_uint64_scale_int (s->start, GST_SECOND, dec->rate);
-
- if (s->stop != -1)
- stop_time = gst_util_uint64_scale_int (s->stop, GST_SECOND, dec->rate);
+ os.format = GST_FORMAT_TIME;
+ os.start = gst_util_uint64_scale_int (os.start, GST_SECOND, dec->rate);
+ if (os.stop)
+ os.stop = gst_util_uint64_scale_int (os.stop, GST_SECOND, dec->rate);
+ os.time = gst_util_uint64_scale_int (os.time, GST_SECOND, dec->rate);
GST_DEBUG_OBJECT (dec, "sending newsegment from %" GST_TIME_FORMAT
- " to %" GST_TIME_FORMAT ", rate = %.1f", GST_TIME_ARGS (start_time),
- GST_TIME_ARGS (stop_time), s->rate);
+ " to %" GST_TIME_FORMAT ", rate = %.1f", GST_TIME_ARGS (os.start),
+ GST_TIME_ARGS (os.stop), os.rate);
- gst_pad_push_event (dec->srcpad,
- gst_event_new_new_segment (FALSE, s->rate, GST_FORMAT_TIME,
- start_time, stop_time, start_time));
+ gst_pad_push_event (dec->srcpad, gst_event_new_segment (&os));
}
static gboolean
@@ -216,10 +208,10 @@
/* operate on segment copy until we know the seek worked */
segment = dec->segment;
- gst_segment_set_seek (&segment, rate, GST_FORMAT_DEFAULT,
+ gst_segment_do_seek (&segment, rate, GST_FORMAT_DEFAULT,
flags, start_type, start, stop_type, stop, NULL);
- gst_pad_push_event (dec->sinkpad, gst_event_new_flush_stop ());
+ gst_pad_push_event (dec->sinkpad, gst_event_new_flush_stop (TRUE));
GST_DEBUG_OBJECT (dec, "segment: [%" G_GINT64_FORMAT "-%" G_GINT64_FORMAT
"] = [%" GST_TIME_FORMAT "-%" GST_TIME_FORMAT "]",
@@ -230,7 +222,7 @@
GST_DEBUG_OBJECT (dec, "performing seek to sample %" G_GINT64_FORMAT,
segment.start);
- if (segment.start < 0 || segment.start >= segment.duration) {
+ if (segment.start >= segment.duration) {
GST_WARNING_OBJECT (dec, "seek out of bounds");
goto failed;
}
@@ -251,10 +243,10 @@
}
if (flush) {
- gst_pad_push_event (dec->srcpad, gst_event_new_flush_stop ());
+ gst_pad_push_event (dec->srcpad, gst_event_new_flush_stop (TRUE));
}
- gst_segment_set_last_stop (&segment, GST_FORMAT_DEFAULT, segment.start);
+ segment.position = segment.start;
dec->segment = segment;
gst_musepackdec_send_newsegment (dec);
@@ -276,12 +268,12 @@
}
static gboolean
-gst_musepackdec_src_event (GstPad * pad, GstEvent * event)
+gst_musepackdec_src_event (GstPad * pad, GstObject * parent, GstEvent * event)
{
GstMusepackDec *dec;
gboolean res;
- dec = GST_MUSEPACK_DEC (gst_pad_get_parent (pad));
+ dec = GST_MUSEPACK_DEC (parent);
GST_DEBUG_OBJECT (dec, "handling %s event", GST_EVENT_TYPE_NAME (event));
@@ -290,31 +282,17 @@
res = gst_musepackdec_handle_seek_event (dec, event);
break;
default:
- res = gst_pad_event_default (pad, event);
+ res = gst_pad_event_default (pad, parent, event);
break;
}
- gst_object_unref (dec);
return res;
}
-static const GstQueryType *
-gst_musepackdec_get_src_query_types (GstPad * pad)
-{
- static const GstQueryType query_types[] = {
- GST_QUERY_POSITION,
- GST_QUERY_DURATION,
- GST_QUERY_SEEKING,
- (GstQueryType) 0
- };
-
- return query_types;
-}
-
static gboolean
-gst_musepackdec_src_query (GstPad * pad, GstQuery * query)
+gst_musepackdec_src_query (GstPad * pad, GstObject * parent, GstQuery * query)
{
- GstMusepackDec *musepackdec = GST_MUSEPACK_DEC (gst_pad_get_parent (pad));
+ GstMusepackDec *musepackdec = GST_MUSEPACK_DEC (parent);
GstFormat format;
gboolean res = FALSE;
gint samplerate;
@@ -331,7 +309,7 @@
gst_query_parse_position (query, &format, NULL);
GST_OBJECT_LOCK (musepackdec);
- cur_off = musepackdec->segment.last_stop;
+ cur_off = musepackdec->segment.position;
GST_OBJECT_UNLOCK (musepackdec);
if (format == GST_FORMAT_TIME) {
@@ -365,23 +343,31 @@
}
case GST_QUERY_SEEKING:{
GstFormat fmt;
+ gint64 len, len_off;
res = TRUE;
gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL);
- if (fmt == GST_FORMAT_TIME || fmt == GST_FORMAT_DEFAULT)
- gst_query_set_seeking (query, fmt, TRUE, 0, -1);
- else
- gst_query_set_seeking (query, fmt, FALSE, -1, -1);
+ GST_OBJECT_LOCK (musepackdec);
+ len_off = musepackdec->segment.duration;
+ GST_OBJECT_UNLOCK (musepackdec);
+
+ if (fmt == GST_FORMAT_TIME) {
+ len = gst_util_uint64_scale_int (len_off, GST_SECOND, samplerate);
+ gst_query_set_seeking (query, fmt, TRUE, 0, len);
+ } else if (fmt == GST_FORMAT_DEFAULT) {
+ gst_query_set_seeking (query, fmt, TRUE, 0, len_off);
+ } else {
+ gst_query_set_seeking (query, fmt, FALSE, -1, -1);
+ }
break;
}
default:
- res = gst_pad_query_default (pad, query);
+ res = gst_pad_query_default (pad, parent, query);
break;
}
done:
- gst_object_unref (musepackdec);
return res;
}
@@ -391,6 +377,7 @@
mpc_streaminfo i;
GstTagList *tags;
GstCaps *caps;
+ gchar *stream_id;
/* set up reading */
gst_musepack_init_reader (musepackdec->r, musepackdec);
@@ -420,10 +407,16 @@
mpc_demux_get_info (musepackdec->d, &i);
#endif
+ stream_id = gst_pad_create_stream_id (musepackdec->srcpad,
+ GST_ELEMENT_CAST (musepackdec), NULL);
+ gst_pad_push_event (musepackdec->srcpad,
+ gst_event_new_stream_start (stream_id));
+ g_free (stream_id);
+
/* capsnego */
- caps = gst_caps_from_string (BASE_CAPS);
- gst_caps_set_simple (caps,
- "endianness", G_TYPE_INT, G_BYTE_ORDER,
+ caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, GST_MPC_FORMAT,
+ "layout", G_TYPE_STRING, "interleaved",
"channels", G_TYPE_INT, i.channels,
"rate", G_TYPE_INT, i.sample_freq, NULL);
gst_pad_use_fixed_caps (musepackdec->srcpad);
@@ -435,12 +428,11 @@
g_atomic_int_set (&musepackdec->bps, 4 * i.channels);
g_atomic_int_set (&musepackdec->rate, i.sample_freq);
- gst_segment_set_last_stop (&musepackdec->segment, GST_FORMAT_DEFAULT, 0);
- gst_segment_set_duration (&musepackdec->segment, GST_FORMAT_DEFAULT,
- mpc_streaminfo_get_length_samples (&i));
+ musepackdec->segment.position = 0;
+ musepackdec->segment.duration = mpc_streaminfo_get_length_samples (&i);
/* send basic tags */
- tags = gst_tag_list_new ();
+ tags = gst_tag_list_new_empty ();
gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE,
GST_TAG_AUDIO_CODEC, "Musepack", NULL);
@@ -472,30 +464,57 @@
}
GST_LOG_OBJECT (musepackdec, "Posting tags: %" GST_PTR_FORMAT, tags);
- gst_element_found_tags (GST_ELEMENT (musepackdec), tags);
+ gst_pad_push_event (musepackdec->srcpad, gst_event_new_tag (tags));
+
return TRUE;
}
static gboolean
-gst_musepackdec_sink_activate (GstPad * sinkpad)
+gst_musepackdec_sink_activate (GstPad * sinkpad, GstObject * parent)
{
- if (!gst_pad_check_pull_range (sinkpad))
+ GstQuery *query;
+ gboolean pull_mode;
+
+ query = gst_query_new_scheduling ();
+
+ if (!gst_pad_peer_query (sinkpad, query)) {
+ gst_query_unref (query);
+ return FALSE;
+ }
+
+ pull_mode = gst_query_has_scheduling_mode_with_flags (query,
+ GST_PAD_MODE_PULL, GST_SCHEDULING_FLAG_SEEKABLE);
+ gst_query_unref (query);
+
+ if (!pull_mode)
return FALSE;
- return gst_pad_activate_pull (sinkpad, TRUE);
+ GST_DEBUG_OBJECT (sinkpad, "activating pull");
+ return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PULL, TRUE);
}
static gboolean
-gst_musepackdec_sink_activate_pull (GstPad * sinkpad, gboolean active)
+gst_musepackdec_sink_activate_mode (GstPad * sinkpad, GstObject * parent,
+ GstPadMode mode, gboolean active)
{
gboolean result;
- if (active) {
- result = gst_pad_start_task (sinkpad,
- (GstTaskFunction) gst_musepackdec_loop, sinkpad, NULL);
- } else {
- result = gst_pad_stop_task (sinkpad);
+ switch (mode) {
+ case GST_PAD_MODE_PUSH:
+ result = FALSE;
+ break;
+ case GST_PAD_MODE_PULL:
+ if (active) {
+ result = gst_pad_start_task (sinkpad,
+ (GstTaskFunction) gst_musepackdec_loop, sinkpad, NULL);
+ } else {
+ result = gst_pad_stop_task (sinkpad);
+ }
+ break;
+ default:
+ result = FALSE;
+ break;
}
return result;
@@ -507,6 +526,7 @@
GstMusepackDec *musepackdec;
GstFlowReturn flow;
GstBuffer *out;
+ GstMapInfo info;
#ifdef MPC_IS_OLD_API
guint32 update_acc, update_bits;
@@ -530,16 +550,14 @@
bitspersample = g_atomic_int_get (&musepackdec->bps);
- flow = gst_pad_alloc_buffer_and_set_caps (musepackdec->srcpad, -1,
- MPC_DECODER_BUFFER_LENGTH * 4, GST_PAD_CAPS (musepackdec->srcpad), &out);
+ out = gst_buffer_new_allocate (NULL, MPC_DECODER_BUFFER_LENGTH * 4, NULL);
- if (flow != GST_FLOW_OK) {
- GST_DEBUG_OBJECT (musepackdec, "Flow: %s", gst_flow_get_name (flow));
- goto pause_task;
- }
#ifdef MPC_IS_OLD_API
+
+ gst_buffer_map (out, &info, GST_MAP_READWRITE);
num_samples = mpc_decoder_decode (musepackdec->d,
- (MPC_SAMPLE_FORMAT *) GST_BUFFER_DATA (out), &update_acc, &update_bits);
+ (MPC_SAMPLE_FORMAT *) info.data, &update_acc, &update_bits);
+ gst_buffer_unmap (out, &info);
if (num_samples < 0) {
GST_ERROR_OBJECT (musepackdec, "Failed to decode sample");
@@ -549,8 +567,10 @@
goto eos_and_pause;
}
#else
- frame.buffer = (MPC_SAMPLE_FORMAT *) GST_BUFFER_DATA (out);
+ gst_buffer_map (out, &info, GST_MAP_READWRITE);
+ frame.buffer = (MPC_SAMPLE_FORMAT *) info.data;
err = mpc_demux_decode (musepackdec->d, &frame);
+ gst_buffer_unmap (out, &info);
if (err != MPC_STATUS_OK) {
GST_ERROR_OBJECT (musepackdec, "Failed to decode sample");
@@ -563,16 +583,16 @@
num_samples = frame.samples;
#endif
- GST_BUFFER_SIZE (out) = num_samples * bitspersample;
+ gst_buffer_set_size (out, num_samples * bitspersample);
- GST_BUFFER_OFFSET (out) = musepackdec->segment.last_stop;
- GST_BUFFER_TIMESTAMP (out) =
- gst_util_uint64_scale_int (musepackdec->segment.last_stop,
+ GST_BUFFER_OFFSET (out) = musepackdec->segment.position;
+ GST_BUFFER_PTS (out) =
+ gst_util_uint64_scale_int (musepackdec->segment.position,
GST_SECOND, samplerate);
GST_BUFFER_DURATION (out) =
gst_util_uint64_scale_int (num_samples, GST_SECOND, samplerate);
- musepackdec->segment.last_stop += num_samples;
+ musepackdec->segment.position += num_samples;
GST_LOG_OBJECT (musepackdec, "Pushing buffer, timestamp %" GST_TIME_FORMAT,
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (out)));
@@ -585,7 +605,7 @@
/* check if we're at the end of a configured segment */
if (musepackdec->segment.stop != -1 &&
- musepackdec->segment.last_stop >= musepackdec->segment.stop) {
+ musepackdec->segment.position >= musepackdec->segment.stop) {
gint64 stop_time;
GST_DEBUG_OBJECT (musepackdec, "Reached end of configured segment");
@@ -633,7 +653,7 @@
switch (transition) {
case GST_STATE_CHANGE_READY_TO_PAUSED:
gst_segment_init (&musepackdec->segment, GST_FORMAT_DEFAULT);
- gst_segment_set_last_stop (&musepackdec->segment, GST_FORMAT_DEFAULT, 0);
+ musepackdec->segment.position = 0;
break;
default:
break;
diff --git a/ext/musepack/gstmusepackreader.c b/ext/musepack/gstmusepackreader.c
index 6717698..2c5bb14 100644
--- a/ext/musepack/gstmusepackreader.c
+++ b/ext/musepack/gstmusepackreader.c
@@ -77,7 +77,7 @@
return 0;
}
- read = MIN (GST_BUFFER_SIZE (buf), size);
+ read = MIN (gst_buffer_get_size (buf), size);
if (read < size) {
GST_WARNING_OBJECT (musepackdec, "Short read: got only %u bytes of %u "
@@ -86,7 +86,7 @@
/* GST_ELEMENT_ERROR (musepackdec, RESOURCE, READ, (NULL), (NULL)); */
}
- memcpy (ptr, GST_BUFFER_DATA (buf), read);
+ gst_buffer_extract (buf, 0, ptr, read);
gst_buffer_unref (buf);
return read;
}
@@ -161,10 +161,14 @@
{
GstMusepackDec *dec = GST_MUSEPACK_DEC (this->data);
#endif
- GstFormat format = GST_FORMAT_BYTES;
- gint64 length = -1;
+ GstQuery *query;
+ GstFormat format;
+ gint64 length;
- if (!gst_pad_query_peer_duration (dec->sinkpad, &format, &length))
+ query = gst_query_new_duration (GST_FORMAT_BYTES);
+ if (gst_pad_peer_query (dec->sinkpad, query))
+ gst_query_parse_duration (query, &format, &length);
+ else
length = -1;
return (mpc_int32_t) length;
diff --git a/ext/nas/Makefile.in b/ext/nas/Makefile.in
index d8cbef4..5ba5243 100644
--- a/ext/nas/Makefile.in
+++ b/ext/nas/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/nas/nassink.c b/ext/nas/nassink.c
index cd8485b..2d6404b 100644
--- a/ext/nas/nassink.c
+++ b/ext/nas/nassink.c
@@ -94,8 +94,7 @@
{
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
gst_element_class_set_static_metadata (element_class, "NAS audio sink",
"Sink/Audio",
"Plays audio to a Network Audio Server",
diff --git a/ext/neon/Makefile.in b/ext/neon/Makefile.in
index f1797d0..c63636c 100644
--- a/ext/neon/Makefile.in
+++ b/ext/neon/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/neon/gstneonhttpsrc.c b/ext/neon/gstneonhttpsrc.c
index 8a4ff0d..03c596c 100644
--- a/ext/neon/gstneonhttpsrc.c
+++ b/ext/neon/gstneonhttpsrc.c
@@ -203,8 +203,7 @@
GST_DEBUG_CATEGORY_INIT (neonhttpsrc_debug, "neonhttpsrc", 0,
"NEON HTTP Client Source");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&srctemplate));
+ gst_element_class_add_static_pad_template (element_class, &srctemplate);
gst_element_class_set_static_metadata (element_class, "HTTP client source",
"Source/Network",
diff --git a/ext/ofa/Makefile.in b/ext/ofa/Makefile.in
index 58d02ba..6630934 100644
--- a/ext/ofa/Makefile.in
+++ b/ext/ofa/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/openal/Makefile.in b/ext/openal/Makefile.in
index 929858a..b14865e 100644
--- a/ext/openal/Makefile.in
+++ b/ext/openal/Makefile.in
@@ -307,6 +307,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -328,6 +330,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -377,6 +381,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -522,6 +528,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -648,8 +656,6 @@
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@
@@ -692,8 +698,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/openal/gstopenalsink.c b/ext/openal/gstopenalsink.c
index 74f58e4..66de051 100644
--- a/ext/openal/gstopenalsink.c
+++ b/ext/openal/gstopenalsink.c
@@ -229,8 +229,8 @@
"Sink/Audio", "Output audio through OpenAL",
"Juan Manuel Borges Caño <juanmabcmail@gmail.com>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&openalsink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &openalsink_factory);
}
diff --git a/ext/openal/gstopenalsrc.c b/ext/openal/gstopenalsrc.c
index d06b3c4..26e73d4 100644
--- a/ext/openal/gstopenalsrc.c
+++ b/ext/openal/gstopenalsrc.c
@@ -192,8 +192,8 @@
"OpenAL Audio Source", "Source/Audio", "Input audio through OpenAL",
"Juan Manuel Borges Caño <juanmabcmail@gmail.com>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&openalsrc_factory));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &openalsrc_factory);
}
static void
diff --git a/ext/opencv/Makefile.am b/ext/opencv/Makefile.am
index 0eee38c..360d4ab 100644
--- a/ext/opencv/Makefile.am
+++ b/ext/opencv/Makefile.am
@@ -14,7 +14,6 @@
gstedgedetect.cpp \
gstfaceblur.cpp \
gsthanddetect.cpp \
- gstpyramidsegment.cpp \
gsttemplatematch.cpp \
gsttextoverlay.cpp \
gstmotioncells.cpp \
@@ -59,7 +58,6 @@
gstfaceblur.h \
gstfacedetect.h \
gsthanddetect.h \
- gstpyramidsegment.h \
gsttemplatematch.h \
gsttextoverlay.h \
gstskindetect.h \
diff --git a/ext/opencv/Makefile.in b/ext/opencv/Makefile.in
index 1aaafee..bac0228 100644
--- a/ext/opencv/Makefile.in
+++ b/ext/opencv/Makefile.in
@@ -178,7 +178,6 @@
libgstopencv_la-gstedgedetect.lo \
libgstopencv_la-gstfaceblur.lo \
libgstopencv_la-gsthanddetect.lo \
- libgstopencv_la-gstpyramidsegment.lo \
libgstopencv_la-gsttemplatematch.lo \
libgstopencv_la-gsttextoverlay.lo \
libgstopencv_la-gstmotioncells.lo \
@@ -325,6 +324,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -346,6 +347,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -395,6 +398,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -540,6 +545,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -666,8 +673,6 @@
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@
@@ -710,8 +715,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -816,7 +826,6 @@
gstedgedetect.cpp \
gstfaceblur.cpp \
gsthanddetect.cpp \
- gstpyramidsegment.cpp \
gsttemplatematch.cpp \
gsttextoverlay.cpp \
gstmotioncells.cpp \
@@ -862,7 +871,6 @@
gstfaceblur.h \
gstfacedetect.h \
gsthanddetect.h \
- gstpyramidsegment.h \
gsttemplatematch.h \
gsttextoverlay.h \
gstskindetect.h \
@@ -973,7 +981,6 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstopencv_la-gstopencv.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstopencv_la-gstopencvutils.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstopencv_la-gstopencvvideofilter.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstopencv_la-gstpyramidsegment.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstopencv_la-gstretinex.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstopencv_la-gstsegmentation.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstopencv_la-gstskindetect.Plo@am__quote@
@@ -1096,13 +1103,6 @@
@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
diff --git a/ext/opencv/MotionCells.cpp b/ext/opencv/MotionCells.cpp
index 9a16176..53d3371 100644
--- a/ext/opencv/MotionCells.cpp
+++ b/ext/opencv/MotionCells.cpp
@@ -79,6 +79,15 @@
m_cellwidth = 0;
m_cellheight = 0;
m_sensitivity = 0;
+
+ memset (&m_header, 0, sizeof (MotionCellHeader));
+ m_header.headersize = GINT32_TO_BE (MC_HEADER);
+ m_header.type = GINT32_TO_BE (MC_TYPE);
+ m_header.version = GINT32_TO_BE (MC_VERSION);
+ m_header.itemsize = 0;
+ m_header.gridx = 0;
+ m_header.gridy = 0;
+ m_header.starttime = 0;
}
MotionCells::~MotionCells ()
@@ -116,6 +125,8 @@
int sumframecnt = 0;
int ret = 0;
+ CvSize frameSize;
+
p_framerate >= 1 ? p_framerate <= 5 ? sumframecnt = 1
: p_framerate <= 10 ? sumframecnt = 2
: p_framerate <= 15 ? sumframecnt = 3
@@ -135,21 +146,21 @@
return ret;
}
- m_frameSize = cvGetSize (p_frame);
- m_frameSize.width /= 2;
- m_frameSize.height /= 2;
- setMotionCells (m_frameSize.width, m_frameSize.height);
+ frameSize = cvGetSize (p_frame);
+ frameSize.width /= 2;
+ frameSize.height /= 2;
+ setMotionCells (frameSize.width, frameSize.height);
m_sensitivity = 1 - p_sensitivity;
m_isVisible = p_isVisible;
m_pcurFrame = cvCloneImage (p_frame);
- IplImage *m_pcurgreyImage = cvCreateImage (m_frameSize, IPL_DEPTH_8U, 1);
- IplImage *m_pprevgreyImage = cvCreateImage (m_frameSize, IPL_DEPTH_8U, 1);
- IplImage *m_pgreyImage = cvCreateImage (m_frameSize, IPL_DEPTH_8U, 1);
+ IplImage *m_pcurgreyImage = cvCreateImage (frameSize, IPL_DEPTH_8U, 1);
+ IplImage *m_pprevgreyImage = cvCreateImage (frameSize, IPL_DEPTH_8U, 1);
+ IplImage *m_pgreyImage = cvCreateImage (frameSize, IPL_DEPTH_8U, 1);
IplImage *m_pcurDown =
- cvCreateImage (m_frameSize, m_pcurFrame->depth, m_pcurFrame->nChannels);
- IplImage *m_pprevDown = cvCreateImage (m_frameSize, m_pprevFrame->depth,
+ cvCreateImage (frameSize, m_pcurFrame->depth, m_pcurFrame->nChannels);
+ IplImage *m_pprevDown = cvCreateImage (frameSize, m_pprevFrame->depth,
m_pprevFrame->nChannels);
- m_pbwImage = cvCreateImage (m_frameSize, IPL_DEPTH_8U, 1);
+ m_pbwImage = cvCreateImage (frameSize, IPL_DEPTH_8U, 1);
cvPyrDown (m_pprevFrame, m_pprevDown);
cvCvtColor (m_pprevDown, m_pprevgreyImage, CV_RGB2GRAY);
cvPyrDown (m_pcurFrame, m_pcurDown);
@@ -333,10 +344,7 @@
}
} else
mc_savefile = NULL;
- memset (&m_header, 0, sizeof (MotionCellHeader));
- m_header.headersize = GINT32_TO_BE (MC_HEADER);
- m_header.type = GINT32_TO_BE (MC_TYPE);
- m_header.version = GINT32_TO_BE (MC_VERSION);
+
//it needs these bytes
m_header.itemsize =
GINT32_TO_BE ((int) ceil (ceil (m_gridx * m_gridy / 8.0) / 4.0) * 4 +
diff --git a/ext/opencv/MotionCells.h b/ext/opencv/MotionCells.h
index 97137bb..c858d87 100644
--- a/ext/opencv/MotionCells.h
+++ b/ext/opencv/MotionCells.h
@@ -242,7 +242,6 @@
IplImage *m_pcurFrame, *m_pprevFrame, *m_pdifferenceImage,
*m_pbwImage,*transparencyimg;
- CvSize m_frameSize;
bool m_isVisible, m_changed_datafile, m_useAlpha, m_saveInDatafile;
Cell **m_pCells;
vector < MotionCellsIdx > m_MotionCells;
diff --git a/ext/opencv/gstcvequalizehist.cpp b/ext/opencv/gstcvequalizehist.cpp
index ea1db28..bd3a7f0 100644
--- a/ext/opencv/gstcvequalizehist.cpp
+++ b/ext/opencv/gstcvequalizehist.cpp
@@ -93,10 +93,8 @@
gstopencvbasefilter_class->cv_trans_func = gst_cv_equalize_hist_transform;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
gst_element_class_set_static_metadata (element_class,
"cvequalizehist",
diff --git a/ext/opencv/gstcvlaplace.cpp b/ext/opencv/gstcvlaplace.cpp
index c989456..c8293bd 100644
--- a/ext/opencv/gstcvlaplace.cpp
+++ b/ext/opencv/gstcvlaplace.cpp
@@ -164,10 +164,8 @@
"Sets whether the detected edges should be used as a mask on the original input or not",
DEFAULT_MASK, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
gst_element_class_set_static_metadata (element_class,
"cvlaplace",
diff --git a/ext/opencv/gstcvsmooth.cpp b/ext/opencv/gstcvsmooth.cpp
index 8715736..f9a8a02 100644
--- a/ext/opencv/gstcvsmooth.cpp
+++ b/ext/opencv/gstcvsmooth.cpp
@@ -317,18 +317,18 @@
switch (filter->type) {
case CV_BLUR:
- blur (Mat (img), Mat (img), Size (filter->width, filter->height),
+ blur (cvarrToMat(img), cvarrToMat(img), Size (filter->width, filter->height),
Point (-1, -1));
break;
case CV_GAUSSIAN:
- GaussianBlur (Mat (img), Mat (img), Size (filter->width, filter->height),
+ GaussianBlur (cvarrToMat(img), cvarrToMat(img), Size (filter->width, filter->height),
filter->colorsigma, filter->colorsigma);
break;
case CV_MEDIAN:
- medianBlur (Mat (img), Mat (img), filter->width);
+ medianBlur (cvarrToMat(img), cvarrToMat(img), filter->width);
break;
case CV_BILATERAL:
- bilateralFilter (Mat (img), Mat (img), -1, filter->colorsigma, 0.0);
+ bilateralFilter (cvarrToMat(img), cvarrToMat(img), -1, filter->colorsigma, 0.0);
break;
default:
break;
diff --git a/ext/opencv/gstcvsobel.cpp b/ext/opencv/gstcvsobel.cpp
index d5c9ef7..4c2ccc4 100644
--- a/ext/opencv/gstcvsobel.cpp
+++ b/ext/opencv/gstcvsobel.cpp
@@ -163,10 +163,8 @@
"Sets whether the detected derivative edges should be used as a mask on the original input or not",
DEFAULT_MASK, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
gst_element_class_set_static_metadata (element_class,
"cvsobel",
diff --git a/ext/opencv/gstdisparity.cpp b/ext/opencv/gstdisparity.cpp
index 3ca9015..486e865 100644
--- a/ext/opencv/gstdisparity.cpp
+++ b/ext/opencv/gstdisparity.cpp
@@ -119,12 +119,16 @@
#include <config.h>
#endif
-#include <opencv2/contrib/contrib.hpp>
#include "gstdisparity.h"
+#include <opencv2/imgproc/imgproc_c.h>
+#if (CV_MAJOR_VERSION >= 3)
+#include <opencv2/imgproc.hpp>
+#endif
GST_DEBUG_CATEGORY_STATIC (gst_disparity_debug);
#define GST_CAT_DEFAULT gst_disparity_debug
+using namespace cv;
/* Filter signals and args */
enum
{
@@ -141,9 +145,7 @@
typedef enum
{
METHOD_SBM,
- METHOD_SGBM,
- METHOD_VAR,
- METHOD_GC
+ METHOD_SGBM
} GstDisparityMethod;
#define DEFAULT_METHOD METHOD_SGBM
@@ -157,8 +159,6 @@
static const GEnumValue values[] = {
{METHOD_SBM, "Global block matching algorithm", "sbm"},
{METHOD_SGBM, "Semi-global block matching algorithm", "sgbm"},
- {METHOD_VAR, "Variational matching algorithm", "svar"},
- {METHOD_GC, "Graph-cut based matching algorithm", "sgc"},
{0, NULL, NULL},
};
etype = g_enum_register_static ("GstDisparityMethod", values);
@@ -205,8 +205,6 @@
static int initialise_sbm (GstDisparity * filter);
static int run_sbm_iteration (GstDisparity * filter);
static int run_sgbm_iteration (GstDisparity * filter);
-static int run_svar_iteration (GstDisparity * filter);
-static int run_sgc_iteration (GstDisparity * filter);
static int finalise_sbm (GstDisparity * filter);
/* initialize the disparity's class */
@@ -238,10 +236,8 @@
"Calculates the stereo disparity map from two (sequences of) rectified and aligned stereo images",
"Miguel Casas-Sanchez <miguelecasassanchez@gmail.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
}
/* initialize the new element
@@ -582,27 +578,6 @@
CV_MINMAX, NULL);
cvCvtColor (fs->cvGray_depth_map2, fs->cvRGB_right, CV_GRAY2RGB);
}
- /* The class implements the modified S. G. Kosov algorithm
- See the comments on top of the file.
- */
- else if (METHOD_VAR == fs->method) {
- cvCvtColor (fs->cvRGB_left, fs->cvGray_left, CV_RGB2GRAY);
- cvCvtColor (fs->cvRGB_right, fs->cvGray_right, CV_RGB2GRAY);
- 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.
- See the comments on top of the file.
- */
- else if (METHOD_GC == fs->method) {
- cvCvtColor (fs->cvRGB_left, fs->cvGray_left, CV_RGB2GRAY);
- cvCvtColor (fs->cvRGB_right, fs->cvGray_right, CV_RGB2GRAY);
- run_sgc_iteration (fs);
- cvConvertScale (fs->cvGray_depth_map1, fs->cvGray_depth_map2, -16.0, 0.0);
- cvCvtColor (fs->cvGray_depth_map2, fs->cvRGB_right, CV_GRAY2RGB);
- }
GST_DEBUG_OBJECT (pad, " right has finished");
@@ -665,72 +640,65 @@
int
initialise_sbm (GstDisparity * filter)
{
- filter->img_right_as_cvMat_rgb =
- (void *) new cv::Mat (filter->cvRGB_right, false);
- filter->img_left_as_cvMat_rgb =
- (void *) new cv::Mat (filter->cvRGB_left, false);
filter->img_right_as_cvMat_gray =
- (void *) new cv::Mat (filter->cvGray_right, false);
+ (void *) new Mat (cvarrToMat (filter->cvGray_right, false));
filter->img_left_as_cvMat_gray =
- (void *) new cv::Mat (filter->cvGray_left, false);
+ (void *) new Mat (cvarrToMat (filter->cvGray_left, false));
filter->depth_map_as_cvMat =
- (void *) new cv::Mat (filter->cvGray_depth_map1, false);
- filter->depth_map_as_cvMat2 =
- (void *) new cv::Mat (filter->cvGray_depth_map2, false);
+ (void *) new Mat (cvarrToMat (filter->cvGray_depth_map1, false));
+#if (CV_MAJOR_VERSION >= 3)
+ filter->sbm = StereoBM::create();
+ filter->sgbm = StereoSGBM::create(1,64,3);
- filter->sbm = (void *) new cv::StereoBM ();
- filter->sgbm = (void *) new cv::StereoSGBM ();
- filter->svar = (void *) new cv::StereoVar ();
- /* SGC has only two parameters on creation: NumerOfDisparities and MaxIters */
- filter->sgc = cvCreateStereoGCState (16, 2);
+ filter->sbm->setBlockSize (9);
+ filter->sbm->setNumDisparities (32);
+ filter->sbm->setPreFilterSize (9);
+ filter->sbm->setPreFilterCap (32);
+ filter->sbm->setMinDisparity (0);
+ filter->sbm->setTextureThreshold (0);
+ filter->sbm->setUniquenessRatio (0);
+ filter->sbm->setSpeckleWindowSize (0);
+ filter->sbm->setSpeckleRange (0);
+ filter->sbm->setDisp12MaxDiff (0);
- ((cv::StereoBM *) filter->sbm)->state->SADWindowSize = 9;
- ((cv::StereoBM *) filter->sbm)->state->numberOfDisparities = 32;
- ((cv::StereoBM *) filter->sbm)->state->preFilterSize = 9;
- ((cv::StereoBM *) filter->sbm)->state->preFilterCap = 32;
- ((cv::StereoBM *) filter->sbm)->state->minDisparity = 0;
- ((cv::StereoBM *) filter->sbm)->state->textureThreshold = 0;
- ((cv::StereoBM *) filter->sbm)->state->uniquenessRatio = 0;
- ((cv::StereoBM *) filter->sbm)->state->speckleWindowSize = 0;
- ((cv::StereoBM *) filter->sbm)->state->speckleRange = 0;
- ((cv::StereoBM *) filter->sbm)->state->disp12MaxDiff = 0;
+ filter->sgbm->setMinDisparity (1);
+ filter->sgbm->setNumDisparities (64);
+ filter->sgbm->setBlockSize (3);
+ filter->sgbm->setP1 (200);
+ filter->sgbm->setP2 (255);
+ filter->sgbm->setDisp12MaxDiff (0);
+ filter->sgbm->setPreFilterCap (0);
+ filter->sgbm->setUniquenessRatio (0);
+ filter->sgbm->setSpeckleWindowSize (0);
+ filter->sgbm->setSpeckleRange (0);
+ filter->sgbm->setMode (StereoSGBM::MODE_HH);
+#else
+ filter->sbm = (void *) new StereoBM ();
+ filter->sgbm = (void *) new StereoSGBM ();
- ((cv::StereoSGBM *) filter->sgbm)->minDisparity = 1;
- ((cv::StereoSGBM *) filter->sgbm)->numberOfDisparities = 64;
- ((cv::StereoSGBM *) filter->sgbm)->SADWindowSize = 3;
- ((cv::StereoSGBM *) filter->sgbm)->P1 = 200;;
- ((cv::StereoSGBM *) filter->sgbm)->P2 = 255;
- ((cv::StereoSGBM *) filter->sgbm)->disp12MaxDiff = 0;
- ((cv::StereoSGBM *) filter->sgbm)->preFilterCap = 0;
- ((cv::StereoSGBM *) filter->sgbm)->uniquenessRatio = 0;
- ((cv::StereoSGBM *) filter->sgbm)->speckleWindowSize = 0;
- ((cv::StereoSGBM *) filter->sgbm)->speckleRange = 0;
- ((cv::StereoSGBM *) filter->sgbm)->fullDP = true;
+ ((StereoBM *) filter->sbm)->state->SADWindowSize = 9;
+ ((StereoBM *) filter->sbm)->state->numberOfDisparities = 32;
+ ((StereoBM *) filter->sbm)->state->preFilterSize = 9;
+ ((StereoBM *) filter->sbm)->state->preFilterCap = 32;
+ ((StereoBM *) filter->sbm)->state->minDisparity = 0;
+ ((StereoBM *) filter->sbm)->state->textureThreshold = 0;
+ ((StereoBM *) filter->sbm)->state->uniquenessRatio = 0;
+ ((StereoBM *) filter->sbm)->state->speckleWindowSize = 0;
+ ((StereoBM *) filter->sbm)->state->speckleRange = 0;
+ ((StereoBM *) filter->sbm)->state->disp12MaxDiff = 0;
- /* From Opencv samples/cpp/stereo_match.cpp */
- ((cv::StereoVar *) filter->svar)->levels = 3;
- ((cv::StereoVar *) filter->svar)->pyrScale = 0.5;
- ((cv::StereoVar *) filter->svar)->nIt = 25;
- ((cv::StereoVar *) filter->svar)->minDisp = -64;
- ((cv::StereoVar *) filter->svar)->maxDisp = 0;
- ((cv::StereoVar *) filter->svar)->poly_n = 3;
- ((cv::StereoVar *) filter->svar)->poly_sigma = 0.0;
- ((cv::StereoVar *) filter->svar)->fi = 15.0f;
- ((cv::StereoVar *) filter->svar)->lambda = 0.03f;
- ((cv::StereoVar *) filter->svar)->penalization =
- cv::StereoVar::PENALIZATION_TICHONOV;
- ((cv::StereoVar *) filter->svar)->cycle = cv::StereoVar::CYCLE_V;
- ((cv::StereoVar *) filter->svar)->flags = cv::StereoVar::USE_SMART_ID |
- cv::StereoVar::USE_AUTO_PARAMS |
- cv::StereoVar::USE_INITIAL_DISPARITY |
- cv::StereoVar::USE_MEDIAN_FILTERING;
-
- filter->sgc->Ithreshold = 5;
- filter->sgc->interactionRadius = 1;
- filter->sgc->occlusionCost = 10000;
- filter->sgc->minDisparity = 0;
- filter->sgc->numberOfDisparities = 16; /* Coming from constructor too */
- filter->sgc->maxIters = 1; /* Coming from constructor too */
+ ((StereoSGBM *) filter->sgbm)->minDisparity = 1;
+ ((StereoSGBM *) filter->sgbm)->numberOfDisparities = 64;
+ ((StereoSGBM *) filter->sgbm)->SADWindowSize = 3;
+ ((StereoSGBM *) filter->sgbm)->P1 = 200;;
+ ((StereoSGBM *) filter->sgbm)->P2 = 255;
+ ((StereoSGBM *) filter->sgbm)->disp12MaxDiff = 0;
+ ((StereoSGBM *) filter->sgbm)->preFilterCap = 0;
+ ((StereoSGBM *) filter->sgbm)->uniquenessRatio = 0;
+ ((StereoSGBM *) filter->sgbm)->speckleWindowSize = 0;
+ ((StereoSGBM *) filter->sgbm)->speckleRange = 0;
+ ((StereoSGBM *) filter->sgbm)->fullDP = true;
+#endif
return (0);
}
@@ -738,53 +706,49 @@
int
run_sbm_iteration (GstDisparity * filter)
{
- (*((cv::StereoBM *) filter->
- sbm)) (*((cv::Mat *) filter->img_left_as_cvMat_gray),
- *((cv::Mat *) filter->img_right_as_cvMat_gray),
- *((cv::Mat *) filter->depth_map_as_cvMat));
+#if (CV_MAJOR_VERSION >= 3)
+ ((StereoBM *) filter->
+ sbm)->compute (*((Mat *) filter->img_left_as_cvMat_gray),
+ *((Mat *) filter->img_right_as_cvMat_gray),
+ *((Mat *) filter->depth_map_as_cvMat));
+#else
+ (*((StereoBM *) filter->
+ sbm)) (*((Mat *) filter->img_left_as_cvMat_gray),
+ *((Mat *) filter->img_right_as_cvMat_gray),
+ *((Mat *) filter->depth_map_as_cvMat));
+#endif
return (0);
}
int
run_sgbm_iteration (GstDisparity * filter)
{
- (*((cv::StereoSGBM *) filter->
- sgbm)) (*((cv::Mat *) filter->img_left_as_cvMat_gray),
- *((cv::Mat *) filter->img_right_as_cvMat_gray),
- *((cv::Mat *) filter->depth_map_as_cvMat));
- return (0);
-}
-
-int
-run_svar_iteration (GstDisparity * filter)
-{
- (*((cv::StereoVar *) filter->
- svar)) (*((cv::Mat *) filter->img_left_as_cvMat_gray),
- *((cv::Mat *) filter->img_right_as_cvMat_gray),
- *((cv::Mat *) filter->depth_map_as_cvMat2));
- return (0);
-}
-
-int
-run_sgc_iteration (GstDisparity * filter)
-{
- cvFindStereoCorrespondenceGC (filter->cvGray_left,
- filter->cvGray_right, filter->cvGray_depth_map1,
- filter->cvGray_depth_map1_2, filter->sgc, 0);
+#if (CV_MAJOR_VERSION >= 3)
+ ((StereoSGBM *) filter->
+ sgbm)->compute (*((Mat *) filter->img_left_as_cvMat_gray),
+ *((Mat *) filter->img_right_as_cvMat_gray),
+ *((Mat *) filter->depth_map_as_cvMat));
+#else
+ (*((StereoSGBM *) filter->
+ sgbm)) (*((Mat *) filter->img_left_as_cvMat_gray),
+ *((Mat *) filter->img_right_as_cvMat_gray),
+ *((Mat *) filter->depth_map_as_cvMat));
+#endif
return (0);
}
int
finalise_sbm (GstDisparity * filter)
{
- delete (cv::Mat *) filter->img_left_as_cvMat_rgb;
- delete (cv::Mat *) filter->img_right_as_cvMat_rgb;
- delete (cv::Mat *) filter->depth_map_as_cvMat;
- delete (cv::Mat *) filter->depth_map_as_cvMat2;
- delete (cv::Mat *) filter->img_left_as_cvMat_gray;
- delete (cv::Mat *) filter->img_right_as_cvMat_gray;
- delete (cv::StereoBM *) filter->sbm;
- delete (cv::StereoSGBM *) filter->sgbm;
- delete (cv::StereoVar *) filter->svar;
+ delete (Mat *) filter->depth_map_as_cvMat;
+ delete (Mat *) filter->img_left_as_cvMat_gray;
+ delete (Mat *) filter->img_right_as_cvMat_gray;
+#if (CV_MAJOR_VERSION >= 3)
+ filter->sbm.release();
+ filter->sgbm.release();
+#else
+ delete (StereoBM *) filter->sbm;
+ delete (StereoSGBM *) filter->sgbm;
+#endif
return (0);
}
diff --git a/ext/opencv/gstdisparity.h b/ext/opencv/gstdisparity.h
index 07e2417..218699d 100644
--- a/ext/opencv/gstdisparity.h
+++ b/ext/opencv/gstdisparity.h
@@ -47,7 +47,9 @@
#include <gst/gst.h>
#include <gst/video/video.h>
-#include <opencv2/legacy/legacy.hpp>
+#include <opencv2/core/core.hpp>
+#include <opencv2/calib3d/calib3d.hpp>
+#include <opencv2/core/version.hpp>
G_BEGIN_DECLS
/* #defines don't like whitespacey bits */
@@ -92,16 +94,16 @@
IplImage *cvGray_depth_map2; /*IPL_DEPTH_8U */
IplImage *cvGray_depth_map1_2; /*IPL_DEPTH_16S */
- void *sbm; /* cv::StereoBM */
- void *sgbm; /* cv::StereoSGBM */
- void *svar; /* cv::StereoVar */
- CvStereoGCState *sgc; /* This is a C implementation */
- void *img_right_as_cvMat_rgb; /* cv::Mat */
- void *img_left_as_cvMat_rgb; /* cv::Mat */
- void *depth_map_as_cvMat; /* cv::Mat */
- void *depth_map_as_cvMat2; /* cv::Mat */
void *img_right_as_cvMat_gray; /* cv::Mat */
void *img_left_as_cvMat_gray; /* cv::Mat */
+ void *depth_map_as_cvMat; /* cv::Mat */
+#if (CV_MAJOR_VERSION >= 3)
+ cv::Ptr<cv::StereoBM> sbm; /* cv::StereoBM */
+ cv::Ptr<cv::StereoSGBM> sgbm; /* cv::StereoSGBM */
+#else
+ void *sbm; /* cv::StereoBM */
+ void *sgbm; /* cv::StereoSGBM */
+#endif
};
struct _GstDisparityClass
diff --git a/ext/opencv/gstedgedetect.cpp b/ext/opencv/gstedgedetect.cpp
index 7e6c1e7..1be9836 100644
--- a/ext/opencv/gstedgedetect.cpp
+++ b/ext/opencv/gstedgedetect.cpp
@@ -169,10 +169,8 @@
"Performs canny edge detection on videos and images.",
"Michael Sheldon <mike@mikeasoft.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
}
/* initialize the new element
diff --git a/ext/opencv/gstfaceblur.cpp b/ext/opencv/gstfaceblur.cpp
index 2bc88d1..4476e14 100644
--- a/ext/opencv/gstfaceblur.cpp
+++ b/ext/opencv/gstfaceblur.cpp
@@ -80,6 +80,7 @@
#define DEFAULT_MIN_SIZE_HEIGHT 30
using namespace cv;
+using namespace std;
enum
{
PROP_0,
@@ -227,10 +228,8 @@
"Blurs faces in images and videos",
"Michael Sheldon <mike@mikeasoft.com>,Robert Jobbagy <jobbagy.robert@gmail.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
}
/* initialize the new element
@@ -357,9 +356,7 @@
cvCvtColor (img, filter->cvGray, CV_RGB2GRAY);
- Mat image (filter->cvGray, Rect (filter->cvGray->origin,
- filter->cvGray->origin, filter->cvGray->width,
- filter->cvGray->height));
+ Mat image = cvarrToMat(filter->cvGray);
filter->cvCascade->detectMultiScale (image, faces, filter->scale_factor,
filter->min_neighbors, filter->flags,
cvSize (filter->min_size_width, filter->min_size_height), cvSize (0, 0));
@@ -368,7 +365,8 @@
for (i = 0; i < faces.size (); ++i) {
Rect *r = &faces[i];
- Mat roi (img, Rect (r->x, r->y, r->width, r->height));
+ Mat imag = cvarrToMat(img);
+ Mat roi (imag, Rect (r->x, r->y, r->width, r->height));
blur (roi, roi, Size (11, 11));
GaussianBlur (roi, roi, Size (11, 11), 0, 0);
}
diff --git a/ext/opencv/gstfacedetect.cpp b/ext/opencv/gstfacedetect.cpp
index aff9979..3c82ce0 100644
--- a/ext/opencv/gstfacedetect.cpp
+++ b/ext/opencv/gstfacedetect.cpp
@@ -78,8 +78,12 @@
#include <vector>
+using namespace std;
+
#include "gstfacedetect.h"
-#include <opencv2/imgproc/imgproc_c.h>
+#if (CV_MAJOR_VERSION >= 3)
+#include <opencv2/imgproc.hpp>
+#endif
GST_DEBUG_CATEGORY_STATIC (gst_face_detect_debug);
#define GST_CAT_DEFAULT gst_face_detect_debug
@@ -349,10 +353,8 @@
"Performs face detection on videos and images, providing detected positions via bus messages",
"Michael Sheldon <mike@mikeasoft.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
}
/* initialize the new element
@@ -559,7 +561,7 @@
img_stddev = stddev.val[0];
}
if (img_stddev >= filter->min_stddev) {
- Mat roi (filter->cvGray, r);
+ Mat roi (cv::cvarrToMat (filter->cvGray), r);
detector->detectMultiScale (roi, faces, filter->scale_factor,
filter->min_neighbors, filter->flags, cvSize (min_size_width,
min_size_height), cvSize (0, 0));
@@ -591,7 +593,7 @@
gboolean do_display = FALSE;
gboolean post_msg = FALSE;
- Mat mtxOrg (img, false);
+ Mat mtxOrg (cv::cvarrToMat (img));
if (filter->display) {
if (gst_buffer_is_writable (buf)) {
diff --git a/ext/opencv/gstgrabcut.cpp b/ext/opencv/gstgrabcut.cpp
index eaf727b..f604953 100644
--- a/ext/opencv/gstgrabcut.cpp
+++ b/ext/opencv/gstgrabcut.cpp
@@ -93,6 +93,7 @@
GST_DEBUG_CATEGORY_STATIC (gst_grabcut_debug);
#define GST_CAT_DEFAULT gst_grabcut_debug
+using namespace cv;
/* Filter signals and args */
enum
{
@@ -184,10 +185,8 @@
downstream event is used to create a bbox of PR_FG elements.\n\
IF nothing is present, then nothing is done.", "Miguel Casas-Sanchez <miguelecasassanchez@gmail.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
}
@@ -394,8 +393,8 @@
for (x = 0; x < output->cols; x++) {
for (y = 0; y < output->rows; y++) {
CV_MAT_ELEM (*output, uchar, y, x) =
- (cvGetReal2D (input, y, x) <= cv::GC_PR_FGD) ? cvGetReal2D (input, y,
- x) : cv::GC_PR_FGD;
+ (cvGetReal2D (input, y, x) <= GC_PR_FGD) ? cvGetReal2D (input, y,
+ x) : GC_PR_FGD;
}
}
}
@@ -405,10 +404,10 @@
initialise_grabcut (struct grabcut_params *GC, IplImage * image_c,
CvMat * mask_c)
{
- GC->image = (void *) new cv::Mat (image_c, false); /* "true" refers to copydata */
- GC->mask = (void *) new cv::Mat (mask_c, false);
- GC->bgdModel = (void *) new cv::Mat (); /* "true" refers to copydata */
- GC->fgdModel = (void *) new cv::Mat ();
+ GC->image = (void *) new Mat (cvarrToMat (image_c, false)); /* "true" refers to copydata */
+ GC->mask = (void *) new Mat (cvarrToMat (mask_c, false));
+ GC->bgdModel = (void *) new Mat (); /* "true" refers to copydata */
+ GC->fgdModel = (void *) new Mat ();
return (0);
}
@@ -417,13 +416,13 @@
run_grabcut_iteration (struct grabcut_params *GC, IplImage * image_c,
CvMat * mask_c, CvRect * bbox)
{
- ((cv::Mat *) GC->image)->data = (uchar *) image_c->imageData;
- ((cv::Mat *) GC->mask)->data = mask_c->data.ptr;
+ ((Mat *) GC->image)->data = (uchar *) image_c->imageData;
+ ((Mat *) GC->mask)->data = mask_c->data.ptr;
if (cvCountNonZero (mask_c))
- grabCut (*((cv::Mat *) GC->image), *((cv::Mat *) GC->mask), cv::Rect (),
- *((cv::Mat *) GC->bgdModel), *((cv::Mat *) GC->fgdModel), 1,
- cv::GC_INIT_WITH_MASK);
+ grabCut (*((Mat *) GC->image), *((Mat *) GC->mask), Rect (),
+ *((Mat *) GC->bgdModel), *((Mat *) GC->fgdModel), 1,
+ GC_INIT_WITH_MASK);
return (0);
}
@@ -432,12 +431,11 @@
run_grabcut_iteration2 (struct grabcut_params *GC, IplImage * image_c,
CvMat * mask_c, CvRect * bbox)
{
- ((cv::Mat *) GC->image)->data = (uchar *) image_c->imageData;
- ((cv::Mat *) GC->mask)->data = mask_c->data.ptr;
-
- grabCut (*((cv::Mat *) GC->image), *((cv::Mat *) GC->mask), *(bbox),
- *((cv::Mat *) GC->bgdModel), *((cv::Mat *) GC->fgdModel), 1,
- cv::GC_INIT_WITH_RECT);
+ ((Mat *) GC->image)->data = (uchar *) image_c->imageData;
+ ((Mat *) GC->mask)->data = mask_c->data.ptr;
+ grabCut (*((Mat *) GC->image), *((Mat *) GC->mask), *(bbox),
+ *((Mat *) GC->bgdModel), *((Mat *) GC->fgdModel), 1,
+ GC_INIT_WITH_RECT);
return (0);
}
@@ -445,10 +443,10 @@
int
finalise_grabcut (struct grabcut_params *GC)
{
- delete ((cv::Mat *) GC->image);
- delete ((cv::Mat *) GC->mask);
- delete ((cv::Mat *) GC->bgdModel);
- delete ((cv::Mat *) GC->fgdModel);
+ delete ((Mat *) GC->image);
+ delete ((Mat *) GC->mask);
+ delete ((Mat *) GC->bgdModel);
+ delete ((Mat *) GC->fgdModel);
return (0);
}
diff --git a/ext/opencv/gsthanddetect.cpp b/ext/opencv/gsthanddetect.cpp
index e36b80e..f85f2c9 100644
--- a/ext/opencv/gsthanddetect.cpp
+++ b/ext/opencv/gsthanddetect.cpp
@@ -72,6 +72,7 @@
#define HAAR_FILE_PALM GST_HAAR_CASCADES_DIR G_DIR_SEPARATOR_S "palm.xml"
using namespace cv;
+using namespace std;
/* Filter signals and args */
enum
{
@@ -245,10 +246,8 @@
"Performs hand gesture detection on videos, providing detected hand positions via bus message and navigation event, and deals with hand gesture events",
"Andol Li <andol@andol.info>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
}
@@ -407,7 +406,8 @@
cvCvtColor (img, filter->cvGray, CV_RGB2GRAY);
/* detect FIST gesture fist */
- Mat roi (filter->cvGray, Rect (filter->cvGray->origin,
+ Mat image = cvarrToMat(filter->cvGray);
+ Mat roi (image, Rect (filter->cvGray->origin,
filter->cvGray->origin, filter->cvGray->width,
filter->cvGray->height));
filter->cvCascade_fist->detectMultiScale (roi, hands, 1.1, 2,
diff --git a/ext/opencv/gstmotioncells.cpp b/ext/opencv/gstmotioncells.cpp
index e1d412f..33f314a 100644
--- a/ext/opencv/gstmotioncells.cpp
+++ b/ext/opencv/gstmotioncells.cpp
@@ -308,10 +308,8 @@
"Performs motion detection on videos and images, providing detected motion cells index via bus messages",
"Robert Jobbagy <jobbagy dot robert at gmail dot com>, Nicola Murino <nicola dot murino at gmail.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
}
/* initialize the new element
diff --git a/ext/opencv/gstopencv.cpp b/ext/opencv/gstopencv.cpp
index 4077ba6..8f50cd8 100644
--- a/ext/opencv/gstopencv.cpp
+++ b/ext/opencv/gstopencv.cpp
@@ -33,7 +33,6 @@
#include "gstfaceblur.h"
#include "gstfacedetect.h"
#include "gstmotioncells.h"
-#include "gstpyramidsegment.h"
#include "gsttemplatematch.h"
#include "gsttextoverlay.h"
#include "gsthanddetect.h"
@@ -76,9 +75,6 @@
if (!gst_motion_cells_plugin_init (plugin))
return FALSE;
- if (!gst_pyramid_segment_plugin_init (plugin))
- return FALSE;
-
if (!gst_template_match_plugin_init (plugin))
return FALSE;
diff --git a/ext/opencv/gstopencvutils.cpp b/ext/opencv/gstopencvutils.cpp
index da6eea9..57b660d 100644
--- a/ext/opencv/gstopencvutils.cpp
+++ b/ext/opencv/gstopencvutils.cpp
@@ -24,7 +24,7 @@
#endif
#include "gstopencvutils.h"
-#include <opencv2/core/types_c.h>
+#include <opencv2/core/core_c.h>
gboolean
diff --git a/ext/opencv/gstpyramidsegment.cpp b/ext/opencv/gstpyramidsegment.cpp
deleted file mode 100644
index d8247c0..0000000
--- a/ext/opencv/gstpyramidsegment.cpp
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * GStreamer
- * 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
- * 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.
- */
-
-/**
- * SECTION:element-pyramidsegment
- *
- * Applies pyramid segmentation to a video or image.
- *
- * <refsect2>
- * <title>Example launch line</title>
- * |[
- * gst-launch-1.0 -v videotestsrc ! pyramidsegment ! videoconvert ! autovideosink
- * ]|
- * </refsect2>
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "gstpyramidsegment.h"
-
-#define BLOCK_SIZE 1000
-
-GST_DEBUG_CATEGORY_STATIC (gst_pyramid_segment_debug);
-#define GST_CAT_DEFAULT gst_pyramid_segment_debug
-
-using namespace cv;
-/* Filter signals and args */
-enum
-{
- /* FILL ME */
- LAST_SIGNAL
-};
-
-enum
-{
- PROP_0,
- PROP_SILENT,
- PROP_THRESHOLD1,
- PROP_THRESHOLD2,
- PROP_LEVEL
-};
-
-/* the capabilities of the inputs and outputs.
- *
- * describe the real formats here.
- */
-static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
- GST_PAD_SINK,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("RGB"))
- );
-
-static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
- GST_PAD_SRC,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("RGB"))
- );
-
-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 GstFlowReturn gst_pyramid_segment_transform_ip (GstOpencvVideoFilter *
- base, GstBuffer * buf, IplImage * img);
-
-/* Clean up */
-static void
-gst_pyramid_segment_finalize (GObject * obj)
-{
- GstPyramidSegment *filter = GST_PYRAMID_SEGMENT (obj);
-
- cvReleaseMemStorage (&filter->storage);
-
- G_OBJECT_CLASS (gst_pyramid_segment_parent_class)->finalize (obj);
-}
-
-/* initialize the pyramidsegment's class */
-static void
-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_ip_func =
- gst_pyramid_segment_transform_ip;
-
- g_object_class_install_property (gobject_class, PROP_SILENT,
- g_param_spec_boolean ("silent", "Silent", "Produce verbose output ?",
- 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,
- (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,
- (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,
- (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
-
- gst_element_class_set_static_metadata (element_class,
- "pyramidsegment",
- "Filter/Effect/Video",
- "Applies pyramid segmentation to a video or image.",
- "Michael Sheldon <mike@mikeasoft.com>");
-
- gst_element_class_add_pad_template (element_class,
- 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
- * initialize instance structure
- */
-static void
-gst_pyramid_segment_init (GstPyramidSegment * filter)
-{
- filter->storage = cvCreateMemStorage (BLOCK_SIZE);
- filter->comp =
- cvCreateSeq (0, sizeof (CvSeq), sizeof (CvPoint), filter->storage);
- filter->silent = FALSE;
- filter->threshold1 = 50.0;
- filter->threshold2 = 60.0;
- filter->level = 4;
-
- gst_opencv_video_filter_set_in_place (GST_OPENCV_VIDEO_FILTER_CAST (filter),
- TRUE);
-}
-
-static void
-gst_pyramid_segment_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec)
-{
- GstPyramidSegment *filter = GST_PYRAMID_SEGMENT (object);
-
- switch (prop_id) {
- case PROP_SILENT:
- filter->silent = g_value_get_boolean (value);
- break;
- case PROP_THRESHOLD1:
- filter->threshold1 = g_value_get_double (value);
- break;
- case PROP_THRESHOLD2:
- filter->threshold2 = g_value_get_double (value);
- break;
- case PROP_LEVEL:
- filter->level = g_value_get_int (value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gst_pyramid_segment_get_property (GObject * object, guint prop_id,
- GValue * value, GParamSpec * pspec)
-{
- GstPyramidSegment *filter = GST_PYRAMID_SEGMENT (object);
-
- switch (prop_id) {
- case PROP_SILENT:
- g_value_set_boolean (value, filter->silent);
- break;
- case PROP_THRESHOLD1:
- g_value_set_double (value, filter->threshold1);
- break;
- case PROP_THRESHOLD2:
- g_value_set_double (value, filter->threshold2);
- break;
- case PROP_LEVEL:
- g_value_set_int (value, filter->level);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-/* transform function
- * this function does the actual processing
- */
-static GstFlowReturn
-gst_pyramid_segment_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf,
- IplImage * img)
-{
- GstPyramidSegment *filter = GST_PYRAMID_SEGMENT (base);
-
- cvPyrSegmentation (img, img, filter->storage,
- &(filter->comp), filter->level, filter->threshold1, filter->threshold2);
-
- return GST_FLOW_OK;
-}
-
-
-/* entry point to initialize the plug-in
- * initialize the plug-in itself
- * register the element factories and other features
- */
-gboolean
-gst_pyramid_segment_plugin_init (GstPlugin * plugin)
-{
- /* debug category for fltering log messages */
- GST_DEBUG_CATEGORY_INIT (gst_pyramid_segment_debug, "pyramidsegment",
- 0, "Applies pyramid segmentation to a video or image");
-
- return gst_element_register (plugin, "pyramidsegment", GST_RANK_NONE,
- GST_TYPE_PYRAMID_SEGMENT);
-}
diff --git a/ext/opencv/gstpyramidsegment.h b/ext/opencv/gstpyramidsegment.h
deleted file mode 100644
index e715766..0000000
--- a/ext/opencv/gstpyramidsegment.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * GStreamer
- * 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
- * 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_PYRAMID_SEGMENT_H__
-#define __GST_PYRAMID_SEGMENT_H__
-
-#include <gstopencvvideofilter.h>
-#include <opencv2/core/version.hpp>
-#include <opencv2/legacy/legacy.hpp>
-
-G_BEGIN_DECLS
-/* #defines don't like whitespacey bits */
-#define GST_TYPE_PYRAMID_SEGMENT \
- (gst_pyramid_segment_get_type())
-#define GST_PYRAMID_SEGMENT(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PYRAMID_SEGMENT,GstPyramidSegment))
-#define GST_PYRAMID_SEGMENT_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PYRAMID_SEGMENT,GstPyramidSegmentClass))
-#define GST_IS_PYRAMID_SEGMENT(obj) \
- (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
-{
- GstOpencvVideoFilter element;
-
- GstPad *sinkpad, *srcpad;
-
- gboolean silent;
-
- CvMemStorage *storage;
-
- CvSeq *comp;
-
- double threshold1, threshold2;
-
- int level;
-};
-
-struct _GstPyramidSegmentClass
-{
- GstOpencvVideoFilterClass parent_class;
-};
-
-GType gst_pyramid_segment_get_type (void);
-
-gboolean gst_pyramid_segment_plugin_init (GstPlugin * plugin);
-
-G_END_DECLS
-#endif /* __GST_PYRAMID_SEGMENT_H__ */
diff --git a/ext/opencv/gstretinex.cpp b/ext/opencv/gstretinex.cpp
index 75842f8..a333914 100644
--- a/ext/opencv/gstretinex.cpp
+++ b/ext/opencv/gstretinex.cpp
@@ -167,10 +167,8 @@
"Multiscale retinex for colour image enhancement",
"Miguel Casas-Sanchez <miguelecasassanchez@gmail.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
}
/* initialize the new element
@@ -294,7 +292,7 @@
int gain = 128;
int offset = 128;
int filter_size;
- Mat icvD (retinex->cvD, false);
+ Mat icvD = cvarrToMat(retinex->cvD, false);
if (!gst_buffer_map (buf, &info, (GstMapFlags) GST_MAP_READWRITE)) {
return GST_FLOW_ERROR;
diff --git a/ext/opencv/gstsegmentation.cpp b/ext/opencv/gstsegmentation.cpp
index e0aa821..472a3c4 100644
--- a/ext/opencv/gstsegmentation.cpp
+++ b/ext/opencv/gstsegmentation.cpp
@@ -91,12 +91,15 @@
#endif
#include "gstsegmentation.h"
-#include <opencv2/video/background_segm.hpp>
#include <opencv2/imgproc/imgproc_c.h>
GST_DEBUG_CATEGORY_STATIC (gst_segmentation_debug);
#define GST_CAT_DEFAULT gst_segmentation_debug
+using namespace cv;
+#if (CV_MAJOR_VERSION >= 3)
+ using namespace cv::bgsegm;
+#endif
/* Filter signals and args */
enum
{
@@ -223,10 +226,8 @@
"Create a Foregound/Background mask applying a particular algorithm",
"Miguel Casas-Sanchez <miguelecasassanchez@gmail.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
}
@@ -779,11 +780,16 @@
int
initialise_mog (GstSegmentation * filter)
{
- filter->img_input_as_cvMat = (void *) new cv::Mat (filter->cvYUV, false);
- filter->img_fg_as_cvMat = (void *) new cv::Mat (filter->cvFG, false);
+ filter->img_input_as_cvMat = (void *) new Mat (cvarrToMat (filter->cvYUV, false));
+ filter->img_fg_as_cvMat = (void *) new Mat (cvarrToMat(filter->cvFG, false));
- filter->mog = (void *) new cv::BackgroundSubtractorMOG ();
- filter->mog2 = (void *) new cv::BackgroundSubtractorMOG2 ();
+#if (CV_MAJOR_VERSION >= 3)
+ filter->mog = bgsegm::createBackgroundSubtractorMOG ();
+ filter->mog2 = createBackgroundSubtractorMOG2 ();
+#else
+ filter->mog = (void *) new BackgroundSubtractorMOG ();
+ filter->mog2 = (void *) new BackgroundSubtractorMOG2 ();
+#endif
return (0);
}
@@ -806,9 +812,15 @@
European Workshop on Advanced Video-Based Surveillance Systems, 2001
*/
- (*((cv::BackgroundSubtractorMOG *) filter->mog)) (*((cv::Mat *) filter->
- img_input_as_cvMat), *((cv::Mat *) filter->img_fg_as_cvMat),
+#if (CV_MAJOR_VERSION >= 3)
+ filter->mog->apply (*((Mat *) filter->
+ img_input_as_cvMat), *((Mat *) filter->img_fg_as_cvMat),
filter->learning_rate);
+#else
+ (*((BackgroundSubtractorMOG *) filter->mog)) (*((Mat *) filter->
+ img_input_as_cvMat), *((Mat *) filter->img_fg_as_cvMat),
+ filter->learning_rate);
+#endif
return (0);
}
@@ -816,10 +828,10 @@
int
run_mog2_iteration (GstSegmentation * filter)
{
- ((cv::Mat *) filter->img_input_as_cvMat)->data =
- (uchar *) filter->cvYUV->imageData;
- ((cv::Mat *) filter->img_fg_as_cvMat)->data =
- (uchar *) filter->cvFG->imageData;
+ ((Mat *) filter->img_input_as_cvMat)->data =
+ (uchar *) filter->cvYUV->imageData;
+ ((Mat *) filter->img_fg_as_cvMat)->data =
+ (uchar *) filter->cvFG->imageData;
/*
BackgroundSubtractorMOG2 [1], Gaussian Mixture-based Background/Foreground
@@ -834,9 +846,15 @@
Letters, vol. 27, no. 7, pages 773-780, 2006.
*/
- (*((cv::BackgroundSubtractorMOG *) filter->mog2)) (*((cv::Mat *) filter->
- img_input_as_cvMat), *((cv::Mat *) filter->img_fg_as_cvMat),
+#if (CV_MAJOR_VERSION >= 3)
+ filter->mog2->apply (*((Mat *) filter->
+ img_input_as_cvMat), *((Mat *) filter->img_fg_as_cvMat),
filter->learning_rate);
+#else
+ (*((BackgroundSubtractorMOG *) filter->mog2)) (*((Mat *) filter->
+ img_input_as_cvMat), *((Mat *) filter->img_fg_as_cvMat),
+ filter->learning_rate);
+#endif
return (0);
}
@@ -844,9 +862,14 @@
int
finalise_mog (GstSegmentation * filter)
{
- delete (cv::Mat *) filter->img_input_as_cvMat;
- delete (cv::Mat *) filter->img_fg_as_cvMat;
- delete (cv::BackgroundSubtractorMOG *) filter->mog;
- delete (cv::BackgroundSubtractorMOG2 *) filter->mog2;
+ delete (Mat *) filter->img_input_as_cvMat;
+ delete (Mat *) filter->img_fg_as_cvMat;
+#if (CV_MAJOR_VERSION >= 3)
+ filter->mog.release ();
+ filter->mog2.release ();
+#else
+ delete (BackgroundSubtractorMOG *) filter->mog;
+ delete (BackgroundSubtractorMOG2 *) filter->mog2;
+#endif
return (0);
}
diff --git a/ext/opencv/gstsegmentation.h b/ext/opencv/gstsegmentation.h
index 9400853..982e2ba 100644
--- a/ext/opencv/gstsegmentation.h
+++ b/ext/opencv/gstsegmentation.h
@@ -47,7 +47,11 @@
#include <gst/gst.h>
#include <gst/video/gstvideofilter.h>
#include <opencv2/core/core_c.h>
-
+#include <opencv2/video/background_segm.hpp>
+#include <opencv2/core/version.hpp>
+#if (CV_MAJOR_VERSION >= 3)
+ #include <opencv2/bgsegm.hpp>
+#endif
G_BEGIN_DECLS
@@ -107,8 +111,13 @@
CvSeq *contours;
/* for MOG methods */
+#if (CV_MAJOR_VERSION >= 3)
+ cv::Ptr<cv::BackgroundSubtractor> mog; /* cv::BackgroundSubtractorMOG */
+ cv::Ptr<cv::BackgroundSubtractorMOG2> mog2; /* cv::BackgroundSubtractorMOG2 */
+#else
void *mog; /* cv::BackgroundSubtractorMOG */
void *mog2; /* cv::BackgroundSubtractorMOG2 */
+#endif
void *img_input_as_cvMat; /* cv::Mat */
void *img_fg_as_cvMat; /* cv::Mat */
double learning_rate;
diff --git a/ext/opencv/gstskindetect.cpp b/ext/opencv/gstskindetect.cpp
index aade23c..e2fcb59 100644
--- a/ext/opencv/gstskindetect.cpp
+++ b/ext/opencv/gstskindetect.cpp
@@ -60,7 +60,6 @@
#include "gstskindetect.h"
#include <opencv2/imgproc/imgproc_c.h>
-#include <opencv2/legacy/compat.hpp>
GST_DEBUG_CATEGORY_STATIC (gst_skin_detect_debug);
#define GST_CAT_DEFAULT gst_skin_detect_debug
@@ -163,10 +162,8 @@
"Performs non-parametric skin detection on input",
"Miguel Casas-Sanchez <miguelecasassanchez@gmail.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
basesrc_class->stop = gst_skin_detect_stop;
gstopencvbasefilter_class->cv_set_caps = gst_skin_detect_set_caps;
@@ -341,7 +338,7 @@
cvCvtColor (filter->cvSkinPixels1, filter->cvRGB, CV_GRAY2RGB);
} else if (RGB == filter->method) {
- cvCvtPixToPlane (filter->cvRGB, filter->cvR, filter->cvG, filter->cvB, 0); /* Extract the 3 color components. */
+ cvSplit (filter->cvRGB, filter->cvR, filter->cvG, filter->cvB, 0); /* Extract the 3 color components. */
cvAdd (filter->cvR, filter->cvG, filter->cvAll, NULL);
cvAdd (filter->cvB, filter->cvAll, filter->cvAll, NULL); /* All = R + G + B */
cvDiv (filter->cvR, filter->cvAll, filter->cvRp, 1.0); /* R' = R / ( R + G + B) */
diff --git a/ext/opencv/gsttemplatematch.cpp b/ext/opencv/gsttemplatematch.cpp
index 1223066..f39208d 100644
--- a/ext/opencv/gsttemplatematch.cpp
+++ b/ext/opencv/gsttemplatematch.cpp
@@ -147,10 +147,8 @@
"Performs template matching on videos and images, providing detected positions via bus messages.",
"Noam Lewis <jones.noamle@gmail.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
}
/* initialize the new element
diff --git a/ext/opencv/gsttextoverlay.cpp b/ext/opencv/gsttextoverlay.cpp
index 7025b36..e3dc518 100644
--- a/ext/opencv/gsttextoverlay.cpp
+++ b/ext/opencv/gsttextoverlay.cpp
@@ -211,10 +211,8 @@
"Filter/Effect/Video",
"Write text on the top of video", "sreerenj<bsreerenj@gmail.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
}
diff --git a/ext/opencv/gsttextoverlay.h b/ext/opencv/gsttextoverlay.h
index 65a7d75..13d09fa 100644
--- a/ext/opencv/gsttextoverlay.h
+++ b/ext/opencv/gsttextoverlay.h
@@ -48,6 +48,9 @@
#include <gstopencvvideofilter.h>
#include <opencv2/core/core_c.h>
+#if (CV_MAJOR_VERSION >= 3)
+#include <opencv2/imgproc/imgproc_c.h>
+#endif
G_BEGIN_DECLS
/* #defines don't like whitespacey bits */
diff --git a/ext/openexr/Makefile.in b/ext/openexr/Makefile.in
index e215e01..8ac7422 100644
--- a/ext/openexr/Makefile.in
+++ b/ext/openexr/Makefile.in
@@ -322,6 +322,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -343,6 +345,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -392,6 +396,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -537,6 +543,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -663,8 +671,6 @@
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@
@@ -707,8 +713,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/openexr/gstopenexrdec.cpp b/ext/openexr/gstopenexrdec.cpp
index a334b0a..8ee4598 100644
--- a/ext/openexr/gstopenexrdec.cpp
+++ b/ext/openexr/gstopenexrdec.cpp
@@ -122,10 +122,8 @@
element_class = (GstElementClass *) klass;
video_decoder_class = (GstVideoDecoderClass *) klass;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_openexr_dec_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_openexr_dec_sink_template));
+ gst_element_class_add_static_pad_template (element_class, &gst_openexr_dec_src_template);
+ gst_element_class_add_static_pad_template (element_class, &gst_openexr_dec_sink_template);
gst_element_class_set_static_metadata (element_class,
"OpenEXR decoder",
diff --git a/ext/openh264/Makefile.in b/ext/openh264/Makefile.in
index 6d37604..c1d96e5 100644
--- a/ext/openh264/Makefile.in
+++ b/ext/openh264/Makefile.in
@@ -322,6 +322,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -343,6 +345,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -392,6 +396,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -537,6 +543,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -663,8 +671,6 @@
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@
@@ -707,8 +713,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/openh264/gstopenh264dec.cpp b/ext/openh264/gstopenh264dec.cpp
index a10e38e..8fad292 100644
--- a/ext/openh264/gstopenh264dec.cpp
+++ b/ext/openh264/gstopenh264dec.cpp
@@ -27,32 +27,16 @@
#include "config.h"
#endif
-#include <wels/codec_api.h>
-#include <wels/codec_app_def.h>
-#include <wels/codec_def.h>
-
#include "gstopenh264dec.h"
#include <gst/gst.h>
#include <gst/video/video.h>
#include <gst/video/gstvideodecoder.h>
#include <string.h> /* for memcpy */
-
-#define GST_OPENH264DEC_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ( \
- (obj), GST_TYPE_OPENH264DEC, \
- GstOpenh264DecPrivate))
-
GST_DEBUG_CATEGORY_STATIC (gst_openh264dec_debug_category);
#define GST_CAT_DEFAULT gst_openh264dec_debug_category
/* prototypes */
-
-
-static void gst_openh264dec_set_property (GObject * object,
- guint property_id, const GValue * value, GParamSpec * pspec);
-static void gst_openh264dec_get_property (GObject * object, guint property_id,
- GValue * value, GParamSpec * pspec);
-
static gboolean gst_openh264dec_start (GstVideoDecoder * decoder);
static gboolean gst_openh264dec_stop (GstVideoDecoder * decoder);
@@ -66,19 +50,6 @@
static gboolean gst_openh264dec_decide_allocation (GstVideoDecoder * decoder,
GstQuery * query);
-enum
-{
- PROP_0,
- N_PROPERTIES
-};
-
-struct _GstOpenh264DecPrivate
-{
- ISVCDecoder *decoder;
- GstVideoCodecState *input_state;
- guint width, height;
-};
-
/* pad templates */
static GstStaticPadTemplate gst_openh264dec_sink_template =
@@ -86,7 +57,8 @@
GST_PAD_SINK,
GST_PAD_ALWAYS,
GST_STATIC_CAPS
- ("video/x-h264, stream-format=(string)byte-stream, alignment=(string)au,profile=(string){constrained-baseline,baseline}"));
+ ("video/x-h264, stream-format=(string)byte-stream, alignment=(string)au, "
+ "profile=(string){ constrained-baseline, baseline}"));
static GstStaticPadTemplate gst_openh264dec_src_template =
GST_STATIC_PAD_TEMPLATE ("src",
@@ -104,23 +76,16 @@
static void
gst_openh264dec_class_init (GstOpenh264DecClass * klass)
{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GstVideoDecoderClass *video_decoder_class = GST_VIDEO_DECODER_CLASS (klass);
- g_type_class_add_private (klass, sizeof (GstOpenh264DecPrivate));
-
- /* Setting up pads and setting metadata should be moved to
- base_class_init if you intend to subclass this class. */
- gst_element_class_add_pad_template (GST_ELEMENT_CLASS (klass),
- gst_static_pad_template_get (&gst_openh264dec_sink_template));
- gst_element_class_add_pad_template (GST_ELEMENT_CLASS (klass),
- gst_static_pad_template_get (&gst_openh264dec_src_template));
+ gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS (klass),
+ &gst_openh264dec_sink_template);
+ gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS (klass),
+ &gst_openh264dec_src_template);
gst_element_class_set_static_metadata (GST_ELEMENT_CLASS (klass),
"OpenH264 video decoder", "Decoder/Video", "OpenH264 video decoder",
"Ericsson AB, http://www.ericsson.com");
- gobject_class->set_property = gst_openh264dec_set_property;
- gobject_class->get_property = gst_openh264dec_get_property;
video_decoder_class->start = GST_DEBUG_FUNCPTR (gst_openh264dec_start);
video_decoder_class->stop = GST_DEBUG_FUNCPTR (gst_openh264dec_stop);
@@ -138,43 +103,12 @@
static void
gst_openh264dec_init (GstOpenh264Dec * openh264dec)
{
- openh264dec->priv = GST_OPENH264DEC_GET_PRIVATE (openh264dec);
- openh264dec->priv->decoder = NULL;
+ openh264dec->decoder = NULL;
gst_video_decoder_set_packetized (GST_VIDEO_DECODER (openh264dec), TRUE);
gst_video_decoder_set_needs_format (GST_VIDEO_DECODER (openh264dec), TRUE);
}
-void
-gst_openh264dec_set_property (GObject * object, guint property_id,
- const GValue * value, GParamSpec * pspec)
-{
- GstOpenh264Dec *openh264dec = GST_OPENH264DEC (object);
-
- GST_DEBUG_OBJECT (openh264dec, "set_property");
-
- switch (property_id) {
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-void
-gst_openh264dec_get_property (GObject * object, guint property_id,
- GValue * value, GParamSpec * pspec)
-{
- GstOpenh264Dec *openh264dec = GST_OPENH264DEC (object);
-
- GST_DEBUG_OBJECT (openh264dec, "get_property");
-
- switch (property_id) {
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
static gboolean
gst_openh264dec_start (GstVideoDecoder * decoder)
{
@@ -182,12 +116,12 @@
gint ret;
SDecodingParam dec_param = { 0 };
- if (openh264dec->priv->decoder != NULL) {
- openh264dec->priv->decoder->Uninitialize ();
- WelsDestroyDecoder (openh264dec->priv->decoder);
- openh264dec->priv->decoder = NULL;
+ if (openh264dec->decoder != NULL) {
+ openh264dec->decoder->Uninitialize ();
+ WelsDestroyDecoder (openh264dec->decoder);
+ openh264dec->decoder = NULL;
}
- WelsCreateDecoder (&(openh264dec->priv->decoder));
+ WelsCreateDecoder (&(openh264dec->decoder));
dec_param.uiTargetDqLayer = 255;
dec_param.eEcActiveIdc = ERROR_CON_FRAME_COPY;
@@ -196,7 +130,7 @@
#endif
dec_param.sVideoProperty.eVideoBsType = VIDEO_BITSTREAM_AVC;
- ret = openh264dec->priv->decoder->Initialize (&dec_param);
+ ret = openh264dec->decoder->Initialize (&dec_param);
GST_DEBUG_OBJECT (openh264dec,
"openh264_dec_start called, openh264dec %sinitialized OK!",
@@ -210,17 +144,17 @@
{
GstOpenh264Dec *openh264dec = GST_OPENH264DEC (decoder);
- if (openh264dec->priv->decoder) {
- openh264dec->priv->decoder->Uninitialize ();
- WelsDestroyDecoder (openh264dec->priv->decoder);
- openh264dec->priv->decoder = NULL;
+ if (openh264dec->decoder) {
+ openh264dec->decoder->Uninitialize ();
+ WelsDestroyDecoder (openh264dec->decoder);
+ openh264dec->decoder = NULL;
}
- if (openh264dec->priv->input_state) {
- gst_video_codec_state_unref (openh264dec->priv->input_state);
- openh264dec->priv->input_state = NULL;
+ if (openh264dec->input_state) {
+ gst_video_codec_state_unref (openh264dec->input_state);
+ openh264dec->input_state = NULL;
}
- openh264dec->priv->width = openh264dec->priv->height = 0;
+ openh264dec->width = openh264dec->height = 0;
return TRUE;
}
@@ -231,14 +165,13 @@
{
GstOpenh264Dec *openh264dec = GST_OPENH264DEC (decoder);
- GST_DEBUG_OBJECT (openh264dec,
- "openh264_dec_set_format called, caps: %" GST_PTR_FORMAT, state->caps);
+ GST_DEBUG_OBJECT (openh264dec, "input caps: %" GST_PTR_FORMAT, state->caps);
- if (openh264dec->priv->input_state) {
- gst_video_codec_state_unref (openh264dec->priv->input_state);
- openh264dec->priv->input_state = NULL;
+ if (openh264dec->input_state) {
+ gst_video_codec_state_unref (openh264dec->input_state);
+ openh264dec->input_state = NULL;
}
- openh264dec->priv->input_state = gst_video_codec_state_ref (state);
+ openh264dec->input_state = gst_video_codec_state_ref (state);
return TRUE;
}
@@ -282,7 +215,7 @@
memset (&dst_buf_info, 0, sizeof (SBufferInfo));
ret =
- openh264dec->priv->decoder->DecodeFrame2 (map_info.data, map_info.size,
+ openh264dec->decoder->DecodeFrame2 (map_info.data, map_info.size,
yuvdata, &dst_buf_info);
if (ret == dsNoParamSets) {
@@ -305,9 +238,7 @@
frame = NULL;
} else {
memset (&dst_buf_info, 0, sizeof (SBufferInfo));
- ret =
- openh264dec->priv->decoder->DecodeFrame2 (NULL, 0, yuvdata,
- &dst_buf_info);
+ ret = openh264dec->decoder->DecodeFrame2 (NULL, 0, yuvdata, &dst_buf_info);
if (ret != dsErrorFree) {
gst_video_codec_frame_unref (frame);
return GST_FLOW_EOS;
@@ -334,13 +265,13 @@
actual_height = dst_buf_info.UsrData.sSystemBuffer.iHeight;
if (!gst_pad_has_current_caps (GST_VIDEO_DECODER_SRC_PAD (openh264dec))
- || actual_width != openh264dec->priv->width
- || actual_height != openh264dec->priv->height) {
+ || actual_width != openh264dec->width
+ || actual_height != openh264dec->height) {
state =
gst_video_decoder_set_output_state (decoder, GST_VIDEO_FORMAT_I420,
- actual_width, actual_height, openh264dec->priv->input_state);
- openh264dec->priv->width = actual_width;
- openh264dec->priv->height = actual_height;
+ actual_width, actual_height, openh264dec->input_state);
+ openh264dec->width = actual_width;
+ openh264dec->height = actual_height;
if (!gst_video_decoder_negotiate (decoder)) {
GST_ERROR_OBJECT (openh264dec,
@@ -397,7 +328,7 @@
GST_DEBUG_OBJECT (openh264dec, "finish");
/* Decoder not negotiated yet */
- if (openh264dec->priv->width == 0)
+ if (openh264dec->width == 0)
return GST_FLOW_OK;
/* Drain all pending frames */
diff --git a/ext/openh264/gstopenh264dec.h b/ext/openh264/gstopenh264dec.h
index 3d56ab4..7d045b8 100644
--- a/ext/openh264/gstopenh264dec.h
+++ b/ext/openh264/gstopenh264dec.h
@@ -33,7 +33,12 @@
#include <gst/video/video.h>
#include <gst/video/gstvideodecoder.h>
+#include <wels/codec_api.h>
+#include <wels/codec_app_def.h>
+#include <wels/codec_def.h>
+
G_BEGIN_DECLS
+
#define GST_TYPE_OPENH264DEC (gst_openh264dec_get_type())
#define GST_OPENH264DEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OPENH264DEC,GstOpenh264Dec))
#define GST_OPENH264DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OPENH264DEC,GstOpenh264DecClass))
@@ -42,14 +47,15 @@
typedef struct _GstOpenh264Dec GstOpenh264Dec;
typedef struct _GstOpenh264DecClass GstOpenh264DecClass;
-typedef struct _GstOpenh264DecPrivate GstOpenh264DecPrivate;
struct _GstOpenh264Dec
{
- GstVideoDecoder base_openh264dec;
+ GstVideoDecoder base_openh264dec;
- /*< private >*/
- GstOpenh264DecPrivate *priv;
+ /*< private >*/
+ ISVCDecoder *decoder;
+ GstVideoCodecState *input_state;
+ guint width, height;
};
struct _GstOpenh264DecClass
diff --git a/ext/openh264/gstopenh264enc.cpp b/ext/openh264/gstopenh264enc.cpp
index 8411e37..a5e488f 100644
--- a/ext/openh264/gstopenh264enc.cpp
+++ b/ext/openh264/gstopenh264enc.cpp
@@ -35,14 +35,6 @@
#include <gst/video/gstvideoencoder.h>
#include <string.h>
-#include <wels/codec_api.h>
-#include <wels/codec_app_def.h>
-#include <wels/codec_def.h>
-#include <wels/codec_ver.h>
-
-#define GST_OPENH264ENC_GET_PRIVATE(obj) \
- (G_TYPE_INSTANCE_GET_PRIVATE((obj), GST_TYPE_OPENH264ENC, GstOpenh264EncPrivate))
-
GST_DEBUG_CATEGORY_STATIC (gst_openh264enc_debug_category);
#define GST_CAT_DEFAULT gst_openh264enc_debug_category
@@ -77,7 +69,8 @@
static const GEnumValue rc_modes_types[] = {
{RC_QUALITY_MODE, "Quality mode", "quality"},
{RC_BITRATE_MODE, "Bitrate mode", "bitrate"},
- {RC_BUFFERBASED_MODE, "No bitrate control, just using buffer status", "buffer"},
+ {RC_BUFFERBASED_MODE, "No bitrate control, just using buffer status",
+ "buffer"},
{RC_OFF_MODE, "Rate control off mode", "off"},
{0, NULL, NULL},
};
@@ -88,13 +81,6 @@
return rc_modes_type;
}
-typedef enum _GstOpenh264encDeblockingMode
-{
- GST_OPENH264_DEBLOCKING_ON = 0,
- GST_OPENH264_DEBLOCKING_OFF = 1,
- GST_OPENH264_DEBLOCKING_NOT_SLICE_BOUNDARIES = 2
-} GstOpenh264encDeblockingMode;
-
#define GST_TYPE_OPENH264ENC_DEBLOCKING_MODE (gst_openh264enc_deblocking_mode_get_type ())
static GType
gst_openh264enc_deblocking_mode_get_type (void)
@@ -108,9 +94,9 @@
};
static gsize id = 0;
- if (g_once_init_enter (& id)) {
+ if (g_once_init_enter (&id)) {
GType _id = g_enum_register_static ("GstOpenh264encDeblockingModes", types);
- g_once_init_leave (& id, _id);
+ g_once_init_leave (&id, _id);
}
return (GType) id;
@@ -128,7 +114,7 @@
static gsize id = 0;
if (g_once_init_enter (&id)) {
- GType _id = g_enum_register_static ("GstOpenh264EncSliceMode", types);
+ GType _id = g_enum_register_static ("GstOpenh264EncSliceModes", types);
g_once_init_leave (&id, _id);
}
@@ -147,9 +133,9 @@
};
static gsize id = 0;
- if (g_once_init_enter (& id)) {
+ if (g_once_init_enter (&id)) {
GType _id = g_enum_register_static ("GstOpenh264encComplexity", types);
- g_once_init_leave (& id, _id);
+ g_once_init_leave (&id, _id);
}
return (GType) id;
@@ -178,9 +164,9 @@
#define DEFAULT_BITRATE (128000)
+#define DEFAULT_MAX_BITRATE (UNSPECIFIED_BIT_RATE)
#define DEFAULT_GOP_SIZE (90)
#define DEFAULT_MAX_SLICE_SIZE (1500000)
-#define DROP_BITRATE 20000
#define START_FRAMERATE 30
#define DEFAULT_USAGE_TYPE CAMERA_VIDEO_REAL_TIME
#define DEFAULT_RATE_CONTROL RC_QUALITY_MODE
@@ -200,6 +186,7 @@
PROP_0,
PROP_USAGE_TYPE,
PROP_BITRATE,
+ PROP_MAX_BITRATE,
PROP_GOP_SIZE,
PROP_MAX_SLICE_SIZE,
PROP_RATE_CONTROL,
@@ -216,32 +203,6 @@
N_PROPERTIES
};
-struct _GstOpenh264EncPrivate
-{
- ISVCEncoder *encoder;
- EUsageType usage_type;
- guint gop_size;
- RC_MODES rate_control;
- guint max_slice_size;
- guint bitrate;
- guint framerate;
- guint multi_thread;
- gboolean enable_denoise;
- gboolean enable_frame_skip;
- GstVideoCodecState *input_state;
- guint32 drop_bitrate;
- guint64 time_per_frame;
- guint64 frame_count;
- guint64 previous_timestamp;
- GstOpenh264encDeblockingMode deblocking_mode;
- gboolean background_detection;
- gboolean adaptive_quantization;
- gboolean scene_change_detection;
- GstOpenh264EncSliceMode slice_mode;
- guint num_slices;
- ECOMPLEXITY_MODE complexity;
-};
-
/* pad templates */
static GstStaticPadTemplate gst_openh264enc_sink_template =
@@ -273,14 +234,12 @@
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GstVideoEncoderClass *video_encoder_class = GST_VIDEO_ENCODER_CLASS (klass);
- g_type_class_add_private (klass, sizeof (GstOpenh264EncPrivate));
-
/* Setting up pads and setting metadata should be moved to
base_class_init if you intend to subclass this class. */
- gst_element_class_add_pad_template (GST_ELEMENT_CLASS (klass),
- gst_static_pad_template_get (&gst_openh264enc_src_template));
- gst_element_class_add_pad_template (GST_ELEMENT_CLASS (klass),
- gst_static_pad_template_get (&gst_openh264enc_sink_template));
+ gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS (klass),
+ &gst_openh264enc_src_template);
+ gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS (klass),
+ &gst_openh264enc_sink_template);
gst_element_class_set_static_metadata (GST_ELEMENT_CLASS (klass),
"OpenH264 video encoder", "Encoder/Video", "OpenH264 video encoder",
@@ -334,6 +293,12 @@
0, G_MAXUINT, DEFAULT_BITRATE,
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
+ g_object_class_install_property (gobject_class, PROP_MAX_BITRATE,
+ g_param_spec_uint ("max-bitrate", "Max Bitrate",
+ "Maximum Bitrate (in bits per second)",
+ 0, G_MAXUINT, DEFAULT_MAX_BITRATE,
+ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
+
g_object_class_install_property (gobject_class, PROP_GOP_SIZE,
g_param_spec_uint ("gop-size", "GOP size",
"Number of frames between intra frames",
@@ -380,37 +345,36 @@
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_COMPLEXITY,
- g_param_spec_enum ("complexity", "Complexity / quality / speed tradeoff", "Complexity",
- GST_TYPE_OPENH264ENC_COMPLEXITY, DEFAULT_COMPLEXITY,
+ g_param_spec_enum ("complexity", "Complexity / quality / speed tradeoff",
+ "Complexity", GST_TYPE_OPENH264ENC_COMPLEXITY, DEFAULT_COMPLEXITY,
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
}
static void
gst_openh264enc_init (GstOpenh264Enc * openh264enc)
{
- openh264enc->priv = GST_OPENH264ENC_GET_PRIVATE (openh264enc);
- openh264enc->priv->gop_size = DEFAULT_GOP_SIZE;
- openh264enc->priv->usage_type = DEFAULT_USAGE_TYPE;
- openh264enc->priv->rate_control = DEFAULT_RATE_CONTROL;
- openh264enc->priv->multi_thread = DEFAULT_MULTI_THREAD;
- openh264enc->priv->max_slice_size = DEFAULT_MAX_SLICE_SIZE;
- openh264enc->priv->bitrate = DEFAULT_BITRATE;
- openh264enc->priv->framerate = START_FRAMERATE;
- openh264enc->priv->input_state = NULL;
- openh264enc->priv->time_per_frame = GST_SECOND / openh264enc->priv->framerate;
- openh264enc->priv->frame_count = 0;
- openh264enc->priv->previous_timestamp = 0;
- openh264enc->priv->drop_bitrate = DROP_BITRATE;
- openh264enc->priv->enable_denoise = DEFAULT_ENABLE_DENOISE;
- openh264enc->priv->enable_frame_skip = DEFAULT_ENABLE_FRAME_SKIP;
- openh264enc->priv->deblocking_mode = DEFAULT_DEBLOCKING_MODE;
- openh264enc->priv->background_detection = DEFAULT_BACKGROUND_DETECTION;
- openh264enc->priv->adaptive_quantization = DEFAULT_ADAPTIVE_QUANTIZATION;
- openh264enc->priv->scene_change_detection = DEFAULT_SCENE_CHANGE_DETECTION;
- openh264enc->priv->slice_mode = DEFAULT_SLICE_MODE;
- openh264enc->priv->num_slices = DEFAULT_NUM_SLICES;
- openh264enc->priv->encoder = NULL;
- openh264enc->priv->complexity = DEFAULT_COMPLEXITY;
+ openh264enc->gop_size = DEFAULT_GOP_SIZE;
+ openh264enc->usage_type = DEFAULT_USAGE_TYPE;
+ openh264enc->rate_control = DEFAULT_RATE_CONTROL;
+ openh264enc->multi_thread = DEFAULT_MULTI_THREAD;
+ openh264enc->max_slice_size = DEFAULT_MAX_SLICE_SIZE;
+ openh264enc->bitrate = DEFAULT_BITRATE;
+ openh264enc->max_bitrate = DEFAULT_MAX_BITRATE;
+ openh264enc->framerate = START_FRAMERATE;
+ openh264enc->input_state = NULL;
+ openh264enc->time_per_frame = GST_SECOND / openh264enc->framerate;
+ openh264enc->frame_count = 0;
+ openh264enc->previous_timestamp = 0;
+ openh264enc->enable_denoise = DEFAULT_ENABLE_DENOISE;
+ openh264enc->enable_frame_skip = DEFAULT_ENABLE_FRAME_SKIP;
+ openh264enc->deblocking_mode = DEFAULT_DEBLOCKING_MODE;
+ openh264enc->background_detection = DEFAULT_BACKGROUND_DETECTION;
+ openh264enc->adaptive_quantization = DEFAULT_ADAPTIVE_QUANTIZATION;
+ openh264enc->scene_change_detection = DEFAULT_SCENE_CHANGE_DETECTION;
+ openh264enc->slice_mode = DEFAULT_SLICE_MODE;
+ openh264enc->num_slices = DEFAULT_NUM_SLICES;
+ openh264enc->encoder = NULL;
+ openh264enc->complexity = DEFAULT_COMPLEXITY;
gst_openh264enc_set_usage_type (openh264enc, CAMERA_VIDEO_REAL_TIME);
gst_openh264enc_set_rate_control (openh264enc, RC_QUALITY_MODE);
}
@@ -420,10 +384,10 @@
{
switch (usage_type) {
case CAMERA_VIDEO_REAL_TIME:
- openh264enc->priv->usage_type = CAMERA_VIDEO_REAL_TIME;
+ openh264enc->usage_type = CAMERA_VIDEO_REAL_TIME;
break;
case SCREEN_CONTENT_REAL_TIME:
- openh264enc->priv->usage_type = SCREEN_CONTENT_REAL_TIME;
+ openh264enc->usage_type = SCREEN_CONTENT_REAL_TIME;
break;
default:
g_assert_not_reached ();
@@ -435,16 +399,16 @@
{
switch (rc_mode) {
case RC_QUALITY_MODE:
- openh264enc->priv->rate_control = RC_QUALITY_MODE;
+ openh264enc->rate_control = RC_QUALITY_MODE;
break;
case RC_BITRATE_MODE:
- openh264enc->priv->rate_control = RC_BITRATE_MODE;
+ openh264enc->rate_control = RC_BITRATE_MODE;
break;
case RC_BUFFERBASED_MODE:
- openh264enc->priv->rate_control = RC_BUFFERBASED_MODE;
+ openh264enc->rate_control = RC_BUFFERBASED_MODE;
break;
case RC_OFF_MODE:
- openh264enc->priv->rate_control = RC_OFF_MODE;
+ openh264enc->rate_control = RC_OFF_MODE;
break;
default:
g_assert_not_reached ();
@@ -461,11 +425,15 @@
switch (property_id) {
case PROP_BITRATE:
- openh264enc->priv->bitrate = g_value_get_uint (value);
+ openh264enc->bitrate = g_value_get_uint (value);
+ break;
+
+ case PROP_MAX_BITRATE:
+ openh264enc->max_bitrate = g_value_get_uint (value);
break;
case PROP_MULTI_THREAD:
- openh264enc->priv->multi_thread = g_value_get_uint (value);
+ openh264enc->multi_thread = g_value_get_uint (value);
break;
case PROP_USAGE_TYPE:
@@ -473,11 +441,11 @@
break;
case PROP_ENABLE_DENOISE:
- openh264enc->priv->enable_denoise = g_value_get_boolean (value);
+ openh264enc->enable_denoise = g_value_get_boolean (value);
break;
case PROP_ENABLE_FRAME_SKIP:
- openh264enc->priv->enable_frame_skip = g_value_get_boolean (value);
+ openh264enc->enable_frame_skip = g_value_get_boolean (value);
break;
case PROP_RATE_CONTROL:
@@ -485,40 +453,40 @@
break;
case PROP_GOP_SIZE:
- openh264enc->priv->gop_size = g_value_get_uint (value);
+ openh264enc->gop_size = g_value_get_uint (value);
break;
case PROP_MAX_SLICE_SIZE:
- openh264enc->priv->max_slice_size = g_value_get_uint (value);
+ openh264enc->max_slice_size = g_value_get_uint (value);
break;
case PROP_DEBLOCKING_MODE:
- openh264enc->priv->deblocking_mode =
+ openh264enc->deblocking_mode =
(GstOpenh264encDeblockingMode) g_value_get_enum (value);
break;
case PROP_BACKGROUND_DETECTION:
- openh264enc->priv->background_detection = g_value_get_boolean (value);
+ openh264enc->background_detection = g_value_get_boolean (value);
break;
case PROP_ADAPTIVE_QUANTIZATION:
- openh264enc->priv->adaptive_quantization = g_value_get_boolean (value);
+ openh264enc->adaptive_quantization = g_value_get_boolean (value);
break;
case PROP_SCENE_CHANGE_DETECTION:
- openh264enc->priv->scene_change_detection = g_value_get_boolean (value);
+ openh264enc->scene_change_detection = g_value_get_boolean (value);
break;
case PROP_SLICE_MODE:
- openh264enc->priv->slice_mode = (GstOpenh264EncSliceMode) g_value_get_enum (value);
+ openh264enc->slice_mode = (GstOpenh264EncSliceMode) g_value_get_enum (value);
break;
case PROP_NUM_SLICES:
- openh264enc->priv->num_slices = g_value_get_uint (value);
+ openh264enc->num_slices = g_value_get_uint (value);
break;
case PROP_COMPLEXITY:
- openh264enc->priv->complexity = (ECOMPLEXITY_MODE) g_value_get_enum (value);
+ openh264enc->complexity = (ECOMPLEXITY_MODE) g_value_get_enum (value);
break;
default:
@@ -537,63 +505,67 @@
switch (property_id) {
case PROP_USAGE_TYPE:
- g_value_set_enum (value, openh264enc->priv->usage_type);
+ g_value_set_enum (value, openh264enc->usage_type);
break;
case PROP_RATE_CONTROL:
- g_value_set_enum (value, openh264enc->priv->rate_control);
+ g_value_set_enum (value, openh264enc->rate_control);
break;
case PROP_BITRATE:
- g_value_set_uint (value, openh264enc->priv->bitrate);
+ g_value_set_uint (value, openh264enc->bitrate);
+ break;
+
+ case PROP_MAX_BITRATE:
+ g_value_set_uint (value, openh264enc->max_bitrate);
break;
case PROP_ENABLE_DENOISE:
- g_value_set_boolean (value, openh264enc->priv->enable_denoise);
+ g_value_set_boolean (value, openh264enc->enable_denoise);
break;
case PROP_ENABLE_FRAME_SKIP:
- g_value_set_boolean (value, openh264enc->priv->enable_frame_skip);
+ g_value_set_boolean (value, openh264enc->enable_frame_skip);
break;
case PROP_MULTI_THREAD:
- g_value_set_uint (value, openh264enc->priv->multi_thread);
+ g_value_set_uint (value, openh264enc->multi_thread);
break;
case PROP_GOP_SIZE:
- g_value_set_uint (value, openh264enc->priv->gop_size);
+ g_value_set_uint (value, openh264enc->gop_size);
break;
case PROP_MAX_SLICE_SIZE:
- g_value_set_uint (value, openh264enc->priv->max_slice_size);
+ g_value_set_uint (value, openh264enc->max_slice_size);
break;
case PROP_DEBLOCKING_MODE:
- g_value_set_enum (value, openh264enc->priv->deblocking_mode);
+ g_value_set_enum (value, openh264enc->deblocking_mode);
break;
case PROP_BACKGROUND_DETECTION:
- g_value_set_boolean (value, openh264enc->priv->background_detection);
+ g_value_set_boolean (value, openh264enc->background_detection);
break;
case PROP_ADAPTIVE_QUANTIZATION:
- g_value_set_boolean (value, openh264enc->priv->adaptive_quantization);
+ g_value_set_boolean (value, openh264enc->adaptive_quantization);
break;
case PROP_SCENE_CHANGE_DETECTION:
- g_value_set_boolean (value, openh264enc->priv->scene_change_detection);
+ g_value_set_boolean (value, openh264enc->scene_change_detection);
break;
case PROP_SLICE_MODE:
- g_value_set_enum (value, openh264enc->priv->slice_mode);
+ g_value_set_enum (value, openh264enc->slice_mode);
break;
case PROP_NUM_SLICES:
- g_value_set_uint (value, openh264enc->priv->num_slices);
+ g_value_set_uint (value, openh264enc->num_slices);
break;
case PROP_COMPLEXITY:
- g_value_set_enum (value, openh264enc->priv->complexity);
+ g_value_set_enum (value, openh264enc->complexity);
break;
default:
@@ -611,10 +583,10 @@
/* clean up object here */
- if (openh264enc->priv->input_state) {
- gst_video_codec_state_unref (openh264enc->priv->input_state);
+ if (openh264enc->input_state) {
+ gst_video_codec_state_unref (openh264enc->input_state);
}
- openh264enc->priv->input_state = NULL;
+ openh264enc->input_state = NULL;
G_OBJECT_CLASS (gst_openh264enc_parent_class)->finalize (object);
}
@@ -635,17 +607,17 @@
openh264enc = GST_OPENH264ENC (encoder);
- if (openh264enc->priv->encoder != NULL) {
- openh264enc->priv->encoder->Uninitialize ();
- WelsDestroySVCEncoder (openh264enc->priv->encoder);
- openh264enc->priv->encoder = NULL;
+ if (openh264enc->encoder != NULL) {
+ openh264enc->encoder->Uninitialize ();
+ WelsDestroySVCEncoder (openh264enc->encoder);
+ openh264enc->encoder = NULL;
}
- openh264enc->priv->encoder = NULL;
+ openh264enc->encoder = NULL;
- if (openh264enc->priv->input_state) {
- gst_video_codec_state_unref (openh264enc->priv->input_state);
+ if (openh264enc->input_state) {
+ gst_video_codec_state_unref (openh264enc->input_state);
}
- openh264enc->priv->input_state = NULL;
+ openh264enc->input_state = NULL;
GST_DEBUG_OBJECT (openh264enc, "openh264_enc_stop called");
@@ -658,7 +630,6 @@
GstVideoCodecState * state)
{
GstOpenh264Enc *openh264enc = GST_OPENH264ENC (encoder);
- GstOpenh264EncPrivate *priv = openh264enc->priv;
gchar *debug_caps;
guint width, height, fps_n, fps_d;
SEncParamExt enc_params;
@@ -667,7 +638,7 @@
gint ret;
GstCaps *outcaps;
GstVideoCodecState *output_state;
- openh264enc->priv->frame_count = 0;
+ openh264enc->frame_count = 0;
int video_format = videoFormatI420;
debug_caps = gst_caps_to_string (state->caps);
@@ -677,45 +648,44 @@
gst_openh264enc_stop (encoder);
- if (priv->input_state) {
- gst_video_codec_state_unref (priv->input_state);
+ if (openh264enc->input_state) {
+ gst_video_codec_state_unref (openh264enc->input_state);
}
- priv->input_state = gst_video_codec_state_ref (state);
+ openh264enc->input_state = gst_video_codec_state_ref (state);
width = GST_VIDEO_INFO_WIDTH (&state->info);
height = GST_VIDEO_INFO_HEIGHT (&state->info);
fps_n = GST_VIDEO_INFO_FPS_N (&state->info);
fps_d = GST_VIDEO_INFO_FPS_D (&state->info);
- if (priv->encoder != NULL) {
- priv->encoder->Uninitialize ();
- WelsDestroySVCEncoder (priv->encoder);
- priv->encoder = NULL;
+ if (openh264enc->encoder != NULL) {
+ openh264enc->encoder->Uninitialize ();
+ WelsDestroySVCEncoder (openh264enc->encoder);
+ openh264enc->encoder = NULL;
}
- WelsCreateSVCEncoder (&(priv->encoder));
+ WelsCreateSVCEncoder (&openh264enc->encoder);
unsigned int uiTraceLevel = WELS_LOG_ERROR;
- priv->encoder->SetOption(ENCODER_OPTION_TRACE_LEVEL, &uiTraceLevel);
+ openh264enc->encoder->SetOption (ENCODER_OPTION_TRACE_LEVEL, &uiTraceLevel);
- priv->encoder->GetDefaultParams (&enc_params);
+ openh264enc->encoder->GetDefaultParams (&enc_params);
- enc_params.iUsageType = openh264enc->priv->usage_type;
+ enc_params.iUsageType = openh264enc->usage_type;
enc_params.iPicWidth = width;
enc_params.iPicHeight = height;
- enc_params.iTargetBitrate = openh264enc->priv->bitrate;
- enc_params.iRCMode = RC_QUALITY_MODE;
+ enc_params.iTargetBitrate = openh264enc->bitrate;
+ enc_params.iMaxBitrate = openh264enc->max_bitrate;
+ enc_params.iRCMode = openh264enc->rate_control;
enc_params.iTemporalLayerNum = 1;
enc_params.iSpatialLayerNum = 1;
enc_params.iLtrMarkPeriod = 30;
- enc_params.iMultipleThreadIdc = openh264enc->priv->multi_thread;
- enc_params.bEnableDenoise = openh264enc->priv->enable_denoise;
- enc_params.iComplexityMode = priv->complexity;
- enc_params.uiIntraPeriod = priv->gop_size;
- enc_params.bEnableBackgroundDetection =
- openh264enc->priv->background_detection;
- enc_params.bEnableAdaptiveQuant = openh264enc->priv->adaptive_quantization;
- enc_params.bEnableSceneChangeDetect =
- openh264enc->priv->scene_change_detection;
- enc_params.bEnableFrameSkip = openh264enc->priv->enable_frame_skip;
+ enc_params.iMultipleThreadIdc = openh264enc->multi_thread;
+ enc_params.bEnableDenoise = openh264enc->enable_denoise;
+ enc_params.iComplexityMode = openh264enc->complexity;
+ enc_params.uiIntraPeriod = openh264enc->gop_size;
+ enc_params.bEnableBackgroundDetection = openh264enc->background_detection;
+ enc_params.bEnableAdaptiveQuant = openh264enc->adaptive_quantization;
+ enc_params.bEnableSceneChangeDetect = openh264enc->scene_change_detection;
+ enc_params.bEnableFrameSkip = openh264enc->enable_frame_skip;
enc_params.bEnableLongTermReference = 0;
#if OPENH264_MINOR >= 4
enc_params.eSpsPpsIdStrategy = CONSTANT_ID;
@@ -724,20 +694,21 @@
#endif
enc_params.bPrefixNalAddingCtrl = 0;
enc_params.fMaxFrameRate = fps_n * 1.0 / fps_d;
- enc_params.iLoopFilterDisableIdc = openh264enc->priv->deblocking_mode;
+ enc_params.iLoopFilterDisableIdc = openh264enc->deblocking_mode;
enc_params.sSpatialLayers[0].uiProfileIdc = PRO_BASELINE;
- enc_params.sSpatialLayers[0].iVideoWidth = width;
- enc_params.sSpatialLayers[0].iVideoHeight = height;
+ enc_params.sSpatialLayers[0].iVideoWidth = enc_params.iPicWidth;
+ enc_params.sSpatialLayers[0].iVideoHeight = enc_params.iPicHeight;
enc_params.sSpatialLayers[0].fFrameRate = fps_n * 1.0 / fps_d;
- enc_params.sSpatialLayers[0].iSpatialBitrate = openh264enc->priv->bitrate;
+ enc_params.sSpatialLayers[0].iSpatialBitrate = enc_params.iTargetBitrate;
+ enc_params.sSpatialLayers[0].iMaxSpatialBitrate = enc_params.iMaxBitrate;
- if (priv->slice_mode == GST_OPENH264_SLICE_MODE_N_SLICES) {
- if (priv->num_slices == 1)
+ if (openh264enc->slice_mode == GST_OPENH264_SLICE_MODE_N_SLICES) {
+ if (openh264enc->num_slices == 1)
slice_mode = SM_SINGLE_SLICE;
else
slice_mode = SM_FIXEDSLCNUM_SLICE;
- n_slices = priv->num_slices;
- } else if (priv->slice_mode == GST_OPENH264_SLICE_MODE_AUTO) {
+ n_slices = openh264enc->num_slices;
+ } else if (openh264enc->slice_mode == GST_OPENH264_SLICE_MODE_AUTO) {
#if OPENH264_MAJOR == 1 && OPENH264_MINOR < 6
slice_mode = SM_AUTO_SLICE;
#else
@@ -745,7 +716,8 @@
n_slices = 0;
#endif
} else {
- GST_ERROR_OBJECT (openh264enc, "unexpected slice mode %d", priv->slice_mode);
+ GST_ERROR_OBJECT (openh264enc, "unexpected slice mode %d",
+ openh264enc->slice_mode);
slice_mode = SM_SINGLE_SLICE;
}
@@ -757,16 +729,16 @@
enc_params.sSpatialLayers[0].sSliceArgument.uiSliceNum = n_slices;
#endif
- priv->framerate = (1 + fps_n / fps_d);
+ openh264enc->framerate = (1 + fps_n / fps_d);
- ret = priv->encoder->InitializeExt (&enc_params);
+ ret = openh264enc->encoder->InitializeExt (&enc_params);
if (ret != cmResultSuccess) {
GST_ERROR_OBJECT (openh264enc, "failed to initialize encoder");
return FALSE;
}
- priv->encoder->SetOption(ENCODER_OPTION_DATAFORMAT, &video_format);
+ openh264enc->encoder->SetOption (ENCODER_OPTION_DATAFORMAT, &video_format);
outcaps =
gst_caps_copy (gst_static_pad_template_get_caps
@@ -813,38 +785,28 @@
}
//fill default src_pic
src_pic->iColorFormat = videoFormatI420;
- src_pic->uiTimeStamp = 0;
+ src_pic->uiTimeStamp = frame->pts / GST_MSECOND;
}
- openh264enc->priv->frame_count++;
+ openh264enc->frame_count++;
if (frame) {
- if (G_UNLIKELY (openh264enc->priv->frame_count == 1)) {
- openh264enc->priv->time_per_frame =
- (GST_SECOND / openh264enc->priv->framerate);
- openh264enc->priv->previous_timestamp = frame->pts;
+ if (G_UNLIKELY (openh264enc->frame_count == 1)) {
+ openh264enc->time_per_frame = (GST_SECOND / openh264enc->framerate);
+ openh264enc->previous_timestamp = frame->pts;
} else {
- openh264enc->priv->time_per_frame =
- openh264enc->priv->time_per_frame * 0.8 + (frame->pts -
- openh264enc->priv->previous_timestamp) * 0.2;
- openh264enc->priv->previous_timestamp = frame->pts;
- if (openh264enc->priv->frame_count % 10 == 0) {
- fps = GST_SECOND / (gdouble) openh264enc->priv->time_per_frame;
- openh264enc->priv->encoder->SetOption (ENCODER_OPTION_FRAME_RATE, &fps);
+ openh264enc->time_per_frame =
+ openh264enc->time_per_frame * 0.8 + (frame->pts -
+ openh264enc->previous_timestamp) * 0.2;
+ openh264enc->previous_timestamp = frame->pts;
+ if (openh264enc->frame_count % 10 == 0) {
+ fps = GST_SECOND / (gdouble) openh264enc->time_per_frame;
+ openh264enc->encoder->SetOption (ENCODER_OPTION_FRAME_RATE, &fps);
}
}
}
- if (openh264enc->priv->bitrate <= openh264enc->priv->drop_bitrate) {
- GST_LOG_OBJECT (openh264enc, "Dropped frame due to too low bitrate");
- if (frame) {
- gst_video_encoder_finish_frame (encoder, frame);
- delete src_pic;
- }
- return GST_FLOW_OK;
- }
-
if (frame) {
- gst_video_frame_map (&video_frame, &openh264enc->priv->input_state->info,
+ gst_video_frame_map (&video_frame, &openh264enc->input_state->info,
frame->input_buffer, GST_MAP_READ);
src_pic->iPicWidth = GST_VIDEO_FRAME_WIDTH (&video_frame);
src_pic->iPicHeight = GST_VIDEO_FRAME_HEIGHT (&video_frame);
@@ -857,14 +819,14 @@
force_keyframe = GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (frame);
if (force_keyframe) {
- openh264enc->priv->encoder->ForceIntraFrame (true);
+ openh264enc->encoder->ForceIntraFrame (true);
GST_DEBUG_OBJECT (openh264enc,
"Got force key unit event, next frame coded as intra picture");
}
}
memset (&frame_info, 0, sizeof (SFrameBSInfo));
- ret = openh264enc->priv->encoder->EncodeFrame (src_pic, &frame_info);
+ ret = openh264enc->encoder->EncodeFrame (src_pic, &frame_info);
if (ret != cmResultSuccess) {
if (frame) {
gst_video_frame_unmap (&video_frame);
@@ -946,7 +908,7 @@
{
GstOpenh264Enc *openh264enc = GST_OPENH264ENC (encoder);
- if (openh264enc->priv->frame_count == 0)
+ if (openh264enc->frame_count == 0)
return GST_FLOW_OK;
/* Drain encoder */
diff --git a/ext/openh264/gstopenh264enc.h b/ext/openh264/gstopenh264enc.h
index 613c488..f684191 100644
--- a/ext/openh264/gstopenh264enc.h
+++ b/ext/openh264/gstopenh264enc.h
@@ -33,8 +33,20 @@
#include <gst/video/video.h>
#include <gst/video/gstvideoencoder.h>
+#include <wels/codec_api.h>
+#include <wels/codec_app_def.h>
+#include <wels/codec_def.h>
+#include <wels/codec_ver.h>
+
G_BEGIN_DECLS
+typedef enum _GstOpenh264encDeblockingMode
+{
+ GST_OPENH264_DEBLOCKING_ON = 0,
+ GST_OPENH264_DEBLOCKING_OFF = 1,
+ GST_OPENH264_DEBLOCKING_NOT_SLICE_BOUNDARIES = 2
+} GstOpenh264encDeblockingMode;
+
typedef enum
{
GST_OPENH264_SLICE_MODE_N_SLICES = 1, /* SM_FIXEDSLCNUM_SLICE */
@@ -49,14 +61,34 @@
typedef struct _GstOpenh264Enc GstOpenh264Enc;
typedef struct _GstOpenh264EncClass GstOpenh264EncClass;
-typedef struct _GstOpenh264EncPrivate GstOpenh264EncPrivate;
struct _GstOpenh264Enc
{
- GstVideoEncoder base_openh264enc;
+ GstVideoEncoder base_openh264enc;
- /*< private >*/
- GstOpenh264EncPrivate *priv;
+ /*< private >*/
+ ISVCEncoder *encoder;
+ EUsageType usage_type;
+ guint gop_size;
+ RC_MODES rate_control;
+ guint max_slice_size;
+ guint bitrate;
+ guint max_bitrate;
+ guint framerate;
+ guint multi_thread;
+ gboolean enable_denoise;
+ gboolean enable_frame_skip;
+ GstVideoCodecState *input_state;
+ guint64 time_per_frame;
+ guint64 frame_count;
+ guint64 previous_timestamp;
+ GstOpenh264encDeblockingMode deblocking_mode;
+ gboolean background_detection;
+ gboolean adaptive_quantization;
+ gboolean scene_change_detection;
+ GstOpenh264EncSliceMode slice_mode;
+ guint num_slices;
+ ECOMPLEXITY_MODE complexity;
};
struct _GstOpenh264EncClass
diff --git a/ext/openjpeg/Makefile.am b/ext/openjpeg/Makefile.am
index c3376f1..eb684d3 100644
--- a/ext/openjpeg/Makefile.am
+++ b/ext/openjpeg/Makefile.am
@@ -1,9 +1,10 @@
plugin_LTLIBRARIES = libgstopenjpeg.la
libgstopenjpeg_la_SOURCES = gstopenjpegdec.c gstopenjpegenc.c gstopenjpeg.c
-libgstopenjpeg_la_CFLAGS = \
+libgstopenjpeg_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) \
$(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(OPENJPEG_CFLAGS)
libgstopenjpeg_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/codecparsers/libgstcodecparsers-$(GST_API_VERSION).la \
$(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) \
$(GST_LIBS) $(OPENJPEG_LIBS)
libgstopenjpeg_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
diff --git a/ext/openjpeg/Makefile.in b/ext/openjpeg/Makefile.in
index 70e93f1..9cb847d 100644
--- a/ext/openjpeg/Makefile.in
+++ b/ext/openjpeg/Makefile.in
@@ -163,8 +163,9 @@
am__installdirs = "$(DESTDIR)$(plugindir)"
LTLIBRARIES = $(plugin_LTLIBRARIES)
am__DEPENDENCIES_1 =
-libgstopenjpeg_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+libgstopenjpeg_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/codecparsers/libgstcodecparsers-$(GST_API_VERSION).la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
am_libgstopenjpeg_la_OBJECTS = libgstopenjpeg_la-gstopenjpegdec.lo \
libgstopenjpeg_la-gstopenjpegenc.lo \
libgstopenjpeg_la-gstopenjpeg.lo
@@ -304,6 +305,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +328,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +379,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +526,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +654,6 @@
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@
@@ -689,8 +696,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -781,10 +793,11 @@
wayland_scanner = @wayland_scanner@
plugin_LTLIBRARIES = libgstopenjpeg.la
libgstopenjpeg_la_SOURCES = gstopenjpegdec.c gstopenjpegenc.c gstopenjpeg.c
-libgstopenjpeg_la_CFLAGS = \
+libgstopenjpeg_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) \
$(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(OPENJPEG_CFLAGS)
libgstopenjpeg_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/codecparsers/libgstcodecparsers-$(GST_API_VERSION).la \
$(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) \
$(GST_LIBS) $(OPENJPEG_LIBS)
diff --git a/ext/openjpeg/gstopenjpegdec.c b/ext/openjpeg/gstopenjpegdec.c
index 5c6a228..60b9543 100644
--- a/ext/openjpeg/gstopenjpegdec.c
+++ b/ext/openjpeg/gstopenjpegdec.c
@@ -26,6 +26,7 @@
#include "gstopenjpegdec.h"
+
#include <string.h>
GST_DEBUG_CATEGORY_STATIC (gst_openjpeg_dec_debug);
@@ -53,9 +54,8 @@
GST_PAD_SINK,
GST_PAD_ALWAYS,
GST_STATIC_CAPS ("image/x-j2c, "
- "colorspace = (string) { sRGB, sYUV, GRAY }; "
- "image/x-jpc, "
- "colorspace = (string) { sRGB, sYUV, GRAY }; " "image/jp2")
+ GST_JPEG2000_SAMPLING_LIST "; "
+ "image/x-jpc, " GST_JPEG2000_SAMPLING_LIST "; " "image/jp2")
);
static GstStaticPadTemplate gst_openjpeg_dec_src_template =
@@ -79,10 +79,10 @@
element_class = (GstElementClass *) klass;
video_decoder_class = (GstVideoDecoderClass *) klass;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_openjpeg_dec_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_openjpeg_dec_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_openjpeg_dec_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_openjpeg_dec_sink_template);
gst_element_class_set_static_metadata (element_class,
"OpenJPEG JPEG2000 decoder",
@@ -116,6 +116,7 @@
#ifdef HAVE_OPENJPEG_1
self->params.cp_limit_decoding = NO_LIMITATION;
#endif
+ self->sampling = GST_JPEG2000_SAMPLING_NONE;
}
static gboolean
@@ -156,7 +157,6 @@
{
GstOpenJPEGDec *self = GST_OPENJPEG_DEC (decoder);
GstStructure *s;
- const gchar *color_space;
GST_DEBUG_OBJECT (self, "Setting format: %" GST_PTR_FORMAT, state->caps);
@@ -177,14 +177,16 @@
g_return_val_if_reached (FALSE);
}
- if ((color_space = gst_structure_get_string (s, "colorspace"))) {
- if (g_str_equal (color_space, "sRGB"))
- self->color_space = OPJ_CLRSPC_SRGB;
- else if (g_str_equal (color_space, "GRAY"))
- self->color_space = OPJ_CLRSPC_GRAY;
- else if (g_str_equal (color_space, "sYUV"))
- self->color_space = OPJ_CLRSPC_SYCC;
- }
+
+ self->sampling =
+ gst_jpeg2000_sampling_from_string (gst_structure_get_string (s,
+ "sampling"));
+ if (gst_jpeg2000_sampling_is_rgb (self->sampling))
+ self->color_space = OPJ_CLRSPC_SRGB;
+ else if (gst_jpeg2000_sampling_is_mono (self->sampling))
+ self->color_space = OPJ_CLRSPC_GRAY;
+ else if (gst_jpeg2000_sampling_is_yuv (self->sampling))
+ self->color_space = OPJ_CLRSPC_SYCC;
self->ncomps = 0;
gst_structure_get_int (s, "num-components", &self->ncomps);
@@ -196,32 +198,40 @@
return TRUE;
}
+static gboolean
+reverse_rgb_channels (GstJPEG2000Sampling sampling)
+{
+ return sampling == GST_JPEG2000_SAMPLING_BGR
+ || sampling == GST_JPEG2000_SAMPLING_BGRA;
+}
+
static void
fill_frame_packed8_4 (GstVideoFrame * frame, opj_image_t * image)
{
- gint x, y, w, h;
+ gint x, y, w, h, c;
guint8 *data_out, *tmp;
const gint *data_in[4];
gint dstride;
+ gint off[4];
w = GST_VIDEO_FRAME_WIDTH (frame);
h = GST_VIDEO_FRAME_HEIGHT (frame);
data_out = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
dstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
- data_in[0] = image->comps[0].data;
- data_in[1] = image->comps[1].data;
- data_in[2] = image->comps[2].data;
- data_in[3] = image->comps[3].data;
+ for (c = 0; c < 4; c++) {
+ data_in[c] = image->comps[c].data;
+ off[c] = 0x80 * image->comps[c].sgnd;
+ }
for (y = 0; y < h; y++) {
tmp = data_out;
for (x = 0; x < w; x++) {
- tmp[0] = *data_in[3];
- tmp[1] = *data_in[0];
- tmp[2] = *data_in[1];
- tmp[3] = *data_in[2];
+ tmp[0] = off[3] + *data_in[3];
+ tmp[1] = off[0] + *data_in[0];
+ tmp[2] = off[1] + *data_in[1];
+ tmp[3] = off[2] + *data_in[2];
tmp += 4;
data_in[0]++;
@@ -236,35 +246,33 @@
static void
fill_frame_packed16_4 (GstVideoFrame * frame, opj_image_t * image)
{
- gint x, y, w, h;
+ gint x, y, w, h, c;
guint16 *data_out, *tmp;
const gint *data_in[4];
gint dstride;
- gint shift[4];
+ gint shift[4], off[4];
w = GST_VIDEO_FRAME_WIDTH (frame);
h = GST_VIDEO_FRAME_HEIGHT (frame);
data_out = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
dstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0) / 2;
- data_in[0] = image->comps[0].data;
- data_in[1] = image->comps[1].data;
- data_in[2] = image->comps[2].data;
- data_in[3] = image->comps[3].data;
-
- shift[0] = 16 - image->comps[0].prec;
- shift[1] = 16 - image->comps[1].prec;
- shift[2] = 16 - image->comps[2].prec;
- shift[3] = 16 - image->comps[3].prec;
+ for (c = 0; c < 4; c++) {
+ data_in[c] = image->comps[c].data;
+ off[c] = (1 << (image->comps[c].prec - 1)) * image->comps[c].sgnd;
+ shift[c] =
+ MAX (MIN (GST_VIDEO_FRAME_COMP_DEPTH (frame, c) - image->comps[c].prec,
+ 8), 0);
+ }
for (y = 0; y < h; y++) {
tmp = data_out;
for (x = 0; x < w; x++) {
- tmp[0] = *data_in[3] << shift[3];
- tmp[1] = *data_in[0] << shift[0];
- tmp[2] = *data_in[1] << shift[1];
- tmp[3] = *data_in[2] << shift[2];
+ tmp[0] = off[3] + (*data_in[3] << shift[3]);
+ tmp[1] = off[0] + (*data_in[0] << shift[0]);
+ tmp[2] = off[1] + (*data_in[1] << shift[1]);
+ tmp[3] = off[2] + (*data_in[2] << shift[2]);
tmp += 4;
data_in[0]++;
@@ -279,27 +287,29 @@
static void
fill_frame_packed8_3 (GstVideoFrame * frame, opj_image_t * image)
{
- gint x, y, w, h;
+ gint x, y, w, h, c;
guint8 *data_out, *tmp;
const gint *data_in[3];
gint dstride;
+ gint off[3];
w = GST_VIDEO_FRAME_WIDTH (frame);
h = GST_VIDEO_FRAME_HEIGHT (frame);
data_out = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
dstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
- data_in[0] = image->comps[0].data;
- data_in[1] = image->comps[1].data;
- data_in[2] = image->comps[2].data;
+ for (c = 0; c < 3; c++) {
+ data_in[c] = image->comps[c].data;
+ off[c] = 0x80 * image->comps[c].sgnd;
+ };
for (y = 0; y < h; y++) {
tmp = data_out;
for (x = 0; x < w; x++) {
- tmp[1] = *data_in[0];
- tmp[2] = *data_in[1];
- tmp[3] = *data_in[2];
+ tmp[1] = off[0] + *data_in[0];
+ tmp[2] = off[1] + *data_in[1];
+ tmp[3] = off[2] + *data_in[2];
tmp += 4;
data_in[0]++;
@@ -313,32 +323,32 @@
static void
fill_frame_packed16_3 (GstVideoFrame * frame, opj_image_t * image)
{
- gint x, y, w, h;
+ gint x, y, w, h, c;
guint16 *data_out, *tmp;
const gint *data_in[3];
gint dstride;
- gint shift[3];
+ gint shift[3], off[3];
w = GST_VIDEO_FRAME_WIDTH (frame);
h = GST_VIDEO_FRAME_HEIGHT (frame);
data_out = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
dstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0) / 2;
- data_in[0] = image->comps[0].data;
- data_in[1] = image->comps[1].data;
- data_in[2] = image->comps[2].data;
-
- shift[0] = 16 - image->comps[0].prec;
- shift[1] = 16 - image->comps[1].prec;
- shift[2] = 16 - image->comps[2].prec;
+ for (c = 0; c < 3; c++) {
+ data_in[c] = image->comps[c].data;
+ off[c] = (1 << (image->comps[c].prec - 1)) * image->comps[c].sgnd;
+ shift[c] =
+ MAX (MIN (GST_VIDEO_FRAME_COMP_DEPTH (frame, c) - image->comps[c].prec,
+ 8), 0);
+ }
for (y = 0; y < h; y++) {
tmp = data_out;
for (x = 0; x < w; x++) {
- tmp[1] = *data_in[0] << shift[0];
- tmp[2] = *data_in[1] << shift[1];
- tmp[3] = *data_in[2] << shift[2];
+ tmp[1] = off[0] + (*data_in[0] << shift[0]);
+ tmp[2] = off[1] + (*data_in[1] << shift[1]);
+ tmp[3] = off[2] + (*data_in[2] << shift[2]);
tmp += 4;
data_in[0]++;
@@ -356,6 +366,7 @@
guint8 *data_out, *tmp;
const gint *data_in;
gint dstride;
+ gint off;
w = GST_VIDEO_FRAME_WIDTH (frame);
h = GST_VIDEO_FRAME_HEIGHT (frame);
@@ -363,12 +374,13 @@
dstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
data_in = image->comps[0].data;
+ off = 0x80 * image->comps[0].sgnd;
for (y = 0; y < h; y++) {
tmp = data_out;
for (x = 0; x < w; x++) {
- *tmp = *data_in;
+ *tmp = off + *data_in;
tmp++;
data_in++;
@@ -384,7 +396,7 @@
guint16 *data_out, *tmp;
const gint *data_in;
gint dstride;
- gint shift;
+ gint shift, off;
w = GST_VIDEO_FRAME_WIDTH (frame);
h = GST_VIDEO_FRAME_HEIGHT (frame);
@@ -393,13 +405,16 @@
data_in = image->comps[0].data;
- shift = 16 - image->comps[0].prec;
+ off = (1 << (image->comps[0].prec - 1)) * image->comps[0].sgnd;
+ shift =
+ MAX (MIN (GST_VIDEO_FRAME_COMP_DEPTH (frame, 0) - image->comps[0].prec,
+ 8), 0);
for (y = 0; y < h; y++) {
tmp = data_out;
for (x = 0; x < w; x++) {
- *tmp = *data_in << shift;
+ *tmp = off + (*data_in << shift);
tmp++;
data_in++;
@@ -414,7 +429,7 @@
gint c, x, y, w, h;
guint8 *data_out, *tmp;
const gint *data_in;
- gint dstride;
+ gint dstride, off;
for (c = 0; c < 3; c++) {
w = GST_VIDEO_FRAME_COMP_WIDTH (frame, c);
@@ -422,12 +437,13 @@
dstride = GST_VIDEO_FRAME_COMP_STRIDE (frame, c);
data_out = GST_VIDEO_FRAME_COMP_DATA (frame, c);
data_in = image->comps[c].data;
+ off = 0x80 * image->comps[c].sgnd;
for (y = 0; y < h; y++) {
tmp = data_out;
for (x = 0; x < w; x++) {
- *tmp = *data_in;
+ *tmp = off + *data_in;
tmp++;
data_in++;
}
@@ -443,7 +459,7 @@
guint16 *data_out, *tmp;
const gint *data_in;
gint dstride;
- gint shift;
+ gint shift, off;
for (c = 0; c < 3; c++) {
w = GST_VIDEO_FRAME_COMP_WIDTH (frame, c);
@@ -451,13 +467,16 @@
dstride = GST_VIDEO_FRAME_COMP_STRIDE (frame, c) / 2;
data_out = (guint16 *) GST_VIDEO_FRAME_COMP_DATA (frame, c);
data_in = image->comps[c].data;
- shift = 16 - image->comps[c].prec;
+ off = (1 << (image->comps[c].prec - 1)) * image->comps[c].sgnd;
+ shift =
+ MAX (MIN (GST_VIDEO_FRAME_COMP_DEPTH (frame, c) - image->comps[c].prec,
+ 8), 0);
for (y = 0; y < h; y++) {
tmp = data_out;
for (x = 0; x < w; x++) {
- *tmp = *data_in << shift;
+ *tmp = off + (*data_in << shift);
tmp++;
data_in++;
}
@@ -469,37 +488,32 @@
static void
fill_frame_planar8_3_generic (GstVideoFrame * frame, opj_image_t * image)
{
- gint x, y, w, h;
+ gint x, y, w, h, c;
guint8 *data_out, *tmp;
const gint *data_in[3];
gint dstride;
- gint dx[3], dy[3];
+ gint dx[3], dy[3], off[3];
w = GST_VIDEO_FRAME_WIDTH (frame);
h = GST_VIDEO_FRAME_HEIGHT (frame);
data_out = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
dstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
- data_in[0] = image->comps[0].data;
- data_in[1] = image->comps[1].data;
- data_in[2] = image->comps[2].data;
-
- dx[0] = image->comps[0].dx;
- dx[1] = image->comps[1].dx;
- dx[2] = image->comps[2].dx;
-
- dy[0] = image->comps[0].dy;
- dy[1] = image->comps[1].dy;
- dy[2] = image->comps[2].dy;
+ for (c = 0; c < 3; c++) {
+ data_in[c] = image->comps[c].data;
+ dx[c] = image->comps[c].dx;
+ dy[c] = image->comps[c].dy;
+ off[c] = 0x80 * image->comps[c].sgnd;
+ }
for (y = 0; y < h; y++) {
tmp = data_out;
for (x = 0; x < w; x++) {
tmp[0] = 0xff;
- tmp[1] = data_in[0][((y / dy[0]) * w + x) / dx[0]];
- tmp[2] = data_in[1][((y / dy[1]) * w + x) / dx[1]];
- tmp[3] = data_in[2][((y / dy[2]) * w + x) / dx[2]];
+ tmp[1] = off[0] + data_in[0][((y / dy[0]) * w + x) / dx[0]];
+ tmp[2] = off[1] + data_in[1][((y / dy[1]) * w + x) / dx[1]];
+ tmp[3] = off[2] + data_in[2][((y / dy[2]) * w + x) / dx[2]];
tmp += 4;
}
data_out += dstride;
@@ -509,40 +523,32 @@
static void
fill_frame_planar8_4_generic (GstVideoFrame * frame, opj_image_t * image)
{
- gint x, y, w, h;
+ gint x, y, w, h, c;
guint8 *data_out, *tmp;
const gint *data_in[4];
gint dstride;
- gint dx[4], dy[4];
+ gint dx[4], dy[4], off[4];
w = GST_VIDEO_FRAME_WIDTH (frame);
h = GST_VIDEO_FRAME_HEIGHT (frame);
data_out = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
dstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
- data_in[0] = image->comps[0].data;
- data_in[1] = image->comps[1].data;
- data_in[2] = image->comps[2].data;
- data_in[3] = image->comps[3].data;
-
- dx[0] = image->comps[0].dx;
- dx[1] = image->comps[1].dx;
- dx[2] = image->comps[2].dx;
- dx[3] = image->comps[3].dx;
-
- dy[0] = image->comps[0].dy;
- dy[1] = image->comps[1].dy;
- dy[2] = image->comps[2].dy;
- dy[3] = image->comps[3].dy;
+ for (c = 0; c < 4; c++) {
+ data_in[c] = image->comps[c].data;
+ dx[c] = image->comps[c].dx;
+ dy[c] = image->comps[c].dy;
+ off[c] = 0x80 * image->comps[c].sgnd;
+ }
for (y = 0; y < h; y++) {
tmp = data_out;
for (x = 0; x < w; x++) {
- tmp[0] = data_in[3][((y / dy[3]) * w + x) / dx[3]];
- tmp[1] = data_in[0][((y / dy[0]) * w + x) / dx[0]];
- tmp[2] = data_in[1][((y / dy[1]) * w + x) / dx[1]];
- tmp[3] = data_in[2][((y / dy[2]) * w + x) / dx[2]];
+ tmp[0] = off[3] + data_in[3][((y / dy[3]) * w + x) / dx[3]];
+ tmp[1] = off[0] + data_in[0][((y / dy[0]) * w + x) / dx[0]];
+ tmp[2] = off[1] + data_in[1][((y / dy[1]) * w + x) / dx[1]];
+ tmp[3] = off[2] + data_in[2][((y / dy[2]) * w + x) / dx[2]];
tmp += 4;
}
data_out += dstride;
@@ -552,41 +558,35 @@
static void
fill_frame_planar16_3_generic (GstVideoFrame * frame, opj_image_t * image)
{
- gint x, y, w, h;
+ gint x, y, w, h, c;
guint16 *data_out, *tmp;
const gint *data_in[3];
gint dstride;
- gint dx[3], dy[3], shift[3];
+ gint dx[3], dy[3], shift[3], off[3];
w = GST_VIDEO_FRAME_WIDTH (frame);
h = GST_VIDEO_FRAME_HEIGHT (frame);
data_out = (guint16 *) GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
dstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0) / 2;
- data_in[0] = image->comps[0].data;
- data_in[1] = image->comps[1].data;
- data_in[2] = image->comps[2].data;
-
- dx[0] = image->comps[0].dx;
- dx[1] = image->comps[1].dx;
- dx[2] = image->comps[2].dx;
-
- dy[0] = image->comps[0].dy;
- dy[1] = image->comps[1].dy;
- dy[2] = image->comps[2].dy;
-
- shift[0] = 16 - image->comps[0].prec;
- shift[1] = 16 - image->comps[1].prec;
- shift[2] = 16 - image->comps[2].prec;
+ for (c = 0; c < 3; c++) {
+ dx[c] = image->comps[c].dx;
+ dy[c] = image->comps[c].dy;
+ data_in[c] = image->comps[c].data;
+ off[c] = (1 << (image->comps[c].prec - 1)) * image->comps[c].sgnd;
+ shift[c] =
+ MAX (MIN (GST_VIDEO_FRAME_COMP_DEPTH (frame, c) - image->comps[c].prec,
+ 8), 0);
+ }
for (y = 0; y < h; y++) {
tmp = data_out;
for (x = 0; x < w; x++) {
tmp[0] = 0xff;
- tmp[1] = data_in[0][((y / dy[0]) * w + x) / dx[0]] << shift[0];
- tmp[2] = data_in[1][((y / dy[1]) * w + x) / dx[1]] << shift[1];
- tmp[3] = data_in[2][((y / dy[2]) * w + x) / dx[2]] << shift[2];
+ tmp[1] = off[0] + (data_in[0][((y / dy[0]) * w + x) / dx[0]] << shift[0]);
+ tmp[2] = off[1] + (data_in[1][((y / dy[1]) * w + x) / dx[1]] << shift[1]);
+ tmp[3] = off[2] + (data_in[2][((y / dy[2]) * w + x) / dx[2]] << shift[2]);
tmp += 4;
}
data_out += dstride;
@@ -596,45 +596,35 @@
static void
fill_frame_planar16_4_generic (GstVideoFrame * frame, opj_image_t * image)
{
- gint x, y, w, h;
+ gint x, y, w, h, c;
guint16 *data_out, *tmp;
const gint *data_in[4];
gint dstride;
- gint dx[4], dy[4], shift[4];
+ gint dx[4], dy[4], shift[4], off[4];
w = GST_VIDEO_FRAME_WIDTH (frame);
h = GST_VIDEO_FRAME_HEIGHT (frame);
data_out = (guint16 *) GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
dstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0) / 2;
- data_in[0] = image->comps[0].data;
- data_in[1] = image->comps[1].data;
- data_in[2] = image->comps[2].data;
- data_in[3] = image->comps[3].data;
-
- dx[0] = image->comps[0].dx;
- dx[1] = image->comps[1].dx;
- dx[2] = image->comps[2].dx;
- dx[3] = image->comps[3].dx;
-
- dy[0] = image->comps[0].dy;
- dy[1] = image->comps[1].dy;
- dy[2] = image->comps[2].dy;
- dy[3] = image->comps[3].dy;
-
- shift[0] = 16 - image->comps[0].prec;
- shift[1] = 16 - image->comps[1].prec;
- shift[2] = 16 - image->comps[2].prec;
- shift[3] = 16 - image->comps[3].prec;
+ for (c = 0; c < 4; c++) {
+ dx[c] = image->comps[c].dx;
+ dy[c] = image->comps[c].dy;
+ data_in[c] = image->comps[c].data;
+ off[c] = (1 << (image->comps[c].prec - 1)) * image->comps[c].sgnd;
+ shift[c] =
+ MAX (MIN (GST_VIDEO_FRAME_COMP_DEPTH (frame, c) - image->comps[c].prec,
+ 8), 0);
+ }
for (y = 0; y < h; y++) {
tmp = data_out;
for (x = 0; x < w; x++) {
- tmp[0] = data_in[3][((y / dy[3]) * w + x) / dx[3]] << shift[3];
- tmp[1] = data_in[0][((y / dy[0]) * w + x) / dx[0]] << shift[0];
- tmp[2] = data_in[1][((y / dy[1]) * w + x) / dx[1]] << shift[1];
- tmp[3] = data_in[2][((y / dy[2]) * w + x) / dx[2]] << shift[2];
+ tmp[0] = off[3] + (data_in[3][((y / dy[3]) * w + x) / dx[3]] << shift[3]);
+ tmp[1] = off[0] + (data_in[0][((y / dy[0]) * w + x) / dx[0]] << shift[0]);
+ tmp[2] = off[1] + (data_in[1][((y / dy[1]) * w + x) / dx[1]] << shift[1]);
+ tmp[3] = off[2] + (data_in[2][((y / dy[2]) * w + x) / dx[2]] << shift[2]);
tmp += 4;
}
data_out += dstride;
@@ -675,7 +665,10 @@
if (get_highest_prec (image) == 8) {
self->fill_frame = fill_frame_packed8_4;
- format = GST_VIDEO_FORMAT_ARGB;
+ format =
+ reverse_rgb_channels (self->sampling) ? GST_VIDEO_FORMAT_BGRA :
+ GST_VIDEO_FORMAT_RGBA;
+
} else if (get_highest_prec (image) <= 16) {
self->fill_frame = fill_frame_packed16_4;
format = GST_VIDEO_FORMAT_ARGB64;
@@ -693,7 +686,9 @@
if (get_highest_prec (image) == 8) {
self->fill_frame = fill_frame_packed8_3;
- format = GST_VIDEO_FORMAT_ARGB;
+ format =
+ reverse_rgb_channels (self->sampling) ? GST_VIDEO_FORMAT_BGR :
+ GST_VIDEO_FORMAT_RGB;
} else if (get_highest_prec (image) <= 16) {
self->fill_frame = fill_frame_packed16_3;
format = GST_VIDEO_FORMAT_ARGB64;
diff --git a/ext/openjpeg/gstopenjpegdec.h b/ext/openjpeg/gstopenjpegdec.h
index 0e6e6af..4b4c6cf 100644
--- a/ext/openjpeg/gstopenjpegdec.h
+++ b/ext/openjpeg/gstopenjpegdec.h
@@ -24,6 +24,7 @@
#include <gst/gst.h>
#include <gst/video/video.h>
+#include <gst/codecparsers/gstjpeg2000sampling.h>
#include "gstopenjpeg.h"
@@ -54,6 +55,7 @@
OPJ_CODEC_FORMAT codec_format;
gboolean is_jp2c;
OPJ_COLOR_SPACE color_space;
+ GstJPEG2000Sampling sampling;
gint ncomps;
void (*fill_frame) (GstVideoFrame *frame, opj_image_t * image);
diff --git a/ext/openjpeg/gstopenjpegenc.c b/ext/openjpeg/gstopenjpegenc.c
index 27f3ee5..7514a35 100644
--- a/ext/openjpeg/gstopenjpegenc.c
+++ b/ext/openjpeg/gstopenjpegenc.c
@@ -25,6 +25,7 @@
#endif
#include "gstopenjpegenc.h"
+#include <gst/codecparsers/gstjpeg2000sampling.h>
#include <string.h>
@@ -115,12 +116,14 @@
"width = (int) [1, MAX], "
"height = (int) [1, MAX], "
"num-components = (int) [1, 4], "
- "colorspace = (string) { sRGB, sYUV, GRAY }; "
+ GST_JPEG2000_SAMPLING_LIST ","
+ GST_JPEG2000_COLORSPACE_LIST "; "
"image/x-jpc, "
"width = (int) [1, MAX], "
"height = (int) [1, MAX], "
"num-components = (int) [1, 4], "
- "colorspace = (string) { sRGB, sYUV, GRAY }; "
+ GST_JPEG2000_SAMPLING_LIST ","
+ GST_JPEG2000_COLORSPACE_LIST "; "
"image/jp2, " "width = (int) [1, MAX], " "height = (int) [1, MAX]")
);
@@ -177,10 +180,10 @@
"Tile Height", 0, G_MAXINT, DEFAULT_TILE_HEIGHT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_openjpeg_enc_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_openjpeg_enc_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_openjpeg_enc_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_openjpeg_enc_sink_template);
gst_element_class_set_static_metadata (element_class,
"OpenJPEG JPEG2000 encoder",
@@ -557,7 +560,8 @@
GstOpenJPEGEnc *self = GST_OPENJPEG_ENC (encoder);
GstCaps *allowed_caps, *caps;
GstStructure *s;
- const gchar *colorspace;
+ const gchar *colorspace = NULL;
+ GstJPEG2000Sampling sampling = GST_JPEG2000_SAMPLING_NONE;
gint ncomps;
GST_DEBUG_OBJECT (self, "Setting format: %" GST_PTR_FORMAT, state->caps);
@@ -588,6 +592,7 @@
ncomps = 4;
break;
case GST_VIDEO_FORMAT_ARGB:
+ case GST_VIDEO_FORMAT_AYUV:
self->fill_image = fill_image_packed8_4;
ncomps = 4;
break;
@@ -608,10 +613,6 @@
self->fill_image = fill_image_planar16_3;
ncomps = 3;
break;
- case GST_VIDEO_FORMAT_AYUV:
- self->fill_image = fill_image_packed8_3;
- ncomps = 3;
- break;
case GST_VIDEO_FORMAT_Y444:
case GST_VIDEO_FORMAT_Y42B:
case GST_VIDEO_FORMAT_I420:
@@ -633,18 +634,71 @@
g_assert_not_reached ();
}
- if ((state->info.finfo->flags & GST_VIDEO_FORMAT_FLAG_YUV))
+
+ /* sampling */
+ /* note: encoder re-orders channels so that alpha channel is encoded as the last channel */
+ switch (state->info.finfo->format) {
+ case GST_VIDEO_FORMAT_ARGB64:
+ case GST_VIDEO_FORMAT_ARGB:
+ sampling = GST_JPEG2000_SAMPLING_RGBA;
+ break;
+ case GST_VIDEO_FORMAT_AYUV64:
+ case GST_VIDEO_FORMAT_AYUV:
+ sampling = GST_JPEG2000_SAMPLING_YBRA4444_EXT;
+ break;
+ case GST_VIDEO_FORMAT_xRGB:
+ sampling = GST_JPEG2000_SAMPLING_RGB;
+ break;
+ case GST_VIDEO_FORMAT_Y444_10LE:
+ case GST_VIDEO_FORMAT_Y444_10BE:
+ case GST_VIDEO_FORMAT_Y444:
+ sampling = GST_JPEG2000_SAMPLING_YBR444;
+ break;
+
+ case GST_VIDEO_FORMAT_I422_10LE:
+ case GST_VIDEO_FORMAT_I422_10BE:
+ case GST_VIDEO_FORMAT_Y42B:
+ sampling = GST_JPEG2000_SAMPLING_YBR422;
+ break;
+ case GST_VIDEO_FORMAT_YUV9:
+ sampling = GST_JPEG2000_SAMPLING_YBR410;
+ break;
+ case GST_VIDEO_FORMAT_I420_10LE:
+ case GST_VIDEO_FORMAT_I420_10BE:
+ case GST_VIDEO_FORMAT_I420:
+ sampling = GST_JPEG2000_SAMPLING_YBR420;
+ break;
+ case GST_VIDEO_FORMAT_GRAY8:
+ case GST_VIDEO_FORMAT_GRAY16_LE:
+ case GST_VIDEO_FORMAT_GRAY16_BE:
+ sampling = GST_JPEG2000_SAMPLING_GRAYSCALE;
+ break;
+ default:
+ break;
+ }
+
+
+
+ if ((state->info.finfo->flags & GST_VIDEO_FORMAT_FLAG_YUV)) {
colorspace = "sYUV";
- else if ((state->info.finfo->flags & GST_VIDEO_FORMAT_FLAG_RGB))
+ } else if ((state->info.finfo->flags & GST_VIDEO_FORMAT_FLAG_RGB)) {
colorspace = "sRGB";
- else if ((state->info.finfo->flags & GST_VIDEO_FORMAT_FLAG_GRAY))
+ } else if ((state->info.finfo->flags & GST_VIDEO_FORMAT_FLAG_GRAY)) {
colorspace = "GRAY";
- else
+ } else
g_return_val_if_reached (FALSE);
- caps = gst_caps_new_simple (gst_structure_get_name (s),
- "colorspace", G_TYPE_STRING, colorspace,
- "num-components", G_TYPE_INT, ncomps, NULL);
+ if (sampling != GST_JPEG2000_SAMPLING_NONE) {
+ caps = gst_caps_new_simple (gst_structure_get_name (s),
+ "colorspace", G_TYPE_STRING, colorspace,
+ "sampling", G_TYPE_STRING, gst_jpeg2000_sampling_to_string (sampling),
+ "num-components", G_TYPE_INT, ncomps, NULL);
+ } else {
+ caps = gst_caps_new_simple (gst_structure_get_name (s),
+ "colorspace", G_TYPE_STRING, colorspace,
+ "num-components", G_TYPE_INT, ncomps, NULL);
+
+ }
gst_caps_unref (allowed_caps);
if (self->output_state)
diff --git a/ext/openni2/Makefile.in b/ext/openni2/Makefile.in
index f4b7f9c..0b0e08a 100644
--- a/ext/openni2/Makefile.in
+++ b/ext/openni2/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/openni2/gstopenni2src.cpp b/ext/openni2/gstopenni2src.cpp
index f12e0b7..88e6a16 100644
--- a/ext/openni2/gstopenni2src.cpp
+++ b/ext/openni2/gstopenni2src.cpp
@@ -153,8 +153,7 @@
basesrc_class->decide_allocation =
GST_DEBUG_FUNCPTR (gst_openni2src_decide_allocation);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&srctemplate));
+ gst_element_class_add_static_pad_template (element_class, &srctemplate);
gst_element_class_set_static_metadata (element_class, "Openni2 client source",
"Source/Video",
diff --git a/ext/opus/Makefile.in b/ext/opus/Makefile.in
index 3dc6aa4..d3da9e5 100644
--- a/ext/opus/Makefile.in
+++ b/ext/opus/Makefile.in
@@ -305,6 +305,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -326,6 +328,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -375,6 +379,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -520,6 +526,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -646,8 +654,6 @@
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@
@@ -690,8 +696,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/opus/gstopusparse.c b/ext/opus/gstopusparse.c
index ea3252e..56e8bb8 100644
--- a/ext/opus/gstopusparse.c
+++ b/ext/opus/gstopusparse.c
@@ -87,13 +87,12 @@
bpclass->stop = GST_DEBUG_FUNCPTR (gst_opus_parse_stop);
bpclass->handle_frame = GST_DEBUG_FUNCPTR (gst_opus_parse_handle_frame);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&opus_parse_src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&opus_parse_sink_factory));
+ gst_element_class_add_static_pad_template (element_class,
+ &opus_parse_src_factory);
+ gst_element_class_add_static_pad_template (element_class,
+ &opus_parse_sink_factory);
gst_element_class_set_static_metadata (element_class, "Opus audio parser",
- "Codec/Parser/Audio",
- "parses opus audio streams",
+ "Codec/Parser/Audio", "parses opus audio streams",
"Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>");
GST_DEBUG_CATEGORY_INIT (opusparse_debug, "opusparse", 0,
diff --git a/ext/qt/Makefile.am b/ext/qt/Makefile.am
index ae091e4..b8bd5d4 100644
--- a/ext/qt/Makefile.am
+++ b/ext/qt/Makefile.am
@@ -26,6 +26,8 @@
qtwindow.cc \
gstqtsink.cc \
gstqtsink.h \
+ gstqtsrc.cc \
+ gstqtsrc.h \
gstqtgl.h \
gstplugin.cc
diff --git a/ext/qt/Makefile.in b/ext/qt/Makefile.in
index 2b3af9e..5b648c4 100644
--- a/ext/qt/Makefile.in
+++ b/ext/qt/Makefile.in
@@ -169,7 +169,7 @@
am_libgstqmlgl_la_OBJECTS = libgstqmlgl_la-gstqsgtexture.lo \
libgstqmlgl_la-gstqtglutility.lo libgstqmlgl_la-qtitem.lo \
libgstqmlgl_la-qtwindow.lo libgstqmlgl_la-gstqtsink.lo \
- libgstqmlgl_la-gstplugin.lo
+ libgstqmlgl_la-gstqtsrc.lo libgstqmlgl_la-gstplugin.lo
am__objects_1 = libgstqmlgl_la-moc_qtitem.lo \
libgstqmlgl_la-moc_qtwindow.lo \
libgstqmlgl_la-moc_gstqsgtexture.lo
@@ -330,6 +330,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -351,6 +353,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -400,6 +404,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -545,6 +551,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -671,8 +679,6 @@
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@
@@ -715,8 +721,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -831,6 +842,8 @@
qtwindow.cc \
gstqtsink.cc \
gstqtsink.h \
+ gstqtsrc.cc \
+ gstqtsrc.h \
gstqtgl.h \
gstplugin.cc
@@ -935,6 +948,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstqmlgl_la-gstqsgtexture.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstqmlgl_la-gstqtglutility.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstqmlgl_la-gstqtsink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstqmlgl_la-gstqtsrc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstqmlgl_la-moc_gstqsgtexture.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstqmlgl_la-moc_qtitem.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstqmlgl_la-moc_qtwindow.Plo@am__quote@
@@ -1000,6 +1014,13 @@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstqmlgl_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstqmlgl_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstqmlgl_la-gstqtsink.lo `test -f 'gstqtsink.cc' || echo '$(srcdir)/'`gstqtsink.cc
+libgstqmlgl_la-gstqtsrc.lo: gstqtsrc.cc
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstqmlgl_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstqmlgl_la_CXXFLAGS) $(CXXFLAGS) -MT libgstqmlgl_la-gstqtsrc.lo -MD -MP -MF $(DEPDIR)/libgstqmlgl_la-gstqtsrc.Tpo -c -o libgstqmlgl_la-gstqtsrc.lo `test -f 'gstqtsrc.cc' || echo '$(srcdir)/'`gstqtsrc.cc
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstqmlgl_la-gstqtsrc.Tpo $(DEPDIR)/libgstqmlgl_la-gstqtsrc.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gstqtsrc.cc' object='libgstqmlgl_la-gstqtsrc.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 $(libgstqmlgl_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstqmlgl_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstqmlgl_la-gstqtsrc.lo `test -f 'gstqtsrc.cc' || echo '$(srcdir)/'`gstqtsrc.cc
+
libgstqmlgl_la-gstplugin.lo: gstplugin.cc
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstqmlgl_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstqmlgl_la_CXXFLAGS) $(CXXFLAGS) -MT libgstqmlgl_la-gstplugin.lo -MD -MP -MF $(DEPDIR)/libgstqmlgl_la-gstplugin.Tpo -c -o libgstqmlgl_la-gstplugin.lo `test -f 'gstplugin.cc' || echo '$(srcdir)/'`gstplugin.cc
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstqmlgl_la-gstplugin.Tpo $(DEPDIR)/libgstqmlgl_la-gstplugin.Plo
diff --git a/ext/qt/gstplugin.cc b/ext/qt/gstplugin.cc
index 27a1f14..01ca275 100644
--- a/ext/qt/gstplugin.cc
+++ b/ext/qt/gstplugin.cc
@@ -23,6 +23,7 @@
#endif
#include "gstqtsink.h"
+#include "gstqtsrc.h"
#include <QtQml/QQmlApplicationEngine>
static gboolean
@@ -32,7 +33,11 @@
GST_RANK_NONE, GST_TYPE_QT_SINK)) {
return FALSE;
}
-
+
+ if (!gst_element_register (plugin, "qmlglsrc",
+ GST_RANK_NONE, GST_TYPE_QT_SRC)) {
+ return FALSE;
+ }
/* this means the plugin must be loaded before the qml engine is loaded */
qmlRegisterType<QtGLVideoItem> ("org.freedesktop.gstreamer.GLVideoItem", 1, 0, "GstGLVideoItem");
diff --git a/ext/qt/gstqsgtexture.cc b/ext/qt/gstqsgtexture.cc
index 13208c0..85747f2 100644
--- a/ext/qt/gstqsgtexture.cc
+++ b/ext/qt/gstqsgtexture.cc
@@ -45,6 +45,7 @@
gst_video_info_init (&this->v_info);
this->buffer_ = NULL;
+ this->qt_context_ = NULL;
this->sync_buffer_ = gst_buffer_new ();
}
@@ -87,6 +88,9 @@
GstMemory *mem;
guint tex_id;
+ if (!this->qt_context_)
+ return;
+
gst_gl_context_activate (this->qt_context_, TRUE);
if (!this->buffer_)
diff --git a/ext/qt/gstqtsrc.cc b/ext/qt/gstqtsrc.cc
new file mode 100644
index 0000000..3cfc709
--- /dev/null
+++ b/ext/qt/gstqtsrc.cc
@@ -0,0 +1,606 @@
+/*
+ * GStreamer
+ * Copyright (C) 2016 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * 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:qmlglsrc
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstqtsrc.h"
+#include <QtGui/QGuiApplication>
+
+#define GST_CAT_DEFAULT gst_debug_qt_gl_src
+GST_DEBUG_CATEGORY (GST_CAT_DEFAULT);
+
+#define DEFAULT_IS_LIVE TRUE
+
+static void gst_qt_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_qt_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static void gst_qt_src_finalize (GObject * object);
+
+static gboolean gst_qt_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps);
+static GstCaps *gst_qt_src_get_caps (GstBaseSrc * bsrc, GstCaps * filter);
+static gboolean gst_qt_src_query (GstBaseSrc * bsrc, GstQuery * query);
+
+static gboolean gst_qt_src_decide_allocation (GstBaseSrc * bsrc,
+ GstQuery * query);
+static GstFlowReturn gst_qt_src_fill (GstPushSrc * psrc, GstBuffer * buffer);
+static GstStateChangeReturn gst_qt_src_change_state (GstElement * element,
+ GstStateChange transition);
+static gboolean gst_qt_src_start (GstBaseSrc * basesrc);
+static gboolean gst_qt_src_stop (GstBaseSrc * basesrc);
+
+static GstStaticPadTemplate gst_qt_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ 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
+{
+ ARG_0,
+ PROP_WINDOW,
+ PROP_DEFAULT_FBO
+};
+
+#define gst_qt_src_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstQtSrc, gst_qt_src,
+ GST_TYPE_PUSH_SRC, GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT,
+ "qtsrc", 0, "Qt Video Src"));
+
+static const gfloat vertical_flip_matrix[] = {
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, -1.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f,
+};
+
+static void
+gst_qt_src_class_init (GstQtSrcClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstElementClass *gstelement_class = (GstElementClass *) klass;
+ GstBaseSrcClass *gstbasesrc_class = (GstBaseSrcClass *) klass;
+ GstPushSrcClass *gstpushsrc_class = (GstPushSrcClass *) klass;
+
+ gobject_class->set_property = gst_qt_src_set_property;
+ gobject_class->get_property = gst_qt_src_get_property;
+ gobject_class->finalize = gst_qt_src_finalize;
+
+ gst_element_class_set_metadata (gstelement_class, "Qt Video Source",
+ "Source/Video", "A video src the grab window from a qml view",
+ "Multimedia Team <shmmmw@freescale.com>");
+
+ g_object_class_install_property (gobject_class, PROP_WINDOW,
+ g_param_spec_pointer ("window", "QQuickWindow",
+ "The QQuickWindow to place in the object heirachy",
+ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
+
+ g_object_class_install_property (gobject_class, PROP_DEFAULT_FBO,
+ g_param_spec_boolean ("use-default-fbo",
+ "If use default fbo",
+ "When set TRUE, it will not create new fbo for qml render thread",
+ FALSE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&gst_qt_src_template));
+
+ gstelement_class->change_state = gst_qt_src_change_state;
+ gstbasesrc_class->set_caps = gst_qt_src_setcaps;
+ gstbasesrc_class->get_caps = gst_qt_src_get_caps;
+ gstbasesrc_class->query = gst_qt_src_query;
+ gstbasesrc_class->start = gst_qt_src_start;
+ gstbasesrc_class->stop = gst_qt_src_stop;
+ gstbasesrc_class->decide_allocation = gst_qt_src_decide_allocation;
+
+ gstpushsrc_class->fill = gst_qt_src_fill;
+}
+
+static void
+gst_qt_src_init (GstQtSrc * src)
+{
+ gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_TIME);
+ gst_base_src_set_live (GST_BASE_SRC (src), DEFAULT_IS_LIVE);
+ src->default_fbo = FALSE;
+ src->pending_image_orientation = TRUE;
+}
+
+static void
+gst_qt_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstQtSrc *qt_src = GST_QT_SRC (object);
+
+ switch (prop_id) {
+ case PROP_WINDOW:{
+ qt_src->qwindow =
+ static_cast < QQuickWindow * >(g_value_get_pointer (value));
+
+ if (qt_src->window)
+ delete qt_src->window;
+ if (qt_src->qwindow)
+ qt_src->window = new QtGLWindow (NULL, qt_src->qwindow);
+
+ break;
+ }
+ case PROP_DEFAULT_FBO:
+ qt_src->default_fbo = g_value_get_boolean (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_qt_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstQtSrc *qt_src = GST_QT_SRC (object);
+
+ switch (prop_id) {
+ case PROP_WINDOW:
+ g_value_set_pointer (value, qt_src->qwindow);
+ break;
+ case PROP_DEFAULT_FBO:
+ g_value_set_boolean (value, qt_src->default_fbo);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_qt_src_finalize (GObject * object)
+{
+ GstQtSrc *qt_src = GST_QT_SRC (object);
+
+ GST_DEBUG ("qmlglsrc finalize");
+ if (qt_src->context)
+ gst_object_unref (qt_src->context);
+ qt_src->context = NULL;
+
+ if (qt_src->qt_context)
+ gst_object_unref (qt_src->qt_context);
+ qt_src->qt_context = NULL;
+
+ if (qt_src->display)
+ gst_object_unref (qt_src->display);
+ qt_src->display = NULL;
+
+ if (qt_src->window)
+ delete qt_src->window;
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static gboolean
+gst_qt_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps)
+{
+ GstQtSrc *qt_src = GST_QT_SRC (bsrc);
+
+ GST_DEBUG ("set caps with %" GST_PTR_FORMAT, caps);
+
+ if (!gst_video_info_from_caps (&qt_src->v_info, caps))
+ return FALSE;
+
+ if (!qt_window_set_caps (qt_src->window, caps))
+ return FALSE;
+
+ return TRUE;
+}
+
+static GstCaps *
+gst_qt_src_get_caps (GstBaseSrc * bsrc, GstCaps * filter)
+{
+ GstCaps *caps = NULL, *temp = NULL;
+ GstPadTemplate *pad_template;
+ GstBaseSrcClass *bclass = GST_BASE_SRC_GET_CLASS (bsrc);
+ GstQtSrc *qt_src = GST_QT_SRC (bsrc);
+ guint i;
+ gint width, height;
+
+ if (qt_src->window) {
+ qt_src->window->getGeometry (&width, &height);
+ }
+
+ pad_template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (bclass), "src");
+ if (pad_template != NULL)
+ caps = gst_pad_template_get_caps (pad_template);
+
+ if (qt_src->window) {
+ temp = gst_caps_copy (caps);
+ guint n_caps = gst_caps_get_size (caps);
+
+ for (i = 0; i < n_caps; i++) {
+ GstStructure *s = gst_caps_get_structure (temp, i);
+ gst_structure_set (s, "width", G_TYPE_INT, width, NULL);
+ gst_structure_set (s, "height", G_TYPE_INT, height, NULL);
+ /* because the framerate is unknown */
+ gst_structure_set (s, "framerate", GST_TYPE_FRACTION, 0, 1, NULL);
+ gst_structure_set (s, "pixel-aspect-ratio",
+ GST_TYPE_FRACTION, 1, 1, NULL);
+ }
+
+ gst_caps_unref (caps);
+ caps = temp;
+ }
+
+ if (filter) {
+ GstCaps *intersection;
+
+ intersection =
+ gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (caps);
+ caps = intersection;
+ }
+
+ return caps;
+}
+
+static gboolean
+gst_qt_src_query (GstBaseSrc * bsrc, GstQuery * query)
+{
+ GstQtSrc *qt_src = GST_QT_SRC (bsrc);
+ gboolean res = FALSE;
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_CONTEXT:
+ {
+ const gchar *context_type;
+ GstContext *context, *old_context;
+ gboolean ret;
+
+ if (!qt_window_is_scenegraph_initialized (qt_src->window))
+ return FALSE;
+
+ if (!qt_src->display && !qt_src->qt_context) {
+ qt_src->display = qt_window_get_display (qt_src->window);
+ qt_src->qt_context = qt_window_get_qt_context (qt_src->window);
+ }
+
+ ret = gst_gl_handle_context_query ((GstElement *) qt_src, query,
+ &qt_src->display, &qt_src->qt_context);
+
+ if (qt_src->display)
+ gst_gl_display_filter_gl_api (qt_src->display,
+ gst_gl_context_get_gl_api (qt_src->qt_context));
+
+ gst_query_parse_context_type (query, &context_type);
+
+ if (g_strcmp0 (context_type, "gst.gl.app_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.app_context", FALSE);
+
+ s = gst_context_writable_structure (context);
+ gst_structure_set (s, "context", GST_GL_TYPE_CONTEXT,
+ qt_src->qt_context, NULL);
+ gst_query_set_context (query, context);
+ gst_context_unref (context);
+
+ ret = qt_src->qt_context != NULL;
+ }
+ GST_LOG_OBJECT (qt_src, "context query of type %s %i", context_type, ret);
+
+ if (ret)
+ return ret;
+
+ /* fallthrough */
+ }
+ default:
+ res = GST_BASE_SRC_CLASS (parent_class)->query (bsrc, query);
+ break;
+ }
+
+ return res;
+}
+
+static gboolean
+_find_local_gl_context (GstQtSrc * qt_src)
+{
+ GstQuery *query;
+ GstContext *context;
+ const GstStructure *s;
+
+ if (qt_src->context)
+ return TRUE;
+
+ query = gst_query_new_context ("gst.gl.local_context");
+ if (!qt_src->context
+ && gst_gl_run_query (GST_ELEMENT (qt_src), 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, &qt_src->context,
+ NULL);
+ }
+ }
+
+ GST_DEBUG_OBJECT (qt_src, "found local context %p", qt_src->context);
+
+ gst_query_unref (query);
+
+ if (qt_src->context)
+ return TRUE;
+
+ return FALSE;
+}
+
+static gboolean
+gst_qt_src_decide_allocation (GstBaseSrc * bsrc, GstQuery * query)
+{
+ GstBufferPool *pool = NULL;
+ GstStructure *config;
+ GstCaps *caps;
+ guint min, max, size, n, i;
+ gboolean update_pool, update_allocator;
+ GstAllocator *allocator;
+ GstAllocationParams params;
+ GstGLVideoAllocationParams *glparams;
+ GstVideoInfo vinfo;
+ GstQtSrc *qt_src = GST_QT_SRC (bsrc);
+
+ if (gst_query_find_allocation_meta (query,
+ GST_VIDEO_AFFINE_TRANSFORMATION_META_API_TYPE, NULL)) {
+ qt_src->downstream_supports_affine_meta = TRUE;
+ } else {
+ qt_src->downstream_supports_affine_meta = FALSE;
+ }
+
+ gst_query_parse_allocation (query, &caps, NULL);
+ if (!caps)
+ return FALSE;
+
+ gst_video_info_from_caps (&vinfo, caps);
+
+ n = gst_query_get_n_allocation_pools (query);
+ if (n > 0) {
+ update_pool = TRUE;
+ for (i = 0; i < n; i++) {
+ gst_query_parse_nth_allocation_pool (query, i, &pool, &size, &min, &max);
+
+ if (!pool || !GST_IS_GL_BUFFER_POOL (pool)) {
+ if (pool)
+ gst_object_unref (pool);
+ pool = NULL;
+ }
+ }
+ }
+
+ if (!pool) {
+ size = vinfo.size;
+ min = max = 0;
+ update_pool = FALSE;
+ }
+
+ if (!qt_src->context && !_find_local_gl_context (qt_src))
+ return FALSE;
+
+ if (!pool) {
+ if (!qt_src->context || !GST_IS_GL_CONTEXT (qt_src->context))
+ return FALSE;
+
+ pool = gst_gl_buffer_pool_new (qt_src->context);
+ GST_INFO_OBJECT (qt_src, "No pool, create one ourself %p", pool);
+ }
+
+ config = gst_buffer_pool_get_config (pool);
+
+ gst_buffer_pool_config_set_params (config, caps, size, min, max);
+ gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META);
+ if (gst_query_find_allocation_meta (query, GST_GL_SYNC_META_API_TYPE, NULL))
+ gst_buffer_pool_config_add_option (config,
+ GST_BUFFER_POOL_OPTION_GL_SYNC_META);
+
+ if (gst_query_get_n_allocation_params (query) > 0) {
+ gst_query_parse_nth_allocation_param (query, 0, &allocator, ¶ms);
+ gst_buffer_pool_config_set_allocator (config, allocator, ¶ms);
+ GST_INFO_OBJECT (qt_src, "got allocator %p", allocator);
+ update_allocator = TRUE;
+ } else {
+ allocator = NULL;
+ gst_allocation_params_init (¶ms);
+ update_allocator = FALSE;
+ }
+
+ glparams =
+ gst_gl_video_allocation_params_new (qt_src->context, ¶ms, &vinfo, 0,
+ NULL, GST_GL_TEXTURE_TARGET_2D, GST_VIDEO_GL_TEXTURE_TYPE_RGBA);
+ gst_buffer_pool_config_set_gl_allocation_params (config,
+ (GstGLAllocationParams *) glparams);
+ gst_gl_allocation_params_free ((GstGLAllocationParams *) glparams);
+
+ if (!gst_buffer_pool_set_config (pool, config))
+ GST_WARNING_OBJECT (qt_src, "Failed to set buffer pool config");
+
+ if (update_allocator)
+ gst_query_set_nth_allocation_param (query, 0, allocator, ¶ms);
+ else
+ gst_query_add_allocation_param (query, allocator, ¶ms);
+ 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);
+ gst_object_unref (pool);
+
+ GST_INFO_OBJECT (qt_src, "successfully decide_allocation");
+ return TRUE;
+}
+
+static GstFlowReturn
+gst_qt_src_fill (GstPushSrc * psrc, GstBuffer * buffer)
+{
+ GstQtSrc *qt_src = GST_QT_SRC (psrc);
+
+ GST_DEBUG_OBJECT (qt_src, "setting buffer %p", buffer);
+
+ if (!qt_window_set_buffer (qt_src->window, buffer)) {
+ GST_ERROR_OBJECT (qt_src, "failed to fill buffer %p", buffer);
+ return GST_FLOW_ERROR;
+ }
+
+ if (!qt_src->downstream_supports_affine_meta) {
+ if (qt_src->pending_image_orientation) {
+ /* let downstream know the image orientation is vertical filp */
+ GstTagList *image_orientation_tag =
+ gst_tag_list_new (GST_TAG_IMAGE_ORIENTATION, "flip-rotate-180", NULL);
+
+ gst_pad_push_event (GST_BASE_SRC_PAD (psrc),
+ gst_event_new_tag (image_orientation_tag));
+
+ qt_src->pending_image_orientation = FALSE;
+ }
+ } else {
+ GstVideoAffineTransformationMeta *trans_meta;
+ trans_meta = gst_buffer_add_video_affine_transformation_meta (buffer);
+ gst_video_affine_transformation_meta_apply_matrix (trans_meta,
+ vertical_flip_matrix);
+ }
+
+ GST_DEBUG_OBJECT (qt_src, "buffer fill done %p", buffer);
+
+ return GST_FLOW_OK;
+}
+
+static GstStateChangeReturn
+gst_qt_src_change_state (GstElement * element, GstStateChange transition)
+{
+ GstQtSrc *qt_src = GST_QT_SRC (element);
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+ QGuiApplication *app;
+ guint64 frames_rendered = 0;
+
+ GST_DEBUG ("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:
+ app = static_cast < QGuiApplication * >(QCoreApplication::instance ());
+ if (!app) {
+ GST_ELEMENT_ERROR (element, RESOURCE, NOT_FOUND,
+ ("%s", "Failed to connect to Qt"),
+ ("%s", "Could not retrieve QGuiApplication instance"));
+ return GST_STATE_CHANGE_FAILURE;
+ }
+
+ if (!qt_src->window) {
+ GST_ELEMENT_ERROR (element, RESOURCE, NOT_FOUND,
+ ("%s", "Required property \'window\' not set"), (NULL));
+ return GST_STATE_CHANGE_FAILURE;
+ }
+
+ if (!qt_window_is_scenegraph_initialized (qt_src->window)) {
+ GST_ELEMENT_ERROR (element, RESOURCE, NOT_FOUND,
+ ("%s", "Could not initialize window system"), (NULL));
+ return GST_STATE_CHANGE_FAILURE;
+ }
+
+ qt_window_use_default_fbo (qt_src->window, qt_src->default_fbo);
+
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ return ret;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ qt_src->run_time = gst_element_get_start_time (GST_ELEMENT (qt_src));
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ qt_window_get_total_frames (qt_src->window, &frames_rendered);
+ if (qt_src->run_time > 0) {
+ GST_DEBUG ("qmlglsrc Total refresh frames (%ld), playing for (%"
+ GST_TIME_FORMAT "), fps (%.3f).\n", frames_rendered,
+ GST_TIME_ARGS (qt_src->run_time),
+ (gfloat) GST_SECOND * frames_rendered / qt_src->run_time);
+ }
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+static gboolean
+gst_qt_src_start (GstBaseSrc * basesrc)
+{
+ GstQtSrc *qt_src = GST_QT_SRC (basesrc);
+
+ /* already has get OpenGL configuration from qt */
+ if (qt_src->display && qt_src->qt_context)
+ return TRUE;
+
+ if (!qt_window_is_scenegraph_initialized (qt_src->window))
+ return FALSE;
+
+ qt_src->display = qt_window_get_display (qt_src->window);
+ qt_src->qt_context = qt_window_get_qt_context (qt_src->window);
+
+ if (!qt_src->display || !qt_src->qt_context) {
+ GST_ERROR_OBJECT (qt_src,
+ "Could not retrieve window system OpenGL configuration");
+ return FALSE;
+ }
+
+ GST_DEBUG_OBJECT (qt_src, "Got qt display %p and qt gl context %p",
+ qt_src->display, qt_src->qt_context);
+ return TRUE;
+}
+
+static gboolean
+gst_qt_src_stop (GstBaseSrc * basesrc)
+{
+ return TRUE;
+}
diff --git a/ext/resindvd/Makefile.in b/ext/resindvd/Makefile.in
index e8a9acd..56251dd 100644
--- a/ext/resindvd/Makefile.in
+++ b/ext/resindvd/Makefile.in
@@ -312,6 +312,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -333,6 +335,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -382,6 +386,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -527,6 +533,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -653,8 +661,6 @@
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@
@@ -697,8 +703,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/resindvd/resindvdbin.c b/ext/resindvd/resindvdbin.c
index 107f9d6..ce2bd1c 100644
--- a/ext/resindvd/resindvdbin.c
+++ b/ext/resindvd/resindvdbin.c
@@ -117,12 +117,12 @@
g_param_spec_string ("device", "Device", "DVD device location",
NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&video_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&audio_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&subpicture_src_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &video_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &audio_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &subpicture_src_template);
element_class->change_state = GST_DEBUG_FUNCPTR (rsn_dvdbin_change_state);
diff --git a/ext/resindvd/resindvdsrc.c b/ext/resindvd/resindvdsrc.c
index 505302b..ab89be7 100644
--- a/ext/resindvd/resindvdsrc.c
+++ b/ext/resindvd/resindvdsrc.c
@@ -231,8 +231,7 @@
"Skip straight to the DVD menu on start", DEFAULT_FASTSTART,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
gst_element_class_set_static_metadata (gstelement_class, "Resin DVD Src",
"Source/DVD", "DVD source element", "Jan Schmidt <thaytan@noraisin.net>");
}
diff --git a/ext/resindvd/resindvdsrc.h b/ext/resindvd/resindvdsrc.h
index cc2bb04..b5d8e36 100644
--- a/ext/resindvd/resindvdsrc.h
+++ b/ext/resindvd/resindvdsrc.h
@@ -23,7 +23,9 @@
#include <gst/base/gstbasesrc.h>
-#include "_stdint.h"
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
#include <dvdnav/dvdnav.h>
#include <dvdread/ifo_read.h>
diff --git a/ext/resindvd/rsndec.c b/ext/resindvd/rsndec.c
index 3403d9a..02d3eb6 100644
--- a/ext/resindvd/rsndec.c
+++ b/ext/resindvd/rsndec.c
@@ -405,10 +405,10 @@
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
RsnDecClass *dec_class = RSN_DEC_CLASS (klass);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&audio_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&audio_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &audio_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &audio_sink_template);
gst_element_class_set_static_metadata (element_class, "RsnAudioDec",
"Audio/Decoder",
@@ -455,10 +455,10 @@
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
RsnDecClass *dec_class = RSN_DEC_CLASS (klass);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&video_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&video_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &video_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &video_sink_template);
gst_element_class_set_static_metadata (element_class, "RsnVideoDec",
"Video/Decoder",
diff --git a/ext/resindvd/rsninputselector.c b/ext/resindvd/rsninputselector.c
index 75d8724..3849baf 100644
--- a/ext/resindvd/rsninputselector.c
+++ b/ext/resindvd/rsninputselector.c
@@ -1236,10 +1236,10 @@
"Julien Moutte <julien@moutte.net>, "
"Jan Schmidt <thaytan@mad.scientist.com>, "
"Wim Taymans <wim.taymans@gmail.com>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_input_selector_sink_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_input_selector_src_factory));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_input_selector_sink_factory);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_input_selector_src_factory);
gstelement_class->request_new_pad = gst_input_selector_request_new_pad;
gstelement_class->release_pad = gst_input_selector_release_pad;
diff --git a/ext/resindvd/rsnparsetter.c b/ext/resindvd/rsnparsetter.c
index a714658..294e513 100644
--- a/ext/resindvd/rsnparsetter.c
+++ b/ext/resindvd/rsnparsetter.c
@@ -55,10 +55,8 @@
gobject_class->finalize = rsn_parsetter_finalize;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
gst_element_class_set_static_metadata (element_class,
"Resin Aspect Ratio Setter", "Filter/Video",
diff --git a/ext/rsvg/Makefile.in b/ext/rsvg/Makefile.in
index 6224b10..87a5781 100644
--- a/ext/rsvg/Makefile.in
+++ b/ext/rsvg/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/rsvg/gstrsvgdec.c b/ext/rsvg/gstrsvgdec.c
index d87c6ca..5d5fc8e 100644
--- a/ext/rsvg/gstrsvgdec.c
+++ b/ext/rsvg/gstrsvgdec.c
@@ -86,10 +86,8 @@
"Uses librsvg to decode SVG images",
"Sebastian Dröge <sebastian.droege@collabora.co.uk>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
gobject_class->finalize = gst_rsvg_dec_finalize;
video_decoder_class->stop = GST_DEBUG_FUNCPTR (gst_rsvg_dec_stop);
diff --git a/ext/rsvg/gstrsvgoverlay.c b/ext/rsvg/gstrsvgoverlay.c
index 69f99ad..b467dc8 100644
--- a/ext/rsvg/gstrsvgoverlay.c
+++ b/ext/rsvg/gstrsvgoverlay.c
@@ -451,12 +451,11 @@
GstVideoFilterClass *videofilter_class = GST_VIDEO_FILTER_CLASS (klass);
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
- 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 (&video_sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&data_sink_template));
+ gst_element_class_add_static_pad_template (element_class, &src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &video_sink_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &data_sink_template);
gst_element_class_set_static_metadata (element_class, "RSVG overlay",
"Filter/Editor/Video",
diff --git a/ext/rtmp/Makefile.in b/ext/rtmp/Makefile.in
index 2061823..b737006 100644
--- a/ext/rtmp/Makefile.in
+++ b/ext/rtmp/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/rtmp/gstrtmpsink.c b/ext/rtmp/gstrtmpsink.c
index 781f3bf..1815d9c 100644
--- a/ext/rtmp/gstrtmpsink.c
+++ b/ext/rtmp/gstrtmpsink.c
@@ -109,8 +109,7 @@
"Sink/Network", "Sends FLV content to a server via RTMP",
"Jan Schmidt <thaytan@noraisin.net>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_template));
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_template);
gstbasesink_class->start = GST_DEBUG_FUNCPTR (gst_rtmp_sink_start);
gstbasesink_class->stop = GST_DEBUG_FUNCPTR (gst_rtmp_sink_stop);
diff --git a/ext/rtmp/gstrtmpsrc.c b/ext/rtmp/gstrtmpsrc.c
index 02cbec1..db620cc 100644
--- a/ext/rtmp/gstrtmpsrc.c
+++ b/ext/rtmp/gstrtmpsrc.c
@@ -68,7 +68,8 @@
enum
{
PROP_0,
- PROP_LOCATION
+ PROP_LOCATION,
+ PROP_TIMEOUT
#if 0
PROP_SWF_URL,
PROP_PAGE_URL
@@ -76,6 +77,7 @@
};
#define DEFAULT_LOCATION NULL
+#define DEFAULT_TIMEOUT 120
static void gst_rtmp_src_uri_handler_init (gpointer g_iface,
gpointer iface_data);
@@ -125,8 +127,13 @@
"Location of the RTMP url to read",
DEFAULT_LOCATION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&srctemplate));
+ g_object_class_install_property (gobject_class, PROP_TIMEOUT,
+ g_param_spec_int ("timeout", "RTMP Timeout",
+ "Time without receiving any data from the server to wait before to timeout the session",
+ 0, G_MAXINT,
+ DEFAULT_TIMEOUT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_add_static_pad_template (gstelement_class, &srctemplate);
gst_element_class_set_static_metadata (gstelement_class,
"RTMP Source",
@@ -161,6 +168,7 @@
rtmpsrc->cur_offset = 0;
rtmpsrc->last_timestamp = 0;
+ rtmpsrc->timeout = DEFAULT_TIMEOUT;
gst_base_src_set_format (GST_BASE_SRC (rtmpsrc), GST_FORMAT_TIME);
}
@@ -272,6 +280,10 @@
g_value_get_string (value), NULL);
break;
}
+ case PROP_TIMEOUT:{
+ src->timeout = g_value_get_int (value);
+ break;
+ }
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -290,6 +302,9 @@
case PROP_LOCATION:
g_value_set_string (value, src->uri);
break;
+ case PROP_TIMEOUT:
+ g_value_set_int (value, src->timeout);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -309,7 +324,6 @@
guint8 *data;
guint todo;
gsize bsize;
- int read;
int size;
src = GST_RTMP_SRC (pushsrc);
@@ -327,20 +341,19 @@
return GST_FLOW_ERROR;
}
- bsize = todo = size;
+ todo = size;
gst_buffer_map (buf, &map, GST_MAP_WRITE);
data = map.data;
- read = bsize = 0;
+ bsize = 0;
while (todo > 0) {
- read = RTMP_Read (src->rtmp, (char *) data, todo);
+ int read = RTMP_Read (src->rtmp, (char *) data, todo);
- if (G_UNLIKELY (read == 0 && todo == size)) {
+ if (G_UNLIKELY (read == 0 && todo == size))
goto eos;
- } else if (G_UNLIKELY (read == 0)) {
- todo = 0;
+
+ if (G_UNLIKELY (read == 0))
break;
- }
if (G_UNLIKELY (read < 0))
goto read_failed;
@@ -575,13 +588,13 @@
src->discont = TRUE;
src->rtmp = RTMP_Alloc ();
-
if (!src->rtmp) {
GST_ERROR_OBJECT (src, "Could not allocate librtmp's RTMP context");
goto error;
}
RTMP_Init (src->rtmp);
+ src->rtmp->Link.timeout = src->timeout;
if (!RTMP_SetupURL (src->rtmp, src->uri)) {
GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL),
("Failed to setup URL '%s'", src->uri));
diff --git a/ext/rtmp/gstrtmpsrc.h b/ext/rtmp/gstrtmpsrc.h
index fa6da17..60ebcb2 100644
--- a/ext/rtmp/gstrtmpsrc.h
+++ b/ext/rtmp/gstrtmpsrc.h
@@ -63,7 +63,7 @@
gchar *page_url;
RTMP *rtmp;
-
+ int timeout;
gint64 cur_offset;
GstClockTime last_timestamp;
gboolean seekable;
diff --git a/ext/sbc/Makefile.in b/ext/sbc/Makefile.in
index c840ea4..87a37fa 100644
--- a/ext/sbc/Makefile.in
+++ b/ext/sbc/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/sbc/gstsbcdec.c b/ext/sbc/gstsbcdec.c
index 086fe1f..5019e83 100644
--- a/ext/sbc/gstsbcdec.c
+++ b/ext/sbc/gstsbcdec.c
@@ -165,7 +165,8 @@
} else if (strcmp (channel_mode, "stereo") == 0) {
dec->frame_len = 4 + (subbands * 2) / 2 + ((blocks * bitpool) + 7) / 8;
} else if (strcmp (channel_mode, "joint") == 0) {
- dec->frame_len = 4 + (subbands * 2) / 2 + ((subbands + blocks * bitpool) + 7) / 8;
+ dec->frame_len =
+ 4 + (subbands * 2) / 2 + ((subbands + blocks * bitpool) + 7) / 8;
} else {
return FALSE;
}
@@ -219,11 +220,10 @@
audio_decoder_class->handle_frame =
GST_DEBUG_FUNCPTR (gst_sbc_dec_handle_frame);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sbc_dec_sink_factory));
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sbc_dec_src_factory));
+ gst_element_class_add_static_pad_template (element_class,
+ &sbc_dec_sink_factory);
+ gst_element_class_add_static_pad_template (element_class,
+ &sbc_dec_src_factory);
gst_element_class_set_static_metadata (element_class,
"Bluetooth SBC audio decoder", "Codec/Decoder/Audio",
diff --git a/ext/sbc/gstsbcenc.c b/ext/sbc/gstsbcenc.c
index 02ca1be..71aca07 100644
--- a/ext/sbc/gstsbcenc.c
+++ b/ext/sbc/gstsbcenc.c
@@ -346,11 +346,10 @@
encoder_class->set_format = GST_DEBUG_FUNCPTR (gst_sbc_enc_set_format);
encoder_class->handle_frame = GST_DEBUG_FUNCPTR (gst_sbc_enc_handle_frame);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sbc_enc_sink_factory));
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sbc_enc_src_factory));
+ gst_element_class_add_static_pad_template (element_class,
+ &sbc_enc_sink_factory);
+ gst_element_class_add_static_pad_template (element_class,
+ &sbc_enc_src_factory);
gst_element_class_set_static_metadata (element_class,
"Bluetooth SBC audio encoder", "Codec/Encoder/Audio",
diff --git a/ext/schroedinger/Makefile.in b/ext/schroedinger/Makefile.in
index 5b3f0a6..f2800c3 100644
--- a/ext/schroedinger/Makefile.in
+++ b/ext/schroedinger/Makefile.in
@@ -305,6 +305,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -326,6 +328,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -375,6 +379,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -520,6 +526,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -646,8 +654,6 @@
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@
@@ -690,8 +696,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/schroedinger/gstschrodec.c b/ext/schroedinger/gstschrodec.c
index 6ac6ae9..359a594 100644
--- a/ext/schroedinger/gstschrodec.c
+++ b/ext/schroedinger/gstschrodec.c
@@ -128,10 +128,10 @@
gobject_class->finalize = gst_schro_dec_finalize;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_schro_dec_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_schro_dec_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_schro_dec_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_schro_dec_sink_template);
gst_element_class_set_static_metadata (element_class, "Dirac Decoder",
"Codec/Decoder/Video",
diff --git a/ext/schroedinger/gstschroenc.c b/ext/schroedinger/gstschroenc.c
index 6cd761f..22ccc5e 100644
--- a/ext/schroedinger/gstschroenc.c
+++ b/ext/schroedinger/gstschroenc.c
@@ -214,10 +214,10 @@
}
}
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_schro_enc_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_schro_enc_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_schro_enc_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_schro_enc_sink_template);
gst_element_class_set_static_metadata (element_class, "Dirac Encoder",
"Codec/Encoder/Video",
diff --git a/ext/sdl/Makefile.in b/ext/sdl/Makefile.in
index 3c5ffda..d5548f8 100644
--- a/ext/sdl/Makefile.in
+++ b/ext/sdl/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/sdl/sdlaudiosink.c b/ext/sdl/sdlaudiosink.c
index 87dd730..ff03782 100644
--- a/ext/sdl/sdlaudiosink.c
+++ b/ext/sdl/sdlaudiosink.c
@@ -151,8 +151,8 @@
"Output to a sound card via SDLAUDIO",
"Edgard Lima <edgard.lima@indt.org.br>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sdlaudiosink_sink_factory));
+ gst_element_class_add_static_pad_template (element_class,
+ &sdlaudiosink_sink_factory);
}
static void
diff --git a/ext/smoothstreaming/Makefile.in b/ext/smoothstreaming/Makefile.in
index 5e2ebef..a7146a7 100644
--- a/ext/smoothstreaming/Makefile.in
+++ b/ext/smoothstreaming/Makefile.in
@@ -308,6 +308,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -329,6 +331,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -378,6 +382,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -523,6 +529,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -649,8 +657,6 @@
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@
@@ -693,8 +699,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/smoothstreaming/gstmssdemux.c b/ext/smoothstreaming/gstmssdemux.c
index c975e17..9d0aece 100644
--- a/ext/smoothstreaming/gstmssdemux.c
+++ b/ext/smoothstreaming/gstmssdemux.c
@@ -150,12 +150,12 @@
gstelement_class = (GstElementClass *) klass;
gstadaptivedemux_class = (GstAdaptiveDemuxClass *) klass;
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_mss_demux_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_mss_demux_videosrc_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_mss_demux_audiosrc_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_mss_demux_sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_mss_demux_videosrc_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_mss_demux_audiosrc_template);
gst_element_class_set_static_metadata (gstelement_class,
"Smooth Streaming demuxer", "Codec/Demuxer/Adaptive",
"Parse and demultiplex a Smooth Streaming manifest into audio and video "
@@ -543,7 +543,8 @@
GST_DEBUG_OBJECT (stream->pad,
"Using stream download bitrate %" G_GUINT64_FORMAT, bitrate);
- if (gst_mss_stream_select_bitrate (mssstream->manifest_stream, bitrate)) {
+ if (gst_mss_stream_select_bitrate (mssstream->manifest_stream,
+ bitrate / MAX (1.0, ABS (stream->demux->segment.rate)))) {
GstCaps *caps;
GstCaps *msscaps;
GstMssDemux *mssdemux = GST_MSS_DEMUX_CAST (stream->demux);
diff --git a/ext/smoothstreaming/gstmssmanifest.c b/ext/smoothstreaming/gstmssmanifest.c
index 02e559c..1b72e8d 100644
--- a/ext/smoothstreaming/gstmssmanifest.c
+++ b/ext/smoothstreaming/gstmssmanifest.c
@@ -569,8 +569,13 @@
parseres = gst_h264_parse_sps (&nalu, &sps_struct, TRUE);
if (parseres == GST_H264_PARSER_OK) {
+ gint fps_num, fps_den;
+
+ /* MSS apparently only supports non-interlaced/progressive H.264 content */
+ gst_h264_video_calculate_framerate (&sps_struct, 0, 0, &fps_num, &fps_den);
+
gst_caps_set_simple (caps, "framerate", GST_TYPE_FRACTION,
- sps_struct.fps_num, sps_struct.fps_den, NULL);
+ fps_num, fps_den, NULL);
}
buffer = _make_h264_codec_data (sps, pps);
diff --git a/ext/sndfile/Makefile.in b/ext/sndfile/Makefile.in
index a6706d2..302d860 100644
--- a/ext/sndfile/Makefile.in
+++ b/ext/sndfile/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/sndfile/gstsfdec.c b/ext/sndfile/gstsfdec.c
index d854dba..24a0e2d 100644
--- a/ext/sndfile/gstsfdec.c
+++ b/ext/sndfile/gstsfdec.c
@@ -157,8 +157,8 @@
"Read audio streams using libsndfile",
"Stefan Sauer <ensonic@user.sf.net>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sf_dec_src_factory));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &sf_dec_src_factory);
gst_element_class_add_pad_template (gstelement_class,
gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS,
diff --git a/ext/sndio/Makefile.in b/ext/sndio/Makefile.in
index f161778..9f4b22d 100644
--- a/ext/sndio/Makefile.in
+++ b/ext/sndio/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/sndio/sndiosink.c b/ext/sndio/sndiosink.c
index 1eab800..c9d0f71 100644
--- a/ext/sndio/sndiosink.c
+++ b/ext/sndio/sndiosink.c
@@ -95,8 +95,8 @@
"Sink/Audio",
"Plays audio through sndio", "Jacob Meuser <jakemsr@sdf.lonestar.org>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sndio_sink_factory));
+ gst_element_class_add_static_pad_template (element_class,
+ &sndio_sink_factory);
}
static void
diff --git a/ext/sndio/sndiosrc.c b/ext/sndio/sndiosrc.c
index 6800c7d..5721f42 100644
--- a/ext/sndio/sndiosrc.c
+++ b/ext/sndio/sndiosrc.c
@@ -93,8 +93,7 @@
"Source/Audio",
"Records audio through sndio", "Jacob Meuser <jakemsr@sdf.lonestar.org>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sndio_src_factory));
+ gst_element_class_add_static_pad_template (element_class, &sndio_src_factory);
}
static void
diff --git a/ext/soundtouch/Makefile.in b/ext/soundtouch/Makefile.in
index 59b8e07..c216413 100644
--- a/ext/soundtouch/Makefile.in
+++ b/ext/soundtouch/Makefile.in
@@ -323,6 +323,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -344,6 +346,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -393,6 +397,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -538,6 +544,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -664,8 +672,6 @@
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@
@@ -708,8 +714,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/soundtouch/gstpitch.cc b/ext/soundtouch/gstpitch.cc
index 2f33adf..b41e665 100644
--- a/ext/soundtouch/gstpitch.cc
+++ b/ext/soundtouch/gstpitch.cc
@@ -163,10 +163,8 @@
element_class->change_state = GST_DEBUG_FUNCPTR (gst_pitch_change_state);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_pitch_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_pitch_sink_template));
+ gst_element_class_add_static_pad_template (element_class, &gst_pitch_src_template);
+ gst_element_class_add_static_pad_template (element_class, &gst_pitch_sink_template);
gst_element_class_set_static_metadata (element_class, "Pitch controller",
"Filter/Effect/Audio", "Control the pitch of an audio stream",
diff --git a/ext/spandsp/Makefile.in b/ext/spandsp/Makefile.in
index 22460b9..f9a21c1 100644
--- a/ext/spandsp/Makefile.in
+++ b/ext/spandsp/Makefile.in
@@ -306,6 +306,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -327,6 +329,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -376,6 +380,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -521,6 +527,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -647,8 +655,6 @@
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@
@@ -691,8 +697,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/spandsp/gstdtmfdetect.c b/ext/spandsp/gstdtmfdetect.c
index 41966e4..362edb4 100644
--- a/ext/spandsp/gstdtmfdetect.c
+++ b/ext/spandsp/gstdtmfdetect.c
@@ -124,10 +124,8 @@
gobject_class->finalize = gst_dtmf_detect_finalize;
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&srctemplate));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sinktemplate));
+ gst_element_class_add_static_pad_template (gstelement_class, &srctemplate);
+ gst_element_class_add_static_pad_template (gstelement_class, &sinktemplate);
gst_element_class_set_static_metadata (gstelement_class,
"DTMF detector element", "Filter/Analyzer/Audio",
diff --git a/ext/spandsp/gstspanplc.c b/ext/spandsp/gstspanplc.c
index d3ff53f..06e1090 100644
--- a/ext/spandsp/gstspanplc.c
+++ b/ext/spandsp/gstspanplc.c
@@ -73,10 +73,8 @@
GObjectClass *gobject_class = (GObjectClass *) klass;
GstElementClass *gstelement_class = (GstElementClass *) klass;
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_factory);
gst_element_class_set_static_metadata (gstelement_class, "SpanDSP PLC",
"Filter/Effect/Audio",
diff --git a/ext/spandsp/gsttonegeneratesrc.c b/ext/spandsp/gsttonegeneratesrc.c
index 2b0cae7..c806799 100644
--- a/ext/spandsp/gsttonegeneratesrc.c
+++ b/ext/spandsp/gsttonegeneratesrc.c
@@ -142,8 +142,8 @@
"Whether to repeat specified tone indefinitly", DEFAULT_REPEAT,
G_PARAM_READWRITE));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_tone_generate_src_src_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_tone_generate_src_src_template);
gst_element_class_set_static_metadata (gstelement_class,
"Telephony Tone Generator source", "Source/Audio",
diff --git a/ext/spc/Makefile.in b/ext/spc/Makefile.in
index 288fc6e..efd1e38 100644
--- a/ext/spc/Makefile.in
+++ b/ext/spc/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/spc/gstspc.c b/ext/spc/gstspc.c
index d975185..d0f0393 100644
--- a/ext/spc/gstspc.c
+++ b/ext/spc/gstspc.c
@@ -81,10 +81,8 @@
"Uses OpenSPC to emulate an SPC processor",
"Chris Lee <clee@kde.org>, Brian Koropoff <bkoropoff@gmail.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
element_class->change_state = GST_DEBUG_FUNCPTR (gst_spc_dec_change_state);
gobject_class->dispose = gst_spc_dec_dispose;
diff --git a/ext/srtp/Makefile.in b/ext/srtp/Makefile.in
index fd26fe2..1895c1b 100644
--- a/ext/srtp/Makefile.in
+++ b/ext/srtp/Makefile.in
@@ -312,6 +312,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -333,6 +335,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -382,6 +386,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -527,6 +533,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -653,8 +661,6 @@
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@
@@ -697,8 +703,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/srtp/gstsrtpdec.c b/ext/srtp/gstsrtpdec.c
index 0120d92..b97094a 100644
--- a/ext/srtp/gstsrtpdec.c
+++ b/ext/srtp/gstsrtpdec.c
@@ -248,14 +248,14 @@
gobject_class->set_property = gst_srtp_dec_set_property;
gobject_class->get_property = gst_srtp_dec_get_property;
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&rtp_src_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&rtp_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&rtcp_src_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&rtcp_sink_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &rtp_src_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &rtp_sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &rtcp_src_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &rtcp_sink_template);
gst_element_class_set_static_metadata (gstelement_class, "SRTP decoder",
"Filter/Network/SRTP",
diff --git a/ext/srtp/gstsrtpenc.c b/ext/srtp/gstsrtpenc.c
index eb00886..c9ae980 100644
--- a/ext/srtp/gstsrtpenc.c
+++ b/ext/srtp/gstsrtpenc.c
@@ -159,7 +159,8 @@
PROP_RTCP_AUTH,
PROP_RANDOM_KEY,
PROP_REPLAY_WINDOW_SIZE,
- PROP_ALLOW_REPEAT_TX
+ PROP_ALLOW_REPEAT_TX,
+ PROP_STATS
};
typedef struct ProcessBufferItData
@@ -246,27 +247,6 @@
static void gst_srtp_enc_release_pad (GstElement * element, GstPad * pad);
-static guint32
-gst_srtp_enc_get_rollover_counter (GstSrtpEnc * filter, guint32 ssrc)
-{
- guint32 roc = 0;
- srtp_stream_t stream;
-
- GST_OBJECT_LOCK (filter);
-
- GST_DEBUG_OBJECT (filter, "retrieving SRTP Rollover Counter, ssrc: %u", ssrc);
-
- if (filter->session) {
- stream = srtp_get_stream (filter->session, htonl (ssrc));
- if (stream)
- roc = stream->rtp_rdbx.index >> 16;
- }
-
- GST_OBJECT_UNLOCK (filter);
-
- return roc;
-}
-
/* initialize the srtpenc's class
*/
static void
@@ -278,14 +258,14 @@
gobject_class = (GObjectClass *) klass;
gstelement_class = (GstElementClass *) klass;
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&rtp_src_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&rtp_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&rtcp_src_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&rtcp_sink_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &rtp_src_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &rtp_sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &rtcp_src_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &rtcp_sink_template);
gst_element_class_set_static_metadata (gstelement_class, "SRTP encoder",
"Filter/Network/SRTP",
@@ -342,6 +322,9 @@
"(Note that such repeated transmissions must have the same RTP payload, "
"or a severe security weakness is introduced!)",
DEFAULT_ALLOW_REPEAT_TX, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_STATS,
+ g_param_spec_boxed ("stats", "Statistics", "Various statistics",
+ GST_TYPE_STRUCTURE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
/**
* GstSrtpEnc::soft-limit:
@@ -354,22 +337,6 @@
gst_srtp_enc_signals[SIGNAL_SOFT_LIMIT] =
g_signal_new ("soft-limit", G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0);
-
- /**
- * GstSrtpEnc::get-rollover-counter:
- * @gstsrtpenc: the element on which the signal is emitted
- * @ssrc: The unique SSRC of the stream
- *
- * Request the SRTP rollover counter for the stream with @ssrc.
- */
- gst_srtp_enc_signals[SIGNAL_GET_ROLLOVER_COUNTER] =
- g_signal_new ("get-rollover-counter", G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstSrtpEncClass,
- get_rollover_counter), NULL, NULL, g_cclosure_marshal_generic,
- G_TYPE_UINT, 1, G_TYPE_UINT);
-
- klass->get_rollover_counter =
- GST_DEBUG_FUNCPTR (gst_srtp_enc_get_rollover_counter);
}
@@ -419,9 +386,11 @@
gsize keysize;
if (filter->key == NULL) {
+ GST_OBJECT_UNLOCK (filter);
GST_ELEMENT_ERROR (filter, LIBRARY, SETTINGS,
("Cipher is not NULL, key must be set"),
("Cipher is not NULL, key must be set"));
+ GST_OBJECT_LOCK (filter);
return err_status_fail;
}
@@ -429,10 +398,12 @@
keysize = gst_buffer_get_size (filter->key);
if (expected != keysize) {
+ GST_OBJECT_UNLOCK (filter);
GST_ELEMENT_ERROR (filter, LIBRARY, SETTINGS,
("Master key size is wrong"),
("Expected master key of %d bytes, but received %" G_GSIZE_FORMAT
" bytes", expected, keysize));
+ GST_OBJECT_LOCK (filter);
return err_status_fail;
}
}
@@ -633,6 +604,41 @@
G_OBJECT_CLASS (gst_srtp_enc_parent_class)->dispose (object);
}
+static GstStructure *
+gst_srtp_enc_create_stats (GstSrtpEnc * filter)
+{
+ GstStructure *s;
+ GValue va = G_VALUE_INIT;
+ GValue v = G_VALUE_INIT;
+
+ s = gst_structure_new_empty ("application/x-srtp-encoder-stats");
+
+ g_value_init (&va, GST_TYPE_ARRAY);
+ g_value_init (&v, GST_TYPE_STRUCTURE);
+
+ if (filter->session) {
+ srtp_stream_t stream = filter->session->stream_list;
+ while (stream) {
+ GstStructure *ss;
+ guint32 ssrc = GUINT32_FROM_BE (stream->ssrc);
+ guint32 roc = stream->rtp_rdbx.index >> 16;
+
+ ss = gst_structure_new ("application/x-srtp-stream",
+ "ssrc", G_TYPE_UINT, ssrc, "roc", G_TYPE_UINT, roc, NULL);
+
+ g_value_take_boxed (&v, ss);
+ gst_value_array_append_value (&va, &v);
+
+ stream = stream->next;
+ }
+ }
+
+ gst_structure_take_value (s, "streams", &va);
+ g_value_unset (&v);
+
+ return s;
+}
+
static void
gst_srtp_enc_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
@@ -724,6 +730,9 @@
case PROP_ALLOW_REPEAT_TX:
g_value_set_boolean (value, filter->allow_repeat_tx);
break;
+ case PROP_STATS:
+ g_value_take_boxed (value, gst_srtp_enc_create_stats (filter));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
diff --git a/ext/srtp/gstsrtpenc.h b/ext/srtp/gstsrtpenc.h
index 843af18..842c56f 100644
--- a/ext/srtp/gstsrtpenc.h
+++ b/ext/srtp/gstsrtpenc.h
@@ -89,9 +89,6 @@
struct _GstSrtpEncClass
{
GstElementClass parent_class;
-
- /* action signals */
- guint32 (*get_rollover_counter) (GstSrtpEnc *encoder, guint32 ssrc);
};
GType gst_srtp_enc_get_type (void);
diff --git a/ext/teletextdec/Makefile.in b/ext/teletextdec/Makefile.in
index 8de3342..f73d19c 100644
--- a/ext/teletextdec/Makefile.in
+++ b/ext/teletextdec/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/teletextdec/gstteletextdec.c b/ext/teletextdec/gstteletextdec.c
index 91b73c2..7f8a8a6 100644
--- a/ext/teletextdec/gstteletextdec.c
+++ b/ext/teletextdec/gstteletextdec.c
@@ -231,10 +231,8 @@
"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));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_template);
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_template);
}
/* initialize the new element
@@ -659,12 +657,13 @@
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);
+ GstStructure *caps_struct;
+ const gchar *caps_name, *caps_fmt;
+
gst_caps_unref (ourcaps);
if (gst_caps_is_empty (peercaps)) {
@@ -673,33 +672,26 @@
/* 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);
+ caps_struct = gst_caps_get_structure (peercaps, 0);
+ caps_name = gst_structure_get_name (caps_struct);
+ caps_fmt = gst_structure_get_string (caps_struct, "format");
- 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 (!g_strcmp0 (caps_name, "video/x-raw")) {
+ 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);
+ } else if (!g_strcmp0 (caps_name, "text/x-raw") &&
+ !g_strcmp0 (caps_fmt, "utf-8")) {
+ teletext->export_func = gst_teletextdec_export_text_page;
+ } else if (!g_strcmp0 (caps_name, "text/x-raw") &&
+ !g_strcmp0 (caps_fmt, "pango-markup")) {
+ teletext->export_func = gst_teletextdec_export_pango_page;
+ } else {
+ goto beach;
}
if (!gst_pad_push_event (teletext->srcpad, gst_event_new_caps (peercaps))) {
@@ -751,9 +743,7 @@
{
if (ret != GST_FLOW_OK && ret != GST_FLOW_NOT_LINKED
&& ret != GST_FLOW_FLUSHING) {
- GST_ELEMENT_ERROR (teletext, STREAM, FAILED,
- ("Internal data stream error."), ("stream stopped, reason %s",
- gst_flow_get_name (ret)));
+ GST_ELEMENT_FLOW_ERROR (teletext, ret);
return GST_FLOW_ERROR;
}
return ret;
diff --git a/ext/timidity/Makefile.in b/ext/timidity/Makefile.in
index 2f94f9f..0cfebaf 100644
--- a/ext/timidity/Makefile.in
+++ b/ext/timidity/Makefile.in
@@ -321,6 +321,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -342,6 +344,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -391,6 +395,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -536,6 +542,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -662,8 +670,6 @@
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@
@@ -706,8 +712,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/timidity/gsttimidity.c b/ext/timidity/gsttimidity.c
index 418a5fe..2078694 100644
--- a/ext/timidity/gsttimidity.c
+++ b/ext/timidity/gsttimidity.c
@@ -95,10 +95,8 @@
{
GstElementClass *element_class = GST_ELEMENT_CLASS (gclass);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
gst_element_class_set_static_metadata (element_class, "Timidity",
"Codec/Decoder/Audio",
"Midi Synthesizer Element", "Wouter Paesen <wouter@blue-gate.be>");
@@ -745,9 +743,7 @@
}
error:
{
- GST_ELEMENT_ERROR (timidity, STREAM, FAILED,
- ("Internal data stream error"),
- ("Streaming stopped, reason %s", gst_flow_get_name (ret)));
+ GST_ELEMENT_FLOW_ERROR (timidity, ret);
gst_pad_push_event (timidity->srcpad, gst_event_new_eos ());
goto paused;
}
diff --git a/ext/timidity/gstwildmidi.c b/ext/timidity/gstwildmidi.c
index 42b40d4..7f380d6 100644
--- a/ext/timidity/gstwildmidi.c
+++ b/ext/timidity/gstwildmidi.c
@@ -239,10 +239,8 @@
"High Quality", DEFAULT_HIGH_QUALITY,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_factory);
gst_element_class_set_static_metadata (gstelement_class, "WildMidi",
"Codec/Decoder/Audio",
"Midi Synthesizer Element", "Wouter Paesen <wouter@blue-gate.be>");
@@ -674,7 +672,7 @@
gst_buffer_map (buffer, &info, GST_MAP_READWRITE);
GST_OBJECT_LOCK (wildmidi);
- size = WildMidi_GetOutput (wildmidi->song, (char *) info.data,
+ size = WildMidi_GetOutput (wildmidi->song, (gpointer) info.data,
(unsigned long int) info.size);
GST_OBJECT_UNLOCK (wildmidi);
@@ -900,9 +898,7 @@
event = gst_event_new_eos ();
/* for fatal errors we post an error message, post the error
* first so the app knows about the error first. */
- GST_ELEMENT_ERROR (wildmidi, STREAM, FAILED,
- ("Internal data flow error."),
- ("streaming task paused, reason %s (%d)", reason, ret));
+ GST_ELEMENT_FLOW_ERROR (wildmidi, ret);
gst_pad_push_event (wildmidi->srcpad, event);
}
}
diff --git a/ext/voaacenc/Makefile.in b/ext/voaacenc/Makefile.in
index 8638438..8cabe02 100644
--- a/ext/voaacenc/Makefile.in
+++ b/ext/voaacenc/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/voaacenc/gstvoaacenc.c b/ext/voaacenc/gstvoaacenc.c
index 315f373..674c481 100644
--- a/ext/voaacenc/gstvoaacenc.c
+++ b/ext/voaacenc/gstvoaacenc.c
@@ -163,10 +163,8 @@
0, G_MAXINT, VOAAC_ENC_DEFAULT_BITRATE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
+ gst_element_class_add_static_pad_template (element_class, &src_template);
gst_element_class_set_static_metadata (element_class, "AAC audio encoder",
"Codec/Encoder/Audio", "AAC audio encoder", "Kan Hu <kan.hu@linaro.org>");
diff --git a/ext/voamrwbenc/Makefile.in b/ext/voamrwbenc/Makefile.in
index 30b2dd2..7c719d9 100644
--- a/ext/voamrwbenc/Makefile.in
+++ b/ext/voamrwbenc/Makefile.in
@@ -305,6 +305,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -326,6 +328,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -375,6 +379,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -520,6 +526,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -646,8 +654,6 @@
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@
@@ -690,8 +696,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/voamrwbenc/gstvoamrwbenc.c b/ext/voamrwbenc/gstvoamrwbenc.c
index ae09f06..f744958 100644
--- a/ext/voamrwbenc/gstvoamrwbenc.c
+++ b/ext/voamrwbenc/gstvoamrwbenc.c
@@ -162,10 +162,8 @@
object_class->set_property = gst_voamrwbenc_set_property;
object_class->get_property = gst_voamrwbenc_get_property;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
+ gst_element_class_add_static_pad_template (element_class, &src_template);
gst_element_class_set_static_metadata (element_class, "AMR-WB audio encoder",
"Codec/Encoder/Audio",
diff --git a/ext/vulkan/Makefile.am b/ext/vulkan/Makefile.am
index ac3ac08..1b19e19 100644
--- a/ext/vulkan/Makefile.am
+++ b/ext/vulkan/Makefile.am
@@ -1,7 +1,7 @@
plugin_LTLIBRARIES = libgstvulkan.la
SUBDIRS =
-DIST_SUBDIRS = xcb
+DIST_SUBDIRS = xcb wayland
DISTCLEANFILES = vkconfig.h
libgstvulkan_la_SOURCES = \
@@ -63,6 +63,11 @@
libgstvulkan_la_LIBADD += xcb/libgstvulkan-xcb.la
endif
+if USE_WAYLAND
+SUBDIRS += wayland
+libgstvulkan_la_LIBADD += wayland/libgstvulkan-wayland.la
+endif
+
libgstvulkan_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
libgstvulkan_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
diff --git a/ext/vulkan/Makefile.in b/ext/vulkan/Makefile.in
index 010c758..c4dd3d5 100644
--- a/ext/vulkan/Makefile.in
+++ b/ext/vulkan/Makefile.in
@@ -92,6 +92,8 @@
target_triplet = @target@
@USE_XCB_TRUE@am__append_1 = xcb
@USE_XCB_TRUE@am__append_2 = xcb/libgstvulkan-xcb.la
+@USE_WAYLAND_TRUE@am__append_3 = wayland
+@USE_WAYLAND_TRUE@am__append_4 = wayland/libgstvulkan-wayland.la
subdir = ext/vulkan
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
@@ -166,7 +168,8 @@
LTLIBRARIES = $(plugin_LTLIBRARIES)
am__DEPENDENCIES_1 =
libgstvulkan_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) $(am__append_2)
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) $(am__append_2) \
+ $(am__append_4)
am_libgstvulkan_la_OBJECTS = libgstvulkan_la-gstvulkan.lo \
libgstvulkan_la-vkdevice.lo libgstvulkan_la-vkdisplay.lo \
libgstvulkan_la-vkerror.lo libgstvulkan_la-vkbuffermemory.lo \
@@ -353,6 +356,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -374,6 +379,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -423,6 +430,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -568,6 +577,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -694,8 +705,6 @@
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@
@@ -738,8 +747,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -829,8 +843,8 @@
top_srcdir = @top_srcdir@
wayland_scanner = @wayland_scanner@
plugin_LTLIBRARIES = libgstvulkan.la
-SUBDIRS = $(am__append_1)
-DIST_SUBDIRS = xcb
+SUBDIRS = $(am__append_1) $(am__append_3)
+DIST_SUBDIRS = xcb wayland
DISTCLEANFILES = vkconfig.h
libgstvulkan_la_SOURCES = \
gstvulkan.c \
@@ -881,7 +895,8 @@
$(VULKAN_CFLAGS)
libgstvulkan_la_LIBADD = $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) \
- -lgstvideo-$(GST_API_VERSION) $(VULKAN_LIBS) $(am__append_2)
+ -lgstvideo-$(GST_API_VERSION) $(VULKAN_LIBS) $(am__append_2) \
+ $(am__append_4)
libgstvulkan_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
libgstvulkan_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
all: all-recursive
diff --git a/ext/vulkan/vkapi.h b/ext/vulkan/vkapi.h
index 525a6c0..e9c23aa 100644
--- a/ext/vulkan/vkapi.h
+++ b/ext/vulkan/vkapi.h
@@ -34,6 +34,12 @@
#endif
#endif
+#if GST_VULKAN_HAVE_WINDOW_WAYLAND
+#ifndef VK_USE_PLATFORM_WAYLAND_KHR
+#define VK_USE_PLATFORM_WAYLAND_KHR
+#endif
+#endif
+
#include <vulkan/vulkan.h>
#endif /* _VK_H_ */
diff --git a/ext/vulkan/vkconfig.h b/ext/vulkan/vkconfig.h
index 4ae6df9..f381cdd 100644
--- a/ext/vulkan/vkconfig.h
+++ b/ext/vulkan/vkconfig.h
@@ -11,7 +11,8 @@
G_BEGIN_DECLS
- #define GST_VULKAN_HAVE_WINDOW_XCB 1
+#define GST_VULKAN_HAVE_WINDOW_XCB 1
+#define GST_VULKAN_HAVE_WINDOW_WAYLAND 1
G_END_DECLS
diff --git a/ext/vulkan/vkdevice.c b/ext/vulkan/vkdevice.c
index 5825391..5c2b279 100644
--- a/ext/vulkan/vkdevice.c
+++ b/ext/vulkan/vkdevice.c
@@ -143,10 +143,14 @@
vkGetPhysicalDeviceProperties (gpu, &props);
- GST_INFO_OBJECT (device, "device name %s type %s api version %u, "
- "driver version %u vendor ID 0x%x, device ID 0x%x", props.deviceName,
- _device_type_to_string (props.deviceType), props.apiVersion,
- props.driverVersion, props.vendorID, props.deviceID);
+ GST_INFO_OBJECT (device, "device name %s type %s api version %u.%u.%u, "
+ "driver version %u.%u.%u vendor ID 0x%x, device ID 0x%x",
+ props.deviceName, _device_type_to_string (props.deviceType),
+ VK_VERSION_MAJOR (props.apiVersion), VK_VERSION_MINOR (props.apiVersion),
+ VK_VERSION_PATCH (props.apiVersion),
+ VK_VERSION_MAJOR (props.driverVersion),
+ VK_VERSION_MINOR (props.driverVersion),
+ VK_VERSION_PATCH (props.driverVersion), props.vendorID, props.deviceID);
return TRUE;
}
@@ -289,8 +293,13 @@
device_info.pNext = NULL;
device_info.queueCreateInfoCount = 1;
device_info.pQueueCreateInfos = &queue_info;
+#if 0
device_info.enabledLayerCount = enabled_layer_count;
device_info.ppEnabledLayerNames = (const char *const *) enabled_layers;
+#else
+ device_info.enabledLayerCount = 0;
+ device_info.ppEnabledLayerNames = NULL;
+#endif
device_info.enabledExtensionCount = enabled_extension_count;
device_info.ppEnabledExtensionNames = (const char *const *) extension_names;
device_info.pEnabledFeatures = NULL;
diff --git a/ext/vulkan/vkdisplay.c b/ext/vulkan/vkdisplay.c
index a066821..096f251 100644
--- a/ext/vulkan/vkdisplay.c
+++ b/ext/vulkan/vkdisplay.c
@@ -33,6 +33,9 @@
#if GST_VULKAN_HAVE_WINDOW_XCB
#include "xcb/vkdisplay_xcb.h"
#endif
+#if GST_VULKAN_HAVE_WINDOW_WAYLAND
+#include "wayland/vkdisplay_wayland.h"
+#endif
GST_DEBUG_CATEGORY_STATIC (GST_CAT_CONTEXT);
#define GST_CAT_DEFAULT gst_vulkan_display_debug
@@ -142,11 +145,6 @@
GstVulkanDisplay *display = GST_VULKAN_DISPLAY (object);
g_mutex_lock (&display->priv->thread_lock);
- if (display->main_context && display->event_source) {
- g_source_destroy (display->event_source);
- g_source_unref (display->event_source);
- }
- display->event_source = NULL;
if (display->main_loop)
g_main_loop_quit (display->main_loop);
@@ -159,6 +157,12 @@
display->priv->event_thread = NULL;
g_mutex_unlock (&display->priv->thread_lock);
+ if (display->main_context && display->event_source) {
+ g_source_destroy (display->event_source);
+ g_source_unref (display->event_source);
+ }
+ display->event_source = NULL;
+
if (display->instance) {
gst_object_unref (display->instance);
}
@@ -179,6 +183,11 @@
display = GST_VULKAN_DISPLAY (gst_vulkan_display_xcb_new (NULL));
}
#endif
+#if GST_VULKAN_HAVE_WINDOW_WAYLAND
+ if (!display && type & GST_VULKAN_DISPLAY_TYPE_WAYLAND) {
+ display = GST_VULKAN_DISPLAY (gst_vulkan_display_wayland_new (NULL));
+ }
+#endif
if (display)
display->instance = gst_object_ref (instance);
@@ -387,6 +396,9 @@
#if GST_VULKAN_HAVE_WINDOW_XCB
CHOOSE_WINSYS (xcb, XCB);
#endif
+#if GST_VULKAN_HAVE_WINDOW_WAYLAND
+ CHOOSE_WINSYS (wayland, WAYLAND);
+#endif
#undef CHOOSE_WINSYS
@@ -408,6 +420,9 @@
if (type & GST_VULKAN_DISPLAY_TYPE_XCB)
return VK_KHR_XCB_SURFACE_EXTENSION_NAME;
+ if (type & GST_VULKAN_DISPLAY_TYPE_WAYLAND)
+ return VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME;
+
return NULL;
}
diff --git a/ext/vulkan/vkinstance.c b/ext/vulkan/vkinstance.c
index 0e48a17..d61458e 100644
--- a/ext/vulkan/vkinstance.c
+++ b/ext/vulkan/vkinstance.c
@@ -299,8 +299,13 @@
inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
inst_info.pNext = NULL;
inst_info.pApplicationInfo = &app;
+#if 0
inst_info.enabledLayerCount = enabled_layer_count;
inst_info.ppEnabledLayerNames = (const char *const *) enabled_layers;
+#else
+ inst_info.enabledLayerCount = 0;
+ inst_info.ppEnabledLayerNames = NULL;
+#endif
inst_info.enabledExtensionCount = enabled_extension_count;
inst_info.ppEnabledExtensionNames = (const char *const *) extension_names;
diff --git a/ext/vulkan/vksink.c b/ext/vulkan/vksink.c
index cb8530d..586d286 100644
--- a/ext/vulkan/vksink.c
+++ b/ext/vulkan/vksink.c
@@ -125,8 +125,8 @@
"Sink/Video", "A videosink based on OpenGL",
"Matthew Waters <matthew@centricular.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_vulkan_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_vulkan_sink_template);
gobject_class->finalize = gst_vulkan_sink_finalize;
diff --git a/ext/vulkan/vkswapper.c b/ext/vulkan/vkswapper.c
index 3ad50cd..d528f0b 100644
--- a/ext/vulkan/vkswapper.c
+++ b/ext/vulkan/vkswapper.c
@@ -93,12 +93,16 @@
switch (format) {
/* double check endianess */
case VK_FORMAT_R8G8B8A8_UNORM:
+ case VK_FORMAT_R8G8B8A8_SRGB:
return GST_VIDEO_FORMAT_RGBA;
case VK_FORMAT_R8G8B8_UNORM:
+ case VK_FORMAT_R8G8B8_SRGB:
return GST_VIDEO_FORMAT_RGB;
case VK_FORMAT_B8G8R8A8_UNORM:
+ case VK_FORMAT_B8G8R8A8_SRGB:
return GST_VIDEO_FORMAT_BGRA;
case VK_FORMAT_B8G8R8_UNORM:
+ case VK_FORMAT_B8G8R8_SRGB:
return GST_VIDEO_FORMAT_BGR;
default:
return GST_VIDEO_FORMAT_UNKNOWN;
@@ -106,17 +110,33 @@
}
static VkFormat
-_vk_format_from_video_format (GstVideoFormat v_format)
+_vk_format_from_video_info (GstVideoInfo * v_info)
{
- switch (v_format) {
+ switch (GST_VIDEO_INFO_FORMAT (v_info)) {
case GST_VIDEO_FORMAT_RGBA:
- return VK_FORMAT_R8G8B8A8_UNORM;
+ if (GST_VIDEO_INFO_COLORIMETRY (v_info).transfer ==
+ GST_VIDEO_TRANSFER_SRGB)
+ return VK_FORMAT_R8G8B8A8_SRGB;
+ else
+ return VK_FORMAT_R8G8B8A8_UNORM;
case GST_VIDEO_FORMAT_RGB:
- return VK_FORMAT_R8G8B8_UNORM;
+ if (GST_VIDEO_INFO_COLORIMETRY (v_info).transfer ==
+ GST_VIDEO_TRANSFER_SRGB)
+ return VK_FORMAT_R8G8B8_SRGB;
+ else
+ return VK_FORMAT_R8G8B8_UNORM;
case GST_VIDEO_FORMAT_BGRA:
- return VK_FORMAT_B8G8R8A8_UNORM;
+ if (GST_VIDEO_INFO_COLORIMETRY (v_info).transfer ==
+ GST_VIDEO_TRANSFER_SRGB)
+ return VK_FORMAT_B8G8R8A8_SRGB;
+ else
+ return VK_FORMAT_B8G8R8A8_UNORM;
case GST_VIDEO_FORMAT_BGR:
- return VK_FORMAT_B8G8R8_UNORM;
+ if (GST_VIDEO_INFO_COLORIMETRY (v_info).transfer ==
+ GST_VIDEO_TRANSFER_SRGB)
+ return VK_FORMAT_B8G8R8_SRGB;
+ else
+ return VK_FORMAT_B8G8R8_UNORM;
default:
return VK_FORMAT_UNDEFINED;
}
@@ -434,6 +454,7 @@
gst_structure_set_value (s, "format", &list);
g_value_unset (&list);
}
+
{
guint32 max_dim = swapper->device->gpu_props.limits.maxImageDimension2D;
@@ -531,11 +552,13 @@
{
VkSubmitInfo submit_info = { 0, };
+ VkPipelineStageFlags stages = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
submit_info.pNext = NULL;
submit_info.waitSemaphoreCount = 0;
submit_info.pWaitSemaphores = NULL;
+ submit_info.pWaitDstStageMask = &stages;
submit_info.commandBufferCount = 1;
submit_info.pCommandBuffers = &cmd;
submit_info.signalSemaphoreCount = 0;
@@ -629,8 +652,7 @@
preTransform = swapper->surf_props.currentTransform;
}
- format =
- _vk_format_from_video_format (GST_VIDEO_INFO_FORMAT (&swapper->v_info));
+ format = _vk_format_from_video_info (&swapper->v_info);
color_space = _vk_color_space_from_video_info (&swapper->v_info);
if ((swapper->surf_props.supportedCompositeAlpha &
@@ -777,7 +799,6 @@
struct cmd_data
{
VkCommandBuffer cmd;
- VkFence fence;
GDestroyNotify notify;
gpointer data;
};
@@ -867,10 +888,6 @@
cmd_data->cmd = cmd;
cmd_data->notify = NULL;
- if (!_new_fence (swapper->device, &cmd_data->fence, error)) {
- return FALSE;
- }
-
return TRUE;
}
@@ -878,7 +895,8 @@
_render_buffer_unlocked (GstVulkanSwapper * swapper,
GstBuffer * buffer, GError ** error)
{
- VkSemaphore semaphore = { 0, };
+ VkSemaphore acquire_semaphore = { 0, };
+ VkSemaphore present_semaphore = { 0, };
VkSemaphoreCreateInfo semaphore_info = { 0, };
VkPresentInfoKHR present;
struct cmd_data cmd_data = { 0, };
@@ -905,18 +923,18 @@
reacquire:
err = vkCreateSemaphore (swapper->device->device, &semaphore_info,
- NULL, &semaphore);
+ NULL, &acquire_semaphore);
if (gst_vulkan_error_to_g_error (err, error, "vkCreateSemaphore") < 0)
goto error;
err =
swapper->AcquireNextImageKHR (swapper->device->device,
- swapper->swap_chain, -1, semaphore, VK_NULL_HANDLE, &swap_idx);
+ swapper->swap_chain, -1, acquire_semaphore, VK_NULL_HANDLE, &swap_idx);
/* TODO: Deal with the VK_SUBOPTIMAL_KHR and VK_ERROR_OUT_OF_DATE_KHR */
if (err == VK_ERROR_OUT_OF_DATE_KHR) {
GST_DEBUG_OBJECT (swapper, "out of date frame acquired");
- vkDestroySemaphore (swapper->device->device, semaphore, NULL);
+ vkDestroySemaphore (swapper->device->device, acquire_semaphore, NULL);
if (!_swapchain_resize (swapper, error))
goto error;
goto reacquire;
@@ -928,36 +946,45 @@
if (!_build_render_buffer_cmd (swapper, swap_idx, buffer, &cmd_data, error))
goto error;
+ err = vkCreateSemaphore (swapper->device->device, &semaphore_info,
+ NULL, &present_semaphore);
+ if (gst_vulkan_error_to_g_error (err, error, "vkCreateSemaphore") < 0)
+ goto error;
+
{
VkSubmitInfo submit_info = { 0, };
+ VkPipelineStageFlags stages = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
submit_info.pNext = NULL;
submit_info.waitSemaphoreCount = 1;
- submit_info.pWaitSemaphores = &semaphore;
+ submit_info.pWaitSemaphores = &acquire_semaphore;
+ submit_info.pWaitDstStageMask = &stages;
submit_info.commandBufferCount = 1;
submit_info.pCommandBuffers = &cmd_data.cmd;
- submit_info.signalSemaphoreCount = 0;
- submit_info.pSignalSemaphores = NULL;
+ submit_info.signalSemaphoreCount = 1;
+ submit_info.pSignalSemaphores = &present_semaphore;
- err =
- vkQueueSubmit (swapper->queue->queue, 1, &submit_info, cmd_data.fence);
+ err = vkQueueSubmit (swapper->queue->queue, 1, &submit_info, NULL);
if (gst_vulkan_error_to_g_error (err, error, "vkQueueSubmit") < 0) {
- return FALSE;
+ goto error;
}
}
present.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
present.pNext = NULL;
- present.waitSemaphoreCount = 0;
- present.pWaitSemaphores = NULL;
+ present.waitSemaphoreCount = 1;
+ present.pWaitSemaphores = &present_semaphore;
present.swapchainCount = 1;
present.pSwapchains = &swapper->swap_chain;
present.pImageIndices = &swap_idx;
present.pResults = &present_err;
err = swapper->QueuePresentKHR (swapper->queue->queue, &present);
- if (err == VK_ERROR_OUT_OF_DATE_KHR) {
+ if (gst_vulkan_error_to_g_error (err, error, "vkQueuePresentKHR") < 0)
+ goto error;
+
+ if (present_err == VK_ERROR_OUT_OF_DATE_KHR) {
GST_DEBUG_OBJECT (swapper, "out of date frame submitted");
if (!_swapchain_resize (swapper, error))
@@ -965,30 +992,30 @@
} else if (gst_vulkan_error_to_g_error (err, error, "vkQueuePresentKHR") < 0)
goto error;
- err = vkWaitForFences (swapper->device->device, 1, &cmd_data.fence, TRUE, -1);
- if (gst_vulkan_error_to_g_error (err, error, "vkWaitForFences") < 0)
+ err = vkDeviceWaitIdle (swapper->device->device);
+ if (gst_vulkan_error_to_g_error (err, error, "vkDeviceWaitIdle") < 0)
goto error;
- if (semaphore)
- vkDestroySemaphore (swapper->device->device, semaphore, NULL);
+ if (acquire_semaphore)
+ vkDestroySemaphore (swapper->device->device, acquire_semaphore, NULL);
+ if (present_semaphore)
+ vkDestroySemaphore (swapper->device->device, present_semaphore, NULL);
if (cmd_data.cmd)
vkFreeCommandBuffers (swapper->device->device, swapper->device->cmd_pool,
1, &cmd_data.cmd);
- if (cmd_data.fence)
- vkDestroyFence (swapper->device->device, cmd_data.fence, NULL);
if (cmd_data.notify)
cmd_data.notify (cmd_data.data);
return TRUE;
error:
{
- if (semaphore)
- vkDestroySemaphore (swapper->device->device, semaphore, NULL);
+ if (acquire_semaphore)
+ vkDestroySemaphore (swapper->device->device, acquire_semaphore, NULL);
+ if (present_semaphore)
+ vkDestroySemaphore (swapper->device->device, present_semaphore, NULL);
if (cmd_data.cmd)
vkFreeCommandBuffers (swapper->device->device, swapper->device->cmd_pool,
1, &cmd_data.cmd);
- if (cmd_data.fence)
- vkDestroyFence (swapper->device->device, cmd_data.fence, NULL);
if (cmd_data.notify)
cmd_data.notify (cmd_data.data);
return FALSE;
diff --git a/ext/vulkan/vkupload.c b/ext/vulkan/vkupload.c
index 95c36cf..4988c64 100644
--- a/ext/vulkan/vkupload.c
+++ b/ext/vulkan/vkupload.c
@@ -161,7 +161,8 @@
}
static GstStaticCaps _buffer_in_templ =
-GST_STATIC_CAPS ("video/x-raw(" GST_CAPS_FEATURE_MEMORY_VULKAN_BUFFER ")");
+ GST_STATIC_CAPS ("video/x-raw(" GST_CAPS_FEATURE_MEMORY_VULKAN_BUFFER ") ;"
+ "video/x-raw");
static GstStaticCaps _buffer_out_templ =
GST_STATIC_CAPS ("video/x-raw(" GST_CAPS_FEATURE_MEMORY_VULKAN_BUFFER ")");
@@ -787,6 +788,7 @@
gst_vulkan_upload_prepare_output_buffer (GstBaseTransform * bt,
GstBuffer * inbuf, GstBuffer ** outbuf)
{
+ GstBaseTransformClass *bclass = GST_BASE_TRANSFORM_GET_CLASS (bt);
GstVulkanUpload *vk_upload = GST_VULKAN_UPLOAD (bt);
GstFlowReturn ret;
@@ -818,6 +820,12 @@
}
} while (FALSE);
+ if (ret == GST_FLOW_OK) {
+ /* basetransform doesn't unref if they're the same */
+ if (inbuf != *outbuf)
+ bclass->copy_metadata (bt, inbuf, *outbuf);
+ }
+
return ret;
}
diff --git a/ext/vulkan/vkutils.c b/ext/vulkan/vkutils.c
index 4b54755..1c25cb8 100644
--- a/ext/vulkan/vkutils.c
+++ b/ext/vulkan/vkutils.c
@@ -36,6 +36,7 @@
if (check_count <= 0 || layer_count <= 0) {
GST_WARNING ("no layers requested or supported");
+ *supported_layers = NULL;
return FALSE;
}
@@ -55,6 +56,7 @@
GST_WARNING ("Cannot find layer: %s", check_names[i]);
}
+ (*supported_layers)[k] = NULL;
*supported_layers_count = g_strv_length (*supported_layers);
return TRUE;
diff --git a/ext/vulkan/vkwindow.c b/ext/vulkan/vkwindow.c
index caa3c47..56b3e60 100644
--- a/ext/vulkan/vkwindow.c
+++ b/ext/vulkan/vkwindow.c
@@ -43,6 +43,9 @@
#if GST_VULKAN_HAVE_WINDOW_XCB
#include "xcb/vkwindow_xcb.h"
#endif
+#if GST_VULKAN_HAVE_WINDOW_WAYLAND
+#include "wayland/vkwindow_wayland.h"
+#endif
#define GST_CAT_DEFAULT gst_vulkan_window_debug
GST_DEBUG_CATEGORY (GST_CAT_DEFAULT);
@@ -183,6 +186,10 @@
if (!window && (!user_choice || g_strstr_len (user_choice, 3, "xcb")))
window = GST_VULKAN_WINDOW (gst_vulkan_window_xcb_new (display));
#endif
+#if GST_VULKAN_HAVE_WINDOW_WAYLAND
+ if (!window && (!user_choice || g_strstr_len (user_choice, 7, "wayland")))
+ window = GST_VULKAN_WINDOW (gst_vulkan_window_wayland_new (display));
+#endif
if (!window) {
/* subclass returned a NULL window */
GST_WARNING ("Could not create window. user specified %s, creating dummy"
diff --git a/ext/vulkan/wayland/Makefile.am b/ext/vulkan/wayland/Makefile.am
new file mode 100644
index 0000000..f92d85e
--- /dev/null
+++ b/ext/vulkan/wayland/Makefile.am
@@ -0,0 +1,29 @@
+## Process this file with automake to produce Makefile.in
+
+noinst_LTLIBRARIES = libgstvulkan-wayland.la
+
+libgstvulkan_wayland_la_SOURCES = \
+ vkdisplay_wayland.c \
+ vkwindow_wayland.c \
+ wayland_event_source.c
+
+noinst_HEADERS = \
+ vkdisplay_wayland.h \
+ vkwindow_wayland.h \
+ wayland_event_source.h
+
+libgstvulkan_wayland_la_CFLAGS = \
+ -I$(top_srcdir)/gst-libs \
+ -I$(top_srcdir)/ext/vulkan \
+ -I$(top_builddir)/gst-libs \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(GST_CFLAGS) \
+ $(WAYLAND_CFLAGS)
+
+libgstvulkan_wayland_la_LIBADD = \
+ $(WAYLAND_LIBS)
+
+libgstvulkan_wayland_la_LDFLAGS = \
+ $(GST_LIB_LDFLAGS) \
+ $(GST_ALL_LDFLAGS)
diff --git a/tests/examples/gl/gtk/gtkvideooverlay/Makefile.in b/ext/vulkan/wayland/Makefile.in
similarity index 75%
copy from tests/examples/gl/gtk/gtkvideooverlay/Makefile.in
copy to ext/vulkan/wayland/Makefile.in
index aef9ed4..44513f9 100644
--- a/tests/examples/gl/gtk/gtkvideooverlay/Makefile.in
+++ b/ext/vulkan/wayland/Makefile.in
@@ -14,6 +14,7 @@
@SET_MAKE@
+
VPATH = @srcdir@
am__is_gnu_make = { \
if test -z '$(MAKELEVEL)'; then \
@@ -89,8 +90,7 @@
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
-noinst_PROGRAMS = gtkvideooverlay$(EXEEXT)
-subdir = tests/examples/gl/gtk/gtkvideooverlay
+subdir = ext/vulkan/wayland
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 \
@@ -127,27 +127,29 @@
$(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 $(am__DIST_COMMON)
+DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \
+ $(am__DIST_COMMON)
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
-PROGRAMS = $(noinst_PROGRAMS)
-am_gtkvideooverlay_OBJECTS = gtkvideooverlay-main.$(OBJEXT)
-gtkvideooverlay_OBJECTS = $(am_gtkvideooverlay_OBJECTS)
+LTLIBRARIES = $(noinst_LTLIBRARIES)
am__DEPENDENCIES_1 =
-gtkvideooverlay_DEPENDENCIES = ../libgstgtkhelper.la \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
+libgstvulkan_wayland_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_libgstvulkan_wayland_la_OBJECTS = \
+ libgstvulkan_wayland_la-vkdisplay_wayland.lo \
+ libgstvulkan_wayland_la-vkwindow_wayland.lo \
+ libgstvulkan_wayland_la-wayland_event_source.lo
+libgstvulkan_wayland_la_OBJECTS = \
+ $(am_libgstvulkan_wayland_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 =
-gtkvideooverlay_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
- $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
- $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
+libgstvulkan_wayland_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libgstvulkan_wayland_la_CFLAGS) $(CFLAGS) \
+ $(libgstvulkan_wayland_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
@@ -164,31 +166,32 @@
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
am__mv = mv -f
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+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_CXXFLAGS) $(CXXFLAGS)
-AM_V_CXX = $(am__v_CXX_@AM_V@)
-am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
-am__v_CXX_0 = @echo " CXX " $@;
-am__v_CXX_1 =
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
- $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
-am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
-am__v_CXXLD_0 = @echo " CXXLD " $@;
-am__v_CXXLD_1 =
-SOURCES = $(gtkvideooverlay_SOURCES)
-DIST_SOURCES = $(gtkvideooverlay_SOURCES)
+ $(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 = $(libgstvulkan_wayland_la_SOURCES)
+DIST_SOURCES = $(libgstvulkan_wayland_la_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 +277,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -295,6 +300,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -344,6 +351,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -489,6 +498,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -615,8 +626,6 @@
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@
@@ -659,8 +668,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -749,19 +763,37 @@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
wayland_scanner = @wayland_scanner@
-gtkvideooverlay_SOURCES = main.cpp
-gtkvideooverlay_CXXFLAGS = -I$(top_srcdir)/gst-libs -I$(top_builddir)/gst-libs \
- $(GST_PLUGINS_BASE_CFLAGS) $(GST_CXXFLAGS) \
- $(GL_CFLAGS) $(GTK3_CFLAGS) $(X11_CFLAGS)
+noinst_LTLIBRARIES = libgstvulkan-wayland.la
+libgstvulkan_wayland_la_SOURCES = \
+ vkdisplay_wayland.c \
+ vkwindow_wayland.c \
+ wayland_event_source.c
-gtkvideooverlay_LDADD = ../libgstgtkhelper.la \
- $(GTK3_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \
- $(GL_LIBS) -lgstvideo-$(GST_API_VERSION) $(X11_LIBS)
+noinst_HEADERS = \
+ vkdisplay_wayland.h \
+ vkwindow_wayland.h \
+ wayland_event_source.h
+
+libgstvulkan_wayland_la_CFLAGS = \
+ -I$(top_srcdir)/gst-libs \
+ -I$(top_srcdir)/ext/vulkan \
+ -I$(top_builddir)/gst-libs \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(GST_CFLAGS) \
+ $(WAYLAND_CFLAGS)
+
+libgstvulkan_wayland_la_LIBADD = \
+ $(WAYLAND_LIBS)
+
+libgstvulkan_wayland_la_LDFLAGS = \
+ $(GST_LIB_LDFLAGS) \
+ $(GST_ALL_LDFLAGS)
all: all-am
.SUFFIXES:
-.SUFFIXES: .cpp .lo .o .obj
+.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 \
@@ -771,9 +803,9 @@
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/gl/gtk/gtkvideooverlay/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/vulkan/wayland/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu tests/examples/gl/gtk/gtkvideooverlay/Makefile
+ $(AUTOMAKE) --gnu ext/vulkan/wayland/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
@@ -792,18 +824,19 @@
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
-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
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_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}; \
+ }
-gtkvideooverlay$(EXEEXT): $(gtkvideooverlay_OBJECTS) $(gtkvideooverlay_DEPENDENCIES) $(EXTRA_gtkvideooverlay_DEPENDENCIES)
- @rm -f gtkvideooverlay$(EXEEXT)
- $(AM_V_CXXLD)$(gtkvideooverlay_LINK) $(gtkvideooverlay_OBJECTS) $(gtkvideooverlay_LDADD) $(LIBS)
+libgstvulkan-wayland.la: $(libgstvulkan_wayland_la_OBJECTS) $(libgstvulkan_wayland_la_DEPENDENCIES) $(EXTRA_libgstvulkan_wayland_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstvulkan_wayland_la_LINK) $(libgstvulkan_wayland_la_OBJECTS) $(libgstvulkan_wayland_la_LIBADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@@ -811,45 +844,54 @@
distclean-compile:
-rm -f *.tab.c
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtkvideooverlay-main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvulkan_wayland_la-vkdisplay_wayland.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvulkan_wayland_la-vkwindow_wayland.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvulkan_wayland_la-wayland_event_source.Plo@am__quote@
-.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 $@ $< &&\
-@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+.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 $@ $<
-.cpp.obj:
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
-@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
-@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+.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) '$<'`
-.cpp.lo:
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
-@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
-@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+.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 $@ $<
-gtkvideooverlay-main.o: main.cpp
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) -MT gtkvideooverlay-main.o -MD -MP -MF $(DEPDIR)/gtkvideooverlay-main.Tpo -c -o gtkvideooverlay-main.o `test -f 'main.cpp' || echo '$(srcdir)/'`main.cpp
-@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gtkvideooverlay-main.Tpo $(DEPDIR)/gtkvideooverlay-main.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='main.cpp' object='gtkvideooverlay-main.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) -c -o gtkvideooverlay-main.o `test -f 'main.cpp' || echo '$(srcdir)/'`main.cpp
+libgstvulkan_wayland_la-vkdisplay_wayland.lo: vkdisplay_wayland.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) $(libgstvulkan_wayland_la_CFLAGS) $(CFLAGS) -MT libgstvulkan_wayland_la-vkdisplay_wayland.lo -MD -MP -MF $(DEPDIR)/libgstvulkan_wayland_la-vkdisplay_wayland.Tpo -c -o libgstvulkan_wayland_la-vkdisplay_wayland.lo `test -f 'vkdisplay_wayland.c' || echo '$(srcdir)/'`vkdisplay_wayland.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvulkan_wayland_la-vkdisplay_wayland.Tpo $(DEPDIR)/libgstvulkan_wayland_la-vkdisplay_wayland.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vkdisplay_wayland.c' object='libgstvulkan_wayland_la-vkdisplay_wayland.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) $(libgstvulkan_wayland_la_CFLAGS) $(CFLAGS) -c -o libgstvulkan_wayland_la-vkdisplay_wayland.lo `test -f 'vkdisplay_wayland.c' || echo '$(srcdir)/'`vkdisplay_wayland.c
-gtkvideooverlay-main.obj: main.cpp
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) -MT gtkvideooverlay-main.obj -MD -MP -MF $(DEPDIR)/gtkvideooverlay-main.Tpo -c -o gtkvideooverlay-main.obj `if test -f 'main.cpp'; then $(CYGPATH_W) 'main.cpp'; else $(CYGPATH_W) '$(srcdir)/main.cpp'; fi`
-@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gtkvideooverlay-main.Tpo $(DEPDIR)/gtkvideooverlay-main.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='main.cpp' object='gtkvideooverlay-main.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) -c -o gtkvideooverlay-main.obj `if test -f 'main.cpp'; then $(CYGPATH_W) 'main.cpp'; else $(CYGPATH_W) '$(srcdir)/main.cpp'; fi`
+libgstvulkan_wayland_la-vkwindow_wayland.lo: vkwindow_wayland.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) $(libgstvulkan_wayland_la_CFLAGS) $(CFLAGS) -MT libgstvulkan_wayland_la-vkwindow_wayland.lo -MD -MP -MF $(DEPDIR)/libgstvulkan_wayland_la-vkwindow_wayland.Tpo -c -o libgstvulkan_wayland_la-vkwindow_wayland.lo `test -f 'vkwindow_wayland.c' || echo '$(srcdir)/'`vkwindow_wayland.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvulkan_wayland_la-vkwindow_wayland.Tpo $(DEPDIR)/libgstvulkan_wayland_la-vkwindow_wayland.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vkwindow_wayland.c' object='libgstvulkan_wayland_la-vkwindow_wayland.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) $(libgstvulkan_wayland_la_CFLAGS) $(CFLAGS) -c -o libgstvulkan_wayland_la-vkwindow_wayland.lo `test -f 'vkwindow_wayland.c' || echo '$(srcdir)/'`vkwindow_wayland.c
+
+libgstvulkan_wayland_la-wayland_event_source.lo: wayland_event_source.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) $(libgstvulkan_wayland_la_CFLAGS) $(CFLAGS) -MT libgstvulkan_wayland_la-wayland_event_source.lo -MD -MP -MF $(DEPDIR)/libgstvulkan_wayland_la-wayland_event_source.Tpo -c -o libgstvulkan_wayland_la-wayland_event_source.lo `test -f 'wayland_event_source.c' || echo '$(srcdir)/'`wayland_event_source.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvulkan_wayland_la-wayland_event_source.Tpo $(DEPDIR)/libgstvulkan_wayland_la-wayland_event_source.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wayland_event_source.c' object='libgstvulkan_wayland_la-wayland_event_source.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) $(libgstvulkan_wayland_la_CFLAGS) $(CFLAGS) -c -o libgstvulkan_wayland_la-wayland_event_source.lo `test -f 'wayland_event_source.c' || echo '$(srcdir)/'`wayland_event_source.c
mostlyclean-libtool:
-rm -f *.lo
@@ -941,7 +983,7 @@
done
check-am: all-am
check: check-am
-all-am: Makefile $(PROGRAMS)
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
installdirs:
install: install-am
install-exec: install-exec-am
@@ -975,7 +1017,7 @@
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
-clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
mostlyclean-am
distclean: distclean-am
@@ -1047,7 +1089,7 @@
.MAKE: install-am install-strip
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
- clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \
+ clean-libtool clean-noinstLTLIBRARIES 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 \
diff --git a/ext/vulkan/wayland/vkdisplay_wayland.c b/ext/vulkan/wayland/vkdisplay_wayland.c
new file mode 100644
index 0000000..686d671
--- /dev/null
+++ b/ext/vulkan/wayland/vkdisplay_wayland.c
@@ -0,0 +1,189 @@
+/*
+ * GStreamer
+ * Copyright (C) 2016 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 "wayland/vkdisplay_wayland.h"
+#include "wayland_event_source.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_vulkan_display_wayland_debug);
+#define GST_CAT_DEFAULT gst_vulkan_display_wayland_debug
+
+G_DEFINE_TYPE_WITH_CODE (GstVulkanDisplayWayland, gst_vulkan_display_wayland,
+ GST_TYPE_VULKAN_DISPLAY, GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT,
+ "vulkandisplaywayland", 0, "Vulkan Wayland Display");
+ );
+
+static void gst_vulkan_display_wayland_finalize (GObject * object);
+static gpointer gst_vulkan_display_wayland_get_handle (GstVulkanDisplay *
+ display);
+
+static void
+registry_handle_global (void *data, struct wl_registry *registry,
+ uint32_t name, const char *interface, uint32_t version)
+{
+ GstVulkanDisplayWayland *display = data;
+
+ GST_TRACE_OBJECT (display, "registry_handle_global with registry %p, "
+ "interface %s, version %u", registry, interface, version);
+
+ if (g_strcmp0 (interface, "wl_compositor") == 0) {
+ display->compositor =
+ wl_registry_bind (registry, name, &wl_compositor_interface, 1);
+ } else if (g_strcmp0 (interface, "wl_subcompositor") == 0) {
+ display->subcompositor =
+ wl_registry_bind (registry, name, &wl_subcompositor_interface, 1);
+ } else if (g_strcmp0 (interface, "wl_shell") == 0) {
+ display->shell = wl_registry_bind (registry, name, &wl_shell_interface, 1);
+ }
+}
+
+static const struct wl_registry_listener registry_listener = {
+ registry_handle_global
+};
+
+static void
+_connect_listeners (GstVulkanDisplayWayland * display)
+{
+ display->registry = wl_display_get_registry (display->display);
+ wl_registry_add_listener (display->registry, ®istry_listener, display);
+
+ wl_display_roundtrip (display->display);
+}
+
+static void
+gst_vulkan_display_wayland_class_init (GstVulkanDisplayWaylandClass * klass)
+{
+ GST_VULKAN_DISPLAY_CLASS (klass)->get_handle =
+ GST_DEBUG_FUNCPTR (gst_vulkan_display_wayland_get_handle);
+
+ G_OBJECT_CLASS (klass)->finalize = gst_vulkan_display_wayland_finalize;
+}
+
+static void
+gst_vulkan_display_wayland_init (GstVulkanDisplayWayland * display_wayland)
+{
+ GstVulkanDisplay *display = (GstVulkanDisplay *) display_wayland;
+
+ display->type = GST_VULKAN_DISPLAY_TYPE_WAYLAND;
+ display_wayland->foreign_display = FALSE;
+}
+
+static void
+gst_vulkan_display_wayland_finalize (GObject * object)
+{
+ GstVulkanDisplayWayland *display_wayland =
+ GST_VULKAN_DISPLAY_WAYLAND (object);
+
+ if (!display_wayland->foreign_display && display_wayland->display) {
+ wl_display_flush (display_wayland->display);
+ wl_display_disconnect (display_wayland->display);
+ }
+
+ G_OBJECT_CLASS (gst_vulkan_display_wayland_parent_class)->finalize (object);
+}
+
+/**
+ * gst_vulkan_display_wayland_new:
+ * @name: (allow-none): a display name
+ *
+ * Create a new #GstVulkanDisplayWayland from the wayland display name. See wl_display_connect()
+ * for details on what is a valid name.
+ *
+ * Returns: (transfer full): a new #GstVulkanDisplayWayland or %NULL
+ */
+GstVulkanDisplayWayland *
+gst_vulkan_display_wayland_new (const gchar * name)
+{
+ GstVulkanDisplayWayland *ret;
+
+ ret = g_object_new (GST_TYPE_VULKAN_DISPLAY_WAYLAND, NULL);
+ ret->display = wl_display_connect (name);
+
+ if (!ret->display) {
+ GST_ERROR ("Failed to open Wayland display connection with name, \'%s\'",
+ name);
+ return NULL;
+ }
+
+ /* connecting the listeners after attaching the event source will race with
+ * the source and the source may eat an event that we're waiting for and
+ * deadlock */
+ _connect_listeners (ret);
+
+ GST_VULKAN_DISPLAY (ret)->event_source =
+ wayland_event_source_new (ret->display, NULL);
+ g_source_attach (GST_VULKAN_DISPLAY (ret)->event_source,
+ GST_VULKAN_DISPLAY (ret)->main_context);
+
+ return ret;
+}
+
+/**
+ * gst_vulkan_display_wayland_new_with_display:
+ * @display: an existing, wayland display
+ *
+ * Creates a new display connection from a wl_display Display.
+ *
+ * Returns: (transfer full): a new #GstVulkanDisplayWayland
+ */
+GstVulkanDisplayWayland *
+gst_vulkan_display_wayland_new_with_display (struct wl_display * display)
+{
+ GstVulkanDisplayWayland *ret;
+
+ g_return_val_if_fail (display != NULL, NULL);
+
+ ret = g_object_new (GST_TYPE_VULKAN_DISPLAY_WAYLAND, NULL);
+
+ ret->display = display;
+ ret->foreign_display = TRUE;
+
+ _connect_listeners (ret);
+
+ return ret;
+}
+
+static gpointer
+gst_vulkan_display_wayland_get_handle (GstVulkanDisplay * display)
+{
+ return GST_VULKAN_DISPLAY_WAYLAND (display)->display;
+}
+
+static gboolean
+_roundtrip_async (gpointer data)
+{
+ GstVulkanDisplayWayland *display = data;
+
+ wl_display_roundtrip (display->display);
+
+ return G_SOURCE_REMOVE;
+}
+
+void
+gst_vulkan_display_wayland_roundtrip_async (GstVulkanDisplayWayland * display)
+{
+ g_return_if_fail (GST_IS_VULKAN_DISPLAY_WAYLAND (display));
+
+ g_main_context_invoke (GST_VULKAN_DISPLAY (display)->main_context,
+ (GSourceFunc) _roundtrip_async, display);
+}
diff --git a/ext/vulkan/wayland/vkdisplay_wayland.h b/ext/vulkan/wayland/vkdisplay_wayland.h
new file mode 100644
index 0000000..44c1340
--- /dev/null
+++ b/ext/vulkan/wayland/vkdisplay_wayland.h
@@ -0,0 +1,78 @@
+/*
+ * GStreamer
+ * Copyright (C) 2016 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_VK_DISPLAY_WAYLAND_H__
+#define __GST_VK_DISPLAY_WAYLAND_H__
+
+#include <gst/gst.h>
+
+#include <wayland-client.h>
+
+#include <vk.h>
+
+G_BEGIN_DECLS
+
+GType gst_vulkan_display_wayland_get_type (void);
+
+#define GST_TYPE_VULKAN_DISPLAY_WAYLAND (gst_vulkan_display_wayland_get_type())
+#define GST_VULKAN_DISPLAY_WAYLAND(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VULKAN_DISPLAY_WAYLAND,GstVulkanDisplayWayland))
+#define GST_VULKAN_DISPLAY_WAYLAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_VULKAN_DISPLAY_WAYLAND,GstVulkanDisplayWaylandClass))
+#define GST_IS_VULKAN_DISPLAY_WAYLAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VULKAN_DISPLAY_WAYLAND))
+#define GST_IS_VULKAN_DISPLAY_WAYLAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_VULKAN_DISPLAY_WAYLAND))
+#define GST_VULKAN_DISPLAY_WAYLAND_CAST(obj) ((GstVulkanDisplayWayland*)(obj))
+
+typedef struct _GstVulkanDisplayWayland GstVulkanDisplayWayland;
+typedef struct _GstVulkanDisplayWaylandClass GstVulkanDisplayWaylandClass;
+
+/**
+ * GstVulkanDisplayWayland:
+ *
+ * the contents of a #GstVulkanDisplayWayland are private and should only be accessed
+ * through the provided API
+ */
+struct _GstVulkanDisplayWayland
+{
+ GstVulkanDisplay parent;
+
+ struct wl_display *display;
+ struct wl_registry *registry;
+ struct wl_compositor *compositor;
+ struct wl_subcompositor *subcompositor;
+ struct wl_shell *shell;
+
+ /* <private> */
+ gboolean foreign_display;
+};
+
+struct _GstVulkanDisplayWaylandClass
+{
+ GstVulkanDisplayClass object_class;
+};
+
+#define GST_VULKAN_DISPLAY_WAYLAND_DISPLAY(display_) (GST_VULKAN_DISPLAY_WAYLAND (display_)->display)
+
+GstVulkanDisplayWayland *gst_vulkan_display_wayland_new (const gchar * name);
+GstVulkanDisplayWayland *gst_vulkan_display_wayland_new_with_display (struct wl_display *display);
+
+void gst_vulkan_display_wayland_roundtrip_async (GstVulkanDisplayWayland * display);
+
+G_END_DECLS
+
+#endif /* __GST_VULKAN_DISPLAY_WAYLAND_H__ */
diff --git a/ext/vulkan/wayland/vkwindow_wayland.c b/ext/vulkan/wayland/vkwindow_wayland.c
new file mode 100644
index 0000000..dc99027
--- /dev/null
+++ b/ext/vulkan/wayland/vkwindow_wayland.c
@@ -0,0 +1,285 @@
+/*
+ * GStreamer
+ * Copyright (C) 2016 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.
+ */
+
+#define GLIB_DISABLE_DEPRECATION_WARNINGS
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <linux/input.h>
+
+#include "wayland_event_source.h"
+
+#include "vkdisplay_wayland.h"
+#include "vkwindow_wayland.h"
+
+#define GST_CAT_DEFAULT gst_vulkan_window_wayland_debug
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
+
+#define gst_vulkan_window_wayland_parent_class parent_class
+G_DEFINE_TYPE (GstVulkanWindowWayland, gst_vulkan_window_wayland,
+ GST_TYPE_VULKAN_WINDOW)
+
+ static void gst_vulkan_window_wayland_close (GstVulkanWindow * window);
+ static gboolean gst_vulkan_window_wayland_open (GstVulkanWindow * window,
+ GError ** error);
+ static VkSurfaceKHR gst_vulkan_window_wayland_get_surface (GstVulkanWindow
+ * window, GError ** error);
+ static gboolean
+ gst_vulkan_window_wayland_get_presentation_support (GstVulkanWindow *
+ window, GstVulkanDevice * device, guint32 queue_family_idx);
+
+ static void
+ handle_ping (void *data, struct wl_shell_surface *shell_surface,
+ uint32_t serial)
+{
+ GstVulkanWindowWayland *window_wl = data;
+
+ GST_TRACE_OBJECT (window_wl, "ping received serial %u", serial);
+
+ wl_shell_surface_pong (shell_surface, serial);
+}
+
+/*
+static void window_resize (GstVulkanWindowWayland * window_wl, guint width,
+ guint height);*/
+
+static void
+handle_configure (void *data, struct wl_shell_surface *shell_surface,
+ uint32_t edges, int32_t width, int32_t height)
+{
+ GstVulkanWindowWayland *window_wl = data;
+
+ GST_DEBUG_OBJECT (window_wl, "configure event on surface %p, %ix%i",
+ shell_surface, width, height);
+
+ /*window_resize (window_wl, width, height); */
+}
+
+static void
+handle_popup_done (void *data, struct wl_shell_surface *shell_surface)
+{
+}
+
+static const struct wl_shell_surface_listener shell_surface_listener = {
+ handle_ping,
+ handle_configure,
+ handle_popup_done
+};
+
+static void
+destroy_surfaces (GstVulkanWindowWayland * window_wl)
+{
+ GST_DEBUG_OBJECT (window_wl, "destroying created surfaces");
+
+ if (window_wl->shell_surface) {
+ wl_shell_surface_destroy (window_wl->shell_surface);
+ window_wl->shell_surface = NULL;
+ }
+ if (window_wl->surface) {
+ wl_surface_destroy (window_wl->surface);
+ window_wl->surface = NULL;
+ }
+}
+
+static void
+create_surfaces (GstVulkanWindowWayland * window_wl)
+{
+ GstVulkanDisplayWayland *display =
+ GST_VULKAN_DISPLAY_WAYLAND (GST_VULKAN_WINDOW (window_wl)->display);
+ gint width, height;
+
+ if (!window_wl->surface) {
+ window_wl->surface = wl_compositor_create_surface (display->compositor);
+ if (window_wl->queue)
+ wl_proxy_set_queue ((struct wl_proxy *) window_wl->surface,
+ window_wl->queue);
+ }
+
+ if (!window_wl->shell_surface) {
+ window_wl->shell_surface =
+ wl_shell_get_shell_surface (display->shell, window_wl->surface);
+ if (window_wl->queue)
+ wl_proxy_set_queue ((struct wl_proxy *) window_wl->shell_surface,
+ window_wl->queue);
+
+ wl_shell_surface_add_listener (window_wl->shell_surface,
+ &shell_surface_listener, window_wl);
+
+ wl_shell_surface_set_title (window_wl->shell_surface, "Vulkan Renderer");
+ wl_shell_surface_set_toplevel (window_wl->shell_surface);
+ GST_DEBUG_OBJECT (window_wl, "Successfully created shell surface %p",
+ window_wl->shell_surface);
+ }
+
+ if (window_wl->window_width > 0)
+ width = window_wl->window_width;
+ else
+ width = 320;
+ window_wl->window_width = width;
+
+ if (window_wl->window_height > 0)
+ height = window_wl->window_height;
+ else
+ height = 240;
+ window_wl->window_height = height;
+}
+
+static void
+gst_vulkan_window_wayland_class_init (GstVulkanWindowWaylandClass * klass)
+{
+ GstVulkanWindowClass *window_class = (GstVulkanWindowClass *) klass;
+
+ window_class->close = GST_DEBUG_FUNCPTR (gst_vulkan_window_wayland_close);
+ window_class->open = GST_DEBUG_FUNCPTR (gst_vulkan_window_wayland_open);
+ window_class->get_surface =
+ GST_DEBUG_FUNCPTR (gst_vulkan_window_wayland_get_surface);
+ window_class->get_presentation_support =
+ GST_DEBUG_FUNCPTR (gst_vulkan_window_wayland_get_presentation_support);
+}
+
+static void
+gst_vulkan_window_wayland_init (GstVulkanWindowWayland * window)
+{
+}
+
+GstVulkanWindowWayland *
+gst_vulkan_window_wayland_new (GstVulkanDisplay * display)
+{
+ if ((gst_vulkan_display_get_handle_type (display) &
+ GST_VULKAN_DISPLAY_TYPE_WAYLAND)
+ == 0)
+ /* we require a wayland display to create wayland surfaces */
+ return NULL;
+
+ GST_DEBUG ("creating Wayland window");
+
+ return g_object_new (GST_TYPE_VULKAN_WINDOW_WAYLAND, NULL);
+}
+
+static void
+gst_vulkan_window_wayland_close (GstVulkanWindow * window)
+{
+ GstVulkanWindowWayland *window_wl;
+
+ window_wl = GST_VULKAN_WINDOW_WAYLAND (window);
+
+ destroy_surfaces (window_wl);
+
+ g_source_destroy (window_wl->wl_source);
+ g_source_unref (window_wl->wl_source);
+ window_wl->wl_source = NULL;
+
+ GST_VULKAN_WINDOW_CLASS (parent_class)->close (window);
+}
+
+static gboolean
+gst_vulkan_window_wayland_open (GstVulkanWindow * window, GError ** error)
+{
+ GstVulkanDisplayWayland *display;
+ GstVulkanWindowWayland *window_wl = GST_VULKAN_WINDOW_WAYLAND (window);
+
+ if (!GST_IS_VULKAN_DISPLAY_WAYLAND (window->display)) {
+ g_set_error (error, GST_VULKAN_WINDOW_ERROR,
+ GST_VULKAN_WINDOW_ERROR_RESOURCE_UNAVAILABLE,
+ "Failed to retrieve Wayland display (wrong type?)");
+ return FALSE;
+ }
+ display = GST_VULKAN_DISPLAY_WAYLAND (window->display);
+
+ if (!display->display) {
+ g_set_error (error, GST_VULKAN_WINDOW_ERROR,
+ GST_VULKAN_WINDOW_ERROR_RESOURCE_UNAVAILABLE,
+ "Failed to retrieve Wayland display");
+ return FALSE;
+ }
+
+ window_wl->queue = NULL;
+
+ if (!GST_VULKAN_WINDOW_CLASS (parent_class)->open (window, error))
+ return FALSE;
+
+ create_surfaces (window_wl);
+
+ gst_vulkan_display_wayland_roundtrip_async (display);
+
+ return TRUE;
+}
+
+static VkSurfaceKHR
+gst_vulkan_window_wayland_get_surface (GstVulkanWindow * window,
+ GError ** error)
+{
+ GstVulkanWindowWayland *window_wl = GST_VULKAN_WINDOW_WAYLAND (window);
+ VkWaylandSurfaceCreateInfoKHR info = { 0, };
+ VkSurfaceKHR ret;
+ VkResult err;
+
+ info.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR;
+ info.pNext = NULL;
+ info.flags = 0;
+ info.display = GST_VULKAN_DISPLAY_WAYLAND_DISPLAY (window->display);
+ info.surface = window_wl->surface;
+
+ if (!window_wl->CreateWaylandSurface)
+ window_wl->CreateWaylandSurface =
+ gst_vulkan_instance_get_proc_address (window->display->instance,
+ "vkCreateWaylandSurfaceKHR");
+ if (!window_wl->CreateWaylandSurface) {
+ g_set_error_literal (error, GST_VULKAN_ERROR, VK_ERROR_FEATURE_NOT_PRESENT,
+ "Could not retrieve \"vkCreateWaylandSurfaceKHR\" function pointer");
+ return NULL;
+ }
+
+ err =
+ window_wl->CreateWaylandSurface (window->display->instance->instance,
+ &info, NULL, &ret);
+ if (gst_vulkan_error_to_g_error (err, error, "vkCreateWaylandSurfaceKHR") < 0)
+ return NULL;
+
+ return ret;
+}
+
+static gboolean
+gst_vulkan_window_wayland_get_presentation_support (GstVulkanWindow * window,
+ GstVulkanDevice * device, guint32 queue_family_idx)
+{
+ GstVulkanWindowWayland *window_wl = GST_VULKAN_WINDOW_WAYLAND (window);
+ VkPhysicalDevice gpu;
+
+ if (!window_wl->GetPhysicalDeviceWaylandPresentationSupport)
+ window_wl->GetPhysicalDeviceWaylandPresentationSupport =
+ gst_vulkan_instance_get_proc_address (window->display->instance,
+ "vkGetPhysicalDeviceWaylandPresentationSupportKHR");
+ if (!window_wl->GetPhysicalDeviceWaylandPresentationSupport) {
+ GST_WARNING_OBJECT (window, "Could not retrieve "
+ "\"vkGetPhysicalDeviceWaylandPresentationSupportKHR\" "
+ "function pointer");
+ return FALSE;
+ }
+
+ gpu = gst_vulkan_device_get_physical_device (device);
+ if (window_wl->GetPhysicalDeviceWaylandPresentationSupport (gpu,
+ queue_family_idx,
+ GST_VULKAN_DISPLAY_WAYLAND_DISPLAY (window->display)))
+ return TRUE;
+ return FALSE;
+}
diff --git a/ext/vulkan/wayland/vkwindow_wayland.h b/ext/vulkan/wayland/vkwindow_wayland.h
new file mode 100644
index 0000000..3d181f8
--- /dev/null
+++ b/ext/vulkan/wayland/vkwindow_wayland.h
@@ -0,0 +1,74 @@
+/*
+ * GStreamer
+ * Copyright (C) 2016 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_VK_WINDOW_WAYLAND_H__
+#define __GST_VK_WINDOW_WAYLAND_H__
+
+#include <wayland-client.h>
+#include <wayland-cursor.h>
+
+#include <vk.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_VULKAN_WINDOW_WAYLAND (gst_vulkan_window_wayland_get_type())
+#define GST_VULKAN_WINDOW_WAYLAND(o) (G_TYPE_CHECK_INSTANCE_CAST((o), GST_TYPE_VULKAN_WINDOW_WAYLAND, GstVulkanWindowWayland))
+#define GST_VULKAN_WINDOW_WAYLAND_CLASS(k) (G_TYPE_CHECK_CLASS((k), GST_TYPE_VULKAN_WINDOW_WAYLAND, GstVulkanWindowWaylandClass))
+#define GST_IS_VULKAN_WINDOW_WAYLAND(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_TYPE_VULKAN_WINDOW_WAYLAND))
+#define GST_IS_VULKAN_WINDOW_WAYLAND_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), GST_TYPE_VULKAN_WINDOW_WAYLAND))
+#define GST_VULKAN_WINDOW_WAYLAND_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_TYPE_VULKAN_WINDOW_WAYLAND, GstVulkanWindowWaylandClass))
+
+typedef struct _GstVulkanWindowWayland GstVulkanWindowWayland;
+typedef struct _GstVulkanWindowWaylandClass GstVulkanWindowWaylandClass;
+
+struct _GstVulkanWindowWayland {
+ /*< private >*/
+ GstVulkanWindow parent;
+
+ PFN_vkCreateWaylandSurfaceKHR CreateWaylandSurface;
+ PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR GetPhysicalDeviceWaylandPresentationSupport;
+
+ struct wl_event_queue *queue;
+ struct wl_surface *surface;
+ struct wl_shell_surface *shell_surface;
+ struct wl_callback *callback;
+
+ int window_width, window_height;
+
+ GSource *wl_source;
+
+ gpointer _reserved[GST_PADDING];
+};
+
+struct _GstVulkanWindowWaylandClass {
+ /*< private >*/
+ GstVulkanWindowClass parent_class;
+
+ /*< private >*/
+ gpointer _reserved[GST_PADDING];
+};
+
+GType gst_vulkan_window_wayland_get_type (void);
+
+GstVulkanWindowWayland * gst_vulkan_window_wayland_new (GstVulkanDisplay * display);
+
+G_END_DECLS
+
+#endif /* __GST_GL_WINDOW_X11_H__ */
diff --git a/ext/vulkan/wayland/wayland_event_source.c b/ext/vulkan/wayland/wayland_event_source.c
new file mode 100644
index 0000000..e1ae1ef
--- /dev/null
+++ b/ext/vulkan/wayland/wayland_event_source.c
@@ -0,0 +1,205 @@
+/*
+ * GStreamer
+ * Copyright (C) 2010 Intel Corporation.
+ * Copyright (C) 2012 Matthew Waters <ystreet00@gmail.com>
+ * Copyright (C) 2016 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.
+ *
+ * Authors:
+ * Matthew Allum
+ * Robert Bragg
+ * Kristian Høgsberg
+ */
+
+/* code originally from clutter's wayland backend found here
+ * http://git.gnome.org/browse/clutter/tree/clutter/wayland/clutter-event-wayland.c
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <wayland-client.h>
+
+#include "wayland_event_source.h"
+
+static void
+sync_callback (void *data, struct wl_callback *callback, uint32_t serial)
+{
+ gboolean *done = data;
+
+ *done = TRUE;
+ wl_callback_destroy (callback);
+}
+
+static const struct wl_callback_listener sync_listener = {
+ sync_callback
+};
+
+/* only thread safe iff called on the same thread @queue is being dispatched on */
+gint
+gst_vulkan_wl_display_roundtrip_queue (struct wl_display *display,
+ struct wl_event_queue *queue)
+{
+ struct wl_callback *callback;
+ gboolean done = FALSE;
+ gint ret = 0;
+
+ if (queue) {
+ /* creating a wl_proxy and setting the queue is racy with the dispatching
+ * of the default queue */
+ while (wl_display_prepare_read_queue (display, queue) != 0) {
+ if ((ret = wl_display_dispatch_queue_pending (display, queue)) < 0)
+ return ret;
+ }
+ }
+ if (!(callback = wl_display_sync (display))) {
+ return -1;
+ }
+ wl_callback_add_listener (callback, &sync_listener, &done);
+ if (queue) {
+ wl_proxy_set_queue ((struct wl_proxy *) callback, queue);
+ wl_display_cancel_read (display);
+ while (!done && ret >= 0)
+ ret = wl_display_dispatch_queue (display, queue);
+ } else {
+ while (!done && ret >= 0)
+ ret = wl_display_dispatch (display);
+ }
+
+ if (ret == -1 && !done)
+ wl_callback_destroy (callback);
+
+ return ret;
+}
+
+typedef struct _WaylandEventSource
+{
+ GSource source;
+ GPollFD pfd;
+ uint32_t mask;
+ struct wl_display *display;
+ struct wl_event_queue *queue;
+ gboolean reading;
+} WaylandEventSource;
+
+static gboolean
+wayland_event_source_prepare (GSource * base, gint * timeout)
+{
+ WaylandEventSource *source = (WaylandEventSource *) base;
+
+ *timeout = -1;
+
+ /* we may be called multiple times for prepare */
+ if (source->reading)
+ wl_display_cancel_read (source->display);
+
+ if (source->queue) {
+ while (wl_display_prepare_read_queue (source->display, source->queue) != 0) {
+ if (wl_display_dispatch_queue_pending (source->display,
+ source->queue) < 0) {
+ g_critical ("Failed to dispatch pending events\n");
+ }
+ }
+ } else {
+ while (wl_display_prepare_read (source->display) != 0) {
+ if (wl_display_dispatch_pending (source->display) < 0) {
+ g_critical ("Failed to dispatch pending events\n");
+ }
+ }
+ }
+ source->reading = TRUE;
+
+ /* FIXME: this may return EAGAIN if the fd is full */
+ if (wl_display_flush (source->display) < 0)
+ g_critical ("Failed to flush Wayland connection\n");
+
+ return FALSE;
+}
+
+static gboolean
+wayland_event_source_check (GSource * base)
+{
+ WaylandEventSource *source = (WaylandEventSource *) base;
+ gboolean retval;
+
+ retval = source->pfd.revents;
+
+ if (source->pfd.revents & G_IO_IN) {
+ wl_display_read_events (source->display);
+ } else {
+ wl_display_cancel_read (source->display);
+ }
+ source->reading = FALSE;
+
+ return retval;
+}
+
+static gboolean
+wayland_event_source_dispatch (GSource * base,
+ GSourceFunc callback, gpointer data)
+{
+ WaylandEventSource *source = (WaylandEventSource *) base;
+
+ if (source->queue)
+ wl_display_dispatch_queue_pending (source->display, source->queue);
+ else
+ wl_display_dispatch_pending (source->display);
+ source->pfd.revents = 0;
+
+ if (callback)
+ callback (data);
+
+ return TRUE;
+}
+
+static void
+wayland_event_source_finalize (GSource * base)
+{
+ WaylandEventSource *source = (WaylandEventSource *) base;
+
+ if (source->reading) {
+ wl_display_cancel_read (source->display);
+ }
+ source->reading = FALSE;
+}
+
+static GSourceFuncs wayland_event_source_funcs = {
+ wayland_event_source_prepare,
+ wayland_event_source_check,
+ wayland_event_source_dispatch,
+ wayland_event_source_finalize
+};
+
+GSource *
+wayland_event_source_new (struct wl_display *display,
+ struct wl_event_queue *queue)
+{
+ WaylandEventSource *source;
+
+ source = (WaylandEventSource *)
+ g_source_new (&wayland_event_source_funcs, sizeof (WaylandEventSource));
+ source->display = display;
+ source->queue = queue;
+ source->pfd.fd = wl_display_get_fd (display);
+ source->pfd.events = G_IO_IN | G_IO_ERR;
+ g_source_add_poll (&source->source, &source->pfd);
+
+ return &source->source;
+}
diff --git a/ext/vulkan/wayland/wayland_event_source.h b/ext/vulkan/wayland/wayland_event_source.h
new file mode 100644
index 0000000..25ffe7b
--- /dev/null
+++ b/ext/vulkan/wayland/wayland_event_source.h
@@ -0,0 +1,34 @@
+/*
+ * GStreamer
+ * Copyright (C) 2016 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 __WAYLAND_EVENT_SOURCE_H__
+#define __WAYLAND_EVENT_SOURCE_H__
+
+#include <glib-object.h>
+
+#include <wayland-client.h>
+
+GSource * wayland_event_source_new (struct wl_display *display,
+ struct wl_event_queue *queue);
+
+G_GNUC_INTERNAL gint gst_vulkan_wl_display_roundtrip_queue (struct wl_display *display,
+ struct wl_event_queue *queue);
+
+#endif /* __WAYLAND_EVENT_SOURCE_H__ */
diff --git a/ext/vulkan/xcb/Makefile.in b/ext/vulkan/xcb/Makefile.in
index 672fed9..562e2ec 100644
--- a/ext/vulkan/xcb/Makefile.in
+++ b/ext/vulkan/xcb/Makefile.in
@@ -275,6 +275,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -296,6 +298,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -345,6 +349,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -490,6 +496,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -616,8 +624,6 @@
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@
@@ -660,8 +666,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/vulkan/xcb/vkwindow_xcb.c b/ext/vulkan/xcb/vkwindow_xcb.c
index 6369a1d..d08c0bf 100644
--- a/ext/vulkan/xcb/vkwindow_xcb.c
+++ b/ext/vulkan/xcb/vkwindow_xcb.c
@@ -206,6 +206,7 @@
static VkSurfaceKHR
gst_vulkan_window_xcb_get_surface (GstVulkanWindow * window, GError ** error)
{
+ GstVulkanWindowXCB *window_xcb = GST_VULKAN_WINDOW_XCB (window);
VkXcbSurfaceCreateInfoKHR info = { 0, };
VkSurfaceKHR ret;
VkResult err;
@@ -216,9 +217,19 @@
info.connection = GST_VULKAN_DISPLAY_XCB_CONNECTION (window->display);
info.window = GST_VULKAN_WINDOW_XCB (window)->win_id;
+ if (!window_xcb->CreateXcbSurface)
+ window_xcb->CreateXcbSurface =
+ gst_vulkan_instance_get_proc_address (window->display->instance,
+ "vkCreateXcbSurfaceKHR");
+ if (!window_xcb->CreateXcbSurface) {
+ g_set_error_literal (error, GST_VULKAN_ERROR, VK_ERROR_FEATURE_NOT_PRESENT,
+ "Could not retrieve \"vkCreateXcbSurfaceKHR\" function pointer");
+ return NULL;
+ }
+
err =
- vkCreateXcbSurfaceKHR (window->display->instance->instance, &info, NULL,
- &ret);
+ window_xcb->CreateXcbSurface (window->display->instance->instance, &info,
+ NULL, &ret);
if (gst_vulkan_error_to_g_error (err, error, "vkCreateXcbSurfaceKHR") < 0)
return NULL;
@@ -229,14 +240,25 @@
gst_vulkan_window_xcb_get_presentation_support (GstVulkanWindow * window,
GstVulkanDevice * device, guint32 queue_family_idx)
{
+ GstVulkanWindowXCB *window_xcb = GST_VULKAN_WINDOW_XCB (window);
VkPhysicalDevice gpu;
xcb_screen_t *screen;
screen = GST_VULKAN_DISPLAY_XCB_SCREEN (window->display);
+ if (!window_xcb->GetPhysicalDeviceXcbPresentationSupport)
+ window_xcb->GetPhysicalDeviceXcbPresentationSupport =
+ gst_vulkan_instance_get_proc_address (window->display->instance,
+ "vkGetPhysicalDeviceXcbPresentationSupportKHR");
+ if (!window_xcb->GetPhysicalDeviceXcbPresentationSupport) {
+ GST_WARNING_OBJECT (window, "Could not retrieve "
+ "\"vkGetPhysicalDeviceXcbPresentationSupportKHR\" " "function pointer");
+ return FALSE;
+ }
+
gpu = gst_vulkan_device_get_physical_device (device);
- if (vkGetPhysicalDeviceXcbPresentationSupportKHR (gpu, queue_family_idx,
- GST_VULKAN_DISPLAY_XCB_CONNECTION (window->display),
+ if (window_xcb->GetPhysicalDeviceXcbPresentationSupport (gpu,
+ queue_family_idx, GST_VULKAN_DISPLAY_XCB_CONNECTION (window->display),
screen->root_visual))
return TRUE;
return FALSE;
diff --git a/ext/vulkan/xcb/vkwindow_xcb.h b/ext/vulkan/xcb/vkwindow_xcb.h
index 517a488..db012bb 100644
--- a/ext/vulkan/xcb/vkwindow_xcb.h
+++ b/ext/vulkan/xcb/vkwindow_xcb.h
@@ -53,6 +53,9 @@
gint visible :1;
+ PFN_vkCreateXcbSurfaceKHR CreateXcbSurface;
+ PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR GetPhysicalDeviceXcbPresentationSupport;
+
/*< private >*/
GstVulkanWindowXCBPrivate *priv;
diff --git a/ext/wayland/Makefile.am b/ext/wayland/Makefile.am
index c742bfc..a23d44d 100644
--- a/ext/wayland/Makefile.am
+++ b/ext/wayland/Makefile.am
@@ -1,13 +1,16 @@
plugin_LTLIBRARIES = libgstwaylandsink.la
+BUILT_SOURCES = viewporter-protocol.c viewporter-client-protocol.h
+
libgstwaylandsink_la_SOURCES = \
gstwaylandsink.c \
wlshmallocator.c \
wlbuffer.c \
wldisplay.c \
wlwindow.c \
- wlvideoformat.c \
- scaler-protocol.c
+ wlvideoformat.c
+
+nodist_libgstwaylandsink_la_SOURCES = viewporter-protocol.c
libgstwaylandsink_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
$(WAYLAND_CFLAGS) $(GST_PLUGINS_BAD_CFLAGS)
@@ -26,24 +29,22 @@
wlbuffer.h \
wldisplay.h \
wlwindow.h \
- wlvideoformat.h \
- scaler-client-protocol.h
+ wlvideoformat.h
-EXTRA_DIST = scaler.xml
-CLEANFILES = scaler-protocol.c scaler-client-protocol.h
+CLEANFILES = $(BUILT_SOURCES)
-%-protocol.c : %.xml
- $(wayland_scanner) code < $< > $@
+.SECONDEXPANSION:
-%-client-protocol.h : %.xml
- $(wayland_scanner) client-header < $< > $@
+define protostability
+$(if $(findstring unstable,$1),unstable,stable)
+endef
-gstwaylandsink.c: scaler-client-protocol.h
+define protoname
+$(shell echo $1 | sed 's/\([a-z\-]\+\)-[a-z]\+-v[0-9]\+/\1/')
+endef
-wlshmallocator.c: scaler-client-protocol.h
+%-protocol.c : $(WAYLAND_PROTOCOLS_DATADIR)/$$(call protostability,$$*)/$$(call protoname,$$*)/$$*.xml
+ $(AM_V_GEN)$(wayland_scanner) code < $< > $@
-wlbuffer.c: scaler-client-protocol.h
-
-wldisplay.c: scaler-client-protocol.h
-
-wlwindow.c: scaler-client-protocol.h
+%-client-protocol.h : $(WAYLAND_PROTOCOLS_DATADIR)/$$(call protostability,$$*)/$$(call protoname,$$*)/$$*.xml
+ $(AM_V_GEN)$(wayland_scanner) client-header < $< > $@
diff --git a/ext/wayland/Makefile.in b/ext/wayland/Makefile.in
index d5b31b9..0f61a1c 100644
--- a/ext/wayland/Makefile.in
+++ b/ext/wayland/Makefile.in
@@ -172,9 +172,11 @@
libgstwaylandsink_la-wlbuffer.lo \
libgstwaylandsink_la-wldisplay.lo \
libgstwaylandsink_la-wlwindow.lo \
- libgstwaylandsink_la-wlvideoformat.lo \
- libgstwaylandsink_la-scaler-protocol.lo
-libgstwaylandsink_la_OBJECTS = $(am_libgstwaylandsink_la_OBJECTS)
+ libgstwaylandsink_la-wlvideoformat.lo
+nodist_libgstwaylandsink_la_OBJECTS = \
+ libgstwaylandsink_la-viewporter-protocol.lo
+libgstwaylandsink_la_OBJECTS = $(am_libgstwaylandsink_la_OBJECTS) \
+ $(nodist_libgstwaylandsink_la_OBJECTS)
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
am__v_lt_0 = --silent
@@ -217,7 +219,8 @@
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
am__v_CCLD_0 = @echo " CCLD " $@;
am__v_CCLD_1 =
-SOURCES = $(libgstwaylandsink_la_SOURCES)
+SOURCES = $(libgstwaylandsink_la_SOURCES) \
+ $(nodist_libgstwaylandsink_la_SOURCES)
DIST_SOURCES = $(libgstwaylandsink_la_SOURCES)
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
@@ -310,6 +313,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -331,6 +336,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -380,6 +387,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -525,6 +534,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -651,8 +662,6 @@
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@
@@ -695,8 +704,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -786,15 +800,16 @@
top_srcdir = @top_srcdir@
wayland_scanner = @wayland_scanner@
plugin_LTLIBRARIES = libgstwaylandsink.la
+BUILT_SOURCES = viewporter-protocol.c viewporter-client-protocol.h
libgstwaylandsink_la_SOURCES = \
gstwaylandsink.c \
wlshmallocator.c \
wlbuffer.c \
wldisplay.c \
wlwindow.c \
- wlvideoformat.c \
- scaler-protocol.c
+ wlvideoformat.c
+nodist_libgstwaylandsink_la_SOURCES = viewporter-protocol.c
libgstwaylandsink_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
$(WAYLAND_CFLAGS) $(GST_PLUGINS_BAD_CFLAGS)
@@ -813,12 +828,11 @@
wlbuffer.h \
wldisplay.h \
wlwindow.h \
- wlvideoformat.h \
- scaler-client-protocol.h
+ wlvideoformat.h
-EXTRA_DIST = scaler.xml
-CLEANFILES = scaler-protocol.c scaler-client-protocol.h
-all: all-am
+CLEANFILES = $(BUILT_SOURCES)
+all: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) all-am
.SUFFIXES:
.SUFFIXES: .c .lo .o .obj
@@ -897,7 +911,7 @@
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwaylandsink_la-gstwaylandsink.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwaylandsink_la-scaler-protocol.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwaylandsink_la-viewporter-protocol.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwaylandsink_la-wlbuffer.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwaylandsink_la-wldisplay.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwaylandsink_la-wlshmallocator.Plo@am__quote@
@@ -970,12 +984,12 @@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwaylandsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwaylandsink_la_CFLAGS) $(CFLAGS) -c -o libgstwaylandsink_la-wlvideoformat.lo `test -f 'wlvideoformat.c' || echo '$(srcdir)/'`wlvideoformat.c
-libgstwaylandsink_la-scaler-protocol.lo: scaler-protocol.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwaylandsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwaylandsink_la_CFLAGS) $(CFLAGS) -MT libgstwaylandsink_la-scaler-protocol.lo -MD -MP -MF $(DEPDIR)/libgstwaylandsink_la-scaler-protocol.Tpo -c -o libgstwaylandsink_la-scaler-protocol.lo `test -f 'scaler-protocol.c' || echo '$(srcdir)/'`scaler-protocol.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwaylandsink_la-scaler-protocol.Tpo $(DEPDIR)/libgstwaylandsink_la-scaler-protocol.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scaler-protocol.c' object='libgstwaylandsink_la-scaler-protocol.lo' libtool=yes @AMDEPBACKSLASH@
+libgstwaylandsink_la-viewporter-protocol.lo: viewporter-protocol.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwaylandsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwaylandsink_la_CFLAGS) $(CFLAGS) -MT libgstwaylandsink_la-viewporter-protocol.lo -MD -MP -MF $(DEPDIR)/libgstwaylandsink_la-viewporter-protocol.Tpo -c -o libgstwaylandsink_la-viewporter-protocol.lo `test -f 'viewporter-protocol.c' || echo '$(srcdir)/'`viewporter-protocol.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwaylandsink_la-viewporter-protocol.Tpo $(DEPDIR)/libgstwaylandsink_la-viewporter-protocol.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='viewporter-protocol.c' object='libgstwaylandsink_la-viewporter-protocol.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 $(libgstwaylandsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwaylandsink_la_CFLAGS) $(CFLAGS) -c -o libgstwaylandsink_la-scaler-protocol.lo `test -f 'scaler-protocol.c' || echo '$(srcdir)/'`scaler-protocol.c
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwaylandsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwaylandsink_la_CFLAGS) $(CFLAGS) -c -o libgstwaylandsink_la-viewporter-protocol.lo `test -f 'viewporter-protocol.c' || echo '$(srcdir)/'`viewporter-protocol.c
mostlyclean-libtool:
-rm -f *.lo
@@ -1066,13 +1080,15 @@
fi; \
done
check-am: all-am
-check: check-am
+check: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-am
all-am: Makefile $(LTLIBRARIES) $(HEADERS)
installdirs:
for dir in "$(DESTDIR)$(plugindir)"; do \
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
done
-install: install-am
+install: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
@@ -1103,6 +1119,7 @@
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
clean: clean-am
clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \
@@ -1174,7 +1191,7 @@
uninstall-am: uninstall-pluginLTLIBRARIES
-.MAKE: install-am install-strip
+.MAKE: all check install install-am install-strip
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
clean-libtool clean-pluginLTLIBRARIES cscopelist-am ctags \
@@ -1194,21 +1211,21 @@
.PRECIOUS: Makefile
-%-protocol.c : %.xml
- $(wayland_scanner) code < $< > $@
+.SECONDEXPANSION:
-%-client-protocol.h : %.xml
- $(wayland_scanner) client-header < $< > $@
+define protostability
+$(if $(findstring unstable,$1),unstable,stable)
+endef
-gstwaylandsink.c: scaler-client-protocol.h
+define protoname
+$(shell echo $1 | sed 's/\([a-z\-]\+\)-[a-z]\+-v[0-9]\+/\1/')
+endef
-wlshmallocator.c: scaler-client-protocol.h
+%-protocol.c : $(WAYLAND_PROTOCOLS_DATADIR)/$$(call protostability,$$*)/$$(call protoname,$$*)/$$*.xml
+ $(AM_V_GEN)$(wayland_scanner) code < $< > $@
-wlbuffer.c: scaler-client-protocol.h
-
-wldisplay.c: scaler-client-protocol.h
-
-wlwindow.c: scaler-client-protocol.h
+%-client-protocol.h : $(WAYLAND_PROTOCOLS_DATADIR)/$$(call protostability,$$*)/$$(call protoname,$$*)/$$*.xml
+ $(AM_V_GEN)$(wayland_scanner) client-header < $< > $@
# 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.
diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c
index f4f34a8..6e7510b 100644
--- a/ext/wayland/gstwaylandsink.c
+++ b/ext/wayland/gstwaylandsink.c
@@ -89,11 +89,9 @@
static GstCaps *gst_wayland_sink_get_caps (GstBaseSink * bsink,
GstCaps * filter);
static gboolean gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps);
-static gboolean gst_wayland_sink_preroll (GstBaseSink * bsink,
- GstBuffer * buffer);
static gboolean
gst_wayland_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query);
-static gboolean gst_wayland_sink_render (GstBaseSink * bsink,
+static gboolean gst_wayland_sink_show_frame (GstVideoSink * bsink,
GstBuffer * buffer);
/* VideoOverlay interface */
@@ -124,17 +122,18 @@
GObjectClass *gobject_class;
GstElementClass *gstelement_class;
GstBaseSinkClass *gstbasesink_class;
+ GstVideoSinkClass *gstvideosink_class;
gobject_class = (GObjectClass *) klass;
gstelement_class = (GstElementClass *) klass;
gstbasesink_class = (GstBaseSinkClass *) klass;
+ gstvideosink_class = (GstVideoSinkClass *) klass;
gobject_class->set_property = gst_wayland_sink_set_property;
gobject_class->get_property = gst_wayland_sink_get_property;
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_wayland_sink_finalize);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_template));
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_template);
gst_element_class_set_static_metadata (gstelement_class,
"wayland video sink", "Sink/Video",
@@ -149,10 +148,11 @@
gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_wayland_sink_get_caps);
gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_wayland_sink_set_caps);
- gstbasesink_class->preroll = GST_DEBUG_FUNCPTR (gst_wayland_sink_preroll);
gstbasesink_class->propose_allocation =
GST_DEBUG_FUNCPTR (gst_wayland_sink_propose_allocation);
- gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_wayland_sink_render);
+
+ gstvideosink_class->show_frame =
+ GST_DEBUG_FUNCPTR (gst_wayland_sink_show_frame);
g_object_class_install_property (gobject_class, PROP_DISPLAY,
g_param_spec_string ("display", "Wayland Display name", "Wayland "
@@ -397,17 +397,18 @@
enum wl_shm_format fmt;
g_value_init (&list, GST_TYPE_LIST);
- g_value_init (&value, G_TYPE_STRING);
formats = sink->display->shm_formats;
for (i = 0; i < formats->len; i++) {
+ g_value_init (&value, G_TYPE_STRING);
fmt = g_array_index (formats, uint32_t, i);
- g_value_set_string (&value, gst_wl_shm_format_to_string (fmt));
- gst_value_list_append_value (&list, &value);
+ g_value_set_static_string (&value, gst_wl_shm_format_to_string (fmt));
+ gst_value_list_append_and_take_value (&list, &value);
}
caps = gst_caps_make_writable (caps);
- gst_structure_set_value (gst_caps_get_structure (caps, 0), "format", &list);
+ gst_structure_take_value (gst_caps_get_structure (caps, 0), "format",
+ &list);
GST_DEBUG_OBJECT (sink, "display caps: %" GST_PTR_FORMAT, caps);
}
@@ -426,6 +427,28 @@
return caps;
}
+static GstBufferPool *
+gst_wayland_create_pool (GstWaylandSink * sink, GstCaps * caps)
+{
+ GstBufferPool *pool = NULL;
+ GstStructure *structure;
+ gsize size = sink->video_info.size;
+
+ pool = gst_video_buffer_pool_new ();
+
+ structure = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_set_params (structure, caps, size, 2, 0);
+ gst_buffer_pool_config_set_allocator (structure, gst_wl_shm_allocator_get (),
+ NULL);
+
+ if (!gst_buffer_pool_set_config (pool, structure)) {
+ g_object_unref (pool);
+ pool = NULL;
+ }
+
+ return pool;
+}
+
static gboolean
gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
{
@@ -435,7 +458,6 @@
enum wl_shm_format format;
GArray *formats;
gint i;
- GstStructure *structure;
sink = GST_WAYLAND_SINK (bsink);
@@ -459,22 +481,16 @@
if (i >= formats->len)
goto unsupported_format;
- /* create a new pool for the new configuration */
- newpool = gst_video_buffer_pool_new ();
- if (!newpool)
- goto pool_failed;
-
- structure = gst_buffer_pool_get_config (newpool);
- gst_buffer_pool_config_set_params (structure, caps, info.size, 2, 0);
- gst_buffer_pool_config_set_allocator (structure, gst_wl_shm_allocator_get (),
- NULL);
- if (!gst_buffer_pool_set_config (newpool, structure))
- goto config_failed;
-
/* store the video info */
sink->video_info = info;
sink->video_info_changed = TRUE;
+ /* create a new pool for the new configuration */
+ newpool = gst_wayland_create_pool (sink, caps);
+ if (!newpool)
+ goto pool_failed;
+
+
gst_object_replace ((GstObject **) & sink->pool, (GstObject *) newpool);
gst_object_unref (newpool);
@@ -482,25 +498,19 @@
invalid_format:
{
- GST_DEBUG_OBJECT (sink,
+ GST_ERROR_OBJECT (sink,
"Could not locate image format from caps %" GST_PTR_FORMAT, caps);
return FALSE;
}
unsupported_format:
{
- GST_DEBUG_OBJECT (sink, "Format %s is not available on the display",
+ GST_ERROR_OBJECT (sink, "Format %s is not available on the display",
gst_wl_shm_format_to_string (format));
return FALSE;
}
pool_failed:
{
- GST_DEBUG_OBJECT (sink, "Failed to create new pool");
- return FALSE;
- }
-config_failed:
- {
- GST_DEBUG_OBJECT (bsink, "failed setting config");
- gst_object_unref (newpool);
+ GST_ERROR_OBJECT (sink, "Failed to create new pool");
return FALSE;
}
}
@@ -509,29 +519,26 @@
gst_wayland_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
{
GstWaylandSink *sink = GST_WAYLAND_SINK (bsink);
- GstStructure *config;
- guint size, min_bufs, max_bufs;
+ GstCaps *caps;
+ GstBufferPool *pool = NULL;
+ gboolean need_pool;
- config = gst_buffer_pool_get_config (sink->pool);
- gst_buffer_pool_config_get_params (config, NULL, &size, &min_bufs, &max_bufs);
+ gst_query_parse_allocation (query, &caps, &need_pool);
- /* we do have a pool for sure (created in set_caps),
- * so let's propose it anyway, but also propose the allocator on its own */
- gst_query_add_allocation_pool (query, sink->pool, size, min_bufs, max_bufs);
+ if (need_pool)
+ pool = gst_wayland_create_pool (sink, caps);
+
+ if (pool) {
+ gst_query_add_allocation_pool (query, pool, sink->video_info.size, 2, 0);
+ g_object_unref (pool);
+ }
+
gst_query_add_allocation_param (query, gst_wl_shm_allocator_get (), NULL);
-
- gst_structure_free (config);
+ gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL);
return TRUE;
}
-static GstFlowReturn
-gst_wayland_sink_preroll (GstBaseSink * bsink, GstBuffer * buffer)
-{
- GST_DEBUG_OBJECT (bsink, "preroll buffer %p", buffer);
- return gst_wayland_sink_render (bsink, buffer);
-}
-
static void
frame_redraw_callback (void *data, struct wl_callback *callback, uint32_t time)
{
@@ -539,7 +546,10 @@
GST_LOG ("frame_redraw_cb");
- g_atomic_int_set (&sink->redraw_pending, FALSE);
+ g_mutex_lock (&sink->render_lock);
+ sink->redraw_pending = FALSE;
+ g_mutex_unlock (&sink->render_lock);
+
wl_callback_destroy (callback);
}
@@ -559,7 +569,7 @@
wlbuffer = gst_buffer_get_wl_buffer (sink->last_buffer);
surface = gst_wl_window_get_wl_surface (sink->window);
- g_atomic_int_set (&sink->redraw_pending, TRUE);
+ sink->redraw_pending = TRUE;
callback = wl_surface_frame (surface);
wl_callback_add_listener (callback, &frame_callback_listener, sink);
@@ -571,9 +581,9 @@
}
static GstFlowReturn
-gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer)
+gst_wayland_sink_show_frame (GstVideoSink * vsink, GstBuffer * buffer)
{
- GstWaylandSink *sink = GST_WAYLAND_SINK (bsink);
+ GstWaylandSink *sink = GST_WAYLAND_SINK (vsink);
GstBuffer *to_render;
GstWlBuffer *wlbuffer;
GstFlowReturn ret = GST_FLOW_OK;
@@ -591,13 +601,13 @@
if (!sink->window) {
/* if we were not provided a window, create one ourselves */
- sink->window =
- gst_wl_window_new_toplevel (sink->display, &sink->video_info);
+ sink->window = gst_wl_window_new_toplevel (sink->display,
+ &sink->video_info, &sink->render_lock);
}
}
/* drop buffers until we get a frame callback */
- if (g_atomic_int_get (&sink->redraw_pending) == TRUE)
+ if (sink->redraw_pending)
goto done;
/* make sure that the application has called set_render_rectangle() */
@@ -611,12 +621,25 @@
"writing directly", buffer);
to_render = buffer;
} else {
+ GstVideoMeta *vmeta;
GstMemory *mem;
struct wl_buffer *wbuf = NULL;
+ /* update video info from video meta */
+ vmeta = gst_buffer_get_video_meta (buffer);
+ if (vmeta) {
+ gint i;
+
+ for (i = 0; i < vmeta->n_planes; i++) {
+ sink->video_info.offset[i] = vmeta->offset[i];
+ sink->video_info.stride[i] = vmeta->stride[i];
+ }
+ }
+
GST_LOG_OBJECT (sink, "buffer %p does not have a wl_buffer from our "
"display, creating it", buffer);
+ /* FIXME check all memory when introducing DMA-Buf */
mem = gst_buffer_peek_memory (buffer, 0);
if (gst_is_wl_shm_memory (mem)) {
@@ -628,7 +651,9 @@
gst_buffer_add_wl_buffer (buffer, wbuf, sink->display);
to_render = buffer;
} else {
- GstMapInfo src;
+ GstVideoFrame src, dst;
+ GstVideoInfo src_info = sink->video_info;
+
/* we don't know how to create a wl_buffer directly from the provided
* memory, so we have to copy the data to a memory that we know how
* to handle... */
@@ -638,9 +663,20 @@
/* sink->pool always exists (created in set_caps), but it may not
* be active if upstream is not using it */
- if (!gst_buffer_pool_is_active (sink->pool) &&
- !gst_buffer_pool_set_active (sink->pool, TRUE))
- goto activate_failed;
+ if (!gst_buffer_pool_is_active (sink->pool)) {
+ GstStructure *config;
+ GstCaps *caps;
+ guint size = sink->video_info.size;
+
+ config = gst_buffer_pool_get_config (sink->pool);
+ gst_buffer_pool_config_get_params (config, &caps, &size, NULL, NULL);
+ gst_buffer_pool_config_set_params (config, caps, size, 0, 0);
+
+ /* This is a video pool, it should not fail with basic setings */
+ if (!gst_buffer_pool_set_config (sink->pool, config) ||
+ !gst_buffer_pool_set_active (sink->pool, TRUE))
+ goto activate_failed;
+ }
ret = gst_buffer_pool_acquire_buffer (sink->pool, &to_render, NULL);
if (ret != GST_FLOW_OK)
@@ -659,9 +695,19 @@
gst_buffer_add_wl_buffer (to_render, wbuf, sink->display);
}
- gst_buffer_map (buffer, &src, GST_MAP_READ);
- gst_buffer_fill (to_render, 0, src.data, src.size);
- gst_buffer_unmap (buffer, &src);
+ if (!gst_video_frame_map (&dst, &sink->video_info, to_render,
+ GST_MAP_WRITE))
+ goto dst_map_failed;
+
+ if (!gst_video_frame_map (&src, &src_info, buffer, GST_MAP_READ)) {
+ gst_video_frame_unmap (&dst);
+ goto src_map_failed;
+ }
+
+ gst_video_frame_copy (&dst, &src);
+
+ gst_video_frame_unmap (&src);
+ gst_video_frame_unmap (&dst);
}
}
@@ -703,6 +749,20 @@
ret = GST_FLOW_ERROR;
goto done;
}
+src_map_failed:
+ {
+ GST_ELEMENT_ERROR (sink, RESOURCE, READ,
+ ("Video memory can not be read from userspace."), (NULL));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+dst_map_failed:
+ {
+ GST_ELEMENT_ERROR (sink, RESOURCE, WRITE,
+ ("Video memory can not be written from userspace."), (NULL));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
done:
{
g_mutex_unlock (&sink->render_lock);
@@ -748,7 +808,8 @@
"an externally-supplied display handle. Consider providing a "
"display handle from your application with GstContext"));
} else {
- sink->window = gst_wl_window_new_in_surface (sink->display, surface);
+ sink->window = gst_wl_window_new_in_surface (sink->display, surface,
+ &sink->render_lock);
}
} else {
GST_ERROR_OBJECT (sink, "Failed to find display handle, "
@@ -792,7 +853,7 @@
GST_DEBUG_OBJECT (sink, "expose");
g_mutex_lock (&sink->render_lock);
- if (sink->last_buffer && g_atomic_int_get (&sink->redraw_pending) == FALSE) {
+ if (sink->last_buffer && !sink->redraw_pending) {
GST_DEBUG_OBJECT (sink, "redrawing last buffer");
render_last_buffer (sink);
}
diff --git a/ext/wayland/scaler-client-protocol.h b/ext/wayland/scaler-client-protocol.h
deleted file mode 100644
index 5c11b0f..0000000
--- a/ext/wayland/scaler-client-protocol.h
+++ /dev/null
@@ -1,420 +0,0 @@
-/* Generated by wayland-scanner 1.11.0 */
-
-#ifndef SCALER_CLIENT_PROTOCOL_H
-#define SCALER_CLIENT_PROTOCOL_H
-
-#include <stdint.h>
-#include <stddef.h>
-#include "wayland-client.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @page page_scaler The scaler protocol
- * @section page_ifaces_scaler Interfaces
- * - @subpage page_iface_wl_scaler - surface cropping and scaling
- * - @subpage page_iface_wl_viewport - crop and scale interface to a wl_surface
- * @section page_copyright_scaler Copyright
- * <pre>
- *
- * Copyright © 2013-2014 Collabora, Ltd.
- *
- * Permission to use, copy, modify, distribute, and sell this
- * software and its documentation for any purpose is hereby granted
- * without fee, provided that the above copyright notice appear in
- * all copies and that both that copyright notice and this permission
- * notice appear in supporting documentation, and that the name of
- * the copyright holders not be used in advertising or publicity
- * pertaining to distribution of the software without specific,
- * written prior permission. The copyright holders make no
- * representations about the suitability of this software for any
- * purpose. It is provided "as is" without express or implied
- * warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
- * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
- * THIS SOFTWARE.
- * </pre>
- */
-struct wl_scaler;
-struct wl_surface;
-struct wl_viewport;
-
-/**
- * @page page_iface_wl_scaler wl_scaler
- * @section page_iface_wl_scaler_desc Description
- *
- * The global interface exposing surface cropping and scaling
- * capabilities is used to instantiate an interface extension for a
- * wl_surface object. This extended interface will then allow
- * cropping and scaling the surface contents, effectively
- * disconnecting the direct relationship between the buffer and the
- * surface size.
- * @section page_iface_wl_scaler_api API
- * See @ref iface_wl_scaler.
- */
-/**
- * @defgroup iface_wl_scaler The wl_scaler interface
- *
- * The global interface exposing surface cropping and scaling
- * capabilities is used to instantiate an interface extension for a
- * wl_surface object. This extended interface will then allow
- * cropping and scaling the surface contents, effectively
- * disconnecting the direct relationship between the buffer and the
- * surface size.
- */
-extern const struct wl_interface wl_scaler_interface;
-/**
- * @page page_iface_wl_viewport wl_viewport
- * @section page_iface_wl_viewport_desc Description
- *
- * An additional interface to a wl_surface object, which allows the
- * client to specify the cropping and scaling of the surface
- * contents.
- *
- * This interface allows to define the source rectangle (src_x,
- * src_y, src_width, src_height) from where to take the wl_buffer
- * contents, and scale that to destination size (dst_width,
- * dst_height). This state is double-buffered, and is applied on the
- * next wl_surface.commit.
- *
- * The two parts of crop and scale state are independent: the source
- * rectangle, and the destination size. Initially both are unset, that
- * is, no scaling is applied. The whole of the current wl_buffer is
- * used as the source, and the surface size is as defined in
- * wl_surface.attach.
- *
- * If the destination size is set, it causes the surface size to become
- * dst_width, dst_height. The source (rectangle) is scaled to exactly
- * this size. This overrides whatever the attached wl_buffer size is,
- * unless the wl_buffer is NULL. If the wl_buffer is NULL, the surface
- * has no content and therefore no size. Otherwise, the size is always
- * at least 1x1 in surface coordinates.
- *
- * If the source rectangle is set, it defines what area of the
- * wl_buffer is taken as the source. If the source rectangle is set and
- * the destination size is not set, the surface size becomes the source
- * rectangle size rounded up to the nearest integer. If the source size
- * is already exactly integers, this results in cropping without scaling.
- *
- * The coordinate transformations from buffer pixel coordinates up to
- * the surface-local coordinates happen in the following order:
- * 1. buffer_transform (wl_surface.set_buffer_transform)
- * 2. buffer_scale (wl_surface.set_buffer_scale)
- * 3. crop and scale (wl_viewport.set*)
- * This means, that the source rectangle coordinates of crop and scale
- * are given in the coordinates after the buffer transform and scale,
- * i.e. in the coordinates that would be the surface-local coordinates
- * if the crop and scale was not applied.
- *
- * If the source rectangle is partially or completely outside of the
- * wl_buffer, then the surface contents are undefined (not void), and
- * the surface size is still dst_width, dst_height.
- *
- * The x, y arguments of wl_surface.attach are applied as normal to
- * the surface. They indicate how many pixels to remove from the
- * surface size from the left and the top. In other words, they are
- * still in the surface-local coordinate system, just like dst_width
- * and dst_height are.
- *
- * If the wl_surface associated with the wl_viewport is destroyed,
- * the wl_viewport object becomes inert.
- *
- * If the wl_viewport object is destroyed, the crop and scale
- * state is removed from the wl_surface. The change will be applied
- * on the next wl_surface.commit.
- * @section page_iface_wl_viewport_api API
- * See @ref iface_wl_viewport.
- */
-/**
- * @defgroup iface_wl_viewport The wl_viewport interface
- *
- * An additional interface to a wl_surface object, which allows the
- * client to specify the cropping and scaling of the surface
- * contents.
- *
- * This interface allows to define the source rectangle (src_x,
- * src_y, src_width, src_height) from where to take the wl_buffer
- * contents, and scale that to destination size (dst_width,
- * dst_height). This state is double-buffered, and is applied on the
- * next wl_surface.commit.
- *
- * The two parts of crop and scale state are independent: the source
- * rectangle, and the destination size. Initially both are unset, that
- * is, no scaling is applied. The whole of the current wl_buffer is
- * used as the source, and the surface size is as defined in
- * wl_surface.attach.
- *
- * If the destination size is set, it causes the surface size to become
- * dst_width, dst_height. The source (rectangle) is scaled to exactly
- * this size. This overrides whatever the attached wl_buffer size is,
- * unless the wl_buffer is NULL. If the wl_buffer is NULL, the surface
- * has no content and therefore no size. Otherwise, the size is always
- * at least 1x1 in surface coordinates.
- *
- * If the source rectangle is set, it defines what area of the
- * wl_buffer is taken as the source. If the source rectangle is set and
- * the destination size is not set, the surface size becomes the source
- * rectangle size rounded up to the nearest integer. If the source size
- * is already exactly integers, this results in cropping without scaling.
- *
- * The coordinate transformations from buffer pixel coordinates up to
- * the surface-local coordinates happen in the following order:
- * 1. buffer_transform (wl_surface.set_buffer_transform)
- * 2. buffer_scale (wl_surface.set_buffer_scale)
- * 3. crop and scale (wl_viewport.set*)
- * This means, that the source rectangle coordinates of crop and scale
- * are given in the coordinates after the buffer transform and scale,
- * i.e. in the coordinates that would be the surface-local coordinates
- * if the crop and scale was not applied.
- *
- * If the source rectangle is partially or completely outside of the
- * wl_buffer, then the surface contents are undefined (not void), and
- * the surface size is still dst_width, dst_height.
- *
- * The x, y arguments of wl_surface.attach are applied as normal to
- * the surface. They indicate how many pixels to remove from the
- * surface size from the left and the top. In other words, they are
- * still in the surface-local coordinate system, just like dst_width
- * and dst_height are.
- *
- * If the wl_surface associated with the wl_viewport is destroyed,
- * the wl_viewport object becomes inert.
- *
- * If the wl_viewport object is destroyed, the crop and scale
- * state is removed from the wl_surface. The change will be applied
- * on the next wl_surface.commit.
- */
-extern const struct wl_interface wl_viewport_interface;
-
-#ifndef WL_SCALER_ERROR_ENUM
-#define WL_SCALER_ERROR_ENUM
-enum wl_scaler_error {
- /**
- * the surface already has a viewport object associated
- */
- WL_SCALER_ERROR_VIEWPORT_EXISTS = 0,
-};
-#endif /* WL_SCALER_ERROR_ENUM */
-
-#define WL_SCALER_DESTROY 0
-#define WL_SCALER_GET_VIEWPORT 1
-
-/**
- * @ingroup iface_wl_scaler
- */
-#define WL_SCALER_DESTROY_SINCE_VERSION 1
-/**
- * @ingroup iface_wl_scaler
- */
-#define WL_SCALER_GET_VIEWPORT_SINCE_VERSION 1
-
-/** @ingroup iface_wl_scaler */
-static inline void
-wl_scaler_set_user_data(struct wl_scaler *wl_scaler, void *user_data)
-{
- wl_proxy_set_user_data((struct wl_proxy *) wl_scaler, user_data);
-}
-
-/** @ingroup iface_wl_scaler */
-static inline void *
-wl_scaler_get_user_data(struct wl_scaler *wl_scaler)
-{
- return wl_proxy_get_user_data((struct wl_proxy *) wl_scaler);
-}
-
-static inline uint32_t
-wl_scaler_get_version(struct wl_scaler *wl_scaler)
-{
- return wl_proxy_get_version((struct wl_proxy *) wl_scaler);
-}
-
-/**
- * @ingroup iface_wl_scaler
- *
- * Informs the server that the client will not be using this
- * protocol object anymore. This does not affect any other objects,
- * wl_viewport objects included.
- */
-static inline void
-wl_scaler_destroy(struct wl_scaler *wl_scaler)
-{
- wl_proxy_marshal((struct wl_proxy *) wl_scaler,
- WL_SCALER_DESTROY);
-
- wl_proxy_destroy((struct wl_proxy *) wl_scaler);
-}
-
-/**
- * @ingroup iface_wl_scaler
- *
- * Instantiate an interface extension for the given wl_surface to
- * crop and scale its content. If the given wl_surface already has
- * a wl_viewport object associated, the viewport_exists
- * protocol error is raised.
- */
-static inline struct wl_viewport *
-wl_scaler_get_viewport(struct wl_scaler *wl_scaler, struct wl_surface *surface)
-{
- struct wl_proxy *id;
-
- id = wl_proxy_marshal_constructor((struct wl_proxy *) wl_scaler,
- WL_SCALER_GET_VIEWPORT, &wl_viewport_interface, NULL, surface);
-
- return (struct wl_viewport *) id;
-}
-
-#ifndef WL_VIEWPORT_ERROR_ENUM
-#define WL_VIEWPORT_ERROR_ENUM
-enum wl_viewport_error {
- /**
- * negative or zero values in width or height
- */
- WL_VIEWPORT_ERROR_BAD_VALUE = 0,
-};
-#endif /* WL_VIEWPORT_ERROR_ENUM */
-
-#define WL_VIEWPORT_DESTROY 0
-#define WL_VIEWPORT_SET 1
-#define WL_VIEWPORT_SET_SOURCE 2
-#define WL_VIEWPORT_SET_DESTINATION 3
-
-/**
- * @ingroup iface_wl_viewport
- */
-#define WL_VIEWPORT_DESTROY_SINCE_VERSION 1
-/**
- * @ingroup iface_wl_viewport
- */
-#define WL_VIEWPORT_SET_SINCE_VERSION 1
-/**
- * @ingroup iface_wl_viewport
- */
-#define WL_VIEWPORT_SET_SOURCE_SINCE_VERSION 2
-/**
- * @ingroup iface_wl_viewport
- */
-#define WL_VIEWPORT_SET_DESTINATION_SINCE_VERSION 2
-
-/** @ingroup iface_wl_viewport */
-static inline void
-wl_viewport_set_user_data(struct wl_viewport *wl_viewport, void *user_data)
-{
- wl_proxy_set_user_data((struct wl_proxy *) wl_viewport, user_data);
-}
-
-/** @ingroup iface_wl_viewport */
-static inline void *
-wl_viewport_get_user_data(struct wl_viewport *wl_viewport)
-{
- return wl_proxy_get_user_data((struct wl_proxy *) wl_viewport);
-}
-
-static inline uint32_t
-wl_viewport_get_version(struct wl_viewport *wl_viewport)
-{
- return wl_proxy_get_version((struct wl_proxy *) wl_viewport);
-}
-
-/**
- * @ingroup iface_wl_viewport
- *
- * The associated wl_surface's crop and scale state is removed.
- * The change is applied on the next wl_surface.commit.
- */
-static inline void
-wl_viewport_destroy(struct wl_viewport *wl_viewport)
-{
- wl_proxy_marshal((struct wl_proxy *) wl_viewport,
- WL_VIEWPORT_DESTROY);
-
- wl_proxy_destroy((struct wl_proxy *) wl_viewport);
-}
-
-/**
- * @ingroup iface_wl_viewport
- *
- * Set both source rectangle and destination size of the associated
- * wl_surface. See wl_viewport for the description, and relation to
- * the wl_buffer size.
- *
- * The bad_value protocol error is raised if src_width or
- * src_height is negative, or if dst_width or dst_height is not
- * positive.
- *
- * The crop and scale state is double-buffered state, and will be
- * applied on the next wl_surface.commit.
- *
- * Arguments dst_x and dst_y do not exist here, use the x and y
- * arguments to wl_surface.attach. The x, y, dst_width, and dst_height
- * define the surface-local coordinate system irrespective of the
- * attached wl_buffer size.
- */
-static inline void
-wl_viewport_set(struct wl_viewport *wl_viewport, wl_fixed_t src_x, wl_fixed_t src_y, wl_fixed_t src_width, wl_fixed_t src_height, int32_t dst_width, int32_t dst_height)
-{
- wl_proxy_marshal((struct wl_proxy *) wl_viewport,
- WL_VIEWPORT_SET, src_x, src_y, src_width, src_height, dst_width, dst_height);
-}
-
-/**
- * @ingroup iface_wl_viewport
- *
- * Set the source rectangle of the associated wl_surface. See
- * wl_viewport for the description, and relation to the wl_buffer
- * size.
- *
- * If width is -1.0 and height is -1.0, the destination size is unset
- * instead. Any other pair of values for width and height that
- * contains zero or negative values raises the bad_value protocol
- * error.
- *
- * The crop and scale state is double-buffered state, and will be
- * applied on the next wl_surface.commit.
- */
-static inline void
-wl_viewport_set_source(struct wl_viewport *wl_viewport, wl_fixed_t x, wl_fixed_t y, wl_fixed_t width, wl_fixed_t height)
-{
- wl_proxy_marshal((struct wl_proxy *) wl_viewport,
- WL_VIEWPORT_SET_SOURCE, x, y, width, height);
-}
-
-/**
- * @ingroup iface_wl_viewport
- *
- * Set the destination size of the associated wl_surface. See
- * wl_viewport for the description, and relation to the wl_buffer
- * size.
- *
- * If width is -1 and height is -1, the destination size is unset
- * instead. Any other pair of values for width and height that
- * contains zero or negative values raises the bad_value protocol
- * error.
- *
- * The crop and scale state is double-buffered state, and will be
- * applied on the next wl_surface.commit.
- *
- * Arguments x and y do not exist here, use the x and y arguments to
- * wl_surface.attach. The x, y, width, and height define the
- * surface-local coordinate system irrespective of the attached
- * wl_buffer size.
- */
-static inline void
-wl_viewport_set_destination(struct wl_viewport *wl_viewport, int32_t width, int32_t height)
-{
- wl_proxy_marshal((struct wl_proxy *) wl_viewport,
- WL_VIEWPORT_SET_DESTINATION, width, height);
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/ext/wayland/scaler-protocol.c b/ext/wayland/scaler-protocol.c
deleted file mode 100644
index 0e8e3d1..0000000
--- a/ext/wayland/scaler-protocol.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/* Generated by wayland-scanner 1.11.0 */
-
-/*
- * Copyright © 2013-2014 Collabora, Ltd.
- *
- * Permission to use, copy, modify, distribute, and sell this
- * software and its documentation for any purpose is hereby granted
- * without fee, provided that the above copyright notice appear in
- * all copies and that both that copyright notice and this permission
- * notice appear in supporting documentation, and that the name of
- * the copyright holders not be used in advertising or publicity
- * pertaining to distribution of the software without specific,
- * written prior permission. The copyright holders make no
- * representations about the suitability of this software for any
- * purpose. It is provided "as is" without express or implied
- * warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
- * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
- * THIS SOFTWARE.
- */
-
-#include <stdlib.h>
-#include <stdint.h>
-#include "wayland-util.h"
-
-extern const struct wl_interface wl_surface_interface;
-extern const struct wl_interface wl_viewport_interface;
-
-static const struct wl_interface *types[] = {
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- &wl_viewport_interface,
- &wl_surface_interface,
-};
-
-static const struct wl_message wl_scaler_requests[] = {
- { "destroy", "", types + 0 },
- { "get_viewport", "no", types + 6 },
-};
-
-WL_EXPORT const struct wl_interface wl_scaler_interface = {
- "wl_scaler", 2,
- 2, wl_scaler_requests,
- 0, NULL,
-};
-
-static const struct wl_message wl_viewport_requests[] = {
- { "destroy", "", types + 0 },
- { "set", "ffffii", types + 0 },
- { "set_source", "2ffff", types + 0 },
- { "set_destination", "2ii", types + 0 },
-};
-
-WL_EXPORT const struct wl_interface wl_viewport_interface = {
- "wl_viewport", 2,
- 4, wl_viewport_requests,
- 0, NULL,
-};
-
diff --git a/ext/wayland/scaler.xml b/ext/wayland/scaler.xml
deleted file mode 100644
index e21ae5b..0000000
--- a/ext/wayland/scaler.xml
+++ /dev/null
@@ -1,210 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<protocol name="scaler">
-
- <copyright>
- Copyright © 2013-2014 Collabora, Ltd.
-
- Permission to use, copy, modify, distribute, and sell this
- software and its documentation for any purpose is hereby granted
- without fee, provided that the above copyright notice appear in
- all copies and that both that copyright notice and this permission
- notice appear in supporting documentation, and that the name of
- the copyright holders not be used in advertising or publicity
- pertaining to distribution of the software without specific,
- written prior permission. The copyright holders make no
- representations about the suitability of this software for any
- purpose. It is provided "as is" without express or implied
- warranty.
-
- THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
- SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
- ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
- THIS SOFTWARE.
- </copyright>
-
- <interface name="wl_scaler" version="2">
- <description summary="surface cropping and scaling">
- The global interface exposing surface cropping and scaling
- capabilities is used to instantiate an interface extension for a
- wl_surface object. This extended interface will then allow
- cropping and scaling the surface contents, effectively
- disconnecting the direct relationship between the buffer and the
- surface size.
- </description>
-
- <request name="destroy" type="destructor">
- <description summary="unbind from the cropping and scaling interface">
- Informs the server that the client will not be using this
- protocol object anymore. This does not affect any other objects,
- wl_viewport objects included.
- </description>
- </request>
-
- <enum name="error">
- <entry name="viewport_exists" value="0"
- summary="the surface already has a viewport object associated"/>
- </enum>
-
- <request name="get_viewport">
- <description summary="extend surface interface for crop and scale">
- Instantiate an interface extension for the given wl_surface to
- crop and scale its content. If the given wl_surface already has
- a wl_viewport object associated, the viewport_exists
- protocol error is raised.
- </description>
-
- <arg name="id" type="new_id" interface="wl_viewport"
- summary="the new viewport interface id"/>
- <arg name="surface" type="object" interface="wl_surface"
- summary="the surface"/>
- </request>
- </interface>
-
- <interface name="wl_viewport" version="2">
- <description summary="crop and scale interface to a wl_surface">
- An additional interface to a wl_surface object, which allows the
- client to specify the cropping and scaling of the surface
- contents.
-
- This interface allows to define the source rectangle (src_x,
- src_y, src_width, src_height) from where to take the wl_buffer
- contents, and scale that to destination size (dst_width,
- dst_height). This state is double-buffered, and is applied on the
- next wl_surface.commit.
-
- The two parts of crop and scale state are independent: the source
- rectangle, and the destination size. Initially both are unset, that
- is, no scaling is applied. The whole of the current wl_buffer is
- used as the source, and the surface size is as defined in
- wl_surface.attach.
-
- If the destination size is set, it causes the surface size to become
- dst_width, dst_height. The source (rectangle) is scaled to exactly
- this size. This overrides whatever the attached wl_buffer size is,
- unless the wl_buffer is NULL. If the wl_buffer is NULL, the surface
- has no content and therefore no size. Otherwise, the size is always
- at least 1x1 in surface coordinates.
-
- If the source rectangle is set, it defines what area of the
- wl_buffer is taken as the source. If the source rectangle is set and
- the destination size is not set, the surface size becomes the source
- rectangle size rounded up to the nearest integer. If the source size
- is already exactly integers, this results in cropping without scaling.
-
- The coordinate transformations from buffer pixel coordinates up to
- the surface-local coordinates happen in the following order:
- 1. buffer_transform (wl_surface.set_buffer_transform)
- 2. buffer_scale (wl_surface.set_buffer_scale)
- 3. crop and scale (wl_viewport.set*)
- This means, that the source rectangle coordinates of crop and scale
- are given in the coordinates after the buffer transform and scale,
- i.e. in the coordinates that would be the surface-local coordinates
- if the crop and scale was not applied.
-
- If the source rectangle is partially or completely outside of the
- wl_buffer, then the surface contents are undefined (not void), and
- the surface size is still dst_width, dst_height.
-
- The x, y arguments of wl_surface.attach are applied as normal to
- the surface. They indicate how many pixels to remove from the
- surface size from the left and the top. In other words, they are
- still in the surface-local coordinate system, just like dst_width
- and dst_height are.
-
- If the wl_surface associated with the wl_viewport is destroyed,
- the wl_viewport object becomes inert.
-
- If the wl_viewport object is destroyed, the crop and scale
- state is removed from the wl_surface. The change will be applied
- on the next wl_surface.commit.
- </description>
-
- <request name="destroy" type="destructor">
- <description summary="remove scaling and cropping from the surface">
- The associated wl_surface's crop and scale state is removed.
- The change is applied on the next wl_surface.commit.
- </description>
- </request>
-
- <enum name="error">
- <entry name="bad_value" value="0"
- summary="negative or zero values in width or height"/>
- </enum>
-
- <request name="set">
- <description summary="set the crop and scale state">
- Set both source rectangle and destination size of the associated
- wl_surface. See wl_viewport for the description, and relation to
- the wl_buffer size.
-
- The bad_value protocol error is raised if src_width or
- src_height is negative, or if dst_width or dst_height is not
- positive.
-
- The crop and scale state is double-buffered state, and will be
- applied on the next wl_surface.commit.
-
- Arguments dst_x and dst_y do not exist here, use the x and y
- arguments to wl_surface.attach. The x, y, dst_width, and dst_height
- define the surface-local coordinate system irrespective of the
- attached wl_buffer size.
- </description>
-
- <arg name="src_x" type="fixed" summary="source rectangle x"/>
- <arg name="src_y" type="fixed" summary="source rectangle y"/>
- <arg name="src_width" type="fixed" summary="source rectangle width"/>
- <arg name="src_height" type="fixed" summary="source rectangle height"/>
- <arg name="dst_width" type="int" summary="surface width"/>
- <arg name="dst_height" type="int" summary="surface height"/>
- </request>
-
- <request name="set_source" since="2">
- <description summary="set the source rectangle for cropping">
- Set the source rectangle of the associated wl_surface. See
- wl_viewport for the description, and relation to the wl_buffer
- size.
-
- If width is -1.0 and height is -1.0, the destination size is unset
- instead. Any other pair of values for width and height that
- contains zero or negative values raises the bad_value protocol
- error.
-
- The crop and scale state is double-buffered state, and will be
- applied on the next wl_surface.commit.
- </description>
-
- <arg name="x" type="fixed" summary="source rectangle x"/>
- <arg name="y" type="fixed" summary="source rectangle y"/>
- <arg name="width" type="fixed" summary="source rectangle width"/>
- <arg name="height" type="fixed" summary="source rectangle height"/>
- </request>
-
- <request name="set_destination" since="2">
- <description summary="set the surface size for scaling">
- Set the destination size of the associated wl_surface. See
- wl_viewport for the description, and relation to the wl_buffer
- size.
-
- If width is -1 and height is -1, the destination size is unset
- instead. Any other pair of values for width and height that
- contains zero or negative values raises the bad_value protocol
- error.
-
- The crop and scale state is double-buffered state, and will be
- applied on the next wl_surface.commit.
-
- Arguments x and y do not exist here, use the x and y arguments to
- wl_surface.attach. The x, y, width, and height define the
- surface-local coordinate system irrespective of the attached
- wl_buffer size.
- </description>
-
- <arg name="width" type="int" summary="surface width"/>
- <arg name="height" type="int" summary="surface height"/>
- </request>
- </interface>
-</protocol>
diff --git a/ext/wayland/wldisplay.c b/ext/wayland/wldisplay.c
index 3318095..1011a04 100644
--- a/ext/wayland/wldisplay.c
+++ b/ext/wayland/wldisplay.c
@@ -75,6 +75,9 @@
g_hash_table_unref (self->buffers);
g_mutex_clear (&self->buffers_mutex);
+ if (self->viewporter)
+ wp_viewporter_destroy (self->viewporter);
+
if (self->shm)
wl_shm_destroy (self->shm);
@@ -161,8 +164,9 @@
} else if (g_strcmp0 (interface, "wl_shm") == 0) {
self->shm = wl_registry_bind (registry, id, &wl_shm_interface, 1);
wl_shm_add_listener (self->shm, &shm_listener, self);
- } else if (g_strcmp0 (interface, "wl_scaler") == 0) {
- self->scaler = wl_registry_bind (registry, id, &wl_scaler_interface, 2);
+ } else if (g_strcmp0 (interface, "wp_viewporter") == 0) {
+ self->viewporter =
+ wl_registry_bind (registry, id, &wp_viewporter_interface, 1);
}
}
@@ -266,10 +270,17 @@
VERIFY_INTERFACE_EXISTS (subcompositor, "wl_subcompositor");
VERIFY_INTERFACE_EXISTS (shell, "wl_shell");
VERIFY_INTERFACE_EXISTS (shm, "wl_shm");
- VERIFY_INTERFACE_EXISTS (scaler, "wl_scaler");
#undef VERIFY_INTERFACE_EXISTS
+ /* We make the viewporter optional even though it may cause bad display.
+ * This is so one can test wayland display on older compositor or on
+ * compositor that don't implement this extension. */
+ if (!self->viewporter) {
+ g_warning ("Wayland compositor is missing the ability to scale, video "
+ "display may not work properly.");
+ }
+
self->thread = g_thread_try_new ("GstWlDisplay", gst_wl_display_thread_run,
self, &err);
if (err) {
diff --git a/ext/wayland/wldisplay.h b/ext/wayland/wldisplay.h
index e9df749..9cbb500 100644
--- a/ext/wayland/wldisplay.h
+++ b/ext/wayland/wldisplay.h
@@ -23,7 +23,7 @@
#include <gst/gst.h>
#include <wayland-client.h>
-#include "scaler-client-protocol.h"
+#include "viewporter-client-protocol.h"
G_BEGIN_DECLS
@@ -51,7 +51,7 @@
struct wl_subcompositor *subcompositor;
struct wl_shell *shell;
struct wl_shm *shm;
- struct wl_scaler *scaler;
+ struct wp_viewporter *viewporter;
GArray *shm_formats;
/* private */
diff --git a/ext/wayland/wlwindow.c b/ext/wayland/wlwindow.c
index 79000ae..b60f351 100644
--- a/ext/wayland/wlwindow.c
+++ b/ext/wayland/wlwindow.c
@@ -46,11 +46,21 @@
handle_configure (void *data, struct wl_shell_surface *shell_surface,
uint32_t edges, int32_t width, int32_t height)
{
+ GstWlWindow *window = data;
+
+ GST_DEBUG ("Windows configure: edges %x, width = %i, height %i", edges,
+ width, height);
+
+ if (width == 0 || height == 0)
+ return;
+
+ gst_wl_window_set_render_rectangle (window, 0, 0, width, height);
}
static void
handle_popup_done (void *data, struct wl_shell_surface *shell_surface)
{
+ GST_DEBUG ("Window popup done.");
}
static const struct wl_shell_surface_listener shell_surface_listener = {
@@ -76,18 +86,21 @@
{
GstWlWindow *self = GST_WL_WINDOW (gobject);
- if (self->shell_surface) {
+ if (self->shell_surface)
wl_shell_surface_destroy (self->shell_surface);
- }
- wl_viewport_destroy (self->video_viewport);
+ if (self->video_viewport)
+ wp_viewport_destroy (self->video_viewport);
+
wl_subsurface_destroy (self->video_subsurface);
wl_surface_destroy (self->video_surface);
- if (self->area_subsurface) {
+ if (self->area_subsurface)
wl_subsurface_destroy (self->area_subsurface);
- }
- wl_viewport_destroy (self->area_viewport);
+
+ if (self->area_viewport)
+ wp_viewport_destroy (self->area_viewport);
+
wl_surface_destroy (self->area_surface);
g_clear_object (&self->display);
@@ -96,18 +109,14 @@
}
static GstWlWindow *
-gst_wl_window_new_internal (GstWlDisplay * display)
+gst_wl_window_new_internal (GstWlDisplay * display, GMutex * render_lock)
{
GstWlWindow *window;
- GstVideoInfo info;
- GstBuffer *buf;
- GstMapInfo mapinfo;
- struct wl_buffer *wlbuf;
- GstWlBuffer *gwlbuf;
struct wl_region *region;
window = g_object_new (GST_TYPE_WL_WINDOW, NULL);
window->display = g_object_ref (display);
+ window->render_lock = render_lock;
window->area_surface = wl_compositor_create_surface (display->compositor);
window->video_surface = wl_compositor_create_surface (display->compositor);
@@ -122,34 +131,12 @@
window->video_surface, window->area_surface);
wl_subsurface_set_desync (window->video_subsurface);
- window->area_viewport = wl_scaler_get_viewport (display->scaler,
- window->area_surface);
- window->video_viewport = wl_scaler_get_viewport (display->scaler,
- window->video_surface);
-
- /* draw the area_subsurface */
- gst_video_info_set_format (&info,
- /* we want WL_SHM_FORMAT_XRGB8888 */
-#if G_BYTE_ORDER == G_BIG_ENDIAN
- GST_VIDEO_FORMAT_xRGB,
-#else
- GST_VIDEO_FORMAT_BGRx,
-#endif
- 1, 1);
-
- buf = gst_buffer_new_allocate (gst_wl_shm_allocator_get (), info.size, NULL);
- gst_buffer_map (buf, &mapinfo, GST_MAP_WRITE);
- *((guint32 *) mapinfo.data) = 0; /* paint it black */
- gst_buffer_unmap (buf, &mapinfo);
- wlbuf =
- gst_wl_shm_memory_construct_wl_buffer (gst_buffer_peek_memory (buf, 0),
- display, &info);
- gwlbuf = gst_buffer_add_wl_buffer (buf, wlbuf, display);
- gst_wl_buffer_attach (gwlbuf, window->area_surface);
-
- /* at this point, the GstWlBuffer keeps the buffer
- * alive and will free it on wl_buffer::release */
- gst_buffer_unref (buf);
+ if (display->viewporter) {
+ window->area_viewport = wp_viewporter_get_viewport (display->viewporter,
+ window->area_surface);
+ window->video_viewport = wp_viewporter_get_viewport (display->viewporter,
+ window->video_surface);
+ }
/* do not accept input */
region = wl_compositor_create_region (display->compositor);
@@ -164,12 +151,13 @@
}
GstWlWindow *
-gst_wl_window_new_toplevel (GstWlDisplay * display, const GstVideoInfo * info)
+gst_wl_window_new_toplevel (GstWlDisplay * display, const GstVideoInfo * info,
+ GMutex * render_lock)
{
GstWlWindow *window;
gint width;
- window = gst_wl_window_new_internal (display);
+ window = gst_wl_window_new_internal (display, render_lock);
/* go toplevel */
window->shell_surface = wl_shell_get_shell_surface (display->shell,
@@ -196,10 +184,10 @@
GstWlWindow *
gst_wl_window_new_in_surface (GstWlDisplay * display,
- struct wl_surface * parent)
+ struct wl_surface * parent, GMutex * render_lock)
{
GstWlWindow *window;
- window = gst_wl_window_new_internal (display);
+ window = gst_wl_window_new_internal (display, render_lock);
/* embed in parent */
window->area_subsurface =
@@ -246,10 +234,15 @@
src.h = window->video_height;
dst.w = window->render_rectangle.w;
dst.h = window->render_rectangle.h;
- gst_video_sink_center_rect (src, dst, &res, TRUE);
+
+ if (window->video_viewport) {
+ gst_video_sink_center_rect (src, dst, &res, TRUE);
+ wp_viewport_set_destination (window->video_viewport, res.w, res.h);
+ } else {
+ gst_video_sink_center_rect (src, dst, &res, FALSE);
+ }
wl_subsurface_set_position (window->video_subsurface, res.x, res.y);
- wl_viewport_set_destination (window->video_viewport, res.w, res.h);
if (commit) {
wl_surface_damage (window->video_surface, 0, 0, res.w, res.h);
@@ -267,8 +260,7 @@
}
/* this is saved for use in wl_surface_damage */
- window->surface_width = res.w;
- window->surface_height = res.h;
+ window->video_rectangle = res;
}
void
@@ -289,8 +281,8 @@
else
wl_surface_attach (window->video_surface, NULL, 0, 0);
- wl_surface_damage (window->video_surface, 0, 0, window->surface_width,
- window->surface_height);
+ wl_surface_damage (window->video_surface, 0, 0, window->video_rectangle.w,
+ window->video_rectangle.h);
wl_surface_commit (window->video_surface);
if (G_UNLIKELY (info)) {
@@ -305,6 +297,53 @@
wl_display_flush (window->display->display);
}
+/* Update the buffer used to draw black borders. When we have viewporter
+ * support, this is a scaled up 1x1 image, and without we need an black image
+ * the size of the rendering areay. */
+static void
+gst_wl_window_update_borders (GstWlWindow * window)
+{
+ GstVideoFormat format;
+ GstVideoInfo info;
+ gint width, height;
+ GstBuffer *buf;
+ struct wl_buffer *wlbuf;
+ GstWlBuffer *gwlbuf;
+
+ if (window->no_border_update)
+ return;
+
+ if (window->display->viewporter) {
+ width = height = 1;
+ window->no_border_update = TRUE;
+ } else {
+ width = window->render_rectangle.w;
+ height = window->render_rectangle.h;
+ }
+
+ /* we want WL_SHM_FORMAT_XRGB8888 */
+#if G_BYTE_ORDER == G_BIG_ENDIAN
+ format = GST_VIDEO_FORMAT_xRGB;
+#else
+ format = GST_VIDEO_FORMAT_BGRx;
+#endif
+
+ /* draw the area_subsurface */
+ gst_video_info_set_format (&info, format, width, height);
+
+ buf = gst_buffer_new_allocate (gst_wl_shm_allocator_get (), info.size, NULL);
+ gst_buffer_memset (buf, 0, 0, info.size);
+ wlbuf =
+ gst_wl_shm_memory_construct_wl_buffer (gst_buffer_peek_memory (buf, 0),
+ window->display, &info);
+ gwlbuf = gst_buffer_add_wl_buffer (buf, wlbuf, window->display);
+ gst_wl_buffer_attach (gwlbuf, window->area_surface);
+
+ /* at this point, the GstWlBuffer keeps the buffer
+ * alive and will free it on wl_buffer::release */
+ gst_buffer_unref (buf);
+}
+
void
gst_wl_window_set_render_rectangle (GstWlWindow * window, gint x, gint y,
gint w, gint h)
@@ -321,7 +360,10 @@
wl_subsurface_set_position (window->area_subsurface, x, y);
/* change the size of the area */
- wl_viewport_set_destination (window->area_viewport, w, h);
+ if (window->area_viewport)
+ wp_viewport_set_destination (window->area_viewport, w, h);
+
+ gst_wl_window_update_borders (window);
if (window->video_width != 0) {
wl_subsurface_set_sync (window->video_subsurface);
diff --git a/ext/wayland/wlwindow.h b/ext/wayland/wlwindow.h
index e22cb26..e247b4e 100644
--- a/ext/wayland/wlwindow.h
+++ b/ext/wayland/wlwindow.h
@@ -41,21 +41,30 @@
{
GObject parent_instance;
+ GMutex *render_lock;
+
GstWlDisplay *display;
struct wl_surface *area_surface;
struct wl_subsurface *area_subsurface;
- struct wl_viewport *area_viewport;
+ struct wp_viewport *area_viewport;
struct wl_surface *video_surface;
struct wl_subsurface *video_subsurface;
- struct wl_viewport *video_viewport;
+ struct wp_viewport *video_viewport;
struct wl_shell_surface *shell_surface;
/* the size and position of the area_(sub)surface */
GstVideoRectangle render_rectangle;
+
+ /* the size and position of the video_subsurface */
+ GstVideoRectangle video_rectangle;
+
/* the size of the video in the buffers */
gint video_width, video_height;
- /* the size of the video_(sub)surface */
- gint surface_width, surface_height;
+
+ /* this will be set when viewporter is available and black background has
+ * already been set on the area_subsurface */
+ gboolean no_border_update;
+
};
struct _GstWlWindowClass
@@ -66,9 +75,9 @@
GType gst_wl_window_get_type (void);
GstWlWindow *gst_wl_window_new_toplevel (GstWlDisplay * display,
- const GstVideoInfo * info);
+ const GstVideoInfo * info, GMutex * render_lock);
GstWlWindow *gst_wl_window_new_in_surface (GstWlDisplay * display,
- struct wl_surface * parent);
+ struct wl_surface * parent, GMutex * render_lock);
GstWlDisplay *gst_wl_window_get_display (GstWlWindow * window);
struct wl_surface *gst_wl_window_get_wl_surface (GstWlWindow * window);
diff --git a/ext/webp/Makefile.in b/ext/webp/Makefile.in
index 9f1343b..8f69240 100644
--- a/ext/webp/Makefile.in
+++ b/ext/webp/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/webp/gstwebpdec.c b/ext/webp/gstwebpdec.c
index f582cc8..85bb5bf 100644
--- a/ext/webp/gstwebpdec.c
+++ b/ext/webp/gstwebpdec.c
@@ -96,13 +96,12 @@
gobject_class->set_property = gst_webp_dec_set_property;
gobject_class->get_property = gst_webp_dec_get_property;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_webp_dec_src_pad_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_webp_dec_sink_pad_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_webp_dec_src_pad_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_webp_dec_sink_pad_template);
gst_element_class_set_static_metadata (element_class, "WebP image decoder",
- "Codec/Decoder/Image",
- "Decode images from WebP format",
+ "Codec/Decoder/Image", "Decode images from WebP format",
"Sreerenj Balachandran <sreerenj.balachandrn@intel.com>");
g_object_class_install_property (gobject_class, PROP_BYPASS_FILTERING,
diff --git a/ext/webp/gstwebpenc.c b/ext/webp/gstwebpenc.c
index 75891ea..4d912a8 100644
--- a/ext/webp/gstwebpenc.c
+++ b/ext/webp/gstwebpenc.c
@@ -123,13 +123,12 @@
gobject_class->set_property = gst_webp_enc_set_property;
gobject_class->get_property = gst_webp_enc_get_property;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&webp_enc_sink_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&webp_enc_src_factory));
+ gst_element_class_add_static_pad_template (element_class,
+ &webp_enc_sink_factory);
+ gst_element_class_add_static_pad_template (element_class,
+ &webp_enc_src_factory);
gst_element_class_set_static_metadata (element_class, "WEBP image encoder",
- "Codec/Encoder/Image",
- "Encode images in WEBP format",
+ "Codec/Encoder/Image", "Encode images in WEBP format",
"Sreerenj Balachandran <sreerenjb@gnome.org>");
venc_class->start = gst_webp_enc_start;
diff --git a/ext/webrtcdsp/Makefile.am b/ext/webrtcdsp/Makefile.am
new file mode 100644
index 0000000..63ebb45
--- /dev/null
+++ b/ext/webrtcdsp/Makefile.am
@@ -0,0 +1,17 @@
+plugin_LTLIBRARIES = libgstwebrtcdsp.la
+
+libgstwebrtcdsp_la_SOURCES = gstwebrtcdsp.cpp gstwebrtcechoprobe.cpp
+libgstwebrtcdsp_la_CXXFLAGS = \
+ -std=c++11 \
+ $(GST_CXXFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(WEBRTCDSP_CFLAGS)
+libgstwebrtcdsp_la_LIBADD = \
+ -lgstaudio-$(GST_API_VERSION) \
+ $(GST_LIBS) $(GST_BASE_LIBS) \
+ $(GST_PLUGINS_BASE_LIBS) \
+ $(WEBRTCDSP_LIBS)
+libgstwebrtcdsp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+
+noinst_HEADERS = gstwebrtcdsp.h gstwebrtcechoprobe.h
diff --git a/tests/examples/gl/gtk/gtkvideooverlay/Makefile.in b/ext/webrtcdsp/Makefile.in
similarity index 79%
rename from tests/examples/gl/gtk/gtkvideooverlay/Makefile.in
rename to ext/webrtcdsp/Makefile.in
index aef9ed4..7b11d5f 100644
--- a/tests/examples/gl/gtk/gtkvideooverlay/Makefile.in
+++ b/ext/webrtcdsp/Makefile.in
@@ -14,6 +14,7 @@
@SET_MAKE@
+
VPATH = @srcdir@
am__is_gnu_make = { \
if test -z '$(MAKELEVEL)'; then \
@@ -89,8 +90,7 @@
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
-noinst_PROGRAMS = gtkvideooverlay$(EXEEXT)
-subdir = tests/examples/gl/gtk/gtkvideooverlay
+subdir = ext/webrtcdsp
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 \
@@ -127,27 +127,56 @@
$(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 $(am__DIST_COMMON)
+DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \
+ $(am__DIST_COMMON)
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
-PROGRAMS = $(noinst_PROGRAMS)
-am_gtkvideooverlay_OBJECTS = gtkvideooverlay-main.$(OBJEXT)
-gtkvideooverlay_OBJECTS = $(am_gtkvideooverlay_OBJECTS)
+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)
am__DEPENDENCIES_1 =
-gtkvideooverlay_DEPENDENCIES = ../libgstgtkhelper.la \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+libgstwebrtcdsp_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1)
+am_libgstwebrtcdsp_la_OBJECTS = libgstwebrtcdsp_la-gstwebrtcdsp.lo \
+ libgstwebrtcdsp_la-gstwebrtcechoprobe.lo
+libgstwebrtcdsp_la_OBJECTS = $(am_libgstwebrtcdsp_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 =
-gtkvideooverlay_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+libgstwebrtcdsp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
- $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
+ $(libgstwebrtcdsp_la_CXXFLAGS) $(CXXFLAGS) \
+ $(libgstwebrtcdsp_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
@@ -182,13 +211,14 @@
am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
am__v_CXXLD_0 = @echo " CXXLD " $@;
am__v_CXXLD_1 =
-SOURCES = $(gtkvideooverlay_SOURCES)
-DIST_SOURCES = $(gtkvideooverlay_SOURCES)
+SOURCES = $(libgstwebrtcdsp_la_SOURCES)
+DIST_SOURCES = $(libgstwebrtcdsp_la_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 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -295,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -344,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -489,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -615,8 +653,6 @@
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@
@@ -659,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -749,15 +790,23 @@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
wayland_scanner = @wayland_scanner@
-gtkvideooverlay_SOURCES = main.cpp
-gtkvideooverlay_CXXFLAGS = -I$(top_srcdir)/gst-libs -I$(top_builddir)/gst-libs \
- $(GST_PLUGINS_BASE_CFLAGS) $(GST_CXXFLAGS) \
- $(GL_CFLAGS) $(GTK3_CFLAGS) $(X11_CFLAGS)
+plugin_LTLIBRARIES = libgstwebrtcdsp.la
+libgstwebrtcdsp_la_SOURCES = gstwebrtcdsp.cpp gstwebrtcechoprobe.cpp
+libgstwebrtcdsp_la_CXXFLAGS = \
+ -std=c++11 \
+ $(GST_CXXFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(WEBRTCDSP_CFLAGS)
-gtkvideooverlay_LDADD = ../libgstgtkhelper.la \
- $(GTK3_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \
- $(GL_LIBS) -lgstvideo-$(GST_API_VERSION) $(X11_LIBS)
+libgstwebrtcdsp_la_LIBADD = \
+ -lgstaudio-$(GST_API_VERSION) \
+ $(GST_LIBS) $(GST_BASE_LIBS) \
+ $(GST_PLUGINS_BASE_LIBS) \
+ $(WEBRTCDSP_LIBS)
+libgstwebrtcdsp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+noinst_HEADERS = gstwebrtcdsp.h gstwebrtcechoprobe.h
all: all-am
.SUFFIXES:
@@ -771,9 +820,9 @@
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/gl/gtk/gtkvideooverlay/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/webrtcdsp/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu tests/examples/gl/gtk/gtkvideooverlay/Makefile
+ $(AUTOMAKE) --gnu ext/webrtcdsp/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
@@ -792,18 +841,43 @@
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
-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
+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)"; \
+ }
-gtkvideooverlay$(EXEEXT): $(gtkvideooverlay_OBJECTS) $(gtkvideooverlay_DEPENDENCIES) $(EXTRA_gtkvideooverlay_DEPENDENCIES)
- @rm -f gtkvideooverlay$(EXEEXT)
- $(AM_V_CXXLD)$(gtkvideooverlay_LINK) $(gtkvideooverlay_OBJECTS) $(gtkvideooverlay_LDADD) $(LIBS)
+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}; \
+ }
+
+libgstwebrtcdsp.la: $(libgstwebrtcdsp_la_OBJECTS) $(libgstwebrtcdsp_la_DEPENDENCIES) $(EXTRA_libgstwebrtcdsp_la_DEPENDENCIES)
+ $(AM_V_CXXLD)$(libgstwebrtcdsp_la_LINK) -rpath $(plugindir) $(libgstwebrtcdsp_la_OBJECTS) $(libgstwebrtcdsp_la_LIBADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@@ -811,7 +885,8 @@
distclean-compile:
-rm -f *.tab.c
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtkvideooverlay-main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwebrtcdsp_la-gstwebrtcdsp.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwebrtcdsp_la-gstwebrtcechoprobe.Plo@am__quote@
.cpp.o:
@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@@ -837,19 +912,19 @@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
-gtkvideooverlay-main.o: main.cpp
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) -MT gtkvideooverlay-main.o -MD -MP -MF $(DEPDIR)/gtkvideooverlay-main.Tpo -c -o gtkvideooverlay-main.o `test -f 'main.cpp' || echo '$(srcdir)/'`main.cpp
-@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gtkvideooverlay-main.Tpo $(DEPDIR)/gtkvideooverlay-main.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='main.cpp' object='gtkvideooverlay-main.o' libtool=no @AMDEPBACKSLASH@
+libgstwebrtcdsp_la-gstwebrtcdsp.lo: gstwebrtcdsp.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwebrtcdsp_la_CXXFLAGS) $(CXXFLAGS) -MT libgstwebrtcdsp_la-gstwebrtcdsp.lo -MD -MP -MF $(DEPDIR)/libgstwebrtcdsp_la-gstwebrtcdsp.Tpo -c -o libgstwebrtcdsp_la-gstwebrtcdsp.lo `test -f 'gstwebrtcdsp.cpp' || echo '$(srcdir)/'`gstwebrtcdsp.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwebrtcdsp_la-gstwebrtcdsp.Tpo $(DEPDIR)/libgstwebrtcdsp_la-gstwebrtcdsp.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gstwebrtcdsp.cpp' object='libgstwebrtcdsp_la-gstwebrtcdsp.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) -c -o gtkvideooverlay-main.o `test -f 'main.cpp' || echo '$(srcdir)/'`main.cpp
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwebrtcdsp_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstwebrtcdsp_la-gstwebrtcdsp.lo `test -f 'gstwebrtcdsp.cpp' || echo '$(srcdir)/'`gstwebrtcdsp.cpp
-gtkvideooverlay-main.obj: main.cpp
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) -MT gtkvideooverlay-main.obj -MD -MP -MF $(DEPDIR)/gtkvideooverlay-main.Tpo -c -o gtkvideooverlay-main.obj `if test -f 'main.cpp'; then $(CYGPATH_W) 'main.cpp'; else $(CYGPATH_W) '$(srcdir)/main.cpp'; fi`
-@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gtkvideooverlay-main.Tpo $(DEPDIR)/gtkvideooverlay-main.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='main.cpp' object='gtkvideooverlay-main.obj' libtool=no @AMDEPBACKSLASH@
+libgstwebrtcdsp_la-gstwebrtcechoprobe.lo: gstwebrtcechoprobe.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwebrtcdsp_la_CXXFLAGS) $(CXXFLAGS) -MT libgstwebrtcdsp_la-gstwebrtcechoprobe.lo -MD -MP -MF $(DEPDIR)/libgstwebrtcdsp_la-gstwebrtcechoprobe.Tpo -c -o libgstwebrtcdsp_la-gstwebrtcechoprobe.lo `test -f 'gstwebrtcechoprobe.cpp' || echo '$(srcdir)/'`gstwebrtcechoprobe.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwebrtcdsp_la-gstwebrtcechoprobe.Tpo $(DEPDIR)/libgstwebrtcdsp_la-gstwebrtcechoprobe.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gstwebrtcechoprobe.cpp' object='libgstwebrtcdsp_la-gstwebrtcechoprobe.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) -c -o gtkvideooverlay-main.obj `if test -f 'main.cpp'; then $(CYGPATH_W) 'main.cpp'; else $(CYGPATH_W) '$(srcdir)/main.cpp'; fi`
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwebrtcdsp_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstwebrtcdsp_la-gstwebrtcechoprobe.lo `test -f 'gstwebrtcechoprobe.cpp' || echo '$(srcdir)/'`gstwebrtcechoprobe.cpp
mostlyclean-libtool:
-rm -f *.lo
@@ -941,8 +1016,11 @@
done
check-am: all-am
check: check-am
-all-am: Makefile $(PROGRAMS)
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
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
@@ -975,7 +1053,7 @@
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
-clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \
mostlyclean-am
distclean: distclean-am
@@ -996,7 +1074,7 @@
info-am:
-install-data-am:
+install-data-am: install-pluginLTLIBRARIES
install-dvi: install-dvi-am
@@ -1042,23 +1120,24 @@
ps-am:
-uninstall-am:
+uninstall-am: uninstall-pluginLTLIBRARIES
.MAKE: install-am install-strip
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
- clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \
+ 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 \
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-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
+ 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
.PRECIOUS: Makefile
diff --git a/ext/webrtcdsp/gstwebrtcdsp.cpp b/ext/webrtcdsp/gstwebrtcdsp.cpp
new file mode 100644
index 0000000..b6b8660
--- /dev/null
+++ b/ext/webrtcdsp/gstwebrtcdsp.cpp
@@ -0,0 +1,811 @@
+/*
+ * WebRTC Audio Processing Elements
+ *
+ * Copyright 2016 Collabora Ltd
+ * @author: Nicolas Dufresne <nicolas.dufresne@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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+/**
+ * SECTION:element-webrtcdsp
+ * @short_description: Audio Filter using WebRTC Audio Processing library
+ *
+ * A voice enhancement filter based on WebRTC Audio Processing library. This
+ * library provides a whide variety of enhancement algorithms. This element
+ * tries to enable as much as possible. The currently enabled enhancements are
+ * High Pass Filter, Echo Canceller, Noise Suppression, Automatic Gain Control,
+ * and some extended filters.
+ *
+ * While webrtcdsp element can be used alone, there is an exception for the
+ * echo canceller. The audio canceller need to be aware of the far end streams
+ * that are played to loud speakers. For this, you must place a webrtcechoprobe
+ * element at that far end. Note that the sample rate must match between
+ * webrtcdsp and the webrtechoprobe. Though, the number of channels can differ.
+ * The probe is found by the DSP element using it's object name. By default,
+ * webrtcdsp looks for webrtcechoprobe0, which means it just work if you have
+ * a single probe and DSP.
+ *
+ * The probe can only be used within the same top level GstPipeline.
+ * Additonally, to simplify the code, the probe element must be created
+ * before the DSP sink pad is activated. It does not need to be in any
+ * particular state and does not even need to be added to the pipeline yet.
+ *
+ * # Example launch line
+ *
+ * As a conveniance, the echo canceller can be tested using an echo loop. In
+ * this configuration, one would expect a single echo to be heard.
+ *
+ * |[
+ * gst-launch-1.0 pulsesrc ! webrtcdsp ! webrtcechoprobe ! pulsesink
+ * ]|
+ *
+ * In real environment, you'll place the probe before the playback, but only
+ * process the far end streams. The DSP should be placed as close as possible
+ * to the audio capture. The following pipeline is astracted and does not
+ * represent a real pipeline.
+ *
+ * |[
+ * gst-launch-1.0 far-end-src ! audio/x-raw,rate=48000 ! webrtcechoprobe ! pulsesink \
+ * pulsesrc ! audio/x-raw,rate=48000 ! webrtcdsp ! far-end-sink
+ * ]|
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstwebrtcdsp.h"
+#include "gstwebrtcechoprobe.h"
+
+#include <webrtc/modules/audio_processing/include/audio_processing.h>
+#include <webrtc/modules/interface/module_common_types.h>
+#include <webrtc/system_wrappers/include/trace.h>
+
+GST_DEBUG_CATEGORY (webrtc_dsp_debug);
+#define GST_CAT_DEFAULT (webrtc_dsp_debug)
+
+static GstStaticPadTemplate gst_webrtc_dsp_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, "
+ "rate = (int) { 48000, 32000, 16000, 8000 }, "
+ "channels = (int) [1, MAX]")
+ );
+
+static GstStaticPadTemplate gst_webrtc_dsp_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-raw, "
+ "format = (string) " GST_AUDIO_NE (S16) ", "
+ "layout = (string) interleaved, "
+ "rate = (int) { 48000, 32000, 16000, 8000 }, "
+ "channels = (int) [1, MAX]")
+ );
+
+typedef webrtc::EchoCancellation::SuppressionLevel GstWebrtcEchoSuppressionLevel;
+#define GST_TYPE_WEBRTC_ECHO_SUPPRESSION_LEVEL \
+ (gst_webrtc_echo_suppression_level_get_type ())
+static GType
+gst_webrtc_echo_suppression_level_get_type (void)
+{
+ static GType suppression_level_type = 0;
+ static const GEnumValue level_types[] = {
+ {webrtc::EchoCancellation::kLowSuppression, "Low Suppression", "low"},
+ {webrtc::EchoCancellation::kModerateSuppression,
+ "Moderate Suppression", "moderate"},
+ {webrtc::EchoCancellation::kHighSuppression, "high Suppression", "high"},
+ {0, NULL, NULL}
+ };
+
+ if (!suppression_level_type) {
+ suppression_level_type =
+ g_enum_register_static ("GstWebrtcEchoSuppressionLevel", level_types);
+ }
+ return suppression_level_type;
+}
+
+typedef webrtc::NoiseSuppression::Level GstWebrtcNoiseSuppressionLevel;
+#define GST_TYPE_WEBRTC_NOISE_SUPPRESSION_LEVEL \
+ (gst_webrtc_noise_suppression_level_get_type ())
+static GType
+gst_webrtc_noise_suppression_level_get_type (void)
+{
+ static GType suppression_level_type = 0;
+ static const GEnumValue level_types[] = {
+ {webrtc::NoiseSuppression::kLow, "Low Suppression", "low"},
+ {webrtc::NoiseSuppression::kModerate, "Moderate Suppression", "moderate"},
+ {webrtc::NoiseSuppression::kHigh, "High Suppression", "high"},
+ {webrtc::NoiseSuppression::kVeryHigh, "Very High Suppression",
+ "very-high"},
+ {0, NULL, NULL}
+ };
+
+ if (!suppression_level_type) {
+ suppression_level_type =
+ g_enum_register_static ("GstWebrtcNoiseSuppressionLevel", level_types);
+ }
+ return suppression_level_type;
+}
+
+enum
+{
+ PROP_0,
+ PROP_PROBE,
+ PROP_HIGH_PASS_FILTER,
+ PROP_ECHO_CANCEL,
+ PROP_ECHO_SUPPRESSION_LEVEL,
+ PROP_NOISE_SUPPRESSION,
+ PROP_NOISE_SUPPRESSION_LEVEL,
+ PROP_GAIN_CONTROL,
+ PROP_EXPERIMENTAL_AGC,
+ PROP_EXTENDED_FILTER,
+ PROP_DELAY_AGNOSTIC
+};
+
+/**
+ * GstWebrtcDSP:
+ *
+ * The adder object structure.
+ */
+struct _GstWebrtcDsp
+{
+ GstAudioFilter element;
+
+ /* Protected by the object lock */
+ GstAudioInfo info;
+ guint period_size;
+
+ /* Protected by the stream lock */
+ GstAdapter *adapter;
+ webrtc::AudioProcessing * apm;
+
+ /* Protected by the object lock */
+ gchar *probe_name;
+ GstWebrtcEchoProbe *probe;
+
+ /* Properties */
+ gboolean high_pass_filter;
+ gboolean echo_cancel;
+ webrtc::EchoCancellation::SuppressionLevel echo_suppression_level;
+ gboolean noise_suppression;
+ webrtc::NoiseSuppression::Level noise_suppression_level;
+ gboolean gain_control;
+ gboolean experimental_agc;
+ gboolean extended_filter;
+ gboolean delay_agnostic;
+};
+
+G_DEFINE_TYPE (GstWebrtcDsp, gst_webrtc_dsp, GST_TYPE_AUDIO_FILTER);
+
+static const gchar *
+webrtc_error_to_string (gint err)
+{
+ const gchar *str = "unkown error";
+
+ switch (err) {
+ case webrtc::AudioProcessing::kNoError:
+ str = "success";
+ break;
+ case webrtc::AudioProcessing::kUnspecifiedError:
+ str = "unspecified error";
+ break;
+ case webrtc::AudioProcessing::kCreationFailedError:
+ str = "creating failed";
+ break;
+ case webrtc::AudioProcessing::kUnsupportedComponentError:
+ str = "unsupported component";
+ break;
+ case webrtc::AudioProcessing::kUnsupportedFunctionError:
+ str = "unsupported function";
+ break;
+ case webrtc::AudioProcessing::kNullPointerError:
+ str = "null pointer";
+ break;
+ case webrtc::AudioProcessing::kBadParameterError:
+ str = "bad parameter";
+ break;
+ case webrtc::AudioProcessing::kBadSampleRateError:
+ str = "bad sample rate";
+ break;
+ case webrtc::AudioProcessing::kBadDataLengthError:
+ str = "bad data length";
+ break;
+ case webrtc::AudioProcessing::kBadNumberChannelsError:
+ str = "bad number of channels";
+ break;
+ case webrtc::AudioProcessing::kFileError:
+ str = "file IO error";
+ break;
+ case webrtc::AudioProcessing::kStreamParameterNotSetError:
+ str = "stream parameter not set";
+ break;
+ case webrtc::AudioProcessing::kNotEnabledError:
+ str = "not enabled";
+ break;
+ default:
+ break;
+ }
+
+ return str;
+}
+
+static GstBuffer *
+gst_webrtc_dsp_take_buffer (GstWebrtcDsp * self)
+{
+ GstBuffer *buffer;
+ GstClockTime timestamp;
+ guint64 distance;
+
+ timestamp = gst_adapter_prev_pts (self->adapter, &distance);
+ timestamp += gst_util_uint64_scale_int (distance / self->info.bpf,
+ GST_SECOND, self->info.rate);
+
+ buffer = gst_adapter_take_buffer (self->adapter, self->period_size);
+
+ GST_BUFFER_PTS (buffer) = timestamp;
+ GST_BUFFER_DURATION (buffer) = 10 * GST_MSECOND;
+
+ if (gst_adapter_pts_at_discont (self->adapter) == timestamp && distance == 0) {
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT);
+ } else
+ GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_DISCONT);
+
+ return buffer;
+}
+
+static GstFlowReturn
+gst_webrtc_dsp_analyze_reverse_stream (GstWebrtcDsp * self,
+ GstClockTime rec_time)
+{
+ GstWebrtcEchoProbe *probe = NULL;
+ webrtc::AudioProcessing * apm;
+ webrtc::AudioFrame frame;
+ GstFlowReturn ret = GST_FLOW_OK;
+ gint err, delay;
+
+ GST_OBJECT_LOCK (self);
+ if (self->echo_cancel)
+ probe = GST_WEBRTC_ECHO_PROBE (g_object_ref (self->probe));
+ GST_OBJECT_UNLOCK (self);
+
+ /* If echo cancellation is disabled */
+ if (!probe)
+ return GST_FLOW_OK;
+
+ apm = self->apm;
+
+ if (self->delay_agnostic)
+ rec_time = GST_CLOCK_TIME_NONE;
+
+again:
+ delay = gst_webrtc_echo_probe_read (probe, rec_time, (gpointer) &frame);
+ apm->set_stream_delay_ms (delay);
+
+ if (delay < 0)
+ goto done;
+
+ if (frame.sample_rate_hz_ != self->info.rate) {
+ GST_ELEMENT_ERROR (self, STREAM, FORMAT,
+ ("Echo Probe has rate %i , while the DSP is running at rate %i,"
+ " use a caps filter to ensure those are the same.",
+ frame.sample_rate_hz_, self->info.rate), (NULL));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+
+ if ((err = apm->AnalyzeReverseStream (&frame)) < 0)
+ GST_WARNING_OBJECT (self, "Reverse stream analyses failed: %s.",
+ webrtc_error_to_string (err));
+
+ if (self->delay_agnostic)
+ goto again;
+
+done:
+ gst_object_unref (probe);
+
+ return ret;
+}
+
+static GstFlowReturn
+gst_webrtc_dsp_process_stream (GstWebrtcDsp * self,
+ GstBuffer * buffer)
+{
+ GstMapInfo info;
+ webrtc::AudioProcessing * apm = self->apm;
+ webrtc::AudioFrame frame;
+ gint err;
+
+ frame.num_channels_ = self->info.channels;
+ frame.sample_rate_hz_ = self->info.rate;
+ frame.samples_per_channel_ = self->period_size / self->info.bpf;
+
+ if (!gst_buffer_map (buffer, &info, (GstMapFlags) GST_MAP_READWRITE)) {
+ gst_buffer_unref (buffer);
+ return GST_FLOW_ERROR;
+ }
+
+ memcpy (frame.data_, info.data, self->period_size);
+
+ if ((err = apm->ProcessStream (&frame)) < 0) {
+ GST_WARNING_OBJECT (self, "Failed to filter the audio: %s.",
+ webrtc_error_to_string (err));
+ } else {
+ memcpy (info.data, frame.data_, self->period_size);
+ }
+
+ gst_buffer_unmap (buffer, &info);
+
+ return GST_FLOW_OK;
+}
+
+static GstFlowReturn
+gst_webrtc_dsp_submit_input_buffer (GstBaseTransform * btrans,
+ gboolean is_discont, GstBuffer * buffer)
+{
+ GstWebrtcDsp *self = GST_WEBRTC_DSP (btrans);
+
+ buffer = gst_buffer_make_writable (buffer);
+ GST_BUFFER_PTS (buffer) = gst_segment_to_running_time (&btrans->segment,
+ GST_FORMAT_TIME, GST_BUFFER_PTS (buffer));
+
+ if (is_discont) {
+ GST_DEBUG_OBJECT (self,
+ "Received discont, clearing adapter.");
+ gst_adapter_clear (self->adapter);
+ }
+
+ gst_adapter_push (self->adapter, buffer);
+
+ return GST_FLOW_OK;
+}
+
+static GstFlowReturn
+gst_webrtc_dsp_generate_output (GstBaseTransform * btrans, GstBuffer ** outbuf)
+{
+ GstWebrtcDsp *self = GST_WEBRTC_DSP (btrans);
+ GstFlowReturn ret;
+
+ if (gst_adapter_available (self->adapter) < self->period_size) {
+ *outbuf = NULL;
+ return GST_FLOW_OK;
+ }
+
+ *outbuf = gst_webrtc_dsp_take_buffer (self);
+ ret = gst_webrtc_dsp_analyze_reverse_stream (self, GST_BUFFER_PTS (*outbuf));
+
+ if (ret == GST_FLOW_OK)
+ ret = gst_webrtc_dsp_process_stream (self, *outbuf);
+
+ return ret;
+}
+
+static gboolean
+gst_webrtc_dsp_start (GstBaseTransform * btrans)
+{
+ GstWebrtcDsp *self = GST_WEBRTC_DSP (btrans);
+ webrtc::Config config;
+
+ GST_OBJECT_LOCK (self);
+
+ config.Set < webrtc::ExtendedFilter >
+ (new webrtc::ExtendedFilter (self->extended_filter));
+ config.Set < webrtc::ExperimentalAgc >
+ (new webrtc::ExperimentalAgc (self->experimental_agc));
+ config.Set < webrtc::DelayAgnostic >
+ (new webrtc::DelayAgnostic (self->delay_agnostic));
+
+ /* TODO Intelligibility enhancer, Beamforming, etc. */
+
+ self->apm = webrtc::AudioProcessing::Create (config);
+
+ if (self->echo_cancel) {
+ self->probe = gst_webrtc_acquire_echo_probe (self->probe_name);
+
+ if (self->probe == NULL) {
+ GST_OBJECT_UNLOCK (self);
+ GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND,
+ ("No echo probe with name %s found.", self->probe_name), (NULL));
+ return FALSE;
+ }
+ }
+
+ GST_OBJECT_UNLOCK (self);
+
+ return TRUE;
+}
+
+static gboolean
+gst_webrtc_dsp_setup (GstAudioFilter * filter, const GstAudioInfo * info)
+{
+ GstWebrtcDsp *self = GST_WEBRTC_DSP (filter);
+ webrtc::AudioProcessing * apm;
+ webrtc::ProcessingConfig pconfig;
+ GstAudioInfo probe_info = *info;
+ gint err = 0;
+
+ GST_LOG_OBJECT (self, "setting format to %s with %i Hz and %i channels",
+ info->finfo->description, info->rate, info->channels);
+
+ GST_OBJECT_LOCK (self);
+
+ gst_adapter_clear (self->adapter);
+ self->info = *info;
+ apm = self->apm;
+
+ /* WebRTC library works with 10ms buffers, compute once this size */
+ self->period_size = info->bpf * info->rate / 100;
+
+ if ((webrtc::AudioFrame::kMaxDataSizeSamples * 2) < self->period_size)
+ goto period_too_big;
+
+ if (self->probe) {
+ GST_WEBRTC_ECHO_PROBE_LOCK (self->probe);
+
+ if (self->probe->info.rate != 0) {
+ if (self->probe->info.rate != info->rate)
+ goto probe_has_wrong_rate;
+ probe_info = self->probe->info;
+ }
+
+ GST_WEBRTC_ECHO_PROBE_UNLOCK (self->probe);
+ }
+
+ /* input stream */
+ pconfig.streams[webrtc::ProcessingConfig::kInputStream] =
+ webrtc::StreamConfig (info->rate, info->channels, false);
+ /* output stream */
+ pconfig.streams[webrtc::ProcessingConfig::kOutputStream] =
+ webrtc::StreamConfig (info->rate, info->channels, false);
+ /* reverse input stream */
+ pconfig.streams[webrtc::ProcessingConfig::kReverseInputStream] =
+ webrtc::StreamConfig (probe_info.rate, probe_info.channels, false);
+ /* reverse output stream */
+ pconfig.streams[webrtc::ProcessingConfig::kReverseOutputStream] =
+ webrtc::StreamConfig (probe_info.rate, probe_info.channels, false);
+
+ if ((err = apm->Initialize (pconfig)) < 0)
+ goto initialize_failed;
+
+ /* Setup Filters */
+ if (self->high_pass_filter) {
+ GST_DEBUG_OBJECT (self, "Enabling High Pass filter");
+ apm->high_pass_filter ()->Enable (true);
+ }
+
+ if (self->echo_cancel) {
+ GST_DEBUG_OBJECT (self, "Enabling Echo Cancellation");
+ apm->echo_cancellation ()->enable_drift_compensation (false);
+ apm->echo_cancellation ()
+ ->set_suppression_level (self->echo_suppression_level);
+ apm->echo_cancellation ()->Enable (true);
+ }
+
+ if (self->noise_suppression) {
+ GST_DEBUG_OBJECT (self, "Enabling Noise Suppression");
+ apm->noise_suppression ()->set_level (self->noise_suppression_level);
+ apm->noise_suppression ()->Enable (true);
+ }
+
+ if (self->gain_control) {
+ GST_DEBUG_OBJECT (self, "Enabling Digital Gain Control");
+ apm->gain_control ()->set_mode (webrtc::GainControl::kAdaptiveDigital);
+ apm->gain_control ()->Enable (true);
+ }
+
+ GST_OBJECT_UNLOCK (self);
+
+ return TRUE;
+
+period_too_big:
+ GST_OBJECT_UNLOCK (self);
+ GST_WARNING_OBJECT (self, "webrtcdsp format produce too big period "
+ "(maximum is %" G_GSIZE_FORMAT " samples and we have %u samples), "
+ "reduce the number of channels or the rate.",
+ webrtc::AudioFrame::kMaxDataSizeSamples, self->period_size / 2);
+ return FALSE;
+
+probe_has_wrong_rate:
+ GST_WEBRTC_ECHO_PROBE_UNLOCK (self->probe);
+ GST_OBJECT_UNLOCK (self);
+ GST_ELEMENT_ERROR (self, STREAM, FORMAT,
+ ("Echo Probe has rate %i , while the DSP is running at rate %i,"
+ " use a caps filter to ensure those are the same.",
+ probe_info.rate, info->rate), (NULL));
+ return FALSE;
+
+initialize_failed:
+ GST_OBJECT_UNLOCK (self);
+ GST_ELEMENT_ERROR (self, LIBRARY, INIT,
+ ("Failed to initialize WebRTC Audio Processing library"),
+ ("webrtc::AudioProcessing::Initialize() failed: %s",
+ webrtc_error_to_string (err)));
+ return FALSE;
+}
+
+static gboolean
+gst_webrtc_dsp_stop (GstBaseTransform * btrans)
+{
+ GstWebrtcDsp *self = GST_WEBRTC_DSP (btrans);
+
+ GST_OBJECT_LOCK (self);
+
+ gst_adapter_clear (self->adapter);
+
+ if (self->probe) {
+ gst_webrtc_release_echo_probe (self->probe);
+ self->probe = NULL;
+ }
+
+ delete self->apm;
+ self->apm = NULL;
+
+ GST_OBJECT_UNLOCK (self);
+
+ return TRUE;
+}
+
+static void
+gst_webrtc_dsp_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec)
+{
+ GstWebrtcDsp *self = GST_WEBRTC_DSP (object);
+
+ GST_OBJECT_LOCK (self);
+ switch (prop_id) {
+ case PROP_PROBE:
+ g_free (self->probe_name);
+ self->probe_name = g_value_dup_string (value);
+ break;
+ case PROP_HIGH_PASS_FILTER:
+ self->high_pass_filter = g_value_get_boolean (value);
+ break;
+ case PROP_ECHO_CANCEL:
+ self->echo_cancel = g_value_get_boolean (value);
+ break;
+ case PROP_ECHO_SUPPRESSION_LEVEL:
+ self->echo_suppression_level =
+ (GstWebrtcEchoSuppressionLevel) g_value_get_enum (value);
+ break;
+ case PROP_NOISE_SUPPRESSION:
+ self->noise_suppression = g_value_get_boolean (value);
+ break;
+ case PROP_NOISE_SUPPRESSION_LEVEL:
+ self->noise_suppression_level =
+ (GstWebrtcNoiseSuppressionLevel) g_value_get_enum (value);
+ break;
+ case PROP_GAIN_CONTROL:
+ self->gain_control = g_value_get_boolean (value);
+ break;
+ case PROP_EXPERIMENTAL_AGC:
+ self->experimental_agc = g_value_get_boolean (value);
+ break;
+ case PROP_EXTENDED_FILTER:
+ self->extended_filter = g_value_get_boolean (value);
+ break;
+ case PROP_DELAY_AGNOSTIC:
+ self->delay_agnostic = g_value_get_boolean (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ GST_OBJECT_UNLOCK (self);
+}
+
+static void
+gst_webrtc_dsp_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec)
+{
+ GstWebrtcDsp *self = GST_WEBRTC_DSP (object);
+
+ GST_OBJECT_LOCK (self);
+ switch (prop_id) {
+ case PROP_PROBE:
+ g_value_set_string (value, self->probe_name);
+ break;
+ case PROP_HIGH_PASS_FILTER:
+ g_value_set_boolean (value, self->high_pass_filter);
+ break;
+ case PROP_ECHO_CANCEL:
+ g_value_set_boolean (value, self->echo_cancel);
+ break;
+ case PROP_ECHO_SUPPRESSION_LEVEL:
+ g_value_set_enum (value, self->echo_suppression_level);
+ break;
+ case PROP_NOISE_SUPPRESSION:
+ g_value_set_boolean (value, self->noise_suppression);
+ break;
+ case PROP_NOISE_SUPPRESSION_LEVEL:
+ g_value_set_enum (value, self->noise_suppression_level);
+ break;
+ case PROP_GAIN_CONTROL:
+ g_value_set_boolean (value, self->gain_control);
+ break;
+ case PROP_EXPERIMENTAL_AGC:
+ g_value_set_boolean (value, self->experimental_agc);
+ break;
+ case PROP_EXTENDED_FILTER:
+ g_value_set_boolean (value, self->extended_filter);
+ break;
+ case PROP_DELAY_AGNOSTIC:
+ g_value_set_boolean (value, self->delay_agnostic);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ GST_OBJECT_UNLOCK (self);
+}
+
+
+static void
+gst_webrtc_dsp_finalize (GObject * object)
+{
+ GstWebrtcDsp *self = GST_WEBRTC_DSP (object);
+
+ gst_object_unref (self->adapter);
+ g_free (self->probe_name);
+
+ G_OBJECT_CLASS (gst_webrtc_dsp_parent_class)->finalize (object);
+}
+
+static void
+gst_webrtc_dsp_init (GstWebrtcDsp * self)
+{
+ self->adapter = gst_adapter_new ();
+ gst_audio_info_init (&self->info);
+}
+
+static void
+gst_webrtc_dsp_class_init (GstWebrtcDspClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ GstBaseTransformClass *btrans_class = GST_BASE_TRANSFORM_CLASS (klass);
+ GstAudioFilterClass *audiofilter_class = GST_AUDIO_FILTER_CLASS (klass);
+
+ gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_webrtc_dsp_finalize);
+ gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_webrtc_dsp_set_property);
+ gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_webrtc_dsp_get_property);
+
+ btrans_class->passthrough_on_same_caps = FALSE;
+ btrans_class->start = GST_DEBUG_FUNCPTR (gst_webrtc_dsp_start);
+ btrans_class->stop = GST_DEBUG_FUNCPTR (gst_webrtc_dsp_stop);
+ btrans_class->submit_input_buffer =
+ GST_DEBUG_FUNCPTR (gst_webrtc_dsp_submit_input_buffer);
+ btrans_class->generate_output =
+ GST_DEBUG_FUNCPTR (gst_webrtc_dsp_generate_output);
+
+ audiofilter_class->setup = GST_DEBUG_FUNCPTR (gst_webrtc_dsp_setup);
+
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_webrtc_dsp_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_webrtc_dsp_sink_template);
+ gst_element_class_set_static_metadata (element_class,
+ "Voice Processor (AGC, AEC, filters, etc.)",
+ "Generic/Audio",
+ "Pre-processes voice with WebRTC Audio Processing Library",
+ "Nicolas Dufresne <nicolas.dufresne@collabora.com>");
+
+ g_object_class_install_property (gobject_class,
+ PROP_PROBE,
+ g_param_spec_string ("probe", "Echo Probe",
+ "The name of the webrtcechoprobe element that record the audio being "
+ "played through loud speakers. Must be set before PAUSED state.",
+ "webrtcechoprobe0",
+ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+ G_PARAM_CONSTRUCT)));
+
+ g_object_class_install_property (gobject_class,
+ PROP_HIGH_PASS_FILTER,
+ g_param_spec_boolean ("high-pass-filter", "High Pass Filter",
+ "Enable or disable high pass filtering", TRUE,
+ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+ G_PARAM_CONSTRUCT)));
+
+ g_object_class_install_property (gobject_class,
+ PROP_ECHO_CANCEL,
+ g_param_spec_boolean ("echo-cancel", "Echo Cancel",
+ "Enable or disable echo canceller, note that it will be disabled if "
+ "no webrtcechoprobe has been found", TRUE,
+ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+ G_PARAM_CONSTRUCT)));
+
+ g_object_class_install_property (gobject_class,
+ PROP_ECHO_SUPPRESSION_LEVEL,
+ g_param_spec_enum ("echo-suppression-level", "Echo Suppression Level",
+ "Controls the aggressiveness of the suppressor. A higher level "
+ "trades off double-talk performance for increased echo suppression.",
+ GST_TYPE_WEBRTC_ECHO_SUPPRESSION_LEVEL,
+ webrtc::EchoCancellation::kModerateSuppression,
+ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+ G_PARAM_CONSTRUCT)));
+
+ g_object_class_install_property (gobject_class,
+ PROP_NOISE_SUPPRESSION,
+ g_param_spec_boolean ("noise-suppression", "Noise Suppression",
+ "Enable or disable noise suppression", TRUE,
+ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+ G_PARAM_CONSTRUCT)));
+
+ g_object_class_install_property (gobject_class,
+ PROP_NOISE_SUPPRESSION_LEVEL,
+ g_param_spec_enum ("noise-suppression-level", "Noise Suppression Level",
+ "Controls the aggressiveness of the suppression. Increasing the "
+ "level will reduce the noise level at the expense of a higher "
+ "speech distortion.", GST_TYPE_WEBRTC_NOISE_SUPPRESSION_LEVEL,
+ webrtc::EchoCancellation::kModerateSuppression,
+ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+ G_PARAM_CONSTRUCT)));
+
+ g_object_class_install_property (gobject_class,
+ PROP_GAIN_CONTROL,
+ g_param_spec_boolean ("gain-control", "Gain Control",
+ "Enable or disable automatic digital gain control",
+ TRUE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+ G_PARAM_CONSTRUCT)));
+
+ g_object_class_install_property (gobject_class,
+ PROP_EXPERIMENTAL_AGC,
+ g_param_spec_boolean ("experimental-agc", "Experimental AGC",
+ "Enable or disable experimental automatic gain control.",
+ FALSE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+ G_PARAM_CONSTRUCT)));
+
+ g_object_class_install_property (gobject_class,
+ PROP_EXTENDED_FILTER,
+ g_param_spec_boolean ("extended-filter", "Extended Filter",
+ "Enable or disable the extended filter.",
+ TRUE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+ G_PARAM_CONSTRUCT)));
+
+ g_object_class_install_property (gobject_class,
+ PROP_DELAY_AGNOSTIC,
+ g_param_spec_boolean ("delay-agnostic", "Delay Agnostic",
+ "Enable or disable the delay agnostic mode.",
+ FALSE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+ G_PARAM_CONSTRUCT)));
+}
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ GST_DEBUG_CATEGORY_INIT
+ (webrtc_dsp_debug, "webrtcdsp", 0, "libwebrtcdsp wrapping elements");
+
+ if (!gst_element_register (plugin, "webrtcdsp", GST_RANK_NONE,
+ GST_TYPE_WEBRTC_DSP)) {
+ return FALSE;
+ }
+ if (!gst_element_register (plugin, "webrtcechoprobe", GST_RANK_NONE,
+ GST_TYPE_WEBRTC_ECHO_PROBE)) {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ webrtcdsp,
+ "Voice pre-processing using WebRTC Audio Processing Library",
+ plugin_init, VERSION, "LGPL", "WebRTCDsp", "http://git.collabora.com")
diff --git a/ext/webrtcdsp/gstwebrtcdsp.h b/ext/webrtcdsp/gstwebrtcdsp.h
new file mode 100644
index 0000000..a2519df
--- /dev/null
+++ b/ext/webrtcdsp/gstwebrtcdsp.h
@@ -0,0 +1,52 @@
+/*
+ * WebRTC Audio Processing Elements
+ *
+ * Copyright 2016 Collabora Ltd
+ * @author: Nicolas Dufresne <nicolas.dufresne@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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __GST_WEBRTC_DSP_H__
+#define __GST_WEBRTC_DSP_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstadapter.h>
+#include <gst/base/gstbasetransform.h>
+#include <gst/audio/audio.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_WEBRTC_DSP (gst_webrtc_dsp_get_type())
+#define GST_WEBRTC_DSP(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WEBRTC_DSP,GstWebrtcDsp))
+#define GST_IS_WEBRTC_DSP(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WEBRTC_DSP))
+#define GST_WEBRTC_DSP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_WEBRTC_DSP,GstWebrtcDspClass))
+#define GST_IS_WEBRTC_DSP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_WEBRTC_DSP))
+#define GST_WEBRTC_DSP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_WEBRTC_DSP,GstWebrtcDspClass))
+
+typedef struct _GstWebrtcDsp GstWebrtcDsp;
+typedef struct _GstWebrtcDspClass GstWebrtcDspClass;
+
+struct _GstWebrtcDspClass
+{
+ GstAudioFilterClass parent_class;
+};
+
+GType gst_webrtc_dsp_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_WEBRTC_DSP_H__ */
diff --git a/ext/webrtcdsp/gstwebrtcechoprobe.cpp b/ext/webrtcdsp/gstwebrtcechoprobe.cpp
new file mode 100644
index 0000000..5b811b6
--- /dev/null
+++ b/ext/webrtcdsp/gstwebrtcechoprobe.cpp
@@ -0,0 +1,351 @@
+/*
+ * WebRTC Audio Processing Elements
+ *
+ * Copyright 2016 Collabora Ltd
+ * @author: Nicolas Dufresne <nicolas.dufresne@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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+/**
+ * SECTION:element-webrtcechoprobe
+ *
+ * This echo probe is to be used with the webrtcdsp element. See #gst-plugins-bad-plugins-webrtcdsp
+ * documentation for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstwebrtcechoprobe.h"
+
+#include <webrtc/modules/interface/module_common_types.h>
+#include <gst/audio/audio.h>
+
+GST_DEBUG_CATEGORY_EXTERN (webrtc_dsp_debug);
+#define GST_CAT_DEFAULT (webrtc_dsp_debug)
+
+#define MAX_ADAPTER_SIZE (1*1024*1024)
+
+static GstStaticPadTemplate gst_webrtc_echo_probe_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, "
+ "rate = (int) { 48000, 32000, 16000, 8000 }, "
+ "channels = (int) [1, MAX]")
+ );
+
+static GstStaticPadTemplate gst_webrtc_echo_probe_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-raw, "
+ "format = (string) " GST_AUDIO_NE (S16) ", "
+ "layout = (string) interleaved, "
+ "rate = (int) { 48000, 32000, 16000, 8000 }, "
+ "channels = (int) [1, MAX]")
+ );
+
+G_LOCK_DEFINE_STATIC (gst_aec_probes);
+static GList *gst_aec_probes = NULL;
+
+G_DEFINE_TYPE (GstWebrtcEchoProbe, gst_webrtc_echo_probe,
+ GST_TYPE_AUDIO_FILTER);
+
+static gboolean
+gst_webrtc_echo_probe_setup (GstAudioFilter * filter, const GstAudioInfo * info)
+{
+ GstWebrtcEchoProbe *self = GST_WEBRTC_ECHO_PROBE (filter);
+
+ GST_LOG_OBJECT (self, "setting format to %s with %i Hz and %i channels",
+ info->finfo->description, info->rate, info->channels);
+
+ GST_WEBRTC_ECHO_PROBE_LOCK (self);
+
+ self->info = *info;
+
+ /* WebRTC library works with 10ms buffers, compute once this size */
+ self->period_size = info->bpf * info->rate / 100;
+
+ if ((webrtc::AudioFrame::kMaxDataSizeSamples * 2) < self->period_size)
+ goto period_too_big;
+
+ GST_WEBRTC_ECHO_PROBE_UNLOCK (self);
+
+ return TRUE;
+
+period_too_big:
+ GST_WEBRTC_ECHO_PROBE_UNLOCK (self);
+ GST_WARNING_OBJECT (self, "webrtcdsp format produce too big period "
+ "(maximum is %" G_GSIZE_FORMAT " samples and we have %u samples), "
+ "reduce the number of channels or the rate.",
+ webrtc::AudioFrame::kMaxDataSizeSamples, self->period_size / 2);
+ return FALSE;
+}
+
+static gboolean
+gst_webrtc_echo_probe_stop (GstBaseTransform * btrans)
+{
+ GstWebrtcEchoProbe *self = GST_WEBRTC_ECHO_PROBE (btrans);
+
+ GST_WEBRTC_ECHO_PROBE_LOCK (self);
+ gst_adapter_clear (self->adapter);
+ GST_WEBRTC_ECHO_PROBE_UNLOCK (self);
+
+ return TRUE;
+}
+
+static gboolean
+gst_webrtc_echo_probe_src_event (GstBaseTransform * btrans, GstEvent * event)
+{
+ GstBaseTransformClass *klass;
+ GstWebrtcEchoProbe *self = GST_WEBRTC_ECHO_PROBE (btrans);
+ GstClockTime latency;
+ GstClockTime upstream_latency = 0;
+ GstQuery *query;
+
+ klass = GST_BASE_TRANSFORM_CLASS (gst_webrtc_echo_probe_parent_class);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_LATENCY:
+ gst_event_parse_latency (event, &latency);
+ query = gst_query_new_latency ();
+
+ if (gst_pad_query (btrans->srcpad, query)) {
+ gst_query_parse_latency (query, NULL, &upstream_latency, NULL);
+
+ if (!GST_CLOCK_TIME_IS_VALID (upstream_latency))
+ upstream_latency = 0;
+ }
+
+ GST_WEBRTC_ECHO_PROBE_LOCK (self);
+ self->latency = latency;
+ self->delay = upstream_latency / GST_MSECOND;
+ GST_WEBRTC_ECHO_PROBE_UNLOCK (self);
+
+ GST_DEBUG_OBJECT (self, "We have a latency of %" GST_TIME_FORMAT
+ " and delay of %ims", GST_TIME_ARGS (latency),
+ (gint) (upstream_latency / GST_MSECOND));
+ break;
+ default:
+ break;
+ }
+
+ return klass->src_event (btrans, event);
+}
+
+static GstFlowReturn
+gst_webrtc_echo_probe_transform_ip (GstBaseTransform * btrans,
+ GstBuffer * buffer)
+{
+ GstWebrtcEchoProbe *self = GST_WEBRTC_ECHO_PROBE (btrans);
+ GstBuffer *newbuf = NULL;
+
+ GST_WEBRTC_ECHO_PROBE_LOCK (self);
+ newbuf = gst_buffer_copy (buffer);
+ /* Moves the buffer timestamp to be in Running time */
+ GST_BUFFER_PTS (newbuf) = gst_segment_to_running_time (&btrans->segment,
+ GST_FORMAT_TIME, GST_BUFFER_PTS (buffer));
+ gst_adapter_push (self->adapter, newbuf);
+
+ if (gst_adapter_available (self->adapter) > MAX_ADAPTER_SIZE)
+ gst_adapter_flush (self->adapter,
+ gst_adapter_available (self->adapter) - MAX_ADAPTER_SIZE);
+ GST_WEBRTC_ECHO_PROBE_UNLOCK (self);
+
+ return GST_FLOW_OK;
+}
+
+static void
+gst_webrtc_echo_probe_finalize (GObject * object)
+{
+ GstWebrtcEchoProbe *self = GST_WEBRTC_ECHO_PROBE (object);
+
+ G_LOCK (gst_aec_probes);
+ gst_aec_probes = g_list_remove (gst_aec_probes, self);
+ G_UNLOCK (gst_aec_probes);
+
+ gst_object_unref (self->adapter);
+ self->adapter = NULL;
+
+ G_OBJECT_CLASS (gst_webrtc_echo_probe_parent_class)->finalize (object);
+}
+
+static void
+gst_webrtc_echo_probe_init (GstWebrtcEchoProbe * self)
+{
+ self->adapter = gst_adapter_new ();
+ gst_audio_info_init (&self->info);
+ g_mutex_init (&self->lock);
+
+ self->latency = GST_CLOCK_TIME_NONE;
+
+ G_LOCK (gst_aec_probes);
+ gst_aec_probes = g_list_prepend (gst_aec_probes, self);
+ G_UNLOCK (gst_aec_probes);
+}
+
+static void
+gst_webrtc_echo_probe_class_init (GstWebrtcEchoProbeClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ GstBaseTransformClass *btrans_class = GST_BASE_TRANSFORM_CLASS (klass);
+ GstAudioFilterClass *audiofilter_class = GST_AUDIO_FILTER_CLASS (klass);
+
+ gobject_class->finalize = gst_webrtc_echo_probe_finalize;
+
+ btrans_class->passthrough_on_same_caps = TRUE;
+ btrans_class->src_event = GST_DEBUG_FUNCPTR (gst_webrtc_echo_probe_src_event);
+ btrans_class->transform_ip =
+ GST_DEBUG_FUNCPTR (gst_webrtc_echo_probe_transform_ip);
+ btrans_class->stop = GST_DEBUG_FUNCPTR (gst_webrtc_echo_probe_stop);
+
+ audiofilter_class->setup = GST_DEBUG_FUNCPTR (gst_webrtc_echo_probe_setup);
+
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_webrtc_echo_probe_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_webrtc_echo_probe_sink_template);
+
+ gst_element_class_set_static_metadata (element_class,
+ "Accoustic Echo Canceller probe",
+ "Generic/Audio",
+ "Gathers playback buffers for webrtcdsp",
+ "Nicolas Dufresne <nicolas.dufrsesne@collabora.com>");
+}
+
+
+GstWebrtcEchoProbe *
+gst_webrtc_acquire_echo_probe (const gchar * name)
+{
+ GstWebrtcEchoProbe *ret = NULL;
+ GList *l;
+
+ G_LOCK (gst_aec_probes);
+ for (l = gst_aec_probes; l; l = l->next) {
+ GstWebrtcEchoProbe *probe = GST_WEBRTC_ECHO_PROBE (l->data);
+
+ GST_WEBRTC_ECHO_PROBE_LOCK (probe);
+ if (!probe->acquired && g_strcmp0 (GST_OBJECT_NAME (probe), name) == 0) {
+ probe->acquired = TRUE;
+ ret = GST_WEBRTC_ECHO_PROBE (gst_object_ref (probe));
+ GST_WEBRTC_ECHO_PROBE_UNLOCK (probe);
+ break;
+ }
+ GST_WEBRTC_ECHO_PROBE_UNLOCK (probe);
+ }
+ G_UNLOCK (gst_aec_probes);
+
+ return ret;
+}
+
+void
+gst_webrtc_release_echo_probe (GstWebrtcEchoProbe * probe)
+{
+ GST_WEBRTC_ECHO_PROBE_LOCK (probe);
+ probe->acquired = FALSE;
+ GST_WEBRTC_ECHO_PROBE_UNLOCK (probe);
+ gst_object_unref (probe);
+}
+
+gint
+gst_webrtc_echo_probe_read (GstWebrtcEchoProbe * self, GstClockTime rec_time,
+ gpointer _frame)
+{
+ webrtc::AudioFrame * frame = (webrtc::AudioFrame *) _frame;
+ GstClockTimeDiff diff;
+ gsize avail, skip, offset, size;
+ gint delay = -1;
+
+ GST_WEBRTC_ECHO_PROBE_LOCK (self);
+
+ if (!GST_CLOCK_TIME_IS_VALID (self->latency))
+ goto done;
+
+ /* In delay agnostic mode, just return 10ms of data */
+ if (!GST_CLOCK_TIME_IS_VALID (rec_time)) {
+ avail = gst_adapter_available (self->adapter);
+
+ if (avail < self->period_size)
+ goto done;
+
+ size = self->period_size;
+ skip = 0;
+ offset = 0;
+
+ goto copy;
+ }
+
+ if (gst_adapter_available (self->adapter) == 0) {
+ diff = G_MAXINT64;
+ } else {
+ GstClockTime play_time;
+ guint64 distance;
+
+ play_time = gst_adapter_prev_pts (self->adapter, &distance);
+
+ if (GST_CLOCK_TIME_IS_VALID (play_time)) {
+ play_time += gst_util_uint64_scale_int (distance / self->info.bpf,
+ GST_SECOND, self->info.rate);
+ play_time += self->latency;
+
+ diff = GST_CLOCK_DIFF (rec_time, play_time) / GST_MSECOND;
+ } else {
+ /* We have no timestamp, assume perfect delay */
+ diff = self->delay;
+ }
+ }
+
+ avail = gst_adapter_available (self->adapter);
+
+ if (diff > self->delay) {
+ skip = (diff - self->delay) * self->info.rate / 1000 * self->info.bpf;
+ skip = MIN (self->period_size, skip);
+ offset = 0;
+ } else {
+ skip = 0;
+ offset = (self->delay - diff) * self->info.rate / 1000 * self->info.bpf;
+ offset = MIN (avail, offset);
+ }
+
+ size = MIN (avail - offset, self->period_size - skip);
+
+ if (size < self->period_size)
+ memset (frame->data_, 0, self->period_size);
+
+copy:
+ if (size) {
+ gst_adapter_copy (self->adapter, (guint8 *) frame->data_ + skip,
+ offset, size);
+ gst_adapter_flush (self->adapter, offset + size);
+ }
+
+ frame->num_channels_ = self->info.channels;
+ frame->sample_rate_hz_ = self->info.rate;
+ frame->samples_per_channel_ = self->period_size / self->info.bpf;
+
+ delay = self->delay;
+
+done:
+ GST_WEBRTC_ECHO_PROBE_UNLOCK (self);
+
+ return delay;
+}
diff --git a/ext/webrtcdsp/gstwebrtcechoprobe.h b/ext/webrtcdsp/gstwebrtcechoprobe.h
new file mode 100644
index 0000000..7c8a240
--- /dev/null
+++ b/ext/webrtcdsp/gstwebrtcechoprobe.h
@@ -0,0 +1,88 @@
+/*
+ * WebRTC Audio Processing Elements
+ *
+ * Copyright 2016 Collabora Ltd
+ * @author: Nicolas Dufresne <nicolas.dufresne@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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __GST_WEBRTC_ECHO_PROBE_H__
+#define __GST_WEBRTC_ECHO_PROBE_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstadapter.h>
+#include <gst/base/gstbasetransform.h>
+#include <gst/audio/audio.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_WEBRTC_ECHO_PROBE (gst_webrtc_echo_probe_get_type())
+#define GST_WEBRTC_ECHO_PROBE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WEBRTC_ECHO_PROBE,GstWebrtcEchoProbe))
+#define GST_IS_WEBRTC_ECHO_PROBE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WEBRTC_ECHO_PROBE))
+#define GST_WEBRTC_ECHO_PROBE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_WEBRTC_ECHO_PROBE,GstWebrtcEchoProbeClass))
+#define GST_IS_WEBRTC_ECHO_PROBE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_WEBRTC_ECHO_PROBE))
+#define GST_WEBRTC_ECHO_PROBE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_WEBRTC_ECHO_PROBE,GstWebrtcEchoProbeClass))
+
+#define GST_WEBRTC_ECHO_PROBE_LOCK(obj) g_mutex_lock (&GST_WEBRTC_ECHO_PROBE (obj)->lock)
+#define GST_WEBRTC_ECHO_PROBE_UNLOCK(obj) g_mutex_unlock (&GST_WEBRTC_ECHO_PROBE (obj)->lock)
+
+typedef struct _GstWebrtcEchoProbe GstWebrtcEchoProbe;
+typedef struct _GstWebrtcEchoProbeClass GstWebrtcEchoProbeClass;
+
+/**
+ * GstWebrtcEchoProbe:
+ *
+ * The adder object structure.
+ */
+struct _GstWebrtcEchoProbe
+{
+ GstAudioFilter parent;
+
+ /* This lock is required as the DSP may need to lock itself using it's
+ * object lock and also lock the probe. The natural order for the DSP is
+ * to lock the DSP and then the echo probe. If we where using the probe
+ * object lock, we'd be racing with GstBin which will lock sink to src,
+ * and may accidently reverse the order. */
+ GMutex lock;
+
+ /* Protected by the lock */
+ GstAudioInfo info;
+ guint period_size;
+ GstClockTime latency;
+ gint delay;
+
+ GstSegment segment;
+ GstAdapter *adapter;
+
+ /* Private */
+ gboolean acquired;
+};
+
+struct _GstWebrtcEchoProbeClass
+{
+ GstAudioFilterClass parent_class;
+};
+
+GType gst_webrtc_echo_probe_get_type (void);
+
+GstWebrtcEchoProbe *gst_webrtc_acquire_echo_probe (const gchar * name);
+void gst_webrtc_release_echo_probe (GstWebrtcEchoProbe * probe);
+gint gst_webrtc_echo_probe_read (GstWebrtcEchoProbe * self,
+ GstClockTime rec_time, gpointer frame);
+
+G_END_DECLS
+#endif /* __GST_WEBRTC_ECHO_PROBE_H__ */
diff --git a/ext/x265/Makefile.in b/ext/x265/Makefile.in
index a4a2314..f55e4fb 100644
--- a/ext/x265/Makefile.in
+++ b/ext/x265/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/x265/gstx265enc.c b/ext/x265/gstx265enc.c
index 99fc522..a2baf56 100644
--- a/ext/x265/gstx265enc.c
+++ b/ext/x265/gstx265enc.c
@@ -403,10 +403,8 @@
"x265enc", "Codec/Encoder/Video", "H265 Encoder",
"Thijs Vermeir <thijs.vermeir@barco.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
}
/* initialize the new element
@@ -661,6 +659,7 @@
encoder->x265param.sourceWidth = info->width;
encoder->x265param.sourceHeight = info->height;
if (info->par_d > 0) {
+ encoder->x265param.vui.aspectRatioIdc = X265_EXTENDED_SAR;
encoder->x265param.vui.sarWidth = info->par_n;
encoder->x265param.vui.sarHeight = info->par_d;
}
diff --git a/ext/xvid/Makefile.in b/ext/xvid/Makefile.in
index 7c86a9f..ed514eb 100644
--- a/ext/xvid/Makefile.in
+++ b/ext/xvid/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/xvid/gstxviddec.c b/ext/xvid/gstxviddec.c
index 7e20ad5..b49cf2f 100644
--- a/ext/xvid/gstxviddec.c
+++ b/ext/xvid/gstxviddec.c
@@ -100,10 +100,8 @@
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
+ gst_element_class_add_static_pad_template (element_class, &src_template);
gst_element_class_set_static_metadata (element_class, "XviD video decoder",
"Codec/Decoder/Video",
diff --git a/ext/xvid/gstxvidenc.c b/ext/xvid/gstxvidenc.c
index c2ecfb8..edf89b7 100644
--- a/ext/xvid/gstxvidenc.c
+++ b/ext/xvid/gstxvidenc.c
@@ -244,10 +244,8 @@
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
+ gst_element_class_add_static_pad_template (element_class, &src_template);
gst_element_class_set_static_metadata (element_class, "XviD video encoder",
"Codec/Encoder/Video",
"XviD encoder based on xvidcore",
diff --git a/ext/zbar/Makefile.in b/ext/zbar/Makefile.in
index 40f9758..33ee46e 100644
--- a/ext/zbar/Makefile.in
+++ b/ext/zbar/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/ext/zbar/gstzbar.c b/ext/zbar/gstzbar.c
index 62fb106..e84f48c 100644
--- a/ext/zbar/gstzbar.c
+++ b/ext/zbar/gstzbar.c
@@ -192,10 +192,10 @@
"Detect bar codes in the video streams",
"Stefan Kost <ensonic@users.sf.net>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_zbar_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_zbar_src_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_zbar_sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_zbar_src_template);
trans_class->start = GST_DEBUG_FUNCPTR (gst_zbar_start);
trans_class->stop = GST_DEBUG_FUNCPTR (gst_zbar_stop);
diff --git a/gst-libs/Makefile.in b/gst-libs/Makefile.in
index e6505b3..433c67f 100644
--- a/gst-libs/Makefile.in
+++ b/gst-libs/Makefile.in
@@ -276,6 +276,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -297,6 +299,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -346,6 +350,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -491,6 +497,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -617,8 +625,6 @@
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@
@@ -661,8 +667,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst-libs/gst/Makefile.in b/gst-libs/gst/Makefile.in
index 77208a1..3fb0167 100644
--- a/gst-libs/gst/Makefile.in
+++ b/gst-libs/gst/Makefile.in
@@ -278,6 +278,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -299,6 +301,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -348,6 +352,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -493,6 +499,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -619,8 +627,6 @@
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@
@@ -663,8 +669,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst-libs/gst/adaptivedemux/Makefile.in b/gst-libs/gst/adaptivedemux/Makefile.in
index 0777736..0a35ee3 100644
--- a/gst-libs/gst/adaptivedemux/Makefile.in
+++ b/gst-libs/gst/adaptivedemux/Makefile.in
@@ -306,6 +306,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -327,6 +329,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -376,6 +380,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -521,6 +527,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -647,8 +655,6 @@
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@
@@ -691,8 +697,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c
index 8e00079..715893c 100644
--- a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c
+++ b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c
@@ -165,10 +165,8 @@
PROP_LAST
};
-enum GstAdaptiveDemuxFlowReturn
-{
- GST_ADAPTIVE_DEMUX_FLOW_SWITCH = GST_FLOW_CUSTOM_SUCCESS_2 + 1
-};
+/* Internal, so not using GST_FLOW_CUSTOM_SUCCESS_N */
+#define GST_ADAPTIVE_DEMUX_FLOW_SWITCH (GST_FLOW_CUSTOM_SUCCESS_2 + 1)
struct _GstAdaptiveDemuxPrivate
{
@@ -209,6 +207,15 @@
GMutex segment_lock;
};
+typedef struct _GstAdaptiveDemuxTimer
+{
+ volatile gint ref_count;
+ GCond *cond;
+ GMutex *mutex;
+ GstClockID clock_id;
+ gboolean fired;
+} GstAdaptiveDemuxTimer;
+
static GstBinClass *parent_class = NULL;
static void gst_adaptive_demux_class_init (GstAdaptiveDemuxClass * klass);
static void gst_adaptive_demux_init (GstAdaptiveDemux * dec,
@@ -272,14 +279,18 @@
stream, GstFlowReturn ret, GError * err);
static GstFlowReturn
gst_adaptive_demux_stream_data_received_default (GstAdaptiveDemux * demux,
- GstAdaptiveDemuxStream * stream);
+ GstAdaptiveDemuxStream * stream, GstBuffer * buffer);
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);
-
+static gboolean
+gst_adaptive_demux_wait_until (GstClock * clock, GCond * cond, GMutex * mutex,
+ GstClockTime end_time);
+static gboolean gst_adaptive_demux_clock_callback (GstClock * clock,
+ GstClockTime time, GstClockID id, gpointer user_data);
/* we can't use G_DEFINE_ABSTRACT_TYPE because we need the klass in the _init
* method to get to the padtemplates */
@@ -408,6 +419,8 @@
GstAdaptiveDemuxClass * klass)
{
GstPadTemplate *pad_template;
+ GstClockType clock_type = GST_CLOCK_TYPE_OTHER;
+ GObjectClass *gobject_class;
GST_DEBUG_OBJECT (demux, "gst_adaptive_demux_init");
@@ -421,6 +434,33 @@
gst_segment_init (&demux->segment, GST_FORMAT_TIME);
+ gst_bin_set_suppressed_flags (GST_BIN_CAST (demux),
+ GST_ELEMENT_FLAG_SOURCE | GST_ELEMENT_FLAG_SINK);
+
+ demux->realtime_clock = gst_system_clock_obtain ();
+ g_assert (demux->realtime_clock != NULL);
+ gobject_class = G_OBJECT_GET_CLASS (demux->realtime_clock);
+ if (g_object_class_find_property (gobject_class, "clock-type")) {
+ g_object_get (demux->realtime_clock, "clock-type", &clock_type, NULL);
+ } else {
+ GST_WARNING_OBJECT (demux,
+ "System clock does not have clock-type property");
+ }
+ if (clock_type == GST_CLOCK_TYPE_REALTIME) {
+ demux->clock_offset = 0;
+ } else {
+ GDateTime *utc_now;
+ GstClockTime rtc_now;
+ GTimeVal gtv;
+
+ utc_now = g_date_time_new_now_utc ();
+ rtc_now = gst_clock_get_time (demux->realtime_clock);
+ g_date_time_to_timeval (utc_now, >v);
+ demux->clock_offset =
+ gtv.tv_sec * G_TIME_SPAN_SECOND + gtv.tv_usec -
+ GST_TIME_AS_USECONDS (rtc_now);
+ g_date_time_unref (utc_now);
+ }
g_rec_mutex_init (&demux->priv->updates_lock);
demux->priv->updates_task =
gst_task_new ((GstTaskFunction) gst_adaptive_demux_updates_loop,
@@ -474,6 +514,10 @@
g_rec_mutex_clear (&demux->priv->manifest_lock);
g_mutex_clear (&demux->priv->api_lock);
g_mutex_clear (&demux->priv->segment_lock);
+ if (demux->realtime_clock) {
+ gst_object_unref (demux->realtime_clock);
+ demux->realtime_clock = NULL;
+ }
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@@ -496,6 +540,7 @@
break;
case GST_STATE_CHANGE_READY_TO_PAUSED:
GST_MANIFEST_LOCK (demux);
+ gst_adaptive_demux_reset (demux);
demux->running = TRUE;
GST_MANIFEST_UNLOCK (demux);
break;
@@ -637,6 +682,9 @@
gst_adaptive_demux_is_live (demux));
gst_adaptive_demux_start_tasks (demux);
if (gst_adaptive_demux_is_live (demux)) {
+ g_mutex_lock (&demux->priv->updates_timed_lock);
+ demux->priv->stop_updates_task = FALSE;
+ g_mutex_unlock (&demux->priv->updates_timed_lock);
/* Task to periodically update the manifest */
gst_task_start (demux->priv->updates_task);
}
@@ -752,6 +800,7 @@
GError *err = NULL;
gchar *debug = NULL;
gchar *new_error = NULL;
+ const GstStructure *details = NULL;
GST_MANIFEST_LOCK (demux);
@@ -772,6 +821,12 @@
err->message = new_error;
}
+ gst_message_parse_error_details (msg, &details);
+ if (details) {
+ gst_structure_get_uint (details, "http-status-code",
+ &stream->last_status_code);
+ }
+
/* error, but ask to retry */
gst_adaptive_demux_stream_fragment_download_finish (stream,
GST_FLOW_CUSTOM_ERROR, err);
@@ -853,7 +908,7 @@
stream->pending_caps = NULL;
}
- stream->discont = FALSE;
+ stream->discont = TRUE;
gst_object_ref (pad);
@@ -1105,7 +1160,6 @@
gst_segment_init (&stream->segment, GST_FORMAT_TIME);
g_cond_init (&stream->fragment_download_cond);
g_mutex_init (&stream->fragment_download_lock);
- stream->adapter = gst_adapter_new ();
demux->next_streams = g_list_append (demux->next_streams, stream);
@@ -1192,11 +1246,14 @@
}
if (stream->src) {
- GST_MANIFEST_UNLOCK (demux);
- gst_element_set_locked_state (stream->src, TRUE);
- gst_element_set_state (stream->src, GST_STATE_NULL);
- gst_bin_remove (GST_BIN_CAST (demux), stream->src);
+ GstElement *src = stream->src;
+
stream->src = NULL;
+
+ GST_MANIFEST_UNLOCK (demux);
+ gst_element_set_locked_state (src, TRUE);
+ gst_element_set_state (src, GST_STATE_NULL);
+ gst_bin_remove (GST_BIN_CAST (demux), src);
GST_MANIFEST_LOCK (demux);
}
@@ -1213,8 +1270,6 @@
g_clear_pointer (&stream->pending_tags, gst_tag_list_unref);
- g_object_unref (stream->adapter);
-
g_free (stream);
}
@@ -1246,232 +1301,256 @@
return klass->seek != NULL;
}
-#define IS_SNAP_SEEK(f) (f & (GST_SEEK_FLAG_SNAP_BEFORE | \
- GST_SEEK_FLAG_SNAP_AFTER | \
- GST_SEEK_FLAG_SNAP_NEAREST))
+#define IS_SNAP_SEEK(f) (f & (GST_SEEK_FLAG_SNAP_BEFORE | \
+ GST_SEEK_FLAG_SNAP_AFTER | \
+ GST_SEEK_FLAG_SNAP_NEAREST | \
+ GST_SEEK_FLAG_TRICKMODE_KEY_UNITS | \
+ GST_SEEK_FLAG_KEY_UNIT))
#define REMOVE_SNAP_FLAGS(f) (f & ~(GST_SEEK_FLAG_SNAP_BEFORE | \
GST_SEEK_FLAG_SNAP_AFTER | \
GST_SEEK_FLAG_SNAP_NEAREST))
static gboolean
+gst_adaptive_demux_handle_seek_event (GstAdaptiveDemux * demux, GstPad * pad,
+ GstEvent * event)
+{
+ GstAdaptiveDemuxClass *demux_class = GST_ADAPTIVE_DEMUX_GET_CLASS (demux);
+ gdouble rate;
+ GstFormat format;
+ GstSeekFlags flags;
+ GstSeekType start_type, stop_type;
+ gint64 start, stop;
+ guint32 seqnum;
+ gboolean update;
+ gboolean ret;
+ GstSegment oldsegment;
+ GstAdaptiveDemuxStream *stream = NULL;
+
+ 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_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;
+ }
+
+ if (gst_adaptive_demux_is_live (demux)) {
+ 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 (!(flags & GST_SEEK_FLAG_ACCURATE)) {
+ /* If the accurate flag is not set, we allow seeking before the start
+ * to map to the start for live cases, since those can return a "moving
+ * target" based on wall time.
+ */
+ if (start < range_start) {
+ guint64 dt = range_start - start;
+ GST_DEBUG_OBJECT (demux,
+ "Non accurate seek before live stream start, offsetting by %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (dt));
+ start = range_start;
+ if (stop != GST_CLOCK_TIME_NONE)
+ stop += dt;
+ }
+ }
+
+ 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;
+ }
+ }
+
+ seqnum = gst_event_get_seqnum (event);
+
+ GST_DEBUG_OBJECT (demux, "seek event, %" GST_PTR_FORMAT, event);
+
+ /* have a backup in case seek fails */
+ gst_segment_copy_into (&demux->segment, &oldsegment);
+
+ if (flags & GST_SEEK_FLAG_FLUSH) {
+ GstEvent *fevent;
+
+ GST_DEBUG_OBJECT (demux, "sending flush start");
+ fevent = gst_event_new_flush_start ();
+ gst_event_set_seqnum (fevent, seqnum);
+ gst_adaptive_demux_push_src_event (demux, fevent);
+
+ gst_adaptive_demux_stop_tasks (demux);
+ } else if ((rate > 0 && start_type != GST_SEEK_TYPE_NONE) ||
+ (rate < 0 && stop_type != GST_SEEK_TYPE_NONE)) {
+
+ gst_adaptive_demux_stop_tasks (demux);
+ }
+
+ GST_ADAPTIVE_DEMUX_SEGMENT_LOCK (demux);
+
+ /*
+ * Handle snap seeks as follows:
+ * 1) do the snap seeking on the stream that received
+ * the event
+ * 2) use the final position on this stream to seek
+ * on the other streams to the same position
+ *
+ * We can't snap at all streams at the same time as
+ * they might end in different positions, so just
+ * use the one that received the event as the 'leading'
+ * one to do the snap seek.
+ */
+ if (IS_SNAP_SEEK (flags) && demux_class->stream_seek && (stream =
+ gst_adaptive_demux_find_stream_for_pad (demux, pad))) {
+ GstClockTime ts;
+ GstSeekFlags stream_seek_flags = flags;
+
+ /* snap-seek on the stream that received the event and then
+ * use the resulting position to seek on all streams */
+
+ if (rate >= 0) {
+ if (start_type != GST_SEEK_TYPE_NONE)
+ ts = start;
+ else {
+ ts = stream->segment.position;
+ start_type = GST_SEEK_TYPE_SET;
+ }
+ } else {
+ if (stop_type != GST_SEEK_TYPE_NONE)
+ ts = stop;
+ else {
+ stop_type = GST_SEEK_TYPE_SET;
+ ts = stream->segment.position;
+ }
+ }
+
+ if (stream) {
+ demux_class->stream_seek (stream, rate >= 0, stream_seek_flags, ts, &ts);
+ }
+
+ /* replace event with a new one without snaping to seek on all streams */
+ gst_event_unref (event);
+ if (rate >= 0) {
+ start = ts;
+ } else {
+ stop = ts;
+ }
+ event =
+ gst_event_new_seek (rate, format, REMOVE_SNAP_FLAGS (flags),
+ start_type, start, stop_type, stop);
+ GST_DEBUG_OBJECT (demux, "Adapted snap seek to %" GST_PTR_FORMAT, event);
+ }
+ stream = NULL;
+
+ gst_segment_do_seek (&demux->segment, rate, format, flags, start_type,
+ start, stop_type, stop, &update);
+
+ /* FIXME - this seems unatural, do_seek() is updating base when we
+ * only want the start/stop position to change, maybe do_seek() needs
+ * some fixing? */
+ if (!(flags & GST_SEEK_FLAG_FLUSH) && ((rate > 0
+ && start_type == GST_SEEK_TYPE_NONE) || (rate < 0
+ && stop_type == GST_SEEK_TYPE_NONE))) {
+ demux->segment.base = oldsegment.base;
+ }
+
+ GST_DEBUG_OBJECT (demux, "Calling subclass seek: %" GST_PTR_FORMAT, event);
+
+ ret = demux_class->seek (demux, event);
+
+ if (!ret) {
+ /* Is there anything else we can do if it fails? */
+ gst_segment_copy_into (&oldsegment, &demux->segment);
+ } else {
+ demux->priv->segment_seqnum = seqnum;
+ }
+ GST_ADAPTIVE_DEMUX_SEGMENT_UNLOCK (demux);
+
+ if (flags & GST_SEEK_FLAG_FLUSH) {
+ GstEvent *fevent;
+
+ GST_DEBUG_OBJECT (demux, "Sending flush stop on all pad");
+ fevent = gst_event_new_flush_stop (TRUE);
+ gst_event_set_seqnum (fevent, seqnum);
+ gst_adaptive_demux_push_src_event (demux, fevent);
+ }
+
+ if (demux->next_streams) {
+ gst_adaptive_demux_expose_streams (demux, FALSE);
+ } else {
+ GList *iter;
+ GstClockTime period_start =
+ gst_adaptive_demux_get_period_start_time (demux);
+
+ GST_ADAPTIVE_DEMUX_SEGMENT_LOCK (demux);
+ for (iter = demux->streams; iter; iter = g_list_next (iter)) {
+ GstAdaptiveDemuxStream *stream = iter->data;
+ GstEvent *seg_evt;
+ GstClockTime offset;
+
+ /* See comments in gst_adaptive_demux_get_period_start_time() for
+ * an explanation of the segment modifications */
+ stream->segment = demux->segment;
+ offset =
+ gst_adaptive_demux_stream_get_presentation_offset (demux, stream);
+ stream->segment.start += offset - period_start;
+ if (demux->segment.rate > 0 && start_type != GST_SEEK_TYPE_NONE)
+ stream->segment.position = stream->segment.start;
+ else if (demux->segment.rate < 0 && stop_type != GST_SEEK_TYPE_NONE)
+ stream->segment.position = stream->segment.stop;
+ seg_evt = gst_event_new_segment (&stream->segment);
+ gst_event_set_seqnum (seg_evt, demux->priv->segment_seqnum);
+ gst_event_replace (&stream->pending_segment, seg_evt);
+ gst_event_unref (seg_evt);
+ /* Make sure the first buffer after a seek has the discont flag */
+ stream->discont = TRUE;
+ }
+
+ GST_ADAPTIVE_DEMUX_SEGMENT_UNLOCK (demux);
+ }
+
+ /* Restart the demux */
+ gst_adaptive_demux_start_tasks (demux);
+ GST_MANIFEST_UNLOCK (demux);
+ GST_API_UNLOCK (demux);
+ gst_event_unref (event);
+
+ return ret;
+}
+
+static gboolean
gst_adaptive_demux_src_event (GstPad * pad, GstObject * parent,
GstEvent * event)
{
GstAdaptiveDemux *demux;
- GstAdaptiveDemuxClass *demux_class;
demux = GST_ADAPTIVE_DEMUX_CAST (parent);
- demux_class = GST_ADAPTIVE_DEMUX_GET_CLASS (demux);
/* FIXME handle events received on pads that are to be removed */
switch (event->type) {
case GST_EVENT_SEEK:
{
- gdouble rate;
- GstFormat format;
- GstSeekFlags flags;
- GstSeekType start_type, stop_type;
- gint64 start, stop;
- guint32 seqnum;
- gboolean update;
- gboolean ret;
- GstSegment oldsegment;
- GstAdaptiveDemuxStream *stream = NULL;
-
- 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_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;
- }
-
- if (gst_adaptive_demux_is_live (demux)) {
- 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;
- }
- }
-
- seqnum = gst_event_get_seqnum (event);
-
- GST_DEBUG_OBJECT (demux, "seek event, %" GST_PTR_FORMAT, event);
-
- /* have a backup in case seek fails */
- gst_segment_copy_into (&demux->segment, &oldsegment);
-
- if (flags & GST_SEEK_FLAG_FLUSH) {
- GstEvent *fevent;
-
- GST_DEBUG_OBJECT (demux, "sending flush start");
- fevent = gst_event_new_flush_start ();
- gst_event_set_seqnum (fevent, seqnum);
- gst_adaptive_demux_push_src_event (demux, fevent);
-
- gst_adaptive_demux_stop_tasks (demux);
- } else if ((rate > 0 && start_type != GST_SEEK_TYPE_NONE) ||
- (rate < 0 && stop_type != GST_SEEK_TYPE_NONE)) {
-
- gst_adaptive_demux_stop_tasks (demux);
- }
-
- GST_ADAPTIVE_DEMUX_SEGMENT_LOCK (demux);
-
- /*
- * Handle snap seeks as follows:
- * 1) do the snap seeking on the stream that received
- * the event
- * 2) use the final position on this stream to seek
- * on the other streams to the same position
- *
- * We can't snap at all streams at the same time as
- * they might end in different positions, so just
- * use the one that received the event as the 'leading'
- * one to do the snap seek.
- */
- if (IS_SNAP_SEEK (flags) && demux_class->stream_seek && (stream =
- gst_adaptive_demux_find_stream_for_pad (demux, pad))) {
- GstClockTime ts;
- GstSeekFlags stream_seek_flags = flags;
-
- /* snap-seek on the stream that received the event and then
- * use the resulting position to seek on all streams */
-
- if (rate >= 0) {
- if (start_type != GST_SEEK_TYPE_NONE)
- ts = start;
- else {
- ts = stream->segment.position;
- start_type = GST_SEEK_TYPE_SET;
- }
- } else {
- if (stop_type != GST_SEEK_TYPE_NONE)
- ts = stop;
- else {
- stop_type = GST_SEEK_TYPE_SET;
- ts = stream->segment.position;
- }
- }
-
- if (stream) {
- demux_class->stream_seek (stream, rate >= 0, stream_seek_flags, ts,
- &ts);
- }
-
- /* replace event with a new one without snaping to seek on all streams */
- gst_event_unref (event);
- if (rate >= 0) {
- start = ts;
- } else {
- stop = ts;
- }
- event =
- gst_event_new_seek (rate, format, REMOVE_SNAP_FLAGS (flags),
- start_type, start, stop_type, stop);
- GST_DEBUG_OBJECT (demux, "Adapted snap seek to %" GST_PTR_FORMAT,
- event);
- }
- stream = NULL;
-
- gst_segment_do_seek (&demux->segment, rate, format, flags, start_type,
- start, stop_type, stop, &update);
-
- /* FIXME - this seems unatural, do_seek() is updating base when we
- * only want the start/stop position to change, maybe do_seek() needs
- * some fixing? */
- if (!(flags & GST_SEEK_FLAG_FLUSH) && ((rate > 0
- && start_type == GST_SEEK_TYPE_NONE) || (rate < 0
- && stop_type == GST_SEEK_TYPE_NONE))) {
- demux->segment.base = oldsegment.base;
- }
-
- GST_DEBUG_OBJECT (demux, "Calling subclass seek: %" GST_PTR_FORMAT,
- event);
-
- ret = demux_class->seek (demux, event);
-
- if (!ret) {
- /* Is there anything else we can do if it fails? */
- gst_segment_copy_into (&oldsegment, &demux->segment);
- } else {
- demux->priv->segment_seqnum = seqnum;
- }
- GST_ADAPTIVE_DEMUX_SEGMENT_UNLOCK (demux);
-
- if (flags & GST_SEEK_FLAG_FLUSH) {
- GstEvent *fevent;
-
- GST_DEBUG_OBJECT (demux, "Sending flush stop on all pad");
- fevent = gst_event_new_flush_stop (TRUE);
- gst_event_set_seqnum (fevent, seqnum);
- gst_adaptive_demux_push_src_event (demux, fevent);
- }
-
- if (demux->next_streams) {
- gst_adaptive_demux_expose_streams (demux, FALSE);
- } else {
- GList *iter;
- GstClockTime period_start =
- gst_adaptive_demux_get_period_start_time (demux);
-
- GST_ADAPTIVE_DEMUX_SEGMENT_LOCK (demux);
- for (iter = demux->streams; iter; iter = g_list_next (iter)) {
- GstAdaptiveDemuxStream *stream = iter->data;
- GstEvent *seg_evt;
- GstClockTime offset;
-
- /* See comments in gst_adaptive_demux_get_period_start_time() for
- * an explanation of the segment modifications */
- stream->segment = demux->segment;
- offset =
- gst_adaptive_demux_stream_get_presentation_offset (demux, stream);
- stream->segment.start += offset - period_start;
- if (demux->segment.rate > 0 && start_type != GST_SEEK_TYPE_NONE)
- stream->segment.position = stream->segment.start;
- else if (demux->segment.rate < 0 && stop_type != GST_SEEK_TYPE_NONE)
- stream->segment.position = stream->segment.stop;
- seg_evt = gst_event_new_segment (&stream->segment);
- gst_event_set_seqnum (seg_evt, demux->priv->segment_seqnum);
- gst_event_replace (&stream->pending_segment, seg_evt);
- gst_event_unref (seg_evt);
- }
-
- GST_ADAPTIVE_DEMUX_SEGMENT_UNLOCK (demux);
- }
-
- /* Restart the demux */
- gst_adaptive_demux_start_tasks (demux);
- GST_MANIFEST_UNLOCK (demux);
- GST_API_UNLOCK (demux);
- gst_event_unref (event);
-
- return ret;
+ return gst_adaptive_demux_handle_seek_event (demux, pad, event);
}
case GST_EVENT_RECONFIGURE:{
GstAdaptiveDemuxStream *stream;
@@ -1694,7 +1773,7 @@
GST_MANIFEST_UNLOCK (demux);
if (src) {
- gst_element_set_locked_state (stream->src, TRUE);
+ gst_element_set_locked_state (src, TRUE);
gst_element_set_state (src, GST_STATE_READY);
}
@@ -1720,7 +1799,6 @@
stream->download_error_count = 0;
stream->need_header = TRUE;
- gst_adapter_clear (stream->adapter);
}
}
@@ -1824,6 +1902,19 @@
GST_DEBUG_OBJECT (demux, "Bitrate after bitrate limit (%0.2f): %"
G_GUINT64_FORMAT, demux->bitrate_limit,
stream->current_download_rate * 8);
+
+#if 0
+ /* Debugging code, modulate the bitrate every few fragments */
+ {
+ static guint ctr = 0;
+ if (ctr % 3 == 0) {
+ GST_INFO_OBJECT (demux, "Halving reported bitrate for debugging");
+ stream->current_download_rate /= 2;
+ }
+ ctr++;
+ }
+#endif
+
return stream->current_download_rate;
}
@@ -2018,12 +2109,8 @@
*/
static GstFlowReturn
gst_adaptive_demux_stream_data_received_default (GstAdaptiveDemux * demux,
- GstAdaptiveDemuxStream * stream)
+ GstAdaptiveDemuxStream * stream, GstBuffer * buffer)
{
- GstBuffer *buffer;
-
- buffer = gst_adapter_take_buffer (stream->adapter,
- gst_adapter_available (stream->adapter));
return gst_adaptive_demux_stream_push_buffer (stream, buffer);
}
@@ -2119,15 +2206,14 @@
}
stream->download_total_time +=
- g_get_monotonic_time () - stream->download_chunk_start_time;
+ GST_TIME_AS_USECONDS (gst_adaptive_demux_get_monotonic_time (demux)) -
+ stream->download_chunk_start_time;
stream->download_total_bytes += gst_buffer_get_size (buffer);
- 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));
+ GST_DEBUG_OBJECT (stream->pad, "Received buffer of size %" G_GSIZE_FORMAT,
+ gst_buffer_get_size (buffer));
- ret = klass->data_received (demux, stream);
+ ret = klass->data_received (demux, stream, buffer);
if (ret == GST_FLOW_FLUSHING) {
/* do not make any changes if the stream is cancelled */
@@ -2140,12 +2226,14 @@
g_mutex_unlock (&stream->fragment_download_lock);
}
- stream->download_chunk_start_time = g_get_monotonic_time ();
+ stream->download_chunk_start_time =
+ GST_TIME_AS_USECONDS (gst_adaptive_demux_get_monotonic_time (demux));
if (ret != GST_FLOW_OK) {
+ gboolean finished = FALSE;
+
if (ret < GST_FLOW_EOS) {
- GST_ELEMENT_ERROR (demux, STREAM, FAILED, (NULL),
- ("stream stopped, reason %s", gst_flow_get_name (ret)));
+ GST_ELEMENT_FLOW_ERROR (demux, ret);
/* TODO push this on all pads */
gst_pad_push_event (stream->pad, gst_event_new_eos ());
@@ -2154,9 +2242,23 @@
gst_flow_get_name (ret));
}
- gst_adaptive_demux_stream_fragment_download_finish (stream, ret, NULL);
- if (ret == (GstFlowReturn) GST_ADAPTIVE_DEMUX_FLOW_SWITCH)
+ if (ret == (GstFlowReturn) GST_ADAPTIVE_DEMUX_FLOW_SWITCH) {
ret = GST_FLOW_EOS; /* return EOS to make the source stop */
+ } else if (ret == GST_ADAPTIVE_DEMUX_FLOW_END_OF_FRAGMENT) {
+ /* Behaves like an EOS event from upstream */
+ stream->fragment.finished = TRUE;
+ ret = klass->finish_fragment (demux, stream);
+ if (ret == (GstFlowReturn) GST_ADAPTIVE_DEMUX_FLOW_SWITCH) {
+ ret = GST_FLOW_EOS; /* return EOS to make the source stop */
+ } else if (ret != GST_FLOW_OK) {
+ goto error;
+ }
+ finished = TRUE;
+ }
+
+ gst_adaptive_demux_stream_fragment_download_finish (stream, ret, NULL);
+ if (finished)
+ ret = GST_FLOW_EOS;
}
error:
@@ -2189,6 +2291,23 @@
g_mutex_unlock (&stream->fragment_download_lock);
}
+static GstFlowReturn
+gst_adaptive_demux_eos_handling (GstAdaptiveDemuxStream * stream)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstAdaptiveDemuxClass *klass = GST_ADAPTIVE_DEMUX_GET_CLASS (stream->demux);
+
+ if (!klass->need_another_chunk || stream->fragment.chunk_size == -1
+ || !klass->need_another_chunk (stream)
+ || stream->fragment.chunk_size == 0) {
+ stream->fragment.finished = TRUE;
+ ret = klass->finish_fragment (stream->demux, stream);
+ }
+ gst_adaptive_demux_stream_fragment_download_finish (stream, ret, NULL);
+
+ return ret;
+}
+
static gboolean
_src_event (GstPad * pad, GstObject * parent, GstEvent * event)
{
@@ -2197,14 +2316,14 @@
switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_EOS:{
- GstAdaptiveDemuxClass *klass;
- GstFlowReturn ret;
-
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_adaptive_demux_eos_handling (stream);
+
+ 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);
GST_MANIFEST_UNLOCK (demux);
break;
@@ -2316,12 +2435,16 @@
new_protocol = gst_uri_get_protocol (uri);
if (!g_str_equal (old_protocol, new_protocol)) {
- gst_object_unref (stream->src_srcpad);
- gst_element_set_locked_state (stream->src, TRUE);
- gst_element_set_state (stream->src, GST_STATE_NULL);
- gst_bin_remove (GST_BIN_CAST (demux), stream->src);
+ GstElement *src = stream->src;
+
stream->src = NULL;
+ gst_object_unref (stream->src_srcpad);
stream->src_srcpad = NULL;
+ GST_MANIFEST_UNLOCK (demux);
+ gst_element_set_locked_state (src, TRUE);
+ gst_element_set_state (src, GST_STATE_NULL);
+ gst_bin_remove (GST_BIN_CAST (demux), src);
+ GST_MANIFEST_LOCK (demux);
GST_DEBUG_OBJECT (demux, "Can't re-use old source element");
} else {
GError *err = NULL;
@@ -2329,15 +2452,19 @@
GST_DEBUG_OBJECT (demux, "Re-using old source element");
if (!gst_uri_handler_set_uri (GST_URI_HANDLER (stream->uri_handler), uri,
&err)) {
+ GstElement *src = stream->src;
+
+ stream->src = NULL;
GST_DEBUG_OBJECT (demux, "Failed to re-use old source element: %s",
err->message);
g_clear_error (&err);
gst_object_unref (stream->src_srcpad);
- gst_element_set_locked_state (stream->src, TRUE);
- gst_element_set_state (stream->src, GST_STATE_NULL);
- gst_bin_remove (GST_BIN_CAST (demux), stream->src);
- stream->src = NULL;
stream->src_srcpad = NULL;
+ GST_MANIFEST_UNLOCK (demux);
+ gst_element_set_locked_state (src, TRUE);
+ gst_element_set_state (src, GST_STATE_NULL);
+ gst_bin_remove (GST_BIN_CAST (demux), src);
+ GST_MANIFEST_LOCK (demux);
}
}
g_free (old_uri);
@@ -2470,11 +2597,12 @@
stream->uri_handler = uri_handler;
stream->queue = queue;
+
+ stream->last_status_code = 200; /* default to OK */
}
return TRUE;
}
-
static GstPadProbeReturn
gst_ad_stream_src_to_ready_cb (GstPad * pad, GstPadProbeInfo * info,
gpointer user_data)
@@ -2490,17 +2618,33 @@
return GST_PAD_PROBE_OK;
}
+#ifndef GST_DISABLE_GST_DEBUG
+static const char *
+uritype (GstAdaptiveDemuxStream * s)
+{
+ if (s->downloading_header)
+ return "header";
+ if (s->downloading_index)
+ return "index";
+ return "fragment";
+}
+#endif
+
/* 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,
- gint64 end)
+ gint64 end, guint * http_status)
{
GstFlowReturn ret = GST_FLOW_OK;
- GST_DEBUG_OBJECT (stream->pad, "Downloading uri: %s, range:%" G_GINT64_FORMAT
- " - %" G_GINT64_FORMAT, uri, start, end);
+ GST_DEBUG_OBJECT (stream->pad,
+ "Downloading %s uri: %s, range:%" G_GINT64_FORMAT " - %" G_GINT64_FORMAT,
+ uritype (stream), uri, start, end);
+
+ if (http_status)
+ *http_status = 200; /* default to ok if no further information */
if (!gst_adaptive_demux_stream_update_source (stream, uri, NULL, FALSE, TRUE)) {
ret = stream->last_ret = GST_FLOW_ERROR;
@@ -2509,6 +2653,7 @@
gst_element_set_locked_state (stream->src, TRUE);
+ GST_MANIFEST_UNLOCK (demux);
if (gst_element_set_state (stream->src,
GST_STATE_READY) != GST_STATE_CHANGE_FAILURE) {
if (start != 0 || end != -1) {
@@ -2522,18 +2667,24 @@
GST_FORMAT_BYTES, (GstSeekFlags) GST_SEEK_FLAG_FLUSH,
GST_SEEK_TYPE_SET, start, GST_SEEK_TYPE_SET, end))) {
+ GST_MANIFEST_LOCK (demux);
/* looks like the source can't handle seeks in READY */
g_clear_error (&stream->last_error);
stream->last_error = g_error_new (GST_CORE_ERROR,
GST_CORE_ERROR_NOT_IMPLEMENTED,
"Source element can't handle range requests");
stream->last_ret = GST_FLOW_ERROR;
+ } else {
+ GST_MANIFEST_LOCK (demux);
}
+ } else {
+ GST_MANIFEST_LOCK (demux);
}
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 ();
+ stream->download_start_time =
+ GST_TIME_AS_USECONDS (gst_adaptive_demux_get_monotonic_time (demux));
+ stream->download_chunk_start_time = stream->download_start_time;
/* src element is in state READY. Before we start it, we reset
* download_finished
@@ -2554,7 +2705,7 @@
/* wait for the fragment to be completely downloaded */
GST_DEBUG_OBJECT (stream->pad,
- "Waiting for fragment download to finish: %s", uri);
+ "Waiting for %s download to finish: %s", uritype (stream), uri);
g_mutex_lock (&stream->fragment_download_lock);
stream->src_at_ready = FALSE;
@@ -2581,10 +2732,15 @@
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));
+ GST_DEBUG_OBJECT (stream->pad, "%s download finished: %s %d %s",
+ uritype (stream), uri, stream->last_ret,
+ gst_flow_get_name (stream->last_ret));
+ if (stream->last_ret != GST_FLOW_OK && http_status) {
+ *http_status = stream->last_status_code;
+ }
}
} else {
+ GST_MANIFEST_UNLOCK (demux);
if (stream->last_ret == GST_FLOW_OK)
stream->last_ret = GST_FLOW_CUSTOM_ERROR;
ret = GST_FLOW_CUSTOM_ERROR;
@@ -2646,7 +2802,7 @@
stream->downloading_header = TRUE;
ret = gst_adaptive_demux_stream_download_uri (demux, stream,
stream->fragment.header_uri, stream->fragment.header_range_start,
- stream->fragment.header_range_end);
+ stream->fragment.header_range_end, NULL);
stream->downloading_header = FALSE;
}
@@ -2661,7 +2817,7 @@
stream->downloading_index = TRUE;
ret = gst_adaptive_demux_stream_download_uri (demux, stream,
stream->fragment.index_uri, stream->fragment.index_range_start,
- stream->fragment.index_range_end);
+ stream->fragment.index_range_end, NULL);
stream->downloading_index = FALSE;
}
}
@@ -2676,8 +2832,12 @@
gst_adaptive_demux_stream_download_fragment (GstAdaptiveDemuxStream * stream)
{
GstAdaptiveDemux *demux = stream->demux;
+ GstAdaptiveDemuxClass *klass = GST_ADAPTIVE_DEMUX_GET_CLASS (demux);
gchar *url = NULL;
- GstFlowReturn ret = GST_FLOW_OK;
+ GstFlowReturn ret;
+ gboolean retried_once = FALSE, live;
+ guint http_status;
+ guint last_status_code;
stream->starting_fragment = TRUE;
stream->last_ret = GST_FLOW_OK;
@@ -2695,43 +2855,199 @@
stream->need_header = FALSE;
}
+again:
+ ret = GST_FLOW_OK;
url = stream->fragment.uri;
GST_DEBUG_OBJECT (stream->pad, "Got url '%s' for stream %p", url, stream);
- if (url) {
+ if (!url)
+ return ret;
+
+ stream->last_ret = GST_FLOW_OK;
+ http_status = 200;
+
+ if (klass->need_another_chunk && klass->need_another_chunk (stream)
+ && stream->fragment.chunk_size != 0) {
+ gint64 range_start, range_end, chunk_start, chunk_end;
+ guint64 download_total_bytes;
+ gint chunk_size = stream->fragment.chunk_size;
+
+ range_start = chunk_start = stream->fragment.range_start;
+ range_end = stream->fragment.range_end;
+ /* HTTP ranges are inclusive for the end */
+ if (chunk_size != -1)
+ chunk_end = range_start + chunk_size - 1;
+ else
+ chunk_end = range_end;
+
+ if (range_end != -1)
+ chunk_end = MIN (chunk_end, range_end);
+
+ while (!stream->fragment.finished && (chunk_start <= range_end
+ || range_end == -1)) {
+ download_total_bytes = stream->download_total_bytes;
+
+ ret =
+ gst_adaptive_demux_stream_download_uri (demux, stream, url,
+ chunk_start, chunk_end, &http_status);
+
+ GST_DEBUG_OBJECT (stream->pad,
+ "Fragment chunk download result: %d (%d) %s", stream->last_ret,
+ http_status, gst_flow_get_name (stream->last_ret));
+
+ /* Don't retry for any chunks except the first. We would have sent
+ * data downstream already otherwise and it's difficult to recover
+ * from that in a meaningful way */
+ if (chunk_start > range_start)
+ retried_once = TRUE;
+
+ /* FIXME: Check for 416 Range Not Satisfiable here and fall back to
+ * downloading up to -1. We don't know the full duration.
+ * Needs https://bugzilla.gnome.org/show_bug.cgi?id=756806 */
+ if (ret != GST_FLOW_OK && chunk_end == -1) {
+ break;
+ } else if (ret != GST_FLOW_OK) {
+ chunk_end = -1;
+ stream->last_ret = GST_FLOW_OK;
+ continue;
+ }
+
+ if (chunk_end == -1)
+ break;
+
+ /* Short read, we're at the end now */
+ if (stream->download_total_bytes - download_total_bytes <
+ chunk_end + 1 - chunk_start)
+ break;
+
+ if (!klass->need_another_chunk (stream))
+ break;
+
+ /* HTTP ranges are inclusive for the end */
+ chunk_start += chunk_size;
+ chunk_size = stream->fragment.chunk_size;
+ if (chunk_size != -1)
+ chunk_end = chunk_start + chunk_size - 1;
+ else
+ chunk_end = range_end;
+
+ if (range_end != -1)
+ chunk_end = MIN (chunk_end, range_end);
+ }
+ } else {
ret =
gst_adaptive_demux_stream_download_uri (demux, stream, url,
- stream->fragment.range_start, stream->fragment.range_end);
- 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) {
- 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);
+ stream->fragment.range_start, stream->fragment.range_end, &http_status);
+ GST_DEBUG_OBJECT (stream->pad, "Fragment download result: %d (%d) %s",
+ stream->last_ret, http_status, gst_flow_get_name (stream->last_ret));
+ }
+ if (ret == GST_FLOW_OK)
+ goto beach;
- /* 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
- * Have to assume we are falling behind and cause a manifest reload */
- GST_DEBUG_OBJECT (stream->pad,
- "Converting error of live stream to EOS");
- return GST_FLOW_EOS;
+ 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)
+ goto beach;
+
+ last_status_code = stream->last_status_code;
+ GST_WARNING_OBJECT (stream->pad, "Got custom error, status %u, dc %d",
+ last_status_code, stream->download_error_count);
+
+ live = gst_adaptive_demux_is_live (demux);
+ if (!retried_once && ((last_status_code / 100 == 4 && live) || last_status_code / 100 == 5)) { /* 4xx/5xx */
+ /* if current position is before available start, switch to next */
+ if (!gst_adaptive_demux_stream_has_next_fragment (demux, stream))
+ goto flushing;
+
+ if (live) {
+ gint64 range_start, range_stop;
+
+ if (!gst_adaptive_demux_get_live_seek_range (demux, &range_start,
+ &range_stop))
+ goto flushing;
+
+ if (demux->segment.position < range_start) {
+ GST_DEBUG_OBJECT (stream->pad, "Retrying once with next segment");
+ stream->last_ret = GST_FLOW_OK;
+ ret = gst_adaptive_demux_eos_handling (stream);
+ GST_DEBUG_OBJECT (stream->pad, "finish_fragment: %s",
+ gst_flow_get_name (ret));
+ ret = gst_adaptive_demux_stream_update_fragment_info (demux, stream);
+ GST_DEBUG_OBJECT (stream->pad, "finish_fragment: %s",
+ gst_flow_get_name (ret));
+ if (ret == GST_FLOW_OK) {
+ retried_once = TRUE;
+ goto again;
}
- } else if (ret == GST_FLOW_CUSTOM_ERROR
- && !gst_adaptive_demux_stream_has_next_fragment (demux, stream)) {
- /* If this is the last fragment, consider failures EOS and not actual
- * errors. Due to rounding errors in the durations, the last fragment
- * might not actually exist */
- GST_DEBUG_OBJECT (stream->pad,
- "Converting error for last fragment to EOS");
- return GST_FLOW_EOS;
+ } else if (demux->segment.position > range_stop) {
+ /* wait a bit to be in range, we don't have any locks at that point */
+ gint64 wait_time =
+ gst_adaptive_demux_stream_get_fragment_waiting_time (demux, stream);
+ if (wait_time > 0) {
+ gint64 end_time = g_get_monotonic_time () + wait_time / GST_USECOND;
+
+ 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 flushing;
+ }
+ do {
+ g_cond_wait_until (&stream->fragment_download_cond,
+ &stream->fragment_download_lock, end_time);
+ if (G_UNLIKELY (stream->cancelled)) {
+ g_mutex_unlock (&stream->fragment_download_lock);
+ GST_MANIFEST_LOCK (demux);
+ stream->last_ret = GST_FLOW_FLUSHING;
+ goto flushing;
+ }
+ } while (!stream->download_finished);
+ g_mutex_unlock (&stream->fragment_download_lock);
+
+ GST_MANIFEST_LOCK (demux);
+ }
}
}
+
+ flushing:
+ if (++stream->download_error_count <= MAX_DOWNLOAD_ERROR_COUNT) {
+ /* looks like there is no way of knowing when a live stream has ended
+ * Have to assume we are falling behind and cause a manifest reload */
+ GST_DEBUG_OBJECT (stream->pad, "Converting error of live stream to EOS");
+ return GST_FLOW_EOS;
+ }
}
+ else if (!gst_adaptive_demux_stream_has_next_fragment (demux, stream)) {
+ /* If this is the last fragment, consider failures EOS and not actual
+ * errors. Due to rounding errors in the durations, the last fragment
+ * might not actually exist */
+ GST_DEBUG_OBJECT (stream->pad, "Converting error for last fragment to EOS");
+ return GST_FLOW_EOS;
+ } else {
+ /* retry once (same segment) for 5xx (server errors) */
+ if (!retried_once) {
+ retried_once = TRUE;
+ /* wait a short time in case the server needs a bit to recover, we don't
+ * care if we get woken up before end time. We can use sleep here since
+ * we're already blocking and just want to wait some time. */
+ g_usleep (100000); /* a tenth of a second */
+ goto again;
+ }
+ }
+
+beach:
return ret;
no_url_error:
@@ -2752,7 +3068,7 @@
gst_adaptive_demux_stream_download_loop (GstAdaptiveDemuxStream * stream)
{
GstAdaptiveDemux *demux = stream->demux;
- guint64 next_download = g_get_monotonic_time ();
+ GstClockTime next_download = gst_adaptive_demux_get_monotonic_time (demux);
GstFlowReturn ret;
gboolean live;
@@ -2879,6 +3195,7 @@
GST_PTR_FORMAT, seg_event);
gst_pad_push_event (stream->pad, seg_event);
+ stream->discont = TRUE;
stream->restart_download = FALSE;
}
@@ -2894,7 +3211,8 @@
gint64 wait_time =
gst_adaptive_demux_stream_get_fragment_waiting_time (demux, stream);
if (wait_time > 0) {
- gint64 end_time = g_get_monotonic_time () + wait_time / GST_USECOND;
+ GstClockTime end_time =
+ gst_adaptive_demux_get_monotonic_time (demux) + wait_time;
GST_DEBUG_OBJECT (stream->pad, "Download waiting for %" GST_TIME_FORMAT,
GST_TIME_ARGS (wait_time));
@@ -2908,8 +3226,9 @@
stream->last_ret = GST_FLOW_FLUSHING;
goto cancelled;
}
- g_cond_wait_until (&stream->fragment_download_cond,
- &stream->fragment_download_lock, end_time);
+ gst_adaptive_demux_wait_until (demux->realtime_clock,
+ &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");
@@ -2928,7 +3247,7 @@
stream->last_ret = GST_FLOW_OK;
- next_download = g_get_monotonic_time ();
+ next_download = gst_adaptive_demux_get_monotonic_time (demux);
ret = gst_adaptive_demux_stream_download_fragment (stream);
if (ret == GST_FLOW_FLUSHING) {
@@ -2968,13 +3287,15 @@
break;
case GST_FLOW_NOT_LINKED:
+ {
+ GstFlowReturn ret;
gst_task_stop (stream->download_task);
- if (gst_adaptive_demux_combine_flows (demux)
- == GST_FLOW_NOT_LINKED) {
- GST_ELEMENT_ERROR (demux, STREAM, FAILED,
- (_("Internal data stream error.")), ("stream stopped, reason %s",
- gst_flow_get_name (GST_FLOW_NOT_LINKED)));
+
+ ret = gst_adaptive_demux_combine_flows (demux);
+ if (ret == GST_FLOW_NOT_LINKED) {
+ GST_ELEMENT_FLOW_ERROR (demux, ret);
}
+ }
break;
case GST_FLOW_FLUSHING:{
@@ -3014,9 +3335,7 @@
}
/* Wait half the fragment duration before retrying */
- next_download +=
- gst_util_uint64_scale
- (stream->fragment.duration, G_USEC_PER_SEC, 2 * GST_SECOND);
+ next_download += stream->fragment.duration / 2;
GST_MANIFEST_UNLOCK (demux);
@@ -3027,8 +3346,9 @@
stream->last_ret = GST_FLOW_FLUSHING;
goto cancelled;
}
- g_cond_wait_until (&stream->fragment_download_cond,
- &stream->fragment_download_lock, next_download);
+ gst_adaptive_demux_wait_until (demux->realtime_clock,
+ &stream->fragment_download_cond, &stream->fragment_download_lock,
+ next_download);
g_mutex_unlock (&stream->fragment_download_lock);
GST_DEBUG_OBJECT (demux, "Retrying now");
@@ -3095,10 +3415,14 @@
gst_task_stop (stream->download_task);
if (stream->src) {
- gst_element_set_locked_state (stream->src, TRUE);
- gst_element_set_state (stream->src, GST_STATE_NULL);
- gst_bin_remove (GST_BIN_CAST (demux), stream->src);
+ GstElement *src = stream->src;
+
stream->src = NULL;
+ GST_MANIFEST_UNLOCK (demux);
+ gst_element_set_locked_state (src, TRUE);
+ gst_element_set_state (src, GST_STATE_NULL);
+ gst_bin_remove (GST_BIN_CAST (demux), src);
+ GST_MANIFEST_LOCK (demux);
}
gst_element_post_message (GST_ELEMENT_CAST (demux), msg);
@@ -3110,7 +3434,7 @@
static void
gst_adaptive_demux_updates_loop (GstAdaptiveDemux * demux)
{
- gint64 next_update;
+ GstClockTime next_update;
GstAdaptiveDemuxClass *klass = GST_ADAPTIVE_DEMUX_GET_CLASS (demux);
/* Loop for updating of the playlist. This periodically checks if
@@ -3122,8 +3446,9 @@
GST_MANIFEST_LOCK (demux);
- next_update = g_get_monotonic_time () +
- klass->get_manifest_update_interval (demux);
+ next_update =
+ gst_adaptive_demux_get_monotonic_time (demux) +
+ klass->get_manifest_update_interval (demux) * GST_USECOND;
/* Updating playlist only needed for live playlists */
while (gst_adaptive_demux_is_live (demux)) {
@@ -3139,7 +3464,8 @@
g_mutex_unlock (&demux->priv->updates_timed_lock);
goto quit;
}
- g_cond_wait_until (&demux->priv->updates_timed_cond,
+ gst_adaptive_demux_wait_until (demux->realtime_clock,
+ &demux->priv->updates_timed_cond,
&demux->priv->updates_timed_lock, next_update);
g_mutex_unlock (&demux->priv->updates_timed_lock);
@@ -3163,8 +3489,8 @@
demux->priv->update_failed_count++;
if (demux->priv->update_failed_count <= DEFAULT_FAILED_COUNT) {
GST_WARNING_OBJECT (demux, "Could not update the playlist");
- next_update = g_get_monotonic_time () +
- klass->get_manifest_update_interval (demux);
+ next_update = gst_adaptive_demux_get_monotonic_time (demux)
+ + klass->get_manifest_update_interval (demux) * GST_USECOND;
} else {
GST_ELEMENT_ERROR (demux, STREAM, FAILED,
(_("Internal data stream error.")), ("Could not update playlist"));
@@ -3175,8 +3501,9 @@
}
} else {
GST_DEBUG_OBJECT (demux, "Updated playlist successfully");
- next_update = g_get_monotonic_time () +
- klass->get_manifest_update_interval (demux);
+ next_update =
+ gst_adaptive_demux_get_monotonic_time (demux) +
+ klass->get_manifest_update_interval (demux) * GST_USECOND;
/* Wake up download tasks */
g_mutex_lock (&demux->priv->manifest_update_lock);
@@ -3337,26 +3664,43 @@
}
stream->download_start_time = stream->download_chunk_start_time =
- g_get_monotonic_time ();
+ GST_TIME_AS_USECONDS (gst_adaptive_demux_get_monotonic_time (demux));
if (ret == GST_FLOW_OK) {
if (gst_adaptive_demux_stream_select_bitrate (demux, stream,
gst_adaptive_demux_stream_update_current_bitrate (demux, stream))) {
stream->need_header = TRUE;
- gst_adapter_clear (stream->adapter);
ret = (GstFlowReturn) GST_ADAPTIVE_DEMUX_FLOW_SWITCH;
}
/* the subclass might want to switch pads */
if (G_UNLIKELY (demux->next_streams)) {
+ GList *iter;
+ gboolean can_expose = TRUE;
+
gst_task_stop (stream->download_task);
- /* TODO only allow switching streams if other downloads are not ongoing */
- GST_DEBUG_OBJECT (demux, "Subclass wants new pads "
- "to do bitrate switching");
- gst_adaptive_demux_expose_streams (demux, FALSE);
- gst_adaptive_demux_start_tasks (demux);
ret = GST_FLOW_EOS;
+
+ for (iter = demux->streams; iter; iter = g_list_next (iter)) {
+ /* Only expose if all streams are now cancelled or finished downloading */
+ GstAdaptiveDemuxStream *other = iter->data;
+ if (other != stream) {
+ g_mutex_lock (&other->fragment_download_lock);
+ can_expose &= (other->cancelled == TRUE
+ || other->download_finished == TRUE);
+ g_mutex_unlock (&other->fragment_download_lock);
+ }
+ }
+
+ if (can_expose) {
+ GST_DEBUG_OBJECT (demux, "Subclass wants new pads "
+ "to do bitrate switching");
+ gst_adaptive_demux_expose_streams (demux, FALSE);
+ gst_adaptive_demux_start_tasks (demux);
+ } else {
+ GST_LOG_OBJECT (demux, "Not switching yet - ongoing downloads");
+ }
}
}
@@ -3370,12 +3714,6 @@
{
GstAdaptiveDemuxClass *klass = GST_ADAPTIVE_DEMUX_GET_CLASS (demux);
- /* FIXME: Currently several issues have be found when letting bitrate adaptation
- * happen using trick modes (such as 'All streams finished without buffers') and
- * the adaptive algorithm does not properly behave. */
- if (demux->segment.rate != 1.0)
- return FALSE;
-
if (klass->stream_select_bitrate)
return klass->stream_select_bitrate (stream, bitrate);
return FALSE;
@@ -3394,6 +3732,7 @@
/* Make sure the sub-class will update bitrate, or else
* we will later */
stream->fragment.bitrate = 0;
+ stream->fragment.finished = FALSE;
return klass->stream_update_fragment_info (stream);
}
@@ -3490,6 +3829,8 @@
f->index_uri = NULL;
f->index_range_start = 0;
f->index_range_end = -1;
+
+ f->finished = FALSE;
}
/* must be called with manifest_lock taken */
@@ -3518,3 +3859,131 @@
gst_adaptive_demux_expose_streams (demux, FALSE);
gst_adaptive_demux_start_tasks (demux);
}
+
+/**
+ * gst_adaptive_demux_get_monotonic_time:
+ * Returns: a monotonically increasing time, using the system realtime clock
+ */
+GstClockTime
+gst_adaptive_demux_get_monotonic_time (GstAdaptiveDemux * demux)
+{
+ g_return_val_if_fail (demux != NULL, GST_CLOCK_TIME_NONE);
+ return gst_clock_get_time (demux->realtime_clock);
+}
+
+/**
+ * gst_adaptive_demux_get_client_now_utc:
+ * @demux: #GstAdaptiveDemux
+ * Returns: the client's estimate of UTC
+ *
+ * Used to find the client's estimate of UTC, using the system realtime clock.
+ */
+GDateTime *
+gst_adaptive_demux_get_client_now_utc (GstAdaptiveDemux * demux)
+{
+ GstClockTime rtc_now;
+ gint64 utc_now;
+ GTimeVal gtv;
+
+ rtc_now = gst_clock_get_time (demux->realtime_clock);
+ utc_now = demux->clock_offset + GST_TIME_AS_USECONDS (rtc_now);
+ gtv.tv_sec = utc_now / G_TIME_SPAN_SECOND;
+ gtv.tv_usec = utc_now % G_TIME_SPAN_SECOND;
+ return g_date_time_new_from_timeval_utc (>v);
+}
+
+static GstAdaptiveDemuxTimer *
+gst_adaptive_demux_timer_new (GCond * cond, GMutex * mutex)
+{
+ GstAdaptiveDemuxTimer *timer;
+
+ timer = g_slice_new (GstAdaptiveDemuxTimer);
+ timer->fired = FALSE;
+ timer->cond = cond;
+ timer->mutex = mutex;
+ timer->ref_count = 1;
+ return timer;
+}
+
+static GstAdaptiveDemuxTimer *
+gst_adaptive_demux_timer_ref (GstAdaptiveDemuxTimer * timer)
+{
+ g_return_val_if_fail (timer != NULL, NULL);
+ g_atomic_int_inc (&timer->ref_count);
+ return timer;
+}
+
+static void
+gst_adaptive_demux_timer_unref (GstAdaptiveDemuxTimer * timer)
+{
+ g_return_if_fail (timer != NULL);
+ if (g_atomic_int_dec_and_test (&timer->ref_count)) {
+ g_slice_free (GstAdaptiveDemuxTimer, timer);
+ }
+}
+
+/* gst_adaptive_demux_wait_until:
+ * A replacement for g_cond_wait_until that uses the clock rather
+ * than system time to control the duration of the sleep. Typically
+ * clock is actually a #GstSystemClock, in which case this function
+ * behaves exactly like g_cond_wait_until. Inside unit tests,
+ * the clock is typically a #GstTestClock, which allows tests to run
+ * in non-realtime.
+ * This function must be called with mutex held.
+ */
+static gboolean
+gst_adaptive_demux_wait_until (GstClock * clock, GCond * cond, GMutex * mutex,
+ GstClockTime end_time)
+{
+ GstAdaptiveDemuxTimer *timer;
+ gboolean fired;
+ GstClockReturn res;
+
+ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (end_time))) {
+ /* for an invalid time, gst_clock_id_wait_async will try to call
+ * gst_adaptive_demux_clock_callback from the current thread.
+ * It still holds the mutex while doing that, so it will deadlock.
+ * g_cond_wait_until would return immediately with false, so we'll do the same.
+ */
+ return FALSE;
+ }
+ timer = gst_adaptive_demux_timer_new (cond, mutex);
+ timer->clock_id = gst_clock_new_single_shot_id (clock, end_time);
+ res =
+ gst_clock_id_wait_async (timer->clock_id,
+ gst_adaptive_demux_clock_callback, gst_adaptive_demux_timer_ref (timer),
+ (GDestroyNotify) gst_adaptive_demux_timer_unref);
+ /* clock does not support asynchronously wait. Assert and return */
+ if (res == GST_CLOCK_UNSUPPORTED) {
+ gst_clock_id_unref (timer->clock_id);
+ gst_adaptive_demux_timer_unref (timer);
+ g_return_val_if_reached (TRUE);
+ }
+ g_assert (!timer->fired);
+ /* the gst_adaptive_demux_clock_callback() will signal the
+ * cond when the clock's single shot timer fires, or the cond will be
+ * signalled by another thread that wants to cause this wait to finish
+ * early (e.g. to terminate the waiting thread).
+ * There is no need for a while loop here, because that logic is
+ * implemented by the function calling gst_adaptive_demux_wait_until() */
+ g_cond_wait (cond, mutex);
+ fired = timer->fired;
+ if (!fired)
+ gst_clock_id_unschedule (timer->clock_id);
+ gst_clock_id_unref (timer->clock_id);
+ gst_adaptive_demux_timer_unref (timer);
+ return !fired;
+}
+
+static gboolean
+gst_adaptive_demux_clock_callback (GstClock * clock,
+ GstClockTime time, GstClockID id, gpointer user_data)
+{
+ GstAdaptiveDemuxTimer *timer = (GstAdaptiveDemuxTimer *) user_data;
+ g_return_val_if_fail (timer != NULL, FALSE);
+ g_mutex_lock (timer->mutex);
+ timer->fired = TRUE;
+ g_cond_signal (timer->cond);
+ g_mutex_unlock (timer->mutex);
+ return TRUE;
+}
diff --git a/gst-libs/gst/adaptivedemux/gstadaptivedemux.h b/gst-libs/gst/adaptivedemux/gstadaptivedemux.h
index 3e84d69..e876600 100644
--- a/gst-libs/gst/adaptivedemux/gstadaptivedemux.h
+++ b/gst-libs/gst/adaptivedemux/gstadaptivedemux.h
@@ -81,6 +81,8 @@
g_clear_error (&err); \
} G_STMT_END
+#define GST_ADAPTIVE_DEMUX_FLOW_END_OF_FRAGMENT GST_FLOW_CUSTOM_SUCCESS_1
+
typedef struct _GstAdaptiveDemuxStreamFragment GstAdaptiveDemuxStreamFragment;
typedef struct _GstAdaptiveDemuxStream GstAdaptiveDemuxStream;
typedef struct _GstAdaptiveDemux GstAdaptiveDemux;
@@ -96,6 +98,9 @@
gint64 range_start;
gint64 range_end;
+ /* when chunked downloading is used, may be be updated need_another_chunk() */
+ guint chunk_size;
+
/* when headers are needed */
gchar *header_uri;
gint64 header_range_start;
@@ -109,6 +114,8 @@
/* Nominal bitrate as provided by
* sub-class or calculated by base-class */
guint bitrate;
+
+ gboolean finished;
};
struct _GstAdaptiveDemuxStream
@@ -120,8 +127,6 @@
GstSegment segment;
- GstAdapter *adapter;
-
GstCaps *pending_caps;
GstEvent *pending_segment;
GstTagList *pending_tags;
@@ -145,6 +150,7 @@
/* download tooling */
GstElement *src;
+ guint last_status_code;
GstPad *src_srcpad;
GstElement *uri_handler;
GstElement *queue;
@@ -208,6 +214,10 @@
gboolean have_group_id;
guint group_id;
+ /* Realtime clock */
+ GstClock *realtime_clock;
+ gint64 clock_offset; /* offset between realtime_clock and UTC (in usec) */
+
/* < private > */
GstAdaptiveDemuxPrivate *priv;
};
@@ -321,6 +331,17 @@
GstFlowReturn (*stream_seek) (GstAdaptiveDemuxStream * stream, gboolean forward, GstSeekFlags flags, GstClockTime target_ts, GstClockTime * final_ts);
gboolean (*stream_has_next_fragment) (GstAdaptiveDemuxStream * stream);
GstFlowReturn (*stream_advance_fragment) (GstAdaptiveDemuxStream * stream);
+
+ /**
+ * need_another_chunk:
+ * @stream: #GstAdaptiveDemuxStream
+ *
+ * If chunked downloading is used (chunk_size != 0) this is called once as
+ * chunk is finished to decide whether more has to be downloaded or not.
+ * May update chunk_size to a different value
+ */
+ gboolean (*need_another_chunk) (GstAdaptiveDemuxStream * stream);
+
/**
* stream_update_fragment_info:
* @stream: #GstAdaptiveDemuxStream
@@ -384,13 +405,14 @@
* data_received:
* @demux: #GstAdaptiveDemux
* @stream: #GstAdaptiveDemuxStream
+ * @buffer: #GstBuffer
*
* Notifies the subclass that a fragment chunk was downloaded. The subclass
- * can look at the data at the adapter and modify/push data as desired.
+ * can look at the data and modify/push data as desired.
*
* Returns: #GST_FLOW_OK if successful, #GST_FLOW_ERROR in case of error.
*/
- GstFlowReturn (*data_received) (GstAdaptiveDemux * demux, GstAdaptiveDemuxStream * stream);
+ GstFlowReturn (*data_received) (GstAdaptiveDemux * demux, GstAdaptiveDemuxStream * stream, GstBuffer * buffer);
/**
* get_live_seek_range:
@@ -453,6 +475,9 @@
void gst_adaptive_demux_stream_queue_event (GstAdaptiveDemuxStream * stream,
GstEvent * event);
+GstClockTime gst_adaptive_demux_get_monotonic_time (GstAdaptiveDemux * demux);
+GDateTime *gst_adaptive_demux_get_client_now_utc (GstAdaptiveDemux * demux);
+
G_END_DECLS
#endif
diff --git a/gst-libs/gst/audio/Makefile.in b/gst-libs/gst/audio/Makefile.in
index d7846bc..9fd5c4b 100644
--- a/gst-libs/gst/audio/Makefile.in
+++ b/gst-libs/gst/audio/Makefile.in
@@ -294,6 +294,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -315,6 +317,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -364,6 +368,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -509,6 +515,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -635,8 +643,6 @@
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@
@@ -679,8 +685,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst-libs/gst/base/Makefile.in b/gst-libs/gst/base/Makefile.in
index 7117a16..fa78568 100644
--- a/gst-libs/gst/base/Makefile.in
+++ b/gst-libs/gst/base/Makefile.in
@@ -288,6 +288,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -309,6 +311,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -358,6 +362,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -503,6 +509,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -629,8 +637,6 @@
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@
@@ -673,8 +679,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst-libs/gst/base/gstaggregator.c b/gst-libs/gst/base/gstaggregator.c
index ec297df..7e8c5be 100644
--- a/gst-libs/gst/base/gstaggregator.c
+++ b/gst-libs/gst/base/gstaggregator.c
@@ -270,7 +270,7 @@
struct _GstAggregatorPrivate
{
- gint padcount;
+ gint max_padserial;
/* Our state is >= PAUSED */
gboolean running; /* protected by src_lock */
@@ -424,6 +424,7 @@
{
GstAggregatorPad *pad;
GList *l, *sinkpads;
+ gboolean have_data = TRUE;
GST_LOG_OBJECT (self, "checking pads");
@@ -438,22 +439,30 @@
PAD_LOCK (pad);
- /* In live mode, having a single pad with buffers is enough to
- * generate a start time from it. In non-live mode all pads need
- * to have a buffer
- */
- if (self->priv->peer_latency_live &&
- !gst_aggregator_pad_queue_is_empty (pad))
+ if (gst_aggregator_pad_queue_is_empty (pad)) {
+ if (!pad->priv->eos) {
+ have_data = FALSE;
+
+ /* If not live we need data on all pads, so leave the loop */
+ if (!self->priv->peer_latency_live) {
+ PAD_UNLOCK (pad);
+ goto pad_not_ready;
+ }
+ }
+ } else if (self->priv->peer_latency_live) {
+ /* In live mode, having a single pad with buffers is enough to
+ * generate a start time from it. In non-live mode all pads need
+ * to have a buffer
+ */
self->priv->first_buffer = FALSE;
-
- if (gst_aggregator_pad_queue_is_empty (pad) && !pad->priv->eos) {
- PAD_UNLOCK (pad);
- goto pad_not_ready;
}
- PAD_UNLOCK (pad);
+ PAD_UNLOCK (pad);
}
+ if (!have_data)
+ goto pad_not_ready;
+
self->priv->first_buffer = FALSE;
GST_OBJECT_UNLOCK (self);
@@ -649,6 +658,7 @@
* and if a pad does not have a buffer in time we ignore
* that pad.
*/
+ GST_OBJECT_LOCK (self);
if (!GST_CLOCK_TIME_IS_VALID (latency) ||
!GST_IS_CLOCK (GST_ELEMENT_CLOCK (self)) ||
!GST_CLOCK_TIME_IS_VALID (start) ||
@@ -659,6 +669,7 @@
* then check if we're ready now. If we return FALSE,
* we will be directly called again.
*/
+ GST_OBJECT_UNLOCK (self);
SRC_WAIT (self);
} else {
GstClockTime base_time, time;
@@ -669,11 +680,8 @@
GST_DEBUG_OBJECT (self, "got subclass start time: %" GST_TIME_FORMAT,
GST_TIME_ARGS (start));
- GST_OBJECT_LOCK (self);
base_time = GST_ELEMENT_CAST (self)->base_time;
- clock = GST_ELEMENT_CLOCK (self);
- if (clock)
- gst_object_ref (clock);
+ clock = gst_object_ref (GST_ELEMENT_CLOCK (self));
GST_OBJECT_UNLOCK (self);
time = base_time + start;
@@ -683,7 +691,7 @@
GST_TIME_FORMAT " (base %" GST_TIME_FORMAT " start %" GST_TIME_FORMAT
" latency %" GST_TIME_FORMAT " current %" GST_TIME_FORMAT ")",
GST_TIME_ARGS (time),
- GST_TIME_ARGS (GST_ELEMENT_CAST (self)->base_time),
+ GST_TIME_ARGS (base_time),
GST_TIME_ARGS (start), GST_TIME_ARGS (latency),
GST_TIME_ARGS (gst_clock_get_time (clock)));
@@ -1316,22 +1324,22 @@
gchar *name = NULL;
if (templ->direction != GST_PAD_SINK ||
- g_strcmp0 (templ->name_template, "sink_%u"))
+ g_strcmp0 (templ->name_template, "sink_%u") != 0)
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++;
+ serial = ++priv->max_padserial;
} else {
/* parse serial number from requested padname */
serial = g_ascii_strtoull (&req_name[5], NULL, 10);
- if (serial >= priv->padcount)
- priv->padcount = serial;
+ if (serial > priv->max_padserial)
+ priv->max_padserial = serial;
}
- name = g_strdup_printf ("sink_%u", priv->padcount);
+ name = g_strdup_printf ("sink_%u", serial);
agg_pad = g_object_new (GST_AGGREGATOR_GET_CLASS (self)->sinkpads_type,
"name", name, "direction", GST_PAD_SINK, "template", templ, NULL);
g_free (name);
@@ -2011,7 +2019,7 @@
gst_element_class_get_pad_template (GST_ELEMENT_CLASS (klass), "src");
g_return_if_fail (pad_template != NULL);
- priv->padcount = -1;
+ priv->max_padserial = -1;
priv->tags_changed = FALSE;
self->priv->peer_latency_live = FALSE;
@@ -2139,10 +2147,6 @@
if (aggpad->priv->pending_eos == TRUE)
goto eos;
- flow_return = aggpad->priv->flow_return;
- if (flow_return != GST_FLOW_OK)
- goto flushing;
-
PAD_UNLOCK (aggpad);
if (aggclass->clip && head) {
@@ -2306,10 +2310,11 @@
return FALSE;
}
-static gboolean
+static GstFlowReturn
gst_aggregator_pad_event_func (GstPad * pad, GstObject * parent,
GstEvent * event)
{
+ GstFlowReturn ret = GST_FLOW_OK;
GstAggregator *self = GST_AGGREGATOR (parent);
GstAggregatorPad *aggpad = GST_AGGREGATOR_PAD (pad);
GstAggregatorClass *klass = GST_AGGREGATOR_GET_CLASS (parent);
@@ -2320,8 +2325,10 @@
PAD_LOCK (aggpad);
if (aggpad->priv->flow_return != GST_FLOW_OK
- && GST_EVENT_TYPE (event) != GST_EVENT_FLUSH_STOP)
+ && GST_EVENT_TYPE (event) != GST_EVENT_FLUSH_STOP) {
+ ret = aggpad->priv->flow_return;
goto flushing;
+ }
if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) {
GST_OBJECT_LOCK (aggpad);
@@ -2343,10 +2350,22 @@
SRC_UNLOCK (self);
}
- if (event)
- return klass->sink_event (self, aggpad, event);
- else
- return TRUE;
+ if (event) {
+ if (!klass->sink_event (self, aggpad, event)) {
+ /* Copied from GstPad to convert boolean to a GstFlowReturn in
+ * the event handling func */
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ ret = GST_FLOW_NOT_NEGOTIATED;
+ break;
+ default:
+ ret = GST_FLOW_ERROR;
+ break;
+ }
+ }
+ }
+
+ return ret;
flushing:
GST_DEBUG_OBJECT (aggpad, "Pad is %s, dropping event",
@@ -2356,7 +2375,8 @@
if (GST_EVENT_IS_STICKY (event))
gst_pad_store_sticky_event (pad, event);
gst_event_unref (event);
- return FALSE;
+
+ return ret;
}
static gboolean
@@ -2393,8 +2413,9 @@
gst_pad_set_chain_function (pad,
GST_DEBUG_FUNCPTR (gst_aggregator_pad_chain));
- gst_pad_set_event_function (pad,
- GST_DEBUG_FUNCPTR (gst_aggregator_pad_event_func));
+ gst_pad_set_event_full_function_full (pad,
+ GST_DEBUG_FUNCPTR (gst_aggregator_pad_event_func),
+ NULL, NULL);
gst_pad_set_query_function (pad,
GST_DEBUG_FUNCPTR (gst_aggregator_pad_query_func));
gst_pad_set_activatemode_function (pad,
diff --git a/gst-libs/gst/basecamerabinsrc/Makefile.in b/gst-libs/gst/basecamerabinsrc/Makefile.in
index a4e5c32..1453b08 100644
--- a/gst-libs/gst/basecamerabinsrc/Makefile.in
+++ b/gst-libs/gst/basecamerabinsrc/Makefile.in
@@ -293,6 +293,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -314,6 +316,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -363,6 +367,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -508,6 +514,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -634,8 +642,6 @@
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@
@@ -678,8 +684,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c b/gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c
index cfdc074..48ec2fe 100644
--- a/gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c
+++ b/gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c
@@ -235,7 +235,14 @@
g_cond_clear (&preview->processing_cond);
if (preview->pipeline) {
+ GstBus *bus;
+
gst_element_set_state (preview->pipeline, GST_STATE_NULL);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (preview->pipeline));
+ gst_bus_remove_watch (bus);
+ gst_object_unref (bus);
+
gst_object_unref (preview->pipeline);
}
g_free (preview);
diff --git a/gst-libs/gst/codecparsers/Makefile.am b/gst-libs/gst/codecparsers/Makefile.am
index b180570..e7d8248 100644
--- a/gst-libs/gst/codecparsers/Makefile.am
+++ b/gst-libs/gst/codecparsers/Makefile.am
@@ -6,6 +6,7 @@
parserutils.c nalutils.c dboolhuff.c vp8utils.c \
gstjpegparser.c \
gstmpegvideometa.c \
+ gstjpeg2000sampling.c \
gstvp9parser.c vp9utils.c
libgstcodecparsers_@GST_API_VERSION@includedir = \
@@ -18,6 +19,7 @@
gsth265parser.h gstvp8parser.h gstvp8rangedecoder.h \
gstjpegparser.h \
gstmpegvideometa.h \
+ gstjpeg2000sampling.h \
gstvp9parser.h
libgstcodecparsers_@GST_API_VERSION@_la_CFLAGS = \
diff --git a/gst-libs/gst/codecparsers/Makefile.in b/gst-libs/gst/codecparsers/Makefile.in
index 084014e..2eead8b 100644
--- a/gst-libs/gst/codecparsers/Makefile.in
+++ b/gst-libs/gst/codecparsers/Makefile.in
@@ -182,6 +182,7 @@
libgstcodecparsers_@GST_API_VERSION@_la-vp8utils.lo \
libgstcodecparsers_@GST_API_VERSION@_la-gstjpegparser.lo \
libgstcodecparsers_@GST_API_VERSION@_la-gstmpegvideometa.lo \
+ libgstcodecparsers_@GST_API_VERSION@_la-gstjpeg2000sampling.lo \
libgstcodecparsers_@GST_API_VERSION@_la-gstvp9parser.lo \
libgstcodecparsers_@GST_API_VERSION@_la-vp9utils.lo
libgstcodecparsers_@GST_API_VERSION@_la_OBJECTS = \
@@ -323,6 +324,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -344,6 +347,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -393,6 +398,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -538,6 +545,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -664,8 +673,6 @@
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@
@@ -708,8 +715,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -805,6 +817,7 @@
parserutils.c nalutils.c dboolhuff.c vp8utils.c \
gstjpegparser.c \
gstmpegvideometa.c \
+ gstjpeg2000sampling.c \
gstvp9parser.c vp9utils.c
libgstcodecparsers_@GST_API_VERSION@includedir = \
@@ -816,6 +829,7 @@
gsth265parser.h gstvp8parser.h gstvp8rangedecoder.h \
gstjpegparser.h \
gstmpegvideometa.h \
+ gstjpeg2000sampling.h \
gstvp9parser.h
libgstcodecparsers_@GST_API_VERSION@_la_CFLAGS = \
@@ -918,6 +932,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcodecparsers_@GST_API_VERSION@_la-dboolhuff.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcodecparsers_@GST_API_VERSION@_la-gsth264parser.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcodecparsers_@GST_API_VERSION@_la-gsth265parser.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcodecparsers_@GST_API_VERSION@_la-gstjpeg2000sampling.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcodecparsers_@GST_API_VERSION@_la-gstjpegparser.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcodecparsers_@GST_API_VERSION@_la-gstmpeg4parser.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcodecparsers_@GST_API_VERSION@_la-gstmpegvideometa.Plo@am__quote@
@@ -1046,6 +1061,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) $(libgstcodecparsers_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstcodecparsers_@GST_API_VERSION@_la-gstmpegvideometa.lo `test -f 'gstmpegvideometa.c' || echo '$(srcdir)/'`gstmpegvideometa.c
+libgstcodecparsers_@GST_API_VERSION@_la-gstjpeg2000sampling.lo: gstjpeg2000sampling.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) $(libgstcodecparsers_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstcodecparsers_@GST_API_VERSION@_la-gstjpeg2000sampling.lo -MD -MP -MF $(DEPDIR)/libgstcodecparsers_@GST_API_VERSION@_la-gstjpeg2000sampling.Tpo -c -o libgstcodecparsers_@GST_API_VERSION@_la-gstjpeg2000sampling.lo `test -f 'gstjpeg2000sampling.c' || echo '$(srcdir)/'`gstjpeg2000sampling.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcodecparsers_@GST_API_VERSION@_la-gstjpeg2000sampling.Tpo $(DEPDIR)/libgstcodecparsers_@GST_API_VERSION@_la-gstjpeg2000sampling.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstjpeg2000sampling.c' object='libgstcodecparsers_@GST_API_VERSION@_la-gstjpeg2000sampling.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) $(libgstcodecparsers_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstcodecparsers_@GST_API_VERSION@_la-gstjpeg2000sampling.lo `test -f 'gstjpeg2000sampling.c' || echo '$(srcdir)/'`gstjpeg2000sampling.c
+
libgstcodecparsers_@GST_API_VERSION@_la-gstvp9parser.lo: gstvp9parser.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) $(libgstcodecparsers_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstcodecparsers_@GST_API_VERSION@_la-gstvp9parser.lo -MD -MP -MF $(DEPDIR)/libgstcodecparsers_@GST_API_VERSION@_la-gstvp9parser.Tpo -c -o libgstcodecparsers_@GST_API_VERSION@_la-gstvp9parser.lo `test -f 'gstvp9parser.c' || echo '$(srcdir)/'`gstvp9parser.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcodecparsers_@GST_API_VERSION@_la-gstvp9parser.Tpo $(DEPDIR)/libgstcodecparsers_@GST_API_VERSION@_la-gstvp9parser.Plo
diff --git a/gst-libs/gst/codecparsers/gsth264parser.c b/gst-libs/gst/codecparsers/gsth264parser.c
index 925d95a..bc84416 100644
--- a/gst-libs/gst/codecparsers/gsth264parser.c
+++ b/gst-libs/gst/codecparsers/gsth264parser.c
@@ -1498,7 +1498,6 @@
gint width, height;
guint subwc[] = { 1, 2, 2, 1 };
guint subhc[] = { 1, 2, 1, 1 };
- GstH264VUIParams *vui = NULL;
memset (sps, 0, sizeof (*sps));
@@ -1592,7 +1591,6 @@
if (sps->vui_parameters_present_flag && parse_vui_params) {
if (!gst_h264_parse_vui_parameters (sps, nr))
goto error;
- vui = &sps->vui_parameters;
}
/* calculate ChromaArrayType */
@@ -1631,26 +1629,10 @@
GST_LOG ("crop_rectangle x=%u y=%u width=%u, height=%u", sps->crop_rect_x,
sps->crop_rect_y, width, height);
}
- sps->fps_num = 0;
- sps->fps_den = 1;
- if (vui && vui->timing_info_present_flag) {
- /* derive framerate */
- /* FIXME verify / also handle other cases */
- GST_LOG ("Framerate: %u %u %u %u", parse_vui_params,
- vui->fixed_frame_rate_flag, sps->frame_mbs_only_flag,
- vui->pic_struct_present_flag);
+ sps->fps_num_removed = 0;
+ sps->fps_den_removed = 1;
- if (parse_vui_params && vui->fixed_frame_rate_flag) {
- sps->fps_num = vui->time_scale;
- sps->fps_den = vui->num_units_in_tick;
- /* picture is a frame = 2 fields */
- sps->fps_den *= 2;
- GST_LOG ("framerate %d/%d", sps->fps_num, sps->fps_den);
- }
- } else {
- GST_LOG ("No VUI, unknown framerate");
- }
return TRUE;
error:
diff --git a/gst-libs/gst/codecparsers/gsth264parser.h b/gst-libs/gst/codecparsers/gsth264parser.h
index be5194f..56d8720 100644
--- a/gst-libs/gst/codecparsers/gsth264parser.h
+++ b/gst-libs/gst/codecparsers/gsth264parser.h
@@ -437,7 +437,7 @@
* @aspect_ratio_idc specifies the value of the sample aspect ratio of the luma samples
* @sar_width indicates the horizontal size of the sample aspect ratio
* @sar_height indicates the vertical size of the sample aspect ratio
- * @overscan_info_present_flag: %TRUE overscan_appropriate_flag is present %FALSE otherwize
+ * @overscan_info_present_flag: %TRUE overscan_appropriate_flag is present %FALSE otherwise
* @overscan_appropriate_flag: %TRUE indicates that the cropped decoded pictures
* output are suitable for display using overscan. %FALSE the cropped decoded pictures
* output contain visually important information
@@ -451,7 +451,7 @@
* @transfer_characteristics: indicates the opto-electronic transfer characteristic
* @matrix_coefficients: describes the matrix coefficients used in deriving luma and chroma signals
* @chroma_loc_info_present_flag: %TRUE specifies that chroma_sample_loc_type_top_field and
- * chroma_sample_loc_type_bottom_field are present, %FALSE otherwize
+ * chroma_sample_loc_type_bottom_field are present, %FALSE otherwise
* @chroma_sample_loc_type_top_field: specify the location of chroma for top field
* @chroma_sample_loc_type_bottom_field specify the location of chroma for bottom field
* @timing_info_present_flag: %TRUE specifies that num_units_in_tick,
@@ -460,7 +460,7 @@
* time_scale: is the number of time units that pass in one second
* @fixed_frame_rate_flag: %TRUE indicates that the temporal distance between the HRD output times
* of any two consecutive pictures in output order is constrained as specified in the spec, %FALSE
- * otherwize.
+ * otherwise.
* @nal_hrd_parameters_present_flag: %TRUE if nal hrd parameters present in the bitstream
* @vcl_hrd_parameters_present_flag: %TRUE if nal vlc hrd parameters present in the bitstream
* @low_delay_hrd_flag: specifies the HRD operational mode
@@ -710,7 +710,7 @@
gint width, height;
gint crop_rect_width, crop_rect_height;
gint crop_rect_x, crop_rect_y;
- gint fps_num, fps_den;
+ gint fps_num_removed, fps_den_removed; /* FIXME: remove */
gboolean valid;
/* Subset SPS extensions */
diff --git a/gst-libs/gst/codecparsers/gsth265parser.h b/gst-libs/gst/codecparsers/gsth265parser.h
index 80cc270..4ec91fa 100644
--- a/gst-libs/gst/codecparsers/gsth265parser.h
+++ b/gst-libs/gst/codecparsers/gsth265parser.h
@@ -535,7 +535,7 @@
* @aspect_ratio_idc specifies the value of the sample aspect ratio of the luma samples
* @sar_width indicates the horizontal size of the sample aspect ratio
* @sar_height indicates the vertical size of the sample aspect ratio
- * @overscan_info_present_flag: %TRUE overscan_appropriate_flag is present %FALSE otherwize
+ * @overscan_info_present_flag: %TRUE overscan_appropriate_flag is present %FALSE otherwise
* @overscan_appropriate_flag: %TRUE indicates that the cropped decoded pictures
* output are suitable for display using overscan. %FALSE the cropped decoded pictures
* output contain visually important information
@@ -549,7 +549,7 @@
* @transfer_characteristics: indicates the opto-electronic transfer characteristic
* @matrix_coefficients: describes the matrix coefficients used in deriving luma and chroma signals
* @chroma_loc_info_present_flag: %TRUE specifies that chroma_sample_loc_type_top_field and
- * chroma_sample_loc_type_bottom_field are present, %FALSE otherwize
+ * chroma_sample_loc_type_bottom_field are present, %FALSE otherwise
* @chroma_sample_loc_type_top_field: specify the location of chroma for top field
* @chroma_sample_loc_type_bottom_field specify the location of chroma for bottom field
* @neutral_chroma_indication_flag: %TRUE indicate that the value of chroma samples is equla
diff --git a/gst-libs/gst/codecparsers/gstjpeg2000sampling.c b/gst-libs/gst/codecparsers/gstjpeg2000sampling.c
new file mode 100644
index 0000000..dba1c50
--- /dev/null
+++ b/gst-libs/gst/codecparsers/gstjpeg2000sampling.c
@@ -0,0 +1,126 @@
+/* GStreamer JPEG 2000 Sampling
+ * Copyright (C) <2016> Grok Image Compression Inc.
+ * @author Aaron Boxer <boxerab@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:gstjpeg2000sampling
+ * @short_description: Manage JPEG 2000 sampling and colorspace fields
+ *
+ */
+
+#include "gstjpeg2000sampling.h"
+
+/* string values corresponding to GstJPEG2000Sampling enums */
+static const gchar *gst_jpeg2000_sampling_strings[] = {
+ "RGB",
+ "BGR",
+ "RGBA",
+ "BGRA",
+ "YCbCr-4:4:4",
+ "YCbCr-4:2:2",
+ "YCbCr-4:2:0",
+ "YCbCr-4:1:0",
+ "GRAYSCALE",
+ "YCbCrA-4:4:4:4",
+};
+
+/* convert string to GstJPEG2000Sampling enum */
+GstJPEG2000Sampling
+gst_jpeg2000_sampling_from_string (const gchar * sampling_string)
+{
+ GstJPEG2000Sampling i;
+ g_return_val_if_fail (sampling_string != NULL, GST_JPEG2000_SAMPLING_NONE);
+ for (i = 0; i < G_N_ELEMENTS (gst_jpeg2000_sampling_strings); ++i) {
+ if (!g_strcmp0 (sampling_string, gst_jpeg2000_sampling_strings[i]))
+ return (i + 1);
+ }
+ return GST_JPEG2000_SAMPLING_NONE;
+
+
+}
+
+/* convert GstJPEG2000Sampling enum to string */
+const gchar *
+gst_jpeg2000_sampling_to_string (GstJPEG2000Sampling sampling)
+{
+ g_return_val_if_fail (sampling > 0
+ && sampling <= G_N_ELEMENTS (gst_jpeg2000_sampling_strings), NULL);
+ return gst_jpeg2000_sampling_strings[sampling - 1];
+}
+
+/* check if @sampling is in RGB color space */
+gboolean
+gst_jpeg2000_sampling_is_rgb (GstJPEG2000Sampling sampling)
+{
+ return sampling == GST_JPEG2000_SAMPLING_RGB ||
+ sampling == GST_JPEG2000_SAMPLING_RGBA ||
+ sampling == GST_JPEG2000_SAMPLING_BGR
+ || sampling == GST_JPEG2000_SAMPLING_BGRA;
+}
+
+/* check if @sampling is in YUV color space */
+gboolean
+gst_jpeg2000_sampling_is_yuv (GstJPEG2000Sampling sampling)
+{
+ return sampling == GST_JPEG2000_SAMPLING_YBRA4444_EXT ||
+ sampling == GST_JPEG2000_SAMPLING_YBR444 ||
+ sampling == GST_JPEG2000_SAMPLING_YBR422 ||
+ sampling == GST_JPEG2000_SAMPLING_YBR420
+ || sampling == GST_JPEG2000_SAMPLING_YBR410;
+}
+
+/* check if @sampling is in GRAYSCALE color space */
+gboolean
+gst_jpeg2000_sampling_is_mono (GstJPEG2000Sampling sampling)
+{
+ return sampling == GST_JPEG2000_SAMPLING_GRAYSCALE;
+}
+
+/* string values corresponding to GstJPEG2000Colorspace enums */
+static const gchar *gst_jpeg2000_colorspace_strings[] = {
+ "sRGB",
+ "sYUV",
+ "GRAY",
+};
+
+/* convert GstJPEG2000Colorspace enum to string */
+GstJPEG2000Colorspace
+gst_jpeg2000_colorspace_from_string (const gchar * colorspace_string)
+{
+ GstJPEG2000Colorspace i;
+
+ g_return_val_if_fail (colorspace_string != NULL,
+ GST_JPEG2000_COLORSPACE_NONE);
+
+ for (i = 0; i < G_N_ELEMENTS (gst_jpeg2000_colorspace_strings); ++i) {
+ if (!g_strcmp0 (colorspace_string, gst_jpeg2000_colorspace_strings[i]))
+ return (i + 1);
+ }
+ return GST_JPEG2000_COLORSPACE_NONE;
+}
+
+/* convert string to GstJPEG2000Colorspace enum */
+const gchar *
+gst_jpeg2000_colorspace_to_string (GstJPEG2000Colorspace colorspace)
+{
+ g_return_val_if_fail (colorspace > GST_JPEG2000_COLORSPACE_NONE
+ && colorspace <= G_N_ELEMENTS (gst_jpeg2000_colorspace_strings), NULL);
+
+ return gst_jpeg2000_colorspace_strings[colorspace - 1];
+}
diff --git a/gst-libs/gst/codecparsers/gstjpeg2000sampling.h b/gst-libs/gst/codecparsers/gstjpeg2000sampling.h
new file mode 100644
index 0000000..fb6a0aa
--- /dev/null
+++ b/gst-libs/gst/codecparsers/gstjpeg2000sampling.h
@@ -0,0 +1,92 @@
+/* GStreamer JPEG 2000 Sampling
+ * Copyright (C) <2016> Grok Image Compression Inc.
+ * @author Aaron Boxer <boxerab@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_JPEG2000_SAMPLING_H__
+#define __GST_JPEG2000_SAMPLING_H__
+
+#include <gst/gst.h>
+
+/**
+ * GstJPEG2000Sampling:
+ * Sampling values from RF 5371 for JPEG 2000 over RTP : https://datatracker.ietf.org/doc/rfc5371/C
+ * Note: sampling extensions that are not listed in the RFC are signified by an _EXT at the end of the enum
+ *
+ * @GST_JPEG2000_SAMPLING_NONE: no sampling
+ * @GST_JPEG2000_SAMPLING_RGB: standard Red, Green, Blue color space.
+ * @GST_JPEG2000_SAMPLING_BGR: standard Blue, Green, Red color space.
+ * @GST_JPEG2000_SAMPLING_RGBA: standard Red, Green, Blue, Alpha color space.
+ * @GST_JPEG2000_SAMPLING_BGRA: standard Blue, Green, Red, Alpha color space.
+ * @GST_JPEG2000_SAMPLING_YCbCr-4:4:4: standard YCbCr color space; no subsampling.
+ * @GST_JPEG2000_SAMPLING_YCbCr-4:2:2: standard YCbCr color space; Cb and Cr are subsampled horizontally by 1/2.
+ * @GST_JPEG2000_SAMPLING_YCbCr-4:2:0: standard YCbCr color space; Cb and Cr are subsampled horizontally and vertically by 1/2.
+ * @GST_JPEG2000_SAMPLING_YCbCr-4:1:1: standard YCbCr color space; Cb and Cr are subsampled vertically by 1/4.
+ * @GST_JPEG2000_SAMPLING_GRAYSCALE: basically, a single component image of just multilevels of grey.
+ * @GST_JPEG2000_SAMPLING_YBRA4444_EXT: standard YCbCr color space, alpha channel, no subsampling,
+ */
+typedef enum
+{
+ GST_JPEG2000_SAMPLING_NONE,
+ GST_JPEG2000_SAMPLING_RGB,
+ GST_JPEG2000_SAMPLING_BGR,
+ GST_JPEG2000_SAMPLING_RGBA,
+ GST_JPEG2000_SAMPLING_BGRA,
+ GST_JPEG2000_SAMPLING_YBR444,
+ GST_JPEG2000_SAMPLING_YBR422,
+ GST_JPEG2000_SAMPLING_YBR420,
+ GST_JPEG2000_SAMPLING_YBR410,
+ GST_JPEG2000_SAMPLING_GRAYSCALE,
+ GST_JPEG2000_SAMPLING_YBRA4444_EXT
+} GstJPEG2000Sampling;
+
+/* GST_JPEG2000_SAMPLING_LIST: sampling strings in list form, for use in caps */
+#define GST_JPEG2000_SAMPLING_LIST "sampling = (string) {\"RGB\", \"BGR\", \"RGBA\", \"BGRA\", \"YCbCr-4:4:4\", \"YCbCr-4:2:2\", \"YCbCr-4:2:0\", \"YCbCr-4:1:1\", \"GRAYSCALE\" , \"YCbCrA-4:4:4:4\"}"
+
+const gchar *gst_jpeg2000_sampling_to_string (GstJPEG2000Sampling sampling);
+GstJPEG2000Sampling gst_jpeg2000_sampling_from_string (const gchar *
+ sampling_string);
+gboolean gst_jpeg2000_sampling_is_rgb (GstJPEG2000Sampling sampling);
+gboolean gst_jpeg2000_sampling_is_yuv (GstJPEG2000Sampling sampling);
+gboolean gst_jpeg2000_sampling_is_mono (GstJPEG2000Sampling sampling);
+
+
+/**
+ * GstJPEG2000Colorspace:
+ * @GST_JPEG2000_COLORSPACE_NONE: no color space
+ * @GST_JPEG2000_COLORSPACE_RGB: standard RGB color space
+ * @GST_JPEG2000_COLORSPACE_YUV: standard YUV color space
+ * @GST_JPEG2000_COLORSPACE_GRAY: monochrome color space
+ */
+typedef enum
+{
+ GST_JPEG2000_COLORSPACE_NONE,
+ GST_JPEG2000_COLORSPACE_RGB,
+ GST_JPEG2000_COLORSPACE_YUV,
+ GST_JPEG2000_COLORSPACE_GRAY
+} GstJPEG2000Colorspace;
+
+const gchar *gst_jpeg2000_colorspace_to_string (GstJPEG2000Colorspace
+ colorspace);
+GstJPEG2000Colorspace gst_jpeg2000_colorspace_from_string (const gchar *
+ colorspace_string);
+
+/* GST_JPEG2000_COLORSPACE_LIST: color space strings in list form, for use in caps */
+#define GST_JPEG2000_COLORSPACE_LIST "colorspace = (string) { \"sRGB\", \"sYUV\", \"GRAY\" }"
+
+#endif
diff --git a/gst-libs/gst/codecparsers/gstmpeg4parser.c b/gst-libs/gst/codecparsers/gstmpeg4parser.c
index b23fc87..b455764 100644
--- a/gst-libs/gst/codecparsers/gstmpeg4parser.c
+++ b/gst-libs/gst/codecparsers/gstmpeg4parser.c
@@ -411,7 +411,7 @@
/**
* gst_mpeg4_parse:
* @packet: The #GstMpeg4Packet to fill
- * @skip_user_data: %TRUE to skip user data packet %FALSE otherwize
+ * @skip_user_data: %TRUE to skip user data packet %FALSE otherwise
* @vop: The last parsed #GstMpeg4VideoObjectPlane or %NULL if you do
* not need to detect the resync codes.
* @offset: offset from which to start the parsing
diff --git a/gst-libs/gst/codecparsers/gstmpegvideometa.c b/gst-libs/gst/codecparsers/gstmpegvideometa.c
index f7b2f87..d5d5f0a 100644
--- a/gst-libs/gst/codecparsers/gstmpegvideometa.c
+++ b/gst-libs/gst/codecparsers/gstmpegvideometa.c
@@ -37,6 +37,7 @@
mpeg_video_meta->pichdr = NULL;
mpeg_video_meta->picext = NULL;
mpeg_video_meta->quantext = NULL;
+ mpeg_video_meta->num_slices = mpeg_video_meta->slice_offset = 0;
return TRUE;
}
diff --git a/gst-libs/gst/codecparsers/gstmpegvideoparser.c b/gst-libs/gst/codecparsers/gstmpegvideoparser.c
index debafa0..2cfd32a 100644
--- a/gst-libs/gst/codecparsers/gstmpegvideoparser.c
+++ b/gst-libs/gst/codecparsers/gstmpegvideoparser.c
@@ -286,7 +286,7 @@
* Parses the @seqhdr MPEG Video Sequence Header structure members
* from video @packet
*
- * Returns: %TRUE if the seqhdr could be parsed correctly, %FALSE otherwize.
+ * Returns: %TRUE if the seqhdr could be parsed correctly, %FALSE otherwise.
*
* Since: 1.2
*/
@@ -296,7 +296,6 @@
{
GstBitReader br;
guint8 bits;
- guint8 load_intra_flag, load_non_intra_flag;
g_return_val_if_fail (seqhdr != NULL, FALSE);
@@ -339,8 +338,8 @@
READ_UINT8 (&br, seqhdr->constrained_parameters_flag, 1);
/* load_intra_quantiser_matrix */
- READ_UINT8 (&br, load_intra_flag, 1);
- if (load_intra_flag) {
+ READ_UINT8 (&br, seqhdr->load_intra_quantiser_matrix, 1);
+ if (seqhdr->load_intra_quantiser_matrix) {
gint i;
for (i = 0; i < 64; i++)
READ_UINT8 (&br, seqhdr->intra_quantizer_matrix[i], 8);
@@ -348,8 +347,8 @@
memcpy (seqhdr->intra_quantizer_matrix, default_intra_quantizer_matrix, 64);
/* non intra quantizer matrix */
- READ_UINT8 (&br, load_non_intra_flag, 1);
- if (load_non_intra_flag) {
+ READ_UINT8 (&br, seqhdr->load_non_intra_quantiser_matrix, 1);
+ if (seqhdr->load_non_intra_quantiser_matrix) {
gint i;
for (i = 0; i < 64; i++)
READ_UINT8 (&br, seqhdr->non_intra_quantizer_matrix[i], 8);
@@ -382,7 +381,7 @@
* Parses the @seqext MPEG Video Sequence Extension structure members
* from video @packet
*
- * Returns: %TRUE if the seqext could be parsed correctly, %FALSE otherwize.
+ * Returns: %TRUE if the seqext could be parsed correctly, %FALSE otherwise.
*
* Since: 1.2
*/
@@ -449,7 +448,7 @@
* Parses the @seqext MPEG Video Sequence Display Extension structure
* members from video @packet
*
- * Returns: %TRUE if the seqext could be parsed correctly, %FALSE otherwize.
+ * Returns: %TRUE if the seqext could be parsed correctly, %FALSE otherwise.
*
* Since: 1.2
*/
@@ -511,7 +510,7 @@
* Parses the @seqscaleext MPEG Video Sequence Scalable Extension structure
* members from video @packet
*
- * Returns: %TRUE if the seqext could be parsed correctly, %FALSE otherwize.
+ * Returns: %TRUE if the seqext could be parsed correctly, %FALSE otherwise.
*
* Since: 1.2
*/
@@ -633,7 +632,7 @@
* structure members from video @packet
*
* Returns: %TRUE if the quant matrix extension could be parsed correctly,
- * %FALSE otherwize.
+ * %FALSE otherwise.
*
* Since: 1.2
*/
@@ -703,7 +702,7 @@
* video @packet
*
* Returns: %TRUE if the picture extension could be parsed correctly,
- * %FALSE otherwize.
+ * %FALSE otherwise.
*
* Since: 1.2
*/
@@ -803,7 +802,7 @@
* from video @packet
*
* Returns: %TRUE if the picture sequence could be parsed correctly, %FALSE
- * otherwize.
+ * otherwise.
*
* Since: 1.2
*/
@@ -831,8 +830,8 @@
if (hdr->pic_type == 0 || hdr->pic_type > 4)
goto bad_pic_type; /* Corrupted picture packet */
- /* skip VBV delay */
- if (!gst_bit_reader_skip (&br, 16))
+ /* VBV delay */
+ if (!gst_bit_reader_get_bits_uint16 (&br, &hdr->vbv_delay, 16))
goto failed;
if (hdr->pic_type == GST_MPEG_VIDEO_PICTURE_TYPE_P
@@ -880,7 +879,7 @@
* Parses the @gop MPEG Video Group of Picture structure members from
* video @packet
*
- * Returns: %TRUE if the gop could be parsed correctly, %FALSE otherwize.
+ * Returns: %TRUE if the gop could be parsed correctly, %FALSE otherwise.
*
* Since: 1.2
*/
@@ -931,7 +930,7 @@
*
* Parses the @GstMpegVideoSliceHdr structure members from @data
*
- * Returns: %TRUE if the slice could be parsed correctly, %FALSE otherwize.
+ * Returns: %TRUE if the slice could be parsed correctly, %FALSE otherwise.
*
* Since: 1.2
*/
@@ -964,6 +963,9 @@
if (height > 2800)
READ_UINT8 (&br, vertical_position_extension, 3);
+ slice_hdr->vertical_position = packet->type;
+ slice_hdr->vertical_position_ext = vertical_position_extension;
+
if (seqscaleext)
if (seqscaleext->scalable_mode ==
GST_MPEG_VIDEO_SEQ_SCALABLE_MODE_DATA_PARTITIONING)
@@ -971,12 +973,12 @@
READ_UINT8 (&br, slice_hdr->quantiser_scale_code, 5);
- READ_UINT8 (&br, extra_bits, 1);
- if (!extra_bits)
+ READ_UINT8 (&br, slice_hdr->slice_ext_flag, 1);
+ if (!slice_hdr->slice_ext_flag)
slice_hdr->intra_slice = 0;
else {
READ_UINT8 (&br, slice_hdr->intra_slice, 1);
- SKIP (&br, 1);
+ READ_UINT8 (&br, slice_hdr->slice_picture_id_enable, 1);
READ_UINT8 (&br, slice_hdr->slice_picture_id, 6);
READ_UINT8 (&br, bits, 1);
@@ -1072,7 +1074,7 @@
*
* Parses the @seqhdr Mpeg Video Sequence Header structure members from @data
*
- * Returns: %TRUE if the seqhdr could be parsed correctly, %FALSE otherwize.
+ * Returns: %TRUE if the seqhdr could be parsed correctly, %FALSE otherwise.
*
* Deprecated: Use gst_mpeg_video_packet_parse_sequence_header() instead.
*/
@@ -1105,7 +1107,7 @@
*
* Parses the @seqext Mpeg Video Sequence Extension structure members from @data
*
- * Returns: %TRUE if the seqext could be parsed correctly, %FALSE otherwize.
+ * Returns: %TRUE if the seqext could be parsed correctly, %FALSE otherwise.
*
* Deprecated: Use gst_mpeg_video_packet_parse_sequence_extension() instead.
*/
@@ -1161,7 +1163,7 @@
* @data
*
* Returns: %TRUE if the quant matrix extension could be parsed correctly,
- * %FALSE otherwize.
+ * %FALSE otherwise.
*
* Deprecated: Use gst_mpeg_video_packet_parse_quant_matrix_extension() instead.
*/
@@ -1195,7 +1197,7 @@
* Parsers the @hdr Mpeg Video Picture Header structure members from @data
*
* Returns: %TRUE if the picture sequence could be parsed correctly, %FALSE
- * otherwize.
+ * otherwise.
*
* Deprecated: Use gst_mpeg_video_packet_parse_picture_header() instead.
*/
@@ -1229,7 +1231,7 @@
* Parse the @ext Mpeg Video Picture Extension structure members from @data
*
* Returns: %TRUE if the picture extension could be parsed correctly,
- * %FALSE otherwize.
+ * %FALSE otherwise.
*
* Deprecated: Use gst_mpeg_video_packet_parse_picture_extension() instead.
*/
@@ -1262,7 +1264,7 @@
*
* Parses the @gop Mpeg Video Group of Picture structure members from @data
*
- * Returns: %TRUE if the gop could be parsed correctly, %FALSE otherwize.
+ * Returns: %TRUE if the gop could be parsed correctly, %FALSE otherwise.
*
* Deprecated: Use gst_mpeg_video_packet_parse_gop() instead.
*/
diff --git a/gst-libs/gst/codecparsers/gstmpegvideoparser.h b/gst-libs/gst/codecparsers/gstmpegvideoparser.h
index 1298ed7..3989f0c 100644
--- a/gst-libs/gst/codecparsers/gstmpegvideoparser.h
+++ b/gst-libs/gst/codecparsers/gstmpegvideoparser.h
@@ -211,7 +211,9 @@
* @bitrate_value: Value of the bitrate as is in the stream (400bps unit)
* @bitrate: the real bitrate of the Mpeg video stream in bits per second, 0 if VBR stream
* @constrained_parameters_flag: %TRUE if this stream uses contrained parameters.
+ * @load_intra_quantiser_matrix: %TRUE indicates the presence of intra_quantiser_matrix
* @intra_quantizer_matrix: intra-quantization table, in zigzag scan order
+ * @load_non_intra_quantiser_matrix: %TRUE indicates the presence of non_intra_quantiser_matrix
* @non_intra_quantizer_matrix: non-intra quantization table, in zigzag scan order
*
* The Mpeg2 Video Sequence Header structure.
@@ -226,7 +228,9 @@
guint8 constrained_parameters_flag;
+ guint8 load_intra_quantiser_matrix;
guint8 intra_quantizer_matrix[64];
+ guint8 load_non_intra_quantiser_matrix;
guint8 non_intra_quantizer_matrix[64];
/* Calculated values */
@@ -376,6 +380,7 @@
{
guint16 tsn;
guint8 pic_type;
+ guint16 vbv_delay;
guint8 full_pel_forward_vector, full_pel_backward_vector;
@@ -394,7 +399,7 @@
* @alternate_scan: Alternate Scan
* @repeat_first_field: Repeat First Field
* @chroma_420_type: Chroma 420 Type
- * @progressive_frame: %TRUE if the frame is progressive %FALSE otherwize
+ * @progressive_frame: %TRUE if the frame is progressive %FALSE otherwise
*
* The Mpeg2 Video Picture Extension structure.
*/
@@ -445,10 +450,13 @@
/**
* GstMpegVideoSliceHdr:
- * @slice_vertical_position_extension: Extension to slice_vertical_position
+ * @vertical_position: slice vertical position
+ * @vertical_position_extension: Extension to slice_vertical_position
* @priority_breakpoint: Point where the bitstream shall be partitioned
* @quantiser_scale_code: Quantiser value (range: 1-31)
+ * @slice_ext_flag: Slice Extension flag
* @intra_slice: Equal to one if all the macroblocks are intra macro blocks.
+ * @slice_picture_id_enable: controls the semantics of slice_picture_id
* @slice_picture_id: Intended to aid recovery on severe bursts of
* errors for certain types of applications
*
@@ -458,9 +466,14 @@
*/
struct _GstMpegVideoSliceHdr
{
+ guint8 vertical_position;
+ guint8 vertical_position_ext;
+
guint8 priority_breakpoint;
guint8 quantiser_scale_code;
+ guint8 slice_ext_flag;
guint8 intra_slice;
+ guint8 slice_picture_id_enable;
guint8 slice_picture_id;
/* Calculated values */
diff --git a/gst-libs/gst/codecparsers/gstvc1parser.c b/gst-libs/gst/codecparsers/gstvc1parser.c
index fd16ee0..7ed73f8 100644
--- a/gst-libs/gst/codecparsers/gstvc1parser.c
+++ b/gst-libs/gst/codecparsers/gstvc1parser.c
@@ -2197,7 +2197,7 @@
* in simple or main mode, or after #gst_vc1_parse_entry_point_header
* if in advanced mode.
*
- * Returns: %TRUE if everything went fine, %FALSE otherwize
+ * Returns: %TRUE if everything went fine, %FALSE otherwise
*/
gboolean
gst_vc1_bitplanes_ensure_size (GstVC1BitPlanes * bitplanes,
diff --git a/gst-libs/gst/codecparsers/gstvp9parser.c b/gst-libs/gst/codecparsers/gstvp9parser.c
index e518dee..0bd05bc 100644
--- a/gst-libs/gst/codecparsers/gstvp9parser.c
+++ b/gst-libs/gst/codecparsers/gstvp9parser.c
@@ -103,26 +103,26 @@
}
static gboolean
-parse_bitdepth_colorspace_sampling (GstBitReader * const br,
- GstVp9FrameHdr * frame_hdr)
+parse_bitdepth_colorspace_sampling (GstVp9Parser * parser,
+ GstBitReader * const br, GstVp9FrameHdr * frame_hdr)
{
if (frame_hdr->profile > GST_VP9_PROFILE_1)
- frame_hdr->bit_depth =
+ parser->bit_depth =
gst_vp9_read_bit (br) ? GST_VP9_BIT_DEPTH_12 : GST_VP9_BIT_DEPTH_10;
else
- frame_hdr->bit_depth = GST_VP9_BIT_DEPTH_8;
+ parser->bit_depth = GST_VP9_BIT_DEPTH_8;
- frame_hdr->color_space = gst_vp9_read_bits (br, 3);
- if (frame_hdr->color_space != GST_VP9_CS_SRGB) {
- frame_hdr->color_range = gst_vp9_read_bit (br);
+ parser->color_space = gst_vp9_read_bits (br, 3);
+ if (parser->color_space != GST_VP9_CS_SRGB) {
+ parser->color_range = gst_vp9_read_bit (br);
if (frame_hdr->profile == GST_VP9_PROFILE_1
|| frame_hdr->profile == GST_VP9_PROFILE_3) {
- frame_hdr->subsampling_x = gst_vp9_read_bit (br);
- frame_hdr->subsampling_y = gst_vp9_read_bit (br);
+ parser->subsampling_x = gst_vp9_read_bit (br);
+ parser->subsampling_y = gst_vp9_read_bit (br);
- if (frame_hdr->subsampling_x == 1 && frame_hdr->subsampling_y == 1) {
+ if (parser->subsampling_x == 1 && parser->subsampling_y == 1) {
GST_ERROR
("4:2:0 subsampling is not supported in profile_1 or profile_3");
goto error;
@@ -133,10 +133,10 @@
goto error;
}
} else {
- frame_hdr->subsampling_y = frame_hdr->subsampling_x = 1;
+ parser->subsampling_y = parser->subsampling_x = 1;
}
} else {
- frame_hdr->color_range = GST_VP9_CR_FULL;
+ parser->color_range = GST_VP9_CR_FULL;
if (frame_hdr->profile == GST_VP9_PROFILE_1
|| frame_hdr->profile == GST_VP9_PROFILE_3) {
@@ -481,12 +481,12 @@
const GstVp9SegmentationInfoData *info = priv->segmentation + i;
seg->luma_dc_quant_scale =
- gst_vp9_dc_quant (q, quant_indices->y_dc_delta, frame_hdr->bit_depth);
- seg->luma_ac_quant_scale = gst_vp9_ac_quant (q, 0, frame_hdr->bit_depth);
+ gst_vp9_dc_quant (q, quant_indices->y_dc_delta, parser->bit_depth);
+ seg->luma_ac_quant_scale = gst_vp9_ac_quant (q, 0, parser->bit_depth);
seg->chroma_dc_quant_scale =
- gst_vp9_dc_quant (q, quant_indices->uv_dc_delta, frame_hdr->bit_depth);
+ gst_vp9_dc_quant (q, quant_indices->uv_dc_delta, parser->bit_depth);
seg->chroma_ac_quant_scale =
- gst_vp9_ac_quant (q, quant_indices->uv_ac_delta, frame_hdr->bit_depth);
+ gst_vp9_ac_quant (q, quant_indices->uv_ac_delta, parser->bit_depth);
if (lf->filter_level) {
guint8 filter = seg_get_filter_level (parser, frame_hdr, i);
@@ -578,13 +578,17 @@
}
static void
-gst_vp9_parser_init (GstVp9Parser * parser)
+gst_vp9_parser_reset (GstVp9Parser * parser)
{
GstVp9ParserPrivate *priv = parser->priv;
- memset (parser, 0, sizeof (GstVp9Parser));
- memset (priv, 0, sizeof (GstVp9ParserPrivate));
+ parser->priv = NULL;
+ memset (parser->mb_segment_tree_probs, 0,
+ sizeof (parser->mb_segment_tree_probs));
+ memset (parser->segment_pred_probs, 0, sizeof (parser->segment_pred_probs));
+ memset (parser->segmentation, 0, sizeof (parser->segmentation));
+ memset (priv, 0, sizeof (GstVp9ParserPrivate));
parser->priv = priv;
}
@@ -592,7 +596,7 @@
gst_vp9_parser_update (GstVp9Parser * parser, GstVp9FrameHdr * const frame_hdr)
{
if (frame_hdr->frame_type == GST_VP9_KEY_FRAME)
- gst_vp9_parser_init (parser);
+ gst_vp9_parser_reset (parser);
if (frame_is_intra_only (frame_hdr) || frame_hdr->error_resilient_mode)
setup_past_independence (parser, frame_hdr);
@@ -626,16 +630,15 @@
INITIALIZE_DEBUG_CATEGORY;
GST_DEBUG ("Create VP9 Parser");
- parser = g_slice_new (GstVp9Parser);
+ parser = g_slice_new0 (GstVp9Parser);
if (!parser)
return NULL;
- priv = g_slice_new (GstVp9ParserPrivate);
+ priv = g_slice_new0 (GstVp9ParserPrivate);
if (!priv)
return NULL;
parser->priv = priv;
- gst_vp9_parser_init (parser);
return parser;
}
@@ -712,7 +715,7 @@
goto error;
}
- if (!parse_bitdepth_colorspace_sampling (br, frame_hdr)) {
+ if (!parse_bitdepth_colorspace_sampling (parser, br, frame_hdr)) {
GST_ERROR ("Failed to parse color_space/bit_depth info !");
goto error;
}
@@ -734,15 +737,15 @@
}
if (frame_hdr->profile > GST_VP9_PROFILE_0) {
- if (!parse_bitdepth_colorspace_sampling (br, frame_hdr)) {
+ if (!parse_bitdepth_colorspace_sampling (parser, br, frame_hdr)) {
GST_ERROR ("Failed to parse color_space/bit_depth info !");
goto error;
}
} else {
- frame_hdr->color_space = GST_VP9_CS_BT_601;
- frame_hdr->color_range = GST_VP9_CR_LIMITED;
- frame_hdr->subsampling_y = frame_hdr->subsampling_x = 1;
- frame_hdr->bit_depth = GST_VP9_BIT_DEPTH_8;
+ parser->color_space = GST_VP9_CS_BT_601;
+ parser->color_range = GST_VP9_CR_LIMITED;
+ parser->subsampling_y = parser->subsampling_x = 1;
+ parser->bit_depth = GST_VP9_BIT_DEPTH_8;
}
frame_hdr->refresh_frame_flags =
@@ -766,12 +769,6 @@
frame_hdr->allow_high_precision_mv = gst_vp9_read_bit (br);
frame_hdr->mcomp_filter_type = parse_interp_filter (br);
-
- /* Assing defalut values */
- frame_hdr->color_space = GST_VP9_CS_BT_601;
- frame_hdr->color_range = GST_VP9_CR_LIMITED;
- frame_hdr->subsampling_y = frame_hdr->subsampling_x = 1;
- frame_hdr->bit_depth = GST_VP9_BIT_DEPTH_8;
}
}
@@ -811,7 +808,6 @@
frame_hdr->frame_header_length_in_bytes =
(gst_bit_reader_get_pos (br) + 7) / 8;
-
return gst_vp9_parser_update (parser, frame_hdr);
error:
diff --git a/gst-libs/gst/codecparsers/gstvp9parser.h b/gst-libs/gst/codecparsers/gstvp9parser.h
index fd45e54..aaf30e5 100644
--- a/gst-libs/gst/codecparsers/gstvp9parser.h
+++ b/gst-libs/gst/codecparsers/gstvp9parser.h
@@ -350,17 +350,12 @@
* @frame_type: frame type
* @show_frame: indicate whether it is a displayable frame or not
* @error_resilient_mode: error resilent mode
- * @subsampling_x: horizontal subsampling
- * @subsampling_y: vertical subsampling
* @width: frame width
* @height: frame height
* @display_size_enabled: display size enabled (cropping)
* @display_width: display width
* @display_height: display height
* @frame_context_idx: frame context index
- * @bit_depth: bit depth of the stream
- * @color_space: color space standard
- * @color_range: color range standard
* @intra_only: intra only frame
* @reset_frame_context: reset frame context
* @refresh_frame_flags: refresh reference frame flags
@@ -391,8 +386,6 @@
guint frame_type;
guint8 show_frame;
guint8 error_resilient_mode;
- gint subsampling_x;
- gint subsampling_y;
guint32 width;
guint32 height;
guint8 display_size_enabled;
@@ -400,10 +393,6 @@
guint32 display_height;
guint frame_context_idx;
- guint bit_depth;
- guint color_space;
- guint color_range;
-
guint8 intra_only;
gint reset_frame_context;
gint refresh_frame_flags;
@@ -464,6 +453,11 @@
/**
* GstVp9Parser:
* @priv: GstVp9ParserPrivate struct to keep track of state variables
+ * @subsampling_x: horizontal subsampling
+ * @subsampling_y: vertical subsampling
+ * @bit_depth: bit depth of the stream
+ * @color_space: color space standard
+ * @color_range: color range standard
* @mb_segment_tree_probs: decoding tree probabilities
* @segment_pred_probs: segment prediction probabiilties
* @segmentation: Segmentation info
@@ -477,6 +471,12 @@
/* private stuct for tracking state variables across frames */
void *priv;
+ gint subsampling_x;
+ gint subsampling_y;
+ guint bit_depth;
+ guint color_space;
+ guint color_range;
+
guint8 mb_segment_tree_probs[GST_VP9_SEG_TREE_PROBS];
guint8 segment_pred_probs[GST_VP9_PREDICTION_PROBS];
GstVp9Segmentation segmentation[GST_VP9_MAX_SEGMENTS];
diff --git a/gst-libs/gst/codecparsers/nalutils.c b/gst-libs/gst/codecparsers/nalutils.c
index b949acb..045b91b 100644
--- a/gst-libs/gst/codecparsers/nalutils.c
+++ b/gst-libs/gst/codecparsers/nalutils.c
@@ -77,7 +77,7 @@
nr->cache = 0xff;
}
-inline gboolean
+extern inline gboolean
nal_reader_read (NalReader * nr, guint nbits)
{
if (G_UNLIKELY (nr->byte * 8 + (nbits - nr->bits_in_cache) > nr->size * 8)) {
@@ -115,7 +115,7 @@
/* Skips the specified amount of bits. This is only suitable to a
cacheable number of bits */
-inline gboolean
+extern inline gboolean
nal_reader_skip (NalReader * nr, guint nbits)
{
g_assert (nbits <= 8 * sizeof (nr->cache));
@@ -146,19 +146,19 @@
return TRUE;
}
-inline guint
+extern inline guint
nal_reader_get_pos (const NalReader * nr)
{
return nr->byte * 8 - nr->bits_in_cache;
}
-inline guint
+extern inline guint
nal_reader_get_remaining (const NalReader * nr)
{
return (nr->size - nr->byte) * 8 + nr->bits_in_cache;
}
-inline guint
+extern inline guint
nal_reader_get_epb_count (const NalReader * nr)
{
return nr->n_epb;
@@ -230,7 +230,7 @@
return TRUE;
}
-inline gboolean
+extern inline gboolean
nal_reader_get_se (NalReader * nr, gint32 * val)
{
guint32 value;
@@ -297,7 +297,7 @@
/*********** end of nal parser ***************/
-inline gint
+extern inline gint
scan_for_start_codes (const guint8 * data, guint size)
{
GstByteReader br;
diff --git a/gst-libs/gst/gl/Makefile.am b/gst-libs/gst/gl/Makefile.am
index 3f04a51..5572d2d 100644
--- a/gst-libs/gst/gl/Makefile.am
+++ b/gst-libs/gst/gl/Makefile.am
@@ -14,6 +14,7 @@
gstglbuffer.c \
gstglmemory.c \
gstglmemorypbo.c \
+ gstglrenderbuffer.c \
gstglbufferpool.c \
gstglfilter.c \
gstglformat.c \
@@ -45,6 +46,7 @@
gstglbuffer.h \
gstglmemory.h \
gstglmemorypbo.h \
+ gstglrenderbuffer.h \
gstglbufferpool.h \
gstglfilter.h \
gstglformat.h \
@@ -129,7 +131,6 @@
libgstgl_@GST_API_VERSION@_la_CFLAGS = \
-I$(top_srcdir)/gst-libs \
-I$(top_builddir)/gst-libs \
- $(GL_CFLAGS) \
$(GST_PLUGINS_BASE_CFLAGS) \
$(GST_BASE_CFLAGS) \
$(GST_CFLAGS) \
diff --git a/gst-libs/gst/gl/Makefile.in b/gst-libs/gst/gl/Makefile.in
index 6bd9f5d..43eb799 100644
--- a/gst-libs/gst/gl/Makefile.in
+++ b/gst-libs/gst/gl/Makefile.in
@@ -200,6 +200,7 @@
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-gstglrenderbuffer.lo \
libgstgl_@GST_API_VERSION@_la-gstglbufferpool.lo \
libgstgl_@GST_API_VERSION@_la-gstglfilter.lo \
libgstgl_@GST_API_VERSION@_la-gstglformat.lo \
@@ -400,6 +401,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -421,6 +424,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -470,6 +475,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -615,6 +622,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -741,8 +750,6 @@
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@
@@ -785,8 +792,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -889,6 +901,7 @@
gstglbuffer.c \
gstglmemory.c \
gstglmemorypbo.c \
+ gstglrenderbuffer.c \
gstglbufferpool.c \
gstglfilter.c \
gstglformat.c \
@@ -920,6 +933,7 @@
gstglbuffer.h \
gstglmemory.h \
gstglmemorypbo.h \
+ gstglrenderbuffer.h \
gstglbufferpool.h \
gstglfilter.h \
gstglformat.h \
@@ -959,7 +973,6 @@
libgstgl_@GST_API_VERSION@_la_CFLAGS = \
-I$(top_srcdir)/gst-libs \
-I$(top_builddir)/gst-libs \
- $(GL_CFLAGS) \
$(GST_PLUGINS_BASE_CFLAGS) \
$(GST_BASE_CFLAGS) \
$(GST_CFLAGS) \
@@ -1080,6 +1093,7 @@
@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-gstglquery.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglrenderbuffer.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-gstglshaderstrings.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglsl.Plo@am__quote@
@@ -1163,6 +1177,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-gstglmemorypbo.lo `test -f 'gstglmemorypbo.c' || echo '$(srcdir)/'`gstglmemorypbo.c
+libgstgl_@GST_API_VERSION@_la-gstglrenderbuffer.lo: gstglrenderbuffer.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-gstglrenderbuffer.lo -MD -MP -MF $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglrenderbuffer.Tpo -c -o libgstgl_@GST_API_VERSION@_la-gstglrenderbuffer.lo `test -f 'gstglrenderbuffer.c' || echo '$(srcdir)/'`gstglrenderbuffer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglrenderbuffer.Tpo $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglrenderbuffer.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstglrenderbuffer.c' object='libgstgl_@GST_API_VERSION@_la-gstglrenderbuffer.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-gstglrenderbuffer.lo `test -f 'gstglrenderbuffer.c' || echo '$(srcdir)/'`gstglrenderbuffer.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
diff --git a/gst-libs/gst/gl/android/Makefile.in b/gst-libs/gst/gl/android/Makefile.in
index 3f966c4..a54865b 100644
--- a/gst-libs/gst/gl/android/Makefile.in
+++ b/gst-libs/gst/gl/android/Makefile.in
@@ -301,6 +301,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -322,6 +324,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -371,6 +375,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -516,6 +522,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -642,8 +650,6 @@
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@
@@ -686,8 +692,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst-libs/gst/gl/cocoa/Makefile.in b/gst-libs/gst/gl/cocoa/Makefile.in
index 1b0c70f..1e4b991 100644
--- a/gst-libs/gst/gl/cocoa/Makefile.in
+++ b/gst-libs/gst/gl/cocoa/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst-libs/gst/gl/cocoa/gstglcaopengllayer.m b/gst-libs/gst/gl/cocoa/gstglcaopengllayer.m
index 45bd0dd..59ed09c 100644
--- a/gst-libs/gst/gl/cocoa/gstglcaopengllayer.m
+++ b/gst-libs/gst/gl/cocoa/gstglcaopengllayer.m
@@ -126,7 +126,7 @@
}
gst_gl_context_activate (self->draw_context, TRUE);
- gst_gl_context_set_shared_with (self->draw_context, self->gst_gl_context);
+ gst_gl_context_set_shared_with (self->draw_context, GST_GL_CONTEXT (self->gst_gl_context));
if (!gst_gl_context_fill_info (self->draw_context, &error)) {
GST_ERROR ("failed to fill wrapped context information: %s", error->message);
return NULL;
diff --git a/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m b/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m
index 0d027c5..495d022 100644
--- a/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m
+++ b/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m
@@ -77,6 +77,8 @@
gint width, gint height);
static void gst_gl_window_cocoa_show (GstGLWindow * window);
static void gst_gl_window_cocoa_queue_resize (GstGLWindow * window);
+static void gst_gl_window_cocoa_send_message_async (GstGLWindow * window,
+ GstGLWindowCB callback, gpointer data, GDestroyNotify destroy);
struct _GstGLWindowCocoaPrivate
{
@@ -90,6 +92,8 @@
/* atomic set when the internal NSView has been created */
int view_ready;
+
+ dispatch_queue_t gl_queue;
};
static void
@@ -111,6 +115,8 @@
GST_DEBUG_FUNCPTR (gst_gl_window_cocoa_set_preferred_size);
window_class->show = GST_DEBUG_FUNCPTR (gst_gl_window_cocoa_show);
window_class->queue_resize = GST_DEBUG_FUNCPTR (gst_gl_window_cocoa_queue_resize);
+ window_class->send_message_async =
+ GST_DEBUG_FUNCPTR (gst_gl_window_cocoa_send_message_async);
gobject_class->finalize = gst_gl_window_cocoa_finalize;
}
@@ -122,11 +128,15 @@
window->priv->preferred_width = 320;
window->priv->preferred_height = 240;
+ window->priv->gl_queue =
+ dispatch_queue_create ("org.freedesktop.gstreamer.glwindow", NULL);
}
static void
gst_gl_window_cocoa_finalize (GObject * object)
{
+ GstGLWindowCocoa *window = GST_GL_WINDOW_COCOA (object);
+ dispatch_release (window->priv->gl_queue);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@@ -370,6 +380,33 @@
[pool release];
}
+static void
+gst_gl_window_cocoa_send_message_async (GstGLWindow * window,
+ GstGLWindowCB callback, gpointer data, GDestroyNotify destroy)
+{
+ GstGLWindowCocoa *window_cocoa = (GstGLWindowCocoa *) window;
+ GstGLContext *context = gst_gl_window_get_context (window);
+ GThread *thread = gst_gl_context_get_thread (context);
+
+ if (thread == g_thread_self()) {
+ /* this case happens for nested calls happening from inside the GCD queue */
+ callback (data);
+ if (destroy)
+ destroy (data);
+ gst_object_unref (context);
+ } else {
+ dispatch_async (window_cocoa->priv->gl_queue, ^{
+ gst_gl_context_activate (context, TRUE);
+ gst_object_unref (context);
+ callback (data);
+ if (destroy)
+ destroy (data);
+ });
+ }
+ if (thread)
+ g_thread_unref (thread);
+}
+
/* =============================================================*/
/* */
/* GstGLNSWindow implementation */
diff --git a/gst-libs/gst/gl/dispmanx/Makefile.in b/gst-libs/gst/gl/dispmanx/Makefile.in
index b8d2722..b49a2e5 100644
--- a/gst-libs/gst/gl/dispmanx/Makefile.in
+++ b/gst-libs/gst/gl/dispmanx/Makefile.in
@@ -273,6 +273,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -294,6 +296,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -343,6 +347,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -488,6 +494,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -614,8 +622,6 @@
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@
@@ -658,8 +664,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c b/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c
index f4a5ae0..d06424c 100644
--- a/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c
+++ b/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c
@@ -57,7 +57,8 @@
static gboolean gst_gl_window_dispmanx_egl_open (GstGLWindow * window,
GError ** error);
static guintptr gst_gl_window_dispmanx_egl_get_display (GstGLWindow * window);
-
+static gboolean gst_gl_window_dispmanx_egl_set_render_rectangle (GstGLWindow *
+ window, gint x, gint y, gint width, gint height);
static void window_resize (GstGLWindowDispmanxEGL * window_egl, guint width,
guint height, gboolean visible);
@@ -78,6 +79,8 @@
GST_DEBUG_FUNCPTR (gst_gl_window_dispmanx_egl_get_display);
window_class->set_preferred_size =
GST_DEBUG_FUNCPTR (gst_gl_window_dispmanx_egl_set_preferred_size);
+ window_class->set_render_rectangle =
+ GST_DEBUG_FUNCPTR (gst_gl_window_dispmanx_egl_set_render_rectangle);
}
static void
@@ -92,6 +95,10 @@
window_egl->native.element = 0;
window_egl->native.width = 0;
window_egl->native.height = 0;
+ window_egl->render_rect.x = 0;
+ window_egl->render_rect.y = 0;
+ window_egl->render_rect.w = 0;
+ window_egl->render_rect.h = 0;
}
/* Must be called in the gl thread */
@@ -194,20 +201,27 @@
if (window_egl->display) {
VC_RECT_T dst_rect;
VC_RECT_T src_rect;
- GstVideoRectangle src, dst, res;
+ GstVideoRectangle src, res;
DISPMANX_UPDATE_HANDLE_T dispman_update;
uint32_t opacity = visible ? 255 : 0;
VC_DISPMANX_ALPHA_T alpha =
{ DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS, opacity, 0 };
- /* Center width*height frame inside dp_width*dp_height */
src.w = width;
src.h = height;
src.x = src.y = 0;
- dst.w = window_egl->dp_width;
- dst.h = window_egl->dp_height;
- dst.x = dst.y = 0;
- gst_video_sink_center_rect (src, dst, &res, FALSE);
+
+ /* If there is no render rectangle, center the width*height frame
+ * inside dp_width*dp_height */
+ if (window_egl->render_rect.w <= 0 || window_egl->render_rect.h <= 0) {
+ GstVideoRectangle dst;
+ dst.w = window_egl->dp_width;
+ dst.h = window_egl->dp_height;
+ dst.x = dst.y = 0;
+ gst_video_sink_center_rect (src, dst, &res, FALSE);
+ } else {
+ gst_video_sink_center_rect (src, window_egl->render_rect, &res, FALSE);
+ }
dst_rect.x = res.x;
dst_rect.y = res.y;
@@ -243,6 +257,21 @@
window_egl->native.height = height;
}
+static gboolean
+gst_gl_window_dispmanx_egl_set_render_rectangle (GstGLWindow * window,
+ gint x, gint y, gint width, gint height)
+{
+ GstGLWindowDispmanxEGL *window_egl = GST_GL_WINDOW_DISPMANX_EGL (window);
+ window_egl->render_rect.x = x;
+ window_egl->render_rect.y = x;
+ window_egl->render_rect.w = width;
+ window_egl->render_rect.h = height;
+
+ window_resize (window_egl, window_egl->render_rect.w,
+ window_egl->render_rect.h, TRUE);
+ return TRUE;
+}
+
static void
gst_gl_window_dispmanx_egl_show (GstGLWindow * window)
{
diff --git a/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h b/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h
index 3130a6c..f0663e2 100644
--- a/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h
+++ b/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h
@@ -67,6 +67,7 @@
gint preferred_width;
gint preferred_height;
+ GstVideoRectangle render_rect;
gboolean visible;
diff --git a/gst-libs/gst/gl/eagl/Makefile.in b/gst-libs/gst/gl/eagl/Makefile.in
index 074ff57..11ee06c 100644
--- a/gst-libs/gst/gl/eagl/Makefile.in
+++ b/gst-libs/gst/gl/eagl/Makefile.in
@@ -273,6 +273,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -294,6 +296,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -343,6 +347,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -488,6 +494,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -614,8 +622,6 @@
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@
@@ -658,8 +664,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst-libs/gst/gl/eagl/gstglcontext_eagl.m b/gst-libs/gst/gl/eagl/gstglcontext_eagl.m
index 42dde56..ecadc3f 100644
--- a/gst-libs/gst/gl/eagl/gstglcontext_eagl.m
+++ b/gst-libs/gst/gl/eagl/gstglcontext_eagl.m
@@ -219,18 +219,30 @@
{
GstGLContextEagl *context_eagl = GST_GL_CONTEXT_EAGL (context);
GstGLContextEaglPrivate *priv = context_eagl->priv;
+ EAGLSharegroup *share_group;
if (other_context) {
EAGLContext *external_gl_context = (EAGLContext *)
gst_gl_context_get_gl_context (other_context);
- EAGLSharegroup *share_group = [external_gl_context sharegroup];
-
- priv->eagl_context = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2 sharegroup:share_group];
- [share_group release];
+ share_group = [external_gl_context sharegroup];
} else {
- priv->eagl_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
+ share_group = nil;
}
+ priv->eagl_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3 sharegroup:share_group];
+ if (!priv->eagl_context) {
+ priv->eagl_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:share_group];
+ }
+ if (!priv->eagl_context) {
+ g_set_error_literal (error, GST_GL_CONTEXT_ERROR,
+ GST_GL_CONTEXT_ERROR_CREATE_CONTEXT,
+ "Failed to create OpenGL ES context");
+ return FALSE;
+ }
+
+ if (share_group)
+ [share_group release];
+
priv->eagl_layer = NULL;
priv->framebuffer = 0;
priv->color_renderbuffer = 0;
diff --git a/gst-libs/gst/gl/eagl/gstglwindow_eagl.m b/gst-libs/gst/gl/eagl/gstglwindow_eagl.m
index eb9d4f7..72ab1ab 100644
--- a/gst-libs/gst/gl/eagl/gstglwindow_eagl.m
+++ b/gst-libs/gst/gl/eagl/gstglwindow_eagl.m
@@ -40,6 +40,7 @@
#define gst_gl_window_eagl_parent_class parent_class
G_DEFINE_TYPE_WITH_CODE (GstGLWindowEagl, gst_gl_window_eagl,
GST_GL_TYPE_WINDOW, DEBUG_INIT);
+static void gst_gl_window_eagl_finalize (GObject * object);
static guintptr gst_gl_window_eagl_get_display (GstGLWindow * window);
static guintptr gst_gl_window_eagl_get_window_handle (GstGLWindow * window);
@@ -48,21 +49,27 @@
static void gst_gl_window_eagl_set_preferred_size (GstGLWindow * window,
gint width, gint height);
static void gst_gl_window_eagl_draw (GstGLWindow * window);
+static void gst_gl_window_eagl_send_message_async (GstGLWindow * window,
+ GstGLWindowCB callback, gpointer data, GDestroyNotify destroy);
struct _GstGLWindowEaglPrivate
{
UIView *view;
gint window_width, window_height;
gint preferred_width, preferred_height;
+ dispatch_queue_t gl_queue;
};
static void
gst_gl_window_eagl_class_init (GstGLWindowEaglClass * klass)
{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
GstGLWindowClass *window_class = (GstGLWindowClass *) klass;
g_type_class_add_private (klass, sizeof (GstGLWindowEaglPrivate));
+ gobject_class->finalize = gst_gl_window_eagl_finalize;
+
window_class->get_display =
GST_DEBUG_FUNCPTR (gst_gl_window_eagl_get_display);
window_class->get_window_handle =
@@ -72,13 +79,24 @@
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);
+ window_class->send_message_async =
+ GST_DEBUG_FUNCPTR (gst_gl_window_eagl_send_message_async);
}
static void
gst_gl_window_eagl_init (GstGLWindowEagl * window)
{
window->priv = GST_GL_WINDOW_EAGL_GET_PRIVATE (window);
+ window->priv->gl_queue =
+ dispatch_queue_create ("org.freedesktop.gstreamer.glwindow", NULL);
+}
+static void
+gst_gl_window_eagl_finalize (GObject * object)
+{
+ GstGLWindowEagl *window = GST_GL_WINDOW_EAGL (object);
+ dispatch_release (window->priv->gl_queue);
+ G_OBJECT_CLASS (parent_class)->finalize (object);
}
/* Must be called in the gl thread */
@@ -127,6 +145,33 @@
}
static void
+gst_gl_window_eagl_send_message_async (GstGLWindow * window,
+ GstGLWindowCB callback, gpointer data, GDestroyNotify destroy)
+{
+ GstGLWindowEagl *window_eagl = (GstGLWindowEagl *) window;
+ GstGLContext *context = gst_gl_window_get_context (window);
+ GThread *thread = gst_gl_context_get_thread (context);
+
+ if (thread == g_thread_self()) {
+ /* this case happens for nested calls happening from inside the GCD queue */
+ callback (data);
+ if (destroy)
+ destroy (data);
+ gst_object_unref (context);
+ } else {
+ dispatch_async (window_eagl->priv->gl_queue, ^{
+ gst_gl_context_activate (context, TRUE);
+ gst_object_unref (context);
+ callback (data);
+ if (destroy)
+ destroy (data);
+ });
+ }
+ if (thread)
+ g_thread_unref (thread);
+}
+
+static void
draw_cb (gpointer data)
{
GstGLWindowEagl *window_eagl = data;
diff --git a/gst-libs/gst/gl/egl/Makefile.am b/gst-libs/gst/gl/egl/Makefile.am
index b808178..e164eb0 100644
--- a/gst-libs/gst/gl/egl/Makefile.am
+++ b/gst-libs/gst/gl/egl/Makefile.am
@@ -5,7 +5,8 @@
libgstgl_egl_la_SOURCES = \
gstgldisplay_egl.c \
gstglcontext_egl.c \
- gsteglimagememory.c
+ gstglmemoryegl.c \
+ gsteglimage.c
noinst_HEADERS =
@@ -13,7 +14,8 @@
libgstgl_eglinclude_HEADERS = \
gstgldisplay_egl.h \
gstglcontext_egl.h \
- gsteglimagememory.h \
+ gstglmemoryegl.h \
+ gsteglimage.h \
gstegl.h
libgstgl_egl_la_CFLAGS = \
diff --git a/gst-libs/gst/gl/egl/Makefile.in b/gst-libs/gst/gl/egl/Makefile.in
index e182bd9..bf567c6 100644
--- a/gst-libs/gst/gl/egl/Makefile.in
+++ b/gst-libs/gst/gl/egl/Makefile.in
@@ -137,7 +137,8 @@
libgstgl_egl_la_LIBADD =
am_libgstgl_egl_la_OBJECTS = libgstgl_egl_la-gstgldisplay_egl.lo \
libgstgl_egl_la-gstglcontext_egl.lo \
- libgstgl_egl_la-gsteglimagememory.lo
+ libgstgl_egl_la-gstglmemoryegl.lo \
+ libgstgl_egl_la-gsteglimage.lo
libgstgl_egl_la_OBJECTS = $(am_libgstgl_egl_la_OBJECTS)
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
@@ -302,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +652,6 @@
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@
@@ -687,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -781,14 +793,16 @@
libgstgl_egl_la_SOURCES = \
gstgldisplay_egl.c \
gstglcontext_egl.c \
- gsteglimagememory.c
+ gstglmemoryegl.c \
+ gsteglimage.c
noinst_HEADERS =
libgstgl_eglincludedir = $(includedir)/gstreamer-@GST_API_VERSION@/gst/gl/egl
libgstgl_eglinclude_HEADERS = \
gstgldisplay_egl.h \
gstglcontext_egl.h \
- gsteglimagememory.h \
+ gstglmemoryegl.h \
+ gsteglimage.h \
gstegl.h
libgstgl_egl_la_CFLAGS = \
@@ -857,9 +871,10 @@
distclean-compile:
-rm -f *.tab.c
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_egl_la-gsteglimagememory.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_egl_la-gsteglimage.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_egl_la-gstglcontext_egl.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_egl_la-gstgldisplay_egl.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_egl_la-gstglmemoryegl.Plo@am__quote@
.c.o:
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@@ -899,12 +914,19 @@
@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_egl_la_CFLAGS) $(CFLAGS) -c -o libgstgl_egl_la-gstglcontext_egl.lo `test -f 'gstglcontext_egl.c' || echo '$(srcdir)/'`gstglcontext_egl.c
-libgstgl_egl_la-gsteglimagememory.lo: gsteglimagememory.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_egl_la_CFLAGS) $(CFLAGS) -MT libgstgl_egl_la-gsteglimagememory.lo -MD -MP -MF $(DEPDIR)/libgstgl_egl_la-gsteglimagememory.Tpo -c -o libgstgl_egl_la-gsteglimagememory.lo `test -f 'gsteglimagememory.c' || echo '$(srcdir)/'`gsteglimagememory.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgl_egl_la-gsteglimagememory.Tpo $(DEPDIR)/libgstgl_egl_la-gsteglimagememory.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsteglimagememory.c' object='libgstgl_egl_la-gsteglimagememory.lo' libtool=yes @AMDEPBACKSLASH@
+libgstgl_egl_la-gstglmemoryegl.lo: gstglmemoryegl.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_egl_la_CFLAGS) $(CFLAGS) -MT libgstgl_egl_la-gstglmemoryegl.lo -MD -MP -MF $(DEPDIR)/libgstgl_egl_la-gstglmemoryegl.Tpo -c -o libgstgl_egl_la-gstglmemoryegl.lo `test -f 'gstglmemoryegl.c' || echo '$(srcdir)/'`gstglmemoryegl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgl_egl_la-gstglmemoryegl.Tpo $(DEPDIR)/libgstgl_egl_la-gstglmemoryegl.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstglmemoryegl.c' object='libgstgl_egl_la-gstglmemoryegl.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_egl_la_CFLAGS) $(CFLAGS) -c -o libgstgl_egl_la-gsteglimagememory.lo `test -f 'gsteglimagememory.c' || echo '$(srcdir)/'`gsteglimagememory.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_egl_la_CFLAGS) $(CFLAGS) -c -o libgstgl_egl_la-gstglmemoryegl.lo `test -f 'gstglmemoryegl.c' || echo '$(srcdir)/'`gstglmemoryegl.c
+
+libgstgl_egl_la-gsteglimage.lo: gsteglimage.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_egl_la_CFLAGS) $(CFLAGS) -MT libgstgl_egl_la-gsteglimage.lo -MD -MP -MF $(DEPDIR)/libgstgl_egl_la-gsteglimage.Tpo -c -o libgstgl_egl_la-gsteglimage.lo `test -f 'gsteglimage.c' || echo '$(srcdir)/'`gsteglimage.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgl_egl_la-gsteglimage.Tpo $(DEPDIR)/libgstgl_egl_la-gsteglimage.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsteglimage.c' object='libgstgl_egl_la-gsteglimage.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_egl_la_CFLAGS) $(CFLAGS) -c -o libgstgl_egl_la-gsteglimage.lo `test -f 'gsteglimage.c' || echo '$(srcdir)/'`gsteglimage.c
mostlyclean-libtool:
-rm -f *.lo
diff --git a/gst-libs/gst/gl/egl/gstegl.h b/gst-libs/gst/gl/egl/gstegl.h
index 82d4953..2a31f82 100644
--- a/gst-libs/gst/gl/egl/gstegl.h
+++ b/gst-libs/gst/gl/egl/gstegl.h
@@ -46,4 +46,9 @@
#pragma GCC diagnostic pop
#endif
+/* compatibility definitions... */
+#if !GST_GL_HAVE_EGLATTRIB
+typedef gintptr EGLAttrib;
+#endif
+
#endif /* _GST_EGL_H_ */
diff --git a/gst-libs/gst/gl/egl/gsteglimage.c b/gst-libs/gst/gl/egl/gsteglimage.c
new file mode 100644
index 0000000..5d2a0a0
--- /dev/null
+++ b/gst-libs/gst/gl/egl/gsteglimage.c
@@ -0,0 +1,322 @@
+/*
+ * GStreamer
+ * Copyright (C) 2012 Collabora Ltd.
+ * @author: Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ * Copyright (C) 2014 Julien Isorce <julien.isorce@gmail.com>
+ * Copyright (C) 2016 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 "gsteglimage.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
+
+#ifndef EGL_LINUX_DMA_BUF_EXT
+#define EGL_LINUX_DMA_BUF_EXT 0x3270
+#endif
+
+#ifndef EGL_LINUX_DRM_FOURCC_EXT
+#define EGL_LINUX_DRM_FOURCC_EXT 0x3271
+#endif
+
+#ifndef EGL_DMA_BUF_PLANE0_FD_EXT
+#define EGL_DMA_BUF_PLANE0_FD_EXT 0x3272
+#endif
+
+#ifndef EGL_DMA_BUF_PLANE0_OFFSET_EXT
+#define EGL_DMA_BUF_PLANE0_OFFSET_EXT 0x3273
+#endif
+
+#ifndef EGL_DMA_BUF_PLANE0_PITCH_EXT
+#define EGL_DMA_BUF_PLANE0_PITCH_EXT 0x3274
+#endif
+
+GST_DEFINE_MINI_OBJECT_TYPE (GstEGLImage, gst_egl_image);
+
+/* XXX: This is only used currently if dmabuf support is enabled */
+#if GST_GL_HAVE_DMABUF
+#ifndef GST_DISABLE_GST_DEBUG
+#define GST_CAT_DEFAULT gst_egl_image_ensure_debug_category()
+
+static GstDebugCategory *
+gst_egl_image_ensure_debug_category (void)
+{
+ static gsize cat_gonce = 0;
+
+ if (g_once_init_enter (&cat_gonce)) {
+ GstDebugCategory *cat = NULL;
+
+ GST_DEBUG_CATEGORY_INIT (cat, "gleglimage", 0, "EGLImage wrapper");
+
+ g_once_init_leave (&cat_gonce, (gsize) cat);
+ }
+
+ return (GstDebugCategory *) cat_gonce;
+}
+#endif /* GST_DISABLE_GST_DEBUG */
+#endif /* GST_GL_HAVE_DMABUF */
+
+EGLImageKHR
+gst_egl_image_get_image (GstEGLImage * image)
+{
+ g_return_val_if_fail (GST_IS_EGL_IMAGE (image), EGL_NO_IMAGE_KHR);
+
+ return image->image;
+}
+
+GstVideoGLTextureOrientation
+gst_egl_image_get_orientation (GstEGLImage * image)
+{
+ g_return_val_if_fail (GST_IS_EGL_IMAGE (image),
+ GST_VIDEO_GL_TEXTURE_ORIENTATION_X_NORMAL_Y_NORMAL);
+
+ return image->orientation;
+}
+
+static void
+_gst_egl_image_free_thread (GstGLContext * context, GstEGLImage * image)
+{
+ if (image->destroy_notify)
+ image->destroy_notify (image, image->destroy_data);
+}
+
+static void
+_gst_egl_image_free (GstMiniObject * object)
+{
+ GstEGLImage *image = GST_EGL_IMAGE (object);
+
+ if (image->context) {
+ gst_gl_context_thread_add (GST_GL_CONTEXT (image->context),
+ (GstGLContextThreadFunc) _gst_egl_image_free_thread, image);
+ gst_object_unref (image->context);
+ }
+}
+
+static GstMiniObject *
+_gst_egl_image_copy (GstMiniObject * obj)
+{
+ return gst_mini_object_ref (obj);
+}
+
+GstEGLImage *
+gst_egl_image_new_wrapped (GstGLContext * context, EGLImageKHR image,
+ GstVideoGLTextureType type, GstVideoGLTextureOrientation orientation,
+ gpointer user_data, GstEGLImageDestroyNotify user_data_destroy)
+{
+ GstEGLImage *img = NULL;
+
+ g_return_val_if_fail (context != NULL, NULL);
+ g_return_val_if_fail (GST_IS_GL_CONTEXT_EGL (context), NULL);
+ g_return_val_if_fail (image != EGL_NO_IMAGE_KHR, NULL);
+
+ img = g_new0 (GstEGLImage, 1);
+ gst_mini_object_init (GST_MINI_OBJECT_CAST (img), 0, GST_TYPE_EGL_IMAGE,
+ (GstMiniObjectCopyFunction) _gst_egl_image_copy, NULL,
+ (GstMiniObjectFreeFunction) _gst_egl_image_free);
+
+ img->context = gst_object_ref (context);
+ img->image = image;
+ img->type = type;
+ img->orientation = orientation;
+
+ img->destroy_data = user_data;
+ img->destroy_notify = user_data_destroy;
+
+ return img;
+}
+
+#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;
+ }
+}
+
+static void
+_destroy_egl_image (GstEGLImage * image, gpointer user_data)
+{
+ image->context->eglDestroyImage (image->context->egl_display, image->image);
+}
+
+GstEGLImage *
+gst_egl_image_from_dmabuf (GstGLContext * context,
+ gint dmabuf, GstVideoInfo * in_info, gint plane, gsize offset)
+{
+ GstGLContextEGL *ctx_egl = GST_GL_CONTEXT_EGL (context);
+ gint fourcc;
+ gint atti = 0;
+ EGLint attribs[13];
+#ifdef EGL_VERSION_1_5
+ EGLAttrib attribs_1_5[13];
+#endif
+ EGLImageKHR img = EGL_NO_IMAGE_KHR;
+ GstVideoGLTextureType type;
+
+ fourcc = _drm_fourcc_from_info (in_info, plane);
+ type =
+ gst_gl_texture_type_from_format (context, GST_VIDEO_INFO_FORMAT (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));
+
+#ifdef EGL_VERSION_1_5
+ if (GST_GL_CHECK_GL_VERSION (ctx_egl->egl_major, ctx_egl->egl_minor, 1, 5)) {
+ attribs_1_5[atti++] = EGL_WIDTH;
+ attribs_1_5[atti++] = GST_VIDEO_INFO_COMP_WIDTH (in_info, plane);
+ attribs_1_5[atti++] = EGL_HEIGHT;
+ attribs_1_5[atti++] = GST_VIDEO_INFO_COMP_HEIGHT (in_info, plane);
+ attribs_1_5[atti++] = EGL_LINUX_DRM_FOURCC_EXT;
+ attribs_1_5[atti++] = fourcc;
+ attribs_1_5[atti++] = EGL_DMA_BUF_PLANE0_FD_EXT;
+ attribs_1_5[atti++] = dmabuf;
+ attribs_1_5[atti++] = EGL_DMA_BUF_PLANE0_OFFSET_EXT;
+ attribs_1_5[atti++] = offset;
+ attribs_1_5[atti++] = EGL_DMA_BUF_PLANE0_PITCH_EXT;
+ attribs_1_5[atti++] = GST_VIDEO_INFO_PLANE_STRIDE (in_info, plane);
+ attribs_1_5[atti] = EGL_NONE;
+
+ for (int i = 0; i < atti; i++)
+ GST_LOG ("attr %i: %" G_GINTPTR_FORMAT, i, attribs_1_5[i]);
+
+ g_assert (atti == 12);
+
+ img = ctx_egl->eglCreateImage (ctx_egl->egl_display, EGL_NO_CONTEXT,
+ EGL_LINUX_DMA_BUF_EXT, NULL, attribs_1_5);
+
+ } else
+#endif
+ {
+ 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->eglCreateImageKHR (ctx_egl->egl_display, EGL_NO_CONTEXT,
+ EGL_LINUX_DMA_BUF_EXT, NULL, attribs);
+ }
+ if (!img) {
+ GST_WARNING ("eglCreateImage failed: %s",
+ gst_gl_context_egl_get_error_string (eglGetError ()));
+ return NULL;
+ }
+
+ return gst_egl_image_new_wrapped (context, img, type,
+ GST_VIDEO_GL_TEXTURE_ORIENTATION_X_NORMAL_Y_NORMAL,
+ (GstEGLImageDestroyNotify) _destroy_egl_image, NULL);
+}
+#endif /* GST_GL_HAVE_DMABUF */
diff --git a/gst-libs/gst/gl/egl/gsteglimage.h b/gst-libs/gst/gl/egl/gsteglimage.h
new file mode 100644
index 0000000..2d2e075
--- /dev/null
+++ b/gst-libs/gst/gl/egl/gsteglimage.h
@@ -0,0 +1,106 @@
+/*
+ * GStreamer
+ * Copyright (C) 2012 Collabora Ltd.
+ * @author: Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ * Copyright (C) 2014 Julien Isorce <julien.isorce@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_EGL_IMAGE_H_
+#define _GST_EGL_IMAGE_H_
+
+#include <gst/gst.h>
+#include <gst/video/video.h>
+
+#include <gst/gl/gl.h>
+#include <gst/gl/egl/gstglcontext_egl.h>
+
+G_BEGIN_DECLS
+
+GType gst_egl_image_get_type (void);
+#define GST_TYPE_EGL_IMAGE (gst_egl_image_get_type())
+#define GST_IS_EGL_IMAGE(obj) (GST_IS_MINI_OBJECT_TYPE(obj, GST_TYPE_EGL_IMAGE))
+#define GST_EGL_IMAGE_CAST(obj) ((GstEGLImage *)(obj))
+#define GST_EGL_IMAGE(obj) (GST_EGL_IMAGE_CAST(obj))
+
+typedef struct _GstEGLImage GstEGLImage;
+
+typedef void (*GstEGLImageDestroyNotify) (GstEGLImage * image,
+ gpointer data);
+
+struct _GstEGLImage
+{
+ GstMiniObject parent;
+
+ GstGLContextEGL *context;
+ EGLImageKHR image;
+ GstVideoGLTextureType type;
+ /* FIXME: remove this and use the affine transformation meta instead */
+ GstVideoGLTextureOrientation orientation;
+
+ /* <private> */
+ gpointer destroy_data;
+ GstEGLImageDestroyNotify destroy_notify;
+};
+
+GstEGLImage * gst_egl_image_new_wrapped (GstGLContext * context,
+ EGLImageKHR image,
+ GstVideoGLTextureType type,
+ GstVideoGLTextureOrientation orientation,
+ gpointer user_data,
+ GstEGLImageDestroyNotify user_data_destroy);
+EGLImageKHR gst_egl_image_get_image (GstEGLImage * image);
+GstVideoGLTextureOrientation gst_egl_image_get_orientation (GstEGLImage * image);
+
+#if GST_GL_HAVE_DMABUF
+GstEGLImage * gst_egl_image_from_dmabuf (GstGLContext * context,
+ gint dmabuf,
+ GstVideoInfo * in_info,
+ gint plane,
+ gsize offset);
+#endif
+
+/**
+ * gst_egl_image_ref:
+ * @image: a #GstEGLImage.
+ *
+ * Increases the refcount of the given image by one.
+ *
+ * Returns: (transfer full): @image
+ */
+static inline GstEGLImage *
+gst_egl_image_ref (GstEGLImage * image)
+{
+ return (GstEGLImage *) gst_mini_object_ref (GST_MINI_OBJECT_CAST (image));
+}
+
+/**
+ * gst_buffer_unref:
+ * @buf: (transfer full): a #GstBuffer.
+ *
+ * Decreases the refcount of the image. If the refcount reaches 0, the image
+ * with the associated metadata and memory will be freed.
+ */
+static inline void
+gst_egl_image_unref (GstEGLImage * image)
+{
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (image));
+}
+
+G_END_DECLS
+
+#endif /* _GST_EGL_IMAGE_H_ */
diff --git a/gst-libs/gst/gl/egl/gsteglimagememory.c b/gst-libs/gst/gl/egl/gsteglimagememory.c
deleted file mode 100644
index 46098b5..0000000
--- a/gst-libs/gst/gl/egl/gsteglimagememory.c
+++ /dev/null
@@ -1,732 +0,0 @@
-/*
- * GStreamer
- * Copyright (C) 2012 Collabora Ltd.
- * @author: Sebastian Dröge <sebastian.droege@collabora.co.uk>
- * Copyright (C) 2014 Julien Isorce <julien.isorce@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 "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
-
-#ifndef EGL_LINUX_DMA_BUF_EXT
-#define EGL_LINUX_DMA_BUF_EXT 0x3270
-#endif
-
-#ifndef EGL_LINUX_DRM_FOURCC_EXT
-#define EGL_LINUX_DRM_FOURCC_EXT 0x3271
-#endif
-
-#ifndef EGL_DMA_BUF_PLANE0_FD_EXT
-#define EGL_DMA_BUF_PLANE0_FD_EXT 0x3272
-#endif
-
-#ifndef EGL_DMA_BUF_PLANE0_OFFSET_EXT
-#define EGL_DMA_BUF_PLANE0_OFFSET_EXT 0x3273
-#endif
-
-#ifndef EGL_DMA_BUF_PLANE0_PITCH_EXT
-#define EGL_DMA_BUF_PLANE0_PITCH_EXT 0x3274
-#endif
-
-GST_DEBUG_CATEGORY_STATIC (GST_CAT_EGL_IMAGE_MEMORY);
-#define GST_CAT_DEFAULT GST_CAT_EGL_IMAGE_MEMORY
-
-#define GST_EGL_IMAGE_MEMORY(mem) ((GstEGLImageMemory*)(mem))
-
-gboolean
-gst_is_egl_image_memory (GstMemory * mem)
-{
- g_return_val_if_fail (mem != NULL, FALSE);
- g_return_val_if_fail (mem->allocator != NULL, FALSE);
-
- return g_strcmp0 (mem->allocator->mem_type, GST_EGL_IMAGE_MEMORY_TYPE) == 0;
-}
-
-EGLImageKHR
-gst_egl_image_memory_get_image (GstMemory * mem)
-{
- g_return_val_if_fail (gst_is_egl_image_memory (mem), EGL_NO_IMAGE_KHR);
-
- if (mem->parent)
- mem = mem->parent;
-
- return GST_EGL_IMAGE_MEMORY (mem)->image;
-}
-
-EGLDisplay
-gst_egl_image_memory_get_display (GstMemory * mem)
-{
- g_return_val_if_fail (gst_is_egl_image_memory (mem), NULL);
-
- if (mem->parent)
- mem = mem->parent;
-
- return GST_EGL_IMAGE_MEMORY (mem)->context->egl_display;
-}
-
-GstVideoGLTextureOrientation
-gst_egl_image_memory_get_orientation (GstMemory * mem)
-{
- g_return_val_if_fail (gst_is_egl_image_memory (mem),
- GST_VIDEO_GL_TEXTURE_ORIENTATION_X_NORMAL_Y_NORMAL);
-
- if (mem->parent)
- mem = mem->parent;
-
- return GST_EGL_IMAGE_MEMORY (mem)->orientation;
-}
-
-void
-gst_egl_image_memory_set_orientation (GstMemory * mem,
- GstVideoGLTextureOrientation orientation)
-{
- g_return_if_fail (gst_is_egl_image_memory (mem));
-
- if (mem->parent)
- mem = mem->parent;
-
- GST_EGL_IMAGE_MEMORY (mem)->orientation = orientation;
-}
-
-static GstMemory *
-gst_egl_image_allocator_alloc_vfunc (GstAllocator * allocator, gsize size,
- GstAllocationParams * params)
-{
- g_warning
- ("Use gst_egl_image_allocator_alloc() to allocate from this allocator");
-
- return NULL;
-}
-
-static void
-gst_egl_image_allocator_free_vfunc (GstAllocator * allocator, GstMemory * mem)
-{
- GstEGLImageMemory *emem = (GstEGLImageMemory *) mem;
-
- g_return_if_fail (gst_is_egl_image_memory (mem));
-
- /* Shared memory should not destroy all the data */
- if (!mem->parent) {
- emem->context->eglDestroyImage (emem->context->egl_display, emem->image);
-
- if (emem->user_data_destroy)
- emem->user_data_destroy (emem->context, emem->user_data);
-
- gst_object_unref (emem->context);
- emem->context = NULL;
- }
-
- g_slice_free (GstEGLImageMemory, emem);
-}
-
-static gpointer
-gst_egl_image_mem_map (GstMemory * mem, gsize maxsize, GstMapFlags flags)
-{
- return NULL;
-}
-
-static void
-gst_egl_image_mem_unmap (GstMemory * mem)
-{
-}
-
-static GstMemory *
-gst_egl_image_mem_share (GstMemory * mem, gssize offset, gssize size)
-{
- return NULL;
-}
-
-static GstMemory *
-gst_egl_image_mem_copy (GstMemory * mem, gssize offset, gssize size)
-{
- return NULL;
-}
-
-static gboolean
-gst_egl_image_mem_is_span (GstMemory * mem1, GstMemory * mem2, gsize * offset)
-{
- return FALSE;
-}
-
-typedef struct _GstEGLImageAllocator GstEGLImageAllocator;
-typedef struct _GstEGLImageAllocatorClass GstEGLImageAllocatorClass;
-
-struct _GstEGLImageAllocator
-{
- GstAllocator parent;
-};
-
-struct _GstEGLImageAllocatorClass
-{
- GstAllocatorClass parent_class;
-};
-
-GType gst_egl_image_allocator_get_type (void);
-G_DEFINE_TYPE (GstEGLImageAllocator, gst_egl_image_allocator,
- GST_TYPE_ALLOCATOR);
-
-#define GST_TYPE_EGL_IMAGE_ALLOCATOR (gst_egl_image_mem_allocator_get_type())
-#define GST_IS_EGL_IMAGE_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_EGL_IMAGE_ALLOCATOR))
-
-static void
-gst_egl_image_allocator_class_init (GstEGLImageAllocatorClass * klass)
-{
- GstAllocatorClass *allocator_class = (GstAllocatorClass *) klass;
-
- allocator_class->alloc = gst_egl_image_allocator_alloc_vfunc;
- allocator_class->free = gst_egl_image_allocator_free_vfunc;
-}
-
-static void
-gst_egl_image_allocator_init (GstEGLImageAllocator * allocator)
-{
- GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator);
-
- alloc->mem_type = GST_EGL_IMAGE_MEMORY_TYPE;
- alloc->mem_map = gst_egl_image_mem_map;
- alloc->mem_unmap = gst_egl_image_mem_unmap;
- alloc->mem_share = gst_egl_image_mem_share;
- alloc->mem_copy = gst_egl_image_mem_copy;
- alloc->mem_is_span = gst_egl_image_mem_is_span;
-
- GST_OBJECT_FLAG_SET (allocator, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC);
-}
-
-static gpointer
-gst_egl_image_allocator_init_instance (gpointer data)
-{
- GstAllocator *allocator =
- g_object_new (gst_egl_image_allocator_get_type (), NULL);
-
- GST_DEBUG_CATEGORY_INIT (GST_CAT_EGL_IMAGE_MEMORY, "eglimagememory", 0,
- "EGLImage Memory");
-
- gst_allocator_register (GST_EGL_IMAGE_MEMORY_TYPE,
- gst_object_ref (allocator));
-
- return allocator;
-}
-
-static GstEGLImageAllocator *
-gst_egl_image_allocator_obtain (void)
-{
- static GOnce once = G_ONCE_INIT;
-
- g_once (&once, gst_egl_image_allocator_init_instance, NULL);
-
- g_return_val_if_fail (once.retval != NULL, NULL);
-
- return (GstEGLImageAllocator *) (g_object_ref (once.retval));
-}
-
-void
-gst_egl_image_memory_init (void)
-{
- gst_egl_image_allocator_obtain ();
-}
-
-static void
-gst_egl_image_memory_del_gl_texture (GstGLContext * context, gpointer tex)
-{
- GLuint textures[1] = { GPOINTER_TO_UINT (tex) };
-
- gst_gl_context_del_texture (context, textures);
-}
-
-static GstMemory *
-gst_egl_image_allocator_wrap (GstEGLImageAllocator * allocator,
- GstGLContextEGL * context, EGLImageKHR image, GstVideoGLTextureType type,
- GstMemoryFlags flags, gsize size, gpointer user_data,
- GstEGLImageDestroyNotify user_data_destroy)
-{
- GstEGLImageMemory *mem = NULL;
-
- g_return_val_if_fail (context != NULL, NULL);
- g_return_val_if_fail (image != EGL_NO_IMAGE_KHR, NULL);
-
- if (!allocator) {
- allocator = gst_egl_image_allocator_obtain ();
- }
-
- mem = g_slice_new (GstEGLImageMemory);
- gst_memory_init (GST_MEMORY_CAST (mem), flags,
- GST_ALLOCATOR (allocator), NULL, size, 0, 0, size);
-
- gst_object_unref (allocator);
-
- mem->context = gst_object_ref (context);
- mem->image = image;
- mem->type = type;
- mem->orientation = GST_VIDEO_GL_TEXTURE_ORIENTATION_X_NORMAL_Y_NORMAL;
-
- mem->user_data = user_data;
- mem->user_data_destroy = user_data_destroy;
-
- return GST_MEMORY_CAST (mem);
-}
-
-#if 0
-static GstMemory *
-gst_egl_image_allocator_alloc (GstAllocator * allocator,
- GstGLContextEGL * context, GstVideoGLTextureType type, gint width,
- gint height, gsize size)
-{
- /* EGL_NO_CONTEXT */
- return NULL;
-}
-#endif
-
-static gboolean
-gst_eglimage_to_gl_texture_upload_meta (GstVideoGLTextureUploadMeta *
- meta, guint texture_id[4])
-{
- gint i = 0;
- gint n = 0;
-
- g_return_val_if_fail (meta != NULL, FALSE);
- g_return_val_if_fail (texture_id != NULL, FALSE);
-
- GST_DEBUG ("Uploading for meta with textures %i,%i,%i,%i", texture_id[0],
- texture_id[1], texture_id[2], texture_id[3]);
-
- n = gst_buffer_n_memory (meta->buffer);
-
- for (i = 0; i < n; i++) {
- GstMemory *mem = gst_buffer_peek_memory (meta->buffer, i);
- const GstGLFuncs *gl = NULL;
-
- if (!gst_is_egl_image_memory (mem)) {
- GST_WARNING ("memory %p does not hold an EGLImage", mem);
- return FALSE;
- }
-
- gl = GST_GL_CONTEXT (GST_EGL_IMAGE_MEMORY (mem)->context)->gl_vtable;
-
- gl->ActiveTexture (GL_TEXTURE0 + i);
- gl->BindTexture (GL_TEXTURE_2D, texture_id[i]);
- gl->EGLImageTargetTexture2D (GL_TEXTURE_2D,
- gst_egl_image_memory_get_image (mem));
- }
-
- if (GST_IS_GL_BUFFER_POOL (meta->buffer->pool))
- 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 (eglGetError ()));
- 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)
-{
- gint i = 0;
- gint stride[3];
- gsize offset[3];
- GstMemory *mem[3] = { NULL, NULL, NULL };
- guint n_mem = 0;
- GstMemoryFlags flags = 0;
- EGLImageKHR image = EGL_NO_IMAGE_KHR;
- EGLClientBuffer client_buffer_tex[3] = { 0, 0, 0 };
- GstVideoGLTextureType texture_types[] = { 0, 0, 0, 0 };
- GstEGLImageAllocator *allocator = gst_egl_image_allocator_obtain ();
- GstGLContextEGL *context = GST_GL_CONTEXT_EGL (ctx);
-
- g_return_val_if_fail (ctx, FALSE);
- g_return_val_if_fail (info, FALSE);
- g_return_val_if_fail (buffer, FALSE);
- g_return_val_if_fail (gst_gl_context_check_feature (ctx,
- "EGL_KHR_image_base"), FALSE);
-
- memset (stride, 0, sizeof (stride));
- memset (offset, 0, sizeof (offset));
-
- flags |= GST_MEMORY_FLAG_NOT_MAPPABLE;
- flags |= GST_MEMORY_FLAG_NO_SHARE;
-
- switch (GST_VIDEO_INFO_FORMAT (info)) {
- case GST_VIDEO_FORMAT_RGB:
- case GST_VIDEO_FORMAT_BGR:
- case GST_VIDEO_FORMAT_RGB16:
- case GST_VIDEO_FORMAT_RGBA:
- case GST_VIDEO_FORMAT_BGRA:
- case GST_VIDEO_FORMAT_ARGB:
- case GST_VIDEO_FORMAT_ABGR:
- case GST_VIDEO_FORMAT_RGBx:
- case GST_VIDEO_FORMAT_BGRx:
- case GST_VIDEO_FORMAT_xRGB:
- case GST_VIDEO_FORMAT_xBGR:
- case GST_VIDEO_FORMAT_AYUV:
- {
- gsize size = 0;
-
- switch (GST_VIDEO_INFO_FORMAT (info)) {
- case GST_VIDEO_FORMAT_RGB:
- case GST_VIDEO_FORMAT_BGR:
- case GST_VIDEO_FORMAT_RGB16:
- {
- texture_types[0] = GST_VIDEO_GL_TEXTURE_TYPE_RGB;
- break;
- }
- case GST_VIDEO_FORMAT_RGBA:
- case GST_VIDEO_FORMAT_BGRA:
- case GST_VIDEO_FORMAT_ARGB:
- case GST_VIDEO_FORMAT_ABGR:
- case GST_VIDEO_FORMAT_RGBx:
- case GST_VIDEO_FORMAT_BGRx:
- case GST_VIDEO_FORMAT_xRGB:
- case GST_VIDEO_FORMAT_xBGR:
- case GST_VIDEO_FORMAT_AYUV:
- {
- texture_types[0] = GST_VIDEO_GL_TEXTURE_TYPE_RGBA;
- break;
- }
- default:
- g_assert_not_reached ();
- break;
- }
-#if 0
- mem[0] =
- gst_egl_image_allocator_alloc (allocator, context,
- texture_types[0], GST_VIDEO_INFO_WIDTH (info),
- GST_VIDEO_INFO_HEIGHT (info), size);
- if (mem[0]) {
- stride[0] = size / GST_VIDEO_INFO_HEIGHT (info);
- n_mem = 1;
- GST_MINI_OBJECT_FLAG_SET (mem[0], GST_MEMORY_FLAG_NO_SHARE);
- } else
-#endif
- {
- gst_gl_generate_texture_full (GST_GL_CONTEXT (context), info, 0, stride,
- offset, &size, (GLuint *) & client_buffer_tex[0]);
-
- image = context->eglCreateImage (context->egl_display,
- context->egl_context, EGL_GL_TEXTURE_2D_KHR, client_buffer_tex[0],
- NULL);
- if (eglGetError () != EGL_SUCCESS)
- goto mem_error;
-
- mem[0] =
- gst_egl_image_allocator_wrap (allocator, context,
- image, texture_types[0], flags, size, client_buffer_tex[0],
- (GstEGLImageDestroyNotify) gst_egl_image_memory_del_gl_texture);
- n_mem = 1;
- }
- break;
- }
-
- case GST_VIDEO_FORMAT_NV12:
- case GST_VIDEO_FORMAT_NV21:
- {
- gsize size[2];
-
- texture_types[0] = GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE;
- texture_types[1] = GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA;
-#if 0
- mem[0] =
- gst_egl_image_allocator_alloc (allocator, context,
- texture_types[0], GST_VIDEO_INFO_COMP_WIDTH (info,
- 0), GST_VIDEO_INFO_COMP_HEIGHT (info, 0), size[0]);
- mem[1] =
- gst_egl_image_allocator_alloc (allocator, context,
- texture_types[1],
- GST_VIDEO_INFO_COMP_WIDTH (info, 1),
- GST_VIDEO_INFO_COMP_HEIGHT (info, 1), size[1]);
-
- if (mem[0] && mem[1]) {
- stride[0] = size[0] / GST_VIDEO_INFO_HEIGHT (info);
- offset[1] = size[0];
- stride[1] = size[1] / GST_VIDEO_INFO_HEIGHT (info);
- n_mem = 2;
- GST_MINI_OBJECT_FLAG_SET (mem[0], GST_MEMORY_FLAG_NO_SHARE);
- GST_MINI_OBJECT_FLAG_SET (mem[1], GST_MEMORY_FLAG_NO_SHARE);
- } else {
- if (mem[0])
- gst_memory_unref (mem[0]);
- if (mem[1])
- gst_memory_unref (mem[1]);
- mem[0] = mem[1] = NULL;
- }
-#endif
- {
- for (i = 0; i < 2; i++) {
- gst_gl_generate_texture_full (GST_GL_CONTEXT (context), info, 0,
- stride, offset, size, (GLuint *) & client_buffer_tex[i]);
-
- image = context->eglCreateImage (context->egl_display,
- context->egl_context, EGL_GL_TEXTURE_2D_KHR, client_buffer_tex[i],
- NULL);
- if (eglGetError () != EGL_SUCCESS)
- goto mem_error;
-
- mem[i] =
- gst_egl_image_allocator_wrap (allocator, context,
- image, texture_types[i], flags, size[i], client_buffer_tex[i],
- (GstEGLImageDestroyNotify) gst_egl_image_memory_del_gl_texture);
- }
-
- n_mem = 2;
- }
- break;
- }
- case GST_VIDEO_FORMAT_I420:
- case GST_VIDEO_FORMAT_YV12:
- case GST_VIDEO_FORMAT_Y444:
- case GST_VIDEO_FORMAT_Y42B:
- case GST_VIDEO_FORMAT_Y41B:
- {
- gsize size[3];
-
- texture_types[0] = GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE;
- texture_types[1] = GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE;
- texture_types[2] = GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE;
-#if 0
- mem[0] =
- gst_egl_image_allocator_alloc (allocator, context,
- texture_types[0], GST_VIDEO_INFO_COMP_WIDTH (info,
- 0), GST_VIDEO_INFO_COMP_HEIGHT (info, 0), size[0]);
- mem[1] =
- gst_egl_image_allocator_alloc (allocator, context,
- texture_types[1], GST_VIDEO_INFO_COMP_WIDTH (info,
- 1), GST_VIDEO_INFO_COMP_HEIGHT (info, 1), size[1]);
- mem[2] =
- gst_egl_image_allocator_alloc (allocator, context,
- texture_types[2], GST_VIDEO_INFO_COMP_WIDTH (info,
- 2), GST_VIDEO_INFO_COMP_HEIGHT (info, 2), size[2]);
-
- if (mem[0] && mem[1] && mem[2]) {
- stride[0] = size[0] / GST_VIDEO_INFO_HEIGHT (info);
- offset[1] = size[0];
- stride[1] = size[1] / GST_VIDEO_INFO_HEIGHT (info);
- offset[2] = size[1];
- stride[2] = size[2] / GST_VIDEO_INFO_HEIGHT (info);
- n_mem = 3;
- GST_MINI_OBJECT_FLAG_SET (mem[0], GST_MEMORY_FLAG_NO_SHARE);
- GST_MINI_OBJECT_FLAG_SET (mem[1], GST_MEMORY_FLAG_NO_SHARE);
- GST_MINI_OBJECT_FLAG_SET (mem[2], GST_MEMORY_FLAG_NO_SHARE);
- } else {
- if (mem[0])
- gst_memory_unref (mem[0]);
- if (mem[1])
- gst_memory_unref (mem[1]);
- if (mem[2])
- gst_memory_unref (mem[2]);
- mem[0] = mem[1] = mem[2] = NULL;
- }
-#endif
- {
- for (i = 0; i < 3; i++) {
- gst_gl_generate_texture_full (GST_GL_CONTEXT (context), info, i,
- stride, offset, size, (GLuint *) & client_buffer_tex[i]);
-
- image = context->eglCreateImage (context->egl_display,
- context->egl_context, EGL_GL_TEXTURE_2D_KHR, client_buffer_tex[i],
- NULL);
- if (eglGetError () != EGL_SUCCESS)
- goto mem_error;
-
- mem[i] =
- gst_egl_image_allocator_wrap (allocator, context,
- image, texture_types[i], flags, size[i], client_buffer_tex[i],
- (GstEGLImageDestroyNotify) gst_egl_image_memory_del_gl_texture);
- }
-
- n_mem = 3;
- }
- break;
- }
- default:
- g_assert_not_reached ();
- break;
- }
-
- gst_buffer_add_video_meta_full (buffer, 0, GST_VIDEO_INFO_FORMAT (info),
- GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info),
- GST_VIDEO_INFO_N_PLANES (info), offset, stride);
-
- gst_buffer_add_video_gl_texture_upload_meta (buffer,
- gst_egl_image_memory_get_orientation (mem[0]), n_mem, texture_types,
- gst_eglimage_to_gl_texture_upload_meta, NULL, NULL, NULL);
-
- for (i = 0; i < n_mem; i++)
- gst_buffer_append_memory (buffer, mem[i]);
-
- return TRUE;
-
-mem_error:
- {
- GST_CAT_ERROR (GST_CAT_DEFAULT, "Failed to create EGLImage");
-
- for (i = 0; i < 3; i++) {
- if (client_buffer_tex[i])
- gst_gl_context_del_texture (ctx, (GLuint *) & client_buffer_tex[i]);
- if (mem[i])
- gst_memory_unref (mem[i]);
- }
-
- return FALSE;
- }
-}
diff --git a/gst-libs/gst/gl/egl/gsteglimagememory.h b/gst-libs/gst/gl/egl/gsteglimagememory.h
deleted file mode 100644
index aced247..0000000
--- a/gst-libs/gst/gl/egl/gsteglimagememory.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * GStreamer
- * Copyright (C) 2012 Collabora Ltd.
- * @author: Sebastian Dröge <sebastian.droege@collabora.co.uk>
- * Copyright (C) 2014 Julien Isorce <julien.isorce@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_EGL_IMAGE_MEMORY_H_
-#define _GST_EGL_IMAGE_MEMORY_H_
-
-#include <gst/gst.h>
-#include <gst/gstallocator.h>
-#include <gst/gstmemory.h>
-#include <gst/video/video.h>
-
-#include <gst/gl/gl.h>
-#include "gstglcontext_egl.h"
-
-G_BEGIN_DECLS
-
-typedef void (*GstEGLImageDestroyNotify) (GstGLContextEGL * context,
- gpointer data);
-
-typedef struct _GstEGLImageMemory GstEGLImageMemory;
-
-#define GST_EGL_IMAGE_MEMORY_TYPE "EGLImage"
-
-#define GST_CAPS_FEATURE_MEMORY_EGL_IMAGE "memory:EGLImage"
-
-struct _GstEGLImageMemory
-{
- GstMemory parent;
-
- GstGLContextEGL *context;
- EGLImageKHR image;
- GstVideoGLTextureType type;
- GstVideoGLTextureOrientation orientation;
-
- gpointer user_data;
- GstEGLImageDestroyNotify user_data_destroy;
-};
-
-void gst_egl_image_memory_init (void);
-gboolean gst_egl_image_memory_setup_buffer (GstGLContext * context, GstVideoInfo * info, GstBuffer * buffer);
-gboolean gst_is_egl_image_memory (GstMemory * mem);
-EGLImageKHR gst_egl_image_memory_get_image (GstMemory * mem);
-EGLDisplay gst_egl_image_memory_get_display (GstMemory * mem);
-GstVideoGLTextureOrientation gst_egl_image_memory_get_orientation (GstMemory * mem);
-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 ceafdf3..057c6a9 100644
--- a/gst-libs/gst/gl/egl/gstglcontext_egl.c
+++ b/gst-libs/gst/gl/egl/gstglcontext_egl.c
@@ -309,8 +309,8 @@
GstGLContextEGL *egl;
GstGLWindow *window = NULL;
EGLNativeWindowType window_handle = (EGLNativeWindowType) 0;
- EGLint majorVersion;
- EGLint minorVersion;
+ EGLint egl_major;
+ EGLint egl_minor;
gboolean need_surface = TRUE;
guintptr external_gl_context = 0;
GstGLDisplay *display;
@@ -363,8 +363,8 @@
}
gst_object_unref (display);
- if (eglInitialize (egl->egl_display, &majorVersion, &minorVersion)) {
- GST_INFO ("egl initialized, version: %d.%d", majorVersion, minorVersion);
+ if (eglInitialize (egl->egl_display, &egl_major, &egl_minor)) {
+ GST_INFO ("egl initialized, version: %d.%d", egl_major, egl_minor);
} else {
g_set_error (error, GST_GL_CONTEXT_ERROR,
GST_GL_CONTEXT_ERROR_RESOURCE_UNAVAILABLE,
@@ -380,16 +380,16 @@
gint i;
/* egl + opengl only available with EGL 1.4+ */
- if (majorVersion == 1 && minorVersion <= 3) {
+ if (egl_major == 1 && egl_minor <= 3) {
if ((gl_api & ~GST_GL_API_OPENGL) == GST_GL_API_NONE) {
g_set_error (error, GST_GL_CONTEXT_ERROR, GST_GL_CONTEXT_ERROR_OLD_LIBS,
"EGL version (%i.%i) too old for OpenGL support, (needed at least 1.4)",
- majorVersion, minorVersion);
+ egl_major, egl_minor);
goto failure;
} else {
GST_WARNING
("EGL version (%i.%i) too old for OpenGL support, (needed at least 1.4)",
- majorVersion, minorVersion);
+ egl_major, egl_minor);
if (gl_api & GST_GL_API_GLES2) {
goto try_gles2;
} else {
@@ -599,22 +599,28 @@
}
/* EGLImage functions */
- if (GST_GL_CHECK_GL_VERSION (majorVersion, minorVersion, 1, 5)) {
+ if (GST_GL_CHECK_GL_VERSION (egl_major, egl_minor, 1, 5)) {
egl->eglCreateImage = gst_gl_context_get_proc_address (context,
"eglCreateImage");
egl->eglDestroyImage = gst_gl_context_get_proc_address (context,
"eglDestroyImage");
+ if (egl->eglCreateImage == NULL || egl->eglDestroyImage == NULL) {
+ egl->eglCreateImage = NULL;
+ egl->eglDestroyImage = NULL;
+ }
} else if (gst_gl_check_extension ("EGL_KHR_image_base", egl->egl_exts)) {
- egl->eglCreateImage = gst_gl_context_get_proc_address (context,
+ egl->eglCreateImageKHR = gst_gl_context_get_proc_address (context,
"eglCreateImageKHR");
egl->eglDestroyImage = gst_gl_context_get_proc_address (context,
"eglDestroyImageKHR");
+ if (egl->eglCreateImageKHR == NULL || egl->eglDestroyImage == NULL) {
+ egl->eglCreateImageKHR = NULL;
+ egl->eglDestroyImage = NULL;
+ }
}
- if (egl->eglCreateImage == NULL || egl->eglDestroyImage == NULL) {
- egl->eglCreateImage = NULL;
- egl->eglDestroyImage = NULL;
- }
-
+ egl->egl_major = egl_major;
+ egl->egl_minor = egl_minor;
+
if (window)
gst_object_unref (window);
@@ -817,7 +823,11 @@
GstGLContextEGL *context_egl = GST_GL_CONTEXT_EGL (context);
if (g_strcmp0 (feature, "EGL_KHR_image_base") == 0) {
- return context_egl->eglCreateImage != NULL &&
+ if (GST_GL_CHECK_GL_VERSION (context_egl->egl_major, context_egl->egl_minor, 1, 5))
+ return context_egl->eglCreateImage != NULL &&
+ context_egl->eglDestroyImage != NULL;
+ else
+ return context_egl->eglCreateImageKHR != NULL &&
context_egl->eglDestroyImage != NULL;
}
diff --git a/gst-libs/gst/gl/egl/gstglcontext_egl.h b/gst-libs/gst/gl/egl/gstglcontext_egl.h
index 90abb03..c73cd02 100644
--- a/gst-libs/gst/gl/egl/gstglcontext_egl.h
+++ b/gst-libs/gst/gl/egl/gstglcontext_egl.h
@@ -46,12 +46,17 @@
EGLSurface egl_surface;
EGLConfig egl_config;
+ gint egl_major;
+ gint egl_minor;
+
GstGLAPI gl_api;
const gchar *egl_exts;
- EGLImageKHR (*eglCreateImage) (EGLDisplay dpy, EGLContext ctx, EGLenum target,
+ EGLImageKHR (*eglCreateImageKHR) (EGLDisplay dpy, EGLContext ctx, EGLenum target,
EGLClientBuffer buffer, const EGLint *attrib_list);
+ EGLImageKHR (*eglCreateImage) (EGLDisplay dpy, EGLContext ctx, EGLenum target,
+ EGLClientBuffer buffer, const EGLAttrib *attrib_list);
EGLBoolean (*eglDestroyImage) (EGLDisplay dpy, EGLImageKHR image);
/* Cached handle */
diff --git a/gst-libs/gst/gl/egl/gstgldisplay_egl.c b/gst-libs/gst/gl/egl/gstgldisplay_egl.c
index 9acf4f0..c0c8022 100644
--- a/gst-libs/gst/gl/egl/gstgldisplay_egl.c
+++ b/gst-libs/gst/gl/egl/gstgldisplay_egl.c
@@ -23,7 +23,8 @@
#endif
#include <gst/gl/egl/gstgldisplay_egl.h>
-#include <gst/gl/egl/gsteglimagememory.h>
+#include <gst/gl/egl/gsteglimage.h>
+#include <gst/gl/egl/gstglmemoryegl.h>
GST_DEBUG_CATEGORY_STATIC (gst_gl_display_debug);
#define GST_CAT_DEFAULT gst_gl_display_debug
@@ -50,7 +51,7 @@
display->type = GST_GL_DISPLAY_TYPE_EGL;
display_egl->foreign_display = FALSE;
- gst_egl_image_memory_init ();
+ gst_gl_memory_egl_init_once ();
}
static void
diff --git a/gst-libs/gst/gl/egl/gstglmemoryegl.c b/gst-libs/gst/gl/egl/gstglmemoryegl.c
new file mode 100644
index 0000000..cde47ca
--- /dev/null
+++ b/gst-libs/gst/gl/egl/gstglmemoryegl.c
@@ -0,0 +1,251 @@
+/*
+ * GStreamer
+ * Copyright (C) 2012 Collabora Ltd.
+ * @author: Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ * Copyright (C) 2014 Julien Isorce <julien.isorce@gmail.com>
+ * Copyright (C) 2015 Igalia
+ * Author: Gwang Yoon Hwang <yoon@igalia.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/egl/gstglmemoryegl.h>
+
+static GstAllocator *_gl_memory_egl_allocator;
+
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_GL_MEMORY);
+#define GST_CAT_DEFAULT GST_CAT_GL_MEMORY
+
+#define parent_class gst_gl_memory_egl_allocator_parent_class
+G_DEFINE_TYPE (GstGLMemoryEGLAllocator, gst_gl_memory_egl_allocator,
+ GST_TYPE_GL_MEMORY_ALLOCATOR);
+
+gboolean
+gst_is_gl_memory_egl (GstMemory * mem)
+{
+ return mem != NULL && mem->allocator != NULL
+ && g_type_is_a (G_OBJECT_TYPE (mem->allocator),
+ GST_TYPE_GL_MEMORY_EGL_ALLOCATOR);
+}
+
+static GstGLMemoryEGL *
+_gl_mem_get_parent (GstGLMemoryEGL * gl_mem)
+{
+ GstGLMemoryEGL *parent = (GstGLMemoryEGL *) gl_mem->mem.mem.mem.parent;
+ return parent ? parent : gl_mem;
+}
+
+EGLImageKHR
+gst_gl_memory_egl_get_image (GstGLMemoryEGL * mem)
+{
+ g_return_val_if_fail (gst_is_gl_memory_egl (GST_MEMORY_CAST (mem)),
+ EGL_NO_IMAGE_KHR);
+ return gst_egl_image_get_image (_gl_mem_get_parent (mem)->image);
+}
+
+EGLDisplay
+gst_gl_memory_egl_get_display (GstGLMemoryEGL * mem)
+{
+ g_return_val_if_fail (gst_is_gl_memory_egl (GST_MEMORY_CAST (mem)), NULL);
+ return GST_GL_CONTEXT_EGL (_gl_mem_get_parent (mem)->mem.mem.
+ context)->egl_display;
+}
+
+GstVideoGLTextureOrientation
+gst_gl_memory_egl_get_orientation (GstGLMemoryEGL * mem)
+{
+ g_return_val_if_fail (gst_is_gl_memory_egl (GST_MEMORY_CAST (mem)),
+ GST_VIDEO_GL_TEXTURE_ORIENTATION_X_NORMAL_Y_NORMAL);
+
+ return gst_egl_image_get_orientation (_gl_mem_get_parent (mem)->image);
+}
+
+static GstMemory *
+_gl_mem_alloc (GstAllocator * allocator, gsize size,
+ GstAllocationParams * params)
+{
+ g_warning ("Use gst_gl_base_memory_allocator_alloc() to allocate from this "
+ "GstGLMemoryEGL allocator");
+
+ return NULL;
+}
+
+static void
+_gl_mem_destroy (GstGLMemoryEGL * mem)
+{
+ if (mem->image)
+ gst_egl_image_unref (mem->image);
+
+ GST_GL_BASE_MEMORY_ALLOCATOR_CLASS (parent_class)->destroy ((GstGLBaseMemory
+ *) mem);
+}
+
+static GstGLMemoryEGL *
+_gl_mem_egl_alloc (GstGLBaseMemoryAllocator * allocator,
+ GstGLVideoAllocationParams * params)
+{
+ guint alloc_flags = params->parent.alloc_flags;
+ GstGLMemoryEGL *mem;
+
+ g_return_val_if_fail (alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_VIDEO,
+ NULL);
+ g_return_val_if_fail ((alloc_flags &
+ GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_SYSMEM) == 0, NULL);
+ if (alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE) {
+ g_return_val_if_fail (GST_IS_EGL_IMAGE (params->parent.gl_handle), NULL);
+ }
+
+ mem = g_new0 (GstGLMemoryEGL, 1);
+ if (alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE) {
+ if (params->target != GST_GL_TEXTURE_TARGET_2D) {
+ g_free (mem);
+ GST_CAT_ERROR (GST_CAT_GL_MEMORY, "GstGLMemoryEGL only supports wrapping "
+ "2D textures");
+ return NULL;
+ }
+ mem->image = gst_egl_image_ref (params->parent.gl_handle);
+ }
+
+ gst_gl_memory_init (GST_GL_MEMORY_CAST (mem), GST_ALLOCATOR_CAST (allocator),
+ NULL, params->parent.context, params->target, params->tex_type,
+ params->parent.alloc_params, params->v_info, params->plane,
+ params->valign, params->parent.user_data, params->parent.notify);
+
+ return mem;
+}
+
+static void
+_destroy_egl_image (GstEGLImage * image, gpointer user_data)
+{
+ image->context->eglDestroyImage (image->context->egl_display, image->image);
+}
+
+static gboolean
+_gl_mem_create (GstGLMemoryEGL * gl_mem, GError ** error)
+{
+ GstGLContext *context = gl_mem->mem.mem.context;
+ GstGLContextEGL *ctx_egl = GST_GL_CONTEXT_EGL (context);
+ const GstGLFuncs *gl = context->gl_vtable;
+ GstGLBaseMemoryAllocatorClass *alloc_class;
+
+ if (!gst_gl_context_check_feature (GST_GL_CONTEXT (context),
+ "EGL_KHR_image_base")) {
+ g_set_error (error, GST_GL_CONTEXT_ERROR, GST_GL_CONTEXT_ERROR_WRONG_API,
+ "EGL_KHR_image_base is not supported");
+ return FALSE;
+ }
+
+ alloc_class = GST_GL_BASE_MEMORY_ALLOCATOR_CLASS (parent_class);
+ if (!alloc_class->create ((GstGLBaseMemory *) gl_mem, error))
+ return FALSE;
+
+ if (gl_mem->image == NULL) {
+ EGLImageKHR image = ctx_egl->eglCreateImageKHR (ctx_egl->egl_display,
+ ctx_egl->egl_context, EGL_GL_TEXTURE_2D_KHR,
+ (EGLClientBuffer) (guintptr) gl_mem->mem.tex_id, NULL);
+
+ GST_TRACE ("Generating EGLImage handle:%p from a texture:%u",
+ gl_mem->image, gl_mem->mem.tex_id);
+
+ if (eglGetError () != EGL_SUCCESS) {
+ g_set_error (error, GST_GL_CONTEXT_ERROR, GST_GL_CONTEXT_ERROR_FAILED,
+ "Failed to create EGLImage");
+ return FALSE;
+ }
+
+ gl_mem->image = gst_egl_image_new_wrapped (context, image, 0, 0,
+ (GstEGLImageDestroyNotify) _destroy_egl_image, NULL);
+ } else {
+ gl->ActiveTexture (GL_TEXTURE0 + gl_mem->mem.plane);
+ gl->BindTexture (GL_TEXTURE_2D, gl_mem->mem.tex_id);
+ gl->EGLImageTargetTexture2D (GL_TEXTURE_2D,
+ gst_egl_image_get_image (GST_EGL_IMAGE (gl_mem->image)));
+ }
+
+ return TRUE;
+}
+
+static GstMemory *
+_gl_mem_copy (GstGLMemoryEGL * src, gssize offset, gssize size)
+{
+ GST_CAT_ERROR (GST_CAT_GL_MEMORY, "GstGLMemoryEGL does not support copy");
+ return NULL;
+}
+
+static void
+gst_gl_memory_egl_allocator_class_init (GstGLMemoryEGLAllocatorClass * 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_egl_alloc;
+ gl_base->create = (GstGLBaseMemoryAllocatorCreateFunction) _gl_mem_create;
+ gl_base->destroy = (GstGLBaseMemoryAllocatorDestroyFunction) _gl_mem_destroy;
+ gl_tex->copy = (GstGLBaseMemoryAllocatorCopyFunction) _gl_mem_copy;
+
+ allocator_class->alloc = _gl_mem_alloc;
+}
+
+static void
+gst_gl_memory_egl_allocator_init (GstGLMemoryEGLAllocator * allocator)
+{
+ GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator);
+
+ alloc->mem_type = GST_GL_MEMORY_EGL_ALLOCATOR_NAME;
+
+ GST_OBJECT_FLAG_SET (allocator, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC);
+}
+
+/**
+ * gst_gl_memory_egl_init_once:
+ *
+ * Initializes the GL Memory allocator. It is safe to call this function
+ * multiple times. This must be called before any other GstGLMemoryEGL operation.
+ */
+void
+gst_gl_memory_egl_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 Texture with EGLImage memory");
+
+ _gl_memory_egl_allocator =
+ g_object_new (GST_TYPE_GL_MEMORY_EGL_ALLOCATOR, NULL);
+
+ /* The allocator is never unreffed */
+ GST_OBJECT_FLAG_SET (_gl_memory_egl_allocator,
+ GST_OBJECT_FLAG_MAY_BE_LEAKED);
+
+ gst_allocator_register (GST_GL_MEMORY_EGL_ALLOCATOR_NAME,
+ gst_object_ref (_gl_memory_egl_allocator));
+ g_once_init_leave (&_init, 1);
+ }
+}
diff --git a/gst-libs/gst/gl/egl/gstglmemoryegl.h b/gst-libs/gst/gl/egl/gstglmemoryegl.h
new file mode 100644
index 0000000..c05ef82
--- /dev/null
+++ b/gst-libs/gst/gl/egl/gstglmemoryegl.h
@@ -0,0 +1,99 @@
+/*
+ * GStreamer
+ * Copyright (C) 2012 Collabora Ltd.
+ * @author: Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ * Copyright (C) 2014 Julien Isorce <julien.isorce@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_MEMORY_EGL_H_
+#define _GST_GL_MEMORY_EGL_H_
+
+#include <gst/gst.h>
+#include <gst/gstallocator.h>
+#include <gst/gstmemory.h>
+#include <gst/video/video.h>
+
+#include <gst/gl/gl.h>
+#include <gst/gl/egl/gstglcontext_egl.h>
+#include <gst/gl/egl/gsteglimage.h>
+
+#include <gst/gl/gstglmemory.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_GL_MEMORY_EGL_ALLOCATOR (gst_gl_memory_egl_allocator_get_type())
+GType gst_gl_memory_egl_allocator_get_type(void);
+
+#define GST_IS_GL_MEMORY_EGL_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GL_MEMORY_EGL_ALLOCATOR))
+#define GST_IS_GL_MEMORY_EGL_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GL_MEMORY_EGL_ALLOCATOR))
+#define GST_GL_MEMORY_EGL_ALLOCATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_GL_MEMORY_EGL_ALLOCATOR, GstGLMemoryEGLAllocatorClass))
+#define GST_GL_MEMORY_EGL_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GL_MEMORY_EGL_ALLOCATOR, GstGLMemoryEGLAllocator))
+#define GST_GL_MEMORY_EGL_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GL_MEMORY_EGL_ALLOCATOR, GstGLAllocatorClass))
+#define GST_GL_MEMORY_EGL_ALLOCATOR_CAST(obj) ((GstGLMemoryEGLAllocator *)(obj))
+
+/**
+ * GstGLMemoryEGL:
+ *
+ * Private instance
+ */
+struct _GstGLMemoryEGL
+{
+ GstGLMemory mem;
+
+ GstEGLImage *image;
+};
+
+/**
+ * GST_GL_MEMORY_EGL_ALLOCATOR:
+ *
+ * The name of the GL Memory EGL allocator
+ */
+#define GST_GL_MEMORY_EGL_ALLOCATOR_NAME "GLMemoryEGL"
+
+void gst_gl_memory_egl_init_once (void);
+gboolean gst_is_gl_memory_egl (GstMemory * mem);
+
+EGLImageKHR gst_gl_memory_egl_get_image (GstGLMemoryEGL * mem);
+EGLDisplay gst_gl_memory_egl_get_display (GstGLMemoryEGL * mem);
+
+GstVideoGLTextureOrientation gst_gl_memory_egl_get_orientation
+ (GstGLMemoryEGL * mem);
+
+/**
+ * GstGLAllocator
+ *
+ * Opaque #GstGLAllocator struct
+ */
+struct _GstGLMemoryEGLAllocator
+{
+ GstGLMemoryAllocator parent;
+};
+
+/**
+ * GstGLAllocatorClass:
+ *
+ * The #GstGLAllocatorClass only contains private data
+ */
+struct _GstGLMemoryEGLAllocatorClass
+{
+ GstGLMemoryAllocatorClass parent_class;
+};
+
+G_END_DECLS
+
+#endif /* _GST_GL_MEMORY_EGL_H_ */
diff --git a/gst-libs/gst/gl/gl.h b/gst-libs/gst/gl/gl.h
index b17a4c6..9547386 100644
--- a/gst-libs/gst/gl/gl.h
+++ b/gst-libs/gst/gl/gl.h
@@ -45,6 +45,7 @@
#include <gst/gl/gstglbuffer.h>
#include <gst/gl/gstglmemory.h>
#include <gst/gl/gstglmemorypbo.h>
+#include <gst/gl/gstglrenderbuffer.h>
#include <gst/gl/gstglbufferpool.h>
#include <gst/gl/gstglframebuffer.h>
#include <gst/gl/gstglbasefilter.h>
diff --git a/gst-libs/gst/gl/glprototypes/Makefile.in b/gst-libs/gst/gl/glprototypes/Makefile.in
index 3284cc2..b1819df 100644
--- a/gst-libs/gst/gl/glprototypes/Makefile.in
+++ b/gst-libs/gst/gl/glprototypes/Makefile.in
@@ -265,6 +265,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -286,6 +288,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -335,6 +339,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -480,6 +486,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -606,8 +614,6 @@
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@
@@ -650,8 +656,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst-libs/gst/gl/glprototypes/gstgl_gles2compat.h b/gst-libs/gst/gl/glprototypes/gstgl_gles2compat.h
index d282990..6dfd2c3 100644
--- a/gst-libs/gst/gl/glprototypes/gstgl_gles2compat.h
+++ b/gst-libs/gst/gl/glprototypes/gstgl_gles2compat.h
@@ -27,23 +27,30 @@
G_BEGIN_DECLS
-/* SUPPORTED */
-//FIXME:
+#ifndef GL_RGB16
#define GL_RGB16 GL_RGB565
+#endif
+#ifndef GL_RGB8
#define GL_RGB8 GL_RGB
-//END FIXME
+#endif
/* UNSUPPORTED */
-#define GL_COLOR_ATTACHMENT1 0
-#define GL_COLOR_ATTACHMENT2 0
+#ifndef GL_COLOR_ATTACHMENT1
+#define GL_COLOR_ATTACHMENT1 0x8CE1
+#endif
+#ifndef GL_COLOR_ATTACHMENT2
+#define GL_COLOR_ATTACHMENT2 0x8CE2
+#endif
#ifndef GL_TEXTURE_ENV
#define GL_TEXTURE_ENV 0
#endif
#ifndef GL_TEXTURE_ENV_MODE
#define GL_TEXTURE_ENV_MODE 0
#endif
-#define GL_DEPTH24_STENCIL8 0
+#ifndef GL_DEPTH24_STENCIL8
+#define GL_DEPTH24_STENCIL8 0x88F0
+#endif
G_END_DECLS
diff --git a/gst-libs/gst/gl/glprototypes/shaders.h b/gst-libs/gst/gl/glprototypes/shaders.h
index 817e479..6d828db 100644
--- a/gst-libs/gst/gl/glprototypes/shaders.h
+++ b/gst-libs/gst/gl/glprototypes/shaders.h
@@ -362,3 +362,13 @@
GST_GL_EXT_FUNCTION (void, UniformMatrix4x3fv,
(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value))
GST_GL_EXT_END ()
+
+GST_GL_EXT_BEGIN (bind_frag_data,
+ GST_GL_API_OPENGL | GST_GL_API_OPENGL3,
+ 3, 0,
+ 255, 255,
+ "\0",
+ "\0")
+GST_GL_EXT_FUNCTION (void, BindFragDataLocation,
+ (GLuint program, GLuint index, const GLchar * name))
+GST_GL_EXT_END ()
diff --git a/gst-libs/gst/gl/gstgl_fwd.h b/gst-libs/gst/gl/gstgl_fwd.h
index fb64ff6..465e284 100644
--- a/gst-libs/gst/gl/gstgl_fwd.h
+++ b/gst-libs/gst/gl/gstgl_fwd.h
@@ -55,6 +55,18 @@
typedef struct _GstGLMemoryPBOAllocator GstGLMemoryPBOAllocator;
typedef struct _GstGLMemoryPBOAllocatorClass GstGLMemoryPBOAllocatorClass;
+typedef struct _GstGLMemoryEGL GstGLMemoryEGL;
+typedef struct _GstGLMemoryEGLAllocator GstGLMemoryEGLAllocator;
+typedef struct _GstGLMemoryEGLAllocatorClass GstGLMemoryEGLAllocatorClass;
+
+typedef struct _GstGLRenderbuffer GstGLRenderbuffer;
+typedef struct _GstGLRenderbufferAllocator GstGLRenderbufferAllocator;
+typedef struct _GstGLRenderbufferAllocatorClass GstGLRenderbufferAllocatorClass;
+
+typedef struct _GstGLFramebuffer GstGLFramebuffer;
+typedef struct _GstGLFramebufferAllocator GstGLFramebufferAllocator;
+typedef struct _GstGLFramebufferAllocatorClass GstGLFramebufferAllocatorClass;
+
typedef struct _GstGLSLStage GstGLSLStage;
typedef struct _GstGLSLStagePrivate GstGLSLStagePrivate;
typedef struct _GstGLSLStageClass GstGLSLStageClass;
diff --git a/gst-libs/gst/gl/gstglapi.h b/gst-libs/gst/gl/gstglapi.h
index be38113..93b60b7 100644
--- a/gst-libs/gst/gl/gstglapi.h
+++ b/gst-libs/gst/gl/gstglapi.h
@@ -39,8 +39,13 @@
# include <OpenGLES/ES2/gl.h>
# include <OpenGLES/ES2/glext.h>
# else
-# include <GLES2/gl2.h>
-# include <GLES2/gl2ext.h>
+# if GST_GL_HAVE_GLES3
+# include <GLES3/gl3.h>
+# include <GLES3/gl3ext.h>
+# else
+# include <GLES2/gl2.h>
+# include <GLES2/gl2ext.h>
+# endif
# endif
# if !GST_GL_HAVE_OPENGL
# include <gst/gl/glprototypes/gstgl_gles2compat.h>
diff --git a/gst-libs/gst/gl/gstglbasefilter.h b/gst-libs/gst/gl/gstglbasefilter.h
index fa16d07..f893127 100644
--- a/gst-libs/gst/gl/gstglbasefilter.h
+++ b/gst-libs/gst/gl/gstglbasefilter.h
@@ -58,7 +58,7 @@
GstCaps *out_caps;
/* <private> */
- gpointer _padding[GST_PADDING];
+ gpointer _padding[GST_PADDING];
GstGLBaseFilterPrivate *priv;
};
diff --git a/gst-libs/gst/gl/gstglbasememory.c b/gst-libs/gst/gl/gstglbasememory.c
index 7fc1d00..2d4c8c3 100644
--- a/gst-libs/gst/gl/gstglbasememory.c
+++ b/gst-libs/gst/gl/gstglbasememory.c
@@ -606,7 +606,7 @@
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,
+ gpointer wrapped_data, gpointer gl_handle, gpointer user_data,
GDestroyNotify notify)
{
memset (params, 0, sizeof (*params));
@@ -732,6 +732,8 @@
{
GstGLBaseMemoryAllocatorClass *alloc_class;
+ g_return_val_if_fail (GST_IS_GL_BASE_MEMORY_ALLOCATOR (allocator), NULL);
+
alloc_class = GST_GL_BASE_MEMORY_ALLOCATOR_GET_CLASS (allocator);
g_return_val_if_fail (alloc_class != NULL, NULL);
diff --git a/gst-libs/gst/gl/gstglbasememory.h b/gst-libs/gst/gl/gstglbasememory.h
index f862c85..22129d0 100644
--- a/gst-libs/gst/gl/gstglbasememory.h
+++ b/gst-libs/gst/gl/gstglbasememory.h
@@ -32,7 +32,7 @@
#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(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GL_BASE_MEMORY_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))
@@ -112,6 +112,8 @@
GDestroyNotify notify;
gpointer user_data;
+
+ gpointer _padding[GST_PADDING];
};
typedef struct _GstGLAllocationParams GstGLAllocationParams;
@@ -173,7 +175,10 @@
/* 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;
+ gpointer gl_handle;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
};
gboolean gst_gl_allocation_params_init (GstGLAllocationParams * params,
@@ -185,7 +190,7 @@
gsize alloc_size,
GstAllocationParams * alloc_params,
gpointer wrapped_data,
- guint gl_handle,
+ gpointer gl_handle,
gpointer user_data,
GDestroyNotify notify);
@@ -293,6 +298,8 @@
/*< private >*/
GstAllocator parent;
GstMemoryCopyFunction fallback_mem_copy;
+
+ gpointer _padding[GST_PADDING];
};
/**
@@ -315,13 +322,16 @@
GstGLBaseMemoryAllocatorCreateFunction create;
GstGLBaseMemoryAllocatorMapFunction map;
+ GstGLBaseMemoryAllocatorUnmapFunction unmap;
+ GstGLBaseMemoryAllocatorCopyFunction copy;
+ GstGLBaseMemoryAllocatorDestroyFunction destroy;
#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;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
};
#include <gst/gl/gl.h>
diff --git a/gst-libs/gst/gl/gstglbuffer.c b/gst-libs/gst/gl/gstglbuffer.c
index 2abdd6d..d50fd6d 100644
--- a/gst-libs/gst/gl/gstglbuffer.c
+++ b/gst-libs/gst/gl/gstglbuffer.c
@@ -456,6 +456,9 @@
_gl_buffer_allocator =
g_object_new (gst_gl_buffer_allocator_get_type (), NULL);
+ /* The allocator is never unreffed */
+ GST_OBJECT_FLAG_SET (_gl_buffer_allocator, GST_OBJECT_FLAG_MAY_BE_LEAKED);
+
gst_allocator_register (GST_GL_BUFFER_ALLOCATOR_NAME,
gst_object_ref (_gl_buffer_allocator));
g_once_init_leave (&_init, 1);
diff --git a/gst-libs/gst/gl/gstglbuffer.h b/gst-libs/gst/gl/gstglbuffer.h
index ef519d8..e481536 100644
--- a/gst-libs/gst/gl/gstglbuffer.h
+++ b/gst-libs/gst/gl/gstglbuffer.h
@@ -74,6 +74,9 @@
guint gl_target;
guint gl_usage;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
};
GstGLBufferAllocationParams * gst_gl_buffer_allocation_params_new (GstGLContext * context,
@@ -90,6 +93,9 @@
struct _GstGLBufferAllocator
{
GstGLBaseMemoryAllocator parent;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
};
/**
@@ -100,6 +106,9 @@
struct _GstGLBufferAllocatorClass
{
GstGLBaseMemoryAllocatorClass parent_class;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
};
#define GST_CAPS_FEATURE_MEMORY_GL_BUFFER "memory:GLBuffer"
diff --git a/gst-libs/gst/gl/gstglbufferpool.c b/gst-libs/gst/gl/gstglbufferpool.c
index 90536b0..218169a 100644
--- a/gst-libs/gst/gl/gstglbufferpool.c
+++ b/gst-libs/gst/gl/gstglbufferpool.c
@@ -26,10 +26,6 @@
#include "gstglbufferpool.h"
#include "gstglutils.h"
-#if GST_GL_HAVE_PLATFORM_EGL
-#include <gst/gl/egl/gsteglimagememory.h>
-#endif
-
/**
* SECTION:gstglbufferpool
* @short_description: buffer pool for #GstGLMemory objects
@@ -51,8 +47,6 @@
GstCaps *caps;
gboolean add_videometa;
gboolean add_glsyncmeta;
- gboolean want_eglimage;
- GstBuffer *last_buffer;
};
static void gst_gl_buffer_pool_finalize (GObject * object);
@@ -132,23 +126,13 @@
priv->add_glsyncmeta = gst_buffer_pool_config_has_option (config,
GST_BUFFER_POOL_OPTION_GL_SYNC_META);
-#if GST_GL_HAVE_PLATFORM_EGL
- 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);
+ &alloc_params, &info, -1, NULL, 0, 0);
max_align = alloc_params.align;
@@ -276,22 +260,9 @@
if (!(buf = gst_buffer_new ())) {
goto no_buffer;
}
-#if GST_GL_HAVE_PLATFORM_EGL
- if (priv->want_eglimage) {
- /* alloc and append memories, also add video_meta and
- * texture_upload_meta */
- if (!gst_egl_image_memory_setup_buffer (glpool->context,
- priv->gl_params->v_info, buf))
- goto egl_image_mem_create_failed;
-
- *buffer = buf;
-
- return GST_FLOW_OK;
- }
-#endif
alloc = GST_GL_MEMORY_ALLOCATOR (priv->allocator);
- if (!gst_gl_memory_setup_buffer (alloc, buf, priv->gl_params))
+ if (!gst_gl_memory_setup_buffer (alloc, buf, priv->gl_params, NULL, NULL, 0))
goto mem_create_failed;
if (priv->add_glsyncmeta)
@@ -312,48 +283,6 @@
GST_WARNING_OBJECT (pool, "Could not create GL Memory");
return GST_FLOW_ERROR;
}
-
-#if GST_GL_HAVE_PLATFORM_EGL
-egl_image_mem_create_failed:
- {
- GST_WARNING_OBJECT (pool, "Could not create EGLImage Memory");
- return GST_FLOW_ERROR;
- }
-#endif
-}
-
-
-static GstFlowReturn
-gst_gl_buffer_pool_acquire_buffer (GstBufferPool * bpool,
- GstBuffer ** buffer, GstBufferPoolAcquireParams * params)
-{
- GstFlowReturn ret = GST_FLOW_OK;
- GstGLBufferPool *glpool = NULL;
-
- ret =
- GST_BUFFER_POOL_CLASS
- (gst_gl_buffer_pool_parent_class)->acquire_buffer (bpool, buffer, params);
- if (ret != GST_FLOW_OK || !*buffer)
- return ret;
-
- glpool = GST_GL_BUFFER_POOL (bpool);
-
- /* XXX: Don't return the memory we just rendered, glEGLImageTargetTexture2DOES()
- * keeps the EGLImage unmappable until the next one is uploaded
- */
- if (glpool->priv->want_eglimage && *buffer
- && *buffer == glpool->priv->last_buffer) {
- GstBuffer *oldbuf = *buffer;
-
- ret =
- GST_BUFFER_POOL_CLASS
- (gst_gl_buffer_pool_parent_class)->acquire_buffer (bpool,
- buffer, params);
- gst_object_replace ((GstObject **) & oldbuf->pool, (GstObject *) glpool);
- gst_buffer_unref (oldbuf);
- }
-
- return ret;
}
/**
@@ -376,24 +305,6 @@
return GST_BUFFER_POOL_CAST (pool);
}
-/**
- * gst_gl_buffer_pool_replace_last_buffer:
- * @pool: a #GstGLBufferPool
- * @buffer: a #GstBuffer
- *
- * Set @pool<-- -->s last buffer to @buffer for #GstGLPlatform<-- -->s that
- * require it.
- */
-void
-gst_gl_buffer_pool_replace_last_buffer (GstGLBufferPool * pool,
- GstBuffer * buffer)
-{
- g_return_if_fail (pool != NULL);
- g_return_if_fail (buffer != NULL);
-
- gst_buffer_replace (&pool->priv->last_buffer, buffer);
-}
-
static void
gst_gl_buffer_pool_class_init (GstGLBufferPoolClass * klass)
{
@@ -407,7 +318,6 @@
gstbufferpool_class->get_options = gst_gl_buffer_pool_get_options;
gstbufferpool_class->set_config = gst_gl_buffer_pool_set_config;
gstbufferpool_class->alloc_buffer = gst_gl_buffer_pool_alloc;
- gstbufferpool_class->acquire_buffer = gst_gl_buffer_pool_acquire_buffer;
gstbufferpool_class->start = gst_gl_buffer_pool_start;
}
@@ -423,8 +333,6 @@
priv->caps = NULL;
priv->add_videometa = TRUE;
priv->add_glsyncmeta = FALSE;
- priv->want_eglimage = FALSE;
- priv->last_buffer = FALSE;
}
static void
@@ -435,8 +343,6 @@
GST_LOG_OBJECT (pool, "finalize GL buffer pool %p", pool);
- gst_buffer_replace (&pool->priv->last_buffer, NULL);
-
if (priv->caps)
gst_caps_unref (priv->caps);
diff --git a/gst-libs/gst/gl/gstglbufferpool.h b/gst-libs/gst/gl/gstglbufferpool.h
index ee13366..a136955 100644
--- a/gst-libs/gst/gl/gstglbufferpool.h
+++ b/gst-libs/gst/gl/gstglbufferpool.h
@@ -47,7 +47,10 @@
GstGLContext *context;
+ /* <private> */
GstGLBufferPoolPrivate *priv;
+
+ gpointer _padding[GST_PADDING];
};
/**
@@ -58,11 +61,12 @@
struct _GstGLBufferPoolClass
{
GstBufferPoolClass parent_class;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
};
GstBufferPool *gst_gl_buffer_pool_new (GstGLContext * context);
-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,
diff --git a/gst-libs/gst/gl/gstglcolorconvert.c b/gst-libs/gst/gl/gstglcolorconvert.c
index eb3b4a8..e9eb88a 100644
--- a/gst-libs/gst/gl/gstglcolorconvert.c
+++ b/gst-libs/gst/gl/gstglcolorconvert.c
@@ -27,6 +27,7 @@
#include "gl.h"
#include "gstglcolorconvert.h"
+#include "gstglsl_private.h"
/**
* SECTION:gstglcolorconvert
@@ -261,9 +262,9 @@
" 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) / unnormalization).%c%c%c%c;\n"
+ " vec4 s = texture2D(tex, (chroma_pos + delta) / unnormalization).%c%c%c%c;\n"
/* rolling average */
- " uv_texel = (float(n-1) * uv_texel + sample) / float(n);\n"
+ " uv_texel = (float(n-1) * uv_texel + s) / float(n);\n"
" }\n"
" }\n"
"}\n"
@@ -413,6 +414,8 @@
GstGLMemory *in_tex[GST_VIDEO_MAX_PLANES];
GstGLMemory *out_tex[GST_VIDEO_MAX_PLANES];
+ GstVideoGLTextureType in_tex_types[GST_VIDEO_MAX_PLANES];
+
GLuint vao;
GLuint vertex_buffer;
GLuint vbo_indices;
@@ -520,23 +523,8 @@
}
static void
-gst_gl_color_convert_reset (GstGLColorConvert * convert)
+gst_gl_color_convert_reset_shader (GstGLColorConvert * convert)
{
- guint i;
-
- if (convert->fbo || convert->depth_buffer) {
- gst_gl_context_del_fbo (convert->context, convert->fbo,
- convert->depth_buffer);
- convert->fbo = 0;
- convert->depth_buffer = 0;
- }
-
- for (i = 0; i < convert->priv->convert_info.out_n_textures; i++) {
- if (convert->priv->out_tex[i])
- gst_memory_unref ((GstMemory *) convert->priv->out_tex[i]);
- convert->priv->out_tex[i] = NULL;
- }
-
convert->priv->convert_info.chroma_sampling[0] = 1.0f;
convert->priv->convert_info.chroma_sampling[1] = 1.0f;
@@ -553,12 +541,32 @@
convert->shader = NULL;
}
+ convert->initted = FALSE;
+}
+
+static void
+gst_gl_color_convert_reset (GstGLColorConvert * convert)
+{
+ guint i;
+
+ if (convert->fbo) {
+ gst_object_unref (convert->fbo);
+ convert->fbo = NULL;
+ }
+
+ for (i = 0; i < convert->priv->convert_info.out_n_textures; i++) {
+ if (convert->priv->out_tex[i])
+ gst_memory_unref ((GstMemory *) convert->priv->out_tex[i]);
+ convert->priv->out_tex[i] = NULL;
+ }
+
if (convert->priv->pool) {
convert->priv->pool_started = FALSE;
gst_object_unref (convert->priv->pool);
convert->priv->pool = NULL;
}
+
gst_caps_replace (&convert->priv->in_caps, NULL);
gst_caps_replace (&convert->priv->out_caps, NULL);
@@ -566,6 +574,8 @@
gst_gl_context_thread_add (convert->context,
(GstGLContextThreadFunc) _reset_gl, convert);
}
+
+ gst_gl_color_convert_reset_shader (convert);
}
static gboolean
@@ -788,7 +798,7 @@
GST_BUFFER_POOL_OPTION_GL_SYNC_META);
params = gst_gl_video_allocation_params_new (convert->context, NULL, &vinfo,
- 0, NULL, convert->priv->to_texture_target);
+ 0, NULL, convert->priv->to_texture_target, 0);
gst_buffer_pool_config_set_gl_allocation_params (config,
(GstGLAllocationParams *) params);
gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
@@ -1328,6 +1338,44 @@
return g_string_free (ret, discard_output);
}
+static guint
+_get_n_textures (GstVideoFormat v_format)
+{
+ switch (v_format) {
+ case GST_VIDEO_FORMAT_RGBA:
+ case GST_VIDEO_FORMAT_RGBx:
+ case GST_VIDEO_FORMAT_ARGB:
+ case GST_VIDEO_FORMAT_xRGB:
+ case GST_VIDEO_FORMAT_BGRA:
+ case GST_VIDEO_FORMAT_BGRx:
+ case GST_VIDEO_FORMAT_ABGR:
+ case GST_VIDEO_FORMAT_xBGR:
+ case GST_VIDEO_FORMAT_RGB:
+ case GST_VIDEO_FORMAT_BGR:
+ case GST_VIDEO_FORMAT_AYUV:
+ case GST_VIDEO_FORMAT_GRAY8:
+ case GST_VIDEO_FORMAT_GRAY16_LE:
+ case GST_VIDEO_FORMAT_GRAY16_BE:
+ case GST_VIDEO_FORMAT_YUY2:
+ case GST_VIDEO_FORMAT_UYVY:
+ case GST_VIDEO_FORMAT_RGB16:
+ case GST_VIDEO_FORMAT_BGR16:
+ return 1;
+ case GST_VIDEO_FORMAT_NV12:
+ case GST_VIDEO_FORMAT_NV21:
+ return 2;
+ case GST_VIDEO_FORMAT_I420:
+ case GST_VIDEO_FORMAT_Y444:
+ case GST_VIDEO_FORMAT_Y42B:
+ case GST_VIDEO_FORMAT_Y41B:
+ case GST_VIDEO_FORMAT_YV12:
+ return 3;
+ default:
+ g_assert_not_reached ();
+ return 0;
+ }
+}
+
static void
_RGB_to_RGB (GstGLColorConvert * convert)
{
@@ -1339,8 +1387,6 @@
gchar *pixel_order = _RGB_pixel_order (in_format_str, out_format_str);
gchar *alpha = NULL;
- info->in_n_textures = 1;
- info->out_n_textures = 1;
if (_is_RGBx (in_format)) {
int i;
char input_alpha_channel = 'a';
@@ -1368,13 +1414,6 @@
GstVideoFormat out_format = GST_VIDEO_INFO_FORMAT (&convert->out_info);
const gchar *out_format_str = gst_video_format_to_string (out_format);
gchar *pixel_order = _RGB_pixel_order ("rgba", out_format_str);
- gboolean texture_rg =
- gst_gl_context_check_feature (convert->context, "GL_EXT_texture_rg")
- || gst_gl_context_check_gl_version (convert->context, GST_GL_API_GLES2, 3,
- 0)
- || gst_gl_context_check_feature (convert->context, "GL_ARB_texture_rg")
- || gst_gl_context_check_gl_version (convert->context, GST_GL_API_OPENGL3,
- 3, 0);
gboolean apple_ycbcr = gst_gl_context_check_feature (convert->context,
"GL_APPLE_ycbcr_422");
gboolean in_tex_rectangular = FALSE;
@@ -1402,7 +1441,6 @@
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)) {
@@ -1410,7 +1448,6 @@
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";
break;
case GST_VIDEO_FORMAT_I420:
@@ -1421,7 +1458,6 @@
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";
info->shader_tex_names[1] = "Utex";
info->shader_tex_names[2] = "Vtex";
@@ -1431,51 +1467,54 @@
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";
info->shader_tex_names[1] = "Vtex";
info->shader_tex_names[2] = "Utex";
break;
case GST_VIDEO_FORMAT_YUY2:
{
- char uv_val = texture_rg ? 'g' : 'a';
+ char uv_val =
+ convert->priv->in_tex_types[0] ==
+ GST_VIDEO_GL_TEXTURE_TYPE_RG ? 'g' : 'a';
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';
+ char y_val =
+ convert->priv->in_tex_types[0] ==
+ GST_VIDEO_GL_TEXTURE_TYPE_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';
+ char val2 =
+ convert->priv->in_tex_types[1] ==
+ GST_VIDEO_GL_TEXTURE_TYPE_RG ? 'g' : 'a';
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";
info->shader_tex_names[1] = "UVtex";
break;
}
case GST_VIDEO_FORMAT_NV21:
{
- char val2 = texture_rg ? 'g' : 'a';
+ char val2 =
+ convert->priv->in_tex_types[1] ==
+ GST_VIDEO_GL_TEXTURE_TYPE_RG ? 'g' : 'a';
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;
@@ -1513,7 +1552,6 @@
const gchar *alpha;
info->frag_prog = NULL;
- info->in_n_textures = 1;
info->shader_tex_names[0] = "tex";
@@ -1609,7 +1647,6 @@
gchar *pixel_order = _RGB_pixel_order (in_format_str, "rgba");
gchar *alpha = NULL;
- info->in_n_textures = 1;
info->out_n_textures = 1;
info->shader_tex_names[0] = "tex";
@@ -1637,16 +1674,7 @@
GstVideoFormat out_format = GST_VIDEO_INFO_FORMAT (&convert->out_info);
const gchar *out_format_str = gst_video_format_to_string (out_format);
gchar *pixel_order = _RGB_pixel_order ("rgba", out_format_str);
- gboolean texture_rg =
- gst_gl_context_check_feature (convert->context, "GL_EXT_texture_rg")
- || gst_gl_context_check_gl_version (convert->context, GST_GL_API_GLES2, 3,
- 0)
- || gst_gl_context_check_feature (convert->context, "GL_ARB_texture_rg")
- || gst_gl_context_check_gl_version (convert->context, GST_GL_API_OPENGL3,
- 3, 0);
- info->in_n_textures = 1;
- info->out_n_textures = 1;
info->shader_tex_names[0] = "tex";
switch (GST_VIDEO_INFO_FORMAT (&convert->in_info)) {
@@ -1657,7 +1685,9 @@
break;
case GST_VIDEO_FORMAT_GRAY16_LE:
{
- char val2 = texture_rg ? 'g' : 'a';
+ char val2 =
+ convert->priv->in_tex_types[0] ==
+ GST_VIDEO_GL_TEXTURE_TYPE_RG ? 'g' : 'a';
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]);
@@ -1665,7 +1695,9 @@
}
case GST_VIDEO_FORMAT_GRAY16_BE:
{
- char val2 = texture_rg ? 'g' : 'a';
+ char val2 =
+ convert->priv->in_tex_types[0] ==
+ GST_VIDEO_GL_TEXTURE_TYPE_RG ? 'g' : 'a';
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]);
@@ -1710,178 +1742,6 @@
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)
{
@@ -1894,16 +1754,14 @@
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);
+ _gst_glsl_mangle_shader (text_vertex_shader, GL_VERTEX_SHADER,
+ info->templ->target, convert->priv->from_texture_target, convert->context,
+ &version, &profile);
tmp1 = gst_glsl_version_profile_to_string (version, profile);
version_str = g_strdup_printf ("#version %s\n", tmp1);
@@ -1941,9 +1799,37 @@
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");
+ g_string_append_c (str, '\n');
+
+ /* GL 3.3+ and GL ES 3.x */
+ if ((profile == GST_GLSL_PROFILE_CORE && version >= GST_GLSL_VERSION_330)
+ || (profile == GST_GLSL_PROFILE_ES && version >= GST_GLSL_VERSION_300)) {
+ if (info->out_n_textures > 1) {
+ gint i;
+
+ for (i = 0; i < info->out_n_textures; i++) {
+ g_string_append_printf (str,
+ "layout(location = %d) out vec4 fragColor_%d;\n", i, i);
+ }
+ } else {
+ g_string_append (str, "layout (location = 0) out vec4 fragColor;\n");
+ }
+ } else if (profile == GST_GLSL_PROFILE_CORE
+ && version >= GST_GLSL_VERSION_150) {
+ /* no layout specifiers, use glBindFragDataLocation instead */
+ if (info->out_n_textures > 1) {
+ gint i;
+
+ for (i = 0; i < info->out_n_textures; i++) {
+ gchar *var_name = g_strdup_printf ("fragColor_%d", i);
+ g_string_append_printf (str, "out vec4 %s;\n", var_name);
+ gst_gl_shader_bind_frag_data_location (ret, i, var_name);
+ g_free (var_name);
+ }
+ } else {
+ g_string_append (str, "out vec4 fragColor;\n");
+ gst_gl_shader_bind_frag_data_location (ret, 0, "fragColor");
+ }
}
for (i = 0; i < MAX_FUNCTIONS; i++) {
@@ -1955,7 +1841,19 @@
g_string_append_c (str, '\n');
}
- g_string_append (str, "\nvarying vec2 v_texcoord;\nvoid main (void) {\n");
+ {
+ const gchar *varying = NULL;
+
+ if ((profile == GST_GLSL_PROFILE_ES && version >= GST_GLSL_VERSION_300)
+ || (profile == GST_GLSL_PROFILE_CORE
+ && version >= GST_GLSL_VERSION_150)) {
+ varying = "in";
+ } else {
+ varying = "varying";
+ }
+ g_string_append_printf (str, "\n%s vec2 v_texcoord;\nvoid main (void) {\n",
+ varying);
+ }
if (info->frag_body) {
g_string_append (str, "vec2 texcoord;\n");
if (convert->priv->from_texture_target == GST_GL_TEXTURE_TARGET_RECTANGLE
@@ -1969,8 +1867,8 @@
}
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,
+ info->frag_prog = _gst_glsl_mangle_shader (tmp, GL_FRAGMENT_SHADER,
+ info->templ->target, convert->priv->from_texture_target, convert->context,
&version, &profile);
g_free (tmp);
@@ -2026,8 +1924,8 @@
gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (&convert->out_info)));
if (!gl->CreateProgramObject && !gl->CreateProgram) {
- gst_gl_context_set_error (convert->context,
- "Cannot perform color conversion without OpenGL shaders");
+ GST_ERROR_OBJECT (convert, "Cannot perform color conversion without "
+ "OpenGL shaders");
goto error;
}
@@ -2071,7 +1969,7 @@
}
/* Requires reading from a RG/LA framebuffer... */
- if (USING_GLES2 (convert->context) &&
+ if (USING_GLES2 (convert->context) && !USING_GLES3 (convert->context) &&
(GST_VIDEO_INFO_FORMAT (&convert->out_info) == GST_VIDEO_FORMAT_YUY2 ||
GST_VIDEO_INFO_FORMAT (&convert->out_info) ==
GST_VIDEO_FORMAT_UYVY)) {
@@ -2129,7 +2027,7 @@
gst_gl_context_clear_shader (convert->context);
- if (!_init_convert_fbo (convert)) {
+ if (convert->fbo == NULL && !_init_convert_fbo (convert)) {
goto error;
}
@@ -2165,8 +2063,7 @@
return TRUE;
unhandled_format:
- gst_gl_context_set_error (convert->context,
- "Don't know how to convert from %s to %s",
+ GST_ERROR_OBJECT (convert, "Don't know how to convert from %s to %s",
gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (&convert->in_info)),
gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (&convert->out_info)));
@@ -2175,8 +2072,7 @@
incompatible_api:
{
- gst_gl_context_set_error (convert->context,
- "Converting from %s to %s requires "
+ GST_ERROR_OBJECT (convert, "Converting from %s to %s requires "
"functionality that the current OpenGL setup does not support",
gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (&convert->in_info)),
gst_video_format_to_string (GST_VIDEO_INFO_FORMAT
@@ -2185,87 +2081,20 @@
}
}
-
/* called by _init_convert (in the gl thread) */
static gboolean
_init_convert_fbo (GstGLColorConvert * convert)
{
- GstGLFuncs *gl;
guint out_width, out_height;
- GLuint fake_texture = 0; /* a FBO must hava texture to init */
- GLenum internal_format;
-
- gl = convert->context->gl_vtable;
out_width = GST_VIDEO_INFO_WIDTH (&convert->out_info);
out_height = GST_VIDEO_INFO_HEIGHT (&convert->out_info);
- if (!gl->GenFramebuffers) {
- /* turn off the pipeline because Frame buffer object is a not present */
- gst_gl_context_set_error (convert->context,
- "Context, EXT_framebuffer_object supported: no");
- return FALSE;
- }
+ convert->fbo =
+ gst_gl_framebuffer_new_with_default_depth (convert->context, out_width,
+ out_height);
- GST_INFO ("Context, EXT_framebuffer_object supported: yes");
-
- /* setup FBO */
- gl->GenFramebuffers (1, &convert->fbo);
- gl->BindFramebuffer (GL_FRAMEBUFFER, convert->fbo);
-
- /* setup the render buffer for depth */
- gl->GenRenderbuffers (1, &convert->depth_buffer);
- gl->BindRenderbuffer (GL_RENDERBUFFER, convert->depth_buffer);
- if (USING_OPENGL (convert->context) || USING_OPENGL3 (convert->context)) {
- gl->RenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH24_STENCIL8,
- out_width, out_height);
- }
- if (USING_GLES2 (convert->context)) {
- gl->RenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT16,
- out_width, out_height);
- }
-
- /* a fake texture is attached to the convert FBO (cannot init without it) */
- gl->GenTextures (1, &fake_texture);
- gl->BindTexture (GL_TEXTURE_2D, fake_texture);
- internal_format =
- gst_gl_sized_gl_format_from_gl_format_type (convert->context, GL_RGBA,
- GL_UNSIGNED_BYTE);
- gl->TexImage2D (GL_TEXTURE_2D, 0, internal_format, out_width, out_height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, NULL);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
- /* attach the texture to the FBO to renderer to */
- gl->FramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- GL_TEXTURE_2D, fake_texture, 0);
-
- /* attach the depth render buffer to the FBO */
- gl->FramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
- GL_RENDERBUFFER, convert->depth_buffer);
-
- if (USING_OPENGL (convert->context)) {
- gl->FramebufferRenderbuffer (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
- GL_RENDERBUFFER, convert->depth_buffer);
- }
-
- if (!gst_gl_context_check_framebuffer_status (convert->context)) {
- gst_gl_context_set_error (convert->context,
- "GL framebuffer status incomplete");
-
- gl->DeleteTextures (1, &fake_texture);
-
- return FALSE;
- }
-
- /* unbind the FBO */
- gl->BindFramebuffer (GL_FRAMEBUFFER, 0);
-
- gl->DeleteTextures (1, &fake_texture);
-
- return TRUE;
+ return convert->fbo != NULL;
}
static gboolean
@@ -2336,7 +2165,8 @@
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);
+ 0, NULL, convert->priv->to_texture_target,
+ GST_VIDEO_GL_TEXTURE_TYPE_RGBA);
convert->priv->out_tex[j] =
(GstGLMemory *) gst_gl_base_memory_alloc (base_mem_allocator,
@@ -2387,15 +2217,13 @@
if (!gst_memory_map ((GstMemory *) convert->priv->out_tex[j], &from_info,
GST_MAP_READ | GST_MAP_GL)) {
- gst_gl_context_set_error (convert->context, "Failed to map "
- "intermediate memory");
+ GST_ERROR_OBJECT (convert, "Failed to map intermediate memory");
res = FALSE;
continue;
}
if (!gst_memory_map ((GstMemory *) out_tex, &to_info,
GST_MAP_WRITE | GST_MAP_GL)) {
- gst_gl_context_set_error (convert->context, "Failed to map "
- "intermediate memory");
+ GST_ERROR_OBJECT (convert, "Failed to map intermediate memory");
res = FALSE;
continue;
}
@@ -2432,6 +2260,7 @@
_do_convert (GstGLContext * context, GstGLColorConvert * convert)
{
GstVideoInfo *in_info = &convert->in_info;
+ struct ConvertInfo *c_info = &convert->priv->convert_info;
gboolean res = TRUE;
gint views, v;
GstVideoOverlayCompositionMeta *composition_meta;
@@ -2440,6 +2269,54 @@
convert->outbuf = NULL;
+ if (GST_VIDEO_INFO_MULTIVIEW_MODE (in_info) ==
+ GST_VIDEO_MULTIVIEW_MODE_SEPARATED)
+ views = GST_VIDEO_INFO_VIEWS (in_info);
+ else
+ views = 1;
+
+ c_info->in_n_textures =
+ _get_n_textures (GST_VIDEO_INFO_FORMAT (&convert->in_info));
+ c_info->out_n_textures =
+ _get_n_textures (GST_VIDEO_INFO_FORMAT (&convert->out_info));
+
+ {
+ gboolean tex_type_change = FALSE;
+ guint i, v;
+
+ for (v = 0; v < views; v++) {
+ for (i = 0; i < c_info->in_n_textures; i++) {
+ guint j = v * c_info->in_n_textures + i;
+ GstGLMemory *in_tex =
+ (GstGLMemory *) gst_buffer_peek_memory (convert->inbuf, j);
+ if (!gst_is_gl_memory ((GstMemory *) in_tex)) {
+ GST_ERROR_OBJECT (convert, "input must be GstGLMemory");
+ convert->priv->result = FALSE;
+ return;
+ }
+
+ if (j >= GST_VIDEO_MAX_PLANES)
+ /* our arrays aren't that big */
+ g_assert_not_reached ();
+
+ if (v > 0 && in_tex->tex_type != convert->priv->in_tex_types[i]) {
+ GST_ERROR_OBJECT (convert, "Cannot convert textures with "
+ "different types");
+ convert->priv->result = FALSE;
+ return;
+ }
+
+ if (convert->priv->in_tex_types[j] != in_tex->tex_type)
+ tex_type_change = TRUE;
+
+ convert->priv->in_tex_types[j] = in_tex->tex_type;
+ }
+ }
+
+ if (tex_type_change)
+ gst_gl_color_convert_reset_shader (convert);
+ }
+
if (!_init_convert (convert)) {
convert->priv->result = FALSE;
return;
@@ -2488,12 +2365,6 @@
return;
}
- if (GST_VIDEO_INFO_MULTIVIEW_MODE (in_info) ==
- GST_VIDEO_MULTIVIEW_MODE_SEPARATED)
- views = GST_VIDEO_INFO_VIEWS (in_info);
- 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)),
@@ -2545,21 +2416,13 @@
gl = context->gl_vtable;
- out_width = GST_VIDEO_INFO_WIDTH (&convert->out_info);
- out_height = GST_VIDEO_INFO_HEIGHT (&convert->out_info);
-
- gl->BindFramebuffer (GL_FRAMEBUFFER, convert->fbo);
+ gst_gl_framebuffer_bind (convert->fbo);
/* 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);
+ GstGLBaseMemory *tex = (GstGLBaseMemory *) convert->priv->out_tex[i];
- /* needed? */
- gl->BindTexture (gl_target, convert->priv->out_tex[i]->tex_id);
-
- gl->FramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i,
- gl_target, convert->priv->out_tex[i]->tex_id, 0);
+ gst_gl_framebuffer_attach (convert->fbo, GL_COLOR_ATTACHMENT0 + i, tex);
}
if (gl->DrawBuffers)
@@ -2569,6 +2432,8 @@
gl->GetIntegerv (GL_VIEWPORT, viewport_dim);
+ gst_gl_framebuffer_get_effective_dimensions (convert->fbo, &out_width,
+ &out_height);
gl->Viewport (0, 0, out_width, out_height);
gst_gl_shader_use (convert->shader);
@@ -2614,7 +2479,7 @@
gst_gl_context_check_framebuffer_status (context);
- gl->BindFramebuffer (GL_FRAMEBUFFER, 0);
+ gst_gl_context_clear_framebuffer (context);
return TRUE;
}
diff --git a/gst-libs/gst/gl/gstglcolorconvert.h b/gst-libs/gst/gl/gstglcolorconvert.h
index 5980cfa..d978e7e 100644
--- a/gst-libs/gst/gl/gstglcolorconvert.h
+++ b/gst-libs/gst/gl/gstglcolorconvert.h
@@ -59,8 +59,7 @@
GstBuffer * outbuf;
/* used for the conversion */
- GLuint fbo;
- GLuint depth_buffer;
+ GstGLFramebuffer *fbo;
GstGLShader *shader;
/* <private> */
@@ -77,6 +76,9 @@
struct _GstGLColorConvertClass
{
GstObjectClass object_class;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
};
/**
diff --git a/gst-libs/gst/gl/gstglcontext.c b/gst-libs/gst/gl/gstglcontext.c
index 59bcf4d..2bc0a78 100644
--- a/gst-libs/gst/gl/gstglcontext.c
+++ b/gst-libs/gst/gl/gstglcontext.c
@@ -132,10 +132,6 @@
return NULL;
}
-#if GST_GL_HAVE_GLES3
-#error "Add module loading support for GLES3"
-#endif
-
/* Context sharedness is tracked by a refcounted pointer stored in each context
* object to track complex creation/deletion scenarios. As a result,
* sharedness can only be successfully validated between two GstGLContext's
@@ -541,9 +537,9 @@
gst_gl_context_get_current_gl_api (GstGLPlatform platform, guint * major,
guint * minor)
{
- const GLubyte *(GSTGLAPI *GetString) (GLenum name);
+ const GLubyte *(GSTGLAPI * GetString) (GLenum name);
#if GST_GL_HAVE_OPENGL
- void (GSTGLAPI *GetIntegerv) (GLenum name, GLuint * n);
+ void (GSTGLAPI * GetIntegerv) (GLenum name, GLuint * n);
#endif
const gchar *version;
gint maj, min, n;
@@ -646,7 +642,14 @@
gst_gl_window_quit (context->window);
GST_INFO_OBJECT (context, "joining gl thread");
- g_thread_join (context->priv->gl_thread);
+ g_mutex_lock (&context->priv->render_lock);
+ if (context->priv->alive) {
+ GThread *t = context->priv->gl_thread;
+ g_mutex_unlock (&context->priv->render_lock);
+ g_thread_join (t);
+ } else {
+ g_mutex_unlock (&context->priv->render_lock);
+ }
GST_INFO_OBJECT (context, "gl thread joined");
context->priv->gl_thread = NULL;
}
@@ -1517,7 +1520,7 @@
gst_gl_context_get_gl_version (GstGLContext * context, gint * maj, gint * min)
{
g_return_if_fail (GST_IS_GL_CONTEXT (context));
- g_return_if_fail (maj != NULL && min != NULL);
+ g_return_if_fail (!(maj == NULL && min == NULL));
if (maj)
*maj = context->priv->gl_major;
diff --git a/gst-libs/gst/gl/gstglcontext.h b/gst-libs/gst/gl/gstglcontext.h
index 5cbc8ad..83e159d 100644
--- a/gst-libs/gst/gl/gstglcontext.h
+++ b/gst-libs/gst/gl/gstglcontext.h
@@ -69,7 +69,6 @@
* Opaque #GstGLContext object
*/
struct _GstGLContext {
- /*< private >*/
GstObject parent;
GstGLDisplay *display;
@@ -77,9 +76,10 @@
GstGLFuncs *gl_vtable;
- gpointer _reserved[GST_PADDING];
-
+ /*< private >*/
GstGLContextPrivate *priv;
+
+ gpointer _reserved[GST_PADDING];
};
/**
diff --git a/gst-libs/gst/gl/gstgldebug.h b/gst-libs/gst/gl/gstgldebug.h
index f568a2b..f131428 100644
--- a/gst-libs/gst/gl/gstgldebug.h
+++ b/gst-libs/gst/gl/gstgldebug.h
@@ -51,6 +51,8 @@
GstGLAsyncDebugLogGetMessage callback;
gpointer user_data;
GDestroyNotify notify;
+
+ gpointer _padding[GST_PADDING];
};
GstGLAsyncDebug * gst_gl_async_debug_new (void);
diff --git a/gst-libs/gst/gl/gstgldisplay.c b/gst-libs/gst/gl/gstgldisplay.c
index 5cae2f4..3ffc906 100644
--- a/gst-libs/gst/gl/gstgldisplay.c
+++ b/gst-libs/gst/gl/gstgldisplay.c
@@ -67,7 +67,8 @@
#endif
#if GST_GL_HAVE_PLATFORM_EGL
#include <gst/gl/egl/gstgldisplay_egl.h>
-#include <gst/gl/egl/gsteglimagememory.h>
+#include <gst/gl/egl/gsteglimage.h>
+#include <gst/gl/egl/gstglmemoryegl.h>
#endif
GST_DEBUG_CATEGORY_STATIC (gst_context);
@@ -141,9 +142,10 @@
gst_gl_buffer_init_once ();
gst_gl_memory_pbo_init_once ();
+ gst_gl_renderbuffer_init_once ();
#if GST_GL_HAVE_PLATFORM_EGL
- gst_egl_image_memory_init ();
+ gst_gl_memory_egl_init_once ();
#endif
}
@@ -211,8 +213,7 @@
display = GST_GL_DISPLAY (gst_gl_display_egl_new ());
#endif
if (!display) {
- /* subclass returned a NULL window */
- GST_WARNING ("Could not create display. user specified %s "
+ GST_INFO ("Could not create platform/winsys display. user specified %s "
"(platform: %s), creating dummy",
GST_STR_NULL (user_choice), GST_STR_NULL (platform_choice));
@@ -432,13 +433,17 @@
if (!context) {
/* remove dead contexts */
g_weak_ref_clear (l->data);
+ g_free (l->data);
display->priv->contexts = g_list_delete_link (display->priv->contexts, l);
l = prev ? prev->next : display->priv->contexts;
continue;
}
- if (thread == NULL)
+ if (thread == NULL) {
+ GST_DEBUG_OBJECT (display, "Returning GL context %" GST_PTR_FORMAT " for "
+ "NULL thread", context);
return context;
+ }
context_thread = gst_gl_context_get_thread (context);
if (thread != context_thread) {
@@ -451,9 +456,13 @@
if (context_thread)
g_thread_unref (context_thread);
+
+ GST_DEBUG_OBJECT (display, "Returning GL context %" GST_PTR_FORMAT " for "
+ "thread %p", context, thread);
return context;
}
+ GST_DEBUG_OBJECT (display, "No GL context for thread %p", thread);
return NULL;
}
@@ -549,11 +558,15 @@
/* adding the same context is a no-op */
if (context == collision) {
+ GST_LOG_OBJECT (display, "Attempting to add the same GL context %"
+ GST_PTR_FORMAT ". Ignoring", context);
ret = TRUE;
goto out;
}
if (_check_collision (context, collision)) {
+ GST_DEBUG_OBJECT (display, "Collision detected adding GL context "
+ "%" GST_PTR_FORMAT, context);
ret = FALSE;
goto out;
}
@@ -562,6 +575,7 @@
ref = g_new0 (GWeakRef, 1);
g_weak_ref_init (ref, context);
+ GST_DEBUG_OBJECT (display, "Adding GL context %" GST_PTR_FORMAT, context);
display->priv->contexts = g_list_prepend (display->priv->contexts, ref);
out:
diff --git a/gst-libs/gst/gl/gstgldisplay.h b/gst-libs/gst/gl/gstgldisplay.h
index 7f49a44..bc00b68 100644
--- a/gst-libs/gst/gl/gstgldisplay.h
+++ b/gst-libs/gst/gl/gstgldisplay.h
@@ -85,6 +85,9 @@
GstObjectClass object_class;
guintptr (*get_handle) (GstGLDisplay * display);
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
};
GstGLDisplay *gst_gl_display_new (void);
diff --git a/gst-libs/gst/gl/gstglfeature.h b/gst-libs/gst/gl/gstglfeature.h
index fdc3137..f1ae142 100644
--- a/gst-libs/gst/gl/gstglfeature.h
+++ b/gst-libs/gst/gl/gstglfeature.h
@@ -40,8 +40,8 @@
*
*/
-#ifndef __COGL_FEATURE_PRIVATE_H
-#define __COGL_FEATURE_PRIVATE_H
+#ifndef __GST_GL_FEATURE_H__
+#define __GST_GL_FEATURE_H__
#include <gst/gst.h>
@@ -113,4 +113,4 @@
G_END_DECLS
-#endif /* __COGL_FEATURE_PRIVATE_H */
+#endif /* __GST_GL_FEATURE_H__ */
diff --git a/gst-libs/gst/gl/gstglfilter.c b/gst-libs/gst/gl/gstglfilter.c
index d25bb72..b0693c1 100644
--- a/gst-libs/gst/gl/gstglfilter.c
+++ b/gst-libs/gst/gl/gstglfilter.c
@@ -28,10 +28,6 @@
#include "gstglfilter.h"
-#if GST_GL_HAVE_PLATFORM_EGL
-#include "egl/gsteglimagememory.h"
-#endif
-
#define GST_CAT_DEFAULT gst_gl_filter_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
@@ -82,7 +78,8 @@
#define gst_gl_filter_parent_class parent_class
G_DEFINE_TYPE_WITH_CODE (GstGLFilter, gst_gl_filter, GST_TYPE_GL_BASE_FILTER,
GST_DEBUG_CATEGORY_INIT (gst_gl_filter_debug, "glfilter", 0,
- "glfilter element"););
+ "glfilter element");
+ );
static void gst_gl_filter_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
@@ -142,10 +139,10 @@
klass->transform_internal_caps = default_transform_internal_caps;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_gl_filter_src_pad_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_gl_filter_sink_pad_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_gl_filter_src_pad_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_gl_filter_sink_pad_template);
}
static void
@@ -231,12 +228,11 @@
filter->vbo_indices = 0;
}
- if (filter->fbo != 0) {
- gst_gl_context_del_fbo (context, filter->fbo, filter->depthbuffer);
+ if (filter->fbo != NULL) {
+ gst_object_unref (filter->fbo);
+ filter->fbo = NULL;
}
- filter->fbo = 0;
- filter->depthbuffer = 0;
filter->default_shader = NULL;
filter->draw_attr_position_loc = -1;
filter->draw_attr_texture_loc = -1;
@@ -694,14 +690,12 @@
out_width = GST_VIDEO_INFO_WIDTH (&filter->out_info);
out_height = GST_VIDEO_INFO_HEIGHT (&filter->out_info);
- if (filter->fbo) {
- gst_gl_context_del_fbo (context, filter->fbo, filter->depthbuffer);
- filter->fbo = 0;
- filter->depthbuffer = 0;
- }
- //blocking call, generate a FBO
- if (!gst_gl_context_gen_fbo (context, out_width, out_height,
- &filter->fbo, &filter->depthbuffer))
+ if (filter->fbo)
+ gst_object_unref (filter->fbo);
+
+ if (!(filter->fbo =
+ gst_gl_framebuffer_new_with_default_depth (context, out_width,
+ out_height)))
goto context_error;
if (filter_class->init_fbo) {
@@ -908,7 +902,7 @@
GstBuffer * outbuf)
{
GstGLFilterClass *filter_class;
- guint in_tex, out_tex;
+ GstMemory *in_tex, *out_tex;
GstVideoFrame gl_frame, out_frame;
gboolean ret;
@@ -920,7 +914,12 @@
goto inbuf_error;
}
- in_tex = *(guint *) gl_frame.data[0];
+ in_tex = gl_frame.map[0].memory;
+ if (!gst_is_gl_memory (in_tex)) {
+ ret = FALSE;
+ GST_ERROR_OBJECT (filter, "Input memory must be GstGLMemory");
+ goto inbuf_error;
+ }
if (!gst_video_frame_map (&out_frame, &filter->out_info, outbuf,
GST_MAP_WRITE | GST_MAP_GL)) {
@@ -928,13 +927,17 @@
goto unmap_out_error;
}
- out_tex = *(guint *) out_frame.data[0];
+ out_tex = out_frame.map[0].memory;
+ g_return_val_if_fail (gst_is_gl_memory (out_tex), FALSE);
- GST_DEBUG ("calling filter_texture with textures in:%i out:%i", in_tex,
- out_tex);
+ GST_DEBUG ("calling filter_texture with textures in:%i out:%i",
+ GST_GL_MEMORY_CAST (in_tex)->tex_id,
+ GST_GL_MEMORY_CAST (out_tex)->tex_id);
g_assert (filter_class->filter_texture);
- ret = filter_class->filter_texture (filter, in_tex, out_tex);
+
+ ret = filter_class->filter_texture (filter, GST_GL_MEMORY_CAST (in_tex),
+ GST_GL_MEMORY_CAST (out_tex));
gst_video_frame_unmap (&out_frame);
unmap_out_error:
@@ -945,10 +948,19 @@
}
static void
-_debug_marker (GstGLContext * context, GstGLFilter * filter)
+_filter_gl (GstGLContext * context, GstGLFilter * filter)
{
+ GstGLFilterClass *filter_class = GST_GL_FILTER_GET_CLASS (filter);
+
gst_gl_insert_debug_marker (context,
"processing in element %s", GST_OBJECT_NAME (filter));
+
+ if (filter_class->filter)
+ filter->gl_result =
+ filter_class->filter (filter, filter->inbuf, filter->outbuf);
+ else
+ filter->gl_result =
+ gst_gl_filter_filter_texture (filter, filter->inbuf, filter->outbuf);
}
static GstFlowReturn
@@ -971,12 +983,11 @@
if (in_sync_meta)
gst_gl_sync_meta_wait (in_sync_meta, context);
- gst_gl_context_thread_add (context, (GstGLContextThreadFunc) _debug_marker,
+ filter->inbuf = inbuf;
+ filter->outbuf = outbuf;
+ gst_gl_context_thread_add (context, (GstGLContextThreadFunc) _filter_gl,
filter);
- if (filter_class->filter)
- ret = filter_class->filter (filter, inbuf, outbuf);
- else
- ret = gst_gl_filter_filter_texture (filter, inbuf, outbuf);
+ ret = filter->gl_result;
out_sync_meta = gst_buffer_get_gl_sync_meta (outbuf);
if (out_sync_meta)
@@ -985,66 +996,46 @@
return ret ? GST_FLOW_OK : GST_FLOW_ERROR;
}
-struct glcb2
+struct glcb
{
- GLCB func;
+ GstGLFilter *filter;
+ GstGLFilterRenderFunc func;
+ GstGLMemory *in_tex;
gpointer data;
- guint texture;
- guint width;
- guint height;
};
-/* convenience functions to simplify filter development */
-static void
-_glcb2 (gpointer data)
+static gboolean
+_glcb (gpointer data)
{
- struct glcb2 *cb = data;
+ struct glcb *cb = data;
- cb->func (cb->width, cb->height, cb->texture, cb->data);
+ return cb->func (cb->filter, cb->in_tex, cb->data);
}
/**
* gst_gl_filter_render_to_target:
* @filter: a #GstGLFilter
- * @resize: whether to automatically resize the texture between the input size
- * and the output size
* @input: the input texture
- * @target: the output texture
+ * @output: the output texture
* @func: the function to transform @input into @output. called with @data
* @data: the data associated with @func
*
- * Transforms @input into @output using @func on through FBO. @resize should
- * only ever be %TRUE whenever @input is the input texture of @filter.
+ * Transforms @input into @output using @func on through FBO.
+ *
+ * Returns: the return value of @func
*/
-void
-gst_gl_filter_render_to_target (GstGLFilter * filter, gboolean resize,
- GLuint input, GLuint target, GLCB func, gpointer data)
+gboolean
+gst_gl_filter_render_to_target (GstGLFilter * filter, GstGLMemory * input,
+ GstGLMemory * output, GstGLFilterRenderFunc func, gpointer data)
{
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- guint in_width, in_height, out_width, out_height;
- struct glcb2 cb;
+ struct glcb cb;
- out_width = GST_VIDEO_INFO_WIDTH (&filter->out_info);
- out_height = GST_VIDEO_INFO_HEIGHT (&filter->out_info);
- if (resize) {
- in_width = GST_VIDEO_INFO_WIDTH (&filter->in_info);
- in_height = GST_VIDEO_INFO_HEIGHT (&filter->in_info);
- } else {
- in_width = out_width;
- in_height = out_height;
- }
-
- GST_LOG ("rendering to target. in %u, %ux%u out %u, %ux%u", input, in_width,
- in_height, target, out_width, out_height);
-
+ cb.filter = filter;
cb.func = func;
+ cb.in_tex = input;
cb.data = data;
- cb.texture = input;
- cb.width = in_width;
- cb.height = in_height;
- gst_gl_context_use_fbo_v2 (context, out_width, out_height,
- filter->fbo, filter->depthbuffer, target, _glcb2, &cb);
+ return gst_gl_framebuffer_draw_to_texture (filter->fbo, output, _glcb, &cb);
}
static void
@@ -1069,10 +1060,10 @@
filter->valid_attributes = TRUE;
}
-static void
-_draw_with_shader_cb (gint width, gint height, guint texture, gpointer stuff)
+static gboolean
+_draw_with_shader_cb (GstGLFilter * filter, GstGLMemory * in_tex,
+ gpointer unused)
{
- GstGLFilter *filter = GST_GL_FILTER (stuff);
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
GstGLFuncs *gl = context->gl_vtable;
@@ -1087,26 +1078,27 @@
gst_gl_shader_use (filter->default_shader);
gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
gst_gl_shader_set_uniform_1i (filter->default_shader, "tex", 1);
- gst_gl_shader_set_uniform_1f (filter->default_shader, "width", width);
- gst_gl_shader_set_uniform_1f (filter->default_shader, "height", height);
+ gst_gl_shader_set_uniform_1f (filter->default_shader, "width",
+ GST_VIDEO_INFO_WIDTH (&filter->out_info));
+ gst_gl_shader_set_uniform_1f (filter->default_shader, "height",
+ GST_VIDEO_INFO_HEIGHT (&filter->out_info));
- gst_gl_filter_draw_texture (filter, texture, width, height);
+ gst_gl_filter_draw_fullscreen_quad (filter);
+
+ return TRUE;
}
/**
* gst_gl_filter_render_to_target_with_shader:
* @filter: a #GstGLFilter
- * @resize: whether to automatically resize the texture between the input size
- * and the output size
* @input: the input texture
- * @target: the output texture
+ * @output: the output texture
* @shader: the shader to use.
*
- * Transforms @input into @output using @shader on FBO. @resize should
- * only ever be %TRUE whenever @input is the input texture of @filter.
+ * Transforms @input into @output using @shader with a FBO.
*
* See also: gst_gl_filter_render_to_target()
*/
@@ -1114,14 +1106,14 @@
* the shader, render input to a quad */
void
gst_gl_filter_render_to_target_with_shader (GstGLFilter * filter,
- gboolean resize, GLuint input, GLuint target, GstGLShader * shader)
+ GstGLMemory * input, GstGLMemory * output, GstGLShader * shader)
{
if (filter->default_shader != shader)
filter->valid_attributes = FALSE;
filter->default_shader = shader;
- gst_gl_filter_render_to_target (filter, resize, input, target,
- _draw_with_shader_cb, filter);
+ gst_gl_filter_render_to_target (filter, input, output, _draw_with_shader_cb,
+ NULL);
}
/* *INDENT-OFF* */
@@ -1172,23 +1164,20 @@
}
/**
- * gst_gl_filter_draw_texture:
+ * gst_gl_filter_draw_fullscreen_quad:
* @filter: a #GstGLFilter
- * @texture: the texture to draw
- * @width: width of @texture
- * @height: height of texture
*
- * Draws @texture into the OpenGL scene at the specified @width and @height.
+ * Render a fullscreen quad using the current GL state. The only GL state this
+ * modifies is the necessary vertex/index buffers and, if necessary, a
+ * Vertex Array Object for drawing a fullscreen quad. Framebuffer state,
+ * any shaders, viewport state, etc must be setup by the caller.
*/
void
-gst_gl_filter_draw_texture (GstGLFilter * filter, GLuint texture,
- guint width, guint height)
+gst_gl_filter_draw_fullscreen_quad (GstGLFilter * filter)
{
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
GstGLFuncs *gl = context->gl_vtable;
- GST_DEBUG ("drawing texture:%u dimensions:%ux%u", texture, width, height);
-
{
if (!filter->vertex_buffer) {
if (gl->GenVertexArrays) {
diff --git a/gst-libs/gst/gl/gstglfilter.h b/gst-libs/gst/gl/gstglfilter.h
index a818bab..cdebe57 100644
--- a/gst-libs/gst/gl/gstglfilter.h
+++ b/gst-libs/gst/gl/gstglfilter.h
@@ -38,6 +38,8 @@
#define GST_IS_GL_FILTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_GL_FILTER))
#define GST_GL_FILTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_GL_FILTER,GstGLFilterClass))
+typedef gboolean (*GstGLFilterRenderFunc) (GstGLFilter * filter, GstGLMemory * in_tex, gpointer user_data);
+
/**
* GstGLFilter:
* @base_transform: parent #GstBaseTransform
@@ -63,12 +65,13 @@
GstCaps *out_caps;
- /* <private> */
- GLuint fbo;
- GLuint depthbuffer;
+ /* <protected> */
+ GstGLFramebuffer *fbo;
- GLuint in_tex_id;
- GLuint out_tex_id;
+ /* <private> */
+ gboolean gl_result;
+ GstBuffer *inbuf;
+ GstBuffer *outbuf;
GstGLShader *default_shader;
gboolean valid_attributes;
@@ -78,6 +81,8 @@
GLuint vertex_buffer;
GLint draw_attr_position_loc;
GLint draw_attr_texture_loc;
+
+ gpointer _padding[GST_PADDING];
};
/**
@@ -102,7 +107,7 @@
gboolean (*set_caps) (GstGLFilter* filter, GstCaps* incaps, GstCaps* outcaps);
gboolean (*filter) (GstGLFilter *filter, GstBuffer *inbuf, GstBuffer *outbuf);
- gboolean (*filter_texture) (GstGLFilter *filter, guint in_tex, guint out_tex);
+ gboolean (*filter_texture) (GstGLFilter *filter, GstGLMemory *in_tex, GstGLMemory *out_tex);
gboolean (*init_fbo) (GstGLFilter *filter);
GstCaps *(*transform_internal_caps) (GstGLFilter *filter,
@@ -111,18 +116,24 @@
/* useful to init and cleanup custom gl resources */
void (*display_init_cb) (GstGLFilter *filter);
void (*display_reset_cb) (GstGLFilter *filter);
+
+ gpointer _padding[GST_PADDING];
};
gboolean gst_gl_filter_filter_texture (GstGLFilter * filter, GstBuffer * inbuf,
GstBuffer * outbuf);
-void gst_gl_filter_render_to_target (GstGLFilter *filter, gboolean resize, GLuint input,
- GLuint target, GLCB func, gpointer data);
+gboolean gst_gl_filter_render_to_target (GstGLFilter *filter,
+ GstGLMemory * input,
+ GstGLMemory * output,
+ GstGLFilterRenderFunc func,
+ gpointer data);
-void gst_gl_filter_render_to_target_with_shader (GstGLFilter * filter, gboolean resize,
- GLuint input, GLuint target, GstGLShader *shader);
-
-void gst_gl_filter_draw_texture (GstGLFilter *filter, GLuint texture, guint width, guint height);
+void gst_gl_filter_draw_fullscreen_quad (GstGLFilter *filter);
+void gst_gl_filter_render_to_target_with_shader (GstGLFilter * filter,
+ GstGLMemory * input,
+ GstGLMemory * output,
+ GstGLShader *shader);
G_END_DECLS
diff --git a/gst-libs/gst/gl/gstglformat.c b/gst-libs/gst/gl/gstglformat.c
index 237e250..1a71327 100644
--- a/gst-libs/gst/gl/gstglformat.c
+++ b/gst-libs/gst/gl/gstglformat.c
@@ -31,22 +31,6 @@
#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
@@ -59,21 +43,21 @@
{
switch (format) {
case GST_VIDEO_GL_TEXTURE_TYPE_RGBA:
- case GL_RGBA:
+ case GST_GL_RGBA:
return 4;
case GST_VIDEO_GL_TEXTURE_TYPE_RGB:
case GST_VIDEO_GL_TEXTURE_TYPE_RGB16:
- case GL_RGB:
+ case GST_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:
+ case GST_GL_LUMINANCE_ALPHA:
+ case GST_GL_RG:
return 2;
case GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE:
case GST_VIDEO_GL_TEXTURE_TYPE_R:
- case GL_LUMINANCE:
- case GL_RED:
+ case GST_GL_LUMINANCE:
+ case GST_GL_RED:
return 1;
default:
return 0;
@@ -153,20 +137,20 @@
{
switch (tex_format) {
case GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA:
- return GL_LUMINANCE_ALPHA;
+ return GST_GL_LUMINANCE_ALPHA;
case GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE:
- return GL_LUMINANCE;
+ return GST_GL_LUMINANCE;
case GST_VIDEO_GL_TEXTURE_TYPE_RGBA:
- return GL_RGBA;
+ return GST_GL_RGBA;
case GST_VIDEO_GL_TEXTURE_TYPE_RGB:
case GST_VIDEO_GL_TEXTURE_TYPE_RGB16:
- return GL_RGB;
+ return GST_GL_RGB;
case GST_VIDEO_GL_TEXTURE_TYPE_RG:
- return GL_RG;
+ return GST_GL_RG;
case GST_VIDEO_GL_TEXTURE_TYPE_R:
- return GL_RED;
+ return GST_GL_RED;
default:
- return GST_VIDEO_GL_TEXTURE_TYPE_RGBA;
+ return tex_format;
}
}
@@ -273,51 +257,52 @@
gst_gl_context_check_feature (context, "GL_EXT_texture_rg");
switch (format) {
- case GL_RGBA:
+ case GST_GL_RGBA:
switch (type) {
case GL_UNSIGNED_BYTE:
return USING_GLES2 (context)
- && !USING_GLES3 (context) ? GL_RGBA : GL_RGBA8;
+ && !USING_GLES3 (context) ? GST_GL_RGBA : GST_GL_RGBA8;
break;
}
break;
- case GL_RGB:
+ case GST_GL_RGB:
switch (type) {
case GL_UNSIGNED_BYTE:
- return GL_RGB8;
+ return GST_GL_RGB8;
break;
case GL_UNSIGNED_SHORT_5_6_5:
- return GL_RGB;
+ return GST_GL_RGB;
break;
}
break;
- case GL_RG:
+ case GST_GL_RG:
switch (type) {
case GL_UNSIGNED_BYTE:
if (!USING_GLES3 (context) && USING_GLES2 (context) && ext_texture_rg)
- return GL_RG;
- return GL_RG8;
+ return GST_GL_RG;
+ return GST_GL_RG8;
break;
}
break;
- case GL_RED:
+ case GST_GL_RED:
switch (type) {
case GL_UNSIGNED_BYTE:
if (!USING_GLES3 (context) && USING_GLES2 (context) && ext_texture_rg)
- return GL_RED;
- return GL_R8;
+ return GST_GL_RED;
+ return GST_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;
+ case GST_GL_RGBA8:
+ case GST_GL_RGB8:
+ case GST_GL_RG8:
+ case GST_GL_R8:
+ case GST_GL_LUMINANCE:
+ case GST_GL_LUMINANCE_ALPHA:
+ case GST_GL_ALPHA:
+ case GST_GL_DEPTH_COMPONENT16:
+ case GST_GL_DEPTH24_STENCIL8:
+ return format;
default:
break;
}
diff --git a/gst-libs/gst/gl/gstglformat.h b/gst-libs/gst/gl/gstglformat.h
index fcd618a..e4e6e37 100644
--- a/gst-libs/gst/gl/gstglformat.h
+++ b/gst-libs/gst/gl/gstglformat.h
@@ -70,6 +70,33 @@
G_BEGIN_DECLS
+typedef enum
+{
+ /* values taken from the GL headers */
+ GST_GL_LUMINANCE = 0x1909,
+
+ GST_GL_ALPHA = 0x1906,
+
+ GST_GL_LUMINANCE_ALPHA = 0x190A,
+
+ GST_GL_RED = 0x1903,
+ GST_GL_R8 = 0x8229,
+
+ GST_GL_RG = 0x8227,
+ GST_GL_RG8 = 0x822B,
+
+ GST_GL_RGB = 0x1907,
+ GST_GL_RGB8 = 0x8051,
+ GST_GL_RGB565 = 0x8D62,
+
+ GST_GL_RGBA = 0x1908,
+ GST_GL_RGBA8 = 0x8058,
+
+ GST_GL_DEPTH_COMPONENT16 = 0x81A5,
+
+ GST_GL_DEPTH24_STENCIL8 = 0x88F0,
+} GstGLFormat;
+
guint gst_gl_format_type_n_bytes (guint format,
guint type);
guint gst_gl_texture_type_n_bytes (GstVideoGLTextureType tex_format);
diff --git a/gst-libs/gst/gl/gstglframebuffer.c b/gst-libs/gst/gl/gstglframebuffer.c
index fb706f5..67f860e 100644
--- a/gst-libs/gst/gl/gstglframebuffer.c
+++ b/gst-libs/gst/gl/gstglframebuffer.c
@@ -24,13 +24,33 @@
#include "gl.h"
#include "gstglframebuffer.h"
+#ifndef GL_FRAMEBUFFER_UNDEFINED
+#define GL_FRAMEBUFFER_UNDEFINED 0x8219
+#endif
+#ifndef GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
+#endif
+#ifndef GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
+#endif
+#ifndef GL_FRAMEBUFFER_UNSUPPORTED
+#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
+#endif
+#ifndef GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9
+#endif
+
+#ifndef GL_DEPTH_STENCIL_ATTACHMENT
+#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
+#endif
+
GST_DEBUG_CATEGORY_STATIC (gst_gl_framebuffer_debug);
#define GST_CAT_DEFAULT gst_gl_framebuffer_debug
#define DEBUG_INIT \
GST_DEBUG_CATEGORY_INIT (gst_gl_framebuffer_debug, "glframebuffer", 0, "GL Framebuffer");
-G_DEFINE_TYPE_WITH_CODE (GstGLFramebuffer, gst_gl_framebuffer, G_TYPE_OBJECT,
+G_DEFINE_TYPE_WITH_CODE (GstGLFramebuffer, gst_gl_framebuffer, GST_TYPE_OBJECT,
DEBUG_INIT);
#define GST_GL_FRAMEBUFFER_GET_PRIVATE(o) \
@@ -40,13 +60,35 @@
struct _GstGLFramebufferPrivate
{
- gint width;
- gint height;
-
- guint fbo;
- guint depth;
+ guint effective_width;
+ guint effective_height;
};
+struct fbo_attachment
+{
+ guint attachment_point;
+ GstGLBaseMemory *mem;
+};
+
+static void
+_fbo_attachment_init (struct fbo_attachment *attach, guint point,
+ GstGLBaseMemory * mem)
+{
+ attach->attachment_point = point;
+ attach->mem = (GstGLBaseMemory *) gst_memory_ref (GST_MEMORY_CAST (mem));
+}
+
+static void
+_fbo_attachment_unset (struct fbo_attachment *attach)
+{
+ if (!attach)
+ return;
+
+ if (attach->mem)
+ gst_memory_unref (GST_MEMORY_CAST (attach->mem));
+ attach->mem = NULL;
+}
+
static void
gst_gl_framebuffer_class_init (GstGLFramebufferClass * klass)
{
@@ -56,183 +98,355 @@
}
static void
-gst_gl_framebuffer_init (GstGLFramebuffer * fbo)
+gst_gl_framebuffer_init (GstGLFramebuffer * fb)
{
- fbo->priv = GST_GL_FRAMEBUFFER_GET_PRIVATE (fbo);
+ fb->priv = GST_GL_FRAMEBUFFER_GET_PRIVATE (fb);
+
+ fb->attachments =
+ g_array_new (FALSE, FALSE, (sizeof (struct fbo_attachment)));
+ g_array_set_clear_func (fb->attachments,
+ (GDestroyNotify) _fbo_attachment_unset);
+}
+
+static void
+_delete_fbo_gl (GstGLContext * context, GstGLFramebuffer * fb)
+{
+ const GstGLFuncs *gl = context->gl_vtable;
+
+ if (fb->fbo_id)
+ gl->DeleteFramebuffers (1, &fb->fbo_id);
+ fb->fbo_id = 0;
}
static void
gst_gl_framebuffer_finalize (GObject * object)
{
- GstGLFramebuffer *fbo = GST_GL_FRAMEBUFFER (object);
+ GstGLFramebuffer *fb = GST_GL_FRAMEBUFFER (object);
- if (fbo->context) {
- gst_object_unref (fbo->context);
- fbo->context = NULL;
+ if (fb->context) {
+ if (fb->fbo_id)
+ gst_gl_context_thread_add (fb->context,
+ (GstGLContextThreadFunc) _delete_fbo_gl, fb);
+
+ gst_object_unref (fb->context);
+ fb->context = NULL;
}
+ if (fb->attachments)
+ g_array_free (fb->attachments, TRUE);
+ fb->attachments = NULL;
+
G_OBJECT_CLASS (gst_gl_framebuffer_parent_class)->finalize (object);
}
GstGLFramebuffer *
gst_gl_framebuffer_new (GstGLContext * context)
{
- GstGLFramebuffer *fbo = g_object_new (GST_TYPE_GL_FRAMEBUFFER, NULL);
-
- fbo->context = gst_object_ref (context);
-
- return fbo;
-}
-
-gboolean
-gst_gl_framebuffer_generate (GstGLFramebuffer * frame, gint width, gint height,
- guint * fbo, guint * depth)
-{
- GLuint fake_texture = 0;
+ GstGLFramebuffer *fb;
const GstGLFuncs *gl;
- GLenum internal_format;
- g_return_val_if_fail (GST_IS_GL_FRAMEBUFFER (frame), FALSE);
- g_return_val_if_fail (fbo != NULL && depth != NULL, FALSE);
- g_return_val_if_fail (width > 0 && height > 0, FALSE);
+ g_return_val_if_fail (GST_IS_GL_CONTEXT (context), NULL);
+ g_return_val_if_fail (gst_gl_context_get_current () == context, NULL);
- gl = frame->context->gl_vtable;
-
- GST_TRACE ("creating FBO dimensions:%ux%u", width, height);
+ gl = context->gl_vtable;
if (!gl->GenFramebuffers) {
- gst_gl_context_set_error (frame->context,
- "Context, EXT_framebuffer_object not supported");
- return FALSE;
+ GST_ERROR_OBJECT (context, "Framebuffers are not supported!");
+ return NULL;
}
- /* setup FBO */
- gl->GenFramebuffers (1, fbo);
- gl->BindFramebuffer (GL_FRAMEBUFFER, *fbo);
- /* setup the render buffer for depth */
- gl->GenRenderbuffers (1, depth);
- gl->BindRenderbuffer (GL_RENDERBUFFER, *depth);
+ fb = g_object_new (GST_TYPE_GL_FRAMEBUFFER, NULL);
+ fb->context = gst_object_ref (context);
+ gl->GenFramebuffers (1, &fb->fbo_id);
- if (gst_gl_context_get_gl_api (frame->context) & (GST_GL_API_OPENGL |
+ return fb;
+}
+
+GstGLFramebuffer *
+gst_gl_framebuffer_new_with_default_depth (GstGLContext * context, guint width,
+ guint height)
+{
+ GstGLFramebuffer *fb = gst_gl_framebuffer_new (context);
+ GstGLBaseMemoryAllocator *render_alloc;
+ GstGLAllocationParams *params;
+ GstGLBaseMemory *renderbuffer;
+ guint attach_point, attach_type;
+
+ if (!fb)
+ return NULL;
+
+ if (gst_gl_context_get_gl_api (fb->context) & (GST_GL_API_OPENGL |
GST_GL_API_OPENGL3)) {
- gl->RenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width,
- height);
- }
- if (gst_gl_context_get_gl_api (frame->context) & GST_GL_API_GLES2) {
- gl->RenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT16,
- width, height);
+ attach_point = GL_DEPTH_STENCIL_ATTACHMENT;
+ attach_type = GST_GL_DEPTH24_STENCIL8;
+ } else if (gst_gl_context_get_gl_api (fb->context) & GST_GL_API_GLES2) {
+ attach_point = GL_DEPTH_ATTACHMENT;
+ attach_type = GST_GL_DEPTH_COMPONENT16;
+ } else {
+ g_assert_not_reached ();
+ return NULL;
}
- /* setup a texture to render to */
- gl->GenTextures (1, &fake_texture);
- gl->BindTexture (GL_TEXTURE_2D, fake_texture);
- internal_format =
- gst_gl_sized_gl_format_from_gl_format_type (frame->context, GL_RGBA,
- GL_UNSIGNED_BYTE);
- gl->TexImage2D (GL_TEXTURE_2D, 0, internal_format, width, height, 0, GL_RGBA,
- GL_UNSIGNED_BYTE, NULL);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ render_alloc = (GstGLBaseMemoryAllocator *)
+ gst_allocator_find (GST_GL_RENDERBUFFER_ALLOCATOR_NAME);
+ params = (GstGLAllocationParams *)
+ gst_gl_renderbuffer_allocation_params_new (context, NULL, attach_type,
+ width, height);
- /* attach the texture to the FBO to renderer to */
- gl->FramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- GL_TEXTURE_2D, fake_texture, 0);
+ renderbuffer = gst_gl_base_memory_alloc (render_alloc, params);
+ gst_gl_allocation_params_free (params);
+ gst_object_unref (render_alloc);
- /* attach the depth render buffer to the FBO */
- gl->FramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
- GL_RENDERBUFFER, *depth);
+ gst_gl_framebuffer_bind (fb);
+ gst_gl_framebuffer_attach (fb, attach_point, renderbuffer);
+ gst_gl_context_clear_framebuffer (fb->context);
+ gst_memory_unref (GST_MEMORY_CAST (renderbuffer));
- if (gst_gl_context_get_gl_api (frame->context) & (GST_GL_API_OPENGL |
- GST_GL_API_OPENGL3)) {
- gl->FramebufferRenderbuffer (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
- GL_RENDERBUFFER, *depth);
- }
-
- if (gl->CheckFramebufferStatus (GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
- gst_gl_context_set_error (frame->context,
- "GL framebuffer status incomplete");
-
- gl->DeleteTextures (1, &fake_texture);
-
- return FALSE;
- }
-
- /* unbind the FBO */
- gl->BindFramebuffer (GL_FRAMEBUFFER, 0);
-
- gl->DeleteTextures (1, &fake_texture);
-
- return TRUE;
+ return fb;
}
gboolean
-gst_gl_framebuffer_use_v2 (GstGLFramebuffer * frame, gint texture_fbo_width,
- gint texture_fbo_height, GLuint fbo, GLuint depth_buffer,
- GLuint texture_fbo, GLCB_V2 cb, gpointer stuff)
+gst_gl_framebuffer_draw_to_texture (GstGLFramebuffer * fb, GstGLMemory * mem,
+ GstGLFramebufferFunc func, gpointer user_data)
{
- const GstGLFuncs *gl;
GLint viewport_dim[4] = { 0 };
+ const GstGLFuncs *gl;
+ gboolean ret;
- g_return_val_if_fail (GST_IS_GL_FRAMEBUFFER (frame), FALSE);
- g_return_val_if_fail (texture_fbo_width > 0 && texture_fbo_height > 0, FALSE);
- g_return_val_if_fail (fbo != 0, FALSE);
- g_return_val_if_fail (texture_fbo != 0, FALSE);
- g_return_val_if_fail (cb != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_GL_FRAMEBUFFER (fb), FALSE);
+ g_return_val_if_fail (gst_is_gl_memory (GST_MEMORY_CAST (mem)), FALSE);
- gl = frame->context->gl_vtable;
+ gl = fb->context->gl_vtable;
- GST_TRACE ("Binding v2 FBO %u dimensions:%ux%u with texture:%u ",
- fbo, texture_fbo_width, texture_fbo_height, texture_fbo);
+ GST_TRACE_OBJECT (fb, "drawing to texture %u, dimensions %ix%i", mem->tex_id,
+ gst_gl_memory_get_texture_width (mem),
+ gst_gl_memory_get_texture_height (mem));
- gl->BindFramebuffer (GL_FRAMEBUFFER, fbo);
-
- /* setup a texture to render to */
- gl->BindTexture (GL_TEXTURE_2D, texture_fbo);
-
- /* attach the texture to the FBO to renderer to */
- gl->FramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- GL_TEXTURE_2D, texture_fbo, 0);
+ gst_gl_framebuffer_bind (fb);
+ gst_gl_framebuffer_attach (fb, GL_COLOR_ATTACHMENT0, (GstGLBaseMemory *) mem);
gl->GetIntegerv (GL_VIEWPORT, viewport_dim);
-
- gl->Viewport (0, 0, texture_fbo_width, texture_fbo_height);
-
- if (gst_gl_context_get_gl_api (frame->context) & (GST_GL_API_OPENGL |
+ gl->Viewport (0, 0, fb->priv->effective_width, fb->priv->effective_height);
+ if (gst_gl_context_get_gl_api (fb->context) & (GST_GL_API_OPENGL |
GST_GL_API_OPENGL3))
gl->DrawBuffer (GL_COLOR_ATTACHMENT0);
- /* the opengl scene */
- cb (stuff);
+ ret = func (user_data);
- if (gst_gl_context_get_gl_api (frame->context) & (GST_GL_API_OPENGL |
+ if (gst_gl_context_get_gl_api (fb->context) & (GST_GL_API_OPENGL |
GST_GL_API_OPENGL3))
gl->DrawBuffer (GL_NONE);
+ gl->Viewport (viewport_dim[0], viewport_dim[1], viewport_dim[2],
+ viewport_dim[3]);
+ gst_gl_context_clear_framebuffer (fb->context);
- gl->Viewport (viewport_dim[0], viewport_dim[1],
- viewport_dim[2], viewport_dim[3]);
-
- gl->BindFramebuffer (GL_FRAMEBUFFER, 0);
-
- return TRUE;
+ return ret;
}
void
-gst_gl_framebuffer_delete (GstGLFramebuffer * frame, guint fbo, guint depth)
+gst_gl_framebuffer_bind (GstGLFramebuffer * fb)
{
const GstGLFuncs *gl;
- g_return_if_fail (GST_IS_GL_FRAMEBUFFER (frame));
+ g_return_if_fail (GST_IS_GL_FRAMEBUFFER (fb));
+ g_return_if_fail (gst_gl_context_get_current () == fb->context);
+ g_return_if_fail (fb->fbo_id != 0);
- gl = frame->context->gl_vtable;
+ gl = fb->context->gl_vtable;
- GST_TRACE ("Deleting FBO %u", fbo);
+ gl->BindFramebuffer (GL_FRAMEBUFFER, fb->fbo_id);
+}
- if (fbo) {
- gl->DeleteFramebuffers (1, &fbo);
+void
+gst_gl_context_clear_framebuffer (GstGLContext * context)
+{
+ const GstGLFuncs *gl;
+
+ g_return_if_fail (GST_IS_GL_CONTEXT (context));
+
+ gl = context->gl_vtable;
+
+ gl->BindFramebuffer (GL_FRAMEBUFFER, 0);
+}
+
+static void
+_update_effective_dimensions (GstGLFramebuffer * fb)
+{
+ int i;
+ guint min_width = -1, min_height = -1;
+
+ /* remove the previous attachment */
+ for (i = 0; i < fb->attachments->len; i++) {
+ struct fbo_attachment *attach;
+ int width, height;
+
+ attach = &g_array_index (fb->attachments, struct fbo_attachment, i);
+
+ if (gst_is_gl_memory (GST_MEMORY_CAST (attach->mem))) {
+ GstGLMemory *mem = (GstGLMemory *) attach->mem;
+
+ width = gst_gl_memory_get_texture_width (mem);
+ height = gst_gl_memory_get_texture_height (mem);
+ } else if (gst_is_gl_renderbuffer (GST_MEMORY_CAST (attach->mem))) {
+ GstGLRenderbuffer *mem = (GstGLRenderbuffer *) attach->mem;
+
+ width = mem->width;
+ height = mem->height;
+ } else {
+ g_assert_not_reached ();
+ }
+
+ if (width < min_width)
+ min_width = width;
+ if (height < min_height)
+ min_height = height;
}
- if (depth) {
- gl->DeleteRenderbuffers (1, &depth);
+
+ fb->priv->effective_width = min_width;
+ fb->priv->effective_height = min_height;
+}
+
+static gboolean
+_is_valid_attachment_point (guint attachment_point)
+{
+ /* all 31 possible color attachments */
+ if (attachment_point >= 0x8CE0 && attachment_point <= 0x8CFF)
+ return TRUE;
+
+ /* depth-stencil attachment */
+ if (attachment_point == 0x821A)
+ return TRUE;
+
+ /* depth attachment */
+ if (attachment_point == 0x8D00)
+ return TRUE;
+
+ /* stencil attachment */
+ if (attachment_point == 0x8D20)
+ return TRUE;
+
+ return FALSE;
+}
+
+static void
+_attach_gl_memory (GstGLFramebuffer * fb, guint attachment_point,
+ GstGLMemory * mem)
+{
+ struct fbo_attachment attach;
+ const GstGLFuncs *gl = fb->context->gl_vtable;
+ guint gl_target = gst_gl_texture_target_to_gl (mem->tex_target);
+
+ gst_gl_framebuffer_bind (fb);
+
+ gl->FramebufferTexture2D (GL_FRAMEBUFFER, attachment_point, gl_target,
+ mem->tex_id, 0);
+
+ _fbo_attachment_init (&attach, attachment_point, (GstGLBaseMemory *) mem);
+ fb->attachments = g_array_append_val (fb->attachments, attach);
+}
+
+static void
+_attach_renderbuffer (GstGLFramebuffer * fb, guint attachment_point,
+ GstGLRenderbuffer * rb)
+{
+ struct fbo_attachment attach;
+ const GstGLFuncs *gl = fb->context->gl_vtable;
+
+ gst_gl_framebuffer_bind (fb);
+ gl->BindRenderbuffer (GL_RENDERBUFFER, rb->renderbuffer_id);
+
+ gl->FramebufferRenderbuffer (GL_FRAMEBUFFER, attachment_point,
+ GL_RENDERBUFFER, rb->renderbuffer_id);
+
+ _fbo_attachment_init (&attach, attachment_point, (GstGLBaseMemory *) rb);
+ fb->attachments = g_array_append_val (fb->attachments, attach);
+}
+
+void
+gst_gl_framebuffer_attach (GstGLFramebuffer * fb, guint attachment_point,
+ GstGLBaseMemory * mem)
+{
+ int i;
+
+ g_return_if_fail (GST_IS_GL_FRAMEBUFFER (fb));
+ g_return_if_fail (gst_gl_context_get_current () == fb->context);
+ g_return_if_fail (_is_valid_attachment_point (attachment_point));
+
+ /* remove the previous attachment */
+ for (i = 0; i < fb->attachments->len; i++) {
+ struct fbo_attachment *attach;
+
+ attach = &g_array_index (fb->attachments, struct fbo_attachment, i);
+
+ if (attach->attachment_point == attachment_point) {
+ g_array_remove_index_fast (fb->attachments, i);
+ break;
+ }
}
+
+ if (gst_is_gl_memory (GST_MEMORY_CAST (mem))) {
+ _attach_gl_memory (fb, attachment_point, (GstGLMemory *) mem);
+ } else if (gst_is_gl_renderbuffer (GST_MEMORY_CAST (mem))) {
+ _attach_renderbuffer (fb, attachment_point, (GstGLRenderbuffer *) mem);
+ } else {
+ g_assert_not_reached ();
+ return;
+ }
+
+ _update_effective_dimensions (fb);
+}
+
+void
+gst_gl_framebuffer_get_effective_dimensions (GstGLFramebuffer * fb,
+ guint * width, guint * height)
+{
+ g_return_if_fail (GST_IS_GL_FRAMEBUFFER (fb));
+
+ if (width)
+ *width = fb->priv->effective_width;
+ if (height)
+ *height = fb->priv->effective_height;
+}
+
+gboolean
+gst_gl_context_check_framebuffer_status (GstGLContext * context)
+{
+ g_return_val_if_fail (GST_IS_GL_CONTEXT (context), FALSE);
+
+ switch (context->gl_vtable->CheckFramebufferStatus (GL_FRAMEBUFFER)) {
+ case GL_FRAMEBUFFER_COMPLETE:
+ return TRUE;
+ break;
+ case GL_FRAMEBUFFER_UNSUPPORTED:
+ GST_WARNING_OBJECT (context, "GL_FRAMEBUFFER_UNSUPPORTED");
+ break;
+ case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
+ GST_WARNING_OBJECT (context, "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT");
+ break;
+ case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
+ GST_WARNING_OBJECT (context,
+ "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT");
+ break;
+ case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
+ GST_WARNING_OBJECT (context, "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS");
+ break;
+#if GST_GL_HAVE_OPENGL
+ case GL_FRAMEBUFFER_UNDEFINED:
+ GST_WARNING_OBJECT (context, "GL_FRAMEBUFFER_UNDEFINED");
+ break;
+#endif
+ default:
+ GST_WARNING_OBJECT (context, "Unknown FBO error");
+ break;
+ }
+
+ return FALSE;
+}
+
+guint
+gst_gl_framebuffer_get_id (GstGLFramebuffer * fb)
+{
+ g_return_val_if_fail (GST_IS_GL_FRAMEBUFFER (fb), 0);
+
+ return fb->fbo_id;
}
diff --git a/gst-libs/gst/gl/gstglframebuffer.h b/gst-libs/gst/gl/gstglframebuffer.h
index 4768afb..6298af1 100644
--- a/gst-libs/gst/gl/gstglframebuffer.h
+++ b/gst-libs/gst/gl/gstglframebuffer.h
@@ -34,35 +34,62 @@
#define GST_IS_GL_FRAMEBUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_GL_FRAMEBUFFER))
#define GST_GL_FRAMEBUFFER_CAST(obj) ((GstGLFramebuffer*)(obj))
-typedef struct _GstGLFramebuffer GstGLFramebuffer;
typedef struct _GstGLFramebufferClass GstGLFramebufferClass;
typedef struct _GstGLFramebufferPrivate GstGLFramebufferPrivate;
+/**
+ * GstGLFramebufferFunc:
+ * @data: user data
+ *
+ * callback definition for operating through a Framebuffer object
+ */
+typedef gboolean (*GstGLFramebufferFunc) (gpointer stuff);
+
struct _GstGLFramebuffer
{
- GObject object;
+ GstObject object;
+
+ GstGLContext *context;
/* <private> */
- GstGLContext *context;
+ guint fbo_id;
+ GArray *attachments;
+
+ gpointer _padding[GST_PADDING];
GstGLFramebufferPrivate *priv;
};
struct _GstGLFramebufferClass
{
- GObjectClass object_class;
+ GstObjectClass object_class;
+
+ gpointer _padding[GST_PADDING];
};
-GstGLFramebuffer *gst_gl_framebuffer_new (GstGLContext *context);
+GstGLFramebuffer * gst_gl_framebuffer_new (GstGLContext *context);
+GstGLFramebuffer * gst_gl_framebuffer_new_with_default_depth (GstGLContext *context,
+ guint width,
+ guint height);
-gboolean gst_gl_framebuffer_generate (GstGLFramebuffer *frame, gint width, gint height,
- guint * fbo, guint * depthbuffer);
+guint gst_gl_framebuffer_get_id (GstGLFramebuffer * fb);
-gboolean gst_gl_framebuffer_use_v2 (GstGLFramebuffer * frame, gint texture_fbo_width,
- gint texture_fbo_height, GLuint fbo, GLuint depth_buffer,
- GLuint texture_fbo, GLCB_V2 cb, gpointer stuff);
+void gst_gl_framebuffer_attach (GstGLFramebuffer * fb,
+ guint attachment_point,
+ GstGLBaseMemory * mem);
+void gst_gl_framebuffer_bind (GstGLFramebuffer * fb);
+void gst_gl_context_clear_framebuffer (GstGLContext * context);
-void gst_gl_framebuffer_delete (GstGLFramebuffer *frame, guint fbo, guint depth);
+void gst_gl_framebuffer_get_effective_dimensions (GstGLFramebuffer * fb,
+ guint * width,
+ guint * height);
+
+gboolean gst_gl_context_check_framebuffer_status (GstGLContext * context);
+
+gboolean gst_gl_framebuffer_draw_to_texture (GstGLFramebuffer * fb,
+ GstGLMemory * mem,
+ GstGLFramebufferFunc cb,
+ gpointer user_data);
#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstGLFramebuffer, gst_object_unref)
diff --git a/gst-libs/gst/gl/gstglmemory.c b/gst-libs/gst/gl/gstglmemory.c
index 402fd4d..73c3b59 100644
--- a/gst-libs/gst/gl/gstglmemory.c
+++ b/gst-libs/gst/gl/gstglmemory.c
@@ -275,8 +275,9 @@
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)
+ GstVideoGLTextureType tex_type, GstAllocationParams * params,
+ GstVideoInfo * info, guint plane, GstVideoAlignment * valign,
+ gpointer user_data, GDestroyNotify notify)
{
const gchar *target_str;
gsize size;
@@ -307,9 +308,7 @@
size = gst_gl_get_plane_data_size (info, valign, plane);
mem->tex_target = target;
- mem->tex_type =
- gst_gl_texture_type_from_format (context, GST_VIDEO_INFO_FORMAT (info),
- plane);
+ mem->tex_type = tex_type;
mem->plane = plane;
_calculate_unpack_length (mem, context);
@@ -367,6 +366,26 @@
return FALSE;
}
+ if (USING_GLES2 (context) || USING_GLES3 (context)) {
+ if (format == GL_RGBA && type == GL_UNSIGNED_BYTE) {
+ /* explicitly supported */
+ } else {
+ gint supported_format, supported_type;
+
+ gl->GetIntegerv (GL_IMPLEMENTATION_COLOR_READ_FORMAT, &supported_format);
+ gl->GetIntegerv (GL_IMPLEMENTATION_COLOR_READ_TYPE, &supported_type);
+
+ if (supported_format != format || supported_type != type) {
+ GST_CAT_ERROR (GST_CAT_GL_MEMORY, "cannot read pixels with "
+ "unsupported format and type. Supported format 0x%x type 0x%x",
+ supported_format, supported_type);
+ gl->BindFramebuffer (GL_FRAMEBUFFER, 0);
+ gl->DeleteFramebuffers (1, &fbo);
+ return FALSE;
+ }
+ }
+ }
+
gst_gl_query_start_log (GST_GL_BASE_MEMORY_CAST (gl_mem)->query,
GST_CAT_GL_MEMORY, GST_LEVEL_LOG, NULL, "%s", "glReadPixels took");
gl->ReadPixels (0, 0, gl_mem->tex_width, GL_MEM_HEIGHT (gl_mem), format,
@@ -374,7 +393,6 @@
gst_gl_query_end (GST_GL_BASE_MEMORY_CAST (gl_mem)->query);
gl->BindFramebuffer (GL_FRAMEBUFFER, 0);
-
gl->DeleteFramebuffers (1, &fbo);
return TRUE;
@@ -619,12 +637,21 @@
goto error;
}
+ if (USING_GLES2 (src->mem.context)
+ && (src->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE
+ || src->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA)) {
+ GST_CAT_FIXME (GST_CAT_GL_MEMORY,
+ "Cannot copy Luminance/Luminance Alpha textures in GLES");
+ 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;
GST_CAT_LOG (GST_CAT_GL_MEMORY, "copying memory %p, tex %u into "
@@ -719,22 +746,15 @@
dest = g_new0 (GstGLMemory, 1);
gst_gl_memory_init (dest, allocator, NULL, src->mem.context, src->tex_target,
- ¶ms, &src->info, src->plane, &src->valign, NULL, NULL);
+ src->tex_type, ¶ms, &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 {
+ if (!GST_MEMORY_FLAG_IS_SET (src, GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD)) {
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");
+ "Failed not map destination for writing");
gst_memory_unref (GST_MEMORY_CAST (dest));
return NULL;
}
@@ -744,11 +764,18 @@
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;
+ goto memcpy;
}
gst_memory_unmap (GST_MEMORY_CAST (dest), &dinfo);
+ } else {
+ memcpy:
+ 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;
+ }
}
return (GstMemory *) dest;
@@ -802,14 +829,14 @@
mem = g_new0 (GstGLMemory, 1);
if (alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE) {
- mem->tex_id = params->parent.gl_handle;
+ mem->tex_id = GPOINTER_TO_UINT (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);
+ params->parent.context, params->target, params->tex_type,
+ params->parent.alloc_params, params->v_info, params->plane,
+ params->valign, params->parent.user_data, params->parent.notify);
if (alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE) {
GST_MINI_OBJECT_FLAG_SET (mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD);
@@ -1044,6 +1071,7 @@
* @plane: the video plane @wrapped_data represents
* @valign: (allow-none): any #GstVideoAlignment applied to symem mappings of @wrapped_data
* @target: the #GstGLTextureTarget
+ * @tex_type: the #GstVideoGLTextureType
* @wrapped_data: (allow-none): the optional data pointer to wrap
* @gl_handle: the optional OpenGL handle to wrap or 0
* @user_data: (allow-none): user data to call @notify with
@@ -1061,8 +1089,8 @@
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)
+ GstVideoGLTextureType tex_type, gpointer wrapped_data, gpointer gl_handle,
+ gpointer user_data, GDestroyNotify notify)
{
guint i;
@@ -1087,6 +1115,7 @@
}
_gst_gl_video_allocation_params_set_video_alignment (params, valign);
params->target = target;
+ params->tex_type = tex_type;
params->plane = plane;
return TRUE;
@@ -1095,11 +1124,12 @@
/**
* 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
+ * @alloc_params: (allow-none): the #GstAllocationParams for sysmem mappings of the texture
+ * @v_info: the #GstVideoInfo for the texture
+ * @plane: the video plane of @v_info to allocate
+ * @valign: (allow-none): any #GstVideoAlignment applied to symem mappings of the texture
+ * @target: the #GstGLTextureTarget for the created textures
+ * @target: the #GstVideoGLTextureType for the created textures
*
* Returns: a new #GstGLVideoAllocationParams for allocating #GstGLMemory's
*
@@ -1108,7 +1138,8 @@
GstGLVideoAllocationParams *
gst_gl_video_allocation_params_new (GstGLContext * context,
GstAllocationParams * alloc_params, GstVideoInfo * v_info, guint plane,
- GstVideoAlignment * valign, GstGLTextureTarget target)
+ GstVideoAlignment * valign, GstGLTextureTarget target,
+ GstVideoGLTextureType tex_type)
{
GstGLVideoAllocationParams *params = g_new0 (GstGLVideoAllocationParams, 1);
@@ -1120,7 +1151,7 @@
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)) {
+ v_info, plane, valign, target, tex_type, NULL, 0, NULL, NULL)) {
g_free (params);
return NULL;
}
@@ -1136,6 +1167,7 @@
* @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
+ * @tex_type: the #GstVideoGLTextureType 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
@@ -1148,7 +1180,8 @@
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)
+ GstVideoGLTextureType tex_type, gpointer wrapped_data, gpointer user_data,
+ GDestroyNotify notify)
{
GstGLVideoAllocationParams *params = g_new0 (GstGLVideoAllocationParams, 1);
@@ -1160,7 +1193,55 @@
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)) {
+ v_info, plane, valign, target, tex_type, wrapped_data, 0, user_data,
+ notify)) {
+ g_free (params);
+ return NULL;
+ }
+
+ return params;
+}
+
+/**
+ * gst_gl_video_allocation_params_new_wrapped_gl_handle:
+ * @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_type: the #GstVideoGLTextureType for @tex_id
+ * @gl_handle: the GL handle to wrap
+ * @user_data: (allow-none): user data to call @notify with
+ * @notify: (allow-none): a #GDestroyNotify
+ *
+ * @gl_handle is defined by the specific OpenGL handle being wrapped
+ * For #GstGLMemory and #GstGLMemoryPBO it is an OpenGL texture id.
+ * Other memory types may define it to require a different type of parameter.
+ *
+ * Returns: a new #GstGLVideoAllocationParams for wrapping @gl_handle
+ *
+ * Since: 1.8
+ */
+GstGLVideoAllocationParams *
+gst_gl_video_allocation_params_new_wrapped_gl_handle (GstGLContext * context,
+ GstAllocationParams * alloc_params, GstVideoInfo * v_info, guint plane,
+ GstVideoAlignment * valign, GstGLTextureTarget target,
+ GstVideoGLTextureType tex_type, gpointer gl_handle, 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, tex_type, NULL, gl_handle, user_data,
+ notify)) {
g_free (params);
return NULL;
}
@@ -1176,6 +1257,7 @@
* @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_type: the #GstGLTextureType 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
@@ -1188,24 +1270,12 @@
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)
+ GstVideoGLTextureType tex_type, 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;
+ return gst_gl_video_allocation_params_new_wrapped_gl_handle (context,
+ alloc_params, v_info, plane, valign, target, tex_type,
+ GUINT_TO_POINTER (tex_id), user_data, notify);
}
/**
@@ -1255,6 +1325,7 @@
_gst_gl_video_allocation_params_set_video_alignment (dest_vid,
src_vid->valign);
dest_vid->target = src_vid->target;
+ dest_vid->tex_type = src_vid->tex_type;
dest_vid->plane = src_vid->plane;
}
@@ -1263,6 +1334,7 @@
* @allocator: the @GstGLMemoryAllocator to allocate from
* @buffer: a #GstBuffer to setup
* @params: the #GstGLVideoAllocationParams to allocate with
+ * @tex_types: (allow-none): a list of #GstVideoGLTextureType's to allocate with.
*
* Returns: whether the buffer was correctly setup
*
@@ -1270,18 +1342,15 @@
*/
gboolean
gst_gl_memory_setup_buffer (GstGLMemoryAllocator * allocator,
- GstBuffer * buffer, GstGLVideoAllocationParams * params)
+ GstBuffer * buffer, GstGLVideoAllocationParams * params,
+ GstVideoGLTextureType * tex_types, gpointer * wrapped_data,
+ gsize n_wrapped_pointers)
{
GstGLBaseMemoryAllocator *base_allocator;
guint n_mem, i, v, views;
guint alloc_flags = params->parent.alloc_flags;
g_return_val_if_fail (params != NULL, FALSE);
- g_return_val_if_fail ((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 (alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_VIDEO,
FALSE);
@@ -1294,11 +1363,30 @@
else
views = 1;
+ g_return_val_if_fail (!wrapped_data
+ || views * n_mem != n_wrapped_pointers, FALSE);
+
for (v = 0; v < views; v++) {
for (i = 0; i < n_mem; i++) {
GstGLMemory *gl_mem;
+ if (tex_types) {
+ params->tex_type = tex_types[i];
+ } else {
+ params->tex_type =
+ gst_gl_texture_type_from_format (params->parent.context,
+ GST_VIDEO_INFO_FORMAT (params->v_info), i);
+ }
+
params->plane = i;
+ if (alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_SYSMEM) {
+ g_return_val_if_fail (wrapped_data != NULL, FALSE);
+ params->parent.wrapped_data = wrapped_data[i];
+ } else if (alloc_flags &
+ GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE) {
+ g_return_val_if_fail (wrapped_data != NULL, FALSE);
+ params->parent.gl_handle = wrapped_data[i];
+ }
if (!(gl_mem = (GstGLMemory *) gst_gl_base_memory_alloc (base_allocator,
(GstGLAllocationParams *) params)))
diff --git a/gst-libs/gst/gl/gstglmemory.h b/gst-libs/gst/gl/gstglmemory.h
index b032a5c..d632564 100644
--- a/gst-libs/gst/gl/gstglmemory.h
+++ b/gst-libs/gst/gl/gstglmemory.h
@@ -78,6 +78,9 @@
gboolean texture_wrapped;
guint unpack_length;
guint tex_width;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
};
typedef struct _GstGLVideoAllocationParams GstGLVideoAllocationParams;
@@ -92,6 +95,10 @@
guint plane;
GstVideoAlignment *valign;
GstGLTextureTarget target;
+ GstVideoGLTextureType tex_type;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
};
gboolean gst_gl_video_allocation_params_init_full (GstGLVideoAllocationParams * params,
@@ -105,8 +112,9 @@
guint plane,
GstVideoAlignment * valign,
GstGLTextureTarget target,
+ GstVideoGLTextureType tex_type,
gpointer wrapped_data,
- guint gl_handle,
+ gpointer gl_handle,
gpointer user_data,
GDestroyNotify notify);
GstGLVideoAllocationParams * gst_gl_video_allocation_params_new (GstGLContext * context,
@@ -114,13 +122,15 @@
GstVideoInfo * v_info,
guint plane,
GstVideoAlignment * valign,
- GstGLTextureTarget target);
+ GstGLTextureTarget target,
+ GstVideoGLTextureType tex_type);
GstGLVideoAllocationParams * gst_gl_video_allocation_params_new_wrapped_data (GstGLContext * context,
GstAllocationParams * alloc_params,
GstVideoInfo * v_info,
guint plane,
GstVideoAlignment * valign,
GstGLTextureTarget target,
+ GstVideoGLTextureType tex_type,
gpointer wrapped_data,
gpointer user_data,
GDestroyNotify notify);
@@ -131,10 +141,22 @@
guint plane,
GstVideoAlignment * valign,
GstGLTextureTarget target,
+ GstVideoGLTextureType tex_type,
guint tex_id,
gpointer user_data,
GDestroyNotify notify);
+GstGLVideoAllocationParams * gst_gl_video_allocation_params_new_wrapped_gl_handle (GstGLContext * context,
+ GstAllocationParams * alloc_params,
+ GstVideoInfo * v_info,
+ guint plane,
+ GstVideoAlignment * valign,
+ GstGLTextureTarget target,
+ GstVideoGLTextureType tex_type,
+ gpointer gl_handle,
+ gpointer user_data,
+ GDestroyNotify notify);
+
/* subclass usage */
void gst_gl_video_allocation_params_free_data (GstGLVideoAllocationParams * params);
/* subclass usage */
@@ -149,6 +171,9 @@
struct _GstGLMemoryAllocator
{
GstGLBaseMemoryAllocator parent;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
};
/**
@@ -163,6 +188,9 @@
GstGLBaseMemoryAllocatorMapFunction map;
GstGLBaseMemoryAllocatorCopyFunction copy;
GstGLBaseMemoryAllocatorUnmapFunction unmap;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
};
#include <gst/gl/gstglbasememory.h>
@@ -182,6 +210,7 @@
GstMemory * parent,
GstGLContext * context,
GstGLTextureTarget target,
+ GstVideoGLTextureType tex_type,
GstAllocationParams *params,
GstVideoInfo * info,
guint plane,
@@ -216,8 +245,10 @@
gboolean gst_gl_memory_setup_buffer (GstGLMemoryAllocator * allocator,
GstBuffer * buffer,
- GstGLVideoAllocationParams * params);
-
+ GstGLVideoAllocationParams * params,
+ GstVideoGLTextureType *tex_types,
+ gpointer *wrapped_data,
+ gsize n_wrapped_pointers);
GstGLMemoryAllocator * gst_gl_memory_allocator_get_default (GstGLContext *context);
diff --git a/gst-libs/gst/gl/gstglmemorypbo.c b/gst-libs/gst/gl/gstglmemorypbo.c
index d8fa710..ebf8f29 100644
--- a/gst-libs/gst/gl/gstglmemorypbo.c
+++ b/gst-libs/gst/gl/gstglmemorypbo.c
@@ -217,34 +217,6 @@
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_new0 (GstGLMemoryPBO, 1);
- 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)
{
@@ -457,7 +429,7 @@
in_gl_type = GL_UNSIGNED_SHORT_5_6_5;
if (!gl->GenFramebuffers) {
- gst_gl_context_set_error (context,
+ GST_CAT_ERROR (GST_CAT_GL_MEMORY,
"Context, EXT_framebuffer_object not supported");
goto error;
}
@@ -467,9 +439,9 @@
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);
+ GST_CAT_ERROR (GST_CAT_GL_MEMORY, "Cannot copy between textures with "
+ "backing data of different sizes. input %" G_GSIZE_FORMAT " output %"
+ G_GSIZE_FORMAT, in_size, out_size);
goto error;
}
}
@@ -515,7 +487,7 @@
GstMapInfo pbo_info;
if (!gl->GenBuffers || !src->pbo) {
- gst_gl_context_set_error (context, "Cannot reinterpret texture contents "
+ GST_CAT_ERROR (GST_CAT_GL_MEMORY, "Cannot reinterpret texture contents "
"without pixel buffer objects");
gl->BindTexture (out_tex_target, 0);
goto fbo_error;
@@ -523,7 +495,7 @@
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 "
+ GST_CAT_ERROR (GST_CAT_GL_MEMORY, "Cannot copy non RGBA/UNSIGNED_BYTE "
"textures on GLES2");
gl->BindTexture (out_tex_target, 0);
goto fbo_error;
@@ -601,18 +573,12 @@
size);
}
- dest = (GstMemory *) _gl_mem_new (allocator, NULL, src->mem.mem.context,
- src->mem.tex_target, ¶ms, &src->mem.info, src->mem.plane,
- &src->mem.valign, NULL, NULL);
+ dest = (GstMemory *) g_new0 (GstGLMemoryPBO, 1);
+ gst_gl_memory_init (GST_GL_MEMORY_CAST (dest), allocator, NULL,
+ src->mem.mem.context, src->mem.tex_target, src->mem.tex_type, ¶ms,
+ &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 {
+ if (!GST_MEMORY_FLAG_IS_SET (src, GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD)) {
GstMapInfo dinfo;
if (!gst_memory_map (GST_MEMORY_CAST (dest), &dinfo,
@@ -628,11 +594,18 @@
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;
+ goto memcpy;
}
gst_memory_unmap (GST_MEMORY_CAST (dest), &dinfo);
+ } else {
+ memcpy:
+ 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;
+ }
}
return dest;
@@ -674,14 +647,14 @@
mem = g_new0 (GstGLMemoryPBO, 1);
if (alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE) {
- mem->mem.tex_id = params->parent.gl_handle;
+ mem->mem.tex_id = GPOINTER_TO_UINT (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);
+ gst_gl_memory_init (GST_GL_MEMORY_CAST (mem), GST_ALLOCATOR_CAST (allocator),
+ NULL, params->parent.context, params->target, params->tex_type,
+ params->parent.alloc_params, params->v_info, params->plane,
+ params->valign, params->parent.user_data, params->parent.notify);
if (alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE) {
GST_MINI_OBJECT_FLAG_SET (mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD);
@@ -864,6 +837,8 @@
GST_DEBUG_CATEGORY_INIT (GST_CAT_GL_MEMORY, "glmemory", 0, "OpenGL Memory");
_gl_allocator = g_object_new (GST_TYPE_GL_MEMORY_PBO_ALLOCATOR, NULL);
+ /* The allocator is never unreffed */
+ GST_OBJECT_FLAG_SET (_gl_allocator, GST_OBJECT_FLAG_MAY_BE_LEAKED);
gst_allocator_register (GST_GL_MEMORY_PBO_ALLOCATOR_NAME,
gst_object_ref (_gl_allocator));
diff --git a/gst-libs/gst/gl/gstglmemorypbo.h b/gst-libs/gst/gl/gstglmemorypbo.h
index aa4110e..830c0f4 100644
--- a/gst-libs/gst/gl/gstglmemorypbo.h
+++ b/gst-libs/gst/gl/gstglmemorypbo.h
@@ -52,6 +52,9 @@
/* <private> */
GstGLBuffer *pbo;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
};
/**
@@ -84,6 +87,9 @@
struct _GstGLMemoryPBOAllocator
{
GstGLMemoryAllocator parent;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
};
/**
@@ -94,6 +100,9 @@
struct _GstGLMemoryPBOAllocatorClass
{
GstGLMemoryAllocatorClass parent_class;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
};
G_END_DECLS
diff --git a/gst-libs/gst/gl/gstgloverlaycompositor.c b/gst-libs/gst/gl/gstgloverlaycompositor.c
index f7d0639..f6548a0 100644
--- a/gst-libs/gst/gl/gstgloverlaycompositor.c
+++ b/gst-libs/gst/gl/gstgloverlaycompositor.c
@@ -356,7 +356,8 @@
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);
+ GST_VIDEO_GL_TEXTURE_TYPE_RGBA, comp_frame->data[0], comp_frame,
+ _video_frame_unmap_and_free);
comp_gl_memory =
(GstGLMemory *) gst_gl_base_memory_alloc (mem_allocator,
diff --git a/gst-libs/gst/gl/gstgloverlaycompositor.h b/gst-libs/gst/gl/gstgloverlaycompositor.h
index dcecb49..dc8434a 100644
--- a/gst-libs/gst/gl/gstgloverlaycompositor.h
+++ b/gst-libs/gst/gl/gstgloverlaycompositor.h
@@ -43,7 +43,10 @@
struct _GstGLOverlayCompositor
{
GstObject parent;
+
GstGLContext *context;
+
+ /* <private> */
guint last_window_width;
guint last_window_height;
@@ -52,6 +55,8 @@
GstGLShader *shader;
GLint position_attrib;
GLint texcoord_attrib;
+
+ gpointer _padding[GST_PADDING];
};
/**
@@ -61,6 +66,9 @@
struct _GstGLOverlayCompositorClass
{
GstObjectClass object_class;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
};
GstGLOverlayCompositor *gst_gl_overlay_compositor_new (GstGLContext * context);
diff --git a/gst-libs/gst/gl/gstglquery.c b/gst-libs/gst/gl/gstglquery.c
index 45e6336..c59c19f 100644
--- a/gst-libs/gst/gl/gstglquery.c
+++ b/gst-libs/gst/gl/gstglquery.c
@@ -254,7 +254,8 @@
gl = query->context->gl_vtable;
if (gl->GetQueryObjectui64v) {
- gl->GetQueryObjectui64v (query->query_id, GL_QUERY_RESULT, &ret);
+ gl->GetQueryObjectui64v (query->query_id, GL_QUERY_RESULT,
+ (GLuint64 *) & ret);
} else {
guint tmp;
gl->GetQueryObjectuiv (query->query_id, GL_QUERY_RESULT, &tmp);
diff --git a/gst-libs/gst/gl/gstglquery.h b/gst-libs/gst/gl/gstglquery.h
index 9cf06fa..33777d4 100644
--- a/gst-libs/gst/gl/gstglquery.h
+++ b/gst-libs/gst/gl/gstglquery.h
@@ -42,6 +42,9 @@
gboolean start_called;
GstGLAsyncDebug debug;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
};
void gst_gl_query_init (GstGLQuery * query,
diff --git a/gst-libs/gst/gl/gstglrenderbuffer.c b/gst-libs/gst/gl/gstglrenderbuffer.c
new file mode 100644
index 0000000..0cabad9
--- /dev/null
+++ b/gst-libs/gst/gl/gstglrenderbuffer.c
@@ -0,0 +1,456 @@
+/*
+ * 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/video/video.h>
+
+#include <gst/gl/gstglbasememory.h>
+#include <gst/gl/gstglrenderbuffer.h>
+
+/**
+ * SECTION:gstglrenderbuffer
+ * @short_description: memory subclass for GL renderbuffer objects
+ * @see_also: #GstMemory, #GstAllocator
+ *
+ * GstGLRenderbuffer is a #GstGLBaseMemory subclass providing support for
+ * OpenGL renderbuffers.
+ *
+ * #GstGLRenderbuffer is created or wrapped through gst_gl_base_memory_alloc()
+ * with #GstGLRenderbufferAllocationParams.
+ */
+
+#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 GstAllocator *_gl_renderbuffer_allocator;
+
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_GL_RENDERBUFFER);
+#define GST_CAT_DEFAULT GST_CAT_GL_RENDERBUFFER
+
+G_DEFINE_TYPE (GstGLRenderbufferAllocator, gst_gl_renderbuffer_allocator,
+ GST_TYPE_GL_BASE_MEMORY_ALLOCATOR);
+
+static guint
+_new_renderbuffer (GstGLContext * context, guint format, guint width,
+ guint height)
+{
+ const GstGLFuncs *gl = context->gl_vtable;
+ guint rbo_id;
+
+ gl->GenRenderbuffers (1, &rbo_id);
+ gl->BindRenderbuffer (GL_RENDERBUFFER, rbo_id);
+
+ gl->RenderbufferStorage (GL_RENDERBUFFER, format, width, height);
+
+ gl->BindRenderbuffer (GL_RENDERBUFFER, 0);
+
+ return rbo_id;
+}
+
+static gboolean
+_gl_rbo_create (GstGLRenderbuffer * gl_mem, GError ** error)
+{
+ if (!gl_mem->renderbuffer_wrapped) {
+ GstGLContext *context = gl_mem->mem.context;
+ GLenum internal_format;
+ GLenum tex_format;
+ GLenum renderbuffer_type;
+
+ tex_format = gst_gl_format_from_gl_texture_type (gl_mem->renderbuffer_type);
+ renderbuffer_type = GL_UNSIGNED_BYTE;
+ if (gl_mem->renderbuffer_type == GST_VIDEO_GL_TEXTURE_TYPE_RGB16)
+ renderbuffer_type = GL_UNSIGNED_SHORT_5_6_5;
+
+ internal_format =
+ gst_gl_sized_gl_format_from_gl_format_type (context, tex_format,
+ renderbuffer_type);
+
+ gl_mem->renderbuffer_id =
+ _new_renderbuffer (context, internal_format,
+ gst_gl_renderbuffer_get_width (gl_mem),
+ gst_gl_renderbuffer_get_height (gl_mem));
+
+ GST_CAT_TRACE (GST_CAT_GL_RENDERBUFFER, "Generating renderbuffer id:%u "
+ "format:%u dimensions:%ux%u", gl_mem->renderbuffer_id, internal_format,
+ gst_gl_renderbuffer_get_width (gl_mem),
+ gst_gl_renderbuffer_get_height (gl_mem));
+ }
+
+ return TRUE;
+}
+
+static void
+gst_gl_renderbuffer_init (GstGLRenderbuffer * mem, GstAllocator * allocator,
+ GstMemory * parent, GstGLContext * context,
+ GstVideoGLTextureType renderbuffer_type, GstAllocationParams * params,
+ guint width, guint height, gpointer user_data, GDestroyNotify notify)
+{
+ gsize size = gst_gl_texture_type_n_bytes (renderbuffer_type) * width * height;
+
+ mem->renderbuffer_type = renderbuffer_type;
+ mem->width = width;
+ mem->height = height;
+
+ gst_gl_base_memory_init ((GstGLBaseMemory *) mem, allocator, parent, context,
+ params, size, user_data, notify);
+
+ GST_CAT_DEBUG (GST_CAT_GL_RENDERBUFFER, "new GL renderbuffer context:%"
+ GST_PTR_FORMAT " memory:%p format:%u dimensions:%ux%u ", context, mem,
+ mem->renderbuffer_type, gst_gl_renderbuffer_get_width (mem),
+ gst_gl_renderbuffer_get_height (mem));
+}
+
+static gpointer
+_gl_rbo_map (GstGLRenderbuffer * gl_mem, GstMapInfo * info, gsize maxsize)
+{
+ GST_CAT_WARNING (GST_CAT_GL_RENDERBUFFER, "Renderbuffer's cannot be mapped");
+
+ return NULL;
+}
+
+static void
+_gl_rbo_unmap (GstGLRenderbuffer * gl_mem, GstMapInfo * info)
+{
+}
+
+static GstMemory *
+_gl_rbo_copy (GstGLRenderbuffer * src, gssize offset, gssize size)
+{
+ GST_CAT_WARNING (GST_CAT_GL_RENDERBUFFER, "Renderbuffer's cannot be copied");
+
+ return NULL;
+}
+
+static GstMemory *
+_gl_rbo_alloc (GstAllocator * allocator, gsize size,
+ GstAllocationParams * params)
+{
+ g_warning ("Use gst_gl_base_memory_alloc to allocate from this allocator");
+
+ return NULL;
+}
+
+static void
+_gl_rbo_destroy (GstGLRenderbuffer * gl_mem)
+{
+ const GstGLFuncs *gl = gl_mem->mem.context->gl_vtable;
+
+ if (gl_mem->renderbuffer_id && !gl_mem->renderbuffer_wrapped)
+ gl->DeleteRenderbuffers (1, &gl_mem->renderbuffer_id);
+}
+
+static GstGLRenderbuffer *
+_default_gl_rbo_alloc (GstGLRenderbufferAllocator * allocator,
+ GstGLRenderbufferAllocationParams * params)
+{
+ guint alloc_flags = params->parent.alloc_flags;
+ GstGLRenderbuffer *mem;
+
+ g_return_val_if_fail ((alloc_flags &
+ GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_SYSMEM) == 0, NULL);
+
+ mem = g_new0 (GstGLRenderbuffer, 1);
+
+ if (alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE) {
+ mem->renderbuffer_id = GPOINTER_TO_UINT (params->parent.gl_handle);
+ mem->renderbuffer_wrapped = TRUE;
+ }
+
+ gst_gl_renderbuffer_init (mem, GST_ALLOCATOR_CAST (allocator), NULL,
+ params->parent.context, params->renderbuffer_type,
+ params->parent.alloc_params, params->width, params->height,
+ params->parent.user_data, params->parent.notify);
+
+ return mem;
+}
+
+static void
+gst_gl_renderbuffer_allocator_class_init (GstGLRenderbufferAllocatorClass *
+ klass)
+{
+ GstGLBaseMemoryAllocatorClass *gl_base;
+ GstAllocatorClass *allocator_class;
+
+ gl_base = (GstGLBaseMemoryAllocatorClass *) klass;
+ allocator_class = (GstAllocatorClass *) klass;
+
+ gl_base->alloc =
+ (GstGLBaseMemoryAllocatorAllocFunction) _default_gl_rbo_alloc;
+ gl_base->create = (GstGLBaseMemoryAllocatorCreateFunction) _gl_rbo_create;
+ gl_base->destroy = (GstGLBaseMemoryAllocatorDestroyFunction) _gl_rbo_destroy;
+
+ allocator_class->alloc = _gl_rbo_alloc;
+}
+
+static void
+gst_gl_renderbuffer_allocator_init (GstGLRenderbufferAllocator * allocator)
+{
+ GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator);
+
+ alloc->mem_type = GST_GL_RENDERBUFFER_ALLOCATOR_NAME;
+
+ alloc->mem_map_full = (GstMemoryMapFullFunction) _gl_rbo_map;
+ alloc->mem_unmap_full = (GstMemoryUnmapFullFunction) _gl_rbo_unmap;
+ alloc->mem_copy = (GstMemoryCopyFunction) _gl_rbo_copy;
+
+ GST_OBJECT_FLAG_SET (allocator, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC);
+}
+
+/**
+ * gst_gl_renderbuffer_get_width:
+ * @gl_mem: a #GstGLRenderbuffer
+ *
+ * Returns: the configured width of @gl_mem
+ *
+ * Since: 1.8
+ */
+gint
+gst_gl_renderbuffer_get_width (GstGLRenderbuffer * gl_mem)
+{
+ g_return_val_if_fail (gst_is_gl_renderbuffer ((GstMemory *) gl_mem), 0);
+
+ return gl_mem->width;
+}
+
+/**
+ * gst_gl_renderbuffer_get_height:
+ * @gl_mem: a #GstGLRenderbuffer
+ *
+ * Returns: the configured height of @gl_mem
+ *
+ * Since: 1.8
+ */
+gint
+gst_gl_renderbuffer_get_height (GstGLRenderbuffer * gl_mem)
+{
+ g_return_val_if_fail (gst_is_gl_renderbuffer ((GstMemory *) gl_mem), 0);
+
+ return gl_mem->height;
+}
+
+/**
+ * gst_gl_renderbuffer_get_type:
+ * @gl_mem: a #GstGLRenderbuffer
+ *
+ * Returns: the #GstVideoGLTextureType of @gl_mem
+ *
+ * Since: 1.8
+ */
+GstVideoGLTextureType
+gst_gl_renderbuffer_get_type (GstGLRenderbuffer * gl_mem)
+{
+ g_return_val_if_fail (gst_is_gl_renderbuffer ((GstMemory *) gl_mem), 0);
+
+ return gl_mem->renderbuffer_type;
+}
+
+/**
+ * gst_gl_renderbuffer_get_id:
+ * @gl_mem: a #GstGLRenderbuffer
+ *
+ * Returns: the OpenGL renderbuffer handle of @gl_mem
+ *
+ * Since: 1.8
+ */
+guint
+gst_gl_renderbuffer_get_id (GstGLRenderbuffer * gl_mem)
+{
+ g_return_val_if_fail (gst_is_gl_renderbuffer ((GstMemory *) gl_mem), 0);
+
+ return gl_mem->renderbuffer_id;
+}
+
+/**
+ * gst_gl_renderbuffer_init_once:
+ *
+ * Initializes the GL Base Texture allocator. It is safe to call this function
+ * multiple times. This must be called before any other GstGLRenderbuffer operation.
+ *
+ * Since: 1.4
+ */
+void
+gst_gl_renderbuffer_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_RENDERBUFFER, "glrenderbuffermemory", 0,
+ "OpenGL Renderbuffer memory");
+
+ _gl_renderbuffer_allocator =
+ g_object_new (GST_TYPE_GL_RENDERBUFFER_ALLOCATOR, NULL);
+ GST_OBJECT_FLAG_SET (_gl_renderbuffer_allocator,
+ GST_OBJECT_FLAG_MAY_BE_LEAKED);
+
+ gst_allocator_register (GST_GL_RENDERBUFFER_ALLOCATOR_NAME,
+ _gl_renderbuffer_allocator);
+
+ g_once_init_leave (&_init, 1);
+ }
+}
+
+/**
+ * gst_is_gl_renderbuffer:
+ * @mem:a #GstMemory
+ *
+ * Returns: whether the memory at @mem is a #GstGLRenderbuffer
+ *
+ * Since: 1.10
+ */
+gboolean
+gst_is_gl_renderbuffer (GstMemory * mem)
+{
+ return mem != NULL && mem->allocator != NULL
+ && g_type_is_a (G_OBJECT_TYPE (mem->allocator),
+ GST_TYPE_GL_RENDERBUFFER_ALLOCATOR);
+}
+
+static void
+_gst_gl_rb_alloc_params_free_data (GstGLRenderbufferAllocationParams * params)
+{
+ gst_gl_allocation_params_free_data (¶ms->parent);
+}
+
+static void
+_gst_gl_rb_alloc_params_copy_data (GstGLRenderbufferAllocationParams * src_vid,
+ GstGLRenderbufferAllocationParams * dest_vid)
+{
+ GstGLAllocationParams *src = (GstGLAllocationParams *) src_vid;
+ GstGLAllocationParams *dest = (GstGLAllocationParams *) dest_vid;
+
+ gst_gl_allocation_params_copy_data (src, dest);
+
+ dest_vid->renderbuffer_type = src_vid->renderbuffer_type;
+ dest_vid->width = src_vid->width;
+ dest_vid->height = src_vid->height;
+}
+
+static gboolean
+ _gst_gl_renderbuffer_allocation_params_init_full
+ (GstGLRenderbufferAllocationParams * params, gsize struct_size,
+ guint alloc_flags, GstGLAllocationParamsCopyFunc copy,
+ GstGLAllocationParamsFreeFunc free, GstGLContext * context,
+ GstAllocationParams * alloc_params, guint width, guint height,
+ GstVideoGLTextureType renderbuffer_type, gpointer wrapped_data,
+ gpointer gl_handle, gpointer user_data, GDestroyNotify notify)
+{
+ 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);
+
+ 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->renderbuffer_type = renderbuffer_type;
+ params->width = width;
+ params->height = height;
+
+ return TRUE;
+}
+
+/**
+ * gst_gl_renderbuffer_allocation_params_new:
+ * @context: a #GstGLContext
+ * @alloc_params: (allow-none): the #GstAllocationParams for sysmem mappings of the texture
+ * @width: the width of the renderbuffer
+ * @height: the height of the renderbuffer
+ * @renderbuffer_type: the #GstVideoGLTextureType for the created textures
+ *
+ * Returns: a new #GstGLRenderbufferAllocationParams for allocating #GstGLRenderbuffer's
+ *
+ * Since: 1.10
+ */
+GstGLRenderbufferAllocationParams *
+gst_gl_renderbuffer_allocation_params_new (GstGLContext * context,
+ GstAllocationParams * alloc_params, GstVideoGLTextureType renderbuffer_type,
+ guint width, guint height)
+{
+ GstGLRenderbufferAllocationParams *params =
+ g_new0 (GstGLRenderbufferAllocationParams, 1);
+
+ if (!_gst_gl_renderbuffer_allocation_params_init_full (params,
+ sizeof (GstGLRenderbufferAllocationParams),
+ GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_ALLOC |
+ GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_VIDEO,
+ (GstGLAllocationParamsCopyFunc) _gst_gl_rb_alloc_params_copy_data,
+ (GstGLAllocationParamsFreeFunc) _gst_gl_rb_alloc_params_free_data,
+ context, alloc_params, width, height, renderbuffer_type, NULL, 0,
+ NULL, NULL)) {
+ g_free (params);
+ return NULL;
+ }
+
+ return params;
+}
+
+/**
+ * gst_gl_renderbuffer_allocation_params_new_wrapped:
+ * @context: a #GstGLContext
+ * @alloc_params: (allow-none): the #GstAllocationParams for @tex_id
+ * @width: the width of the renderbuffer
+ * @height: the height of the renderbuffer
+ * @renderbuffer_type: the #GstVideoGLTextureType for @tex_id
+ * @gl_handle: the GL handle to wrap
+ * @user_data: (allow-none): user data to call @notify with
+ * @notify: (allow-none): a #GDestroyNotify
+ *
+ * Returns: a new #GstGLRenderbufferAllocationParams for wrapping @gl_handle as a
+ * renderbuffer
+ *
+ * Since: 1.10
+ */
+GstGLRenderbufferAllocationParams *
+gst_gl_renderbuffer_allocation_params_new_wrapped (GstGLContext * context,
+ GstAllocationParams * alloc_params, GstVideoGLTextureType renderbuffer_type,
+ guint width, guint height, gpointer gl_handle, gpointer user_data,
+ GDestroyNotify notify)
+{
+ GstGLRenderbufferAllocationParams *params =
+ g_new0 (GstGLRenderbufferAllocationParams, 1);
+
+ if (!_gst_gl_renderbuffer_allocation_params_init_full (params,
+ sizeof (GstGLRenderbufferAllocationParams),
+ GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE |
+ GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_VIDEO,
+ (GstGLAllocationParamsCopyFunc) _gst_gl_rb_alloc_params_copy_data,
+ (GstGLAllocationParamsFreeFunc) _gst_gl_rb_alloc_params_free_data,
+ context, alloc_params, width, height, renderbuffer_type, NULL,
+ gl_handle, user_data, notify)) {
+ g_free (params);
+ return NULL;
+ }
+
+ return params;
+}
diff --git a/gst-libs/gst/gl/gstglrenderbuffer.h b/gst-libs/gst/gl/gstglrenderbuffer.h
new file mode 100644
index 0000000..5a9a1c0
--- /dev/null
+++ b/gst-libs/gst/gl/gstglrenderbuffer.h
@@ -0,0 +1,143 @@
+/*
+ * 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_RENDERBUFFER_H_
+#define _GST_GL_RENDERBUFFER_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_RENDERBUFFER_ALLOCATOR (gst_gl_renderbuffer_allocator_get_type())
+GType gst_gl_renderbuffer_allocator_get_type(void);
+
+#define GST_IS_GL_RENDERBUFFER_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GL_RENDERBUFFER_ALLOCATOR))
+#define GST_IS_GL_RENDERBUFFER_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GL_RENDERBUFFER_ALLOCATOR))
+#define GST_GL_RENDERBUFFER_ALLOCATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_GL_RENDERBUFFER_ALLOCATOR, GstGLRenderbufferAllocatorClass))
+#define GST_GL_RENDERBUFFER_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GL_RENDERBUFFER_ALLOCATOR, GstGLRenderbufferAllocator))
+#define GST_GL_RENDERBUFFER_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GL_RENDERBUFFER_ALLOCATOR, GstGLRenderbufferAllocatorClass))
+#define GST_GL_RENDERBUFFER_ALLOCATOR_CAST(obj) ((GstGLRenderbufferAllocator *)(obj))
+
+#define GST_GL_RENDERBUFFER_CAST(obj) ((GstGLRenderbuffer *) obj)
+
+/**
+ * GST_GL_RENDERBUFFER_ALLOCATOR_NAME:
+ *
+ * The name of the GL renderbuffer allocator
+ */
+#define GST_GL_RENDERBUFFER_ALLOCATOR_NAME "GLRenderbuffer"
+
+/**
+ * GstGLRenderbuffer:
+ * @mem: the parent object
+ * @renderbuffer_id: the GL texture id for this memory
+ * @renderbuffer_type: the texture type
+ * @width: the width
+ * @height: the height
+ *
+ * Represents information about a GL renderbuffer
+ */
+struct _GstGLRenderbuffer
+{
+ GstGLBaseMemory mem;
+
+ guint renderbuffer_id;
+ GstVideoGLTextureType renderbuffer_type;
+ guint width;
+ guint height;
+
+ /* <protected> */
+ gboolean renderbuffer_wrapped;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
+};
+
+/**
+ * GstGLRenderbufferAllocator
+ *
+ * Opaque #GstGLRenderbufferAllocator struct
+ */
+struct _GstGLRenderbufferAllocator
+{
+ GstGLBaseMemoryAllocator parent;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
+};
+
+/**
+ * GstGLRenderbufferAllocatorClass:
+ *
+ * The #GstGLRenderbufferAllocatorClass only contains private data
+ */
+struct _GstGLRenderbufferAllocatorClass
+{
+ GstGLBaseMemoryAllocatorClass parent_class;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
+};
+
+#include <gst/gl/gstglbasememory.h>
+
+typedef struct
+{
+ GstGLAllocationParams parent;
+
+ GstVideoGLTextureType renderbuffer_type;
+ guint width;
+ guint height;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
+} GstGLRenderbufferAllocationParams;
+
+GstGLRenderbufferAllocationParams * gst_gl_renderbuffer_allocation_params_new (GstGLContext * context,
+ GstAllocationParams * alloc_params,
+ GstVideoGLTextureType renderbuffer_type,
+ guint width,
+ guint height);
+
+GstGLRenderbufferAllocationParams * gst_gl_renderbuffer_allocation_params_new_wrapped (GstGLContext * context,
+ GstAllocationParams * alloc_params,
+ GstVideoGLTextureType renderbuffer_type,
+ guint width,
+ guint height,
+ gpointer gl_handle,
+ gpointer user_data,
+ GDestroyNotify notify);
+
+void gst_gl_renderbuffer_init_once (void);
+gboolean gst_is_gl_renderbuffer (GstMemory * mem);
+
+/* accessors */
+gint gst_gl_renderbuffer_get_width (GstGLRenderbuffer * gl_mem);
+gint gst_gl_renderbuffer_get_height (GstGLRenderbuffer * gl_mem);
+GstVideoGLTextureType gst_gl_renderbuffer_get_type (GstGLRenderbuffer * gl_mem);
+guint gst_gl_renderbuffer_get_id (GstGLRenderbuffer * gl_mem);
+
+G_END_DECLS
+
+#endif /* _GST_GL_RENDERBUFFER_H_ */
diff --git a/gst-libs/gst/gl/gstglshader.c b/gst-libs/gst/gl/gstglshader.c
index 9d96784..9f09236 100644
--- a/gst-libs/gst/gl/gstglshader.c
+++ b/gst-libs/gst/gl/gstglshader.c
@@ -1306,3 +1306,23 @@
gl->BindAttribLocation (priv->program_handle, index, name);
}
+
+void
+gst_gl_shader_bind_frag_data_location (GstGLShader * shader,
+ guint index, const gchar * name)
+{
+ GstGLShaderPrivate *priv;
+ GstGLFuncs *gl;
+
+ g_return_if_fail (shader != NULL);
+ if (!_ensure_program (shader))
+ g_return_if_fail (shader->priv->program_handle);
+ priv = shader->priv;
+ gl = shader->context->gl_vtable;
+ g_return_if_fail (gl->BindFragDataLocation);
+
+ GST_TRACE_OBJECT (shader, "binding program %i frag data \'%s\' location %i",
+ (int) priv->program_handle, name, index);
+
+ gl->BindFragDataLocation (priv->program_handle, index, name);
+}
diff --git a/gst-libs/gst/gl/gstglshader.h b/gst-libs/gst/gl/gstglshader.h
index 21410e2..2164f21 100644
--- a/gst-libs/gst/gl/gstglshader.h
+++ b/gst-libs/gst/gl/gstglshader.h
@@ -34,12 +34,13 @@
#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))
-struct _GstGLShader {
- /*< private >*/
+struct _GstGLShader
+{
GstObject parent;
GstGLContext *context;
+ /*< private >*/
GstGLShaderPrivate *priv;
gpointer _padding[GST_PADDING];
@@ -104,6 +105,7 @@
gint gst_gl_shader_get_attribute_location (GstGLShader *shader, const gchar *name);
void gst_gl_shader_bind_attribute_location (GstGLShader * shader, guint index, const gchar * name);
+void gst_gl_shader_bind_frag_data_location (GstGLShader * shader, guint index, const gchar * name);
G_END_DECLS
diff --git a/gst-libs/gst/gl/gstglshaderstrings.c b/gst-libs/gst/gl/gstglshaderstrings.c
index 729be6f..e6bf5f3 100644
--- a/gst-libs/gst/gl/gstglshaderstrings.c
+++ b/gst-libs/gst/gl/gstglshaderstrings.c
@@ -46,6 +46,17 @@
" v_texcoord = (u_transformation * vec4(a_texcoord, 0, 1)).xy;\n"
"}\n";
+const gchar *gst_gl_shader_string_vertex_mat4_vertex_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 = u_transformation * a_position;\n"
+ " v_texcoord = a_texcoord;\n"
+ "}\n";
+
const gchar *gst_gl_shader_string_fragment_default =
"#ifdef GL_ES\n"
"precision mediump float;\n"
diff --git a/gst-libs/gst/gl/gstglshaderstrings.h b/gst-libs/gst/gl/gstglshaderstrings.h
index 49ea8de..89d88b0 100644
--- a/gst-libs/gst/gl/gstglshaderstrings.h
+++ b/gst-libs/gst/gl/gstglshaderstrings.h
@@ -29,6 +29,7 @@
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_vertex_mat4_vertex_transform;
extern const gchar *gst_gl_shader_string_fragment_external_oes_default;
G_END_DECLS
diff --git a/gst-libs/gst/gl/gstglsl.c b/gst-libs/gst/gl/gstglsl.c
index 5074552..e3fe9c5 100644
--- a/gst-libs/gst/gl/gstglsl.c
+++ b/gst-libs/gst/gl/gstglsl.c
@@ -33,6 +33,21 @@
* @see_also: #GstGLSLStage, #GstGLShader
*/
+#define GST_CAT_DEFAULT gst_glsl_debug
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
+
+static void
+_init_debug (void)
+{
+ static volatile gsize _init = 0;
+
+ if (g_once_init_enter (&_init)) {
+ GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "glsl", 0,
+ "OpenGL Shading Language");
+ g_once_init_leave (&_init, 1);
+ }
+}
+
GQuark
gst_glsl_error_quark (void)
{
@@ -255,6 +270,8 @@
GstGLSLProfile profile = GST_GLSL_PROFILE_NONE;
gint i;
+ _init_debug ();
+
if (!string)
goto error;
@@ -265,6 +282,7 @@
if (str[0] == '#') {
if (!(version_s =
(gchar *) _check_valid_version_preprocessor_string (version_s))) {
+ GST_WARNING ("Invalid preprocesser directive detected: %s", version_s);
g_free (str);
goto error;
}
@@ -277,6 +295,8 @@
i++;
/* wrong version length */
if (i != 3) {
+ GST_WARNING ("version number has the wrong number of digits: %s",
+ version_s);
g_free (str);
goto error;
}
@@ -293,13 +313,24 @@
g_free (str);
/* check whether the parsed data is valid */
- if (!version)
+ if (!version) {
+ GST_WARNING ("Could not map the version number to a valid GLSL version:");
goto error;
- if (!_is_valid_version_profile (version, profile))
+ }
+ if (!_is_valid_version_profile (version, profile)) {
+ GST_WARNING ("Invalid version/profile combination specified: %s %s",
+ gst_glsl_version_to_string (version),
+ gst_glsl_profile_to_string (profile));
goto error;
+ }
/* got a profile when none was expected */
- if (version <= GST_GLSL_VERSION_150 && profile != GST_GLSL_PROFILE_NONE)
+ if (version <= GST_GLSL_VERSION_150 && profile != GST_GLSL_PROFILE_NONE) {
+ GST_WARNING
+ ("Found a profile (%s) with a version (%s) that does not support "
+ "profiles", gst_glsl_version_to_string (version),
+ gst_glsl_profile_to_string (profile));
goto error;
+ }
_fixup_version_profile (&version, &profile);
@@ -329,6 +360,8 @@
gboolean newline = TRUE;
gint i = 0;
+ _init_debug ();
+
/* search for #version while allowing for preceeding comments/whitespace as
* permitted by the GLSL specification */
while (str && str[i] != '\0' && i < 1024) {
@@ -366,8 +399,10 @@
}
if (str[i] == '#') {
- if (newline && _check_valid_version_preprocessor_string (&str[i]))
+ if (newline && _check_valid_version_preprocessor_string (&str[i])) {
+ GST_DEBUG ("found #version declaration at index %i", i);
return &str[i];
+ }
break;
}
@@ -376,6 +411,8 @@
i++;
}
+ GST_DEBUG ("no #version declaration found in the first 1K");
+
return NULL;
}
@@ -410,6 +447,8 @@
{
g_return_val_if_fail (gl_api != GST_GL_API_NONE, 0);
+ _init_debug ();
+
if (gl_api & GST_GL_API_GLES2) {
if (maj == 2 && min == 0)
return 100;
@@ -417,6 +456,7 @@
if (maj == 3 && min >= 0 && min <= 2)
return maj * 100 + min * 10;
+ GST_WARNING ("unknown GLES version");
return 0;
}
@@ -436,9 +476,11 @@
if (maj == 2 && min == 0)
return 110;
+ GST_WARNING ("unknown GL version");
return 0;
}
+ GST_WARNING ("unknown GL API");
return 0;
}
@@ -551,3 +593,269 @@
vtable->initialized = TRUE;
return TRUE;
}
+
+static gchar *
+_mangle_external_image_extension (const gchar * str, GstGLContext * context,
+ GstGLTextureTarget from, GstGLTextureTarget to, GstGLSLVersion version,
+ GstGLSLProfile profile)
+{
+ GST_DEBUG ("is oes? %d, profile == ES? %d, version >= 300? %d, "
+ "have essl3? %d", to == GST_GL_TEXTURE_TARGET_EXTERNAL_OES,
+ profile == GST_GLSL_PROFILE_ES, version >= GST_GLSL_VERSION_300,
+ gst_gl_context_check_feature (context,
+ "GL_OES_EGL_image_external_essl3"));
+
+ /* replace GL_OES_EGL_image_external with GL_OES_EGL_image_external_essl3 where supported */
+ if (to == GST_GL_TEXTURE_TARGET_EXTERNAL_OES && profile == GST_GLSL_PROFILE_ES
+ && version >= GST_GLSL_VERSION_300) {
+ if (gst_gl_context_check_feature (context,
+ "GL_OES_EGL_image_external_essl3")) {
+ GRegex *regex = g_regex_new (
+ /* '#extension ' with optional spacing */
+ "(#[ \\t]*extension[ \\t]+)"
+ /* what we're looking to replace */
+ "GL_OES_EGL_image_external"
+ /* ':' with optional spacing */
+ "([ \\t]*:[ \\t]*"
+ /* some word like require, disable, etc followed by spacing and a newline */
+ "\\S+[ \\t]*\\R)",
+ 0, 0, NULL);
+ gchar *tmp = g_regex_replace (regex, str, -1, 0,
+ "\\1GL_OES_EGL_image_external_essl3\\2", 0, NULL);
+ g_regex_unref (regex);
+ return tmp;
+ } else {
+ GST_FIXME ("Undefined situation detected. GLES3 supported but "
+ "GL_OES_EGL_image_external_essl3 not supported. Falling back to the "
+ "older GL_OES_EGL_image_external extension");
+ return g_strdup (str);
+ }
+ } else {
+ return g_strdup (str);
+ }
+}
+
+static gchar *
+_mangle_texture_access (const gchar * str, GstGLContext * context,
+ GstGLTextureTarget from, GstGLTextureTarget to, GstGLSLVersion version,
+ GstGLSLProfile profile)
+{
+ 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";
+
+ /* GL3 || gles3 but not when external-oes unless the image_external_essl3 extension is supported */
+ if (profile == GST_GLSL_PROFILE_CORE || (profile == GST_GLSL_PROFILE_ES
+ && version >= GST_GLSL_VERSION_300
+ && (to != GST_GL_TEXTURE_TARGET_EXTERNAL_OES
+ || gst_gl_context_check_feature (context,
+ "GL_OES_EGL_image_external_essl3")))) {
+ 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,
+ GstGLSLVersion version, GstGLSLProfile profile)
+{
+ if (shader_type == GL_VERTEX_SHADER) {
+ if (profile == GST_GLSL_PROFILE_CORE || (profile == GST_GLSL_PROFILE_ES
+ && version >= GST_GLSL_VERSION_300)) {
+ 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) {
+ if (profile == GST_GLSL_PROFILE_CORE || (profile == GST_GLSL_PROFILE_ES
+ && version >= GST_GLSL_VERSION_300)) {
+ 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_data (const gchar * str)
+{
+ GRegex *regex;
+ gchar *ret, *tmp;
+
+ 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);
+
+ tmp = ret;
+ /* search and replace 'gl_FragData[NUM]' into fragColor_NUM */
+ regex = g_regex_new ("gl_FragData\\[(\\d+)\\]", 0, 0, NULL);
+ ret = g_regex_replace (regex, tmp, -1, 0, "fragColor_\\1", 0, NULL);
+ g_regex_unref (regex);
+ g_free (tmp);
+
+ return ret;
+}
+
+static void
+_mangle_version_profile_from_gl_api (GstGLContext * context,
+ GstGLTextureTarget from, GstGLTextureTarget to, GstGLSLVersion * version,
+ GstGLSLProfile * profile)
+{
+ GstGLAPI gl_api;
+ gint gl_major, gl_minor;
+
+ gl_api = gst_gl_context_get_gl_api (context);
+ gst_gl_context_get_gl_version (context, &gl_major, &gl_minor);
+
+ *version = GST_GLSL_VERSION_NONE;
+ *profile = GST_GLSL_PROFILE_NONE;
+
+ if (gl_api & GST_GL_API_OPENGL3) {
+ if (gl_major > 3 || gl_minor >= 3) {
+ *version = GST_GLSL_VERSION_330;
+ *profile = GST_GLSL_PROFILE_CORE;
+ } else {
+ *version = GST_GLSL_VERSION_150;
+ *profile = GST_GLSL_PROFILE_NONE;
+ }
+ } else if (gl_api & GST_GL_API_GLES2) {
+ /* We don't know which texture function to use if we have GLES3 and
+ * don't have the essl3 extension */
+ if (gl_major >= 3 && (to != GST_GL_TEXTURE_TARGET_EXTERNAL_OES
+ || gst_gl_context_check_feature (context,
+ "GL_OES_EGL_image_external_essl3"))) {
+ *version = GST_GLSL_VERSION_300;
+ *profile = GST_GLSL_PROFILE_ES;
+ } else if (gl_major >= 2) {
+ *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;
+ }
+}
+
+gchar *
+_gst_glsl_mangle_shader (const gchar * str, guint shader_type,
+ GstGLTextureTarget from, GstGLTextureTarget to, GstGLContext * context,
+ GstGLSLVersion * version, GstGLSLProfile * profile)
+{
+ gchar *tmp, *tmp2;
+
+ _init_debug ();
+
+ g_return_val_if_fail (GST_IS_GL_CONTEXT (context), NULL);
+
+ _mangle_version_profile_from_gl_api (context, from, to, version, profile);
+ tmp2 =
+ _mangle_external_image_extension (str, context, from, to, *version,
+ *profile);
+ tmp = _mangle_texture_access (tmp2, context, from, to, *version, *profile);
+ g_free (tmp2);
+ tmp2 = _mangle_sampler_type (tmp, from, to);
+ g_free (tmp);
+ tmp = _mangle_varying_attribute (tmp2, shader_type, *version, *profile);
+ g_free (tmp2);
+ if (shader_type == GL_FRAGMENT_SHADER) {
+ if ((*profile == GST_GLSL_PROFILE_ES && *version >= GST_GLSL_VERSION_300)
+ || (*profile == GST_GLSL_PROFILE_CORE
+ && *version >= GST_GLSL_VERSION_150)) {
+ tmp2 = _mangle_frag_color_data (tmp);
+ g_free (tmp);
+ tmp = tmp2;
+ }
+ }
+ return tmp;
+}
diff --git a/gst-libs/gst/gl/gstglsl_private.h b/gst-libs/gst/gl/gstglsl_private.h
index c1be677..755170d 100644
--- a/gst-libs/gst/gl/gstglsl_private.h
+++ b/gst-libs/gst/gl/gstglsl_private.h
@@ -58,6 +58,10 @@
G_GNUC_INTERNAL gboolean _gst_glsl_funcs_fill (GstGLSLFuncs * vtable, GstGLContext * context);
G_GNUC_INTERNAL const gchar * _gst_glsl_shader_string_find_version (const gchar * str);
+G_GNUC_INTERNAL gchar *
+_gst_glsl_mangle_shader (const gchar * str, guint shader_type, GstGLTextureTarget from,
+ GstGLTextureTarget to, GstGLContext * context, GstGLSLVersion * version, GstGLSLProfile * profile);
+
G_END_DECLS
#endif /* __GST_GLSL_PRIVATE_H__ */
diff --git a/gst-libs/gst/gl/gstglslstage.h b/gst-libs/gst/gl/gstglslstage.h
index 31dcbec..3521e22 100644
--- a/gst-libs/gst/gl/gstglslstage.h
+++ b/gst-libs/gst/gl/gstglslstage.h
@@ -39,11 +39,11 @@
*/
struct _GstGLSLStage
{
- /*< private >*/
GstObject parent;
GstGLContext *context;
+ /*< private >*/
GstGLSLStagePrivate *priv;
gpointer _padding[GST_PADDING];
@@ -56,8 +56,10 @@
*/
struct _GstGLSLStageClass
{
- /*< private >*/
GstObjectClass parent;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
};
GType gst_glsl_stage_get_type (void);
diff --git a/gst-libs/gst/gl/gstglupload.c b/gst-libs/gst/gl/gstglupload.c
index 32e6150..bfa5f22 100644
--- a/gst-libs/gst/gl/gstglupload.c
+++ b/gst-libs/gst/gl/gstglupload.c
@@ -28,7 +28,7 @@
#include "gstglupload.h"
#if GST_GL_HAVE_PLATFORM_EGL
-#include "egl/gsteglimagememory.h"
+#include "egl/gstglmemoryegl.h"
#endif
#if GST_GL_HAVE_DMABUF
@@ -189,7 +189,7 @@
GstStaticCaps *input_template_caps;
gpointer (*new) (GstGLUpload * upload);
- GstCaps *(*transform_caps) (GstGLContext * context,
+ GstCaps *(*transform_caps) (gpointer impl, GstGLContext * context,
GstPadDirection direction, GstCaps * caps);
gboolean (*accept) (gpointer impl, GstBuffer * buffer, GstCaps * in_caps,
GstCaps * out_caps);
@@ -203,6 +203,8 @@
struct GLMemoryUpload
{
GstGLUpload *upload;
+ GstGLTextureTarget input_target;
+ GstGLTextureTarget output_target;
};
static gpointer
@@ -211,14 +213,17 @@
struct GLMemoryUpload *mem = g_new0 (struct GLMemoryUpload, 1);
mem->upload = upload;
+ mem->input_target = GST_GL_TEXTURE_TARGET_NONE;
+ mem->output_target = GST_GL_TEXTURE_TARGET_NONE;
return mem;
}
static GstCaps *
-_gl_memory_upload_transform_caps (GstGLContext * context,
+_gl_memory_upload_transform_caps (gpointer impl, GstGLContext * context,
GstPadDirection direction, GstCaps * caps)
{
+ struct GLMemoryUpload *upload = impl;
GstCapsFeatures *passthrough =
gst_caps_features_from_string
(GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION);
@@ -231,12 +236,17 @@
gst_caps_features_free (passthrough);
if (direction == GST_PAD_SINK) {
- GstGLTextureTarget target_mask = 0;
GstCaps *tmp;
+ GstGLTextureTarget target_mask;
- target_mask |= 1 << GST_GL_TEXTURE_TARGET_2D;
- target_mask |= 1 << GST_GL_TEXTURE_TARGET_RECTANGLE;
- target_mask |= 1 << GST_GL_TEXTURE_TARGET_EXTERNAL_OES;
+ if (upload->input_target != GST_GL_TEXTURE_TARGET_NONE) {
+ target_mask = 1 << upload->input_target;
+ } else {
+ target_mask = 1 << GST_GL_TEXTURE_TARGET_2D |
+ 1 << GST_GL_TEXTURE_TARGET_RECTANGLE |
+ 1 << GST_GL_TEXTURE_TARGET_EXTERNAL_OES;
+ }
+
tmp = _caps_intersect_texture_target (ret, target_mask);
gst_caps_unref (ret);
ret = tmp;
@@ -319,6 +329,17 @@
upload->context));
gst_query_add_allocation_param (query, allocator, ¶ms);
gst_object_unref (allocator);
+
+#if GST_GL_HAVE_PLATFORM_EGL
+ if (upload->upload->context
+ && gst_gl_context_get_gl_platform (upload->upload->context) ==
+ GST_GL_PLATFORM_EGL) {
+ allocator =
+ GST_ALLOCATOR (gst_allocator_find (GST_GL_MEMORY_EGL_ALLOCATOR_NAME));
+ gst_query_add_allocation_param (query, allocator, ¶ms);
+ gst_object_unref (allocator);
+ }
+#endif
}
n_pools = gst_query_get_n_allocation_pools (query);
@@ -401,6 +422,21 @@
gl_mem->mem.context))
return GST_GL_UPLOAD_UNSHARED_GL_CONTEXT;
+ if (upload->output_target == GST_GL_TEXTURE_TARGET_NONE &&
+ upload->upload->priv->out_caps) {
+ upload->output_target =
+ _caps_get_texture_target (upload->upload->priv->out_caps,
+ GST_GL_TEXTURE_TARGET_NONE);
+ }
+
+ /* always track the last input texture target so ::transform_caps() can
+ * use it to build the output caps */
+ upload->input_target = gl_mem->tex_target;
+ if (upload->output_target != gl_mem->tex_target) {
+ *outbuf = NULL;
+ return GST_GL_UPLOAD_RECONFIGURE;
+ }
+
if (gst_is_gl_memory_pbo (mem))
gst_gl_memory_pbo_upload_transfer ((GstGLMemoryPBO *) mem);
}
@@ -433,231 +469,12 @@
&_gl_memory_upload_free
};
-#if GST_GL_HAVE_PLATFORM_EGL
-struct EGLImageUpload
-{
- GstGLUpload *upload;
- GstBuffer *buffer;
- GstBuffer **outbuf;
- GstGLVideoAllocationParams *params;
-};
-
-static gpointer
-_egl_image_upload_new (GstGLUpload * upload)
-{
- struct EGLImageUpload *image = g_new0 (struct EGLImageUpload, 1);
-
- image->upload = upload;
-
- return image;
-}
-
-static GstCaps *
-_egl_image_upload_transform_caps (GstGLContext * context,
- GstPadDirection direction, GstCaps * caps)
-{
- GstCapsFeatures *passthrough =
- gst_caps_features_from_string
- (GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION);
- GstCaps *ret;
-
- if (direction == GST_PAD_SINK) {
- GstCaps *tmp;
-
- ret =
- _set_caps_features_with_passthrough (caps,
- GST_CAPS_FEATURE_MEMORY_GL_MEMORY, passthrough);
-
- tmp = _caps_intersect_texture_target (ret, 1 << GST_GL_TEXTURE_TARGET_2D);
- gst_caps_unref (ret);
- ret = tmp;
- } else {
- gint i, n;
-
- ret =
- _set_caps_features_with_passthrough (caps,
- GST_CAPS_FEATURE_MEMORY_EGL_IMAGE, passthrough);
- 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);
- }
- }
-
- gst_caps_features_free (passthrough);
-
- return ret;
-}
-
-static gboolean
-_egl_image_upload_accept (gpointer impl, GstBuffer * buffer, GstCaps * in_caps,
- GstCaps * out_caps)
-{
- struct EGLImageUpload *image = impl;
- GstCapsFeatures *features;
- gboolean ret = TRUE;
- int i;
-
- features = gst_caps_get_features (in_caps, 0);
- if (!gst_caps_features_contains (features, GST_CAPS_FEATURE_MEMORY_EGL_IMAGE))
- ret = FALSE;
-
- features = gst_caps_get_features (out_caps, 0);
- if (!gst_caps_features_contains (features, GST_CAPS_FEATURE_MEMORY_GL_MEMORY))
- ret = FALSE;
-
- 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);
-
- /* Support stereo views for separated multiview mode */
- if (GST_VIDEO_INFO_MULTIVIEW_MODE (in_info) ==
- GST_VIDEO_MULTIVIEW_MODE_SEPARATED)
- expected_memories *= GST_VIDEO_INFO_VIEWS (in_info);
-
- if (gst_buffer_n_memory (buffer) != expected_memories)
- return FALSE;
-
- for (i = 0; i < expected_memories; i++) {
- GstMemory *mem = gst_buffer_peek_memory (buffer, i);
-
- if (!gst_is_egl_image_memory (mem))
- return FALSE;
- }
- }
-
- return TRUE;
-}
-
-static void
-_egl_image_upload_propose_allocation (gpointer impl, GstQuery * decide_query,
- GstQuery * query)
-{
- struct EGLImageUpload *image = impl;
- GstCaps *caps;
- GstCapsFeatures *features;
-
- gst_query_parse_allocation (query, &caps, NULL);
- features = gst_caps_get_features (caps, 0);
-
- /* 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 (¶ms);
-
- allocator = gst_allocator_find (GST_EGL_IMAGE_MEMORY_TYPE);
- gst_query_add_allocation_param (query, allocator, ¶ms);
- gst_object_unref (allocator);
- }
-}
-
-static void
-_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 (allocator, *image->outbuf, image->params);
- gst_object_unref (allocator);
-
- n = gst_buffer_n_memory (image->buffer);
- for (i = 0; i < n; i++) {
- GstMemory *mem = gst_buffer_peek_memory (image->buffer, i);
- GstGLMemory *out_gl_mem =
- (GstGLMemory *) gst_buffer_peek_memory (*image->outbuf, i);
- const GstGLFuncs *gl = NULL;
-
- gl = GST_GL_CONTEXT (((GstEGLImageMemory *) mem)->context)->gl_vtable;
-
- gl->ActiveTexture (GL_TEXTURE0 + i);
- gl->BindTexture (GL_TEXTURE_2D, out_gl_mem->tex_id);
- gl->EGLImageTargetTexture2D (GL_TEXTURE_2D,
- gst_egl_image_memory_get_image (mem));
- }
-
- 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);
-}
-
-static GstGLUploadReturn
-_egl_image_upload_perform (gpointer impl, GstBuffer * buffer,
- GstBuffer ** outbuf)
-{
- struct EGLImageUpload *image = impl;
-
- image->buffer = buffer;
- image->outbuf = outbuf;
-
- gst_gl_context_thread_add (image->upload->context,
- (GstGLContextThreadFunc) _egl_image_upload_perform_gl_thread, image);
-
- if (!*image->outbuf)
- return GST_GL_UPLOAD_ERROR;
-
- return GST_GL_UPLOAD_DONE;
-}
-
-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);
-}
-
-static GstStaticCaps _egl_image_upload_caps =
-GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
- (GST_CAPS_FEATURE_MEMORY_EGL_IMAGE, "RGBA"));
-
-static const UploadMethod _egl_image_upload = {
- "EGLImage",
- 0,
- &_egl_image_upload_caps,
- &_egl_image_upload_new,
- &_egl_image_upload_transform_caps,
- &_egl_image_upload_accept,
- &_egl_image_upload_propose_allocation,
- &_egl_image_upload_perform,
- &_egl_image_upload_free
-};
-#endif /* GST_GL_HAVE_PLATFORM_EGL */
-
#if GST_GL_HAVE_DMABUF
struct DmabufUpload
{
GstGLUpload *upload;
- GstMemory *eglimage[GST_VIDEO_MAX_PLANES];
+ GstEGLImage *eglimage[GST_VIDEO_MAX_PLANES];
GstBuffer *outbuf;
GstGLVideoAllocationParams *params;
};
@@ -674,7 +491,7 @@
}
static GstCaps *
-_dma_buf_upload_transform_caps (GstGLContext * context,
+_dma_buf_upload_transform_caps (gpointer impl, GstGLContext * context,
GstPadDirection direction, GstCaps * caps)
{
GstCapsFeatures *passthrough =
@@ -729,7 +546,7 @@
return quark[plane];
}
-static GstMemory *
+static GstEGLImage *
_get_cached_eglimage (GstMemory * mem, gint plane)
{
return gst_mini_object_get_qdata (GST_MINI_OBJECT (mem),
@@ -737,10 +554,10 @@
}
static void
-_set_cached_eglimage (GstMemory * mem, GstMemory * eglimage, gint plane)
+_set_cached_eglimage (GstMemory * mem, GstEGLImage * eglimage, gint plane)
{
return gst_mini_object_set_qdata (GST_MINI_OBJECT (mem),
- _eglimage_quark (plane), eglimage, (GDestroyNotify) gst_memory_unref);
+ _eglimage_quark (plane), eglimage, (GDestroyNotify) gst_egl_image_unref);
}
static gboolean
@@ -790,9 +607,9 @@
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)))
+ gst_gl_video_allocation_params_new_wrapped_gl_handle (dmabuf->
+ upload->context, NULL, &dmabuf->upload->priv->in_info, -1, NULL,
+ GST_GL_TEXTURE_TARGET_2D, 0, NULL, NULL, NULL)))
return FALSE;
/* Find and validate all memories */
@@ -826,7 +643,7 @@
/* otherwise create one and cache it */
dmabuf->eglimage[i] =
- gst_egl_image_memory_from_dmabuf (dmabuf->upload->context,
+ gst_egl_image_from_dmabuf (dmabuf->upload->context,
gst_dmabuf_memory_get_fd (mems[i]), in_info, i, mems_skip[i]);
if (!dmabuf->eglimage[i])
@@ -850,35 +667,16 @@
struct DmabufUpload *dmabuf)
{
GstGLMemoryAllocator *allocator;
- guint i, n;
allocator =
GST_GL_MEMORY_ALLOCATOR (gst_allocator_find
- (GST_GL_MEMORY_PBO_ALLOCATOR_NAME));
+ (GST_GL_MEMORY_EGL_ALLOCATOR_NAME));
/* FIXME: buffer pool */
dmabuf->outbuf = gst_buffer_new ();
- gst_gl_memory_setup_buffer (allocator, dmabuf->outbuf, dmabuf->params);
+ gst_gl_memory_setup_buffer (allocator, dmabuf->outbuf, dmabuf->params, NULL,
+ (gpointer *) dmabuf->eglimage, gst_buffer_n_memory (dmabuf->outbuf));
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
@@ -932,7 +730,7 @@
gboolean result;
GstVideoGLTextureUploadMeta *meta;
guint texture_ids[GST_GL_UPLOAD_MAX_PLANES];
- GstGLVideoAllocationParams *params;
+ GstBufferPool *pool;
};
static gpointer
@@ -941,12 +739,13 @@
struct GLUploadMeta *meta = g_new0 (struct GLUploadMeta, 1);
meta->upload = upload;
+ meta->pool = NULL;
return meta;
}
static GstCaps *
-_upload_meta_upload_transform_caps (GstGLContext * context,
+_upload_meta_upload_transform_caps (gpointer impl, GstGLContext * context,
GstPadDirection direction, GstCaps * caps)
{
GstCapsFeatures *passthrough =
@@ -993,6 +792,8 @@
GstCapsFeatures *features;
GstVideoGLTextureUploadMeta *meta;
gboolean ret = TRUE;
+ GstStructure *config;
+ gsize size;
features = gst_caps_get_features (in_caps, 0);
@@ -1007,13 +808,21 @@
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 (upload->pool == NULL)
+ upload->pool = gst_gl_buffer_pool_new (upload->upload->context);
+
+ if (!gst_buffer_pool_is_active (upload->pool)) {
+ config = gst_buffer_pool_get_config (upload->pool);
+
+ size = upload->upload->priv->in_info.size;
+ gst_buffer_pool_config_set_params (config, in_caps, size, 0, 0);
+
+ if (!gst_buffer_pool_set_config (upload->pool, config)) {
+ GST_WARNING_OBJECT (upload->upload, "failed to set bufferpool config");
+ return FALSE;
+ }
+ gst_buffer_pool_set_active (upload->pool, TRUE);
+ }
if (buffer) {
if ((meta = gst_buffer_get_video_gl_texture_upload_meta (buffer)) == NULL)
@@ -1088,9 +897,6 @@
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) ==
@@ -1101,10 +907,11 @@
upload->meta = gst_buffer_get_video_gl_texture_upload_meta (buffer);
- /* FIXME: buffer pool */
- *outbuf = gst_buffer_new ();
- gst_gl_memory_setup_buffer (allocator, *outbuf, upload->params);
- gst_object_unref (allocator);
+ if (gst_buffer_pool_acquire_buffer (upload->pool, outbuf,
+ NULL) != GST_FLOW_OK) {
+ GST_WARNING_OBJECT (upload, "failed to acquire buffer from bufferpool");
+ return GST_GL_UPLOAD_ERROR;
+ }
for (i = 0; i < GST_GL_UPLOAD_MAX_PLANES; i++) {
guint tex_id = 0;
@@ -1137,18 +944,11 @@
_upload_meta_upload_free (gpointer impl)
{
struct GLUploadMeta *upload = impl;
- gint i;
g_return_if_fail (impl != NULL);
- for (i = 0; i < GST_GL_UPLOAD_MAX_PLANES; i++) {
- if (upload->texture_ids[i])
- gst_gl_context_del_texture (upload->upload->context,
- &upload->texture_ids[i]);
- }
-
- if (upload->params)
- gst_gl_allocation_params_free ((GstGLAllocationParams *) upload->params);
+ if (upload->pool)
+ gst_object_unref (upload->pool);
g_free (upload);
}
@@ -1240,7 +1040,7 @@
}
static GstCaps *
-_raw_data_upload_transform_caps (GstGLContext * context,
+_raw_data_upload_transform_caps (gpointer impl, GstGLContext * context,
GstPadDirection direction, GstCaps * caps)
{
GstCapsFeatures *passthrough =
@@ -1301,7 +1101,7 @@
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,
+ GST_GL_TEXTURE_TARGET_2D, 0, NULL, raw->in_frame,
(GDestroyNotify) _raw_upload_frame_unref)))
return FALSE;
@@ -1337,6 +1137,9 @@
raw->params->parent.wrapped_data = raw->in_frame->frame.data[i];
raw->params->plane = i;
+ raw->params->tex_type =
+ gst_gl_texture_type_from_format (raw->upload->context,
+ GST_VIDEO_INFO_FORMAT (in_info), i);
tex =
gst_gl_base_memory_alloc (allocator,
@@ -1385,9 +1188,6 @@
};
static const UploadMethod *upload_methods[] = { &_gl_memory_upload,
-#if GST_GL_HAVE_PLATFORM_EGL
- &_egl_image_upload,
-#endif
#if GST_GL_HAVE_DMABUF
&_dma_buf_upload,
#endif
@@ -1444,7 +1244,10 @@
GstGLUpload *upload = g_object_new (GST_TYPE_GL_UPLOAD, NULL);
gint i, n;
- upload->context = gst_object_ref (context);
+ if (context)
+ gst_gl_upload_set_context (upload, context);
+ else
+ upload->context = NULL;
n = G_N_ELEMENTS (upload_methods);
upload->priv->upload_impl = g_malloc (sizeof (gpointer) * n);
@@ -1458,6 +1261,14 @@
return upload;
}
+void
+gst_gl_upload_set_context (GstGLUpload * upload, GstGLContext * context)
+{
+ g_return_if_fail (upload != NULL);
+
+ gst_object_replace ((GstObject **) & upload->context, (GstObject *) context);
+}
+
static void
gst_gl_upload_finalize (GObject * object)
{
@@ -1466,8 +1277,6 @@
upload = GST_GL_UPLOAD (object);
- if (upload->priv->method_impl)
- upload->priv->method->free (upload->priv->method_impl);
upload->priv->method_i = 0;
if (upload->context) {
@@ -1496,8 +1305,8 @@
}
GstCaps *
-gst_gl_upload_transform_caps (GstGLContext * context, GstPadDirection direction,
- GstCaps * caps, GstCaps * filter)
+gst_gl_upload_transform_caps (GstGLUpload * upload, GstGLContext * context,
+ GstPadDirection direction, GstCaps * caps, GstCaps * filter)
{
GstCaps *result, *tmp;
gint i;
@@ -1507,7 +1316,9 @@
for (i = 0; i < G_N_ELEMENTS (upload_methods); i++) {
GstCaps *tmp2;
- tmp2 = upload_methods[i]->transform_caps (context, direction, caps);
+ tmp2 =
+ upload_methods[i]->transform_caps (upload->priv->upload_impl[i],
+ context, direction, caps);
if (tmp2)
tmp = gst_caps_merge (tmp, tmp2);
@@ -1560,8 +1371,6 @@
gst_video_info_from_caps (&upload->priv->in_info, in_caps);
gst_video_info_from_caps (&upload->priv->out_info, out_caps);
- if (upload->priv->method_impl)
- upload->priv->method->free (upload->priv->method_impl);
upload->priv->method_impl = NULL;
upload->priv->method_i = 0;
@@ -1616,16 +1425,14 @@
static gboolean
_upload_find_method (GstGLUpload * upload)
{
+ gint method_i;
+
if (upload->priv->method_i >= G_N_ELEMENTS (upload_methods))
return FALSE;
- if (upload->priv->method_impl) {
- upload->priv->method->free (upload->priv->method_impl);
- upload->priv->method_impl = NULL;
- }
-
- upload->priv->method = upload_methods[upload->priv->method_i];
- upload->priv->method_impl = upload->priv->method->new (upload);
+ method_i = upload->priv->method_i;
+ upload->priv->method = upload_methods[method_i];
+ upload->priv->method_impl = upload->priv->upload_impl[method_i];
GST_DEBUG_OBJECT (upload, "attempting upload with uploader %s",
upload->priv->method->name);
@@ -1680,19 +1487,24 @@
upload->priv->method->perform (upload->priv->method_impl, buffer,
&outbuf);
if (ret == GST_GL_UPLOAD_UNSHARED_GL_CONTEXT) {
- upload->priv->method->free (upload->priv->method_impl);
- upload->priv->method = &_raw_data_upload;
- upload->priv->method_impl = upload->priv->method->new (upload);
+ for (int i = 0; i < G_N_ELEMENTS (upload_methods); i++) {
+ if (upload_methods[i] == &_raw_data_upload) {
+ upload->priv->method = &_raw_data_upload;
+ upload->priv->method_impl = upload->priv->upload_impl[i];
+ upload->priv->method_i = i;
+
+ break;
+ }
+ }
goto restart;
- } else if (ret == GST_GL_UPLOAD_DONE) {
+ } else if (ret == GST_GL_UPLOAD_DONE || ret == GST_GL_UPLOAD_RECONFIGURE) {
/* we are done */
} else {
- upload->priv->method->free (upload->priv->method_impl);
upload->priv->method_impl = NULL;
NEXT_METHOD;
}
- if (buffer != outbuf)
+ if (outbuf && buffer != outbuf)
gst_buffer_copy_into (outbuf, buffer,
GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS, 0, -1);
*outbuf_ptr = outbuf;
diff --git a/gst-libs/gst/gl/gstglupload.h b/gst-libs/gst/gl/gstglupload.h
index 577c94b..3e00298 100644
--- a/gst-libs/gst/gl/gstglupload.h
+++ b/gst-libs/gst/gl/gstglupload.h
@@ -47,8 +47,9 @@
GST_GL_UPLOAD_ERROR = -1,
GST_GL_UPLOAD_UNSUPPORTED = -2,
+ GST_GL_UPLOAD_RECONFIGURE = -3,
/* <private> */
- GST_GL_UPLOAD_UNSHARED_GL_CONTEXT = -3,
+ GST_GL_UPLOAD_UNSHARED_GL_CONTEXT = -100,
} GstGLUploadReturn;
/**
@@ -58,11 +59,11 @@
*/
struct _GstGLUpload
{
- /* <private> */
GstObject parent;
GstGLContext *context;
+ /* <private> */
GstGLUploadPrivate *priv;
gpointer _reserved[GST_PADDING];
@@ -76,13 +77,20 @@
struct _GstGLUploadClass
{
GstObjectClass object_class;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
};
GstCaps * gst_gl_upload_get_input_template_caps (void);
GstGLUpload * gst_gl_upload_new (GstGLContext * context);
-GstCaps * gst_gl_upload_transform_caps (GstGLContext * context,
+void gst_gl_upload_set_context (GstGLUpload * upload,
+ GstGLContext * context);
+
+GstCaps * gst_gl_upload_transform_caps (GstGLUpload * upload,
+ GstGLContext * context,
GstPadDirection direction,
GstCaps * caps,
GstCaps * filter);
diff --git a/gst-libs/gst/gl/gstglutils.c b/gst-libs/gst/gl/gstglutils.c
index e2e04e4..4a23914 100644
--- a/gst-libs/gst/gl/gstglutils.c
+++ b/gst-libs/gst/gl/gstglutils.c
@@ -36,345 +36,12 @@
#include <gst/gl/wayland/gstgldisplay_wayland.h>
#endif
-#ifndef GL_FRAMEBUFFER_UNDEFINED
-#define GL_FRAMEBUFFER_UNDEFINED 0x8219
-#endif
-#ifndef GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
-#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
-#endif
-#ifndef GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT
-#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
-#endif
-#ifndef GL_FRAMEBUFFER_UNSUPPORTED
-#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
-#endif
-#ifndef GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS
-#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9
-#endif
-
#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 gchar *error_message;
-
-/* called in the gl thread */
-gboolean
-gst_gl_context_check_framebuffer_status (GstGLContext * context)
-{
- GLenum status = 0;
- status = context->gl_vtable->CheckFramebufferStatus (GL_FRAMEBUFFER);
-
- switch (status) {
- case GL_FRAMEBUFFER_COMPLETE:
- return TRUE;
- break;
-
- case GL_FRAMEBUFFER_UNSUPPORTED:
- GST_ERROR ("GL_FRAMEBUFFER_UNSUPPORTED");
- break;
-
- case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
- GST_ERROR ("GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT");
- break;
-
- case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
- GST_ERROR ("GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT");
- break;
- case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
- GST_ERROR ("GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS");
- break;
-#if GST_GL_HAVE_OPENGL
- case GL_FRAMEBUFFER_UNDEFINED:
- GST_ERROR ("GL_FRAMEBUFFER_UNDEFINED");
- break;
-#endif
- default:
- GST_ERROR ("General FBO error");
- }
-
- return FALSE;
-}
-
-typedef struct _GenTexture
-{
- guint width, height;
- GstVideoFormat format;
- guint result;
-} GenTexture;
-
-static void
-_gen_texture (GstGLContext * context, GenTexture * data)
-{
- const GstGLFuncs *gl = context->gl_vtable;
- GLenum internal_format;
-
- GST_TRACE ("Generating texture format:%u dimensions:%ux%u", data->format,
- data->width, data->height);
-
- gl->GenTextures (1, &data->result);
- gl->BindTexture (GL_TEXTURE_2D, data->result);
-
- internal_format =
- gst_gl_sized_gl_format_from_gl_format_type (context, GL_RGBA,
- GL_UNSIGNED_BYTE);
- if (data->width > 0 && data->height > 0)
- gl->TexImage2D (GL_TEXTURE_2D, 0, internal_format,
- data->width, data->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
-
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
- GST_LOG ("generated texture id:%d", data->result);
-}
-
-/* deprecated. replaced by GstGLMemory */
-void
-gst_gl_context_gen_texture (GstGLContext * context, GLuint * pTexture,
- GstVideoFormat v_format, GLint width, GLint height)
-{
- GenTexture data = { width, height, v_format, 0 };
-
- gst_gl_context_thread_add (context, (GstGLContextThreadFunc) _gen_texture,
- &data);
-
- *pTexture = data.result;
-}
-
-static void
-_del_texture (GstGLContext * context, guint * texture)
-{
- context->gl_vtable->DeleteTextures (1, texture);
-}
-
-/* deprecated. replaced by GstGLMemory */
-void
-gst_gl_context_del_texture (GstGLContext * context, GLuint * pTexture)
-{
- gst_gl_context_thread_add (context, (GstGLContextThreadFunc) _del_texture,
- pTexture);
-}
-
-typedef struct _GenTextureFull
-{
- const GstVideoInfo *info;
- const gint comp;
- guint result;
-} GenTextureFull;
-
-static void
-_gen_texture_full (GstGLContext * context, GenTextureFull * data)
-{
- const GstGLFuncs *gl = context->gl_vtable;
- GstVideoGLTextureType tex_type;
- GstVideoFormat v_format;
- GLint glinternalformat = 0;
- GLenum glformat = 0;
- GLenum gltype = 0;
-
- gl->GenTextures (1, &data->result);
- gl->BindTexture (GL_TEXTURE_2D, data->result);
-
- v_format = GST_VIDEO_INFO_FORMAT (data->info);
- tex_type = gst_gl_texture_type_from_format (context, v_format, data->comp);
- glformat = gst_gl_format_from_gl_texture_type (tex_type);
- gltype = GL_UNSIGNED_BYTE;
- if (v_format == GST_VIDEO_FORMAT_RGB16)
- gltype = GL_UNSIGNED_SHORT_5_6_5;
- glinternalformat = gst_gl_sized_gl_format_from_gl_format_type (context,
- glformat, gltype);
-
- gl->TexImage2D (GL_TEXTURE_2D, 0, glinternalformat,
- GST_VIDEO_INFO_COMP_WIDTH (data->info, data->comp),
- GST_VIDEO_INFO_COMP_HEIGHT (data->info, data->comp), 0, glformat, gltype,
- NULL);
-
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-}
-
-/* deprecated. replaced by GstGLMemory */
-void
-gst_gl_generate_texture_full (GstGLContext * context, const GstVideoInfo * info,
- const guint comp, gint stride[], gsize offset[], gsize size[],
- GLuint * pTexture)
-{
- GenTextureFull data = { info, comp, 0 };
-
- switch (GST_VIDEO_INFO_FORMAT (info)) {
- case GST_VIDEO_FORMAT_RGB:
- case GST_VIDEO_FORMAT_BGR:
- {
- stride[0] = GST_ROUND_UP_4 (GST_VIDEO_INFO_WIDTH (info) * 3);
- offset[0] = 0;
- size[0] = stride[0] * GST_VIDEO_INFO_HEIGHT (info);
- break;
- }
- case GST_VIDEO_FORMAT_RGB16:
- {
- stride[0] = GST_ROUND_UP_4 (GST_VIDEO_INFO_WIDTH (info) * 2);
- offset[0] = 0;
- size[0] = stride[0] * GST_VIDEO_INFO_HEIGHT (info);
- break;
- }
- case GST_VIDEO_FORMAT_RGBA:
- case GST_VIDEO_FORMAT_BGRA:
- case GST_VIDEO_FORMAT_ARGB:
- case GST_VIDEO_FORMAT_ABGR:
- case GST_VIDEO_FORMAT_RGBx:
- case GST_VIDEO_FORMAT_BGRx:
- case GST_VIDEO_FORMAT_xRGB:
- case GST_VIDEO_FORMAT_xBGR:
- case GST_VIDEO_FORMAT_AYUV:
- {
- stride[0] = GST_ROUND_UP_4 (GST_VIDEO_INFO_WIDTH (info) * 4);
- offset[0] = 0;
- size[0] = stride[0] * GST_VIDEO_INFO_HEIGHT (info);
- break;
- }
- case GST_VIDEO_FORMAT_NV12:
- case GST_VIDEO_FORMAT_NV21:
- {
- size[comp] = stride[comp] * GST_VIDEO_INFO_COMP_HEIGHT (info, comp);
- if (comp == 0) {
- stride[0] = GST_ROUND_UP_4 (GST_VIDEO_INFO_COMP_WIDTH (info, 1));
- offset[0] = 0;
- } else {
- stride[1] = GST_ROUND_UP_4 (GST_VIDEO_INFO_COMP_WIDTH (info, 1) * 2);
- offset[1] = size[0];
- }
- break;
- }
- case GST_VIDEO_FORMAT_I420:
- case GST_VIDEO_FORMAT_YV12:
- case GST_VIDEO_FORMAT_Y444:
- case GST_VIDEO_FORMAT_Y42B:
- case GST_VIDEO_FORMAT_Y41B:
- {
- stride[comp] = GST_ROUND_UP_4 (GST_VIDEO_INFO_COMP_WIDTH (info, comp));
- size[comp] = stride[comp] * GST_VIDEO_INFO_COMP_HEIGHT (info, comp);
- if (comp == 0)
- offset[0] = 0;
- else if (comp == 1)
- offset[1] = size[0];
- else
- offset[2] = offset[1] + size[1];
- break;
- }
- default:
- GST_WARNING ("unsupported %s",
- gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (info)));
- break;
- }
-
- gst_gl_context_thread_add (context,
- (GstGLContextThreadFunc) _gen_texture_full, &data);
-
- *pTexture = data.result;
-}
-
-typedef struct _GenFBO
-{
- GstGLFramebuffer *frame;
- gint width, height;
- GLuint *fbo, *depth;
-} GenFBO;
-
-static void
-_gen_fbo (GstGLContext * context, GenFBO * data)
-{
- gst_gl_framebuffer_generate (data->frame, data->width, data->height,
- data->fbo, data->depth);
-}
-
-gboolean
-gst_gl_context_gen_fbo (GstGLContext * context, gint width, gint height,
- GLuint * fbo, GLuint * depthbuffer)
-{
- GstGLFramebuffer *frame = gst_gl_framebuffer_new (context);
-
- GenFBO data = { frame, width, height, fbo, depthbuffer };
-
- gst_gl_context_thread_add (context, (GstGLContextThreadFunc) _gen_fbo, &data);
-
- gst_object_unref (frame);
-
- return TRUE;
-}
-
-typedef struct _UseFBO2
-{
- GstGLFramebuffer *frame;
- gint texture_fbo_width;
- gint texture_fbo_height;
- GLuint fbo;
- GLuint depth_buffer;
- GLuint texture_fbo;
- GLCB_V2 cb;
- gpointer stuff;
-} UseFBO2;
-
-static void
-_use_fbo_v2 (GstGLContext * context, UseFBO2 * data)
-{
- gst_gl_framebuffer_use_v2 (data->frame, data->texture_fbo_width,
- data->texture_fbo_height, data->fbo, data->depth_buffer,
- data->texture_fbo, data->cb, data->stuff);
-}
-
-gboolean
-gst_gl_context_use_fbo_v2 (GstGLContext * context, gint texture_fbo_width,
- gint texture_fbo_height, GLuint fbo, GLuint depth_buffer,
- GLuint texture_fbo, GLCB_V2 cb, gpointer stuff)
-{
- GstGLFramebuffer *frame = gst_gl_framebuffer_new (context);
-
- UseFBO2 data =
- { frame, texture_fbo_width, texture_fbo_height, fbo, depth_buffer,
- texture_fbo, cb, stuff
- };
-
- gst_gl_context_thread_add (context, (GstGLContextThreadFunc) _use_fbo_v2,
- &data);
-
- gst_object_unref (frame);
-
- return TRUE;
-}
-
-typedef struct _DelFBO
-{
- GstGLFramebuffer *frame;
- GLuint fbo;
- GLuint depth;
-} DelFBO;
-
-/* Called in the gl thread */
-static void
-_del_fbo (GstGLContext * context, DelFBO * data)
-{
- gst_gl_framebuffer_delete (data->frame, data->fbo, data->depth);
-}
-
-/* Called by gltestsrc and glfilter */
-void
-gst_gl_context_del_fbo (GstGLContext * context, GLuint fbo, GLuint depth_buffer)
-{
- GstGLFramebuffer *frame = gst_gl_framebuffer_new (context);
-
- DelFBO data = { frame, fbo, depth_buffer };
-
- gst_gl_context_thread_add (context, (GstGLContextThreadFunc) _del_fbo, &data);
-
- gst_object_unref (frame);
-}
-
struct _compile_shader
{
GstGLShader **shader;
@@ -456,26 +123,6 @@
return *shader != NULL;
}
-void
-gst_gl_context_set_error (GstGLContext * context, const char *format, ...)
-{
- va_list args;
-
- g_free (error_message);
-
- va_start (args, format);
- error_message = g_strdup_vprintf (format, args);
- va_end (args);
-
- GST_WARNING ("%s", error_message);
-}
-
-gchar *
-gst_gl_context_get_error (void)
-{
- return error_message;
-}
-
/* Called by glfilter */
void
gst_gl_context_del_shader (GstGLContext * context, GstGLShader * shader)
@@ -1067,3 +714,63 @@
return ret;
}
}
+
+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 const gfloat from_ndc_matrix[] = {
+ 0.5f, 0.0f, 0.0, 0.5f,
+ 0.0f, 0.5f, 0.0, 0.5f,
+ 0.0f, 0.0f, 0.5, 0.5f,
+ 0.0f, 0.0f, 0.0, 1.0f,
+};
+
+static const gfloat to_ndc_matrix[] = {
+ 2.0f, 0.0f, 0.0, -1.0f,
+ 0.0f, 2.0f, 0.0, -1.0f,
+ 0.0f, 0.0f, 2.0, -1.0f,
+ 0.0f, 0.0f, 0.0, 1.0f,
+};
+
+void
+gst_gl_multiply_matrix4 (const gfloat * a, const gfloat * b, gfloat * result)
+{
+ int i, j, k;
+ gfloat tmp[16] = { 0.0f };
+
+ if (!a || !b || !result)
+ return;
+
+ for (i = 0; i < 4; i++) {
+ for (j = 0; j < 4; j++) {
+ for (k = 0; k < 4; k++) {
+ tmp[i + (j * 4)] += a[i + (k * 4)] * b[k + (j * 4)];
+ }
+ }
+ }
+
+ for (i = 0; i < 16; i++)
+ result[i] = tmp[i];
+}
+
+void
+gst_gl_get_affine_transformation_meta_as_ndc (GstVideoAffineTransformationMeta *
+ meta, gfloat * matrix)
+{
+ if (!meta) {
+ int i;
+
+ for (i = 0; i < 16; i++) {
+ matrix[i] = identity_matrix[i];
+ }
+ } else {
+ gfloat tmp[16] = { 0.0f };
+
+ gst_gl_multiply_matrix4 (from_ndc_matrix, meta->matrix, tmp);
+ gst_gl_multiply_matrix4 (tmp, to_ndc_matrix, matrix);
+ }
+}
diff --git a/gst-libs/gst/gl/gstglutils.h b/gst-libs/gst/gl/gstglutils.h
index 1c5ab12..a714759 100644
--- a/gst-libs/gst/gl/gstglutils.h
+++ b/gst-libs/gst/gl/gstglutils.h
@@ -22,79 +22,17 @@
#define __GST_GL_UTILS_H__
#include <gst/video/video.h>
+#include <gst/video/gstvideoaffinetransformationmeta.h>
#include <gst/gl/gstgl_fwd.h>
G_BEGIN_DECLS
-/**
- * GstGLContextProjection:
- *
- * %GST_GL_DISPLAY_PROJECTION_ORTHO2D: Orthogonal projection
- * %GST_GL_DISPLAY_CONVERSION_MATRIX: Perspective projection
- */
-typedef enum
-{
- GST_GL_DISPLAY_PROJECTION_ORTHO2D,
- GST_GL_DISPLAY_PROJECTION_PERSPECTIVE
-} GstGLDisplayProjection;
-
-/**
- * CDCB:
- * @texture: texture to draw
- * @width: new width
- * @height: new height:
- * @data: user data
- *
- * client draw callback
- */
-typedef gboolean (*CDCB) (GLuint texture, GLuint width, GLuint height, gpointer data);
-/**
- * GLCB:
- * @width: the width
- * @height: the height
- * @texture: texture
- * @stuff: user data
- *
- * callback definition for operating on textures
- */
-typedef void (*GLCB) (gint, gint, guint, gpointer stuff);
-/**
- * GLCB_V2:
- * @stuff: user data
- *
- * callback definition for operating through a Framebuffer object
- */
-typedef void (*GLCB_V2) (gpointer stuff);
-
-/* deprecated. replaced by GstGLMemory */
-void gst_gl_context_gen_texture (GstGLContext * context, GLuint * pTexture,
- GstVideoFormat v_format, GLint width, GLint height);
-/* deprecated. replaced by GstGLMemory */
-void gst_gl_context_del_texture (GstGLContext * context, GLuint * pTexture);
-
-/* deprecated. replaced by GstGLMemory */
-void gst_gl_generate_texture_full (GstGLContext * context, const GstVideoInfo * info,
- const guint comp, gint stride[], gsize offset[], gsize size[], GLuint * pTexture);
-
-gboolean gst_gl_context_gen_fbo (GstGLContext * context, gint width, gint height,
- GLuint * fbo, GLuint * depthbuffer);
-gboolean gst_gl_context_use_fbo_v2 (GstGLContext * context, gint texture_fbo_width,
- gint texture_fbo_height, GLuint fbo, GLuint depth_buffer,
- GLuint texture_fbo, GLCB_V2 cb, gpointer stuff);
-void gst_gl_context_del_fbo (GstGLContext * context, GLuint fbo,
- GLuint depth_buffer);
-
gboolean gst_gl_context_gen_shader (GstGLContext * context,
const gchar * shader_vertex_source,
const gchar * shader_fragment_source, GstGLShader ** shader);
void gst_gl_context_del_shader (GstGLContext * context, GstGLShader * shader);
-gboolean gst_gl_context_check_framebuffer_status (GstGLContext * context);
-
-void gst_gl_context_set_error (GstGLContext * context, const char * format, ...);
-gchar *gst_gl_context_get_error (void);
-
gboolean gst_gl_ensure_element_data (gpointer element,
GstGLDisplay **display_ptr, GstGLContext ** other_context_ptr);
gboolean gst_gl_handle_set_context (GstElement * element, GstContext * context,
@@ -116,6 +54,10 @@
gboolean gst_gl_value_set_texture_target (GValue * value, GstGLTextureTarget target);
GstGLTextureTarget gst_gl_value_get_texture_target_mask (const GValue * value);
+void gst_gl_multiply_matrix4 (const gfloat * a, const gfloat * b, gfloat * result);
+void gst_gl_get_affine_transformation_meta_as_ndc (GstVideoAffineTransformationMeta *
+ meta, gfloat * matrix);
+
G_END_DECLS
#endif /* __GST_GL_UTILS_H__ */
diff --git a/gst-libs/gst/gl/gstglviewconvert.c b/gst-libs/gst/gl/gstglviewconvert.c
index 7d44860..c409e3a 100644
--- a/gst-libs/gst/gl/gstglviewconvert.c
+++ b/gst-libs/gst/gl/gstglviewconvert.c
@@ -31,6 +31,7 @@
#endif
#include "gstglviewconvert.h"
+#include "gstglsl_private.h"
#include <gst/video/gstvideoaffinetransformationmeta.h>
#define USING_OPENGL(context) (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL, 1, 0))
@@ -152,27 +153,20 @@
0.0f, 0.0f, 0.0f, 1.0f,
};
+#define glsl_OES_extension_string "#extension GL_OES_EGL_image_external : require \n"
+
/* *INDENT-OFF* */
-static const gchar *fragment_source =
+static const gchar *fragment_header =
"#ifdef GL_ES\n"
"precision mediump float;\n"
"#endif\n"
- "varying vec2 v_texcoord;\n"
"uniform sampler2D tex_l;\n"
"uniform sampler2D tex_r;\n"
"uniform float width;\n"
"uniform float height;\n"
"uniform mat3 downmix[2];\n"
"uniform vec2 tex_scale[2];\n"
- "uniform vec2 offsets[2];\n"
- "void main () {\n"
- "vec4 l, r;\n"
- /* input */
- "%s"
- /* now have left and right pixel into l and r */
- /* output */
- "%s"
- "}\n";
+ "uniform vec2 offsets[2];\n";
static const gchar *frag_input =
" vec2 l_tex = v_texcoord * tex_scale[0] + offsets[0];\n"
@@ -1214,7 +1208,7 @@
g_value_set_static_string (&item, GST_GL_TEXTURE_TARGET_EXTERNAL_OES_STR);
}
- gst_structure_set_value (s, "texture-target", &item);
+ gst_structure_set_value (s_other, "texture-target", &item);
g_value_unset (&item);
@@ -1292,9 +1286,7 @@
}
}
- tmp = _fixate_texture_target (viewconvert, direction, caps, othercaps);
- gst_caps_unref (othercaps);
- othercaps = tmp;
+ othercaps = _fixate_texture_target (viewconvert, direction, caps, othercaps);
done:
GST_DEBUG_OBJECT (viewconvert, "dir %s fixated to %" GST_PTR_FORMAT
@@ -1310,6 +1302,11 @@
if (viewconvert->shader)
gst_gl_context_del_shader (viewconvert->context, viewconvert->shader);
viewconvert->shader = NULL;
+
+ if (viewconvert->fbo)
+ gst_object_unref (viewconvert->fbo);
+ viewconvert->fbo = NULL;
+
viewconvert->initted = FALSE;
viewconvert->reconfigure = FALSE;
}
@@ -1389,181 +1386,29 @@
static gboolean
_init_view_convert_fbo (GstGLViewConvert * viewconvert)
{
- GstGLFuncs *gl;
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);
out_height = GST_VIDEO_INFO_HEIGHT (&viewconvert->out_info);
- if (!gl->GenFramebuffers) {
- /* turn off the pipeline because Frame buffer object is a not present */
- gst_gl_context_set_error (viewconvert->context,
- "Frambuffer objects unsupported");
- return FALSE;
- }
- /* setup FBO */
- gl->GenFramebuffers (1, &viewconvert->fbo);
- gl->BindFramebuffer (GL_FRAMEBUFFER, viewconvert->fbo);
- /* setup the render buffer for depth */
- gl->GenRenderbuffers (1, &viewconvert->depth_buffer);
- gl->BindRenderbuffer (GL_RENDERBUFFER, viewconvert->depth_buffer);
- if (USING_OPENGL (viewconvert->context)
- || USING_OPENGL3 (viewconvert->context)) {
- gl->RenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT, out_width,
- out_height);
- gl->RenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH24_STENCIL8,
- out_width, out_height);
- }
- if (USING_GLES2 (viewconvert->context)) {
- gl->RenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT16,
- out_width, out_height);
- }
+ viewconvert->fbo =
+ gst_gl_framebuffer_new_with_default_depth (viewconvert->context,
+ out_width, out_height);
- /* a fake texture is attached to the convert FBO (cannot init without it) */
- gl->GenTextures (1, &fake_texture);
- gl->BindTexture (GL_TEXTURE_2D, fake_texture);
- internal_format =
- gst_gl_sized_gl_format_from_gl_format_type (viewconvert->context, GL_RGBA,
- GL_UNSIGNED_BYTE);
- gl->TexImage2D (GL_TEXTURE_2D, 0, internal_format, out_width, out_height,
- 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- /* attach the texture to the FBO to renderer to */
- gl->FramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- GL_TEXTURE_2D, fake_texture, 0);
- /* attach the depth render buffer to the FBO */
- gl->FramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
- GL_RENDERBUFFER, viewconvert->depth_buffer);
- if (USING_OPENGL (viewconvert->context)) {
- gl->FramebufferRenderbuffer (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
- GL_RENDERBUFFER, viewconvert->depth_buffer);
- }
-
- if (!gst_gl_context_check_framebuffer_status (viewconvert->context)) {
- gst_gl_context_set_error (viewconvert->context,
- "GL framebuffer status incomplete");
- ret = FALSE;
- }
-
- /* unbind the FBO */
- gl->BindTexture (GL_TEXTURE_2D, 0);
- gl->BindFramebuffer (GL_FRAMEBUFFER, 0);
- gl->DeleteTextures (1, &fake_texture);
- 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);
- }
+ return viewconvert->fbo != NULL;
}
/* free after use */
static gchar *
-_get_shader_string (GstGLViewConvert * viewconvert,
- GstVideoMultiviewMode in_mode, GstVideoMultiviewMode out_mode)
+_get_shader_string (GstGLViewConvert * viewconvert, GstGLShader * shader,
+ GstVideoMultiviewMode in_mode, GstVideoMultiviewMode out_mode,
+ GstGLSLVersion version, GstGLSLProfile profile)
{
const gchar *input_str, *output_str;
gboolean mono_input = FALSE;
gchar *tmp, *tmp2;
+ GString *str = g_string_new (NULL);
+ guint n_outputs = 1;
switch (in_mode) {
case GST_VIDEO_MULTIVIEW_MODE_NONE:
@@ -1601,6 +1446,7 @@
case GST_VIDEO_MULTIVIEW_MODE_SEPARATED:
case GST_VIDEO_MULTIVIEW_MODE_FRAME_BY_FRAME:
output_str = frag_output_separated;
+ n_outputs = 2;
break;
case GST_VIDEO_MULTIVIEW_MODE_CHECKERBOARD:
output_str = frag_output_checkerboard;
@@ -1615,15 +1461,65 @@
break;
}
- 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);
+ if (viewconvert->from_texture_target == GST_GL_TEXTURE_TARGET_EXTERNAL_OES)
+ g_string_append (str, glsl_OES_extension_string);
+
+ g_string_append (str, fragment_header);
+
+ /* GL 3.3+ and GL ES 3.x */
+ if ((profile == GST_GLSL_PROFILE_CORE && version >= GST_GLSL_VERSION_330)
+ || (profile == GST_GLSL_PROFILE_ES && version >= GST_GLSL_VERSION_300)) {
+ if (n_outputs > 1) {
+ gint i;
+
+ for (i = 0; i < n_outputs; i++) {
+ g_string_append_printf (str,
+ "layout(location = %d) out vec4 fragColor_%d;\n", i, i);
+ }
+ } else {
+ g_string_append (str, "layout (location = 0) out vec4 fragColor;\n");
+ }
+ } else if (profile == GST_GLSL_PROFILE_CORE
+ && version >= GST_GLSL_VERSION_150) {
+ /* no layout specifiers, use glBindFragDataLocation instead */
+ if (n_outputs > 1) {
+ gint i;
+
+ for (i = 0; i < n_outputs; i++) {
+ gchar *var_name = g_strdup_printf ("fragColor_%d", i);
+ g_string_append_printf (str, "out vec4 %s;\n", var_name);
+ gst_gl_shader_bind_frag_data_location (shader, i, var_name);
+ g_free (var_name);
+ }
+ } else {
+ g_string_append (str, "out vec4 fragColor;\n");
+ gst_gl_shader_bind_frag_data_location (shader, 0, "fragColor");
+ }
+ }
+
+ {
+ const gchar *varying = NULL;
+
+ if ((profile == GST_GLSL_PROFILE_ES && version >= GST_GLSL_VERSION_300)
+ || (profile == GST_GLSL_PROFILE_CORE
+ && version >= GST_GLSL_VERSION_150)) {
+ varying = "in";
+ } else {
+ varying = "varying";
+ }
+ g_string_append_printf (str,
+ "\n%s vec2 v_texcoord;\nvoid main() {\nvec4 l, r;\n", varying);
+ }
+
+ g_string_append (str, input_str);
+ g_string_append (str, output_str);
+ g_string_append (str, "\n}");
+ tmp = g_string_free (str, FALSE);
+
+ tmp2 =
+ _gst_glsl_mangle_shader (tmp, GL_FRAGMENT_SHADER,
+ GST_GL_TEXTURE_TARGET_2D, viewconvert->from_texture_target,
+ viewconvert->context, &version, &profile);
return tmp2;
}
@@ -1673,7 +1569,6 @@
};
gchar *fragment_source_str;
GstGLFuncs *gl;
- gboolean res;
gint l_index, r_index;
gl = viewconvert->context->gl_vtable;
@@ -1693,8 +1588,8 @@
viewconvert->out_info.width, viewconvert->out_info.height);
if (!gl->CreateProgramObject && !gl->CreateProgram) {
- gst_gl_context_set_error (viewconvert->context,
- "Cannot perform multiview conversion without OpenGL shaders");
+ GST_ERROR_OBJECT (viewconvert, "Cannot perform multiview conversion "
+ "without OpenGL shaders");
goto error;
}
@@ -1774,13 +1669,70 @@
tex_scale[0][0], tex_scale[0][1],
tex_scale[1][0], tex_scale[1][1],
offsets[0][0], offsets[0][1], offsets[1][0], offsets[1][1]);
- fragment_source_str = _get_shader_string (viewconvert, in_mode, out_mode);
- 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;
+
+ viewconvert->shader = gst_gl_shader_new (viewconvert->context);
+ {
+ GstGLSLVersion version;
+ GstGLSLProfile profile;
+ GstGLSLStage *vert, *frag;
+ gchar *tmp, *tmp1, *version_str;
+ const gchar *strings[2];
+ GError *error = NULL;
+
+ tmp =
+ _gst_glsl_mangle_shader
+ (gst_gl_shader_string_vertex_mat4_vertex_transform, GL_VERTEX_SHADER,
+ GST_GL_TEXTURE_TARGET_2D, viewconvert->from_texture_target,
+ viewconvert->context, &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;
+ vert =
+ gst_glsl_stage_new_with_strings (viewconvert->context,
+ GL_VERTEX_SHADER, version, profile, 2, strings);
+ g_free (tmp);
+
+ if (!gst_gl_shader_compile_attach_stage (viewconvert->shader, vert, &error)) {
+ GST_ERROR_OBJECT (viewconvert, "Failed to compile vertex stage %s",
+ error->message);
+ gst_object_unref (viewconvert->shader);
+ viewconvert->shader = NULL;
+ g_free (version_str);
+ goto error;
+ }
+
+ fragment_source_str = _get_shader_string (viewconvert, viewconvert->shader,
+ in_mode, out_mode, version, profile);
+ strings[1] = fragment_source_str;
+
+ frag =
+ gst_glsl_stage_new_with_strings (viewconvert->context,
+ GL_FRAGMENT_SHADER, version, profile, 2, strings);
+ g_free (version_str);
+
+ if (!gst_gl_shader_compile_attach_stage (viewconvert->shader, frag, &error)) {
+ GST_ERROR_OBJECT (viewconvert, "Failed to compile fragment stage %s",
+ error->message);
+ g_free (fragment_source_str);
+ gst_object_unref (viewconvert->shader);
+ viewconvert->shader = NULL;
+ goto error;
+ }
+ g_free (fragment_source_str);
+
+ if (!gst_gl_shader_link (viewconvert->shader, &error)) {
+ GST_ERROR_OBJECT (viewconvert, "Failed to link conversion shader %s",
+ error->message);
+ gst_object_unref (viewconvert->shader);
+ viewconvert->shader = NULL;
+ goto error;
+ }
+ }
+
viewconvert->priv->attr_position =
gst_gl_shader_get_attribute_location (viewconvert->shader, "a_position");
viewconvert->priv->attr_texture =
@@ -1856,12 +1808,11 @@
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);
- out_height = GST_VIDEO_INFO_HEIGHT (&viewconvert->out_info);
- gl->BindFramebuffer (GL_FRAMEBUFFER, viewconvert->fbo);
+
+ gst_gl_framebuffer_bind (viewconvert->fbo);
+
if (out_mode == GST_VIDEO_MULTIVIEW_MODE_SEPARATED ||
out_mode == GST_VIDEO_MULTIVIEW_MODE_FRAME_BY_FRAME) {
out_views = viewconvert->out_info.views;
@@ -1869,34 +1820,42 @@
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);
+ GstGLBaseMemory *tex = (GstGLBaseMemory *) priv->out_tex[i];
- /* needed? */
- gl->BindTexture (gl_target, priv->out_tex[i]->tex_id);
- gl->FramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i,
- gl_target, priv->out_tex[i]->tex_id, 0);
+ gst_gl_framebuffer_attach (viewconvert->fbo, GL_COLOR_ATTACHMENT0 + i, tex);
}
if (gl->DrawBuffers)
gl->DrawBuffers (out_views, multipleRT);
else if (gl->DrawBuffer)
gl->DrawBuffer (GL_COLOR_ATTACHMENT0);
+
+ gst_gl_framebuffer_get_effective_dimensions (viewconvert->fbo, &out_width,
+ &out_height);
gl->GetIntegerv (GL_VIEWPORT, viewport_dim);
gl->Viewport (0, 0, out_width, out_height);
+
gst_gl_shader_use (viewconvert->shader);
+
+ /* FIXME: the auxillary buffer could have a different transform matrix */
+ {
+ GstVideoAffineTransformationMeta *af_meta;
+ gfloat matrix[16];
+
+ af_meta =
+ gst_buffer_get_video_affine_transformation_meta (priv->primary_in);
+ gst_gl_get_affine_transformation_meta_as_ndc (af_meta, matrix);
+ gst_gl_shader_set_uniform_matrix_4fv (viewconvert->shader,
+ "u_transformation", 1, FALSE, matrix);
+ }
+
if (gl->BindVertexArray)
gl->BindVertexArray (priv->vao);
else
_bind_buffer (viewconvert);
+
if (in_mode == GST_VIDEO_MULTIVIEW_MODE_SEPARATED ||
in_mode == GST_VIDEO_MULTIVIEW_MODE_FRAME_BY_FRAME) {
if (priv->in_tex[1] == NULL) {
@@ -1910,7 +1869,9 @@
gl->ActiveTexture (GL_TEXTURE0);
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);
else
@@ -1921,8 +1882,8 @@
gst_gl_context_clear_shader (context);
gl->Viewport (viewport_dim[0], viewport_dim[1], viewport_dim[2],
viewport_dim[3]);
- gst_gl_context_check_framebuffer_status (context);
- gl->BindFramebuffer (GL_FRAMEBUFFER, 0);
+ gst_gl_context_clear_framebuffer (context);
+
return TRUE;
}
@@ -1940,9 +1901,10 @@
(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);
+ &viewconvert->out_info, 0, NULL, viewconvert->to_texture_target, 0);
- if (!gst_gl_memory_setup_buffer (mem_allocator, *target, params)) {
+ if (!gst_gl_memory_setup_buffer (mem_allocator, *target, params, NULL, NULL,
+ 0)) {
gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
gst_object_unref (allocator);
return FALSE;
@@ -2081,7 +2043,8 @@
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);
+ 0, NULL, viewconvert->to_texture_target,
+ GST_VIDEO_GL_TEXTURE_TYPE_RGBA);
priv->out_tex[j] =
(GstGLMemory *) gst_gl_base_memory_alloc (base_mem_allocator,
@@ -2128,15 +2091,13 @@
GstMapInfo to_info, from_info;
if (!gst_memory_map ((GstMemory *) priv->out_tex[j],
&from_info, GST_MAP_READ | GST_MAP_GL)) {
- gst_gl_context_set_error (viewconvert->context,
- "Failed to map " "intermediate memory");
+ GST_ERROR_OBJECT (viewconvert, "Failed to map intermediate memory");
res = FALSE;
continue;
}
if (!gst_memory_map ((GstMemory *) out_tex, &to_info,
GST_MAP_WRITE | GST_MAP_GL)) {
- gst_gl_context_set_error (viewconvert->context, "Failed to map "
- "intermediate memory");
+ GST_ERROR_OBJECT (viewconvert, "Failed to map intermediate memory");
res = FALSE;
continue;
}
diff --git a/gst-libs/gst/gl/gstglviewconvert.h b/gst-libs/gst/gl/gstglviewconvert.h
index 8cfa1b2..4783dd1 100644
--- a/gst-libs/gst/gl/gstglviewconvert.h
+++ b/gst-libs/gst/gl/gstglviewconvert.h
@@ -68,15 +68,20 @@
gboolean initted;
gboolean reconfigure;
- GLuint fbo;
- GLuint depth_buffer;
+ GstGLFramebuffer *fbo;
+ /* <private> */
GstGLViewConvertPrivate *priv;
+
+ gpointer _padding[GST_PADDING];
};
struct _GstGLViewConvertClass
{
GstObjectClass object_class;
+
+ /* <private> */
+ gpointer _padding[GST_PADDING];
};
GType gst_gl_view_convert_get_type (void);
diff --git a/gst-libs/gst/gl/gstglwindow.c b/gst-libs/gst/gl/gstglwindow.c
index 695f4c4..b74d397 100644
--- a/gst-libs/gst/gl/gstglwindow.c
+++ b/gst-libs/gst/gl/gstglwindow.c
@@ -102,6 +102,8 @@
GMutex nav_lock;
GCond nav_create_cond;
gboolean nav_alive;
+ GMutex sync_message_lock;
+ GCond sync_message_cond;
};
static void gst_gl_window_finalize (GObject * object);
@@ -197,6 +199,9 @@
g_weak_ref_init (&window->context_ref, NULL);
+ g_mutex_init (&window->priv->sync_message_lock);
+ g_cond_init (&window->priv->sync_message_cond);
+
priv->main_context = g_main_context_new ();
priv->loop = g_main_loop_new (priv->main_context, FALSE);
priv->navigation_loop = NULL;
@@ -348,6 +353,8 @@
g_mutex_clear (&window->lock);
g_mutex_clear (&window->priv->nav_lock);
g_cond_clear (&window->priv->nav_create_cond);
+ g_mutex_clear (&window->priv->sync_message_lock);
+ g_cond_clear (&window->priv->sync_message_cond);
gst_object_unref (window->display);
G_OBJECT_CLASS (gst_gl_window_parent_class)->finalize (object);
@@ -480,8 +487,6 @@
}
window_class->draw (window);
-
- window->queue_resize = FALSE;
}
/**
@@ -590,8 +595,7 @@
typedef struct _GstGLSyncMessage
{
- GMutex lock;
- GCond cond;
+ GstGLWindow *window;
gboolean fired;
GstGLWindowCB callback;
@@ -601,14 +605,14 @@
static void
_run_message_sync (GstGLSyncMessage * message)
{
- g_mutex_lock (&message->lock);
if (message->callback)
message->callback (message->data);
+ g_mutex_lock (&message->window->priv->sync_message_lock);
message->fired = TRUE;
- g_cond_signal (&message->cond);
- g_mutex_unlock (&message->lock);
+ g_cond_broadcast (&message->window->priv->sync_message_cond);
+ g_mutex_unlock (&message->window->priv->sync_message_lock);
}
void
@@ -617,24 +621,21 @@
{
GstGLSyncMessage message;
+ message.window = window;
message.callback = callback;
message.data = data;
message.fired = FALSE;
- g_mutex_init (&message.lock);
- g_cond_init (&message.cond);
gst_gl_window_send_message_async (window, (GstGLWindowCB) _run_message_sync,
&message, NULL);
- g_mutex_lock (&message.lock);
+ g_mutex_lock (&window->priv->sync_message_lock);
/* block until opengl calls have been executed in the gl thread */
while (!message.fired)
- g_cond_wait (&message.cond, &message.lock);
- g_mutex_unlock (&message.lock);
-
- g_mutex_clear (&message.lock);
- g_cond_clear (&message.cond);
+ g_cond_wait (&window->priv->sync_message_cond,
+ &window->priv->sync_message_lock);
+ g_mutex_unlock (&window->priv->sync_message_lock);
}
/**
@@ -1161,14 +1162,38 @@
window_class->queue_resize (window);
}
+struct resize_data
+{
+ GstGLWindow *window;
+ guint width, height;
+};
+
+static void
+_on_resize (gpointer data)
+{
+ struct resize_data *resize = data;
+
+ resize->window->resize (resize->window->resize_data, resize->width,
+ resize->height);
+}
+
void
gst_gl_window_resize (GstGLWindow * window, guint width, guint height)
{
g_return_if_fail (GST_IS_GL_WINDOW (window));
- if (window->resize)
- window->resize (window->resize_data, width, height);
+ if (window->resize) {
+ struct resize_data resize = { 0, };
+
+ resize.window = window;
+ resize.width = width;
+ resize.height = height;
+
+ gst_gl_window_send_message (window, (GstGLWindowCB) _on_resize, &resize);
+ }
window->priv->surface_width = width;
window->priv->surface_height = height;
+
+ window->queue_resize = FALSE;
}
diff --git a/gst-libs/gst/gl/wayland/Makefile.in b/gst-libs/gst/gl/wayland/Makefile.in
index feaf1a8..4646c78 100644
--- a/gst-libs/gst/gl/wayland/Makefile.in
+++ b/gst-libs/gst/gl/wayland/Makefile.in
@@ -275,6 +275,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -296,6 +298,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -345,6 +349,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -490,6 +496,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -616,8 +624,6 @@
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@
@@ -660,8 +666,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst-libs/gst/gl/wayland/gstgldisplay_wayland.c b/gst-libs/gst/gl/wayland/gstgldisplay_wayland.c
index c5c5094..6654280 100644
--- a/gst-libs/gst/gl/wayland/gstgldisplay_wayland.c
+++ b/gst-libs/gst/gl/wayland/gstgldisplay_wayland.c
@@ -117,7 +117,12 @@
ret->display = wl_display_connect (name);
if (!ret->display) {
- GST_ERROR ("Failed to open X11 display connection with name, \'%s\'", name);
+ if (name != NULL) {
+ GST_ERROR ("Failed to open Wayland display connection with name \'%s\'",
+ name);
+ } else {
+ GST_ERROR ("Failed to open Wayland display connection.");
+ }
return NULL;
}
diff --git a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h
index e0166da..a88955f 100644
--- a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h
+++ b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h
@@ -103,4 +103,4 @@
G_END_DECLS
-#endif /* __GST_GL_WINDOW_X11_H__ */
+#endif /* __GST_GL_WINDOW_WAYLAND_EGL_H__ */
diff --git a/gst-libs/gst/gl/wayland/wayland_event_source.c b/gst-libs/gst/gl/wayland/wayland_event_source.c
index 114977a..ffb1503 100644
--- a/gst-libs/gst/gl/wayland/wayland_event_source.c
+++ b/gst-libs/gst/gl/wayland/wayland_event_source.c
@@ -51,19 +51,30 @@
sync_callback
};
+/* only thread safe iff called on the same thread @queue is being dispatched on */
gint
gst_gl_wl_display_roundtrip_queue (struct wl_display *display,
struct wl_event_queue *queue)
{
- struct wl_callback *callback = wl_display_sync (display);
+ struct wl_callback *callback;
gboolean done = FALSE;
gint ret = 0;
- if (callback == NULL)
+ if (queue) {
+ /* creating a wl_proxy and setting the queue is racy with the dispatching
+ * of the default queue */
+ while (wl_display_prepare_read_queue (display, queue) != 0) {
+ if ((ret = wl_display_dispatch_queue_pending (display, queue)) < 0)
+ return ret;
+ }
+ }
+ if (!(callback = wl_display_sync (display))) {
return -1;
+ }
wl_callback_add_listener (callback, &sync_listener, &done);
if (queue) {
wl_proxy_set_queue ((struct wl_proxy *) callback, queue);
+ wl_display_cancel_read (display);
while (!done && ret >= 0)
ret = wl_display_dispatch_queue (display, queue);
} else {
@@ -84,6 +95,7 @@
uint32_t mask;
struct wl_display *display;
struct wl_event_queue *queue;
+ gboolean reading;
} WaylandEventSource;
static gboolean
@@ -93,10 +105,29 @@
*timeout = -1;
- /* We have to add/remove the GPollFD if we want to update our
- * poll event mask dynamically. Instead, let's just flush all
- * writes on idle */
- wl_display_flush (source->display);
+ /* we may be called multiple times for prepare */
+ if (source->reading)
+ wl_display_cancel_read (source->display);
+
+ if (source->queue) {
+ while (wl_display_prepare_read_queue (source->display, source->queue) != 0) {
+ if (wl_display_dispatch_queue_pending (source->display,
+ source->queue) < 0) {
+ g_critical ("Failed to dispatch pending events\n");
+ }
+ }
+ } else {
+ while (wl_display_prepare_read (source->display) != 0) {
+ if (wl_display_dispatch_pending (source->display) < 0) {
+ g_critical ("Failed to dispatch pending events\n");
+ }
+ }
+ }
+ source->reading = TRUE;
+
+ /* FIXME: this may return EAGAIN if the fd is full */
+ if (wl_display_flush (source->display) < 0)
+ g_critical ("Failed to flush Wayland connection\n");
return FALSE;
}
@@ -109,6 +140,13 @@
retval = source->pfd.revents;
+ if (source->pfd.revents & G_IO_IN) {
+ wl_display_read_events (source->display);
+ } else {
+ wl_display_cancel_read (source->display);
+ }
+ source->reading = FALSE;
+
return retval;
}
@@ -118,13 +156,11 @@
{
WaylandEventSource *source = (WaylandEventSource *) base;
- if (source->pfd.revents) {
- if (source->queue)
- wl_display_dispatch_queue_pending (source->display, source->queue);
- else
- wl_display_dispatch_pending (source->display);
- source->pfd.revents = 0;
- }
+ if (source->queue)
+ wl_display_dispatch_queue_pending (source->display, source->queue);
+ else
+ wl_display_dispatch_pending (source->display);
+ source->pfd.revents = 0;
if (callback)
callback (data);
@@ -132,11 +168,22 @@
return TRUE;
}
+static void
+wayland_event_source_finalize (GSource * base)
+{
+ WaylandEventSource *source = (WaylandEventSource *) base;
+
+ if (source->reading) {
+ wl_display_cancel_read (source->display);
+ }
+ source->reading = FALSE;
+}
+
static GSourceFuncs wayland_event_source_funcs = {
wayland_event_source_prepare,
wayland_event_source_check,
wayland_event_source_dispatch,
- NULL
+ wayland_event_source_finalize
};
GSource *
diff --git a/gst-libs/gst/gl/win32/Makefile.in b/gst-libs/gst/gl/win32/Makefile.in
index 079345d..9fc5848 100644
--- a/gst-libs/gst/gl/win32/Makefile.in
+++ b/gst-libs/gst/gl/win32/Makefile.in
@@ -280,6 +280,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -301,6 +303,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -350,6 +354,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -495,6 +501,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -621,8 +629,6 @@
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@
@@ -665,8 +671,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst-libs/gst/gl/win32/gstglcontext_wgl.c b/gst-libs/gst/gl/win32/gstglcontext_wgl.c
index 3c2f34a..0961e40 100644
--- a/gst-libs/gst/gl/win32/gstglcontext_wgl.c
+++ b/gst-libs/gst/gl/win32/gstglcontext_wgl.c
@@ -40,6 +40,8 @@
GstGLAPI context_api;
};
+#define GST_CAT_DEFAULT gst_gl_context_debug
+
#define gst_gl_context_wgl_parent_class parent_class
G_DEFINE_TYPE (GstGLContextWGL, gst_gl_context_wgl, GST_GL_TYPE_CONTEXT);
#define GST_GL_CONTEXT_WGL_GET_PRIVATE(o) \
@@ -221,23 +223,35 @@
}
if (!context_wgl->wgl_context) {
- context_wgl->wgl_context = wglCreateContext (device);
- if (!context_wgl->wgl_context) {
- g_set_error (error, GST_GL_CONTEXT_ERROR,
- GST_GL_CONTEXT_ERROR_CREATE_CONTEXT,
- "Failed to create WGL context 0x%x", (unsigned int) GetLastError ());
- goto failure;
+ if (context_wgl->priv->wglCreateContextAttribsARB && external_gl_context) {
+ context_wgl->wgl_context =
+ context_wgl->priv->wglCreateContextAttribsARB (device,
+ external_gl_context, 0);
}
- if (external_gl_context) {
- if (!wglShareLists (external_gl_context, context_wgl->wgl_context)) {
+
+ if (!context_wgl->wgl_context) {
+
+ context_wgl->wgl_context = wglCreateContext (device);
+
+ if (!context_wgl->wgl_context) {
g_set_error (error, GST_GL_CONTEXT_ERROR,
GST_GL_CONTEXT_ERROR_CREATE_CONTEXT,
- "failed to share contexts through wglShareLists 0x%x",
+ "Failed to create WGL context 0x%x",
(unsigned int) GetLastError ());
goto failure;
}
+
+ if (external_gl_context) {
+ if (!wglShareLists (external_gl_context, context_wgl->wgl_context)) {
+ g_set_error (error, GST_GL_CONTEXT_ERROR,
+ GST_GL_CONTEXT_ERROR_CREATE_CONTEXT,
+ "failed to share contexts through wglShareLists 0x%x",
+ (unsigned int) GetLastError ());
+ goto failure;
+ }
+ }
}
context_wgl->priv->context_api = GST_GL_API_OPENGL;
diff --git a/gst-libs/gst/gl/x11/Makefile.in b/gst-libs/gst/gl/x11/Makefile.in
index 982e2ec..d2d059a 100644
--- a/gst-libs/gst/gl/x11/Makefile.in
+++ b/gst-libs/gst/gl/x11/Makefile.in
@@ -309,6 +309,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -330,6 +332,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -379,6 +383,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -524,6 +530,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -650,8 +658,6 @@
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@
@@ -694,8 +700,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst-libs/gst/gl/x11/gstglwindow_x11.c b/gst-libs/gst/gl/x11/gstglwindow_x11.c
index a330825..d08b757 100644
--- a/gst-libs/gst/gl/x11/gstglwindow_x11.c
+++ b/gst-libs/gst/gl/x11/gstglwindow_x11.c
@@ -391,6 +391,7 @@
GstGLWindow *window = GST_GL_WINDOW (window_x11);
if (gst_gl_window_is_running (window)) {
+ guint width, height;
XWindowAttributes attr;
XGetWindowAttributes (window_x11->device, window_x11->internal_win_id,
@@ -414,13 +415,16 @@
}
}
- if (window_x11->allow_extra_expose_events) {
- if (window->queue_resize) {
- guint width, height;
+ gst_gl_window_get_surface_dimensions (window, &width, &height);
+ if (attr.width != width || attr.height != height) {
+ width = attr.width;
+ height = attr.height;
+ gst_gl_window_queue_resize (window);
+ }
- gst_gl_window_get_surface_dimensions (window, &width, &height);
+ if (window_x11->allow_extra_expose_events) {
+ if (window->queue_resize)
gst_gl_window_resize (window, width, height);
- }
if (window->draw) {
GstGLContext *context = gst_gl_window_get_context (window);
diff --git a/gst-libs/gst/insertbin/Makefile.in b/gst-libs/gst/insertbin/Makefile.in
index 234dd83..d81f7ee 100644
--- a/gst-libs/gst/insertbin/Makefile.in
+++ b/gst-libs/gst/insertbin/Makefile.in
@@ -292,6 +292,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -313,6 +315,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -362,6 +366,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -507,6 +513,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -633,8 +641,6 @@
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@
@@ -677,8 +683,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst-libs/gst/insertbin/gstinsertbin.c b/gst-libs/gst/insertbin/gstinsertbin.c
index 57f030a..f200c28 100644
--- a/gst-libs/gst/insertbin/gstinsertbin.c
+++ b/gst-libs/gst/insertbin/gstinsertbin.c
@@ -132,13 +132,12 @@
g_type_class_add_private (klass, sizeof (GstInsertBinPrivate));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_insert_bin_src_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_insert_bin_sink_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_insert_bin_src_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_insert_bin_sink_template);
gst_element_class_set_static_metadata (gstelement_class, "Insert Bin",
- "Generic/Bin/Filter",
- "Auto-links filter style elements insertally",
+ "Generic/Bin/Filter", "Auto-links filter style elements insertally",
"Olivier Crete <olivier.crete@collabora.com>");
gobject_class->dispose = gst_insert_bin_dispose;
diff --git a/gst-libs/gst/interfaces/Makefile.in b/gst-libs/gst/interfaces/Makefile.in
index f04d68a..44e57bf 100644
--- a/gst-libs/gst/interfaces/Makefile.in
+++ b/gst-libs/gst/interfaces/Makefile.in
@@ -322,6 +322,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -343,6 +345,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -392,6 +396,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -537,6 +543,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -663,8 +671,6 @@
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@
@@ -707,8 +713,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst-libs/gst/mpegts/Makefile.in b/gst-libs/gst/mpegts/Makefile.in
index 03e86ac..b3c79d9 100644
--- a/gst-libs/gst/mpegts/Makefile.in
+++ b/gst-libs/gst/mpegts/Makefile.in
@@ -330,6 +330,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -351,6 +353,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -400,6 +404,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -545,6 +551,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -671,8 +679,6 @@
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@
@@ -715,8 +721,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst-libs/gst/mpegts/gstmpegtsdescriptor.c b/gst-libs/gst/mpegts/gstmpegtsdescriptor.c
index d4817d2..a49ce2a 100644
--- a/gst-libs/gst/mpegts/gstmpegtsdescriptor.c
+++ b/gst-libs/gst/mpegts/gstmpegtsdescriptor.c
@@ -1040,6 +1040,30 @@
}
/**
+ * gst_mpegts_descriptor_from_iso_639_language:
+ * @language: (transfer none): ISO-639-2 language 3-char code
+ *
+ * Creates a %GST_MTS_DESC_ISO_639_LANGUAGE #GstMpegtsDescriptor with
+ * a single language
+ *
+ * Return: #GstMpegtsDescriptor, %NULL on failure
+ */
+GstMpegtsDescriptor *
+gst_mpegts_descriptor_from_iso_639_language (const gchar * language)
+{
+ GstMpegtsDescriptor *descriptor;
+
+ g_return_val_if_fail (language != NULL, NULL);
+
+ descriptor = _new_descriptor (GST_MTS_DESC_ISO_639_LANGUAGE, 4 + 4); /* a language takes 4 bytes */
+
+ memcpy (descriptor->data + 2, language, 3);
+ descriptor->data[2 + 3] = 0; /* set audio type to undefined */
+
+ return descriptor;
+}
+
+/**
* gst_mpegts_descriptor_parse_logical_channel:
* @descriptor: a %GST_MTS_DESC_DTG_LOGICAL_CHANNEL #GstMpegtsDescriptor
* @res: (out) (transfer none): the #GstMpegtsLogicalChannelDescriptor to fill
diff --git a/gst-libs/gst/mpegts/gstmpegtsdescriptor.h b/gst-libs/gst/mpegts/gstmpegtsdescriptor.h
index af56be0..33d46f5 100644
--- a/gst-libs/gst/mpegts/gstmpegtsdescriptor.h
+++ b/gst-libs/gst/mpegts/gstmpegtsdescriptor.h
@@ -313,6 +313,7 @@
guint idx, gchar **lang,
GstMpegtsIso639AudioType *audio_type);
guint gst_mpegts_descriptor_parse_iso_639_language_nb (const GstMpegtsDescriptor *descriptor);
+GstMpegtsDescriptor * gst_mpegts_descriptor_from_iso_639_language (const gchar * language);
diff --git a/gst-libs/gst/player/Makefile.am b/gst-libs/gst/player/Makefile.am
index 042622b..f893375 100644
--- a/gst-libs/gst/player/Makefile.am
+++ b/gst-libs/gst/player/Makefile.am
@@ -69,9 +69,12 @@
--c-include "gst/player/player.h" \
--add-include-path=$(top_builddir)/gst-libs \
--add-include-path=`PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" $(PKG_CONFIG) --variable=girdir gstreamer-1.0` \
+ --add-include-path=`PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" $(PKG_CONFIG) --variable=girdir gstreamer-base-1.0` \
+ --add-include-path=`PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" $(PKG_CONFIG) --variable=girdir gstreamer-video-1.0` \
--library-path=$(top_builddir)/gst-libs \
--library=libgstplayer-@GST_API_VERSION@.la \
--include=Gst-@GST_API_VERSION@ \
+ --include=GstVideo-@GST_API_VERSION@ \
--libtool="${LIBTOOL}" \
--pkg gstreamer-@GST_API_VERSION@ \
--pkg gstreamer-audio-@GST_API_VERSION@ \
@@ -99,6 +102,8 @@
--includedir=$(srcdir)/gst-libs \
--includedir=$(builddir)/gst-libs \
--includedir=`PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" $(PKG_CONFIG) --variable=girdir gstreamer-1.0` \
+ --includedir=`PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" $(PKG_CONFIG) --variable=girdir gstreamer-base-1.0` \
+ --includedir=`PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" $(PKG_CONFIG) --variable=girdir gstreamer-video-1.0` \
$(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
CLEANFILES += $(BUILT_GIRSOURCES) $(typelibs_DATA)
diff --git a/gst-libs/gst/player/Makefile.in b/gst-libs/gst/player/Makefile.in
index a9e8ab1..fe0747b 100644
--- a/gst-libs/gst/player/Makefile.in
+++ b/gst-libs/gst/player/Makefile.in
@@ -315,6 +315,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -336,6 +338,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -385,6 +389,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -530,6 +536,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -656,8 +664,6 @@
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@
@@ -700,8 +706,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -1305,9 +1316,12 @@
@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_PATH="$(GST_PKG_CONFIG_PATH)" $(PKG_CONFIG) --variable=girdir gstreamer-1.0` \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=`PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" $(PKG_CONFIG) --variable=girdir gstreamer-base-1.0` \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=`PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" $(PKG_CONFIG) --variable=girdir gstreamer-video-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@ --include=GstVideo-@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@ \
@@ -1326,6 +1340,8 @@
@HAVE_INTROSPECTION_TRUE@ --includedir=$(srcdir)/gst-libs \
@HAVE_INTROSPECTION_TRUE@ --includedir=$(builddir)/gst-libs \
@HAVE_INTROSPECTION_TRUE@ --includedir=`PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" $(PKG_CONFIG) --variable=girdir gstreamer-1.0` \
+@HAVE_INTROSPECTION_TRUE@ --includedir=`PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" $(PKG_CONFIG) --variable=girdir gstreamer-base-1.0` \
+@HAVE_INTROSPECTION_TRUE@ --includedir=`PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" $(PKG_CONFIG) --variable=girdir gstreamer-video-1.0` \
@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
# Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/gst-libs/gst/player/gstplayer-media-info-private.h b/gst-libs/gst/player/gstplayer-media-info-private.h
index b8757be..c5f6aad 100644
--- a/gst-libs/gst/player/gstplayer-media-info-private.h
+++ b/gst-libs/gst/player/gstplayer-media-info-private.h
@@ -96,7 +96,7 @@
gchar *uri;
gchar *title;
gchar *container;
- gboolean seekable;
+ gboolean seekable, is_live;
GstTagList *tags;
GstSample *image_sample;
diff --git a/gst-libs/gst/player/gstplayer-media-info.c b/gst-libs/gst/player/gstplayer-media-info.c
index 85a53d4..bba8ea6 100644
--- a/gst-libs/gst/player/gstplayer-media-info.c
+++ b/gst-libs/gst/player/gstplayer-media-info.c
@@ -410,6 +410,7 @@
gst_player_media_info_init (GstPlayerMediaInfo * info)
{
info->duration = -1;
+ info->is_live = FALSE;
info->seekable = FALSE;
}
@@ -558,6 +559,7 @@
info = gst_player_media_info_new (ref->uri);
info->duration = ref->duration;
info->seekable = ref->seekable;
+ info->is_live = ref->is_live;
if (ref->tags)
info->tags = gst_tag_list_ref (ref->tags);
if (ref->title)
@@ -644,6 +646,20 @@
}
/**
+ * gst_player_media_info_is_live:
+ * @info: a #GstPlayerMediaInfo
+ *
+ * Returns: %TRUE if the media is live.
+ */
+gboolean
+gst_player_media_info_is_live (const GstPlayerMediaInfo * info)
+{
+ g_return_val_if_fail (GST_IS_PLAYER_MEDIA_INFO (info), FALSE);
+
+ return info->is_live;
+}
+
+/**
* gst_player_media_info_get_stream_list:
* @info: a #GstPlayerMediaInfo
*
diff --git a/gst-libs/gst/player/gstplayer-media-info.h b/gst-libs/gst/player/gstplayer-media-info.h
index a458b75..7ffd6b4 100644
--- a/gst-libs/gst/player/gstplayer-media-info.h
+++ b/gst-libs/gst/player/gstplayer-media-info.h
@@ -169,6 +169,8 @@
(const GstPlayerMediaInfo *info);
gboolean gst_player_media_info_is_seekable
(const GstPlayerMediaInfo *info);
+gboolean gst_player_media_info_is_live
+ (const GstPlayerMediaInfo *info);
GstClockTime gst_player_media_info_get_duration
(const GstPlayerMediaInfo *info);
GList* gst_player_media_info_get_stream_list
diff --git a/gst-libs/gst/player/gstplayer-video-overlay-video-renderer.c b/gst-libs/gst/player/gstplayer-video-overlay-video-renderer.c
index 72a35e0..7764d43 100644
--- a/gst-libs/gst/player/gstplayer-video-overlay-video-renderer.c
+++ b/gst-libs/gst/player/gstplayer-video-overlay-video-renderer.c
@@ -255,7 +255,7 @@
* Configure a subregion as a video target within the window set by
* gst_player_video_overlay_video_renderer_set_window_handle(). If this is not
* used or not supported the video will fill the area of the window set as the
- * overlay to 100%. By specifying the rectangle, the video can be overlayed to
+ * overlay to 100%. By specifying the rectangle, the video can be overlaid to
* a specific region of that window only. After setting the new rectangle one
* should call gst_player_video_overlay_video_renderer_expose() to force a
* redraw. To unset the region pass -1 for the @width and @height parameters.
diff --git a/gst-libs/gst/player/gstplayer.c b/gst-libs/gst/player/gstplayer.c
index 871ba43..62cd800 100644
--- a/gst-libs/gst/player/gstplayer.c
+++ b/gst-libs/gst/player/gstplayer.c
@@ -65,6 +65,7 @@
#define DEFAULT_MUTE FALSE
#define DEFAULT_RATE 1.0
#define DEFAULT_POSITION_UPDATE_INTERVAL_MS 100
+#define DEFAULT_AUDIO_VIDEO_OFFSET 0
GQuark
gst_player_error_quark (void)
@@ -77,6 +78,26 @@
return quark;
}
+static GQuark QUARK_CONFIG;
+
+/* Keep ConfigQuarkId and _config_quark_strings ordered and synced */
+typedef enum
+{
+ CONFIG_QUARK_USER_AGENT = 0,
+ CONFIG_QUARK_POSITION_INTERVAL_UPDATE,
+
+ CONFIG_QUARK_MAX
+} ConfigQuarkId;
+
+static const gchar *_config_quark_strings[] = {
+ "user-agent",
+ "position-interval-update",
+};
+
+GQuark _config_quark_table[CONFIG_QUARK_MAX];
+
+#define CONFIG_QUARK(q) _config_quark_table[CONFIG_QUARK_##q]
+
enum
{
PROP_0,
@@ -94,12 +115,15 @@
PROP_MUTE,
PROP_RATE,
PROP_PIPELINE,
- PROP_POSITION_UPDATE_INTERVAL,
+ PROP_VIDEO_MULTIVIEW_MODE,
+ PROP_VIDEO_MULTIVIEW_FLAGS,
+ PROP_AUDIO_VIDEO_OFFSET,
PROP_LAST
};
enum
{
+ SIGNAL_URI_LOADED,
SIGNAL_POSITION_UPDATED,
SIGNAL_DURATION_CHANGED,
SIGNAL_STATE_CHANGED,
@@ -131,6 +155,7 @@
GstPlayerSignalDispatcher *signal_dispatcher;
gchar *uri;
+ gchar *redirect_uri;
gchar *suburi;
GThread *thread;
@@ -146,7 +171,6 @@
GSource *tick_source, *ready_timeout_source;
gdouble rate;
- guint position_update_interval_ms;
GstPlayerState app_state;
gint buffering;
@@ -156,11 +180,17 @@
GstElement *current_vis_element;
+ GstStructure *config;
+
/* 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;
+ /* If TRUE, all signals are inhibited except the
+ * state-changed:GST_PLAYER_STATE_STOPPED/PAUSED. This ensures that no signal
+ * is emitted after gst_player_stop/pause() has been called by the user. */
+ gboolean inhibit_sigs;
};
struct _GstPlayerClass
@@ -185,12 +215,11 @@
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 void gst_player_stop_internal (GstPlayer * self, gboolean transient);
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 gboolean gst_player_seek_internal (gpointer user_data);
+static void gst_player_set_rate_internal (GstPlayer * self);
static void change_state (GstPlayer * self, GstPlayerState state);
static GstPlayerMediaInfo *gst_player_media_info_create (GstPlayer * self);
@@ -234,15 +263,38 @@
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;
+ /* *INDENT-OFF* */
+ self->config = gst_structure_new_id (QUARK_CONFIG,
+ CONFIG_QUARK (POSITION_INTERVAL_UPDATE), G_TYPE_UINT, DEFAULT_POSITION_UPDATE_INTERVAL_MS,
+ NULL);
+ /* *INDENT-ON* */
+
self->seek_pending = FALSE;
self->seek_position = GST_CLOCK_TIME_NONE;
self->last_seek_time = GST_CLOCK_TIME_NONE;
+ self->inhibit_sigs = FALSE;
GST_TRACE_OBJECT (self, "Initialized");
}
static void
+config_quark_initialize (void)
+{
+ gint i;
+
+ QUARK_CONFIG = g_quark_from_static_string ("player-config");
+
+ if (G_N_ELEMENTS (_config_quark_strings) != CONFIG_QUARK_MAX)
+ g_warning ("the quark table is not consistent! %d != %d",
+ (int) G_N_ELEMENTS (_config_quark_strings), CONFIG_QUARK_MAX);
+
+ for (i = 0; i < CONFIG_QUARK_MAX; i++) {
+ _config_quark_table[i] =
+ g_quark_from_static_string (_config_quark_strings[i]);
+ }
+}
+
+static void
gst_player_class_init (GstPlayerClass * klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
@@ -318,15 +370,33 @@
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,
+ param_specs[PROP_VIDEO_MULTIVIEW_MODE] =
+ g_param_spec_enum ("video-multiview-mode",
+ "Multiview Mode Override",
+ "Re-interpret a video stream as one of several frame-packed stereoscopic modes.",
+ GST_TYPE_VIDEO_MULTIVIEW_FRAME_PACKING,
+ GST_VIDEO_MULTIVIEW_FRAME_PACKING_NONE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+ param_specs[PROP_VIDEO_MULTIVIEW_FLAGS] =
+ g_param_spec_flags ("video-multiview-flags",
+ "Multiview Flags Override",
+ "Override details of the multiview frame layout",
+ GST_TYPE_VIDEO_MULTIVIEW_FLAGS, GST_VIDEO_MULTIVIEW_FLAGS_NONE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+ param_specs[PROP_AUDIO_VIDEO_OFFSET] =
+ g_param_spec_int64 ("audio-video-offset", "Audio Video Offset",
+ "The synchronisation offset between audio and video in nanoseconds",
+ G_MININT64, G_MAXINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
g_object_class_install_properties (gobject_class, PROP_LAST, param_specs);
+ signals[SIGNAL_URI_LOADED] =
+ g_signal_new ("uri-loaded", 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_STRING);
+
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,
@@ -386,6 +456,8 @@
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);
+
+ config_quark_initialize ();
}
static void
@@ -419,6 +491,7 @@
GST_TRACE_OBJECT (self, "Finalizing");
g_free (self->uri);
+ g_free (self->redirect_uri);
g_free (self->suburi);
if (self->global_tags)
gst_tag_list_unref (self->global_tags);
@@ -428,6 +501,8 @@
g_object_unref (self->signal_dispatcher);
if (self->current_vis_element)
gst_object_unref (self->current_vis_element);
+ if (self->config)
+ gst_structure_free (self->config);
g_mutex_clear (&self->lock);
g_cond_clear (&self->cond);
@@ -450,12 +525,34 @@
G_OBJECT_CLASS (parent_class)->constructed (object);
}
+typedef struct
+{
+ GstPlayer *player;
+ gchar *uri;
+} UriLoadedSignalData;
+
+static void
+uri_loaded_dispatch (gpointer user_data)
+{
+ UriLoadedSignalData *data = user_data;
+
+ g_signal_emit (data->player, signals[SIGNAL_URI_LOADED], 0, data->uri);
+}
+
+static void
+uri_loaded_signal_data_free (UriLoadedSignalData * data)
+{
+ g_object_unref (data->player);
+ g_free (data->uri);
+ g_free (data);
+}
+
static gboolean
gst_player_set_uri_internal (gpointer user_data)
{
GstPlayer *self = user_data;
- gst_player_stop_internal (self);
+ gst_player_stop_internal (self, FALSE);
g_mutex_lock (&self->lock);
@@ -463,6 +560,17 @@
g_object_set (self->playbin, "uri", self->uri, NULL);
+ if (g_signal_handler_find (self, G_SIGNAL_MATCH_ID,
+ signals[SIGNAL_URI_LOADED], 0, NULL, NULL, NULL) != 0) {
+ UriLoadedSignalData *data = g_new (UriLoadedSignalData, 1);
+
+ data->player = g_object_ref (self);
+ data->uri = g_strdup (self->uri);
+ gst_player_signal_dispatcher_dispatch (self->signal_dispatcher, self,
+ uri_loaded_dispatch, data,
+ (GDestroyNotify) uri_loaded_signal_data_free);
+ }
+
/* if have suburi from previous playback then free it */
if (self->suburi) {
g_free (self->suburi);
@@ -486,14 +594,15 @@
target_state = self->target_state;
position = gst_player_get_position (self);
- gst_player_stop_internal (self);
+ gst_player_stop_internal (self, TRUE);
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_object_set (self->playbin, "uri",
+ self->redirect_uri ? self->redirect_uri : self->uri, NULL);
g_mutex_unlock (&self->lock);
@@ -509,6 +618,26 @@
}
static void
+gst_player_set_rate_internal (GstPlayer * self)
+{
+ 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);
+ }
+ }
+}
+
+static void
gst_player_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
{
@@ -524,6 +653,8 @@
case PROP_URI:{
g_mutex_lock (&self->lock);
g_free (self->uri);
+ g_free (self->redirect_uri);
+ self->redirect_uri = NULL;
self->uri = g_value_dup_string (value);
GST_DEBUG_OBJECT (self, "Set uri=%s", self->uri);
@@ -553,22 +684,27 @@
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);
+ g_mutex_unlock (&self->lock);
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);
+ case PROP_VIDEO_MULTIVIEW_MODE:
+ GST_DEBUG_OBJECT (self, "Set multiview mode=%u",
+ g_value_get_enum (value));
+ g_object_set_property (G_OBJECT (self->playbin), "video-multiview-mode",
+ value);
+ break;
+ case PROP_VIDEO_MULTIVIEW_FLAGS:
+ GST_DEBUG_OBJECT (self, "Set multiview flags=%x",
+ g_value_get_flags (value));
+ g_object_set_property (G_OBJECT (self->playbin), "video-multiview-flags",
+ value);
+ break;
+ case PROP_AUDIO_VIDEO_OFFSET:
+ g_object_set_property (G_OBJECT (self->playbin), "av-offset", value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -647,7 +783,7 @@
break;
case PROP_RATE:
g_mutex_lock (&self->lock);
- g_value_set_double (value, gst_player_get_rate (self));
+ g_value_set_double (value, self->rate);
g_mutex_unlock (&self->lock);
break;
case PROP_MUTE:
@@ -657,10 +793,22 @@
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);
+ case PROP_VIDEO_MULTIVIEW_MODE:{
+ g_object_get_property (G_OBJECT (self->playbin), "video-multiview-mode",
+ value);
+ GST_TRACE_OBJECT (self, "Return multiview mode=%d",
+ g_value_get_enum (value));
+ break;
+ }
+ case PROP_VIDEO_MULTIVIEW_FLAGS:{
+ g_object_get_property (G_OBJECT (self->playbin), "video-multiview-flags",
+ value);
+ GST_TRACE_OBJECT (self, "Return multiview flags=%x",
+ g_value_get_flags (value));
+ break;
+ }
+ case PROP_AUDIO_VIDEO_OFFSET:
+ g_object_get_property (G_OBJECT (self->playbin), "av-offset", value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -693,6 +841,10 @@
{
StateChangedSignalData *data = user_data;
+ if (data->player->inhibit_sigs && data->state != GST_PLAYER_STATE_STOPPED
+ && data->state != GST_PLAYER_STATE_PAUSED)
+ return;
+
g_signal_emit (data->player, signals[SIGNAL_STATE_CHANGED], 0, data->state);
}
@@ -737,6 +889,9 @@
{
PositionUpdatedSignalData *data = user_data;
+ if (data->player->inhibit_sigs)
+ return;
+
if (data->player->target_state >= GST_STATE_PAUSED) {
g_signal_emit (data->player, signals[SIGNAL_POSITION_UPDATED], 0,
data->position);
@@ -782,13 +937,17 @@
static void
add_tick_source (GstPlayer * self)
{
+ guint position_update_interval_ms;
+
if (self->tick_source)
return;
- if (!self->position_update_interval_ms)
+ position_update_interval_ms =
+ gst_player_config_get_position_update_interval (self->config);
+ if (!position_update_interval_ms)
return;
- self->tick_source = g_timeout_source_new (self->position_update_interval_ms);
+ self->tick_source = g_timeout_source_new (position_update_interval_ms);
g_source_set_callback (self->tick_source, (GSourceFunc) tick_cb, self, NULL);
g_source_attach (self->tick_source, self->context);
}
@@ -853,6 +1012,9 @@
{
ErrorSignalData *data = user_data;
+ if (data->player->inhibit_sigs)
+ return;
+
g_signal_emit (data->player, signals[SIGNAL_ERROR], 0, data->err);
}
@@ -939,6 +1101,9 @@
{
WarningSignalData *data = user_data;
+ if (data->player->inhibit_sigs)
+ return;
+
g_signal_emit (data->player, signals[SIGNAL_WARNING], 0, data->err);
}
@@ -1051,7 +1216,12 @@
static void
eos_dispatch (gpointer user_data)
{
- g_signal_emit (user_data, signals[SIGNAL_END_OF_STREAM], 0);
+ GstPlayer *player = user_data;
+
+ if (player->inhibit_sigs)
+ return;
+
+ g_signal_emit (player, signals[SIGNAL_END_OF_STREAM], 0);
}
static void
@@ -1086,6 +1256,9 @@
{
BufferingSignalData *data = user_data;
+ if (data->player->inhibit_sigs)
+ return;
+
if (data->player->target_state >= GST_STATE_PAUSED) {
g_signal_emit (data->player, signals[SIGNAL_BUFFERING], 0, data->percent);
}
@@ -1201,6 +1374,9 @@
{
VideoDimensionsChangedSignalData *data = user_data;
+ if (data->player->inhibit_sigs)
+ return;
+
if (data->player->target_state >= GST_STATE_PAUSED) {
g_signal_emit (data->player, signals[SIGNAL_VIDEO_DIMENSIONS_CHANGED], 0,
data->width, data->height);
@@ -1286,6 +1462,9 @@
{
DurationChangedSignalData *data = user_data;
+ if (data->player->inhibit_sigs)
+ return;
+
if (data->player->target_state >= GST_STATE_PAUSED) {
g_signal_emit (data->player, signals[SIGNAL_DURATION_CHANGED], 0,
data->duration);
@@ -1330,6 +1509,9 @@
{
SeekDoneSignalData *data = user_data;
+ if (data->player->inhibit_sigs)
+ return;
+
g_signal_emit (data->player, signals[SIGNAL_SEEK_DONE], 0, data->position);
}
@@ -1408,8 +1590,10 @@
}
check_video_dimensions_changed (self);
- gst_element_query_duration (self->playbin, GST_FORMAT_TIME, &duration);
- emit_duration_changed (self, duration);
+ if (gst_element_query_duration (self->playbin, GST_FORMAT_TIME,
+ &duration)) {
+ emit_duration_changed (self, duration);
+ }
}
if (new_state == GST_STATE_PAUSED
@@ -1548,14 +1732,7 @@
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_DEBUG_OBJECT (self, "received %s tags",
gst_tag_list_get_scope (tags) ==
GST_TAG_SCOPE_GLOBAL ? "global" : "stream");
@@ -1621,14 +1798,14 @@
/* Remember target state and restore after setting the URI */
target_state = self->target_state;
+ gst_player_stop_internal (self, TRUE);
+
g_mutex_lock (&self->lock);
- g_free (self->uri);
-
- self->uri = g_strdup (new_location);
+ g_free (self->redirect_uri);
+ self->redirect_uri = g_strdup (new_location);
+ g_object_set (self->playbin, "uri", self->redirect_uri, NULL);
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)
@@ -1672,6 +1849,9 @@
{
MediaInfoUpdatedSignalData *data = user_data;
+ if (data->player->inhibit_sigs)
+ return;
+
if (data->player->target_state >= GST_STATE_PAUSED) {
g_signal_emit (data->player, signals[SIGNAL_MEDIA_INFO_UPDATED], 0,
data->info);
@@ -2235,6 +2415,7 @@
media_info = gst_player_media_info_new (self->uri);
media_info->duration = gst_player_get_duration (self);
media_info->tags = self->global_tags;
+ media_info->is_live = self->is_live;
self->global_tags = NULL;
query = gst_query_new_seeking (GST_FORMAT_TIME);
@@ -2256,10 +2437,10 @@
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",
+ " seekable: %s live: %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);
+ media_info->seekable ? "yes" : "no", media_info->is_live ? "yes" : "no",
+ media_info->container, media_info->image_sample);
GST_DEBUG_OBJECT (self, "end");
return media_info;
@@ -2309,8 +2490,13 @@
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]);
+ GstPlayer *player = user_data;
+
+ if (player->inhibit_sigs)
+ return;
+
+ g_signal_emit (player, signals[SIGNAL_VOLUME_CHANGED], 0);
+ g_object_notify_by_pspec (G_OBJECT (player), param_specs[PROP_VOLUME]);
}
static void
@@ -2328,8 +2514,13 @@
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]);
+ GstPlayer *player = user_data;
+
+ if (player->inhibit_sigs)
+ return;
+
+ g_signal_emit (player, signals[SIGNAL_MUTE_CHANGED], 0);
+ g_object_notify_by_pspec (G_OBJECT (player), param_specs[PROP_MUTE]);
}
static void
@@ -2344,6 +2535,26 @@
}
}
+static void
+source_setup_cb (GstElement * playbin, GstElement * source, GstPlayer * self)
+{
+ gchar *user_agent;
+
+ user_agent = gst_player_config_get_user_agent (self->config);
+ if (user_agent) {
+ GParamSpec *prop;
+
+ prop = g_object_class_find_property (G_OBJECT_GET_CLASS (source),
+ "user-agent");
+ if (prop && prop->value_type == G_TYPE_STRING) {
+ GST_INFO_OBJECT (self, "Setting source user-agent: %s", user_agent);
+ g_object_set (source, "user-agent", user_agent, NULL);
+ }
+
+ g_free (user_agent);
+ }
+}
+
static gpointer
gst_player_main (gpointer data)
{
@@ -2376,14 +2587,7 @@
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");
- }
+ g_object_set (self->playbin, "audio-filter", scaletempo, NULL);
} else {
g_warning ("GstPlayer: scaletempo element not available. Audio pitch "
"will not be preserved during trick modes");
@@ -2433,6 +2637,8 @@
G_CALLBACK (volume_notify_cb), self);
g_signal_connect (self->playbin, "notify::mute",
G_CALLBACK (mute_notify_cb), self);
+ g_signal_connect (self->playbin, "source-setup",
+ G_CALLBACK (source_setup_cb), self);
self->target_state = GST_STATE_NULL;
self->current_state = GST_STATE_NULL;
@@ -2440,6 +2646,7 @@
self->buffering = 100;
self->is_eos = FALSE;
self->is_live = FALSE;
+ self->rate = 1.0;
GST_TRACE_OBJECT (self, "Starting main loop");
g_main_loop_run (self->loop);
@@ -2547,7 +2754,8 @@
change_state (self, GST_PLAYER_STATE_BUFFERING);
if (self->current_state >= GST_STATE_PAUSED && !self->is_eos
- && self->buffering >= 100) {
+ && self->buffering >= 100 && !(self->seek_position != GST_CLOCK_TIME_NONE
+ || self->seek_pending)) {
state_ret = gst_element_set_state (self->playbin, GST_STATE_PLAYING);
} else {
state_ret = gst_element_set_state (self->playbin, GST_STATE_PAUSED);
@@ -2577,7 +2785,7 @@
GST_SEEK_FLAG_FLUSH, 0);
if (!ret) {
GST_ERROR_OBJECT (self, "Seek to beginning failed");
- gst_player_stop_internal (self);
+ gst_player_stop_internal (self, TRUE);
gst_player_play_internal (self);
}
}
@@ -2596,6 +2804,10 @@
{
g_return_if_fail (GST_IS_PLAYER (self));
+ g_mutex_lock (&self->lock);
+ self->inhibit_sigs = FALSE;
+ g_mutex_unlock (&self->lock);
+
g_main_context_invoke_full (self->context, G_PRIORITY_DEFAULT,
gst_player_play_internal, self, NULL);
}
@@ -2644,7 +2856,7 @@
GST_SEEK_FLAG_FLUSH, 0);
if (!ret) {
GST_ERROR_OBJECT (self, "Seek to beginning failed");
- gst_player_stop_internal (self);
+ gst_player_stop_internal (self, TRUE);
gst_player_pause_internal (self);
}
}
@@ -2663,16 +2875,18 @@
{
g_return_if_fail (GST_IS_PLAYER (self));
+ g_mutex_lock (&self->lock);
+ self->inhibit_sigs = FALSE;
+ g_mutex_unlock (&self->lock);
+
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)
+static void
+gst_player_stop_internal (GstPlayer * self, gboolean transient)
{
- GstPlayer *self = GST_PLAYER (user_data);
-
- GST_DEBUG_OBJECT (self, "Stop");
+ GST_DEBUG_OBJECT (self, "Stop (transient %d)", transient);
tick_cb (self);
remove_tick_source (self);
@@ -2686,7 +2900,10 @@
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);
+ change_state (self, transient
+ && self->app_state !=
+ GST_PLAYER_STATE_STOPPED ? GST_PLAYER_STATE_BUFFERING :
+ GST_PLAYER_STATE_STOPPED);
self->buffering = 100;
g_mutex_lock (&self->lock);
if (self->media_info) {
@@ -2707,10 +2924,19 @@
self->last_seek_time = GST_CLOCK_TIME_NONE;
self->rate = 1.0;
g_mutex_unlock (&self->lock);
+}
+
+static gboolean
+gst_player_stop_internal_dispatch (gpointer user_data)
+{
+ GstPlayer *self = GST_PLAYER (user_data);
+
+ gst_player_stop_internal (self, FALSE);
return G_SOURCE_REMOVE;
}
+
/**
* gst_player_stop:
* @player: #GstPlayer instance
@@ -2723,8 +2949,12 @@
{
g_return_if_fail (GST_IS_PLAYER (self));
+ g_mutex_lock (&self->lock);
+ self->inhibit_sigs = TRUE;
+ g_mutex_unlock (&self->lock);
+
g_main_context_invoke_full (self->context, G_PRIORITY_DEFAULT,
- gst_player_stop_internal, self, NULL);
+ gst_player_stop_internal_dispatch, self, NULL);
}
/* Must be called with lock from main context, releases lock! */
@@ -2772,11 +3002,9 @@
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,
@@ -2809,34 +3037,6 @@
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
@@ -2850,11 +3050,7 @@
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);
+ g_object_set (self, "rate", rate, NULL);
}
/**
@@ -2866,62 +3062,13 @@
gdouble
gst_player_get_rate (GstPlayer * self)
{
+ gdouble val;
+
g_return_val_if_fail (GST_IS_PLAYER (self), DEFAULT_RATE);
- return self->rate;
-}
+ g_object_get (self, "rate", &val, NULL);
-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;
+ return val;
}
/**
@@ -3018,6 +3165,44 @@
}
/**
+ * gst_player_set_subtitle_uri:
+ * @player: #GstPlayer instance
+ * @uri: subtitle URI
+ *
+ * Returns: %TRUE or %FALSE
+ *
+ * Sets the external subtitle URI.
+ */
+void
+gst_player_set_subtitle_uri (GstPlayer * self, const gchar * suburi)
+{
+ g_return_if_fail (GST_IS_PLAYER (self));
+
+ g_object_set (self, "suburi", suburi, NULL);
+}
+
+/**
+ * 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_get_position:
* @player: #GstPlayer instance
*
@@ -3397,46 +3582,6 @@
}
/**
- * 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_object_set (self, "suburi", suburi, NULL);
-
- 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
@@ -3656,6 +3801,125 @@
(gdouble) channel->min_value);
}
+/**
+ * gst_player_get_multiview_mode:
+ * @player: #GstPlayer instance
+ *
+ * Retrieve the current value of the indicated @type.
+ *
+ * Returns: The current value of @type, Default: -1 "none"
+ *
+ * Since: 1.10
+ */
+GstVideoMultiviewMode
+gst_player_get_multiview_mode (GstPlayer * self)
+{
+ GstVideoMultiviewMode val = GST_VIDEO_MULTIVIEW_MODE_NONE;
+
+ g_return_val_if_fail (GST_IS_PLAYER (self), GST_VIDEO_MULTIVIEW_MODE_NONE);
+
+ g_object_get (self, "video-multiview-mode", &val, NULL);
+
+ return val;
+}
+
+/**
+ * gst_player_set_multiview_mode:
+ * @player: #GstPlayer instance
+ * @mode: The new value for the @type
+ *
+ * Sets the current value of the indicated mode @type to the passed
+ * value.
+ *
+ * Since: 1.10
+ */
+void
+gst_player_set_multiview_mode (GstPlayer * self, GstVideoMultiviewMode mode)
+{
+ g_return_if_fail (GST_IS_PLAYER (self));
+
+ g_object_set (self, "video-multiview-mode", mode, NULL);
+}
+
+/**
+ * gst_player_get_multiview_flags:
+ * @player: #GstPlayer instance
+ *
+ * Retrieve the current value of the indicated @type.
+ *
+ * Returns: The current value of @type, Default: 0x00000000 "none
+ *
+ * Since: 1.10
+ */
+GstVideoMultiviewFlags
+gst_player_get_multiview_flags (GstPlayer * self)
+{
+ GstVideoMultiviewFlags val = GST_VIDEO_MULTIVIEW_FLAGS_NONE;
+
+ g_return_val_if_fail (GST_IS_PLAYER (self), val);
+
+ g_object_get (self, "video-multiview-flags", &val, NULL);
+
+ return val;
+}
+
+/**
+ * gst_player_set_multiview_flags:
+ * @player: #GstPlayer instance
+ * @flags: The new value for the @type
+ *
+ * Sets the current value of the indicated mode @type to the passed
+ * value.
+ *
+ * Since: 1.10
+ */
+void
+gst_player_set_multiview_flags (GstPlayer * self, GstVideoMultiviewFlags flags)
+{
+ g_return_if_fail (GST_IS_PLAYER (self));
+
+ g_object_set (self, "video-multiview-flags", flags, NULL);
+}
+
+/**
+ * gst_player_get_audio_video_offset:
+ * @player: #GstPlayer instance
+ *
+ * Retrieve the current value of audio-video-offset property
+ *
+ * Returns: The current value of audio-video-offset in nanoseconds
+ *
+ * Since 1.10
+ */
+gint64
+gst_player_get_audio_video_offset (GstPlayer * self)
+{
+ gint64 val = 0;
+
+ g_return_val_if_fail (GST_IS_PLAYER (self), DEFAULT_AUDIO_VIDEO_OFFSET);
+
+ g_object_get (self, "audio-video-offset", &val, NULL);
+
+ return val;
+}
+
+/**
+ * gst_player_set_audio_video_offset:
+ * @player: #GstPlayer instance
+ * @offset: #gint64 in nanoseconds
+ *
+ * Sets audio-video-offset property by value of @offset
+ *
+ * Since 1.10
+ */
+void
+gst_player_set_audio_video_offset (GstPlayer * self, gint64 offset)
+{
+ g_return_if_fail (GST_IS_PLAYER (self));
+
+ g_object_set (self, "audio-video-offset", offset, NULL);
+}
+
#define C_ENUM(v) ((gint) v)
#define C_FLAGS(v) ((guint) v)
@@ -3784,3 +4048,156 @@
g_assert_not_reached ();
return NULL;
}
+
+/**
+ * gst_player_set_config:
+ * @player: #GstPlayer instance
+ * @config: (transfer full): a #GstStructure
+ *
+ * Set the configuration of the player. If the player is already configured, and
+ * the configuration haven't change, this function will return %TRUE. If the
+ * player is not in the GST_PLAYER_STATE_STOPPED, this method will return %FALSE
+ * and active configuration will remain.
+ *
+ * @config is a #GstStructure that contains the configuration parameters for
+ * the player.
+ *
+ * This function takes ownership of @config.
+ *
+ * Returns: %TRUE when the configuration could be set.
+ * Since 1.10
+ */
+gboolean
+gst_player_set_config (GstPlayer * self, GstStructure * config)
+{
+ g_return_val_if_fail (GST_IS_PLAYER (self), FALSE);
+ g_return_val_if_fail (config != NULL, FALSE);
+
+ g_mutex_lock (&self->lock);
+
+ if (self->app_state != GST_PLAYER_STATE_STOPPED) {
+ GST_INFO_OBJECT (self, "can't change config while player is %s",
+ gst_player_state_get_name (self->app_state));
+ g_mutex_unlock (&self->lock);
+ return FALSE;
+ }
+
+ if (self->config)
+ gst_structure_free (self->config);
+ self->config = config;
+ g_mutex_unlock (&self->lock);
+
+ return TRUE;
+}
+
+/**
+ * gst_player_get_config:
+ * @player: #GstPlayer instance
+ *
+ * Get a copy of the current configuration of the player. This configuration
+ * can either be modified and used for the gst_player_set_config() call
+ * or it must be freed after usage.
+ *
+ * Returns: (transfer full): a copy of the current configuration of @player. Use
+ * gst_structure_free() after usage or gst_player_set_config().
+ *
+ * Since 1.10
+ */
+GstStructure *
+gst_player_get_config (GstPlayer * self)
+{
+ GstStructure *ret;
+
+ g_return_val_if_fail (GST_IS_PLAYER (self), NULL);
+
+ g_mutex_lock (&self->lock);
+ ret = gst_structure_copy (self->config);
+ g_mutex_unlock (&self->lock);
+
+ return ret;
+}
+
+/**
+ * gst_player_config_set_user_agent:
+ * @config: a #GstPlayer configuration
+ * @agent: the string to use as user agent
+ *
+ * Set the user agent to pass to the server if @player needs to connect
+ * to a server during playback. This is typically used when playing HTTP
+ * or RTSP streams.
+ *
+ * Since 1.10
+ */
+void
+gst_player_config_set_user_agent (GstStructure * config, const gchar * agent)
+{
+ g_return_if_fail (config != NULL);
+ g_return_if_fail (agent != NULL);
+
+ gst_structure_id_set (config,
+ CONFIG_QUARK (USER_AGENT), G_TYPE_STRING, agent, NULL);
+}
+
+/**
+ * gst_player_config_get_user_agent:
+ * @config: a #GstPlayer configuration
+ *
+ * Return the user agent which has been configured using
+ * gst_player_config_set_user_agent() if any.
+ *
+ * Returns: (transfer full): the configured agent, or %NULL
+ * Since 1.10
+ */
+gchar *
+gst_player_config_get_user_agent (const GstStructure * config)
+{
+ gchar *agent = NULL;
+
+ g_return_val_if_fail (config != NULL, NULL);
+
+ gst_structure_id_get (config,
+ CONFIG_QUARK (USER_AGENT), G_TYPE_STRING, &agent, NULL);
+
+ return agent;
+}
+
+/**
+ * gst_player_config_set_position_update_interval:
+ * @config: a #GstPlayer configuration
+ * @interval: interval in ms
+ *
+ * set interval in milliseconds between two position-updated signals.
+ * pass 0 to stop updating the position.
+ * Since 1.10
+ */
+void
+gst_player_config_set_position_update_interval (GstStructure * config,
+ guint interval)
+{
+ g_return_if_fail (config != NULL);
+ g_return_if_fail (interval <= 10000);
+
+ gst_structure_id_set (config,
+ CONFIG_QUARK (POSITION_INTERVAL_UPDATE), G_TYPE_UINT, interval, NULL);
+}
+
+/**
+ * gst_player_config_get_position_update_interval:
+ * @config: a #GstPlayer configuration
+ *
+ * Returns: current position update interval in milliseconds
+ *
+ * Since 1.10
+ */
+guint
+gst_player_config_get_position_update_interval (const GstStructure * config)
+{
+ guint interval = DEFAULT_POSITION_UPDATE_INTERVAL_MS;
+
+ g_return_val_if_fail (config != NULL, DEFAULT_POSITION_UPDATE_INTERVAL_MS);
+
+ gst_structure_id_get (config,
+ CONFIG_QUARK (POSITION_INTERVAL_UPDATE), G_TYPE_UINT, &interval, NULL);
+
+ return interval;
+}
diff --git a/gst-libs/gst/player/gstplayer.h b/gst-libs/gst/player/gstplayer.h
index 3391b0f..0ac66be 100644
--- a/gst-libs/gst/player/gstplayer.h
+++ b/gst-libs/gst/player/gstplayer.h
@@ -22,6 +22,7 @@
#define __GST_PLAYER_H__
#include <gst/gst.h>
+#include <gst/video/video.h>
#include <gst/player/gstplayer-types.h>
#include <gst/player/gstplayer-signal-dispatcher.h>
#include <gst/player/gstplayer-video-renderer.h>
@@ -109,14 +110,14 @@
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);
+gchar * gst_player_get_subtitle_uri (GstPlayer * player);
+void gst_player_set_subtitle_uri (GstPlayer * player,
+ const gchar *uri);
+
GstClockTime gst_player_get_position (GstPlayer * player);
GstClockTime gst_player_get_duration (GstPlayer * player);
@@ -159,10 +160,6 @@
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);
@@ -178,6 +175,33 @@
gdouble gst_player_get_color_balance (GstPlayer * player,
GstPlayerColorBalanceType type);
+
+GstVideoMultiviewMode gst_player_get_multiview_mode (GstPlayer * player);
+void gst_player_set_multiview_mode (GstPlayer * player,
+ GstVideoMultiviewMode mode);
+
+GstVideoMultiviewFlags gst_player_get_multiview_flags (GstPlayer * player);
+void gst_player_set_multiview_flags (GstPlayer * player,
+ GstVideoMultiviewFlags flags);
+
+gint64 gst_player_get_audio_video_offset (GstPlayer * player);
+void gst_player_set_audio_video_offset (GstPlayer * player,
+ gint64 offset);
+
+gboolean gst_player_set_config (GstPlayer * player,
+ GstStructure * config);
+GstStructure * gst_player_get_config (GstPlayer * player);
+
+/* helpers for configuring the config structure */
+
+void gst_player_config_set_user_agent (GstStructure * config,
+ const gchar * agent);
+gchar * gst_player_config_get_user_agent (const GstStructure * config);
+
+void gst_player_config_set_position_update_interval (GstStructure * config,
+ guint interval);
+guint gst_player_config_get_position_update_interval (const GstStructure * config);
+
G_END_DECLS
#endif /* __GST_PLAYER_H__ */
diff --git a/gst-libs/gst/uridownloader/Makefile.in b/gst-libs/gst/uridownloader/Makefile.in
index daf72b3..7747e94 100644
--- a/gst-libs/gst/uridownloader/Makefile.in
+++ b/gst-libs/gst/uridownloader/Makefile.in
@@ -290,6 +290,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -311,6 +313,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -360,6 +364,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -505,6 +511,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -631,8 +639,6 @@
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@
@@ -675,8 +681,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst-libs/gst/uridownloader/gsturidownloader.c b/gst-libs/gst/uridownloader/gsturidownloader.c
index 72e5e79..47b6f29 100644
--- a/gst-libs/gst/uridownloader/gsturidownloader.c
+++ b/gst-libs/gst/uridownloader/gsturidownloader.c
@@ -58,6 +58,10 @@
static GstBusSyncReply gst_uri_downloader_bus_handler (GstBus * bus,
GstMessage * message, gpointer data);
+static gboolean gst_uri_downloader_ensure_src (GstUriDownloader * downloader,
+ const gchar * uri);
+static void gst_uri_downloader_destroy_src (GstUriDownloader * downloader);
+
static GstStaticPadTemplate sinkpadtemplate = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
@@ -112,11 +116,7 @@
{
GstUriDownloader *downloader = GST_URI_DOWNLOADER (object);
- if (downloader->priv->urisrc != NULL) {
- gst_element_set_state (downloader->priv->urisrc, GST_STATE_NULL);
- gst_object_unref (downloader->priv->urisrc);
- downloader->priv->urisrc = NULL;
- }
+ gst_uri_downloader_destroy_src (downloader);
if (downloader->priv->bus != NULL) {
gst_object_unref (downloader->priv->bus);
@@ -347,16 +347,8 @@
}
static gboolean
-gst_uri_downloader_set_uri (GstUriDownloader * downloader, const gchar * uri,
- const gchar * referer, gboolean compress, gboolean refresh,
- gboolean allow_cache)
+gst_uri_downloader_ensure_src (GstUriDownloader * downloader, const gchar * uri)
{
- GstPad *pad;
- GObjectClass *gobject_class;
-
- if (!gst_uri_is_valid (uri))
- return FALSE;
-
if (downloader->priv->urisrc) {
gchar *old_protocol, *new_protocol;
gchar *old_uri;
@@ -367,22 +359,18 @@
new_protocol = gst_uri_get_protocol (uri);
if (!g_str_equal (old_protocol, new_protocol)) {
- gst_element_set_state (downloader->priv->urisrc, GST_STATE_NULL);
- gst_object_unref (downloader->priv->urisrc);
- downloader->priv->urisrc = NULL;
+ gst_uri_downloader_destroy_src (downloader);
GST_DEBUG_OBJECT (downloader, "Can't re-use old source element");
} else {
GError *err = NULL;
GST_DEBUG_OBJECT (downloader, "Re-using old source element");
- if (!gst_uri_handler_set_uri (GST_URI_HANDLER (downloader->priv->urisrc),
- uri, &err)) {
- GST_DEBUG_OBJECT (downloader, "Failed to re-use old source element: %s",
- err->message);
+ if (!gst_uri_handler_set_uri
+ (GST_URI_HANDLER (downloader->priv->urisrc), uri, &err)) {
+ GST_DEBUG_OBJECT (downloader,
+ "Failed to re-use old source element: %s", err->message);
g_clear_error (&err);
- gst_element_set_state (downloader->priv->urisrc, GST_STATE_NULL);
- gst_object_unref (downloader->priv->urisrc);
- downloader->priv->urisrc = NULL;
+ gst_uri_downloader_destroy_src (downloader);
}
}
g_free (old_uri);
@@ -395,10 +383,43 @@
uri);
downloader->priv->urisrc =
gst_element_make_from_uri (GST_URI_SRC, uri, NULL, NULL);
- if (!downloader->priv->urisrc)
- return FALSE;
+ if (downloader->priv->urisrc) {
+ /* gst_element_make_from_uri returns a floating reference
+ * and we are not going to transfer the ownership, so we
+ * should take it.
+ */
+ gst_object_ref_sink (downloader->priv->urisrc);
+ }
}
+ return downloader->priv->urisrc != NULL;
+}
+
+static void
+gst_uri_downloader_destroy_src (GstUriDownloader * downloader)
+{
+ if (!downloader->priv->urisrc)
+ return;
+
+ gst_element_set_state (downloader->priv->urisrc, GST_STATE_NULL);
+ gst_object_unref (downloader->priv->urisrc);
+ downloader->priv->urisrc = NULL;
+}
+
+static gboolean
+gst_uri_downloader_set_uri (GstUriDownloader * downloader, const gchar * uri,
+ const gchar * referer, gboolean compress,
+ gboolean refresh, gboolean allow_cache)
+{
+ GstPad *pad;
+ GObjectClass *gobject_class;
+
+ if (!gst_uri_is_valid (uri))
+ return FALSE;
+
+ if (!gst_uri_downloader_ensure_src (downloader, uri))
+ return FALSE;
+
gobject_class = G_OBJECT_GET_CLASS (downloader->priv->urisrc);
if (g_object_class_find_property (gobject_class, "compress"))
g_object_set (downloader->priv->urisrc, "compress", compress, NULL);
diff --git a/gst-libs/gst/video/Makefile.in b/gst-libs/gst/video/Makefile.in
index 6fb5acd..24b7fc8 100644
--- a/gst-libs/gst/video/Makefile.in
+++ b/gst-libs/gst/video/Makefile.in
@@ -294,6 +294,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -315,6 +317,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -364,6 +368,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -509,6 +515,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -635,8 +643,6 @@
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@
@@ -679,8 +685,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst-libs/gst/video/gstvideoaggregator.c b/gst-libs/gst/video/gstvideoaggregator.c
index 1254e2e..cd42d7e 100644
--- a/gst-libs/gst/video/gstvideoaggregator.c
+++ b/gst-libs/gst/video/gstvideoaggregator.c
@@ -43,11 +43,11 @@
#include "gstvideoaggregator.h"
#include "gstvideoaggregatorpad.h"
-GST_DEBUG_CATEGORY_STATIC (gst_videoaggregator_debug);
-#define GST_CAT_DEFAULT gst_videoaggregator_debug
+GST_DEBUG_CATEGORY_STATIC (gst_video_aggregator_debug);
+#define GST_CAT_DEFAULT gst_video_aggregator_debug
/* Needed prototypes */
-static void gst_videoaggregator_reset_qos (GstVideoAggregator * vagg);
+static void gst_video_aggregator_reset_qos (GstVideoAggregator * vagg);
/****************************************
* GstVideoAggregatorPad implementation *
@@ -77,11 +77,11 @@
};
-G_DEFINE_TYPE (GstVideoAggregatorPad, gst_videoaggregator_pad,
+G_DEFINE_TYPE (GstVideoAggregatorPad, gst_video_aggregator_pad,
GST_TYPE_AGGREGATOR_PAD);
static void
-gst_videoaggregator_pad_get_property (GObject * object, guint prop_id,
+gst_video_aggregator_pad_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec)
{
GstVideoAggregatorPad *pad = GST_VIDEO_AGGREGATOR_PAD (object);
@@ -107,7 +107,7 @@
}
static void
-gst_videoaggregator_pad_set_property (GObject * object, guint prop_id,
+gst_video_aggregator_pad_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
{
GstVideoAggregatorPad *pad = GST_VIDEO_AGGREGATOR_PAD (object);
@@ -133,18 +133,18 @@
gst_object_unref (vagg);
}
-static gboolean
+static GstFlowReturn
_flush_pad (GstAggregatorPad * aggpad, GstAggregator * aggregator)
{
GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (aggregator);
GstVideoAggregatorPad *pad = GST_VIDEO_AGGREGATOR_PAD (aggpad);
- gst_videoaggregator_reset_qos (vagg);
+ gst_video_aggregator_reset_qos (vagg);
gst_buffer_replace (&pad->buffer, NULL);
pad->priv->start_time = -1;
pad->priv->end_time = -1;
- return TRUE;
+ return GST_FLOW_OK;
}
static gboolean
@@ -217,7 +217,7 @@
}
static void
-gst_videoaggregator_pad_finalize (GObject * o)
+gst_video_aggregator_pad_finalize (GObject * o)
{
GstVideoAggregatorPad *vaggpad = GST_VIDEO_AGGREGATOR_PAD (o);
@@ -225,7 +225,7 @@
gst_video_converter_free (vaggpad->priv->convert);
vaggpad->priv->convert = NULL;
- G_OBJECT_CLASS (gst_videoaggregator_pad_parent_class)->finalize (o);
+ G_OBJECT_CLASS (gst_video_aggregator_pad_parent_class)->finalize (o);
}
static gboolean
@@ -300,14 +300,14 @@
}
static void
-gst_videoaggregator_pad_class_init (GstVideoAggregatorPadClass * klass)
+gst_video_aggregator_pad_class_init (GstVideoAggregatorPadClass * klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GstAggregatorPadClass *aggpadclass = (GstAggregatorPadClass *) klass;
- gobject_class->set_property = gst_videoaggregator_pad_set_property;
- gobject_class->get_property = gst_videoaggregator_pad_get_property;
- gobject_class->finalize = gst_videoaggregator_pad_finalize;
+ gobject_class->set_property = gst_video_aggregator_pad_set_property;
+ gobject_class->get_property = gst_video_aggregator_pad_get_property;
+ gobject_class->finalize = gst_video_aggregator_pad_finalize;
g_object_class_install_property (gobject_class, PROP_PAD_ZORDER,
g_param_spec_uint ("zorder", "Z-Order", "Z Order of the picture",
@@ -329,7 +329,7 @@
}
static void
-gst_videoaggregator_pad_init (GstVideoAggregatorPad * vaggpad)
+gst_video_aggregator_pad_init (GstVideoAggregatorPad * vaggpad)
{
vaggpad->priv =
G_TYPE_INSTANCE_GET_PRIVATE (vaggpad, GST_TYPE_VIDEO_AGGREGATOR_PAD,
@@ -347,8 +347,8 @@
* GstChildProxy implementation *
*********************************/
static GObject *
-gst_videoaggregator_child_proxy_get_child_by_index (GstChildProxy * child_proxy,
- guint index)
+gst_video_aggregator_child_proxy_get_child_by_index (GstChildProxy *
+ child_proxy, guint index)
{
GObject *obj;
GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (child_proxy);
@@ -362,7 +362,8 @@
}
static guint
-gst_videoaggregator_child_proxy_get_children_count (GstChildProxy * child_proxy)
+gst_video_aggregator_child_proxy_get_children_count (GstChildProxy *
+ child_proxy)
{
guint count = 0;
@@ -376,15 +377,15 @@
}
static void
-gst_videoaggregator_child_proxy_init (gpointer g_iface, gpointer iface_data)
+gst_video_aggregator_child_proxy_init (gpointer g_iface, gpointer iface_data)
{
GstChildProxyInterface *iface = g_iface;
GST_INFO ("intializing child proxy interface");
iface->get_child_by_index =
- gst_videoaggregator_child_proxy_get_child_by_index;
+ gst_video_aggregator_child_proxy_get_child_by_index;
iface->get_children_count =
- gst_videoaggregator_child_proxy_get_children_count;
+ gst_video_aggregator_child_proxy_get_children_count;
}
/**************************************
@@ -434,13 +435,13 @@
* videoaggregator class in the _init to be able to set
* the sink pad non-alpha caps. Using the G_DEFINE_TYPE there
* seems to be no way of getting the real class being initialized */
-static void gst_videoaggregator_init (GstVideoAggregator * self,
+static void gst_video_aggregator_init (GstVideoAggregator * self,
GstVideoAggregatorClass * klass);
-static void gst_videoaggregator_class_init (GstVideoAggregatorClass * klass);
-static gpointer gst_videoaggregator_parent_class = NULL;
+static void gst_video_aggregator_class_init (GstVideoAggregatorClass * klass);
+static gpointer gst_video_aggregator_parent_class = NULL;
GType
-gst_videoaggregator_get_type (void)
+gst_video_aggregator_get_type (void)
{
static volatile gsize g_define_type_id_volatile = 0;
@@ -448,13 +449,13 @@
GType g_define_type_id = g_type_register_static_simple (GST_TYPE_AGGREGATOR,
g_intern_static_string ("GstVideoAggregator"),
sizeof (GstVideoAggregatorClass),
- (GClassInitFunc) gst_videoaggregator_class_init,
+ (GClassInitFunc) gst_video_aggregator_class_init,
sizeof (GstVideoAggregator),
- (GInstanceInitFunc) gst_videoaggregator_init,
+ (GInstanceInitFunc) gst_video_aggregator_init,
(GTypeFlags) G_TYPE_FLAG_ABSTRACT);
{
G_IMPLEMENT_INTERFACE (GST_TYPE_CHILD_PROXY,
- gst_videoaggregator_child_proxy_init);
+ gst_video_aggregator_child_proxy_init);
}
g_once_init_leave (&g_define_type_id_volatile, g_define_type_id);
}
@@ -462,7 +463,7 @@
}
static void
-gst_videoaggreagator_find_best_format (GstVideoAggregator * vagg,
+gst_video_aggregator_find_best_format (GstVideoAggregator * vagg,
GstCaps * downstream_caps, GstVideoInfo * best_info,
gboolean * at_least_one_alpha)
{
@@ -534,7 +535,7 @@
/* WITH GST_VIDEO_AGGREGATOR_LOCK TAKEN */
static gboolean
-gst_videoaggregator_src_setcaps (GstVideoAggregator * vagg, GstCaps * caps)
+gst_video_aggregator_src_setcaps (GstVideoAggregator * vagg, GstCaps * caps)
{
GstAggregator *agg = GST_AGGREGATOR (vagg);
gboolean ret = FALSE;
@@ -558,7 +559,7 @@
GST_DEBUG_OBJECT (vagg,
"Resetting frame counter because of framerate change");
}
- gst_videoaggregator_reset_qos (vagg);
+ gst_video_aggregator_reset_qos (vagg);
}
vagg->info = info;
@@ -583,7 +584,7 @@
}
static GstCaps *
-gst_videoaggregator_default_fixate_caps (GstVideoAggregator * vagg,
+gst_video_aggregator_default_fixate_caps (GstVideoAggregator * vagg,
GstCaps * caps)
{
gint best_width = -1, best_height = -1;
@@ -644,7 +645,7 @@
}
static GstCaps *
-gst_videoaggregator_default_update_caps (GstVideoAggregator * vagg,
+gst_video_aggregator_default_update_caps (GstVideoAggregator * vagg,
GstCaps * caps, GstCaps * filter)
{
GstVideoAggregatorClass *vagg_klass = GST_VIDEO_AGGREGATOR_GET_CLASS (vagg);
@@ -680,9 +681,10 @@
ret = gst_caps_merge (best_format_caps, gst_caps_ref (caps));
if (filter) {
- ret = gst_caps_intersect (ret, filter);
- } else {
- gst_caps_ref (ret);
+ GstCaps *tmp;
+ tmp = gst_caps_intersect (ret, filter);
+ gst_caps_unref (ret);
+ ret = tmp;
}
return ret;
@@ -690,7 +692,7 @@
/* WITH GST_VIDEO_AGGREGATOR_LOCK TAKEN */
static gboolean
-gst_videoaggregator_update_src_caps (GstVideoAggregator * vagg)
+gst_video_aggregator_update_src_caps (GstVideoAggregator * vagg)
{
GstVideoAggregatorClass *vagg_klass = GST_VIDEO_AGGREGATOR_GET_CLASS (vagg);
GstVideoAggregatorPadClass *vaggpad_klass = g_type_class_peek
@@ -735,7 +737,8 @@
GST_DEBUG_OBJECT (vagg, "updating caps from %" GST_PTR_FORMAT,
downstream_caps);
GST_DEBUG_OBJECT (vagg, " with filter %" GST_PTR_FORMAT, peercaps);
- if (!(caps = vagg_klass->update_caps (vagg, downstream_caps, peercaps))) {
+ if (!(caps = vagg_klass->update_caps (vagg, downstream_caps, peercaps)) ||
+ gst_caps_is_empty (caps)) {
GST_WARNING_OBJECT (vagg, "Subclass failed to update provided caps");
gst_caps_unref (downstream_caps);
if (peercaps)
@@ -800,7 +803,7 @@
}
}
- if (gst_videoaggregator_src_setcaps (vagg, caps)) {
+ if (gst_video_aggregator_src_setcaps (vagg, caps)) {
if (vagg_klass->negotiated_caps)
ret =
GST_VIDEO_AGGREGATOR_GET_CLASS (vagg)->negotiated_caps (vagg, caps);
@@ -820,7 +823,27 @@
}
static gboolean
-gst_videoaggregator_pad_sink_setcaps (GstPad * pad, GstObject * parent,
+gst_video_aggregator_get_sinkpads_interlace_mode (GstVideoAggregator * vagg,
+ GstVideoAggregatorPad * skip_pad, GstVideoInterlaceMode * mode)
+{
+ GList *walk;
+
+ for (walk = GST_ELEMENT (vagg)->sinkpads; walk; walk = g_list_next (walk)) {
+ GstVideoAggregatorPad *vaggpad = walk->data;
+
+ if (skip_pad && vaggpad == skip_pad)
+ continue;
+ if (vaggpad->info.finfo
+ && GST_VIDEO_INFO_FORMAT (&vaggpad->info) != GST_VIDEO_FORMAT_UNKNOWN) {
+ *mode = GST_VIDEO_INFO_INTERLACE_MODE (&vaggpad->info);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static gboolean
+gst_video_aggregator_pad_sink_setcaps (GstPad * pad, GstObject * parent,
GstCaps * caps)
{
GstVideoAggregator *vagg;
@@ -839,14 +862,28 @@
}
GST_VIDEO_AGGREGATOR_LOCK (vagg);
- if (GST_VIDEO_INFO_FORMAT (&vagg->info) != GST_VIDEO_FORMAT_UNKNOWN) {
- if (GST_VIDEO_INFO_INTERLACE_MODE (&vagg->info) !=
- GST_VIDEO_INFO_INTERLACE_MODE (&info)) {
- GST_ERROR_OBJECT (pad,
- "got input caps %" GST_PTR_FORMAT ", but " "current caps are %"
- GST_PTR_FORMAT, caps, vagg->priv->current_caps);
- GST_VIDEO_AGGREGATOR_UNLOCK (vagg);
- return FALSE;
+ {
+ GstVideoInterlaceMode pads_mode = GST_VIDEO_INTERLACE_MODE_PROGRESSIVE;
+ gboolean has_mode = FALSE;
+
+ /* get the current output setting or fallback to other pads settings */
+ if (GST_VIDEO_INFO_FORMAT (&vagg->info) != GST_VIDEO_FORMAT_UNKNOWN) {
+ pads_mode = GST_VIDEO_INFO_INTERLACE_MODE (&vagg->info);
+ has_mode = TRUE;
+ } else {
+ has_mode =
+ gst_video_aggregator_get_sinkpads_interlace_mode (vagg, vaggpad,
+ &pads_mode);
+ }
+
+ if (has_mode) {
+ if (pads_mode != GST_VIDEO_INFO_INTERLACE_MODE (&info)) {
+ GST_ERROR_OBJECT (pad,
+ "got input caps %" GST_PTR_FORMAT ", but current caps are %"
+ GST_PTR_FORMAT, caps, vagg->priv->current_caps);
+ GST_VIDEO_AGGREGATOR_UNLOCK (vagg);
+ return FALSE;
+ }
}
}
@@ -861,7 +898,7 @@
}
static gboolean
-gst_videoaggregator_caps_has_alpha (GstCaps * caps)
+gst_video_aggregator_caps_has_alpha (GstCaps * caps)
{
guint size = gst_caps_get_size (caps);
guint i;
@@ -907,7 +944,7 @@
}
static GstCaps *
-gst_videoaggregator_pad_sink_getcaps (GstPad * pad, GstVideoAggregator * vagg,
+gst_video_aggregator_pad_sink_getcaps (GstPad * pad, GstVideoAggregator * vagg,
GstCaps * filter)
{
GstCaps *srccaps;
@@ -918,6 +955,8 @@
GstAggregator *agg = GST_AGGREGATOR (vagg);
GstPad *srcpad = GST_PAD (agg->srcpad);
gboolean has_alpha;
+ GstVideoInterlaceMode interlace_mode;
+ gboolean has_interlace_mode;
template_caps = gst_pad_get_pad_template_caps (srcpad);
@@ -925,7 +964,11 @@
srccaps = gst_pad_peer_query_caps (srcpad, template_caps);
srccaps = gst_caps_make_writable (srccaps);
- has_alpha = gst_videoaggregator_caps_has_alpha (srccaps);
+ has_alpha = gst_video_aggregator_caps_has_alpha (srccaps);
+
+ has_interlace_mode =
+ gst_video_aggregator_get_sinkpads_interlace_mode (vagg, NULL,
+ &interlace_mode);
n = gst_caps_get_size (srccaps);
for (i = 0; i < n; i++) {
@@ -936,6 +979,9 @@
gst_structure_remove_fields (s, "colorimetry", "chroma-site", "format",
"pixel-aspect-ratio", NULL);
+ if (has_interlace_mode)
+ gst_structure_set (s, "interlace-mode", G_TYPE_STRING,
+ gst_video_interlace_mode_to_string (interlace_mode), NULL);
}
if (filter) {
@@ -967,7 +1013,7 @@
}
static void
-gst_videoaggregator_update_qos (GstVideoAggregator * vagg, gdouble proportion,
+gst_video_aggregator_update_qos (GstVideoAggregator * vagg, gdouble proportion,
GstClockTimeDiff diff, GstClockTime timestamp)
{
gboolean live;
@@ -999,14 +1045,14 @@
}
static void
-gst_videoaggregator_reset_qos (GstVideoAggregator * vagg)
+gst_video_aggregator_reset_qos (GstVideoAggregator * vagg)
{
- gst_videoaggregator_update_qos (vagg, 0.5, 0, GST_CLOCK_TIME_NONE);
+ gst_video_aggregator_update_qos (vagg, 0.5, 0, GST_CLOCK_TIME_NONE);
vagg->priv->qos_processed = vagg->priv->qos_dropped = 0;
}
static void
-gst_videoaggregator_read_qos (GstVideoAggregator * vagg, gdouble * proportion,
+gst_video_aggregator_read_qos (GstVideoAggregator * vagg, gdouble * proportion,
GstClockTime * time)
{
GST_OBJECT_LOCK (vagg);
@@ -1016,7 +1062,7 @@
}
static void
-gst_videoaggregator_reset (GstVideoAggregator * vagg)
+gst_video_aggregator_reset (GstVideoAggregator * vagg)
{
GstAggregator *agg = GST_AGGREGATOR (vagg);
GList *l;
@@ -1028,7 +1074,7 @@
agg->segment.position = -1;
- gst_videoaggregator_reset_qos (vagg);
+ gst_video_aggregator_reset_qos (vagg);
GST_OBJECT_LOCK (vagg);
for (l = GST_ELEMENT (vagg)->sinkpads; l; l = l->next) {
@@ -1045,7 +1091,7 @@
#define GST_FLOW_NEEDS_DATA GST_FLOW_CUSTOM_ERROR
static gint
-gst_videoaggregator_fill_queues (GstVideoAggregator * vagg,
+gst_video_aggregator_fill_queues (GstVideoAggregator * vagg,
GstClockTime output_start_running_time,
GstClockTime output_end_running_time)
{
@@ -1286,7 +1332,7 @@
}
static GstFlowReturn
-gst_videoaggregator_do_aggregate (GstVideoAggregator * vagg,
+gst_video_aggregator_do_aggregate (GstVideoAggregator * vagg,
GstClockTime output_start_time, GstClockTime output_end_time,
GstBuffer ** outbuf)
{
@@ -1333,7 +1379,7 @@
/* Perform qos calculations before processing the next frame. Returns TRUE if
* the frame should be processed, FALSE if the frame can be dropped entirely */
static gint64
-gst_videoaggregator_do_qos (GstVideoAggregator * vagg, GstClockTime timestamp)
+gst_video_aggregator_do_qos (GstVideoAggregator * vagg, GstClockTime timestamp)
{
GstAggregator *agg = GST_AGGREGATOR (vagg);
GstClockTime qostime, earliest_time;
@@ -1347,7 +1393,7 @@
}
/* get latest QoS observation values */
- gst_videoaggregator_read_qos (vagg, &proportion, &earliest_time);
+ gst_video_aggregator_read_qos (vagg, &proportion, &earliest_time);
/* skip qos if we have no observation (yet) => process frame */
if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (earliest_time))) {
@@ -1374,7 +1420,7 @@
}
static GstClockTime
-gst_videoaggregator_get_next_time (GstAggregator * agg)
+gst_video_aggregator_get_next_time (GstAggregator * agg)
{
GstClockTime next_time;
@@ -1395,7 +1441,7 @@
}
static GstFlowReturn
-gst_videoaggregator_check_reconfigure (GstVideoAggregator * vagg,
+gst_video_aggregator_check_reconfigure (GstVideoAggregator * vagg,
gboolean timeout)
{
GstAggregator *agg = (GstAggregator *) vagg;
@@ -1404,7 +1450,7 @@
|| gst_pad_check_reconfigure (GST_AGGREGATOR_SRC_PAD (vagg))) {
gboolean ret;
- ret = gst_videoaggregator_update_src_caps (vagg);
+ ret = gst_video_aggregator_update_src_caps (vagg);
if (!ret) {
if (timeout && gst_pad_needs_reconfigure (GST_AGGREGATOR_SRC_PAD (vagg))) {
guint64 frame_duration;
@@ -1445,7 +1491,7 @@
}
static GstFlowReturn
-gst_videoaggregator_aggregate (GstAggregator * agg, gboolean timeout)
+gst_video_aggregator_aggregate (GstAggregator * agg, gboolean timeout)
{
GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (agg);
GstClockTime output_start_time, output_end_time;
@@ -1456,7 +1502,7 @@
GST_VIDEO_AGGREGATOR_LOCK (vagg);
- flow_ret = gst_videoaggregator_check_reconfigure (vagg, timeout);
+ flow_ret = gst_video_aggregator_check_reconfigure (vagg, timeout);
if (flow_ret != GST_FLOW_OK) {
if (flow_ret == GST_FLOW_NEEDS_DATA)
flow_ret = GST_FLOW_OK;
@@ -1497,7 +1543,7 @@
flow_ret = GST_FLOW_EOS;
} else {
flow_ret =
- gst_videoaggregator_fill_queues (vagg, output_start_running_time,
+ gst_video_aggregator_fill_queues (vagg, output_start_running_time,
output_end_running_time);
}
@@ -1521,9 +1567,9 @@
GST_TIME_ARGS (output_start_running_time),
GST_TIME_ARGS (output_end_running_time));
- jitter = gst_videoaggregator_do_qos (vagg, output_start_time);
+ jitter = gst_video_aggregator_do_qos (vagg, output_start_time);
if (jitter <= 0) {
- flow_ret = gst_videoaggregator_do_aggregate (vagg, output_start_time,
+ flow_ret = gst_video_aggregator_do_aggregate (vagg, output_start_time,
output_end_time, &outbuf);
if (flow_ret != GST_FLOW_OK)
goto done;
@@ -1588,7 +1634,8 @@
* cases work at least somewhat.
*/
static gboolean
-gst_videoaggregator_query_duration (GstVideoAggregator * vagg, GstQuery * query)
+gst_video_aggregator_query_duration (GstVideoAggregator * vagg,
+ GstQuery * query)
{
GValue item = { 0 };
gint64 max;
@@ -1659,7 +1706,7 @@
}
static gboolean
-gst_videoaggregator_src_query (GstAggregator * agg, GstQuery * query)
+gst_video_aggregator_src_query (GstAggregator * agg, GstQuery * query)
{
GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (agg);
gboolean res = FALSE;
@@ -1684,11 +1731,11 @@
break;
}
case GST_QUERY_DURATION:
- res = gst_videoaggregator_query_duration (vagg, query);
+ res = gst_video_aggregator_query_duration (vagg, query);
break;
case GST_QUERY_LATENCY:
res =
- GST_AGGREGATOR_CLASS (gst_videoaggregator_parent_class)->src_query
+ GST_AGGREGATOR_CLASS (gst_video_aggregator_parent_class)->src_query
(agg, query);
if (res) {
@@ -1697,7 +1744,7 @@
break;
default:
res =
- GST_AGGREGATOR_CLASS (gst_videoaggregator_parent_class)->src_query
+ GST_AGGREGATOR_CLASS (gst_video_aggregator_parent_class)->src_query
(agg, query);
break;
}
@@ -1705,7 +1752,7 @@
}
static gboolean
-gst_videoaggregator_src_event (GstAggregator * agg, GstEvent * event)
+gst_video_aggregator_src_event (GstAggregator * agg, GstEvent * event)
{
GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (agg);
@@ -1718,7 +1765,7 @@
gdouble proportion;
gst_event_parse_qos (event, &type, &proportion, &diff, ×tamp);
- gst_videoaggregator_update_qos (vagg, proportion, diff, timestamp);
+ gst_video_aggregator_update_qos (vagg, proportion, diff, timestamp);
break;
}
case GST_EVENT_SEEK:
@@ -1730,12 +1777,12 @@
}
return
- GST_AGGREGATOR_CLASS (gst_videoaggregator_parent_class)->src_event (agg,
+ GST_AGGREGATOR_CLASS (gst_video_aggregator_parent_class)->src_event (agg,
event);
}
static GstFlowReturn
-gst_videoaggregator_flush (GstAggregator * agg)
+gst_video_aggregator_flush (GstAggregator * agg)
{
GList *l;
gdouble abs_rate;
@@ -1765,12 +1812,12 @@
vagg->priv->ts_offset = 0;
vagg->priv->nframes = 0;
- gst_videoaggregator_reset_qos (vagg);
+ gst_video_aggregator_reset_qos (vagg);
return GST_FLOW_OK;
}
static gboolean
-gst_videoaggregator_sink_event (GstAggregator * agg, GstAggregatorPad * bpad,
+gst_video_aggregator_sink_event (GstAggregator * agg, GstAggregatorPad * bpad,
GstEvent * event)
{
GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (agg);
@@ -1787,7 +1834,7 @@
gst_event_parse_caps (event, &caps);
ret =
- gst_videoaggregator_pad_sink_setcaps (GST_PAD (pad),
+ gst_video_aggregator_pad_sink_setcaps (GST_PAD (pad),
GST_OBJECT (vagg), caps);
gst_event_unref (event);
event = NULL;
@@ -1798,7 +1845,7 @@
gst_event_copy_segment (event, &seg);
g_assert (seg.format == GST_FORMAT_TIME);
- gst_videoaggregator_reset_qos (vagg);
+ gst_video_aggregator_reset_qos (vagg);
break;
}
default:
@@ -1806,14 +1853,14 @@
}
if (event != NULL)
- return GST_AGGREGATOR_CLASS (gst_videoaggregator_parent_class)->sink_event
+ return GST_AGGREGATOR_CLASS (gst_video_aggregator_parent_class)->sink_event
(agg, bpad, event);
return ret;
}
static gboolean
-gst_videoaggregator_start (GstAggregator * agg)
+gst_video_aggregator_start (GstAggregator * agg)
{
GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (agg);
@@ -1823,18 +1870,18 @@
}
static gboolean
-gst_videoaggregator_stop (GstAggregator * agg)
+gst_video_aggregator_stop (GstAggregator * agg)
{
GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (agg);
- gst_videoaggregator_reset (vagg);
+ gst_video_aggregator_reset (vagg);
return TRUE;
}
/* GstElement vmethods */
static GstPad *
-gst_videoaggregator_request_new_pad (GstElement * element,
+gst_video_aggregator_request_new_pad (GstElement * element,
GstPadTemplate * templ, const gchar * req_name, const GstCaps * caps)
{
GstVideoAggregator *vagg;
@@ -1843,7 +1890,7 @@
vagg = GST_VIDEO_AGGREGATOR (element);
vaggpad = (GstVideoAggregatorPad *)
- GST_ELEMENT_CLASS (gst_videoaggregator_parent_class)->request_new_pad
+ GST_ELEMENT_CLASS (gst_video_aggregator_parent_class)->request_new_pad
(element, templ, req_name, caps);
if (vaggpad == NULL)
@@ -1864,7 +1911,7 @@
}
static void
-gst_videoaggregator_release_pad (GstElement * element, GstPad * pad)
+gst_video_aggregator_release_pad (GstElement * element, GstPad * pad)
{
GstVideoAggregator *vagg = NULL;
GstVideoAggregatorPad *vaggpad;
@@ -1880,15 +1927,15 @@
GST_OBJECT_UNLOCK (vagg);
if (last_pad)
- gst_videoaggregator_reset (vagg);
+ gst_video_aggregator_reset (vagg);
gst_buffer_replace (&vaggpad->buffer, NULL);
gst_child_proxy_child_removed (GST_CHILD_PROXY (vagg), G_OBJECT (vaggpad),
GST_OBJECT_NAME (vaggpad));
- GST_ELEMENT_CLASS (gst_videoaggregator_parent_class)->release_pad (GST_ELEMENT
- (vagg), pad);
+ GST_ELEMENT_CLASS (gst_video_aggregator_parent_class)->release_pad
+ (GST_ELEMENT (vagg), pad);
gst_pad_mark_reconfigure (GST_AGGREGATOR_SRC_PAD (vagg));
@@ -1897,7 +1944,7 @@
}
static GstFlowReturn
-gst_videoaggregator_get_output_buffer (GstVideoAggregator * videoaggregator,
+gst_video_aggregator_get_output_buffer (GstVideoAggregator * videoaggregator,
GstBuffer ** outbuf)
{
guint outsize;
@@ -1915,7 +1962,7 @@
}
static gboolean
-gst_videoaggregator_pad_sink_acceptcaps (GstPad * pad,
+gst_video_aggregator_pad_sink_acceptcaps (GstPad * pad,
GstVideoAggregator * vagg, GstCaps * caps)
{
gboolean ret;
@@ -1966,7 +2013,7 @@
}
static gboolean
-gst_videoaggregator_sink_query (GstAggregator * agg, GstAggregatorPad * bpad,
+gst_video_aggregator_sink_query (GstAggregator * agg, GstAggregatorPad * bpad,
GstQuery * query)
{
GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (agg);
@@ -1979,7 +2026,8 @@
GstCaps *filter, *caps;
gst_query_parse_caps (query, &filter);
- caps = gst_videoaggregator_pad_sink_getcaps (GST_PAD (pad), vagg, filter);
+ caps =
+ gst_video_aggregator_pad_sink_getcaps (GST_PAD (pad), vagg, filter);
gst_query_set_caps_result (query, caps);
gst_caps_unref (caps);
ret = TRUE;
@@ -1990,14 +2038,15 @@
GstCaps *caps;
gst_query_parse_accept_caps (query, &caps);
- ret = gst_videoaggregator_pad_sink_acceptcaps (GST_PAD (pad), vagg, caps);
+ ret =
+ gst_video_aggregator_pad_sink_acceptcaps (GST_PAD (pad), vagg, caps);
gst_query_set_accept_caps_result (query, ret);
ret = TRUE;
break;
}
default:
ret =
- GST_AGGREGATOR_CLASS (gst_videoaggregator_parent_class)->sink_query
+ GST_AGGREGATOR_CLASS (gst_video_aggregator_parent_class)->sink_query
(agg, bpad, query);
break;
}
@@ -2006,27 +2055,27 @@
/* GObject vmethods */
static void
-gst_videoaggregator_finalize (GObject * o)
+gst_video_aggregator_finalize (GObject * o)
{
GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (o);
g_mutex_clear (&vagg->priv->lock);
- G_OBJECT_CLASS (gst_videoaggregator_parent_class)->finalize (o);
+ G_OBJECT_CLASS (gst_video_aggregator_parent_class)->finalize (o);
}
static void
-gst_videoaggregator_dispose (GObject * o)
+gst_video_aggregator_dispose (GObject * o)
{
GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (o);
gst_caps_replace (&vagg->priv->current_caps, NULL);
- G_OBJECT_CLASS (gst_videoaggregator_parent_class)->dispose (o);
+ G_OBJECT_CLASS (gst_video_aggregator_parent_class)->dispose (o);
}
static void
-gst_videoaggregator_get_property (GObject * object,
+gst_video_aggregator_get_property (GObject * object,
guint prop_id, GValue * value, GParamSpec * pspec)
{
switch (prop_id) {
@@ -2037,7 +2086,7 @@
}
static void
-gst_videoaggregator_set_property (GObject * object,
+gst_video_aggregator_set_property (GObject * object,
guint prop_id, const GValue * value, GParamSpec * pspec)
{
switch (prop_id) {
@@ -2049,45 +2098,45 @@
/* GObject boilerplate */
static void
-gst_videoaggregator_class_init (GstVideoAggregatorClass * klass)
+gst_video_aggregator_class_init (GstVideoAggregatorClass * klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GstElementClass *gstelement_class = (GstElementClass *) klass;
GstAggregatorClass *agg_class = (GstAggregatorClass *) klass;
- GST_DEBUG_CATEGORY_INIT (gst_videoaggregator_debug, "videoaggregator", 0,
+ GST_DEBUG_CATEGORY_INIT (gst_video_aggregator_debug, "videoaggregator", 0,
"base video aggregator");
- gst_videoaggregator_parent_class = g_type_class_peek_parent (klass);
+ gst_video_aggregator_parent_class = g_type_class_peek_parent (klass);
g_type_class_add_private (klass, sizeof (GstVideoAggregatorPrivate));
- gobject_class->finalize = gst_videoaggregator_finalize;
- gobject_class->dispose = gst_videoaggregator_dispose;
+ gobject_class->finalize = gst_video_aggregator_finalize;
+ gobject_class->dispose = gst_video_aggregator_dispose;
- gobject_class->get_property = gst_videoaggregator_get_property;
- gobject_class->set_property = gst_videoaggregator_set_property;
+ gobject_class->get_property = gst_video_aggregator_get_property;
+ gobject_class->set_property = gst_video_aggregator_set_property;
gstelement_class->request_new_pad =
- GST_DEBUG_FUNCPTR (gst_videoaggregator_request_new_pad);
+ GST_DEBUG_FUNCPTR (gst_video_aggregator_request_new_pad);
gstelement_class->release_pad =
- GST_DEBUG_FUNCPTR (gst_videoaggregator_release_pad);
+ GST_DEBUG_FUNCPTR (gst_video_aggregator_release_pad);
agg_class->sinkpads_type = GST_TYPE_VIDEO_AGGREGATOR_PAD;
- agg_class->start = gst_videoaggregator_start;
- agg_class->stop = gst_videoaggregator_stop;
- agg_class->sink_query = gst_videoaggregator_sink_query;
- agg_class->sink_event = gst_videoaggregator_sink_event;
- agg_class->flush = gst_videoaggregator_flush;
- agg_class->aggregate = gst_videoaggregator_aggregate;
- agg_class->src_event = gst_videoaggregator_src_event;
- agg_class->src_query = gst_videoaggregator_src_query;
- agg_class->get_next_time = gst_videoaggregator_get_next_time;
+ agg_class->start = gst_video_aggregator_start;
+ agg_class->stop = gst_video_aggregator_stop;
+ agg_class->sink_query = gst_video_aggregator_sink_query;
+ agg_class->sink_event = gst_video_aggregator_sink_event;
+ agg_class->flush = gst_video_aggregator_flush;
+ agg_class->aggregate = gst_video_aggregator_aggregate;
+ agg_class->src_event = gst_video_aggregator_src_event;
+ agg_class->src_query = gst_video_aggregator_src_query;
+ agg_class->get_next_time = gst_video_aggregator_get_next_time;
- klass->find_best_format = gst_videoaggreagator_find_best_format;
- klass->get_output_buffer = gst_videoaggregator_get_output_buffer;
- klass->update_caps = gst_videoaggregator_default_update_caps;
- klass->fixate_caps = gst_videoaggregator_default_fixate_caps;
+ klass->find_best_format = gst_video_aggregator_find_best_format;
+ klass->get_output_buffer = gst_video_aggregator_get_output_buffer;
+ klass->update_caps = gst_video_aggregator_default_update_caps;
+ klass->fixate_caps = gst_video_aggregator_default_fixate_caps;
/* Register the pad class */
g_type_class_ref (GST_TYPE_VIDEO_AGGREGATOR_PAD);
@@ -2166,7 +2215,7 @@
static GMutex sink_caps_mutex;
static void
-gst_videoaggregator_init (GstVideoAggregator * vagg,
+gst_video_aggregator_init (GstVideoAggregator * vagg,
GstVideoAggregatorClass * klass)
{
@@ -2182,8 +2231,12 @@
g_mutex_lock (&sink_caps_mutex);
if (klass->sink_non_alpha_caps == NULL) {
klass->sink_non_alpha_caps = _get_non_alpha_caps_from_template (klass);
+
+ /* The caps is cached */
+ GST_MINI_OBJECT_FLAG_SET (klass->sink_non_alpha_caps,
+ GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED);
}
g_mutex_unlock (&sink_caps_mutex);
- gst_videoaggregator_reset (vagg);
+ gst_video_aggregator_reset (vagg);
}
diff --git a/gst-libs/gst/video/gstvideoaggregator.h b/gst-libs/gst/video/gstvideoaggregator.h
index 86df0b6..6204bdd 100644
--- a/gst-libs/gst/video/gstvideoaggregator.h
+++ b/gst-libs/gst/video/gstvideoaggregator.h
@@ -32,7 +32,7 @@
G_BEGIN_DECLS
-#define GST_TYPE_VIDEO_AGGREGATOR (gst_videoaggregator_get_type())
+#define GST_TYPE_VIDEO_AGGREGATOR (gst_video_aggregator_get_type())
#define GST_VIDEO_AGGREGATOR(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_AGGREGATOR, GstVideoAggregator))
#define GST_VIDEO_AGGREGATOR_CLASS(klass) \
@@ -118,7 +118,7 @@
gpointer _gst_reserved[GST_PADDING_LARGE];
};
-GType gst_videoaggregator_get_type (void);
+GType gst_video_aggregator_get_type (void);
G_END_DECLS
#endif /* __GST_VIDEO_AGGREGATOR_H__ */
diff --git a/gst-libs/gst/video/gstvideoaggregatorpad.h b/gst-libs/gst/video/gstvideoaggregatorpad.h
index 4302aa3..3360b53 100644
--- a/gst-libs/gst/video/gstvideoaggregatorpad.h
+++ b/gst-libs/gst/video/gstvideoaggregatorpad.h
@@ -29,7 +29,7 @@
G_BEGIN_DECLS
-#define GST_TYPE_VIDEO_AGGREGATOR_PAD (gst_videoaggregator_pad_get_type())
+#define GST_TYPE_VIDEO_AGGREGATOR_PAD (gst_video_aggregator_pad_get_type())
#define GST_VIDEO_AGGREGATOR_PAD(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_AGGREGATOR_PAD, GstVideoAggregatorPad))
#define GST_VIDEO_AGGREGATOR_PAD_CLASS(klass) \
@@ -106,7 +106,7 @@
gpointer _gst_reserved[GST_PADDING_LARGE];
};
-GType gst_videoaggregator_pad_get_type (void);
+GType gst_video_aggregator_pad_get_type (void);
G_END_DECLS
#endif /* __GST_VIDEO_AGGREGATOR_PAD_H__ */
diff --git a/gst-libs/gst/wayland/Makefile.am b/gst-libs/gst/wayland/Makefile.am
index 0344598..743a489 100644
--- a/gst-libs/gst/wayland/Makefile.am
+++ b/gst-libs/gst/wayland/Makefile.am
@@ -12,6 +12,7 @@
$(WAYLAND_CFLAGS)
libgstwayland_@GST_API_VERSION@_la_LIBADD = \
+ $(GST_PLUGINS_BASE_LIBS) \
$(GST_LIBS) \
$(WAYLAND_LIBS) \
-lgstvideo-$(GST_API_VERSION)
diff --git a/gst-libs/gst/wayland/Makefile.in b/gst-libs/gst/wayland/Makefile.in
index b2be04e..35fb584 100644
--- a/gst-libs/gst/wayland/Makefile.in
+++ b/gst-libs/gst/wayland/Makefile.in
@@ -164,7 +164,8 @@
LTLIBRARIES = $(lib_LTLIBRARIES)
am__DEPENDENCIES_1 =
libgstwayland_@GST_API_VERSION@_la_DEPENDENCIES = \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
am_libgstwayland_@GST_API_VERSION@_la_OBJECTS = \
libgstwayland_@GST_API_VERSION@_la-wayland.lo
libgstwayland_@GST_API_VERSION@_la_OBJECTS = \
@@ -304,6 +305,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +328,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +379,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +526,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +654,6 @@
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@
@@ -689,8 +696,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -791,6 +803,7 @@
$(WAYLAND_CFLAGS)
libgstwayland_@GST_API_VERSION@_la_LIBADD = \
+ $(GST_PLUGINS_BASE_LIBS) \
$(GST_LIBS) \
$(WAYLAND_LIBS) \
-lgstvideo-$(GST_API_VERSION)
diff --git a/gst-plugins-bad.doap b/gst-plugins-bad.doap
index 83ba7e7..ec65d38 100644
--- a/gst-plugins-bad.doap
+++ b/gst-plugins-bad.doap
@@ -35,31 +35,31 @@
<release>
<Version>
- <revision>1.8.3</revision>
- <branch>1.8</branch>
+ <revision>1.9.90</revision>
+ <branch>master</branch>
<name></name>
- <created>2016-08-19</created>
- <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.8.3.tar.xz" />
+ <created>2016-09-30</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.9.90.tar.xz" />
</Version>
</release>
<release>
<Version>
- <revision>1.8.2</revision>
- <branch>1.8</branch>
+ <revision>1.9.2</revision>
+ <branch>master</branch>
<name></name>
- <created>2016-06-09</created>
- <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.8.2.tar.xz" />
+ <created>2016-09-01</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.9.2.tar.xz" />
</Version>
</release>
<release>
<Version>
- <revision>1.8.1</revision>
- <branch>1.8</branch>
+ <revision>1.9.1</revision>
+ <branch>master</branch>
<name></name>
- <created>2016-04-20</created>
- <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.8.1.tar.xz" />
+ <created>2016-06-06</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.9.1.tar.xz" />
</Version>
</release>
diff --git a/gst-plugins-bad.spec b/gst-plugins-bad.spec
index c0c21a1..2ee8b4d 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.8.3
+Version: 1.9.90
Release: 1.gst
# The freeze and nfs plugins are LGPLv2 (only)
License: LGPLv2+ and LGPLv2
diff --git a/gst/Makefile.in b/gst/Makefile.in
index 2a090e4..fbff90f 100644
--- a/gst/Makefile.in
+++ b/gst/Makefile.in
@@ -281,6 +281,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -302,6 +304,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -351,6 +355,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -496,6 +502,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -622,8 +630,6 @@
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@
@@ -666,8 +672,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/accurip/Makefile.in b/gst/accurip/Makefile.in
index df7b44a..327137f 100644
--- a/gst/accurip/Makefile.in
+++ b/gst/accurip/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/adpcmdec/Makefile.in b/gst/adpcmdec/Makefile.in
index 95d425a..86f2770 100644
--- a/gst/adpcmdec/Makefile.in
+++ b/gst/adpcmdec/Makefile.in
@@ -299,6 +299,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -320,6 +322,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -369,6 +373,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -514,6 +520,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -640,8 +648,6 @@
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@
@@ -684,8 +690,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/adpcmdec/adpcmdec.c b/gst/adpcmdec/adpcmdec.c
index 83289ba..3cfa820 100644
--- a/gst/adpcmdec/adpcmdec.c
+++ b/gst/adpcmdec/adpcmdec.c
@@ -467,13 +467,12 @@
GstElementClass *element_class = (GstElementClass *) klass;
GstAudioDecoderClass *base_class = (GstAudioDecoderClass *) klass;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&adpcmdec_sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&adpcmdec_src_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &adpcmdec_sink_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &adpcmdec_src_template);
gst_element_class_set_static_metadata (element_class, "ADPCM decoder",
- "Codec/Decoder/Audio",
- "Decode MS and IMA ADPCM audio",
+ "Codec/Decoder/Audio", "Decode MS and IMA ADPCM audio",
"Pioneers of the Inevitable <songbird@songbirdnest.com>");
base_class->start = GST_DEBUG_FUNCPTR (adpcmdec_start);
diff --git a/gst/adpcmenc/Makefile.in b/gst/adpcmenc/Makefile.in
index 1cede6e..6c7a7fd 100644
--- a/gst/adpcmenc/Makefile.in
+++ b/gst/adpcmenc/Makefile.in
@@ -299,6 +299,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -320,6 +322,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -369,6 +373,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -514,6 +520,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -640,8 +648,6 @@
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@
@@ -684,8 +690,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/adpcmenc/adpcmenc.c b/gst/adpcmenc/adpcmenc.c
index def90cf..8391b08 100644
--- a/gst/adpcmenc/adpcmenc.c
+++ b/gst/adpcmenc/adpcmenc.c
@@ -438,13 +438,12 @@
gobjectclass->set_property = adpcmenc_set_property;
gobjectclass->get_property = adpcmenc_get_property;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&adpcmenc_sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&adpcmenc_src_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &adpcmenc_sink_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &adpcmenc_src_template);
gst_element_class_set_static_metadata (element_class, "ADPCM encoder",
- "Codec/Encoder/Audio",
- "Encode ADPCM audio",
+ "Codec/Encoder/Audio", "Encode ADPCM audio",
"Pioneers of the Inevitable <songbird@songbirdnest.com>");
base_class->start = GST_DEBUG_FUNCPTR (adpcmenc_start);
diff --git a/gst/aiff/Makefile.am b/gst/aiff/Makefile.am
index ebe4230..ee13fcf 100644
--- a/gst/aiff/Makefile.am
+++ b/gst/aiff/Makefile.am
@@ -9,7 +9,7 @@
$(GST_BASE_CFLAGS) \
$(GST_CFLAGS)
libgstaiff_la_LIBADD = \
- $(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_API_VERSION) -lgstaudio-$(GST_API_VERSION)\
+ $(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_API_VERSION) -lgstaudio-$(GST_API_VERSION) -lgstpbutils-$(GST_API_VERSION) \
$(GST_BASE_LIBS) \
$(LIBM)
libgstaiff_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
diff --git a/gst/aiff/Makefile.in b/gst/aiff/Makefile.in
index e0b3060..235647d 100644
--- a/gst/aiff/Makefile.in
+++ b/gst/aiff/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -788,7 +799,7 @@
$(GST_CFLAGS)
libgstaiff_la_LIBADD = \
- $(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_API_VERSION) -lgstaudio-$(GST_API_VERSION)\
+ $(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_API_VERSION) -lgstaudio-$(GST_API_VERSION) -lgstpbutils-$(GST_API_VERSION) \
$(GST_BASE_LIBS) \
$(LIBM)
diff --git a/gst/aiff/aiffmux.c b/gst/aiff/aiffmux.c
index 5d5fded..0f6d330 100644
--- a/gst/aiff/aiffmux.c
+++ b/gst/aiff/aiffmux.c
@@ -113,10 +113,8 @@
"AIFF audio muxer", "Muxer/Audio", "Multiplex raw audio into AIFF",
"Robert Swain <robert.swain@gmail.com>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_factory);
gstelement_class->change_state =
GST_DEBUG_FUNCPTR (gst_aiff_mux_change_state);
diff --git a/gst/aiff/aiffparse.c b/gst/aiff/aiffparse.c
index aba4f0f..faa2647 100644
--- a/gst/aiff/aiffparse.c
+++ b/gst/aiff/aiffparse.c
@@ -59,6 +59,7 @@
#include "aiffparse.h"
#include <gst/audio/audio.h>
#include <gst/tag/tag.h>
+#include <gst/pbutils/descriptions.h>
#include <gst/gst-i18n-plugin.h>
GST_DEBUG_CATEGORY (aiffparse_debug);
@@ -120,10 +121,10 @@
object_class->dispose = gst_aiff_parse_dispose;
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_template_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_template_factory));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &sink_template_factory);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &src_template_factory);
gst_element_class_set_static_metadata (gstelement_class,
"AIFF audio demuxer", "Codec/Demuxer/Audio",
@@ -995,6 +996,32 @@
aiff->bytes_per_sample = aiff->channels * aiff->width / 8;
aiff->bps = aiff->bytes_per_sample * aiff->rate;
+ if (!aiff->tags)
+ aiff->tags = gst_tag_list_new_empty ();
+
+ {
+ GstCaps *templ_caps = gst_pad_get_pad_template_caps (aiff->sinkpad);
+ gst_pb_utils_add_codec_description_to_tag_list (aiff->tags,
+ GST_TAG_CONTAINER_FORMAT, templ_caps);
+ gst_caps_unref (templ_caps);
+ }
+
+ if (aiff->bps) {
+ guint bitrate = aiff->bps * 8;
+
+ GST_DEBUG_OBJECT (aiff, "adding bitrate of %u bps to tag list",
+ bitrate);
+
+ /* At the moment, aiffparse only supports uncompressed PCM data.
+ * Therefore, nominal, actual, minimum, maximum bitrate are the same.
+ * XXX: If AIFF-C support is extended to include compression,
+ * make sure that aiff->bps is set properly. */
+ gst_tag_list_add (aiff->tags, GST_TAG_MERGE_REPLACE,
+ GST_TAG_BITRATE, bitrate, GST_TAG_NOMINAL_BITRATE, bitrate,
+ GST_TAG_MINIMUM_BITRATE, bitrate, GST_TAG_MAXIMUM_BITRATE,
+ bitrate, NULL);
+ }
+
if (aiff->bytes_per_sample <= 0)
goto no_bytes_per_sample;
@@ -1500,9 +1527,7 @@
} else if (ret < GST_FLOW_EOS || ret == GST_FLOW_NOT_LINKED) {
/* for fatal errors we post an error message, post the error
* first so the app knows about the error first. */
- GST_ELEMENT_ERROR (aiff, STREAM, FAILED,
- (_("Internal data flow error.")),
- ("streaming task paused, reason %s (%d)", reason, ret));
+ GST_ELEMENT_FLOW_ERROR (aiff, ret);
gst_pad_push_event (aiff->srcpad, gst_event_new_eos ());
}
return;
diff --git a/gst/asfmux/Makefile.in b/gst/asfmux/Makefile.in
index 60fa5b4..3cf2159 100644
--- a/gst/asfmux/Makefile.in
+++ b/gst/asfmux/Makefile.in
@@ -307,6 +307,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -328,6 +330,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -377,6 +381,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -522,6 +528,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -648,8 +656,6 @@
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@
@@ -692,8 +698,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/asfmux/gstasfmux.c b/gst/asfmux/gstasfmux.c
index 45617be..3579a55 100644
--- a/gst/asfmux/gstasfmux.c
+++ b/gst/asfmux/gstasfmux.c
@@ -270,12 +270,11 @@
GST_DEBUG_FUNCPTR (gst_asf_mux_request_new_pad);
gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_asf_mux_change_state);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&audio_sink_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&video_sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &audio_sink_factory);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &video_sink_factory);
gst_element_class_set_static_metadata (gstelement_class, "ASF muxer",
"Codec/Muxer",
diff --git a/gst/asfmux/gstasfparse.c b/gst/asfmux/gstasfparse.c
index c288266..6cc75b6 100644
--- a/gst/asfmux/gstasfparse.c
+++ b/gst/asfmux/gstasfparse.c
@@ -400,10 +400,8 @@
gstbaseparse_class->stop = gst_asf_parse_stop;
gstbaseparse_class->handle_frame = gst_asf_parse_handle_frame;
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_factory);
gst_element_class_set_static_metadata (gstelement_class, "ASF parser",
"Parser", "Parses ASF", "Thiago Santos <thiagoss@embedded.ufcg.edu.br>");
diff --git a/gst/asfmux/gstrtpasfpay.c b/gst/asfmux/gstrtpasfpay.c
index e5ff0de..9b1e032 100644
--- a/gst/asfmux/gstrtpasfpay.c
+++ b/gst/asfmux/gstrtpasfpay.c
@@ -96,10 +96,10 @@
gstbasertppayload_class->handle_buffer = gst_rtp_asf_pay_handle_buffer;
gstbasertppayload_class->set_caps = gst_rtp_asf_pay_set_caps;
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_rtp_asf_pay_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_rtp_asf_pay_src_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_rtp_asf_pay_sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_rtp_asf_pay_src_template);
gst_element_class_set_static_metadata (gstelement_class, "RTP ASF payloader",
"Codec/Payloader/Network",
"Payload-encodes ASF into RTP packets (MS_RTSP)",
diff --git a/gst/audiofxbad/Makefile.in b/gst/audiofxbad/Makefile.in
index 7d065d2..8a36765 100644
--- a/gst/audiofxbad/Makefile.in
+++ b/gst/audiofxbad/Makefile.in
@@ -301,6 +301,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -322,6 +324,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -371,6 +375,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -516,6 +522,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -642,8 +650,6 @@
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@
@@ -686,8 +692,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/audiofxbad/gstaudiochannelmix.c b/gst/audiofxbad/gstaudiochannelmix.c
index aebe84a..7d92a5b 100644
--- a/gst/audiofxbad/gstaudiochannelmix.c
+++ b/gst/audiofxbad/gstaudiochannelmix.c
@@ -102,10 +102,10 @@
/* Setting up pads and setting metadata should be moved to
base_class_init if you intend to subclass this class. */
- gst_element_class_add_pad_template (GST_ELEMENT_CLASS (klass),
- gst_static_pad_template_get (&gst_audio_channel_mix_src_template));
- gst_element_class_add_pad_template (GST_ELEMENT_CLASS (klass),
- gst_static_pad_template_get (&gst_audio_channel_mix_sink_template));
+ gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS (klass),
+ &gst_audio_channel_mix_src_template);
+ gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS (klass),
+ &gst_audio_channel_mix_sink_template);
gst_element_class_set_static_metadata (GST_ELEMENT_CLASS (klass),
"Simple stereo audio mixer", "Audio/Mixer", "Mixes left/right channels "
diff --git a/gst/audiomixer/Makefile.in b/gst/audiomixer/Makefile.in
index db32131..51745cd 100644
--- a/gst/audiomixer/Makefile.in
+++ b/gst/audiomixer/Makefile.in
@@ -332,6 +332,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -353,6 +355,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -402,6 +406,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -547,6 +553,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -673,8 +681,6 @@
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@
@@ -717,8 +723,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/audiomixer/gstaudiointerleave.c b/gst/audiomixer/gstaudiointerleave.c
index 39b86e8..e91b645 100644
--- a/gst/audiomixer/gstaudiointerleave.c
+++ b/gst/audiomixer/gstaudiointerleave.c
@@ -566,13 +566,12 @@
gobject_class->get_property = gst_audio_interleave_get_property;
gobject_class->finalize = gst_audio_interleave_finalize;
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_audio_interleave_src_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_audio_interleave_sink_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_audio_interleave_src_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_audio_interleave_sink_template);
gst_element_class_set_static_metadata (gstelement_class, "AudioInterleave",
- "Generic/Audio",
- "Mixes multiple audio streams",
+ "Generic/Audio", "Mixes multiple audio streams",
"Olivier Crete <olivier.crete@collabora.com>");
gstelement_class->request_new_pad =
diff --git a/gst/audiomixer/gstaudiomixer.c b/gst/audiomixer/gstaudiomixer.c
index b211f7d..de539db 100644
--- a/gst/audiomixer/gstaudiomixer.c
+++ b/gst/audiomixer/gstaudiomixer.c
@@ -485,13 +485,12 @@
"Setting this property takes a reference to the supplied GstCaps "
"object", GST_TYPE_CAPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_audiomixer_src_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_audiomixer_sink_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_audiomixer_src_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_audiomixer_sink_template);
gst_element_class_set_static_metadata (gstelement_class, "AudioMixer",
- "Generic/Audio",
- "Mixes multiple audio streams",
+ "Generic/Audio", "Mixes multiple audio streams",
"Sebastian Dröge <sebastian@centricular.com>");
gstelement_class->request_new_pad =
diff --git a/gst/audiovisualizers/Makefile.in b/gst/audiovisualizers/Makefile.in
index 08ab702..057e21e 100644
--- a/gst/audiovisualizers/Makefile.in
+++ b/gst/audiovisualizers/Makefile.in
@@ -310,6 +310,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -331,6 +333,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -380,6 +384,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -525,6 +531,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -651,8 +659,6 @@
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@
@@ -695,8 +701,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/audiovisualizers/gstspacescope.c b/gst/audiovisualizers/gstspacescope.c
index 6cde066..5071dc8 100644
--- a/gst/audiovisualizers/gstspacescope.c
+++ b/gst/audiovisualizers/gstspacescope.c
@@ -39,15 +39,17 @@
#include <stdlib.h>
#include "gstspacescope.h"
+#if G_BYTE_ORDER == G_BIG_ENDIAN
+#define RGB_ORDER "xRGB"
+#else
+#define RGB_ORDER "BGRx"
+#endif
+
static GstStaticPadTemplate gst_space_scope_src_template =
GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
-#if G_BYTE_ORDER == G_BIG_ENDIAN
- GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("xRGB"))
-#else
- GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("BGRx"))
-#endif
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (RGB_ORDER))
);
static GstStaticPadTemplate gst_space_scope_sink_template =
@@ -131,10 +133,10 @@
"Visualization",
"Simple stereo visualizer", "Stefan Kost <ensonic@users.sf.net>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_space_scope_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_space_scope_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_space_scope_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_space_scope_sink_template);
gobject_class->set_property = gst_space_scope_set_property;
gobject_class->get_property = gst_space_scope_get_property;
diff --git a/gst/audiovisualizers/gstspectrascope.c b/gst/audiovisualizers/gstspectrascope.c
index 297d3ef..10aa7d2 100644
--- a/gst/audiovisualizers/gstspectrascope.c
+++ b/gst/audiovisualizers/gstspectrascope.c
@@ -40,15 +40,17 @@
#include "gstspectrascope.h"
+#if G_BYTE_ORDER == G_BIG_ENDIAN
+#define RGB_ORDER "xRGB"
+#else
+#define RGB_ORDER "BGRx"
+#endif
+
static GstStaticPadTemplate gst_spectra_scope_src_template =
GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
-#if G_BYTE_ORDER == G_BIG_ENDIAN
- GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("xRGB"))
-#else
- GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("BGRx"))
-#endif
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (RGB_ORDER))
);
static GstStaticPadTemplate gst_spectra_scope_sink_template =
@@ -88,10 +90,10 @@
"Frequency spectrum scope", "Visualization",
"Simple frequency spectrum scope", "Stefan Kost <ensonic@users.sf.net>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_spectra_scope_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_spectra_scope_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_spectra_scope_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_spectra_scope_sink_template);
scope_class->setup = GST_DEBUG_FUNCPTR (gst_spectra_scope_setup);
scope_class->render = GST_DEBUG_FUNCPTR (gst_spectra_scope_render);
diff --git a/gst/audiovisualizers/gstsynaescope.c b/gst/audiovisualizers/gstsynaescope.c
index dfadf09..f99a753 100644
--- a/gst/audiovisualizers/gstsynaescope.c
+++ b/gst/audiovisualizers/gstsynaescope.c
@@ -38,15 +38,17 @@
#include "gstsynaescope.h"
+#if G_BYTE_ORDER == G_BIG_ENDIAN
+#define RGB_ORDER "xRGB"
+#else
+#define RGB_ORDER "BGRx"
+#endif
+
static GstStaticPadTemplate gst_synae_scope_src_template =
GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
-#if G_BYTE_ORDER == G_BIG_ENDIAN
- GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("xRGB"))
-#else
- GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("BGRx"))
-#endif
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (RGB_ORDER))
);
static GstStaticPadTemplate gst_synae_scope_sink_template =
@@ -87,10 +89,10 @@
"Creates video visualizations of audio input, using stereo and pitch information",
"Stefan Kost <ensonic@users.sf.net>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_synae_scope_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_synae_scope_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_synae_scope_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_synae_scope_sink_template);
scope_class->setup = GST_DEBUG_FUNCPTR (gst_synae_scope_setup);
scope_class->render = GST_DEBUG_FUNCPTR (gst_synae_scope_render);
diff --git a/gst/audiovisualizers/gstwavescope.c b/gst/audiovisualizers/gstwavescope.c
index ad125b0..e4eb8c2 100644
--- a/gst/audiovisualizers/gstwavescope.c
+++ b/gst/audiovisualizers/gstwavescope.c
@@ -39,15 +39,17 @@
#include <stdlib.h>
#include "gstwavescope.h"
+#if G_BYTE_ORDER == G_BIG_ENDIAN
+#define RGB_ORDER "xRGB"
+#else
+#define RGB_ORDER "BGRx"
+#endif
+
static GstStaticPadTemplate gst_wave_scope_src_template =
GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
-#if G_BYTE_ORDER == G_BIG_ENDIAN
- GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("xRGB"))
-#else
- GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("BGRx"))
-#endif
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (RGB_ORDER))
);
static GstStaticPadTemplate gst_wave_scope_sink_template =
@@ -146,10 +148,10 @@
"Waveform oscilloscope", "Visualization", "Simple waveform oscilloscope",
"Stefan Kost <ensonic@users.sf.net>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_wave_scope_src_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_wave_scope_sink_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_wave_scope_src_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_wave_scope_sink_template);
}
static void
diff --git a/gst/autoconvert/Makefile.in b/gst/autoconvert/Makefile.in
index a951011..4f0081f 100644
--- a/gst/autoconvert/Makefile.in
+++ b/gst/autoconvert/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/autoconvert/gstautoconvert.c b/gst/autoconvert/gstautoconvert.c
index b5a1035..77e095a 100644
--- a/gst/autoconvert/gstautoconvert.c
+++ b/gst/autoconvert/gstautoconvert.c
@@ -159,10 +159,8 @@
parent_quark = g_quark_from_static_string ("parent");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&srctemplate));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sinktemplate));
+ gst_element_class_add_static_pad_template (gstelement_class, &srctemplate);
+ gst_element_class_add_static_pad_template (gstelement_class, &sinktemplate);
gst_element_class_set_static_metadata (gstelement_class,
"Select convertor based on caps", "Generic/Bin",
diff --git a/gst/autoconvert/gstautovideoconvert.c b/gst/autoconvert/gstautovideoconvert.c
index 11fc974..7e0ea9e 100644
--- a/gst/autoconvert/gstautovideoconvert.c
+++ b/gst/autoconvert/gstautovideoconvert.c
@@ -140,10 +140,8 @@
GST_DEBUG_CATEGORY_INIT (autovideoconvert_debug, "autovideoconvert", 0,
"Auto color space converter");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&srctemplate));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sinktemplate));
+ gst_element_class_add_static_pad_template (gstelement_class, &srctemplate);
+ gst_element_class_add_static_pad_template (gstelement_class, &sinktemplate);
gst_element_class_set_static_metadata (gstelement_class,
"Select color space convertor based on caps", "Generic/Bin",
diff --git a/gst/bayer/Makefile.in b/gst/bayer/Makefile.in
index bc71546..898a1b1 100644
--- a/gst/bayer/Makefile.in
+++ b/gst/bayer/Makefile.in
@@ -326,6 +326,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -349,6 +351,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -398,6 +402,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -543,6 +549,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -669,8 +677,6 @@
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@
@@ -713,8 +719,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/bayer/gstbayer2rgb.c b/gst/bayer/gstbayer2rgb.c
index e159ca2..0b6f232 100644
--- a/gst/bayer/gstbayer2rgb.c
+++ b/gst/bayer/gstbayer2rgb.c
@@ -80,7 +80,11 @@
#include <gst/video/video.h>
#include <string.h>
#include <stdlib.h>
-#include <_stdint.h>
+
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+
#include "gstbayerorc.h"
#define GST_CAT_DEFAULT gst_bayer2rgb_debug
diff --git a/gst/bayer/gstbayerorc-dist.c b/gst/bayer/gstbayerorc-dist.c
index e79862f..1bc39a6 100644
--- a/gst/bayer/gstbayerorc-dist.c
+++ b/gst/bayer/gstbayerorc-dist.c
@@ -336,7 +336,7 @@
static const orc_uint8 bc[] = {
1, 9, 34, 98, 97, 121, 101, 114, 95, 111, 114, 99, 95, 104, 111, 114,
105, 122, 95, 117, 112, 115, 97, 109, 112, 108, 101, 95, 117, 110, 97,
- 108,
+ 108,
105, 103, 110, 101, 100, 11, 2, 2, 11, 2, 2, 12, 2, 2, 14, 4,
1, 0, 0, 0, 20, 2, 20, 1, 20, 1, 20, 1, 20, 1, 199, 34,
33, 4, 83, 32, 4, 16, 199, 36, 35, 32, 39, 36, 34, 36, 196, 0,
diff --git a/gst/bayer/gstrgb2bayer.c b/gst/bayer/gstrgb2bayer.c
index 495f151..9ef5c89 100644
--- a/gst/bayer/gstrgb2bayer.c
+++ b/gst/bayer/gstrgb2bayer.c
@@ -87,10 +87,10 @@
gobject_class->finalize = gst_rgb2bayer_finalize;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_rgb2bayer_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_rgb2bayer_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_rgb2bayer_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_rgb2bayer_sink_template);
gst_element_class_set_static_metadata (element_class,
"RGB to Bayer converter",
diff --git a/gst/camerabin2/Makefile.in b/gst/camerabin2/Makefile.in
index 0caf788..1341ce1 100644
--- a/gst/camerabin2/Makefile.in
+++ b/gst/camerabin2/Makefile.in
@@ -310,6 +310,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -331,6 +333,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -380,6 +384,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -525,6 +531,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -651,8 +659,6 @@
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@
@@ -695,8 +701,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/camerabin2/gstcamerabin2.c b/gst/camerabin2/gstcamerabin2.c
index d0876d5..24bb4fb 100644
--- a/gst/camerabin2/gstcamerabin2.c
+++ b/gst/camerabin2/gstcamerabin2.c
@@ -17,17 +17,16 @@
* Boston, MA 02110-1301, USA.
*/
/**
- * SECTION:element-camerabin2
+ * SECTION:element-camerabin
*
- * CameraBin2 is a high-level camera object that encapsulates gstreamer
+ * CameraBin is a high-level camera object that encapsulates gstreamer
* elements, providing an API for controlling a digital camera.
*
* <note>
- * Note that camerabin2 is still UNSTABLE and under
- * development.
+ * Note that camerabin is still UNSTABLE and under development.
* </note>
*
- * CameraBin2 has the following main features:
+ * CameraBin has the following main features:
* <itemizedlist>
* <listitem>
* Record videos
@@ -46,12 +45,12 @@
* <refsect2>
* <title>Usage</title>
* <para>
- * Camerabin2 can be created using gst_element_factory_make() just like
+ * Camerabin can be created using gst_element_factory_make() just like
* any other element. Video or image capture mode can be selected using
* the #GstCameraBin:mode property and the file to save the capture is
* selected using #GstCameraBin:location property.
*
- * After creating camerabin2, applications might want to do some
+ * After creating camerabin, applications might want to do some
* customization (there's a section about this below), then select
* the desired mode and start capturing.
*
@@ -76,11 +75,11 @@
* <refsect2>
* <title>Customization</title>
* <para>
- * Camerabin2 provides various customization properties, allowing the user
+ * Camerabin provides various customization properties, allowing the user
* to set custom filters, selecting the viewfinder sink and formats to
* use to encode the captured images/videos.
*
- * #GstEncodingProfile<!-- -->s are used to tell camerabin2 which formats it
+ * #GstEncodingProfile<!-- -->s are used to tell camerabin which formats it
* should encode the captures to, those should be set to
* #GstCameraBin:image-profile and #GstCameraBin:video-profile. Default is
* jpeg for images, and ogg (theora and vorbis) for video. If a profile without
@@ -89,7 +88,7 @@
* #GstCameraBin:preview-caps can be used to select which format preview
* images should be posted on the #GstBus. It has to be a raw video format.
*
- * Camerabin2 has a #GstCameraBin:camera-source property so applications can
+ * Camerabin has a #GstCameraBin:camera-source property so applications can
* set their source that will provide buffers for the viewfinder and for
* captures. This camera source is a special type of source that has 3 pads.
* To use a 'regular' source with a single pad you should use
@@ -103,7 +102,7 @@
* #GstCameraBin:viewfinder-caps, these #GstCaps should be a subset of
* #GstCameraBin:viewfinder-supported-caps.
*
- * To select the desired resolution for captures, camerabin2 provides
+ * To select the desired resolution for captures, camerabin provides
* #GstCameraBin:image-capture-caps and #GstCameraBin:video-capture-caps,
* these caps must be a subset of what the source can produce. The allowed
* caps can be probed using #GstCameraBin:image-capture-supported-caps and
@@ -121,8 +120,8 @@
* <refsect2>
* <title>Example launch line</title>
* <para>
- * 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
+ * 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-1.0 -v -m camerabin
diff --git a/gst/camerabin2/gstdigitalzoom.c b/gst/camerabin2/gstdigitalzoom.c
index 20c01be..b936fe4 100644
--- a/gst/camerabin2/gstdigitalzoom.c
+++ b/gst/camerabin2/gstdigitalzoom.c
@@ -376,10 +376,8 @@
GST_DEBUG_CATEGORY_INIT (digital_zoom_debug, "digitalzoom",
0, "digital zoom");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class, &src_template);
gst_element_class_set_static_metadata (gstelement_class,
"Digital zoom bin", "Generic/Video",
diff --git a/gst/camerabin2/gstviewfinderbin.c b/gst/camerabin2/gstviewfinderbin.c
index 3ae6c31..7ff7bd5 100644
--- a/gst/camerabin2/gstviewfinderbin.c
+++ b/gst/camerabin2/gstviewfinderbin.c
@@ -122,8 +122,7 @@
DEFAULT_DISABLE_CONVERTERS,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_set_static_metadata (element_class, "Viewfinder Bin",
"Sink/Video", "Viewfinder Bin used in camerabin2",
diff --git a/gst/camerabin2/gstwrappercamerabinsrc.c b/gst/camerabin2/gstwrappercamerabinsrc.c
index 7796107..4c2d8ec 100644
--- a/gst/camerabin2/gstwrappercamerabinsrc.c
+++ b/gst/camerabin2/gstwrappercamerabinsrc.c
@@ -1123,14 +1123,13 @@
GST_DEBUG_CATEGORY_INIT (wrapper_camera_bin_src_debug, "wrappercamerabinsrc",
0, "wrapper camera src");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&vfsrc_template));
+ gst_element_class_add_static_pad_template (gstelement_class, &vfsrc_template);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&imgsrc_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &imgsrc_template);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&vidsrc_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &vidsrc_template);
gst_element_class_set_static_metadata (gstelement_class,
"Wrapper camera src element for camerabin2", "Source/Video",
diff --git a/gst/cdxaparse/Makefile.in b/gst/cdxaparse/Makefile.in
index 3f2b137..3035dd9 100644
--- a/gst/cdxaparse/Makefile.in
+++ b/gst/cdxaparse/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/cdxaparse/gstcdxaparse.c b/gst/cdxaparse/gstcdxaparse.c
index cf0d08f..4334362 100644
--- a/gst/cdxaparse/gstcdxaparse.c
+++ b/gst/cdxaparse/gstcdxaparse.c
@@ -76,10 +76,10 @@
"Wim Taymans <wim.taymans@tvd.be>");
/* register src pads */
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_template_factory));
+ gst_element_class_add_static_pad_template (element_class,
+ &sink_template_factory);
+ gst_element_class_add_static_pad_template (element_class,
+ &src_template_factory);
}
static void
diff --git a/gst/cdxaparse/gstvcdparse.c b/gst/cdxaparse/gstvcdparse.c
index 4a3a7e7..424e839 100644
--- a/gst/cdxaparse/gstvcdparse.c
+++ b/gst/cdxaparse/gstvcdparse.c
@@ -55,10 +55,8 @@
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
gst_element_class_set_static_metadata (element_class, "(S)VCD stream parser",
"Codec/Parser", "Strip (S)VCD stream from its sync headers",
diff --git a/gst/coloreffects/Makefile.in b/gst/coloreffects/Makefile.in
index 793eb5a..d8d3a8f 100644
--- a/gst/coloreffects/Makefile.in
+++ b/gst/coloreffects/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/coloreffects/gstchromahold.c b/gst/coloreffects/gstchromahold.c
index 097312a..011c401 100644
--- a/gst/coloreffects/gstchromahold.c
+++ b/gst/coloreffects/gstchromahold.c
@@ -153,10 +153,10 @@
"Removes all color information except for one color",
"Sebastian Dröge <sebastian.droege@collabora.co.uk>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_chroma_hold_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_chroma_hold_src_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_chroma_hold_sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_chroma_hold_src_template);
GST_DEBUG_CATEGORY_INIT (gst_chroma_hold_debug, "chromahold", 0,
"chromahold - Removes all color information except for one color");
diff --git a/gst/coloreffects/gstcoloreffects.c b/gst/coloreffects/gstcoloreffects.c
index a62a45d..5a1aea1 100644
--- a/gst/coloreffects/gstcoloreffects.c
+++ b/gst/coloreffects/gstcoloreffects.c
@@ -590,10 +590,10 @@
"Color Look-up Table filter",
"Filippo Argiolas <filippo.argiolas@gmail.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_color_effects_sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_color_effects_src_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_color_effects_sink_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_color_effects_src_template);
}
static void
diff --git a/gst/compositor/Makefile.in b/gst/compositor/Makefile.in
index b00c88d..0b87e2c 100644
--- a/gst/compositor/Makefile.in
+++ b/gst/compositor/Makefile.in
@@ -333,6 +333,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -354,6 +356,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -403,6 +407,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -548,6 +554,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -674,8 +682,6 @@
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@
@@ -718,8 +724,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/compositor/compositor.c b/gst/compositor/compositor.c
index eced976..c9fd3fc 100644
--- a/gst/compositor/compositor.c
+++ b/gst/compositor/compositor.c
@@ -75,7 +75,7 @@
* ]| A pipeline to demonstrate compositor used together with videobox.
* This should show a 320x240 pixels video test source with some transparency
* showing the background checker pattern. Another video test source with just
- * the snow pattern of 100x100 pixels is overlayed on top of the first one on
+ * the snow pattern of 100x100 pixels is overlaid on top of the first one on
* the left vertically centered with a small transparency showing the first
* video test source behind and the checker pattern under it. Note that the
* framerate of the output video is 10 frames per second.
@@ -239,9 +239,12 @@
comp_pad->height <=
0 ? GST_VIDEO_INFO_HEIGHT (&vagg_pad->info) : comp_pad->height;
- gst_video_calculate_display_ratio (&dar_n, &dar_d, pad_width, pad_height,
- GST_VIDEO_INFO_PAR_N (&vagg_pad->info),
- GST_VIDEO_INFO_PAR_D (&vagg_pad->info), out_par_n, out_par_d);
+ if (!gst_video_calculate_display_ratio (&dar_n, &dar_d, pad_width, pad_height,
+ GST_VIDEO_INFO_PAR_N (&vagg_pad->info),
+ GST_VIDEO_INFO_PAR_D (&vagg_pad->info), out_par_n, out_par_d)) {
+ GST_WARNING_OBJECT (comp_pad, "Cannot calculate display aspect ratio");
+ *width = *height = 0;
+ }
GST_LOG_OBJECT (comp_pad, "scaling %ux%u by %u/%u (%u/%u / %u/%u)", pad_width,
pad_height, dar_n, dar_d, GST_VIDEO_INFO_PAR_N (&vagg_pad->info),
GST_VIDEO_INFO_PAR_D (&vagg_pad->info), out_par_n, out_par_d);
@@ -254,10 +257,8 @@
pad_width = gst_util_uint64_scale_int (pad_height, dar_n, dar_d);
}
- if (width)
- *width = pad_width;
- if (height)
- *height = pad_height;
+ *width = pad_width;
+ *height = pad_height;
}
static gboolean
@@ -1112,10 +1113,8 @@
GST_TYPE_COMPOSITOR_BACKGROUND,
DEFAULT_BACKGROUND, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_factory);
gst_element_class_set_static_metadata (gstelement_class, "Compositor",
"Filter/Editor/Video/Compositor",
diff --git a/gst/dataurisrc/Makefile.in b/gst/dataurisrc/Makefile.in
index 8756410..9e6681b 100644
--- a/gst/dataurisrc/Makefile.in
+++ b/gst/dataurisrc/Makefile.in
@@ -299,6 +299,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -320,6 +322,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -369,6 +373,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -514,6 +520,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -640,8 +648,6 @@
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@
@@ -684,8 +690,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/dataurisrc/gstdataurisrc.c b/gst/dataurisrc/gstdataurisrc.c
index fe018b0..84ec894 100644
--- a/gst/dataurisrc/gstdataurisrc.c
+++ b/gst/dataurisrc/gstdataurisrc.c
@@ -99,8 +99,7 @@
"URI that should be used",
NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (element_class, &src_template);
gst_element_class_set_static_metadata (element_class,
"data: URI source element", "Source", "Handles data: uris",
"Philippe Normand <pnormand@igalia.com>, "
diff --git a/gst/dccp/Makefile.in b/gst/dccp/Makefile.in
index 2b8fc41..6248784 100644
--- a/gst/dccp/Makefile.in
+++ b/gst/dccp/Makefile.in
@@ -309,6 +309,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -330,6 +332,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -379,6 +383,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -524,6 +530,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -650,8 +658,6 @@
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@
@@ -694,8 +700,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/dccp/gstdccp_common.h b/gst/dccp/gstdccp_common.h
index 3851e51..c88f8ef 100644
--- a/gst/dccp/gstdccp_common.h
+++ b/gst/dccp/gstdccp_common.h
@@ -38,9 +38,19 @@
#define socklen_t int
#endif
#endif
+
+#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
-#include <_stdint.h>
+#endif
+
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
#include <unistd.h>
+#endif
+
#include <string.h>
#endif /* __GST_DCCP_NET_H__ */
diff --git a/gst/dccp/gstdccpclientsink.c b/gst/dccp/gstdccpclientsink.c
index 9e1f999..058db2b 100644
--- a/gst/dccp/gstdccpclientsink.c
+++ b/gst/dccp/gstdccpclientsink.c
@@ -239,8 +239,7 @@
{
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sinktemplate));
+ gst_element_class_add_static_pad_template (element_class, &sinktemplate);
gst_element_class_set_static_metadata (element_class, "DCCP client sink",
"Sink/Network",
diff --git a/gst/dccp/gstdccpclientsrc.c b/gst/dccp/gstdccpclientsrc.c
index a467a87..21ac8e2 100644
--- a/gst/dccp/gstdccpclientsrc.c
+++ b/gst/dccp/gstdccpclientsrc.c
@@ -272,8 +272,7 @@
{
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&srctemplate));
+ gst_element_class_add_static_pad_template (element_class, &srctemplate);
gst_element_class_set_static_metadata (element_class, "DCCP client source",
"Source/Network",
diff --git a/gst/dccp/gstdccpserversink.c b/gst/dccp/gstdccpserversink.c
index 98e0960..7623523 100644
--- a/gst/dccp/gstdccpserversink.c
+++ b/gst/dccp/gstdccpserversink.c
@@ -336,8 +336,7 @@
{
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sinktemplate));
+ gst_element_class_add_static_pad_template (element_class, &sinktemplate);
gst_element_class_set_static_metadata (element_class, "DCCP server sink",
"Sink/Network",
diff --git a/gst/dccp/gstdccpserversrc.c b/gst/dccp/gstdccpserversrc.c
index d8e231d..357a8d1 100644
--- a/gst/dccp/gstdccpserversrc.c
+++ b/gst/dccp/gstdccpserversrc.c
@@ -262,8 +262,7 @@
{
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&srctemplate));
+ gst_element_class_add_static_pad_template (element_class, &srctemplate);
gst_element_class_set_static_metadata (element_class, "DCCP server source",
"Source/Network",
diff --git a/gst/debugutils/Makefile.in b/gst/debugutils/Makefile.in
index e5ad858..bb1c977 100644
--- a/gst/debugutils/Makefile.in
+++ b/gst/debugutils/Makefile.in
@@ -310,6 +310,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -331,6 +333,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -380,6 +384,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -525,6 +531,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -651,8 +659,6 @@
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@
@@ -695,8 +701,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/debugutils/fpsdisplaysink.c b/gst/debugutils/fpsdisplaysink.c
index 92b3201..00f89a3 100644
--- a/gst/debugutils/fpsdisplaysink.c
+++ b/gst/debugutils/fpsdisplaysink.c
@@ -205,8 +205,8 @@
gstelement_klass->change_state = fps_display_sink_change_state;
- gst_element_class_add_pad_template (gstelement_klass,
- gst_static_pad_template_get (&fps_display_sink_template));
+ gst_element_class_add_static_pad_template (gstelement_klass,
+ &fps_display_sink_template);
gst_element_class_set_static_metadata (gstelement_klass,
"Measure and show framerate on videosink", "Sink/Video",
diff --git a/gst/debugutils/gstchecksumsink.c b/gst/debugutils/gstchecksumsink.c
index dd55d30..5560a14 100644
--- a/gst/debugutils/gstchecksumsink.c
+++ b/gst/debugutils/gstchecksumsink.c
@@ -25,6 +25,10 @@
#include <gst/base/gstbasesink.h>
#include "gstchecksumsink.h"
+static void gst_checksum_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_checksum_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
static void gst_checksum_sink_dispose (GObject * object);
static void gst_checksum_sink_finalize (GObject * object);
@@ -33,6 +37,12 @@
static GstFlowReturn
gst_checksum_sink_render (GstBaseSink * sink, GstBuffer * buffer);
+enum
+{
+ PROP_0,
+ PROP_HASH,
+};
+
static GstStaticPadTemplate gst_checksum_sink_sink_template =
GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
@@ -47,6 +57,26 @@
/* class initialization */
+#define GST_TYPE_CHECKSUM_SINK_HASH (gst_checksum_sink_hash_get_type ())
+static GType
+gst_checksum_sink_hash_get_type (void)
+{
+ static GType gtype = 0;
+
+ if (gtype == 0) {
+ static const GEnumValue values[] = {
+ {G_CHECKSUM_MD5, "MD5", "md5"},
+ {G_CHECKSUM_SHA1, "SHA-1", "sha1"},
+ {G_CHECKSUM_SHA256, "SHA-256", "sha256"},
+ {G_CHECKSUM_SHA512, "SHA-512", "sha512"},
+ {0, NULL, NULL},
+ };
+
+ gtype = g_enum_register_static ("GstChecksumSinkHash", values);
+ }
+ return gtype;
+}
+
#define gst_checksum_sink_parent_class parent_class
G_DEFINE_TYPE (GstChecksumSink, gst_checksum_sink, GST_TYPE_BASE_SINK);
@@ -57,16 +87,23 @@
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
GstBaseSinkClass *base_sink_class = GST_BASE_SINK_CLASS (klass);
+ gobject_class->set_property = gst_checksum_sink_set_property;
+ gobject_class->get_property = gst_checksum_sink_get_property;
gobject_class->dispose = gst_checksum_sink_dispose;
gobject_class->finalize = gst_checksum_sink_finalize;
base_sink_class->start = GST_DEBUG_FUNCPTR (gst_checksum_sink_start);
base_sink_class->stop = GST_DEBUG_FUNCPTR (gst_checksum_sink_stop);
base_sink_class->render = GST_DEBUG_FUNCPTR (gst_checksum_sink_render);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_checksum_sink_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_checksum_sink_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_checksum_sink_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_checksum_sink_sink_template);
+
+ g_object_class_install_property (gobject_class, PROP_HASH,
+ g_param_spec_enum ("hash", "Hash", "Checksum type",
+ gst_checksum_sink_hash_get_type (), G_CHECKSUM_SHA1,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
gst_element_class_set_static_metadata (element_class, "Checksum sink",
"Debug/Sink", "Calculates a checksum for buffers",
@@ -77,15 +114,48 @@
gst_checksum_sink_init (GstChecksumSink * checksumsink)
{
gst_base_sink_set_sync (GST_BASE_SINK (checksumsink), FALSE);
+ checksumsink->hash = G_CHECKSUM_SHA1;
}
-void
+static void
+gst_checksum_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstChecksumSink *checksumsink = GST_CHECKSUM_SINK (object);
+
+ switch (prop_id) {
+ case PROP_HASH:
+ checksumsink->hash = g_value_get_enum (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_checksum_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstChecksumSink *checksumsink = GST_CHECKSUM_SINK (object);
+
+ switch (prop_id) {
+ case PROP_HASH:
+ g_value_set_enum (value, checksumsink->hash);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
gst_checksum_sink_dispose (GObject * object)
{
G_OBJECT_CLASS (parent_class)->dispose (object);
}
-void
+static void
gst_checksum_sink_finalize (GObject * object)
{
G_OBJECT_CLASS (parent_class)->finalize (object);
@@ -108,9 +178,11 @@
{
gchar *s;
GstMapInfo map;
+ GstChecksumSink *checksumsink;
+ checksumsink = GST_CHECKSUM_SINK (sink);
gst_buffer_map (buffer, &map, GST_MAP_READ);
- s = g_compute_checksum_for_data (G_CHECKSUM_SHA1, map.data, map.size);
+ s = g_compute_checksum_for_data (checksumsink->hash, map.data, map.size);
gst_buffer_unmap (buffer, &map);
g_print ("%" GST_TIME_FORMAT " %s\n",
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)), s);
diff --git a/gst/debugutils/gstchecksumsink.h b/gst/debugutils/gstchecksumsink.h
index d714628..d86ced4 100644
--- a/gst/debugutils/gstchecksumsink.h
+++ b/gst/debugutils/gstchecksumsink.h
@@ -37,7 +37,7 @@
struct _GstChecksumSink
{
GstBaseSink base_checksumsink;
-
+ GChecksumType hash;
};
struct _GstChecksumSinkClass
diff --git a/gst/debugutils/gstchopmydata.c b/gst/debugutils/gstchopmydata.c
index ceff7e5..c382d32 100644
--- a/gst/debugutils/gstchopmydata.c
+++ b/gst/debugutils/gstchopmydata.c
@@ -121,10 +121,10 @@
"Step increment for random buffer sizes", 1, G_MAXINT,
DEFAULT_MAX_SIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_chop_my_data_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_chop_my_data_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_chop_my_data_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_chop_my_data_sink_template);
gst_element_class_set_static_metadata (element_class, "FIXME",
"Generic", "FIXME", "David Schleef <ds@schleef.org>");
diff --git a/gst/debugutils/gstcompare.c b/gst/debugutils/gstcompare.c
index 3d52615..777a8d8 100644
--- a/gst/debugutils/gstcompare.c
+++ b/gst/debugutils/gstcompare.c
@@ -169,12 +169,10 @@
"Whether threshold value is upper bound or lower bound for difference measure",
DEFAULT_UPPER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&check_sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_factory);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &check_sink_factory);
gst_element_class_set_static_metadata (gstelement_class, "Compare buffers",
"Filter/Debug", "Compares incoming buffers",
"Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>");
diff --git a/gst/debugutils/gstdebugspy.c b/gst/debugutils/gstdebugspy.c
index 19e7cf2..fed2db1 100644
--- a/gst/debugutils/gstdebugspy.c
+++ b/gst/debugutils/gstdebugspy.c
@@ -139,10 +139,8 @@
"DebugSpy provides information on buffers with bus messages",
"Guillaume Emont <gemont@igalia.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
GST_DEBUG_CATEGORY_INIT (gst_debug_spy_debug, "debugspy", 0, "debugspy");
}
diff --git a/gst/debugutils/gsterrorignore.c b/gst/debugutils/gsterrorignore.c
index 3c19ed5..ed42a05 100644
--- a/gst/debugutils/gsterrorignore.c
+++ b/gst/debugutils/gsterrorignore.c
@@ -92,10 +92,8 @@
"Pass through all packets but ignore some GstFlowReturn types",
"Vivia Nikolaidou <vivia@toolsonair.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));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_template);
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_template);
gstelement_class->change_state = gst_error_ignore_change_state;
diff --git a/gst/dvbsuboverlay/Makefile.in b/gst/dvbsuboverlay/Makefile.in
index 0f1fc17..c3cd836 100644
--- a/gst/dvbsuboverlay/Makefile.in
+++ b/gst/dvbsuboverlay/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/dvbsuboverlay/gstdvbsuboverlay.c b/gst/dvbsuboverlay/gstdvbsuboverlay.c
index 3658201..0b0062b 100644
--- a/gst/dvbsuboverlay/gstdvbsuboverlay.c
+++ b/gst/dvbsuboverlay/gstdvbsuboverlay.c
@@ -162,12 +162,11 @@
gstelement_class->change_state =
GST_DEBUG_FUNCPTR (gst_dvbsub_overlay_change_state);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&video_sink_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&text_sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &video_sink_factory);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &text_sink_factory);
gst_element_class_set_static_metadata (gstelement_class,
"DVB Subtitles Overlay",
@@ -1129,7 +1128,7 @@
overlay->current_comp);
} else {
GST_DEBUG_OBJECT (overlay, "Blending overlay image to video buffer");
- gst_video_frame_map (&frame, &overlay->info, buffer, GST_MAP_WRITE);
+ gst_video_frame_map (&frame, &overlay->info, buffer, GST_MAP_READWRITE);
gst_video_overlay_composition_blend (overlay->current_comp, &frame);
gst_video_frame_unmap (&frame);
}
diff --git a/gst/dvdspu/Makefile.in b/gst/dvdspu/Makefile.in
index 009b2f6..040bf04 100644
--- a/gst/dvdspu/Makefile.in
+++ b/gst/dvdspu/Makefile.in
@@ -306,6 +306,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -327,6 +329,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -376,6 +380,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -521,6 +527,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -647,8 +655,6 @@
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@
@@ -691,8 +697,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/dvdspu/gstdvdspu.c b/gst/dvdspu/gstdvdspu.c
index 84f5ba8..fb21748 100644
--- a/gst/dvdspu/gstdvdspu.c
+++ b/gst/dvdspu/gstdvdspu.c
@@ -131,12 +131,11 @@
gstelement_class->change_state = gst_dvd_spu_change_state;
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&video_sink_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&subpic_sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &video_sink_factory);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &subpic_sink_factory);
gst_element_class_set_static_metadata (gstelement_class,
"Sub-picture Overlay", "Mixer/Video/Overlay/SubPicture/DVD/Bluray",
diff --git a/gst/faceoverlay/Makefile.in b/gst/faceoverlay/Makefile.in
index db2a418..755a258 100644
--- a/gst/faceoverlay/Makefile.in
+++ b/gst/faceoverlay/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/faceoverlay/gstfaceoverlay.c b/gst/faceoverlay/gstfaceoverlay.c
index 2a84b54..19006f3 100644
--- a/gst/faceoverlay/gstfaceoverlay.c
+++ b/gst/faceoverlay/gstfaceoverlay.c
@@ -286,10 +286,8 @@
"Overlays SVG graphics over a detected face in a video stream",
"Laura Lucas Alday <lauralucas@gmail.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
}
static void
diff --git a/gst/festival/Makefile.in b/gst/festival/Makefile.in
index 1140829..a4fe21f 100644
--- a/gst/festival/Makefile.in
+++ b/gst/festival/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/festival/gstfestival.c b/gst/festival/gstfestival.c
index 00ef82d..981ec61 100644
--- a/gst/festival/gstfestival.c
+++ b/gst/festival/gstfestival.c
@@ -163,10 +163,10 @@
GST_DEBUG_FUNCPTR (gst_festival_change_state);
/* register pads */
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_template_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_template_factory));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &sink_template_factory);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &src_template_factory);
gst_element_class_set_static_metadata (gstelement_class,
"Festival Text-to-Speech synthesizer", "Filter/Effect/Audio",
diff --git a/gst/fieldanalysis/Makefile.in b/gst/fieldanalysis/Makefile.in
index 2f77894..63b63d4 100644
--- a/gst/fieldanalysis/Makefile.in
+++ b/gst/fieldanalysis/Makefile.in
@@ -331,6 +331,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -352,6 +354,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -401,6 +405,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -546,6 +552,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -672,8 +680,6 @@
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@
@@ -716,8 +722,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/fieldanalysis/gstfieldanalysis.c b/gst/fieldanalysis/gstfieldanalysis.c
index 260eaf3..ac6bf60 100644
--- a/gst/fieldanalysis/gstfieldanalysis.c
+++ b/gst/fieldanalysis/gstfieldanalysis.c
@@ -284,10 +284,8 @@
"Analyse fields from video frames to identify if they are progressive/telecined/interlaced",
"Robert Swain <robert.swain@collabora.co.uk>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_factory);
}
diff --git a/gst/fieldanalysis/gstfieldanalysisorc-dist.c b/gst/fieldanalysis/gstfieldanalysisorc-dist.c
index 1ae0143..7d00a73 100644
--- a/gst/fieldanalysis/gstfieldanalysisorc-dist.c
+++ b/gst/fieldanalysis/gstfieldanalysisorc-dist.c
@@ -283,7 +283,7 @@
static const orc_uint8 bc[] = {
1, 9, 44, 102, 105, 101, 108, 100, 97, 110, 97, 108, 121, 115, 105, 115,
95, 111, 114, 99, 95, 115, 97, 109, 101, 95, 112, 97, 114, 105, 116,
- 121,
+ 121,
95, 115, 97, 100, 95, 112, 108, 97, 110, 97, 114, 95, 121, 117, 118, 12,
1, 1, 12, 1, 1, 13, 4, 16, 4, 20, 2, 20, 2, 20, 4, 20,
4, 150, 32, 4, 150, 33, 5, 98, 32, 32, 33, 69, 32, 32, 154, 34,
@@ -466,9 +466,9 @@
static const orc_uint8 bc[] = {
1, 9, 44, 102, 105, 101, 108, 100, 97, 110, 97, 108, 121, 115, 105, 115,
95, 111, 114, 99, 95, 115, 97, 109, 101, 95, 112, 97, 114, 105, 116,
- 121,
+ 121,
95, 115, 115, 100, 95, 112, 108, 97, 110, 97, 114, 95, 121, 117, 118,
- 12,
+ 12,
1, 1, 12, 1, 1, 13, 4, 16, 4, 20, 2, 20, 2, 20, 4, 20,
4, 150, 32, 4, 150, 33, 5, 98, 32, 32, 33, 176, 34, 32, 32, 111,
35, 34, 24, 106, 34, 34, 35, 181, 12, 34, 2, 0,
@@ -758,7 +758,7 @@
static const orc_uint8 bc[] = {
1, 9, 46, 102, 105, 101, 108, 100, 97, 110, 97, 108, 121, 115, 105, 115,
95, 111, 114, 99, 95, 115, 97, 109, 101, 95, 112, 97, 114, 105, 116,
- 121,
+ 121,
95, 51, 95, 116, 97, 112, 95, 112, 108, 97, 110, 97, 114, 95, 121, 117,
118, 12, 1, 1, 12, 1, 1, 12, 1, 1, 12, 1, 1, 12, 1, 1,
12, 1, 1, 13, 4, 14, 2, 2, 0, 0, 0, 16, 4, 20, 2, 20,
@@ -1085,7 +1085,7 @@
static const orc_uint8 bc[] = {
1, 9, 50, 102, 105, 101, 108, 100, 97, 110, 97, 108, 121, 115, 105, 115,
95, 111, 114, 99, 95, 111, 112, 112, 111, 115, 105, 116, 101, 95, 112,
- 97,
+ 97,
114, 105, 116, 121, 95, 53, 95, 116, 97, 112, 95, 112, 108, 97, 110, 97,
114, 95, 121, 117, 118, 12, 1, 1, 12, 1, 1, 12, 1, 1, 12, 1,
1, 12, 1, 1, 13, 4, 14, 2, 2, 0, 0, 0, 14, 2, 3, 0,
diff --git a/gst/freeverb/Makefile.in b/gst/freeverb/Makefile.in
index ee24cd9..5ac2dbc 100644
--- a/gst/freeverb/Makefile.in
+++ b/gst/freeverb/Makefile.in
@@ -305,6 +305,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -326,6 +328,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -375,6 +379,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -520,6 +526,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -646,8 +654,6 @@
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@
@@ -690,8 +696,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/freeverb/gstfreeverb.c b/gst/freeverb/gstfreeverb.c
index 9500334..e4263e5 100644
--- a/gst/freeverb/gstfreeverb.c
+++ b/gst/freeverb/gstfreeverb.c
@@ -424,10 +424,8 @@
"Add reverberation to audio streams",
"Stefan Sauer <ensonic@users.sf.net>");
- 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));
+ gst_element_class_add_static_pad_template (element_class, &src_template);
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
GST_BASE_TRANSFORM_CLASS (klass)->get_unit_size =
GST_DEBUG_FUNCPTR (gst_freeverb_get_unit_size);
diff --git a/gst/frei0r/Makefile.in b/gst/frei0r/Makefile.in
index f91296e..53b2744 100644
--- a/gst/frei0r/Makefile.in
+++ b/gst/frei0r/Makefile.in
@@ -306,6 +306,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -327,6 +329,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -376,6 +380,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -521,6 +527,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -647,8 +655,6 @@
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@
@@ -691,8 +697,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/gaudieffects/Makefile.in b/gst/gaudieffects/Makefile.in
index cee102b..67e58cb 100644
--- a/gst/gaudieffects/Makefile.in
+++ b/gst/gaudieffects/Makefile.in
@@ -337,6 +337,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -358,6 +360,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -407,6 +411,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -552,6 +558,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -678,8 +686,6 @@
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@
@@ -722,8 +728,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/gaudieffects/gstburn.c b/gst/gaudieffects/gstburn.c
index a3a3c55..ee44875 100644
--- a/gst/gaudieffects/gstburn.c
+++ b/gst/gaudieffects/gstburn.c
@@ -138,10 +138,10 @@
"Burn adjusts the colors in the video signal.",
"Luis de Bethencourt <luis@debethencourt.com>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_burn_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_burn_src_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_burn_sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_burn_src_template);
gobject_class->set_property = gst_burn_set_property;
gobject_class->get_property = gst_burn_get_property;
diff --git a/gst/gaudieffects/gstchromium.c b/gst/gaudieffects/gstchromium.c
index 264bb65..65ac5b5 100644
--- a/gst/gaudieffects/gstchromium.c
+++ b/gst/gaudieffects/gstchromium.c
@@ -152,10 +152,10 @@
"Chromium breaks the colors of the video signal.",
"Luis de Bethencourt <luis@debethencourt.com>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_chromium_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_chromium_src_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_chromium_sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_chromium_src_template);
gobject_class->set_property = gst_chromium_set_property;
gobject_class->get_property = gst_chromium_get_property;
diff --git a/gst/gaudieffects/gstchromium.h b/gst/gaudieffects/gstchromium.h
index 4d54e2a..8c3b4a0 100644
--- a/gst/gaudieffects/gstchromium.h
+++ b/gst/gaudieffects/gstchromium.h
@@ -62,10 +62,10 @@
#define GST_IS_CHROMIUM_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CHROMIUM))
-typedef struct GstChromium GstChromium;
-typedef struct GstChromiumClass GstChromiumClass;
+typedef struct _GstChromium GstChromium;
+typedef struct _GstChromiumClass GstChromiumClass;
-struct GstChromium
+struct _GstChromium
{
GstVideoFilter videofilter;
@@ -73,7 +73,7 @@
gint edge_a, edge_b;
};
-struct GstChromiumClass
+struct _GstChromiumClass
{
GstVideoFilterClass parent_class;
};
diff --git a/gst/gaudieffects/gstdilate.c b/gst/gaudieffects/gstdilate.c
index 83a3513..301135d 100644
--- a/gst/gaudieffects/gstdilate.c
+++ b/gst/gaudieffects/gstdilate.c
@@ -140,10 +140,10 @@
"Dilate copies the brightest pixel around.",
"Luis de Bethencourt <luis@debethencourt.com>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_dilate_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_dilate_src_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_dilate_sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_dilate_src_template);
gobject_class->set_property = gst_dilate_set_property;
gobject_class->get_property = gst_dilate_get_property;
diff --git a/gst/gaudieffects/gstdodge.c b/gst/gaudieffects/gstdodge.c
index 996d894..eb5019e 100644
--- a/gst/gaudieffects/gstdodge.c
+++ b/gst/gaudieffects/gstdodge.c
@@ -135,10 +135,10 @@
"Dodge saturates the colors in the video signal.",
"Luis de Bethencourt <luis@debethencourt.com>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_dodge_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_dodge_src_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_dodge_sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_dodge_src_template);
gobject_class->set_property = gst_dodge_set_property;
gobject_class->get_property = gst_dodge_get_property;
diff --git a/gst/gaudieffects/gstexclusion.c b/gst/gaudieffects/gstexclusion.c
index a723f69..6ebe825 100644
--- a/gst/gaudieffects/gstexclusion.c
+++ b/gst/gaudieffects/gstexclusion.c
@@ -140,10 +140,10 @@
"Exclusion exclodes the colors in the video signal.",
"Luis de Bethencourt <luis@debethencourt.com>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_exclusion_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_exclusion_src_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_exclusion_sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_exclusion_src_template);
gobject_class->set_property = gst_exclusion_set_property;
gobject_class->get_property = gst_exclusion_get_property;
diff --git a/gst/gaudieffects/gstgaussblur.c b/gst/gaudieffects/gstgaussblur.c
index 6ba9b84..4e3dc59 100644
--- a/gst/gaudieffects/gstgaussblur.c
+++ b/gst/gaudieffects/gstgaussblur.c
@@ -137,10 +137,10 @@
"Perform Gaussian blur/sharpen on a video",
"Jan Schmidt <thaytan@noraisin.net>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_gaussianblur_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_gaussianblur_src_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_gaussianblur_sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_gaussianblur_src_template);
gobject_class->set_property = gst_gaussianblur_set_property;
gobject_class->get_property = gst_gaussianblur_get_property;
diff --git a/gst/gaudieffects/gstgaussblur.h b/gst/gaudieffects/gstgaussblur.h
index 84688b9..33cbb02 100644
--- a/gst/gaudieffects/gstgaussblur.h
+++ b/gst/gaudieffects/gstgaussblur.h
@@ -58,10 +58,10 @@
#define GST_GAUSSIANBLUR(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GAUSSIANBLUR, GstGaussianBlur))
-typedef struct GstGaussianBlur GstGaussianBlur;
-typedef struct GstGaussianBlurClass GstGaussianBlurClass;
+typedef struct _GstGaussianBlur GstGaussianBlur;
+typedef struct _GstGaussianBlurClass GstGaussianBlurClass;
-struct GstGaussianBlur
+struct _GstGaussianBlur
{
GstVideoFilter videofilter;
gint width, height, stride;
@@ -75,7 +75,7 @@
gint16 *smoothedim;
};
-struct GstGaussianBlurClass
+struct _GstGaussianBlurClass
{
GstVideoFilterClass parent_class;
};
diff --git a/gst/gaudieffects/gstsolarize.c b/gst/gaudieffects/gstsolarize.c
index f5d98b8..0710d0f 100644
--- a/gst/gaudieffects/gstsolarize.c
+++ b/gst/gaudieffects/gstsolarize.c
@@ -143,10 +143,10 @@
"Solarize tunable inverse in the video signal.",
"Luis de Bethencourt <luis@debethencourt.com>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_solarize_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_solarize_src_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_solarize_sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_solarize_src_template);
gobject_class->set_property = gst_solarize_set_property;
gobject_class->get_property = gst_solarize_get_property;
diff --git a/gst/gdp/Makefile.in b/gst/gdp/Makefile.in
index cf4631a..592ead1 100644
--- a/gst/gdp/Makefile.in
+++ b/gst/gdp/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/gdp/dataprotocol.c b/gst/gdp/dataprotocol.c
index fbb46a6..d6534ba 100644
--- a/gst/gdp/dataprotocol.c
+++ b/gst/gdp/dataprotocol.c
@@ -477,6 +477,8 @@
* gst_dp_buffer_from_header:
* @header_length: the length of the packet header
* @header: the byte array of the packet header
+ * @allocator: the allocator used to allocate the new #GstBuffer
+ * @allocation_params: the allocations parameters used to allocate the new #GstBuffer
*
* Creates a newly allocated #GstBuffer from the given header.
* The buffer data needs to be copied into it before validating.
@@ -490,7 +492,8 @@
* Returns: A #GstBuffer if the buffer was successfully created, or NULL.
*/
GstBuffer *
-gst_dp_buffer_from_header (guint header_length, const guint8 * header)
+gst_dp_buffer_from_header (guint header_length, const guint8 * header,
+ GstAllocator * allocator, GstAllocationParams * allocation_params)
{
GstBuffer *buffer;
@@ -500,8 +503,8 @@
GST_DP_PAYLOAD_BUFFER, NULL);
buffer =
- gst_buffer_new_allocate (NULL,
- (guint) GST_DP_HEADER_PAYLOAD_LENGTH (header), NULL);
+ gst_buffer_new_allocate (allocator,
+ (guint) GST_DP_HEADER_PAYLOAD_LENGTH (header), allocation_params);
GST_BUFFER_TIMESTAMP (buffer) = GST_DP_HEADER_TIMESTAMP (header);
GST_BUFFER_DTS (buffer) = GST_DP_HEADER_DTS (header);
diff --git a/gst/gdp/dataprotocol.h b/gst/gdp/dataprotocol.h
index ac1d010..397bf43 100644
--- a/gst/gdp/dataprotocol.h
+++ b/gst/gdp/dataprotocol.h
@@ -78,7 +78,9 @@
/* converting to GstBuffer/GstEvent/GstCaps */
GstBuffer * gst_dp_buffer_from_header (guint header_length,
- const guint8 * header);
+ const guint8 * header,
+ GstAllocator * allocator,
+ GstAllocationParams * allocation_params);
GstCaps * gst_dp_caps_from_packet (guint header_length,
const guint8 * header,
const guint8 * payload);
diff --git a/gst/gdp/gstgdpdepay.c b/gst/gdp/gstgdpdepay.c
index b779a85..b7269bd 100644
--- a/gst/gdp/gstgdpdepay.c
+++ b/gst/gdp/gstgdpdepay.c
@@ -86,6 +86,7 @@
const GValue * value, GParamSpec * pspec);
static void gst_gdp_depay_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
+static void gst_gdp_depay_decide_allocation (GstGDPDepay * depay);
static void
gst_gdp_depay_class_init (GstGDPDepayClass * klass)
@@ -110,10 +111,10 @@
"Depayloads GStreamer Data Protocol buffers",
"Thomas Vander Stichele <thomas at apestaart dot org>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gdp_depay_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gdp_depay_src_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gdp_depay_sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gdp_depay_src_template);
gstelement_class->change_state =
GST_DEBUG_FUNCPTR (gst_gdp_depay_change_state);
@@ -140,6 +141,9 @@
gst_element_add_pad (GST_ELEMENT (gdpdepay), gdpdepay->srcpad);
gdpdepay->adapter = gst_adapter_new ();
+
+ gdpdepay->allocator = NULL;
+ gst_allocation_params_init (&gdpdepay->allocation_params);
}
static void
@@ -153,6 +157,8 @@
g_free (this->header);
gst_adapter_clear (this->adapter);
g_object_unref (this->adapter);
+ if (this->allocator)
+ gst_object_unref (this->allocator);
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (gobject));
}
@@ -265,6 +271,10 @@
this = GST_GDP_DEPAY (parent);
+ if (gst_pad_check_reconfigure (this->srcpad)) {
+ gst_gdp_depay_decide_allocation (this);
+ }
+
/* On DISCONT, get rid of accumulated data. We assume a buffer after the
* DISCONT contains (part of) a new valid header, if not we error because we
* lost sync */
@@ -352,7 +362,9 @@
goto no_caps;
GST_LOG_OBJECT (this, "reading GDP buffer from adapter");
- buf = gst_dp_buffer_from_header (GST_DP_HEADER_LENGTH, this->header);
+ buf =
+ gst_dp_buffer_from_header (GST_DP_HEADER_LENGTH, this->header,
+ this->allocator, &this->allocation_params);
if (!buf)
goto buffer_failed;
@@ -411,6 +423,7 @@
GST_DEBUG_OBJECT (this, "deserialized caps %" GST_PTR_FORMAT, caps);
gst_caps_replace (&(this->caps), caps);
gst_pad_set_caps (this->srcpad, caps);
+ gst_gdp_depay_decide_allocation (this);
/* drop the creation ref we still have */
gst_caps_unref (caps);
@@ -521,6 +534,10 @@
this->caps = NULL;
}
gst_adapter_clear (this->adapter);
+ if (this->allocator)
+ gst_object_unref (this->allocator);
+ this->allocator = NULL;
+ gst_allocation_params_init (&this->allocation_params);
break;
default:
break;
@@ -528,6 +545,43 @@
return ret;
}
+static void
+gst_gdp_depay_decide_allocation (GstGDPDepay * gdpdepay)
+{
+ GstAllocator *allocator;
+ GstAllocationParams params;
+ GstQuery *query = NULL;
+ GstCaps *caps;
+
+ caps = gst_pad_query_caps (gdpdepay->srcpad, NULL);
+ if (!caps) {
+ GST_LOG_OBJECT (gdpdepay,
+ "No peer pad caps found. Using default allocator.");
+ return;
+ }
+
+ query = gst_query_new_allocation (caps, TRUE);
+ if (!gst_pad_peer_query (gdpdepay->srcpad, query)) {
+ GST_WARNING_OBJECT (gdpdepay, "Peer allocation query failed.");
+ }
+
+ if (gst_query_get_n_allocation_params (query) > 0) {
+ gst_query_parse_nth_allocation_param (query, 0, &allocator, ¶ms);
+ } else {
+ allocator = NULL;
+ gst_allocation_params_init (¶ms);
+ }
+
+ if (gdpdepay->allocator)
+ gst_object_unref (gdpdepay->allocator);
+
+ gdpdepay->allocator = allocator;
+ gdpdepay->allocation_params = params;
+
+ gst_caps_unref (caps);
+ gst_query_unref (query);
+}
+
gboolean
gst_gdp_depay_plugin_init (GstPlugin * plugin)
{
diff --git a/gst/gdp/gstgdpdepay.h b/gst/gdp/gstgdpdepay.h
index 43bbf9d..c21f302 100644
--- a/gst/gdp/gstgdpdepay.h
+++ b/gst/gdp/gstgdpdepay.h
@@ -68,6 +68,9 @@
GstDPPayloadType payload_type;
gint64 ts_offset;
+
+ GstAllocator *allocator;
+ GstAllocationParams allocation_params;
};
struct _GstGDPDepayClass
diff --git a/gst/gdp/gstgdppay.c b/gst/gdp/gstgdppay.c
index b428462..6b55895 100644
--- a/gst/gdp/gstgdppay.c
+++ b/gst/gdp/gstgdppay.c
@@ -117,10 +117,10 @@
"Payloads GStreamer Data Protocol buffers",
"Thomas Vander Stichele <thomas at apestaart dot org>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gdp_pay_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gdp_pay_src_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gdp_pay_sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gdp_pay_src_template);
gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_gdp_pay_change_state);
}
diff --git a/gst/geometrictransform/Makefile.in b/gst/geometrictransform/Makefile.in
index a1b5f61..b5a8c51 100644
--- a/gst/geometrictransform/Makefile.in
+++ b/gst/geometrictransform/Makefile.in
@@ -325,6 +325,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -346,6 +348,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -395,6 +399,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -540,6 +546,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -666,8 +674,6 @@
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@
@@ -710,8 +716,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/geometrictransform/gstgeometrictransform.c b/gst/geometrictransform/gstgeometrictransform.c
index 94910ed..a6c00a8 100644
--- a/gst/geometrictransform/gstgeometrictransform.c
+++ b/gst/geometrictransform/gstgeometrictransform.c
@@ -352,10 +352,10 @@
{
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_geometric_transform_sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_geometric_transform_src_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_geometric_transform_sink_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_geometric_transform_src_template);
}
static void
diff --git a/gst/hdvparse/Makefile.in b/gst/hdvparse/Makefile.in
index de0f5e0..05f1297 100644
--- a/gst/hdvparse/Makefile.in
+++ b/gst/hdvparse/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/hdvparse/gsthdvparse.c b/gst/hdvparse/gsthdvparse.c
index 837c74e..b899e95 100644
--- a/gst/hdvparse/gsthdvparse.c
+++ b/gst/hdvparse/gsthdvparse.c
@@ -116,10 +116,8 @@
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
- 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));
+ gst_element_class_add_static_pad_template (element_class, &src_template);
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_set_static_metadata (element_class, "HDVParser",
"Data/Parser",
"HDV private stream Parser", "Edward Hervey <bilboed@bilboed.com>");
diff --git a/gst/id3tag/Makefile.in b/gst/id3tag/Makefile.in
index ef09091..9c9e3c4 100644
--- a/gst/id3tag/Makefile.in
+++ b/gst/id3tag/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/id3tag/gstid3mux.c b/gst/id3tag/gstid3mux.c
index 6417538..37c7a49 100644
--- a/gst/id3tag/gstid3mux.c
+++ b/gst/id3tag/gstid3mux.c
@@ -129,11 +129,8 @@
"Michael Smith <msmith@songbirdnest.com>, "
"Tim-Philipp Müller <tim centricular net>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
+ gst_element_class_add_static_pad_template (element_class, &src_template);
}
static void
diff --git a/gst/inter/Makefile.in b/gst/inter/Makefile.in
index fdec405..e00e5e1 100644
--- a/gst/inter/Makefile.in
+++ b/gst/inter/Makefile.in
@@ -319,6 +319,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -340,6 +342,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -389,6 +393,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -534,6 +540,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -660,8 +668,6 @@
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@
@@ -704,8 +710,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/inter/gstinteraudiosink.c b/gst/inter/gstinteraudiosink.c
index 261ed25..19fc5d2 100644
--- a/gst/inter/gstinteraudiosink.c
+++ b/gst/inter/gstinteraudiosink.c
@@ -99,8 +99,8 @@
GST_DEBUG_CATEGORY_INIT (gst_inter_audio_sink_debug_category,
"interaudiosink", 0, "debug category for interaudiosink element");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_inter_audio_sink_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_inter_audio_sink_sink_template);
gst_element_class_set_static_metadata (element_class,
"Internal audio sink",
diff --git a/gst/inter/gstinteraudiosrc.c b/gst/inter/gstinteraudiosrc.c
index 1d4b68b..10581ba 100644
--- a/gst/inter/gstinteraudiosrc.c
+++ b/gst/inter/gstinteraudiosrc.c
@@ -106,8 +106,8 @@
GST_DEBUG_CATEGORY_INIT (gst_inter_audio_src_debug_category, "interaudiosrc",
0, "debug category for interaudiosrc element");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_inter_audio_src_src_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_inter_audio_src_src_template);
gst_element_class_set_static_metadata (element_class,
"Internal audio source",
diff --git a/gst/inter/gstintersubsink.c b/gst/inter/gstintersubsink.c
index 77bc484..038acbb 100644
--- a/gst/inter/gstintersubsink.c
+++ b/gst/inter/gstintersubsink.c
@@ -91,8 +91,8 @@
GST_DEBUG_CATEGORY_INIT (gst_inter_sub_sink_debug_category, "intersubsink", 0,
"debug category for intersubsink element");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_inter_sub_sink_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_inter_sub_sink_sink_template);
gst_element_class_set_static_metadata (element_class,
"Internal subtitle sink",
diff --git a/gst/inter/gstintersubsrc.c b/gst/inter/gstintersubsrc.c
index 482a20f..ac49265 100644
--- a/gst/inter/gstintersubsrc.c
+++ b/gst/inter/gstintersubsrc.c
@@ -93,8 +93,8 @@
GST_DEBUG_CATEGORY_INIT (gst_inter_sub_src_debug_category, "intersubsrc", 0,
"debug category for intersubsrc element");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_inter_sub_src_src_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_inter_sub_src_src_template);
gst_element_class_set_static_metadata (element_class,
"Internal subtitle source",
diff --git a/gst/inter/gstintervideosink.c b/gst/inter/gstintervideosink.c
index ca357d6..edee11d 100644
--- a/gst/inter/gstintervideosink.c
+++ b/gst/inter/gstintervideosink.c
@@ -94,8 +94,8 @@
GST_DEBUG_CATEGORY_INIT (gst_inter_video_sink_debug_category,
"intervideosink", 0, "debug category for intervideosink element");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_inter_video_sink_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_inter_video_sink_sink_template);
gst_element_class_set_static_metadata (element_class,
"Internal video sink",
diff --git a/gst/inter/gstintervideosrc.c b/gst/inter/gstintervideosrc.c
index 8cab648..fd41d50 100644
--- a/gst/inter/gstintervideosrc.c
+++ b/gst/inter/gstintervideosrc.c
@@ -100,8 +100,8 @@
GST_DEBUG_CATEGORY_INIT (gst_inter_video_src_debug_category, "intervideosrc",
0, "debug category for intervideosrc element");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_inter_video_src_src_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_inter_video_src_src_template);
gst_element_class_set_static_metadata (element_class,
"Internal video source",
diff --git a/gst/interlace/Makefile.in b/gst/interlace/Makefile.in
index 0753198..aaffb82 100644
--- a/gst/interlace/Makefile.in
+++ b/gst/interlace/Makefile.in
@@ -299,6 +299,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -320,6 +322,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -369,6 +373,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -514,6 +520,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -640,8 +648,6 @@
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@
@@ -684,8 +690,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/interlace/gstinterlace.c b/gst/interlace/gstinterlace.c
index ae9f2de..88e68c0 100644
--- a/gst/interlace/gstinterlace.c
+++ b/gst/interlace/gstinterlace.c
@@ -104,6 +104,7 @@
GstClockTime timebase;
int fields_since_timebase;
guint pattern_offset; /* initial offset into the pattern */
+ gboolean passthrough;
};
struct _GstInterlaceClass
@@ -182,7 +183,7 @@
GST_PAD_ALWAYS,
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE
("{AYUV,YUY2,UYVY,I420,YV12,Y42B,Y444,NV12,NV21}")
- ",interlace-mode=progressive")
+ )
);
GType gst_interlace_get_type (void);
@@ -247,10 +248,10 @@
"Creates an interlaced video from progressive frames",
"David Schleef <ds@schleef.org>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_interlace_sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_interlace_src_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_interlace_sink_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_interlace_src_template);
element_class->change_state = gst_interlace_change_state;
}
@@ -267,6 +268,7 @@
interlace->phase_index = interlace->pattern_offset;
interlace->timebase = GST_CLOCK_TIME_NONE;
interlace->field_index = 0;
+ interlace->passthrough = FALSE;
if (interlace->stored_frame) {
gst_buffer_unref (interlace->stored_frame);
interlace->stored_frame = NULL;
@@ -392,8 +394,21 @@
gst_caps_set_simple (othercaps, "interlace-mode", G_TYPE_STRING,
"interleaved", NULL);
}
- gst_caps_set_simple (othercaps, "framerate", GST_TYPE_FRACTION,
- interlace->src_fps_n, interlace->src_fps_d, NULL);
+
+ if (gst_caps_can_intersect (caps, othercaps)) {
+ interlace->passthrough = TRUE;
+ } else {
+ if (GST_VIDEO_INFO_IS_INTERLACED (&info)) {
+ GST_ERROR_OBJECT (interlace,
+ "Caps %" GST_PTR_FORMAT " not compatible with %" GST_PTR_FORMAT, caps,
+ othercaps);
+ gst_caps_unref (othercaps);
+ goto caps_error;
+ }
+ interlace->passthrough = FALSE;
+ gst_caps_set_simple (othercaps, "framerate", GST_TYPE_FRACTION,
+ interlace->src_fps_n, interlace->src_fps_d, NULL);
+ }
ret = gst_pad_set_caps (interlace->srcpad, othercaps);
gst_caps_unref (othercaps);
@@ -686,6 +701,7 @@
}
icaps = gst_caps_make_writable (icaps);
+ tcaps = gst_caps_copy (icaps);
if (interlace->pattern > GST_INTERLACE_PATTERN_2_2) {
mode = "mixed";
} else {
@@ -693,6 +709,13 @@
}
gst_caps_set_simple (icaps, "interlace-mode", G_TYPE_STRING,
pad == interlace->srcpad ? mode : "progressive", NULL);
+ if (pad == interlace->sinkpad) {
+ gst_caps_set_simple (tcaps, "interlace-mode", G_TYPE_STRING, mode, NULL);
+ icaps = gst_caps_merge (icaps, tcaps);
+ tcaps = NULL;
+ } else {
+ gst_caps_unref (tcaps);
+ }
icaps =
gst_interlace_caps_double_framerate (icaps, (pad == interlace->srcpad));
@@ -837,6 +860,10 @@
(GST_BUFFER_FLAGS (buffer) & GST_VIDEO_BUFFER_FLAG_ONEFIELD) ? "onefield"
: "");
+ if (interlace->passthrough) {
+ return gst_pad_push (interlace->srcpad, buffer);
+ }
+
if (GST_BUFFER_FLAGS (buffer) & GST_BUFFER_FLAG_DISCONT) {
GST_DEBUG ("discont");
diff --git a/gst/ivfparse/Makefile.in b/gst/ivfparse/Makefile.in
index 8739814..fd7eaa1 100644
--- a/gst/ivfparse/Makefile.in
+++ b/gst/ivfparse/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/ivfparse/gstivfparse.c b/gst/ivfparse/gstivfparse.c
index bea1e19..e0e8401 100644
--- a/gst/ivfparse/gstivfparse.c
+++ b/gst/ivfparse/gstivfparse.c
@@ -99,10 +99,8 @@
gstbaseparse_class->stop = gst_ivf_parse_stop;
gstbaseparse_class->handle_frame = gst_ivf_parse_handle_frame;
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_factory);
gst_element_class_set_static_metadata (gstelement_class,
"IVF parser", "Codec/Demuxer",
diff --git a/gst/ivtc/Makefile.in b/gst/ivtc/Makefile.in
index adbee9e..4e559ff 100644
--- a/gst/ivtc/Makefile.in
+++ b/gst/ivtc/Makefile.in
@@ -300,6 +300,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -321,6 +323,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -370,6 +374,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -515,6 +521,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -641,8 +649,6 @@
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@
@@ -685,8 +691,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/ivtc/gstcombdetect.c b/gst/ivtc/gstcombdetect.c
index 2356b96..210d39c 100644
--- a/gst/ivtc/gstcombdetect.c
+++ b/gst/ivtc/gstcombdetect.c
@@ -103,10 +103,10 @@
/* Setting up pads and setting metadata should be moved to
base_class_init if you intend to subclass this class. */
- gst_element_class_add_pad_template (GST_ELEMENT_CLASS (klass),
- gst_static_pad_template_get (&gst_comb_detect_sink_template));
- gst_element_class_add_pad_template (GST_ELEMENT_CLASS (klass),
- gst_static_pad_template_get (&gst_comb_detect_src_template));
+ gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS (klass),
+ &gst_comb_detect_sink_template);
+ gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS (klass),
+ &gst_comb_detect_src_template);
gst_element_class_set_static_metadata (GST_ELEMENT_CLASS (klass),
"Comb Detect", "Video/Filter", "Detect combing artifacts in video stream",
diff --git a/gst/ivtc/gstivtc.c b/gst/ivtc/gstivtc.c
index 6dd0c8d..09b02a5 100644
--- a/gst/ivtc/gstivtc.c
+++ b/gst/ivtc/gstivtc.c
@@ -119,10 +119,10 @@
/* Setting up pads and setting metadata should be moved to
base_class_init if you intend to subclass this class. */
- gst_element_class_add_pad_template (GST_ELEMENT_CLASS (klass),
- gst_static_pad_template_get (&gst_ivtc_sink_template));
- gst_element_class_add_pad_template (GST_ELEMENT_CLASS (klass),
- gst_static_pad_template_get (&gst_ivtc_src_template));
+ gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS (klass),
+ &gst_ivtc_sink_template);
+ gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS (klass),
+ &gst_ivtc_src_template);
gst_element_class_set_static_metadata (GST_ELEMENT_CLASS (klass),
"Inverse Telecine", "Video/Filter", "Inverse Telecine Filter",
diff --git a/gst/jp2kdecimator/Makefile.in b/gst/jp2kdecimator/Makefile.in
index 7d1b517..7773514 100644
--- a/gst/jp2kdecimator/Makefile.in
+++ b/gst/jp2kdecimator/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/jp2kdecimator/gstjp2kdecimator.c b/gst/jp2kdecimator/gstjp2kdecimator.c
index cb95cc0..75ee746 100644
--- a/gst/jp2kdecimator/gstjp2kdecimator.c
+++ b/gst/jp2kdecimator/gstjp2kdecimator.c
@@ -92,10 +92,10 @@
"Removes information from JPEG2000 streams without recompression",
"Sebastian Dröge <sebastian.droege@collabora.co.uk>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_pad_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_pad_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &sink_pad_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &src_pad_template);
gobject_class->set_property = gst_jp2k_decimator_set_property;
gobject_class->get_property = gst_jp2k_decimator_get_property;
diff --git a/gst/jpegformat/Makefile.in b/gst/jpegformat/Makefile.in
index 2bb807d..2999ea3 100644
--- a/gst/jpegformat/Makefile.in
+++ b/gst/jpegformat/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/jpegformat/gstjifmux.c b/gst/jpegformat/gstjifmux.c
index 3a6b6fd..b1ba175 100644
--- a/gst/jpegformat/gstjifmux.c
+++ b/gst/jpegformat/gstjifmux.c
@@ -136,10 +136,10 @@
gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_jif_mux_change_state);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_jif_mux_src_pad_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_jif_mux_sink_pad_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_jif_mux_src_pad_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_jif_mux_sink_pad_template);
gst_element_class_set_static_metadata (gstelement_class,
"JPEG stream muxer",
diff --git a/gst/jpegformat/gstjpegparse.c b/gst/jpegformat/gstjpegparse.c
index 77e53a6..c127d6e 100644
--- a/gst/jpegformat/gstjpegparse.c
+++ b/gst/jpegformat/gstjpegparse.c
@@ -144,10 +144,10 @@
gstbaseparse_class->handle_frame = gst_jpeg_parse_handle_frame;
gstbaseparse_class->pre_push_frame = gst_jpeg_parse_pre_push_frame;
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_jpeg_parse_src_pad_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_jpeg_parse_sink_pad_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_jpeg_parse_src_pad_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_jpeg_parse_sink_pad_template);
gst_element_class_set_static_metadata (gstelement_class,
"JPEG stream parser",
diff --git a/gst/librfb/Makefile.am b/gst/librfb/Makefile.am
index d542ffc..b69ee8c 100644
--- a/gst/librfb/Makefile.am
+++ b/gst/librfb/Makefile.am
@@ -1,27 +1,25 @@
# please keep librfb easily extractable
-noinst_LTLIBRARIES = librfb.la
plugin_LTLIBRARIES = libgstrfbsrc.la
-libgstrfbsrc_la_SOURCES = gstrfbsrc.c
-libgstrfbsrc_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(X11_CFLAGS) -I$(srcdir)/..
-libgstrfbsrc_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) \
- $(GST_BASE_LIBS) $(GST_LIBS) $(X11_LIBS) librfb.la
-libgstrfbsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libgstrfbsrc_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
-
-librfb_la_SOURCES = \
- rfbbuffer.c \
+libgstrfbsrc_la_SOURCES = gstrfbsrc.c \
rfbdecoder.c \
d3des.c
-librfb_la_CFLAGS = $(GST_CFLAGS) $(GIO_CFLAGS) -I$(srcdir)/..
-librfb_la_LIBADD = $(GST_LIBS) $(GIO_LIBS)
+libgstrfbsrc_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(GST_CFLAGS) \
+ $(X11_CFLAGS) \
+ $(GIO_CFLAGS)
+libgstrfbsrc_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \
+ -lgstvideo-$(GST_API_VERSION) \
+ $(GST_BASE_LIBS) \
+ $(GST_LIBS) \
+ $(X11_LIBS) \
+ $(GIO_LIBS)
+libgstrfbsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(GIO_LDFLAGS)
+libgstrfbsrc_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
noinst_HEADERS = \
- rfb.h \
rfbdecoder.h \
- rfbbuffer.h \
- rfbcontext.h \
- rfbutil.h \
gstrfbsrc.h \
d3des.h
diff --git a/gst/librfb/Makefile.in b/gst/librfb/Makefile.in
index 8b8047f..b8f39f1 100644
--- a/gst/librfb/Makefile.in
+++ b/gst/librfb/Makefile.in
@@ -163,12 +163,13 @@
$(am__cd) "$$dir" && rm -f $$files; }; \
}
am__installdirs = "$(DESTDIR)$(plugindir)"
-LTLIBRARIES = $(noinst_LTLIBRARIES) $(plugin_LTLIBRARIES)
+LTLIBRARIES = $(plugin_LTLIBRARIES)
am__DEPENDENCIES_1 =
libgstrfbsrc_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) librfb.la
-am_libgstrfbsrc_la_OBJECTS = libgstrfbsrc_la-gstrfbsrc.lo
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libgstrfbsrc_la_OBJECTS = libgstrfbsrc_la-gstrfbsrc.lo \
+ libgstrfbsrc_la-rfbdecoder.lo libgstrfbsrc_la-d3des.lo
libgstrfbsrc_la_OBJECTS = $(am_libgstrfbsrc_la_OBJECTS)
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
@@ -178,13 +179,6 @@
$(libgstrfbsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
$(CCLD) $(libgstrfbsrc_la_CFLAGS) $(CFLAGS) \
$(libgstrfbsrc_la_LDFLAGS) $(LDFLAGS) -o $@
-librfb_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_librfb_la_OBJECTS = librfb_la-rfbbuffer.lo librfb_la-rfbdecoder.lo \
- librfb_la-d3des.lo
-librfb_la_OBJECTS = $(am_librfb_la_OBJECTS)
-librfb_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=link $(CCLD) $(librfb_la_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
@@ -219,8 +213,8 @@
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
am__v_CCLD_0 = @echo " CCLD " $@;
am__v_CCLD_1 =
-SOURCES = $(libgstrfbsrc_la_SOURCES) $(librfb_la_SOURCES)
-DIST_SOURCES = $(libgstrfbsrc_la_SOURCES) $(librfb_la_SOURCES)
+SOURCES = $(libgstrfbsrc_la_SOURCES)
+DIST_SOURCES = $(libgstrfbsrc_la_SOURCES)
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
@@ -312,6 +306,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -333,6 +329,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -382,6 +380,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -527,6 +527,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -653,8 +655,6 @@
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@
@@ -697,8 +697,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -787,28 +792,28 @@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
wayland_scanner = @wayland_scanner@
-noinst_LTLIBRARIES = librfb.la
plugin_LTLIBRARIES = libgstrfbsrc.la
-libgstrfbsrc_la_SOURCES = gstrfbsrc.c
-libgstrfbsrc_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(X11_CFLAGS) -I$(srcdir)/..
-libgstrfbsrc_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) \
- $(GST_BASE_LIBS) $(GST_LIBS) $(X11_LIBS) librfb.la
-
-libgstrfbsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libgstrfbsrc_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
-librfb_la_SOURCES = \
- rfbbuffer.c \
+libgstrfbsrc_la_SOURCES = gstrfbsrc.c \
rfbdecoder.c \
d3des.c
-librfb_la_CFLAGS = $(GST_CFLAGS) $(GIO_CFLAGS) -I$(srcdir)/..
-librfb_la_LIBADD = $(GST_LIBS) $(GIO_LIBS)
+libgstrfbsrc_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(GST_CFLAGS) \
+ $(X11_CFLAGS) \
+ $(GIO_CFLAGS)
+
+libgstrfbsrc_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \
+ -lgstvideo-$(GST_API_VERSION) \
+ $(GST_BASE_LIBS) \
+ $(GST_LIBS) \
+ $(X11_LIBS) \
+ $(GIO_LIBS)
+
+libgstrfbsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(GIO_LDFLAGS)
+libgstrfbsrc_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
noinst_HEADERS = \
- rfb.h \
rfbdecoder.h \
- rfbbuffer.h \
- rfbcontext.h \
- rfbutil.h \
gstrfbsrc.h \
d3des.h
@@ -846,17 +851,6 @@
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
-clean-noinstLTLIBRARIES:
- -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
- @list='$(noinst_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}; \
- }
-
install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES)
@$(NORMAL_INSTALL)
@list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \
@@ -895,19 +889,15 @@
libgstrfbsrc.la: $(libgstrfbsrc_la_OBJECTS) $(libgstrfbsrc_la_DEPENDENCIES) $(EXTRA_libgstrfbsrc_la_DEPENDENCIES)
$(AM_V_CCLD)$(libgstrfbsrc_la_LINK) -rpath $(plugindir) $(libgstrfbsrc_la_OBJECTS) $(libgstrfbsrc_la_LIBADD) $(LIBS)
-librfb.la: $(librfb_la_OBJECTS) $(librfb_la_DEPENDENCIES) $(EXTRA_librfb_la_DEPENDENCIES)
- $(AM_V_CCLD)$(librfb_la_LINK) $(librfb_la_OBJECTS) $(librfb_la_LIBADD) $(LIBS)
-
mostlyclean-compile:
-rm -f *.$(OBJEXT)
distclean-compile:
-rm -f *.tab.c
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrfbsrc_la-d3des.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrfbsrc_la-gstrfbsrc.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfb_la-d3des.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfb_la-rfbbuffer.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfb_la-rfbdecoder.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrfbsrc_la-rfbdecoder.Plo@am__quote@
.c.o:
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@@ -940,26 +930,19 @@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrfbsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrfbsrc_la_CFLAGS) $(CFLAGS) -c -o libgstrfbsrc_la-gstrfbsrc.lo `test -f 'gstrfbsrc.c' || echo '$(srcdir)/'`gstrfbsrc.c
-librfb_la-rfbbuffer.lo: rfbbuffer.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) $(librfb_la_CFLAGS) $(CFLAGS) -MT librfb_la-rfbbuffer.lo -MD -MP -MF $(DEPDIR)/librfb_la-rfbbuffer.Tpo -c -o librfb_la-rfbbuffer.lo `test -f 'rfbbuffer.c' || echo '$(srcdir)/'`rfbbuffer.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfb_la-rfbbuffer.Tpo $(DEPDIR)/librfb_la-rfbbuffer.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rfbbuffer.c' object='librfb_la-rfbbuffer.lo' libtool=yes @AMDEPBACKSLASH@
+libgstrfbsrc_la-rfbdecoder.lo: rfbdecoder.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrfbsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrfbsrc_la_CFLAGS) $(CFLAGS) -MT libgstrfbsrc_la-rfbdecoder.lo -MD -MP -MF $(DEPDIR)/libgstrfbsrc_la-rfbdecoder.Tpo -c -o libgstrfbsrc_la-rfbdecoder.lo `test -f 'rfbdecoder.c' || echo '$(srcdir)/'`rfbdecoder.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrfbsrc_la-rfbdecoder.Tpo $(DEPDIR)/libgstrfbsrc_la-rfbdecoder.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rfbdecoder.c' object='libgstrfbsrc_la-rfbdecoder.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) $(librfb_la_CFLAGS) $(CFLAGS) -c -o librfb_la-rfbbuffer.lo `test -f 'rfbbuffer.c' || echo '$(srcdir)/'`rfbbuffer.c
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrfbsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrfbsrc_la_CFLAGS) $(CFLAGS) -c -o libgstrfbsrc_la-rfbdecoder.lo `test -f 'rfbdecoder.c' || echo '$(srcdir)/'`rfbdecoder.c
-librfb_la-rfbdecoder.lo: rfbdecoder.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) $(librfb_la_CFLAGS) $(CFLAGS) -MT librfb_la-rfbdecoder.lo -MD -MP -MF $(DEPDIR)/librfb_la-rfbdecoder.Tpo -c -o librfb_la-rfbdecoder.lo `test -f 'rfbdecoder.c' || echo '$(srcdir)/'`rfbdecoder.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfb_la-rfbdecoder.Tpo $(DEPDIR)/librfb_la-rfbdecoder.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rfbdecoder.c' object='librfb_la-rfbdecoder.lo' libtool=yes @AMDEPBACKSLASH@
+libgstrfbsrc_la-d3des.lo: d3des.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrfbsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrfbsrc_la_CFLAGS) $(CFLAGS) -MT libgstrfbsrc_la-d3des.lo -MD -MP -MF $(DEPDIR)/libgstrfbsrc_la-d3des.Tpo -c -o libgstrfbsrc_la-d3des.lo `test -f 'd3des.c' || echo '$(srcdir)/'`d3des.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrfbsrc_la-d3des.Tpo $(DEPDIR)/libgstrfbsrc_la-d3des.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='d3des.c' object='libgstrfbsrc_la-d3des.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) $(librfb_la_CFLAGS) $(CFLAGS) -c -o librfb_la-rfbdecoder.lo `test -f 'rfbdecoder.c' || echo '$(srcdir)/'`rfbdecoder.c
-
-librfb_la-d3des.lo: d3des.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) $(librfb_la_CFLAGS) $(CFLAGS) -MT librfb_la-d3des.lo -MD -MP -MF $(DEPDIR)/librfb_la-d3des.Tpo -c -o librfb_la-d3des.lo `test -f 'd3des.c' || echo '$(srcdir)/'`d3des.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfb_la-d3des.Tpo $(DEPDIR)/librfb_la-d3des.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='d3des.c' object='librfb_la-d3des.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) $(librfb_la_CFLAGS) $(CFLAGS) -c -o librfb_la-d3des.lo `test -f 'd3des.c' || echo '$(srcdir)/'`d3des.c
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrfbsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrfbsrc_la_CFLAGS) $(CFLAGS) -c -o libgstrfbsrc_la-d3des.lo `test -f 'd3des.c' || echo '$(srcdir)/'`d3des.c
mostlyclean-libtool:
-rm -f *.lo
@@ -1088,8 +1071,8 @@
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
-clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
- clean-pluginLTLIBRARIES mostlyclean-am
+clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \
+ mostlyclean-am
distclean: distclean-am
-rm -rf ./$(DEPDIR)
@@ -1160,19 +1143,19 @@
.MAKE: install-am install-strip
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
- clean-libtool clean-noinstLTLIBRARIES 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 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
+ 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 \
+ 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
.PRECIOUS: Makefile
diff --git a/gst/librfb/d3des.c b/gst/librfb/d3des.c
index c05fea3..377670e 100644
--- a/gst/librfb/d3des.c
+++ b/gst/librfb/d3des.c
@@ -26,8 +26,13 @@
* (GEnie : OUTER; CIS : [71755,204]) Graven Imagery, 1992.
*/
+#ifdef HAVE_CONFIG_H
#include "config.h"
-#include "_stdint.h"
+#endif
+
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
#include "d3des.h"
diff --git a/gst/librfb/gstrfbsrc.c b/gst/librfb/gstrfbsrc.c
index 7f9e591..786d32d 100644
--- a/gst/librfb/gstrfbsrc.c
+++ b/gst/librfb/gstrfbsrc.c
@@ -72,12 +72,13 @@
static void gst_rfb_src_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
-static GstCaps *gst_rfb_src_fixate (GstBaseSrc * bsrc, GstCaps * caps);
-static gboolean gst_rfb_src_start (GstBaseSrc * bsrc);
+static gboolean gst_rfb_src_negotiate (GstBaseSrc * bsrc);
static gboolean gst_rfb_src_stop (GstBaseSrc * bsrc);
static gboolean gst_rfb_src_event (GstBaseSrc * bsrc, GstEvent * event);
-static GstFlowReturn gst_rfb_src_create (GstPushSrc * psrc,
- GstBuffer ** outbuf);
+static gboolean gst_rfb_src_unlock (GstBaseSrc * bsrc);
+static gboolean gst_rfb_src_decide_allocation (GstBaseSrc * bsrc,
+ GstQuery * query);
+static GstFlowReturn gst_rfb_src_fill (GstPushSrc * psrc, GstBuffer * outbuf);
#define gst_rfb_src_parent_class parent_class
G_DEFINE_TYPE (GstRfbSrc, gst_rfb_src, GST_TYPE_PUSH_SRC);
@@ -146,16 +147,19 @@
g_param_spec_boolean ("view-only", "Only view the desktop",
"only view the desktop", FALSE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gstbasesrc_class->fixate = GST_DEBUG_FUNCPTR (gst_rfb_src_fixate);
- gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_rfb_src_start);
+
+ gstbasesrc_class->negotiate = GST_DEBUG_FUNCPTR (gst_rfb_src_negotiate);
gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_rfb_src_stop);
gstbasesrc_class->event = GST_DEBUG_FUNCPTR (gst_rfb_src_event);
- gstpushsrc_class->create = GST_DEBUG_FUNCPTR (gst_rfb_src_create);
+ gstbasesrc_class->unlock = GST_DEBUG_FUNCPTR (gst_rfb_src_unlock);
+ gstpushsrc_class->fill = GST_DEBUG_FUNCPTR (gst_rfb_src_fill);
+ gstbasesrc_class->decide_allocation =
+ GST_DEBUG_FUNCPTR (gst_rfb_src_decide_allocation);
gstelement_class = GST_ELEMENT_CLASS (klass);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_rfb_src_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_rfb_src_template);
gst_element_class_set_static_metadata (gstelement_class, "Rfb source",
"Source/Video",
@@ -183,10 +187,7 @@
src->view_only = FALSE;
- src->pool = NULL;
-
src->decoder = rfb_decoder_new ();
-
}
static void
@@ -195,10 +196,7 @@
GstRfbSrc *src = GST_RFB_SRC (object);
g_free (src->host);
- if (src->pool) {
- gst_object_unref (src->pool);
- src->pool = NULL;
- }
+
if (src->decoder) {
rfb_decoder_free (src->decoder);
src->decoder = NULL;
@@ -340,84 +338,54 @@
}
}
-static GstCaps *
-gst_rfb_src_fixate (GstBaseSrc * bsrc, GstCaps * caps)
+static gboolean
+gst_rfb_src_decide_allocation (GstBaseSrc * bsrc, GstQuery * query)
{
- GstRfbSrc *src = GST_RFB_SRC (bsrc);
- RfbDecoder *decoder;
- GstStructure *structure;
- guint i;
-
- decoder = src->decoder;
-
- GST_DEBUG_OBJECT (src, "fixating caps %" GST_PTR_FORMAT, caps);
-
- caps = gst_caps_make_writable (caps);
-
- for (i = 0; i < gst_caps_get_size (caps); ++i) {
- structure = gst_caps_get_structure (caps, i);
-
- gst_structure_fixate_field_nearest_int (structure,
- "width", decoder->rect_width);
- gst_structure_fixate_field_nearest_int (structure,
- "height", decoder->rect_height);
- gst_structure_fixate_field (structure, "format");
- }
-
- GST_DEBUG_OBJECT (src, "fixated caps %" GST_PTR_FORMAT, caps);
-
- caps = GST_BASE_SRC_CLASS (parent_class)->fixate (bsrc, caps);
-
- return caps;
-}
-
-static void
-gst_rfb_negotiate_pool (GstRfbSrc * src, GstCaps * caps)
-{
- GstQuery *query;
GstBufferPool *pool = NULL;
- guint size, min, max;
+ guint size, min = 1, max = 0;
GstStructure *config;
+ GstCaps *caps;
+ GstVideoInfo info;
+ gboolean ret;
- /* find a pool for the negotiated caps now */
- query = gst_query_new_allocation (caps, TRUE);
+ gst_query_parse_allocation (query, &caps, NULL);
- if (!gst_pad_peer_query (GST_BASE_SRC_PAD (src), query)) {
- /* not a problem, we use the defaults of query */
- GST_DEBUG_OBJECT (src, "could not get downstream ALLOCATION hints");
- }
+ if (!caps || !gst_video_info_from_caps (&info, caps))
+ return FALSE;
- if (gst_query_get_n_allocation_pools (query) > 0) {
- /* we got configuration from our peer, parse them */
+ while (gst_query_get_n_allocation_pools (query) > 0) {
gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max);
- } else {
- GST_DEBUG_OBJECT (src, "didn't get downstream pool hints");
- size = GST_BASE_SRC (src)->blocksize;
- min = max = 0;
+
+ /* TODO We restrict to the exact size as we don't support strides or
+ * special padding */
+ if (size == info.size)
+ break;
+
+ gst_query_remove_nth_allocation_pool (query, 0);
+ gst_object_unref (pool);
+ pool = NULL;
}
if (pool == NULL) {
/* we did not get a pool, make one ourselves then */
pool = gst_video_buffer_pool_new ();
+ size = info.size;
+ min = 1;
+ max = 0;
+ gst_query_add_allocation_pool (query, pool, size, min, max);
}
- if (src->pool)
- gst_object_unref (src->pool);
- src->pool = pool;
-
config = gst_buffer_pool_get_config (pool);
gst_buffer_pool_config_set_params (config, caps, size, min, max);
- gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META);
- gst_buffer_pool_set_config (pool, config);
- // and activate
- gst_buffer_pool_set_active (pool, TRUE);
+ ret = gst_buffer_pool_set_config (pool, config);
+ gst_object_unref (pool);
- gst_query_unref (query);
+ return ret;
}
static gboolean
-gst_rfb_src_start (GstBaseSrc * bsrc)
+gst_rfb_src_negotiate (GstBaseSrc * bsrc)
{
GstRfbSrc *src = GST_RFB_SRC (bsrc);
RfbDecoder *decoder;
@@ -430,6 +398,9 @@
decoder = src->decoder;
+ if (decoder->inited)
+ return TRUE;
+
GST_DEBUG_OBJECT (src, "connecting to host %s on port %d",
src->host, src->port);
if (!rfb_decoder_connect_tcp (decoder, src->host, src->port)) {
@@ -471,13 +442,6 @@
decoder->rect_height =
(decoder->rect_height ? decoder->rect_height : decoder->height);
- g_object_set (bsrc, "blocksize",
- src->decoder->width * src->decoder->height * (decoder->bpp / 8), NULL);
-
- decoder->frame = g_malloc (bsrc->blocksize);
- if (decoder->use_copyrect) {
- decoder->prev_frame = g_malloc (bsrc->blocksize);
- }
decoder->decoder_private = src;
/* calculate some many used values */
@@ -500,11 +464,13 @@
gst_video_info_set_format (&vinfo, vformat, decoder->rect_width,
decoder->rect_height);
+ decoder->frame = g_malloc (vinfo.size);
+ if (decoder->use_copyrect)
+ decoder->prev_frame = g_malloc (vinfo.size);
+
caps = gst_video_info_to_caps (&vinfo);
- gst_pad_set_caps (GST_BASE_SRC_PAD (bsrc), caps);
-
- gst_rfb_negotiate_pool (src, caps);
+ gst_base_src_set_caps (bsrc, caps);
gst_caps_unref (caps);
@@ -516,10 +482,7 @@
{
GstRfbSrc *src = GST_RFB_SRC (bsrc);
- if (src->decoder->socket) {
- g_object_unref (src->decoder->socket);
- src->decoder->socket = NULL;
- }
+ rfb_decoder_disconnect (src->decoder);
if (src->decoder->frame) {
g_free (src->decoder->frame);
@@ -535,12 +498,11 @@
}
static GstFlowReturn
-gst_rfb_src_create (GstPushSrc * psrc, GstBuffer ** outbuf)
+gst_rfb_src_fill (GstPushSrc * psrc, GstBuffer * outbuf)
{
GstRfbSrc *src = GST_RFB_SRC (psrc);
RfbDecoder *decoder = src->decoder;
GstMapInfo info;
- GstFlowReturn ret;
rfb_decoder_send_update_request (decoder, src->incremental_update,
decoder->offset_x, decoder->offset_y, decoder->rect_width,
@@ -557,25 +519,23 @@
("Error on setup VNC connection to host %s on port %d", src->host,
src->port), (NULL));
}
+ return GST_FLOW_ERROR;
}
}
- /* Create the buffer. */
- ret = gst_buffer_pool_acquire_buffer (src->pool, outbuf, NULL);
-
- if (G_UNLIKELY (ret != GST_FLOW_OK)) {
+ if (!gst_buffer_map (outbuf, &info, GST_MAP_WRITE)) {
+ GST_ELEMENT_ERROR (src, RESOURCE, WRITE,
+ ("Could not map the output frame"), (NULL));
return GST_FLOW_ERROR;
}
- gst_buffer_map (*outbuf, &info, GST_MAP_WRITE);
-
memcpy (info.data, decoder->frame, info.size);
- GST_BUFFER_PTS (*outbuf) =
+ GST_BUFFER_PTS (outbuf) =
gst_clock_get_time (GST_ELEMENT_CLOCK (src)) -
GST_ELEMENT_CAST (src)->base_time;
- gst_buffer_unmap (*outbuf, &info);
+ gst_buffer_unmap (outbuf, &info);
return GST_FLOW_OK;
}
@@ -658,6 +618,14 @@
}
static gboolean
+gst_rfb_src_unlock (GstBaseSrc * bsrc)
+{
+ GstRfbSrc *src = GST_RFB_SRC (bsrc);
+ g_cancellable_cancel (src->decoder->cancellable);
+ return TRUE;
+}
+
+static gboolean
plugin_init (GstPlugin * plugin)
{
return gst_element_register (plugin, "rfbsrc", GST_RANK_NONE,
diff --git a/gst/librfb/gstrfbsrc.h b/gst/librfb/gstrfbsrc.h
index a85dc6e..81ebd45 100644
--- a/gst/librfb/gstrfbsrc.h
+++ b/gst/librfb/gstrfbsrc.h
@@ -25,7 +25,8 @@
#include <gst/gst.h>
#include <gst/base/gstpushsrc.h>
#include <gst/video/gstvideopool.h>
-#include <librfb/rfb.h>
+
+#include "rfbdecoder.h"
G_BEGIN_DECLS
#define GST_TYPE_RFB_SRC \
@@ -60,8 +61,6 @@
guint button_mask;
- GstBufferPool *pool;
-
/* protocol version */
guint version_major;
guint version_minor;
diff --git a/gst/librfb/rfb.h b/gst/librfb/rfb.h
deleted file mode 100644
index 89a4be9..0000000
--- a/gst/librfb/rfb.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef _RFB_RFB_H_
-#define _RFB_RFB_H_
-
-#include <librfb/rfbdecoder.h>
-#include <librfb/rfbbuffer.h>
-
-#endif
diff --git a/gst/librfb/rfbbuffer.c b/gst/librfb/rfbbuffer.c
deleted file mode 100644
index d8ca081..0000000
--- a/gst/librfb/rfbbuffer.c
+++ /dev/null
@@ -1,30 +0,0 @@
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "rfbbuffer.h"
-
-RfbBuffer *
-rfb_buffer_new (void)
-{
- return g_new0 (RfbBuffer, 1);
-}
-
-RfbBuffer *
-rfb_buffer_new_and_alloc (int len)
-{
- RfbBuffer *buffer = g_new0 (RfbBuffer, 1);
-
- buffer->data = g_malloc (len);
- buffer->free_data = (RfbBufferFreeFunc) g_free;
-
- return buffer;
-}
-
-void
-rfb_buffer_free (RfbBuffer * buffer)
-{
- g_return_if_fail (buffer != NULL);
-
- buffer->free_data (buffer->data, buffer->buffer_private);
-}
diff --git a/gst/librfb/rfbbuffer.h b/gst/librfb/rfbbuffer.h
deleted file mode 100644
index 6250ad4..0000000
--- a/gst/librfb/rfbbuffer.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef _LIBRFB_BUFFER_H_
-#define _LIBRFB_BUFFER_H_
-
-#include <glib.h>
-
-G_BEGIN_DECLS typedef struct _RfbBuffer RfbBuffer;
-typedef void (*RfbBufferFreeFunc) (guint8 * data, gpointer priv);
-
-struct _RfbBuffer
-{
- RfbBufferFreeFunc free_data;
- gpointer buffer_private;
-
- guint8 *data;
- gint length;
-};
-
-RfbBuffer *rfb_buffer_new (void);
-RfbBuffer *rfb_buffer_new_and_alloc (gint len);
-void rfb_buffer_free (RfbBuffer * buffer);
-
-G_END_DECLS
-#endif
diff --git a/gst/librfb/rfbcontext.h b/gst/librfb/rfbcontext.h
deleted file mode 100644
index 4c72bc6..0000000
--- a/gst/librfb/rfbcontext.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef _LIBRFB_RFBCONTEXT_H_
-#define _LIBRFB_RFBCONTEXT_H_
-
-#include <glib.h>
-
-G_BEGIN_DECLS typedef struct _RfbContext
-{
- RfbConnection *connection;
-
- guint8 *buffer1;
- gpointer buffer1_alloc;
- guint buffer1_len;
-
- guint8 *buffer2;
- gpointer buffer2_alloc;
- guint buffer2_len;
-
- gchar *name;
-} RfbContext;
-
-typedef struct _RfbRect
-{
- RfbContext *context;
-
- guint x_pos;
- guint y_pos;
- guint width;
- guint height;
- guint encoding_type;
-
- gchar *data;
-} RfbRect;
-
-G_END_DECLS
-#endif
diff --git a/gst/librfb/rfbdecoder.c b/gst/librfb/rfbdecoder.c
index bd225ad..e6eb701 100644
--- a/gst/librfb/rfbdecoder.c
+++ b/gst/librfb/rfbdecoder.c
@@ -2,7 +2,7 @@
#include "config.h"
#endif
-#include "rfb.h"
+#include "rfbdecoder.h"
#include "d3des.h"
#include <gst/gst.h>
@@ -35,23 +35,24 @@
decoder);
static gboolean rfb_decoder_state_set_colour_map_entries (RfbDecoder * decoder);
static gboolean rfb_decoder_state_server_cut_text (RfbDecoder * decoder);
-static void rfb_decoder_raw_encoding (RfbDecoder * decoder, gint start_x,
+static gboolean rfb_decoder_raw_encoding (RfbDecoder * decoder, gint start_x,
gint start_y, gint rect_w, gint rect_h);
-static void rfb_decoder_copyrect_encoding (RfbDecoder * decoder, gint start_x,
+static gboolean rfb_decoder_copyrect_encoding (RfbDecoder * decoder,
+ gint start_x, gint start_y, gint rect_w, gint rect_h);
+static gboolean rfb_decoder_rre_encoding (RfbDecoder * decoder, gint start_x,
gint start_y, gint rect_w, gint rect_h);
-static void rfb_decoder_rre_encoding (RfbDecoder * decoder, gint start_x,
+static gboolean rfb_decoder_corre_encoding (RfbDecoder * decoder, gint start_x,
gint start_y, gint rect_w, gint rect_h);
-static void rfb_decoder_corre_encoding (RfbDecoder * decoder, gint start_x,
- gint start_y, gint rect_w, gint rect_h);
-static void rfb_decoder_hextile_encoding (RfbDecoder * decoder, gint start_x,
- gint start_y, gint rect_w, gint rect_h);
+static gboolean rfb_decoder_hextile_encoding (RfbDecoder * decoder,
+ gint start_x, gint start_y, gint rect_w, gint rect_h);
RfbDecoder *
rfb_decoder_new (void)
{
RfbDecoder *decoder = g_new0 (RfbDecoder, 1);
- decoder->socket = NULL;
+ decoder->socket_client = g_socket_client_new ();
+ decoder->connection = NULL;
decoder->cancellable = g_cancellable_new ();
decoder->password = NULL;
@@ -63,11 +64,12 @@
decoder->rect_width = 0;
decoder->rect_height = 0;
decoder->shared_flag = TRUE;
- decoder->disconnected = FALSE;
decoder->data = NULL;
decoder->data_len = 0;
decoder->error = NULL;
+ g_mutex_init (&decoder->write_lock);
+
return decoder;
}
@@ -76,21 +78,11 @@
{
g_return_if_fail (decoder != NULL);
- if (decoder->cancellable) {
- g_cancellable_cancel (decoder->cancellable);
- g_object_unref (decoder->cancellable);
- decoder->cancellable = NULL;
- }
+ rfb_decoder_disconnect (decoder);
- if (decoder->socket) {
- g_object_unref (decoder->socket);
- decoder->socket = NULL;
- }
-
- g_clear_error (&decoder->error);
-
- g_free (decoder->data);
-
+ g_clear_object (&decoder->socket_client);
+ g_clear_object (&decoder->cancellable);
+ g_mutex_clear (&decoder->write_lock);
g_free (decoder);
}
@@ -98,78 +90,27 @@
rfb_decoder_connect_tcp (RfbDecoder * decoder, gchar * host, guint port)
{
GError *err = NULL;
- GInetAddress *addr;
- GSocketAddress *saddr;
- GResolver *resolver;
+ GSocketConnection *connection;
GST_DEBUG ("connecting to the rfb server");
g_return_val_if_fail (decoder != NULL, FALSE);
- g_return_val_if_fail (decoder->socket == NULL, FALSE);
+ g_return_val_if_fail (decoder->connection == NULL, FALSE);
g_return_val_if_fail (host != NULL, FALSE);
- /* look up name if we need to */
- addr = g_inet_address_new_from_string (host);
- if (!addr) {
- GList *results;
+ g_cancellable_reset (decoder->cancellable);
- resolver = g_resolver_get_default ();
+ connection =
+ g_socket_client_connect_to_host (decoder->socket_client, host, port,
+ decoder->cancellable, &err);
- results =
- g_resolver_lookup_by_name (resolver, host, decoder->cancellable, &err);
- if (!results)
- goto name_resolve;
- addr = G_INET_ADDRESS (g_object_ref (results->data));
-
- g_resolver_free_addresses (results);
- g_object_unref (resolver);
- }
-
- saddr = g_inet_socket_address_new (addr, port);
-
- decoder->socket =
- g_socket_new (g_socket_address_get_family (saddr), G_SOCKET_TYPE_STREAM,
- G_SOCKET_PROTOCOL_TCP, &err);
-
- if (!decoder->socket)
- goto no_socket;
-
- GST_DEBUG ("opened receiving client socket");
-
- if (!g_socket_connect (decoder->socket, saddr, decoder->cancellable, &err))
+ if (!connection)
goto connect_failed;
- g_object_unref (saddr);
-
- decoder->disconnected = FALSE;
+ decoder->connection = connection;
return TRUE;
-no_socket:
- {
- GST_WARNING ("Failed to create socket: %s", err->message);
- if (decoder->error == NULL)
- decoder->error = err;
- else
- g_clear_error (&err);
- g_object_unref (saddr);
- return FALSE;
- }
-name_resolve:
- {
- if (g_error_matches (err, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
- GST_DEBUG ("Cancelled name resolval");
- } else {
- GST_WARNING ("Failed to resolve host '%s': %s", host, err->message);
- if (decoder->error == NULL) {
- decoder->error = err;
- err = NULL;
- }
- }
- g_clear_error (&err);
- g_object_unref (resolver);
- return FALSE;
- }
connect_failed:
{
if (g_error_matches (err, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
@@ -183,11 +124,31 @@
}
}
g_clear_error (&err);
- g_object_unref (saddr);
return FALSE;
}
}
+void
+rfb_decoder_disconnect (RfbDecoder * decoder)
+{
+ GST_DEBUG ("Disconnecting from the rfb server");
+
+ g_return_if_fail (decoder);
+ g_return_if_fail (decoder->cancellable);
+
+ g_cancellable_cancel (decoder->cancellable);
+
+ /* Make sure threaded write a done first, this avoids race condition,
+ * specially when the decoder is freed */
+ g_mutex_lock (&decoder->write_lock);
+
+ g_clear_object (&decoder->connection);
+ g_clear_error (&decoder->error);
+ g_clear_pointer (&decoder->data, g_free);
+
+ g_mutex_unlock (&decoder->write_lock);
+}
+
/**
* rfb_decoder_iterate:
* @decoder: The rfb context
@@ -202,7 +163,7 @@
gboolean ret;
g_return_val_if_fail (decoder != NULL, FALSE);
- g_return_val_if_fail (decoder->socket != NULL, FALSE);
+ g_return_val_if_fail (decoder->connection != NULL, FALSE);
if (decoder->state == NULL) {
GST_DEBUG ("First iteration: set state to -> wait for protocol version");
@@ -225,28 +186,35 @@
static guint8 *
rfb_decoder_read (RfbDecoder * decoder, guint32 len)
{
- guint32 total = 0;
- gssize now = 0;
+ GInputStream *in;
GError *err = NULL;
+ gsize count = 0;
- g_return_val_if_fail (decoder->socket != NULL, NULL);
+ if (!decoder->connection)
+ return FALSE;
+
g_return_val_if_fail (len > 0, NULL);
+ in = g_io_stream_get_input_stream (G_IO_STREAM (decoder->connection));
+
+ g_return_val_if_fail (in != NULL, NULL);
+
if (G_UNLIKELY (len > decoder->data_len)) {
g_free (decoder->data);
decoder->data = g_malloc (len);
decoder->data_len = len;
}
- while (total < len) {
- now = g_socket_receive (decoder->socket, (gchar *) decoder->data + total,
- len - total, decoder->cancellable, &err);
+ if (!g_input_stream_read_all (in, decoder->data, len, &count,
+ decoder->cancellable, &err))
+ goto recv_error;
- if (now < 0)
- goto recv_error;
-
- total += now;
+ if (count == 0) {
+ g_set_error_literal (&err, G_IO_ERROR, G_IO_ERROR_BROKEN_PIPE,
+ "Connection was closed.");
+ goto recv_error;
}
+
return decoder->data;
recv_error:
@@ -261,29 +229,33 @@
}
}
g_clear_error (&err);
- decoder->disconnected = TRUE;
return NULL;
}
}
-static gint
+static gboolean
rfb_decoder_send (RfbDecoder * decoder, guint8 * buffer, guint len)
{
- gssize now = 0;
+ GOutputStream *out;
GError *err = NULL;
- g_return_val_if_fail (decoder->socket != NULL, 0);
+ if (!decoder->connection)
+ return FALSE;
+
g_return_val_if_fail (buffer != NULL, 0);
g_return_val_if_fail (len > 0, 0);
- now = g_socket_send (decoder->socket, (gchar *) buffer, len,
- decoder->cancellable, &err);
+ g_mutex_lock (&decoder->write_lock);
- if (now < 0)
+ out = g_io_stream_get_output_stream (G_IO_STREAM (decoder->connection));
+
+ if (!g_output_stream_write_all (out, buffer, len, NULL, decoder->cancellable,
+ &err))
goto send_error;
-done:
- return now;
+ g_mutex_unlock (&decoder->write_lock);
+
+ return TRUE;
send_error:
{
@@ -297,7 +269,8 @@
}
}
g_clear_error (&err);
- goto done;
+ g_mutex_unlock (&decoder->write_lock);
+ return FALSE;
}
}
@@ -308,7 +281,7 @@
guint8 data[10];
g_return_if_fail (decoder != NULL);
- g_return_if_fail (decoder->socket != NULL);
+ g_return_if_fail (decoder->connection != NULL);
data[0] = 3;
data[1] = incremental;
@@ -334,7 +307,7 @@
guint8 data[8];
g_return_if_fail (decoder != NULL);
- g_return_if_fail (decoder->socket != NULL);
+ g_return_if_fail (decoder->connection != NULL);
data[0] = 4;
data[1] = down_flag;
@@ -351,7 +324,7 @@
guint8 data[6];
g_return_if_fail (decoder != NULL);
- g_return_if_fail (decoder->socket != NULL);
+ g_return_if_fail (decoder->connection != NULL);
data[0] = 5;
data[1] = button_mask;
@@ -365,13 +338,14 @@
* rfb_decoder_state_wait_for_protocol_version:
*
* Negotiate the rfb version used
- *
- * \TODO Support for versions 3.7 and 3.8
*/
static gboolean
rfb_decoder_state_wait_for_protocol_version (RfbDecoder * decoder)
{
- rfb_decoder_read (decoder, 12);
+ gchar version_str[] = "RFB 003.003\n";
+
+ if (!rfb_decoder_read (decoder, 12))
+ return FALSE;
g_return_val_if_fail (memcmp (decoder->data, "RFB 003.00", 10) == 0, FALSE);
g_return_val_if_fail (*(decoder->data + 11) == 0x0a, FALSE);
@@ -389,16 +363,23 @@
("A major protocol version of %d is not supported, falling back to 3",
decoder->protocol_major);
decoder->protocol_major = 3;
+ decoder->protocol_minor = 3;
}
switch (decoder->protocol_minor) {
case 3:
+ case 7:
+ case 8:
break;
default:
GST_INFO ("Minor version %d is not supported, using 3",
decoder->protocol_minor);
decoder->protocol_minor = 3;
}
- rfb_decoder_send (decoder, (guint8 *) "RFB 003.003\n", 12);
+
+ version_str[10] = '0' + decoder->protocol_minor;
+
+ if (!rfb_decoder_send (decoder, (guint8 *) version_str, 12))
+ return FALSE;
decoder->state = rfb_decoder_state_wait_for_security;
return TRUE;
@@ -413,10 +394,14 @@
{
gint reason_length;
- rfb_decoder_read (decoder, 4);
+ if (!rfb_decoder_read (decoder, 4))
+ return FALSE;
reason_length = RFB_GET_UINT32 (decoder->data);
- rfb_decoder_read (decoder, reason_length);
+
+ if (!rfb_decoder_read (decoder, reason_length))
+ return FALSE;
+
GST_WARNING ("Reason by server: %s", decoder->data);
if (decoder->error == NULL) {
@@ -438,17 +423,60 @@
* above.
*/
if (IS_VERSION_3_3 (decoder)) {
- rfb_decoder_read (decoder, 4);
+ if (!rfb_decoder_read (decoder, 4))
+ return FALSE;
decoder->security_type = RFB_GET_UINT32 (decoder->data);
GST_DEBUG ("security = %d", decoder->security_type);
g_return_val_if_fail (decoder->security_type < 3, FALSE);
- g_return_val_if_fail (decoder->security_type != SECURITY_FAIL,
- rfb_decoder_state_reason (decoder));
+
+ if (decoder->security_type == SECURITY_FAIL) {
+ decoder->state = rfb_decoder_state_reason;
+ return TRUE;
+ }
} else {
- /* \TODO Add behavior for the rfb 3.7 and 3.8 servers */
- GST_WARNING ("Other versions are not yet supported");
+ guint8 num_type;
+ gint i;
+ guint8 *type = NULL;
+
+ if (!rfb_decoder_read (decoder, 1))
+ return FALSE;
+
+ num_type = RFB_GET_UINT8 (decoder->data);
+ if (num_type == 0) {
+ decoder->state = rfb_decoder_state_reason;
+ return TRUE;
+ }
+
+ if (!rfb_decoder_read (decoder, num_type))
+ return FALSE;
+
+ decoder->security_type = SECURITY_FAIL;
+
+ /* For now, simply pick the first support security method */
+ for (i = 0; i < num_type; i++) {
+ guint val = RFB_GET_UINT8 (decoder->data + i);
+
+ GST_DEBUG ("Server supports security type %u", val);
+
+ if (val == SECURITY_NONE || val == SECURITY_VNC) {
+ decoder->security_type = val;
+ type = decoder->data + i;
+ break;
+ }
+ }
+
+ if (!type) {
+ GST_WARNING ("Security type negotiation failed.");
+ decoder->error = g_error_new (GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_READ,
+ "VNC server requires unsupported security method.");
+ return FALSE;
+ }
+
+ GST_DEBUG ("security = %d", decoder->security_type);
+ if (!rfb_decoder_send (decoder, type, 1))
+ return FALSE;
}
switch (decoder->security_type) {
@@ -497,7 +525,8 @@
des (&des_ctx, challenge + 8, challenge + 8);
/* .. and send back to server */
- rfb_decoder_send (decoder, challenge, 16);
+ if (!rfb_decoder_send (decoder, challenge, 16))
+ return FALSE;
GST_DEBUG ("Encrypted challenge sent to server");
@@ -519,7 +548,9 @@
static gboolean
rfb_decoder_state_security_result (RfbDecoder * decoder)
{
- rfb_decoder_read (decoder, 4);
+ if (!rfb_decoder_read (decoder, 4))
+ return FALSE;
+
if (RFB_GET_UINT32 (decoder->data) != 0) {
GST_WARNING ("Security handshaking failed");
if (IS_VERSION_3_8 (decoder)) {
@@ -593,7 +624,11 @@
message = rfb_decoder_message_set_encodings (encoder_list);
- rfb_decoder_send (decoder, message, 4 + 4 * g_slist_length (encoder_list));
+ if (!rfb_decoder_send (decoder, message,
+ 4 + 4 * g_slist_length (encoder_list))) {
+ g_free (message);
+ return FALSE;
+ }
g_free (message);
@@ -609,7 +644,10 @@
guint8 shared_flag;
shared_flag = decoder->shared_flag;
- rfb_decoder_send (decoder, &shared_flag, 1);
+
+ if (!rfb_decoder_send (decoder, &shared_flag, 1))
+ return FALSE;
+
GST_DEBUG ("shared_flag is %d", shared_flag);
decoder->state = rfb_decoder_state_wait_for_server_initialisation;
@@ -621,7 +659,8 @@
{
guint32 name_length;
- rfb_decoder_read (decoder, 24);
+ if (!rfb_decoder_read (decoder, 24))
+ return FALSE;
decoder->width = RFB_GET_UINT16 (decoder->data + 0);
decoder->height = RFB_GET_UINT16 (decoder->data + 2);
@@ -652,7 +691,8 @@
name_length = RFB_GET_UINT32 (decoder->data + 20);
- rfb_decoder_read (decoder, name_length);
+ if (!rfb_decoder_read (decoder, name_length))
+ return FALSE;
decoder->name = g_strndup ((gchar *) (decoder->data), name_length);
GST_DEBUG ("name = %s", decoder->name);
@@ -709,7 +749,9 @@
GST_DEBUG ("decoder_state_normal");
- rfb_decoder_read (decoder, 1);
+ if (!rfb_decoder_read (decoder, 1))
+ return FALSE;
+
message_type = RFB_GET_UINT8 (decoder->data);
switch (message_type) {
@@ -738,7 +780,8 @@
rfb_decoder_state_framebuffer_update (RfbDecoder * decoder)
{
- rfb_decoder_read (decoder, 3);
+ if (!rfb_decoder_read (decoder, 3))
+ return FALSE;
decoder->n_rects = RFB_GET_UINT16 (decoder->data + 1);
GST_DEBUG ("Number of rectangles : %d", decoder->n_rects);
@@ -753,8 +796,10 @@
{
gint x, y, w, h;
gint encoding;
+ gboolean ret = FALSE;
- rfb_decoder_read (decoder, 12);
+ if (!rfb_decoder_read (decoder, 12))
+ return FALSE;
x = RFB_GET_UINT16 (decoder->data + 0) - decoder->offset_x;
y = RFB_GET_UINT16 (decoder->data + 2) - decoder->offset_y;
@@ -770,40 +815,44 @@
if (((w * h) + (x * y)) > (decoder->width * decoder->height)) {
GST_ERROR ("Desktop resize is unsupported.");
decoder->state = NULL;
- decoder->disconnected = TRUE;
return TRUE;
}
switch (encoding) {
case ENCODING_TYPE_RAW:
- rfb_decoder_raw_encoding (decoder, x, y, w, h);
+ ret = rfb_decoder_raw_encoding (decoder, x, y, w, h);
break;
case ENCODING_TYPE_COPYRECT:
- rfb_decoder_copyrect_encoding (decoder, x, y, w, h);
+ ret = rfb_decoder_copyrect_encoding (decoder, x, y, w, h);
break;
case ENCODING_TYPE_RRE:
- rfb_decoder_rre_encoding (decoder, x, y, w, h);
+ ret = rfb_decoder_rre_encoding (decoder, x, y, w, h);
break;
case ENCODING_TYPE_CORRE:
- rfb_decoder_corre_encoding (decoder, x, y, w, h);
+ ret = rfb_decoder_corre_encoding (decoder, x, y, w, h);
break;
case ENCODING_TYPE_HEXTILE:
- rfb_decoder_hextile_encoding (decoder, x, y, w, h);
+ ret = rfb_decoder_hextile_encoding (decoder, x, y, w, h);
break;
default:
g_critical ("unimplemented encoding\n");
break;
}
+
+ if (!ret)
+ return FALSE;
+
decoder->n_rects--;
- if (decoder->n_rects == 0 || decoder->disconnected) {
+ if (decoder->n_rects == 0) {
decoder->state = NULL;
} else {
decoder->state = rfb_decoder_state_framebuffer_update_rectangle;
}
+
return TRUE;
}
-static void
+static gboolean
rfb_decoder_raw_encoding (RfbDecoder * decoder, gint start_x, gint start_y,
gint rect_w, gint rect_h)
{
@@ -813,8 +862,11 @@
raw_line_size = rect_w * decoder->bytespp;
size = rect_h * raw_line_size;
+
GST_DEBUG ("Reading %d bytes (%dx%d)", size, rect_w, rect_h);
- rfb_decoder_read (decoder, size);
+
+ if (!rfb_decoder_read (decoder, size))
+ return FALSE;
frame =
decoder->frame + (((start_y * decoder->rect_width) +
@@ -826,9 +878,11 @@
p += raw_line_size;
frame += decoder->line_size;
}
+
+ return TRUE;
}
-static void
+static gboolean
rfb_decoder_copyrect_encoding (RfbDecoder * decoder, gint start_x, gint start_y,
gint rect_w, gint rect_h)
{
@@ -836,7 +890,8 @@
gint line_width, copyrect_width;
guint8 *src, *dst;
- rfb_decoder_read (decoder, 4);
+ if (!rfb_decoder_read (decoder, 4))
+ return FALSE;
/* don't forget the offset */
src_x = RFB_GET_UINT16 (decoder->data) - decoder->offset_x;
@@ -857,6 +912,8 @@
src += line_width;
dst += line_width;
}
+
+ return TRUE;
}
static void
@@ -878,14 +935,16 @@
}
}
-static void
+static gboolean
rfb_decoder_rre_encoding (RfbDecoder * decoder, gint start_x, gint start_y,
gint rect_w, gint rect_h)
{
guint32 number_of_rectangles, color;
guint16 x, y, w, h;
- rfb_decoder_read (decoder, 4 + decoder->bytespp);
+ if (!rfb_decoder_read (decoder, 4 + decoder->bytespp))
+ return FALSE;
+
number_of_rectangles = RFB_GET_UINT32 (decoder->data);
color = GUINT32_SWAP_LE_BE ((RFB_GET_UINT32 (decoder->data + 4)));
@@ -896,7 +955,9 @@
while (number_of_rectangles--) {
- rfb_decoder_read (decoder, decoder->bytespp + 8);
+ if (!rfb_decoder_read (decoder, decoder->bytespp + 8))
+ return FALSE;
+
color = GUINT32_SWAP_LE_BE ((RFB_GET_UINT32 (decoder->data)));
x = RFB_GET_UINT16 (decoder->data + decoder->bytespp);
y = RFB_GET_UINT16 (decoder->data + decoder->bytespp + 2);
@@ -906,16 +967,20 @@
/* draw the rectangle in the foreground */
rfb_decoder_fill_rectangle (decoder, start_x + x, start_y + y, w, h, color);
}
+
+ return TRUE;
}
-static void
+static gboolean
rfb_decoder_corre_encoding (RfbDecoder * decoder, gint start_x, gint start_y,
gint rect_w, gint rect_h)
{
guint32 number_of_rectangles, color;
guint8 x, y, w, h;
- rfb_decoder_read (decoder, 4 + decoder->bytespp);
+ if (!rfb_decoder_read (decoder, 4 + decoder->bytespp))
+ return FALSE;
+
number_of_rectangles = RFB_GET_UINT32 (decoder->data);
color = GUINT32_SWAP_LE_BE ((RFB_GET_UINT32 (decoder->data + 4)));
g_free (decoder->data);
@@ -927,7 +992,9 @@
while (number_of_rectangles--) {
- rfb_decoder_read (decoder, decoder->bytespp + 4);
+ if (!rfb_decoder_read (decoder, decoder->bytespp + 4))
+ return FALSE;
+
color = GUINT32_SWAP_LE_BE ((RFB_GET_UINT32 (decoder->data)));
x = RFB_GET_UINT8 (decoder->data + decoder->bytespp);
y = RFB_GET_UINT8 (decoder->data + decoder->bytespp + 1);
@@ -939,9 +1006,11 @@
g_free (decoder->data);
}
+
+ return TRUE;
}
-static void
+static gboolean
rfb_decoder_hextile_encoding (RfbDecoder * decoder, gint start_x, gint start_y,
gint rect_w, gint rect_h)
{
@@ -963,7 +1032,9 @@
for (y = start_y; y < y_max; y += 16) {
for (x = start_x; x < x_max; x += 16) {
- rfb_decoder_read (decoder, 1);
+ if (!rfb_decoder_read (decoder, 1))
+ return FALSE;
+
subencoding = RFB_GET_UINT8 (decoder->data);
if (subencoding & SUBENCODING_RAW) {
@@ -973,7 +1044,9 @@
}
if (subencoding & SUBENCODING_BACKGROUND) {
- rfb_decoder_read (decoder, decoder->bytespp);
+ if (!rfb_decoder_read (decoder, decoder->bytespp))
+ return FALSE;
+
background = GUINT32_SWAP_LE_BE ((RFB_GET_UINT32 (decoder->data)));
}
rfb_decoder_fill_rectangle (decoder, x, y,
@@ -981,12 +1054,16 @@
background);
if (subencoding & SUBENCODING_FOREGROUND) {
- rfb_decoder_read (decoder, decoder->bytespp);
+ if (!rfb_decoder_read (decoder, decoder->bytespp))
+ return FALSE;
+
foreground = GUINT32_SWAP_LE_BE ((RFB_GET_UINT32 (decoder->data)));
}
if (subencoding & SUBENCODING_ANYSUBRECTS) {
- rfb_decoder_read (decoder, 1);
+ if (!rfb_decoder_read (decoder, 1))
+ return FALSE;
+
nr_subrect = RFB_GET_UINT8 (decoder->data);
} else {
continue;
@@ -995,7 +1072,8 @@
if (subencoding & SUBENCODING_SUBRECTSCOLORED) {
guint offset = 0;
- rfb_decoder_read (decoder, nr_subrect * (2 + decoder->bytespp));
+ if (!rfb_decoder_read (decoder, nr_subrect * (2 + decoder->bytespp)))
+ return FALSE;
while (nr_subrect--) {
foreground =
@@ -1009,7 +1087,8 @@
} else {
guint offset = 0;
- rfb_decoder_read (decoder, 2 * nr_subrect);
+ if (!rfb_decoder_read (decoder, 2 * nr_subrect))
+ return FALSE;
while (nr_subrect--) {
xy = RFB_GET_UINT8 (decoder->data + offset++);
@@ -1020,6 +1099,8 @@
}
}
}
+
+ return TRUE;
}
static gboolean
@@ -1036,13 +1117,18 @@
gint cut_text_length;
/* 3 bytes padding, 4 bytes cut_text_length */
- rfb_decoder_read (decoder, 7);
+ if (!rfb_decoder_read (decoder, 7))
+ return FALSE;
+
cut_text_length = RFB_GET_UINT32 (decoder->data + 3);
- rfb_decoder_read (decoder, cut_text_length);
+ if (!rfb_decoder_read (decoder, cut_text_length))
+ return FALSE;
+
GST_DEBUG ("rfb_decoder_state_server_cut_text: throw away '%s'",
decoder->data);
decoder->state = rfb_decoder_state_normal;
+
return TRUE;
}
diff --git a/gst/librfb/rfbdecoder.h b/gst/librfb/rfbdecoder.h
index 00a8520..0f3f5af 100644
--- a/gst/librfb/rfbdecoder.h
+++ b/gst/librfb/rfbdecoder.h
@@ -42,7 +42,8 @@
gpointer buffer_handler_data;
- GSocket *socket;
+ GSocketClient *socket_client;
+ GSocketConnection *connection;
GCancellable *cancellable;
guint8 *data;
@@ -55,7 +56,6 @@
/* settable properties */
gboolean shared_flag;
- gboolean disconnected;
/* readable properties */
gboolean inited;
@@ -93,27 +93,16 @@
/* some many used values */
guint bytespp;
guint line_size;
+
+ /* Seriliaze writes operations */
+ GMutex write_lock;
};
-#if 0
-typedef struct _RfbRect
-{
- RfbConnection *connection;
-
- guint x_pos;
- guint y_pos;
- guint width;
- guint height;
- guint encoding_type;
-
- gchar *data;
-} RfbRect;
-#endif
-
RfbDecoder *rfb_decoder_new (void);
void rfb_decoder_free (RfbDecoder * decoder);
gboolean rfb_decoder_connect_tcp (RfbDecoder * decoder,
gchar * host, guint port);
+void rfb_decoder_disconnect (RfbDecoder * decoder);
gboolean rfb_decoder_iterate (RfbDecoder * decoder);
void rfb_decoder_send_update_request (RfbDecoder * decoder,
gboolean incremental, gint x, gint y, gint width, gint height);
diff --git a/gst/librfb/rfbutil.h b/gst/librfb/rfbutil.h
deleted file mode 100644
index b1ac946..0000000
--- a/gst/librfb/rfbutil.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef _LIBRFB_UTIL_H_
-#define _LIBRFB_UTIL_H_
-
-#include <glib.h>
-
-G_BEGIN_DECLS G_END_DECLS
-#endif
diff --git a/gst/midi/Makefile.in b/gst/midi/Makefile.in
index 512252a..070af53 100644
--- a/gst/midi/Makefile.in
+++ b/gst/midi/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/midi/midiparse.c b/gst/midi/midiparse.c
index 2f817c7..d58ea3f 100644
--- a/gst/midi/midiparse.c
+++ b/gst/midi/midiparse.c
@@ -133,10 +133,8 @@
gobject_class->set_property = gst_midi_parse_set_property;
gobject_class->get_property = gst_midi_parse_get_property;
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_factory);
gst_element_class_set_static_metadata (gstelement_class, "MidiParse",
"Codec/Demuxer/Audio",
"Midi Parser Element", "Wim Taymans <wim.taymans@gmail.com>");
@@ -1284,9 +1282,7 @@
event = gst_event_new_eos ();
/* for fatal errors we post an error message, post the error
* first so the app knows about the error first. */
- GST_ELEMENT_ERROR (midiparse, STREAM, FAILED,
- ("Internal data flow error."),
- ("streaming task paused, reason %s (%d)", reason, ret));
+ GST_ELEMENT_FLOW_ERROR (midiparse, ret);
gst_pad_push_event (midiparse->srcpad, event);
}
}
diff --git a/gst/mpegdemux/Makefile.in b/gst/mpegdemux/Makefile.in
index dbe2b80..23727f4 100644
--- a/gst/mpegdemux/Makefile.in
+++ b/gst/mpegdemux/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/mpegdemux/gstmpegdemux.c b/gst/mpegdemux/gstmpegdemux.c
index eb2848b..b608db8 100644
--- a/gst/mpegdemux/gstmpegdemux.c
+++ b/gst/mpegdemux/gstmpegdemux.c
@@ -228,7 +228,7 @@
gst_element_class_add_pad_template (element_class, klass->sink_template);
gst_element_class_set_static_metadata (element_class,
- "The Fluendo MPEG Program Stream Demuxer", "Codec/Demuxer",
+ "MPEG Program Stream Demuxer", "Codec/Demuxer",
"Demultiplexes MPEG Program Streams", "Wim Taymans <wim@fluendo.com>");
}
@@ -1274,7 +1274,7 @@
}
/* check the limits */
- if (seeksegment.rate > 0.0) {
+ if (seeksegment.rate > 0.0 && first_pts != G_MAXUINT64) {
if (seeksegment.start < first_pts - demux->base_time) {
seeksegment.start = first_pts - demux->base_time;
seeksegment.position = seeksegment.start;
@@ -2401,13 +2401,14 @@
static inline gboolean
gst_ps_demux_scan_ts (GstPsDemux * demux, const guint8 * data,
- SCAN_MODE mode, guint64 * rts)
+ SCAN_MODE mode, guint64 * rts, const guint8 * end)
{
gboolean ret = FALSE;
guint32 scr1, scr2;
guint64 scr;
guint64 pts, dts;
guint32 code;
+ guint16 len;
/* read the 4 bytes for the sync code */
code = GST_READ_UINT32_BE (data);
@@ -2422,6 +2423,7 @@
/* start parsing the stream */
if ((*data & 0xc0) == 0x40) {
+ /* MPEG-2 PACK header */
guint32 scr_ext;
guint32 next32;
guint8 stuffing_bytes;
@@ -2461,6 +2463,7 @@
goto beach;
}
} else {
+ /* MPEG-1 pack header */
/* check markers */
if ((scr1 & 0xf1000100) != 0x21000100)
goto beach;
@@ -2482,8 +2485,27 @@
goto beach;
}
- /* read the 4 bytes for the PES sync code */
+ /* Possible optional System header here */
code = GST_READ_UINT32_BE (data);
+ len = GST_READ_UINT16_BE (data + 4);
+
+ if (code == ID_PS_SYSTEM_HEADER_START_CODE) {
+ /* Found a system header, skip it */
+ /* Check for sufficient data - system header, plus enough
+ * left over for the PES packet header */
+ if (data + 6 + len + 6 > end)
+ return FALSE;
+ data += len + 6;
+
+ /* read the 4 bytes for the PES sync code */
+ code = GST_READ_UINT32_BE (data);
+ len = GST_READ_UINT16_BE (data + 4);
+ }
+
+ /* Check we have enough data left for reading the PES packet */
+ if (data + 6 + len > end)
+ return FALSE;
+
if (!gst_ps_demux_is_pes_sync (code))
goto beach;
@@ -2597,9 +2619,11 @@
GstMapInfo map;
do {
+ /* Check we can get at least scan_sz bytes */
if (offset + scan_sz > demux->sink_segment.stop)
return FALSE;
+ /* Don't go further than 'limit' bytes */
if (limit && offset > *pos + limit)
return FALSE;
@@ -2624,7 +2648,8 @@
/* scan the block */
for (cursor = 0; !found && cursor <= end_scan; cursor++) {
- found = gst_ps_demux_scan_ts (demux, map.data + cursor, mode, &ts);
+ found = gst_ps_demux_scan_ts (demux, map.data + cursor, mode, &ts,
+ map.data + map.size);
}
/* done with the buffer, unref it */
@@ -2658,10 +2683,12 @@
GstMapInfo map;
do {
+ /* Check we have at least scan_sz bytes available */
if (offset < scan_sz - 1)
return FALSE;
- if (limit && offset < *pos - limit)
+ /* Don't go backward past the start or 'limit' bytes */
+ if (limit && offset + limit < *pos)
return FALSE;
if (offset > BLOCK_SZ)
@@ -2690,7 +2717,8 @@
/* scan the block */
for (cursor = (start_scan + 1); !found && cursor > 0; cursor--) {
- found = gst_ps_demux_scan_ts (demux, data--, mode, &ts);
+ found = gst_ps_demux_scan_ts (demux, data--, mode, &ts,
+ map.data + map.size);
}
/* done with the buffer, unref it */
@@ -2750,7 +2778,8 @@
demux->first_scr_offset = offset;
/* scan for last SCR in the stream */
offset = demux->sink_segment.stop;
- gst_ps_demux_scan_backward_ts (demux, &offset, SCAN_SCR, &demux->last_scr, 0);
+ gst_ps_demux_scan_backward_ts (demux, &offset, SCAN_SCR, &demux->last_scr,
+ DURATION_SCAN_LIMIT);
GST_DEBUG_OBJECT (demux, "Last SCR: %" G_GINT64_FORMAT " %" GST_TIME_FORMAT
" in packet starting at %" G_GUINT64_FORMAT,
demux->last_scr, GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (demux->last_scr)),
@@ -2976,9 +3005,7 @@
}
}
} else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_EOS) {
- GST_ELEMENT_ERROR (demux, STREAM, FAILED,
- ("Internal data stream error."),
- ("stream stopped, reason %s", reason));
+ GST_ELEMENT_FLOW_ERROR (demux, ret);
gst_ps_demux_send_event (demux, gst_event_new_eos ());
}
diff --git a/gst/mpegpsmux/Makefile.in b/gst/mpegpsmux/Makefile.in
index ec13c2a..1c89d5a 100644
--- a/gst/mpegpsmux/Makefile.in
+++ b/gst/mpegpsmux/Makefile.in
@@ -305,6 +305,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -326,6 +328,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -375,6 +379,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -520,6 +526,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -646,8 +654,6 @@
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@
@@ -690,8 +696,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/mpegpsmux/mpegpsmux.c b/gst/mpegpsmux/mpegpsmux.c
index 2b96fc1..fdd1c14 100644
--- a/gst/mpegpsmux/mpegpsmux.c
+++ b/gst/mpegpsmux/mpegpsmux.c
@@ -127,10 +127,10 @@
"Whether to aggregate GOPs and push them out as buffer lists",
DEFAULT_AGGREGATE_GOPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&mpegpsmux_sink_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&mpegpsmux_src_factory));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &mpegpsmux_sink_factory);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &mpegpsmux_src_factory);
gst_element_class_set_static_metadata (gstelement_class,
"MPEG Program Stream Muxer", "Codec/Muxer",
diff --git a/gst/mpegtsdemux/Makefile.in b/gst/mpegtsdemux/Makefile.in
index 0ca9693..40d9134 100644
--- a/gst/mpegtsdemux/Makefile.in
+++ b/gst/mpegtsdemux/Makefile.in
@@ -310,6 +310,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -331,6 +333,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -380,6 +384,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -525,6 +531,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -651,8 +659,6 @@
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@
@@ -695,8 +701,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/mpegtsdemux/gstmpegdefs.h b/gst/mpegtsdemux/gstmpegdefs.h
index e179f7d..f0a225b 100644
--- a/gst/mpegtsdemux/gstmpegdefs.h
+++ b/gst/mpegtsdemux/gstmpegdefs.h
@@ -48,6 +48,8 @@
/* private stream types */
#define ST_PS_VIDEO_MPEG2_DCII 0x80
#define ST_PS_AUDIO_AC3 0x81
+#define ST_PS_AUDIO_EAC3 0x87
+#define ST_PS_AUDIO_LPCM2 0x83
#define ST_PS_AUDIO_DTS 0x8a
#define ST_PS_AUDIO_LPCM 0x8b
#define ST_PS_DVD_SUBPICTURE 0xff
diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c
index 4aee084..659faad 100644
--- a/gst/mpegtsdemux/mpegtsbase.c
+++ b/gst/mpegtsdemux/mpegtsbase.c
@@ -125,8 +125,7 @@
element_class = GST_ELEMENT_CLASS (klass);
element_class->change_state = mpegts_base_change_state;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
gobject_class = G_OBJECT_CLASS (klass);
gobject_class->dispose = mpegts_base_dispose;
@@ -1024,14 +1023,24 @@
if ((desc =
gst_mpegts_find_descriptor (event->descriptors,
GST_MTS_DESC_DVB_SHORT_EVENT))) {
- gchar *name;
+ gchar *name = NULL, *text = NULL;
+
if (gst_mpegts_descriptor_parse_dvb_short_event (desc, NULL, &name,
- NULL)) {
+ &text)) {
+ program->tags = gst_tag_list_new_empty ();
+ if (name) {
+ gst_tag_list_add (program->tags, GST_TAG_MERGE_APPEND,
+ GST_TAG_TITLE, name, NULL);
+ g_free (name);
+ }
+ if (text) {
+ gst_tag_list_add (program->tags, GST_TAG_MERGE_APPEND,
+ GST_TAG_DESCRIPTION, text, NULL);
+ g_free (text);
+ }
/* FIXME : Is it correct to post an event duration as a GST_TAG_DURATION ??? */
- program->tags =
- gst_tag_list_new (GST_TAG_TITLE, name, GST_TAG_DURATION,
- event->duration * GST_SECOND, NULL);
- g_free (name);
+ gst_tag_list_add (program->tags, GST_TAG_MERGE_APPEND,
+ GST_TAG_DURATION, event->duration * GST_SECOND, NULL);
return TRUE;
}
}
@@ -1327,7 +1336,7 @@
mpegts_packetizer_clear (base->packetizer);
GST_WARNING_OBJECT (base, "Couldn't find any PCR within the first %d bytes",
10 * 65536);
- return GST_FLOW_ERROR;
+ return GST_FLOW_OK;
}
@@ -1383,9 +1392,7 @@
(_("Internal data stream error.")),
("No program activated before EOS"));
} else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_EOS) {
- GST_ELEMENT_ERROR (base, STREAM, FAILED,
- (_("Internal data stream error.")),
- ("stream stopped, reason %s", reason));
+ GST_ELEMENT_FLOW_ERROR (base, ret);
GST_MPEGTS_BASE_GET_CLASS (base)->push_event (base, gst_event_new_eos ());
}
gst_pad_pause_task (base->sinkpad);
diff --git a/gst/mpegtsdemux/mpegtsbase.h b/gst/mpegtsdemux/mpegtsbase.h
index fc0c651..ecb15ac 100644
--- a/gst/mpegtsdemux/mpegtsbase.h
+++ b/gst/mpegtsdemux/mpegtsbase.h
@@ -141,11 +141,6 @@
/* Whether we saw a PAT yet */
gboolean seen_pat;
- /* Whether upstream is live or not */
- gboolean upstream_live;
- /* Whether we queried the upstream latency or not */
- gboolean queried_latency;
-
/* Upstream segment */
GstSegment segment;
diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c
index a7e0798..16fb8ff 100644
--- a/gst/mpegtsdemux/mpegtspacketizer.c
+++ b/gst/mpegtsdemux/mpegtspacketizer.c
@@ -557,6 +557,7 @@
mpegts_packetizer_clear (MpegTSPacketizer2 * packetizer)
{
guint i;
+ MpegTSPCR *pcrtable;
packetizer->packet_size = 0;
@@ -579,6 +580,10 @@
packetizer->map_offset = 0;
packetizer->last_in_time = GST_CLOCK_TIME_NONE;
+ pcrtable = packetizer->observations[packetizer->pcrtablelut[0x1fff]];
+ if (pcrtable)
+ pcrtable->base_time = GST_CLOCK_TIME_NONE;
+
/* Close current PCR group */
PACKETIZER_GROUP_LOCK (packetizer);
@@ -595,6 +600,7 @@
mpegts_packetizer_flush (MpegTSPacketizer2 * packetizer, gboolean hard)
{
guint i;
+ MpegTSPCR *pcrtable;
GST_DEBUG ("Flushing");
if (packetizer->streams) {
@@ -614,6 +620,10 @@
packetizer->map_offset = 0;
packetizer->last_in_time = GST_CLOCK_TIME_NONE;
+ pcrtable = packetizer->observations[packetizer->pcrtablelut[0x1fff]];
+ if (pcrtable)
+ pcrtable->base_time = GST_CLOCK_TIME_NONE;
+
/* Close current PCR group */
PACKETIZER_GROUP_LOCK (packetizer);
for (i = 0; i < MAX_PCR_OBS_CHANNELS; i++) {
@@ -2189,6 +2199,12 @@
PACKETIZER_GROUP_LOCK (packetizer);
pcrtable = get_pcr_table (packetizer, pcr_pid);
+ if (!GST_CLOCK_TIME_IS_VALID (pcrtable->base_time) && pcr_pid == 0x1fff &&
+ GST_CLOCK_TIME_IS_VALID (packetizer->last_in_time)) {
+ pcrtable->base_time = packetizer->last_in_time;
+ pcrtable->base_pcrtime = pts;
+ }
+
/* Use clock skew if present */
if (packetizer->calculate_skew
&& GST_CLOCK_TIME_IS_VALID (pcrtable->base_time)) {
@@ -2206,7 +2222,8 @@
* That being said, this will only happen for the small interval of time
* where PTS/DTS are wrapping just before we see the first reset/wrap PCR
*/
- if (G_UNLIKELY (ABSDIFF (res, pcrtable->last_pcrtime) > 15 * GST_SECOND))
+ if (G_UNLIKELY (pcr_pid != 0x1fff &&
+ ABSDIFF (res, pcrtable->last_pcrtime) > 15 * GST_SECOND))
res = GST_CLOCK_TIME_NONE;
else {
GstClockTime tmp = pcrtable->base_time + pcrtable->skew;
diff --git a/gst/mpegtsdemux/mpegtsparse.c b/gst/mpegtsdemux/mpegtsparse.c
index 6ab2e7d..7bf8fc4 100644
--- a/gst/mpegtsdemux/mpegtsparse.c
+++ b/gst/mpegtsdemux/mpegtsparse.c
@@ -165,10 +165,8 @@
element_class->request_new_pad = mpegts_parse_request_new_pad;
element_class->release_pad = mpegts_parse_release_pad;
- 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 (&program_template));
+ gst_element_class_add_static_pad_template (element_class, &src_template);
+ gst_element_class_add_static_pad_template (element_class, &program_template);
gst_element_class_set_static_metadata (element_class,
"MPEG transport stream parser", "Codec/Parser",
diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c
index 8a41f90..0ac95bd 100644
--- a/gst/mpegtsdemux/tsdemux.c
+++ b/gst/mpegtsdemux/tsdemux.c
@@ -246,24 +246,24 @@
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,
+GST_STATIC_PAD_TEMPLATE ("video_%01x_%05x", GST_PAD_SRC,
GST_PAD_SOMETIMES,
VIDEO_CAPS);
static GstStaticPadTemplate audio_template =
-GST_STATIC_PAD_TEMPLATE ("audio_%04x",
+GST_STATIC_PAD_TEMPLATE ("audio_%01x_%05x",
GST_PAD_SRC,
GST_PAD_SOMETIMES,
AUDIO_CAPS);
static GstStaticPadTemplate subpicture_template =
-GST_STATIC_PAD_TEMPLATE ("subpicture_%04x",
+GST_STATIC_PAD_TEMPLATE ("subpicture_%01x_%05x",
GST_PAD_SRC,
GST_PAD_SOMETIMES,
SUBPICTURE_CAPS);
static GstStaticPadTemplate private_template =
-GST_STATIC_PAD_TEMPLATE ("private_%04x",
+GST_STATIC_PAD_TEMPLATE ("private_%01x_%05x",
GST_PAD_SRC,
GST_PAD_SOMETIMES,
GST_STATIC_CAPS_ANY);
@@ -305,7 +305,8 @@
GValue * value, GParamSpec * pspec);
static void gst_ts_demux_flush_streams (GstTSDemux * tsdemux, gboolean hard);
static GstFlowReturn
-gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream);
+gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream,
+ MpegTSBaseProgram * program);
static void gst_ts_demux_stream_flush (TSDemuxStream * stream,
GstTSDemux * demux, gboolean hard);
@@ -418,6 +419,7 @@
demux->group_id = G_MAXUINT;
demux->last_seek_offset = -1;
+ demux->program_generation = 0;
}
static void
@@ -971,7 +973,7 @@
/* If we are pushing out EOS, flush out pending data first */
if (GST_EVENT_TYPE (event) == GST_EVENT_EOS &&
gst_pad_is_active (stream->pad))
- gst_ts_demux_push_pending_data (demux, stream);
+ gst_ts_demux_push_pending_data (demux, stream, NULL);
gst_event_ref (event);
gst_pad_push_event (stream->pad, event);
@@ -1504,6 +1506,15 @@
is_audio = TRUE;
caps = gst_caps_new_empty_simple ("audio/x-ac3");
break;
+ case ST_PS_AUDIO_EAC3:
+ /* ATSC_ENHANCED_AC3 */
+ is_audio = TRUE;
+ caps = gst_caps_new_empty_simple ("audio/x-eac3");
+ break;
+ case ST_PS_AUDIO_LPCM2:
+ is_audio = TRUE;
+ caps = gst_caps_new_empty_simple ("audio/x-private2-lpcm");
+ break;
case ST_PS_AUDIO_DTS:
is_audio = TRUE;
caps = gst_caps_new_empty_simple ("audio/x-dts");
@@ -1533,16 +1544,24 @@
if (caps) {
if (is_audio) {
template = gst_static_pad_template_get (&audio_template);
- name = g_strdup_printf ("audio_%04x", bstream->pid);
+ name =
+ g_strdup_printf ("audio_%01x_%04x", demux->program_generation,
+ bstream->pid);
} else if (is_video) {
template = gst_static_pad_template_get (&video_template);
- name = g_strdup_printf ("video_%04x", bstream->pid);
+ name =
+ g_strdup_printf ("video_%01x_%04x", demux->program_generation,
+ bstream->pid);
} else if (is_private) {
template = gst_static_pad_template_get (&private_template);
- name = g_strdup_printf ("private_%04x", bstream->pid);
+ name =
+ g_strdup_printf ("private_%01x_%04x", demux->program_generation,
+ bstream->pid);
} else if (is_subpicture) {
template = gst_static_pad_template_get (&subpicture_template);
- name = g_strdup_printf ("subpicture_%04x", bstream->pid);
+ name =
+ g_strdup_printf ("subpicture_%01x_%04x", demux->program_generation,
+ bstream->pid);
} else
g_assert_not_reached ();
@@ -1638,6 +1657,8 @@
stream->nb_out_buffers = 0;
stream->gap_ref_buffers = 0;
stream->gap_ref_pts = GST_CLOCK_TIME_NONE;
+ /* Only wait for a valid timestamp if we have a PCR_PID */
+ stream->pending_ts = program->pcr_pid < 0x1fff;
stream->continuity_counter = CONTINUITY_UNSET;
}
}
@@ -1668,7 +1689,7 @@
if (gst_pad_is_active (stream->pad)) {
/* Flush out all data */
GST_DEBUG_OBJECT (stream->pad, "Flushing out pending data");
- gst_ts_demux_push_pending_data ((GstTSDemux *) base, stream);
+ gst_ts_demux_push_pending_data ((GstTSDemux *) base, stream, NULL);
GST_DEBUG_OBJECT (stream->pad, "Pushing out EOS");
gst_pad_push_event (stream->pad, gst_event_new_eos ());
@@ -1799,6 +1820,9 @@
demux->program_number = program->program_number;
demux->program = program;
+ /* Increment the program_generation counter */
+ demux->program_generation = (demux->program_generation + 1) & 0xf;
+
/* If this is not the initial program, we need to calculate
* a new segment */
if (demux->segment_event) {
@@ -1813,7 +1837,8 @@
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);
+ gst_ts_demux_push_pending_data (demux, stream,
+ demux->previous_program);
}
}
@@ -2213,7 +2238,8 @@
}
static void
-calculate_and_push_newsegment (GstTSDemux * demux, TSDemuxStream * stream)
+calculate_and_push_newsegment (GstTSDemux * demux, TSDemuxStream * stream,
+ MpegTSBaseProgram * target_program)
{
MpegTSBase *base = (MpegTSBase *) demux;
GstClockTime lowest_pts = GST_CLOCK_TIME_NONE;
@@ -2222,12 +2248,15 @@
GST_DEBUG ("Creating new newsegment for stream %p", stream);
+ if (target_program == NULL)
+ target_program = demux->program;
+
/* Speedup : if we don't need to calculate anything, go straight to pushing */
if (demux->segment_event)
goto push_new_segment;
/* Calculate the 'new_start' value, used for newsegment */
- for (tmp = demux->program->stream_list; tmp; tmp = tmp->next) {
+ for (tmp = target_program->stream_list; tmp; tmp = tmp->next) {
TSDemuxStream *pstream = (TSDemuxStream *) tmp->data;
if (GST_CLOCK_TIME_IS_VALID (pstream->first_pts)) {
@@ -2276,7 +2305,7 @@
}
push_new_segment:
- for (tmp = demux->program->stream_list; tmp; tmp = tmp->next) {
+ for (tmp = target_program->stream_list; tmp; tmp = tmp->next) {
stream = (TSDemuxStream *) tmp->data;
if (stream->pad == NULL)
continue;
@@ -2351,7 +2380,7 @@
"Stream needs update. Pushing GAP event to TS %" GST_TIME_FORMAT,
GST_TIME_ARGS (time));
if (G_UNLIKELY (ps->need_newsegment))
- calculate_and_push_newsegment (demux, ps);
+ calculate_and_push_newsegment (demux, ps, NULL);
/* Now send gap event */
gst_pad_push_event (ps->pad, gst_event_new_gap (time, 0));
@@ -2459,13 +2488,15 @@
}
static GstFlowReturn
-gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream)
+gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream,
+ MpegTSBaseProgram * target_program)
{
GstFlowReturn res = GST_FLOW_OK;
MpegTSBaseStream *bs = (MpegTSBaseStream *) stream;
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,
bs->stream_type, stream->state);
@@ -2579,7 +2610,7 @@
}
if (G_UNLIKELY (stream->need_newsegment))
- calculate_and_push_newsegment (demux, stream);
+ calculate_and_push_newsegment (demux, stream, target_program);
/* FIXME : Push pending buffers if any */
if (G_UNLIKELY (stream->pending)) {
@@ -2673,13 +2704,19 @@
* hit this will trigger a gap check */
if (G_UNLIKELY (stream->pts != GST_CLOCK_TIME_NONE &&
stream->pts > stream->gap_ref_pts + 2 * GST_SECOND)) {
- GstClockTime curpcr =
- mpegts_packetizer_get_current_time (MPEG_TS_BASE_PACKETIZER (demux),
- demux->program->pcr_pid);
- if (curpcr == GST_CLOCK_TIME_NONE || curpcr < 800 * GST_MSECOND)
- goto beach;
- curpcr -= 800 * GST_MSECOND;
- gst_ts_demux_check_and_sync_streams (demux, curpcr);
+ if (demux->program->pcr_pid != 0x1fff) {
+ GstClockTime curpcr =
+ mpegts_packetizer_get_current_time (MPEG_TS_BASE_PACKETIZER (demux),
+ demux->program->pcr_pid);
+ if (curpcr == GST_CLOCK_TIME_NONE || curpcr < 800 * GST_MSECOND)
+ goto beach;
+ curpcr -= 800 * GST_MSECOND;
+ /* Use the current PCR (with a safety margin) to sync against */
+ gst_ts_demux_check_and_sync_streams (demux, curpcr);
+ } else {
+ /* If we don't have a PCR track, just use the current stream PTS */
+ gst_ts_demux_check_and_sync_streams (demux, stream->pts);
+ }
}
}
@@ -2707,7 +2744,7 @@
if (G_UNLIKELY (packet->payload_unit_start_indicator) &&
FLAGS_HAS_PAYLOAD (packet->scram_afc_cc))
/* Flush previous data */
- res = gst_ts_demux_push_pending_data (demux, stream);
+ res = gst_ts_demux_push_pending_data (demux, stream, NULL);
if (packet->payload && (res == GST_FLOW_OK || res == GST_FLOW_NOT_LINKED)
&& stream->pad) {
@@ -2717,7 +2754,7 @@
/* Finally check if the data we queued completes a packet */
if (stream->expected_size && stream->current_size == stream->expected_size) {
GST_LOG ("pushing complete packet");
- res = gst_ts_demux_push_pending_data (demux, stream);
+ res = gst_ts_demux_push_pending_data (demux, stream, NULL);
}
}
@@ -2765,7 +2802,7 @@
for (tmp = demux->program->stream_list; tmp; tmp = tmp->next) {
TSDemuxStream *stream = (TSDemuxStream *) tmp->data;
if (stream->pad) {
- res = gst_ts_demux_push_pending_data (demux, stream);
+ res = gst_ts_demux_push_pending_data (demux, stream, NULL);
if (G_UNLIKELY (res != GST_FLOW_OK))
break;
}
diff --git a/gst/mpegtsdemux/tsdemux.h b/gst/mpegtsdemux/tsdemux.h
index b416733..32cbde2 100644
--- a/gst/mpegtsdemux/tsdemux.h
+++ b/gst/mpegtsdemux/tsdemux.h
@@ -64,6 +64,7 @@
gboolean emit_statistics;
/*< private >*/
+ gint program_generation; /* Incremented each time we switch program 0..15 */
MpegTSBaseProgram *program; /* Current program */
MpegTSBaseProgram *previous_program; /* Previous program, to deactivate once
* the new program becomes active */
diff --git a/gst/mpegtsmux/Makefile.in b/gst/mpegtsmux/Makefile.in
index 2611b8c..33c887b 100644
--- a/gst/mpegtsmux/Makefile.in
+++ b/gst/mpegtsmux/Makefile.in
@@ -349,6 +349,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -370,6 +372,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -419,6 +423,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -564,6 +570,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -690,8 +698,6 @@
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@
@@ -734,8 +740,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/mpegtsmux/mpegtsmux.c b/gst/mpegtsmux/mpegtsmux.c
index 4c68e3e..67c2b72 100644
--- a/gst/mpegtsmux/mpegtsmux.c
+++ b/gst/mpegtsmux/mpegtsmux.c
@@ -239,10 +239,10 @@
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&mpegtsmux_sink_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&mpegtsmux_src_factory));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &mpegtsmux_sink_factory);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &mpegtsmux_src_factory);
gst_element_class_set_static_metadata (gstelement_class,
"MPEG Transport Stream Muxer", "Codec/Muxer",
@@ -933,11 +933,9 @@
lang_code = gst_tag_get_language_code_iso_639_2B (lang);
if (lang_code) {
- if (pad_data->language) {
- g_free (pad_data->language);
- pad_data->language = NULL;
- }
GST_DEBUG_OBJECT (pad, "Setting language to '%s'", lang_code);
+
+ g_free (pad_data->language);
pad_data->language = g_strdup (lang_code);
} else {
GST_WARNING_OBJECT (pad, "Did not get language code for '%s'", lang);
diff --git a/gst/mpegtsmux/tsmux/Makefile.in b/gst/mpegtsmux/tsmux/Makefile.in
index f2526ec..05fd2d1 100644
--- a/gst/mpegtsmux/tsmux/Makefile.in
+++ b/gst/mpegtsmux/tsmux/Makefile.in
@@ -274,6 +274,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -295,6 +297,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -344,6 +348,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -489,6 +495,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -615,8 +623,6 @@
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@
@@ -659,8 +665,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/mpegtsmux/tsmux/tsmuxstream.c b/gst/mpegtsmux/tsmux/tsmuxstream.c
index 6b7c17e..f719d8f 100644
--- a/gst/mpegtsmux/tsmux/tsmuxstream.c
+++ b/gst/mpegtsmux/tsmux/tsmuxstream.c
@@ -148,6 +148,7 @@
case TSMUX_ST_AUDIO_MPEG1:
case TSMUX_ST_AUDIO_MPEG2:
/* FIXME: Assign sequential IDs? */
+ stream->is_audio = TRUE;
stream->id = 0xC0;
stream->pi.flags |= TSMUX_PACKET_FLAG_PES_FULL_HEADER;
break;
@@ -163,12 +164,15 @@
stream->is_video_stream = TRUE;
break;
case TSMUX_ST_PS_AUDIO_LPCM:
+ stream->is_audio = TRUE;
stream->id_extended = 0x80;
break;
case TSMUX_ST_PS_AUDIO_AC3:
+ stream->is_audio = TRUE;
stream->id_extended = 0x71;
break;
case TSMUX_ST_PS_AUDIO_DTS:
+ stream->is_audio = TRUE;
stream->id_extended = 0x82;
break;
default:
@@ -204,6 +208,7 @@
case TSMUX_ST_PS_OPUS:
/* FIXME: assign sequential extended IDs? */
stream->id = 0xBD;
+ stream->is_audio = TRUE;
stream->stream_type = TSMUX_ST_PRIVATE_DATA;
stream->is_opus = TRUE;
stream->pi.flags |= TSMUX_PACKET_FLAG_PES_FULL_HEADER;
@@ -732,7 +737,13 @@
g_return_if_fail (stream != NULL);
g_return_if_fail (pmt_stream != NULL);
- /* Based on the stream type, write out any descriptors to go in the
+ if (stream->is_audio && stream->language[0] != '\0') {
+ descriptor = gst_mpegts_descriptor_from_iso_639_language (stream->language);
+ g_ptr_array_add (pmt_stream->descriptors, descriptor);
+ descriptor = NULL;
+ }
+
+ /* Based on the stream type, write out any descriptors to go in the
* PMT ES_info field */
/* tag (registration_descriptor), length, format_identifier */
switch (stream->stream_type) {
diff --git a/gst/mpegtsmux/tsmux/tsmuxstream.h b/gst/mpegtsmux/tsmux/tsmuxstream.h
index 73b2a88..2766718 100644
--- a/gst/mpegtsmux/tsmux/tsmuxstream.h
+++ b/gst/mpegtsmux/tsmux/tsmuxstream.h
@@ -211,6 +211,7 @@
gchar language[4];
gboolean is_meta;
+ gboolean is_audio;
/* Opus */
gboolean is_opus;
diff --git a/gst/mve/Makefile.in b/gst/mve/Makefile.in
index fc8b6de..811ee1e 100644
--- a/gst/mve/Makefile.in
+++ b/gst/mve/Makefile.in
@@ -306,6 +306,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -327,6 +329,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -376,6 +380,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -521,6 +527,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -647,8 +655,6 @@
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@
@@ -691,8 +697,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/mve/gstmvemux.c b/gst/mve/gstmvemux.c
index a7a32cb..b123d2d 100644
--- a/gst/mve/gstmvemux.c
+++ b/gst/mve/gstmvemux.c
@@ -1350,12 +1350,11 @@
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&audio_sink_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&video_sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class,
+ &audio_sink_factory);
+ gst_element_class_add_static_pad_template (element_class,
+ &video_sink_factory);
gst_element_class_set_static_metadata (element_class, "MVE Multiplexer",
"Codec/Muxer",
diff --git a/gst/mxf/Makefile.in b/gst/mxf/Makefile.in
index d7fa222..21ddb86 100644
--- a/gst/mxf/Makefile.in
+++ b/gst/mxf/Makefile.in
@@ -311,6 +311,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -332,6 +334,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -381,6 +385,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -526,6 +532,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -652,8 +660,6 @@
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@
@@ -696,8 +702,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c
index 0eaad0f..823b1b6 100644
--- a/gst/mxf/mxfdemux.c
+++ b/gst/mxf/mxfdemux.c
@@ -3098,9 +3098,7 @@
} else if (flow == GST_FLOW_NOT_LINKED || flow < GST_FLOW_EOS) {
GstEvent *e;
- GST_ELEMENT_ERROR (demux, STREAM, FAILED,
- ("Internal data stream error."),
- ("stream stopped, reason %s", reason));
+ GST_ELEMENT_FLOW_ERROR (demux, flow);
e = gst_event_new_eos ();
gst_event_set_seqnum (e, demux->seqnum);
gst_mxf_demux_push_src_event (demux, e);
@@ -4461,13 +4459,13 @@
GST_DEBUG_FUNCPTR (gst_mxf_demux_change_state);
gstelement_class->query = GST_DEBUG_FUNCPTR (gst_mxf_demux_query);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&mxf_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&mxf_src_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &mxf_sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &mxf_src_template);
gst_element_class_set_static_metadata (gstelement_class, "MXF Demuxer",
- "Codec/Demuxer",
- "Demux MXF files", "Sebastian Dröge <sebastian.droege@collabora.co.uk>");
+ "Codec/Demuxer", "Demux MXF files",
+ "Sebastian Dröge <sebastian.droege@collabora.co.uk>");
}
static void
diff --git a/gst/mxf/mxfmux.c b/gst/mxf/mxfmux.c
index 4fb6630..c21a84d 100644
--- a/gst/mxf/mxfmux.c
+++ b/gst/mxf/mxfmux.c
@@ -171,8 +171,7 @@
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));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_templ);
p = mxf_essence_element_writer_get_pad_templates ();
while (p && *p) {
diff --git a/gst/netsim/Makefile.in b/gst/netsim/Makefile.in
index c04ea7e..e555656 100644
--- a/gst/netsim/Makefile.in
+++ b/gst/netsim/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/netsim/gstnetsim.c b/gst/netsim/gstnetsim.c
index 2e15ac3..833e746 100644
--- a/gst/netsim/gstnetsim.c
+++ b/gst/netsim/gstnetsim.c
@@ -400,10 +400,10 @@
g_type_class_add_private (klass, sizeof (GstNetSimPrivate));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_net_sim_src_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_net_sim_sink_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_net_sim_src_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_net_sim_sink_template);
gst_element_class_set_metadata (gstelement_class,
"Network Simulator",
diff --git a/gst/nuvdemux/Makefile.in b/gst/nuvdemux/Makefile.in
index ff8e8e5..fe3f5b0 100644
--- a/gst/nuvdemux/Makefile.in
+++ b/gst/nuvdemux/Makefile.in
@@ -301,6 +301,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -322,6 +324,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -371,6 +375,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -516,6 +522,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -642,8 +650,6 @@
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@
@@ -686,8 +692,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/nuvdemux/gstnuvdemux.c b/gst/nuvdemux/gstnuvdemux.c
index 765025f..88968f0 100644
--- a/gst/nuvdemux/gstnuvdemux.c
+++ b/gst/nuvdemux/gstnuvdemux.c
@@ -124,14 +124,11 @@
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&audio_src_template));
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&video_src_template));
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &audio_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &video_src_template);
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_set_static_metadata (element_class, "Nuv demuxer",
"Codec/Demuxer",
"Demultiplex a MythTV NuppleVideo .nuv file into audio and video",
@@ -732,9 +729,7 @@
if (res == GST_FLOW_UNEXPECTED) {
gst_nuv_demux_send_eos (nuv);
} else if (res == GST_FLOW_NOT_LINKED || res < GST_FLOW_UNEXPECTED) {
- GST_ELEMENT_ERROR (nuv, STREAM, FAILED,
- (_("Internal data stream error.")),
- ("streaming stopped, reason %s", gst_flow_get_name (res)));
+ GST_ELEMENT_FLOW_ERROR (nuv, res);
gst_nuv_demux_send_eos (nuv);
}
diff --git a/gst/onvif/Makefile.in b/gst/onvif/Makefile.in
index 84f6c30..1a707c8 100644
--- a/gst/onvif/Makefile.in
+++ b/gst/onvif/Makefile.in
@@ -301,6 +301,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -322,6 +324,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -371,6 +375,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -516,6 +522,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -642,8 +650,6 @@
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@
@@ -686,8 +692,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/onvif/gstrtponvifparse.c b/gst/onvif/gstrtponvifparse.c
index f48ac07..8ff4fa9 100644
--- a/gst/onvif/gstrtponvifparse.c
+++ b/gst/onvif/gstrtponvifparse.c
@@ -57,10 +57,10 @@
gstelement_class = GST_ELEMENT_CLASS (klass);
/* register pads */
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_template_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_template_factory));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &sink_template_factory);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &src_template_factory);
gst_element_class_set_static_metadata (gstelement_class,
"ONVIF NTP timestamps RTP extension", "Effect/RTP",
diff --git a/gst/onvif/gstrtponviftimestamp.c b/gst/onvif/gstrtponviftimestamp.c
index 4abece1..a957483 100644
--- a/gst/onvif/gstrtponviftimestamp.c
+++ b/gst/onvif/gstrtponviftimestamp.c
@@ -204,7 +204,7 @@
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_d_bit = TRUE;
self->set_e_bit = FALSE;
break;
default:
@@ -257,10 +257,10 @@
DEFAULT_SET_E_BIT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/* register pads */
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_template_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_template_factory));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &sink_template_factory);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &src_template_factory);
gst_element_class_set_static_metadata (gstelement_class,
"ONVIF NTP timestamps RTP extension", "Effect/RTP",
@@ -316,7 +316,7 @@
/* 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 &&
+ if (self->buffer != NULL && 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)) {
@@ -345,7 +345,7 @@
}
case GST_EVENT_FLUSH_STOP:
purge_cached_buffer_and_events (self);
- self->set_d_bit = FALSE;
+ self->set_d_bit = TRUE;
self->set_e_bit = FALSE;
gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);
break;
diff --git a/gst/patchdetect/Makefile.in b/gst/patchdetect/Makefile.in
index 22dceb0..cbc0358 100644
--- a/gst/patchdetect/Makefile.in
+++ b/gst/patchdetect/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/patchdetect/gstpatchdetect.c b/gst/patchdetect/gstpatchdetect.c
index 06a6396..ff21fda 100644
--- a/gst/patchdetect/gstpatchdetect.c
+++ b/gst/patchdetect/gstpatchdetect.c
@@ -109,10 +109,10 @@
{
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_patchdetect_sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_patchdetect_src_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_patchdetect_sink_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_patchdetect_src_template);
gst_element_class_set_static_metadata (element_class, "Color Patch Detector",
"Video/Analysis", "Detects color patches from a color calibration chart",
diff --git a/gst/pcapparse/Makefile.in b/gst/pcapparse/Makefile.in
index 9a4cd05..e4ce753 100644
--- a/gst/pcapparse/Makefile.in
+++ b/gst/pcapparse/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/pcapparse/gstirtspparse.c b/gst/pcapparse/gstirtspparse.c
index 88a0096..f6b7ace 100644
--- a/gst/pcapparse/gstirtspparse.c
+++ b/gst/pcapparse/gstirtspparse.c
@@ -105,10 +105,8 @@
parse_class->stop = GST_DEBUG_FUNCPTR (gst_irtsp_parse_stop);
parse_class->handle_frame = GST_DEBUG_FUNCPTR (gst_irtsp_parse_handle_frame);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
+ gst_element_class_add_static_pad_template (element_class, &src_template);
gst_element_class_set_static_metadata (element_class, "IRTSPParse",
"Raw/Parser",
diff --git a/gst/pcapparse/gstpcapparse.c b/gst/pcapparse/gstpcapparse.c
index 21e0cab..4ffa8c1 100644
--- a/gst/pcapparse/gstpcapparse.c
+++ b/gst/pcapparse/gstpcapparse.c
@@ -138,10 +138,8 @@
"Relative timestamp offset (ns) to apply (-1 = use absolute packet time)",
-1, G_MAXINT64, -1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
+ gst_element_class_add_static_pad_template (element_class, &src_template);
element_class->change_state = gst_pcap_parse_change_state;
diff --git a/gst/pnm/Makefile.in b/gst/pnm/Makefile.in
index deecc99..4a74f2a 100644
--- a/gst/pnm/Makefile.in
+++ b/gst/pnm/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/pnm/gstpnmdec.c b/gst/pnm/gstpnmdec.c
index 93c4140..1b5ea51 100644
--- a/gst/pnm/gstpnmdec.c
+++ b/gst/pnm/gstpnmdec.c
@@ -44,6 +44,7 @@
#include <stdio.h>
static gboolean gst_pnmdec_start (GstVideoDecoder * decoder);
+static GstFlowReturn gst_pnmdec_finish (GstVideoDecoder * decoder);
static gboolean gst_pnmdec_set_format (GstVideoDecoder * decoder,
GstVideoCodecState * state);
static gboolean gst_pnmdec_stop (GstVideoDecoder * decoder);
@@ -57,11 +58,14 @@
G_DEFINE_TYPE (GstPnmdec, gst_pnmdec, GST_TYPE_VIDEO_DECODER);
static GstStaticPadTemplate gst_pnmdec_src_pad_template =
- GST_STATIC_PAD_TEMPLATE ("src",
+GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
- GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("RGB") "; "
- GST_VIDEO_CAPS_MAKE ("GRAY8")));
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE
+ ("{ RGB, GRAY8, GRAY16_BE, GRAY16_LE }")));
+
+static GstStaticCaps gst_pnmdec_gray16_caps =
+GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{ GRAY16_BE, GRAY16_LE }"));
static GstStaticPadTemplate gst_pnmdec_sink_pad_template =
GST_STATIC_PAD_TEMPLATE ("sink",
@@ -69,6 +73,8 @@
GST_PAD_ALWAYS,
GST_STATIC_CAPS (MIME_ALL));
+GST_DEBUG_CATEGORY (pnmdecoder_debug);
+#define GST_CAT_DEFAULT pnmdecoder_debug
static void
gst_pnmdec_class_init (GstPnmdecClass * klass)
@@ -76,16 +82,20 @@
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
GstVideoDecoderClass *vdec_class = (GstVideoDecoderClass *) klass;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_pnmdec_src_pad_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_pnmdec_sink_pad_template));
+ GST_DEBUG_CATEGORY_INIT (pnmdecoder_debug, "pnmdec", 0, "PNM Video Decoder");
+
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_pnmdec_src_pad_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_pnmdec_sink_pad_template);
+
gst_element_class_set_static_metadata (element_class, "PNM image decoder",
"Codec/Decoder/Image",
"Decodes images in portable pixmap/graymap/bitmap/anymamp (PNM) format",
"Lutz Mueller <lutz@users.sourceforge.net>");
vdec_class->start = gst_pnmdec_start;
+ vdec_class->finish = gst_pnmdec_finish;
vdec_class->stop = gst_pnmdec_stop;
vdec_class->parse = gst_pnmdec_parse;
vdec_class->handle_frame = gst_pnmdec_handle_frame;
@@ -116,11 +126,91 @@
GST_PAD_SET_ACCEPT_TEMPLATE (GST_VIDEO_DECODER_SINK_PAD (s));
}
+static GstFlowReturn
+gst_pnmdec_negotiate (GstVideoDecoder * decoder)
+{
+ GstPnmdec *pnmdec = (GstPnmdec *) decoder;
+ GstVideoFormat fmt = GST_VIDEO_FORMAT_UNKNOWN;
+ GstVideoCodecState *output_state;
+
+ switch (pnmdec->mngr.info.type) {
+ case GST_PNM_TYPE_BITMAP:
+ if (pnmdec->mngr.info.encoding == GST_PNM_ENCODING_ASCII) {
+ return GST_FLOW_ERROR;
+ }
+ pnmdec->size = pnmdec->mngr.info.width * pnmdec->mngr.info.height * 1;
+ fmt = GST_VIDEO_FORMAT_GRAY8;
+ break;
+ case GST_PNM_TYPE_GRAYMAP:
+ if (pnmdec->mngr.info.max > 255) {
+ GstCaps *gray16_caps = gst_static_caps_get (&gst_pnmdec_gray16_caps);
+ GstCaps *peercaps;
+ GstStructure *peerstruct;
+ const gchar *fmtstr;
+
+ pnmdec->size = pnmdec->mngr.info.width * pnmdec->mngr.info.height * 2;
+ /* perform some basic negotiation to resolve which endianess,
+ * if any, is supported by the component downstream. Query
+ * the peer caps, intersecting with our preferred caps
+ */
+ peercaps =
+ gst_pad_peer_query_caps (GST_VIDEO_DECODER_SRC_PAD (decoder),
+ gray16_caps);
+ gst_caps_unref (gray16_caps);
+
+ GST_DEBUG ("Received caps from peer: %" GST_PTR_FORMAT, peercaps);
+ if (gst_caps_is_empty (peercaps)) {
+ gst_caps_unref (peercaps);
+ return FALSE;
+ }
+
+ if (!gst_caps_is_fixed (peercaps))
+ peercaps = gst_caps_fixate (peercaps);
+
+ peerstruct = gst_caps_get_structure (peercaps, 0);
+ fmtstr = gst_structure_get_string (peerstruct, "format");
+ if (fmtstr) {
+ if (g_str_equal (fmtstr, "GRAY16_BE")) {
+ fmt = GST_VIDEO_FORMAT_GRAY16_BE;
+ } else if (g_str_equal (fmtstr, "GRAY16_LE")) {
+ fmt = GST_VIDEO_FORMAT_GRAY16_LE;
+ }
+ }
+ gst_caps_unref (peercaps);
+ } else {
+ pnmdec->size = pnmdec->mngr.info.width * pnmdec->mngr.info.height * 1;
+ fmt = GST_VIDEO_FORMAT_GRAY8;
+ }
+ break;
+ case GST_PNM_TYPE_PIXMAP:
+ pnmdec->size = pnmdec->mngr.info.width * pnmdec->mngr.info.height * 3;
+ fmt = GST_VIDEO_FORMAT_RGB;
+ break;
+ }
+
+ if (fmt == GST_VIDEO_FORMAT_UNKNOWN)
+ return GST_FLOW_NOT_NEGOTIATED;
+
+ pnmdec->out_format = fmt;
+
+ output_state =
+ gst_video_decoder_set_output_state (decoder, fmt,
+ pnmdec->mngr.info.width, pnmdec->mngr.info.height, pnmdec->input_state);
+ gst_video_codec_state_unref (output_state);
+
+ if (gst_video_decoder_negotiate (decoder) == FALSE)
+ return GST_FLOW_NOT_NEGOTIATED;
+
+ return GST_FLOW_OK;
+}
+
static gboolean
gst_pnmdec_set_format (GstVideoDecoder * decoder, GstVideoCodecState * state)
{
GstPnmdec *pnmdec = (GstPnmdec *) decoder;
+ gst_pnmdec_negotiate (decoder);
+
if (pnmdec->input_state)
gst_video_codec_state_unref (pnmdec->input_state);
pnmdec->input_state = gst_video_codec_state_ref (state);
@@ -150,7 +240,7 @@
{
GScanner *scanner;
guint i = 0;
- guint target;
+ guint target, last_val = 0;
GstMapInfo map;
guint8 *outdata;
@@ -158,42 +248,78 @@
gst_buffer_map (s->buf, &map, GST_MAP_WRITE);
- /* leave the number of bytes already parsed */
- outdata = map.data + s->current_size;
- if (!bs) {
- goto drop_ok;
+ if (bs) {
+ GST_MEMDUMP_OBJECT (s, "Starting parse:", b, MIN (16, bs));
}
- if (s->last_byte) {
- while (*b >= '0' && *b <= '9') {
- s->last_byte = 10 * s->last_byte + *b - '0';
+ /* leave the number of bytes already parsed */
+ outdata = map.data + s->current_size;
+
+ if (s->have_last_val) {
+ while (bs && *b >= '0' && *b <= '9') {
+ s->last_val = 10 * s->last_val + *b - '0';
b++;
if (!--bs) {
goto drop_error;
}
}
- if (s->last_byte > 255) {
+ if (s->last_val > s->mngr.info.max) {
GST_DEBUG_OBJECT (s, "Corrupt ASCII encoded PNM file.");
goto drop_error;
}
+
+ GST_LOG_OBJECT (s, "Collected partial value from previous parse - %u",
+ s->last_val);
+ if (s->mngr.info.max > 255) {
+ if (i + 1 >= target) {
+ GST_DEBUG_OBJECT (s, "PNM file contains too much data.");
+ goto drop_error;
+ }
+ if (s->out_format == GST_VIDEO_FORMAT_GRAY16_BE)
+ GST_WRITE_UINT16_BE (outdata + i, s->last_val);
+ else
+ GST_WRITE_UINT16_LE (outdata + i, s->last_val);
+ i += 2;
+ } else {
+ outdata[i++] = s->last_val;
+ }
+ last_val = s->last_val;
+ s->have_last_val = FALSE;
}
- if (s->last_byte) {
- outdata[i++] = s->last_byte;
- s->last_byte = 0;
- }
+ /* Might be no data if we're at EOS */
+ if (!bs)
+ goto done;
scanner = g_scanner_new (NULL);
g_scanner_input_text (scanner, (gchar *) b, bs);
while (!g_scanner_eof (scanner)) {
switch (g_scanner_get_next_token (scanner)) {
case G_TOKEN_INT:
- if (i == target) {
- GST_DEBUG_OBJECT (s, "PNM file contains too much data.");
- g_scanner_destroy (scanner);
- goto drop_error;
+ if (s->mngr.info.max > 255) {
+ if (i + 1 >= target) {
+ GST_DEBUG_OBJECT (s,
+ "PNM file contains too much data after line %u col %u.",
+ scanner->line, scanner->position);
+ g_scanner_destroy (scanner);
+ goto done; // drop_error;
+ }
+ if (s->out_format == GST_VIDEO_FORMAT_GRAY16_BE)
+ GST_WRITE_UINT16_BE (outdata + i, scanner->value.v_int);
+ else
+ GST_WRITE_UINT16_LE (outdata + i, scanner->value.v_int);
+ i += 2;
+ } else {
+ if (i == target) {
+ GST_DEBUG_OBJECT (s,
+ "PNM file contains too much data after line %u col %u.",
+ scanner->line, scanner->position);
+ g_scanner_destroy (scanner);
+ goto drop_error;
+ }
+ outdata[i++] = scanner->value.v_int;
}
- outdata[i++] = scanner->value.v_int;
+ last_val = scanner->value.v_int;
break;
default:
/* Should we care? */ ;
@@ -202,18 +328,25 @@
g_scanner_destroy (scanner);
/* If we didn't get the whole image, handle the last byte with care. */
- if (i && i < target && b[bs - 1] > '0' && b[bs - 1] <= '9') {
- s->last_byte = outdata[--i];
+ if (i && i < target && b[bs - 1] >= '0' && b[bs - 1] <= '9') {
+ s->last_val = last_val;
+ s->have_last_val = TRUE;
+ if (s->mngr.info.max > 255)
+ i -= 2;
+ else
+ i--;
+ GST_LOG_OBJECT (s, "Stored last value %u for next parse cycle",
+ s->last_val);
}
- /* Update the number of bytes parsed in this scan */
+done:
+ /* Update the number of output bytes parsed in this scan */
s->current_size += i;
+ GST_LOG_OBJECT (s, "Parsed %u bytes, now have %u bytes of %u output",
+ i, s->current_size, s->size);
gst_buffer_unmap (s->buf, &map);
return GST_FLOW_OK;
-drop_ok:
- gst_buffer_unmap (s->buf, &map);
- return GST_FLOW_OK;
drop_error:
gst_buffer_unmap (s->buf, &map);
@@ -269,7 +402,10 @@
i_rowstride = 3 * s->mngr.info.width;
o_rowstride = GST_ROUND_UP_4 (i_rowstride);
} else {
- i_rowstride = s->mngr.info.width;
+ if (s->mngr.info.max > 255)
+ i_rowstride = s->mngr.info.width * 2;
+ else
+ i_rowstride = s->mngr.info.width;
o_rowstride = GST_ROUND_UP_4 (i_rowstride);
}
@@ -283,8 +419,28 @@
}
if (s->mngr.info.type != GST_PNM_TYPE_BITMAP) {
- /* Convert the pixels from 0 - max range to 0 - 255 range */
- if (s->mngr.info.max < 255) {
+ if (s->mngr.info.max > 255 && s->mngr.info.max < 65535) {
+ /* Convert the pixels from 0 - max range to 0 - 65535 range
+ * and appropriate endianness (input is always BE) */
+ guint8 *data = omap.data;
+ gint max = s->mngr.info.max;
+ if (s->out_format == GST_VIDEO_FORMAT_GRAY16_BE) {
+ for (i = 0; i < total_bytes; i += 2) {
+ /* Clamp to 65535 */
+ guint16 val = GST_READ_UINT16_BE (data + i);
+ val = (val > max) ? 65535 : 65535 * val / max;
+ GST_WRITE_UINT16_BE (data + i, val);
+ }
+ } else {
+ for (i = 0; i < total_bytes; i += 2) {
+ /* Clamp to 65535 */
+ guint16 val = GST_READ_UINT16_BE (data + i);
+ val = (val > max) ? 65535 : 65535 * val / max;
+ GST_WRITE_UINT16_LE (data + i, val);
+ }
+ }
+ } else if (s->mngr.info.max < 255) {
+ /* Convert the pixels from 0 - max range to 0 - 255 range */
gint max = s->mngr.info.max;
for (i = 0; i < total_bytes; i++) {
if (omap.data[i] <= max) {
@@ -305,6 +461,8 @@
}
gst_buffer_unmap (frame->output_buffer, &omap);
+ s->current_size = 0;
+
r = gst_video_decoder_finish_frame (GST_VIDEO_DECODER (s), frame);
out:
@@ -321,21 +479,23 @@
GstPnmdec *s = GST_PNMDEC (decoder);
GstFlowReturn r = GST_FLOW_OK;
guint offset = 0;
- GstVideoFormat format = GST_VIDEO_FORMAT_UNKNOWN;
- const guint8 *raw_data;
- GstVideoCodecState *output_state;
+ const guint8 *raw_data = NULL;
GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame);
size = gst_adapter_available (adapter);
- if (size < 8) {
- goto need_more_data;
- }
- raw_data = gst_adapter_map (adapter, size);
+ if (size > 0)
+ raw_data = gst_adapter_map (adapter, size);
+
+ GST_LOG_OBJECT (s, "Entering parse with %" G_GSIZE_FORMAT " bytes. at_eos %d",
+ size, at_eos);
if (s->mngr.info.fields != GST_PNM_INFO_FIELDS_ALL) {
GstPnmInfoMngrResult res;
+ if (size < 8)
+ goto need_more_data;
+
res = gst_pnm_info_mngr_scan (&s->mngr, raw_data, size);
switch (res) {
@@ -346,38 +506,16 @@
r = GST_FLOW_OK;
goto out;
case GST_PNM_INFO_MNGR_RESULT_FINISHED:
- switch (s->mngr.info.type) {
- case GST_PNM_TYPE_BITMAP:
- if (s->mngr.info.encoding == GST_PNM_ENCODING_ASCII) {
- r = GST_FLOW_ERROR;
- goto out;
- }
- s->size = s->mngr.info.width * s->mngr.info.height * 1;
- format = GST_VIDEO_FORMAT_GRAY8;
- break;
- case GST_PNM_TYPE_GRAYMAP:
- s->size = s->mngr.info.width * s->mngr.info.height * 1;
- format = GST_VIDEO_FORMAT_GRAY8;
- break;
- case GST_PNM_TYPE_PIXMAP:
- s->size = s->mngr.info.width * s->mngr.info.height * 3;
- format = GST_VIDEO_FORMAT_RGB;
- break;
- }
- output_state =
- gst_video_decoder_set_output_state (GST_VIDEO_DECODER (s), format,
- s->mngr.info.width, s->mngr.info.height, s->input_state);
- gst_video_codec_state_unref (output_state);
- if (gst_video_decoder_negotiate (GST_VIDEO_DECODER (s)) == FALSE) {
- r = GST_FLOW_NOT_NEGOTIATED;
+
+ r = gst_pnmdec_negotiate (decoder);
+ if (r != GST_FLOW_OK)
goto out;
- }
if (s->mngr.info.encoding == GST_PNM_ENCODING_ASCII) {
- s->mngr.data_offset++;
/* It is not possible to know the size of input ascii data to parse.
So we have to parse and know the number of pixels parsed and
then finally decide when we have full frame */
+ GST_DEBUG_OBJECT (s, "Allocating output frame of size %u", s->size);
s->buf = gst_buffer_new_and_alloc (s->size);
}
offset = s->mngr.data_offset;
@@ -387,8 +525,9 @@
}
if (s->mngr.info.encoding == GST_PNM_ENCODING_ASCII) {
- /* Parse ASCII data dn populate s->current_size with the number of
+ /* Parse ASCII data and populate s->current_size with the number of
bytes actually parsed from the input data */
+ GST_DEBUG_OBJECT (s, "Parsing %u bytes at offset %u", (guint) size, offset);
r = gst_pnmdec_parse_ascii (s, raw_data + offset, size);
} else {
/* Bitmap Contains 8 pixels in a byte */
@@ -417,7 +556,25 @@
gst_pnmdec_start (GstVideoDecoder * decoder)
{
GstPnmdec *pnmdec = (GstPnmdec *) decoder;
-
gst_video_decoder_set_packetized (GST_VIDEO_DECODER (pnmdec), FALSE);
+ gst_pnmdec_flush (pnmdec);
return TRUE;
}
+
+static GstFlowReturn
+gst_pnmdec_finish (GstVideoDecoder * decoder)
+{
+ GstPnmdec *s = (GstPnmdec *) decoder;
+
+ GST_LOG_OBJECT (s, "finishing");
+
+ if (s->mngr.info.encoding == GST_PNM_ENCODING_ASCII) {
+ /* One last go at outputting any final value */
+ gst_pnmdec_parse_ascii (s, 0, 0);
+ if (s->size <= s->current_size) {
+ return gst_video_decoder_have_frame (decoder);
+ }
+ }
+
+ return GST_FLOW_OK;
+}
diff --git a/gst/pnm/gstpnmdec.h b/gst/pnm/gstpnmdec.h
index 28a3c50..b5aac35 100644
--- a/gst/pnm/gstpnmdec.h
+++ b/gst/pnm/gstpnmdec.h
@@ -42,8 +42,10 @@
GstVideoDecoder decoder;
GstPnmInfoMngr mngr;
GstVideoCodecState *input_state;
- guint size, last_byte, current_size ;
+ guint size, last_val, current_size ;
+ gboolean have_last_val;
GstBuffer *buf;
+ GstVideoFormat out_format;
};
struct _GstPnmdecClass
diff --git a/gst/pnm/gstpnmenc.c b/gst/pnm/gstpnmenc.c
index 32fd6f6..2c45191 100644
--- a/gst/pnm/gstpnmenc.c
+++ b/gst/pnm/gstpnmenc.c
@@ -24,7 +24,7 @@
* To enable ASCII encoding, set the parameter ascii to TRUE. If you omit
* the parameter or set it to FALSE, the output will be raw encoded.
*
- * <refsect>
+ * <refsect2>
* <title>Example launch line</title>
* |[
* gst-launch-1.0 videotestsrc num_buffers=1 ! videoconvert ! "video/x-raw,format=GRAY8" ! pnmenc ascii=true ! filesink location=test.pnm
@@ -53,10 +53,12 @@
/* Add here. */
};
+
+
static GstStaticPadTemplate sink_pad_template =
- GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS,
- GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("RGB") "; "
- GST_VIDEO_CAPS_MAKE ("GRAY8")));
+GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE
+ ("{ RGB, GRAY8, GRAY16_BE, GRAY16_LE }")));
static GstStaticPadTemplate src_pad_template =
@@ -134,16 +136,27 @@
gboolean ret = TRUE;
GstVideoInfo *info;
GstVideoCodecState *output_state;
+ const gchar *mime_type = NULL;
pnmenc = GST_PNMENC (encoder);
info = &state->info;
switch (GST_VIDEO_INFO_FORMAT (info)) {
case GST_VIDEO_FORMAT_RGB:
+ pnmenc->info.max = 255;
pnmenc->info.type = GST_PNM_TYPE_PIXMAP;
+ mime_type = MIME_PM;
break;
case GST_VIDEO_FORMAT_GRAY8:
+ pnmenc->info.max = 255;
pnmenc->info.type = GST_PNM_TYPE_GRAYMAP;
+ mime_type = MIME_GM;
+ break;
+ case GST_VIDEO_FORMAT_GRAY16_BE:
+ case GST_VIDEO_FORMAT_GRAY16_LE:
+ pnmenc->info.max = 65535;
+ pnmenc->info.type = GST_PNM_TYPE_GRAYMAP;
+ mime_type = MIME_GM;
break;
default:
ret = FALSE;
@@ -152,8 +165,6 @@
pnmenc->info.width = GST_VIDEO_INFO_WIDTH (info);
pnmenc->info.height = GST_VIDEO_INFO_HEIGHT (info);
- /* Supported max value is only one, that is 255 */
- pnmenc->info.max = 255;
if (pnmenc->input_state)
gst_video_codec_state_unref (pnmenc->input_state);
@@ -161,7 +172,7 @@
output_state =
gst_video_encoder_set_output_state (encoder,
- gst_caps_new_empty_simple ("image/pnm"), state);
+ gst_caps_new_empty_simple (mime_type), state);
gst_video_codec_state_unref (output_state);
done:
@@ -172,7 +183,7 @@
gst_pnmenc_handle_frame (GstVideoEncoder * encoder, GstVideoCodecFrame * frame)
{
GstPnmenc *pnmenc;
- guint size, pixels;
+ guint size, pixels, bytesize;
GstMapInfo omap, imap;
gchar *header = NULL;
GstVideoInfo *info;
@@ -180,16 +191,34 @@
guint i_rowstride, o_rowstride;
guint bytes = 0, index, head_size;
guint i, j;
-
+ guint maxbytes_per_pixel, str_len;
+ gchar format_str[4];
pnmenc = GST_PNMENC (encoder);
info = &pnmenc->input_state->info;
switch (GST_VIDEO_INFO_FORMAT (info)) {
case GST_VIDEO_FORMAT_RGB:
pixels = size = pnmenc->info.width * pnmenc->info.height * 3;
+ bytesize = 1;
+ maxbytes_per_pixel = 4;
+ str_len = 3;
+ g_strlcpy (format_str, "%3i", 4);
break;
case GST_VIDEO_FORMAT_GRAY8:
pixels = size = pnmenc->info.width * pnmenc->info.height * 1;
+ bytesize = 1;
+ maxbytes_per_pixel = 4;
+ str_len = 3;
+ g_strlcpy (format_str, "%3i", 4);
+ break;
+ case GST_VIDEO_FORMAT_GRAY16_LE:
+ case GST_VIDEO_FORMAT_GRAY16_BE:
+ pixels = pnmenc->info.width * pnmenc->info.height * 1;
+ bytesize = 2;
+ size = pixels * bytesize;
+ maxbytes_per_pixel = 6;
+ str_len = 5;
+ g_strlcpy (format_str, "%5i", 4);
break;
default:
ret = FALSE;
@@ -222,58 +251,111 @@
ret = GST_FLOW_ERROR;
goto done;
}
- memcpy (omap.data, header, strlen (header));
-
+ /* Copy out the header first */
head_size = strlen (header);
+ memcpy (omap.data, header, head_size);
+
if (pnmenc->info.encoding == GST_PNM_ENCODING_ASCII) {
/* We need to convert to ASCII */
- if (pnmenc->info.width % 4 != 0) {
- /* Convert from gstreamer rowstride to PNM rowstride */
- if (pnmenc->info.type == GST_PNM_TYPE_PIXMAP) {
- o_rowstride = 3 * pnmenc->info.width;
- } else {
- o_rowstride = pnmenc->info.width;
- }
- i_rowstride = GST_VIDEO_FRAME_COMP_STRIDE (pnmenc->input_state, 0);
-
- for (i = 0; i < pnmenc->info.height; i++) {
- index = i * i_rowstride;
- for (j = 0; j < o_rowstride; j++, bytes++, index++) {
- g_snprintf ((char *) omap.data + head_size, 4, "%3i",
- imap.data[index]);
- head_size += 3;
- omap.data[head_size++] = ' ';
- /* Add new line so that file will not end up with sinle big line */
- if (!((bytes + 1) % 20))
- omap.data[head_size++] = '\n';
- }
- }
+ /* Convert from gstreamer rowstride to PNM rowstride as we go */
+ if (pnmenc->info.type == GST_PNM_TYPE_PIXMAP) {
+ o_rowstride = 3 * pnmenc->info.width;
} else {
- for (i = 0; i < pixels; i++) {
- g_snprintf ((char *) omap.data + head_size, 4, "%3i", imap.data[i]);
- head_size += 3;
- omap.data[head_size++] = ' ';
- if (!((i + 1) % 20))
- omap.data[head_size++] = '\n';
- }
+ o_rowstride = pnmenc->info.width;
}
- } else {
- /* Need to convert from GStreamer rowstride to PNM rowstride */
- if (pnmenc->info.width % 4 != 0) {
- if (pnmenc->info.type == GST_PNM_TYPE_PIXMAP) {
- o_rowstride = 3 * pnmenc->info.width;
- } else {
- o_rowstride = pnmenc->info.width;
- }
- i_rowstride = GST_VIDEO_FRAME_COMP_STRIDE (pnmenc->input_state, 0);
+ i_rowstride = GST_VIDEO_FRAME_COMP_STRIDE (pnmenc->input_state, 0);
- for (i = 0; i < pnmenc->info.height; i++)
- memcpy (omap.data + head_size + o_rowstride * i,
- imap.data + i_rowstride * i, o_rowstride);
+ switch (GST_VIDEO_INFO_FORMAT (info)) {
+ case GST_VIDEO_FORMAT_RGB:
+ case GST_VIDEO_FORMAT_GRAY8:
+ for (i = 0; i < pnmenc->info.height; i++) {
+ index = i * i_rowstride;
+ for (j = 0; j < o_rowstride; j++, bytes++, index++) {
+ g_snprintf ((char *) omap.data + head_size, maxbytes_per_pixel,
+ format_str, imap.data[index]);
+ head_size += str_len;
+ omap.data[head_size++] = ' ';
+ /* Add new line so that file will not end up with single big line */
+ if (!((bytes + 1) % 20))
+ omap.data[head_size++] = '\n';
+ }
+ }
+ break;
+ case GST_VIDEO_FORMAT_GRAY16_BE:
+ for (i = 0; i < pnmenc->info.height; i++) {
+ index = i * i_rowstride;
+ for (j = 0; j < o_rowstride; j++, bytes++, index += 2) {
+ g_snprintf ((char *) omap.data + head_size, maxbytes_per_pixel,
+ format_str, GST_READ_UINT16_BE (imap.data + index));
+ head_size += str_len;
+ omap.data[head_size++] = ' ';
+ /* Add new line so that file will not end up with single big line */
+ if (!((bytes + 1) % 20))
+ omap.data[head_size++] = '\n';
+ }
+ }
+ break;
+ case GST_VIDEO_FORMAT_GRAY16_LE:
+ for (i = 0; i < pnmenc->info.height; i++) {
+ index = i * i_rowstride;
+ for (j = 0; j < o_rowstride; j++, bytes++, index += 2) {
+ g_snprintf ((char *) omap.data + head_size, maxbytes_per_pixel,
+ format_str, GST_READ_UINT16_LE (imap.data + index));
+ head_size += str_len;
+ omap.data[head_size++] = ' ';
+ /* Add new line so that file will not end up with single big line */
+ if (!((bytes + 1) % 20))
+ omap.data[head_size++] = '\n';
+ }
+ }
+ break;
+ default:
+ GST_ERROR_OBJECT (encoder, "Unhandled format %s",
+ gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (info)));
+ gst_buffer_unmap (frame->output_buffer, &omap);
+ gst_buffer_unmap (frame->input_buffer, &imap);
+ g_free (header);
+ return GST_FLOW_ERROR;
+ }
+
+ gst_buffer_set_size (frame->output_buffer, head_size);
+ } else {
+ guint out_index = head_size;
+
+ /* Binary output. 8-bit, or 16-bit BE */
+ if (pnmenc->info.type == GST_PNM_TYPE_PIXMAP) {
+ o_rowstride = 3 * pnmenc->info.width * bytesize;
} else {
- /* size contains complete image size inlcuding header size,
- Exclude header size while copying data */
- memcpy (omap.data + strlen (header), imap.data, (size - head_size));
+ o_rowstride = pnmenc->info.width * bytesize;
+ }
+ i_rowstride = GST_VIDEO_FRAME_COMP_STRIDE (pnmenc->input_state, 0);
+
+ switch (GST_VIDEO_INFO_FORMAT (info)) {
+ case GST_VIDEO_FORMAT_GRAY16_BE:
+ for (i = 0; i < pnmenc->info.height; i++) {
+ index = i * i_rowstride;
+ for (j = 0; j < o_rowstride; j += 2, index += 2) {
+ guint16 val = GST_READ_UINT16_LE (imap.data + index);
+ GST_WRITE_UINT16_BE (omap.data + out_index, val);
+ out_index += 2;
+ }
+ }
+ break;
+ case GST_VIDEO_FORMAT_GRAY16_LE:
+ for (i = 0; i < pnmenc->info.height; i++) {
+ index = i * i_rowstride;
+ for (j = 0; j < o_rowstride; j += 2, index += 2) {
+ guint16 val = GST_READ_UINT16_LE (imap.data + index);
+ GST_WRITE_UINT16_BE (omap.data + out_index, val);
+ out_index += 2;
+ }
+ }
+ break;
+ default:
+ for (i = 0; i < pnmenc->info.height; i++) {
+ memcpy (omap.data + head_size + o_rowstride * i,
+ imap.data + i_rowstride * i, o_rowstride);
+ }
}
}
@@ -303,11 +385,8 @@
g_param_spec_boolean ("ascii", "ASCII Encoding", "The output will be "
"ASCII encoded", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_pad_template));
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_pad_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_pad_template);
+ gst_element_class_add_static_pad_template (element_class, &src_pad_template);
gst_element_class_set_static_metadata (element_class, "PNM image encoder",
"Codec/Encoder/Image",
diff --git a/gst/pnm/gstpnmutils.c b/gst/pnm/gstpnmutils.c
index b7441cd..a72e423 100644
--- a/gst/pnm/gstpnmutils.c
+++ b/gst/pnm/gstpnmutils.c
@@ -178,7 +178,11 @@
case ' ':
/* Check for maximum and minimum supported bit depth and
return error if its out of range */
- if ((mngr->info.max > 255) || (mngr->info.max < 1)) {
+ if (mngr->info.type == GST_PNM_TYPE_GRAYMAP) {
+ if ((mngr->info.max > 65535) || (mngr->info.max < 1)) {
+ return GST_PNM_INFO_MNGR_RESULT_FAILED;
+ }
+ } else if ((mngr->info.max > 255) || (mngr->info.max < 1)) {
return GST_PNM_INFO_MNGR_RESULT_FAILED;
}
mngr->info.fields |= GST_PNM_INFO_FIELDS_MAX;
diff --git a/gst/rawparse/Makefile.am b/gst/rawparse/Makefile.am
index 03eeb48..623dc94 100644
--- a/gst/rawparse/Makefile.am
+++ b/gst/rawparse/Makefile.am
@@ -2,9 +2,13 @@
plugin_LTLIBRARIES = libgstrawparse.la
libgstrawparse_la_SOURCES = \
- gstrawparse.c \
+ gstunalignedaudioparse.c \
+ gstunalignedvideoparse.c \
gstaudioparse.c \
gstvideoparse.c \
+ gstrawbaseparse.c \
+ gstrawaudioparse.c \
+ gstrawvideoparse.c \
plugin.c
libgstrawparse_la_CFLAGS = \
$(GST_PLUGINS_BASE_CFLAGS) \
@@ -19,6 +23,12 @@
libgstrawparse_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
noinst_HEADERS = \
+ unalignedaudio.h \
+ unalignedvideo.h \
+ gstunalignedaudioparse.h \
+ gstunalignedvideoparse.h \
gstaudioparse.h \
- gstrawparse.h \
- gstvideoparse.h
+ gstvideoparse.h \
+ gstrawbaseparse.h \
+ gstrawaudioparse.h \
+ gstrawvideoparse.h
diff --git a/gst/rawparse/Makefile.in b/gst/rawparse/Makefile.in
index cff1ba5..b024238 100644
--- a/gst/rawparse/Makefile.in
+++ b/gst/rawparse/Makefile.in
@@ -165,9 +165,15 @@
am__DEPENDENCIES_1 =
libgstrawparse_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_libgstrawparse_la_OBJECTS = libgstrawparse_la-gstrawparse.lo \
+am_libgstrawparse_la_OBJECTS = \
+ libgstrawparse_la-gstunalignedaudioparse.lo \
+ libgstrawparse_la-gstunalignedvideoparse.lo \
libgstrawparse_la-gstaudioparse.lo \
- libgstrawparse_la-gstvideoparse.lo libgstrawparse_la-plugin.lo
+ libgstrawparse_la-gstvideoparse.lo \
+ libgstrawparse_la-gstrawbaseparse.lo \
+ libgstrawparse_la-gstrawaudioparse.lo \
+ libgstrawparse_la-gstrawvideoparse.lo \
+ libgstrawparse_la-plugin.lo
libgstrawparse_la_OBJECTS = $(am_libgstrawparse_la_OBJECTS)
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
@@ -304,6 +310,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +333,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +384,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +531,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +659,6 @@
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@
@@ -689,8 +701,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -781,9 +798,13 @@
wayland_scanner = @wayland_scanner@
plugin_LTLIBRARIES = libgstrawparse.la
libgstrawparse_la_SOURCES = \
- gstrawparse.c \
+ gstunalignedaudioparse.c \
+ gstunalignedvideoparse.c \
gstaudioparse.c \
gstvideoparse.c \
+ gstrawbaseparse.c \
+ gstrawaudioparse.c \
+ gstrawvideoparse.c \
plugin.c
libgstrawparse_la_CFLAGS = \
@@ -800,9 +821,15 @@
libgstrawparse_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
libgstrawparse_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
noinst_HEADERS = \
+ unalignedaudio.h \
+ unalignedvideo.h \
+ gstunalignedaudioparse.h \
+ gstunalignedvideoparse.h \
gstaudioparse.h \
- gstrawparse.h \
- gstvideoparse.h
+ gstvideoparse.h \
+ gstrawbaseparse.h \
+ gstrawaudioparse.h \
+ gstrawvideoparse.h
all: all-am
@@ -883,7 +910,11 @@
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrawparse_la-gstaudioparse.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrawparse_la-gstrawparse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrawparse_la-gstrawaudioparse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrawparse_la-gstrawbaseparse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrawparse_la-gstrawvideoparse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrawparse_la-gstunalignedaudioparse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrawparse_la-gstunalignedvideoparse.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrawparse_la-gstvideoparse.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrawparse_la-plugin.Plo@am__quote@
@@ -911,12 +942,19 @@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
-libgstrawparse_la-gstrawparse.lo: gstrawparse.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrawparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrawparse_la_CFLAGS) $(CFLAGS) -MT libgstrawparse_la-gstrawparse.lo -MD -MP -MF $(DEPDIR)/libgstrawparse_la-gstrawparse.Tpo -c -o libgstrawparse_la-gstrawparse.lo `test -f 'gstrawparse.c' || echo '$(srcdir)/'`gstrawparse.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrawparse_la-gstrawparse.Tpo $(DEPDIR)/libgstrawparse_la-gstrawparse.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrawparse.c' object='libgstrawparse_la-gstrawparse.lo' libtool=yes @AMDEPBACKSLASH@
+libgstrawparse_la-gstunalignedaudioparse.lo: gstunalignedaudioparse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrawparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrawparse_la_CFLAGS) $(CFLAGS) -MT libgstrawparse_la-gstunalignedaudioparse.lo -MD -MP -MF $(DEPDIR)/libgstrawparse_la-gstunalignedaudioparse.Tpo -c -o libgstrawparse_la-gstunalignedaudioparse.lo `test -f 'gstunalignedaudioparse.c' || echo '$(srcdir)/'`gstunalignedaudioparse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrawparse_la-gstunalignedaudioparse.Tpo $(DEPDIR)/libgstrawparse_la-gstunalignedaudioparse.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstunalignedaudioparse.c' object='libgstrawparse_la-gstunalignedaudioparse.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 $(libgstrawparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrawparse_la_CFLAGS) $(CFLAGS) -c -o libgstrawparse_la-gstrawparse.lo `test -f 'gstrawparse.c' || echo '$(srcdir)/'`gstrawparse.c
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrawparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrawparse_la_CFLAGS) $(CFLAGS) -c -o libgstrawparse_la-gstunalignedaudioparse.lo `test -f 'gstunalignedaudioparse.c' || echo '$(srcdir)/'`gstunalignedaudioparse.c
+
+libgstrawparse_la-gstunalignedvideoparse.lo: gstunalignedvideoparse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrawparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrawparse_la_CFLAGS) $(CFLAGS) -MT libgstrawparse_la-gstunalignedvideoparse.lo -MD -MP -MF $(DEPDIR)/libgstrawparse_la-gstunalignedvideoparse.Tpo -c -o libgstrawparse_la-gstunalignedvideoparse.lo `test -f 'gstunalignedvideoparse.c' || echo '$(srcdir)/'`gstunalignedvideoparse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrawparse_la-gstunalignedvideoparse.Tpo $(DEPDIR)/libgstrawparse_la-gstunalignedvideoparse.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstunalignedvideoparse.c' object='libgstrawparse_la-gstunalignedvideoparse.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 $(libgstrawparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrawparse_la_CFLAGS) $(CFLAGS) -c -o libgstrawparse_la-gstunalignedvideoparse.lo `test -f 'gstunalignedvideoparse.c' || echo '$(srcdir)/'`gstunalignedvideoparse.c
libgstrawparse_la-gstaudioparse.lo: gstaudioparse.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrawparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrawparse_la_CFLAGS) $(CFLAGS) -MT libgstrawparse_la-gstaudioparse.lo -MD -MP -MF $(DEPDIR)/libgstrawparse_la-gstaudioparse.Tpo -c -o libgstrawparse_la-gstaudioparse.lo `test -f 'gstaudioparse.c' || echo '$(srcdir)/'`gstaudioparse.c
@@ -932,6 +970,27 @@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrawparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrawparse_la_CFLAGS) $(CFLAGS) -c -o libgstrawparse_la-gstvideoparse.lo `test -f 'gstvideoparse.c' || echo '$(srcdir)/'`gstvideoparse.c
+libgstrawparse_la-gstrawbaseparse.lo: gstrawbaseparse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrawparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrawparse_la_CFLAGS) $(CFLAGS) -MT libgstrawparse_la-gstrawbaseparse.lo -MD -MP -MF $(DEPDIR)/libgstrawparse_la-gstrawbaseparse.Tpo -c -o libgstrawparse_la-gstrawbaseparse.lo `test -f 'gstrawbaseparse.c' || echo '$(srcdir)/'`gstrawbaseparse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrawparse_la-gstrawbaseparse.Tpo $(DEPDIR)/libgstrawparse_la-gstrawbaseparse.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrawbaseparse.c' object='libgstrawparse_la-gstrawbaseparse.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 $(libgstrawparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrawparse_la_CFLAGS) $(CFLAGS) -c -o libgstrawparse_la-gstrawbaseparse.lo `test -f 'gstrawbaseparse.c' || echo '$(srcdir)/'`gstrawbaseparse.c
+
+libgstrawparse_la-gstrawaudioparse.lo: gstrawaudioparse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrawparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrawparse_la_CFLAGS) $(CFLAGS) -MT libgstrawparse_la-gstrawaudioparse.lo -MD -MP -MF $(DEPDIR)/libgstrawparse_la-gstrawaudioparse.Tpo -c -o libgstrawparse_la-gstrawaudioparse.lo `test -f 'gstrawaudioparse.c' || echo '$(srcdir)/'`gstrawaudioparse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrawparse_la-gstrawaudioparse.Tpo $(DEPDIR)/libgstrawparse_la-gstrawaudioparse.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrawaudioparse.c' object='libgstrawparse_la-gstrawaudioparse.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 $(libgstrawparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrawparse_la_CFLAGS) $(CFLAGS) -c -o libgstrawparse_la-gstrawaudioparse.lo `test -f 'gstrawaudioparse.c' || echo '$(srcdir)/'`gstrawaudioparse.c
+
+libgstrawparse_la-gstrawvideoparse.lo: gstrawvideoparse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrawparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrawparse_la_CFLAGS) $(CFLAGS) -MT libgstrawparse_la-gstrawvideoparse.lo -MD -MP -MF $(DEPDIR)/libgstrawparse_la-gstrawvideoparse.Tpo -c -o libgstrawparse_la-gstrawvideoparse.lo `test -f 'gstrawvideoparse.c' || echo '$(srcdir)/'`gstrawvideoparse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrawparse_la-gstrawvideoparse.Tpo $(DEPDIR)/libgstrawparse_la-gstrawvideoparse.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrawvideoparse.c' object='libgstrawparse_la-gstrawvideoparse.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 $(libgstrawparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrawparse_la_CFLAGS) $(CFLAGS) -c -o libgstrawparse_la-gstrawvideoparse.lo `test -f 'gstrawvideoparse.c' || echo '$(srcdir)/'`gstrawvideoparse.c
+
libgstrawparse_la-plugin.lo: plugin.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrawparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrawparse_la_CFLAGS) $(CFLAGS) -MT libgstrawparse_la-plugin.lo -MD -MP -MF $(DEPDIR)/libgstrawparse_la-plugin.Tpo -c -o libgstrawparse_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrawparse_la-plugin.Tpo $(DEPDIR)/libgstrawparse_la-plugin.Plo
diff --git a/gst/rawparse/gstaudioparse.c b/gst/rawparse/gstaudioparse.c
index 04477f5..4e7f694 100644
--- a/gst/rawparse/gstaudioparse.c
+++ b/gst/rawparse/gstaudioparse.c
@@ -22,6 +22,8 @@
* SECTION:element-audioparse
*
* Converts a byte stream into audio frames.
+ *
+ * <note>This element is deprecated. Use #GstRawAudioParse instead.</note>
*/
#ifdef HAVE_CONFIG_H
@@ -32,10 +34,34 @@
* for now with newer GLib versions (>= 2.31.0) */
#define GLIB_DISABLE_DEPRECATION_WARNINGS
+#include <gst/gst.h>
+#include <gst/audio/audio.h>
#include "gstaudioparse.h"
+#include "gstrawaudioparse.h"
+#include "unalignedaudio.h"
#include <string.h>
+
+static GstStaticPadTemplate static_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+
+static GstStaticPadTemplate static_src_template =
+ GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_AUDIO_CAPS_MAKE (GST_AUDIO_FORMATS_ALL)
+ ", layout = (string) { interleaved, non-interleaved }; "
+ GST_UNALIGNED_RAW_AUDIO_CAPS "; "
+ "audio/x-alaw, rate=(int)[1,MAX], channels=(int)[1,MAX]; "
+ "audio/x-mulaw, rate=(int)[1,MAX], channels=(int)[1,MAX]")
+ );
+
+
typedef enum
{
GST_AUDIO_PARSE_FORMAT_RAW,
@@ -43,21 +69,10 @@
GST_AUDIO_PARSE_FORMAT_ALAW
} GstAudioParseFormat;
-typedef enum
-{
- GST_AUDIO_PARSE_ENDIANNESS_LITTLE = 1234,
- GST_AUDIO_PARSE_ENDIANNESS_BIG = 4321
-} GstAudioParseEndianness;
-
static void gst_audio_parse_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_audio_parse_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
-static void gst_audio_parse_finalize (GObject * object);
-
-static GstCaps *gst_audio_parse_get_caps (GstRawParse * rp);
-
-static void gst_audio_parse_update_frame_size (GstAudioParse * ap);
GST_DEBUG_CATEGORY_STATIC (gst_audio_parse_debug);
#define GST_CAT_DEFAULT gst_audio_parse_debug
@@ -96,21 +111,16 @@
#define gst_audio_parse_parent_class parent_class
-G_DEFINE_TYPE (GstAudioParse, gst_audio_parse, GST_TYPE_RAW_PARSE);
+G_DEFINE_TYPE (GstAudioParse, gst_audio_parse, GST_TYPE_BIN);
static void
gst_audio_parse_class_init (GstAudioParseClass * klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
- GstRawParseClass *rp_class = GST_RAW_PARSE_CLASS (klass);
- GstCaps *caps;
gobject_class->set_property = gst_audio_parse_set_property;
gobject_class->get_property = gst_audio_parse_get_property;
- gobject_class->finalize = gst_audio_parse_finalize;
-
- rp_class->get_caps = gst_audio_parse_get_caps;
g_object_class_install_property (gobject_class, PROP_FORMAT,
g_param_spec_enum ("format", "Format",
@@ -154,17 +164,13 @@
gst_element_class_set_static_metadata (gstelement_class, "Audio Parse",
"Filter/Audio",
- "Converts stream into audio frames",
+ "Converts stream into audio frames (deprecated: use rawaudioparse instead)",
"Sebastian Dröge <sebastian.droege@collabora.co.uk>");
- caps = gst_caps_from_string (GST_AUDIO_CAPS_MAKE (GST_AUDIO_FORMATS_ALL)
- ", layout = (string) { interleaved, non-interleaved }; "
- "audio/x-alaw, rate=(int)[1,MAX], channels=(int)[1,MAX]; "
- "audio/x-mulaw, rate=(int)[1,MAX], channels=(int)[1,MAX]");
-
- gst_raw_parse_class_set_src_pad_template (rp_class, caps);
- gst_raw_parse_class_set_multiple_frames_per_buffer (rp_class, TRUE);
- gst_caps_unref (caps);
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&static_sink_template));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&static_src_template));
GST_DEBUG_CATEGORY_INIT (gst_audio_parse_debug, "audioparse", 0,
"audioparse element");
@@ -173,13 +179,28 @@
static void
gst_audio_parse_init (GstAudioParse * ap)
{
- ap->format = GST_AUDIO_PARSE_FORMAT_RAW;
- ap->raw_format = GST_AUDIO_FORMAT_S16;
- ap->channels = 2;
- ap->interleaved = TRUE;
+ GstPad *inner_pad;
+ GstPad *ghostpad;
- gst_audio_parse_update_frame_size (ap);
- gst_raw_parse_set_fps (GST_RAW_PARSE (ap), 44100, 1);
+ ap->rawaudioparse =
+ gst_element_factory_make ("rawaudioparse", "inner_rawaudioparse");
+ g_assert (ap->rawaudioparse != NULL);
+
+ gst_bin_add (GST_BIN (ap), ap->rawaudioparse);
+
+ inner_pad = gst_element_get_static_pad (ap->rawaudioparse, "sink");
+ ghostpad =
+ gst_ghost_pad_new_from_template ("sink", inner_pad,
+ gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (ap), "sink"));
+ gst_element_add_pad (GST_ELEMENT (ap), ghostpad);
+ gst_object_unref (GST_OBJECT (inner_pad));
+
+ inner_pad = gst_element_get_static_pad (ap->rawaudioparse, "src");
+ ghostpad =
+ gst_ghost_pad_new_from_template ("src", inner_pad,
+ gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (ap), "src"));
+ gst_element_add_pad (GST_ELEMENT (ap), ghostpad);
+ gst_object_unref (GST_OBJECT (inner_pad));
}
static void
@@ -188,39 +209,68 @@
{
GstAudioParse *ap = GST_AUDIO_PARSE (object);
- g_return_if_fail (!gst_raw_parse_is_negotiated (GST_RAW_PARSE (ap)));
-
switch (prop_id) {
- case PROP_FORMAT:
- ap->format = g_value_get_enum (value);
- break;
- case PROP_RAW_FORMAT:
- ap->raw_format = g_value_get_enum (value);
- break;
- case PROP_RATE:
- gst_raw_parse_set_fps (GST_RAW_PARSE (ap), g_value_get_int (value), 1);
- break;
- case PROP_CHANNELS:
- ap->channels = g_value_get_int (value);
- break;
- case PROP_INTERLEAVED:
- ap->interleaved = g_value_get_boolean (value);
- break;
- case PROP_CHANNEL_POSITIONS:
- if (ap->channel_positions)
- g_value_array_free (ap->channel_positions);
+ case PROP_FORMAT:{
+ GstRawAudioParseFormat raw_parse_format;
- ap->channel_positions = g_value_dup_boxed (value);
+ switch (g_value_get_enum (value)) {
+ case GST_AUDIO_PARSE_FORMAT_RAW:
+ raw_parse_format = GST_RAW_AUDIO_PARSE_FORMAT_PCM;
+ break;
+
+ case GST_AUDIO_PARSE_FORMAT_MULAW:
+ raw_parse_format = GST_RAW_AUDIO_PARSE_FORMAT_MULAW;
+ break;
+
+ case GST_AUDIO_PARSE_FORMAT_ALAW:
+ raw_parse_format = GST_RAW_AUDIO_PARSE_FORMAT_ALAW;
+ break;
+
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ g_object_set (G_OBJECT (ap->rawaudioparse), "format", raw_parse_format,
+ NULL);
+
break;
+ }
+
+ case PROP_RAW_FORMAT:
+ g_object_set (G_OBJECT (ap->rawaudioparse), "pcm-format",
+ g_value_get_enum (value), NULL);
+ break;
+
+ case PROP_RATE:
+ g_object_set (G_OBJECT (ap->rawaudioparse), "sample-rate",
+ g_value_get_int (value), NULL);
+ break;
+
+ case PROP_CHANNELS:
+ g_object_set (G_OBJECT (ap->rawaudioparse), "num-channels",
+ g_value_get_int (value), NULL);
+ break;
+
+ case PROP_INTERLEAVED:
+ g_object_set (G_OBJECT (ap->rawaudioparse), "interleaved",
+ g_value_get_boolean (value), NULL);
+ break;
+
+ case PROP_CHANNEL_POSITIONS:
+ g_object_set (G_OBJECT (ap->rawaudioparse), "channel-positions",
+ g_value_get_boxed (value), NULL);
+ break;
+
case PROP_USE_SINK_CAPS:
- ap->use_sink_caps = g_value_get_boolean (value);
+ g_object_set (G_OBJECT (ap->rawaudioparse), "use-sink-caps",
+ g_value_get_boolean (value), NULL);
break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
-
- gst_audio_parse_update_frame_size (ap);
}
static void
@@ -230,213 +280,85 @@
GstAudioParse *ap = GST_AUDIO_PARSE (object);
switch (prop_id) {
- case PROP_FORMAT:
- g_value_set_enum (value, ap->format);
- break;
- case PROP_RAW_FORMAT:
- g_value_set_enum (value, ap->raw_format);
- break;
- case PROP_RATE:{
- gint fps_n, fps_d;
+ case PROP_FORMAT:{
+ GstRawAudioParseFormat raw_parse_format;
+ GstAudioParseFormat format;
- gst_raw_parse_get_fps (GST_RAW_PARSE (ap), &fps_n, &fps_d);
- g_value_set_int (value, fps_n);
+ g_object_get (G_OBJECT (ap->rawaudioparse), "format", &raw_parse_format,
+ NULL);
+
+ switch (raw_parse_format) {
+ case GST_RAW_AUDIO_PARSE_FORMAT_PCM:
+ format = GST_AUDIO_PARSE_FORMAT_RAW;
+ break;
+
+ case GST_RAW_AUDIO_PARSE_FORMAT_MULAW:
+ format = GST_AUDIO_PARSE_FORMAT_MULAW;
+ break;
+
+ case GST_RAW_AUDIO_PARSE_FORMAT_ALAW:
+ format = GST_AUDIO_PARSE_FORMAT_ALAW;
+ break;
+
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ g_value_set_enum (value, format);
+
break;
}
- case PROP_CHANNELS:
- g_value_set_int (value, ap->channels);
+
+ case PROP_RAW_FORMAT:{
+ GstAudioFormat format;
+ g_object_get (G_OBJECT (ap->rawaudioparse), "pcm-format", &format, NULL);
+ g_value_set_enum (value, format);
break;
- case PROP_INTERLEAVED:
- g_value_set_boolean (value, ap->interleaved);
+ }
+
+ case PROP_RATE:{
+ gint sample_rate;
+ g_object_get (G_OBJECT (ap->rawaudioparse), "sample-rate", &sample_rate,
+ NULL);
+ g_value_set_int (value, sample_rate);
break;
- case PROP_CHANNEL_POSITIONS:
- g_value_set_boxed (value, ap->channel_positions);
+ }
+
+ case PROP_CHANNELS:{
+ gint num_channels;
+ g_object_get (G_OBJECT (ap->rawaudioparse), "num-channels", &num_channels,
+ NULL);
+ g_value_set_int (value, num_channels);
break;
- case PROP_USE_SINK_CAPS:
- g_value_set_boolean (value, ap->use_sink_caps);
+ }
+
+ case PROP_INTERLEAVED:{
+ gboolean interleaved;
+ g_object_get (G_OBJECT (ap->rawaudioparse), "interleaved", &interleaved,
+ NULL);
+ g_value_set_boolean (value, interleaved);
break;
+ }
+
+ case PROP_CHANNEL_POSITIONS:{
+ gpointer channel_positions;
+ g_object_get (G_OBJECT (ap->rawaudioparse), "channel-positions",
+ &channel_positions, NULL);
+ g_value_set_boxed (value, channel_positions);
+ break;
+ }
+
+ case PROP_USE_SINK_CAPS:{
+ gboolean use_sink_caps;
+ g_object_get (G_OBJECT (ap->rawaudioparse), "use-sink-caps",
+ &use_sink_caps, NULL);
+ g_value_set_boolean (value, use_sink_caps);
+ break;
+ }
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
-
-static void
-gst_audio_parse_finalize (GObject * object)
-{
- GstAudioParse *ap = GST_AUDIO_PARSE (object);
-
- if (ap->channel_positions) {
- g_value_array_free (ap->channel_positions);
- ap->channel_positions = NULL;
- }
-
- g_free (ap->channel_pos);
- g_free (ap->channel_order);
-
- G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-void
-gst_audio_parse_update_frame_size (GstAudioParse * ap)
-{
- gint framesize, width;
-
- switch (ap->format) {
- case GST_AUDIO_PARSE_FORMAT_ALAW:
- case GST_AUDIO_PARSE_FORMAT_MULAW:
- width = 8;
- break;
- case GST_AUDIO_PARSE_FORMAT_RAW:
- default:
- {
- GstAudioInfo info;
-
- gst_audio_info_init (&info);
- /* rate, etc do not really matter here */
- gst_audio_info_set_format (&info, ap->raw_format, 44100, ap->channels,
- NULL);
- width = GST_AUDIO_INFO_WIDTH (&info);
- break;
- }
- }
-
- framesize = (width / 8) * ap->channels;
-
- gst_raw_parse_set_framesize (GST_RAW_PARSE (ap), framesize);
-}
-
-static GstAudioChannelPosition *
-gst_audio_parse_get_channel_positions (GValueArray * positions)
-{
- gint i;
- guint channels;
- GstAudioChannelPosition *pos;
-
- channels = positions->n_values;
- pos = g_new (GstAudioChannelPosition, positions->n_values);
-
- for (i = 0; i < channels; i++) {
- GValue *v = g_value_array_get_nth (positions, i);
-
- pos[i] = g_value_get_enum (v);
- }
-
- return pos;
-}
-
-static void
-gst_audio_parse_setup_channel_positions (GstAudioParse * ap)
-{
- GstAudioChannelPosition *pos, *to;
-
- g_free (ap->channel_pos);
- g_free (ap->channel_order);
- ap->channel_pos = NULL;
- ap->channel_order = NULL;
-
- if (!ap->channel_positions) {
- GST_DEBUG_OBJECT (ap, "no channel positions");
- /* implicit mapping for 1- and 2-channel audio is okay */
- /* will come up with one in other cases also */
- return;
- }
-
- pos = gst_audio_parse_get_channel_positions (ap->channel_positions);
- if (ap->channels != ap->channel_positions->n_values ||
- !gst_audio_check_valid_channel_positions (pos, ap->channels, FALSE)) {
- GST_DEBUG_OBJECT (ap, "invalid channel position");
- g_free (pos);
- return;
- }
-
- /* ok, got something we can work with now */
- to = g_new (GstAudioChannelPosition, ap->channels);
- memcpy (to, pos, ap->channels * sizeof (to[0]));
- gst_audio_channel_positions_to_valid_order (to, ap->channels);
-
- ap->channel_pos = pos;
- ap->channel_order = to;
-}
-
-static GstCaps *
-gst_audio_parse_get_caps (GstRawParse * rp)
-{
- GstAudioParse *ap = GST_AUDIO_PARSE (rp);
- GstCaps *caps, *ncaps;
- GstAudioInfo info;
- gint fps_n, fps_d;
- const GValue *val;
-
- if (ap->use_sink_caps) {
- gint rate;
- GstCaps *caps = gst_pad_get_current_caps (rp->sinkpad);
- if (!caps) {
- GST_WARNING_OBJECT (ap,
- "Sink pad has no caps, but we were asked to use its caps");
- return NULL;
- }
- if (!gst_audio_info_from_caps (&info, caps)) {
- GST_WARNING_OBJECT (ap, "Failed to parse caps %" GST_PTR_FORMAT, caps);
- gst_caps_unref (caps);
- return NULL;
- }
-
- ap->format = GST_AUDIO_PARSE_FORMAT_RAW;
- ap->raw_format = GST_AUDIO_INFO_FORMAT (&info);
- ap->channels = GST_AUDIO_INFO_CHANNELS (&info);
- ap->interleaved = info.layout == GST_AUDIO_LAYOUT_INTERLEAVED;
-
- rate = GST_AUDIO_INFO_RATE (&info);
- gst_raw_parse_set_fps (GST_RAW_PARSE (ap), rate, 1);
- gst_audio_parse_update_frame_size (ap);
-
- return caps;
- }
-
- gst_raw_parse_get_fps (rp, &fps_n, &fps_d);
- gst_audio_parse_setup_channel_positions (ap);
-
- /* yes, even when format not raw */
- gst_audio_info_init (&info);
- gst_audio_info_set_format (&info, ap->raw_format, fps_n, ap->channels,
- ap->channel_order);
- info.layout = ap->interleaved ? GST_AUDIO_LAYOUT_INTERLEAVED :
- GST_AUDIO_LAYOUT_NON_INTERLEAVED;
- caps = gst_audio_info_to_caps (&info);
-
- switch (ap->format) {
- case GST_AUDIO_PARSE_FORMAT_RAW:
- break;
- case GST_AUDIO_PARSE_FORMAT_ALAW:
- ncaps = gst_caps_new_simple ("audio/x-alaw",
- "rate", G_TYPE_INT, fps_n,
- "channels", G_TYPE_INT, ap->channels, NULL);
- /* pick mask stuff from faked raw format */
- val = gst_structure_get_value (gst_caps_get_structure (caps, 0),
- "channel-mask");
- if (val)
- gst_caps_set_value (ncaps, "channel-mask", val);
- gst_caps_unref (caps);
- caps = ncaps;
- break;
- case GST_AUDIO_PARSE_FORMAT_MULAW:
- ncaps = gst_caps_new_simple ("audio/x-mulaw",
- "rate", G_TYPE_INT, fps_n,
- "channels", G_TYPE_INT, ap->channels, NULL);
- /* pick mask stuff from faked raw format */
- val = gst_structure_get_value (gst_caps_get_structure (caps, 0),
- "channel-mask");
- if (val)
- gst_caps_set_value (ncaps, "channel-mask", val);
- gst_caps_unref (caps);
- caps = ncaps;
- break;
- default:
- caps = gst_caps_new_empty ();
- GST_ERROR_OBJECT (rp, "unexpected format %d", ap->format);
- break;
- }
-
- return caps;
-}
diff --git a/gst/rawparse/gstaudioparse.h b/gst/rawparse/gstaudioparse.h
index 2a357d9..efa5730 100644
--- a/gst/rawparse/gstaudioparse.h
+++ b/gst/rawparse/gstaudioparse.h
@@ -23,11 +23,6 @@
#define __GST_AUDIO_PARSE_H__
#include <gst/gst.h>
-#include <gst/base/gstbasetransform.h>
-#include <gst/base/gstadapter.h>
-#include <gst/audio/audio.h>
-
-#include "gstrawparse.h"
#define GST_TYPE_AUDIO_PARSE \
(gst_audio_parse_get_type())
@@ -45,23 +40,13 @@
struct _GstAudioParse
{
- GstRawParse parent;
-
- /* properties */
- gboolean use_sink_caps;
- gint format;
- GstAudioFormat raw_format;
- gint channels;
- gboolean interleaved;
- GValueArray *channel_positions;
-
- GstAudioChannelPosition *channel_pos;
- GstAudioChannelPosition *channel_order;
+ GstBin parent;
+ GstElement *rawaudioparse;
};
struct _GstAudioParseClass
{
- GstRawParseClass parent_class;
+ GstBinClass parent_class;
};
diff --git a/gst/rawparse/gstrawaudioparse.c b/gst/rawparse/gstrawaudioparse.c
new file mode 100644
index 0000000..98575dd
--- /dev/null
+++ b/gst/rawparse/gstrawaudioparse.c
@@ -0,0 +1,1088 @@
+/* GStreamer
+ * Copyright (C) <2016> Carlos Rafael Giani <dv at pseudoterminal 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-rawaudioparse
+ *
+ * This element parses incoming data as raw audio samples and timestamps it.
+ * It also handles seek queries in said raw audio data, and ensures that output
+ * buffers contain an integer number of samples, even if the input buffers don't.
+ * For example, with sample format S16LE and 2 channels, an input buffer of 411
+ * bytes contains 102.75 samples. rawaudioparse will then output 102 samples
+ * (= 408 bytes) and keep the remaining 3 bytes. These will then be prepended to
+ * the next input data.
+ *
+ * The element implements the properties and sink caps configuration as specified
+ * in the #GstRawBaseParse documentation. The properties configuration can be
+ * modified by using the sample-rate, num-channels, channel-positions, format,
+ * and pcm-format properties.
+ *
+ * Currently, this parser supports raw data in a-law, mu-law, or linear PCM format.
+ *
+ * To facilitate operation with the unalignedaudioparse element, rawaudioparse
+ * supports the "audio/x-unaligned-raw" media type. This is treated identically to
+ * "audio/x-raw", except that it is used by source elements which do not guarantee
+ * that the buffers they push out are timestamped and contain an integer amount of
+ * samples (see the 411 bytes example above). By using a different media type, it
+ * is guaranteed that unalignedaudioparse is autoplugged, making sure that the
+ * autoplugged chain does not push unparsed content downstream. The source caps'
+ * media type with linear PCM data is always "audio/x-raw", even if the sink caps
+ * use "audio/x-unaligned-raw".
+ *
+ * The channel-positions property can be used to set explicit position information
+ * for each channel. If the array that is passed to this property does not match
+ * the number of channels indicated by num-channels, then said number of channels
+ * is updated to the array length. If channel-positions is NULL, then the default
+ * GStreamer positioning is used. This property is also useful for swapping left
+ * and right in a stereo signal for example.
+ *
+ * <refsect2>
+ * <title>Example pipelines</title>
+ * |[
+ * gst-launch-1.0 souphttpsrc http://my-dlna-server/track.l16 \
+ * rawaudioparse ! audioconvert ! audioresample ! autoaudiosink
+ * ]| Receive L16 data from a DLNA server, parse and timestamp it with
+ * rawaudioparse, and play it. use-sink-caps is set to true since souphttpsrc
+ * will set its source pad's caps to audio/x-unaligned-raw for the L16 stream.
+ * |[
+ * gst-launch-1.0 filesrc location=audio.raw ! rawaudioparse use-sink-caps=false \
+ * format=pcm pcm-format=s16le sample-rate=48000 num-channels=2 \
+ * audioconvert ! audioresample ! autoaudiosink
+ * ]| Read raw data from a local file and parse it as PCM data with 48000 Hz sample
+ * rate, signed 16 bit integer samples, and 2 channels. use-sink-caps is set to
+ * false to ensure the property information is used and the parser does not expect
+ * audio/x-raw or audio/x-unaligned-raw caps.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+/* FIXME: GValueArray is deprecated, but there is currently no viabla alternative
+ * See https://bugzilla.gnome.org/show_bug.cgi?id=667228 */
+#define GLIB_DISABLE_DEPRECATION_WARNINGS
+
+#include <string.h>
+#include "gstrawaudioparse.h"
+#include "unalignedaudio.h"
+
+
+GST_DEBUG_CATEGORY_STATIC (raw_audio_parse_debug);
+#define GST_CAT_DEFAULT raw_audio_parse_debug
+
+
+enum
+{
+ PROP_0,
+ PROP_FORMAT,
+ PROP_PCM_FORMAT,
+ PROP_SAMPLE_RATE,
+ PROP_NUM_CHANNELS,
+ PROP_INTERLEAVED,
+ PROP_CHANNEL_POSITIONS
+};
+
+
+#define DEFAULT_FORMAT GST_RAW_AUDIO_PARSE_FORMAT_PCM
+#define DEFAULT_PCM_FORMAT GST_AUDIO_FORMAT_S16
+#define DEFAULT_SAMPLE_RATE 44100
+#define DEFAULT_NUM_CHANNELS 2
+#define DEFAULT_INTERLEAVED TRUE
+
+
+#define GST_RAW_AUDIO_PARSE_CAPS \
+ GST_AUDIO_CAPS_MAKE(GST_AUDIO_FORMATS_ALL) \
+ ", layout = (string) { interleaved, non-interleaved }; " \
+ "audio/x-alaw, rate = (int) [ 1, MAX ], channels = (int) [ 1, MAX ]; " \
+ "audio/x-mulaw, rate = (int) [ 1, MAX ], channels = (int) [ 1, MAX ]; "
+
+
+static GstStaticPadTemplate static_sink_template =
+ GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_UNALIGNED_RAW_AUDIO_CAPS "; " GST_RAW_AUDIO_PARSE_CAPS)
+ );
+
+
+static GstStaticPadTemplate static_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_RAW_AUDIO_PARSE_CAPS)
+ );
+
+
+#define gst_raw_audio_parse_parent_class parent_class
+G_DEFINE_TYPE (GstRawAudioParse, gst_raw_audio_parse, GST_TYPE_RAW_BASE_PARSE);
+
+
+static void gst_raw_audio_parse_set_property (GObject * object, guint prop_id,
+ GValue const *value, GParamSpec * pspec);
+static void gst_raw_audio_parse_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static gboolean gst_raw_audio_parse_stop (GstBaseParse * parse);
+
+static gboolean gst_raw_audio_parse_set_current_config (GstRawBaseParse *
+ raw_base_parse, GstRawBaseParseConfig config);
+static GstRawBaseParseConfig
+gst_raw_audio_parse_get_current_config (GstRawBaseParse * raw_base_parse);
+static gboolean gst_raw_audio_parse_set_config_from_caps (GstRawBaseParse *
+ raw_base_parse, GstRawBaseParseConfig config, GstCaps * caps);
+static gboolean gst_raw_audio_parse_get_caps_from_config (GstRawBaseParse *
+ raw_base_parse, GstRawBaseParseConfig config, GstCaps ** caps);
+static gsize gst_raw_audio_parse_get_config_frame_size (GstRawBaseParse *
+ raw_base_parse, GstRawBaseParseConfig config);
+static gboolean gst_raw_audio_parse_is_config_ready (GstRawBaseParse *
+ raw_base_parse, GstRawBaseParseConfig config);
+static gboolean gst_raw_audio_parse_process (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config, GstBuffer * in_data, gsize total_num_in_bytes,
+ gsize num_valid_in_bytes, GstBuffer ** processed_data);
+static gboolean gst_raw_audio_parse_is_unit_format_supported (GstRawBaseParse *
+ raw_base_parse, GstFormat format);
+static void gst_raw_audio_parse_get_units_per_second (GstRawBaseParse *
+ raw_base_parse, GstFormat format, GstRawBaseParseConfig config,
+ gsize * units_per_sec_n, gsize * units_per_sec_d);
+
+static gboolean gst_raw_audio_parse_is_using_sink_caps (GstRawAudioParse *
+ raw_audio_parse);
+static GstRawAudioParseConfig
+ * gst_raw_audio_parse_get_config_ptr (GstRawAudioParse * raw_audio_parse,
+ GstRawBaseParseConfig config);
+
+static void gst_raw_audio_parse_init_config (GstRawAudioParseConfig * config);
+static gboolean gst_raw_audio_parse_set_config_channels (GstRawAudioParseConfig
+ * config, guint num_channels, guint64 channel_mask, gboolean set_positions);
+static gboolean
+gst_raw_audio_parse_update_channel_reordering_flag (GstRawAudioParseConfig *
+ config);
+static void gst_raw_audio_parse_update_config_bpf (GstRawAudioParseConfig *
+ config);
+static gboolean gst_raw_audio_parse_caps_to_config (GstRawAudioParse *
+ raw_audio_parse, GstCaps * caps, GstRawAudioParseConfig * config);
+static gboolean gst_raw_audio_parse_config_to_caps (GstRawAudioParse *
+ raw_audio_parse, GstCaps ** caps, GstRawAudioParseConfig * config);
+
+
+
+static void
+gst_raw_audio_parse_class_init (GstRawAudioParseClass * klass)
+{
+ GObjectClass *object_class;
+ GstElementClass *element_class;
+ GstBaseParseClass *baseparse_class;
+ GstRawBaseParseClass *rawbaseparse_class;
+
+ GST_DEBUG_CATEGORY_INIT (raw_audio_parse_debug, "rawaudioparse", 0,
+ "rawaudioparse element");
+
+ object_class = G_OBJECT_CLASS (klass);
+ element_class = GST_ELEMENT_CLASS (klass);
+ baseparse_class = GST_BASE_PARSE_CLASS (klass);
+ rawbaseparse_class = GST_RAW_BASE_PARSE_CLASS (klass);
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&static_sink_template));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&static_src_template));
+
+ object_class->set_property =
+ GST_DEBUG_FUNCPTR (gst_raw_audio_parse_set_property);
+ object_class->get_property =
+ GST_DEBUG_FUNCPTR (gst_raw_audio_parse_get_property);
+
+ baseparse_class->stop = GST_DEBUG_FUNCPTR (gst_raw_audio_parse_stop);
+
+ rawbaseparse_class->set_current_config =
+ GST_DEBUG_FUNCPTR (gst_raw_audio_parse_set_current_config);
+ rawbaseparse_class->get_current_config =
+ GST_DEBUG_FUNCPTR (gst_raw_audio_parse_get_current_config);
+ rawbaseparse_class->set_config_from_caps =
+ GST_DEBUG_FUNCPTR (gst_raw_audio_parse_set_config_from_caps);
+ rawbaseparse_class->get_caps_from_config =
+ GST_DEBUG_FUNCPTR (gst_raw_audio_parse_get_caps_from_config);
+ rawbaseparse_class->get_config_frame_size =
+ GST_DEBUG_FUNCPTR (gst_raw_audio_parse_get_config_frame_size);
+ rawbaseparse_class->is_config_ready =
+ GST_DEBUG_FUNCPTR (gst_raw_audio_parse_is_config_ready);
+ rawbaseparse_class->process = GST_DEBUG_FUNCPTR (gst_raw_audio_parse_process);
+ rawbaseparse_class->is_unit_format_supported =
+ GST_DEBUG_FUNCPTR (gst_raw_audio_parse_is_unit_format_supported);
+ rawbaseparse_class->get_units_per_second =
+ GST_DEBUG_FUNCPTR (gst_raw_audio_parse_get_units_per_second);
+
+ g_object_class_install_property (object_class,
+ PROP_FORMAT,
+ g_param_spec_enum ("format",
+ "Format",
+ "Format of the raw audio stream",
+ gst_raw_audio_parse_format_get_type (),
+ GST_RAW_AUDIO_PARSE_FORMAT_PCM,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
+ );
+ g_object_class_install_property (object_class,
+ PROP_PCM_FORMAT,
+ g_param_spec_enum ("pcm-format",
+ "PCM format",
+ "Format of audio samples in PCM stream (ignored if format property is not set to pcm)",
+ GST_TYPE_AUDIO_FORMAT,
+ GST_RAW_AUDIO_PARSE_FORMAT_PCM,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
+ );
+ g_object_class_install_property (object_class,
+ PROP_SAMPLE_RATE,
+ g_param_spec_int ("sample-rate",
+ "Sample rate",
+ "Rate of audio samples in raw stream",
+ 1, INT_MAX,
+ DEFAULT_SAMPLE_RATE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
+ );
+ g_object_class_install_property (object_class,
+ PROP_NUM_CHANNELS,
+ g_param_spec_int ("num-channels",
+ "Number of channels",
+ "Number of channels in raw stream",
+ 1, INT_MAX,
+ DEFAULT_NUM_CHANNELS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
+ );
+ g_object_class_install_property (object_class,
+ PROP_INTERLEAVED,
+ g_param_spec_boolean ("interleaved",
+ "Interleaved layout",
+ "True if audio has interleaved layout",
+ DEFAULT_INTERLEAVED, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
+ );
+ g_object_class_install_property (object_class,
+ PROP_CHANNEL_POSITIONS,
+ g_param_spec_value_array ("channel-positions",
+ "Channel positions",
+ "Channel positions used on the output",
+ g_param_spec_enum ("channel-position",
+ "Channel position",
+ "Channel position of the n-th input",
+ GST_TYPE_AUDIO_CHANNEL_POSITION,
+ GST_AUDIO_CHANNEL_POSITION_NONE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS),
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
+ );
+
+ gst_element_class_set_static_metadata (element_class,
+ "rawaudioparse",
+ "Codec/Parser/Audio",
+ "Converts unformatted data streams into timestamped raw audio frames",
+ "Carlos Rafael Giani <dv@pseudoterminal.org>");
+}
+
+
+static void
+gst_raw_audio_parse_init (GstRawAudioParse * raw_audio_parse)
+{
+ /* Setup configs and select which one shall be the current one from the start. */
+ gst_raw_audio_parse_init_config (&(raw_audio_parse->properties_config));
+ gst_raw_audio_parse_init_config (&(raw_audio_parse->sink_caps_config));
+ /* As required by GstRawBaseParse, ensure that the current configuration
+ * is initially set to be the properties config */
+ raw_audio_parse->current_config = &(raw_audio_parse->properties_config);
+
+ /* Properties config must be valid from the start, so set its ready value
+ * to TRUE, and make sure its bpf value is valid. */
+ raw_audio_parse->properties_config.ready = TRUE;
+ gst_raw_audio_parse_update_config_bpf (&(raw_audio_parse->properties_config));
+}
+
+
+static void
+gst_raw_audio_parse_set_property (GObject * object, guint prop_id,
+ GValue const *value, GParamSpec * pspec)
+{
+ GstBaseParse *base_parse = GST_BASE_PARSE (object);
+ GstRawBaseParse *raw_base_parse = GST_RAW_BASE_PARSE (object);
+ GstRawAudioParse *raw_audio_parse = GST_RAW_AUDIO_PARSE (object);
+
+ /* All properties are handled similarly:
+ * - if the new value is the same as the current value, nothing is done
+ * - the parser lock is held while the new value is set
+ * - if the properties config is the current config, the source caps are
+ * invalidated to ensure that the code in handle_frame pushes a new CAPS
+ * event out
+ * - properties that affect the bpf value call the function to update
+ * the bpf and also call gst_base_parse_set_min_frame_size() to ensure
+ * that the minimum frame size can hold 1 frame (= one sample for each
+ * channel)
+ */
+
+ switch (prop_id) {
+ case PROP_FORMAT:
+ {
+ GstRawAudioParseFormat new_format = g_value_get_enum (value);
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+
+ if (new_format != raw_audio_parse->properties_config.format) {
+ raw_audio_parse->properties_config.format = new_format;
+ gst_raw_audio_parse_update_config_bpf (&
+ (raw_audio_parse->properties_config));
+
+ if (!gst_raw_audio_parse_is_using_sink_caps (raw_audio_parse)) {
+ gst_raw_base_parse_invalidate_src_caps (raw_base_parse);
+ gst_base_parse_set_min_frame_size (base_parse,
+ raw_audio_parse->properties_config.bpf);
+ }
+ }
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+ }
+
+ case PROP_PCM_FORMAT:
+ {
+ GstAudioFormat new_pcm_format = g_value_get_enum (value);
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+
+ if (new_pcm_format != raw_audio_parse->properties_config.pcm_format) {
+ raw_audio_parse->properties_config.pcm_format = new_pcm_format;
+ gst_raw_audio_parse_update_config_bpf (&
+ (raw_audio_parse->properties_config));
+
+ if (!gst_raw_audio_parse_is_using_sink_caps (raw_audio_parse)) {
+ gst_raw_base_parse_invalidate_src_caps (raw_base_parse);
+ gst_base_parse_set_min_frame_size (base_parse,
+ raw_audio_parse->properties_config.bpf);
+ }
+ }
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+ }
+
+ case PROP_SAMPLE_RATE:
+ {
+ guint new_sample_rate = g_value_get_int (value);
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+
+ if (new_sample_rate != raw_audio_parse->properties_config.sample_rate) {
+ raw_audio_parse->properties_config.sample_rate = new_sample_rate;
+
+ if (!gst_raw_audio_parse_is_using_sink_caps (raw_audio_parse))
+ gst_raw_base_parse_invalidate_src_caps (raw_base_parse);
+ }
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+ }
+
+ case PROP_NUM_CHANNELS:
+ {
+ guint new_num_channels = g_value_get_int (value);
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+
+ if (new_num_channels != raw_audio_parse->properties_config.num_channels) {
+ gst_raw_audio_parse_set_config_channels (&
+ (raw_audio_parse->properties_config), new_num_channels, 0, TRUE);
+
+ raw_audio_parse->properties_config.num_channels = new_num_channels;
+ gst_raw_audio_parse_update_config_bpf (&
+ (raw_audio_parse->properties_config));
+
+ if (!gst_raw_audio_parse_is_using_sink_caps (raw_audio_parse)) {
+ gst_raw_base_parse_invalidate_src_caps (raw_base_parse);
+ gst_base_parse_set_min_frame_size (base_parse,
+ raw_audio_parse->properties_config.bpf);
+ }
+ }
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+ }
+
+ case PROP_INTERLEAVED:
+ {
+ gboolean new_interleaved = g_value_get_boolean (value);
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+
+ if (new_interleaved != raw_audio_parse->properties_config.interleaved) {
+ raw_audio_parse->properties_config.interleaved = new_interleaved;
+
+ if (!gst_raw_audio_parse_is_using_sink_caps (raw_audio_parse))
+ gst_raw_base_parse_invalidate_src_caps (raw_base_parse);
+ }
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+ }
+
+ case PROP_CHANNEL_POSITIONS:
+ {
+ GValueArray *valarray = g_value_get_boxed (value);
+ GstRawAudioParseConfig *config = &(raw_audio_parse->properties_config);
+
+ /* Sanity check - reject empty arrays */
+ if ((valarray != NULL) && (valarray->n_values == 0)) {
+ GST_ELEMENT_ERROR (raw_audio_parse, LIBRARY, SETTINGS,
+ ("channel position property holds an empty array"), (NULL));
+ break;
+ }
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+
+ if ((valarray == NULL) && (config->num_channels > 0)) {
+ /* NULL value given, and number of channels is nonzero.
+ * Use the default GStreamer positioning. Call
+ * set_config_channels with the set_positions parameter
+ * set to TRUE to ensure the position values are filled. */
+ gst_raw_audio_parse_set_config_channels (&
+ (raw_audio_parse->properties_config), config->num_channels, 0,
+ TRUE);
+ } else {
+ /* Non-NULL value given. Make sure the channel_positions
+ * array in the properties config has enough room, and that
+ * the num_channels value equals the array length. Then copy
+ * the values from the valarray to channel_positions, and
+ * produce a copy of that array in case its channel positions
+ * are not in a valid GStreamer order (to be able to apply
+ * channel reordering later).
+ */
+
+ guint i;
+
+ if (valarray->n_values != config->num_channels) {
+ /* Call with set_positions == FALSE to ensure that
+ * the array is properly allocated but not filled
+ * (it is filled below) */
+ gst_raw_audio_parse_set_config_channels (config, valarray->n_values,
+ 0, FALSE);
+ }
+
+ for (i = 0; i < config->num_channels; ++i) {
+ GValue *val = g_value_array_get_nth (valarray, i);
+ config->channel_positions[i] = g_value_get_enum (val);
+ }
+
+ gst_raw_audio_parse_update_channel_reordering_flag (config);
+ }
+
+ gst_raw_audio_parse_update_config_bpf (&
+ (raw_audio_parse->properties_config));
+
+ if (!gst_raw_audio_parse_is_using_sink_caps (raw_audio_parse)) {
+ gst_raw_base_parse_invalidate_src_caps (raw_base_parse);
+ gst_base_parse_set_min_frame_size (base_parse,
+ raw_audio_parse->properties_config.bpf);
+ }
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+ }
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+
+static void
+gst_raw_audio_parse_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstRawAudioParse *raw_audio_parse = GST_RAW_AUDIO_PARSE (object);
+
+ switch (prop_id) {
+ case PROP_FORMAT:
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+ g_value_set_enum (value, raw_audio_parse->properties_config.format);
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+
+ case PROP_PCM_FORMAT:
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+ g_value_set_enum (value, raw_audio_parse->properties_config.pcm_format);
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+
+ case PROP_SAMPLE_RATE:
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+ g_value_set_int (value, raw_audio_parse->properties_config.sample_rate);
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+
+ case PROP_NUM_CHANNELS:
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+ g_value_set_int (value, raw_audio_parse->properties_config.num_channels);
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+
+ case PROP_INTERLEAVED:
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+ g_value_set_boolean (value,
+ raw_audio_parse->properties_config.interleaved);
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+
+ case PROP_CHANNEL_POSITIONS:
+ {
+ GstRawAudioParseConfig *config;
+ GValueArray *valarray;
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+
+ valarray = NULL;
+ config = &(raw_audio_parse->properties_config);
+
+ /* Copy channel positions into the valuearray */
+ if (config->num_channels > 0) {
+ guint i;
+ GValue val = G_VALUE_INIT;
+ g_assert (config->channel_positions);
+
+ g_value_init (&val, GST_TYPE_AUDIO_CHANNEL_POSITION);
+ valarray = g_value_array_new (config->num_channels);
+
+ for (i = 0; i < config->num_channels; ++i) {
+ g_value_set_enum (&val, config->channel_positions[i]);
+ g_value_array_insert (valarray, i, &val);
+ }
+
+ g_value_unset (&val);
+ }
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+
+ /* Pass on ownership to the value array,
+ * since we don't need it anymore */
+ g_value_take_boxed (value, valarray);
+
+ break;
+ }
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+
+static gboolean
+gst_raw_audio_parse_stop (GstBaseParse * parse)
+{
+ GstRawAudioParse *raw_audio_parse = GST_RAW_AUDIO_PARSE (parse);
+
+ /* Sink caps config is not ready until caps come in.
+ * We are stopping processing, the element is being reset,
+ * so the config has to be un-readied.
+ * (Since the properties config is not depending on caps,
+ * its ready status is always TRUE.) */
+ raw_audio_parse->sink_caps_config.ready = FALSE;
+
+ return GST_BASE_PARSE_CLASS (parent_class)->stop (parse);
+}
+
+
+static gboolean
+gst_raw_audio_parse_set_current_config (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config)
+{
+ GstRawAudioParse *raw_audio_parse = GST_RAW_AUDIO_PARSE (raw_base_parse);
+
+ switch (config) {
+ case GST_RAW_BASE_PARSE_CONFIG_PROPERTIES:
+ raw_audio_parse->current_config = &(raw_audio_parse->properties_config);
+ break;
+
+ case GST_RAW_BASE_PARSE_CONFIG_SINKCAPS:
+ raw_audio_parse->current_config = &(raw_audio_parse->sink_caps_config);
+ break;
+
+ default:
+ g_assert_not_reached ();
+ }
+
+ return TRUE;
+}
+
+
+static GstRawBaseParseConfig
+gst_raw_audio_parse_get_current_config (GstRawBaseParse * raw_base_parse)
+{
+ GstRawAudioParse *raw_audio_parse = GST_RAW_AUDIO_PARSE (raw_base_parse);
+ return gst_raw_audio_parse_is_using_sink_caps (raw_audio_parse) ?
+ GST_RAW_BASE_PARSE_CONFIG_SINKCAPS : GST_RAW_BASE_PARSE_CONFIG_PROPERTIES;
+}
+
+
+static gboolean
+gst_raw_audio_parse_set_config_from_caps (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config, GstCaps * caps)
+{
+ GstRawAudioParse *raw_audio_parse = GST_RAW_AUDIO_PARSE (raw_base_parse);
+ return gst_raw_audio_parse_caps_to_config (raw_audio_parse, caps,
+ gst_raw_audio_parse_get_config_ptr (raw_audio_parse, config));
+}
+
+
+static gboolean
+gst_raw_audio_parse_get_caps_from_config (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config, GstCaps ** caps)
+{
+ GstRawAudioParse *raw_audio_parse = GST_RAW_AUDIO_PARSE (raw_base_parse);
+ return gst_raw_audio_parse_config_to_caps (raw_audio_parse, caps,
+ gst_raw_audio_parse_get_config_ptr (raw_audio_parse, config));
+}
+
+
+static gsize
+gst_raw_audio_parse_get_config_frame_size (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config)
+{
+ GstRawAudioParse *raw_audio_parse = GST_RAW_AUDIO_PARSE (raw_base_parse);
+ return gst_raw_audio_parse_get_config_ptr (raw_audio_parse, config)->bpf;
+}
+
+
+static gboolean
+gst_raw_audio_parse_is_config_ready (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config)
+{
+ GstRawAudioParse *raw_audio_parse = GST_RAW_AUDIO_PARSE (raw_base_parse);
+ return gst_raw_audio_parse_get_config_ptr (raw_audio_parse, config)->ready;
+}
+
+
+static gboolean
+gst_raw_audio_parse_process (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config, GstBuffer * in_data, gsize total_num_in_bytes,
+ gsize num_valid_in_bytes, GstBuffer ** processed_data)
+{
+ GstRawAudioParse *raw_audio_parse = GST_RAW_AUDIO_PARSE (raw_base_parse);
+ GstRawAudioParseConfig *config_ptr =
+ gst_raw_audio_parse_get_config_ptr (raw_audio_parse, config);
+
+ if ((config_ptr->format == GST_RAW_AUDIO_PARSE_FORMAT_PCM)
+ && config_ptr->needs_channel_reordering) {
+ /* Need to reorder samples, since they are in an invalid
+ * channel order. */
+
+ GstBuffer *outbuf;
+
+ GST_LOG_OBJECT (raw_audio_parse,
+ "using %" G_GSIZE_FORMAT " bytes out of the %" G_GSIZE_FORMAT
+ " bytes from the input buffer with reordering", num_valid_in_bytes,
+ total_num_in_bytes);
+
+ outbuf =
+ gst_buffer_copy_region (in_data,
+ GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS |
+ GST_BUFFER_COPY_META | GST_BUFFER_COPY_MEMORY, 0, num_valid_in_bytes);
+
+ gst_audio_buffer_reorder_channels (outbuf,
+ config_ptr->pcm_format,
+ config_ptr->num_channels,
+ config_ptr->channel_positions, config_ptr->reordered_channel_positions);
+
+ *processed_data = outbuf;
+ } else {
+ /* Nothing needs to be done with the sample data.
+ * Instruct the baseparse class to just take out_size bytes
+ * from the input buffer */
+
+ GST_LOG_OBJECT (raw_audio_parse,
+ "using %" G_GSIZE_FORMAT " bytes out of the %" G_GSIZE_FORMAT
+ " bytes from the input buffer without reordering", num_valid_in_bytes,
+ total_num_in_bytes);
+
+ *processed_data = NULL;
+ }
+
+ return TRUE;
+}
+
+
+static gboolean
+gst_raw_audio_parse_is_unit_format_supported (G_GNUC_UNUSED GstRawBaseParse *
+ raw_base_parse, GstFormat format)
+{
+ switch (format) {
+ case GST_FORMAT_BYTES:
+ case GST_FORMAT_DEFAULT:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+
+static void
+gst_raw_audio_parse_get_units_per_second (GstRawBaseParse * raw_base_parse,
+ GstFormat format, GstRawBaseParseConfig config, gsize * units_per_sec_n,
+ gsize * units_per_sec_d)
+{
+ GstRawAudioParse *raw_audio_parse = GST_RAW_AUDIO_PARSE (raw_base_parse);
+ GstRawAudioParseConfig *config_ptr =
+ gst_raw_audio_parse_get_config_ptr (raw_audio_parse, config);
+
+ switch (format) {
+ case GST_FORMAT_BYTES:
+ *units_per_sec_n = config_ptr->sample_rate * config_ptr->bpf;
+ *units_per_sec_d = 1;
+ break;
+
+ case GST_FORMAT_DEFAULT:
+ *units_per_sec_n = config_ptr->sample_rate;
+ *units_per_sec_d = 1;
+ break;
+
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+
+static gboolean
+gst_raw_audio_parse_is_using_sink_caps (GstRawAudioParse * raw_audio_parse)
+{
+ return raw_audio_parse->current_config ==
+ &(raw_audio_parse->sink_caps_config);
+}
+
+
+static GstRawAudioParseConfig *
+gst_raw_audio_parse_get_config_ptr (GstRawAudioParse * raw_audio_parse,
+ GstRawBaseParseConfig config)
+{
+ g_assert (raw_audio_parse->current_config != NULL);
+
+ switch (config) {
+ case GST_RAW_BASE_PARSE_CONFIG_PROPERTIES:
+ return &(raw_audio_parse->properties_config);
+
+ case GST_RAW_BASE_PARSE_CONFIG_SINKCAPS:
+ return &(raw_audio_parse->sink_caps_config);
+
+ default:
+ g_assert (raw_audio_parse->current_config != NULL);
+ return raw_audio_parse->current_config;
+ }
+}
+
+
+static void
+gst_raw_audio_parse_init_config (GstRawAudioParseConfig * config)
+{
+ config->ready = FALSE;
+ config->format = DEFAULT_FORMAT;
+ config->pcm_format = DEFAULT_PCM_FORMAT;
+ config->bpf = 0;
+ config->sample_rate = DEFAULT_SAMPLE_RATE;
+ config->num_channels = DEFAULT_NUM_CHANNELS;
+ config->interleaved = DEFAULT_INTERLEAVED;
+ config->needs_channel_reordering = FALSE;
+
+ gst_raw_audio_parse_set_config_channels (config, config->num_channels, 0,
+ TRUE);
+}
+
+
+static gboolean
+gst_raw_audio_parse_set_config_channels (GstRawAudioParseConfig * config,
+ guint num_channels, guint64 channel_mask, gboolean set_positions)
+{
+ g_assert (num_channels > 0);
+
+ config->num_channels = num_channels;
+ /* Setting this to FALSE, since initially, after setting the channels,
+ * the default GStreamer channel ordering is used. */
+ config->needs_channel_reordering = FALSE;
+
+ /* Set the channel positions based on the given channel mask if set_positions
+ * is set to TRUE. A channel mask of 0 signifies that a fallback mask should be
+ * used for the given number of channels. */
+ if (set_positions) {
+ if (channel_mask == 0)
+ channel_mask = gst_audio_channel_get_fallback_mask (config->num_channels);
+
+ return gst_audio_channel_positions_from_mask (config->num_channels,
+ channel_mask, config->channel_positions);
+ } else {
+ return TRUE;
+ }
+}
+
+
+static gboolean
+gst_raw_audio_parse_update_channel_reordering_flag (GstRawAudioParseConfig *
+ config)
+{
+ g_assert (config->num_channels > 0);
+
+ /* If the channel_positions array contains channel positions which are in an
+ * order that conforms to the valid GStreamer order, ensure that channel
+ * reordering is disabled.
+ * Otherwise, if the order of the positions in the channel_positions array
+ * does not conform to the GStreamer order, ensure it is enabled.
+ */
+
+ if (gst_audio_check_valid_channel_positions (config->channel_positions,
+ config->num_channels, TRUE)) {
+
+ config->needs_channel_reordering = FALSE;
+
+ return TRUE;
+ } else {
+ config->needs_channel_reordering = TRUE;
+ memcpy (config->reordered_channel_positions, config->channel_positions,
+ sizeof (GstAudioChannelPosition) * config->num_channels);
+ return
+ gst_audio_channel_positions_to_valid_order
+ (config->reordered_channel_positions, config->num_channels);
+ }
+}
+
+
+static void
+gst_raw_audio_parse_update_config_bpf (GstRawAudioParseConfig * config)
+{
+ switch (config->format) {
+ case GST_RAW_AUDIO_PARSE_FORMAT_PCM:
+ {
+ GstAudioFormatInfo const *fmt_info =
+ gst_audio_format_get_info (config->pcm_format);
+ g_assert (fmt_info != NULL);
+
+ config->bpf =
+ GST_AUDIO_FORMAT_INFO_WIDTH (fmt_info) * config->num_channels / 8;
+
+ break;
+ }
+
+ case GST_RAW_AUDIO_PARSE_FORMAT_ALAW:
+ case GST_RAW_AUDIO_PARSE_FORMAT_MULAW:
+ /* A-law and mu-law both use 1 byte per sample */
+ config->bpf = 1 * config->num_channels;
+ break;
+
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+
+static gboolean
+gst_raw_audio_parse_caps_to_config (GstRawAudioParse * raw_audio_parse,
+ GstCaps * caps, GstRawAudioParseConfig * config)
+{
+ gboolean ret = FALSE;
+ GstStructure *structure;
+
+ /* Caps might get copied, and the copy needs to be unref'd.
+ * Also, the caller retains ownership over the original caps.
+ * So, to make this mechanism also work with cases where the
+ * caps are *not* copied, ref the original caps here first. */
+ gst_caps_ref (caps);
+
+ structure = gst_caps_get_structure (caps, 0);
+
+ /* For unaligned raw data, the output caps stay the same,
+ * except that audio/x-unaligned-raw becomes audio/x-raw,
+ * since the parser aligns the sample data */
+ if (gst_structure_has_name (structure, "audio/x-unaligned-raw")) {
+ /* Copy the caps to be able to modify them */
+ GstCaps *new_caps = gst_caps_copy (caps);
+ gst_caps_unref (caps);
+ caps = new_caps;
+
+ /* Change the media type to audio/x-raw , otherwise
+ * gst_audio_info_from_caps() won't work */
+ structure = gst_caps_get_structure (caps, 0);
+ gst_structure_set_name (structure, "audio/x-raw");
+ }
+
+ if (gst_structure_has_name (structure, "audio/x-raw")) {
+ guint num_channels;
+ GstAudioInfo info;
+ if (!gst_audio_info_from_caps (&info, caps)) {
+ GST_ERROR_OBJECT (raw_audio_parse,
+ "failed to parse caps %" GST_PTR_FORMAT, (gpointer) caps);
+ goto done;
+ }
+
+ num_channels = GST_AUDIO_INFO_CHANNELS (&info);
+
+ config->format = GST_RAW_AUDIO_PARSE_FORMAT_PCM;
+ config->pcm_format = GST_AUDIO_INFO_FORMAT (&info);
+ config->bpf = GST_AUDIO_INFO_BPF (&info);
+ config->sample_rate = GST_AUDIO_INFO_RATE (&info);
+ config->interleaved =
+ (GST_AUDIO_INFO_LAYOUT (&info) == GST_AUDIO_LAYOUT_INTERLEAVED);
+
+ gst_raw_audio_parse_set_config_channels (config, num_channels, 0, FALSE);
+ memcpy (config->channel_positions, &(GST_AUDIO_INFO_POSITION (&info, 0)),
+ sizeof (GstAudioChannelPosition) * num_channels);
+ } else if (gst_structure_has_name (structure, "audio/x-alaw")
+ || gst_structure_has_name (structure, "audio/x-mulaw")) {
+ gint i;
+ guint64 channel_mask;
+ guint num_channels;
+
+ config->format =
+ gst_structure_has_name (structure,
+ "audio/x-alaw") ? GST_RAW_AUDIO_PARSE_FORMAT_ALAW :
+ GST_RAW_AUDIO_PARSE_FORMAT_MULAW;
+
+ if (!gst_structure_get_int (structure, "rate", &i)) {
+ GST_ERROR_OBJECT (raw_audio_parse,
+ "missing rate value in caps %" GST_PTR_FORMAT, (gpointer) caps);
+ goto done;
+ }
+ config->sample_rate = i;
+
+ if (!gst_structure_get_int (structure, "channels", &i)) {
+ GST_ERROR_OBJECT (raw_audio_parse,
+ "missing channels value in caps %" GST_PTR_FORMAT, (gpointer) caps);
+ goto done;
+ }
+ num_channels = i;
+
+ if (!gst_structure_get (structure, "channel-mask", GST_TYPE_BITMASK,
+ &channel_mask, NULL)) {
+ channel_mask = gst_audio_channel_get_fallback_mask (num_channels);
+ GST_DEBUG_OBJECT (raw_audio_parse,
+ "input caps have no channel mask - using fallback mask %#"
+ G_GINT64_MODIFIER "x for %u channels", channel_mask, num_channels);
+ }
+
+ if (!gst_raw_audio_parse_set_config_channels (config, num_channels,
+ channel_mask, TRUE)) {
+ GST_ERROR_OBJECT (raw_audio_parse,
+ "could not use channel mask %#" G_GINT64_MODIFIER
+ "x for channel positions", channel_mask);
+ goto done;
+ }
+
+ /* A-law and mu-law both use 1 byte per sample */
+ config->bpf = 1 * num_channels;
+ } else {
+ GST_ERROR_OBJECT (raw_audio_parse,
+ "caps %" GST_PTR_FORMAT " have an unsupported media type",
+ (gpointer) caps);
+ goto done;
+ }
+
+ ret = TRUE;
+
+done:
+ gst_caps_unref (caps);
+ if (ret)
+ config->ready = TRUE;
+ return ret;
+}
+
+
+static gboolean
+gst_raw_audio_parse_config_to_caps (GstRawAudioParse * raw_audio_parse,
+ GstCaps ** caps, GstRawAudioParseConfig * config)
+{
+ gboolean ret = TRUE;
+ GstAudioChannelPosition *channel_positions;
+
+ g_assert (caps != NULL);
+
+ if (config->bpf == 0) {
+ GST_ERROR_OBJECT (raw_audio_parse,
+ "cannot convert config to caps - config not filled with valid values");
+ *caps = NULL;
+ return FALSE;
+ }
+
+ channel_positions =
+ config->needs_channel_reordering ? &(config->
+ reordered_channel_positions[0]) : &(config->channel_positions[0]);
+
+ switch (config->format) {
+ case GST_RAW_AUDIO_PARSE_FORMAT_PCM:
+ {
+ GstAudioInfo info;
+ gst_audio_info_init (&info);
+ gst_audio_info_set_format (&info,
+ config->pcm_format,
+ config->sample_rate, config->num_channels, channel_positions);
+
+ *caps = gst_audio_info_to_caps (&info);
+
+ break;
+ }
+
+ case GST_RAW_AUDIO_PARSE_FORMAT_ALAW:
+ case GST_RAW_AUDIO_PARSE_FORMAT_MULAW:
+ {
+ guint64 channel_mask;
+
+ if (!gst_audio_channel_positions_to_mask (channel_positions,
+ config->num_channels, TRUE, &channel_mask)) {
+ GST_ERROR_OBJECT (raw_audio_parse, "invalid channel positions");
+ ret = FALSE;
+ break;
+ }
+
+ *caps = gst_caps_new_simple (
+ (config->format ==
+ GST_RAW_AUDIO_PARSE_FORMAT_ALAW) ? "audio/x-alaw" :
+ "audio/x-mulaw", "rate", G_TYPE_INT, config->sample_rate, "channels",
+ G_TYPE_INT, config->num_channels, "channel-mask", GST_TYPE_BITMASK,
+ channel_mask, NULL);
+
+ break;
+ }
+
+ default:
+ g_assert_not_reached ();
+ ret = FALSE;
+ }
+
+ if (!ret)
+ *caps = NULL;
+
+ return ret;
+}
+
+
+
+
+GType
+gst_raw_audio_parse_format_get_type (void)
+{
+ static GType audio_parse_format_gtype = 0;
+ static const GEnumValue types[] = {
+ {GST_RAW_AUDIO_PARSE_FORMAT_PCM, "PCM", "pcm"},
+ {GST_RAW_AUDIO_PARSE_FORMAT_ALAW, "A-Law", "alaw"},
+ {GST_RAW_AUDIO_PARSE_FORMAT_MULAW, "\302\265-Law", "mulaw"},
+ {0, NULL, NULL}
+ };
+
+ if (!audio_parse_format_gtype)
+ audio_parse_format_gtype =
+ g_enum_register_static ("GstRawAudioParseFormat", types);
+
+ return audio_parse_format_gtype;
+}
diff --git a/gst/rawparse/gstrawaudioparse.h b/gst/rawparse/gstrawaudioparse.h
new file mode 100644
index 0000000..f1e0766
--- /dev/null
+++ b/gst/rawparse/gstrawaudioparse.h
@@ -0,0 +1,131 @@
+/* GStreamer
+ * Copyright (C) <2016> Carlos Rafael Giani <dv at pseudoterminal 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.
+ */
+
+#ifndef __GST_RAW_AUDIO_PARSE_H__
+#define __GST_RAW_AUDIO_PARSE_H__
+
+#include <gst/gst.h>
+#include <gst/audio/audio.h>
+#include "gstrawbaseparse.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_RAW_AUDIO_PARSE \
+ (gst_raw_audio_parse_get_type())
+#define GST_RAW_AUDIO_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_RAW_AUDIO_PARSE, GstRawAudioParse))
+#define GST_RAW_AUDIO_PARSE_CAST(obj) \
+ ((GstRawAudioParse *)(obj))
+#define GST_RAW_AUDIO_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_RAW_AUDIO_PARSE, GstRawAudioParseClass))
+#define GST_IS_RAW_AUDIO_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_RAW_AUDIO_PARSE))
+#define GST_IS_RAW_AUDIO_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_RAW_AUDIO_PARSE))
+
+
+typedef enum _GstRawAudioParseFormat GstRawAudioParseFormat;
+
+typedef struct _GstRawAudioParseConfig GstRawAudioParseConfig;
+typedef struct _GstRawAudioParse GstRawAudioParse;
+typedef struct _GstRawAudioParseClass GstRawAudioParseClass;
+
+
+enum _GstRawAudioParseFormat
+{
+ GST_RAW_AUDIO_PARSE_FORMAT_PCM,
+ GST_RAW_AUDIO_PARSE_FORMAT_MULAW,
+ GST_RAW_AUDIO_PARSE_FORMAT_ALAW
+};
+
+
+/* Contains information about the sample rate, format, and channel count to use. */
+struct _GstRawAudioParseConfig
+{
+ /* If TRUE, then this configuration is ready to use */
+ gboolean ready;
+ /* Format of the configuration. Can be PCM, a-law, mu-law. */
+ GstRawAudioParseFormat format;
+ /* If format is set to PCM, this specifies the exact PCM format in use.
+ * Meaningless if format is set to anything other than PCM. */
+ GstAudioFormat pcm_format;
+ /* Bytes per frame. Calculated as: bpf = bytes_per_sample * num_channels
+ * Must be nonzero. This is the size of one frame, the value returned
+ * by the GstRawBaseParseClass get_config_frame_size() vfunc. */
+ guint bpf;
+ /* Sample rate in Hz - must be nonzero */
+ guint sample_rate;
+ /* Number of channels - must be nonzero */
+ guint num_channels;
+ /* TRUE if the data is interleaved, FALSE otherwise */
+ gboolean interleaved;
+
+ /* Array of channel positions, one position per channel; its first
+ * num_channels values are valid. They are computed out of the number
+ * of channels if no positions are explicitely given. */
+ GstAudioChannelPosition channel_positions[64];
+
+ /* If the channel_positions are in a valid GStreamer channel order, then
+ * this is not used, and needs_channel_reordering is FALSE. Otherwise,
+ * this contains the same positions as in channel_positions, but in the
+ * order GStreamer expects. needs_channel_reordering will be TRUE in that
+ * case. This is used for reordering samples in outgoing buffers if
+ * necessary. */
+ GstAudioChannelPosition reordered_channel_positions[64];
+
+ /* TRUE if channel reordering is necessary, FALSE otherwise. See above
+ * for details. */
+ gboolean needs_channel_reordering;
+};
+
+
+struct _GstRawAudioParse
+{
+ GstRawBaseParse parent;
+
+ /*< private > */
+
+ /* Configuration controlled by the object properties. Its ready value
+ * is set to TRUE from the start, so it can be used right away.
+ */
+ GstRawAudioParseConfig properties_config;
+ /* Configuration controlled by the sink caps. Its ready value is
+ * initially set to FALSE until valid sink caps come in. It is set to
+ * FALSE again when the stream-start event is observed.
+ */
+ GstRawAudioParseConfig sink_caps_config;
+ /* Currently active configuration. Points either to properties_config
+ * or to sink_caps_config. This is never NULL. */
+ GstRawAudioParseConfig *current_config;
+};
+
+
+struct _GstRawAudioParseClass
+{
+ GstRawBaseParseClass parent_class;
+};
+
+
+GType gst_raw_audio_parse_get_type (void);
+GType gst_raw_audio_parse_format_get_type (void);
+
+
+G_END_DECLS
+
+#endif
diff --git a/gst/rawparse/gstrawbaseparse.c b/gst/rawparse/gstrawbaseparse.c
new file mode 100644
index 0000000..e90f400
--- /dev/null
+++ b/gst/rawparse/gstrawbaseparse.c
@@ -0,0 +1,748 @@
+/* GStreamer
+ * Copyright (C) <2016> Carlos Rafael Giani <dv at pseudoterminal 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:gstrawbaseparse
+ * @short_description: Base class for raw media data parsers
+ *
+ * This base class is for parsers which read raw media data and output
+ * timestamped buffers with an integer number of frames inside.
+ *
+ * The format of the raw media data is specified in one of two ways: either,
+ * the information from the sink pad's caps is taken, or the information from
+ * the properties is used (this is chosen by the use-sink-caps property).
+ * These two ways are internally referred to as "configurations". The configuration
+ * that receives its information from the sink pad's caps is called the
+ * "sink caps configuration", while the one that depends on the information from
+ * the properties is the "properties configuration". Configurations have a
+ * "readiness". A configuration is "ready" when it contains valid information.
+ * For example, with an audio parser, a configuration is not ready unless it
+ * contains a valid sample rate, sample format, and channel count.
+ *
+ * The properties configuration must always be ready, even right from the start.
+ * Subclasses must ensure this. The underlying reason is that properties have valid
+ * values right from the start, and with the properties configuration, there is
+ * nothing that readies it before actual data is sent (unlike with the sink caps
+ * configuration, where a sink caps event will ready it before data is pushed
+ * downstream).
+ *
+ * It is possible to switch between the configurations during a stream by
+ * setting the use-sink-caps property. Subclasses typically allow for updating the
+ * properties configuration during a stream by setting the various properties
+ * (like sample-rate for a raw audio parser).
+ * In these cases, the parser will produce a new CAPS event and push it downstream
+ * to announce the caps for the new configuration. This also happens if the sink
+ * caps change.
+ *
+ * A common mistake when trying to parse raw data with no input caps (for example,
+ * a file with raw PCM samples when using rawaudioparse) is to forget to set the
+ * use-sink-caps property to FALSE. In this case, the parser will report an error
+ * when it tries to access the current configuration (because then the sink caps
+ * configuration will be the current one and it will not contain valid values
+ * since no sink caps were seen at this point).
+ *
+ * Subclasses must ensure that the properties configuration is the default one.
+ *
+ * The sink caps configuration is mostly useful with push-based sources, because these
+ * will produce caps events and send them downstream. With pull-based sources, it is
+ * possible that this doesn't happen. Since the sink caps configuration requires a caps
+ * event to arrive at the sinkpad, this will cause the parser to fail then.
+ *
+ * The base class identifies the configurations by means of the GstRawAudioParseConfig
+ * enum. It instructs the subclass to switch between configurations this way, and
+ * also requests information about the current configuration, a configuration's
+ * frame size, its readiness, etc. Subclasses are not required to use any particular
+ * structure for the configuration implementations.
+ *
+ * Use the GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK and GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK
+ * macros to protect configuration modifications.
+ *
+ * <listitem>
+ * <itemizedlist>
+ * <title>Summary of the subclass requirements</title>
+ * <listitem><para>
+ * Sink caps and properties configurations must both be
+ * implemented and supported. It must also be ensured that there is a
+ * "current" configuration.
+ * </para></listitem>
+ * Modifications to the configurations must be protected with the
+ * GstRawBaseParse lock. This is typically necessary when the
+ * properties configuration is modified by setting new property values.
+ * (Note that the lock is held during *all* vfunc calls.)
+ * <listitem><para>
+ * If the properties configuration is updated (typically by
+ * setting new property values), gst_raw_base_parse_invalidate_src_caps()
+ * must be called if the properties config is the current one. This is
+ * necessary to ensure that GstBaseParse pushes a new caps event downstream
+ * which contains caps from the updated configuration.
+ * </para></listitem>
+ * <listitem><para>
+ * In case there are bytes in each frame that aren't part of the actual
+ * payload, the get_overhead_size() vfunc must be defined, and the
+ * @get_config_frame_size() vfunc must return a frame size that includes
+ * the number of non-payload bytes (= the overhead). Otherwise, the
+ * timestamps will incorrectly include the overhead bytes.
+ * </para></listitem>
+ * </listitem>
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <string.h>
+#include "gstrawbaseparse.h"
+
+
+GST_DEBUG_CATEGORY_STATIC (raw_base_parse_debug);
+#define GST_CAT_DEFAULT raw_base_parse_debug
+
+
+enum
+{
+ PROP_0,
+ PROP_USE_SINK_CAPS
+};
+
+
+#define DEFAULT_USE_SINK_CAPS FALSE
+#define INITIAL_PARSER_CONFIG \
+ ((DEFAULT_USE_SINK_CAPS) ? GST_RAW_BASE_PARSE_CONFIG_SINKCAPS : \
+ GST_RAW_BASE_PARSE_CONFIG_PROPERTIES)
+
+
+#define gst_raw_base_parse_parent_class parent_class
+G_DEFINE_ABSTRACT_TYPE (GstRawBaseParse, gst_raw_base_parse,
+ GST_TYPE_BASE_PARSE);
+
+
+static void gst_raw_base_parse_finalize (GObject * object);
+static void gst_raw_base_parse_set_property (GObject * object, guint prop_id,
+ GValue const *value, GParamSpec * pspec);
+static void gst_raw_base_parse_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static gboolean gst_raw_base_parse_start (GstBaseParse * parse);
+static gboolean gst_raw_base_parse_stop (GstBaseParse * parse);
+static gboolean gst_raw_base_parse_set_sink_caps (GstBaseParse * parse,
+ GstCaps * caps);
+static GstFlowReturn gst_raw_base_parse_handle_frame (GstBaseParse * parse,
+ GstBaseParseFrame * frame, gint * skipsize);
+static gboolean gst_raw_base_parse_convert (GstBaseParse * parse,
+ GstFormat src_format, gint64 src_value, GstFormat dest_format,
+ gint64 * dest_value);
+
+static gboolean gst_raw_base_parse_is_using_sink_caps (GstRawBaseParse *
+ raw_base_parse);
+static gboolean gst_raw_base_parse_is_gstformat_supported (GstRawBaseParse *
+ raw_base_parse, GstFormat format);
+
+
+
+static void
+gst_raw_base_parse_class_init (GstRawBaseParseClass * klass)
+{
+ GObjectClass *object_class;
+ GstBaseParseClass *baseparse_class;
+
+ GST_DEBUG_CATEGORY_INIT (raw_base_parse_debug, "rawbaseparse", 0,
+ "raw base parse class");
+
+ object_class = G_OBJECT_CLASS (klass);
+ baseparse_class = GST_BASE_PARSE_CLASS (klass);
+
+ object_class->finalize = GST_DEBUG_FUNCPTR (gst_raw_base_parse_finalize);
+ object_class->set_property =
+ GST_DEBUG_FUNCPTR (gst_raw_base_parse_set_property);
+ object_class->get_property =
+ GST_DEBUG_FUNCPTR (gst_raw_base_parse_get_property);
+
+ baseparse_class->start = GST_DEBUG_FUNCPTR (gst_raw_base_parse_start);
+ baseparse_class->stop = GST_DEBUG_FUNCPTR (gst_raw_base_parse_stop);
+ baseparse_class->set_sink_caps =
+ GST_DEBUG_FUNCPTR (gst_raw_base_parse_set_sink_caps);
+ baseparse_class->handle_frame =
+ GST_DEBUG_FUNCPTR (gst_raw_base_parse_handle_frame);
+ baseparse_class->convert = GST_DEBUG_FUNCPTR (gst_raw_base_parse_convert);
+
+ /**
+ * GstRawBaseParse::use-sink-caps:
+ *
+ * Use sink caps configuration. If set to false, the parser
+ * will use the properties configuration instead. It is possible
+ * to switch between these during playback.
+ */
+ g_object_class_install_property (object_class,
+ PROP_USE_SINK_CAPS,
+ g_param_spec_boolean ("use-sink-caps",
+ "Use sink caps",
+ "Use the sink caps for defining the output format",
+ DEFAULT_USE_SINK_CAPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
+ );
+}
+
+
+static void
+gst_raw_base_parse_init (GstRawBaseParse * raw_base_parse)
+{
+ raw_base_parse->src_caps_set = FALSE;
+ g_mutex_init (&(raw_base_parse->config_mutex));
+}
+
+
+static void
+gst_raw_base_parse_finalize (GObject * object)
+{
+ GstRawBaseParse *raw_base_parse = GST_RAW_BASE_PARSE (object);
+
+ g_mutex_clear (&(raw_base_parse->config_mutex));
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+
+static void
+gst_raw_base_parse_set_property (GObject * object, guint prop_id,
+ GValue const *value, GParamSpec * pspec)
+{
+ GstBaseParse *base_parse = GST_BASE_PARSE (object);
+ GstRawBaseParse *raw_base_parse = GST_RAW_BASE_PARSE (object);
+ GstRawBaseParseClass *klass = GST_RAW_BASE_PARSE_GET_CLASS (object);
+
+ g_assert (klass->is_config_ready);
+ g_assert (klass->set_current_config);
+
+ switch (prop_id) {
+ case PROP_USE_SINK_CAPS:
+ {
+ gboolean new_state, cur_state;
+ GstRawBaseParseConfig new_config;
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+
+ /* Check to ensure nothing is done if the value stays the same */
+ new_state = g_value_get_boolean (value);
+ cur_state = gst_raw_base_parse_is_using_sink_caps (raw_base_parse);
+ if (new_state == cur_state) {
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+ }
+
+ GST_DEBUG_OBJECT (raw_base_parse, "switching to %s config",
+ new_state ? "sink caps" : "properties");
+ new_config =
+ new_state ? GST_RAW_BASE_PARSE_CONFIG_SINKCAPS :
+ GST_RAW_BASE_PARSE_CONFIG_PROPERTIES;
+
+ if (!klass->set_current_config (raw_base_parse, new_config)) {
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ GST_ELEMENT_ERROR (raw_base_parse, STREAM, FAILED,
+ ("could not set new current config"), ("use-sink-caps property: %d",
+ new_state));
+ break;
+ }
+
+ /* Update the minimum frame size if the config is ready. This ensures that
+ * the next buffer that is passed to handle_frame contains complete frames.
+ * If the current config is the properties config, then it will always be
+ * ready, and its frame size will be valid. Ensure that the baseparse minimum
+ * frame size is set properly then.
+ * If the current config is the sink caps config, then it will initially not
+ * be ready until the sink caps are set, so the minimum frame size cannot be
+ * set right here. However, since the caps always come in *before* the actual
+ * data, the config will be readied in the set_sink_caps function, and be ready
+ * by the time handle_frame is called. There, the minimum frame size is set as
+ * well. */
+ if (klass->is_config_ready (raw_base_parse,
+ GST_RAW_BASE_PARSE_CONFIG_CURRENT)) {
+ gsize frame_size = klass->get_config_frame_size (raw_base_parse,
+ GST_RAW_BASE_PARSE_CONFIG_CURRENT);
+ gst_base_parse_set_min_frame_size (base_parse, frame_size);
+ }
+
+ /* Since the current config was switched, the source caps change. Ensure the
+ * new caps are pushed downstream by setting src_caps_set to FALSE: This way,
+ * the next handle_frame call will take care of that. */
+ raw_base_parse->src_caps_set = FALSE;
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+
+ break;
+ }
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+
+static void
+gst_raw_base_parse_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstRawBaseParse *raw_base_parse = GST_RAW_BASE_PARSE (object);
+
+ switch (prop_id) {
+ case PROP_USE_SINK_CAPS:
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+ g_value_set_boolean (value,
+ gst_raw_base_parse_is_using_sink_caps (raw_base_parse));
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+
+static gboolean
+gst_raw_base_parse_start (GstBaseParse * parse)
+{
+ GstBaseParse *base_parse = GST_BASE_PARSE (parse);
+ GstRawBaseParse *raw_base_parse = GST_RAW_BASE_PARSE (parse);
+ GstRawBaseParseClass *klass = GST_RAW_BASE_PARSE_GET_CLASS (parse);
+
+ g_assert (klass->set_current_config);
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (raw_base_parse);
+
+ /* If the config is ready from the start, set the min frame size
+ * (this will happen with the properties config) */
+ if (klass->is_config_ready (raw_base_parse,
+ GST_RAW_BASE_PARSE_CONFIG_CURRENT)) {
+ gsize frame_size = klass->get_config_frame_size (raw_base_parse,
+ GST_RAW_BASE_PARSE_CONFIG_CURRENT);
+ gst_base_parse_set_min_frame_size (base_parse, frame_size);
+ }
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (raw_base_parse);
+
+ return TRUE;
+}
+
+
+static gboolean
+gst_raw_base_parse_stop (GstBaseParse * parse)
+{
+ GstRawBaseParse *raw_base_parse = GST_RAW_BASE_PARSE (parse);
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (raw_base_parse);
+ raw_base_parse->src_caps_set = FALSE;
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (raw_base_parse);
+
+ return TRUE;
+}
+
+
+static gboolean
+gst_raw_base_parse_set_sink_caps (GstBaseParse * parse, GstCaps * caps)
+{
+ gboolean ret = FALSE;
+ GstRawBaseParse *raw_base_parse = GST_RAW_BASE_PARSE (parse);
+ GstRawBaseParseClass *klass = GST_RAW_BASE_PARSE_GET_CLASS (parse);
+
+ g_assert (klass->set_config_from_caps);
+ g_assert (klass->get_caps_from_config);
+ g_assert (klass->get_config_frame_size);
+
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (raw_base_parse);
+
+ GST_DEBUG_OBJECT (parse, "getting config from new sink caps");
+
+ /* Convert the new sink caps to sink caps config. This also
+ * readies the config. */
+ ret =
+ klass->set_config_from_caps (raw_base_parse,
+ GST_RAW_BASE_PARSE_CONFIG_SINKCAPS, caps);
+ if (!ret) {
+ GST_ERROR_OBJECT (raw_base_parse, "could not get config from sink caps");
+ goto done;
+ }
+
+ /* If the sink caps config is currently active, push caps downstream,
+ * set the minimum frame size (to guarantee that input buffers hold
+ * complete frames), and update the src_caps_set flag. If the sink
+ * caps config isn't the currently active config, just exit, since in
+ * that case, the caps will always be pushed downstream in handle_frame. */
+ if (gst_raw_base_parse_is_using_sink_caps (raw_base_parse)) {
+ GstCaps *new_src_caps;
+ gsize frame_size;
+
+ GST_DEBUG_OBJECT (parse,
+ "sink caps config is the current one; trying to push new caps downstream");
+
+ /* Convert back to caps. The caps may have changed, for example
+ * audio/x-unaligned-raw may have been replaced with audio/x-raw.
+ * (Also, this keeps the behavior in sync with that of the block
+ * in handle_frame that pushes caps downstream if not done already.) */
+ if (!klass->get_caps_from_config (raw_base_parse,
+ GST_RAW_BASE_PARSE_CONFIG_CURRENT, &new_src_caps)) {
+ GST_ERROR_OBJECT (raw_base_parse,
+ "could not get src caps from current config");
+ goto done;
+ }
+
+ GST_DEBUG_OBJECT (raw_base_parse,
+ "got new sink caps; updating src caps to %" GST_PTR_FORMAT,
+ (gpointer) new_src_caps);
+
+ frame_size =
+ klass->get_config_frame_size (raw_base_parse,
+ GST_RAW_BASE_PARSE_CONFIG_CURRENT);
+ gst_base_parse_set_min_frame_size (parse, frame_size);
+
+ raw_base_parse->src_caps_set = TRUE;
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (raw_base_parse);
+
+ /* Push caps outside of the lock */
+ gst_pad_push_event (GST_BASE_PARSE_SRC_PAD (raw_base_parse),
+ gst_event_new_caps (new_src_caps)
+ );
+
+ gst_caps_unref (new_src_caps);
+ } else {
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (raw_base_parse);
+ }
+
+ ret = TRUE;
+
+done:
+ return ret;
+}
+
+
+static GstFlowReturn
+gst_raw_base_parse_handle_frame (GstBaseParse * parse,
+ GstBaseParseFrame * frame, gint * skipsize)
+{
+ gsize in_size, out_size;
+ guint frame_size;
+ guint num_out_frames;
+ gsize units_n, units_d;
+ guint64 buffer_duration;
+ GstFlowReturn flow_ret = GST_FLOW_OK;
+ GstEvent *new_caps_event = NULL;
+ GstRawBaseParse *raw_base_parse = GST_RAW_BASE_PARSE (parse);
+ GstRawBaseParseClass *klass = GST_RAW_BASE_PARSE_GET_CLASS (parse);
+
+ g_assert (klass->is_config_ready);
+ g_assert (klass->get_caps_from_config);
+ g_assert (klass->get_config_frame_size);
+ g_assert (klass->get_units_per_second);
+
+
+ /* We never skip any bytes this way. Instead, subclass takes care
+ * of skipping any overhead (necessary, since the way it needs to
+ * be skipped is completely subclass specific). */
+ *skipsize = 0;
+
+
+ /* The operations below access the current config. Protect
+ * against race conditions by using the object lock. */
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (raw_base_parse);
+
+
+ /* If the source pad caps haven't been set yet, or need to be
+ * set again, do so now, BEFORE any buffers are pushed out */
+ if (G_UNLIKELY (!raw_base_parse->src_caps_set)) {
+ GstCaps *new_src_caps;
+
+ if (G_UNLIKELY (!klass->is_config_ready (raw_base_parse,
+ GST_RAW_BASE_PARSE_CONFIG_CURRENT))) {
+ /* The current configuration is not ready. No caps can be
+ * generated out of it.
+ * The most likely reason for this is that the sink caps config
+ * is the current one and no valid sink caps have been pushed
+ * by upstream. Report the problem and exit. */
+
+ if (gst_raw_base_parse_is_using_sink_caps (raw_base_parse)) {
+ goto config_not_ready;
+ } else {
+ /* This should not be reached if the property config is active */
+ g_assert_not_reached ();
+ }
+ }
+
+ GST_DEBUG_OBJECT (parse,
+ "setting src caps since this has not been done yet");
+
+ /* Convert the current config to a caps structure to
+ * inform downstream about the new format */
+ if (!klass->get_caps_from_config (raw_base_parse,
+ GST_RAW_BASE_PARSE_CONFIG_CURRENT, &new_src_caps)) {
+ GST_ERROR_OBJECT (raw_base_parse,
+ "could not get src caps from current config");
+ flow_ret = GST_FLOW_NOT_NEGOTIATED;
+ goto error_locked;
+ }
+
+ new_caps_event = gst_event_new_caps (new_src_caps);
+ gst_caps_unref (new_src_caps);
+
+ raw_base_parse->src_caps_set = TRUE;
+ }
+
+ frame_size =
+ klass->get_config_frame_size (raw_base_parse,
+ GST_RAW_BASE_PARSE_CONFIG_CURRENT);
+
+
+ in_size = gst_buffer_get_size (frame->buffer);
+
+ /* gst_base_parse_set_min_frame_size() is called when the current
+ * configuration changes and the change affects the frame size. This
+ * means that a buffer must contain at least as many bytes as indicated
+ * by the frame size. If there are fewer inside an error occurred;
+ * either something in the parser went wrong, or the min frame size
+ * wasn't updated properly. */
+ g_assert (in_size >= frame_size);
+
+ /* Determine how many complete frames would fit in the input buffer.
+ * Then check if this amount exceeds the maximum number of frames
+ * as indicated by the subclass. */
+ num_out_frames = (in_size / frame_size);
+ if (klass->get_max_frames_per_buffer) {
+ guint max_num_out_frames = klass->get_max_frames_per_buffer (raw_base_parse,
+ GST_RAW_BASE_PARSE_CONFIG_CURRENT);
+ num_out_frames = MIN (num_out_frames, max_num_out_frames);
+ }
+
+ /* Ensure that the size of the buffers that get pushed downstream
+ * is always an integer multiple of the frame size to prevent cases
+ * where downstream gets buffers with incomplete frames. */
+ out_size = num_out_frames * frame_size;
+
+ /* Set the overhead size to ensure that timestamping excludes these
+ * extra overhead bytes. */
+ frame->overhead =
+ klass->get_overhead_size ? klass->get_overhead_size (raw_base_parse,
+ GST_RAW_BASE_PARSE_CONFIG_CURRENT) : 0;
+
+ g_assert (out_size >= (guint) (frame->overhead));
+ out_size -= frame->overhead;
+
+ GST_LOG_OBJECT (raw_base_parse,
+ "%" G_GSIZE_FORMAT " bytes input %" G_GSIZE_FORMAT
+ " bytes output (%u frame(s)) %d bytes overhead", in_size, out_size,
+ num_out_frames, frame->overhead);
+
+ /* Calculate buffer duration */
+ klass->get_units_per_second (raw_base_parse, GST_FORMAT_BYTES,
+ GST_RAW_BASE_PARSE_CONFIG_CURRENT, &units_n, &units_d);
+ if (units_n == 0 || units_d == 0)
+ buffer_duration = GST_CLOCK_TIME_NONE;
+ else
+ buffer_duration =
+ gst_util_uint64_scale (out_size, GST_SECOND * units_d, units_n);
+
+ if (klass->process) {
+ GstBuffer *processed_data = NULL;
+
+ if (!klass->process (raw_base_parse, GST_RAW_BASE_PARSE_CONFIG_CURRENT,
+ frame->buffer, in_size, out_size, &processed_data))
+ goto process_error;
+
+ frame->out_buffer = processed_data;
+ } else {
+ frame->out_buffer = NULL;
+ }
+
+ /* Set the duration of the output buffer, or if none exists, of
+ * the input buffer. Do this after the process() call, since in
+ * case out_buffer is set, the subclass has created a new buffer.
+ * Instead of requiring subclasses to set the duration (which
+ * anyway must always be buffer_duration), let's do it here. */
+ if (frame->out_buffer != NULL)
+ GST_BUFFER_DURATION (frame->out_buffer) = buffer_duration;
+ else
+ GST_BUFFER_DURATION (frame->buffer) = buffer_duration;
+
+ /* Access to the current config is not needed in subsequent
+ * operations, so the lock can be released */
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (raw_base_parse);
+
+
+ /* If any new caps have to be pushed downstrean, do so
+ * *before* the frame is finished */
+ if (G_UNLIKELY (new_caps_event != NULL)) {
+ gst_pad_push_event (GST_BASE_PARSE_SRC_PAD (raw_base_parse),
+ new_caps_event);
+ new_caps_event = NULL;
+ }
+
+ gst_base_parse_finish_frame (parse, frame, out_size + frame->overhead);
+
+
+ return flow_ret;
+
+
+config_not_ready:
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (raw_base_parse);
+ GST_ELEMENT_ERROR (parse, STREAM, FORMAT,
+ ("sink caps config is the current config, and it is not ready -"
+ "upstream may not have pushed a caps event yet"), (NULL));
+ flow_ret = GST_FLOW_ERROR;
+ goto error_end;
+
+process_error:
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (raw_base_parse);
+ GST_ELEMENT_ERROR (parse, STREAM, DECODE, ("could not process data"), (NULL));
+ flow_ret = GST_FLOW_ERROR;
+ goto error_end;
+
+error_locked:
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (raw_base_parse);
+ goto error_end;
+
+error_end:
+ frame->flags |= GST_BASE_PARSE_FRAME_FLAG_DROP;
+ if (new_caps_event != NULL)
+ gst_event_unref (new_caps_event);
+ return flow_ret;
+}
+
+
+static gboolean
+gst_raw_base_parse_convert (GstBaseParse * parse, GstFormat src_format,
+ gint64 src_value, GstFormat dest_format, gint64 * dest_value)
+{
+ GstRawBaseParse *raw_base_parse = GST_RAW_BASE_PARSE (parse);
+ GstRawBaseParseClass *klass = GST_RAW_BASE_PARSE_GET_CLASS (parse);
+ gboolean ret = TRUE;
+ gsize units_n, units_d;
+
+ g_assert (klass->is_config_ready);
+ g_assert (klass->get_units_per_second);
+
+
+ /* The operations below access the current config. Protect
+ * against race conditions by using the object lock. */
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (raw_base_parse);
+
+
+ if (!klass->is_config_ready (raw_base_parse,
+ GST_RAW_BASE_PARSE_CONFIG_CURRENT)) {
+ if (gst_raw_base_parse_is_using_sink_caps (raw_base_parse)) {
+ goto config_not_ready;
+ } else {
+ /* This should not be reached if the property config is active */
+ g_assert_not_reached ();
+ }
+ }
+
+ if (G_UNLIKELY (src_format == dest_format)) {
+ *dest_value = src_value;
+ } else if ((src_format == GST_FORMAT_TIME || dest_format == GST_FORMAT_TIME)
+ && gst_raw_base_parse_is_gstformat_supported (raw_base_parse, src_format)
+ && gst_raw_base_parse_is_gstformat_supported (raw_base_parse, src_format)) {
+ /* Perform conversions here if either the src or dest format
+ * are GST_FORMAT_TIME and the other format is supported by
+ * the subclass. This is because we perform TIME<->non-TIME
+ * conversions here. Typically, subclasses only support
+ * BYTES and DEFAULT formats. */
+
+ if (src_format == GST_FORMAT_TIME) {
+ /* The source format is time, so perform a TIME -> non-TIME conversion */
+ klass->get_units_per_second (raw_base_parse, dest_format,
+ GST_RAW_BASE_PARSE_CONFIG_CURRENT, &units_n, &units_d);
+ *dest_value = (units_n == 0
+ || units_d == 0) ? src_value : gst_util_uint64_scale (src_value,
+ units_n, GST_SECOND * units_d);
+ } else {
+ /* The dest format is time, so perform a non-TIME -> TIME conversion */
+ klass->get_units_per_second (raw_base_parse, src_format,
+ GST_RAW_BASE_PARSE_CONFIG_CURRENT, &units_n, &units_d);
+ *dest_value = (units_n == 0
+ || units_d == 0) ? src_value : gst_util_uint64_scale (src_value,
+ GST_SECOND * units_d, units_n);
+ }
+ } else {
+ /* Fallback for other conversions */
+ ret =
+ gst_base_parse_convert_default (parse, src_format, src_value,
+ dest_format, dest_value);
+ }
+
+ GST_DEBUG_OBJECT (parse,
+ "converted %s -> %s %" G_GINT64_FORMAT " -> %" GST_TIME_FORMAT,
+ gst_format_get_name (src_format), gst_format_get_name (dest_format),
+ src_value, GST_TIME_ARGS (*dest_value));
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (raw_base_parse);
+ return ret;
+
+
+config_not_ready:
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (raw_base_parse);
+ GST_ELEMENT_ERROR (parse, STREAM, FORMAT,
+ ("sink caps config is the current config, and it is not ready - "
+ "upstream may not have pushed a caps event yet"), (NULL));
+ return FALSE;
+}
+
+
+static gboolean
+gst_raw_base_parse_is_using_sink_caps (GstRawBaseParse * raw_base_parse)
+{
+ /* must be called with lock */
+ GstRawBaseParseClass *klass = GST_RAW_BASE_PARSE_GET_CLASS (raw_base_parse);
+ g_assert (klass->get_current_config);
+ return klass->get_current_config (raw_base_parse) ==
+ GST_RAW_BASE_PARSE_CONFIG_SINKCAPS;
+}
+
+
+static gboolean
+gst_raw_base_parse_is_gstformat_supported (GstRawBaseParse * raw_base_parse,
+ GstFormat format)
+{
+ /* must be called with lock */
+ GstRawBaseParseClass *klass = GST_RAW_BASE_PARSE_GET_CLASS (raw_base_parse);
+ g_assert (klass->is_unit_format_supported);
+ return klass->is_unit_format_supported (raw_base_parse, format);
+}
+
+
+
+
+
+/**
+ * gst_raw_base_parse_invalidate_src_caps:
+ * @raw_base_parse: a #GstRawBaseParse instance
+ *
+ * Flags the current source caps as invalid. Before the next downstream
+ * buffer push, @get_caps_from_config is called, and the created caps are
+ * pushed downstream in a new caps event, This is used if for example the
+ * properties configuration is modified in the subclass.
+ *
+ * Note that this must be called with the parser lock held. Use the
+ * GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK() and GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK()
+ * macros for this purpose.
+ */
+void
+gst_raw_base_parse_invalidate_src_caps (GstRawBaseParse * raw_base_parse)
+{
+ /* must be called with lock */
+ g_assert (raw_base_parse != NULL);
+ raw_base_parse->src_caps_set = FALSE;
+}
diff --git a/gst/rawparse/gstrawbaseparse.h b/gst/rawparse/gstrawbaseparse.h
new file mode 100644
index 0000000..519b409
--- /dev/null
+++ b/gst/rawparse/gstrawbaseparse.h
@@ -0,0 +1,207 @@
+/* GStreamer
+ * Copyright (C) <2016> Carlos Rafael Giani <dv at pseudoterminal 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.
+ */
+
+#ifndef __GST_RAW_BASE_PARSE_H__
+#define __GST_RAW_BASE_PARSE_H__
+
+#include <gst/gst.h>
+#include <gst/base/base.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_RAW_BASE_PARSE \
+ (gst_raw_base_parse_get_type())
+#define GST_RAW_BASE_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_RAW_BASE_PARSE, GstRawBaseParse))
+#define GST_RAW_BASE_PARSE_CAST(obj) \
+ ((GstRawBaseParse *)(obj))
+#define GST_RAW_BASE_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_RAW_BASE_PARSE, GstRawBaseParseClass))
+#define GST_RAW_BASE_PARSE_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_RAW_BASE_PARSE, GstRawBaseParseClass))
+#define GST_IS_RAW_BASE_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_RAW_BASE_PARSE))
+#define GST_IS_RAW_BASE_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_RAW_BASE_PARSE))
+
+#define GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK(obj) g_mutex_lock(&(((GstRawBaseParse *)(obj))->config_mutex))
+#define GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK(obj) g_mutex_unlock(&(((GstRawBaseParse *)(obj))->config_mutex))
+
+
+typedef enum _GstRawBaseParseConfig GstRawBaseParseConfig;
+typedef struct _GstRawBaseParse GstRawBaseParse;
+typedef struct _GstRawBaseParseClass GstRawBaseParseClass;
+
+
+/**
+ * GstRawBaseParseConfig:
+ * @GST_RAW_BASE_PARSE_CONFIG_CURRENT: configuration that is currently active
+ * @GST_RAW_BASE_PARSE_CONFIG_SINKCAPS: configuration that is defined by the input sink caps
+ * @GST_RAW_BASE_PARSE_CONFIG_PROPERTIES: configuration that is defined by class properties
+ *
+ * Identifier for the type of parser configuration.
+ */
+enum _GstRawBaseParseConfig
+{
+ GST_RAW_BASE_PARSE_CONFIG_CURRENT = 1,
+ GST_RAW_BASE_PARSE_CONFIG_SINKCAPS,
+ GST_RAW_BASE_PARSE_CONFIG_PROPERTIES
+};
+
+
+/**
+ * GstRawBaseParse:
+ *
+ * The opaque #GstRawBaseParse data structure.
+ */
+struct _GstRawBaseParse
+{
+ GstBaseParse parent;
+
+ /*< private > */
+
+ /* TRUE if the source pad caps have been set already. This is used
+ * for checking if the source pad caps have to be set. */
+ gboolean src_caps_set;
+
+ /* Mutex which protects access to and modifications on the configs. */
+ GMutex config_mutex;
+};
+
+
+/**
+ * GstRawBaseParseClass:
+ * @parent_class: The parent class structure
+ * @set_current_config: Sets the new current configuration. Subclasses must internally
+ * switch to this new configuration. Return FALSE if this failed,
+ * TRUE otherwise.
+ * @get_current_config: Gets the current configuration. All return values except
+ * except GST_RAW_BASE_PARSE_CONFIG_CURRENT are valid.
+ * @set_config_from_caps: Parses the caps and copies its information to the configuration.
+ * Returns FALSE if this failed, TRUE otheriwse. Specified caps
+ * are not unref'd.
+ * @get_caps_from_config: Creates a new caps structure out of the information from the
+ * specified configuration. Ownership over the returned caps are
+ * transferred to the caller. If something fails during the caps
+ * creation, the vfunc must make sure to destroy any partially
+ * created caps; the *caps value is always set to NULL in case of
+ * failure. Returns FALSE in case of failure,
+ * TRUE in case of success.
+ * @get_config_frame_size: Gets the size of one frame, in bytes, from the specified
+ * configuration. This must be the size of the complete frame,
+ * including any overhead (metadata, headers, padding bytes etc.).
+ * @get_max_frames_per_buffer: Optional.
+ * Returns up to how many complete frames one output buffer may
+ * contain. The value must be nonzero. This is useful for example
+ * with video parsers which need to ensure that one output buffer
+ * contains only one video frame, even if the input buffer contains
+ * several complete frames. If this vfunc is not set, then there
+ * is no maximum number of frames per buffer - the parser reads
+ * as many complete frames as possible from the input buffer.
+ * @is_config_ready: Returns TRUE if the specified configuration is ready, FALSE
+ * otherwise.
+ * @process: Optional.
+ * This is useful to do any last minute processing before the
+ * data is pushed downstream. One example is channel reordering
+ * in audio parsers.
+ * in_data is the complete input buffer, total_num_in_bytes is
+ * the total amount of bytes this input buffer contains (including
+ * excess bytes that form an incomplete rame). num_valid_in_bytes
+ * is the subset of these bytes that are to be pushed downstream.
+ * If for example the frame size is 4, and total_num_in_bytes is
+ * 411, then num_valid_in_bytes will be 408, since the last 3
+ * bytes form an incomplete frame.
+ * The value of num_valid_in_bytes excludes the overhead bytes
+ * indicated by @get_overhead_size.
+ * If the subclass creates a new buffer here, *processed_data
+ * must be set to the new buffer's pointer. If the subclass does
+ * not create any new buffer, and just expects the first
+ * num_valid_in_bytes of the input buffer to be pushed downstream,
+ * then *processed_data must be set to NULL.
+ * If this vfunc is not set, then the parser behaves as if this
+ * vfunc set *processed_data data to NULL.
+ * @is_unit_format_supported: Returns TRUE if the given format is supported by the
+ * @get_units_per_second function, FALSE otherwise.
+ * @get_units_per_second: Returns how many units per second exist for a given format.
+ * For example, with an audio parser and format DEFAULT, the units
+ * per second are typically the number of samples per second
+ * (= the sample rate). For video parsers, this would be the frame
+ * rate. If BYTES or TIME are used as format, then the result must
+ * not include any extra overhead (metadata, headers, padding etc.)
+ * @get_overhead_size: Optional.
+ * Returns the number of bytes that make up the portion of a frame
+ * that isn't payload. Examples are padding bytes, headers, and
+ * other kinds of metadata. If this vfunc isn't defined, then an
+ * overhead size of 0 bytes is assumed.
+ *
+ * Subclasses are required to override all vfuncs except for @process, which is optional.
+ * The raw base parser lock is held during all vfunc calls.
+ */
+struct _GstRawBaseParseClass
+{
+ GstBaseParseClass parent_class;
+
+ gboolean (*set_current_config) (GstRawBaseParse *raw_base_parse,
+ GstRawBaseParseConfig config);
+ GstRawBaseParseConfig (*get_current_config) (GstRawBaseParse *raw_base_parse);
+
+ gboolean (*set_config_from_caps) (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config,
+ GstCaps * caps);
+ gboolean (*get_caps_from_config) (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config,
+ GstCaps ** caps);
+
+ gsize (*get_config_frame_size) (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config);
+ guint (*get_max_frames_per_buffer) (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config);
+
+ gboolean (*is_config_ready) (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config);
+
+ gboolean (*process) (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config,
+ GstBuffer * in_data,
+ gsize total_num_in_bytes,
+ gsize num_valid_in_bytes,
+ GstBuffer ** processed_data);
+
+ gboolean (*is_unit_format_supported) (GstRawBaseParse * raw_base_parse,
+ GstFormat format);
+ void (*get_units_per_second) (GstRawBaseParse * raw_base_parse,
+ GstFormat format,
+ GstRawBaseParseConfig config,
+ gsize * units_per_sec_n,
+ gsize * units_per_sec_d);
+
+ gint (*get_overhead_size) (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config);
+};
+
+
+void gst_raw_base_parse_invalidate_src_caps (GstRawBaseParse * raw_base_parse);
+
+
+GType gst_raw_base_parse_get_type (void);
+
+
+G_END_DECLS
+
+#endif
diff --git a/gst/rawparse/gstrawparse.c b/gst/rawparse/gstrawparse.c
deleted file mode 100644
index a6468d9..0000000
--- a/gst/rawparse/gstrawparse.c
+++ /dev/null
@@ -1,1105 +0,0 @@
-/* GStreamer
- * Copyright (C) 2006 David A. Schleef <ds@schleef.org>
- * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
- *
- * gstrawparse.c:
- *
- * 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: - Add locking where appropiate
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <string.h>
-
-#include <gst/gst.h>
-#include <gst/base/gstbasetransform.h>
-#include <gst/base/gstadapter.h>
-
-#include "gstrawparse.h"
-
-static void gst_raw_parse_dispose (GObject * object);
-
-static gboolean gst_raw_parse_sink_activate (GstPad * sinkpad,
- GstObject * parent);
-static gboolean gst_raw_parse_sink_activatemode (GstPad * sinkpad,
- GstObject * parent, GstPadMode mode, gboolean active);
-static void gst_raw_parse_loop (GstElement * element);
-static GstStateChangeReturn gst_raw_parse_change_state (GstElement * element,
- GstStateChange transition);
-static GstFlowReturn gst_raw_parse_chain (GstPad * pad, GstObject * parent,
- GstBuffer * buffer);
-static gboolean gst_raw_parse_sink_event (GstPad * pad, GstObject * parent,
- GstEvent * event);
-static gboolean gst_raw_parse_src_event (GstPad * pad, GstObject * parent,
- GstEvent * event);
-static gboolean gst_raw_parse_src_query (GstPad * pad, GstObject * parent,
- GstQuery * query);
-static gboolean gst_raw_parse_convert (GstRawParse * rp, GstFormat src_format,
- gint64 src_value, GstFormat dest_format, gint64 * dest_value);
-static gboolean gst_raw_parse_handle_seek_pull (GstRawParse * rp,
- GstEvent * event);
-
-static void gst_raw_parse_reset (GstRawParse * rp);
-
-static GstStaticPadTemplate gst_raw_parse_sink_pad_template =
-GST_STATIC_PAD_TEMPLATE ("sink",
- GST_PAD_SINK,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS_ANY);
-
-GST_DEBUG_CATEGORY_STATIC (gst_raw_parse_debug);
-#define GST_CAT_DEFAULT gst_raw_parse_debug
-
-static void gst_raw_parse_class_init (GstRawParseClass * klass);
-static void gst_raw_parse_init (GstRawParse * clip, GstRawParseClass * g_class);
-
-static GstElementClass *parent_class;
-
-/* we can't use G_DEFINE_ABSTRACT_TYPE because we need the klass in the _init
- * method to get to the padtemplates */
-GType
-gst_raw_parse_get_type (void)
-{
- static volatile gsize raw_parse_type = 0;
-
- if (g_once_init_enter (&raw_parse_type)) {
- GType _type;
-
- _type = g_type_register_static_simple (GST_TYPE_ELEMENT,
- "GstRawParse", sizeof (GstRawParseClass),
- (GClassInitFunc) gst_raw_parse_class_init, sizeof (GstRawParse),
- (GInstanceInitFunc) gst_raw_parse_init, G_TYPE_FLAG_ABSTRACT);
-
- g_once_init_leave (&raw_parse_type, _type);
- }
- return raw_parse_type;
-}
-
-static void
-gst_raw_parse_class_init (GstRawParseClass * klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
-
- parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->dispose = gst_raw_parse_dispose;
-
- gstelement_class->change_state =
- GST_DEBUG_FUNCPTR (gst_raw_parse_change_state);
-
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_raw_parse_sink_pad_template));
-
- GST_DEBUG_CATEGORY_INIT (gst_raw_parse_debug, "rawparse", 0,
- "rawparse element");
-}
-
-static void
-gst_raw_parse_init (GstRawParse * rp, GstRawParseClass * g_class)
-{
- GstPadTemplate *src_pad_template;
- GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
-
- rp->sinkpad =
- gst_pad_new_from_static_template (&gst_raw_parse_sink_pad_template,
- "sink");
- gst_pad_set_chain_function (rp->sinkpad,
- GST_DEBUG_FUNCPTR (gst_raw_parse_chain));
- gst_pad_set_event_function (rp->sinkpad,
- GST_DEBUG_FUNCPTR (gst_raw_parse_sink_event));
- gst_pad_set_activate_function (rp->sinkpad,
- GST_DEBUG_FUNCPTR (gst_raw_parse_sink_activate));
- gst_pad_set_activatemode_function (rp->sinkpad,
- GST_DEBUG_FUNCPTR (gst_raw_parse_sink_activatemode));
- gst_element_add_pad (GST_ELEMENT (rp), rp->sinkpad);
-
- src_pad_template = gst_element_class_get_pad_template (element_class, "src");
-
- if (src_pad_template) {
- rp->srcpad = gst_pad_new_from_template (src_pad_template, "src");
- } else {
- g_warning ("Subclass didn't specify a src pad template");
- g_assert_not_reached ();
- }
-
- gst_pad_set_event_function (rp->srcpad,
- GST_DEBUG_FUNCPTR (gst_raw_parse_src_event));
- gst_pad_set_query_function (rp->srcpad,
- GST_DEBUG_FUNCPTR (gst_raw_parse_src_query));
- gst_element_add_pad (GST_ELEMENT (rp), rp->srcpad);
-
- rp->adapter = gst_adapter_new ();
-
- rp->fps_n = 1;
- rp->fps_d = 0;
- rp->framesize = 1;
-
- gst_raw_parse_reset (rp);
-}
-
-static void
-gst_raw_parse_dispose (GObject * object)
-{
- GstRawParse *rp = GST_RAW_PARSE (object);
-
- if (rp->adapter) {
- g_object_unref (rp->adapter);
- rp->adapter = NULL;
- }
-
- G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-void
-gst_raw_parse_class_set_src_pad_template (GstRawParseClass * klass,
- const GstCaps * allowed_caps)
-{
- GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
-
- g_return_if_fail (GST_IS_RAW_PARSE_CLASS (klass));
- g_return_if_fail (allowed_caps != NULL);
- g_return_if_fail (GST_IS_CAPS (allowed_caps));
-
- gst_element_class_add_pad_template (element_class,
- gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
- gst_caps_copy (allowed_caps)));
-}
-
-void
-gst_raw_parse_class_set_multiple_frames_per_buffer (GstRawParseClass * klass,
- gboolean multiple_frames)
-{
- g_return_if_fail (GST_IS_RAW_PARSE_CLASS (klass));
-
- klass->multiple_frames_per_buffer = multiple_frames;
-}
-
-static void
-gst_raw_parse_reset (GstRawParse * rp)
-{
- rp->n_frames = 0;
- rp->discont = TRUE;
- rp->negotiated = FALSE;
-
- gst_segment_init (&rp->segment, GST_FORMAT_TIME);
- gst_adapter_clear (rp->adapter);
-}
-
-static gboolean
-gst_raw_parse_set_src_caps (GstRawParse * rp)
-{
- GstRawParseClass *rp_class = GST_RAW_PARSE_GET_CLASS (rp);
- GstCaps *caps;
-
- if (rp->negotiated)
- return TRUE;
-
- if (rp_class->get_caps) {
- caps = rp_class->get_caps (rp);
- } else {
- GST_WARNING
- ("Subclass doesn't implement get_caps() method, using ANY caps");
- caps = gst_caps_new_any ();
- }
-
- rp->negotiated = gst_pad_set_caps (rp->srcpad, caps);
-
- /* if subclass inplement decide_allocation, send an allocation
- * query, pass result to subclass and let it handle allocation if needed. */
- if (rp_class->decide_allocation) {
- GstQuery *query;
-
- query = gst_query_new_allocation (caps, TRUE);
- if (!gst_pad_peer_query (rp->srcpad, query)) {
- /* not a problem, just debug a little */
- GST_DEBUG_OBJECT (rp, "peer ALLOCATION query failed");
- }
-
- rp_class->decide_allocation (rp, query);
- gst_query_unref (query);
- }
-
- gst_caps_unref (caps);
-
- return rp->negotiated;
-}
-
-static GstFlowReturn
-gst_raw_parse_push_buffer (GstRawParse * rp, GstBuffer * buffer)
-{
- GstFlowReturn ret;
- gint nframes;
- GstRawParseClass *rpclass;
- gsize size;
-
- rpclass = GST_RAW_PARSE_GET_CLASS (rp);
-
- size = gst_buffer_get_size (buffer);
- nframes = size / rp->framesize;
-
- if (rp->segment.rate < 0) {
- rp->n_frames -= nframes;
- rp->discont = TRUE;
- }
-
- GST_BUFFER_OFFSET (buffer) = rp->n_frames;
- GST_BUFFER_OFFSET_END (buffer) = rp->n_frames + nframes;
-
- if (rp->fps_n) {
- GST_BUFFER_TIMESTAMP (buffer) =
- gst_util_uint64_scale (rp->n_frames, GST_SECOND * rp->fps_d, rp->fps_n);
- GST_BUFFER_DURATION (buffer) =
- gst_util_uint64_scale ((rp->n_frames + nframes) * GST_SECOND, rp->fps_d,
- rp->fps_n) - GST_BUFFER_TIMESTAMP (buffer);
- } else {
- GST_BUFFER_TIMESTAMP (buffer) = rp->segment.start;
- GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE;
- }
-
- if (rpclass->pre_push_buffer) {
- rpclass->pre_push_buffer (rp, buffer);
- }
-
- if (rp->discont) {
- GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT);
- rp->discont = FALSE;
- }
-
- if (rp->segment.rate >= 0) {
- rp->offset += size;
- rp->n_frames += nframes;
- }
-
- rp->segment.position = GST_BUFFER_TIMESTAMP (buffer);
-
- GST_LOG_OBJECT (rp, "Pushing buffer with time %" GST_TIME_FORMAT,
- GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)));
-
- ret = gst_pad_push (rp->srcpad, buffer);
-
- return ret;
-}
-
-static GstFlowReturn
-gst_raw_parse_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
-{
- GstRawParse *rp = GST_RAW_PARSE (parent);
- GstFlowReturn ret = GST_FLOW_OK;
- GstRawParseClass *rp_class = GST_RAW_PARSE_GET_CLASS (rp);
- guint buffersize, available;
-
- if (G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT))) {
- GST_DEBUG_OBJECT (rp, "received DISCONT buffer");
- gst_adapter_clear (rp->adapter);
- rp->discont = TRUE;
- }
-
- if (!gst_raw_parse_set_src_caps (rp))
- goto no_caps;
-
- if (rp->start_segment) {
- GST_DEBUG_OBJECT (rp, "sending start segment");
- gst_pad_push_event (rp->srcpad, rp->start_segment);
- rp->start_segment = NULL;
- }
-
- gst_adapter_push (rp->adapter, buffer);
-
- available = gst_adapter_available (rp->adapter);
- if (rp_class->multiple_frames_per_buffer) {
- buffersize = available;
- buffersize -= buffersize % rp->framesize;
- } else {
- buffersize = rp->framesize;
- }
-
- while (buffersize > 0 && gst_adapter_available (rp->adapter) >= buffersize) {
- buffer = gst_adapter_take_buffer (rp->adapter, buffersize);
-
- ret = gst_raw_parse_push_buffer (rp, buffer);
- if (ret != GST_FLOW_OK)
- break;
- }
-done:
-
- return ret;
-
- /* ERRORS */
-no_caps:
- {
- GST_ERROR_OBJECT (rp, "could not set caps");
- ret = GST_FLOW_NOT_NEGOTIATED;
- goto done;
- }
-}
-
-static void
-gst_raw_parse_loop (GstElement * element)
-{
- GstRawParse *rp = GST_RAW_PARSE (element);
- GstRawParseClass *rp_class = GST_RAW_PARSE_GET_CLASS (rp);
- GstFlowReturn ret;
- GstBuffer *buffer;
- gint size;
-
- if (G_UNLIKELY (rp->push_stream_start)) {
- gchar *stream_id;
- GstEvent *event;
-
- stream_id =
- gst_pad_create_stream_id (rp->srcpad, GST_ELEMENT_CAST (rp), NULL);
-
- event = gst_event_new_stream_start (stream_id);
- gst_event_set_group_id (event, gst_util_group_id_next ());
-
- GST_DEBUG_OBJECT (rp, "Pushing STREAM_START");
- gst_pad_push_event (rp->srcpad, event);
- rp->push_stream_start = FALSE;
- g_free (stream_id);
- }
-
- if (!gst_raw_parse_set_src_caps (rp))
- goto no_caps;
-
- if (rp->start_segment) {
- GST_DEBUG_OBJECT (rp, "sending start segment");
- gst_pad_push_event (rp->srcpad, rp->start_segment);
- rp->start_segment = NULL;
- }
-
- if (rp_class->multiple_frames_per_buffer && rp->framesize < 4096)
- size = 4096 - (4096 % rp->framesize);
- else
- size = rp->framesize;
-
- if (rp->segment.rate >= 0) {
- if (rp->offset + size > rp->upstream_length) {
- GstFormat fmt = GST_FORMAT_BYTES;
-
- if (!gst_pad_peer_query_duration (rp->sinkpad, fmt, &rp->upstream_length)) {
- GST_WARNING_OBJECT (rp,
- "Could not get upstream duration, trying to pull frame by frame");
- size = rp->framesize;
- } else if (rp->upstream_length < rp->offset + rp->framesize) {
- ret = GST_FLOW_EOS;
- goto pause;
- } else if (rp->offset + size > rp->upstream_length) {
- size = rp->upstream_length - rp->offset;
- size -= size % rp->framesize;
- }
- }
- } else {
- if (rp->offset == 0) {
- ret = GST_FLOW_EOS;
- goto pause;
- } else if (rp->offset < size) {
- size -= rp->offset;
- }
- rp->offset -= size;
- }
-
- buffer = NULL;
- ret = gst_pad_pull_range (rp->sinkpad, rp->offset, size, &buffer);
-
- if (ret != GST_FLOW_OK) {
- GST_DEBUG_OBJECT (rp, "pull_range (%" G_GINT64_FORMAT ", %u) "
- "failed, flow: %s", rp->offset, size, gst_flow_get_name (ret));
- buffer = NULL;
- goto pause;
- }
-
- if (gst_buffer_get_size (buffer) < size) {
- GST_DEBUG_OBJECT (rp, "Short read at offset %" G_GINT64_FORMAT
- ", got only %" G_GSIZE_FORMAT " of %u bytes", rp->offset,
- gst_buffer_get_size (buffer), size);
-
- if (size > rp->framesize) {
- gst_buffer_set_size (buffer, gst_buffer_get_size (buffer) -
- gst_buffer_get_size (buffer) % rp->framesize);
- } else {
- gst_buffer_unref (buffer);
- buffer = NULL;
- ret = GST_FLOW_EOS;
- goto pause;
- }
- }
-
- ret = gst_raw_parse_push_buffer (rp, buffer);
- if (ret != GST_FLOW_OK)
- goto pause;
-
- return;
-
- /* ERRORS */
-no_caps:
- {
- GST_ERROR_OBJECT (rp, "could not negotiate caps");
- ret = GST_FLOW_NOT_NEGOTIATED;
- goto pause;
- }
-pause:
- {
- const gchar *reason = gst_flow_get_name (ret);
-
- GST_LOG_OBJECT (rp, "pausing task, reason %s", reason);
- gst_pad_pause_task (rp->sinkpad);
-
- if (ret == GST_FLOW_EOS) {
- if (rp->segment.flags & GST_SEEK_FLAG_SEGMENT) {
- GstClockTime stop;
-
- GST_LOG_OBJECT (rp, "Sending segment done");
-
- if ((stop = rp->segment.stop) == -1)
- stop = rp->segment.duration;
-
- gst_element_post_message (GST_ELEMENT_CAST (rp),
- gst_message_new_segment_done (GST_OBJECT_CAST (rp),
- rp->segment.format, stop));
- gst_pad_push_event (rp->srcpad,
- gst_event_new_segment_done (rp->segment.format, stop));
- } else {
- GST_LOG_OBJECT (rp, "Sending EOS, at end of stream");
- gst_pad_push_event (rp->srcpad, gst_event_new_eos ());
- }
- } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_EOS) {
- GST_ELEMENT_ERROR (rp, STREAM, FAILED,
- ("Internal data stream error."),
- ("stream stopped, reason %s", reason));
- gst_pad_push_event (rp->srcpad, gst_event_new_eos ());
- }
- return;
- }
-}
-
-static gboolean
-gst_raw_parse_sink_activate (GstPad * sinkpad, GstObject * parent)
-{
- GstQuery *query;
- gboolean pull_mode = FALSE;
-
- query = gst_query_new_scheduling ();
-
- if (gst_pad_peer_query (sinkpad, query))
- pull_mode = gst_query_has_scheduling_mode_with_flags (query,
- GST_PAD_MODE_PULL, GST_SCHEDULING_FLAG_SEEKABLE);
-
- gst_query_unref (query);
-
- if (pull_mode) {
- GST_DEBUG ("going to pull mode");
- return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PULL, TRUE);
- } else {
- GST_DEBUG ("going to push (streaming) mode");
- return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PUSH, TRUE);
- }
-}
-
-static gboolean
-gst_raw_parse_sink_activatemode (GstPad * sinkpad, GstObject * parent,
- GstPadMode mode, gboolean active)
-{
- GstRawParse *rp = GST_RAW_PARSE (parent);
- gboolean result;
-
- switch (mode) {
- case GST_PAD_MODE_PULL:
- if (active) {
- GstFormat format;
- gint64 duration;
-
- /* get the duration in bytes */
- format = GST_FORMAT_BYTES;
- result = gst_pad_peer_query_duration (sinkpad, format, &duration);
- if (result) {
- GST_DEBUG_OBJECT (rp, "got duration %" GST_TIME_FORMAT,
- GST_TIME_ARGS (duration));
- rp->upstream_length = duration;
- /* convert to time */
- gst_raw_parse_convert (rp, format, duration, GST_FORMAT_TIME,
- &duration);
- } else {
- rp->upstream_length = -1;
- duration = -1;
- }
- rp->segment.duration = duration;
-
- rp->push_stream_start = TRUE;
-
- result = gst_raw_parse_handle_seek_pull (rp, NULL);
- rp->mode = mode;
- } else {
- result = gst_pad_stop_task (sinkpad);
- }
- return result;
- case GST_PAD_MODE_PUSH:
- rp->mode = mode;
- return TRUE;
- default:
- return FALSE;
- }
-}
-
-static GstStateChangeReturn
-gst_raw_parse_change_state (GstElement * element, GstStateChange transition)
-{
- GstRawParse *rp = GST_RAW_PARSE (element);
- GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
-
- switch (transition) {
- case GST_STATE_CHANGE_READY_TO_PAUSED:
- gst_segment_init (&rp->segment, GST_FORMAT_TIME);
- rp->segment.position = 0;
- default:
- break;
- }
-
- if (GST_ELEMENT_CLASS (parent_class)->change_state)
- ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
-
- switch (transition) {
- case GST_STATE_CHANGE_PAUSED_TO_READY:
- gst_raw_parse_reset (rp);
- break;
- default:
- break;
- }
-
- return ret;
-}
-
-static gboolean
-gst_raw_parse_convert (GstRawParse * rp,
- GstFormat src_format, gint64 src_value,
- GstFormat dest_format, gint64 * dest_value)
-{
- gboolean ret = FALSE;
-
- GST_DEBUG ("converting value %" G_GINT64_FORMAT " from %s (%d) to %s (%d)",
- src_value, gst_format_get_name (src_format), src_format,
- gst_format_get_name (dest_format), dest_format);
-
- if (src_format == dest_format) {
- *dest_value = src_value;
- ret = TRUE;
- goto done;
- }
-
- if (src_value == -1) {
- *dest_value = -1;
- ret = TRUE;
- goto done;
- }
-
- /* bytes to frames */
- if (src_format == GST_FORMAT_BYTES && dest_format == GST_FORMAT_DEFAULT) {
- if (rp->framesize != 0) {
- *dest_value = gst_util_uint64_scale_int (src_value, 1, rp->framesize);
- } else {
- GST_ERROR ("framesize is 0");
- *dest_value = 0;
- }
- ret = TRUE;
- goto done;
- }
-
- /* frames to bytes */
- if (src_format == GST_FORMAT_DEFAULT && dest_format == GST_FORMAT_BYTES) {
- *dest_value = gst_util_uint64_scale_int (src_value, rp->framesize, 1);
- ret = TRUE;
- goto done;
- }
-
- /* time to frames */
- if (src_format == GST_FORMAT_TIME && dest_format == GST_FORMAT_DEFAULT) {
- if (rp->fps_d != 0) {
- *dest_value = gst_util_uint64_scale (src_value,
- rp->fps_n, GST_SECOND * rp->fps_d);
- } else {
- GST_ERROR ("framerate denominator is 0");
- *dest_value = 0;
- }
- ret = TRUE;
- goto done;
- }
-
- /* frames to time */
- if (src_format == GST_FORMAT_DEFAULT && dest_format == GST_FORMAT_TIME) {
- if (rp->fps_n != 0) {
- *dest_value = gst_util_uint64_scale (src_value,
- GST_SECOND * rp->fps_d, rp->fps_n);
- } else {
- GST_ERROR ("framerate numerator is 0");
- *dest_value = 0;
- }
- ret = TRUE;
- goto done;
- }
-
- /* time to bytes */
- if (src_format == GST_FORMAT_TIME && dest_format == GST_FORMAT_BYTES) {
- if (rp->fps_d != 0) {
- *dest_value = gst_util_uint64_scale (src_value,
- rp->fps_n * rp->framesize, GST_SECOND * rp->fps_d);
- } else {
- GST_ERROR ("framerate denominator is 0");
- *dest_value = 0;
- }
- ret = TRUE;
- goto done;
- }
-
- /* bytes to time */
- if (src_format == GST_FORMAT_BYTES && dest_format == GST_FORMAT_TIME) {
- if (rp->fps_n != 0 && rp->framesize != 0) {
- *dest_value = gst_util_uint64_scale (src_value,
- GST_SECOND * rp->fps_d, rp->fps_n * rp->framesize);
- } else {
- GST_ERROR ("framerate denominator and/or framesize is 0");
- *dest_value = 0;
- }
- ret = TRUE;
- }
-
-done:
-
- GST_DEBUG ("ret=%d result %" G_GINT64_FORMAT, ret, *dest_value);
-
- return ret;
-}
-
-
-static gboolean
-gst_raw_parse_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
-{
- GstRawParse *rp = GST_RAW_PARSE (parent);
- gboolean ret;
-
- switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_EOS:
- case GST_EVENT_FLUSH_STOP:
- /* Only happens in push mode */
- gst_raw_parse_reset (rp);
- ret = gst_pad_push_event (rp->srcpad, event);
- break;
- case GST_EVENT_SEGMENT:
- {
- GstSegment segment;
-
- /* Only happens in push mode */
-
- gst_event_copy_segment (event, &segment);
-
- if (segment.format != GST_FORMAT_TIME) {
- gst_event_unref (event);
-
- ret =
- gst_raw_parse_convert (rp, segment.format, segment.start,
- GST_FORMAT_TIME, (gint64 *) & segment.start);
- ret &= gst_raw_parse_convert (rp, segment.format, segment.time,
- GST_FORMAT_TIME, (gint64 *) & segment.time);
- ret &= gst_raw_parse_convert (rp, segment.format, segment.stop,
- GST_FORMAT_TIME, (gint64 *) & segment.stop);
- if (!ret) {
- GST_ERROR_OBJECT (rp,
- "Failed converting to GST_FORMAT_TIME format (%d)",
- segment.format);
- break;
- }
-
- segment.format = GST_FORMAT_TIME;
-
- event = gst_event_new_segment (&segment);
- }
-
- gst_segment_copy_into (&segment, &rp->segment);
-
- if (rp->start_segment)
- gst_event_unref (rp->start_segment);
- rp->start_segment = event;
- ret = TRUE;
- break;
- }
- default:
- ret = gst_pad_event_default (pad, parent, event);
- break;
- }
-
- return ret;
-}
-
-
-static gboolean
-gst_raw_parse_handle_seek_push (GstRawParse * rp, GstEvent * event)
-{
- GstFormat format;
- gdouble rate;
- GstSeekFlags flags;
- GstSeekType start_type, stop_type;
- gint64 start, stop;
- gboolean ret = FALSE;
-
- gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start,
- &stop_type, &stop);
-
- /* can't seek backwards yet */
- if (rate <= 0.0)
- goto wrong_rate;
-
- /* First try if upstream handles the seek */
- ret = gst_pad_push_event (rp->sinkpad, event);
- if (ret)
- return ret;
-
- /* Otherwise convert to bytes and push upstream */
- if (format == GST_FORMAT_TIME || format == GST_FORMAT_DEFAULT) {
- ret = gst_raw_parse_convert (rp, format, start, GST_FORMAT_BYTES, &start);
- ret &= gst_raw_parse_convert (rp, format, stop, GST_FORMAT_BYTES, &stop);
-
- if (ret) {
- /* Seek on a frame boundary */
- start -= start % rp->framesize;
- if (stop != -1)
- stop += rp->framesize - stop % rp->framesize;
-
- event =
- gst_event_new_seek (rate, GST_FORMAT_BYTES, flags, start_type,
- start, stop_type, stop);
-
- ret = gst_pad_push_event (rp->sinkpad, event);
- } else {
- GST_DEBUG_OBJECT (rp, "Seek failed: couldn't convert to byte positions");
- }
- } else {
- GST_DEBUG_OBJECT (rp,
- "seeking is only supported in TIME or DEFAULT format");
- }
- return ret;
-
- /* ERRORS */
-wrong_rate:
- {
- GST_DEBUG_OBJECT (rp, "Seek failed: negative rates not supported yet");
- return FALSE;
- }
-}
-
-static gboolean
-gst_raw_parse_handle_seek_pull (GstRawParse * rp, GstEvent * event)
-{
- gdouble rate;
- GstFormat format;
- GstSeekFlags flags;
- GstSeekType start_type, stop_type;
- gint64 start, stop;
- gint64 last_stop;
- gboolean ret = FALSE;
- gboolean flush;
- GstSegment seeksegment;
-
- if (event) {
- gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start,
- &stop_type, &stop);
-
- /* convert input offsets to time */
- ret = gst_raw_parse_convert (rp, format, start, GST_FORMAT_TIME, &start);
- ret &= gst_raw_parse_convert (rp, format, stop, GST_FORMAT_TIME, &stop);
- if (!ret)
- goto convert_failed;
-
- GST_DEBUG_OBJECT (rp, "converted start - stop to time");
-
- gst_event_unref (event);
- } else {
- flags = 0;
- }
-
- format = GST_FORMAT_TIME;
-
- flush = ((flags & GST_SEEK_FLAG_FLUSH) != 0);
-
- /* start flushing up and downstream so that the loop function pauses and we
- * can acquire the STREAM_LOCK. */
- if (flush) {
- GST_LOG_OBJECT (rp, "flushing");
- gst_pad_push_event (rp->sinkpad, gst_event_new_flush_start ());
- gst_pad_push_event (rp->srcpad, gst_event_new_flush_start ());
- } else {
- GST_LOG_OBJECT (rp, "pause task");
- gst_pad_pause_task (rp->sinkpad);
- }
-
- GST_PAD_STREAM_LOCK (rp->sinkpad);
-
- memcpy (&seeksegment, &rp->segment, sizeof (GstSegment));
-
- if (event) {
- /* configure the seek values */
- gst_segment_do_seek (&seeksegment, rate, format, flags,
- start_type, start, stop_type, stop, NULL);
- }
-
- /* get the desired position */
- last_stop = seeksegment.position;
-
- GST_LOG_OBJECT (rp, "seeking to %" GST_TIME_FORMAT,
- GST_TIME_ARGS (last_stop));
-
- /* convert the desired position to bytes */
- ret =
- gst_raw_parse_convert (rp, format, last_stop, GST_FORMAT_BYTES,
- &last_stop);
-
- /* prepare for streaming */
- if (flush) {
- GST_LOG_OBJECT (rp, "stop flush");
- gst_pad_push_event (rp->sinkpad, gst_event_new_flush_stop (TRUE));
- gst_pad_push_event (rp->srcpad, gst_event_new_flush_stop (TRUE));
- }
-
- if (ret) {
- /* seek done */
-
- /* Seek on a frame boundary */
- last_stop -= last_stop % rp->framesize;
-
- rp->offset = last_stop;
- rp->n_frames = last_stop / rp->framesize;
-
- GST_LOG_OBJECT (rp, "seeking to bytes %" G_GINT64_FORMAT, last_stop);
-
- memcpy (&rp->segment, &seeksegment, sizeof (GstSegment));
-
- if (rp->segment.flags & GST_SEEK_FLAG_SEGMENT) {
- gst_element_post_message (GST_ELEMENT_CAST (rp),
- gst_message_new_segment_start (GST_OBJECT_CAST (rp),
- rp->segment.format, rp->segment.position));
- }
-
- /* for deriving a stop position for the playback segment from the seek
- * segment, we must take the duration when the stop is not set */
- if ((stop = rp->segment.stop) == -1)
- stop = rp->segment.duration;
-
- GST_DEBUG_OBJECT (rp, "preparing newsegment from %" G_GINT64_FORMAT
- " to %" G_GINT64_FORMAT, rp->segment.start, stop);
-
- /* now replace the old segment so that we send it in the stream thread the
- * next time it is scheduled. */
- if (rp->start_segment)
- gst_event_unref (rp->start_segment);
- rp->start_segment = gst_event_new_segment (&rp->segment);
- }
- rp->discont = TRUE;
-
- GST_LOG_OBJECT (rp, "start streaming");
- gst_pad_start_task (rp->sinkpad, (GstTaskFunction) gst_raw_parse_loop, rp,
- NULL);
-
- GST_PAD_STREAM_UNLOCK (rp->sinkpad);
-
- return ret;
-
- /* ERRORS */
-convert_failed:
- {
- GST_DEBUG_OBJECT (rp, "Seek failed: couldn't convert to byte positions");
- return FALSE;
- }
-}
-
-static gboolean
-gst_raw_parse_src_event (GstPad * pad, GstObject * parent, GstEvent * event)
-{
- GstRawParse *rp = GST_RAW_PARSE (parent);
- gboolean ret;
-
- switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_SEEK:
- if (rp->mode == GST_PAD_MODE_PUSH)
- ret = gst_raw_parse_handle_seek_push (rp, event);
- else
- ret = gst_raw_parse_handle_seek_pull (rp, event);
- break;
- default:
- ret = gst_pad_event_default (pad, parent, event);
- break;
- }
-
- return ret;
-}
-
-static gboolean
-gst_raw_parse_src_query (GstPad * pad, GstObject * parent, GstQuery * query)
-{
- GstRawParse *rp = GST_RAW_PARSE (parent);
- gboolean ret = FALSE;
-
- GST_DEBUG ("src_query %s", gst_query_type_get_name (GST_QUERY_TYPE (query)));
-
- switch (GST_QUERY_TYPE (query)) {
- case GST_QUERY_POSITION:
- {
- GstFormat format;
- gint64 time, value;
-
- GST_LOG ("query position");
-
- gst_query_parse_position (query, &format, NULL);
-
- time = rp->segment.position;
- ret = gst_raw_parse_convert (rp, GST_FORMAT_TIME, time, format, &value);
-
- gst_query_set_position (query, format, value);
-
- break;
- }
- case GST_QUERY_DURATION:{
- gint64 duration;
- GstFormat format;
- GstQuery *bquery;
-
- GST_LOG ("query duration");
- ret = gst_pad_peer_query (rp->sinkpad, query);
- if (ret)
- goto done;
-
- gst_query_parse_duration (query, &format, NULL);
- /* We only handle TIME and DEFAULT format */
- if (format != GST_FORMAT_TIME && format != GST_FORMAT_DEFAULT)
- goto error;
-
- bquery = gst_query_new_duration (GST_FORMAT_BYTES);
- ret = gst_pad_peer_query (rp->sinkpad, bquery);
- if (!ret) {
- gst_query_unref (bquery);
- goto error;
- }
-
- gst_query_parse_duration (bquery, NULL, &duration);
- gst_query_unref (bquery);
-
- ret =
- gst_raw_parse_convert (rp, GST_FORMAT_BYTES, duration, format,
- &duration);
- if (ret)
- gst_query_set_duration (query, format, duration);
-
- break;
- }
- case GST_QUERY_CONVERT:
- {
- GstFormat src_fmt, dest_fmt;
- gint64 src_val, dest_val;
-
- GST_LOG ("query convert");
-
- gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val);
- ret = gst_raw_parse_convert (rp, src_fmt, src_val, dest_fmt, &dest_val);
- if (!ret)
- goto error;
- gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
- break;
- }
- case GST_QUERY_SEEKING:{
- GstFormat fmt;
-
- ret = TRUE;
-
- /* try upstream first */
- if (gst_pad_peer_query (rp->sinkpad, query))
- break;
-
- gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL);
- if (fmt != GST_FORMAT_TIME && fmt != GST_FORMAT_DEFAULT
- && fmt != GST_FORMAT_BYTES) {
- gst_query_set_seeking (query, fmt, FALSE, -1, -1);
- } else if (rp->mode == GST_PAD_MODE_PUSH) {
- GstQuery *peerquery = gst_query_new_seeking (GST_FORMAT_BYTES);
- gboolean seekable;
-
- seekable = gst_pad_peer_query (rp->sinkpad, peerquery);
- if (seekable)
- gst_query_parse_seeking (peerquery, NULL, &seekable, NULL, NULL);
-
- gst_query_unref (peerquery);
- gst_query_set_seeking (query, fmt, seekable, seekable ? 0 : -1, -1);
- } else {
- gst_query_set_seeking (query, fmt, TRUE, 0, -1);
- }
- break;
- }
- default:
- /* else forward upstream */
- ret = gst_pad_query_default (pad, parent, query);
- break;
- }
-
-done:
- return ret;
-
- /* ERRORS */
-error:
- {
- GST_DEBUG_OBJECT (rp, "query failed");
- goto done;
- }
-}
-
-void
-gst_raw_parse_set_framesize (GstRawParse * rp, int framesize)
-{
- g_return_if_fail (GST_IS_RAW_PARSE (rp));
- g_return_if_fail (!rp->negotiated);
-
- GST_DEBUG_OBJECT (rp, "framesize %d", framesize);
- rp->framesize = framesize;
-}
-
-void
-gst_raw_parse_set_fps (GstRawParse * rp, int fps_n, int fps_d)
-{
- g_return_if_fail (GST_IS_RAW_PARSE (rp));
- g_return_if_fail (!rp->negotiated);
-
- rp->fps_n = fps_n;
- rp->fps_d = fps_d;
-}
-
-void
-gst_raw_parse_get_fps (GstRawParse * rp, int *fps_n, int *fps_d)
-{
- g_return_if_fail (GST_IS_RAW_PARSE (rp));
-
- if (fps_n)
- *fps_n = rp->fps_n;
- if (fps_d)
- *fps_d = rp->fps_d;
-}
-
-gboolean
-gst_raw_parse_is_negotiated (GstRawParse * rp)
-{
- g_return_val_if_fail (GST_IS_RAW_PARSE (rp), FALSE);
-
- return rp->negotiated;
-}
diff --git a/gst/rawparse/gstrawparse.h b/gst/rawparse/gstrawparse.h
deleted file mode 100644
index 2327dc6..0000000
--- a/gst/rawparse/gstrawparse.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/* GStreamer
- * Copyright (C) 2006 David A. Schleef <ds@schleef.org>
- * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
- *
- * gstrawparse.h:
- *
- * 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_RAW_PARSE_H__
-#define __GST_RAW_PARSE_H__
-
-#include <gst/gst.h>
-#include <gst/base/gstbasetransform.h>
-#include <gst/base/gstadapter.h>
-
-G_BEGIN_DECLS
-
-#define GST_TYPE_RAW_PARSE \
- (gst_raw_parse_get_type())
-#define GST_RAW_PARSE(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RAW_PARSE,GstRawParse))
-#define GST_RAW_PARSE_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RAW_PARSE,GstRawParseClass))
-#define GST_RAW_PARSE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_RAW_PARSE,GstRawParseClass))
-#define GST_IS_RAW_PARSE(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RAW_PARSE))
-#define GST_IS_RAW_PARSE_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RAW_PARSE))
-
-typedef struct _GstRawParse GstRawParse;
-typedef struct _GstRawParseClass GstRawParseClass;
-
-struct _GstRawParse
-{
- GstElement parent;
-
- /* <private> */
- GstPad *sinkpad;
- GstPad *srcpad;
-
- GstPadMode mode;
- GstAdapter *adapter;
-
- gint framesize;
- gint fps_d;
- gint fps_n;
-
- gboolean discont;
- guint64 n_frames;
-
- gint64 upstream_length;
- gint64 offset;
-
- GstSegment segment;
- GstEvent *start_segment;
-
- gboolean negotiated;
- gboolean push_stream_start;
-};
-
-struct _GstRawParseClass
-{
- GstElementClass parent_class;
-
- GstCaps * (*get_caps) (GstRawParse *rp);
- void (*pre_push_buffer) (GstRawParse *rp, GstBuffer *buffer);
- void (*decide_allocation) (GstRawParse *rp, GstQuery *query);
-
- gboolean multiple_frames_per_buffer;
-};
-
-GType gst_raw_parse_get_type (void);
-
-void gst_raw_parse_class_set_src_pad_template (GstRawParseClass *klass, const GstCaps * allowed_caps);
-void gst_raw_parse_class_set_multiple_frames_per_buffer (GstRawParseClass *klass, gboolean multiple_frames);
-
-void gst_raw_parse_set_framesize (GstRawParse *rp, int framesize);
-void gst_raw_parse_set_fps (GstRawParse *rp, int fps_n, int fps_d);
-void gst_raw_parse_get_fps (GstRawParse *rp, int *fps_n, int *fps_d);
-gboolean gst_raw_parse_is_negotiated (GstRawParse *rp);
-
-G_END_DECLS
-
-#endif /* __GST_RAW_PARSE_H__ */
diff --git a/gst/rawparse/gstrawvideoparse.c b/gst/rawparse/gstrawvideoparse.c
new file mode 100644
index 0000000..2fb58c1
--- /dev/null
+++ b/gst/rawparse/gstrawvideoparse.c
@@ -0,0 +1,1195 @@
+/* GStreamer
+ * Copyright (C) <2016> Carlos Rafael Giani <dv at pseudoterminal 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-rawvideoparse
+ *
+ * This element parses incoming data as raw video frames and timestamps these.
+ * It also handles seek queries in said raw video data, and ensures that output
+ * buffers contain exactly one frame, even if the input buffers contain only
+ * partial frames or multiple frames. In the former case, it will continue to
+ * receive buffers until there is enough input data to output one frame. In the
+ * latter case, it will extract the first frame in the buffer and output it, then
+ * the second one etc. until the remaining unparsed bytes aren't enough to form
+ * a complete frame, and it will then continue as described in the earlier case.
+ *
+ * The element implements the properties and sink caps configuration as specified
+ * in the #GstRawBaseParse documentation. The properties configuration can be
+ * modified by using the width, height, pixel-aspect-ratio, framerate, interlaced,
+ * top-field-first, plane-strides, plane-offsets, and frame-stride properties.
+ *
+ * If the properties configuration is used, plane strides and offsets will be
+ * computed by using gst_video_info_set_format(). This can be overridden by passing
+ * GValueArrays to the plane-offsets and plane-strides properties. When this is
+ * done, these custom offsets and strides are used later even if new width,
+ * height, format etc. property values might be set. To switch back to computed
+ * plane strides & offsets, pass NULL to one or both of the plane-offset and
+ * plane-array properties.
+ *
+ * The frame stride property is useful in cases where there is extra data between
+ * the frames (for example, trailing metadata, or headers). The parser calculates
+ * the actual frame size out of the other properties and compares it with this
+ * frame-stride value. If the frame stride is larger than the calculated size,
+ * then the extra bytes after the end of the frame are skipped. For example, with
+ * 8-bit grayscale frames and a frame size of 100x10 pixels and a frame stride of
+ * 1500 bytes, there are 500 excess bytes at the end of the actual frame which
+ * are then skipped. It is safe to set the frame stride to a value that is smaller
+ * than the actual frame size (in fact, its default value is 0); if it is smaller,
+ * then no trailing data will be skipped.
+ *
+ * If a framerate of 0 Hz is set (for example, 0/1), then output buffers will have
+ * no duration set. The first output buffer will have a PTS 0, all subsequent ones
+ * an unset PTS.
+ *
+ * <refsect2>
+ * <title>Example pipelines</title>
+ * |[
+ * gst-launch-1.0 filesrc location=video.raw ! rawvideoparse use-sink-caps=false \
+ * width=500 height=400 format=y444 ! autovideosink
+ * ]| Read raw data from a local file and parse it as video data with 500x400 pixels
+ * and Y444 video format.
+ * |[
+ * gst-launch-1.0 filesrc location=video.raw ! queue ! "video/x-raw, width=320, \
+ * height=240, format=I420, framerate=1/1" ! rawvideoparse \
+ * use-sink-caps=true ! autovideosink
+ * ]| Read raw data from a local file and parse it as video data with 320x240 pixels
+ * and I420 video format. The queue element here is to force push based scheduling.
+ * See the documentation in #GstRawBaseParse for the reason why.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+/* FIXME: GValueArray is deprecated, but there is currently no viabla alternative
+ * See https://bugzilla.gnome.org/show_bug.cgi?id=667228 */
+#define GLIB_DISABLE_DEPRECATION_WARNINGS
+
+#include <string.h>
+#include "gstrawvideoparse.h"
+#include "unalignedvideo.h"
+
+
+GST_DEBUG_CATEGORY_STATIC (raw_video_parse_debug);
+#define GST_CAT_DEFAULT raw_video_parse_debug
+
+
+enum
+{
+ PROP_0,
+ PROP_WIDTH,
+ PROP_HEIGHT,
+ PROP_FORMAT,
+ PROP_PIXEL_ASPECT_RATIO,
+ PROP_FRAMERATE,
+ PROP_INTERLACED,
+ PROP_TOP_FIELD_FIRST,
+ PROP_PLANE_STRIDES,
+ PROP_PLANE_OFFSETS,
+ PROP_FRAME_STRIDE
+};
+
+
+#define DEFAULT_WIDTH 320
+#define DEFAULT_HEIGHT 240
+#define DEFAULT_FORMAT GST_VIDEO_FORMAT_I420
+#define DEFAULT_PIXEL_ASPECT_RATIO_N 1
+#define DEFAULT_PIXEL_ASPECT_RATIO_D 1
+#define DEFAULT_FRAMERATE_N 25
+#define DEFAULT_FRAMERATE_D 1
+#define DEFAULT_INTERLACED FALSE
+#define DEFAULT_TOP_FIELD_FIRST FALSE
+#define DEFAULT_FRAME_STRIDE 0
+
+
+#define GST_RAW_VIDEO_PARSE_CAPS \
+ GST_VIDEO_CAPS_MAKE(GST_VIDEO_FORMATS_ALL) "; "
+
+
+static GstStaticPadTemplate static_sink_template =
+ GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_UNALIGNED_RAW_VIDEO_CAPS "; " GST_RAW_VIDEO_PARSE_CAPS)
+ );
+
+
+static GstStaticPadTemplate static_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_RAW_VIDEO_PARSE_CAPS)
+ );
+
+
+#define gst_raw_video_parse_parent_class parent_class
+G_DEFINE_TYPE (GstRawVideoParse, gst_raw_video_parse, GST_TYPE_RAW_BASE_PARSE);
+
+
+static void gst_raw_video_parse_set_property (GObject * object, guint prop_id,
+ GValue const *value, GParamSpec * pspec);
+static void gst_raw_video_parse_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static gboolean gst_raw_video_parse_stop (GstBaseParse * parse);
+
+static gboolean gst_raw_video_parse_set_current_config (GstRawBaseParse *
+ raw_base_parse, GstRawBaseParseConfig config);
+static GstRawBaseParseConfig
+gst_raw_video_parse_get_current_config (GstRawBaseParse * raw_base_parse);
+static gboolean gst_raw_video_parse_set_config_from_caps (GstRawBaseParse *
+ raw_base_parse, GstRawBaseParseConfig config, GstCaps * caps);
+static gboolean gst_raw_video_parse_get_caps_from_config (GstRawBaseParse *
+ raw_base_parse, GstRawBaseParseConfig config, GstCaps ** caps);
+static gsize gst_raw_video_parse_get_config_frame_size (GstRawBaseParse *
+ raw_base_parse, GstRawBaseParseConfig config);
+static guint gst_raw_video_parse_get_max_frames_per_buffer (GstRawBaseParse *
+ raw_base_parse, GstRawBaseParseConfig config);
+static gboolean gst_raw_video_parse_is_config_ready (GstRawBaseParse *
+ raw_base_parse, GstRawBaseParseConfig config);
+static gboolean gst_raw_video_parse_process (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config, GstBuffer * in_data, gsize total_num_in_bytes,
+ gsize num_valid_in_bytes, GstBuffer ** processed_data);
+static gboolean gst_raw_video_parse_is_unit_format_supported (GstRawBaseParse *
+ raw_base_parse, GstFormat format);
+static void gst_raw_video_parse_get_units_per_second (GstRawBaseParse *
+ raw_base_parse, GstFormat format, GstRawBaseParseConfig config,
+ gsize * units_per_sec_n, gsize * units_per_sec_d);
+
+static gint gst_raw_video_parse_get_overhead_size (GstRawBaseParse *
+ raw_base_parse, GstRawBaseParseConfig config);
+
+static gboolean gst_raw_video_parse_is_using_sink_caps (GstRawVideoParse *
+ raw_video_parse);
+static GstRawVideoParseConfig
+ * gst_raw_video_parse_get_config_ptr (GstRawVideoParse * raw_video_parse,
+ GstRawBaseParseConfig config);
+
+static void gst_raw_video_parse_init_config (GstRawVideoParseConfig * config);
+static void gst_raw_video_parse_update_info (GstRawVideoParseConfig * config);
+
+
+
+static void
+gst_raw_video_parse_class_init (GstRawVideoParseClass * klass)
+{
+ GObjectClass *object_class;
+ GstElementClass *element_class;
+ GstBaseParseClass *baseparse_class;
+ GstRawBaseParseClass *rawbaseparse_class;
+
+ GST_DEBUG_CATEGORY_INIT (raw_video_parse_debug, "rawvideoparse", 0,
+ "rawvideoparse element");
+
+ object_class = G_OBJECT_CLASS (klass);
+ element_class = GST_ELEMENT_CLASS (klass);
+ baseparse_class = GST_BASE_PARSE_CLASS (klass);
+ rawbaseparse_class = GST_RAW_BASE_PARSE_CLASS (klass);
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&static_sink_template));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&static_src_template));
+
+ object_class->set_property =
+ GST_DEBUG_FUNCPTR (gst_raw_video_parse_set_property);
+ object_class->get_property =
+ GST_DEBUG_FUNCPTR (gst_raw_video_parse_get_property);
+
+ baseparse_class->stop = GST_DEBUG_FUNCPTR (gst_raw_video_parse_stop);
+
+ rawbaseparse_class->set_current_config =
+ GST_DEBUG_FUNCPTR (gst_raw_video_parse_set_current_config);
+ rawbaseparse_class->get_current_config =
+ GST_DEBUG_FUNCPTR (gst_raw_video_parse_get_current_config);
+ rawbaseparse_class->set_config_from_caps =
+ GST_DEBUG_FUNCPTR (gst_raw_video_parse_set_config_from_caps);
+ rawbaseparse_class->get_caps_from_config =
+ GST_DEBUG_FUNCPTR (gst_raw_video_parse_get_caps_from_config);
+ rawbaseparse_class->get_config_frame_size =
+ GST_DEBUG_FUNCPTR (gst_raw_video_parse_get_config_frame_size);
+ rawbaseparse_class->get_max_frames_per_buffer =
+ GST_DEBUG_FUNCPTR (gst_raw_video_parse_get_max_frames_per_buffer);
+ rawbaseparse_class->is_config_ready =
+ GST_DEBUG_FUNCPTR (gst_raw_video_parse_is_config_ready);
+ rawbaseparse_class->process = GST_DEBUG_FUNCPTR (gst_raw_video_parse_process);
+ rawbaseparse_class->is_unit_format_supported =
+ GST_DEBUG_FUNCPTR (gst_raw_video_parse_is_unit_format_supported);
+ rawbaseparse_class->get_units_per_second =
+ GST_DEBUG_FUNCPTR (gst_raw_video_parse_get_units_per_second);
+ rawbaseparse_class->get_overhead_size =
+ GST_DEBUG_FUNCPTR (gst_raw_video_parse_get_overhead_size);
+
+ g_object_class_install_property (object_class,
+ PROP_WIDTH,
+ g_param_spec_int ("width",
+ "Width",
+ "Width of frames in raw stream",
+ 0, G_MAXINT, DEFAULT_WIDTH,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
+ );
+ g_object_class_install_property (object_class,
+ PROP_HEIGHT,
+ g_param_spec_int ("height",
+ "Height",
+ "Height of frames in raw stream",
+ 0, G_MAXINT,
+ DEFAULT_HEIGHT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
+ );
+ g_object_class_install_property (object_class,
+ PROP_FORMAT,
+ g_param_spec_enum ("format",
+ "Format",
+ "Format of frames in raw stream",
+ GST_TYPE_VIDEO_FORMAT,
+ DEFAULT_FORMAT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
+ );
+ g_object_class_install_property (object_class,
+ PROP_FRAMERATE,
+ gst_param_spec_fraction ("framerate",
+ "Frame rate",
+ "Rate of frames in raw stream",
+ 0, 1, G_MAXINT, 1,
+ DEFAULT_FRAMERATE_N, DEFAULT_FRAMERATE_D,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
+ );
+ g_object_class_install_property (object_class,
+ PROP_PIXEL_ASPECT_RATIO,
+ gst_param_spec_fraction ("pixel-aspect-ratio",
+ "Pixel aspect ratio",
+ "Pixel aspect ratio of frames in raw stream",
+ 1, 100, 100, 1,
+ DEFAULT_PIXEL_ASPECT_RATIO_N, DEFAULT_PIXEL_ASPECT_RATIO_D,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
+ );
+ g_object_class_install_property (object_class,
+ PROP_INTERLACED,
+ g_param_spec_boolean ("interlaced",
+ "Interlaced flag",
+ "True if frames in raw stream are interlaced",
+ DEFAULT_INTERLACED, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
+ );
+ g_object_class_install_property (object_class,
+ PROP_TOP_FIELD_FIRST,
+ g_param_spec_boolean ("top-field-first",
+ "Top field first",
+ "True if top field in frames in raw stream come first (not used if frames aren't interlaced)",
+ DEFAULT_INTERLACED, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
+ );
+ g_object_class_install_property (object_class,
+ PROP_PLANE_STRIDES,
+ g_param_spec_value_array ("plane-strides",
+ "Plane strides",
+ "Strides of the planets in bytes",
+ g_param_spec_uint ("plane-stride",
+ "Plane stride",
+ "Stride of the n-th plane in bytes (0 = stride equals width*bytes-per-pixel)",
+ 0, G_MAXUINT,
+ 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS),
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
+ );
+ g_object_class_install_property (object_class,
+ PROP_PLANE_OFFSETS,
+ g_param_spec_value_array ("plane-offsets",
+ "Plane offsets",
+ "Offsets of the planets in bytes",
+ g_param_spec_uint ("plane-offset",
+ "Plane offset",
+ "Offset of the n-th plane in bytes",
+ 0, G_MAXUINT,
+ 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS),
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
+ );
+ g_object_class_install_property (object_class,
+ PROP_FRAME_STRIDE,
+ g_param_spec_uint ("frame-stride",
+ "Frame stride",
+ "Stride between whole frames (0 = frames are tightly packed together)",
+ 0, G_MAXUINT,
+ DEFAULT_FRAME_STRIDE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
+ );
+
+ gst_element_class_set_static_metadata (element_class,
+ "rawvideoparse",
+ "Codec/Parser/Video",
+ "Converts unformatted data streams into timestamped raw video frames",
+ "Carlos Rafael Giani <dv@pseudoterminal.org>");
+}
+
+
+static void
+gst_raw_video_parse_init (GstRawVideoParse * raw_video_parse)
+{
+ gst_raw_video_parse_init_config (&(raw_video_parse->properties_config));
+ gst_raw_video_parse_init_config (&(raw_video_parse->sink_caps_config));
+
+ /* As required by GstRawBaseParse, ensure that the current configuration
+ * is initially set to be the properties config */
+ raw_video_parse->current_config = &(raw_video_parse->properties_config);
+
+ /* Properties config must be valid from the start, so set its ready value
+ * to TRUE, and make sure its bpf value is valid. */
+ raw_video_parse->properties_config.ready = TRUE;
+ raw_video_parse->properties_config.top_field_first = DEFAULT_TOP_FIELD_FIRST;
+ raw_video_parse->properties_config.frame_stride = DEFAULT_FRAME_STRIDE;
+}
+
+
+static void
+gst_raw_video_parse_set_property (GObject * object, guint prop_id,
+ GValue const *value, GParamSpec * pspec)
+{
+ GstBaseParse *base_parse = GST_BASE_PARSE (object);
+ GstRawBaseParse *raw_base_parse = GST_RAW_BASE_PARSE (object);
+ GstRawVideoParse *raw_video_parse = GST_RAW_VIDEO_PARSE (object);
+ GstRawVideoParseConfig *props_cfg = &(raw_video_parse->properties_config);
+
+ /* All properties are handled similarly:
+ * - if the new value is the same as the current value, nothing is done
+ * - the parser lock is held while the new value is set
+ * - if the properties config is the current config, the source caps are
+ * invalidated to ensure that the code in handle_frame pushes a new CAPS
+ * event out
+ * - properties that affect the video frame size call the function to update
+ * the info and also call gst_base_parse_set_min_frame_size() to ensure
+ * that the minimum frame size can hold 1 frame (= one sample for each
+ * channel); to ensure that the min frame size includes any extra padding,
+ * it is set to the result of gst_raw_video_parse_get_config_frame_size()
+ * - property configuration values that require video info updates aren't
+ * written directory into the video info structure, but in the extra
+ * fields instead (gst_raw_video_parse_update_info() then copies the values
+ * from these fields into the video info); see the documentation inside
+ * gst_raw_video_parse_update_info() for the reason why
+ */
+
+ switch (prop_id) {
+ case PROP_WIDTH:
+ {
+ gint new_width = g_value_get_int (value);
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+
+ if (new_width != props_cfg->width) {
+ props_cfg->width = new_width;
+ gst_raw_video_parse_update_info (props_cfg);
+
+ if (!gst_raw_video_parse_is_using_sink_caps (raw_video_parse)) {
+ gst_raw_base_parse_invalidate_src_caps (raw_base_parse);
+ gst_base_parse_set_min_frame_size (base_parse,
+ gst_raw_video_parse_get_config_frame_size (raw_base_parse,
+ GST_RAW_BASE_PARSE_CONFIG_PROPERTIES));
+ }
+ }
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+ }
+
+ case PROP_HEIGHT:
+ {
+ gint new_height = g_value_get_int (value);
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+
+ if (new_height != props_cfg->height) {
+ props_cfg->height = new_height;
+ gst_raw_video_parse_update_info (props_cfg);
+
+ if (!gst_raw_video_parse_is_using_sink_caps (raw_video_parse)) {
+ gst_raw_base_parse_invalidate_src_caps (raw_base_parse);
+ gst_base_parse_set_min_frame_size (base_parse,
+ gst_raw_video_parse_get_config_frame_size (raw_base_parse,
+ GST_RAW_BASE_PARSE_CONFIG_PROPERTIES));
+ }
+ }
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+ }
+
+ case PROP_FORMAT:
+ {
+ GstVideoFormat new_format = g_value_get_enum (value);
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+
+ if (new_format != props_cfg->format) {
+ props_cfg->format = new_format;
+ gst_raw_video_parse_update_info (props_cfg);
+
+ if (!gst_raw_video_parse_is_using_sink_caps (raw_video_parse)) {
+ gst_raw_base_parse_invalidate_src_caps (raw_base_parse);
+ gst_base_parse_set_min_frame_size (base_parse,
+ gst_raw_video_parse_get_config_frame_size (raw_base_parse,
+ GST_RAW_BASE_PARSE_CONFIG_PROPERTIES));
+ }
+ }
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+ }
+
+ case PROP_PIXEL_ASPECT_RATIO:
+ {
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+
+ /* The pixel aspect ratio does not affect the video frame size,
+ * so it is just set directly without any updates */
+ props_cfg->pixel_aspect_ratio_n =
+ GST_VIDEO_INFO_PAR_N (&(props_cfg->info)) =
+ gst_value_get_fraction_numerator (value);
+ props_cfg->pixel_aspect_ratio_d =
+ GST_VIDEO_INFO_PAR_D (&(props_cfg->info)) =
+ gst_value_get_fraction_denominator (value);
+ GST_DEBUG_OBJECT (raw_video_parse, "setting pixel aspect ratio to %u/%u",
+ props_cfg->pixel_aspect_ratio_n, props_cfg->pixel_aspect_ratio_d);
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+ }
+
+ case PROP_FRAMERATE:
+ {
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+
+ /* The framerate does not affect the video frame size,
+ * so it is just set directly without any updates */
+ props_cfg->framerate_n = GST_VIDEO_INFO_FPS_N (&(props_cfg->info)) =
+ gst_value_get_fraction_numerator (value);
+ props_cfg->framerate_d = GST_VIDEO_INFO_FPS_D (&(props_cfg->info)) =
+ gst_value_get_fraction_denominator (value);
+ GST_DEBUG_OBJECT (raw_video_parse, "setting framerate to %u/%u",
+ props_cfg->framerate_n, props_cfg->framerate_d);
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+ }
+
+ case PROP_INTERLACED:
+ {
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+
+ /* Interlacing does not affect the video frame size,
+ * so it is just set directly without any updates */
+ props_cfg->interlaced = g_value_get_boolean (value);
+ GST_VIDEO_INFO_INTERLACE_MODE (&(props_cfg->info)) =
+ props_cfg->interlaced ? GST_VIDEO_INTERLACE_MODE_INTERLEAVED :
+ GST_VIDEO_INTERLACE_MODE_PROGRESSIVE;
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+
+ break;
+ }
+
+ case PROP_TOP_FIELD_FIRST:
+ {
+ /* The top-field-first flag is a detail related to
+ * interlacing, so no video info update is needed */
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+ props_cfg->top_field_first = g_value_get_boolean (value);
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+ }
+
+ case PROP_PLANE_STRIDES:
+ {
+ GValueArray *valarray = g_value_get_boxed (value);
+ guint n_planes;
+ guint i;
+
+ /* If no valarray is given, then disable custom
+ * plane strides & offsets and stick to the
+ * standard computed ones */
+ if (valarray == NULL) {
+ GST_DEBUG_OBJECT (raw_video_parse,
+ "custom plane strides & offsets disabled");
+ props_cfg->custom_plane_strides = FALSE;
+ gst_raw_video_parse_update_info (props_cfg);
+ break;
+ }
+
+ /* Sanity check - reject empty arrays */
+ if ((valarray != NULL) && (valarray->n_values == 0)) {
+ GST_ELEMENT_ERROR (raw_video_parse, LIBRARY, SETTINGS,
+ ("plane strides property holds an empty array"), (NULL));
+ break;
+ }
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+
+ n_planes = GST_VIDEO_INFO_N_PLANES (&(props_cfg->info));
+
+ /* Check that the valarray holds the right number of values */
+ if (valarray->n_values != n_planes) {
+ GST_ELEMENT_ERROR (raw_video_parse, LIBRARY, SETTINGS,
+ ("incorrect number of elements in plane strides property"),
+ ("expected: %u, got: %u", n_planes, valarray->n_values));
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+ }
+
+ /* Copy the values to the stride array */
+ for (i = 0; i < n_planes; ++i) {
+ GValue *val = g_value_array_get_nth (valarray, i);
+ props_cfg->plane_strides[i] = g_value_get_uint (val);
+ GST_DEBUG_OBJECT (raw_video_parse, "plane #%u stride: %d", i,
+ props_cfg->plane_strides[i]);
+ }
+
+ props_cfg->custom_plane_strides = TRUE;
+
+ gst_raw_video_parse_update_info (props_cfg);
+
+ if (!gst_raw_video_parse_is_using_sink_caps (raw_video_parse))
+ gst_base_parse_set_min_frame_size (base_parse,
+ gst_raw_video_parse_get_config_frame_size (raw_base_parse,
+ GST_RAW_BASE_PARSE_CONFIG_PROPERTIES));
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+ }
+
+ case PROP_PLANE_OFFSETS:
+ {
+ GValueArray *valarray = g_value_get_boxed (value);
+ guint n_planes;
+ guint i;
+
+ /* If no valarray is given, then disable custom
+ * plane strides & offsets and stick to the
+ * standard computed ones */
+ if (valarray == NULL) {
+ GST_DEBUG_OBJECT (raw_video_parse,
+ "custom plane strides & offsets disabled");
+ props_cfg->custom_plane_strides = FALSE;
+ gst_raw_video_parse_update_info (props_cfg);
+ break;
+ }
+
+ /* Sanity check - reject empty arrays */
+ if ((valarray != NULL) && (valarray->n_values == 0)) {
+ GST_ELEMENT_ERROR (raw_video_parse, LIBRARY, SETTINGS,
+ ("plane offsets property holds an empty array"), (NULL));
+ break;
+ }
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+
+ n_planes = GST_VIDEO_INFO_N_PLANES (&(props_cfg->info));
+
+ /* Check that the valarray holds the right number of values */
+ if (valarray->n_values != n_planes) {
+ GST_ELEMENT_ERROR (raw_video_parse, LIBRARY, SETTINGS,
+ ("incorrect number of elements in plane offsets property"),
+ ("expected: %u, got: %u", n_planes, valarray->n_values));
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+ }
+
+ /* Copy the values to the offset array */
+ for (i = 0; i < n_planes; ++i) {
+ GValue *val = g_value_array_get_nth (valarray, i);
+ props_cfg->plane_offsets[i] = g_value_get_uint (val);
+ GST_DEBUG_OBJECT (raw_video_parse, "plane #%u offset: %" G_GSIZE_FORMAT,
+ i, props_cfg->plane_offsets[i]);
+ }
+
+ props_cfg->custom_plane_strides = TRUE;
+
+ gst_raw_video_parse_update_info (props_cfg);
+
+ if (!gst_raw_video_parse_is_using_sink_caps (raw_video_parse))
+ gst_base_parse_set_min_frame_size (base_parse,
+ gst_raw_video_parse_get_config_frame_size (raw_base_parse,
+ GST_RAW_BASE_PARSE_CONFIG_PROPERTIES));
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+ }
+
+ case PROP_FRAME_STRIDE:
+ {
+ /* The frame stride does not affect the video frame size,
+ * so it is just set directly without any updates */
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+ props_cfg->frame_stride = g_value_get_uint (value);
+ gst_raw_video_parse_update_info (props_cfg);
+ if (!gst_raw_video_parse_is_using_sink_caps (raw_video_parse))
+ gst_base_parse_set_min_frame_size (base_parse,
+ gst_raw_video_parse_get_config_frame_size (raw_base_parse,
+ GST_RAW_BASE_PARSE_CONFIG_PROPERTIES));
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+
+ break;
+ }
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+
+static void
+gst_raw_video_parse_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstRawVideoParse *raw_video_parse = GST_RAW_VIDEO_PARSE (object);
+ GstRawVideoParseConfig *props_cfg = &(raw_video_parse->properties_config);
+
+ switch (prop_id) {
+ case PROP_WIDTH:
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+ g_value_set_int (value, props_cfg->width);
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+
+ case PROP_HEIGHT:
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+ g_value_set_int (value, props_cfg->height);
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+
+ case PROP_FORMAT:
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+ g_value_set_enum (value, props_cfg->format);
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+
+ case PROP_PIXEL_ASPECT_RATIO:
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+ gst_value_set_fraction (value, props_cfg->pixel_aspect_ratio_n,
+ props_cfg->pixel_aspect_ratio_d);
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+
+ break;
+
+ case PROP_FRAMERATE:
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+ gst_value_set_fraction (value, props_cfg->framerate_n,
+ props_cfg->framerate_d);
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+
+ case PROP_INTERLACED:
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+ g_value_set_boolean (value, props_cfg->interlaced);
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+
+ case PROP_TOP_FIELD_FIRST:
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+ g_value_set_boolean (value, props_cfg->top_field_first);
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+
+ case PROP_PLANE_STRIDES:
+ {
+ guint i, n_planes;
+ GValue val = G_VALUE_INIT;
+ GValueArray *valarray;
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+
+ n_planes = GST_VIDEO_INFO_N_PLANES (&(props_cfg->info));
+ valarray = g_value_array_new (n_planes);
+ g_value_init (&val, G_TYPE_UINT);
+
+ for (i = 0; i < n_planes; ++i) {
+ g_value_set_uint (&val, props_cfg->plane_strides[i]);
+ g_value_array_insert (valarray, i, &val);
+ }
+
+ g_value_unset (&val);
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+
+ /* Pass on ownership to the value array,
+ * since we don't need it anymore */
+ g_value_take_boxed (value, valarray);
+ break;
+ }
+
+ case PROP_PLANE_OFFSETS:
+ {
+ guint i, n_planes;
+ GValue val = G_VALUE_INIT;
+ GValueArray *valarray;
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+
+ n_planes = GST_VIDEO_INFO_N_PLANES (&(props_cfg->info));
+ valarray = g_value_array_new (n_planes);
+ g_value_init (&val, G_TYPE_UINT);
+
+ for (i = 0; i < n_planes; ++i) {
+ g_value_set_uint (&val, props_cfg->plane_offsets[i]);
+ g_value_array_insert (valarray, i, &val);
+ }
+
+ g_value_unset (&val);
+
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+
+ /* Pass on ownership to the value array,
+ * since we don't need it anymore */
+ g_value_take_boxed (value, valarray);
+ break;
+ }
+
+ case PROP_FRAME_STRIDE:
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_LOCK (object);
+ g_value_set_uint (value, raw_video_parse->properties_config.frame_stride);
+ GST_RAW_BASE_PARSE_CONFIG_MUTEX_UNLOCK (object);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+
+static gboolean
+gst_raw_video_parse_stop (GstBaseParse * parse)
+{
+ GstRawVideoParse *raw_video_parse = GST_RAW_VIDEO_PARSE (parse);
+
+ /* Sink caps config is not ready until caps come in.
+ * We are stopping processing, the element is being reset,
+ * so the config has to be un-readied.
+ * (Since the properties config is not depending on caps,
+ * its ready status is always TRUE.) */
+ raw_video_parse->sink_caps_config.ready = FALSE;
+
+ return GST_BASE_PARSE_CLASS (parent_class)->stop (parse);
+}
+
+
+static gboolean
+gst_raw_video_parse_set_current_config (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config)
+{
+ GstRawVideoParse *raw_video_parse = GST_RAW_VIDEO_PARSE (raw_base_parse);
+
+ switch (config) {
+ case GST_RAW_BASE_PARSE_CONFIG_PROPERTIES:
+ raw_video_parse->current_config = &(raw_video_parse->properties_config);
+ break;
+
+ case GST_RAW_BASE_PARSE_CONFIG_SINKCAPS:
+ raw_video_parse->current_config = &(raw_video_parse->sink_caps_config);
+ break;
+
+ default:
+ g_assert_not_reached ();
+ }
+
+ return TRUE;
+}
+
+
+static GstRawBaseParseConfig
+gst_raw_video_parse_get_current_config (GstRawBaseParse * raw_base_parse)
+{
+ GstRawVideoParse *raw_video_parse = GST_RAW_VIDEO_PARSE (raw_base_parse);
+ return gst_raw_video_parse_is_using_sink_caps (raw_video_parse) ?
+ GST_RAW_BASE_PARSE_CONFIG_SINKCAPS : GST_RAW_BASE_PARSE_CONFIG_PROPERTIES;
+}
+
+
+static gboolean
+gst_raw_video_parse_set_config_from_caps (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config, GstCaps * caps)
+{
+ int i;
+ GstStructure *structure;
+ GstRawVideoParse *raw_video_parse = GST_RAW_VIDEO_PARSE (raw_base_parse);
+ GstRawVideoParseConfig *config_ptr =
+ gst_raw_video_parse_get_config_ptr (raw_video_parse, config);
+
+ g_assert (caps != NULL);
+
+ /* Caps might get copied, and the copy needs to be unref'd.
+ * Also, the caller retains ownership over the original caps.
+ * So, to make this mechanism also work with cases where the
+ * caps are *not* copied, ref the original caps here first. */
+ gst_caps_ref (caps);
+
+ structure = gst_caps_get_structure (caps, 0);
+
+ /* For unaligned raw data, the output caps stay the same,
+ * except that video/x-unaligned-raw becomes video/x-raw,
+ * since the parser aligns the frame data */
+ if (gst_structure_has_name (structure, "video/x-unaligned-raw")) {
+ /* Copy the caps to be able to modify them */
+ GstCaps *new_caps = gst_caps_copy (caps);
+ gst_caps_unref (caps);
+ caps = new_caps;
+
+ /* Change the media type to video/x-raw , otherwise
+ * gst_video_info_from_caps() won't work */
+ structure = gst_caps_get_structure (caps, 0);
+ gst_structure_set_name (structure, "video/x-raw");
+ }
+
+ config_ptr->ready = gst_video_info_from_caps (&(config_ptr->info), caps);
+
+ if (config_ptr->ready) {
+ config_ptr->width = GST_VIDEO_INFO_WIDTH (&(config_ptr->info));
+ config_ptr->height = GST_VIDEO_INFO_HEIGHT (&(config_ptr->info));
+ config_ptr->pixel_aspect_ratio_n =
+ GST_VIDEO_INFO_PAR_N (&(config_ptr->info));
+ config_ptr->pixel_aspect_ratio_d =
+ GST_VIDEO_INFO_PAR_D (&(config_ptr->info));
+ config_ptr->framerate_n = GST_VIDEO_INFO_FPS_N (&(config_ptr->info));
+ config_ptr->framerate_d = GST_VIDEO_INFO_FPS_D (&(config_ptr->info));
+ config_ptr->interlaced = GST_VIDEO_INFO_IS_INTERLACED (&(config_ptr->info));
+ config_ptr->height = GST_VIDEO_INFO_HEIGHT (&(config_ptr->info));
+ config_ptr->top_field_first = 0;
+ config_ptr->frame_stride = 0;
+
+ for (i = 0; i < GST_VIDEO_MAX_PLANES; ++i) {
+ config_ptr->plane_offsets[i] =
+ GST_VIDEO_INFO_PLANE_OFFSET (&(config_ptr->info), i);
+ config_ptr->plane_strides[i] =
+ GST_VIDEO_INFO_PLANE_STRIDE (&(config_ptr->info), i);
+ }
+ }
+
+ gst_caps_unref (caps);
+
+ return config_ptr->ready;
+}
+
+
+static gboolean
+gst_raw_video_parse_get_caps_from_config (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config, GstCaps ** caps)
+{
+ GstRawVideoParse *raw_video_parse = GST_RAW_VIDEO_PARSE (raw_base_parse);
+ GstRawVideoParseConfig *config_ptr =
+ gst_raw_video_parse_get_config_ptr (raw_video_parse, config);
+
+ g_assert (caps != NULL);
+
+ *caps = gst_video_info_to_caps (&(config_ptr->info));
+
+ return *caps != NULL;
+}
+
+
+static gsize
+gst_raw_video_parse_get_config_frame_size (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config)
+{
+ GstRawVideoParse *raw_video_parse = GST_RAW_VIDEO_PARSE (raw_base_parse);
+ GstRawVideoParseConfig *config_ptr =
+ gst_raw_video_parse_get_config_ptr (raw_video_parse, config);
+ return MAX (GST_VIDEO_INFO_SIZE (&(config_ptr->info)),
+ (gsize) (config_ptr->frame_stride));
+}
+
+
+static guint
+gst_raw_video_parse_get_max_frames_per_buffer (G_GNUC_UNUSED GstRawBaseParse *
+ raw_base_parse, G_GNUC_UNUSED GstRawBaseParseConfig config)
+{
+ /* We want exactly one frame per buffer */
+ return 1;
+}
+
+
+static gboolean
+gst_raw_video_parse_is_config_ready (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config)
+{
+ GstRawVideoParse *raw_video_parse = GST_RAW_VIDEO_PARSE (raw_base_parse);
+ return gst_raw_video_parse_get_config_ptr (raw_video_parse, config)->ready;
+}
+
+
+static gboolean
+gst_raw_video_parse_process (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config, GstBuffer * in_data,
+ G_GNUC_UNUSED gsize total_num_in_bytes,
+ G_GNUC_UNUSED gsize num_valid_in_bytes, GstBuffer ** processed_data)
+{
+ GstRawVideoParse *raw_video_parse = GST_RAW_VIDEO_PARSE (raw_base_parse);
+ GstRawVideoParseConfig *config_ptr =
+ gst_raw_video_parse_get_config_ptr (raw_video_parse, config);
+ guint frame_flags = 0;
+ GstVideoInfo *video_info = &(config_ptr->info);
+ GstVideoMeta *videometa;
+ GstBuffer *out_data;
+
+ /* In case of extra padding bytes, get a subbuffer without the padding bytes.
+ * Otherwise, just add the video meta. */
+ if (GST_VIDEO_INFO_SIZE (video_info) < config_ptr->frame_stride) {
+ *processed_data = out_data =
+ gst_buffer_copy_region (in_data,
+ GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS |
+ GST_BUFFER_COPY_MEMORY, 0, GST_VIDEO_INFO_SIZE (video_info));
+ } else {
+ out_data = in_data;
+ *processed_data = NULL;
+ }
+
+ if (config_ptr->interlaced) {
+ GST_BUFFER_FLAG_SET (out_data, GST_VIDEO_BUFFER_FLAG_INTERLACED);
+ frame_flags |= GST_VIDEO_FRAME_FLAG_INTERLACED;
+
+ if (config_ptr->top_field_first) {
+ GST_BUFFER_FLAG_SET (out_data, GST_VIDEO_BUFFER_FLAG_TFF);
+ frame_flags |= GST_VIDEO_FRAME_FLAG_TFF;
+ } else
+ GST_BUFFER_FLAG_UNSET (out_data, GST_VIDEO_BUFFER_FLAG_TFF);
+ }
+
+ /* Remove any existing videometa - it will be replaced by the new videometa
+ * from here */
+ while ((videometa = gst_buffer_get_video_meta (out_data))) {
+ GST_LOG_OBJECT (raw_base_parse, "removing existing videometa from buffer");
+ gst_buffer_remove_meta (out_data, (GstMeta *) videometa);
+ }
+
+ gst_buffer_add_video_meta_full (out_data,
+ frame_flags,
+ config_ptr->format,
+ config_ptr->width,
+ config_ptr->height,
+ GST_VIDEO_INFO_N_PLANES (video_info),
+ config_ptr->plane_offsets, config_ptr->plane_strides);
+
+
+ return TRUE;
+}
+
+
+static gboolean
+gst_raw_video_parse_is_unit_format_supported (G_GNUC_UNUSED GstRawBaseParse *
+ raw_base_parse, GstFormat format)
+{
+ switch (format) {
+ case GST_FORMAT_BYTES:
+ case GST_FORMAT_DEFAULT:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+
+static void
+gst_raw_video_parse_get_units_per_second (GstRawBaseParse * raw_base_parse,
+ GstFormat format, GstRawBaseParseConfig config, gsize * units_per_sec_n,
+ gsize * units_per_sec_d)
+{
+ GstRawVideoParse *raw_video_parse = GST_RAW_VIDEO_PARSE (raw_base_parse);
+ GstRawVideoParseConfig *config_ptr =
+ gst_raw_video_parse_get_config_ptr (raw_video_parse, config);
+
+ switch (format) {
+ case GST_FORMAT_BYTES:
+ {
+ gsize framesize = GST_VIDEO_INFO_SIZE (&(config_ptr->info));
+ gint64 n = framesize * config_ptr->framerate_n;
+ gint64 d = config_ptr->framerate_d;
+ gint64 common_div = gst_util_greatest_common_divisor_int64 (n, d);
+ GST_DEBUG_OBJECT (raw_video_parse,
+ "n: %" G_GINT64_FORMAT " d: %" G_GINT64_FORMAT " common divisor: %"
+ G_GINT64_FORMAT, n, d, common_div);
+
+ /* Divide numerator and denominator by greatest common divisor.
+ * This minimizes the risk of integer overflows in the baseparse class. */
+ *units_per_sec_n = n / common_div;
+ *units_per_sec_d = d / common_div;
+
+ break;
+ }
+
+ case GST_FORMAT_DEFAULT:
+ {
+ *units_per_sec_n = config_ptr->framerate_n;
+ *units_per_sec_d = config_ptr->framerate_d;
+ break;
+ }
+
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+
+static gint
+gst_raw_video_parse_get_overhead_size (GstRawBaseParse * raw_base_parse,
+ GstRawBaseParseConfig config)
+{
+ GstRawVideoParse *raw_video_parse = GST_RAW_VIDEO_PARSE (raw_base_parse);
+ GstRawVideoParseConfig *config_ptr =
+ gst_raw_video_parse_get_config_ptr (raw_video_parse, config);
+ gint64 frame_size = GST_VIDEO_INFO_SIZE (&(config_ptr->info));
+ gint64 frame_stride = config_ptr->frame_stride;
+
+ /* In the video parser, the overhead is defined by the difference between
+ * the frame stride and the actual frame size. If the former is larger,
+ * then the additional bytes are considered padding bytes and get ignored
+ * by the base class. */
+
+ GST_LOG_OBJECT (raw_video_parse,
+ "frame size: %" G_GINT64_FORMAT " frame stride: %" G_GINT64_FORMAT,
+ frame_size, frame_stride);
+
+ return (frame_size < frame_stride) ? (gint) (frame_stride - frame_size) : 0;
+}
+
+
+static gboolean
+gst_raw_video_parse_is_using_sink_caps (GstRawVideoParse * raw_video_parse)
+{
+ return raw_video_parse->current_config ==
+ &(raw_video_parse->sink_caps_config);
+}
+
+
+static GstRawVideoParseConfig *
+gst_raw_video_parse_get_config_ptr (GstRawVideoParse * raw_video_parse,
+ GstRawBaseParseConfig config)
+{
+ g_assert (raw_video_parse->current_config != NULL);
+
+ switch (config) {
+ case GST_RAW_BASE_PARSE_CONFIG_PROPERTIES:
+ return &(raw_video_parse->properties_config);
+
+ case GST_RAW_BASE_PARSE_CONFIG_SINKCAPS:
+ return &(raw_video_parse->sink_caps_config);
+
+ default:
+ g_assert (raw_video_parse->current_config != NULL);
+ return raw_video_parse->current_config;
+ }
+}
+
+
+static void
+gst_raw_video_parse_init_config (GstRawVideoParseConfig * config)
+{
+ int i;
+
+ config->ready = FALSE;
+ config->width = DEFAULT_WIDTH;
+ config->height = DEFAULT_HEIGHT;
+ config->format = DEFAULT_FORMAT;
+ config->pixel_aspect_ratio_n = DEFAULT_PIXEL_ASPECT_RATIO_N;
+ config->pixel_aspect_ratio_d = DEFAULT_PIXEL_ASPECT_RATIO_D;
+ config->framerate_n = DEFAULT_FRAMERATE_N;
+ config->framerate_d = DEFAULT_FRAMERATE_D;
+ config->interlaced = DEFAULT_INTERLACED;
+
+ config->top_field_first = DEFAULT_TOP_FIELD_FIRST;
+ config->frame_stride = DEFAULT_FRAME_STRIDE;
+
+ gst_video_info_set_format (&(config->info), DEFAULT_FORMAT, DEFAULT_WIDTH,
+ DEFAULT_HEIGHT);
+ for (i = 0; i < GST_VIDEO_MAX_PLANES; ++i) {
+ config->plane_offsets[i] = GST_VIDEO_INFO_PLANE_OFFSET (&(config->info), i);
+ config->plane_strides[i] = GST_VIDEO_INFO_PLANE_STRIDE (&(config->info), i);
+ }
+}
+
+
+static void
+gst_raw_video_parse_update_info (GstRawVideoParseConfig * config)
+{
+ guint i;
+ guint n_planes;
+ guint last_plane;
+ gsize last_plane_offset, last_plane_size;
+ GstVideoInfo *info = &(config->info);
+
+ GST_DEBUG ("updating info with width %u height %u format %s "
+ " custom plane strides&offsets %d", config->width, config->height,
+ gst_video_format_to_string (config->format),
+ config->custom_plane_strides);
+
+ gst_video_info_set_format (info, config->format, config->width,
+ config->height);
+
+ GST_VIDEO_INFO_PAR_N (info) = config->pixel_aspect_ratio_n;
+ GST_VIDEO_INFO_PAR_D (info) = config->pixel_aspect_ratio_d;
+ GST_VIDEO_INFO_FPS_N (info) = config->framerate_n;
+ GST_VIDEO_INFO_FPS_D (info) = config->framerate_d;
+ GST_VIDEO_INFO_INTERLACE_MODE (info) =
+ config->interlaced ? GST_VIDEO_INTERLACE_MODE_INTERLEAVED :
+ GST_VIDEO_INTERLACE_MODE_PROGRESSIVE;
+
+ /* Check if there are custom plane strides & offsets that need to be preserved */
+ if (config->custom_plane_strides) {
+ /* In case there are, overwrite the offsets&strides computed by
+ * gst_video_info_set_format with the custom ones */
+ for (i = 0; i < GST_VIDEO_MAX_PLANES; ++i) {
+ GST_VIDEO_INFO_PLANE_OFFSET (info, i) = config->plane_offsets[i];
+ GST_VIDEO_INFO_PLANE_STRIDE (info, i) = config->plane_strides[i];
+ }
+ } else {
+ /* No custom planes&offsets; copy the computed ones into
+ * the plane_offsets & plane_strides arrays to ensure they
+ * are equal to the ones in the videoinfo */
+ for (i = 0; i < GST_VIDEO_MAX_PLANES; ++i) {
+ config->plane_offsets[i] = GST_VIDEO_INFO_PLANE_OFFSET (info, i);
+ config->plane_strides[i] = GST_VIDEO_INFO_PLANE_STRIDE (info, i);
+ }
+ }
+
+ n_planes = GST_VIDEO_INFO_N_PLANES (info);
+ if (n_planes < 1)
+ n_planes = 1;
+
+ /* Figure out what plane is the physically last one. Typically
+ * this is the last plane in the list (= at index n_planes-1).
+ * However, this is not guaranteed, so we have to scan the offsets
+ * to find the last plane. */
+ last_plane_offset = 0;
+ last_plane = 0;
+ for (i = 0; i < n_planes; ++i) {
+ gsize plane_offset = GST_VIDEO_INFO_PLANE_OFFSET (info, i);
+ if (plane_offset >= last_plane_offset) {
+ last_plane = i;
+ last_plane_offset = plane_offset;
+ }
+ }
+
+ last_plane_size =
+ GST_VIDEO_INFO_PLANE_STRIDE (info,
+ last_plane) * GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (info->finfo,
+ last_plane, config->height);
+
+ GST_VIDEO_INFO_SIZE (info) = last_plane_offset + last_plane_size;
+
+ GST_DEBUG ("last plane #%u: offset: %" G_GSIZE_FORMAT " size: %"
+ G_GSIZE_FORMAT " => frame size minus extra padding: %" G_GSIZE_FORMAT,
+ last_plane, last_plane_offset, last_plane_size,
+ GST_VIDEO_INFO_SIZE (info));
+}
diff --git a/gst/rawparse/gstrawvideoparse.h b/gst/rawparse/gstrawvideoparse.h
new file mode 100644
index 0000000..32605a6
--- /dev/null
+++ b/gst/rawparse/gstrawvideoparse.h
@@ -0,0 +1,118 @@
+/* GStreamer
+ * Copyright (C) <2016> Carlos Rafael Giani <dv at pseudoterminal 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.
+ */
+
+#ifndef __GST_RAW_VIDEO_PARSE_H__
+#define __GST_RAW_VIDEO_PARSE_H__
+
+#include <gst/gst.h>
+#include <gst/video/video.h>
+#include "gstrawbaseparse.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_RAW_VIDEO_PARSE \
+ (gst_raw_video_parse_get_type())
+#define GST_RAW_VIDEO_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_RAW_VIDEO_PARSE, GstRawVideoParse))
+#define GST_RAW_VIDEO_PARSE_CAST(obj) \
+ ((GstRawVideoParse *)(obj))
+#define GST_RAW_VIDEO_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_RAW_VIDEO_PARSE, GstRawVideoParseClass))
+#define GST_IS_RAW_VIDEO_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_RAW_VIDEO_PARSE))
+#define GST_IS_RAW_VIDEO_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_RAW_VIDEO_PARSE))
+
+
+typedef struct _GstRawVideoParseConfig GstRawVideoParseConfig;
+typedef struct _GstRawVideoParse GstRawVideoParse;
+typedef struct _GstRawVideoParseClass GstRawVideoParseClass;
+
+
+/* Contains information about the video frame format. */
+struct _GstRawVideoParseConfig
+{
+ /* If TRUE, then this configuration is ready to use */
+ gboolean ready;
+
+ /* FIXME: These values should not be necessary, since there's
+ * GstVideoInfo. However, setting these values in the video
+ * info independently is currently difficult. For example,
+ * setting the video format requires the gst_video_info_set_format()
+ * function, but this function also overwrites plane strides
+ * and offsets. */
+ gint width, height;
+ GstVideoFormat format;
+ gint pixel_aspect_ratio_n, pixel_aspect_ratio_d;
+ gint framerate_n, framerate_d;
+ gboolean interlaced;
+ gsize plane_offsets[GST_VIDEO_MAX_PLANES];
+ gint plane_strides[GST_VIDEO_MAX_PLANES];
+
+ /* If TRUE, then TFF flags are added to outgoing buffers and
+ * their video metadata */
+ gboolean top_field_first;
+
+ /* Distance between the start of each frame, in bytes. If this value
+ * is larger than the actual size of a frame, then the extra bytes
+ * are skipped. For example, with frames that have 115200 bytes, a
+ * frame_stride value of 120000 means that 4800 trailing bytes are
+ * skipped after the 115200 frame bytes. This is useful to skip
+ * metadata in between frames. */
+ guint frame_stride;
+
+ GstVideoInfo info;
+
+ gboolean custom_plane_strides;
+};
+
+
+struct _GstRawVideoParse
+{
+ GstRawBaseParse parent;
+
+ /*< private > */
+
+ /* Configuration controlled by the object properties. Its ready value
+ * is set to TRUE from the start, so it can be used right away.
+ */
+ GstRawVideoParseConfig properties_config;
+ /* Configuration controlled by the sink caps. Its ready value is
+ * initially set to FALSE until valid sink caps come in. It is set to
+ * FALSE again when the stream-start event is observed.
+ */
+ GstRawVideoParseConfig sink_caps_config;
+ /* Currently active configuration. Points either to properties_config
+ * or to sink_caps_config. This is never NULL. */
+ GstRawVideoParseConfig *current_config;
+};
+
+
+struct _GstRawVideoParseClass
+{
+ GstRawBaseParseClass parent_class;
+};
+
+
+GType gst_raw_video_parse_get_type (void);
+
+
+G_END_DECLS
+
+#endif
diff --git a/gst/rawparse/gstunalignedaudioparse.c b/gst/rawparse/gstunalignedaudioparse.c
new file mode 100644
index 0000000..8847e1f
--- /dev/null
+++ b/gst/rawparse/gstunalignedaudioparse.c
@@ -0,0 +1,125 @@
+/* GStreamer
+ * Copyright (C) 2016 Carlos Rafael Giani <dv@pseudoterminal.org>
+ *
+ * gstunalignedaudioparse.c:
+ *
+ * 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 <string.h>
+#include <stdio.h>
+#include <gst/gst.h>
+#include <gst/audio/audio.h>
+#include "gstunalignedaudioparse.h"
+#include "unalignedaudio.h"
+
+
+GST_DEBUG_CATEGORY (unaligned_audio_parse_debug);
+#define GST_CAT_DEFAULT unaligned_audio_parse_debug
+
+
+struct _GstUnalignedAudioParse
+{
+ GstBin parent;
+ GstElement *inner_parser;
+};
+
+
+struct _GstUnalignedAudioParseClass
+{
+ GstBinClass parent_class;
+};
+
+
+static GstStaticPadTemplate static_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_UNALIGNED_RAW_AUDIO_CAPS)
+ );
+
+
+static GstStaticPadTemplate static_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_AUDIO_CAPS_MAKE (GST_AUDIO_FORMATS_ALL)
+ ", layout = (string) { interleaved, non-interleaved }")
+ );
+
+
+
+
+G_DEFINE_TYPE (GstUnalignedAudioParse, gst_unaligned_audio_parse, GST_TYPE_BIN);
+
+
+static void
+gst_unaligned_audio_parse_class_init (GstUnalignedAudioParseClass * klass)
+{
+ GstElementClass *element_class;
+
+ GST_DEBUG_CATEGORY_INIT (unaligned_audio_parse_debug, "unalignedaudioparse",
+ 0, "Unaligned raw audio parser");
+
+ element_class = GST_ELEMENT_CLASS (klass);
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&static_sink_template));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&static_src_template));
+
+ gst_element_class_set_static_metadata (element_class,
+ "unalignedaudioparse",
+ "Codec/Parser/Bin/Audio",
+ "Parse unaligned raw audio data",
+ "Carlos Rafael Giani <dv@pseudoterminal.org>");
+}
+
+
+static void
+gst_unaligned_audio_parse_init (GstUnalignedAudioParse * unaligned_audio_parse)
+{
+ GstPad *inner_pad;
+ GstPad *ghostpad;
+
+ unaligned_audio_parse->inner_parser =
+ gst_element_factory_make ("rawaudioparse", "inner_parser");
+ g_assert (unaligned_audio_parse->inner_parser != NULL);
+
+ g_object_set (G_OBJECT (unaligned_audio_parse->inner_parser),
+ "use-sink-caps", TRUE, NULL);
+
+ gst_bin_add (GST_BIN (unaligned_audio_parse),
+ unaligned_audio_parse->inner_parser);
+
+ inner_pad =
+ gst_element_get_static_pad (unaligned_audio_parse->inner_parser, "sink");
+ ghostpad =
+ gst_ghost_pad_new_from_template ("sink", inner_pad,
+ gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS
+ (unaligned_audio_parse), "sink"));
+ gst_element_add_pad (GST_ELEMENT (unaligned_audio_parse), ghostpad);
+ gst_object_unref (GST_OBJECT (inner_pad));
+
+ inner_pad = gst_element_get_static_pad (unaligned_audio_parse->inner_parser,
+ "src");
+ ghostpad =
+ gst_ghost_pad_new_from_template ("src", inner_pad,
+ gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS
+ (unaligned_audio_parse), "src"));
+ gst_element_add_pad (GST_ELEMENT (unaligned_audio_parse), ghostpad);
+ gst_object_unref (GST_OBJECT (inner_pad));
+}
diff --git a/gst/rawparse/gstunalignedaudioparse.h b/gst/rawparse/gstunalignedaudioparse.h
new file mode 100644
index 0000000..a07bee7
--- /dev/null
+++ b/gst/rawparse/gstunalignedaudioparse.h
@@ -0,0 +1,49 @@
+/* GStreamer
+ * Copyright (C) 2016 Carlos Rafael Giani <dv@pseudoterminal.org>
+ *
+ * gstunalignedaudioparse.h:
+ *
+ * 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_UNALIGNED_AUDIO_PARSE_H___
+#define __GST_UNALIGNED_AUDIO_PARSE_H___
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_UNALIGNED_AUDIO_PARSE \
+ (gst_unaligned_audio_parse_get_type())
+#define GST_UNALIGNED_AUDIO_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_UNALIGNED_AUDIO_PARSE, GstUnalignedAudioParse))
+#define GST_UNALIGNED_AUDIO_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_UNALIGNED_AUDIO_PARSE, GstUnalignedAudioParseClass))
+#define GST_UNALIGNED_AUDIO_PARSE_CAST(obj) \
+ ((GstUnalignedAudioParse *)(obj))
+#define GST_IS_UNALIGNED_AUDIO_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_UNALIGNED_AUDIO_PARSE))
+#define GST_IS_UNALIGNED_AUDIO_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_UNALIGNED_AUDIO_PARSE))
+
+typedef struct _GstUnalignedAudioParse GstUnalignedAudioParse;
+typedef struct _GstUnalignedAudioParseClass GstUnalignedAudioParseClass;
+
+GType gst_unaligned_audio_parse_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_UNALIGNED_AUDIO_PARSE_H___ */
diff --git a/gst/rawparse/gstunalignedvideoparse.c b/gst/rawparse/gstunalignedvideoparse.c
new file mode 100644
index 0000000..d6e8cf3
--- /dev/null
+++ b/gst/rawparse/gstunalignedvideoparse.c
@@ -0,0 +1,124 @@
+/* GStreamer
+ * Copyright (C) 2016 Carlos Rafael Giani <dv@pseudoterminal.org>
+ *
+ * gstunalignedvideoparse.c:
+ *
+ * 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 <string.h>
+#include <stdio.h>
+#include <gst/gst.h>
+#include <gst/video/video.h>
+#include "gstunalignedvideoparse.h"
+#include "unalignedvideo.h"
+
+
+GST_DEBUG_CATEGORY (unaligned_video_parse_debug);
+#define GST_CAT_DEFAULT unaligned_video_parse_debug
+
+
+struct _GstUnalignedVideoParse
+{
+ GstBin parent;
+ GstElement *inner_parser;
+};
+
+
+struct _GstUnalignedVideoParseClass
+{
+ GstBinClass parent_class;
+};
+
+
+static GstStaticPadTemplate static_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_UNALIGNED_RAW_VIDEO_CAPS)
+ );
+
+
+static GstStaticPadTemplate static_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (GST_VIDEO_FORMATS_ALL))
+ );
+
+
+
+
+G_DEFINE_TYPE (GstUnalignedVideoParse, gst_unaligned_video_parse, GST_TYPE_BIN);
+
+
+static void
+gst_unaligned_video_parse_class_init (GstUnalignedVideoParseClass * klass)
+{
+ GstElementClass *element_class;
+
+ GST_DEBUG_CATEGORY_INIT (unaligned_video_parse_debug, "unalignedvideoparse",
+ 0, "Unaligned raw video parser");
+
+ element_class = GST_ELEMENT_CLASS (klass);
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&static_sink_template));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&static_src_template));
+
+ gst_element_class_set_static_metadata (element_class,
+ "unalignedvideoparse",
+ "Codec/Parser/Bin/Video",
+ "Parse unaligned raw video data",
+ "Carlos Rafael Giani <dv@pseudoterminal.org>");
+}
+
+
+static void
+gst_unaligned_video_parse_init (GstUnalignedVideoParse * unaligned_video_parse)
+{
+ GstPad *inner_pad;
+ GstPad *ghostpad;
+
+ unaligned_video_parse->inner_parser =
+ gst_element_factory_make ("rawvideoparse", "inner_parser");
+ g_assert (unaligned_video_parse->inner_parser != NULL);
+
+ g_object_set (G_OBJECT (unaligned_video_parse->inner_parser),
+ "use-sink-caps", TRUE, NULL);
+
+ gst_bin_add (GST_BIN (unaligned_video_parse),
+ unaligned_video_parse->inner_parser);
+
+ inner_pad =
+ gst_element_get_static_pad (unaligned_video_parse->inner_parser, "sink");
+ ghostpad =
+ gst_ghost_pad_new_from_template ("sink", inner_pad,
+ gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS
+ (unaligned_video_parse), "sink"));
+ gst_element_add_pad (GST_ELEMENT (unaligned_video_parse), ghostpad);
+ gst_object_unref (GST_OBJECT (inner_pad));
+
+ inner_pad = gst_element_get_static_pad (unaligned_video_parse->inner_parser,
+ "src");
+ ghostpad =
+ gst_ghost_pad_new_from_template ("src", inner_pad,
+ gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS
+ (unaligned_video_parse), "src"));
+ gst_element_add_pad (GST_ELEMENT (unaligned_video_parse), ghostpad);
+ gst_object_unref (GST_OBJECT (inner_pad));
+}
diff --git a/gst/rawparse/gstunalignedvideoparse.h b/gst/rawparse/gstunalignedvideoparse.h
new file mode 100644
index 0000000..da40ac9
--- /dev/null
+++ b/gst/rawparse/gstunalignedvideoparse.h
@@ -0,0 +1,49 @@
+/* GStreamer
+ * Copyright (C) 2016 Carlos Rafael Giani <dv@pseudoterminal.org>
+ *
+ * gstunalignedvideoparse.h:
+ *
+ * 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_UNALIGNED_VIDEO_PARSE_H___
+#define __GST_UNALIGNED_VIDEO_PARSE_H___
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_UNALIGNED_VIDEO_PARSE \
+ (gst_unaligned_video_parse_get_type())
+#define GST_UNALIGNED_VIDEO_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_UNALIGNED_VIDEO_PARSE, GstUnalignedVideoParse))
+#define GST_UNALIGNED_VIDEO_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_UNALIGNED_VIDEO_PARSE, GstUnalignedVideoParseClass))
+#define GST_UNALIGNED_VIDEO_PARSE_CAST(obj) \
+ ((GstUnalignedVideoParse *)(obj))
+#define GST_IS_UNALIGNED_VIDEO_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_UNALIGNED_VIDEO_PARSE))
+#define GST_IS_UNALIGNED_VIDEO_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_UNALIGNED_VIDEO_PARSE))
+
+typedef struct _GstUnalignedVideoParse GstUnalignedVideoParse;
+typedef struct _GstUnalignedVideoParseClass GstUnalignedVideoParseClass;
+
+GType gst_unaligned_video_parse_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_UNALIGNED_VIDEO_PARSE_H___ */
diff --git a/gst/rawparse/gstvideoparse.c b/gst/rawparse/gstvideoparse.c
index 7b5e037..cf5c48e 100644
--- a/gst/rawparse/gstvideoparse.c
+++ b/gst/rawparse/gstvideoparse.c
@@ -23,28 +23,47 @@
* SECTION:element-videoparse
*
* Converts a byte stream into video frames.
+ *
+ * <note>This element is deprecated. Use #GstRawVideoParse instead.</note>
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
+/* FIXME 0.11: suppress warnings for deprecated API such as g_value_array stuff
+ * for now with newer GLib versions (>= 2.31.0) */
+#define GLIB_DISABLE_DEPRECATION_WARNINGS
+
+#include <gst/gst.h>
+#include <gst/audio/audio.h>
#include "gstvideoparse.h"
+#include "gstrawvideoparse.h"
+
+
+static GstStaticPadTemplate static_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+
+static GstStaticPadTemplate static_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("video/x-raw")
+ );
+
static void gst_video_parse_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_video_parse_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
-static GstCaps *gst_video_parse_get_caps (GstRawParse * rp);
-static void gst_video_parse_pre_push_buffer (GstRawParse * rp,
- GstBuffer * buffer);
-static void gst_video_parse_decide_allocation (GstRawParse * rp,
- GstQuery * query);
-
-static void gst_video_parse_update_info (GstVideoParse * vp);
-static gboolean gst_video_parse_deserialize_int_array (const gchar * str,
- gint * dest, guint n_values);
+static GValueArray *gst_video_parse_int_valarray_from_string (const gchar *
+ str);
+static gchar *gst_video_parse_int_valarray_to_string (GValueArray * valarray);
GST_DEBUG_CATEGORY_STATIC (gst_video_parse_debug);
#define GST_CAT_DEFAULT gst_video_parse_debug
@@ -65,23 +84,17 @@
};
#define gst_video_parse_parent_class parent_class
-G_DEFINE_TYPE (GstVideoParse, gst_video_parse, GST_TYPE_RAW_PARSE);
+G_DEFINE_TYPE (GstVideoParse, gst_video_parse, GST_TYPE_BIN);
static void
gst_video_parse_class_init (GstVideoParseClass * klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
- GstRawParseClass *rp_class = GST_RAW_PARSE_CLASS (klass);
- GstCaps *caps;
gobject_class->set_property = gst_video_parse_set_property;
gobject_class->get_property = gst_video_parse_get_property;
- rp_class->get_caps = gst_video_parse_get_caps;
- rp_class->pre_push_buffer = gst_video_parse_pre_push_buffer;
- rp_class->decide_allocation = gst_video_parse_decide_allocation;
-
g_object_class_install_property (gobject_class, PROP_FORMAT,
g_param_spec_enum ("format", "Format", "Format of images in raw stream",
GST_TYPE_VIDEO_FORMAT, GST_VIDEO_FORMAT_I420,
@@ -123,15 +136,14 @@
gst_element_class_set_static_metadata (gstelement_class, "Video Parse",
"Filter/Video",
- "Converts stream into video frames",
+ "Converts stream into video frames (deprecated: use rawvideoparse instead)",
"David Schleef <ds@schleef.org>, "
"Sebastian Dröge <sebastian.droege@collabora.co.uk>");
- caps = gst_caps_from_string ("video/x-raw; video/x-bayer");
-
- gst_raw_parse_class_set_src_pad_template (rp_class, caps);
- gst_raw_parse_class_set_multiple_frames_per_buffer (rp_class, FALSE);
- gst_caps_unref (caps);
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&static_sink_template));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&static_src_template));
GST_DEBUG_CATEGORY_INIT (gst_video_parse_debug, "videoparse", 0,
"videoparse element");
@@ -140,14 +152,28 @@
static void
gst_video_parse_init (GstVideoParse * vp)
{
- vp->width = 320;
- vp->height = 240;
- vp->format = GST_VIDEO_FORMAT_I420;
- vp->par_n = 1;
- vp->par_d = 1;
+ GstPad *inner_pad;
+ GstPad *ghostpad;
- gst_raw_parse_set_fps (GST_RAW_PARSE (vp), 25, 1);
- gst_video_parse_update_info (vp);
+ vp->rawvideoparse =
+ gst_element_factory_make ("rawvideoparse", "inner_rawvideoparse");
+ g_assert (vp->rawvideoparse != NULL);
+
+ gst_bin_add (GST_BIN (vp), vp->rawvideoparse);
+
+ inner_pad = gst_element_get_static_pad (vp->rawvideoparse, "sink");
+ ghostpad =
+ gst_ghost_pad_new_from_template ("sink", inner_pad,
+ gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (vp), "sink"));
+ gst_element_add_pad (GST_ELEMENT (vp), ghostpad);
+ gst_object_unref (GST_OBJECT (inner_pad));
+
+ inner_pad = gst_element_get_static_pad (vp->rawvideoparse, "src");
+ ghostpad =
+ gst_ghost_pad_new_from_template ("src", inner_pad,
+ gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (vp), "src"));
+ gst_element_add_pad (GST_ELEMENT (vp), ghostpad);
+ gst_object_unref (GST_OBJECT (inner_pad));
}
static void
@@ -156,62 +182,83 @@
{
GstVideoParse *vp = GST_VIDEO_PARSE (object);
- g_return_if_fail (!gst_raw_parse_is_negotiated (GST_RAW_PARSE (vp)));
-
switch (prop_id) {
case PROP_FORMAT:
- vp->format = g_value_get_enum (value);
+ g_object_set (G_OBJECT (vp->rawvideoparse), "format",
+ g_value_get_enum (value), NULL);
break;
+
case PROP_WIDTH:
- vp->width = g_value_get_int (value);
+ g_object_set (G_OBJECT (vp->rawvideoparse), "width",
+ g_value_get_int (value), NULL);
break;
+
case PROP_HEIGHT:
- vp->height = g_value_get_int (value);
+ g_object_set (G_OBJECT (vp->rawvideoparse), "height",
+ g_value_get_int (value), NULL);
break;
+
case PROP_FRAMERATE:
- gst_raw_parse_set_fps (GST_RAW_PARSE (vp),
+ g_object_set (G_OBJECT (vp->rawvideoparse), "framerate",
gst_value_get_fraction_numerator (value),
- gst_value_get_fraction_denominator (value));
+ gst_value_get_fraction_denominator (value), NULL);
break;
+
case PROP_PAR:
- vp->par_n = gst_value_get_fraction_numerator (value);
- vp->par_d = gst_value_get_fraction_denominator (value);
+ g_object_set (G_OBJECT (vp->rawvideoparse), "pixel-aspect-ratio",
+ gst_value_get_fraction_numerator (value),
+ gst_value_get_fraction_denominator (value), NULL);
break;
+
case PROP_INTERLACED:
- vp->interlaced = g_value_get_boolean (value);
+ g_object_set (G_OBJECT (vp->rawvideoparse), "interlaced",
+ g_value_get_boolean (value), NULL);
break;
+
case PROP_TOP_FIELD_FIRST:
- vp->top_field_first = g_value_get_boolean (value);
+ g_object_set (G_OBJECT (vp->rawvideoparse), "top-field-first",
+ g_value_get_boolean (value), NULL);
break;
- case PROP_STRIDES:
- if (gst_video_parse_deserialize_int_array (g_value_get_string (value),
- vp->stride, GST_VIDEO_MAX_PLANES)) {
- vp->stride_set = TRUE;
+
+ case PROP_STRIDES:{
+ GValueArray *valarray =
+ gst_video_parse_int_valarray_from_string (g_value_get_string (value));
+
+ if (valarray != NULL) {
+ g_object_set (G_OBJECT (vp->rawvideoparse), "plane-strides",
+ valarray, NULL);
+ g_value_array_free (valarray);
} else {
GST_WARNING_OBJECT (vp, "failed to deserialize given strides");
- vp->stride_set = FALSE;
}
break;
- case PROP_OFFSETS:
- if (gst_video_parse_deserialize_int_array (g_value_get_string (value),
- vp->offset, GST_VIDEO_MAX_PLANES)) {
- vp->offset_set = TRUE;
+ }
+
+ case PROP_OFFSETS:{
+ GValueArray *valarray =
+ gst_video_parse_int_valarray_from_string (g_value_get_string (value));
+
+ if (valarray != NULL) {
+ g_object_set (G_OBJECT (vp->rawvideoparse), "plane-offsets",
+ valarray, NULL);
+ g_value_array_free (valarray);
} else {
- GST_WARNING_OBJECT (vp, "failed to deserialized given offsets");
- vp->offset_set = FALSE;
+ GST_WARNING_OBJECT (vp, "failed to deserialize given offsets");
}
break;
+ }
+
case PROP_FRAMESIZE:
- vp->framesize = g_value_get_uint (value);
+ g_object_set (G_OBJECT (vp->rawvideoparse), "frame-stride",
+ g_value_get_uint (value), NULL);
break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
-
- gst_video_parse_update_info (vp);
}
static void
@@ -221,377 +268,155 @@
GstVideoParse *vp = GST_VIDEO_PARSE (object);
switch (prop_id) {
- case PROP_FORMAT:
- g_value_set_enum (value, vp->format);
+ case PROP_FORMAT:{
+ GstVideoFormat format;
+ g_object_get (G_OBJECT (vp->rawvideoparse), "format", &format, NULL);
+ g_value_set_enum (value, format);
break;
- case PROP_WIDTH:
- g_value_set_int (value, vp->width);
+ }
+
+ case PROP_WIDTH:{
+ gint width;
+ g_object_get (G_OBJECT (vp->rawvideoparse), "width", &width, NULL);
+ g_value_set_int (value, width);
break;
- case PROP_HEIGHT:
- g_value_set_int (value, vp->height);
+ }
+
+ case PROP_HEIGHT:{
+ gint height;
+ g_object_get (G_OBJECT (vp->rawvideoparse), "height", &height, NULL);
+ g_value_set_int (value, height);
break;
+ }
+
case PROP_FRAMERATE:{
gint fps_n, fps_d;
-
- gst_raw_parse_get_fps (GST_RAW_PARSE (vp), &fps_n, &fps_d);
+ g_object_get (G_OBJECT (vp->rawvideoparse), "framerate", &fps_n, &fps_d,
+ NULL);
gst_value_set_fraction (value, fps_n, fps_d);
break;
}
- case PROP_PAR:
- gst_value_set_fraction (value, vp->par_n, vp->par_d);
- break;
- case PROP_INTERLACED:
- g_value_set_boolean (value, vp->interlaced);
- break;
- case PROP_TOP_FIELD_FIRST:
- g_value_set_boolean (value, vp->top_field_first);
- break;
- case PROP_STRIDES:
- {
- gchar *tmp;
- tmp = g_strdup_printf ("%d,%d,%d,%d", vp->info.stride[0],
- vp->info.stride[1], vp->info.stride[2], vp->info.stride[3]);
- g_value_set_string (value, tmp);
- g_free (tmp);
+ case PROP_PAR:{
+ gint par_n, par_d;
+ g_object_get (G_OBJECT (vp->rawvideoparse), "pixel-aspect-ratio", &par_n,
+ &par_d, NULL);
+ gst_value_set_fraction (value, par_n, par_d);
break;
}
- case PROP_OFFSETS:
- {
- gchar *tmp;
- tmp = g_strdup_printf ("%" G_GSIZE_FORMAT ",%" G_GSIZE_FORMAT
- ",%" G_GSIZE_FORMAT ",%" G_GSIZE_FORMAT, vp->info.offset[0],
- vp->info.offset[1], vp->info.offset[2], vp->info.offset[3]);
- g_value_set_string (value, tmp);
- g_free (tmp);
+ case PROP_INTERLACED:{
+ gboolean interlaced;
+ g_object_get (G_OBJECT (vp->rawvideoparse), "interlaced", &interlaced,
+ NULL);
+ g_value_set_boolean (value, interlaced);
break;
}
- case PROP_FRAMESIZE:
- g_value_set_uint (value, vp->info.size);
+
+ case PROP_TOP_FIELD_FIRST:{
+ gboolean top_field_first;
+ g_object_get (G_OBJECT (vp->rawvideoparse), "top-field-first",
+ &top_field_first, NULL);
+ g_value_set_boolean (value, top_field_first);
break;
+ }
+
+ case PROP_STRIDES:{
+ GValueArray *array;
+ g_object_get (G_OBJECT (vp->rawvideoparse), "plane-strides", &array,
+ NULL);
+ g_value_take_string (value,
+ gst_video_parse_int_valarray_to_string (array));
+ break;
+ }
+
+ case PROP_OFFSETS:{
+ GValueArray *array;
+ g_object_get (G_OBJECT (vp->rawvideoparse), "plane-offsets", &array,
+ NULL);
+ g_value_take_string (value,
+ gst_video_parse_int_valarray_to_string (array));
+ break;
+ }
+
+ case PROP_FRAMESIZE:{
+ guint frame_stride;
+ g_object_get (G_OBJECT (vp->rawvideoparse), "frame-stride", &frame_stride,
+ NULL);
+ g_value_set_uint (value, frame_stride);
+ break;
+ }
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
-static gboolean
-gst_video_parse_deserialize_int_array (const gchar * str, gint * dest,
- guint n_values)
+static GValueArray *
+gst_video_parse_int_valarray_from_string (const gchar * str)
{
gchar **strv;
guint length;
guint i;
+ GValueArray *valarray;
+ GValue gvalue = G_VALUE_INIT;
- strv = g_strsplit (str, ",", n_values);
+ if (str == NULL)
+ return NULL;
+
+ strv = g_strsplit (str, ",", GST_VIDEO_MAX_PLANES);
if (strv == NULL)
- return FALSE;
+ return NULL;
length = g_strv_length (strv);
+ valarray = g_value_array_new (length);
+ g_value_init (&gvalue, G_TYPE_UINT);
for (i = 0; i < length; i++) {
gint64 val;
val = g_ascii_strtoll (strv[i], NULL, 10);
if (val < G_MININT || val > G_MAXINT) {
- g_strfreev (strv);
- return FALSE;
+ goto error;
}
- dest[i] = val;
+ g_value_set_uint (&gvalue, val);
+ g_value_array_insert (valarray, i, &gvalue);
}
- /* fill remaining values with 0 */
- for (i = length; i < n_values; i++)
- dest[i] = 0;
-
+finish:
g_strfreev (strv);
+ return valarray;
- return TRUE;
+error:
+ g_value_array_free (valarray);
+ valarray = NULL;
+ goto finish;
}
-static inline gsize
-gst_video_parse_get_plane_size (GstVideoInfo * info, guint plane)
+static gchar *
+gst_video_parse_int_valarray_to_string (GValueArray * valarray)
{
- gsize size = 0;
-
- if (GST_VIDEO_FORMAT_INFO_IS_TILED (info->finfo)) {
- gint tile_width, tile_height, x_tiles, y_tiles;
-
- tile_width = 1 << GST_VIDEO_FORMAT_INFO_TILE_WS (info->finfo);
- tile_height = 1 << GST_VIDEO_FORMAT_INFO_TILE_HS (info->finfo);
- x_tiles = GST_VIDEO_TILE_X_TILES (info->stride[plane]);
- y_tiles = GST_VIDEO_TILE_Y_TILES (info->stride[plane]);
-
- /* plane size is the size of one tile multiplied by the number of tiles */
- size = tile_width * tile_height * x_tiles * y_tiles;
- } else {
- size = info->stride[plane] *
- GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (info->finfo, plane, info->height);
- }
-
- return size;
-}
-
-
-static gboolean
-gst_video_parse_update_stride (GstVideoParse * vp)
-{
- GstVideoInfo *info = &vp->info;
+ /* holds a 64-bit number as string, which can have max. 20 digits
+ * (with extra char for nullbyte) */
+ gchar stride_str[21];
+ gchar *str = NULL;
guint i;
- /* 1. check that provided strides are greater than the default ones */
- for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) {
- if (GST_VIDEO_FORMAT_INFO_IS_TILED (info->finfo)) {
- /* for tiled format, make sure there is more tiles than default */
- gint default_x_tiles, default_y_tiles, x_tiles, y_tiles;
+ for (i = 0; i < valarray->n_values; i++) {
+ GValue *gvalue = g_value_array_get_nth (valarray, i);
+ guint val = g_value_get_uint (gvalue);
+ g_snprintf (stride_str, sizeof (stride_str), "%u", val);
- x_tiles = GST_VIDEO_TILE_X_TILES (vp->stride[i]);
- y_tiles = GST_VIDEO_TILE_Y_TILES (vp->stride[i]);
- default_x_tiles = GST_VIDEO_TILE_X_TILES (info->stride[i]);
- default_y_tiles = GST_VIDEO_TILE_Y_TILES (info->stride[i]);
-
- if (x_tiles < default_x_tiles) {
- GST_WARNING_OBJECT (vp,
- "x_tiles for plane %u is too small: got %d, min %d", i, x_tiles,
- default_x_tiles);
- return FALSE;
- }
-
- if (y_tiles < default_y_tiles) {
- GST_WARNING_OBJECT (vp,
- "y_tiles for plane %u is too small: got %d, min %d", i, y_tiles,
- default_y_tiles);
- return FALSE;
- }
+ if (str == NULL) {
+ str = g_strdup (stride_str);
} else {
- if (vp->stride[i] < info->stride[i]) {
- GST_WARNING_OBJECT (vp,
- "stride for plane %u is too small: got %d, min %d", i,
- vp->stride[i], info->stride[i]);
- return FALSE;
- }
+ gchar *new_str = g_strdup_printf ("%s,%s", str, stride_str);
+ g_free (str);
+ str = new_str;
}
}
- /* 2. update stride and plane offsets */
- for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) {
- if (vp->stride[i] != info->stride[i]) {
- info->stride[i] = vp->stride[i];
-
- if (i > 0) {
- /* update offset to reflect stride change for plane > 0 */
- info->offset[i] = info->offset[i - 1] +
- gst_video_parse_get_plane_size (info, i - 1);
- }
-
- vp->need_videometa = TRUE;
- }
- }
-
- return TRUE;
-}
-
-static gboolean
-gst_video_parse_update_offset (GstVideoParse * vp)
-{
- GstVideoInfo *info = &vp->info;
- guint i;
-
- /* 1. check that provided offsets are greaters than the default ones and are
- * consistent with plane size */
- for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) {
- gsize min_offset = info->offset[i];
-
- if (i > 0)
- min_offset = MAX (min_offset,
- vp->offset[i - 1] + gst_video_parse_get_plane_size (info, i - 1));
-
- if (vp->offset[i] < min_offset) {
- GST_WARNING_OBJECT (vp,
- "offset for plane %u is too small: got %d, min %" G_GSIZE_FORMAT, i,
- vp->offset[i], min_offset);
- return FALSE;
- }
- }
-
- /* 2. update offsets */
- for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) {
- if (vp->offset[i] != info->offset[i]) {
- info->offset[i] = vp->offset[i];
- vp->need_videometa = TRUE;
- }
- }
-
- return TRUE;
-}
-
-static void
-gst_video_parse_update_info (GstVideoParse * vp)
-{
- GstVideoInfo *info = &vp->info;
- gint fps_n, fps_d;
- gint framesize;
- guint i;
- gboolean update_size = FALSE;
-
- gst_raw_parse_get_fps (GST_RAW_PARSE (vp), &fps_n, &fps_d);
-
- gst_video_info_init (info);
- gst_video_info_set_format (info, vp->format, vp->width, vp->height);
- info->fps_n = fps_n;
- info->fps_d = fps_d;
- info->par_n = vp->par_n;
- info->par_d = vp->par_d;
- info->interlace_mode = vp->interlaced ?
- GST_VIDEO_INTERLACE_MODE_INTERLEAVED :
- GST_VIDEO_INTERLACE_MODE_PROGRESSIVE;
-
- vp->need_videometa = FALSE;
-
- if (vp->stride_set) {
- if (gst_video_parse_update_stride (vp))
- update_size = TRUE;
- else
- GST_WARNING_OBJECT (vp, "invalid strides set, use default ones");
- }
-
- if (vp->offset_set) {
- if (gst_video_parse_update_offset (vp))
- update_size = TRUE;
- else
- GST_WARNING_OBJECT (vp, "invalid offsets set, use default ones");
- }
-
- if (update_size) {
- framesize = 0;
-
- for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) {
- gint planesize = info->offset[i];
- planesize += gst_video_parse_get_plane_size (info, i);
-
- if (planesize > framesize)
- framesize = planesize;
- }
-
- info->size = framesize;
- }
-
- if (vp->framesize) {
- /* user requires a specific framesize, just make sure it's bigger than
- * the current one */
-
- if (vp->framesize > vp->info.size)
- vp->info.size = vp->framesize;
- else
- GST_WARNING_OBJECT (vp, "invalid framesize set: got %u, min: %"
- G_GSIZE_FORMAT, vp->framesize, vp->info.size);
- }
-
- GST_DEBUG_OBJECT (vp, "video info: %ux%u, format %s, size %" G_GSIZE_FORMAT
- ", stride {%d,%d,%d,%d}, offset {%" G_GSIZE_FORMAT ",%" G_GSIZE_FORMAT
- ",%" G_GSIZE_FORMAT ",%" G_GSIZE_FORMAT "}",
- GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info),
- GST_VIDEO_INFO_NAME (info), GST_VIDEO_INFO_SIZE (info),
- info->stride[0], info->stride[1], info->stride[2], info->stride[3],
- info->offset[0], info->offset[1], info->offset[2], info->offset[3]);
-
- /* update base class framesize */
- framesize = GST_VIDEO_INFO_SIZE (info);
- gst_raw_parse_set_framesize (GST_RAW_PARSE (vp), framesize);
-}
-
-static GstCaps *
-gst_video_parse_get_caps (GstRawParse * rp)
-{
- GstVideoParse *vp = GST_VIDEO_PARSE (rp);
-
- return gst_video_info_to_caps (&vp->info);
-}
-
-static gboolean
-gst_video_parse_copy_frame (GstVideoParse * vp, GstBuffer * dest,
- GstVideoInfo * dest_info, GstBuffer * src, GstVideoInfo * src_info)
-{
- GstVideoFrame src_frame;
- GstVideoFrame dest_frame;
- gboolean ret;
-
- if (!gst_video_frame_map (&src_frame, src_info, src, GST_MAP_READ)) {
- GST_ERROR_OBJECT (vp, "failed to map src frame");
- return FALSE;
- }
-
- if (!gst_video_frame_map (&dest_frame, dest_info, dest, GST_MAP_WRITE)) {
- GST_ERROR_OBJECT (vp, "failed to map dest frame");
- gst_video_frame_unmap (&src_frame);
- return FALSE;
- }
-
- ret = gst_video_frame_copy (&dest_frame, &src_frame);
-
- gst_video_frame_unmap (&src_frame);
- gst_video_frame_unmap (&dest_frame);
-
- return ret;
-}
-
-static void
-gst_video_parse_pre_push_buffer (GstRawParse * rp, GstBuffer * buffer)
-{
- GstVideoParse *vp = GST_VIDEO_PARSE (rp);
-
- if (vp->do_copy) {
- GstVideoInfo info;
- GstBuffer *outbuf;
-
- gst_video_info_init (&info);
- gst_video_info_set_format (&info, vp->format, vp->width, vp->height);
-
- GST_DEBUG_OBJECT (vp, "copying frame to remove padding");
-
- outbuf = gst_buffer_new_allocate (NULL, GST_VIDEO_INFO_SIZE (&info), NULL);
-
- if (!gst_video_parse_copy_frame (vp, outbuf, &info, buffer, &vp->info))
- GST_WARNING_OBJECT (vp, "failed to copy frame");
-
- gst_buffer_replace_all_memory (buffer, gst_buffer_get_all_memory (outbuf));
- gst_buffer_unref (outbuf);
- } else {
- GstVideoInfo *info = &vp->info;
- GstVideoFrameFlags flags = GST_VIDEO_FRAME_FLAG_NONE;
-
- if (vp->interlaced && vp->top_field_first)
- flags = GST_VIDEO_FRAME_FLAG_TFF;
-
- gst_buffer_add_video_meta_full (buffer, flags, GST_VIDEO_INFO_FORMAT (info),
- GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info),
- GST_VIDEO_INFO_N_PLANES (info), info->offset, info->stride);
- }
-
- if (vp->interlaced) {
- if (vp->top_field_first) {
- GST_BUFFER_FLAG_SET (buffer, GST_VIDEO_BUFFER_FLAG_TFF);
- } else {
- GST_BUFFER_FLAG_UNSET (buffer, GST_VIDEO_BUFFER_FLAG_TFF);
- }
- }
-}
-
-static void
-gst_video_parse_decide_allocation (GstRawParse * rp, GstQuery * query)
-{
- GstVideoParse *vp = GST_VIDEO_PARSE (rp);
- gboolean has_videometa;
-
- has_videometa = gst_query_find_allocation_meta (query,
- GST_VIDEO_META_API_TYPE, NULL);
-
- /* no need to copy if downstream supports videometa or if we don't need
- * them */
- if (has_videometa || !vp->need_videometa)
- return;
-
- vp->do_copy = TRUE;
+ return str;
}
diff --git a/gst/rawparse/gstvideoparse.h b/gst/rawparse/gstvideoparse.h
index dd540c5..c5d8d64 100644
--- a/gst/rawparse/gstvideoparse.h
+++ b/gst/rawparse/gstvideoparse.h
@@ -24,11 +24,6 @@
#define __GST_VIDEO_PARSE_H__
#include <gst/gst.h>
-#include <gst/base/gstbasetransform.h>
-#include <gst/base/gstadapter.h>
-#include <gst/video/video.h>
-
-#include "gstrawparse.h"
#define GST_TYPE_VIDEO_PARSE \
(gst_video_parse_get_type())
@@ -46,29 +41,13 @@
struct _GstVideoParse
{
- GstRawParse parent;
-
- GstVideoInfo info;
- gboolean do_copy;
- gboolean need_videometa;
- gboolean stride_set;
- gboolean offset_set;
-
- /* properties */
- GstVideoFormat format;
- gint width;
- gint height;
- gint par_n, par_d;
- gboolean interlaced;
- gboolean top_field_first;
- gint stride[GST_VIDEO_MAX_PLANES];
- gint offset[GST_VIDEO_MAX_PLANES];
- guint framesize;
+ GstBin parent;
+ GstElement *rawvideoparse;
};
struct _GstVideoParseClass
{
- GstRawParseClass parent_class;
+ GstBinClass parent_class;
};
diff --git a/gst/rawparse/plugin.c b/gst/rawparse/plugin.c
index dc860e1..72b3e49 100644
--- a/gst/rawparse/plugin.c
+++ b/gst/rawparse/plugin.c
@@ -3,6 +3,10 @@
#endif
#include <gst/gst.h>
+#include "gstrawaudioparse.h"
+#include "gstrawvideoparse.h"
+#include "gstunalignedaudioparse.h"
+#include "gstunalignedvideoparse.h"
#include "gstaudioparse.h"
#include "gstvideoparse.h"
@@ -15,6 +19,14 @@
gst_video_parse_get_type ());
ret &= gst_element_register (plugin, "audioparse", GST_RANK_NONE,
gst_audio_parse_get_type ());
+ ret &= gst_element_register (plugin, "unalignedaudioparse", GST_RANK_MARGINAL,
+ gst_unaligned_audio_parse_get_type ());
+ ret &= gst_element_register (plugin, "unalignedvideoparse", GST_RANK_MARGINAL,
+ gst_unaligned_video_parse_get_type ());
+ ret &= gst_element_register (plugin, "rawaudioparse", GST_RANK_NONE,
+ gst_raw_audio_parse_get_type ());
+ ret &= gst_element_register (plugin, "rawvideoparse", GST_RANK_NONE,
+ gst_raw_video_parse_get_type ());
return ret;
}
diff --git a/sys/applemedia-nonpublic/bufferfactory.h b/gst/rawparse/unalignedaudio.h
similarity index 61%
copy from sys/applemedia-nonpublic/bufferfactory.h
copy to gst/rawparse/unalignedaudio.h
index 132b953..15d4995 100644
--- a/sys/applemedia-nonpublic/bufferfactory.h
+++ b/gst/rawparse/unalignedaudio.h
@@ -1,5 +1,7 @@
-/*
- * Copyright (C) 2010 Ole André Vadla Ravnås <oleavr@soundrop.com>
+/* GStreamer
+ * Copyright (C) 2016 Carlos Rafael Giani <dv@pseudoterminal.org>
+ *
+ * unalignedaudio.h:
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -17,18 +19,17 @@
* Boston, MA 02110-1301, USA.
*/
-#import <Foundation/Foundation.h>
+#ifndef __GST_UNALIGNED_AUDIO_H__
+#define __GST_UNALIGNED_AUDIO_H__
#include <gst/gst.h>
+#include <gst/audio/audio.h>
-@interface GstAMBufferFactory : NSObject {
- gpointer coreMediaCtx;
-}
+#define GST_UNALIGNED_RAW_AUDIO_CAPS \
+ "audio/x-unaligned-raw" \
+ ", format = (string) " GST_AUDIO_FORMATS_ALL \
+ ", rate = (int) [ 1, MAX ]" \
+ ", channels = (int) [ 1, MAX ]" \
+ ", layout = (string) { interleaved, non-interleaved }"
-- (id)initWithError:(GError **)error;
-- (void)finalize;
-
-- (GstBuffer *)createGstBufferForCoreVideoBuffer:(CFTypeRef)cvbuf;
-- (GstBuffer *)createGstBufferForSampleBuffer:(CFTypeRef)sbuf;
-
-@end
+#endif /* __GST_UNALIGNED_AUDIO_H__ */
diff --git a/sys/applemedia-nonpublic/bufferfactory.h b/gst/rawparse/unalignedvideo.h
similarity index 61%
copy from sys/applemedia-nonpublic/bufferfactory.h
copy to gst/rawparse/unalignedvideo.h
index 132b953..a5c1005 100644
--- a/sys/applemedia-nonpublic/bufferfactory.h
+++ b/gst/rawparse/unalignedvideo.h
@@ -1,5 +1,7 @@
-/*
- * Copyright (C) 2010 Ole André Vadla Ravnås <oleavr@soundrop.com>
+/* GStreamer
+ * Copyright (C) 2016 Carlos Rafael Giani <dv@pseudoterminal.org>
+ *
+ * unalignedvideo.h:
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -17,18 +19,17 @@
* Boston, MA 02110-1301, USA.
*/
-#import <Foundation/Foundation.h>
+#ifndef __GST_UNALIGNED_VIDEO_H__
+#define __GST_UNALIGNED_VIDEO_H__
#include <gst/gst.h>
+#include <gst/video/video.h>
-@interface GstAMBufferFactory : NSObject {
- gpointer coreMediaCtx;
-}
+#define GST_UNALIGNED_RAW_VIDEO_CAPS \
+ "video/x-unaligned-raw" \
+ ", format = (string) " GST_VIDEO_FORMATS_ALL \
+ ", width = " GST_VIDEO_SIZE_RANGE \
+ ", height = " GST_VIDEO_SIZE_RANGE \
+ ", framerate = " GST_VIDEO_FPS_RANGE
-- (id)initWithError:(GError **)error;
-- (void)finalize;
-
-- (GstBuffer *)createGstBufferForCoreVideoBuffer:(CFTypeRef)cvbuf;
-- (GstBuffer *)createGstBufferForSampleBuffer:(CFTypeRef)sbuf;
-
-@end
+#endif /* __GST_UNALIGNED_VIDEO_H__ */
diff --git a/gst/removesilence/Makefile.in b/gst/removesilence/Makefile.in
index 8ea401d..316ae84 100644
--- a/gst/removesilence/Makefile.in
+++ b/gst/removesilence/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/removesilence/gstremovesilence.c b/gst/removesilence/gstremovesilence.c
index 7707817..98456ff 100644
--- a/gst/removesilence/gstremovesilence.c
+++ b/gst/removesilence/gstremovesilence.c
@@ -128,10 +128,8 @@
"Tiago Katcipis <tiagokatcipis@gmail.com>\n \
Paulo Pizarro <paulo.pizarro@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));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_template);
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_template);
GST_BASE_TRANSFORM_CLASS (klass)->transform_ip =
GST_DEBUG_FUNCPTR (gst_remove_silence_transform_ip);
diff --git a/gst/sdi/Makefile.in b/gst/sdi/Makefile.in
index 025e857..bfbf9d7 100644
--- a/gst/sdi/Makefile.in
+++ b/gst/sdi/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/sdi/gstsdidemux.c b/gst/sdi/gstsdidemux.c
index 9de97a9..70184f4 100644
--- a/gst/sdi/gstsdidemux.c
+++ b/gst/sdi/gstsdidemux.c
@@ -105,10 +105,10 @@
{
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_sdi_demux_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_sdi_demux_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_sdi_demux_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_sdi_demux_sink_template);
gst_element_class_set_static_metadata (element_class,
"SDI Demuxer",
diff --git a/gst/sdi/gstsdimux.c b/gst/sdi/gstsdimux.c
index b9f4159..7734bad 100644
--- a/gst/sdi/gstsdimux.c
+++ b/gst/sdi/gstsdimux.c
@@ -108,10 +108,10 @@
{
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_sdi_mux_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_sdi_mux_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_sdi_mux_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_sdi_mux_sink_template);
gst_element_class_set_static_metadata (element_class, "SDI Muxer",
"Muxer",
diff --git a/gst/sdp/Makefile.am b/gst/sdp/Makefile.am
index 395b857..ce14d50 100644
--- a/gst/sdp/Makefile.am
+++ b/gst/sdp/Makefile.am
@@ -1,12 +1,13 @@
plugin_LTLIBRARIES = libgstsdpelem.la
-libgstsdpelem_la_SOURCES = gstsdpelem.c gstsdpdemux.h gstsdpdemux.c
+libgstsdpelem_la_SOURCES = gstsdpelem.c gstsdpsrc.c gstsdpdemux.c
libgstsdpelem_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(GIO_CFLAGS)
libgstsdpelem_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GIO_LIBS) \
-lgstrtp-@GST_API_VERSION@ -lgstsdp-@GST_API_VERSION@ \
+ -lgstapp-@GST_API_VERSION@ \
$(GST_LIBS) $(WINSOCK2_LIBS)
libgstsdpelem_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
libgstsdpelem_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
-noinst_HEADERS = gstsdpdemux.h
+noinst_HEADERS = gstsdpdemux.h gstsdpsrc.h
diff --git a/gst/sdp/Makefile.in b/gst/sdp/Makefile.in
index 087a85b..e908697 100644
--- a/gst/sdp/Makefile.in
+++ b/gst/sdp/Makefile.in
@@ -167,7 +167,7 @@
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
am_libgstsdpelem_la_OBJECTS = libgstsdpelem_la-gstsdpelem.lo \
- libgstsdpelem_la-gstsdpdemux.lo
+ libgstsdpelem_la-gstsdpsrc.lo libgstsdpelem_la-gstsdpdemux.lo
libgstsdpelem_la_OBJECTS = $(am_libgstsdpelem_la_OBJECTS)
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -780,15 +791,16 @@
top_srcdir = @top_srcdir@
wayland_scanner = @wayland_scanner@
plugin_LTLIBRARIES = libgstsdpelem.la
-libgstsdpelem_la_SOURCES = gstsdpelem.c gstsdpdemux.h gstsdpdemux.c
+libgstsdpelem_la_SOURCES = gstsdpelem.c gstsdpsrc.c gstsdpdemux.c
libgstsdpelem_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(GIO_CFLAGS)
libgstsdpelem_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GIO_LIBS) \
-lgstrtp-@GST_API_VERSION@ -lgstsdp-@GST_API_VERSION@ \
+ -lgstapp-@GST_API_VERSION@ \
$(GST_LIBS) $(WINSOCK2_LIBS)
libgstsdpelem_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
libgstsdpelem_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
-noinst_HEADERS = gstsdpdemux.h
+noinst_HEADERS = gstsdpdemux.h gstsdpsrc.h
all: all-am
.SUFFIXES:
@@ -869,6 +881,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsdpelem_la-gstsdpdemux.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsdpelem_la-gstsdpelem.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsdpelem_la-gstsdpsrc.Plo@am__quote@
.c.o:
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@@ -901,6 +914,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 $(libgstsdpelem_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsdpelem_la_CFLAGS) $(CFLAGS) -c -o libgstsdpelem_la-gstsdpelem.lo `test -f 'gstsdpelem.c' || echo '$(srcdir)/'`gstsdpelem.c
+libgstsdpelem_la-gstsdpsrc.lo: gstsdpsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsdpelem_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsdpelem_la_CFLAGS) $(CFLAGS) -MT libgstsdpelem_la-gstsdpsrc.lo -MD -MP -MF $(DEPDIR)/libgstsdpelem_la-gstsdpsrc.Tpo -c -o libgstsdpelem_la-gstsdpsrc.lo `test -f 'gstsdpsrc.c' || echo '$(srcdir)/'`gstsdpsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsdpelem_la-gstsdpsrc.Tpo $(DEPDIR)/libgstsdpelem_la-gstsdpsrc.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsdpsrc.c' object='libgstsdpelem_la-gstsdpsrc.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 $(libgstsdpelem_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsdpelem_la_CFLAGS) $(CFLAGS) -c -o libgstsdpelem_la-gstsdpsrc.lo `test -f 'gstsdpsrc.c' || echo '$(srcdir)/'`gstsdpsrc.c
+
libgstsdpelem_la-gstsdpdemux.lo: gstsdpdemux.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsdpelem_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsdpelem_la_CFLAGS) $(CFLAGS) -MT libgstsdpelem_la-gstsdpdemux.lo -MD -MP -MF $(DEPDIR)/libgstsdpelem_la-gstsdpdemux.Tpo -c -o libgstsdpelem_la-gstsdpdemux.lo `test -f 'gstsdpdemux.c' || echo '$(srcdir)/'`gstsdpdemux.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsdpelem_la-gstsdpdemux.Tpo $(DEPDIR)/libgstsdpelem_la-gstsdpdemux.Plo
diff --git a/gst/sdp/gstsdpdemux.c b/gst/sdp/gstsdpdemux.c
index ae3bbe4..1f80fcc 100644
--- a/gst/sdp/gstsdpdemux.c
+++ b/gst/sdp/gstsdpdemux.c
@@ -150,10 +150,8 @@
DEFAULT_REDIRECT,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sinktemplate));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&rtptemplate));
+ gst_element_class_add_static_pad_template (gstelement_class, &sinktemplate);
+ gst_element_class_add_static_pad_template (gstelement_class, &rtptemplate);
gst_element_class_set_static_metadata (gstelement_class, "SDP session setup",
"Codec/Demuxer/Network/RTP",
diff --git a/gst/sdp/gstsdpelem.c b/gst/sdp/gstsdpelem.c
index 8ab0d11..d0f0333 100644
--- a/gst/sdp/gstsdpelem.c
+++ b/gst/sdp/gstsdpelem.c
@@ -22,6 +22,7 @@
#endif
#include "gstsdpdemux.h"
+#include "gstsdpsrc.h"
static gboolean
plugin_init (GstPlugin * plugin)
@@ -29,6 +30,8 @@
if (!gst_element_register (plugin, "sdpdemux", GST_RANK_NONE,
GST_TYPE_SDP_DEMUX))
return FALSE;
+ if (!gst_element_register (plugin, "sdpsrc", GST_RANK_NONE, GST_TYPE_SDP_SRC))
+ return FALSE;
return TRUE;
}
diff --git a/gst/sdp/gstsdpsrc.c b/gst/sdp/gstsdpsrc.c
new file mode 100644
index 0000000..ea9a5bc
--- /dev/null
+++ b/gst/sdp/gstsdpsrc.c
@@ -0,0 +1,332 @@
+/*
+ * Copyright (C) 2016 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 "gstsdpsrc.h"
+#include <gst/app/app.h>
+#include <string.h>
+
+GST_DEBUG_CATEGORY_STATIC (sdp_src_debug);
+#define GST_CAT_DEFAULT sdp_src_debug
+
+static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("stream_%u",
+ GST_PAD_SRC,
+ GST_PAD_SOMETIMES,
+ GST_STATIC_CAPS ("application/x-rtp"));
+
+enum
+{
+ PROP_0,
+ PROP_LOCATION,
+ PROP_SDP
+};
+
+static void gst_sdp_src_handler_init (gpointer g_iface, gpointer iface_data);
+
+#define gst_sdp_src_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstSdpSrc, gst_sdp_src, GST_TYPE_BIN,
+ G_IMPLEMENT_INTERFACE (GST_TYPE_URI_HANDLER, gst_sdp_src_handler_init));
+
+static void
+gst_sdp_src_finalize (GObject * object)
+{
+ GstSdpSrc *self = GST_SDP_SRC_CAST (object);
+
+ if (self->sdp_buffer)
+ gst_buffer_unref (self->sdp_buffer);
+ g_free (self->location);
+ g_free (self->sdp);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_sdp_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstSdpSrc *self = GST_SDP_SRC_CAST (object);
+
+ switch (prop_id) {
+ case PROP_LOCATION:
+ g_value_set_string (value, self->location);
+ break;
+ case PROP_SDP:
+ g_value_set_string (value, self->sdp);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_sdp_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstSdpSrc *self = GST_SDP_SRC_CAST (object);
+
+ switch (prop_id) {
+ case PROP_LOCATION:
+ g_free (self->location);
+ self->location = g_value_dup_string (value);
+ break;
+ case PROP_SDP:
+ g_free (self->sdp);
+ self->sdp = g_value_dup_string (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+pad_added_cb (GstElement * element, GstPad * pad, gpointer user_data)
+{
+ GstSdpSrc *self = GST_SDP_SRC_CAST (user_data);
+ GstPad *ghost;
+
+ ghost =
+ gst_ghost_pad_new_from_template (GST_PAD_NAME (pad), pad,
+ gst_static_pad_template_get (&src_template));
+ gst_pad_set_active (ghost, TRUE);
+ gst_element_add_pad (GST_ELEMENT_CAST (self), ghost);
+}
+
+static void
+pad_removed_cb (GstElement * element, GstPad * pad, gpointer user_data)
+{
+ GstSdpSrc *self = GST_SDP_SRC_CAST (user_data);
+ GstPad *peer;
+
+ peer = gst_pad_get_peer (pad);
+ if (peer) {
+ GstPad *ghost =
+ GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD (peer)));
+
+ if (ghost) {
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (ghost), NULL);
+ gst_element_remove_pad (GST_ELEMENT_CAST (self), ghost);
+ gst_object_unref (ghost);
+ }
+
+ gst_object_unref (peer);
+ }
+}
+
+static void
+no_more_pads_cb (GstElement * element, gpointer user_data)
+{
+ gst_element_no_more_pads (GST_ELEMENT_CAST (user_data));
+}
+
+static void
+remove_pad (const GValue * item, gpointer user_data)
+{
+ GstElement *self = user_data;
+ GstPad *pad = g_value_get_object (item);
+
+ gst_element_remove_pad (self, pad);
+}
+
+static GstStateChangeReturn
+gst_sdp_src_change_state (GstElement * element, GstStateChange transition)
+{
+ GstSdpSrc *self = GST_SDP_SRC_CAST (element);
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ GST_OBJECT_LOCK (self);
+ if (self->sdp_buffer)
+ gst_buffer_unref (self->sdp_buffer);
+ self->sdp_buffer = NULL;
+
+ if (self->location && strcmp (self->location, "sdp://") != 0) {
+ /* Do nothing */
+ } else if (self->sdp) {
+ self->sdp_buffer =
+ gst_buffer_new_wrapped (self->sdp, strlen (self->sdp) + 1);
+ } else {
+ ret = GST_STATE_CHANGE_FAILURE;
+ }
+ GST_OBJECT_UNLOCK (self);
+
+ if (ret != GST_STATE_CHANGE_FAILURE) {
+ if (self->sdp_buffer) {
+ GstCaps *caps = gst_caps_new_empty_simple ("application/sdp");
+
+ self->src = gst_element_factory_make ("appsrc", NULL);
+ g_object_set (self->src, "caps", caps, "emit-signals", FALSE, NULL);
+ gst_caps_unref (caps);
+ } else {
+ self->src = gst_element_factory_make ("filesrc", NULL);
+ g_object_set (self->src, "location", self->location + 6, NULL);
+ }
+
+ self->demux = gst_element_factory_make ("sdpdemux", NULL);
+ g_signal_connect (self->demux, "pad-added", G_CALLBACK (pad_added_cb),
+ self);
+ g_signal_connect (self->demux, "pad-removed",
+ G_CALLBACK (pad_removed_cb), self);
+ g_signal_connect (self->demux, "no-more-pads",
+ G_CALLBACK (no_more_pads_cb), self);
+ gst_bin_add_many (GST_BIN_CAST (self), self->src, self->demux, NULL);
+ gst_element_link_pads (self->src, "src", self->demux, "sink");
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ return ret;
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ return ret;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_NULL:{
+ GstIterator *it;
+
+ it = gst_element_iterate_src_pads (GST_ELEMENT_CAST (self));
+ while (gst_iterator_foreach (it, remove_pad, self) == GST_ITERATOR_RESYNC)
+ gst_iterator_resync (it);
+ gst_iterator_free (it);
+
+ if (self->src) {
+ gst_bin_remove (GST_BIN_CAST (self), self->src);
+ self->src = NULL;
+ }
+ if (self->demux) {
+ gst_bin_remove (GST_BIN_CAST (self), self->demux);
+ self->demux = NULL;
+ }
+ break;
+ }
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ if (ret != GST_STATE_CHANGE_FAILURE)
+ ret = GST_STATE_CHANGE_NO_PREROLL;
+ if (self->sdp_buffer) {
+ if (gst_app_src_push_buffer (GST_APP_SRC_CAST (self->src),
+ gst_buffer_ref (self->sdp_buffer)) != GST_FLOW_OK)
+ ret = GST_STATE_CHANGE_FAILURE;
+ else
+ gst_app_src_end_of_stream (GST_APP_SRC_CAST (self->src));
+ }
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+static void
+gst_sdp_src_class_init (GstSdpSrcClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstElementClass *element_class = (GstElementClass *) klass;
+
+ GST_DEBUG_CATEGORY_INIT (sdp_src_debug, "sdpsrc", 0, "SDP Source");
+
+ gobject_class->finalize = gst_sdp_src_finalize;
+ gobject_class->set_property = gst_sdp_src_set_property;
+ gobject_class->get_property = gst_sdp_src_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_LOCATION,
+ g_param_spec_string ("location",
+ "Location",
+ "URI to SDP file (sdp:///path/to/file)", NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_SDP,
+ g_param_spec_string ("sdp",
+ "SDP",
+ "SDP description used instead of location", NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&src_template));
+
+ gst_element_class_set_static_metadata (element_class, "SDP Source",
+ "Source/Network/RTP",
+ "Stream RTP based on an SDP",
+ "Sebastian Dröge <sebastian@centricular.com>");
+
+ element_class->change_state = GST_DEBUG_FUNCPTR (gst_sdp_src_change_state);
+}
+
+static void
+gst_sdp_src_init (GstSdpSrc * self)
+{
+}
+
+static GstURIType
+gst_sdp_src_get_uri_type (GType type)
+{
+ return GST_URI_SRC;
+}
+
+static const gchar *const *
+gst_sdp_src_get_protocols (GType type)
+{
+ static const gchar *protocols[] = { "sdp", 0 };
+
+ return protocols;
+}
+
+static gchar *
+gst_sdp_src_get_uri (GstURIHandler * handler)
+{
+ gchar *uri = NULL;
+
+ g_object_get (handler, "location", &uri, NULL);
+
+ return uri;
+}
+
+static gboolean
+gst_sdp_src_set_uri (GstURIHandler * handler, const gchar * uri,
+ GError ** error)
+{
+ if (uri && !g_str_has_prefix (uri, "sdp://")) {
+ g_set_error (error, GST_URI_ERROR, GST_URI_ERROR_BAD_URI,
+ "Invalid SDP URI");
+ return FALSE;
+ }
+
+ g_object_set (handler, "location", uri, NULL);
+
+ return TRUE;
+}
+
+static void
+gst_sdp_src_handler_init (gpointer g_iface, gpointer iface_data)
+{
+ GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface;
+
+ iface->get_type = gst_sdp_src_get_uri_type;
+ iface->get_protocols = gst_sdp_src_get_protocols;
+ iface->get_uri = gst_sdp_src_get_uri;
+ iface->set_uri = gst_sdp_src_set_uri;
+}
diff --git a/gst/sdp/gstsdpsrc.h b/gst/sdp/gstsdpsrc.h
new file mode 100644
index 0000000..05f2074
--- /dev/null
+++ b/gst/sdp/gstsdpsrc.h
@@ -0,0 +1,62 @@
+/* GStreamer
+ * Copyright (C) 2016 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_SDP_SRC_H__
+#define __GST_SDP_SRC_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+#define GST_TYPE_SDP_SRC \
+ (gst_sdp_src_get_type())
+#define GST_SDP_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SDP_SRC, GstSdpSrc))
+#define GST_SDP_SRC_CAST(obj) \
+ ((GstSdpSrc *) obj)
+#define GST_SDP_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SDP_SRC, GstSdpSrcClass))
+#define GST_IS_SDP_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SDP_SRC))
+#define GST_IS_SDP_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SDP_SRC))
+
+typedef struct _GstSdpSrc GstSdpSrc;
+typedef struct _GstSdpSrcClass GstSdpSrcClass;
+
+struct _GstSdpSrc
+{
+ GstBin parent;
+
+ gchar *location;
+ gchar *sdp;
+
+ GstBuffer *sdp_buffer;
+ GstElement *src;
+ GstElement *demux;
+};
+
+struct _GstSdpSrcClass
+{
+ GstBinClass parent;
+};
+
+GType gst_sdp_src_get_type (void);
+
+G_END_DECLS
+#endif /* __GST_SDP_SRC_H__ */
diff --git a/gst/segmentclip/Makefile.in b/gst/segmentclip/Makefile.in
index 45a5577..4f6e6ed 100644
--- a/gst/segmentclip/Makefile.in
+++ b/gst/segmentclip/Makefile.in
@@ -306,6 +306,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -327,6 +329,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -376,6 +380,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -521,6 +527,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -647,8 +655,6 @@
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@
@@ -691,8 +697,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/segmentclip/gstaudiosegmentclip.c b/gst/segmentclip/gstaudiosegmentclip.c
index 21fcd46..434424a 100644
--- a/gst/segmentclip/gstaudiosegmentclip.c
+++ b/gst/segmentclip/gstaudiosegmentclip.c
@@ -67,10 +67,8 @@
"Clips audio buffers to the configured segment",
"Sebastian Dröge <sebastian.droege@collabora.co.uk>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_pad_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_pad_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_pad_template);
+ gst_element_class_add_static_pad_template (element_class, &src_pad_template);
}
static void
diff --git a/gst/segmentclip/gstvideosegmentclip.c b/gst/segmentclip/gstvideosegmentclip.c
index 0b168e4..34ba58b 100644
--- a/gst/segmentclip/gstvideosegmentclip.c
+++ b/gst/segmentclip/gstvideosegmentclip.c
@@ -61,10 +61,8 @@
"Clips video buffers to the configured segment",
"Sebastian Dröge <sebastian.droege@collabora.co.uk>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_pad_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_pad_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_pad_template);
+ gst_element_class_add_static_pad_template (element_class, &src_pad_template);
segment_clip_klass->reset = GST_DEBUG_FUNCPTR (gst_video_segment_clip_reset);
segment_clip_klass->set_caps =
diff --git a/gst/siren/Makefile.in b/gst/siren/Makefile.in
index 00b5506..9c35f27 100644
--- a/gst/siren/Makefile.in
+++ b/gst/siren/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/siren/gstsirendec.c b/gst/siren/gstsirendec.c
index ab0635a..78338ae 100644
--- a/gst/siren/gstsirendec.c
+++ b/gst/siren/gstsirendec.c
@@ -57,7 +57,7 @@
static gboolean gst_siren_dec_stop (GstAudioDecoder * dec);
static gboolean gst_siren_dec_set_format (GstAudioDecoder * dec,
GstCaps * caps);
-static gboolean gst_siren_dec_parse (GstAudioDecoder * dec,
+static GstFlowReturn gst_siren_dec_parse (GstAudioDecoder * dec,
GstAdapter * adapter, gint * offset, gint * length);
static GstFlowReturn gst_siren_dec_handle_frame (GstAudioDecoder * dec,
GstBuffer * buffer);
@@ -73,10 +73,8 @@
GST_DEBUG_CATEGORY_INIT (sirendec_debug, "sirendec", 0, "sirendec");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&srctemplate));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sinktemplate));
+ gst_element_class_add_static_pad_template (element_class, &srctemplate);
+ gst_element_class_add_static_pad_template (element_class, &sinktemplate);
gst_element_class_set_static_metadata (element_class, "Siren Decoder element",
"Codec/Decoder/Audio ",
diff --git a/gst/siren/gstsirenenc.c b/gst/siren/gstsirenenc.c
index 69b4d80..0be5cd3 100644
--- a/gst/siren/gstsirenenc.c
+++ b/gst/siren/gstsirenenc.c
@@ -71,10 +71,8 @@
GST_DEBUG_CATEGORY_INIT (sirenenc_debug, "sirenenc", 0, "sirenenc");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&srctemplate));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sinktemplate));
+ gst_element_class_add_static_pad_template (element_class, &srctemplate);
+ gst_element_class_add_static_pad_template (element_class, &sinktemplate);
gst_element_class_set_static_metadata (element_class, "Siren Encoder element",
"Codec/Encoder/Audio ",
diff --git a/gst/smooth/Makefile.in b/gst/smooth/Makefile.in
index 21135e6..8468051 100644
--- a/gst/smooth/Makefile.in
+++ b/gst/smooth/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/smooth/gstsmooth.c b/gst/smooth/gstsmooth.c
index cfdf51a..3bc233a 100644
--- a/gst/smooth/gstsmooth.c
+++ b/gst/smooth/gstsmooth.c
@@ -89,13 +89,12 @@
g_param_spec_boolean ("luma-only", "luma-only", "only filter luma part",
TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_smooth_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_smooth_src_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_smooth_sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_smooth_src_template);
gst_element_class_set_static_metadata (gstelement_class, "Smooth effect",
- "Filter/Effect/Video",
- "Apply a smooth filter to an image",
+ "Filter/Effect/Video", "Apply a smooth filter to an image",
"Wim Taymans <wim.taymans@chello.be>");
vfilter_class->transform_frame =
diff --git a/gst/speed/Makefile.in b/gst/speed/Makefile.in
index 22a00e6..48bb4ac 100644
--- a/gst/speed/Makefile.in
+++ b/gst/speed/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/speed/gstspeed.c b/gst/speed/gstspeed.c
index c0f9198..72a907d 100644
--- a/gst/speed/gstspeed.c
+++ b/gst/speed/gstspeed.c
@@ -399,10 +399,10 @@
"Andy Wingo <apwingo@eos.ncsu.edu>, "
"Tim-Philipp Müller <tim@centricular.net>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_speed_src_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_speed_sink_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_speed_src_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_speed_sink_template);
}
static void
diff --git a/gst/stereo/Makefile.in b/gst/stereo/Makefile.in
index 1f73f05..22c9315 100644
--- a/gst/stereo/Makefile.in
+++ b/gst/stereo/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/subenc/Makefile.in b/gst/subenc/Makefile.in
index eb67032..a0b0780 100644
--- a/gst/subenc/Makefile.in
+++ b/gst/subenc/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/subenc/gstsrtenc.c b/gst/subenc/gstsrtenc.c
index 079fc44..c16e6ed 100644
--- a/gst/subenc/gstsrtenc.c
+++ b/gst/subenc/gstsrtenc.c
@@ -246,10 +246,8 @@
0,
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
+ gst_element_class_add_static_pad_template (element_class, &src_template);
gst_element_class_set_static_metadata (element_class,
"Srt encoder", "Codec/Encoder/Subtitle",
diff --git a/gst/subenc/gstwebvttenc.c b/gst/subenc/gstwebvttenc.c
index 67b6305..eefc78d 100644
--- a/gst/subenc/gstwebvttenc.c
+++ b/gst/subenc/gstwebvttenc.c
@@ -266,10 +266,8 @@
0,
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
+ gst_element_class_add_static_pad_template (element_class, &src_template);
gst_element_class_set_static_metadata (element_class,
"WebVTT encoder", "Codec/Encoder/Subtitle",
diff --git a/gst/timecode/Makefile.am b/gst/timecode/Makefile.am
new file mode 100644
index 0000000..e819b26
--- /dev/null
+++ b/gst/timecode/Makefile.am
@@ -0,0 +1,10 @@
+plugin_LTLIBRARIES = libgsttimecode.la
+
+libgsttimecode_la_SOURCES = plugin.c gsttimecodestamper.c gsttimecodewait.c
+
+libgsttimecode_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgsttimecode_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) -lgstaudio-$(GST_API_VERSION) $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM)
+libgsttimecode_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgsttimecode_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
+
+noinst_HEADERS = gsttimecodestamper.h gsttimecodewait.h
diff --git a/tests/examples/gl/gtk/gtkvideooverlay/Makefile.in b/gst/timecode/Makefile.in
similarity index 71%
copy from tests/examples/gl/gtk/gtkvideooverlay/Makefile.in
copy to gst/timecode/Makefile.in
index aef9ed4..2f73601 100644
--- a/tests/examples/gl/gtk/gtkvideooverlay/Makefile.in
+++ b/gst/timecode/Makefile.in
@@ -14,6 +14,7 @@
@SET_MAKE@
+
VPATH = @srcdir@
am__is_gnu_make = { \
if test -z '$(MAKELEVEL)'; then \
@@ -89,8 +90,7 @@
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
-noinst_PROGRAMS = gtkvideooverlay$(EXEEXT)
-subdir = tests/examples/gl/gtk/gtkvideooverlay
+subdir = gst/timecode
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 \
@@ -127,27 +127,57 @@
$(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 $(am__DIST_COMMON)
+DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \
+ $(am__DIST_COMMON)
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
-PROGRAMS = $(noinst_PROGRAMS)
-am_gtkvideooverlay_OBJECTS = gtkvideooverlay-main.$(OBJEXT)
-gtkvideooverlay_OBJECTS = $(am_gtkvideooverlay_OBJECTS)
+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)
am__DEPENDENCIES_1 =
-gtkvideooverlay_DEPENDENCIES = ../libgstgtkhelper.la \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+libgsttimecode_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1)
+am_libgsttimecode_la_OBJECTS = libgsttimecode_la-plugin.lo \
+ libgsttimecode_la-gsttimecodestamper.lo \
+ libgsttimecode_la-gsttimecodewait.lo
+libgsttimecode_la_OBJECTS = $(am_libgsttimecode_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 =
-gtkvideooverlay_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
- $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
- $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
+libgsttimecode_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgsttimecode_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgsttimecode_la_CFLAGS) $(CFLAGS) \
+ $(libgsttimecode_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
@@ -164,31 +194,32 @@
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
am__mv = mv -f
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+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_CXXFLAGS) $(CXXFLAGS)
-AM_V_CXX = $(am__v_CXX_@AM_V@)
-am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
-am__v_CXX_0 = @echo " CXX " $@;
-am__v_CXX_1 =
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
- $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
-am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
-am__v_CXXLD_0 = @echo " CXXLD " $@;
-am__v_CXXLD_1 =
-SOURCES = $(gtkvideooverlay_SOURCES)
-DIST_SOURCES = $(gtkvideooverlay_SOURCES)
+ $(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 = $(libgsttimecode_la_SOURCES)
+DIST_SOURCES = $(libgsttimecode_la_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 +305,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -295,6 +328,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -344,6 +379,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -489,6 +526,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -615,8 +654,6 @@
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@
@@ -659,8 +696,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -749,19 +791,17 @@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
wayland_scanner = @wayland_scanner@
-gtkvideooverlay_SOURCES = main.cpp
-gtkvideooverlay_CXXFLAGS = -I$(top_srcdir)/gst-libs -I$(top_builddir)/gst-libs \
- $(GST_PLUGINS_BASE_CFLAGS) $(GST_CXXFLAGS) \
- $(GL_CFLAGS) $(GTK3_CFLAGS) $(X11_CFLAGS)
-
-gtkvideooverlay_LDADD = ../libgstgtkhelper.la \
- $(GTK3_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \
- $(GL_LIBS) -lgstvideo-$(GST_API_VERSION) $(X11_LIBS)
-
+plugin_LTLIBRARIES = libgsttimecode.la
+libgsttimecode_la_SOURCES = plugin.c gsttimecodestamper.c gsttimecodewait.c
+libgsttimecode_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgsttimecode_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) -lgstaudio-$(GST_API_VERSION) $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM)
+libgsttimecode_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgsttimecode_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
+noinst_HEADERS = gsttimecodestamper.h gsttimecodewait.h
all: all-am
.SUFFIXES:
-.SUFFIXES: .cpp .lo .o .obj
+.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 \
@@ -771,9 +811,9 @@
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/gl/gtk/gtkvideooverlay/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/timecode/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu tests/examples/gl/gtk/gtkvideooverlay/Makefile
+ $(AUTOMAKE) --gnu gst/timecode/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
@@ -792,18 +832,43 @@
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
-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
+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)"; \
+ }
-gtkvideooverlay$(EXEEXT): $(gtkvideooverlay_OBJECTS) $(gtkvideooverlay_DEPENDENCIES) $(EXTRA_gtkvideooverlay_DEPENDENCIES)
- @rm -f gtkvideooverlay$(EXEEXT)
- $(AM_V_CXXLD)$(gtkvideooverlay_LINK) $(gtkvideooverlay_OBJECTS) $(gtkvideooverlay_LDADD) $(LIBS)
+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}; \
+ }
+
+libgsttimecode.la: $(libgsttimecode_la_OBJECTS) $(libgsttimecode_la_DEPENDENCIES) $(EXTRA_libgsttimecode_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgsttimecode_la_LINK) -rpath $(plugindir) $(libgsttimecode_la_OBJECTS) $(libgsttimecode_la_LIBADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@@ -811,45 +876,54 @@
distclean-compile:
-rm -f *.tab.c
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtkvideooverlay-main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttimecode_la-gsttimecodestamper.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttimecode_la-gsttimecodewait.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttimecode_la-plugin.Plo@am__quote@
-.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 $@ $< &&\
-@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+.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 $@ $<
-.cpp.obj:
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
-@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
-@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+.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) '$<'`
-.cpp.lo:
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
-@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
-@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+.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 $@ $<
-gtkvideooverlay-main.o: main.cpp
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) -MT gtkvideooverlay-main.o -MD -MP -MF $(DEPDIR)/gtkvideooverlay-main.Tpo -c -o gtkvideooverlay-main.o `test -f 'main.cpp' || echo '$(srcdir)/'`main.cpp
-@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gtkvideooverlay-main.Tpo $(DEPDIR)/gtkvideooverlay-main.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='main.cpp' object='gtkvideooverlay-main.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) -c -o gtkvideooverlay-main.o `test -f 'main.cpp' || echo '$(srcdir)/'`main.cpp
+libgsttimecode_la-plugin.lo: plugin.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttimecode_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttimecode_la_CFLAGS) $(CFLAGS) -MT libgsttimecode_la-plugin.lo -MD -MP -MF $(DEPDIR)/libgsttimecode_la-plugin.Tpo -c -o libgsttimecode_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttimecode_la-plugin.Tpo $(DEPDIR)/libgsttimecode_la-plugin.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='plugin.c' object='libgsttimecode_la-plugin.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 $(libgsttimecode_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttimecode_la_CFLAGS) $(CFLAGS) -c -o libgsttimecode_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c
-gtkvideooverlay-main.obj: main.cpp
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) -MT gtkvideooverlay-main.obj -MD -MP -MF $(DEPDIR)/gtkvideooverlay-main.Tpo -c -o gtkvideooverlay-main.obj `if test -f 'main.cpp'; then $(CYGPATH_W) 'main.cpp'; else $(CYGPATH_W) '$(srcdir)/main.cpp'; fi`
-@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gtkvideooverlay-main.Tpo $(DEPDIR)/gtkvideooverlay-main.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='main.cpp' object='gtkvideooverlay-main.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) -c -o gtkvideooverlay-main.obj `if test -f 'main.cpp'; then $(CYGPATH_W) 'main.cpp'; else $(CYGPATH_W) '$(srcdir)/main.cpp'; fi`
+libgsttimecode_la-gsttimecodestamper.lo: gsttimecodestamper.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttimecode_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttimecode_la_CFLAGS) $(CFLAGS) -MT libgsttimecode_la-gsttimecodestamper.lo -MD -MP -MF $(DEPDIR)/libgsttimecode_la-gsttimecodestamper.Tpo -c -o libgsttimecode_la-gsttimecodestamper.lo `test -f 'gsttimecodestamper.c' || echo '$(srcdir)/'`gsttimecodestamper.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttimecode_la-gsttimecodestamper.Tpo $(DEPDIR)/libgsttimecode_la-gsttimecodestamper.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsttimecodestamper.c' object='libgsttimecode_la-gsttimecodestamper.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 $(libgsttimecode_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttimecode_la_CFLAGS) $(CFLAGS) -c -o libgsttimecode_la-gsttimecodestamper.lo `test -f 'gsttimecodestamper.c' || echo '$(srcdir)/'`gsttimecodestamper.c
+
+libgsttimecode_la-gsttimecodewait.lo: gsttimecodewait.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttimecode_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttimecode_la_CFLAGS) $(CFLAGS) -MT libgsttimecode_la-gsttimecodewait.lo -MD -MP -MF $(DEPDIR)/libgsttimecode_la-gsttimecodewait.Tpo -c -o libgsttimecode_la-gsttimecodewait.lo `test -f 'gsttimecodewait.c' || echo '$(srcdir)/'`gsttimecodewait.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttimecode_la-gsttimecodewait.Tpo $(DEPDIR)/libgsttimecode_la-gsttimecodewait.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsttimecodewait.c' object='libgsttimecode_la-gsttimecodewait.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 $(libgsttimecode_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttimecode_la_CFLAGS) $(CFLAGS) -c -o libgsttimecode_la-gsttimecodewait.lo `test -f 'gsttimecodewait.c' || echo '$(srcdir)/'`gsttimecodewait.c
mostlyclean-libtool:
-rm -f *.lo
@@ -941,8 +1015,11 @@
done
check-am: all-am
check: check-am
-all-am: Makefile $(PROGRAMS)
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
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
@@ -975,7 +1052,7 @@
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
-clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \
mostlyclean-am
distclean: distclean-am
@@ -996,7 +1073,7 @@
info-am:
-install-data-am:
+install-data-am: install-pluginLTLIBRARIES
install-dvi: install-dvi-am
@@ -1042,23 +1119,24 @@
ps-am:
-uninstall-am:
+uninstall-am: uninstall-pluginLTLIBRARIES
.MAKE: install-am install-strip
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
- clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \
+ 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 \
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-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
+ 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
.PRECIOUS: Makefile
diff --git a/gst/timecode/gsttimecodestamper.c b/gst/timecode/gsttimecodestamper.c
new file mode 100644
index 0000000..d930289
--- /dev/null
+++ b/gst/timecode/gsttimecodestamper.c
@@ -0,0 +1,419 @@
+/*
+ * GStreamer
+ * Copyright (C) 2016 Vivia Nikolaidou <vivia@toolsonair.com>
+ *
+ * gsttimecodestamper.c
+ *
+ * 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-timecodestamper
+ * @short_description: Attach a timecode into incoming video frames
+ *
+ * This element attaches a timecode into every incoming video frame. It starts
+ * counting from the stream time of each segment start, which it converts into
+ * a timecode.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 videotestsrc ! timecodestamper ! autovideosink
+ * ]|
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gsttimecodestamper.h"
+
+#include <gst/gst.h>
+#include <gst/video/video.h>
+#include <stdlib.h>
+#include <string.h>
+
+GST_DEBUG_CATEGORY_STATIC (timecodestamper_debug);
+#define GST_CAT_DEFAULT timecodestamper_debug
+
+/* GstTimeCodeStamper properties */
+enum
+{
+ PROP_0,
+ PROP_OVERRIDE_EXISTING,
+ PROP_DROP_FRAME,
+ PROP_SOURCE_CLOCK,
+ PROP_DAILY_JAM
+};
+
+#define DEFAULT_OVERRIDE_EXISTING FALSE
+#define DEFAULT_DROP_FRAME FALSE
+#define DEFAULT_SOURCE_CLOCK NULL
+#define DEFAULT_DAILY_JAM NULL
+
+static GstStaticPadTemplate gst_timecodestamper_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("video/x-raw")
+ );
+
+static GstStaticPadTemplate gst_timecodestamper_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("video/x-raw")
+ );
+
+static void gst_timecodestamper_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_timecodestamper_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void gst_timecodestamper_dispose (GObject * object);
+static gboolean gst_timecodestamper_sink_event (GstBaseTransform * trans,
+ GstEvent * event);
+static GstFlowReturn gst_timecodestamper_transform_ip (GstBaseTransform *
+ vfilter, GstBuffer * buffer);
+static gboolean gst_timecodestamper_stop (GstBaseTransform * trans);
+
+G_DEFINE_TYPE (GstTimeCodeStamper, gst_timecodestamper,
+ GST_TYPE_BASE_TRANSFORM);
+
+static void
+gst_timecodestamper_class_init (GstTimeCodeStamperClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstElementClass *element_class = (GstElementClass *) klass;
+ GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass;
+
+ GST_DEBUG_CATEGORY_INIT (timecodestamper_debug, "timecodestamper", 0,
+ "timecodestamper");
+ gst_element_class_set_static_metadata (element_class, "Timecode stamper",
+ "Filter/Video", "Attaches a timecode meta into each video frame",
+ "Vivia Nikolaidou <vivia@toolsonair.com");
+
+ gobject_class->set_property = gst_timecodestamper_set_property;
+ gobject_class->get_property = gst_timecodestamper_get_property;
+ gobject_class->dispose = gst_timecodestamper_dispose;
+
+ g_object_class_install_property (gobject_class, PROP_OVERRIDE_EXISTING,
+ g_param_spec_boolean ("override-existing", "Override existing timecode",
+ "If set to true, any existing timecode will be overridden",
+ DEFAULT_OVERRIDE_EXISTING,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_DROP_FRAME,
+ g_param_spec_boolean ("drop-frame", "Override existing timecode",
+ "Use drop-frame timecodes for 29.97 and 59.94 FPS",
+ DEFAULT_DROP_FRAME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_SOURCE_CLOCK,
+ g_param_spec_object ("source-clock",
+ "Source clock to use for first timecode",
+ "If unset, the timecode will refer to the stream time",
+ GST_TYPE_CLOCK, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_DAILY_JAM,
+ g_param_spec_boxed ("daily-jam",
+ "Daily jam",
+ "The daily jam of the timecode",
+ G_TYPE_DATE_TIME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_timecodestamper_sink_template));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_timecodestamper_src_template));
+
+ trans_class->sink_event = GST_DEBUG_FUNCPTR (gst_timecodestamper_sink_event);
+ trans_class->stop = GST_DEBUG_FUNCPTR (gst_timecodestamper_stop);
+
+ trans_class->transform_ip =
+ GST_DEBUG_FUNCPTR (gst_timecodestamper_transform_ip);
+}
+
+static void
+gst_timecodestamper_init (GstTimeCodeStamper * timecodestamper)
+{
+ timecodestamper->override_existing = DEFAULT_OVERRIDE_EXISTING;
+ timecodestamper->drop_frame = DEFAULT_DROP_FRAME;
+ timecodestamper->source_clock = DEFAULT_SOURCE_CLOCK;
+ timecodestamper->current_tc = gst_video_time_code_new_empty ();
+ timecodestamper->current_tc->config.latest_daily_jam = DEFAULT_DAILY_JAM;
+}
+
+static void
+gst_timecodestamper_dispose (GObject * object)
+{
+ GstTimeCodeStamper *timecodestamper = GST_TIME_CODE_STAMPER (object);
+
+ if (timecodestamper->current_tc != NULL) {
+ gst_video_time_code_free (timecodestamper->current_tc);
+ timecodestamper->current_tc = NULL;
+ }
+
+ if (timecodestamper->source_clock) {
+ gst_object_unref (timecodestamper->source_clock);
+ timecodestamper->source_clock = NULL;
+ }
+
+ G_OBJECT_CLASS (gst_timecodestamper_parent_class)->dispose (object);
+}
+
+static void
+gst_timecodestamper_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstTimeCodeStamper *timecodestamper = GST_TIME_CODE_STAMPER (object);
+
+ switch (prop_id) {
+ case PROP_OVERRIDE_EXISTING:
+ timecodestamper->override_existing = g_value_get_boolean (value);
+ break;
+ case PROP_DROP_FRAME:
+ timecodestamper->drop_frame = g_value_get_boolean (value);
+ break;
+ case PROP_SOURCE_CLOCK:
+ if (timecodestamper->source_clock)
+ gst_object_unref (timecodestamper->source_clock);
+ timecodestamper->source_clock = g_value_dup_object (value);
+ break;
+ case PROP_DAILY_JAM:
+ if (timecodestamper->current_tc->config.latest_daily_jam)
+ g_date_time_unref (timecodestamper->current_tc->
+ config.latest_daily_jam);
+ timecodestamper->current_tc->config.latest_daily_jam =
+ g_value_dup_boxed (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_timecodestamper_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstTimeCodeStamper *timecodestamper = GST_TIME_CODE_STAMPER (object);
+
+ switch (prop_id) {
+ case PROP_OVERRIDE_EXISTING:
+ g_value_set_boolean (value, timecodestamper->override_existing);
+ break;
+ case PROP_DROP_FRAME:
+ g_value_set_boolean (value, timecodestamper->drop_frame);
+ break;
+ case PROP_SOURCE_CLOCK:
+ g_value_set_object (value, timecodestamper->source_clock);
+ break;
+ case PROP_DAILY_JAM:
+ g_value_set_boxed (value,
+ timecodestamper->current_tc->config.latest_daily_jam);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_timecodestamper_set_drop_frame (GstTimeCodeStamper * timecodestamper)
+{
+ if (timecodestamper->drop_frame && timecodestamper->vinfo.fps_d == 1001 &&
+ (timecodestamper->vinfo.fps_n == 30000 ||
+ timecodestamper->vinfo.fps_d == 60000))
+ timecodestamper->current_tc->config.flags |=
+ GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME;
+ else
+ timecodestamper->current_tc->config.flags &=
+ ~GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME;
+}
+
+static gboolean
+gst_timecodestamper_stop (GstBaseTransform * trans)
+{
+ GstTimeCodeStamper *timecodestamper = GST_TIME_CODE_STAMPER (trans);
+
+ gst_video_info_init (&timecodestamper->vinfo);
+
+ return TRUE;
+}
+
+/* Must be called with object lock */
+static void
+gst_timecodestamper_reset_timecode (GstTimeCodeStamper * timecodestamper)
+{
+ GDateTime *jam = NULL;
+
+ if (timecodestamper->current_tc->config.latest_daily_jam)
+ jam =
+ g_date_time_ref (timecodestamper->current_tc->config.latest_daily_jam);
+ gst_video_time_code_clear (timecodestamper->current_tc);
+ /* FIXME: What if the buffer doesn't contain both top and bottom fields? */
+ gst_video_time_code_init (timecodestamper->current_tc,
+ timecodestamper->vinfo.fps_n,
+ timecodestamper->vinfo.fps_d,
+ jam,
+ timecodestamper->vinfo.interlace_mode ==
+ GST_VIDEO_INTERLACE_MODE_PROGRESSIVE ? 0 :
+ GST_VIDEO_TIME_CODE_FLAGS_INTERLACED, 0, 0, 0, 0, 0);
+ gst_timecodestamper_set_drop_frame (timecodestamper);
+}
+
+static gboolean
+gst_timecodestamper_sink_event (GstBaseTransform * trans, GstEvent * event)
+{
+ gboolean ret = FALSE;
+ GstTimeCodeStamper *timecodestamper = GST_TIME_CODE_STAMPER (trans);
+
+ GST_DEBUG_OBJECT (trans, "received event %" GST_PTR_FORMAT, event);
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEGMENT:
+ {
+ GstSegment segment;
+ guint64 frames;
+ gchar *tc_str;
+
+ GST_OBJECT_LOCK (timecodestamper);
+ if (timecodestamper->source_clock != NULL) {
+ GST_OBJECT_UNLOCK (timecodestamper);
+ break;
+ }
+
+ gst_event_copy_segment (event, &segment);
+ if (segment.format != GST_FORMAT_TIME) {
+ GST_OBJECT_UNLOCK (timecodestamper);
+ GST_ERROR_OBJECT (timecodestamper, "Invalid segment format");
+ return FALSE;
+ }
+ if (GST_VIDEO_INFO_FORMAT (&timecodestamper->vinfo) ==
+ GST_VIDEO_FORMAT_UNKNOWN) {
+ GST_ERROR_OBJECT (timecodestamper,
+ "Received segment event without caps");
+ GST_OBJECT_UNLOCK (timecodestamper);
+ return FALSE;
+ }
+ frames =
+ gst_util_uint64_scale (segment.time, timecodestamper->vinfo.fps_n,
+ timecodestamper->vinfo.fps_d * GST_SECOND);
+ gst_timecodestamper_reset_timecode (timecodestamper);
+ gst_video_time_code_add_frames (timecodestamper->current_tc, frames);
+ GST_DEBUG_OBJECT (timecodestamper,
+ "Got %" G_GUINT64_FORMAT " frames when segment time is %"
+ GST_TIME_FORMAT, frames, GST_TIME_ARGS (segment.time));
+ tc_str = gst_video_time_code_to_string (timecodestamper->current_tc);
+ GST_DEBUG_OBJECT (timecodestamper, "New timecode is %s", tc_str);
+ g_free (tc_str);
+ GST_OBJECT_UNLOCK (timecodestamper);
+ break;
+ }
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ GST_OBJECT_LOCK (timecodestamper);
+ gst_event_parse_caps (event, &caps);
+ if (!gst_video_info_from_caps (&timecodestamper->vinfo, caps)) {
+ GST_OBJECT_UNLOCK (timecodestamper);
+ return FALSE;
+ }
+ gst_timecodestamper_reset_timecode (timecodestamper);
+ GST_OBJECT_UNLOCK (timecodestamper);
+ break;
+ }
+ default:
+ break;
+ }
+ ret =
+ GST_BASE_TRANSFORM_CLASS (gst_timecodestamper_parent_class)->sink_event
+ (trans, event);
+ return ret;
+}
+
+static GstFlowReturn
+gst_timecodestamper_transform_ip (GstBaseTransform * vfilter,
+ GstBuffer * buffer)
+{
+ GstTimeCodeStamper *timecodestamper = GST_TIME_CODE_STAMPER (vfilter);
+ GstClockTime ref_time;
+
+ GST_OBJECT_LOCK (timecodestamper);
+ if (gst_buffer_get_video_time_code_meta (buffer)
+ && timecodestamper->override_existing == FALSE) {
+ GST_OBJECT_UNLOCK (timecodestamper);
+ return GST_FLOW_OK;
+ }
+ if (timecodestamper->source_clock != NULL) {
+ if (timecodestamper->current_tc->hours == 0
+ && timecodestamper->current_tc->minutes == 0
+ && timecodestamper->current_tc->seconds == 0
+ && timecodestamper->current_tc->frames == 0) {
+ guint64 hours, minutes, seconds, frames;
+ /* Daily jam time */
+
+ ref_time = gst_clock_get_time (timecodestamper->source_clock);
+ ref_time = ref_time % (24 * 60 * 60 * GST_SECOND);
+ hours = ref_time / (GST_SECOND * 60 * 60);
+ ref_time -= hours * GST_SECOND * 60 * 60;
+ minutes = ref_time / (GST_SECOND * 60);
+ ref_time -= minutes * GST_SECOND * 60;
+ seconds = ref_time / GST_SECOND;
+ ref_time -= seconds * GST_SECOND;
+ /* Converting to frames for the whole ref_time might be inaccurate in case
+ * we have a drop frame timecode */
+ frames = gst_util_uint64_scale (ref_time, timecodestamper->vinfo.fps_n,
+ timecodestamper->vinfo.fps_d * GST_SECOND);
+
+ GST_DEBUG_OBJECT (timecodestamper,
+ "Initializing with %" G_GUINT64_FORMAT ":%" G_GUINT64_FORMAT ":%"
+ G_GUINT64_FORMAT ":%" G_GUINT64_FORMAT "", hours, minutes, seconds,
+ frames);
+ gst_video_time_code_init (timecodestamper->current_tc,
+ timecodestamper->vinfo.fps_n,
+ timecodestamper->vinfo.fps_d,
+ NULL,
+ timecodestamper->vinfo.interlace_mode ==
+ GST_VIDEO_INTERLACE_MODE_PROGRESSIVE ? 0 :
+ GST_VIDEO_TIME_CODE_FLAGS_INTERLACED, hours, minutes, seconds, 0, 0);
+ gst_timecodestamper_set_drop_frame (timecodestamper);
+ /* Do not use frames when initializing because maybe we have drop frame */
+ gst_video_time_code_add_frames (timecodestamper->current_tc, frames);
+ }
+ } else if (timecodestamper->source_clock == NULL) {
+ GstClockTime timecode_time;
+
+ timecode_time =
+ gst_video_time_code_nsec_since_daily_jam (timecodestamper->current_tc);
+ ref_time =
+ gst_segment_to_stream_time (&vfilter->segment, GST_FORMAT_TIME,
+ buffer->pts);
+ if (timecode_time != GST_CLOCK_TIME_NONE && ref_time != GST_CLOCK_TIME_NONE
+ && ((timecode_time > ref_time && timecode_time - ref_time > GST_SECOND)
+ || (ref_time > timecode_time
+ && ref_time - timecode_time > GST_SECOND))) {
+ gchar *tc_str =
+ gst_video_time_code_to_string (timecodestamper->current_tc);
+ GST_WARNING_OBJECT (timecodestamper,
+ "Time code %s (stream time %" GST_TIME_FORMAT
+ ") has drifted more than one second from stream time %"
+ GST_TIME_FORMAT, tc_str, GST_TIME_ARGS (timecode_time),
+ GST_TIME_ARGS (ref_time));
+ g_free (tc_str);
+ }
+ }
+ gst_buffer_add_video_time_code_meta (buffer, timecodestamper->current_tc);
+ gst_video_time_code_increment_frame (timecodestamper->current_tc);
+ GST_OBJECT_UNLOCK (timecodestamper);
+ return GST_FLOW_OK;
+}
diff --git a/gst/timecode/gsttimecodestamper.h b/gst/timecode/gsttimecodestamper.h
new file mode 100644
index 0000000..b06912e
--- /dev/null
+++ b/gst/timecode/gsttimecodestamper.h
@@ -0,0 +1,64 @@
+/*
+ * GStreamer
+ * Copyright (C) 2016 Vivia Nikolaidou <vivia@toolsonair.com>
+ *
+ * gsttimecodestamper.h
+ *
+ * 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_TIME_CODE_STAMPER_H__
+#define __GST_TIME_CODE_STAMPER_H__
+
+#include <gst/gst.h>
+#include <gst/video/video.h>
+
+#define GST_TYPE_TIME_CODE_STAMPER (gst_timecodestamper_get_type())
+#define GST_TIME_CODE_STAMPER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TIME_CODE_STAMPER,GstTimeCodeStamper))
+#define GST_TIME_CODE_STAMPER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_TIME_CODE_STAMPER,GstTimeCodeStamperClass))
+#define GST_TIME_CODE_STAMPER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_TIME_CODE_STAMPER,GstTimeCodeStamperClass))
+#define GST_IS_TIME_CODE_STAMPER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TIME_CODE_STAMPER))
+#define GST_IS_TIME_CODE_STAMPER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_TIME_CODE_STAMPER))
+
+typedef struct _GstTimeCodeStamper GstTimeCodeStamper;
+typedef struct _GstTimeCodeStamperClass GstTimeCodeStamperClass;
+
+/**
+ * GstTimeCodeStamper:
+ *
+ * Opaque data structure.
+ */
+struct _GstTimeCodeStamper
+{
+ GstBaseTransform videofilter;
+
+ /* < private > */
+ gboolean override_existing;
+ gboolean drop_frame;
+ GstVideoTimeCode *current_tc;
+ GstVideoInfo vinfo;
+ GstClock *source_clock;
+};
+
+struct _GstTimeCodeStamperClass
+{
+ GstBaseTransformClass parent_class;
+};
+
+GType gst_timecodestamper_get_type (void);
+
+G_END_DECLS
+#endif /* __GST_TIME_CODE_STAMPER_H__ */
diff --git a/gst/timecode/gsttimecodewait.c b/gst/timecode/gsttimecodewait.c
new file mode 100644
index 0000000..6a8cd4a
--- /dev/null
+++ b/gst/timecode/gsttimecodewait.c
@@ -0,0 +1,639 @@
+/*
+ * GStreamer
+ * Copyright (C) 2016 Vivia Nikolaidou <vivia@toolsonair.com>
+ *
+ * Based on gstvideoframe-audiolevel.c:
+ * 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.
+ */
+
+/**
+ * SECTION:element-timecodewait
+ *
+ * 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 filesrc location="my_file" ! decodebin name=d ! "audio/x-raw" ! timecodewait name=l target-timecode-str="00:00:04:00" ! autoaudiosink d. ! "video/x-raw" ! timecodestamper ! l. l. ! queue ! timeoverlay time-mode=time-code ! autovideosink
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gsttimecodewait.h"
+
+#define GST_CAT_DEFAULT gst_timecodewait_debug
+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 ("audio/x-raw")
+ );
+
+static GstStaticPadTemplate audio_src_template =
+GST_STATIC_PAD_TEMPLATE ("asrc",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-raw")
+ );
+
+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_timecodewait_parent_class
+G_DEFINE_TYPE (GstTimeCodeWait, gst_timecodewait, GST_TYPE_ELEMENT);
+
+enum
+{
+ PROP_0,
+ PROP_TARGET_TIME_CODE,
+ PROP_TARGET_TIME_CODE_STRING
+};
+
+#define DEFAULT_TARGET_TIMECODE_STR "00:00:00:00"
+
+static void gst_timecodewait_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_timecodewait_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+static GstFlowReturn gst_timecodewait_asink_chain (GstPad * pad,
+ GstObject * parent, GstBuffer * inbuf);
+static GstFlowReturn gst_timecodewait_vsink_chain (GstPad * pad,
+ GstObject * parent, GstBuffer * inbuf);
+static gboolean gst_timecodewait_asink_event (GstPad * pad,
+ GstObject * parent, GstEvent * event);
+static gboolean gst_timecodewait_vsink_event (GstPad * pad,
+ GstObject * parent, GstEvent * event);
+static GstIterator *gst_timecodewait_iterate_internal_links (GstPad *
+ pad, GstObject * parent);
+
+static void gst_timecodewait_finalize (GObject * gobject);
+
+static GstStateChangeReturn gst_timecodewait_change_state (GstElement *
+ element, GstStateChange transition);
+
+static void
+gst_timecodewait_class_init (GstTimeCodeWaitClass * klass)
+{
+ GstElementClass *gstelement_class;
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+
+ GST_DEBUG_CATEGORY_INIT (gst_timecodewait_debug,
+ "timecodewait", 0, "timecodewait");
+
+ gstelement_class = (GstElementClass *) klass;
+
+ gst_element_class_set_static_metadata (gstelement_class,
+ "Timecode Wait", "Filter/Audio/Video",
+ "Drops all audio/video until a specific timecode has been reached",
+ "Vivia Nikolaidou <vivia@toolsonair.com>");
+
+ gobject_class->set_property = gst_timecodewait_set_property;
+ gobject_class->get_property = gst_timecodewait_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_TARGET_TIME_CODE_STRING,
+ g_param_spec_string ("target-timecode-string", "Target timecode (string)",
+ "Timecode to wait for (string). Must take the form 00:00:00:00",
+ DEFAULT_TARGET_TIMECODE_STR,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_TARGET_TIME_CODE,
+ g_param_spec_boxed ("target-timecode", "Target timecode (object)",
+ "Timecode to wait for (object)",
+ GST_TYPE_VIDEO_TIME_CODE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gobject_class->finalize = gst_timecodewait_finalize;
+ gstelement_class->change_state = gst_timecodewait_change_state;
+
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &audio_src_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &audio_sink_template);
+
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &video_src_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &video_sink_template);
+}
+
+static void
+gst_timecodewait_init (GstTimeCodeWait * self)
+{
+ self->asinkpad =
+ gst_pad_new_from_static_template (&audio_sink_template, "asink");
+ gst_pad_set_chain_function (self->asinkpad,
+ GST_DEBUG_FUNCPTR (gst_timecodewait_asink_chain));
+ gst_pad_set_event_function (self->asinkpad,
+ GST_DEBUG_FUNCPTR (gst_timecodewait_asink_event));
+ gst_pad_set_iterate_internal_links_function (self->asinkpad,
+ GST_DEBUG_FUNCPTR (gst_timecodewait_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_timecodewait_vsink_chain));
+ gst_pad_set_event_function (self->vsinkpad,
+ GST_DEBUG_FUNCPTR (gst_timecodewait_vsink_event));
+ gst_pad_set_iterate_internal_links_function (self->vsinkpad,
+ GST_DEBUG_FUNCPTR (gst_timecodewait_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_timecodewait_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_timecodewait_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->running_time_of_timecode = GST_CLOCK_TIME_NONE;
+
+ self->video_eos_flag = FALSE;
+ self->audio_flush_flag = FALSE;
+ self->shutdown_flag = FALSE;
+ self->from_string = FALSE;
+ self->tc = gst_video_time_code_new_empty ();
+
+ g_mutex_init (&self->mutex);
+ g_cond_init (&self->cond);
+}
+
+static GstStateChangeReturn
+gst_timecodewait_change_state (GstElement * element, GstStateChange transition)
+{
+ GstStateChangeReturn ret;
+ GstTimeCodeWait *self = GST_TIMECODEWAIT (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->running_time_of_timecode = GST_CLOCK_TIME_NONE;
+ gst_segment_init (&self->asegment, GST_FORMAT_UNDEFINED);
+ self->asegment.position = GST_CLOCK_TIME_NONE;
+ gst_segment_init (&self->vsegment, GST_FORMAT_UNDEFINED);
+ self->vsegment.position = GST_CLOCK_TIME_NONE;
+ g_mutex_unlock (&self->mutex);
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+static void
+gst_timecodewait_finalize (GObject * object)
+{
+ GstTimeCodeWait *self = GST_TIMECODEWAIT (object);
+
+ if (self->tc) {
+ gst_video_time_code_free (self->tc);
+ self->tc = NULL;
+ }
+
+ g_mutex_clear (&self->mutex);
+ g_cond_clear (&self->cond);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_timecodewait_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstTimeCodeWait *self = GST_TIMECODEWAIT (object);
+
+ switch (prop_id) {
+ case PROP_TARGET_TIME_CODE_STRING:{
+ if (self->tc)
+ g_value_take_string (value, gst_video_time_code_to_string (self->tc));
+ else
+ g_value_set_string (value, DEFAULT_TARGET_TIMECODE_STR);
+ break;
+ }
+ case PROP_TARGET_TIME_CODE:{
+ g_value_set_boxed (value, self->tc);
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_timecodewait_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstTimeCodeWait *self = GST_TIMECODEWAIT (object);
+
+ switch (prop_id) {
+ case PROP_TARGET_TIME_CODE_STRING:{
+ gchar **parts;
+ const gchar *tc_str;
+ guint hours, minutes, seconds, frames;
+
+ tc_str = g_value_get_string (value);
+ parts = g_strsplit (tc_str, ":", 4);
+ if (!parts || parts[3] == NULL) {
+ GST_ERROR_OBJECT (self,
+ "Error: Could not parse timecode %s. Please input a timecode in the form 00:00:00:00",
+ tc_str);
+ g_strfreev (parts);
+ return;
+ }
+ hours = g_ascii_strtoll (parts[0], NULL, 10);
+ minutes = g_ascii_strtoll (parts[1], NULL, 10);
+ seconds = g_ascii_strtoll (parts[2], NULL, 10);
+ frames = g_ascii_strtoll (parts[3], NULL, 10);
+ gst_video_time_code_init (self->tc, 0, 1, NULL, 0, hours, minutes,
+ seconds, frames, 0);
+ if (self->vinfo.finfo != NULL) {
+ self->tc->config.fps_n = self->vinfo.fps_n;
+ self->tc->config.fps_d = self->vinfo.fps_d;
+ }
+ self->from_string = TRUE;
+ g_strfreev (parts);
+ break;
+ }
+ case PROP_TARGET_TIME_CODE:{
+ if (self->tc)
+ gst_video_time_code_free (self->tc);
+ self->tc = g_value_dup_boxed (value);
+ self->from_string = FALSE;
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static gboolean
+gst_timecodewait_vsink_event (GstPad * pad, GstObject * parent,
+ GstEvent * event)
+{
+ GstTimeCodeWait *self = GST_TIMECODEWAIT (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);
+ gst_event_copy_segment (event, &self->vsegment);
+ if (self->vsegment.format != GST_FORMAT_TIME) {
+ GST_ERROR_OBJECT (self, "Invalid segment format");
+ g_mutex_unlock (&self->mutex);
+ gst_event_unref (event);
+ return FALSE;
+ }
+ self->vsegment.position = GST_CLOCK_TIME_NONE;
+ g_mutex_unlock (&self->mutex);
+ break;
+ case GST_EVENT_GAP:
+ gst_event_unref (event);
+ 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_START:
+ g_mutex_lock (&self->mutex);
+ 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;
+ case GST_EVENT_CAPS:{
+ GstCaps *caps;
+ gst_event_parse_caps (event, &caps);
+ GST_DEBUG_OBJECT (self, "Got caps %" GST_PTR_FORMAT, caps);
+ if (!gst_video_info_from_caps (&self->vinfo, caps)) {
+ gst_event_unref (event);
+ return FALSE;
+ }
+ g_mutex_lock (&self->mutex);
+ if (self->from_string) {
+ self->tc->config.fps_n = self->vinfo.fps_n;
+ self->tc->config.fps_d = self->vinfo.fps_d;
+ }
+ g_mutex_unlock (&self->mutex);
+ break;
+ }
+ default:
+ break;
+ }
+ return gst_pad_event_default (pad, parent, event);
+}
+
+static gboolean
+gst_timecodewait_asink_event (GstPad * pad, GstObject * parent,
+ GstEvent * event)
+{
+ GstTimeCodeWait *self = GST_TIMECODEWAIT (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);
+ self->running_time_of_timecode = GST_CLOCK_TIME_NONE;
+ gst_event_copy_segment (event, &self->asegment);
+ if (self->asegment.format != GST_FORMAT_TIME) {
+ GST_ERROR_OBJECT (self, "Invalid segment format");
+ g_mutex_unlock (&self->mutex);
+ return FALSE;
+ }
+ self->asegment.position = GST_CLOCK_TIME_NONE;
+ g_mutex_unlock (&self->mutex);
+ 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:
+ g_mutex_lock (&self->mutex);
+ self->audio_flush_flag = FALSE;
+ self->running_time_of_timecode = GST_CLOCK_TIME_NONE;
+ gst_segment_init (&self->asegment, GST_FORMAT_UNDEFINED);
+ self->asegment.position = GST_CLOCK_TIME_NONE;
+ g_mutex_unlock (&self->mutex);
+ break;
+ case GST_EVENT_CAPS:{
+ GstCaps *caps;
+ gst_event_parse_caps (event, &caps);
+ GST_DEBUG_OBJECT (self, "Got caps %" GST_PTR_FORMAT, caps);
+ g_mutex_lock (&self->mutex);
+ if (!gst_audio_info_from_caps (&self->ainfo, caps)) {
+ g_mutex_unlock (&self->mutex);
+ return FALSE;
+ }
+ self->running_time_of_timecode = GST_CLOCK_TIME_NONE;
+ g_mutex_unlock (&self->mutex);
+ break;
+ }
+ default:
+ break;
+ }
+
+ return gst_pad_event_default (pad, parent, event);
+}
+
+static GstFlowReturn
+gst_timecodewait_vsink_chain (GstPad * pad, GstObject * parent,
+ GstBuffer * inbuf)
+{
+ GstClockTime timestamp;
+ GstTimeCodeWait *self = GST_TIMECODEWAIT (parent);
+ GstClockTime duration;
+ GstVideoTimeCode *tc = NULL;
+ GstVideoTimeCodeMeta *tc_meta;
+
+ timestamp = GST_BUFFER_TIMESTAMP (inbuf);
+ if (timestamp == GST_CLOCK_TIME_NONE) {
+ gst_buffer_unref (inbuf);
+ return GST_FLOW_ERROR;
+ }
+ g_mutex_lock (&self->mutex);
+ self->vsegment.position = timestamp;
+ duration = GST_BUFFER_DURATION (inbuf);
+ if (duration != GST_CLOCK_TIME_NONE)
+ self->vsegment.position += duration;
+ tc_meta = gst_buffer_get_video_time_code_meta (inbuf);
+ if (tc_meta)
+ tc = &tc_meta->tc;
+ if (self->tc != NULL && tc != NULL) {
+ if (gst_video_time_code_compare (tc, self->tc) < 0
+ && self->running_time_of_timecode == GST_CLOCK_TIME_NONE) {
+ GST_DEBUG_OBJECT (self, "Timecode not yet reached, ignoring frame");
+ gst_buffer_unref (inbuf);
+ inbuf = NULL;
+ } else if (self->running_time_of_timecode == GST_CLOCK_TIME_NONE) {
+ GST_INFO_OBJECT (self, "Target timecode reached at %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (self->vsegment.position));
+ self->running_time_of_timecode =
+ gst_segment_to_running_time (&self->vsegment, GST_FORMAT_TIME,
+ self->vsegment.position);
+ }
+ }
+ g_cond_signal (&self->cond);
+ g_mutex_unlock (&self->mutex);
+ if (inbuf)
+ return gst_pad_push (self->vsrcpad, inbuf);
+ else
+ return GST_FLOW_OK;
+}
+
+/*
+ * assumes sign1 and sign2 are either 1 or -1
+ * returns 0 if sign1*num1 == sign2*num2
+ * -1 if sign1*num1 < sign2*num2
+ * 1 if sign1*num1 > sign2*num2
+ */
+static gint
+gst_timecodewait_compare_guint64_with_signs (gint sign1,
+ guint64 num1, gint sign2, guint64 num2)
+{
+ if (sign1 != sign2)
+ return sign1;
+ else if (num1 == num2)
+ return 0;
+ else
+ return num1 > num2 ? sign1 : -sign1;
+}
+
+static GstFlowReturn
+gst_timecodewait_asink_chain (GstPad * pad, GstObject * parent,
+ GstBuffer * inbuf)
+{
+ GstClockTime timestamp;
+ GstTimeCodeWait *self = GST_TIMECODEWAIT (parent);
+ GstClockTime current_running_time;
+ GstClockTime video_running_time = GST_CLOCK_TIME_NONE;
+ GstClockTime duration;
+ GstClockTime running_time_at_end = GST_CLOCK_TIME_NONE;
+ gint asign, vsign = 1, esign = 1;
+
+ timestamp = GST_BUFFER_TIMESTAMP (inbuf);
+ if (timestamp == GST_CLOCK_TIME_NONE) {
+ gst_buffer_unref (inbuf);
+ return GST_FLOW_ERROR;
+ }
+ g_mutex_lock (&self->mutex);
+ self->asegment.position = timestamp;
+ asign =
+ gst_segment_to_running_time_full (&self->asegment, GST_FORMAT_TIME,
+ self->asegment.position, ¤t_running_time);
+ if (asign == 0) {
+ g_mutex_unlock (&self->mutex);
+ gst_buffer_unref (inbuf);
+ GST_ERROR_OBJECT (self, "Could not get current running time");
+ return GST_FLOW_ERROR;
+ }
+ if (self->vsegment.format == GST_FORMAT_TIME) {
+ vsign =
+ gst_segment_to_running_time_full (&self->vsegment, GST_FORMAT_TIME,
+ self->vsegment.position, &video_running_time);
+ if (vsign == 0) {
+ video_running_time = GST_CLOCK_TIME_NONE;
+ }
+ }
+ while (!(self->video_eos_flag || self->audio_flush_flag
+ || self->shutdown_flag) && (video_running_time == GST_CLOCK_TIME_NONE
+ || gst_timecodewait_compare_guint64_with_signs (asign,
+ current_running_time, vsign, video_running_time) == 1)
+ && self->running_time_of_timecode == GST_CLOCK_TIME_NONE) {
+ g_cond_wait (&self->cond, &self->mutex);
+ vsign =
+ gst_segment_to_running_time_full (&self->vsegment, GST_FORMAT_TIME,
+ self->vsegment.position, &video_running_time);
+ if (vsign == 0) {
+ video_running_time = GST_CLOCK_TIME_NONE;
+ }
+ }
+ if (self->audio_flush_flag || self->shutdown_flag) {
+ GST_DEBUG_OBJECT (self, "Shutting down, ignoring frame");
+ gst_buffer_unref (inbuf);
+ return GST_FLOW_FLUSHING;
+ }
+ duration = GST_BUFFER_DURATION (inbuf);
+ if (duration != GST_CLOCK_TIME_NONE) {
+ esign =
+ gst_segment_to_running_time_full (&self->asegment, GST_FORMAT_TIME,
+ self->asegment.position + duration, &running_time_at_end);
+ if (esign == 0) {
+ g_mutex_unlock (&self->mutex);
+ GST_ERROR_OBJECT (self, "Could not get running time at end");
+ gst_buffer_unref (inbuf);
+ return GST_FLOW_ERROR;
+ }
+ }
+ if (self->running_time_of_timecode == GST_CLOCK_TIME_NONE
+ || gst_timecodewait_compare_guint64_with_signs (esign,
+ running_time_at_end, 1, self->running_time_of_timecode) == -1) {
+ GST_DEBUG_OBJECT (self,
+ "Dropped an audio buf at %" GST_TIME_FORMAT " with timecode %"
+ GST_TIME_FORMAT " video timecode %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (current_running_time),
+ GST_TIME_ARGS (self->running_time_of_timecode),
+ GST_TIME_ARGS (video_running_time));
+ gst_buffer_unref (inbuf);
+ inbuf = NULL;
+ } else if (current_running_time < self->running_time_of_timecode
+ && running_time_at_end > self->running_time_of_timecode) {
+ GstSegment asegment2 = self->asegment;
+
+ gst_segment_set_running_time (&asegment2, GST_FORMAT_TIME,
+ self->running_time_of_timecode);
+ inbuf =
+ gst_audio_buffer_clip (inbuf, &asegment2, self->ainfo.rate,
+ self->ainfo.bpf);
+ }
+ g_mutex_unlock (&self->mutex);
+ if (inbuf)
+ return gst_pad_push (self->asrcpad, inbuf);
+ else
+ return GST_FLOW_OK;
+}
+
+static GstIterator *
+gst_timecodewait_iterate_internal_links (GstPad * pad, GstObject * parent)
+{
+ GstIterator *it = NULL;
+ GstPad *opad;
+ GValue val = G_VALUE_INIT;
+ GstTimeCodeWait *self = GST_TIMECODEWAIT (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;
+}
diff --git a/gst/timecode/gsttimecodewait.h b/gst/timecode/gsttimecodewait.h
new file mode 100644
index 0000000..cdb2525
--- /dev/null
+++ b/gst/timecode/gsttimecodewait.h
@@ -0,0 +1,70 @@
+/*
+ * GStreamer
+ * Copyright (C) 2016 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_TIMECODEWAIT_H__
+#define __GST_TIMECODEWAIT_H__
+
+#include <gst/gst.h>
+#include <gst/audio/audio.h>
+#include <gst/video/video.h>
+
+G_BEGIN_DECLS
+#define GST_TYPE_TIMECODEWAIT (gst_timecodewait_get_type())
+#define GST_TIMECODEWAIT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TIMECODEWAIT,GstTimeCodeWait))
+#define GST_IS_TIMECODEWAIT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TIMECODEWAIT))
+#define GST_TIMECODEWAIT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_TIMECODEWAIT,GstTimeCodeWaitClass))
+#define GST_IS_TIMECODEWAIT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_TIMECODEWAIT))
+#define GST_TIMECODEWAIT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_TIMECODEWAIT,GstTimeCodeWaitClass))
+typedef struct _GstTimeCodeWait GstTimeCodeWait;
+typedef struct _GstTimeCodeWaitClass GstTimeCodeWaitClass;
+
+struct _GstTimeCodeWait
+{
+ GstElement parent;
+
+ GstVideoTimeCode *tc;
+ gboolean from_string;
+
+ GstPad *asrcpad, *asinkpad, *vsrcpad, *vsinkpad;
+
+ GstAudioInfo ainfo;
+ GstVideoInfo vinfo;
+
+ GstSegment asegment, vsegment;
+
+ GstClockTime running_time_of_timecode;
+
+ gboolean video_eos_flag;
+ gboolean audio_flush_flag;
+ gboolean shutdown_flag;
+
+ GCond cond;
+ GMutex mutex;
+};
+
+struct _GstTimeCodeWaitClass
+{
+ GstElementClass parent_class;
+};
+
+GType gst_timecodewait_get_type (void);
+
+G_END_DECLS
+#endif /* __GST_TIMECODEWAIT_H__ */
diff --git a/gst/timecode/plugin.c b/gst/timecode/plugin.c
new file mode 100644
index 0000000..8bfcbe9
--- /dev/null
+++ b/gst/timecode/plugin.c
@@ -0,0 +1,48 @@
+/*
+ * GStreamer
+ * Copyright (C) 2016 Vivia Nikolaidou <vivia@toolsonair.com>
+ *
+ * plugin.c
+ *
+ * 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 "gsttimecodestamper.h"
+#include "gsttimecodewait.h"
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ gboolean ret;
+
+ ret = gst_element_register (plugin, "timecodestamper", GST_RANK_NONE,
+ GST_TYPE_TIME_CODE_STAMPER);
+
+ ret &= gst_element_register (plugin, "timecodewait", GST_RANK_NONE,
+ GST_TYPE_TIMECODEWAIT);
+
+ return ret;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ timecode,
+ "Timecode-related elements",
+ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
diff --git a/gst/tta/Makefile.in b/gst/tta/Makefile.in
index 034146d..f8a5a25 100644
--- a/gst/tta/Makefile.in
+++ b/gst/tta/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/tta/gstttadec.c b/gst/tta/gstttadec.c
index f4e29a2..1aa9d95 100644
--- a/gst/tta/gstttadec.c
+++ b/gst/tta/gstttadec.c
@@ -171,10 +171,8 @@
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
gst_element_class_set_static_metadata (element_class, "TTA audio decoder",
"Codec/Decoder/Audio",
"Decode TTA audio data", "Arwed v. Merkatz <v.merkatz@gmx.net>");
diff --git a/gst/tta/gstttaparse.c b/gst/tta/gstttaparse.c
index 9d3b8b4..485a197 100644
--- a/gst/tta/gstttaparse.c
+++ b/gst/tta/gstttaparse.c
@@ -92,10 +92,8 @@
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
gst_element_class_set_static_metadata (element_class, "TTA file parser",
"Codec/Demuxer/Audio",
"Parses TTA files", "Arwed v. Merkatz <v.merkatz@gmx.net>");
@@ -470,9 +468,7 @@
if (ret == GST_FLOW_UNEXPECTED) {
gst_pad_push_event (ttaparse->srcpad, gst_event_new_eos ());
} else if (ret < GST_FLOW_UNEXPECTED || ret == GST_FLOW_NOT_LINKED) {
- GST_ELEMENT_ERROR (ttaparse, STREAM, FAILED,
- ("Internal data stream error."),
- ("streaming stopped, reason %s", gst_flow_get_name (ret)));
+ GST_ELEMENT_FLOW_ERROR (ttaparse, ret);
gst_pad_push_event (ttaparse->srcpad, gst_event_new_eos ());
}
}
diff --git a/gst/videofilters/Makefile.in b/gst/videofilters/Makefile.in
index 65f842a..88928cc 100644
--- a/gst/videofilters/Makefile.in
+++ b/gst/videofilters/Makefile.in
@@ -308,6 +308,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -329,6 +331,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -378,6 +382,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -523,6 +529,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -649,8 +657,6 @@
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@
@@ -693,8 +699,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/videofilters/gstvideodiff.c b/gst/videofilters/gstvideodiff.c
index 6f5b35e..457ebd1 100644
--- a/gst/videofilters/gstvideodiff.c
+++ b/gst/videofilters/gstvideodiff.c
@@ -1,5 +1,5 @@
/* GStreamer
- * Copyright (C) 2013 FIXME <fixme@example.com>
+ * Copyright (C) 2013 David Schleef <ds@schleef.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -19,14 +19,14 @@
/**
* SECTION:element-gstvideodiff
*
- * The videodiff element does FIXME stuff.
+ * The videodiff element highlights the difference between a frame and its
+ * previous on the luma plane.
*
* <refsect2>
* <title>Example launch line</title>
* |[
- * gst-launch-1.0 -v fakesrc ! videodiff ! FIXME ! fakesink
+ * gst-launch-1.0 -v videotestsrc pattern=ball ! videodiff ! videoconvert ! autovideosink
* ]|
- * FIXME Describe what the pipeline does.
* </refsect2>
*/
@@ -47,24 +47,13 @@
static GstFlowReturn gst_video_diff_transform_frame (GstVideoFilter * filter,
GstVideoFrame * inframe, GstVideoFrame * outframe);
-enum
-{
- PROP_0
-};
-
-/* pad templates */
-
-/* FIXME: add/remove formats you can handle */
#define VIDEO_SRC_CAPS \
- GST_VIDEO_CAPS_MAKE("{ I420, Y444, Y42B, UYVY, RGBA }")
+ GST_VIDEO_CAPS_MAKE("{ I420, Y444, Y42B, Y41B }")
-/* FIXME: add/remove formats you can handle */
#define VIDEO_SINK_CAPS \
- GST_VIDEO_CAPS_MAKE("{ I420, Y444, Y42B, UYVY, RGBA }")
+ GST_VIDEO_CAPS_MAKE("{ I420, Y444, Y42B, Y41B }")
-/* class initialization */
-
G_DEFINE_TYPE_WITH_CODE (GstVideoDiff, gst_video_diff, GST_TYPE_VIDEO_FILTER,
GST_DEBUG_CATEGORY_INIT (gst_video_diff_debug_category, "videodiff", 0,
"debug category for videodiff element"));
@@ -74,8 +63,6 @@
{
GstVideoFilterClass *video_filter_class = GST_VIDEO_FILTER_CLASS (klass);
- /* Setting up pads and setting metadata should be moved to
- base_class_init if you intend to subclass this class. */
gst_element_class_add_pad_template (GST_ELEMENT_CLASS (klass),
gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
gst_caps_from_string (VIDEO_SRC_CAPS)));
@@ -84,12 +71,12 @@
gst_caps_from_string (VIDEO_SINK_CAPS)));
gst_element_class_set_static_metadata (GST_ELEMENT_CLASS (klass),
- "FIXME Long name", "Generic", "FIXME Description",
- "FIXME <fixme@example.com>");
+ "Video Diff", "Video/Filter",
+ "Visualize differences between adjacent video frames",
+ "David Schleef <ds@schleef.org>");
video_filter_class->transform_frame =
GST_DEBUG_FUNCPTR (gst_video_diff_transform_frame);
-
}
static void
diff --git a/gst/videofilters/gstvideodiff.h b/gst/videofilters/gstvideodiff.h
index c91844a..8d76d70 100644
--- a/gst/videofilters/gstvideodiff.h
+++ b/gst/videofilters/gstvideodiff.h
@@ -1,5 +1,5 @@
/* GStreamer
- * Copyright (C) 2013 FIXME <fixme@example.com>
+ * Copyright (C) 2013 David Schleef <ds@schleef.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
diff --git a/gst/videoframe_audiolevel/Makefile.in b/gst/videoframe_audiolevel/Makefile.in
index 61b80d8..c5a6d3a 100644
--- a/gst/videoframe_audiolevel/Makefile.in
+++ b/gst/videoframe_audiolevel/Makefile.in
@@ -305,6 +305,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -326,6 +328,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -375,6 +379,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -520,6 +526,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -646,8 +654,6 @@
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@
@@ -690,8 +696,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/videoframe_audiolevel/gstvideoframe-audiolevel.c b/gst/videoframe_audiolevel/gstvideoframe-audiolevel.c
index ade9966..46fda77 100644
--- a/gst/videoframe_audiolevel/gstvideoframe-audiolevel.c
+++ b/gst/videoframe_audiolevel/gstvideoframe-audiolevel.c
@@ -122,15 +122,15 @@
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_static_pad_template (gstelement_class,
+ &audio_src_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &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));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &video_src_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &video_sink_template);
}
static void
diff --git a/gst/videomeasure/Makefile.in b/gst/videomeasure/Makefile.in
index d99030c..c173c8c 100644
--- a/gst/videomeasure/Makefile.in
+++ b/gst/videomeasure/Makefile.in
@@ -306,6 +306,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -327,6 +329,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -376,6 +380,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -521,6 +527,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -647,8 +655,6 @@
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@
@@ -691,8 +697,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/videomeasure/gstvideomeasure_collector.c b/gst/videomeasure/gstvideomeasure_collector.c
index 448adc4..3778bbf 100644
--- a/gst/videomeasure/gstvideomeasure_collector.c
+++ b/gst/videomeasure/gstvideomeasure_collector.c
@@ -320,10 +320,10 @@
"Collect measurements from a measuring element",
"Руслан Ижбулатов <lrn _at_ gmail _dot_ com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_measure_collector_sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_measure_collector_src_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_measure_collector_sink_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_measure_collector_src_template);
}
static void
diff --git a/gst/videomeasure/gstvideomeasure_ssim.c b/gst/videomeasure/gstvideomeasure_ssim.c
index 13ba035..d0a2c9d 100644
--- a/gst/videomeasure/gstvideomeasure_ssim.c
+++ b/gst/videomeasure/gstvideomeasure_ssim.c
@@ -1095,15 +1095,14 @@
"(only when using Gaussian window).",
G_MINFLOAT, 10, 1.5, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_ssim_src_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_ssim_sink_original_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_ssim_sink_modified_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_ssim_src_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_ssim_sink_original_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_ssim_sink_modified_template);
gst_element_class_set_static_metadata (gstelement_class, "SSim",
- "Filter/Analyzer/Video",
- "Calculate Y-SSIM for n+2 YUV video streams",
+ "Filter/Analyzer/Video", "Calculate Y-SSIM for n+2 YUV video streams",
"Руслан Ижбулатов <lrn1986 _at_ gmail _dot_ com>");
parent_class = g_type_class_peek_parent (klass);
diff --git a/gst/videoparsers/Makefile.am b/gst/videoparsers/Makefile.am
index f1b0a11..f81cc0e 100644
--- a/gst/videoparsers/Makefile.am
+++ b/gst/videoparsers/Makefile.am
@@ -5,6 +5,7 @@
gstdiracparse.c dirac_parse.c \
gsth264parse.c gstmpegvideoparse.c \
gstmpeg4videoparse.c \
+ gstjpeg2000parse.c \
gstpngparse.c \
gstvc1parse.c \
gsth265parse.c
@@ -29,6 +30,7 @@
gstdiracparse.h dirac_parse.h \
gsth264parse.h gstmpegvideoparse.h \
gstmpeg4videoparse.h \
+ gstjpeg2000parse.h \
gstpngparse.h \
gstvc1parse.h \
gsth265parse.h
diff --git a/gst/videoparsers/Makefile.in b/gst/videoparsers/Makefile.in
index 9b99433..97892f4 100644
--- a/gst/videoparsers/Makefile.in
+++ b/gst/videoparsers/Makefile.in
@@ -175,6 +175,7 @@
libgstvideoparsersbad_la-gsth264parse.lo \
libgstvideoparsersbad_la-gstmpegvideoparse.lo \
libgstvideoparsersbad_la-gstmpeg4videoparse.lo \
+ libgstvideoparsersbad_la-gstjpeg2000parse.lo \
libgstvideoparsersbad_la-gstpngparse.lo \
libgstvideoparsersbad_la-gstvc1parse.lo \
libgstvideoparsersbad_la-gsth265parse.lo
@@ -315,6 +316,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -336,6 +339,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -385,6 +390,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -530,6 +537,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -656,8 +665,6 @@
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@
@@ -700,8 +707,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -796,6 +808,7 @@
gstdiracparse.c dirac_parse.c \
gsth264parse.c gstmpegvideoparse.c \
gstmpeg4videoparse.c \
+ gstjpeg2000parse.c \
gstpngparse.c \
gstvc1parse.c \
gsth265parse.c
@@ -821,6 +834,7 @@
gstdiracparse.h dirac_parse.h \
gsth264parse.h gstmpegvideoparse.h \
gstmpeg4videoparse.h \
+ gstjpeg2000parse.h \
gstpngparse.h \
gstvc1parse.h \
gsth265parse.h
@@ -908,6 +922,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideoparsersbad_la-gsth263parse.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideoparsersbad_la-gsth264parse.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideoparsersbad_la-gsth265parse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideoparsersbad_la-gstjpeg2000parse.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideoparsersbad_la-gstmpeg4videoparse.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideoparsersbad_la-gstmpegvideoparse.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideoparsersbad_la-gstpngparse.Plo@am__quote@
@@ -995,6 +1010,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 $(libgstvideoparsersbad_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoparsersbad_la_CFLAGS) $(CFLAGS) -c -o libgstvideoparsersbad_la-gstmpeg4videoparse.lo `test -f 'gstmpeg4videoparse.c' || echo '$(srcdir)/'`gstmpeg4videoparse.c
+libgstvideoparsersbad_la-gstjpeg2000parse.lo: gstjpeg2000parse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoparsersbad_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoparsersbad_la_CFLAGS) $(CFLAGS) -MT libgstvideoparsersbad_la-gstjpeg2000parse.lo -MD -MP -MF $(DEPDIR)/libgstvideoparsersbad_la-gstjpeg2000parse.Tpo -c -o libgstvideoparsersbad_la-gstjpeg2000parse.lo `test -f 'gstjpeg2000parse.c' || echo '$(srcdir)/'`gstjpeg2000parse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideoparsersbad_la-gstjpeg2000parse.Tpo $(DEPDIR)/libgstvideoparsersbad_la-gstjpeg2000parse.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstjpeg2000parse.c' object='libgstvideoparsersbad_la-gstjpeg2000parse.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 $(libgstvideoparsersbad_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoparsersbad_la_CFLAGS) $(CFLAGS) -c -o libgstvideoparsersbad_la-gstjpeg2000parse.lo `test -f 'gstjpeg2000parse.c' || echo '$(srcdir)/'`gstjpeg2000parse.c
+
libgstvideoparsersbad_la-gstpngparse.lo: gstpngparse.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoparsersbad_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoparsersbad_la_CFLAGS) $(CFLAGS) -MT libgstvideoparsersbad_la-gstpngparse.lo -MD -MP -MF $(DEPDIR)/libgstvideoparsersbad_la-gstpngparse.Tpo -c -o libgstvideoparsersbad_la-gstpngparse.lo `test -f 'gstpngparse.c' || echo '$(srcdir)/'`gstpngparse.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideoparsersbad_la-gstpngparse.Tpo $(DEPDIR)/libgstvideoparsersbad_la-gstpngparse.Plo
diff --git a/gst/videoparsers/gstdiracparse.c b/gst/videoparsers/gstdiracparse.c
index 93f00c6..c674cb8 100644
--- a/gst/videoparsers/gstdiracparse.c
+++ b/gst/videoparsers/gstdiracparse.c
@@ -109,10 +109,10 @@
gobject_class->dispose = gst_dirac_parse_dispose;
gobject_class->finalize = gst_dirac_parse_finalize;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_dirac_parse_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_dirac_parse_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_dirac_parse_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_dirac_parse_sink_template);
gst_element_class_set_static_metadata (element_class, "Dirac parser",
"Codec/Parser/Video", "Parses Dirac streams",
diff --git a/gst/videoparsers/gsth263parse.c b/gst/videoparsers/gsth263parse.c
index 370cbb1..0f4d42e 100644
--- a/gst/videoparsers/gsth263parse.c
+++ b/gst/videoparsers/gsth263parse.c
@@ -73,10 +73,8 @@
GST_DEBUG_CATEGORY_INIT (h263_parse_debug, "h263parse", 0, "h263 parser");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&srctemplate));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sinktemplate));
+ gst_element_class_add_static_pad_template (gstelement_class, &srctemplate);
+ gst_element_class_add_static_pad_template (gstelement_class, &sinktemplate);
gst_element_class_set_static_metadata (gstelement_class, "H.263 parser",
"Codec/Parser/Video",
"Parses H.263 streams",
diff --git a/gst/videoparsers/gsth264parse.c b/gst/videoparsers/gsth264parse.c
index 05b6b75..095a645 100644
--- a/gst/videoparsers/gsth264parse.c
+++ b/gst/videoparsers/gsth264parse.c
@@ -129,11 +129,12 @@
gobject_class->get_property = gst_h264_parse_get_property;
g_object_class_install_property (gobject_class, PROP_CONFIG_INTERVAL,
- g_param_spec_uint ("config-interval",
+ g_param_spec_int ("config-interval",
"SPS PPS Send Interval",
"Send SPS and PPS Insertion Interval in seconds (sprop parameter sets "
- "will be multiplexed in the data stream when detected.) (0 = disabled)",
- 0, 3600, DEFAULT_CONFIG_INTERVAL,
+ "will be multiplexed in the data stream when detected.) "
+ "(0 = disabled, -1 = send with every IDR frame)",
+ -1, 3600, DEFAULT_CONFIG_INTERVAL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
/* Override BaseParse vfuncs */
@@ -147,10 +148,8 @@
parse_class->sink_event = GST_DEBUG_FUNCPTR (gst_h264_parse_event);
parse_class->src_event = GST_DEBUG_FUNCPTR (gst_h264_parse_src_event);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&srctemplate));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sinktemplate));
+ gst_element_class_add_static_pad_template (gstelement_class, &srctemplate);
+ gst_element_class_add_static_pad_template (gstelement_class, &sinktemplate);
gst_element_class_set_static_metadata (gstelement_class, "H.264 parser",
"Codec/Parser/Converter/Video",
@@ -1054,6 +1053,7 @@
GstH264NalUnit nalu;
GstH264ParserResult pres;
gint framesize;
+ GstFlowReturn ret;
if (G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (frame->buffer,
GST_BUFFER_FLAG_DISCONT))) {
@@ -1087,7 +1087,9 @@
GST_LOG_OBJECT (h264parse, "resuming frame parsing");
}
- drain = GST_BASE_PARSE_DRAINING (parse);
+ /* Always consume the entire input buffer when in_align == ALIGN_AU */
+ drain = GST_BASE_PARSE_DRAINING (parse)
+ || h264parse->in_align == GST_H264_PARSE_ALIGN_AU;
nonext = FALSE;
current_off = h264parse->current_off;
@@ -1104,6 +1106,22 @@
switch (pres) {
case GST_H264_PARSER_OK:
if (nalu.sc_offset > 0) {
+ int i;
+ gboolean is_filler_data = TRUE;
+ /* Handle filler data */
+ for (i = 0; i < nalu.sc_offset; i++) {
+ if (data[i] != 0x00) {
+ is_filler_data = FALSE;
+ break;
+ }
+ }
+ if (is_filler_data) {
+ GST_DEBUG_OBJECT (parse, "Dropping filler data %d", nalu.sc_offset);
+ frame->flags |= GST_BASE_PARSE_FRAME_FLAG_DROP;
+ gst_buffer_unmap (buffer, &map);
+ ret = gst_base_parse_finish_frame (parse, frame, nalu.sc_offset);
+ goto drop;
+ }
*skipsize = nalu.sc_offset;
goto skip;
}
@@ -1239,6 +1257,10 @@
gst_buffer_unmap (buffer, &map);
return GST_FLOW_OK;
+drop:
+ GST_DEBUG_OBJECT (h264parse, "Dropped data");
+ return ret;
+
skip:
GST_DEBUG_OBJECT (h264parse, "skipping %d", *skipsize);
/* If we are collecting access units, we need to preserve the initial
@@ -1613,7 +1635,12 @@
profile = "scalable-baseline";
break;
case 86:
- profile = "scalable-high";
+ if (sps->constraint_set3_flag)
+ profile = "scalable-high-intra";
+ else if (sps->constraint_set5_flag)
+ profile = "scalable-constrained-high";
+ else
+ profile = "scalable-high";
break;
default:
return NULL;
@@ -1919,6 +1946,8 @@
g_return_if_fail (out_ts != NULL);
upstream = *out_ts;
+ GST_LOG_OBJECT (h264parse, "Upstream ts %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (upstream));
if (!frame) {
GST_LOG_OBJECT (h264parse, "no frame data -> 0 duration");
@@ -2201,6 +2230,92 @@
parse->push_codec = TRUE;
}
+static gboolean
+gst_h264_parse_handle_sps_pps_nals (GstH264Parse * h264parse,
+ GstBuffer * buffer, GstBaseParseFrame * frame)
+{
+ GstBuffer *codec_nal;
+ gint i;
+ gboolean send_done = FALSE;
+ GstClockTime timestamp = GST_BUFFER_TIMESTAMP (buffer);
+
+ if (h264parse->align == GST_H264_PARSE_ALIGN_NAL) {
+ /* send separate config NAL buffers */
+ GST_DEBUG_OBJECT (h264parse, "- sending SPS/PPS");
+ for (i = 0; i < GST_H264_MAX_SPS_COUNT; i++) {
+ if ((codec_nal = h264parse->sps_nals[i])) {
+ GST_DEBUG_OBJECT (h264parse, "sending SPS nal");
+ gst_h264_parse_push_codec_buffer (h264parse, codec_nal, timestamp);
+ send_done = TRUE;
+ }
+ }
+ for (i = 0; i < GST_H264_MAX_PPS_COUNT; i++) {
+ if ((codec_nal = h264parse->pps_nals[i])) {
+ GST_DEBUG_OBJECT (h264parse, "sending PPS nal");
+ gst_h264_parse_push_codec_buffer (h264parse, codec_nal, timestamp);
+ send_done = TRUE;
+ }
+ }
+ } else {
+ /* insert config NALs into AU */
+ GstByteWriter bw;
+ GstBuffer *new_buf;
+ const gboolean bs = h264parse->format == GST_H264_PARSE_FORMAT_BYTE;
+ const gint nls = 4 - h264parse->nal_length_size;
+ gboolean ok;
+
+ gst_byte_writer_init_with_size (&bw, gst_buffer_get_size (buffer), FALSE);
+ ok = gst_byte_writer_put_buffer (&bw, buffer, 0, h264parse->idr_pos);
+ GST_DEBUG_OBJECT (h264parse, "- inserting SPS/PPS");
+ for (i = 0; i < GST_H264_MAX_SPS_COUNT; i++) {
+ if ((codec_nal = h264parse->sps_nals[i])) {
+ gsize nal_size = gst_buffer_get_size (codec_nal);
+ GST_DEBUG_OBJECT (h264parse, "inserting SPS nal");
+ if (bs) {
+ ok &= gst_byte_writer_put_uint32_be (&bw, 1);
+ } else {
+ ok &= gst_byte_writer_put_uint32_be (&bw, (nal_size << (nls * 8)));
+ ok &= gst_byte_writer_set_pos (&bw,
+ gst_byte_writer_get_pos (&bw) - nls);
+ }
+
+ ok &= gst_byte_writer_put_buffer (&bw, codec_nal, 0, nal_size);
+ send_done = TRUE;
+ }
+ }
+ for (i = 0; i < GST_H264_MAX_PPS_COUNT; i++) {
+ if ((codec_nal = h264parse->pps_nals[i])) {
+ gsize nal_size = gst_buffer_get_size (codec_nal);
+ GST_DEBUG_OBJECT (h264parse, "inserting PPS nal");
+ if (bs) {
+ ok &= gst_byte_writer_put_uint32_be (&bw, 1);
+ } else {
+ ok &= gst_byte_writer_put_uint32_be (&bw, (nal_size << (nls * 8)));
+ ok &= gst_byte_writer_set_pos (&bw,
+ gst_byte_writer_get_pos (&bw) - nls);
+ }
+ ok &= gst_byte_writer_put_buffer (&bw, codec_nal, 0, nal_size);
+ send_done = TRUE;
+ }
+ }
+ ok &= gst_byte_writer_put_buffer (&bw, buffer, h264parse->idr_pos, -1);
+ /* collect result and push */
+ new_buf = gst_byte_writer_reset_and_get_buffer (&bw);
+ gst_buffer_copy_into (new_buf, buffer, GST_BUFFER_COPY_METADATA, 0, -1);
+ /* should already be keyframe/IDR, but it may not have been,
+ * so mark it as such to avoid being discarded by picky decoder */
+ GST_BUFFER_FLAG_UNSET (new_buf, GST_BUFFER_FLAG_DELTA_UNIT);
+ gst_buffer_replace (&frame->out_buffer, new_buf);
+ gst_buffer_unref (new_buf);
+ /* some result checking seems to make some compilers happy */
+ if (G_UNLIKELY (!ok)) {
+ GST_ERROR_OBJECT (h264parse, "failed to insert SPS/PPS");
+ }
+ }
+
+ return send_done;
+}
+
static GstFlowReturn
gst_h264_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
{
@@ -2276,93 +2391,14 @@
if (GST_TIME_AS_SECONDS (diff) >= h264parse->interval ||
initial_frame || h264parse->push_codec) {
- GstBuffer *codec_nal;
- gint i;
GstClockTime new_ts;
/* avoid overwriting a perfectly fine timestamp */
new_ts = GST_CLOCK_TIME_IS_VALID (timestamp) ? timestamp :
h264parse->last_report;
- if (h264parse->align == GST_H264_PARSE_ALIGN_NAL) {
- /* send separate config NAL buffers */
- GST_DEBUG_OBJECT (h264parse, "- sending SPS/PPS");
- for (i = 0; i < GST_H264_MAX_SPS_COUNT; i++) {
- if ((codec_nal = h264parse->sps_nals[i])) {
- GST_DEBUG_OBJECT (h264parse, "sending SPS nal");
- gst_h264_parse_push_codec_buffer (h264parse, codec_nal,
- timestamp);
- h264parse->last_report = new_ts;
- }
- }
- for (i = 0; i < GST_H264_MAX_PPS_COUNT; i++) {
- if ((codec_nal = h264parse->pps_nals[i])) {
- GST_DEBUG_OBJECT (h264parse, "sending PPS nal");
- gst_h264_parse_push_codec_buffer (h264parse, codec_nal,
- timestamp);
- h264parse->last_report = new_ts;
- }
- }
- } else {
- /* insert config NALs into AU */
- GstByteWriter bw;
- GstBuffer *new_buf;
- const gboolean bs = h264parse->format == GST_H264_PARSE_FORMAT_BYTE;
- const gint nls = 4 - h264parse->nal_length_size;
- gboolean ok;
-
- gst_byte_writer_init_with_size (&bw, gst_buffer_get_size (buffer),
- FALSE);
- ok = gst_byte_writer_put_buffer (&bw, buffer, 0, h264parse->idr_pos);
- GST_DEBUG_OBJECT (h264parse, "- inserting SPS/PPS");
- for (i = 0; i < GST_H264_MAX_SPS_COUNT; i++) {
- if ((codec_nal = h264parse->sps_nals[i])) {
- gsize nal_size = gst_buffer_get_size (codec_nal);
- GST_DEBUG_OBJECT (h264parse, "inserting SPS nal");
- if (bs) {
- ok &= gst_byte_writer_put_uint32_be (&bw, 1);
- } else {
- ok &= gst_byte_writer_put_uint32_be (&bw,
- (nal_size << (nls * 8)));
- ok &= gst_byte_writer_set_pos (&bw,
- gst_byte_writer_get_pos (&bw) - nls);
- }
-
- ok &= gst_byte_writer_put_buffer (&bw, codec_nal, 0, nal_size);
- h264parse->last_report = new_ts;
- }
- }
- for (i = 0; i < GST_H264_MAX_PPS_COUNT; i++) {
- if ((codec_nal = h264parse->pps_nals[i])) {
- gsize nal_size = gst_buffer_get_size (codec_nal);
- GST_DEBUG_OBJECT (h264parse, "inserting PPS nal");
- if (bs) {
- ok &= gst_byte_writer_put_uint32_be (&bw, 1);
- } else {
- ok &= gst_byte_writer_put_uint32_be (&bw,
- (nal_size << (nls * 8)));
- ok &= gst_byte_writer_set_pos (&bw,
- gst_byte_writer_get_pos (&bw) - nls);
- }
- ok &= gst_byte_writer_put_buffer (&bw, codec_nal, 0, nal_size);
- h264parse->last_report = new_ts;
- }
- }
- ok &=
- gst_byte_writer_put_buffer (&bw, buffer, h264parse->idr_pos, -1);
- /* collect result and push */
- new_buf = gst_byte_writer_reset_and_get_buffer (&bw);
- gst_buffer_copy_into (new_buf, buffer, GST_BUFFER_COPY_METADATA, 0,
- -1);
- /* should already be keyframe/IDR, but it may not have been,
- * so mark it as such to avoid being discarded by picky decoder */
- GST_BUFFER_FLAG_UNSET (new_buf, GST_BUFFER_FLAG_DELTA_UNIT);
- gst_buffer_replace (&frame->out_buffer, new_buf);
- gst_buffer_unref (new_buf);
- /* some result checking seems to make some compilers happy */
- if (G_UNLIKELY (!ok)) {
- GST_ERROR_OBJECT (h264parse, "failed to insert SPS/PPS");
- }
+ if (gst_h264_parse_handle_sps_pps_nals (h264parse, buffer, frame)) {
+ h264parse->last_report = new_ts;
}
}
/* we pushed whatever we had */
@@ -2371,6 +2407,18 @@
h264parse->have_pps = FALSE;
h264parse->state &= GST_H264_PARSE_STATE_VALID_PICTURE_HEADERS;
}
+ } else if (h264parse->interval == -1) {
+ if (h264parse->idr_pos >= 0) {
+ GST_LOG_OBJECT (h264parse, "IDR nal at offset %d", h264parse->idr_pos);
+
+ gst_h264_parse_handle_sps_pps_nals (h264parse, buffer, frame);
+
+ /* we pushed whatever we had */
+ h264parse->push_codec = FALSE;
+ h264parse->have_sps = FALSE;
+ h264parse->have_pps = FALSE;
+ h264parse->state &= GST_H264_PARSE_STATE_VALID_PICTURE_HEADERS;
+ }
}
/* Fixme: setting passthrough mode casuing multiple issues:
@@ -2593,6 +2641,8 @@
h264parse->packetized = TRUE;
}
+ h264parse->in_align = align;
+
return TRUE;
/* ERRORS */
@@ -2801,7 +2851,7 @@
switch (prop_id) {
case PROP_CONFIG_INTERVAL:
- parse->interval = g_value_get_uint (value);
+ parse->interval = g_value_get_int (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -2819,7 +2869,7 @@
switch (prop_id) {
case PROP_CONFIG_INTERVAL:
- g_value_set_uint (value, parse->interval);
+ g_value_set_int (value, parse->interval);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
diff --git a/gst/videoparsers/gsth264parse.h b/gst/videoparsers/gsth264parse.h
index 58d818c..c71990b 100644
--- a/gst/videoparsers/gsth264parse.h
+++ b/gst/videoparsers/gsth264parse.h
@@ -71,6 +71,7 @@
/* state */
GstH264NalParser *nalparser;
guint state;
+ guint in_align;
guint align;
guint format;
gint current_off;
@@ -118,7 +119,7 @@
gboolean picture_start;
/* props */
- guint interval;
+ gint interval;
GstClockTime pending_key_unit_ts;
GstEvent *force_key_unit_event;
diff --git a/gst/videoparsers/gsth265parse.c b/gst/videoparsers/gsth265parse.c
index 26e7c48..68fbe8d 100644
--- a/gst/videoparsers/gsth265parse.c
+++ b/gst/videoparsers/gsth265parse.c
@@ -124,10 +124,8 @@
parse_class->sink_event = GST_DEBUG_FUNCPTR (gst_h265_parse_event);
parse_class->src_event = GST_DEBUG_FUNCPTR (gst_h265_parse_src_event);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&srctemplate));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sinktemplate));
+ gst_element_class_add_static_pad_template (gstelement_class, &srctemplate);
+ gst_element_class_add_static_pad_template (gstelement_class, &sinktemplate);
gst_element_class_set_static_metadata (gstelement_class, "H.265 parser",
"Codec/Parser/Converter/Video",
@@ -1146,7 +1144,7 @@
GST_WRITE_UINT16_BE (data, num_vps);
data += 2;
- for (i = 0; i < num_vps; i++) {
+ for (i = 0; i < GST_H265_MAX_VPS_COUNT; i++) {
if ((nal = h265parse->vps_nals[i])) {
gsize nal_size = gst_buffer_get_size (nal);
GST_WRITE_UINT16_BE (data, nal_size);
@@ -1165,7 +1163,7 @@
GST_WRITE_UINT16_BE (data, num_sps);
data += 2;
- for (i = 0; i < num_sps; i++) {
+ for (i = 0; i < GST_H265_MAX_SPS_COUNT; i++) {
if ((nal = h265parse->sps_nals[i])) {
gsize nal_size = gst_buffer_get_size (nal);
GST_WRITE_UINT16_BE (data, nal_size);
@@ -1184,7 +1182,7 @@
GST_WRITE_UINT16_BE (data, num_pps);
data += 2;
- for (i = 0; i < num_pps; i++) {
+ for (i = 0; i < GST_H265_MAX_PPS_COUNT; i++) {
if ((nal = h265parse->pps_nals[i])) {
gsize nal_size = gst_buffer_get_size (nal);
GST_WRITE_UINT16_BE (data, nal_size);
@@ -2049,9 +2047,10 @@
off = 23;
for (i = 0; i < data[22]; i++) {
num_nals = GST_READ_UINT16_BE (data + off + 1);
+ off += 3;
for (j = 0; j < num_nals; j++) {
parseres = gst_h265_parser_identify_nalu_hevc (h265parse->nalparser,
- data, off + 3, size, 2, &nalu);
+ data, off, size, 2, &nalu);
if (parseres != GST_H265_PARSER_OK) {
gst_buffer_unmap (codec_data, &map);
diff --git a/gst/videoparsers/gstjpeg2000parse.c b/gst/videoparsers/gstjpeg2000parse.c
new file mode 100644
index 0000000..6468bf0
--- /dev/null
+++ b/gst/videoparsers/gstjpeg2000parse.c
@@ -0,0 +1,536 @@
+/* GStreamer JPEG 2000 Parser
+ * Copyright (C) <2016> Grok Image Compession Inc.
+ * @author Aaron Boxer <boxerab@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 "gstjpeg2000parse.h"
+#include <gst/base/base.h>
+
+
+
+static void
+gst_jpeg2000_parse_get_subsampling (GstJPEG2000Sampling sampling, guint8 * dx,
+ guint8 * dy)
+{
+ *dx = 1;
+ *dy = 1;
+ if (sampling == GST_JPEG2000_SAMPLING_YBR422) {
+ *dx = 2;
+ } else if (sampling == GST_JPEG2000_SAMPLING_YBR420) {
+ *dx = 2;
+ *dy = 2;
+ } else if (sampling == GST_JPEG2000_SAMPLING_YBR410) {
+ *dx = 4;
+ *dy = 2;
+ }
+}
+
+#define GST_JPEG2000_JP2_SIZE_OF_BOX_ID 4
+#define GST_JPEG2000_JP2_SIZE_OF_BOX_LEN 4
+#define GST_JPEG2000_MARKER_SIZE 4
+
+
+/* J2C has 8 bytes preceding J2K magic: 4 for size of box, and 4 for fourcc */
+#define GST_JPEG2000_PARSE_SIZE_OF_J2C_PREFIX_BYTES (GST_JPEG2000_JP2_SIZE_OF_BOX_LEN + GST_JPEG2000_JP2_SIZE_OF_BOX_ID)
+
+/* SOC marker plus minimum size of SIZ marker */
+#define GST_JPEG2000_PARSE_MIN_FRAME_SIZE (GST_JPEG2000_MARKER_SIZE + GST_JPEG2000_PARSE_SIZE_OF_J2C_PREFIX_BYTES + 36)
+
+#define GST_JPEG2000_PARSE_J2K_MAGIC 0xFF4FFF51
+
+GST_DEBUG_CATEGORY (jpeg2000_parse_debug);
+#define GST_CAT_DEFAULT jpeg2000_parse_debug
+
+static GstStaticPadTemplate srctemplate =
+ GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("image/x-jpc,"
+ " width = (int)[1, MAX], height = (int)[1, MAX],"
+ GST_JPEG2000_SAMPLING_LIST ","
+ GST_JPEG2000_COLORSPACE_LIST ","
+ " parsed = (boolean) true;"
+ "image/x-j2c,"
+ " width = (int)[1, MAX], height = (int)[1, MAX],"
+ GST_JPEG2000_SAMPLING_LIST ","
+ GST_JPEG2000_COLORSPACE_LIST "," " parsed = (boolean) true")
+ );
+
+static GstStaticPadTemplate sinktemplate =
+ GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("image/x-jpc,"
+ GST_JPEG2000_SAMPLING_LIST ";"
+ "image/x-jpc, "
+ GST_JPEG2000_COLORSPACE_LIST ";"
+ "image/x-j2c,"
+ GST_JPEG2000_SAMPLING_LIST ";"
+ "image/x-j2c, " GST_JPEG2000_COLORSPACE_LIST)
+ );
+
+#define parent_class gst_jpeg2000_parse_parent_class
+G_DEFINE_TYPE (GstJPEG2000Parse, gst_jpeg2000_parse, GST_TYPE_BASE_PARSE);
+
+static gboolean gst_jpeg2000_parse_start (GstBaseParse * parse);
+static gboolean gst_jpeg2000_parse_event (GstBaseParse * parse,
+ GstEvent * event);
+static GstFlowReturn gst_jpeg2000_parse_handle_frame (GstBaseParse * parse,
+ GstBaseParseFrame * frame, gint * skipsize);
+static gboolean gst_jpeg2000_parse_set_sink_caps (GstBaseParse * parse,
+ GstCaps * caps);
+
+static void
+gst_jpeg2000_parse_class_init (GstJPEG2000ParseClass * klass)
+{
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+ GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass);
+
+ GST_DEBUG_CATEGORY_INIT (jpeg2000_parse_debug, "jpeg2000parse", 0,
+ "jpeg 2000 parser");
+
+ gst_element_class_add_static_pad_template (gstelement_class, &srctemplate);
+ gst_element_class_add_static_pad_template (gstelement_class, &sinktemplate);
+ gst_element_class_set_static_metadata (gstelement_class, "JPEG 2000 parser",
+ "Codec/Parser/Video/Image",
+ "Parses JPEG 2000 files", "Aaron Boxer <boxerab@gmail.com>");
+
+ /* Override BaseParse vfuncs */
+ parse_class->set_sink_caps =
+ GST_DEBUG_FUNCPTR (gst_jpeg2000_parse_set_sink_caps);
+ parse_class->start = GST_DEBUG_FUNCPTR (gst_jpeg2000_parse_start);
+ parse_class->sink_event = GST_DEBUG_FUNCPTR (gst_jpeg2000_parse_event);
+ parse_class->handle_frame =
+ GST_DEBUG_FUNCPTR (gst_jpeg2000_parse_handle_frame);
+}
+
+static gboolean
+gst_jpeg2000_parse_start (GstBaseParse * parse)
+{
+ GstJPEG2000Parse *jpeg2000parse = GST_JPEG2000_PARSE (parse);
+ GST_DEBUG_OBJECT (jpeg2000parse, "start");
+ gst_base_parse_set_min_frame_size (parse, GST_JPEG2000_PARSE_MIN_FRAME_SIZE);
+
+ jpeg2000parse->width = 0;
+ jpeg2000parse->height = 0;
+
+ jpeg2000parse->sampling = GST_JPEG2000_SAMPLING_NONE;
+ jpeg2000parse->colorspace = GST_JPEG2000_COLORSPACE_NONE;
+ jpeg2000parse->codec_format = GST_JPEG2000_PARSE_NO_CODEC;
+ return TRUE;
+}
+
+
+static void
+gst_jpeg2000_parse_init (GstJPEG2000Parse * jpeg2000parse)
+{
+ GST_PAD_SET_ACCEPT_INTERSECT (GST_BASE_PARSE_SINK_PAD (jpeg2000parse));
+ GST_PAD_SET_ACCEPT_TEMPLATE (GST_BASE_PARSE_SINK_PAD (jpeg2000parse));
+}
+
+static gboolean
+gst_jpeg2000_parse_set_sink_caps (GstBaseParse * parse, GstCaps * caps)
+{
+ GstJPEG2000Parse *jpeg2000parse = GST_JPEG2000_PARSE (parse);
+ GstStructure *caps_struct = gst_caps_get_structure (caps, 0);
+
+ if (gst_structure_has_name (caps_struct, "image/jp2")) {
+ jpeg2000parse->codec_format = GST_JPEG2000_PARSE_JP2;
+ } else if (gst_structure_has_name (caps_struct, "image/x-j2c")) {
+ jpeg2000parse->codec_format = GST_JPEG2000_PARSE_J2C;
+ } else if (gst_structure_has_name (caps_struct, "image/x-jpc")) {
+ jpeg2000parse->codec_format = GST_JPEG2000_PARSE_JPC;
+ }
+
+ return TRUE;
+}
+
+static gboolean
+gst_jpeg2000_parse_event (GstBaseParse * parse, GstEvent * event)
+{
+ gboolean res = GST_BASE_PARSE_CLASS (parent_class)->sink_event (parse, event);
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_STOP:
+ gst_base_parse_set_min_frame_size (parse,
+ GST_JPEG2000_PARSE_MIN_FRAME_SIZE);
+ break;
+ default:
+ break;
+ }
+ return res;
+}
+
+static GstFlowReturn
+gst_jpeg2000_parse_handle_frame (GstBaseParse * parse,
+ GstBaseParseFrame * frame, gint * skipsize)
+{
+ GstJPEG2000Parse *jpeg2000parse = GST_JPEG2000_PARSE (parse);
+ GstMapInfo map;
+ GstByteReader reader;
+ GstFlowReturn ret = GST_FLOW_OK;
+ guint eoc_offset = 0;
+ GstCaps *current_caps = NULL;
+ GstStructure *current_caps_struct = NULL;
+ const gchar *colorspace_string = NULL;
+ GstJPEG2000Colorspace colorspace = GST_JPEG2000_COLORSPACE_NONE;
+ guint x0, y0, x1, y1;
+ guint width = 0, height = 0;
+ guint8 dx[GST_JPEG2000_PARSE_MAX_SUPPORTED_COMPONENTS];
+ guint8 dy[GST_JPEG2000_PARSE_MAX_SUPPORTED_COMPONENTS];
+ guint16 numcomps;
+ guint16 compno;
+ GstJPEG2000Sampling parsed_sampling = GST_JPEG2000_SAMPLING_NONE;
+ const gchar *sink_sampling_string = NULL;
+ GstJPEG2000Sampling sink_sampling = GST_JPEG2000_SAMPLING_NONE;
+ GstJPEG2000Sampling source_sampling = GST_JPEG2000_SAMPLING_NONE;
+ guint magic_offset = 0;
+ guint j2c_box_id_offset = 0;
+ guint num_prefix_bytes = 0; /* number of bytes to skip before actual code stream */
+ GstCaps *src_caps = NULL;
+ guint frame_size = 0;
+ gboolean is_j2c = jpeg2000parse->codec_format == GST_JPEG2000_PARSE_J2C;
+
+ if (!gst_buffer_map (frame->buffer, &map, GST_MAP_READ)) {
+ GST_ERROR_OBJECT (jpeg2000parse, "Unable to map buffer");
+ return GST_FLOW_ERROR;
+ }
+
+ gst_byte_reader_init (&reader, map.data, map.size);
+ num_prefix_bytes = GST_JPEG2000_MARKER_SIZE;
+
+ if (is_j2c) {
+ num_prefix_bytes +=
+ GST_JPEG2000_JP2_SIZE_OF_BOX_LEN + GST_JPEG2000_JP2_SIZE_OF_BOX_ID;
+ /* check for "jp2c" */
+ j2c_box_id_offset = gst_byte_reader_masked_scan_uint32 (&reader, 0xffffffff,
+ GST_MAKE_FOURCC ('j', 'p', '2', 'c'), 0,
+ gst_byte_reader_get_remaining (&reader));
+
+ if (j2c_box_id_offset == -1) {
+ GST_ELEMENT_ERROR (jpeg2000parse, STREAM, DECODE, NULL,
+ ("Missing contiguous code stream box for j2c stream"));
+ ret = GST_FLOW_ERROR;
+ goto beach;
+ }
+ }
+
+ /* Look for magic. If found, skip to beginning of frame */
+ magic_offset = gst_byte_reader_masked_scan_uint32 (&reader, 0xffffffff,
+ GST_JPEG2000_PARSE_J2K_MAGIC, 0, gst_byte_reader_get_remaining (&reader));
+ if (magic_offset == -1) {
+ *skipsize = gst_byte_reader_get_size (&reader) - num_prefix_bytes;
+ goto beach;
+ }
+
+ /* see if we need to skip any bytes at beginning of frame */
+ GST_DEBUG_OBJECT (jpeg2000parse, "Found magic at offset = %d", magic_offset);
+ if (magic_offset > 0) {
+ *skipsize = magic_offset;
+ /* J2C has 8 bytes preceding J2K magic */
+ if (is_j2c)
+ *skipsize -= GST_JPEG2000_PARSE_SIZE_OF_J2C_PREFIX_BYTES;
+ if (*skipsize > 0)
+ goto beach;
+ }
+
+ if (is_j2c) {
+ /* sanity check on box id offset */
+ if (j2c_box_id_offset + GST_JPEG2000_JP2_SIZE_OF_BOX_ID != magic_offset) {
+ GST_ELEMENT_ERROR (jpeg2000parse, STREAM, DECODE, NULL,
+ ("Corrupt contiguous code stream box for j2c stream"));
+ ret = GST_FLOW_ERROR;
+ goto beach;
+ }
+
+ /* check that we have enough bytes for the J2C box length */
+ if (j2c_box_id_offset < GST_JPEG2000_JP2_SIZE_OF_BOX_LEN) {
+ *skipsize = gst_byte_reader_get_size (&reader) - num_prefix_bytes;
+ goto beach;
+ }
+
+ if (!gst_byte_reader_skip (&reader,
+ j2c_box_id_offset - GST_JPEG2000_JP2_SIZE_OF_BOX_LEN))
+ goto beach;
+
+ /* read the box length, and adjust num_prefix_bytes accordingly */
+ if (!gst_byte_reader_get_uint32_be (&reader, &frame_size))
+ goto beach;
+ num_prefix_bytes -= GST_JPEG2000_JP2_SIZE_OF_BOX_LEN;
+
+ /* bail out if not enough data for frame */
+ if ((gst_byte_reader_get_size (&reader) < frame_size))
+ goto beach;
+ }
+
+ /* 2 to skip marker size, and another 2 to skip rsiz field */
+ if (!gst_byte_reader_skip (&reader, num_prefix_bytes + 2 + 2))
+ goto beach;
+
+ if (!gst_byte_reader_get_uint32_be (&reader, &x1))
+ goto beach;
+
+ if (!gst_byte_reader_get_uint32_be (&reader, &y1))
+ goto beach;
+
+ if (!gst_byte_reader_get_uint32_be (&reader, &x0))
+ goto beach;
+
+ if (!gst_byte_reader_get_uint32_be (&reader, &y0))
+ goto beach;
+
+ /* sanity check on image dimensions */
+ if (x1 < x0 || y1 < y0) {
+ GST_ELEMENT_ERROR (jpeg2000parse, STREAM, DECODE, NULL,
+ ("Nonsensical image dimensions %d,%d,%d,%d", x0, y0, x1, y1));
+ ret = GST_FLOW_ERROR;
+ goto beach;
+ }
+
+ width = x1 - x0;
+ height = y1 - y0;
+
+ GST_DEBUG_OBJECT (jpeg2000parse, "Parsed image dimensions %d,%d", width,
+ height);
+
+ /* skip tile dimensions */
+ if (!gst_byte_reader_skip (&reader, 4 * 4))
+ goto beach;
+
+ /* read number of components */
+ if (!gst_byte_reader_get_uint16_be (&reader, &numcomps))
+ goto beach;
+
+ if (numcomps == 2 || numcomps > GST_JPEG2000_PARSE_MAX_SUPPORTED_COMPONENTS) {
+ GST_ELEMENT_ERROR (jpeg2000parse, STREAM, DECODE, NULL,
+ ("Unsupported number of components %d", numcomps));
+ ret = GST_FLOW_NOT_NEGOTIATED;
+ goto beach;
+ }
+
+ current_caps = gst_pad_get_current_caps (GST_BASE_PARSE_SINK_PAD (parse));
+ if (!current_caps) {
+ GST_ERROR_OBJECT (jpeg2000parse, "Unable to get current caps");
+ ret = GST_FLOW_NOT_NEGOTIATED;
+ goto beach;
+ }
+
+ current_caps_struct = gst_caps_get_structure (current_caps, 0);
+ if (!current_caps_struct) {
+ GST_ERROR_OBJECT (jpeg2000parse,
+ "Unable to get structure of current caps struct");
+ ret = GST_FLOW_NOT_NEGOTIATED;
+ goto beach;
+ }
+
+ colorspace_string = gst_structure_get_string
+ (current_caps_struct, "colorspace");
+ if (colorspace_string)
+ colorspace = gst_jpeg2000_colorspace_from_string (colorspace_string);
+ sink_sampling_string = gst_structure_get_string
+ (current_caps_struct, "sampling");
+ if (sink_sampling_string)
+ sink_sampling = gst_jpeg2000_sampling_from_string (sink_sampling_string);
+
+ for (compno = 0; compno < numcomps; ++compno) {
+
+ /* skip Ssiz (precision and signed/unsigned bit ) */
+ if (!gst_byte_reader_skip (&reader, 1))
+ goto beach;
+
+ if (!gst_byte_reader_get_uint8 (&reader, dx + compno))
+ goto beach;
+
+ if (!gst_byte_reader_get_uint8 (&reader, dy + compno))
+ goto beach;
+
+ GST_DEBUG_OBJECT (jpeg2000parse,
+ "Parsed sub-sampling %d,%d for component %d", dx[compno], dy[compno],
+ compno);
+ }
+
+ /*** sanity check on sub-sampling *****/
+ if (dx[0] != 1 || dy[0] != 1) {
+ GST_WARNING_OBJECT (jpeg2000parse, "Sub-sampled luma channel");
+ }
+ if (dx[1] != dx[2] || dy[1] != dy[2]) {
+ GST_WARNING_OBJECT (jpeg2000parse,
+ "Chroma channel sub-sampling factors are not equal");
+ }
+ for (compno = 0; compno < numcomps; ++compno) {
+ if (colorspace != GST_JPEG2000_COLORSPACE_NONE
+ && (colorspace != GST_JPEG2000_COLORSPACE_YUV)
+ && (dx[compno] > 1 || dy[compno] > 1)) {
+ GST_WARNING_OBJECT (jpeg2000parse,
+ "Sub-sampled RGB or monochrome color spaces");
+ }
+ if (sink_sampling != GST_JPEG2000_SAMPLING_NONE) {
+ guint8 dx_caps, dy_caps;
+ gst_jpeg2000_parse_get_subsampling (sink_sampling, &dx_caps, &dy_caps);
+ if (dx_caps != dx[compno] || dy_caps != dy[compno]) {
+ GstJPEG2000Colorspace inferred_colorspace =
+ GST_JPEG2000_COLORSPACE_NONE;
+ GST_WARNING_OBJECT (jpeg2000parse,
+ "Sink caps sub-sampling %d,%d for channel %d does not match stream sub-sampling %d,%d",
+ dx_caps, dy_caps, compno, dx[compno], dy[compno]);
+ /* try to guess correct color space */
+ if (gst_jpeg2000_sampling_is_mono (sink_sampling))
+ inferred_colorspace = GST_JPEG2000_COLORSPACE_GRAY;
+ else if (gst_jpeg2000_sampling_is_rgb (sink_sampling))
+ inferred_colorspace = GST_JPEG2000_COLORSPACE_RGB;
+ else if (gst_jpeg2000_sampling_is_yuv (sink_sampling))
+ inferred_colorspace = GST_JPEG2000_COLORSPACE_YUV;
+ else if (colorspace)
+ inferred_colorspace = colorspace;
+ if (inferred_colorspace != GST_JPEG2000_COLORSPACE_NONE) {
+ sink_sampling = GST_JPEG2000_SAMPLING_NONE;
+ colorspace = inferred_colorspace;
+ break;
+ } else {
+ /* unrecognized sink_sampling and no colorspace */
+ GST_ERROR_OBJECT (jpeg2000parse,
+ "Unrecognized sink sampling field and no sink colorspace field");
+ ret = GST_FLOW_NOT_NEGOTIATED;
+ goto beach;
+ }
+ }
+ }
+ }
+ /*************************************/
+
+ /* if colorspace is present, we can work out the parsed_sampling field */
+ if (colorspace != GST_JPEG2000_COLORSPACE_NONE) {
+ if (colorspace == GST_JPEG2000_COLORSPACE_YUV) {
+ if (numcomps == 4) {
+ guint i;
+ parsed_sampling = GST_JPEG2000_SAMPLING_YBRA4444_EXT;
+ for (i = 0; i < 4; ++i) {
+ if (dx[i] > 1 || dy[i] > 1) {
+ GST_WARNING_OBJECT (jpeg2000parse, "Sub-sampled YUVA images");
+ }
+ }
+ } else if (numcomps == 3) {
+ /* use sub-sampling from U chroma channel */
+ if (dx[1] == 1 && dy[1] == 1) {
+ parsed_sampling = GST_JPEG2000_SAMPLING_YBR444;
+ } else if (dx[1] == 2 && dy[1] == 2) {
+ parsed_sampling = GST_JPEG2000_SAMPLING_YBR420;
+ } else if (dx[1] == 4 && dy[1] == 2) {
+ parsed_sampling = GST_JPEG2000_SAMPLING_YBR410;
+ } else if (dx[1] == 2 && dy[1] == 1) {
+ parsed_sampling = GST_JPEG2000_SAMPLING_YBR422;
+ } else {
+ GST_WARNING_OBJECT (jpeg2000parse,
+ "Unsupported sub-sampling factors %d,%d", dx[1], dy[1]);
+ /* best effort */
+ parsed_sampling = GST_JPEG2000_SAMPLING_YBR444;
+ }
+ }
+ } else if (colorspace == GST_JPEG2000_COLORSPACE_GRAY) {
+ parsed_sampling = GST_JPEG2000_SAMPLING_GRAYSCALE;
+ } else {
+ parsed_sampling =
+ (numcomps ==
+ 4) ? GST_JPEG2000_SAMPLING_RGBA : GST_JPEG2000_SAMPLING_RGB;
+ }
+ } else {
+ if (gst_jpeg2000_sampling_is_mono (sink_sampling)) {
+ colorspace = GST_JPEG2000_COLORSPACE_GRAY;
+ } else if (gst_jpeg2000_sampling_is_rgb (sink_sampling)) {
+ colorspace = GST_JPEG2000_COLORSPACE_RGB;
+ } else {
+ /* best effort */
+ colorspace = GST_JPEG2000_COLORSPACE_YUV;
+ }
+ }
+
+ /* now we can set the source caps, if something has changed */
+ source_sampling =
+ sink_sampling !=
+ GST_JPEG2000_SAMPLING_NONE ? sink_sampling : parsed_sampling;
+ if (width != jpeg2000parse->width || height != jpeg2000parse->height
+ || jpeg2000parse->sampling != source_sampling
+ || jpeg2000parse->colorspace != colorspace) {
+ gint fr_num = 0, fr_denom = 0;
+
+ jpeg2000parse->width = width;
+ jpeg2000parse->height = height;
+ jpeg2000parse->sampling = source_sampling;
+ jpeg2000parse->colorspace = colorspace;
+
+ src_caps =
+ gst_caps_new_simple (gst_structure_get_name (current_caps_struct),
+ "width", G_TYPE_INT, width, "height", G_TYPE_INT, height,
+ "colorspace", G_TYPE_STRING,
+ gst_jpeg2000_colorspace_to_string (colorspace), "sampling",
+ G_TYPE_STRING, gst_jpeg2000_sampling_to_string (source_sampling), NULL);
+
+ if (gst_structure_get_fraction (current_caps_struct, "framerate", &fr_num,
+ &fr_denom)) {
+ gst_caps_set_simple (src_caps, "framerate", GST_TYPE_FRACTION, fr_num,
+ fr_denom, NULL);
+ } else {
+ GST_WARNING_OBJECT (jpeg2000parse, "No framerate set");
+ }
+ if (!gst_pad_set_caps (GST_BASE_PARSE_SRC_PAD (parse), src_caps)) {
+ GST_ERROR_OBJECT (jpeg2000parse, "Unable to set source caps");
+ ret = GST_FLOW_NOT_NEGOTIATED;
+ gst_caps_unref (src_caps);
+ goto beach;
+ }
+ gst_caps_unref (src_caps);
+ }
+ /*************************************************/
+
+ /* look for EOC to mark frame end */
+ /* look for EOC end of codestream marker */
+ eoc_offset = gst_byte_reader_masked_scan_uint32 (&reader, 0x0000ffff,
+ 0xFFD9, 0, gst_byte_reader_get_remaining (&reader));
+
+ if (eoc_offset != -1) {
+ /* add 4 for eoc marker and eoc marker size */
+ guint eoc_frame_size = gst_byte_reader_get_pos (&reader) + eoc_offset + 4;
+ GST_DEBUG_OBJECT (jpeg2000parse,
+ "Found EOC at offset = %d, frame size = %d", eoc_offset,
+ eoc_frame_size);
+
+ /* bail out if not enough data for frame */
+ if (gst_byte_reader_get_size (&reader) < eoc_frame_size)
+ goto beach;
+
+ if (frame_size && frame_size != eoc_frame_size) {
+ GST_WARNING_OBJECT (jpeg2000parse,
+ "Frame size %d from contiguous code size does not equal frame size %d signalled by eoc",
+ frame_size, eoc_frame_size);
+ }
+ frame_size = eoc_frame_size;
+ }
+
+ /* clean up and finish frame */
+ if (current_caps)
+ gst_caps_unref (current_caps);
+ gst_buffer_unmap (frame->buffer, &map);
+ return gst_base_parse_finish_frame (parse, frame, frame_size);
+
+beach:
+ if (current_caps)
+ gst_caps_unref (current_caps);
+ gst_buffer_unmap (frame->buffer, &map);
+ return ret;
+}
diff --git a/gst/videoparsers/gstjpeg2000parse.h b/gst/videoparsers/gstjpeg2000parse.h
new file mode 100644
index 0000000..93236db
--- /dev/null
+++ b/gst/videoparsers/gstjpeg2000parse.h
@@ -0,0 +1,79 @@
+/* GStreamer JPEG 2000 Parser
+ * Copyright (C) <2016> Grok Image Compression Inc.
+ * @author Aaron Boxer <boxerab@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_JPEG2000_PARSE_H__
+#define __GST_JPEG2000_PARSE_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstadapter.h>
+#include <gst/base/gstbaseparse.h>
+#include <gst/codecparsers/gstjpeg2000sampling.h>
+
+G_BEGIN_DECLS
+#define GST_TYPE_JPEG2000_PARSE \
+ (gst_jpeg2000_parse_get_type())
+#define GST_JPEG2000_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_JPEG2000_PARSE,GstJPEG2000Parse))
+#define GST_JPEG2000_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_JPEG2000_PARSE,GstJPEG2000ParseClass))
+#define GST_IS_JPEG2000_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_JPEG2000_PARSE))
+#define GST_IS_JPEG2000_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_JPEG2000_PARSE))
+ GType gst_jpeg2000_parse_get_type (void);
+
+typedef struct _GstJPEG2000Parse GstJPEG2000Parse;
+typedef struct _GstJPEG2000ParseClass GstJPEG2000ParseClass;
+
+#define GST_JPEG2000_PARSE_MAX_SUPPORTED_COMPONENTS 4
+
+typedef enum
+{
+ GST_JPEG2000_PARSE_NO_CODEC,
+ GST_JPEG2000_PARSE_JPC, /* jpeg 2000 code stream */
+ GST_JPEG2000_PARSE_J2C, /* jpeg 2000 contiguous code stream box plus code stream */
+ GST_JPEG2000_PARSE_JP2, /* jpeg 2000 part I file format */
+
+} GstJPEG2000ParseFormats;
+
+
+struct _GstJPEG2000Parse
+{
+ GstBaseParse baseparse;
+
+
+ guint width;
+ guint height;
+
+ GstJPEG2000Sampling sampling;
+ GstJPEG2000Colorspace colorspace;
+ GstJPEG2000ParseFormats codec_format;
+};
+
+struct _GstJPEG2000ParseClass
+{
+ GstBaseParseClass parent_class;
+
+
+};
+
+
+G_END_DECLS
+#endif
diff --git a/gst/videoparsers/gstmpeg4videoparse.c b/gst/videoparsers/gstmpeg4videoparse.c
index a1fd3b2..83f6f94 100644
--- a/gst/videoparsers/gstmpeg4videoparse.c
+++ b/gst/videoparsers/gstmpeg4videoparse.c
@@ -154,10 +154,8 @@
0, 3600, DEFAULT_CONFIG_INTERVAL,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- 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));
+ gst_element_class_add_static_pad_template (element_class, &src_template);
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_set_static_metadata (element_class,
"MPEG 4 video elementary stream parser", "Codec/Parser/Video",
diff --git a/gst/videoparsers/gstmpegvideoparse.c b/gst/videoparsers/gstmpegvideoparse.c
index bf71a3e..6896339 100644
--- a/gst/videoparsers/gstmpegvideoparse.c
+++ b/gst/videoparsers/gstmpegvideoparse.c
@@ -146,10 +146,8 @@
"Split frame when encountering GOP", DEFAULT_PROP_GOP_SPLIT,
G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- 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));
+ gst_element_class_add_static_pad_template (element_class, &src_template);
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_set_static_metadata (element_class,
"MPEG video elementary stream parser",
diff --git a/gst/videoparsers/gstpngparse.c b/gst/videoparsers/gstpngparse.c
index e9d0768..6df53bd 100644
--- a/gst/videoparsers/gstpngparse.c
+++ b/gst/videoparsers/gstpngparse.c
@@ -63,10 +63,8 @@
GST_DEBUG_CATEGORY_INIT (png_parse_debug, "pngparse", 0, "png parser");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&srctemplate));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sinktemplate));
+ gst_element_class_add_static_pad_template (gstelement_class, &srctemplate);
+ gst_element_class_add_static_pad_template (gstelement_class, &sinktemplate);
gst_element_class_set_static_metadata (gstelement_class, "PNG parser",
"Codec/Parser/Video/Image",
"Parses PNG files", "Olivier Crete <olivier.crete@collabora.com>");
diff --git a/gst/videoparsers/gstvc1parse.c b/gst/videoparsers/gstvc1parse.c
index e72f4f6..915e0fc 100644
--- a/gst/videoparsers/gstvc1parse.c
+++ b/gst/videoparsers/gstvc1parse.c
@@ -222,10 +222,8 @@
gobject_class->finalize = gst_vc1_parse_finalize;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&srctemplate));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sinktemplate));
+ gst_element_class_add_static_pad_template (element_class, &srctemplate);
+ gst_element_class_add_static_pad_template (element_class, &sinktemplate);
gst_element_class_set_static_metadata (element_class, "VC1 parser",
"Codec/Parser/Converter/Video",
diff --git a/gst/videoparsers/plugin.c b/gst/videoparsers/plugin.c
index 79d1df6..2deddf4 100644
--- a/gst/videoparsers/plugin.c
+++ b/gst/videoparsers/plugin.c
@@ -28,6 +28,7 @@
#include "gstmpegvideoparse.h"
#include "gstmpeg4videoparse.h"
#include "gstpngparse.h"
+#include "gstjpeg2000parse.h"
#include "gstvc1parse.h"
#include "gsth265parse.h"
@@ -48,6 +49,8 @@
GST_RANK_PRIMARY + 1, GST_TYPE_MPEG4VIDEO_PARSE);
ret |= gst_element_register (plugin, "pngparse",
GST_RANK_PRIMARY, GST_TYPE_PNG_PARSE);
+ ret |= gst_element_register (plugin, "jpeg2000parse",
+ GST_RANK_PRIMARY, GST_TYPE_JPEG2000_PARSE);
ret |= gst_element_register (plugin, "h265parse",
GST_RANK_SECONDARY, GST_TYPE_H265_PARSE);
ret |= gst_element_register (plugin, "vc1parse",
diff --git a/gst/videosignal/Makefile.in b/gst/videosignal/Makefile.in
index 2561d03..afcb48b 100644
--- a/gst/videosignal/Makefile.in
+++ b/gst/videosignal/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/vmnc/Makefile.in b/gst/vmnc/Makefile.in
index c0c3e00..523a4a6 100644
--- a/gst/vmnc/Makefile.in
+++ b/gst/vmnc/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/vmnc/vmncdec.c b/gst/vmnc/vmncdec.c
index 5504302..e8d498c 100644
--- a/gst/vmnc/vmncdec.c
+++ b/gst/vmnc/vmncdec.c
@@ -93,13 +93,12 @@
decoder_class->set_format = gst_vmnc_dec_set_format;
decoder_class->sink_event = gst_vmnc_dec_sink_event;
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&vmnc_dec_src_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&vmnc_dec_sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &vmnc_dec_src_factory);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &vmnc_dec_sink_factory);
gst_element_class_set_static_metadata (gstelement_class, "VMnc video decoder",
- "Codec/Decoder/Video",
- "Decode VmWare video to raw (RGB) video",
+ "Codec/Decoder/Video", "Decode VmWare video to raw (RGB) video",
"Michael Smith <msmith@xiph.org>");
GST_DEBUG_CATEGORY_INIT (vmnc_debug, "vmncdec", 0, "VMnc decoder");
diff --git a/gst/y4m/Makefile.in b/gst/y4m/Makefile.in
index eb19efb..03d499a 100644
--- a/gst/y4m/Makefile.in
+++ b/gst/y4m/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/y4m/gsty4mdec.c b/gst/y4m/gsty4mdec.c
index c6b2065..30966b0 100644
--- a/gst/y4m/gsty4mdec.c
+++ b/gst/y4m/gsty4mdec.c
@@ -106,10 +106,10 @@
element_class->change_state = GST_DEBUG_FUNCPTR (gst_y4m_dec_change_state);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_y4m_dec_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_y4m_dec_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_y4m_dec_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_y4m_dec_sink_template);
gst_element_class_set_static_metadata (element_class,
"YUV4MPEG demuxer/decoder", "Codec/Demuxer",
diff --git a/gst/yadif/Makefile.in b/gst/yadif/Makefile.in
index 724c7f7..19e5dae 100644
--- a/gst/yadif/Makefile.in
+++ b/gst/yadif/Makefile.in
@@ -300,6 +300,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -321,6 +323,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -370,6 +374,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -515,6 +521,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -641,8 +649,6 @@
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@
@@ -685,8 +691,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/gst/yadif/gstyadif.c b/gst/yadif/gstyadif.c
index 1dcf2ca..b75894e 100644
--- a/gst/yadif/gstyadif.c
+++ b/gst/yadif/gstyadif.c
@@ -131,10 +131,10 @@
/* Setting up pads and setting metadata should be moved to
base_class_init if you intend to subclass this class. */
- gst_element_class_add_pad_template (GST_ELEMENT_CLASS (klass),
- gst_static_pad_template_get (&gst_yadif_sink_template));
- gst_element_class_add_pad_template (GST_ELEMENT_CLASS (klass),
- gst_static_pad_template_get (&gst_yadif_src_template));
+ gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS (klass),
+ &gst_yadif_sink_template);
+ gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS (klass),
+ &gst_yadif_src_template);
gst_element_class_set_static_metadata (GST_ELEMENT_CLASS (klass),
"YADIF deinterlacer", "Video/Filter",
diff --git a/ltmain.sh b/ltmain.sh
index 2ad8be8..a736cf9 100644
--- a/ltmain.sh
+++ b/ltmain.sh
@@ -31,7 +31,7 @@
PROGRAM=libtool
PACKAGE=libtool
-VERSION="2.4.6 Debian-2.4.6-1"
+VERSION="2.4.6 Debian-2.4.6-2"
package_revision=2.4.6
@@ -1977,7 +1977,7 @@
# End:
# Set a version string.
-scriptversion='(GNU libtool) 2.4.6 Debian-2.4.6-1'
+scriptversion='(GNU libtool) 2.4.6'
# func_echo ARG...
@@ -2068,7 +2068,7 @@
compiler: $LTCC
compiler flags: $LTCFLAGS
linker: $LD (gnu? $with_gnu_ld)
- version: $progname $scriptversion
+ version: $progname $scriptversion Debian-2.4.6-2
automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q`
diff --git a/m4/Makefile.in b/m4/Makefile.in
index 83c49f2..41206e5 100644
--- a/m4/Makefile.in
+++ b/m4/Makefile.in
@@ -216,6 +216,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -237,6 +239,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -286,6 +290,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -431,6 +437,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -557,8 +565,6 @@
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@
@@ -601,8 +607,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/pkgconfig/Makefile.in b/pkgconfig/Makefile.in
index d70331d..e3e957f 100644
--- a/pkgconfig/Makefile.in
+++ b/pkgconfig/Makefile.in
@@ -278,6 +278,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -299,6 +301,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -348,6 +352,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -493,6 +499,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -619,8 +627,6 @@
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@
@@ -663,8 +669,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/pkgconfig/gstreamer-gl.pc.in b/pkgconfig/gstreamer-gl.pc.in
index 5589e2a..112ce21 100644
--- a/pkgconfig/gstreamer-gl.pc.in
+++ b/pkgconfig/gstreamer-gl.pc.in
@@ -10,4 +10,4 @@
Requires: gstreamer-base-@GST_API_VERSION@ gstreamer-@GST_API_VERSION@
Libs: -L${libdir} -lgstgl-@GST_API_VERSION@ @GL_LIBS@
-Cflags: -I${includedir} @GL_CFLAGS@
+Cflags: -I${includedir} -I${libdir}/gstreamer-@GST_API_VERSION@/include @GL_CFLAGS@
diff --git a/pkgconfig/gstreamer-player-uninstalled.pc.in b/pkgconfig/gstreamer-player-uninstalled.pc.in
index 5a495f4..5c2c0d7 100644
--- a/pkgconfig/gstreamer-player-uninstalled.pc.in
+++ b/pkgconfig/gstreamer-player-uninstalled.pc.in
@@ -5,7 +5,7 @@
Name: GStreamer Player, Uninstalled
Description: GStreamer Player convenience library, uninstalled
-Requires: gstreamer-@GST_API_VERSION@
+Requires: gstreamer-@GST_API_VERSION@ gstreamer-video-@GST_API_VERSION@
Version: @VERSION@
Libs: -L${libdir} -lgstplayer-@GST_API_VERSION@
Cflags: -I${includedir}
diff --git a/pkgconfig/gstreamer-player.pc.in b/pkgconfig/gstreamer-player.pc.in
index f296e7f..6400261 100644
--- a/pkgconfig/gstreamer-player.pc.in
+++ b/pkgconfig/gstreamer-player.pc.in
@@ -5,7 +5,7 @@
Name: GStreamer Player
Description: GStreamer Player convenience library
-Requires: gstreamer-@GST_API_VERSION@
+Requires: gstreamer-@GST_API_VERSION@ gstreamer-video-@GST_API_VERSION@
Version: @VERSION@
Libs: -L${libdir} -lgstplayer-@GST_API_VERSION@
Cflags: -I${includedir}
diff --git a/po/af.gmo b/po/af.gmo
index 716fa90..0c11cda 100644
--- a/po/af.gmo
+++ b/po/af.gmo
Binary files differ
diff --git a/po/af.po b/po/af.po
index e0d0471..afc2616 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -16,6 +16,12 @@
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -63,9 +69,6 @@
msgid "Could not start sndio"
msgstr "Kon nie skryf na lêer \"%s\" nie."
-msgid "Internal data flow error."
-msgstr ""
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
@@ -85,10 +88,10 @@
msgid "Failed to get fragment URL."
msgstr ""
-msgid "Internal data stream error."
+msgid "Couldn't download fragments"
msgstr ""
-msgid "Couldn't download fragments"
+msgid "Internal data stream error."
msgstr ""
#, fuzzy
@@ -130,11 +133,23 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr ""
-msgid "DVB channel configuration file doesn't contain any channels"
+#, c-format
+msgid "Couldn't find details for DVB channel %s"
msgstr ""
#, c-format
-msgid "Couldn't find details for DVB channel %s"
+msgid "No properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr ""
+
+msgid "DVB channel configuration file doesn't contain any channels"
msgstr ""
#~ msgid "Could not write to file \"%s\"."
diff --git a/po/az.gmo b/po/az.gmo
index 341801d..f1eb31e 100644
--- a/po/az.gmo
+++ b/po/az.gmo
Binary files differ
diff --git a/po/az.po b/po/az.po
index 7bef016..bae75a2 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -17,6 +17,12 @@
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: KBabel 1.0.2\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -64,9 +70,6 @@
msgid "Could not start sndio"
msgstr "\"%s\" faylına yazıla bilmədi."
-msgid "Internal data flow error."
-msgstr ""
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
@@ -86,10 +89,10 @@
msgid "Failed to get fragment URL."
msgstr ""
-msgid "Internal data stream error."
+msgid "Couldn't download fragments"
msgstr ""
-msgid "Couldn't download fragments"
+msgid "Internal data stream error."
msgstr ""
#, fuzzy
@@ -131,11 +134,23 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr ""
-msgid "DVB channel configuration file doesn't contain any channels"
+#, c-format
+msgid "Couldn't find details for DVB channel %s"
msgstr ""
#, c-format
-msgid "Couldn't find details for DVB channel %s"
+msgid "No properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr ""
+
+msgid "DVB channel configuration file doesn't contain any channels"
msgstr ""
#~ msgid "Could not write to file \"%s\"."
diff --git a/po/bg.gmo b/po/bg.gmo
index bdc87b7..0a21e7f 100644
--- a/po/bg.gmo
+++ b/po/bg.gmo
Binary files differ
diff --git a/po/bg.po b/po/bg.po
index 9e3fbdf..8b52a90 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -8,7 +8,7 @@
msgstr ""
"Project-Id-Version: gst-plugins-bad 1.7.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\n"
"PO-Revision-Date: 2016-02-21 21:03+0200\n"
"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
"Language-Team: Bulgarian <dict@ludost.net>\n"
@@ -18,6 +18,12 @@
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr "форматът не е бил уточнен преди извикване на функцията за получаване"
@@ -62,9 +68,6 @@
msgid "Could not start sndio"
msgstr "Не може да се стартира sndio"
-msgid "Internal data flow error."
-msgstr "Вътрешна грешка в потока на данни."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
"Генерираният файл е с по-дълго време за буфериране отколкото е самата му "
@@ -86,12 +89,12 @@
msgid "Failed to get fragment URL."
msgstr "Неуспешно получаване на адреса на фрагмента."
-msgid "Internal data stream error."
-msgstr "Вътрешна грешка в потока на данни."
-
msgid "Couldn't download fragments"
msgstr "Фрагментите не могат да бъдат свалени"
+msgid "Internal data stream error."
+msgstr "Вътрешна грешка в потока на данни."
+
msgid "No file name specified for writing."
msgstr "Не е указано име на файл за запис."
@@ -136,11 +139,28 @@
"Файлът с настройките на цифровото видеоръзпръскване (DVB) „%s“ не може да "
"бъде прочетен"
+#, c-format
+msgid "Couldn't find details for DVB channel %s"
+msgstr "Липсват данни за канала за цифрово видеоръзпръскване (DVB) „%s“"
+
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "Липсват данни за канала за цифрово видеоръзпръскване (DVB) „%s“"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "Липсват данни за канала за цифрово видеоръзпръскване (DVB) „%s“"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr ""
+"Файлът с настройките на цифровото видеоръзпръскване (DVB) не може да бъде "
+"открит"
+
msgid "DVB channel configuration file doesn't contain any channels"
msgstr ""
"Файлът с настройките на цифровото видеоръзпръскване (DVB) не съдържа никакви "
"канали"
-#, c-format
-msgid "Couldn't find details for DVB channel %s"
-msgstr "Липсват данни за канала за цифрово видеоръзпръскване (DVB) „%s“"
+#~ msgid "Internal data flow error."
+#~ msgstr "Вътрешна грешка в потока на данни."
diff --git a/po/ca.gmo b/po/ca.gmo
index c7f6d0f..a3d82a1 100644
--- a/po/ca.gmo
+++ b/po/ca.gmo
Binary files differ
diff --git a/po/ca.po b/po/ca.po
index aa9c17c..3c63fa6 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -19,6 +19,12 @@
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -66,9 +72,6 @@
msgid "Could not start sndio"
msgstr "No s'ha pogut llegir el DVD."
-msgid "Internal data flow error."
-msgstr "S'ha produït un error intern de flux de dades."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
@@ -88,12 +91,12 @@
msgid "Failed to get fragment URL."
msgstr ""
-msgid "Internal data stream error."
-msgstr "S'ha produït un error intern de flux de dades."
-
msgid "Couldn't download fragments"
msgstr ""
+msgid "Internal data stream error."
+msgstr "S'ha produït un error intern de flux de dades."
+
msgid "No file name specified for writing."
msgstr "No s'ha especificat cap nom de fitxer per a l'escriptura."
@@ -132,12 +135,27 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr ""
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr ""
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr ""
+#, c-format
+msgid "No properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr ""
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr ""
+
+#~ msgid "Internal data flow error."
+#~ msgstr "S'ha produït un error intern de flux de dades."
+
#~ msgid "Could not write to file \"%s\"."
#~ msgstr "No s'ha pogut escriure al fitxer «%s»."
diff --git a/po/cs.gmo b/po/cs.gmo
index 33bee40..58531f8 100644
--- a/po/cs.gmo
+++ b/po/cs.gmo
Binary files differ
diff --git a/po/cs.po b/po/cs.po
index 11eb8a0..4d6c56e 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -22,6 +22,12 @@
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Gtranslator 2.91.7\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr "formát nebyl vyjednán před získáním funkce"
@@ -66,9 +72,6 @@
msgid "Could not start sndio"
msgstr "Nelze spustit sndio"
-msgid "Internal data flow error."
-msgstr "Vnitřní chyba datového toku."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
"Vygenerovaný soubor má delší čas videa vloženého před začátek (preroll) než "
@@ -92,12 +95,12 @@
msgid "Failed to get fragment URL."
msgstr "Selhalo získání adresy URL fragmentu."
-msgid "Internal data stream error."
-msgstr "Chyba proudu vnitřních dat."
-
msgid "Couldn't download fragments"
msgstr "Nelze stáhnout fragmenty"
+msgid "Internal data stream error."
+msgstr "Chyba proudu vnitřních dat."
+
msgid "No file name specified for writing."
msgstr "K zápisu nebyl zadán žádný název souboru."
@@ -138,13 +141,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "Nelze načíst soubor s nastavením kanálu DVB: %s"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr "Soubor s nastavením kanálů DVB neobsahuje žádné kanály"
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr "Nelze najít podrobnosti ke kanálu DVB %s"
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "Nelze najít podrobnosti ke kanálu DVB %s"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "Nelze najít podrobnosti ke kanálu DVB %s"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "Nelze najít soubor s nastavením kanálů DVB"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr "Soubor s nastavením kanálů DVB neobsahuje žádné kanály"
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Vnitřní chyba datového toku."
+
#~ msgid "default GStreamer sound events audiosink"
#~ msgstr "výchozí zvukový cíl GStreamer pro zvukové události"
diff --git a/po/da.gmo b/po/da.gmo
index 0991191..3fde8f2 100644
--- a/po/da.gmo
+++ b/po/da.gmo
Binary files differ
diff --git a/po/da.po b/po/da.po
index b075b39..ed4a584 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -17,6 +17,12 @@
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr "format blev ikke forhandlet før hent funktion"
@@ -61,9 +67,6 @@
msgid "Could not start sndio"
msgstr "Kunne ikke starte sndio"
-msgid "Internal data flow error."
-msgstr "Intern datastrømfejl."
-
# pre-roll. The name of an online video commercial that appears prior to an online video,
# http://en.wiktionary.org/wiki/preroll
msgid "Generated file has a larger preroll time than its streams duration"
@@ -85,12 +88,12 @@
msgid "Failed to get fragment URL."
msgstr "Kunne ikke indhente fragmentadresse."
-msgid "Internal data stream error."
-msgstr "Intern datastrømfejl."
-
msgid "Couldn't download fragments"
msgstr "Kunne ikke hente fragmenter"
+msgid "Internal data stream error."
+msgstr "Intern datastrømfejl."
+
msgid "No file name specified for writing."
msgstr "Intet filnavn er angivet til skrivning."
@@ -130,13 +133,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "Kunne ikke indlæse DVB-kanalens konfigurationsfil: %s"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr "DVB-kanalens konfigurationsfil indeholder ikke nogen kanaler"
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr "Kunne ikke finde detaljer for DVB-kanalen %s"
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "Kunne ikke finde detaljer for DVB-kanalen %s"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "Kunne ikke finde detaljer for DVB-kanalen %s"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "Kunne ikke finde DVB-kanalens konfigurationsfil"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr "DVB-kanalens konfigurationsfil indeholder ikke nogen kanaler"
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Intern datastrømfejl."
+
#~ msgid "default GStreamer sound events audiosink"
#~ msgstr "standardlydkanal for GStreamers lydhændelser"
diff --git a/po/de.gmo b/po/de.gmo
index 42c9d2a..4f6245c 100644
--- a/po/de.gmo
+++ b/po/de.gmo
Binary files differ
diff --git a/po/de.po b/po/de.po
index f9be94c..64537bb 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -19,6 +19,12 @@
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 1.8.5\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr "das Format wurde vor der get-Funktion nicht ausgehandelt"
@@ -65,9 +71,6 @@
msgid "Could not start sndio"
msgstr "sndio konnten nicht gestartet werden"
-msgid "Internal data flow error."
-msgstr "Interner Datenstromfehler."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
"Die erzeugte Datei hat eine größere Vorlaufzeit als die Dauer ihres "
@@ -92,12 +95,12 @@
msgid "Failed to get fragment URL."
msgstr "Ermitteln der Fragment-Adresse schlug fehl."
-msgid "Internal data stream error."
-msgstr "Interner Datenstromfehler."
-
msgid "Couldn't download fragments"
msgstr "Fragmente konnten nicht heruntergeladen werden"
+msgid "Internal data stream error."
+msgstr "Interner Datenstromfehler."
+
msgid "No file name specified for writing."
msgstr "Kein Dateiname zum Schreiben angegeben."
@@ -140,13 +143,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "DVB Kanal-Konfigurationsdatei konnte nicht geladen werden: %s"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr "DVB Kanal-Konfigurationsdatei enthält keine Kanäle"
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr "Details zu DVB-Kanal %s konnten nicht gefunden werden"
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "Details zu DVB-Kanal %s konnten nicht gefunden werden"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "Details zu DVB-Kanal %s konnten nicht gefunden werden"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "DVB Kanal-Konfigurationsdatei konnte nicht gefunden werden"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr "DVB Kanal-Konfigurationsdatei enthält keine Kanäle"
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Interner Datenstromfehler."
+
#~ msgid "default GStreamer sound events audiosink"
#~ msgstr "Voreingestellte GStreamer Tonereignis-Audioziel"
diff --git a/po/el.gmo b/po/el.gmo
index f4fcf78..7d5900e 100644
--- a/po/el.gmo
+++ b/po/el.gmo
Binary files differ
diff --git a/po/el.po b/po/el.po
index 367f5b1..1b6e0c1 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -19,6 +19,12 @@
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n>1;\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -67,9 +73,6 @@
msgid "Could not start sndio"
msgstr "Αδυναμία ανάγνωσης δίσκου DVD."
-msgid "Internal data flow error."
-msgstr "Εσωτερικό σφάλμα ροής δεδομένων."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
@@ -89,12 +92,12 @@
msgid "Failed to get fragment URL."
msgstr ""
-msgid "Internal data stream error."
-msgstr "Εσωτερικό σφάλμα ροής δεδομένων."
-
msgid "Couldn't download fragments"
msgstr ""
+msgid "Internal data stream error."
+msgstr "Εσωτερικό σφάλμα ροής δεδομένων."
+
msgid "No file name specified for writing."
msgstr "Δεν έχει καθορισθεί όνομα αρχείου για εγγραφή."
@@ -133,12 +136,27 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr ""
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr ""
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr ""
+#, c-format
+msgid "No properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr ""
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr ""
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Εσωτερικό σφάλμα ροής δεδομένων."
+
#~ msgid "Could not write to file \"%s\"."
#~ msgstr "Αδυναμία εγγραφής στο αρχείο \"%s\"."
diff --git a/po/en_GB.gmo b/po/en_GB.gmo
index 809dd8c..7e4eec7 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 93db4e9..f4eea15 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -15,6 +15,12 @@
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -62,9 +68,6 @@
msgid "Could not start sndio"
msgstr "Could not write to file \"%s\"."
-msgid "Internal data flow error."
-msgstr ""
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
@@ -84,10 +87,10 @@
msgid "Failed to get fragment URL."
msgstr ""
-msgid "Internal data stream error."
+msgid "Couldn't download fragments"
msgstr ""
-msgid "Couldn't download fragments"
+msgid "Internal data stream error."
msgstr ""
#, fuzzy
@@ -129,11 +132,23 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr ""
-msgid "DVB channel configuration file doesn't contain any channels"
+#, c-format
+msgid "Couldn't find details for DVB channel %s"
msgstr ""
#, c-format
-msgid "Couldn't find details for DVB channel %s"
+msgid "No properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr ""
+
+msgid "DVB channel configuration file doesn't contain any channels"
msgstr ""
#~ msgid "Could not write to file \"%s\"."
diff --git a/po/eo.gmo b/po/eo.gmo
index 93aa8b1..bd10fce 100644
--- a/po/eo.gmo
+++ b/po/eo.gmo
Binary files differ
diff --git a/po/eo.po b/po/eo.po
index 7b13ab4..45e2583 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -17,6 +17,12 @@
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -64,9 +70,6 @@
msgid "Could not start sndio"
msgstr "Ne eblis legi la DVD-n."
-msgid "Internal data flow error."
-msgstr "Interna datum-flu-eraro."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
@@ -86,12 +89,12 @@
msgid "Failed to get fragment URL."
msgstr ""
-msgid "Internal data stream error."
-msgstr "Interna datum-flu-eraro."
-
msgid "Couldn't download fragments"
msgstr ""
+msgid "Internal data stream error."
+msgstr "Interna datum-flu-eraro."
+
msgid "No file name specified for writing."
msgstr "Neniu dosiernomo estas specifite por skribi."
@@ -130,12 +133,27 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr ""
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr ""
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr ""
+#, c-format
+msgid "No properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr ""
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr ""
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Interna datum-flu-eraro."
+
#~ msgid "Could not write to file \"%s\"."
#~ msgstr "Ne eblis skribi al dosiero \"%s\"."
diff --git a/po/es.gmo b/po/es.gmo
index 4595c82..238d0a9 100644
--- a/po/es.gmo
+++ b/po/es.gmo
Binary files differ
diff --git a/po/es.po b/po/es.po
index 016946c..898a4ec 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -17,6 +17,12 @@
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -64,9 +70,6 @@
msgid "Could not start sndio"
msgstr "No se pudo leer el DVD."
-msgid "Internal data flow error."
-msgstr "Error en el flujo de datos interno."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
@@ -86,12 +89,12 @@
msgid "Failed to get fragment URL."
msgstr ""
-msgid "Internal data stream error."
-msgstr "Error en el flujo de datos interno."
-
msgid "Couldn't download fragments"
msgstr ""
+msgid "Internal data stream error."
+msgstr "Error en el flujo de datos interno."
+
msgid "No file name specified for writing."
msgstr "No se especificó un nombre de archivo para su escritura."
@@ -131,13 +134,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "Configuración del canal del mezclador virtual"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr ""
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr ""
+#, c-format
+msgid "No properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "Configuración del canal del mezclador virtual"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr ""
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Error en el flujo de datos interno."
+
#~ msgid "Could not write to file \"%s\"."
#~ msgstr "No se pudo escribir en el archivo «%s»."
diff --git a/po/eu.gmo b/po/eu.gmo
index d0ad0c4..3fedd14 100644
--- a/po/eu.gmo
+++ b/po/eu.gmo
Binary files differ
diff --git a/po/eu.po b/po/eu.po
index 3b5564a..52c80e5 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -19,6 +19,12 @@
"X-Generator: KBabel 1.11.4\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -65,9 +71,6 @@
msgid "Could not start sndio"
msgstr "Ezin izan da DVDaren tituluaren informazioa irakurri."
-msgid "Internal data flow error."
-msgstr "Datu-korrontearen barne-errorea."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
@@ -87,12 +90,12 @@
msgid "Failed to get fragment URL."
msgstr ""
-msgid "Internal data stream error."
-msgstr "Datu-korrontearen barne-errorea."
-
msgid "Couldn't download fragments"
msgstr ""
+msgid "Internal data stream error."
+msgstr "Datu-korrontearen barne-errorea."
+
msgid "No file name specified for writing."
msgstr "Ez da fitxategi-izenik zehaztu idazteko."
@@ -131,13 +134,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr ""
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr ""
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr ""
+#, c-format
+msgid "No properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr ""
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr ""
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Datu-korrontearen barne-errorea."
+
#~ msgid "Could not write to file \"%s\"."
#~ msgstr "Ezin izan da idatzi \"%s\" fitxategian."
diff --git a/po/fi.gmo b/po/fi.gmo
index 70df6a9..d61e65e 100644
--- a/po/fi.gmo
+++ b/po/fi.gmo
Binary files differ
diff --git a/po/fi.po b/po/fi.po
index 7fec6a0..c86d78e 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -22,6 +22,12 @@
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: KBabel 1.11.2\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -68,9 +74,6 @@
msgid "Could not start sndio"
msgstr "DVD:n otsikkotietoja ei voitu lukea."
-msgid "Internal data flow error."
-msgstr "Sisäinen tietovirtavirhe."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
@@ -90,12 +93,12 @@
msgid "Failed to get fragment URL."
msgstr ""
-msgid "Internal data stream error."
-msgstr "Sisäisen tietovirran virhe."
-
msgid "Couldn't download fragments"
msgstr ""
+msgid "Internal data stream error."
+msgstr "Sisäisen tietovirran virhe."
+
msgid "No file name specified for writing."
msgstr "Kirjoitettavaa tiedostonimeä ei annettu."
@@ -135,13 +138,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "Näennäinen mikserikanava-asetus"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr ""
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr ""
+#, c-format
+msgid "No properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "Näennäinen mikserikanava-asetus"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr ""
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Sisäinen tietovirtavirhe."
+
#~ msgid "Could not write to file \"%s\"."
#~ msgstr "Tiedostoon \"%s\" ei voitu kirjoittaa."
diff --git a/po/fr.gmo b/po/fr.gmo
index b7a3b33..d7d5691 100644
--- a/po/fr.gmo
+++ b/po/fr.gmo
Binary files differ
diff --git a/po/fr.po b/po/fr.po
index a3175cc..024fa49 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -9,7 +9,7 @@
msgstr ""
"Project-Id-Version: gst-plugins-bad 1.7.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\n"
"PO-Revision-Date: 2016-02-20 16:27+0100\n"
"Last-Translator: Stéphane Aulery <lkppo@free.fr>\n"
"Language-Team: French <traduc@traduc.org>\n"
@@ -18,6 +18,12 @@
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr "Format non négocié avant l'appel de la fonction get"
@@ -62,9 +68,6 @@
msgid "Could not start sndio"
msgstr "Impossible de démarrer sndio"
-msgid "Internal data flow error."
-msgstr "Erreur du flux de données interne."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
"Le fichier généré a un temps de lancement plus long que la durée du flux"
@@ -87,12 +90,12 @@
msgid "Failed to get fragment URL."
msgstr "Échec de la récupération de l’URL de fragment."
-msgid "Internal data stream error."
-msgstr "Erreur interne de flux de données."
-
msgid "Couldn't download fragments"
msgstr "Impossible de télécharger les fragments"
+msgid "Internal data stream error."
+msgstr "Erreur interne de flux de données."
+
msgid "No file name specified for writing."
msgstr "Aucun nom de fichier indiqué en écriture."
@@ -134,13 +137,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "Impossible de charger le fichier de configuration de canal DVB : %s"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr "Le fichier de configuration de canal DVB ne contient aucun canal"
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr "Impossible de trouver des informations sur le canal DVB %s"
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "Impossible de trouver des informations sur le canal DVB %s"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "Impossible de trouver des informations sur le canal DVB %s"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "Impossible de trouver le fichier de configuration de canal DVB"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr "Le fichier de configuration de canal DVB ne contient aucun canal"
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Erreur du flux de données interne."
+
#~ msgid "default GStreamer sound events audiosink"
#~ msgstr "récepteur audio GStreamer par défaut pour les événements sonores"
diff --git a/po/gl.gmo b/po/gl.gmo
index b9eaab5..7173231 100644
--- a/po/gl.gmo
+++ b/po/gl.gmo
Binary files differ
diff --git a/po/gl.po b/po/gl.po
index 7af7d95..027a614 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -19,6 +19,12 @@
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
"X-Poedit-Language: galego\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -66,9 +72,6 @@
msgid "Could not start sndio"
msgstr "Non foi posíbel ler o DVD."
-msgid "Internal data flow error."
-msgstr "Produciuse un erro interno no fluxo de datos."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
@@ -88,12 +91,12 @@
msgid "Failed to get fragment URL."
msgstr ""
-msgid "Internal data stream error."
-msgstr "Produciuse un erro interno no fluxo de datos."
-
msgid "Couldn't download fragments"
msgstr ""
+msgid "Internal data stream error."
+msgstr "Produciuse un erro interno no fluxo de datos."
+
msgid "No file name specified for writing."
msgstr "Non se especificou ningún nome de ficheiro para a súa escritura."
@@ -132,13 +135,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr ""
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr ""
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr ""
+#, c-format
+msgid "No properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr ""
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr ""
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Produciuse un erro interno no fluxo de datos."
+
#~ msgid "Could not write to file \"%s\"."
#~ msgstr "Non foi posíbel escribir no ficheiro «%s»."
diff --git a/po/gst-plugins-bad-1.0.pot b/po/gst-plugins-bad-1.0.pot
index e5346f6..a21ccb3 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.8.3\n"
+"Project-Id-Version: gst-plugins-bad 1.9.90\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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,39 +16,47 @@
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ext/gl/gstgltestsrc.c:680
+#: ext/gl/gstgltestsrc.c:521
+msgid "failed to draw pattern"
+msgstr ""
+
+#: ext/gl/gstgltestsrc.c:522
+msgid "A GL error occured"
+msgstr ""
+
+#: ext/gl/gstgltestsrc.c:528
msgid "format wasn't negotiated before get function"
msgstr ""
-#: ext/opencv/gsttemplatematch.cpp:188
+#: ext/opencv/gsttemplatematch.cpp:186
msgid "OpenCV failed to load template image"
msgstr ""
-#: ext/resindvd/resindvdsrc.c:362
+#: ext/resindvd/resindvdsrc.c:361
msgid "Could not read title information for DVD."
msgstr ""
-#: ext/resindvd/resindvdsrc.c:368
+#: ext/resindvd/resindvdsrc.c:367
#, c-format
msgid "Failed to open DVD device '%s'."
msgstr ""
-#: ext/resindvd/resindvdsrc.c:374
+#: ext/resindvd/resindvdsrc.c:373
msgid "Failed to set PGC based seeking."
msgstr ""
-#: ext/resindvd/resindvdsrc.c:1165
+#: ext/resindvd/resindvdsrc.c:1164
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:1170 ext/resindvd/resindvdsrc.c:1179
+#: ext/resindvd/resindvdsrc.c:1169 ext/resindvd/resindvdsrc.c:1178
msgid "Could not read DVD."
msgstr ""
#: ext/smoothstreaming/gstmssdemux.c:405
-#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:647
+#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:695
msgid "This file contains no playable streams."
msgstr ""
@@ -56,37 +64,33 @@
msgid "Could not open sndfile stream for reading."
msgstr ""
-#: ext/sndio/sndiosink.c:324 ext/sndio/sndiosrc.c:321
+#: ext/sndio/sndiosink.c:324 ext/sndio/sndiosrc.c:320
msgid "Could not establish connection to sndio"
msgstr ""
-#: ext/sndio/sndiosink.c:331 ext/sndio/sndiosrc.c:328
+#: ext/sndio/sndiosink.c:331 ext/sndio/sndiosrc.c:327
msgid "Failed to query sndio capabilities"
msgstr ""
-#: ext/sndio/sndiosink.c:424 ext/sndio/sndiosrc.c:422
+#: ext/sndio/sndiosink.c:424 ext/sndio/sndiosrc.c:421
msgid "Could not configure sndio"
msgstr ""
-#: ext/sndio/sndiosink.c:430 ext/sndio/sndiosrc.c:428
+#: ext/sndio/sndiosink.c:430 ext/sndio/sndiosrc.c:427
msgid "Could not start sndio"
msgstr ""
-#: gst/aiff/aiffparse.c:1504
-msgid "Internal data flow error."
-msgstr ""
-
-#: gst/asfmux/gstasfmux.c:1832
+#: gst/asfmux/gstasfmux.c:1831
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
-#: gst/camerabin2/camerabingeneral.c:166 gst/camerabin2/gstcamerabin2.c:1876
-#: gst/camerabin2/gstdigitalzoom.c:282 gst/camerabin2/gstviewfinderbin.c:271
+#: gst/camerabin2/camerabingeneral.c:166 gst/camerabin2/gstcamerabin2.c:1875
+#: gst/camerabin2/gstdigitalzoom.c:282 gst/camerabin2/gstviewfinderbin.c:270
#, c-format
msgid "Missing element '%s' - check your GStreamer installation."
msgstr ""
-#: gst/camerabin2/gstcamerabin2.c:364
+#: gst/camerabin2/gstcamerabin2.c:363
msgid "File location is set to NULL, please set it to a valid filename"
msgstr ""
@@ -94,23 +98,21 @@
msgid "Digitalzoom element couldn't be created"
msgstr ""
-#: gst/dvdspu/gstdvdspu.c:1042
+#: gst/dvdspu/gstdvdspu.c:1041
msgid "Subpicture format was not configured before data flow"
msgstr ""
-#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:2740
+#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:3056
msgid "Failed to get fragment URL."
msgstr ""
-#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:2975
-#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:3170
-#: gst/mpegtsdemux/mpegtsbase.c:1383 gst/mpegtsdemux/mpegtsbase.c:1387
-#: gst/nuvdemux/gstnuvdemux.c:736
-msgid "Internal data stream error."
+#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:3407
+msgid "Couldn't download fragments"
msgstr ""
-#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:3087
-msgid "Couldn't download fragments"
+#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:3496
+#: gst/mpegtsdemux/mpegtsbase.c:1392
+msgid "Internal data stream error."
msgstr ""
#: gst/videomeasure/gstvideomeasure_collector.c:294
@@ -127,45 +129,60 @@
msgid "Could not open file \"%s\" for writing."
msgstr ""
-#: sys/dvb/gstdvbsrc.c:1564 sys/dvb/gstdvbsrc.c:1753
+#: sys/dvb/gstdvbsrc.c:1567 sys/dvb/gstdvbsrc.c:1780
#, c-format
msgid "Device \"%s\" does not exist."
msgstr ""
-#: sys/dvb/gstdvbsrc.c:1568
+#: sys/dvb/gstdvbsrc.c:1571
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr ""
-#: sys/dvb/gstdvbsrc.c:1582
+#: sys/dvb/gstdvbsrc.c:1590
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr ""
-#: sys/dvb/gstdvbsrc.c:1599
+#: sys/dvb/gstdvbsrc.c:1607
#, c-format
msgid "Cannot enumerate delivery systems from frontend device \"%s\"."
msgstr ""
-#: sys/dvb/gstdvbsrc.c:1757
+#: sys/dvb/gstdvbsrc.c:1784
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr ""
-#: sys/dvb/parsechannels.c:165
+#: sys/dvb/parsechannels.c:359
msgid "Couldn't find DVB channel configuration file"
msgstr ""
-#: sys/dvb/parsechannels.c:168
+#: sys/dvb/parsechannels.c:362 sys/dvb/parsechannels.c:518
#, c-format
msgid "Couldn't load DVB channel configuration file: %s"
msgstr ""
-#: sys/dvb/parsechannels.c:175
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr ""
-
-#: sys/dvb/parsechannels.c:449
+#: sys/dvb/parsechannels.c:371 sys/dvb/parsechannels.c:803
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr ""
+
+#: sys/dvb/parsechannels.c:381
+#, c-format
+msgid "No properties for the DVB channel %s"
+msgstr ""
+
+#: sys/dvb/parsechannels.c:391
+#, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr ""
+
+#: sys/dvb/parsechannels.c:515
+#, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr ""
+
+#: sys/dvb/parsechannels.c:525
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr ""
diff --git a/po/hr.gmo b/po/hr.gmo
index 3e85119..b15b5c8 100644
--- a/po/hr.gmo
+++ b/po/hr.gmo
Binary files differ
diff --git a/po/hr.po b/po/hr.po
index dfb86e6..0f18211 100644
--- a/po/hr.po
+++ b/po/hr.po
@@ -7,7 +7,7 @@
msgstr ""
"Project-Id-Version: gst-plugins-bad 1.7.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\n"
"PO-Revision-Date: 2016-05-27 12:45-0700\n"
"Last-Translator: Božidar Putanec <bozidarp@yahoo.com>\n"
"Language-Team: Croatian <lokalizacija@linux.hr>\n"
@@ -19,6 +19,12 @@
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
"X-Generator: Lokalize 2.0\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr "format nije bio dogovoren prije ‘get’ funkcije"
@@ -65,9 +71,6 @@
msgid "Could not start sndio"
msgstr "‘sndio’ nije moguće pokrenuti"
-msgid "Internal data flow error."
-msgstr "Interna greška u protoku podataka."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
"U generiranoj datoteci priprema (preroll vrijeme) je duža od ukupnog "
@@ -90,12 +93,12 @@
msgid "Failed to get fragment URL."
msgstr "Nije uspjelo dobiti fragmente adrese URL-a."
-msgid "Internal data stream error."
-msgstr "Interna greška toka (stream) podataka."
-
msgid "Couldn't download fragments"
msgstr "Nije moguće preuzeti fragmente"
+msgid "Internal data stream error."
+msgstr "Interna greška toka (stream) podataka."
+
msgid "No file name specified for writing."
msgstr "Nedostaje naziv (nema ga) datoteke za pisanje."
@@ -137,12 +140,27 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "Nije moguće učitati konfiguracijsku datoteku za DVB kanal: %s"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr "Konfiguracijska datoteka za DVB kanal ne sadrži nijedan kanal"
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr "Pojedinosti za DVB kanal %s nije moguće pronaći"
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "Pojedinosti za DVB kanal %s nije moguće pronaći"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "Pojedinosti za DVB kanal %s nije moguće pronaći"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "Konfiguracijsku datoteku za DVB kanal nije moguće pronaći"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr "Konfiguracijska datoteka za DVB kanal ne sadrži nijedan kanal"
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Interna greška u protoku podataka."
+
#~ msgid "Could not write to file \"%s\"."
#~ msgstr "Ne mogu pisati u datoteku „%s”."
diff --git a/po/hu.gmo b/po/hu.gmo
index 7d36384..c4ee658 100644
--- a/po/hu.gmo
+++ b/po/hu.gmo
Binary files differ
diff --git a/po/hu.po b/po/hu.po
index 43a29aa..1079e61 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -19,6 +19,12 @@
"X-Generator: Lokalize 1.2\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr "a formátum nem lett egyeztetve a függvény lekérése előtt"
@@ -63,9 +69,6 @@
msgid "Could not start sndio"
msgstr "Nem sikerült az sndio indítása"
-msgid "Internal data flow error."
-msgstr "Belső adatfolyamhiba."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
"Az előállított fájlnak nagyobb előtekerési ideje van, mint a folyamának "
@@ -89,12 +92,12 @@
msgid "Failed to get fragment URL."
msgstr "Nem sikerült lekérni a töredék URL-t."
-msgid "Internal data stream error."
-msgstr "Belső adatfolyamhiba."
-
msgid "Couldn't download fragments"
msgstr "Nem sikerült letölteni a töredékeket"
+msgid "Internal data stream error."
+msgstr "Belső adatfolyamhiba."
+
msgid "No file name specified for writing."
msgstr "Nincs megadva fájlnév az íráshoz."
@@ -135,13 +138,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "Nem sikerült betölteni a DVB-csatorna beállítófájlt: %s"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr "A DVB-csatorna beállítófájl nem tartalmaz egyetlen csatornát sem"
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr "Nem találhatók a(z) %s DVB-csatorna részletei"
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "Nem találhatók a(z) %s DVB-csatorna részletei"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "Nem találhatók a(z) %s DVB-csatorna részletei"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "Nem található DVB-csatorna beállítófájl"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr "A DVB-csatorna beállítófájl nem tartalmaz egyetlen csatornát sem"
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Belső adatfolyamhiba."
+
#~ msgid "default GStreamer sound events audiosink"
#~ msgstr "alapértelmezett GStreamer hangesemények audiosink"
diff --git a/po/id.gmo b/po/id.gmo
index ec71c06..4744a0b 100644
--- a/po/id.gmo
+++ b/po/id.gmo
Binary files differ
diff --git a/po/id.po b/po/id.po
index 000be50..5792ac2 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -17,6 +17,12 @@
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.5.7\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -61,9 +67,6 @@
msgid "Could not start sndio"
msgstr "Tak dapat memulai sndio"
-msgid "Internal data flow error."
-msgstr "Galat arus data internal."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
"Berkas yang dihasilkan memiliki waktu preroll lebih besar daripada durasi "
@@ -85,12 +88,12 @@
msgid "Failed to get fragment URL."
msgstr "Gagal mendapat URL fragmen."
-msgid "Internal data stream error."
-msgstr "Galat arus data internal."
-
msgid "Couldn't download fragments"
msgstr "Tak bisa mengunduh fragmen."
+msgid "Internal data stream error."
+msgstr "Galat arus data internal."
+
msgid "No file name specified for writing."
msgstr "Tak ada nama berkas yang ditentukan untuk ditulis."
@@ -132,13 +135,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "Tak bisa memuat berka konfigurasi kanal DVB: %s"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr "Berkas konfigurasi kanal DVB tak memuat kanal apapun"
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr "Tak bisa temukan rincian untuk kanal DVB %s"
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "Tak bisa temukan rincian untuk kanal DVB %s"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "Tak bisa temukan rincian untuk kanal DVB %s"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "Tak bisa temukan berkas konfigurasi kanal DVB"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr "Berkas konfigurasi kanal DVB tak memuat kanal apapun"
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Galat arus data internal."
+
#~ msgid "Couldn't get the Manifest's URI"
#~ msgstr "Tak bisa memperoleh URI Manifes"
diff --git a/po/it.gmo b/po/it.gmo
index 07e061a..7368349 100644
--- a/po/it.gmo
+++ b/po/it.gmo
Binary files differ
diff --git a/po/it.po b/po/it.po
index 7eaec7c..160c36d 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -16,6 +16,12 @@
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -62,9 +68,6 @@
msgid "Could not start sndio"
msgstr "Impossibile leggere le informazioni del titolo per il DVD."
-msgid "Internal data flow error."
-msgstr "Errore interno nel flusso di dati."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
@@ -84,12 +87,12 @@
msgid "Failed to get fragment URL."
msgstr ""
-msgid "Internal data stream error."
-msgstr "Errore interno nello stream di dati."
-
msgid "Couldn't download fragments"
msgstr ""
+msgid "Internal data stream error."
+msgstr "Errore interno nello stream di dati."
+
msgid "No file name specified for writing."
msgstr "Nessun nome di file specificato per la scrittura."
@@ -128,13 +131,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr ""
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr ""
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr ""
+#, c-format
+msgid "No properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr ""
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr ""
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Errore interno nel flusso di dati."
+
#~ msgid "Could not write to file \"%s\"."
#~ msgstr "Impossibile scrivere sul file «%s»."
diff --git a/po/ja.gmo b/po/ja.gmo
index db69d30..c7668ab 100644
--- a/po/ja.gmo
+++ b/po/ja.gmo
Binary files differ
diff --git a/po/ja.po b/po/ja.po
index d4922c2..d813aea 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -17,6 +17,12 @@
"X-Generator: Lokalize 0.3\n"
"Plural-Forms: nplurals=1; plural=0;\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -64,9 +70,6 @@
msgid "Could not start sndio"
msgstr "DVDを読み込むことができませんでした。"
-msgid "Internal data flow error."
-msgstr "内部データフローエラー。"
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
@@ -86,12 +89,12 @@
msgid "Failed to get fragment URL."
msgstr ""
-msgid "Internal data stream error."
-msgstr "内部データストリームエラー。"
-
msgid "Couldn't download fragments"
msgstr ""
+msgid "Internal data stream error."
+msgstr "内部データストリームエラー。"
+
msgid "No file name specified for writing."
msgstr "書き込み用にファイル名が指定されていません。"
@@ -131,13 +134,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "仮想ミックスチャンネル設定"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr ""
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr ""
+#, c-format
+msgid "No properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "仮想ミックスチャンネル設定"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr ""
+
+#~ msgid "Internal data flow error."
+#~ msgstr "内部データフローエラー。"
+
#~ msgid "Could not write to file \"%s\"."
#~ msgstr "ファイル \"%s\" へ書き込むことができませんでした。"
diff --git a/po/ky.gmo b/po/ky.gmo
index 048d337..6afd057 100644
--- a/po/ky.gmo
+++ b/po/ky.gmo
Binary files differ
diff --git a/po/ky.po b/po/ky.po
index 4349122..65ccb6c 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -14,9 +14,16 @@
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
"X-Poedit-Language: Kyrgyz\n"
"X-Poedit-Country: KYRGYZSTAN\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -61,9 +68,6 @@
msgid "Could not start sndio"
msgstr ""
-msgid "Internal data flow error."
-msgstr ""
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
@@ -83,10 +87,10 @@
msgid "Failed to get fragment URL."
msgstr ""
-msgid "Internal data stream error."
+msgid "Couldn't download fragments"
msgstr ""
-msgid "Couldn't download fragments"
+msgid "Internal data stream error."
msgstr ""
msgid "No file name specified for writing."
@@ -127,9 +131,21 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr ""
-msgid "DVB channel configuration file doesn't contain any channels"
+#, c-format
+msgid "Couldn't find details for DVB channel %s"
msgstr ""
#, c-format
-msgid "Couldn't find details for DVB channel %s"
+msgid "No properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr ""
+
+msgid "DVB channel configuration file doesn't contain any channels"
msgstr ""
diff --git a/po/lt.gmo b/po/lt.gmo
index b053f78..5a7c491 100644
--- a/po/lt.gmo
+++ b/po/lt.gmo
Binary files differ
diff --git a/po/lt.po b/po/lt.po
index 4d0407e..3b0995f 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -18,6 +18,12 @@
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
"%100<10 || n%100>=20) ? 1 : 2);\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -65,10 +71,6 @@
msgid "Could not start sndio"
msgstr "Nepavyko rašyti į failą „%s“."
-#, fuzzy
-msgid "Internal data flow error."
-msgstr "Vidinė duomenų srauto klaida."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
@@ -88,12 +90,12 @@
msgid "Failed to get fragment URL."
msgstr ""
-msgid "Internal data stream error."
-msgstr "Vidinė duomenų srauto klaida."
-
msgid "Couldn't download fragments"
msgstr ""
+msgid "Internal data stream error."
+msgstr "Vidinė duomenų srauto klaida."
+
msgid "No file name specified for writing."
msgstr "Nenurodytas failo rašymui pavadinimas."
@@ -132,13 +134,29 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr ""
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr ""
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr ""
+#, c-format
+msgid "No properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr ""
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Internal data flow error."
+#~ msgstr "Vidinė duomenų srauto klaida."
+
#~ msgid "Could not write to file \"%s\"."
#~ msgstr "Nepavyko rašyti į failą „%s“."
diff --git a/po/lv.gmo b/po/lv.gmo
index dd797e3..d66ee0f 100644
--- a/po/lv.gmo
+++ b/po/lv.gmo
Binary files differ
diff --git a/po/lv.po b/po/lv.po
index ef5ba5f..536869a 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -22,6 +22,12 @@
"2);\n"
"X-Generator: Lokalize 1.5\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -67,9 +73,6 @@
msgid "Could not start sndio"
msgstr "Nevarēja palaist sndio"
-msgid "Internal data flow error."
-msgstr "Iekšēja datu plūsmas kļūda."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
"Izveidotajai datnei ir lielāks pirms-atskaņojuma laiks, kā straumes garums"
@@ -91,12 +94,12 @@
msgid "Failed to get fragment URL."
msgstr "Neizdevās saņemt fragmenta URL."
-msgid "Internal data stream error."
-msgstr "Iekšējās datu plūsmas kļūda."
-
msgid "Couldn't download fragments"
msgstr "Nevarēja lejupielādēt fragmentus"
+msgid "Internal data stream error."
+msgstr "Iekšējās datu plūsmas kļūda."
+
msgid "No file name specified for writing."
msgstr "Ierakstīšanai nav norādīts neviens datnes nosaukums."
@@ -137,13 +140,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "Nevarēja ielādēt DVB kanāla konfigurācijas datni: %s"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr "DVB kanāla konfigurācijas datne nesatur nevienu kanālu"
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr "Nevarēja atrast sīkāku informāciju par DVB kanālu %s"
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "Nevarēja atrast sīkāku informāciju par DVB kanālu %s"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "Nevarēja atrast sīkāku informāciju par DVB kanālu %s"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "Nevarēja atrast DVB kanāla konfigurācijas datni"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr "DVB kanāla konfigurācijas datne nesatur nevienu kanālu"
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Iekšēja datu plūsmas kļūda."
+
#~ msgid "Couldn't get the Manifest's URI"
#~ msgstr "Nevarēja saņemt manifesta URI"
diff --git a/po/mt.gmo b/po/mt.gmo
index 80d8487..b5e536a 100644
--- a/po/mt.gmo
+++ b/po/mt.gmo
Binary files differ
diff --git a/po/mt.po b/po/mt.po
index 93f5adc..a31a907 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -18,6 +18,12 @@
"X-Poedit-SourceCharset: utf-8\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -64,9 +70,6 @@
msgid "Could not start sndio"
msgstr "Ma stajtx naqra informazzjoni fuq it-titlu tad-DVD."
-msgid "Internal data flow error."
-msgstr "Internal data flow error."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
@@ -86,12 +89,12 @@
msgid "Failed to get fragment URL."
msgstr ""
-msgid "Internal data stream error."
-msgstr "Internal data stream error."
-
msgid "Couldn't download fragments"
msgstr ""
+msgid "Internal data stream error."
+msgstr "Internal data stream error."
+
msgid "No file name specified for writing."
msgstr "L-ebda isem speċifikat biex nikteb."
@@ -131,13 +134,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "Virtual mixer channel configuration"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr ""
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr ""
+#, c-format
+msgid "No properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "Virtual mixer channel configuration"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr ""
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Internal data flow error."
+
#~ msgid "Could not write to file \"%s\"."
#~ msgstr "Ma nistax nikteb fil-fajl \"%s\". "
diff --git a/po/nb.gmo b/po/nb.gmo
index e75229c..396abde 100644
--- a/po/nb.gmo
+++ b/po/nb.gmo
Binary files differ
diff --git a/po/nb.po b/po/nb.po
index 52dfb5b..745045c 100644
--- a/po/nb.po
+++ b/po/nb.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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -18,6 +18,12 @@
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.6.9\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr "formatet ble ikke forhandlet før get-funksjon"
@@ -62,9 +68,6 @@
msgid "Could not start sndio"
msgstr "Kunne ikke starte sndio"
-msgid "Internal data flow error."
-msgstr "Intern feil i datastrøm."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr "Genererte filen har en større preroll tid enn strømmens varighet"
@@ -85,12 +88,12 @@
msgid "Failed to get fragment URL."
msgstr "Klarte ikke å hente fragment-nettadresse."
-msgid "Internal data stream error."
-msgstr "Intern feil i datastrøm."
-
msgid "Couldn't download fragments"
msgstr "Kunne ikke laste ned fragmenter"
+msgid "Internal data stream error."
+msgstr "Intern feil i datastrøm."
+
msgid "No file name specified for writing."
msgstr "Ingen filnavn oppgitt for skriving."
@@ -129,13 +132,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "Kunne ikke finne DVB-kanalkonfigurasjonsfil: %s"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr "DVB-kanalkonfigurasjonsfilen inneholder ingen kanaler"
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr "Kunne ikke finne detaljer for DVB-kanal %s"
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "Kunne ikke finne detaljer for DVB-kanal %s"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "Kunne ikke finne detaljer for DVB-kanal %s"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "Kunne ikke finne DVB-kanal-konfigurasjonsfil"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr "DVB-kanalkonfigurasjonsfilen inneholder ingen kanaler"
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Intern feil i datastrøm."
+
#~ msgid "default GStreamer sound events audiosink"
#~ msgstr "standard GStreamer lydhendelser-audiosink"
diff --git a/po/nl.gmo b/po/nl.gmo
index 01a6040..c0e4769 100644
--- a/po/nl.gmo
+++ b/po/nl.gmo
Binary files differ
diff --git a/po/nl.po b/po/nl.po
index 65f6506..8d26663 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -7,7 +7,7 @@
msgstr ""
"Project-Id-Version: gst-plugins-bad 1.7.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\n"
"PO-Revision-Date: 2016-02-20 12:35+0100\n"
"Last-Translator: Freek de Kruijf <f.de.kruijf@gmail.com>\n"
"Language-Team: Dutch <vertaling@vrijschrift.org>\n"
@@ -18,6 +18,12 @@
"X-Generator: Lokalize 1.5\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr "formaat is niet onderhandeld vóór get-functie"
@@ -62,9 +68,6 @@
msgid "Could not start sndio"
msgstr "Kon sndio niet starten"
-msgid "Internal data flow error."
-msgstr "Interne fout met gegevensdoorvoer."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
"Gegenereerd bestand heeft een grotere voorlooptijd dan de duur van zijn "
@@ -88,12 +91,12 @@
msgid "Failed to get fragment URL."
msgstr "Verkrijgen van de URL van het fragment is mislukt."
-msgid "Internal data stream error."
-msgstr "Interne fout in gegevensstroom."
-
msgid "Couldn't download fragments"
msgstr "Kan fragmenten niet downloaden"
+msgid "Internal data stream error."
+msgstr "Interne fout in gegevensstroom."
+
msgid "No file name specified for writing."
msgstr "Geen bestandsnaam gespecificeerd voor de uitvoer."
@@ -134,13 +137,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "Kon het instellingenbestand \"%s\" van het DVB-kanaal niet laden"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr "Het instellingenbestand van het DVB-kanaal bevat geen kanalen"
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr "Kon de details voor het DVB-kanaal %s niet vinden"
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "Kon de details voor het DVB-kanaal %s niet vinden"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "Kon de details voor het DVB-kanaal %s niet vinden"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "Kon het instellingenbestand van het DVB-kanaal niet vinden"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr "Het instellingenbestand van het DVB-kanaal bevat geen kanalen"
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Interne fout met gegevensdoorvoer."
+
#~ msgid "default GStreamer sound events audiosink"
#~ msgstr "standaard GStreamer audiosink voor geluidsgebeurtenissen"
diff --git a/po/or.gmo b/po/or.gmo
index 976f1f7..319cc21 100644
--- a/po/or.gmo
+++ b/po/or.gmo
Binary files differ
diff --git a/po/or.po b/po/or.po
index 6b910ae..86a10ee 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -17,6 +17,12 @@
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -64,9 +70,6 @@
msgid "Could not start sndio"
msgstr "\"%s\" ଫାଇଲ ଲେଖିହେଲା ନାହିଁ."
-msgid "Internal data flow error."
-msgstr ""
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
@@ -86,10 +89,10 @@
msgid "Failed to get fragment URL."
msgstr ""
-msgid "Internal data stream error."
+msgid "Couldn't download fragments"
msgstr ""
-msgid "Couldn't download fragments"
+msgid "Internal data stream error."
msgstr ""
#, fuzzy
@@ -131,11 +134,23 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr ""
-msgid "DVB channel configuration file doesn't contain any channels"
+#, c-format
+msgid "Couldn't find details for DVB channel %s"
msgstr ""
#, c-format
-msgid "Couldn't find details for DVB channel %s"
+msgid "No properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr ""
+
+msgid "DVB channel configuration file doesn't contain any channels"
msgstr ""
#~ msgid "Could not write to file \"%s\"."
diff --git a/po/pl.gmo b/po/pl.gmo
index 712276d..a1ea176 100644
--- a/po/pl.gmo
+++ b/po/pl.gmo
Binary files differ
diff --git a/po/pl.po b/po/pl.po
index 14d0397..1bd5f3b 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -15,6 +15,12 @@
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr "format nie został wynegocjowany przed funkcją pobrania"
@@ -59,9 +65,6 @@
msgid "Could not start sndio"
msgstr "Nie udało się uruchomić sndio"
-msgid "Internal data flow error."
-msgstr "Błąd wewnętrzny przepływu danych."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
"Wygenerowany plik ma dłuższy czas rozbiegówki niż czas trwania strumieni"
@@ -83,12 +86,12 @@
msgid "Failed to get fragment URL."
msgstr "Nie udało się uzyskać URL-a fragmentu."
-msgid "Internal data stream error."
-msgstr "Błąd wewnętrzny strumienia danych."
-
msgid "Couldn't download fragments"
msgstr "Nie udało się pobrać fragmentów"
+msgid "Internal data stream error."
+msgstr "Błąd wewnętrzny strumienia danych."
+
msgid "No file name specified for writing."
msgstr "Nie określono nazwy pliku do zapisu."
@@ -130,13 +133,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "Nie udało się wczytać pliku konfiguracyjnego kanałów DVB: %s"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr "Plik konfiguracyjny kanałów DVB nie zawiera żadnych kanałów"
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr "Nie udało się odnaleźć szczegółów dla kanału DVB %s"
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "Nie udało się odnaleźć szczegółów dla kanału DVB %s"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "Nie udało się odnaleźć szczegółów dla kanału DVB %s"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "Nie udało się odnaleźć pliku konfiguracyjnego kanałów DVB"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr "Plik konfiguracyjny kanałów DVB nie zawiera żadnych kanałów"
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Błąd wewnętrzny przepływu danych."
+
#~ msgid "default GStreamer sound events audiosink"
#~ msgstr "domyślny element GStreamera pochłaniający zdarzenia dźwiękowe"
diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo
index 51516e0..c9f898c 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 40233cd..ef9de04 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -8,7 +8,7 @@
msgstr ""
"Project-Id-Version: gst-plugins-bad-1.7.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\n"
"PO-Revision-Date: 2016-05-06 16:02-0300\n"
"Last-Translator: Fabrício Godoy <skarllot@gmail.com>\n"
"Language-Team: Brazilian Portuguese <ldpbr-translation@lists.sourceforge."
@@ -19,6 +19,12 @@
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr "O formato não foi negociado antes da chamada da função"
@@ -63,9 +69,6 @@
msgid "Could not start sndio"
msgstr "Não foi possível iniciar o sndio"
-msgid "Internal data flow error."
-msgstr "Erro interno de fluxo de dados."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
"O arquivo gerado tem um tempo de preparação maior que a sua duração de fluxo"
@@ -88,12 +91,12 @@
msgid "Failed to get fragment URL."
msgstr "Falha ao obter um fragmento de URL."
-msgid "Internal data stream error."
-msgstr "Erro interno de fluxo de dados."
-
msgid "Couldn't download fragments"
msgstr "Não foi possível baixar os fragmentos"
+msgid "Internal data stream error."
+msgstr "Erro interno de fluxo de dados."
+
msgid "No file name specified for writing."
msgstr "Nenhum nome de arquivo especificado para gravação."
@@ -137,13 +140,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "Não foi possível carregar o arquivo de configuração de canal DVB: %s"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr "O arquivo de configuração de canal DVB não contém nenhum canal"
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr "Não foi possível encontrar detalhes para o canal DVB %s"
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "Não foi possível encontrar detalhes para o canal DVB %s"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "Não foi possível encontrar detalhes para o canal DVB %s"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "Não foi possível encontrar o arquivo de configuração de canal DVB"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr "O arquivo de configuração de canal DVB não contém nenhum canal"
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Erro interno de fluxo de dados."
+
#~ msgid "default GStreamer sound events audiosink"
#~ msgstr "audiosink do GStreamer pré-definido para eventos de som"
diff --git a/po/ro.gmo b/po/ro.gmo
index a4bcea0..c72ee99 100644
--- a/po/ro.gmo
+++ b/po/ro.gmo
Binary files differ
diff --git a/po/ro.po b/po/ro.po
index bc7c7a0..922d43e 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -17,6 +17,12 @@
"20)) ? 1 : 2);;\n"
"X-Generator: Virtaal 0.6.1\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -63,9 +69,6 @@
msgid "Could not start sndio"
msgstr "Nu s-au putut citi informațiile despre titlu pentru DVD."
-msgid "Internal data flow error."
-msgstr "Eroare internă de flux al datelor."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
@@ -85,12 +88,12 @@
msgid "Failed to get fragment URL."
msgstr ""
-msgid "Internal data stream error."
-msgstr "Eroare internă a fluxului de date."
-
msgid "Couldn't download fragments"
msgstr ""
+msgid "Internal data stream error."
+msgstr "Eroare internă a fluxului de date."
+
msgid "No file name specified for writing."
msgstr "Niciun nume de fișier specificat pentru scriere."
@@ -129,12 +132,27 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr ""
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr ""
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr ""
+#, c-format
+msgid "No properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr ""
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr ""
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Eroare internă de flux al datelor."
+
#~ msgid "Could not write to file \"%s\"."
#~ msgstr "Nu s-a putut scrie în fișierul „%s”."
diff --git a/po/ru.gmo b/po/ru.gmo
index 548156a..e326719 100644
--- a/po/ru.gmo
+++ b/po/ru.gmo
Binary files differ
diff --git a/po/ru.po b/po/ru.po
index a31b92b..41f8799 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -20,6 +20,12 @@
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr "перед функцией получения не был согласован формат"
@@ -64,9 +70,6 @@
msgid "Could not start sndio"
msgstr "Не удалось запустить sndio"
-msgid "Internal data flow error."
-msgstr "Внутренняя ошибка передачи данных."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
"В сгенерированном файле время предпуска (preroll) больше чем длительность "
@@ -88,12 +91,12 @@
msgid "Failed to get fragment URL."
msgstr "Ошибка при получении URL фрагмента."
-msgid "Internal data stream error."
-msgstr "Внутренняя ошибка потока данных."
-
msgid "Couldn't download fragments"
msgstr "Не удалось скачать фрагменты"
+msgid "Internal data stream error."
+msgstr "Внутренняя ошибка потока данных."
+
msgid "No file name specified for writing."
msgstr "Не указано имя файла для записи."
@@ -134,13 +137,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "Не удалось загрузить файл настройки каналов DVB: %s"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr "Файл настройки каналов DVB не содержит каналов"
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr "Не удалось найти настройки DVB-канала %s"
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "Не удалось найти настройки DVB-канала %s"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "Не удалось найти настройки DVB-канала %s"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "Не удалось найти файл настройки каналов DVB"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr "Файл настройки каналов DVB не содержит каналов"
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Внутренняя ошибка передачи данных."
+
#~ msgid "default GStreamer sound events audiosink"
#~ msgstr "GStreamer audiosink по умолчанию для звуковых событий"
diff --git a/po/sk.gmo b/po/sk.gmo
index a56bd17..086f682 100644
--- a/po/sk.gmo
+++ b/po/sk.gmo
Binary files differ
diff --git a/po/sk.po b/po/sk.po
index 3107617..1fc661e 100644
--- a/po/sk.po
+++ b/po/sk.po
@@ -8,7 +8,7 @@
msgstr ""
"Project-Id-Version: gst-plugins-bad 1.7.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\n"
"PO-Revision-Date: 2016-05-20 12:33+0100\n"
"Last-Translator: Peter Tuhársky <tuharsky@misbb.sk>\n"
"Language-Team: Slovak <sk-i18n@lists.linux.sk>\n"
@@ -20,6 +20,12 @@
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Poedit 1.6.10\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr "formát nebol dohodnutý pred funkciou stiahnutia"
@@ -64,9 +70,6 @@
msgid "Could not start sndio"
msgstr "Nepodarilo sa spustiť sndio"
-msgid "Internal data flow error."
-msgstr "Vnútorná chyba prúdu údajov."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
"Vytvorený súbor má väčší prerolovací čas než je trvanie jeho prúdu údajov"
@@ -89,12 +92,12 @@
msgid "Failed to get fragment URL."
msgstr "Nepodarilo sa získať URL fragmentu."
-msgid "Internal data stream error."
-msgstr "Vnútorná chyba prúdu údajov."
-
msgid "Couldn't download fragments"
msgstr "Nepodarilo sa získať fragmenty"
+msgid "Internal data stream error."
+msgstr "Vnútorná chyba prúdu údajov."
+
msgid "No file name specified for writing."
msgstr "Nebolo zadané žiadne meno súboru pre zápis."
@@ -135,13 +138,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "Nepodarilo sa načítať konfiguračný súbor DVB kanálu: %s"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr "Konfiguračný súbor DVB kanála neobsahuje žiadne kanály"
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr "Nepodarilo sa nájsť podrobnosti o DVB kanáli %s"
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "Nepodarilo sa nájsť podrobnosti o DVB kanáli %s"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "Nepodarilo sa nájsť podrobnosti o DVB kanáli %s"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "Nepodarilo sa nájsť konfiguračný súbor DVB kanálu"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr "Konfiguračný súbor DVB kanála neobsahuje žiadne kanály"
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Vnútorná chyba prúdu údajov."
+
#~ msgid "Couldn't get the Manifest's URI"
#~ msgstr "Nepodarilo sa získať URI Manifestu"
diff --git a/po/sl.gmo b/po/sl.gmo
index ba195a6..2593e16 100644
--- a/po/sl.gmo
+++ b/po/sl.gmo
Binary files differ
diff --git a/po/sl.po b/po/sl.po
index ad5cea2..cd58f1c 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -22,6 +22,12 @@
"X-Poedit-Country: SLOVENIA\n"
"X-Poedit-SourceCharset: utf-8\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -69,9 +75,6 @@
msgid "Could not start sndio"
msgstr "DVD-ja ni mogoče prebrati."
-msgid "Internal data flow error."
-msgstr "Notranja napaka pretočnosti podatkov."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
@@ -91,12 +94,12 @@
msgid "Failed to get fragment URL."
msgstr ""
-msgid "Internal data stream error."
-msgstr "Notranja napaka pretoka podatkov."
-
msgid "Couldn't download fragments"
msgstr ""
+msgid "Internal data stream error."
+msgstr "Notranja napaka pretoka podatkov."
+
msgid "No file name specified for writing."
msgstr "Ni navedenega imena datoteke za pisanje."
@@ -135,13 +138,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr ""
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr ""
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr ""
+#, c-format
+msgid "No properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr ""
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr ""
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Notranja napaka pretočnosti podatkov."
+
#~ msgid "Could not write to file \"%s\"."
#~ msgstr "V datoteko \"%s\" ni mogoče pisati."
diff --git a/po/sq.gmo b/po/sq.gmo
index 4ab513d..89835e8 100644
--- a/po/sq.gmo
+++ b/po/sq.gmo
Binary files differ
diff --git a/po/sq.po b/po/sq.po
index 973d96a..82c2710 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -15,6 +15,12 @@
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr ""
@@ -62,10 +68,6 @@
msgid "Could not start sndio"
msgstr "I pamundur shkrimi tek file \"%s\"."
-#, fuzzy
-msgid "Internal data flow error."
-msgstr "Gabim i brendshëm tek stream i të dhënave."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
@@ -85,12 +87,12 @@
msgid "Failed to get fragment URL."
msgstr ""
-msgid "Internal data stream error."
-msgstr "Gabim i brendshëm tek stream i të dhënave."
-
msgid "Couldn't download fragments"
msgstr ""
+msgid "Internal data stream error."
+msgstr "Gabim i brendshëm tek stream i të dhënave."
+
msgid "No file name specified for writing."
msgstr "Asnjë emër file specifikuar për shkrim."
@@ -129,13 +131,29 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr ""
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr ""
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr ""
+#, c-format
+msgid "No properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr ""
+
+#, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr ""
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Internal data flow error."
+#~ msgstr "Gabim i brendshëm tek stream i të dhënave."
+
#~ msgid "Could not write to file \"%s\"."
#~ msgstr "I pamundur shkrimi tek file \"%s\"."
diff --git a/po/sr.gmo b/po/sr.gmo
index 9312574..57abefe 100644
--- a/po/sr.gmo
+++ b/po/sr.gmo
Binary files differ
diff --git a/po/sr.po b/po/sr.po
index 60d1758..e064215 100644
--- a/po/sr.po
+++ b/po/sr.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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\n"
"PO-Revision-Date: 2015-12-24 11:34+0200\n"
"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
"Language-Team: Serbian <(nothing)>\n"
@@ -18,6 +18,12 @@
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr "запис није договорен пре функције добављања (get)"
@@ -62,9 +68,6 @@
msgid "Could not start sndio"
msgstr "Не могу да покренем улаз/излаз звука"
-msgid "Internal data flow error."
-msgstr "Унутрашња грешка протока података."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr "Створена датотека има дуже време припреме од трајања њеног тока"
@@ -85,12 +88,12 @@
msgid "Failed to get fragment URL."
msgstr "Нисам успео да добијем адресу одломка."
-msgid "Internal data stream error."
-msgstr "Унутрашња грешка тока података."
-
msgid "Couldn't download fragments"
msgstr "Не могу да преузмем одломке"
+msgid "Internal data stream error."
+msgstr "Унутрашња грешка тока података."
+
msgid "No file name specified for writing."
msgstr "Није наведен назив датотеке за упис."
@@ -131,13 +134,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "Не могу да учитам датотеку подешавања ДВБ канала: %s"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr "Датотека подешавања ДВБ канала не садржи ниједан канал"
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr "Не могу да пронађем податке за ДВБ канал „%s“"
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "Не могу да пронађем податке за ДВБ канал „%s“"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "Не могу да пронађем податке за ДВБ канал „%s“"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "Не могу да пронађем датотеку подешавања ДВБ канала"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr "Датотека подешавања ДВБ канала не садржи ниједан канал"
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Унутрашња грешка протока података."
+
#~ msgid "default GStreamer sound events audiosink"
#~ msgstr "основни аудио усклађивач звучних догађаја Гстримера"
diff --git a/po/sv.gmo b/po/sv.gmo
index bf7f34f..fdee880 100644
--- a/po/sv.gmo
+++ b/po/sv.gmo
Binary files differ
diff --git a/po/sv.po b/po/sv.po
index 35cd4c6..d0ebea0 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -16,8 +16,15 @@
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
"X-Generator: Poedit 1.8.6\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr "formatet förhandlades inte fram innan hämtfunktionen"
@@ -62,9 +69,6 @@
msgid "Could not start sndio"
msgstr "Kunde ej starta sndio"
-msgid "Internal data flow error."
-msgstr "Internt fel i dataflöde."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr "Den genererade filen har en längre förrullningstid än dess strömlängd"
@@ -85,12 +89,12 @@
msgid "Failed to get fragment URL."
msgstr "Misslyckades att hämta fragment-URL"
-msgid "Internal data stream error."
-msgstr "Internt fel i dataström."
-
msgid "Couldn't download fragments"
msgstr "Kunde ej ladda ner fragment"
+msgid "Internal data stream error."
+msgstr "Internt fel i dataström."
+
msgid "No file name specified for writing."
msgstr "Inget filnamn angavs för skrivning."
@@ -129,13 +133,25 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "Kunde ej ladda konfigurationsfil för DVB-kanal: %s"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr "Konfigurationsfil för DVB-kanal innehåller inga kanaler"
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr "Kunde ej hitta detaljer för DVB-kanal %s"
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "Kunde ej hitta detaljer för DVB-kanal %s"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "Kunde ej hitta detaljer för DVB-kanal %s"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "Kunde ej hitta konfigurationsfil för DVB-kanal"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr "Konfigurationsfil för DVB-kanal innehåller inga kanaler"
+
#~ msgid "default GStreamer sound events audiosink"
#~ msgstr "standard GStreamer-ljudutgång för ljudhändelser"
@@ -242,6 +258,9 @@
#~ msgid "Describes the selected visualization element."
#~ msgstr "Beskriver det valda visualiseringselementet."
+#~ msgid "Internal data flow error."
+#~ msgstr "Internt fel i dataflöde."
+
#~ msgid "Couldn't get the Manifest's URI"
#~ msgstr "Kunde ej hämta manifestets URI"
diff --git a/po/tr.gmo b/po/tr.gmo
index c73634c..dcf7340 100644
--- a/po/tr.gmo
+++ b/po/tr.gmo
Binary files differ
diff --git a/po/tr.po b/po/tr.po
index 7565d46..10c14c0 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -18,6 +18,12 @@
"X-Generator: Lokalize 1.5\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr "get fonksiyonundan önce biçim görüşülemedi"
@@ -62,9 +68,6 @@
msgid "Could not start sndio"
msgstr "Sndio başlatılamadı"
-msgid "Internal data flow error."
-msgstr "İç veri akış hatası."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
"Oluşturlmuş dosya, akışlarının süresinden daha büyük preroll zamanına sahip"
@@ -87,12 +90,12 @@
msgid "Failed to get fragment URL."
msgstr "Parça adresi alınamadı."
-msgid "Internal data stream error."
-msgstr "İç veri akım hatası."
-
msgid "Couldn't download fragments"
msgstr "Parçalar indirilemedi"
+msgid "Internal data stream error."
+msgstr "İç veri akım hatası."
+
msgid "No file name specified for writing."
msgstr "Yazmak için dosya adı belirtilmedi."
@@ -131,13 +134,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "DVB kanal yapılandırma dosyası yüklenemedi: %s"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr "DVB kanal yapılandırma dosyası herhangi bir kanal içermiyor"
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr "DVB kanalı %s için ayrıntılar bulunamadı"
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "DVB kanalı %s için ayrıntılar bulunamadı"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "DVB kanalı %s için ayrıntılar bulunamadı"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "DVB kanal yapılandırma dosyası bulunamadı"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr "DVB kanal yapılandırma dosyası herhangi bir kanal içermiyor"
+
+#~ msgid "Internal data flow error."
+#~ msgstr "İç veri akış hatası."
+
#~ msgid "Couldn't get the Manifest's URI"
#~ msgstr "Manifest URI alınamadı"
diff --git a/po/uk.gmo b/po/uk.gmo
index 830daae..d2860f7 100644
--- a/po/uk.gmo
+++ b/po/uk.gmo
Binary files differ
diff --git a/po/uk.po b/po/uk.po
index 54de90f..73152fb 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -20,6 +20,12 @@
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Lokalize 1.5\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr "формат не було узгоджено до виклику функції get"
@@ -64,9 +70,6 @@
msgid "Could not start sndio"
msgstr "Не вдалося задіяти sndio"
-msgid "Internal data flow error."
-msgstr "Помилка внутрішнього перенесення даних."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
"Створений файл має більше значення випереджувального просування даних ніж "
@@ -91,12 +94,12 @@
msgid "Failed to get fragment URL."
msgstr "Не вдалося отримати адреси фрагмента."
-msgid "Internal data stream error."
-msgstr "Помилка внутрішнього потоку даних."
-
msgid "Couldn't download fragments"
msgstr "Не вдалося отримати фрагменти"
+msgid "Internal data stream error."
+msgstr "Помилка внутрішнього потоку даних."
+
msgid "No file name specified for writing."
msgstr "Не вказано назви файла для запису."
@@ -139,13 +142,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "Не вдалося завантажити файл налаштувань каналів DVB: %s"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr "У файлі налаштувань каналів DVB не міститься даних щодо жодного каналу"
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr "Не вдалося знайти параметрів каналу DVB %s"
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "Не вдалося знайти параметрів каналу DVB %s"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "Не вдалося знайти параметрів каналу DVB %s"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "Не вдалося знайти файла налаштувань каналів DVB"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr "У файлі налаштувань каналів DVB не міститься даних щодо жодного каналу"
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Помилка внутрішнього перенесення даних."
+
#~ msgid "default GStreamer sound events audiosink"
#~ msgstr "типовий приймач звукових подій GStreamer"
diff --git a/po/vi.gmo b/po/vi.gmo
index 0acfb82..cdf9df8 100644
--- a/po/vi.gmo
+++ b/po/vi.gmo
Binary files differ
diff --git a/po/vi.po b/po/vi.po
index 72fcd76..35eeb0f 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -20,6 +20,12 @@
"X-Language-Team-Website: <http://translationproject.org/team/vi.html>\n"
"X-Generator: Gtranslator 2.91.7\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr "định dạng không được dàn xếp trước hàm"
@@ -64,9 +70,6 @@
msgid "Could not start sndio"
msgstr "Không thể khởi chạy sndio"
-msgid "Internal data flow error."
-msgstr "Lỗi tràn luồng dữ liệu nội bộ."
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr ""
"Tập tin đã tạo có thời gian cuộn trước lớn hơn thời lượng của dòng dữ liệu"
@@ -88,12 +91,12 @@
msgid "Failed to get fragment URL."
msgstr "Gặp lỗi khi lấy URL phân mảnh."
-msgid "Internal data stream error."
-msgstr "Lỗi luồng dữ liệu nội bộ."
-
msgid "Couldn't download fragments"
msgstr "Không thể tải về các phân mảnh"
+msgid "Internal data stream error."
+msgstr "Lỗi luồng dữ liệu nội bộ."
+
msgid "No file name specified for writing."
msgstr "Chưa chỉ định tên tập tin để ghi vào."
@@ -135,13 +138,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "Không thể tải tập tin cấu hình kênh DVB: %s"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr "Tập tin cấu hình kênh DVB chẳng chứa kênh nào cả"
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr "Không thể tìm thấy chi tiết cho kênh DVB %s"
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "Không thể tìm thấy chi tiết cho kênh DVB %s"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "Không thể tìm thấy chi tiết cho kênh DVB %s"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "Không thể tìm thấy tập tin cấu hình kênh DVB"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr "Tập tin cấu hình kênh DVB chẳng chứa kênh nào cả"
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Lỗi tràn luồng dữ liệu nội bộ."
+
#~ msgid "default GStreamer sound events audiosink"
#~ msgstr "các sự kiện âm thanh GStreamer mặc định cho “audiosink”"
diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo
index 9977e18..cbe0a8c 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 9a6e54c..25cc2f2 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: 2016-08-19 11:59+0300\n"
+"POT-Creation-Date: 2016-09-30 12:19+0300\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"
@@ -19,6 +19,12 @@
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.8.5\n"
+msgid "failed to draw pattern"
+msgstr ""
+
+msgid "A GL error occured"
+msgstr ""
+
msgid "format wasn't negotiated before get function"
msgstr "在调用get函数之前未确定合适的格式"
@@ -61,9 +67,6 @@
msgid "Could not start sndio"
msgstr "无法启动sndio。"
-msgid "Internal data flow error."
-msgstr "内部数据流错误。"
-
msgid "Generated file has a larger preroll time than its streams duration"
msgstr "生成文件的预告片段超过其自身流长度。"
@@ -83,12 +86,12 @@
msgid "Failed to get fragment URL."
msgstr "无法获取片段URL。"
-msgid "Internal data stream error."
-msgstr "内部数据流错误。"
-
msgid "Couldn't download fragments"
msgstr "无法下载片段。"
+msgid "Internal data stream error."
+msgstr "内部数据流错误。"
+
msgid "No file name specified for writing."
msgstr "未指定写入文件名。"
@@ -127,13 +130,28 @@
msgid "Couldn't load DVB channel configuration file: %s"
msgstr "无法加载DVB通道配置文件:%s"
-msgid "DVB channel configuration file doesn't contain any channels"
-msgstr "DVB通道配置文件不包含任何通道"
-
#, c-format
msgid "Couldn't find details for DVB channel %s"
msgstr "无法获取DVB通道 %s 的详细信息"
+#, fuzzy, c-format
+msgid "No properties for the DVB channel %s"
+msgstr "无法获取DVB通道 %s 的详细信息"
+
+#, fuzzy, c-format
+msgid "Failed to set properties for the DVB channel %s"
+msgstr "无法获取DVB通道 %s 的详细信息"
+
+#, fuzzy, c-format
+msgid "Couldn't find DVB channel configuration file: %s"
+msgstr "无法找到DVB通道配置文件"
+
+msgid "DVB channel configuration file doesn't contain any channels"
+msgstr "DVB通道配置文件不包含任何通道"
+
+#~ msgid "Internal data flow error."
+#~ msgstr "内部数据流错误。"
+
#~ msgid "default GStreamer sound events audiosink"
#~ msgstr "默认GStreamer声音事件的音频汇"
diff --git a/sys/Makefile.am b/sys/Makefile.am
index 32f79fb..5365316 100644
--- a/sys/Makefile.am
+++ b/sys/Makefile.am
@@ -11,7 +11,7 @@
endif
if USE_APPLE_MEDIA
-APPLE_MEDIA_DIR=applemedia applemedia-nonpublic
+APPLE_MEDIA_DIR=applemedia
else
APPLE_MEDIA_DIR=
endif
@@ -64,6 +64,12 @@
FBDEV_DIR=
endif
+if USE_KMS
+KMS_DIR=kms
+else
+KMS_DIR=
+endif
+
if USE_DVB
DVB_DIR=dvb
else
@@ -148,9 +154,9 @@
TINYALSA_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) $(TINYALSA_DIR)
+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) $(KMS_DIR) $(LINSYS_DIR) $(OPENSLES_DIR) $(PVR_DIR) $(SHM_DIR) $(UVCH264_DIR) $(VCD_DIR) $(VDPAU_DIR) $(WININET_DIR) $(WINSCREENCAP_DIR) $(WASAPI_DIR) $(NVENC_DIR) $(TINYALSA_DIR)
-DIST_SUBDIRS = acmenc acmmp3dec androidmedia applemedia applemedia-nonpublic avc bluez d3dvideosink decklink directsound dvb linsys fbdev dshowdecwrapper dshowsrcwrapper dshowvideosink \
+DIST_SUBDIRS = acmenc acmmp3dec androidmedia applemedia avc bluez d3dvideosink decklink directsound dvb linsys fbdev kms dshowdecwrapper dshowsrcwrapper dshowvideosink \
opensles pvr2d shm uvch264 vcd vdpau wasapi wininet winks winscreencap \
nvenc tinyalsa
diff --git a/sys/Makefile.in b/sys/Makefile.in
index 825e341..781fd1d 100644
--- a/sys/Makefile.in
+++ b/sys/Makefile.in
@@ -281,6 +281,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -302,6 +304,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -351,6 +355,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -496,6 +502,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -622,8 +630,6 @@
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@
@@ -666,8 +672,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -761,7 +772,7 @@
@USE_ANDROID_MEDIA_FALSE@ANDROID_MEDIA_DIR =
@USE_ANDROID_MEDIA_TRUE@ANDROID_MEDIA_DIR = androidmedia
@USE_APPLE_MEDIA_FALSE@APPLE_MEDIA_DIR =
-@USE_APPLE_MEDIA_TRUE@APPLE_MEDIA_DIR = applemedia applemedia-nonpublic
+@USE_APPLE_MEDIA_TRUE@APPLE_MEDIA_DIR = applemedia
@USE_AVC_FALSE@AVC_DIR =
@USE_AVC_TRUE@AVC_DIR = avc
@USE_BLUEZ_FALSE@BLUEZ_DIR =
@@ -778,6 +789,8 @@
@USE_DIRECTSOUND_TRUE@DIRECTSOUND_DIR = directsound
@USE_FBDEV_FALSE@FBDEV_DIR =
@USE_FBDEV_TRUE@FBDEV_DIR = fbdev
+@USE_KMS_FALSE@KMS_DIR =
+@USE_KMS_TRUE@KMS_DIR = kms
@USE_DVB_FALSE@DVB_DIR =
@USE_DVB_TRUE@DVB_DIR = dvb
@USE_LINSYS_FALSE@LINSYS_DIR =
@@ -814,8 +827,8 @@
@USE_NVENC_TRUE@NVENC_DIR = nvenc
@USE_TINYALSA_FALSE@TINYALSA_DIR =
@USE_TINYALSA_TRUE@TINYALSA_DIR = tinyalsa
-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) $(TINYALSA_DIR)
-DIST_SUBDIRS = acmenc acmmp3dec androidmedia applemedia applemedia-nonpublic avc bluez d3dvideosink decklink directsound dvb linsys fbdev dshowdecwrapper dshowsrcwrapper dshowvideosink \
+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) $(KMS_DIR) $(LINSYS_DIR) $(OPENSLES_DIR) $(PVR_DIR) $(SHM_DIR) $(UVCH264_DIR) $(VCD_DIR) $(VDPAU_DIR) $(WININET_DIR) $(WINSCREENCAP_DIR) $(WASAPI_DIR) $(NVENC_DIR) $(TINYALSA_DIR)
+DIST_SUBDIRS = acmenc acmmp3dec androidmedia applemedia avc bluez d3dvideosink decklink directsound dvb linsys fbdev kms dshowdecwrapper dshowsrcwrapper dshowvideosink \
opensles pvr2d shm uvch264 vcd vdpau wasapi wininet winks winscreencap \
nvenc tinyalsa
diff --git a/sys/acmenc/Makefile.in b/sys/acmenc/Makefile.in
index ec745ee..9f53580 100644
--- a/sys/acmenc/Makefile.in
+++ b/sys/acmenc/Makefile.in
@@ -299,6 +299,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -320,6 +322,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -369,6 +373,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -514,6 +520,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -640,8 +648,6 @@
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@
@@ -684,8 +690,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/acmenc/acmenc.c b/sys/acmenc/acmenc.c
index 7a1c1ff..7fed6c7 100644
--- a/sys/acmenc/acmenc.c
+++ b/sys/acmenc/acmenc.c
@@ -485,10 +485,10 @@
g_param_spec_int ("bitrate", "Bitrate", "Bitrate to encode at (in bps)",
0, 1000000, DEFAULT_BITRATE, G_PARAM_READWRITE));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&acmenc_sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&acmenc_src_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &acmenc_sink_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &acmenc_src_template);
params =
(ACMEncParams *) g_type_get_qdata (G_OBJECT_CLASS_TYPE (klass),
ACMENC_PARAMS_QDATA);
diff --git a/sys/acmmp3dec/Makefile.in b/sys/acmmp3dec/Makefile.in
index 2e0b71d..4dabd3c 100644
--- a/sys/acmmp3dec/Makefile.in
+++ b/sys/acmmp3dec/Makefile.in
@@ -299,6 +299,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -320,6 +322,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -369,6 +373,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -514,6 +520,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -640,8 +648,6 @@
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@
@@ -684,8 +690,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/acmmp3dec/acmmp3dec.c b/sys/acmmp3dec/acmmp3dec.c
index 7537691..4ec3385 100644
--- a/sys/acmmp3dec/acmmp3dec.c
+++ b/sys/acmmp3dec/acmmp3dec.c
@@ -417,13 +417,12 @@
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));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&acmmp3dec_src_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &acmmp3dec_sink_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &acmmp3dec_src_template);
gst_element_class_set_static_metadata (element_class, "ACM MP3 decoder",
- "Codec/Decoder/Audio",
- "Decode MP3 using ACM decoder",
+ "Codec/Decoder/Audio", "Decode MP3 using ACM decoder",
"Pioneers of the Inevitable <songbird@songbirdnest.com");
}
diff --git a/sys/androidmedia/Makefile.am b/sys/androidmedia/Makefile.am
index 7ad9b6e..c56eee2 100644
--- a/sys/androidmedia/Makefile.am
+++ b/sys/androidmedia/Makefile.am
@@ -2,6 +2,7 @@
libgstandroidmedia_la_SOURCES = \
gstahcsrc.c \
+ gstahssrc.c \
gstamcaudiodec.c \
gstamc.c \
gstamcsurface.c \
@@ -9,12 +10,13 @@
gstamcvideodec.c \
gstamcvideoenc.c \
gst-android-graphics-imageformat.c \
- gst-android-graphics-surfacetexture.c \
gst-android-hardware-camera.c \
+ gst-android-hardware-sensor.c \
gstjniutils.c
noinst_HEADERS = \
gstahcsrc.h \
+ gstahssrc.h \
gstamcaudiodec.h \
gstamc-constants.h \
gstamc.h \
@@ -23,8 +25,8 @@
gstamcvideodec.h \
gstamcvideoenc.h \
gst-android-graphics-imageformat.h \
- gst-android-graphics-surfacetexture.h \
gst-android-hardware-camera.h \
+ gst-android-hardware-sensor.h \
gstjniutils.h
libgstandroidmedia_la_CFLAGS = \
@@ -52,4 +54,5 @@
androidmedia_java_classesdir = $(datadir)/gst-android/ndk-build/androidmedia/
androidmedia_java_classes_DATA = \
org/freedesktop/gstreamer/androidmedia/GstAhcCallback.java \
+ org/freedesktop/gstreamer/androidmedia/GstAhsCallback.java \
org/freedesktop/gstreamer/androidmedia/GstAmcOnFrameAvailableListener.java
diff --git a/sys/androidmedia/Makefile.in b/sys/androidmedia/Makefile.in
index 0f5ca04..ab2e4ea 100644
--- a/sys/androidmedia/Makefile.in
+++ b/sys/androidmedia/Makefile.in
@@ -170,6 +170,7 @@
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
am_libgstandroidmedia_la_OBJECTS = libgstandroidmedia_la-gstahcsrc.lo \
+ libgstandroidmedia_la-gstahssrc.lo \
libgstandroidmedia_la-gstamcaudiodec.lo \
libgstandroidmedia_la-gstamc.lo \
libgstandroidmedia_la-gstamcsurface.lo \
@@ -177,8 +178,8 @@
libgstandroidmedia_la-gstamcvideodec.lo \
libgstandroidmedia_la-gstamcvideoenc.lo \
libgstandroidmedia_la-gst-android-graphics-imageformat.lo \
- libgstandroidmedia_la-gst-android-graphics-surfacetexture.lo \
libgstandroidmedia_la-gst-android-hardware-camera.lo \
+ libgstandroidmedia_la-gst-android-hardware-sensor.lo \
libgstandroidmedia_la-gstjniutils.lo
libgstandroidmedia_la_OBJECTS = $(am_libgstandroidmedia_la_OBJECTS)
AM_V_lt = $(am__v_lt_@AM_V@)
@@ -317,6 +318,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -338,6 +341,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -387,6 +392,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -532,6 +539,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -658,8 +667,6 @@
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@
@@ -702,8 +709,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -795,6 +807,7 @@
plugin_LTLIBRARIES = libgstandroidmedia.la
libgstandroidmedia_la_SOURCES = \
gstahcsrc.c \
+ gstahssrc.c \
gstamcaudiodec.c \
gstamc.c \
gstamcsurface.c \
@@ -802,12 +815,13 @@
gstamcvideodec.c \
gstamcvideoenc.c \
gst-android-graphics-imageformat.c \
- gst-android-graphics-surfacetexture.c \
gst-android-hardware-camera.c \
+ gst-android-hardware-sensor.c \
gstjniutils.c
noinst_HEADERS = \
gstahcsrc.h \
+ gstahssrc.h \
gstamcaudiodec.h \
gstamc-constants.h \
gstamc.h \
@@ -816,8 +830,8 @@
gstamcvideodec.h \
gstamcvideoenc.h \
gst-android-graphics-imageformat.h \
- gst-android-graphics-surfacetexture.h \
gst-android-hardware-camera.h \
+ gst-android-hardware-sensor.h \
gstjniutils.h
libgstandroidmedia_la_CFLAGS = \
@@ -845,6 +859,7 @@
androidmedia_java_classesdir = $(datadir)/gst-android/ndk-build/androidmedia/
androidmedia_java_classes_DATA = \
org/freedesktop/gstreamer/androidmedia/GstAhcCallback.java \
+ org/freedesktop/gstreamer/androidmedia/GstAhsCallback.java \
org/freedesktop/gstreamer/androidmedia/GstAmcOnFrameAvailableListener.java
all: all-am
@@ -926,9 +941,10 @@
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstandroidmedia_la-gst-android-graphics-imageformat.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstandroidmedia_la-gst-android-graphics-surfacetexture.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstandroidmedia_la-gst-android-hardware-camera.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstandroidmedia_la-gst-android-hardware-sensor.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstandroidmedia_la-gstahcsrc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstandroidmedia_la-gstahssrc.Plo@am__quote@
@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@
@@ -968,6 +984,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 $(libgstandroidmedia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstandroidmedia_la_CFLAGS) $(CFLAGS) -c -o libgstandroidmedia_la-gstahcsrc.lo `test -f 'gstahcsrc.c' || echo '$(srcdir)/'`gstahcsrc.c
+libgstandroidmedia_la-gstahssrc.lo: gstahssrc.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-gstahssrc.lo -MD -MP -MF $(DEPDIR)/libgstandroidmedia_la-gstahssrc.Tpo -c -o libgstandroidmedia_la-gstahssrc.lo `test -f 'gstahssrc.c' || echo '$(srcdir)/'`gstahssrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstandroidmedia_la-gstahssrc.Tpo $(DEPDIR)/libgstandroidmedia_la-gstahssrc.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstahssrc.c' object='libgstandroidmedia_la-gstahssrc.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-gstahssrc.lo `test -f 'gstahssrc.c' || echo '$(srcdir)/'`gstahssrc.c
+
libgstandroidmedia_la-gstamcaudiodec.lo: gstamcaudiodec.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-gstamcaudiodec.lo -MD -MP -MF $(DEPDIR)/libgstandroidmedia_la-gstamcaudiodec.Tpo -c -o libgstandroidmedia_la-gstamcaudiodec.lo `test -f 'gstamcaudiodec.c' || echo '$(srcdir)/'`gstamcaudiodec.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstandroidmedia_la-gstamcaudiodec.Tpo $(DEPDIR)/libgstandroidmedia_la-gstamcaudiodec.Plo
@@ -1017,13 +1040,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 $(libgstandroidmedia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstandroidmedia_la_CFLAGS) $(CFLAGS) -c -o libgstandroidmedia_la-gst-android-graphics-imageformat.lo `test -f 'gst-android-graphics-imageformat.c' || echo '$(srcdir)/'`gst-android-graphics-imageformat.c
-libgstandroidmedia_la-gst-android-graphics-surfacetexture.lo: gst-android-graphics-surfacetexture.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-gst-android-graphics-surfacetexture.lo -MD -MP -MF $(DEPDIR)/libgstandroidmedia_la-gst-android-graphics-surfacetexture.Tpo -c -o libgstandroidmedia_la-gst-android-graphics-surfacetexture.lo `test -f 'gst-android-graphics-surfacetexture.c' || echo '$(srcdir)/'`gst-android-graphics-surfacetexture.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstandroidmedia_la-gst-android-graphics-surfacetexture.Tpo $(DEPDIR)/libgstandroidmedia_la-gst-android-graphics-surfacetexture.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gst-android-graphics-surfacetexture.c' object='libgstandroidmedia_la-gst-android-graphics-surfacetexture.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-gst-android-graphics-surfacetexture.lo `test -f 'gst-android-graphics-surfacetexture.c' || echo '$(srcdir)/'`gst-android-graphics-surfacetexture.c
-
libgstandroidmedia_la-gst-android-hardware-camera.lo: gst-android-hardware-camera.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-gst-android-hardware-camera.lo -MD -MP -MF $(DEPDIR)/libgstandroidmedia_la-gst-android-hardware-camera.Tpo -c -o libgstandroidmedia_la-gst-android-hardware-camera.lo `test -f 'gst-android-hardware-camera.c' || echo '$(srcdir)/'`gst-android-hardware-camera.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstandroidmedia_la-gst-android-hardware-camera.Tpo $(DEPDIR)/libgstandroidmedia_la-gst-android-hardware-camera.Plo
@@ -1031,6 +1047,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 $(libgstandroidmedia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstandroidmedia_la_CFLAGS) $(CFLAGS) -c -o libgstandroidmedia_la-gst-android-hardware-camera.lo `test -f 'gst-android-hardware-camera.c' || echo '$(srcdir)/'`gst-android-hardware-camera.c
+libgstandroidmedia_la-gst-android-hardware-sensor.lo: gst-android-hardware-sensor.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-gst-android-hardware-sensor.lo -MD -MP -MF $(DEPDIR)/libgstandroidmedia_la-gst-android-hardware-sensor.Tpo -c -o libgstandroidmedia_la-gst-android-hardware-sensor.lo `test -f 'gst-android-hardware-sensor.c' || echo '$(srcdir)/'`gst-android-hardware-sensor.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstandroidmedia_la-gst-android-hardware-sensor.Tpo $(DEPDIR)/libgstandroidmedia_la-gst-android-hardware-sensor.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gst-android-hardware-sensor.c' object='libgstandroidmedia_la-gst-android-hardware-sensor.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-gst-android-hardware-sensor.lo `test -f 'gst-android-hardware-sensor.c' || echo '$(srcdir)/'`gst-android-hardware-sensor.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
diff --git a/sys/androidmedia/gst-android-graphics-surfacetexture.c b/sys/androidmedia/gst-android-graphics-surfacetexture.c
deleted file mode 100644
index 84993a8..0000000
--- a/sys/androidmedia/gst-android-graphics-surfacetexture.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2012, Collabora Ltd.
- * Copyright (C) 2012, Cisco Systems, Inc.
- * Author: Youness Alaoui <youness.alaoui@collabora.co.uk>
- *
- * Copyright (C) 2015, Collabora Ltd.
- * Author: Justin Kim <justin.kim@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 "gst-android-graphics-surfacetexture.h"
-
-static struct
-{
- jclass klass;
- jmethodID constructor;
- jmethodID release;
-} android_graphics_surfacetexture = {
-0};
-
-static gboolean
-_init_classes (void)
-{
- JNIEnv *env;
- GError *err = NULL;
-
- env = gst_amc_jni_get_env ();
-
- /* android.graphics.SurfaceTexture */
- android_graphics_surfacetexture.klass =
- gst_amc_jni_get_class (env, &err, "android/graphics/SurfaceTexture");
-
- if (!android_graphics_surfacetexture.klass) {
- GST_ERROR ("Failed to get android.graphics.SurfaceTexture class: %s",
- err->message);
- g_clear_error (&err);
- return FALSE;
- }
-
- android_graphics_surfacetexture.constructor =
- gst_amc_jni_get_method_id (env, &err,
- android_graphics_surfacetexture.klass, "<init>", "(I)V");
- android_graphics_surfacetexture.release =
- gst_amc_jni_get_method_id (env, &err,
- android_graphics_surfacetexture.klass, "release", "()V");
-
- return TRUE;
-}
-
-gboolean
-gst_android_graphics_surfacetexture_init (void)
-{
- if (!_init_classes ()) {
- gst_android_graphics_surfacetexture_deinit ();
- return FALSE;
- }
-
- return TRUE;
-}
-
-void
-gst_android_graphics_surfacetexture_deinit (void)
-{
- JNIEnv *env = gst_amc_jni_get_env ();
-
- if (android_graphics_surfacetexture.klass)
- (*env)->DeleteGlobalRef (env, android_graphics_surfacetexture.klass);
- android_graphics_surfacetexture.klass = NULL;
-}
-
-/* android.graphics.SurfaceTexture */
-GstAGSurfaceTexture *
-gst_ag_surfacetexture_new (gint texture_id)
-{
- JNIEnv *env = gst_amc_jni_get_env ();
- jobject object = NULL;
- GstAGSurfaceTexture *tex = NULL;
-
- object = (*env)->NewObject (env,
- android_graphics_surfacetexture.klass,
- android_graphics_surfacetexture.constructor, texture_id);
- if ((*env)->ExceptionCheck (env) || !object) {
- GST_ERROR ("Failed to call Java method");
- (*env)->ExceptionClear (env);
- return NULL;
- }
-
- tex = g_slice_new0 (GstAGSurfaceTexture);
- tex->object = (*env)->NewGlobalRef (env, object);
- if (!tex->object) {
- GST_ERROR ("Failed to create global reference");
- (*env)->ExceptionClear (env);
- g_slice_free (GstAGSurfaceTexture, tex);
- tex = NULL;
- }
- (*env)->DeleteLocalRef (env, object);
-
- return tex;
-}
-
-void
-gst_ag_surfacetexture_release (GstAGSurfaceTexture * self)
-{
- JNIEnv *env;
- GError *err = NULL;
-
- env = gst_amc_jni_get_env ();
-
- if (!gst_amc_jni_call_void_method (env, &err, self->object,
- android_graphics_surfacetexture.release)) {
- GST_ERROR ("Failed to call release: %s", err->message);
- g_clear_error (&err);
- }
-
-}
-
-void
-gst_ag_surfacetexture_free (GstAGSurfaceTexture * self)
-{
- JNIEnv *env = gst_amc_jni_get_env ();
-
- (*env)->DeleteGlobalRef (env, self->object);
- g_slice_free (GstAGSurfaceTexture, self);
-}
diff --git a/sys/androidmedia/gst-android-graphics-surfacetexture.h b/sys/androidmedia/gst-android-graphics-surfacetexture.h
deleted file mode 100644
index 3bb80ca..0000000
--- a/sys/androidmedia/gst-android-graphics-surfacetexture.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2012, Collabora Ltd.
- * Copyright (C) 2012, Cisco Systems, Inc.
- * Author: Youness Alaoui <youness.alaoui@collabora.co.uk>
- *
- * Copyright (C) 2015, Collabora Ltd.
- * Author: Justin Kim <justin.kim@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_ANDROID_GRAPHICS_SURFACETEXTURE_H__
-#define __GST_ANDROID_GRAPHICS_SURFACETEXTURE_H__
-
-#include <gst/gst.h>
-#include <jni.h>
-
-
-G_BEGIN_DECLS
-
-typedef struct _GstAGSurfaceTexture GstAGSurfaceTexture;
-
-/* android.graphics.SurfaceTexture */
-struct _GstAGSurfaceTexture {
- /* < private > */
- jobject object; /* global reference */
-};
-
-
-gboolean gst_android_graphics_surfacetexture_init (void);
-void gst_android_graphics_surfacetexture_deinit (void);
-
-/* android.graphics.SurfaceTexture */
-GstAGSurfaceTexture *gst_ag_surfacetexture_new (gint texture_id);
-void gst_ag_surfacetexture_release (GstAGSurfaceTexture *self);
-void gst_ag_surfacetexture_free (GstAGSurfaceTexture *self);
-
-G_END_DECLS
-
-#endif /* __GST_ANDROID_GRAPHICS_SURFACETEXTURE_H__ */
-
diff --git a/sys/androidmedia/gst-android-hardware-camera.c b/sys/androidmedia/gst-android-hardware-camera.c
index 11c9253..aa574bd 100644
--- a/sys/androidmedia/gst-android-hardware-camera.c
+++ b/sys/androidmedia/gst-android-hardware-camera.c
@@ -33,26 +33,6 @@
GST_DEBUG_CATEGORY_STATIC (ahc_debug);
#define GST_CAT_DEFAULT ahc_debug
-#define GST_DVM_STATIC_CALL(error_statement, type, k, method, ...) \
- (*env)->CallStatic##type##Method (env, k.klass, k.method, ## __VA_ARGS__); \
- if ((*env)->ExceptionCheck (env)) { \
- GST_ERROR ("Failed to call Java method"); \
- (*env)->ExceptionDescribe (env); \
- (*env)->ExceptionClear (env); \
- error_statement; \
- }
-
-#define GST_DVM_CALL(error_statement, obj, type, k, method, ...) \
- (*env)->Call##type##Method (env, obj, k.method, ## __VA_ARGS__); \
- if ((*env)->ExceptionCheck (env)) { \
- GST_ERROR ("Failed to call Java method"); \
- (*env)->ExceptionDescribe (env); \
- (*env)->ExceptionClear (env); \
- error_statement; \
- }
-
-
-
static struct
{
jclass klass;
@@ -657,8 +637,7 @@
jobject local = android_hardware_camera_parameters.WHITE_BALANCE_AUTO;
android_hardware_camera_parameters.WHITE_BALANCE_AUTO =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -678,8 +657,7 @@
android_hardware_camera_parameters.WHITE_BALANCE_INCANDESCENT;
android_hardware_camera_parameters.WHITE_BALANCE_INCANDESCENT =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -699,8 +677,7 @@
android_hardware_camera_parameters.WHITE_BALANCE_FLUORESCENT;
android_hardware_camera_parameters.WHITE_BALANCE_FLUORESCENT =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -720,8 +697,7 @@
android_hardware_camera_parameters.WHITE_BALANCE_WARM_FLUORESCENT;
android_hardware_camera_parameters.WHITE_BALANCE_WARM_FLUORESCENT =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -740,8 +716,7 @@
jobject local = android_hardware_camera_parameters.WHITE_BALANCE_DAYLIGHT;
android_hardware_camera_parameters.WHITE_BALANCE_DAYLIGHT =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -760,8 +735,7 @@
android_hardware_camera_parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT;
android_hardware_camera_parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -779,8 +753,7 @@
jobject local = android_hardware_camera_parameters.WHITE_BALANCE_TWILIGHT;
android_hardware_camera_parameters.WHITE_BALANCE_TWILIGHT =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -799,8 +772,7 @@
jobject local = android_hardware_camera_parameters.WHITE_BALANCE_SHADE;
android_hardware_camera_parameters.WHITE_BALANCE_SHADE =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -819,8 +791,7 @@
jobject local = android_hardware_camera_parameters.EFFECT_NONE;
android_hardware_camera_parameters.EFFECT_NONE =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -839,8 +810,7 @@
jobject local = android_hardware_camera_parameters.EFFECT_MONO;
android_hardware_camera_parameters.EFFECT_MONO =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -859,8 +829,7 @@
jobject local = android_hardware_camera_parameters.EFFECT_NEGATIVE;
android_hardware_camera_parameters.EFFECT_NEGATIVE =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -879,8 +848,7 @@
jobject local = android_hardware_camera_parameters.EFFECT_SOLARIZE;
android_hardware_camera_parameters.EFFECT_SOLARIZE =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -899,8 +867,7 @@
jobject local = android_hardware_camera_parameters.EFFECT_SEPIA;
android_hardware_camera_parameters.EFFECT_SEPIA =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -919,8 +886,7 @@
jobject local = android_hardware_camera_parameters.EFFECT_POSTERIZE;
android_hardware_camera_parameters.EFFECT_POSTERIZE =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -939,8 +905,7 @@
jobject local = android_hardware_camera_parameters.EFFECT_WHITEBOARD;
android_hardware_camera_parameters.EFFECT_WHITEBOARD =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -959,8 +924,7 @@
jobject local = android_hardware_camera_parameters.EFFECT_BLACKBOARD;
android_hardware_camera_parameters.EFFECT_BLACKBOARD =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -979,8 +943,7 @@
jobject local = android_hardware_camera_parameters.EFFECT_AQUA;
android_hardware_camera_parameters.EFFECT_AQUA =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -999,8 +962,7 @@
jobject local = android_hardware_camera_parameters.ANTIBANDING_AUTO;
android_hardware_camera_parameters.ANTIBANDING_AUTO =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1019,8 +981,7 @@
jobject local = android_hardware_camera_parameters.ANTIBANDING_50HZ;
android_hardware_camera_parameters.ANTIBANDING_50HZ =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1039,8 +1000,7 @@
jobject local = android_hardware_camera_parameters.ANTIBANDING_60HZ;
android_hardware_camera_parameters.ANTIBANDING_60HZ =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1059,8 +1019,7 @@
jobject local = android_hardware_camera_parameters.ANTIBANDING_OFF;
android_hardware_camera_parameters.ANTIBANDING_OFF =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1079,8 +1038,7 @@
jobject local = android_hardware_camera_parameters.FLASH_MODE_OFF;
android_hardware_camera_parameters.FLASH_MODE_OFF =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1099,8 +1057,7 @@
jobject local = android_hardware_camera_parameters.FLASH_MODE_AUTO;
android_hardware_camera_parameters.FLASH_MODE_AUTO =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1119,8 +1076,7 @@
jobject local = android_hardware_camera_parameters.FLASH_MODE_ON;
android_hardware_camera_parameters.FLASH_MODE_ON =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1139,8 +1095,7 @@
jobject local = android_hardware_camera_parameters.FLASH_MODE_RED_EYE;
android_hardware_camera_parameters.FLASH_MODE_RED_EYE =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1159,8 +1114,7 @@
jobject local = android_hardware_camera_parameters.FLASH_MODE_TORCH;
android_hardware_camera_parameters.FLASH_MODE_TORCH =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1179,8 +1133,7 @@
jobject local = android_hardware_camera_parameters.SCENE_MODE_AUTO;
android_hardware_camera_parameters.SCENE_MODE_AUTO =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1199,8 +1152,7 @@
jobject local = android_hardware_camera_parameters.SCENE_MODE_ACTION;
android_hardware_camera_parameters.SCENE_MODE_ACTION =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1219,8 +1171,7 @@
jobject local = android_hardware_camera_parameters.SCENE_MODE_PORTRAIT;
android_hardware_camera_parameters.SCENE_MODE_PORTRAIT =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1238,8 +1189,7 @@
jobject local = android_hardware_camera_parameters.SCENE_MODE_LANDSCAPE;
android_hardware_camera_parameters.SCENE_MODE_LANDSCAPE =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1258,8 +1208,7 @@
jobject local = android_hardware_camera_parameters.SCENE_MODE_NIGHT;
android_hardware_camera_parameters.SCENE_MODE_NIGHT =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1278,8 +1227,7 @@
android_hardware_camera_parameters.SCENE_MODE_NIGHT_PORTRAIT;
android_hardware_camera_parameters.SCENE_MODE_NIGHT_PORTRAIT =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_THEATRE",
@@ -1297,8 +1245,7 @@
jobject local = android_hardware_camera_parameters.SCENE_MODE_THEATRE;
android_hardware_camera_parameters.SCENE_MODE_THEATRE =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1317,8 +1264,7 @@
jobject local = android_hardware_camera_parameters.SCENE_MODE_BEACH;
android_hardware_camera_parameters.SCENE_MODE_BEACH =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1337,8 +1283,7 @@
jobject local = android_hardware_camera_parameters.SCENE_MODE_SNOW;
android_hardware_camera_parameters.SCENE_MODE_SNOW =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1358,8 +1303,7 @@
jobject local = android_hardware_camera_parameters.SCENE_MODE_SUNSET;
android_hardware_camera_parameters.SCENE_MODE_SUNSET =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1379,8 +1323,7 @@
jobject local = android_hardware_camera_parameters.SCENE_MODE_STEADYPHOTO;
android_hardware_camera_parameters.SCENE_MODE_STEADYPHOTO =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1399,8 +1342,7 @@
jobject local = android_hardware_camera_parameters.SCENE_MODE_FIREWORKS;
android_hardware_camera_parameters.SCENE_MODE_FIREWORKS =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1420,8 +1362,7 @@
jobject local = android_hardware_camera_parameters.SCENE_MODE_SPORTS;
android_hardware_camera_parameters.SCENE_MODE_SPORTS =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1440,8 +1381,7 @@
jobject local = android_hardware_camera_parameters.SCENE_MODE_PARTY;
android_hardware_camera_parameters.SCENE_MODE_PARTY =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1460,8 +1400,7 @@
jobject local = android_hardware_camera_parameters.SCENE_MODE_CANDLELIGHT;
android_hardware_camera_parameters.SCENE_MODE_CANDLELIGHT =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
@@ -1481,8 +1420,7 @@
jobject local = android_hardware_camera_parameters.SCENE_MODE_BARCODE;
android_hardware_camera_parameters.SCENE_MODE_BARCODE =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1501,8 +1439,7 @@
jobject local = android_hardware_camera_parameters.FOCUS_MODE_AUTO;
android_hardware_camera_parameters.FOCUS_MODE_AUTO =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1521,8 +1458,7 @@
jobject local = android_hardware_camera_parameters.FOCUS_MODE_INFINITY;
android_hardware_camera_parameters.FOCUS_MODE_INFINITY =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1541,8 +1477,7 @@
jobject local = android_hardware_camera_parameters.FOCUS_MODE_MACRO;
android_hardware_camera_parameters.FOCUS_MODE_MACRO =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1561,8 +1496,7 @@
jobject local = android_hardware_camera_parameters.FOCUS_MODE_FIXED;
android_hardware_camera_parameters.FOCUS_MODE_FIXED =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1581,8 +1515,7 @@
jobject local = android_hardware_camera_parameters.FOCUS_MODE_EDOF;
android_hardware_camera_parameters.FOCUS_MODE_EDOF =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1602,8 +1535,7 @@
android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_VIDEO;
android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_VIDEO =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
fieldID =
@@ -1624,8 +1556,7 @@
android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_PICTURE;
android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_PICTURE =
- (*env)->NewGlobalRef (env, local);
- (*env)->DeleteLocalRef (env, local);
+ gst_amc_jni_object_make_global (env, local);
}
/* java.lang.String */
@@ -1710,19 +1641,19 @@
JNIEnv *env = gst_amc_jni_get_env ();
if (android_hardware_camera.klass)
- (*env)->DeleteGlobalRef (env, android_hardware_camera.klass);
+ gst_amc_jni_object_unref (env, android_hardware_camera.klass);
android_hardware_camera.klass = NULL;
if (android_hardware_camera_camerainfo.klass)
- (*env)->DeleteGlobalRef (env, android_hardware_camera_camerainfo.klass);
+ gst_amc_jni_object_unref (env, android_hardware_camera_camerainfo.klass);
android_hardware_camera_camerainfo.klass = NULL;
if (android_hardware_camera_size.klass)
- (*env)->DeleteGlobalRef (env, android_hardware_camera_size.klass);
+ gst_amc_jni_object_unref (env, android_hardware_camera_size.klass);
android_hardware_camera_size.klass = NULL;
if (android_hardware_camera_parameters.klass)
- (*env)->DeleteGlobalRef (env, android_hardware_camera_parameters.klass);
+ gst_amc_jni_object_unref (env, android_hardware_camera_parameters.klass);
android_hardware_camera_parameters.klass = NULL;
if (Parameters_WHITE_BALANCE_AUTO)
(*env)->ReleaseStringUTFChars (env,
@@ -1730,7 +1661,7 @@
Parameters_WHITE_BALANCE_AUTO);
Parameters_WHITE_BALANCE_AUTO = NULL;
if (android_hardware_camera_parameters.WHITE_BALANCE_AUTO)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.WHITE_BALANCE_AUTO);
android_hardware_camera_parameters.WHITE_BALANCE_AUTO = NULL;
if (Parameters_WHITE_BALANCE_INCANDESCENT)
@@ -1739,7 +1670,7 @@
Parameters_WHITE_BALANCE_INCANDESCENT);
Parameters_WHITE_BALANCE_INCANDESCENT = NULL;
if (android_hardware_camera_parameters.WHITE_BALANCE_INCANDESCENT)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.WHITE_BALANCE_INCANDESCENT);
android_hardware_camera_parameters.WHITE_BALANCE_INCANDESCENT = NULL;
if (Parameters_WHITE_BALANCE_FLUORESCENT)
@@ -1748,7 +1679,7 @@
Parameters_WHITE_BALANCE_FLUORESCENT);
Parameters_WHITE_BALANCE_FLUORESCENT = NULL;
if (android_hardware_camera_parameters.WHITE_BALANCE_FLUORESCENT)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.WHITE_BALANCE_FLUORESCENT);
android_hardware_camera_parameters.WHITE_BALANCE_FLUORESCENT = NULL;
if (Parameters_WHITE_BALANCE_WARM_FLUORESCENT)
@@ -1757,7 +1688,7 @@
Parameters_WHITE_BALANCE_WARM_FLUORESCENT);
Parameters_WHITE_BALANCE_WARM_FLUORESCENT = NULL;
if (android_hardware_camera_parameters.WHITE_BALANCE_WARM_FLUORESCENT)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.WHITE_BALANCE_WARM_FLUORESCENT);
android_hardware_camera_parameters.WHITE_BALANCE_WARM_FLUORESCENT = NULL;
if (Parameters_WHITE_BALANCE_DAYLIGHT)
@@ -1766,7 +1697,7 @@
Parameters_WHITE_BALANCE_DAYLIGHT);
Parameters_WHITE_BALANCE_DAYLIGHT = NULL;
if (android_hardware_camera_parameters.WHITE_BALANCE_DAYLIGHT)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.WHITE_BALANCE_DAYLIGHT);
android_hardware_camera_parameters.WHITE_BALANCE_DAYLIGHT = NULL;
if (Parameters_WHITE_BALANCE_CLOUDY_DAYLIGHT)
@@ -1775,7 +1706,7 @@
Parameters_WHITE_BALANCE_CLOUDY_DAYLIGHT);
Parameters_WHITE_BALANCE_CLOUDY_DAYLIGHT = NULL;
if (android_hardware_camera_parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT);
android_hardware_camera_parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT = NULL;
if (Parameters_WHITE_BALANCE_TWILIGHT)
@@ -1784,7 +1715,7 @@
Parameters_WHITE_BALANCE_TWILIGHT);
Parameters_WHITE_BALANCE_TWILIGHT = NULL;
if (android_hardware_camera_parameters.WHITE_BALANCE_TWILIGHT)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.WHITE_BALANCE_TWILIGHT);
android_hardware_camera_parameters.WHITE_BALANCE_TWILIGHT = NULL;
if (Parameters_WHITE_BALANCE_SHADE)
@@ -1793,7 +1724,7 @@
Parameters_WHITE_BALANCE_SHADE);
Parameters_WHITE_BALANCE_SHADE = NULL;
if (android_hardware_camera_parameters.WHITE_BALANCE_SHADE)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.WHITE_BALANCE_SHADE);
android_hardware_camera_parameters.WHITE_BALANCE_SHADE = NULL;
if (Parameters_EFFECT_NONE)
@@ -1801,7 +1732,7 @@
android_hardware_camera_parameters.EFFECT_NONE, Parameters_EFFECT_NONE);
Parameters_EFFECT_NONE = NULL;
if (android_hardware_camera_parameters.EFFECT_NONE)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.EFFECT_NONE);
android_hardware_camera_parameters.EFFECT_NONE = NULL;
if (Parameters_EFFECT_MONO)
@@ -1809,7 +1740,7 @@
android_hardware_camera_parameters.EFFECT_MONO, Parameters_EFFECT_MONO);
Parameters_EFFECT_MONO = NULL;
if (android_hardware_camera_parameters.EFFECT_MONO)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.EFFECT_MONO);
android_hardware_camera_parameters.EFFECT_MONO = NULL;
if (Parameters_EFFECT_NEGATIVE)
@@ -1818,7 +1749,7 @@
Parameters_EFFECT_NEGATIVE);
Parameters_EFFECT_NEGATIVE = NULL;
if (android_hardware_camera_parameters.EFFECT_NEGATIVE)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.EFFECT_NEGATIVE);
android_hardware_camera_parameters.EFFECT_NEGATIVE = NULL;
if (Parameters_EFFECT_SOLARIZE)
@@ -1827,7 +1758,7 @@
Parameters_EFFECT_SOLARIZE);
Parameters_EFFECT_SOLARIZE = NULL;
if (android_hardware_camera_parameters.EFFECT_SOLARIZE)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.EFFECT_SOLARIZE);
android_hardware_camera_parameters.EFFECT_SOLARIZE = NULL;
if (Parameters_EFFECT_SEPIA)
@@ -1836,7 +1767,7 @@
Parameters_EFFECT_SEPIA);
Parameters_EFFECT_SEPIA = NULL;
if (android_hardware_camera_parameters.EFFECT_SEPIA)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.EFFECT_SEPIA);
android_hardware_camera_parameters.EFFECT_SEPIA = NULL;
if (Parameters_EFFECT_POSTERIZE)
@@ -1845,7 +1776,7 @@
Parameters_EFFECT_POSTERIZE);
Parameters_EFFECT_POSTERIZE = NULL;
if (android_hardware_camera_parameters.EFFECT_POSTERIZE)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.EFFECT_POSTERIZE);
android_hardware_camera_parameters.EFFECT_POSTERIZE = NULL;
if (Parameters_EFFECT_WHITEBOARD)
@@ -1854,7 +1785,7 @@
Parameters_EFFECT_WHITEBOARD);
Parameters_EFFECT_WHITEBOARD = NULL;
if (android_hardware_camera_parameters.EFFECT_WHITEBOARD)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.EFFECT_WHITEBOARD);
android_hardware_camera_parameters.EFFECT_WHITEBOARD = NULL;
if (Parameters_EFFECT_BLACKBOARD)
@@ -1863,7 +1794,7 @@
Parameters_EFFECT_BLACKBOARD);
Parameters_EFFECT_BLACKBOARD = NULL;
if (android_hardware_camera_parameters.EFFECT_BLACKBOARD)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.EFFECT_BLACKBOARD);
android_hardware_camera_parameters.EFFECT_BLACKBOARD = NULL;
if (Parameters_EFFECT_AQUA)
@@ -1871,7 +1802,7 @@
android_hardware_camera_parameters.EFFECT_AQUA, Parameters_EFFECT_AQUA);
Parameters_EFFECT_AQUA = NULL;
if (android_hardware_camera_parameters.EFFECT_AQUA)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.EFFECT_AQUA);
android_hardware_camera_parameters.EFFECT_AQUA = NULL;
if (Parameters_ANTIBANDING_AUTO)
@@ -1880,7 +1811,7 @@
Parameters_ANTIBANDING_AUTO);
Parameters_ANTIBANDING_AUTO = NULL;
if (android_hardware_camera_parameters.ANTIBANDING_AUTO)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.ANTIBANDING_AUTO);
android_hardware_camera_parameters.ANTIBANDING_AUTO = NULL;
if (Parameters_ANTIBANDING_50HZ)
@@ -1889,7 +1820,7 @@
Parameters_ANTIBANDING_50HZ);
Parameters_ANTIBANDING_50HZ = NULL;
if (android_hardware_camera_parameters.ANTIBANDING_50HZ)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.ANTIBANDING_50HZ);
android_hardware_camera_parameters.ANTIBANDING_50HZ = NULL;
if (Parameters_ANTIBANDING_60HZ)
@@ -1898,7 +1829,7 @@
Parameters_ANTIBANDING_60HZ);
Parameters_ANTIBANDING_60HZ = NULL;
if (android_hardware_camera_parameters.ANTIBANDING_60HZ)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.ANTIBANDING_60HZ);
android_hardware_camera_parameters.ANTIBANDING_60HZ = NULL;
if (Parameters_ANTIBANDING_OFF)
@@ -1907,7 +1838,7 @@
Parameters_ANTIBANDING_OFF);
Parameters_ANTIBANDING_OFF = NULL;
if (android_hardware_camera_parameters.ANTIBANDING_OFF)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.ANTIBANDING_OFF);
android_hardware_camera_parameters.ANTIBANDING_OFF = NULL;
if (Parameters_FLASH_MODE_OFF)
@@ -1916,7 +1847,7 @@
Parameters_FLASH_MODE_OFF);
Parameters_FLASH_MODE_OFF = NULL;
if (android_hardware_camera_parameters.FLASH_MODE_OFF)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.FLASH_MODE_OFF);
android_hardware_camera_parameters.FLASH_MODE_OFF = NULL;
if (Parameters_FLASH_MODE_AUTO)
@@ -1925,7 +1856,7 @@
Parameters_FLASH_MODE_AUTO);
Parameters_FLASH_MODE_AUTO = NULL;
if (android_hardware_camera_parameters.FLASH_MODE_AUTO)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.FLASH_MODE_AUTO);
android_hardware_camera_parameters.FLASH_MODE_AUTO = NULL;
if (Parameters_FLASH_MODE_ON)
@@ -1934,7 +1865,7 @@
Parameters_FLASH_MODE_ON);
Parameters_FLASH_MODE_ON = NULL;
if (android_hardware_camera_parameters.FLASH_MODE_ON)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.FLASH_MODE_ON);
android_hardware_camera_parameters.FLASH_MODE_ON = NULL;
if (Parameters_FLASH_MODE_RED_EYE)
@@ -1943,7 +1874,7 @@
Parameters_FLASH_MODE_RED_EYE);
Parameters_FLASH_MODE_RED_EYE = NULL;
if (android_hardware_camera_parameters.FLASH_MODE_RED_EYE)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.FLASH_MODE_RED_EYE);
android_hardware_camera_parameters.FLASH_MODE_RED_EYE = NULL;
if (Parameters_FLASH_MODE_TORCH)
@@ -1952,7 +1883,7 @@
Parameters_FLASH_MODE_TORCH);
Parameters_FLASH_MODE_TORCH = NULL;
if (android_hardware_camera_parameters.FLASH_MODE_TORCH)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.FLASH_MODE_TORCH);
android_hardware_camera_parameters.FLASH_MODE_TORCH = NULL;
if (Parameters_SCENE_MODE_AUTO)
@@ -1961,7 +1892,7 @@
Parameters_SCENE_MODE_AUTO);
Parameters_SCENE_MODE_AUTO = NULL;
if (android_hardware_camera_parameters.SCENE_MODE_AUTO)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.SCENE_MODE_AUTO);
android_hardware_camera_parameters.SCENE_MODE_AUTO = NULL;
if (Parameters_SCENE_MODE_ACTION)
@@ -1970,7 +1901,7 @@
Parameters_SCENE_MODE_ACTION);
Parameters_SCENE_MODE_ACTION = NULL;
if (android_hardware_camera_parameters.SCENE_MODE_ACTION)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.SCENE_MODE_ACTION);
android_hardware_camera_parameters.SCENE_MODE_ACTION = NULL;
if (Parameters_SCENE_MODE_PORTRAIT)
@@ -1979,7 +1910,7 @@
Parameters_SCENE_MODE_PORTRAIT);
Parameters_SCENE_MODE_PORTRAIT = NULL;
if (android_hardware_camera_parameters.SCENE_MODE_PORTRAIT)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.SCENE_MODE_PORTRAIT);
android_hardware_camera_parameters.SCENE_MODE_PORTRAIT = NULL;
if (Parameters_SCENE_MODE_LANDSCAPE)
@@ -1988,7 +1919,7 @@
Parameters_SCENE_MODE_LANDSCAPE);
Parameters_SCENE_MODE_LANDSCAPE = NULL;
if (android_hardware_camera_parameters.SCENE_MODE_LANDSCAPE)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.SCENE_MODE_LANDSCAPE);
android_hardware_camera_parameters.SCENE_MODE_LANDSCAPE = NULL;
if (Parameters_SCENE_MODE_NIGHT)
@@ -1997,7 +1928,7 @@
Parameters_SCENE_MODE_NIGHT);
Parameters_SCENE_MODE_NIGHT = NULL;
if (android_hardware_camera_parameters.SCENE_MODE_NIGHT)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.SCENE_MODE_NIGHT);
android_hardware_camera_parameters.SCENE_MODE_NIGHT = NULL;
if (Parameters_SCENE_MODE_NIGHT_PORTRAIT)
@@ -2006,7 +1937,7 @@
Parameters_SCENE_MODE_NIGHT_PORTRAIT);
Parameters_SCENE_MODE_NIGHT_PORTRAIT = NULL;
if (android_hardware_camera_parameters.SCENE_MODE_NIGHT_PORTRAIT)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.SCENE_MODE_NIGHT_PORTRAIT);
android_hardware_camera_parameters.SCENE_MODE_NIGHT_PORTRAIT = NULL;
if (Parameters_SCENE_MODE_THEATRE)
@@ -2015,7 +1946,7 @@
Parameters_SCENE_MODE_THEATRE);
Parameters_SCENE_MODE_THEATRE = NULL;
if (android_hardware_camera_parameters.SCENE_MODE_THEATRE)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.SCENE_MODE_THEATRE);
android_hardware_camera_parameters.SCENE_MODE_THEATRE = NULL;
if (Parameters_SCENE_MODE_BEACH)
@@ -2024,7 +1955,7 @@
Parameters_SCENE_MODE_BEACH);
Parameters_SCENE_MODE_BEACH = NULL;
if (android_hardware_camera_parameters.SCENE_MODE_BEACH)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.SCENE_MODE_BEACH);
android_hardware_camera_parameters.SCENE_MODE_BEACH = NULL;
if (Parameters_SCENE_MODE_SNOW)
@@ -2033,7 +1964,7 @@
Parameters_SCENE_MODE_SNOW);
Parameters_SCENE_MODE_SNOW = NULL;
if (android_hardware_camera_parameters.SCENE_MODE_SNOW)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.SCENE_MODE_SNOW);
android_hardware_camera_parameters.SCENE_MODE_SNOW = NULL;
if (Parameters_SCENE_MODE_SUNSET)
@@ -2042,7 +1973,7 @@
Parameters_SCENE_MODE_SUNSET);
Parameters_SCENE_MODE_SUNSET = NULL;
if (android_hardware_camera_parameters.SCENE_MODE_SUNSET)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.SCENE_MODE_SUNSET);
android_hardware_camera_parameters.SCENE_MODE_SUNSET = NULL;
if (Parameters_SCENE_MODE_STEADYPHOTO)
@@ -2051,7 +1982,7 @@
Parameters_SCENE_MODE_STEADYPHOTO);
Parameters_SCENE_MODE_STEADYPHOTO = NULL;
if (android_hardware_camera_parameters.SCENE_MODE_STEADYPHOTO)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.SCENE_MODE_STEADYPHOTO);
android_hardware_camera_parameters.SCENE_MODE_STEADYPHOTO = NULL;
if (Parameters_SCENE_MODE_FIREWORKS)
@@ -2060,7 +1991,7 @@
Parameters_SCENE_MODE_FIREWORKS);
Parameters_SCENE_MODE_FIREWORKS = NULL;
if (android_hardware_camera_parameters.SCENE_MODE_FIREWORKS)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.SCENE_MODE_FIREWORKS);
android_hardware_camera_parameters.SCENE_MODE_FIREWORKS = NULL;
if (Parameters_SCENE_MODE_SPORTS)
@@ -2069,7 +2000,7 @@
Parameters_SCENE_MODE_SPORTS);
Parameters_SCENE_MODE_SPORTS = NULL;
if (android_hardware_camera_parameters.SCENE_MODE_SPORTS)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.SCENE_MODE_SPORTS);
android_hardware_camera_parameters.SCENE_MODE_SPORTS = NULL;
if (Parameters_SCENE_MODE_PARTY)
@@ -2078,7 +2009,7 @@
Parameters_SCENE_MODE_PARTY);
Parameters_SCENE_MODE_PARTY = NULL;
if (android_hardware_camera_parameters.SCENE_MODE_PARTY)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.SCENE_MODE_PARTY);
android_hardware_camera_parameters.SCENE_MODE_PARTY = NULL;
if (Parameters_SCENE_MODE_CANDLELIGHT)
@@ -2087,7 +2018,7 @@
Parameters_SCENE_MODE_CANDLELIGHT);
Parameters_SCENE_MODE_CANDLELIGHT = NULL;
if (android_hardware_camera_parameters.SCENE_MODE_CANDLELIGHT)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.SCENE_MODE_CANDLELIGHT);
android_hardware_camera_parameters.SCENE_MODE_CANDLELIGHT = NULL;
if (Parameters_SCENE_MODE_BARCODE)
@@ -2096,7 +2027,7 @@
Parameters_SCENE_MODE_BARCODE);
Parameters_SCENE_MODE_BARCODE = NULL;
if (android_hardware_camera_parameters.SCENE_MODE_BARCODE)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.SCENE_MODE_BARCODE);
android_hardware_camera_parameters.SCENE_MODE_BARCODE = NULL;
if (Parameters_FOCUS_MODE_AUTO)
@@ -2105,7 +2036,7 @@
Parameters_FOCUS_MODE_AUTO);
Parameters_FOCUS_MODE_AUTO = NULL;
if (android_hardware_camera_parameters.FOCUS_MODE_AUTO)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.FOCUS_MODE_AUTO);
android_hardware_camera_parameters.FOCUS_MODE_AUTO = NULL;
if (Parameters_FOCUS_MODE_INFINITY)
@@ -2114,7 +2045,7 @@
Parameters_FOCUS_MODE_INFINITY);
Parameters_FOCUS_MODE_INFINITY = NULL;
if (android_hardware_camera_parameters.FOCUS_MODE_INFINITY)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.FOCUS_MODE_INFINITY);
android_hardware_camera_parameters.FOCUS_MODE_INFINITY = NULL;
if (Parameters_FOCUS_MODE_MACRO)
@@ -2123,7 +2054,7 @@
Parameters_FOCUS_MODE_MACRO);
Parameters_FOCUS_MODE_MACRO = NULL;
if (android_hardware_camera_parameters.FOCUS_MODE_MACRO)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.FOCUS_MODE_MACRO);
android_hardware_camera_parameters.FOCUS_MODE_MACRO = NULL;
if (Parameters_FOCUS_MODE_FIXED)
@@ -2132,7 +2063,7 @@
Parameters_FOCUS_MODE_FIXED);
Parameters_FOCUS_MODE_FIXED = NULL;
if (android_hardware_camera_parameters.FOCUS_MODE_FIXED)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.FOCUS_MODE_FIXED);
android_hardware_camera_parameters.FOCUS_MODE_FIXED = NULL;
if (Parameters_FOCUS_MODE_EDOF)
@@ -2141,7 +2072,7 @@
Parameters_FOCUS_MODE_EDOF);
Parameters_FOCUS_MODE_EDOF = NULL;
if (android_hardware_camera_parameters.FOCUS_MODE_EDOF)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.FOCUS_MODE_EDOF);
android_hardware_camera_parameters.FOCUS_MODE_EDOF = NULL;
if (Parameters_FOCUS_MODE_CONTINUOUS_VIDEO)
@@ -2150,7 +2081,7 @@
Parameters_FOCUS_MODE_CONTINUOUS_VIDEO);
Parameters_FOCUS_MODE_CONTINUOUS_VIDEO = NULL;
if (android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_VIDEO)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_VIDEO = NULL;
if (Parameters_FOCUS_MODE_CONTINUOUS_PICTURE)
@@ -2159,51 +2090,51 @@
Parameters_FOCUS_MODE_CONTINUOUS_PICTURE);
Parameters_FOCUS_MODE_CONTINUOUS_PICTURE = NULL;
if (android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_PICTURE)
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_PICTURE = NULL;
if (java_lang_string.klass)
- (*env)->DeleteGlobalRef (env, java_lang_string.klass);
+ gst_amc_jni_object_unref (env, java_lang_string.klass);
java_lang_string.klass = NULL;
if (java_util_list.klass)
- (*env)->DeleteGlobalRef (env, java_util_list.klass);
+ gst_amc_jni_object_unref (env, java_util_list.klass);
java_util_list.klass = NULL;
if (java_util_iterator.klass)
- (*env)->DeleteGlobalRef (env, java_util_iterator.klass);
+ gst_amc_jni_object_unref (env, java_util_iterator.klass);
java_util_iterator.klass = NULL;
if (java_lang_integer.klass)
- (*env)->DeleteGlobalRef (env, java_lang_integer.klass);
+ gst_amc_jni_object_unref (env, java_lang_integer.klass);
java_lang_integer.klass = NULL;
if (org_freedesktop_gstreamer_androidmedia_gstahccallback.klass) {
(*env)->UnregisterNatives (env,
org_freedesktop_gstreamer_androidmedia_gstahccallback.klass);
- (*env)->DeleteGlobalRef (env,
+ gst_amc_jni_object_unref (env,
org_freedesktop_gstreamer_androidmedia_gstahccallback.klass);
}
org_freedesktop_gstreamer_androidmedia_gstahccallback.klass = NULL;
}
/* android.hardware.Camera */
-#define AHC_CALL(error_statement, type, method, ...) \
- GST_DVM_CALL (error_statement, self->object, type, android_hardware_camera, \
- method, ## __VA_ARGS__);
-#define AHC_STATIC_CALL(error_statement, type, method, ...) \
- GST_DVM_STATIC_CALL (error_statement, type, android_hardware_camera, \
- method, ## __VA_ARGS__);
-
void
gst_ah_camera_add_callback_buffer (GstAHCamera * self, jbyteArray buffer)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
GST_DEBUG ("add callback_buffer %p", buffer);
- AHC_CALL (, Void, addCallbackBuffer, buffer);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera.addCallbackBuffer, buffer);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.addCallbackBuffer: %s",
+ err->message);
+ g_clear_error (&err);
+ }
}
gboolean
@@ -2211,27 +2142,39 @@
GstAHCAutoFocusCallback cb, gpointer user_data)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jobject object = NULL;
gboolean ret = FALSE;
if (cb) {
- object = (*env)->NewObject (env,
+ object = gst_amc_jni_new_object (env,
+ &err,
+ FALSE,
org_freedesktop_gstreamer_androidmedia_gstahccallback.klass,
org_freedesktop_gstreamer_androidmedia_gstahccallback.constructor,
*((jlong *) & cb), *((jlong *) & user_data));
- if (!object) {
- GST_ERROR ("Failed to create callback object");
- (*env)->ExceptionClear (env);
+ if (err) {
+ GST_ERROR
+ ("Failed to create org.freedesktop.gstreamer.androidmedia.GstAhcCallback object");
+ g_clear_error (&err);
goto done;
}
}
- AHC_CALL (goto done, Void, autoFocus, object);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera.autoFocus, object);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.autoFocus: %s",
+ err->message);
+ goto done;
+ }
ret = TRUE;
done:
+ if (err)
+ g_clear_error (&err);
if (object)
- (*env)->DeleteLocalRef (env, object);
+ gst_amc_jni_object_local_unref (env, object);
return ret;
}
@@ -2240,8 +2183,16 @@
gst_ah_camera_cancel_auto_focus (GstAHCamera * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
- AHC_CALL (return FALSE, Void, cancelAutoFocus);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera.cancelAutoFocus);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.cancelAutoFocus: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
@@ -2250,19 +2201,28 @@
gst_ah_camera_get_camera_info (gint camera_id, GstAHCCameraInfo * camera_info)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jobject jcamera_info = NULL;
gboolean ret = FALSE;
- jcamera_info = (*env)->NewObject (env,
+ jcamera_info = gst_amc_jni_new_object (env,
+ &err,
+ FALSE,
android_hardware_camera_camerainfo.klass,
android_hardware_camera_camerainfo.constructor);
- if (!jcamera_info) {
- GST_ERROR ("Failed to call Java method");
- (*env)->ExceptionClear (env);
+ if (err) {
+ GST_ERROR ("Failed to create android.hardware.camera.CameraInfo object");
+ g_clear_error (&err);
goto done;
}
- AHC_STATIC_CALL (goto done, Void, getCameraInfo, camera_id, jcamera_info);
+ gst_amc_jni_call_static_void_method (env, &err, android_hardware_camera.klass,
+ android_hardware_camera.getCameraInfo, camera_id, jcamera_info);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.getCameraInfo: %s",
+ err->message);
+ goto done;
+ }
camera_info->facing = (*env)->GetIntField (env, jcamera_info,
android_hardware_camera_camerainfo.facing);
@@ -2282,8 +2242,10 @@
ret = TRUE;
done:
+ if (err)
+ g_clear_error (&err);
if (jcamera_info)
- (*env)->DeleteLocalRef (env, jcamera_info);
+ gst_amc_jni_object_local_unref (env, jcamera_info);
return ret;
}
@@ -2292,9 +2254,17 @@
gst_ah_camera_get_number_of_cameras (void)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
gint num_cameras;
- num_cameras = AHC_STATIC_CALL (return -1, Int, getNumberOfCameras);
+ gst_amc_jni_call_static_int_method (env, &err, android_hardware_camera.klass,
+ android_hardware_camera.getNumberOfCameras, &num_cameras);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.getNumberOfCameras: %s",
+ err->message);
+ g_clear_error (&err);
+ return -1;
+ }
return num_cameras;
}
@@ -2303,18 +2273,26 @@
gst_ah_camera_get_parameters (GstAHCamera * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jobject object = NULL;
GstAHCParameters *params = NULL;
- object = AHC_CALL (return NULL, Object, getParameters);
+ gst_amc_jni_call_object_method (env, &err, self->object,
+ android_hardware_camera.getParameters, &object);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.getParameters: %s",
+ err->message);
+ g_clear_error (&err);
+ return NULL;
+ }
if (!object) {
GST_WARNING ("android.hardware.Camera.getParameter is NULL");
return NULL;
}
params = g_slice_new0 (GstAHCParameters);
- params->object = (*env)->NewGlobalRef (env, object);
- (*env)->DeleteLocalRef (env, object);
+ params->object = gst_amc_jni_object_ref (env, object);
+ gst_amc_jni_object_local_unref (env, object);
if (!params->object) {
GST_ERROR ("Failed to create global reference");
(*env)->ExceptionClear (env);
@@ -2331,8 +2309,15 @@
gst_ah_camera_lock (GstAHCamera * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
- AHC_CALL (return FALSE, Void, lock);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera.lock);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.lock: %s", err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
@@ -2341,14 +2326,23 @@
gst_ah_camera_open (gint camera_id)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jobject object = NULL;
GstAHCamera *camera = NULL;
- object = AHC_STATIC_CALL (goto done, Object, open, camera_id);
+ gst_amc_jni_call_static_object_method (env, &err,
+ android_hardware_camera.klass, android_hardware_camera.open, &object,
+ camera_id);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.open: %s", err->message);
+ g_clear_error (&err);
+ goto done;
+ }
+
if (object) {
camera = g_slice_new0 (GstAHCamera);
- camera->object = (*env)->NewGlobalRef (env, object);
- (*env)->DeleteLocalRef (env, object);
+ camera->object = gst_amc_jni_object_ref (env, object);
+ gst_amc_jni_object_local_unref (env, object);
if (!camera->object) {
GST_ERROR ("Failed to create global reference");
(*env)->ExceptionClear (env);
@@ -2365,8 +2359,16 @@
gst_ah_camera_reconnect (GstAHCamera * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
- AHC_CALL (return FALSE, Void, reconnect);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera.reconnect);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.reconnect: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
@@ -2375,8 +2377,15 @@
gst_ah_camera_release (GstAHCamera * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
- AHC_CALL (, Void, release);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera.release);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.release: %s",
+ err->message);
+ g_clear_error (&err);
+ }
}
void
@@ -2384,7 +2393,7 @@
{
JNIEnv *env = gst_amc_jni_get_env ();
- (*env)->DeleteGlobalRef (env, self->object);
+ gst_amc_jni_object_unref (env, self->object);
g_slice_free (GstAHCamera, self);
}
@@ -2393,8 +2402,16 @@
gst_ah_camera_set_parameters (GstAHCamera * self, GstAHCParameters * params)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
- AHC_CALL (return FALSE, Void, setParameters, params->object);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera.setParameters, params->object);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.setParameters: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
@@ -2404,27 +2421,39 @@
gpointer user_data)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jobject object = NULL;
gboolean ret = FALSE;
if (cb) {
- object = (*env)->NewObject (env,
+ object = gst_amc_jni_new_object (env,
+ &err,
+ FALSE,
org_freedesktop_gstreamer_androidmedia_gstahccallback.klass,
org_freedesktop_gstreamer_androidmedia_gstahccallback.constructor,
*((jlong *) & cb), *((jlong *) & user_data));
- if (!object) {
- GST_ERROR ("Failed to create callback object");
- (*env)->ExceptionClear (env);
+ if (err) {
+ GST_ERROR
+ ("Failed to create org.freedesktop.gstreamer.androidmedia.GstAhcCallback object");
+ g_clear_error (&err);
goto done;
}
}
- AHC_CALL (goto done, Void, setErrorCallback, object);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera.setErrorCallback, object);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.setErrorCallback: %s",
+ err->message);
+ goto done;
+ }
ret = TRUE;
done:
+ if (err)
+ g_clear_error (&err);
if (object)
- (*env)->DeleteLocalRef (env, object);
+ gst_amc_jni_object_local_unref (env, object);
return ret;
}
@@ -2434,46 +2463,74 @@
GstAHCPreviewCallback cb, gpointer user_data)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jobject object = NULL;
gboolean ret = FALSE;
if (cb) {
- object = (*env)->NewObject (env,
+ object = gst_amc_jni_new_object (env,
+ &err,
+ FALSE,
org_freedesktop_gstreamer_androidmedia_gstahccallback.klass,
org_freedesktop_gstreamer_androidmedia_gstahccallback.constructor,
*((jlong *) & cb), *((jlong *) & user_data));
- if (!object) {
- GST_ERROR ("Failed to create callback object");
- (*env)->ExceptionClear (env);
+ if (err) {
+ GST_ERROR
+ ("Failed to create org.freedesktop.gstreamer.androidmedia.GstAhcCallback object");
+ g_clear_error (&err);
goto done;
}
}
- AHC_CALL (goto done, Void, setPreviewCallbackWithBuffer, object);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera.setPreviewCallbackWithBuffer, object);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.setPreviewCallbackWithBuffer: %s",
+ err->message);
+ goto done;
+ }
ret = TRUE;
done:
+ if (err)
+ g_clear_error (&err);
if (object)
- (*env)->DeleteLocalRef (env, object);
+ gst_amc_jni_object_local_unref (env, object);
return ret;
}
void
gst_ah_camera_set_preview_texture (GstAHCamera * self,
- GstAGSurfaceTexture * surfaceTexture)
+ GstAmcSurfaceTexture * surfaceTexture)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
- AHC_CALL (, Void, setPreviewTexture, surfaceTexture->object);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera.setPreviewTexture, surfaceTexture->jobject);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.setPreviewTexture: %s",
+ err->message);
+ g_clear_error (&err);
+ }
}
gboolean
gst_ah_camera_start_preview (GstAHCamera * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
- AHC_CALL (return FALSE, Void, startPreview);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera.startPreview);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.startPreview: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
@@ -2482,8 +2539,16 @@
gst_ah_camera_start_smooth_zoom (GstAHCamera * self, gint value)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
- AHC_CALL (return FALSE, Void, startSmoothZoom, value);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera.startSmoothZoom, value);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.startSmoothZoom: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
@@ -2492,8 +2557,16 @@
gst_ah_camera_stop_preview (GstAHCamera * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
- AHC_CALL (return FALSE, Void, stopPreview);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera.stopPreview);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.stopPreview: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
@@ -2502,8 +2575,16 @@
gst_ah_camera_stop_smooth_zoom (GstAHCamera * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
- AHC_CALL (return FALSE, Void, stopSmoothZoom);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera.stopSmoothZoom);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.stopSmoothZoom: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
@@ -2512,20 +2593,25 @@
gst_ah_camera_unlock (GstAHCamera * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
- AHC_CALL (return FALSE, Void, unlock);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera.unlock);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.unlock: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
-#undef AHC_CALL
-#undef AHC_STATIC_CALL
-
/* android.hardware.Camera.Size */
GstAHCSize *
gst_ahc_size_new (gint width, gint height)
{
- GstAHCSize *self = g_slice_new0 (GstAHCSize);
+ GstAHCSize *self = g_slice_new (GstAHCSize);
self->width = width;
self->height = height;
@@ -2575,14 +2661,6 @@
/* android.hardware.Camera.Parameters */
-#define AHCP_CALL(error_statement, type, method, ...) \
- GST_DVM_CALL (error_statement, self->object, type, \
- android_hardware_camera_parameters, method, ## __VA_ARGS__);
-
-#define AHCP_STATIC_CALL(error_statement, type, method, ...) \
- GST_DVM_STATIC_CALL (error_statement, type, \
- android_hardware_camera_parameters, method, ## __VA_ARGS__);
-
static const gchar *
_white_balance_to_gchar (JNIEnv * env, jstring white_balance)
{
@@ -2953,11 +3031,19 @@
gst_ahc_parameters_flatten (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jstring v_str = NULL;
const gchar *v = NULL;
gchar *ret = NULL;
- v_str = AHCP_CALL (goto done, Object, flatten);
+ gst_amc_jni_call_object_method (env, &err, self->object,
+ android_hardware_camera_parameters.flatten, &v_str);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.Parameters.flatten: %s",
+ err->message);
+ goto done;
+ }
+
v = (*env)->GetStringUTFChars (env, v_str, NULL);
if (!v) {
GST_ERROR ("Failed to convert string to UTF8");
@@ -2967,10 +3053,12 @@
ret = g_strdup (v);
done:
+ if (err)
+ g_clear_error (&err);
if (v)
(*env)->ReleaseStringUTFChars (env, v_str, v);
if (v_str)
- (*env)->DeleteLocalRef (env, v_str);
+ gst_amc_jni_object_local_unref (env, v_str);
return ret;
}
@@ -2979,15 +3067,24 @@
gst_ahc_parameters_get_antibanding (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
const gchar *ret = NULL;
jstring antibanding;
- antibanding = AHCP_CALL (return NULL, Object, getAntibanding);
+ gst_amc_jni_call_object_method (env, &err, self->object,
+ android_hardware_camera_parameters.getAntibanding, &antibanding);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getAntibanding: %s",
+ err->message);
+ g_clear_error (&err);
+ return NULL;
+ }
ret = _antibanding_to_gchar (env, antibanding);
if (antibanding)
- (*env)->DeleteLocalRef (env, antibanding);
+ gst_amc_jni_object_local_unref (env, antibanding);
return ret;
}
@@ -2996,15 +3093,24 @@
gst_ahc_parameters_get_color_effect (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
const gchar *ret = NULL;
jstring color_effect;
- color_effect = AHCP_CALL (return NULL, Object, getColorEffect);
+ gst_amc_jni_call_object_method (env, &err, self->object,
+ android_hardware_camera_parameters.getColorEffect, &color_effect);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getColorEffect: %s",
+ err->message);
+ g_clear_error (&err);
+ return NULL;
+ }
ret = _color_effect_to_gchar (env, color_effect);
if (color_effect)
- (*env)->DeleteLocalRef (env, color_effect);
+ gst_amc_jni_object_local_unref (env, color_effect);
return ret;
}
@@ -3013,9 +3119,18 @@
gst_ahc_parameters_get_exposure_compensation (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
gint ev;
- ev = AHCP_CALL (return -1, Int, getExposureCompensation);
+ gst_amc_jni_call_int_method (env, &err, self->object,
+ android_hardware_camera_parameters.getExposureCompensation, &ev);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getExposureCompensation: %s",
+ err->message);
+ g_clear_error (&err);
+ return -1;
+ }
return ev;
}
@@ -3024,9 +3139,18 @@
gst_ahc_parameters_get_exposure_compensation_step (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
gfloat step;
- step = AHCP_CALL (return 0.0, Float, getExposureCompensationStep);
+ gst_amc_jni_call_float_method (env, &err, self->object,
+ android_hardware_camera_parameters.getExposureCompensationStep, &step);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getExposureCompensationStep: %s",
+ err->message);
+ g_clear_error (&err);
+ return 0.0;
+ }
return step;
}
@@ -3035,15 +3159,24 @@
gst_ahc_parameters_get_flash_mode (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
const gchar *ret = NULL;
jstring flash_mode;
- flash_mode = AHCP_CALL (return NULL, Object, getFlashMode);
+ gst_amc_jni_call_object_method (env, &err, self->object,
+ android_hardware_camera_parameters.getFlashMode, &flash_mode);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getFlashMode: %s",
+ err->message);
+ g_clear_error (&err);
+ return NULL;
+ }
ret = _flash_mode_to_gchar (env, flash_mode);
if (flash_mode)
- (*env)->DeleteLocalRef (env, flash_mode);
+ gst_amc_jni_object_local_unref (env, flash_mode);
return ret;
}
@@ -3052,9 +3185,18 @@
gst_ahc_parameters_get_focal_length (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
gfloat length;
- length = AHCP_CALL (return 0.0, Float, getFocalLength);
+ gst_amc_jni_call_float_method (env, &err, self->object,
+ android_hardware_camera_parameters.getFocalLength, &length);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getFocalLength: %s",
+ err->message);
+ g_clear_error (&err);
+ return 0.0;
+ }
return length;
}
@@ -3063,15 +3205,24 @@
gst_ahc_parameters_get_focus_mode (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
const gchar *ret = NULL;
jstring focus_mode;
- focus_mode = AHCP_CALL (return NULL, Object, getFocusMode);
+ gst_amc_jni_call_object_method (env, &err, self->object,
+ android_hardware_camera_parameters.getFocusMode, &focus_mode);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getFocusMode: %s",
+ err->message);
+ g_clear_error (&err);
+ return NULL;
+ }
ret = _focus_mode_to_gchar (env, focus_mode);
if (focus_mode)
- (*env)->DeleteLocalRef (env, focus_mode);
+ gst_amc_jni_object_local_unref (env, focus_mode);
return ret;
}
@@ -3080,9 +3231,18 @@
gst_ahc_parameters_get_horizontal_view_angle (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
gfloat angle;
- angle = AHCP_CALL (return 0.0, Float, getHorizontalViewAngle);
+ gst_amc_jni_call_float_method (env, &err, self->object,
+ android_hardware_camera_parameters.getHorizontalViewAngle, &angle);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getHorizontalViewAngle: %s",
+ err->message);
+ g_clear_error (&err);
+ return 0.0;
+ }
return angle;
}
@@ -3091,9 +3251,18 @@
gst_ahc_parameters_get_max_exposure_compensation (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
gint max;
- max = AHCP_CALL (return 0, Int, getMaxExposureCompensation);
+ gst_amc_jni_call_int_method (env, &err, self->object,
+ android_hardware_camera_parameters.getMaxExposureCompensation, &max);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getMaxExposureCompensation: %s",
+ err->message);
+ g_clear_error (&err);
+ return 0;
+ }
return max;
}
@@ -3102,9 +3271,18 @@
gst_ahc_parameters_get_max_zoom (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
gint max;
- max = AHCP_CALL (return -1, Int, getMaxZoom);
+ gst_amc_jni_call_int_method (env, &err, self->object,
+ android_hardware_camera_parameters.getMaxZoom, &max);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getMaxZoom: %s",
+ err->message);
+ g_clear_error (&err);
+ return -1;
+ }
return max;
}
@@ -3113,9 +3291,18 @@
gst_ahc_parameters_get_min_exposure_compensation (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
gint min;
- min = AHCP_CALL (return 0, Int, getMinExposureCompensation);
+ gst_amc_jni_call_int_method (env, &err, self->object,
+ android_hardware_camera_parameters.getMinExposureCompensation, &min);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getMinExposureCompensation: %s",
+ err->message);
+ g_clear_error (&err);
+ return 0;
+ }
return min;
}
@@ -3124,9 +3311,18 @@
gst_ahc_parameters_get_preview_format (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
gint format;
- format = AHCP_CALL (return 0, Int, getPreviewFormat);
+ gst_amc_jni_call_int_method (env, &err, self->object,
+ android_hardware_camera_parameters.getPreviewFormat, &format);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getPreviewFormat: %s",
+ err->message);
+ g_clear_error (&err);
+ return 0;
+ }
return format;
}
@@ -3136,6 +3332,7 @@
gint * min, gint * max)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
gboolean ret = FALSE;
jintArray range = NULL;
jint *fps = NULL;
@@ -3147,7 +3344,14 @@
goto done;
}
- AHCP_CALL (goto done, Void, getPreviewFpsRange, range);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera_parameters.getPreviewFpsRange, range);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getPreviewFpsRange: %s",
+ err->message);
+ goto done;
+ }
fps = (*env)->GetIntArrayElements (env, range, NULL);
if ((*env)->ExceptionCheck (env) || !fps) {
@@ -3162,10 +3366,12 @@
ret = TRUE;
done:
+ if (err)
+ g_clear_error (&err);
if (fps)
(*env)->ReleaseIntArrayElements (env, range, fps, JNI_ABORT);
if (range)
- (*env)->DeleteLocalRef (env, range);
+ gst_amc_jni_object_local_unref (env, range);
return ret;
}
@@ -3174,13 +3380,20 @@
gst_ahc_parameters_get_preview_size (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jobject jsize = NULL;
GstAHCSize *size = NULL;
- jsize = AHCP_CALL (goto done, Object, getPreviewSize);
+ gst_amc_jni_call_object_method (env, &err, self->object,
+ android_hardware_camera_parameters.getPreviewSize, &jsize);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getPreviewSize: %s",
+ err->message);
+ goto done;
+ }
- size = g_slice_new0 (GstAHCSize);
-
+ size = g_slice_new (GstAHCSize);
size->width = (*env)->GetIntField (env, jsize,
android_hardware_camera_size.width);
if ((*env)->ExceptionCheck (env)) {
@@ -3202,8 +3415,10 @@
}
done:
+ if (err)
+ g_clear_error (&err);
if (jsize)
- (*env)->DeleteLocalRef (env, jsize);
+ gst_amc_jni_object_local_unref (env, jsize);
return size;
}
@@ -3212,15 +3427,24 @@
gst_ahc_parameters_get_scene_mode (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
const gchar *ret = NULL;
jstring scene_mode;
- scene_mode = AHCP_CALL (return NULL, Object, getSceneMode);
+ gst_amc_jni_call_object_method (env, &err, self->object,
+ android_hardware_camera_parameters.getSceneMode, &scene_mode);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getSceneMode: %s",
+ err->message);
+ g_clear_error (&err);
+ return NULL;
+ }
ret = _scene_mode_to_gchar (env, scene_mode);
if (scene_mode)
- (*env)->DeleteLocalRef (env, scene_mode);
+ gst_amc_jni_object_local_unref (env, scene_mode);
return ret;
}
@@ -3229,10 +3453,19 @@
gst_ahc_parameters_get_supported_antibanding (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jobject list = NULL;
GList *ret = NULL;
- list = AHCP_CALL (return NULL, Object, getSupportedAntibanding);
+ gst_amc_jni_call_object_method (env, &err, self->object,
+ android_hardware_camera_parameters.getSupportedAntibanding, &list);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getSupportedAntibanding: %s",
+ err->message);
+ g_clear_error (&err);
+ return NULL;
+ }
if (list) {
jobject iterator = NULL;
@@ -3246,12 +3479,12 @@
const gchar *value = _antibanding_to_gchar (env, str);
ret = g_list_append (ret, (gchar *) value);
- (*env)->DeleteLocalRef (env, str);
+ gst_amc_jni_object_local_unref (env, str);
}
}
- (*env)->DeleteLocalRef (env, iterator);
+ gst_amc_jni_object_local_unref (env, iterator);
}
- (*env)->DeleteLocalRef (env, list);
+ gst_amc_jni_object_local_unref (env, list);
}
return ret;
@@ -3267,10 +3500,19 @@
gst_ahc_parameters_get_supported_color_effects (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jobject list = NULL;
GList *ret = NULL;
- list = AHCP_CALL (return NULL, Object, getSupportedColorEffects);
+ gst_amc_jni_call_object_method (env, &err, self->object,
+ android_hardware_camera_parameters.getSupportedColorEffects, &list);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getSupportedColorEffects: %s",
+ err->message);
+ g_clear_error (&err);
+ return NULL;
+ }
if (list) {
jobject iterator = NULL;
@@ -3284,12 +3526,12 @@
const gchar *value = _color_effect_to_gchar (env, str);
ret = g_list_append (ret, (gchar *) value);
- (*env)->DeleteLocalRef (env, str);
+ gst_amc_jni_object_local_unref (env, str);
}
}
- (*env)->DeleteLocalRef (env, iterator);
+ gst_amc_jni_object_local_unref (env, iterator);
}
- (*env)->DeleteLocalRef (env, list);
+ gst_amc_jni_object_local_unref (env, list);
}
return ret;
@@ -3305,10 +3547,19 @@
gst_ahc_parameters_get_supported_flash_modes (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jobject list = NULL;
GList *ret = NULL;
- list = AHCP_CALL (return NULL, Object, getSupportedFlashModes);
+ gst_amc_jni_call_object_method (env, &err, self->object,
+ android_hardware_camera_parameters.getSupportedFlashModes, &list);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getSupportedFlashModes: %s",
+ err->message);
+ g_clear_error (&err);
+ return NULL;
+ }
if (list) {
jobject iterator = NULL;
@@ -3322,12 +3573,12 @@
const gchar *value = _flash_mode_to_gchar (env, str);
ret = g_list_append (ret, (gchar *) value);
- (*env)->DeleteLocalRef (env, str);
+ gst_amc_jni_object_local_unref (env, str);
}
}
- (*env)->DeleteLocalRef (env, iterator);
+ gst_amc_jni_object_local_unref (env, iterator);
}
- (*env)->DeleteLocalRef (env, list);
+ gst_amc_jni_object_local_unref (env, list);
}
return ret;
@@ -3343,10 +3594,19 @@
gst_ahc_parameters_get_supported_focus_modes (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jobject list = NULL;
GList *ret = NULL;
- list = AHCP_CALL (return NULL, Object, getSupportedFocusModes);
+ gst_amc_jni_call_object_method (env, &err, self->object,
+ android_hardware_camera_parameters.getSupportedFocusModes, &list);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getSupportedFocusModes: %s",
+ err->message);
+ g_clear_error (&err);
+ return NULL;
+ }
if (list) {
jobject iterator = NULL;
@@ -3360,12 +3620,12 @@
const gchar *value = _focus_mode_to_gchar (env, str);
ret = g_list_append (ret, (gchar *) value);
- (*env)->DeleteLocalRef (env, str);
+ gst_amc_jni_object_local_unref (env, str);
}
}
- (*env)->DeleteLocalRef (env, iterator);
+ gst_amc_jni_object_local_unref (env, iterator);
}
- (*env)->DeleteLocalRef (env, list);
+ gst_amc_jni_object_local_unref (env, list);
}
return ret;
@@ -3381,10 +3641,19 @@
gst_ahc_parameters_get_supported_preview_formats (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jobject list = NULL;
GList *ret = NULL;
- list = AHCP_CALL (return NULL, Object, getSupportedPreviewFormats);
+ gst_amc_jni_call_object_method (env, &err, self->object,
+ android_hardware_camera_parameters.getSupportedPreviewFormats, &list);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getSupportedPreviewFormats: %s",
+ err->message);
+ g_clear_error (&err);
+ return NULL;
+ }
if (list) {
jobject iterator = NULL;
@@ -3398,12 +3667,12 @@
jint value = java_lang_integer_int_value (env, integer);
ret = g_list_append (ret, GINT_TO_POINTER (value));
- (*env)->DeleteLocalRef (env, integer);
+ gst_amc_jni_object_local_unref (env, integer);
}
}
- (*env)->DeleteLocalRef (env, iterator);
+ gst_amc_jni_object_local_unref (env, iterator);
}
- (*env)->DeleteLocalRef (env, list);
+ gst_amc_jni_object_local_unref (env, list);
}
return ret;
@@ -3419,10 +3688,19 @@
gst_ahc_parameters_get_supported_preview_fps_range (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jobject list = NULL;
GList *ret = NULL;
- list = AHCP_CALL (return NULL, Object, getSupportedPreviewFpsRange);
+ gst_amc_jni_call_object_method (env, &err, self->object,
+ android_hardware_camera_parameters.getSupportedPreviewFpsRange, &list);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getSupportedPreviewFpsRange: %s",
+ err->message);
+ g_clear_error (&err);
+ return NULL;
+ }
if (list) {
jobject iterator = NULL;
@@ -3437,12 +3715,12 @@
(*env)->GetIntArrayRegion (env, range, 0, 2, fps);
ret = g_list_append (ret, fps);
- (*env)->DeleteLocalRef (env, range);
+ gst_amc_jni_object_local_unref (env, range);
}
}
- (*env)->DeleteLocalRef (env, iterator);
+ gst_amc_jni_object_local_unref (env, iterator);
}
- (*env)->DeleteLocalRef (env, list);
+ gst_amc_jni_object_local_unref (env, list);
}
return ret;
@@ -3459,10 +3737,19 @@
gst_ahc_parameters_get_supported_preview_sizes (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jobject list = NULL;
GList *ret = NULL;
- list = AHCP_CALL (return NULL, Object, getSupportedPreviewSizes);
+ gst_amc_jni_call_object_method (env, &err, self->object,
+ android_hardware_camera_parameters.getSupportedPreviewSizes, &list);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getSupportedPreviewSizes: %s",
+ err->message);
+ g_clear_error (&err);
+ return NULL;
+ }
if (list) {
jobject iterator = NULL;
@@ -3481,12 +3768,12 @@
android_hardware_camera_size.height);
ret = g_list_append (ret, gst_ahc_size_new (width, height));
- (*env)->DeleteLocalRef (env, jsize);
+ gst_amc_jni_object_local_unref (env, jsize);
}
}
- (*env)->DeleteLocalRef (env, iterator);
+ gst_amc_jni_object_local_unref (env, iterator);
}
- (*env)->DeleteLocalRef (env, list);
+ gst_amc_jni_object_local_unref (env, list);
}
return ret;
@@ -3503,10 +3790,19 @@
gst_ahc_parameters_get_supported_scene_modes (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jobject list = NULL;
GList *ret = NULL;
- list = AHCP_CALL (return NULL, Object, getSupportedSceneModes);
+ gst_amc_jni_call_object_method (env, &err, self->object,
+ android_hardware_camera_parameters.getSupportedSceneModes, &list);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getSupportedSceneModes: %s",
+ err->message);
+ g_clear_error (&err);
+ return NULL;
+ }
if (list) {
jobject iterator = NULL;
@@ -3520,12 +3816,12 @@
const gchar *value = _scene_mode_to_gchar (env, str);
ret = g_list_append (ret, (gchar *) value);
- (*env)->DeleteLocalRef (env, str);
+ gst_amc_jni_object_local_unref (env, str);
}
}
- (*env)->DeleteLocalRef (env, iterator);
+ gst_amc_jni_object_local_unref (env, iterator);
}
- (*env)->DeleteLocalRef (env, list);
+ gst_amc_jni_object_local_unref (env, list);
}
return ret;
@@ -3541,10 +3837,19 @@
gst_ahc_parameters_get_supported_white_balance (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jobject list = NULL;
GList *ret = NULL;
- list = AHCP_CALL (return NULL, Object, getSupportedWhiteBalance);
+ gst_amc_jni_call_object_method (env, &err, self->object,
+ android_hardware_camera_parameters.getSupportedWhiteBalance, &list);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getSupportedWhiteBalance: %s",
+ err->message);
+ g_clear_error (&err);
+ return NULL;
+ }
if (list) {
jobject iterator = NULL;
@@ -3558,12 +3863,12 @@
const gchar *value = _white_balance_to_gchar (env, str);
ret = g_list_append (ret, (gchar *) value);
- (*env)->DeleteLocalRef (env, str);
+ gst_amc_jni_object_local_unref (env, str);
}
}
- (*env)->DeleteLocalRef (env, iterator);
+ gst_amc_jni_object_local_unref (env, iterator);
}
- (*env)->DeleteLocalRef (env, list);
+ gst_amc_jni_object_local_unref (env, list);
}
return ret;
@@ -3579,9 +3884,18 @@
gst_ahc_parameters_get_vertical_view_angle (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
gfloat angle;
- angle = AHCP_CALL (return 0.0, Float, getVerticalViewAngle);
+ gst_amc_jni_call_float_method (env, &err, self->object,
+ android_hardware_camera_parameters.getVerticalViewAngle, &angle);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getVerticalViewAngle: %s",
+ err->message);
+ g_clear_error (&err);
+ return 0.0;
+ }
return angle;
}
@@ -3590,9 +3904,18 @@
gst_ahc_parameters_get_video_stabilization (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
gboolean ret;
- ret = AHCP_CALL (return FALSE, Boolean, getVideoStabilization);
+ gst_amc_jni_call_boolean_method (env, &err, self->object,
+ android_hardware_camera_parameters.getVideoStabilization, &ret);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getVideoStabilization: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return ret;
}
@@ -3601,15 +3924,24 @@
gst_ahc_parameters_get_white_balance (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
const gchar *ret = NULL;
jstring white_balance;
- white_balance = AHCP_CALL (return NULL, Object, getWhiteBalance);
+ gst_amc_jni_call_object_method (env, &err, self->object,
+ android_hardware_camera_parameters.getWhiteBalance, &white_balance);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getWhiteBalance: %s",
+ err->message);
+ g_clear_error (&err);
+ return NULL;
+ }
ret = _white_balance_to_gchar (env, white_balance);
if (white_balance)
- (*env)->DeleteLocalRef (env, white_balance);
+ gst_amc_jni_object_local_unref (env, white_balance);
return ret;
}
@@ -3618,9 +3950,17 @@
gst_ahc_parameters_get_zoom (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
gint zoom;
- zoom = AHCP_CALL (return -1, Int, getZoom);
+ gst_amc_jni_call_int_method (env, &err, self->object,
+ android_hardware_camera_parameters.getZoom, &zoom);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.Parameters.getZoom: %s",
+ err->message);
+ g_clear_error (&err);
+ return -1;
+ }
return zoom;
}
@@ -3629,10 +3969,19 @@
gst_ahc_parameters_get_zoom_ratios (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jobject list = NULL;
GList *ret = NULL;
- list = AHCP_CALL (return NULL, Object, getZoomRatios);
+ gst_amc_jni_call_object_method (env, &err, self->object,
+ android_hardware_camera_parameters.getZoomRatios, &list);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.getZoomRatios: %s",
+ err->message);
+ g_clear_error (&err);
+ return NULL;
+ }
if (list) {
jobject iterator = NULL;
@@ -3646,12 +3995,12 @@
jint value = java_lang_integer_int_value (env, integer);
ret = g_list_append (ret, GINT_TO_POINTER (value));
- (*env)->DeleteLocalRef (env, integer);
+ gst_amc_jni_object_local_unref (env, integer);
}
}
- (*env)->DeleteLocalRef (env, iterator);
+ gst_amc_jni_object_local_unref (env, iterator);
}
- (*env)->DeleteLocalRef (env, list);
+ gst_amc_jni_object_local_unref (env, list);
}
return ret;
@@ -3667,9 +4016,18 @@
gst_ahc_parameters_is_smooth_zoom_supported (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
gboolean supported;
- supported = AHCP_CALL (return FALSE, Boolean, isSmoothZoomSupported);
+ gst_amc_jni_call_boolean_method (env, &err, self->object,
+ android_hardware_camera_parameters.isSmoothZoomSupported, &supported);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.isSmoothZoomSupported: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return supported;
}
@@ -3678,9 +4036,19 @@
gst_ahc_parameters_is_video_stabilization_supported (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
gboolean supported;
- supported = AHCP_CALL (return FALSE, Boolean, isVideoStabilizationSupported);
+ gst_amc_jni_call_boolean_method (env, &err, self->object,
+ android_hardware_camera_parameters.isVideoStabilizationSupported,
+ &supported);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.isVideoStabilizationSupported: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return supported;
}
@@ -3689,9 +4057,18 @@
gst_ahc_parameters_is_zoom_supported (GstAHCParameters * self)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
gboolean supported;
- supported = AHCP_CALL (return FALSE, Boolean, isZoomSupported);
+ gst_amc_jni_call_boolean_method (env, &err, self->object,
+ android_hardware_camera_parameters.isZoomSupported, &supported);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.isZoomSupported: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return supported;
}
@@ -3701,13 +4078,22 @@
const gchar * value)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jstring antibanding;
antibanding = _antibanding_to_jstring (value);
if (!antibanding)
return FALSE;
- AHCP_CALL (return FALSE, Void, setAntibanding, antibanding);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera_parameters.setAntibanding, antibanding);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.setAntibanding: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
@@ -3717,13 +4103,22 @@
const gchar * value)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jstring color_effect;
color_effect = _color_effect_to_jstring (value);
if (!color_effect)
return FALSE;
- AHCP_CALL (return FALSE, Void, setColorEffect, color_effect);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera_parameters.setColorEffect, color_effect);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.setColorEffect: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
@@ -3733,8 +4128,17 @@
gint value)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
- AHCP_CALL (return FALSE, Void, setExposureCompensation, value);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera_parameters.setExposureCompensation, value);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.setExposureCompensation: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
@@ -3743,13 +4147,22 @@
gst_ahc_parameters_set_flash_mode (GstAHCParameters * self, const gchar * value)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jstring flash_mode;
flash_mode = _flash_mode_to_jstring (value);
if (!flash_mode)
return FALSE;
- AHCP_CALL (return FALSE, Void, setFlashMode, flash_mode);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera_parameters.setFlashMode, flash_mode);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.setFlashMode: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
@@ -3758,13 +4171,22 @@
gst_ahc_parameters_set_focus_mode (GstAHCParameters * self, const gchar * value)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jstring focus_mode;
focus_mode = _focus_mode_to_jstring (value);
if (!focus_mode)
return FALSE;
- AHCP_CALL (return FALSE, Void, setFocusMode, focus_mode);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera_parameters.setFocusMode, focus_mode);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.setFocusMode: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
@@ -3773,8 +4195,17 @@
gst_ahc_parameters_set_preview_format (GstAHCParameters * self, gint format)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
- AHCP_CALL (return FALSE, Void, setPreviewFormat, format);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera_parameters.setPreviewFormat, format);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.setPreviewFormat: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
@@ -3784,8 +4215,17 @@
gint min, gint max)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
- AHCP_CALL (return FALSE, Void, setPreviewFpsRange, min, max);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera_parameters.setPreviewFpsRange, min, max);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.setPreviewFpsRange: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
@@ -3795,8 +4235,17 @@
gint width, gint height)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
- AHCP_CALL (return FALSE, Void, setPreviewSize, width, height);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera_parameters.setPreviewSize, width, height);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.setPreviewSize: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
@@ -3805,13 +4254,22 @@
gst_ahc_parameters_set_scene_mode (GstAHCParameters * self, const gchar * value)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jstring scene_mode;
scene_mode = _scene_mode_to_jstring (value);
if (!scene_mode)
return FALSE;
- AHCP_CALL (return FALSE, Void, setSceneMode, scene_mode);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera_parameters.setSceneMode, scene_mode);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.setSceneMode: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
@@ -3822,8 +4280,17 @@
gboolean toggle)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
- AHCP_CALL (return FALSE, Void, setVideoStabilization, toggle);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera_parameters.setVideoStabilization, toggle);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.setVideoStabilization: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
@@ -3833,13 +4300,22 @@
const gchar * value)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jstring white_balance;
white_balance = _white_balance_to_jstring (value);
if (!white_balance)
return FALSE;
- AHCP_CALL (return FALSE, Void, setWhiteBalance, white_balance);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera_parameters.setWhiteBalance, white_balance);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.setWhiteBalance: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
@@ -3848,8 +4324,16 @@
gst_ahc_parameters_set_zoom (GstAHCParameters * self, gint value)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
- AHCP_CALL (return FALSE, Void, setZoom, value);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera_parameters.setZoom, value);
+ if (err) {
+ GST_ERROR ("Failed to call android.hardware.Camera.Parameters.setZoom: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
return TRUE;
}
@@ -3858,6 +4342,7 @@
gst_ahc_parameters_unflatten (GstAHCParameters * self, const gchar * flattened)
{
JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
jstring v_str = NULL;
gboolean ret = TRUE;
@@ -3865,9 +4350,17 @@
if (v_str == NULL)
return FALSE;
- AHCP_CALL (ret = FALSE, Void, unflatten, v_str);
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_camera_parameters.unflatten, v_str);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.Camera.Parameters.unflatten: %s",
+ err->message);
+ g_clear_error (&err);
+ ret = FALSE;
+ }
- (*env)->DeleteLocalRef (env, v_str);
+ gst_amc_jni_object_local_unref (env, self->object);
return ret;
}
@@ -3882,6 +4375,6 @@
GST_DEBUG ("freeing parameters %p", self->object);
- (*env)->DeleteGlobalRef (env, self->object);
+ gst_amc_jni_object_unref (env, self->object);
g_slice_free (GstAHCParameters, self);
}
diff --git a/sys/androidmedia/gst-android-hardware-camera.h b/sys/androidmedia/gst-android-hardware-camera.h
index 44e7842..ab2e25a 100644
--- a/sys/androidmedia/gst-android-hardware-camera.h
+++ b/sys/androidmedia/gst-android-hardware-camera.h
@@ -28,8 +28,8 @@
#include <gst/gst.h>
#include <jni.h>
-#include "gst-android-graphics-surfacetexture.h"
#include "gst-android-graphics-imageformat.h"
+#include "gstamcsurfacetexture.h"
G_BEGIN_DECLS
@@ -150,7 +150,7 @@
gboolean gst_ah_camera_set_preview_callback_with_buffer (GstAHCamera * self,
GstAHCPreviewCallback cb, gpointer user_data);
void gst_ah_camera_set_preview_texture (GstAHCamera * self,
- GstAGSurfaceTexture * surfaceTexture);
+ GstAmcSurfaceTexture * surfaceTexture);
gboolean gst_ah_camera_start_preview (GstAHCamera * self);
gboolean gst_ah_camera_start_smooth_zoom (GstAHCamera * self, gint value);
gboolean gst_ah_camera_stop_preview (GstAHCamera * self);
diff --git a/sys/androidmedia/gst-android-hardware-sensor.c b/sys/androidmedia/gst-android-hardware-sensor.c
new file mode 100644
index 0000000..862e9fb
--- /dev/null
+++ b/sys/androidmedia/gst-android-hardware-sensor.c
@@ -0,0 +1,834 @@
+/*
+ * Copyright (C) 2016 SurroundIO
+ * Author: Martin Kelly <martin@surround.io>
+ *
+ * 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.
+ *
+ * The UNION_CAST macro is copyright:
+ * Copyright (C) 2008-2016 Matt Gallagher ( http://cocoawithlove.com ).
+ * All rights reserved.
+ * Permission to use, copy, modify, and/or distribute this software for any purpose
+ * with or without fee is hereby granted, provided that the above copyright notice
+ * and this permission notice appear in all copies.
+
+ * THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <glib.h>
+#include <gmodule.h>
+
+#include "gstjniutils.h"
+#include "gst-android-hardware-sensor.h"
+
+static jobject (*gst_android_get_application_context) (void) = NULL;
+
+GST_DEBUG_CATEGORY_STATIC (ahs_debug);
+#define GST_CAT_DEFAULT ahs_debug
+
+/*
+ * See:
+ * http://www.cocoawithlove.com/2008/04/using-pointers-to-recast-in-c-is-bad.html
+ * for details.
+ */
+#define UNION_CAST(x, destType) \
+ (((union {__typeof__(x) a; destType b;})x).b)
+
+static struct
+{
+ jclass klass;
+ jstring SENSOR_SERVICE;
+ jmethodID getSystemService;
+} android_content_context = {
+0};
+
+static struct
+{
+ jclass klass;
+ jfieldID accuracy;
+ jfieldID values;
+} android_hardware_sensor_event = {
+0};
+
+static struct
+{
+ jclass klass;
+ jmethodID getDefaultSensor;;
+ jmethodID registerListener;
+ jmethodID unregisterListener;
+} android_hardware_sensor_manager = {
+0};
+
+static struct
+{
+ jclass klass;
+ jmethodID constructor;
+} org_freedesktop_gstreamer_androidmedia_gstahscallback = {
+0};
+
+GHashTable *sensor_sizes = NULL;
+static void
+gst_ah_sensor_sensor_sizes_init (void)
+{
+ gint i;
+ static struct
+ {
+ gint type;
+ gsize size;
+ } types[] = {
+ {
+ AHS_SENSOR_TYPE_ACCELEROMETER, sizeof (GstAHSAccelerometerValues)}
+ , {
+ AHS_SENSOR_TYPE_AMBIENT_TEMPERATURE,
+ sizeof (GstAHSAmbientTemperatureValues)}
+ , {
+ AHS_SENSOR_TYPE_GAME_ROTATION_VECTOR,
+ sizeof (GstAHSGameRotationVectorValues)}
+ , {
+ AHS_SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR,
+ sizeof (GstAHSGeomagneticRotationVectorValues)}
+ , {
+ AHS_SENSOR_TYPE_GRAVITY, sizeof (GstAHSGravityValues)}
+ , {
+ AHS_SENSOR_TYPE_GYROSCOPE, sizeof (GstAHSGyroscopeValues)}
+ , {
+ AHS_SENSOR_TYPE_GYROSCOPE_UNCALIBRATED,
+ sizeof (GstAHSGyroscopeUncalibratedValues)}
+ , {
+ AHS_SENSOR_TYPE_HEART_RATE, sizeof (GstAHSHeartRateValues)}
+ , {
+ AHS_SENSOR_TYPE_LIGHT, sizeof (GstAHSLightValues)}
+ , {
+ AHS_SENSOR_TYPE_LINEAR_ACCELERATION,
+ sizeof (GstAHSLinearAccelerationValues)}
+ , {
+ AHS_SENSOR_TYPE_MAGNETIC_FIELD, sizeof (GstAHSMagneticFieldValues)}
+ , {
+ AHS_SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED,
+ sizeof (GstAHSMagneticFieldUncalibratedValues)}
+ , {
+ AHS_SENSOR_TYPE_ORIENTATION, sizeof (GstAHSOrientationValues)}
+ , {
+ AHS_SENSOR_TYPE_PRESSURE, sizeof (GstAHSPressureValues)}
+ , {
+ AHS_SENSOR_TYPE_PROXIMITY, sizeof (GstAHSProximityValues)}
+ , {
+ AHS_SENSOR_TYPE_RELATIVE_HUMIDITY, sizeof (GstAHSRelativeHumidityValues)}
+ , {
+ AHS_SENSOR_TYPE_ROTATION_VECTOR, sizeof (GstAHSRotationVectorValues)}
+ , {
+ AHS_SENSOR_TYPE_STEP_COUNTER, sizeof (GstAHSStepCounterValues)}
+ , {
+ AHS_SENSOR_TYPE_STEP_DETECTOR, sizeof (GstAHSStepDetectorValues)}
+ ,};
+
+ g_assert_null (sensor_sizes);
+
+ sensor_sizes = g_hash_table_new (g_int_hash, g_int_equal);
+ for (i = 0; i < G_N_ELEMENTS (types); i++)
+ g_hash_table_insert (sensor_sizes, &types[i].type, &types[i].size);
+}
+
+static void
+gst_ah_sensor_sensor_sizes_deinit (void)
+{
+ g_assert_nonnull (sensor_sizes);
+
+ g_hash_table_unref (sensor_sizes);
+ sensor_sizes = NULL;
+}
+
+gsize
+gst_ah_sensor_get_sensor_data_size (gint sensor_type)
+{
+ return *((gsize *) g_hash_table_lookup (sensor_sizes, &sensor_type));
+}
+
+static void
+gst_ah_sensor_on_sensor_changed (JNIEnv * env, jclass klass,
+ jobject sensor_event, jlong callback, jlong user_data)
+{
+ GstAHSensorCallback cb = (GstAHSensorCallback) (gsize) callback;
+
+ if (cb)
+ cb (sensor_event, (gpointer) (gsize) user_data);
+}
+
+static void
+gst_ah_sensor_on_accuracy_changed (JNIEnv * env, jclass klass,
+ jobject sensor, jint accuracy, jlong callback, jlong user_data)
+{
+ GstAHSAccuracyCallback cb = (GstAHSAccuracyCallback) (gsize) callback;
+
+ if (cb)
+ cb (sensor, accuracy, (gpointer) (gsize) user_data);
+}
+
+static gboolean natives_registered = FALSE;
+
+static JNINativeMethod native_methods[] = {
+ {(gchar *) "gst_ah_sensor_on_sensor_changed",
+ (gchar *) "(Landroid/hardware/SensorEvent;JJ)V",
+ (void *) gst_ah_sensor_on_sensor_changed},
+ {(gchar *) "gst_ah_sensor_on_accuracy_changed",
+ (gchar *) "(Landroid/hardware/Sensor;IJJ)V",
+ (void *) gst_ah_sensor_on_accuracy_changed}
+};
+
+static gboolean
+_init_classes (void)
+{
+ gint32 delay;
+ JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
+ jclass klass;
+ jfieldID fieldID;
+ GModule *module;
+ gboolean success;
+ gint32 type;
+
+ /*
+ * Lookup the Android function to get an Android context. This function will
+ * be provided when the plugin is built via ndk-build.
+ */
+ module = g_module_open (NULL, G_MODULE_BIND_LOCAL);
+ if (!module)
+ goto failed;
+ success = g_module_symbol (module, "gst_android_get_application_context",
+ (gpointer *) & gst_android_get_application_context);
+ if (!success || !gst_android_get_application_context)
+ goto failed;
+ g_module_close (module);
+
+ /* android.content.Context */
+ klass = android_content_context.klass = gst_amc_jni_get_class (env, &err,
+ "android/content/Context");
+ if (!klass)
+ goto failed;
+ android_content_context.getSystemService =
+ gst_amc_jni_get_method_id (env, &err, klass, "getSystemService",
+ "(Ljava/lang/String;)Ljava/lang/Object;");
+ if (!android_content_context.getSystemService)
+ goto failed;
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass, "SENSOR_SERVICE",
+ "Ljava/lang/String;");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
+ &android_content_context.SENSOR_SERVICE))
+ goto failed;
+ android_content_context.SENSOR_SERVICE =
+ gst_amc_jni_object_make_global (env,
+ android_content_context.SENSOR_SERVICE);
+ if (!android_content_context.SENSOR_SERVICE)
+ goto failed;
+
+ /* android.hardware.SensorEvent */
+ klass = android_hardware_sensor_event.klass =
+ gst_amc_jni_get_class (env, &err, "android/hardware/SensorEvent");
+ if (!klass)
+ goto failed;
+ android_hardware_sensor_event.accuracy =
+ gst_amc_jni_get_field_id (env, &err, klass, "accuracy", "I");
+ if (!android_hardware_sensor_event.accuracy)
+ goto failed;
+ android_hardware_sensor_event.values =
+ gst_amc_jni_get_field_id (env, &err, klass, "values", "[F");
+ if (!android_hardware_sensor_event.values)
+ goto failed;
+
+ /* android.hardware.SensorManager */
+ klass = android_hardware_sensor_manager.klass =
+ gst_amc_jni_get_class (env, &err, "android/hardware/SensorManager");
+ if (!klass)
+ goto failed;
+ android_hardware_sensor_manager.getDefaultSensor =
+ gst_amc_jni_get_method_id (env, &err, klass,
+ "getDefaultSensor", "(I)Landroid/hardware/Sensor;");
+ if (!android_hardware_sensor_manager.getDefaultSensor)
+ goto failed;
+ android_hardware_sensor_manager.registerListener =
+ gst_amc_jni_get_method_id (env, &err, klass,
+ "registerListener",
+ "(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;I)Z");
+ if (!android_hardware_sensor_manager.registerListener)
+ goto failed;
+ android_hardware_sensor_manager.unregisterListener =
+ gst_amc_jni_get_method_id (env, &err, klass,
+ "unregisterListener", "(Landroid/hardware/SensorEventListener;)V");
+ if (!android_hardware_sensor_manager.unregisterListener)
+ goto failed;
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass, "SENSOR_DELAY_FASTEST",
+ "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &delay))
+ goto failed;
+ if (delay != AHS_SENSOR_DELAY_FASTEST) {
+ GST_ERROR ("SENSOR_DELAY_FASTEST has changed value");
+ goto failed;
+ }
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass, "SENSOR_DELAY_GAME",
+ "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &delay))
+ goto failed;
+ if (delay != AHS_SENSOR_DELAY_GAME) {
+ GST_ERROR ("SENSOR_DELAY_GAME has changed value");
+ goto failed;
+ }
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass, "SENSOR_DELAY_NORMAL",
+ "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &delay))
+ goto failed;
+ if (delay != AHS_SENSOR_DELAY_NORMAL) {
+ GST_ERROR ("SENSOR_DELAY_NORMAL has changed value");
+ goto failed;
+ }
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass, "SENSOR_DELAY_UI",
+ "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &delay))
+ goto failed;
+ if (delay != AHS_SENSOR_DELAY_UI) {
+ GST_ERROR ("SENSOR_DELAY_UI has changed value");
+ goto failed;
+ }
+
+ /* android.hardware.Sensor */
+ klass = gst_amc_jni_get_class (env, &err, "android/hardware/Sensor");
+ if (!klass)
+ goto failed;
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass, "TYPE_ACCELEROMETER",
+ "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &type))
+ goto failed;
+ if (type != AHS_SENSOR_TYPE_ACCELEROMETER) {
+ GST_ERROR ("TYPE_ACCELEROMETER has changed value");
+ goto failed;
+ }
+
+ fieldID = gst_amc_jni_get_static_field_id (env, &err, klass,
+ "TYPE_AMBIENT_TEMPERATURE", "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &type))
+ goto failed;
+ if (type != AHS_SENSOR_TYPE_AMBIENT_TEMPERATURE) {
+ GST_ERROR ("TYPE_AMBIENT_TEMPERATURE has changed value");
+ goto failed;
+ }
+
+ fieldID = gst_amc_jni_get_static_field_id (env, &err, klass,
+ "TYPE_GAME_ROTATION_VECTOR", "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &type))
+ goto failed;
+ if (type != AHS_SENSOR_TYPE_GAME_ROTATION_VECTOR) {
+ GST_ERROR ("TYPE_GAME_ROTATION_VECTOR has changed value");
+ goto failed;
+ }
+
+ fieldID = gst_amc_jni_get_static_field_id (env, &err, klass,
+ "TYPE_GEOMAGNETIC_ROTATION_VECTOR", "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &type))
+ goto failed;
+ if (type != AHS_SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR) {
+ GST_ERROR ("TYPE_GEOMAGNETIC_ROTATION_VECTOR has changed value");
+ goto failed;
+ }
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass, "TYPE_GRAVITY", "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &type))
+ goto failed;
+ if (type != AHS_SENSOR_TYPE_GRAVITY) {
+ GST_ERROR ("TYPE_GRAVITY has changed value");
+ goto failed;
+ }
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass, "TYPE_GYROSCOPE", "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &type))
+ goto failed;
+ if (type != AHS_SENSOR_TYPE_GYROSCOPE) {
+ GST_ERROR ("TYPE_GYROSCOPE has changed value");
+ goto failed;
+ }
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass,
+ "TYPE_GYROSCOPE_UNCALIBRATED", "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &type))
+ goto failed;
+ if (type != AHS_SENSOR_TYPE_GYROSCOPE_UNCALIBRATED) {
+ GST_ERROR ("TYPE_GYROSCOPE_UNCALIBRATED has changed value");
+ goto failed;
+ }
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass, "TYPE_HEART_RATE",
+ "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &type))
+ goto failed;
+ if (type != AHS_SENSOR_TYPE_HEART_RATE) {
+ GST_ERROR ("TYPE_HEART_RATE has changed value");
+ goto failed;
+ }
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass, "TYPE_LIGHT", "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &type))
+ goto failed;
+ if (type != AHS_SENSOR_TYPE_LIGHT) {
+ GST_ERROR ("TYPE_LIGHT has changed value");
+ goto failed;
+ }
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass,
+ "TYPE_LINEAR_ACCELERATION", "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &type))
+ goto failed;
+ if (type != AHS_SENSOR_TYPE_LINEAR_ACCELERATION) {
+ GST_ERROR ("TYPE_LINEAR_ACCELERATION has changed value");
+ goto failed;
+ }
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass, "TYPE_MAGNETIC_FIELD",
+ "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &type))
+ goto failed;
+ if (type != AHS_SENSOR_TYPE_MAGNETIC_FIELD) {
+ GST_ERROR ("TYPE_MAGNETIC_FIELD has changed value");
+ goto failed;
+ }
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass,
+ "TYPE_MAGNETIC_FIELD_UNCALIBRATED", "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &type))
+ goto failed;
+ if (type != AHS_SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED) {
+ GST_ERROR ("TYPE_MAGNETIC_FIELD_UNCALIBRATED has changed value");
+ goto failed;
+ }
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass, "TYPE_ORIENTATION",
+ "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &type))
+ goto failed;
+ if (type != AHS_SENSOR_TYPE_ORIENTATION) {
+ GST_ERROR ("TYPE_ORIENTATION has changed value");
+ goto failed;
+ }
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass, "TYPE_PRESSURE", "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &type))
+ goto failed;
+ if (type != AHS_SENSOR_TYPE_PRESSURE) {
+ GST_ERROR ("TYPE_PRESSURE has changed value");
+ goto failed;
+ }
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass, "TYPE_PROXIMITY", "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &type))
+ goto failed;
+ if (type != AHS_SENSOR_TYPE_PROXIMITY) {
+ GST_ERROR ("TYPE_PROXIMITY has changed value");
+ goto failed;
+ }
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass,
+ "TYPE_RELATIVE_HUMIDITY", "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &type))
+ goto failed;
+ if (type != AHS_SENSOR_TYPE_RELATIVE_HUMIDITY) {
+ GST_ERROR ("TYPE_RELATIVE_HUMIDITY has changed value");
+ goto failed;
+ }
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass, "TYPE_ROTATION_VECTOR",
+ "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &type))
+ goto failed;
+ if (type != AHS_SENSOR_TYPE_ROTATION_VECTOR) {
+ GST_ERROR ("TYPE_ROTATION_VECTOR has changed value");
+ goto failed;
+ }
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass,
+ "TYPE_SIGNIFICANT_MOTION", "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &type))
+ goto failed;
+ if (type != AHS_SENSOR_TYPE_SIGNIFICANT_MOTION) {
+ GST_ERROR ("TYPE_SIGNIFICANT_MOTION has changed value");
+ goto failed;
+ }
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass, "TYPE_STEP_COUNTER",
+ "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &type))
+ goto failed;
+ if (type != AHS_SENSOR_TYPE_STEP_COUNTER) {
+ GST_ERROR ("TYPE_STEP_COUNTER has changed value");
+ goto failed;
+ }
+
+ fieldID =
+ gst_amc_jni_get_static_field_id (env, &err, klass, "TYPE_STEP_DETECTOR",
+ "I");
+ if (!fieldID)
+ goto failed;
+ if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, &type))
+ goto failed;
+ if (type != AHS_SENSOR_TYPE_STEP_DETECTOR) {
+ GST_ERROR ("TYPE_STEP_DETECTOR has changed value");
+ goto failed;
+ }
+
+ /* org.freedesktop.gstreamer.androidmedia.GstAhsCallback */
+ if (!org_freedesktop_gstreamer_androidmedia_gstahscallback.klass) {
+ org_freedesktop_gstreamer_androidmedia_gstahscallback.klass =
+ gst_amc_jni_get_class (env, &err,
+ "org/freedesktop/gstreamer/androidmedia/GstAhsCallback");
+ }
+ if (!org_freedesktop_gstreamer_androidmedia_gstahscallback.klass)
+ goto failed;
+ org_freedesktop_gstreamer_androidmedia_gstahscallback.constructor =
+ gst_amc_jni_get_method_id (env, &err,
+ org_freedesktop_gstreamer_androidmedia_gstahscallback.klass, "<init>",
+ "(JJJ)V");
+ if (!org_freedesktop_gstreamer_androidmedia_gstahscallback.constructor)
+ goto failed;
+
+ if ((*env)->RegisterNatives (env,
+ org_freedesktop_gstreamer_androidmedia_gstahscallback.klass,
+ native_methods, G_N_ELEMENTS (native_methods))) {
+ GST_ERROR ("Failed to register native methods for GstAhsCallback");
+ goto failed;
+ }
+ natives_registered = TRUE;
+
+ return TRUE;
+
+failed:
+ if (err) {
+ GST_ERROR ("Failed to initialize Android classes: %s", err->message);
+ g_clear_error (&err);
+ }
+
+ return FALSE;
+}
+
+gboolean
+gst_android_hardware_sensor_init (void)
+{
+ GST_DEBUG_CATEGORY_INIT (ahs_debug, "ahs", 0,
+ "Android Gstreamer Hardware Sensor");
+ if (!_init_classes ()) {
+ gst_android_hardware_sensor_deinit ();
+ return FALSE;
+ }
+
+ gst_ah_sensor_sensor_sizes_init ();
+
+ return TRUE;
+}
+
+void
+gst_android_hardware_sensor_deinit (void)
+{
+ JNIEnv *env = gst_amc_jni_get_env ();
+
+ if (android_content_context.SENSOR_SERVICE) {
+ gst_amc_jni_object_unref (env, android_content_context.SENSOR_SERVICE);
+ android_content_context.SENSOR_SERVICE = NULL;
+ }
+
+ if (android_content_context.klass) {
+ gst_amc_jni_object_unref (env, android_content_context.klass);
+ android_content_context.klass = NULL;
+ }
+
+ if (android_hardware_sensor_event.klass) {
+ gst_amc_jni_object_unref (env, android_hardware_sensor_event.klass);
+ android_hardware_sensor_event.klass = NULL;
+ }
+
+ if (android_hardware_sensor_manager.klass) {
+ gst_amc_jni_object_unref (env, android_hardware_sensor_manager.klass);
+ android_hardware_sensor_manager.klass = NULL;
+ }
+
+ if (org_freedesktop_gstreamer_androidmedia_gstahscallback.klass) {
+ if (natives_registered) {
+ (*env)->UnregisterNatives (env,
+ org_freedesktop_gstreamer_androidmedia_gstahscallback.klass);
+ natives_registered = FALSE;
+ }
+ gst_amc_jni_object_unref (env,
+ org_freedesktop_gstreamer_androidmedia_gstahscallback.klass);
+ org_freedesktop_gstreamer_androidmedia_gstahscallback.klass = NULL;
+ }
+
+ gst_ah_sensor_sensor_sizes_deinit ();
+}
+
+GstAHSensorManager *
+gst_ah_sensor_get_manager (void)
+{
+ jobject context;
+ GError *err = NULL;
+ JNIEnv *env = gst_amc_jni_get_env ();
+ GstAHSensorManager *manager;
+ jobject object;
+ gboolean success;
+
+ context = gst_android_get_application_context ();
+ success = gst_amc_jni_call_object_method (env, &err, context,
+ android_content_context.getSystemService,
+ &object, android_content_context.SENSOR_SERVICE);
+ if (!success)
+ return NULL;
+
+ object = gst_amc_jni_object_make_global (env, object);
+ if (!object)
+ return NULL;
+
+ manager = g_slice_new (GstAHSensorManager);
+ manager->object = object;
+
+ return manager;
+}
+
+GstAHSensor *
+gst_ah_sensor_get_default_sensor (GstAHSensorManager * self, gint32 sensor_type)
+{
+ JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
+ jobject object;
+ GstAHSensor *sensor;
+
+ if (!gst_amc_jni_call_object_method (env, &err, self->object,
+ android_hardware_sensor_manager.getDefaultSensor,
+ &object, sensor_type))
+ return NULL;
+
+ object = gst_amc_jni_object_make_global (env, object);
+ if (!object)
+ return NULL;
+
+ sensor = g_slice_new (GstAHSensor);
+ sensor->object = object;
+
+ return sensor;
+}
+
+GstAHSensorEventListener *
+gst_ah_sensor_create_listener (GstAHSensorCallback sensor_cb,
+ GstAHSAccuracyCallback accuracy_cb, gpointer user_data)
+{
+ JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
+ GstAHSensorEventListener *listener;
+ jobject object;
+
+ object = gst_amc_jni_new_object (env,
+ &err,
+ TRUE,
+ org_freedesktop_gstreamer_androidmedia_gstahscallback.klass,
+ org_freedesktop_gstreamer_androidmedia_gstahscallback.constructor,
+ UNION_CAST (sensor_cb, jlong),
+ UNION_CAST (accuracy_cb, jlong), UNION_CAST (user_data, jlong));
+ if (err) {
+ GST_ERROR ("Failed to create listener callback class");
+ g_clear_error (&err);
+ return NULL;
+ }
+
+ listener = g_slice_new (GstAHSensorEventListener);
+ listener->object = object;
+
+ return listener;
+}
+
+gboolean
+gst_ah_sensor_register_listener (GstAHSensorManager * self,
+ GstAHSensorEventListener * listener, GstAHSensor * sensor, gint32 delay)
+{
+ JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
+ gboolean success;
+
+ gst_amc_jni_call_boolean_method (env, &err, self->object,
+ android_hardware_sensor_manager.registerListener, &success,
+ listener->object, sensor->object, (jint) delay);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.SensorManager.registerListener: %s",
+ err->message);
+ g_clear_error (&err);
+ return FALSE;
+ }
+ listener->registered = TRUE;
+
+ return TRUE;
+}
+
+void
+gst_ah_sensor_unregister_listener (GstAHSensorManager * self,
+ GstAHSensorEventListener * listener)
+{
+ JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
+
+ gst_amc_jni_call_void_method (env, &err, self->object,
+ android_hardware_sensor_manager.unregisterListener, listener->object);
+ if (err) {
+ GST_ERROR
+ ("Failed to call android.hardware.SensorManager.unregisterListener: %s",
+ err->message);
+ g_clear_error (&err);
+ }
+ listener->registered = FALSE;
+}
+
+gboolean
+gst_ah_sensor_populate_event (GstAHSensorEvent * event, jobject event_object,
+ gint size)
+{
+ JNIEnv *env = gst_amc_jni_get_env ();
+ GError *err = NULL;
+ jfloatArray object_array;
+ jfloat *values;
+
+ gst_amc_jni_get_int_field (env, &err,
+ event_object, android_hardware_sensor_event.accuracy, &event->accuracy);
+ if (err) {
+ GST_ERROR ("Failed to get sensor accuracy field: %s", err->message);
+ goto error;
+ }
+
+ gst_amc_jni_get_object_field (env, &err, event_object,
+ android_hardware_sensor_event.values, &object_array);
+ if (err) {
+ GST_ERROR ("Failed to get sensor values field: %s", err->message);
+ goto error;
+ }
+
+ values = (*env)->GetFloatArrayElements (env, object_array, NULL);
+ if (!values) {
+ GST_ERROR ("Failed to get float array elements from object array");
+ gst_amc_jni_object_local_unref (env, object_array);
+ return FALSE;
+ }
+ /* We can't use gst_amc_jni_object_make_global here because we need to call
+ * ReleaseFloatArrayElements before doing a local unref in the failure case,
+ * but gst_amc_jni_object_make_global would unref before we could Release.
+ */
+ event->data.array = gst_amc_jni_object_ref (env, object_array);
+ if (!event->data.array) {
+ (*env)->ReleaseFloatArrayElements (env, object_array, values, JNI_ABORT);
+ gst_amc_jni_object_local_unref (env, object_array);
+ return FALSE;
+ }
+ event->data.values = values;
+ gst_amc_jni_object_local_unref (env, object_array);
+
+ return TRUE;
+
+error:
+ g_clear_error (&err);
+ return FALSE;
+}
+
+void
+gst_ah_sensor_free_sensor_data (GstAHSensorData * data)
+{
+ JNIEnv *env = gst_amc_jni_get_env ();
+
+ (*env)->ReleaseFloatArrayElements (env, data->array, data->values, JNI_ABORT);
+ gst_amc_jni_object_unref (env, data->array);
+}
diff --git a/sys/androidmedia/gst-android-hardware-sensor.h b/sys/androidmedia/gst-android-hardware-sensor.h
new file mode 100644
index 0000000..2dc79dc
--- /dev/null
+++ b/sys/androidmedia/gst-android-hardware-sensor.h
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2016 SurroundIO
+ * Author: Martin Kelly <martin@surround.io>
+ *
+ * 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_ANDROID_HARDWARE_SENSOR_H__
+#define __GST_ANDROID_HARDWARE_SENSOR_H__
+
+#include <gst/gst.h>
+#include <jni.h>
+
+#include "gstsensors.h"
+
+G_BEGIN_DECLS
+
+typedef struct GstAHSensor
+{
+ /* < private > */
+ jobject object;
+} GstAHSensor;
+
+typedef struct GstAHSensorData
+{
+ jfloatArray array;
+ gfloat *values;
+} GstAHSensorData;
+
+typedef struct GstAHSensorEvent
+{
+ /*
+ * Note that we don't use the Android event timestamp, as it's not reliable.
+ * See https://code.google.com/p/android/issues/detail?id=7981 for more
+ * details.
+ */
+ gint32 accuracy;
+ GstAHSensorData data;
+} GstAHSensorEvent;
+
+typedef struct GstAHSensorEventListener
+{
+ /* < private > */
+ jobject object;
+
+ gboolean registered;
+} GstAHSensorEventListener;
+
+typedef struct GstAHSensorManager
+{
+ /* < private > */
+ jobject object;
+} GstAHSensorManager;
+
+gint gst_android_sensor_type_from_string (const gchar * type_str);
+
+/* android.hardware.SensorListener onSensorChanged */
+typedef void (*GstAHSensorCallback) (jobject sensor_event, gpointer user_data);
+
+/* android.hardware.SensorListener onAccuracyChanged */
+typedef void (*GstAHSAccuracyCallback) (jobject sensor, gint32 accuracy,
+ gpointer user_data);
+
+gboolean gst_android_hardware_sensor_init (void);
+void gst_android_hardware_sensor_deinit (void);
+
+/*
+ * Example usage (excluding error checking):
+ *
+ * GstAHSensorManager *manager = gst_ah_sensor_get_manager ();
+ * GstAHSensor *sensor =
+ * gst_ah_sensor_get_default_sensor (manager, * sensor_type);
+ * GstAHSensorEventListener *listener =
+ * gst_ah_sensor_create_listener * (change_cb, accuracy_cb, self);
+ * gst_ah_sensor_register_listener (manager, listener, sensor,
+ * SensorDelay_SENSOR_DELAY_NORMAL);
+ */
+GstAHSensorManager *gst_ah_sensor_get_manager (void);
+GstAHSensor *gst_ah_sensor_get_default_sensor (GstAHSensorManager * manager,
+ gint32 sensor_type);
+GstAHSensorEventListener *gst_ah_sensor_create_listener (GstAHSensorCallback
+ sensor_cb, GstAHSAccuracyCallback accuracy_cb, gpointer user_data);
+gboolean gst_ah_sensor_register_listener (GstAHSensorManager * self,
+ GstAHSensorEventListener * listener, GstAHSensor * sensor, gint32 delay);
+void gst_ah_sensor_unregister_listener (GstAHSensorManager * self,
+ GstAHSensorEventListener * listener);
+
+gboolean gst_ah_sensor_populate_event (GstAHSensorEvent * event,
+ jobject event_object, gint size);
+void gst_ah_sensor_free_sensor_data (GstAHSensorData * data);
+
+/*
+ * These constants come from the matching SENSOR_DELAY_* TYPE_* constants found
+ * in the Android documentation:
+ *
+ * SENSOR_DELAY_*:
+ * https://developer.android.com/reference/android/hardware/SensorManager.html
+ *
+ * TYPE_*:
+ * https://developer.android.com/reference/android/hardware/Sensor.html
+ *
+ * They are intended to be passed into the registerListener callback for
+ * listener registration. Note that, although these are hardcoded, we also do
+ * paranoid runtime checks during plugin init to verify that the API values
+ * haven't changed. This is unlikely but seems like a good precaution. When
+ * adding values, please keep the two lists in sync.
+ */
+enum
+{
+ AHS_SENSOR_DELAY_FASTEST = 0,
+ AHS_SENSOR_DELAY_GAME = 1,
+ AHS_SENSOR_DELAY_NORMAL = 3,
+ AHS_SENSOR_DELAY_UI = 2
+};
+
+enum
+{
+ AHS_SENSOR_TYPE_ACCELEROMETER = 0x1,
+ AHS_SENSOR_TYPE_AMBIENT_TEMPERATURE = 0xd,
+ AHS_SENSOR_TYPE_GAME_ROTATION_VECTOR = 0xf,
+ AHS_SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR = 0x14,
+ AHS_SENSOR_TYPE_GRAVITY = 0x9,
+ AHS_SENSOR_TYPE_GYROSCOPE = 0x4,
+ AHS_SENSOR_TYPE_GYROSCOPE_UNCALIBRATED = 0x10,
+ AHS_SENSOR_TYPE_HEART_RATE = 0x15,
+ AHS_SENSOR_TYPE_LIGHT = 0x5,
+ AHS_SENSOR_TYPE_LINEAR_ACCELERATION = 0xa,
+ AHS_SENSOR_TYPE_MAGNETIC_FIELD = 0x2,
+ AHS_SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED = 0xe,
+ AHS_SENSOR_TYPE_ORIENTATION = 0x3,
+ AHS_SENSOR_TYPE_PRESSURE = 0x6,
+ AHS_SENSOR_TYPE_PROXIMITY = 0x8,
+ AHS_SENSOR_TYPE_RELATIVE_HUMIDITY = 0xc,
+ AHS_SENSOR_TYPE_ROTATION_VECTOR = 0xb,
+ AHS_SENSOR_TYPE_SIGNIFICANT_MOTION = 0x11,
+ AHS_SENSOR_TYPE_STEP_COUNTER = 0x13,
+ AHS_SENSOR_TYPE_STEP_DETECTOR = 0x12
+};
+
+gsize gst_ah_sensor_get_sensor_data_size (gint sensor_type);
+
+G_END_DECLS
+#endif /* __GST_ANDROID_HARDWARE_SENSOR_H__ */
diff --git a/sys/androidmedia/gstahcsrc.c b/sys/androidmedia/gstahcsrc.c
index 2c351a0..2fa1d6f 100644
--- a/sys/androidmedia/gstahcsrc.c
+++ b/sys/androidmedia/gstahcsrc.c
@@ -81,7 +81,7 @@
const GValue * value, GParamSpec * pspec);
static void gst_ahc_src_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
-static void gst_ahc_src_dispose (GObject * object);
+static void gst_ahc_src_finalize (GObject * object);
/* GstElement */
static GstStateChangeReturn gst_ahc_src_change_state (GstElement * element,
@@ -272,7 +272,7 @@
gobject_class->set_property = gst_ahc_src_set_property;
gobject_class->get_property = gst_ahc_src_get_property;
- gobject_class->dispose = gst_ahc_src_dispose;
+ gobject_class->finalize = gst_ahc_src_finalize;
element_class->change_state = gst_ahc_src_change_state;
@@ -287,8 +287,8 @@
gstpushsrc_class->create = gst_ahc_src_create;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_ahc_src_pad_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_ahc_src_pad_template);
/**
* GstAHCSrc:device:
@@ -378,7 +378,7 @@
properties[PROP_VERTICAL_VIEW_ANGLE]);
/**
- * GstAHCSrc:video-stabilizatio:
+ * GstAHCSrc:video-stabilization:
*
* Video stabilization reduces the shaking due to the motion of the camera.
*/
@@ -523,10 +523,6 @@
properties[PROP_ANALOG_GAIN] = g_object_class_find_property (gobject_class,
GST_PHOTOGRAPHY_PROP_ANALOG_GAIN);
-
-
- klass->probe_properties = NULL;
-
gst_element_class_set_static_metadata (element_class,
"Android Camera Source",
"Source/Video",
@@ -562,17 +558,14 @@
}
static void
-gst_ahc_src_dispose (GObject * object)
+gst_ahc_src_finalize (GObject * object)
{
GstAHCSrc *self = GST_AHC_SRC (object);
- if (self->queue)
- g_object_unref (self->queue);
- self->queue = NULL;
-
+ g_clear_object (&self->queue);
g_mutex_clear (&self->mutex);
- G_OBJECT_CLASS (parent_class)->dispose (object);
+ G_OBJECT_CLASS (parent_class)->finalize (object);
}
static void
@@ -858,167 +851,6 @@
}
}
-#if 0
-static const GList *
-gst_ahc_src_probe_get_properties (GstPropertyProbe * probe)
-{
- GstAHCSrcClass *ahc_class = GST_AHC_SRC_CLASS (probe);
- GList **list = &ahc_class->probe_properties;
-
- if (!*list) {
- *list = g_list_append (*list, properties[PROP_DEVICE]);
- *list = g_list_append (*list, properties[PROP_EV_COMP]);
- *list = g_list_append (*list, properties[PROP_ZOOM]);
- *list = g_list_append (*list, properties[PROP_WB_MODE]);
- *list = g_list_append (*list, properties[PROP_COLOUR_TONE]);
- *list = g_list_append (*list, properties[PROP_FLASH_MODE]);
- *list = g_list_append (*list, properties[PROP_FOCUS_MODE]);
- *list = g_list_append (*list, properties[PROP_SCENE_MODE]);
- *list = g_list_append (*list, properties[PROP_FLICKER_MODE]);
- }
-
- return *list;
-}
-
-#define PROBE_GET_ENUM_VALUES(name, type, struct_name) \
- if (self->camera) { \
- GstAHCParameters *params; \
- \
- params = gst_ah_camera_get_parameters (self->camera); \
- if (params) { \
- GList *list = gst_ahc_parameters_get_supported_##name (params); \
- \
- if (list) { \
- GValue value = { 0 }; \
- GList *i; \
- \
- array = g_value_array_new (g_list_length (list)); \
- g_value_init (&value, type); \
- for (i = list; i; i = i->next) { \
- struct_name mode; \
- const gchar *name = i->data; \
- \
- if (_##name##_to_enum (name, &mode)) { \
- g_value_set_enum (&value, mode); \
- g_value_array_append (array, &value); \
- } \
- } \
- g_value_unset (&value); \
- } \
- \
- gst_ahc_parameters_supported_##name##_free (list); \
- gst_ahc_parameters_free (params); \
- } \
- }
-
-
-static GValueArray *
-gst_ahc_src_probe_get_values (GstPropertyProbe * probe,
- guint prop_id, const GParamSpec * pspec)
-{
- GstAHCSrc *self = GST_AHC_SRC (probe);
- GValueArray *array = NULL;
-
- /* g_object_class_find_property returns overriden property with
- * param_id == 0, so we can't switch/case the prop_id and
- * we need to check the pspec instead */
- if (pspec == properties[PROP_DEVICE]) {
- GValue value = { 0 };
- gint num_cams = gst_ah_camera_get_number_of_cameras ();
- gint i;
-
- array = g_value_array_new (num_cams);
- g_value_init (&value, G_TYPE_STRING);
- for (i = 0; i < num_cams; i++) {
- g_value_take_string (&value, g_strdup_printf ("%d", i));
- g_value_array_append (array, &value);
- }
- g_value_unset (&value);
- } else if (pspec == properties[PROP_EV_COMP]) {
- if (self->camera) {
- GstAHCParameters *params;
-
- params = gst_ah_camera_get_parameters (self->camera);
- if (params) {
- gint min, max;
- gfloat step;
-
- min = gst_ahc_parameters_get_min_exposure_compensation (params);
- max = gst_ahc_parameters_get_max_exposure_compensation (params);
- step = gst_ahc_parameters_get_exposure_compensation_step (params);
-
- if (step != 0.0 && min != max) {
- GValue value = { 0 };
- gint i;
-
- /* Min and Max are inclusive */
- array = g_value_array_new (max - min + 1);
- g_value_init (&value, G_TYPE_FLOAT);
- for (i = min; i <= max; i++) {
- g_value_set_float (&value, step * i);
- g_value_array_append (array, &value);
- }
- g_value_unset (&value);
- }
-
- gst_ahc_parameters_free (params);
- }
- }
- } else if (pspec == properties[PROP_ZOOM]) {
- if (self->camera) {
- GstAHCParameters *params;
-
- params = gst_ah_camera_get_parameters (self->camera);
- if (params) {
- GList *zoom_ratios = gst_ahc_parameters_get_zoom_ratios (params);
- gint max_zoom = gst_ahc_parameters_get_max_zoom (params);
-
- if (zoom_ratios && g_list_length (zoom_ratios) == (max_zoom + 1)) {
- GValue value = { 0 };
- GList *i;
-
- array = g_value_array_new (max_zoom + 1);
- g_value_init (&value, G_TYPE_FLOAT);
- for (i = zoom_ratios; i; i = i->next) {
- gint zoom_value = GPOINTER_TO_INT (i->data);
- gfloat zoom = (gfloat) zoom_value / 100.0;
-
- g_value_set_float (&value, zoom);
- g_value_array_append (array, &value);
- }
- g_value_unset (&value);
- }
-
- gst_ahc_parameters_zoom_ratios_free (zoom_ratios);
- gst_ahc_parameters_free (params);
- }
- }
- } else if (pspec == properties[PROP_WB_MODE]) {
- PROBE_GET_ENUM_VALUES (white_balance, GST_TYPE_WHITE_BALANCE_MODE,
- GstPhotographyWhiteBalanceMode);
- } else if (pspec == properties[PROP_COLOUR_TONE]) {
- PROBE_GET_ENUM_VALUES (color_effects, GST_TYPE_COLOUR_TONE_MODE,
- GstPhotographyColorToneMode);
- } else if (pspec == properties[PROP_FLASH_MODE]) {
- PROBE_GET_ENUM_VALUES (flash_modes, GST_TYPE_FLASH_MODE,
- GstPhotographyFlashMode);
- } else if (pspec == properties[PROP_FOCUS_MODE]) {
- PROBE_GET_ENUM_VALUES (focus_modes, GST_TYPE_FOCUS_MODE,
- GstPhotographyFocusMode);
- } else if (pspec == properties[PROP_SCENE_MODE]) {
- PROBE_GET_ENUM_VALUES (scene_modes, GST_TYPE_SCENE_MODE,
- GstPhotographySceneMode);
- } else if (pspec == properties[PROP_FLICKER_MODE]) {
- PROBE_GET_ENUM_VALUES (antibanding, GST_TYPE_FLICKER_REDUCTION_MODE,
- GstPhotographyFlickerReductionMode);
- } else {
- G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec);
- }
-
- return array;
-}
-#endif
-
static gboolean
_antibanding_to_enum (const gchar * antibanding,
GstPhotographyFlickerReductionMode * mode)
@@ -2290,7 +2122,7 @@
GST_DEBUG_OBJECT (self, "Received data buffer %p", array);
- malloc_data = g_slice_new0 (FreeFuncBuffer);
+ malloc_data = g_slice_new (FreeFuncBuffer);
malloc_data->self = gst_object_ref (self);
malloc_data->array = (*env)->NewGlobalRef (env, array);
malloc_data->data = (*env)->GetByteArrayElements (env, array, NULL);
@@ -2305,7 +2137,7 @@
GST_DEBUG_OBJECT (self, "creating wrapped buffer (size: %d)",
self->buffer_size);
- item = g_slice_new0 (GstDataQueueItem);
+ item = g_slice_new (GstDataQueueItem);
item->object = GST_MINI_OBJECT (buffer);
item->size = gst_buffer_get_size (buffer);
item->duration = GST_BUFFER_DURATION (buffer);
@@ -2338,6 +2170,8 @@
static gboolean
gst_ahc_src_open (GstAHCSrc * self)
{
+ GError *err = NULL;
+
GST_DEBUG_OBJECT (self, "Opening camera");
self->camera = gst_ah_camera_open (self->device);
@@ -2345,29 +2179,44 @@
if (self->camera) {
GST_DEBUG_OBJECT (self, "Opened camera");
- self->texture = gst_ag_surfacetexture_new (0);
+ self->texture = gst_amc_surface_texture_new (&err);
+ if (self->texture == NULL) {
+ GST_ERROR_OBJECT (self,
+ "Failed to create surface texture object: %s", err->message);
+ g_clear_error (&err);
+ goto failed_surfacetexutre;
+ }
gst_ah_camera_set_preview_texture (self->camera, self->texture);
self->buffer_size = 0;
} else {
gint num_cams = gst_ah_camera_get_number_of_cameras ();
if (num_cams > 0 && self->device < num_cams) {
GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND,
- ("Unable to open device '%d'.", self->device), GST_ERROR_SYSTEM);
+ ("Unable to open device '%d'.", self->device), (NULL));
} else if (num_cams > 0) {
GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND,
- ("Device '%d' does not exist.", self->device), GST_ERROR_SYSTEM);
+ ("Device '%d' does not exist.", self->device), (NULL));
} else {
GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND,
- ("There are no cameras available on this device."), GST_ERROR_SYSTEM);
+ ("There are no cameras available on this device."), (NULL));
}
}
return (self->camera != NULL);
+
+failed_surfacetexutre:
+ gst_ah_camera_release (self->camera);
+ gst_ah_camera_free (self->camera);
+ self->camera = NULL;
+
+ return FALSE;
}
static void
gst_ahc_src_close (GstAHCSrc * self)
{
+ GError *err = NULL;
+
if (self->camera) {
gst_ah_camera_set_error_callback (self->camera, NULL, NULL);
gst_ah_camera_set_preview_callback_with_buffer (self->camera, NULL, NULL);
@@ -2376,11 +2225,13 @@
}
self->camera = NULL;
- if (self->texture) {
- gst_ag_surfacetexture_release (self->texture);
- gst_ag_surfacetexture_free (self->texture);
+ if (self->texture && !gst_amc_surface_texture_release (self->texture, &err)) {
+ GST_ERROR_OBJECT (self,
+ "Failed to release surface texture object: %s", err->message);
+ g_clear_error (&err);
}
- self->texture = NULL;
+
+ g_clear_object (&self->texture);
}
static GstStateChangeReturn
diff --git a/sys/androidmedia/gstahcsrc.h b/sys/androidmedia/gstahcsrc.h
index fc24989..dc80beb 100644
--- a/sys/androidmedia/gstahcsrc.h
+++ b/sys/androidmedia/gstahcsrc.h
@@ -30,6 +30,7 @@
#include <gst/base/gstdataqueue.h>
#include "gst-android-hardware-camera.h"
+#include "gstamcsurfacetexture.h"
G_BEGIN_DECLS
@@ -59,7 +60,7 @@
GstPushSrc parent;
GstAHCamera *camera;
- GstAGSurfaceTexture *texture;
+ GstAmcSurfaceTexture *texture;
GList *data;
GstDataQueue *queue;
gint buffer_size;
@@ -80,7 +81,6 @@
struct _GstAHCSrcClass
{
GstPushSrcClass parent_class;
- GList *probe_properties;
};
GType gst_ahc_src_get_type (void);
diff --git a/sys/androidmedia/gstahssrc.c b/sys/androidmedia/gstahssrc.c
new file mode 100644
index 0000000..88f8282
--- /dev/null
+++ b/sys/androidmedia/gstahssrc.c
@@ -0,0 +1,687 @@
+/* GStreamer android.hardware.Sensor Source
+ * Copyright (C) 2016 SurroundIO
+ * Author: Martin Kelly <martin@surround.io>
+ *
+ * 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-gstahssrc
+ *
+ * The ahssrc element reads data from Android device sensors
+ * (android.hardware.Sensor).
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch -v ahssrc ! fakesink
+ * ]|
+ * Push Android sensor data into a fakesink.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include <gst/gst.h>
+#include <gst/gstclock.h>
+#include <gst/base/gstbasesrc.h>
+#include <gst/base/gstpushsrc.h>
+#include "gstjniutils.h"
+#include "gst-android-hardware-sensor.h"
+#include "gstahssrc.h"
+#include "gstsensors.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_ahs_src_debug);
+#define GST_CAT_DEFAULT gst_ahs_src_debug
+
+#define parent_class gst_ahs_src_parent_class
+
+/* GObject */
+static void gst_ahs_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_ahs_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void gst_ahs_src_dispose (GObject * object);
+
+/* GstBaseSrc */
+static gboolean gst_ahs_src_set_caps (GstBaseSrc * src, GstCaps * caps);
+static gboolean gst_ahs_src_start (GstBaseSrc * src);
+static gboolean gst_ahs_src_stop (GstBaseSrc * src);
+static gboolean gst_ahs_src_get_size (GstBaseSrc * src, guint64 * size);
+static gboolean gst_ahs_src_is_seekable (GstBaseSrc * src);
+static gboolean gst_ahs_src_unlock (GstBaseSrc * src);
+static gboolean gst_ahs_src_unlock_stop (GstBaseSrc * src);
+
+/* GstPushSrc */
+static GstFlowReturn gst_ahs_src_create (GstPushSrc * src, GstBuffer ** buf);
+
+/* GstAHSSrc */
+static void gst_ahs_src_on_sensor_changed (jobject sensor_event,
+ gpointer user_data);
+static void gst_ahs_src_on_accuracy_changed (jobject sensor, gint accuracy,
+ gpointer user_data);
+static gboolean gst_ahs_src_register_callback (GstAHSSrc * self);
+
+enum
+{
+ PROP_0,
+ PROP_SENSOR_DELAY,
+ PROP_ALPHA,
+ PROP_SAMPLE_INTERVAL,
+ PROP_LAST
+};
+
+static GParamSpec *properties[PROP_LAST];
+
+#define GST_AHS_SRC_CAPS_STR GST_SENSOR_CAPS_MAKE (GST_SENSOR_FORMATS_ALL)
+
+static GstStaticPadTemplate gst_ahs_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_AHS_SRC_CAPS_STR));
+
+
+G_DEFINE_TYPE_WITH_CODE (GstAHSSrc, gst_ahs_src, GST_TYPE_PUSH_SRC,
+ GST_DEBUG_CATEGORY_INIT (gst_ahs_src_debug, "ahssrc", 0,
+ "Android hardware sensors"));
+
+#define GST_TYPE_AHS_SENSOR_DELAY (gst_ahs_src_get_sensor_delay ())
+static GType
+gst_ahs_src_get_sensor_delay (void)
+{
+ static GType ahs_src_sensor_delay = 0;
+
+ if (!ahs_src_sensor_delay) {
+ static GEnumValue sensor_delay[5];
+ sensor_delay[0].value = AHS_SENSOR_DELAY_FASTEST;
+ sensor_delay[0].value_name = "fastest";
+ sensor_delay[0].value_nick = "fastest";
+ sensor_delay[1].value = AHS_SENSOR_DELAY_GAME;
+ sensor_delay[1].value_name = "game";
+ sensor_delay[1].value_nick = "game";
+ sensor_delay[2].value = AHS_SENSOR_DELAY_NORMAL;
+ sensor_delay[2].value_name = "normal";
+ sensor_delay[2].value_nick = "normal";
+ sensor_delay[3].value = AHS_SENSOR_DELAY_UI;
+ sensor_delay[3].value_name = "ui";
+ sensor_delay[3].value_nick = "ui";
+ sensor_delay[4].value = 0;
+ sensor_delay[4].value_name = NULL;
+ sensor_delay[4].value_nick = NULL;
+
+ ahs_src_sensor_delay =
+ g_enum_register_static ("GstAhsSrcSensorDelay", sensor_delay);
+ }
+
+ return ahs_src_sensor_delay;
+}
+
+#define GST_TYPE_AHS_SENSOR_TYPE (gst_ahs_src_get_sensor_type ())
+static GType
+gst_ahs_src_get_sensor_type (void)
+{
+ static GType ahs_src_sensor_type = 0;
+
+ if (!ahs_src_sensor_type) {
+ static const GEnumValue sensor_types[] = {
+ {AHS_SENSOR_TYPE_ACCELEROMETER, "accelerometer"},
+ {AHS_SENSOR_TYPE_AMBIENT_TEMPERATURE, "ambient-temperature"},
+ {AHS_SENSOR_TYPE_GAME_ROTATION_VECTOR, "game-rotation-vector"},
+ {AHS_SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR,
+ "geomagnetic-rotation-vector"},
+ {AHS_SENSOR_TYPE_GRAVITY, "gravity"},
+ {AHS_SENSOR_TYPE_GYROSCOPE, "gyroscope"},
+ {AHS_SENSOR_TYPE_GYROSCOPE_UNCALIBRATED, "gyroscope-uncalibrated"},
+ {AHS_SENSOR_TYPE_HEART_RATE, "heart-rate"},
+ {AHS_SENSOR_TYPE_LIGHT, "light"},
+ {AHS_SENSOR_TYPE_LINEAR_ACCELERATION, "linear-acceleration"},
+ {AHS_SENSOR_TYPE_MAGNETIC_FIELD, "magnetic-field"},
+ {AHS_SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED,
+ "magnetic-field-uncalibrated"},
+ {AHS_SENSOR_TYPE_ORIENTATION, "orientation"},
+ {AHS_SENSOR_TYPE_PRESSURE, "pressure"},
+ {AHS_SENSOR_TYPE_PROXIMITY, "proximity"},
+ {AHS_SENSOR_TYPE_RELATIVE_HUMIDITY, "relative-humidity"},
+ {AHS_SENSOR_TYPE_ROTATION_VECTOR, "rotation-vector"},
+ {AHS_SENSOR_TYPE_STEP_COUNTER, "step-counter"},
+ {AHS_SENSOR_TYPE_STEP_DETECTOR, "step-detector"},
+ {0, NULL, NULL}
+ };
+
+ ahs_src_sensor_type =
+ g_enum_register_static ("GstAhsSrcSensorType", sensor_types);
+ }
+
+ return ahs_src_sensor_type;
+}
+
+static void
+gst_ahs_src_class_init (GstAHSSrcClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstBaseSrcClass *base_src_class = GST_BASE_SRC_CLASS (klass);
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ GstPushSrcClass *push_src_class = GST_PUSH_SRC_CLASS (klass);
+
+ gobject_class->set_property = gst_ahs_src_set_property;
+ gobject_class->get_property = gst_ahs_src_get_property;
+ gobject_class->dispose = gst_ahs_src_dispose;
+
+ base_src_class->set_caps = GST_DEBUG_FUNCPTR (gst_ahs_src_set_caps);
+ base_src_class->start = GST_DEBUG_FUNCPTR (gst_ahs_src_start);
+ base_src_class->stop = GST_DEBUG_FUNCPTR (gst_ahs_src_stop);
+ base_src_class->get_size = GST_DEBUG_FUNCPTR (gst_ahs_src_get_size);
+ base_src_class->is_seekable = GST_DEBUG_FUNCPTR (gst_ahs_src_is_seekable);
+ base_src_class->unlock = GST_DEBUG_FUNCPTR (gst_ahs_src_unlock);
+ base_src_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_ahs_src_unlock_stop);
+
+ push_src_class->create = GST_DEBUG_FUNCPTR (gst_ahs_src_create);
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_ahs_src_template));
+
+ properties[PROP_SENSOR_DELAY] = g_param_spec_enum ("sensor-delay",
+ "Sensor delay", "Configure the sensor rate", GST_TYPE_AHS_SENSOR_DELAY,
+ AHS_SENSOR_DELAY_NORMAL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (gobject_class, PROP_SENSOR_DELAY,
+ properties[PROP_SENSOR_DELAY]);
+
+ properties[PROP_ALPHA] = g_param_spec_double ("alpha", "Alpha",
+ "Alpha value used for exponential smoothing (between 0.0 and 1.0)", 0.0,
+ 1.0, 0.2, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (gobject_class, PROP_ALPHA,
+ properties[PROP_ALPHA]);
+
+ properties[PROP_SAMPLE_INTERVAL] = g_param_spec_uint ("sample-interval",
+ "Sample interval",
+ "Sample interval (for interval n, will output a smoothed average every "
+ "nth sample)", 1, G_MAXUINT, 1,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (gobject_class, PROP_SAMPLE_INTERVAL,
+ properties[PROP_SAMPLE_INTERVAL]);
+
+ gst_element_class_set_static_metadata (element_class,
+ "Android hardware sensors", "Source/Sensor/Device",
+ "Source for Android hardware sensor data",
+ "Martin Kelly <martin@surround.io>");
+}
+
+static gboolean
+_data_queue_check_full (GstDataQueue * queue, guint visible,
+ guint bytes, guint64 time, gpointer checkdata)
+{
+ return FALSE;
+}
+
+static void
+gst_ahs_src_init (GstAHSSrc * self)
+{
+ gst_base_src_set_live (GST_BASE_SRC (self), TRUE);
+ gst_base_src_set_format (GST_BASE_SRC (self), GST_FORMAT_TIME);
+ gst_base_src_set_do_timestamp (GST_BASE_SRC (self), FALSE);
+
+ self->sensor_enum_class = g_type_class_ref (GST_TYPE_AHS_SENSOR_TYPE);
+ self->sensor_type_name = NULL;
+
+ self->manager = NULL;
+ self->sensor = NULL;
+ self->listener = NULL;
+ self->callback_registered = FALSE;
+
+ self->queue = gst_data_queue_new (_data_queue_check_full, NULL, NULL, NULL);
+
+ self->previous_time = GST_CLOCK_TIME_NONE;
+ self->sample_index = 0;
+ self->current_sample = NULL;
+}
+
+static void
+gst_ahs_src_dispose (GObject * object)
+{
+ JNIEnv *env = gst_amc_jni_get_env ();
+ GstAHSSrc *self = GST_AHS_SRC (object);
+
+ if (self->manager) {
+ gst_amc_jni_object_unref (env, self->manager->object);
+ g_slice_free (GstAHSensorManager, self->manager);
+ self->manager = NULL;
+ }
+
+ if (self->sensor) {
+ gst_amc_jni_object_unref (env, self->sensor->object);
+ g_slice_free (GstAHSensor, self->sensor);
+ self->sensor = NULL;
+ }
+
+ if (self->listener) {
+ gst_amc_jni_object_unref (env, self->listener->object);
+ g_slice_free (GstAHSensorEventListener, self->listener);
+ self->listener = NULL;
+ }
+
+ if (self->current_sample) {
+ g_free (self->current_sample);
+ self->current_sample = NULL;
+ }
+
+ if (self->sensor_enum_class) {
+ g_type_class_unref (self->sensor_enum_class);
+ self->sensor_enum_class = NULL;
+ }
+
+ if (self->sensor_type_name) {
+ g_free ((gpointer) self->sensor_type_name);
+ self->sensor_type_name = NULL;
+ }
+
+ if (self->queue) {
+ g_object_unref (self->queue);
+ self->queue = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+gst_ahs_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstAHSSrc *self = GST_AHS_SRC (object);
+
+ /*
+ * Take the mutex to protect against callbacks or changes to the properties
+ * that the callback uses (e.g. caps changes).
+ */
+ GST_OBJECT_LOCK (self);
+
+ switch (prop_id) {
+ case PROP_SENSOR_DELAY:
+ self->sensor_delay = g_value_get_enum (value);
+ /*
+ * If we already have a callback running, reregister with the new delay.
+ * Otherwise, wait for the pipeline to start before we register.
+ */
+ if (self->callback_registered)
+ gst_ahs_src_register_callback (self);
+ break;
+ case PROP_ALPHA:
+ self->alpha = g_value_get_double (value);
+ break;
+ case PROP_SAMPLE_INTERVAL:
+ self->sample_interval = g_value_get_uint (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+
+ GST_OBJECT_UNLOCK (self);
+}
+
+static void
+gst_ahs_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstAHSSrc *self = GST_AHS_SRC (object);
+
+ switch (prop_id) {
+ case PROP_SENSOR_DELAY:
+ g_value_set_enum (value, self->sensor_delay);
+ case PROP_ALPHA:
+ g_value_set_double (value, self->alpha);
+ break;
+ case PROP_SAMPLE_INTERVAL:
+ g_value_set_uint (value, self->sample_interval);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static gboolean
+gst_ahs_src_register_callback (GstAHSSrc * self)
+{
+ if (self->callback_registered) {
+ gst_ah_sensor_unregister_listener (self->manager, self->listener);
+ self->callback_registered = FALSE;
+ }
+ if (!gst_ah_sensor_register_listener (self->manager, self->listener,
+ self->sensor, self->sensor_delay)) {
+ return FALSE;
+ }
+ self->callback_registered = TRUE;
+
+ return TRUE;
+}
+
+static gboolean
+gst_ahs_src_change_sensor_type (GstAHSSrc * self, const gchar * type_str,
+ gint type)
+{
+ JNIEnv *env = gst_amc_jni_get_env ();
+
+ /* Replace sensor type. */
+ if (self->sensor_type_name)
+ g_free ((gpointer) self->sensor_type_name);
+ self->sensor_type_name = type_str;
+ self->sensor_type = type;
+
+ /* Adjust buffer and buffer size. */
+ self->buffer_size = gst_ah_sensor_get_sensor_data_size (self->sensor_type);
+ g_assert (self->buffer_size != 0);
+ self->sample_length = self->buffer_size / sizeof (*self->current_sample);
+ self->current_sample = g_realloc (self->current_sample, self->buffer_size);
+
+ /* Make sure we have a manager. */
+ if (!self->manager) {
+ self->manager = gst_ah_sensor_get_manager ();
+ if (!self->manager) {
+ GST_ERROR_OBJECT (self, "Failed to get sensor manager");
+ goto error_sensor_type_name;
+ }
+ }
+
+ /* Replace sensor object. */
+ if (self->sensor) {
+ gst_amc_jni_object_unref (env, self->sensor->object);
+ g_slice_free (GstAHSensor, self->sensor);
+ }
+ self->sensor = gst_ah_sensor_get_default_sensor (self->manager,
+ self->sensor_type);
+ if (!self->sensor) {
+ GST_ERROR_OBJECT (self, "Failed to get sensor type %s",
+ self->sensor_type_name);
+ goto error_manager;
+ }
+
+ /* Register for the callback, unregistering first if necessary. */
+ if (!gst_ahs_src_register_callback (self))
+ goto error_sensor;
+
+ return TRUE;
+
+error_sensor:
+ gst_amc_jni_object_unref (env, self->sensor->object);
+ g_slice_free (GstAHSensor, self->sensor);
+ self->sensor = NULL;
+error_manager:
+ gst_amc_jni_object_unref (env, self->manager->object);
+ g_slice_free (GstAHSensorManager, self->manager);
+ self->manager = NULL;
+error_sensor_type_name:
+ g_free ((gpointer) self->sensor_type_name);
+ self->sensor_type_name = NULL;
+ return FALSE;
+}
+
+static gboolean
+gst_ahs_src_set_caps (GstBaseSrc * src, GstCaps * caps)
+{
+ const GstStructure *caps_struct;
+ GstAHSSrc *self = GST_AHS_SRC (src);
+ gboolean success;
+ gint type;
+ const gchar *type_str;
+ GEnumValue *value;
+
+ caps_struct = gst_caps_get_structure (caps, 0);
+ type_str = gst_structure_get_string (caps_struct, "type");
+ value = g_enum_get_value_by_name (self->sensor_enum_class, type_str);
+ if (!value) {
+ GST_ERROR_OBJECT (self, "Failed to lookup sensor type %s", type_str);
+ return FALSE;
+ }
+ type_str = g_strdup (type_str);
+ type = value->value;
+
+ /*
+ * Take the mutex while changing the sensor type in case there are concurrent
+ * callbacks being processed.
+ */
+ GST_OBJECT_LOCK (self);
+ success = gst_ahs_src_change_sensor_type (self, type_str, type);
+ GST_OBJECT_UNLOCK (self);
+
+ if (!success)
+ return FALSE;
+
+ return TRUE;
+}
+
+static gboolean
+gst_ahs_src_start (GstBaseSrc * src)
+{
+ JNIEnv *env = gst_amc_jni_get_env ();
+ GstAHSSrc *self = GST_AHS_SRC (src);
+
+ g_assert_null (self->manager);
+ g_assert_null (self->listener);
+
+ self->manager = gst_ah_sensor_get_manager ();
+ if (!self->manager) {
+ GST_ERROR_OBJECT (self, "Failed to get sensor manager");
+ goto error;
+ }
+
+ self->previous_time = GST_CLOCK_TIME_NONE;
+
+ self->listener = gst_ah_sensor_create_listener (gst_ahs_src_on_sensor_changed,
+ gst_ahs_src_on_accuracy_changed, self);
+ if (!self->listener) {
+ GST_ERROR_OBJECT (self, "Failed to create sensor listener");
+ goto error_manager;
+ }
+
+ return TRUE;
+
+error_manager:
+ gst_amc_jni_object_unref (env, self->manager->object);
+ g_slice_free (GstAHSensorManager, self->manager);
+ self->manager = NULL;
+error:
+ return FALSE;
+}
+
+static gboolean
+gst_ahs_src_stop (GstBaseSrc * src)
+{
+ GstAHSSrc *self = GST_AHS_SRC (src);
+
+ g_assert_nonnull (self->manager);
+ g_assert_nonnull (self->sensor);
+ g_assert_nonnull (self->listener);
+
+ gst_ah_sensor_unregister_listener (self->manager, self->listener);
+ self->previous_time = GST_CLOCK_TIME_NONE;
+
+ return TRUE;
+}
+
+static gboolean
+gst_ahs_src_get_size (GstBaseSrc * src, guint64 * size)
+{
+ GstAHSSrc *self = GST_AHS_SRC (src);
+
+ return self->buffer_size;
+}
+
+static gboolean
+gst_ahs_src_is_seekable (GstBaseSrc * src)
+{
+ return FALSE;
+}
+
+static gboolean
+gst_ahs_src_unlock (GstBaseSrc * src)
+{
+ GstAHSSrc *self = GST_AHS_SRC (src);
+
+ gst_data_queue_set_flushing (self->queue, TRUE);
+
+ return TRUE;
+}
+
+static gboolean
+gst_ahs_src_unlock_stop (GstBaseSrc * src)
+{
+ GstAHSSrc *self = GST_AHS_SRC (src);
+
+ gst_data_queue_set_flushing (self->queue, FALSE);
+
+ return TRUE;
+}
+
+static GstFlowReturn
+gst_ahs_src_create (GstPushSrc * src, GstBuffer ** buffer)
+{
+ GstAHSSrc *self = GST_AHS_SRC (src);
+ GstDataQueueItem *item;
+
+ if (!gst_data_queue_pop (self->queue, &item)) {
+ GST_INFO_OBJECT (self, "data queue is empty");
+ return GST_FLOW_FLUSHING;
+ }
+
+ GST_DEBUG_OBJECT (self, "creating buffer %p->%p", item, item->object);
+
+ *buffer = GST_BUFFER (item->object);
+ g_slice_free (GstDataQueueItem, item);
+
+ return GST_FLOW_OK;
+}
+
+static void
+gst_ahs_src_free_data_queue_item (GstDataQueueItem * item)
+{
+ gst_buffer_unref (GST_BUFFER (item->object));
+ g_slice_free (GstDataQueueItem, item);
+}
+
+static void
+gst_ahs_src_update_smoothing (GstAHSSrc * self, const GstAHSensorEvent * event)
+{
+ gint i;
+
+ /*
+ * Since we're doing exponential smoothing, the first sample needs to be
+ * special-cased to prevent it from being artificially lowered by the alpha
+ * smoothing factor.
+ */
+ if (self->sample_index == 0) {
+ for (i = 0; i < self->sample_length; i++) {
+ self->current_sample[i] = event->data.values[i];
+ }
+ } else {
+ for (i = 0; i < self->sample_length; i++)
+ self->current_sample[i] =
+ (1 - self->alpha) * self->current_sample[i] +
+ self->alpha * event->data.values[i];
+ }
+}
+
+static void
+gst_ahs_src_on_sensor_changed (jobject event_object, gpointer user_data)
+{
+ GstBuffer *buffer;
+ GstClockTime buffer_time;
+ gfloat *data;
+ GstAHSensorEvent event;
+ GstDataQueueItem *item;
+ GstClock *pipeline_clock;
+ GstAHSSrc *self = GST_AHS_SRC (user_data);
+ gboolean success;
+
+ GST_OBJECT_LOCK (self);
+
+ pipeline_clock = GST_ELEMENT_CLOCK (self);
+ /* If the clock is NULL, the pipeline is not yet set to PLAYING. */
+ if (pipeline_clock == NULL)
+ goto done;
+
+ /*
+ * Unfortunately, the timestamp reported in the Android SensorEvent timestamp
+ * is not guaranteed to use any particular clock. On some device models, it
+ * uses system time, and on other models, it uses monotonic time. In addition,
+ * in some cases, the units are microseconds, and in other cases they are
+ * nanoseconds. Thus we cannot slave it to the pipeline clock or use any
+ * similar strategy that would allow us to correlate the two clocks. So
+ * instead, we approximate the buffer timestamp using the pipeline clock.
+ *
+ * See here for more details on issues with the Android SensorEvent timestamp:
+ * https://code.google.com/p/android/issues/detail?id=7981
+ */
+ buffer_time =
+ gst_clock_get_time (pipeline_clock) - GST_ELEMENT_CAST (self)->base_time;
+
+ success =
+ gst_ah_sensor_populate_event (&event, event_object, self->buffer_size);
+ if (!success) {
+ GST_ERROR_OBJECT (self, "Failed to populate sensor event");
+ goto done;
+ }
+
+ gst_ahs_src_update_smoothing (self, &event);
+ gst_ah_sensor_free_sensor_data (&event.data);
+ self->sample_index++;
+ if (self->sample_index < self->sample_interval)
+ goto done;
+ self->sample_index = 0;
+
+ /*
+ * We want to send off this sample; copy it into a separate data struct so we
+ * can continue using current_sample for aggregating future samples.
+ */
+ data = g_malloc (self->buffer_size);
+ memcpy (data, self->current_sample, self->buffer_size);
+
+ /* Wrap the datapoint with a buffer and add it to the queue. */
+ buffer = gst_buffer_new_wrapped (data, self->buffer_size);
+ GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_PTS (buffer) = buffer_time;
+
+ item = g_slice_new (GstDataQueueItem);
+ item->object = GST_MINI_OBJECT (buffer);
+ item->size = gst_buffer_get_size (buffer);
+ item->duration = GST_BUFFER_DURATION (buffer);
+ item->visible = TRUE;
+ item->destroy = (GDestroyNotify) gst_ahs_src_free_data_queue_item;
+
+ success = gst_data_queue_push (self->queue, item);
+ if (!success) {
+ GST_ERROR_OBJECT (self, "Could not add buffer to queue");
+ gst_ahs_src_free_data_queue_item (item);
+ goto done;
+ }
+
+done:
+ GST_OBJECT_UNLOCK (self);
+}
+
+static void
+gst_ahs_src_on_accuracy_changed (jobject sensor, gint accuracy,
+ gpointer user_data)
+{
+ GstAHSSrc *self = GST_AHS_SRC (user_data);
+
+ /* TODO: Perhaps we should do something more with this information. */
+ GST_DEBUG_OBJECT (self, "Accuracy changed on sensor %p and is now %d", sensor,
+ accuracy);
+}
diff --git a/sys/androidmedia/gstahssrc.h b/sys/androidmedia/gstahssrc.h
new file mode 100644
index 0000000..9c00ca7
--- /dev/null
+++ b/sys/androidmedia/gstahssrc.h
@@ -0,0 +1,80 @@
+/* GStreamer android.hardware.Sensor Source
+ * Copyright (C) 2016 SurroundIO
+ * Author: Martin Kelly <martin@surround.io>
+ *
+ * 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_AHSSRC_H__
+#define _GST_AHSSRC_H__
+
+#include <gst/base/gstdataqueue.h>
+#include <gst/base/gstpushsrc.h>
+
+#include "gst-android-hardware-sensor.h"
+
+G_BEGIN_DECLS
+#define GST_TYPE_AHS_SRC (gst_ahs_src_get_type())
+#define GST_AHS_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AHS_SRC,GstAHSSrc))
+#define GST_AHS_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AHS_SRC,GstAHSSrcClass))
+#define GST_IS_AHS_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AHS_SRC))
+#define GST_IS_AHS_SRC_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AHS_SRC))
+typedef struct _GstAHSSrc GstAHSSrc;
+typedef struct _GstAHSSrcClass GstAHSSrcClass;
+
+struct _GstAHSSrc
+{
+ /* < private > */
+ GstPushSrc parent;
+
+ /* properties */
+ gint32 sensor_delay;
+ gdouble alpha;
+ guint sample_interval;
+
+ /* sensor type information */
+ GEnumClass *sensor_enum_class;
+ gint sensor_type;
+ const gchar *sensor_type_name;
+
+ /* JNI wrapper classes */
+ GstAHSensorManager *manager;
+ GstAHSensor *sensor;
+ GstAHSensorEventListener *listener;
+
+ /* timestamping */
+ GstClockTime previous_time;
+ gfloat *current_sample;
+
+ /* buffers */
+ gboolean callback_registered;
+ gint sample_index;
+ gint sample_length;
+ gint buffer_size;
+
+ /* multiprocessing */
+ GstDataQueue *queue;
+};
+
+struct _GstAHSSrcClass
+{
+ GstPushSrcClass parent_class;
+};
+
+GType gst_ahs_src_get_type (void);
+
+G_END_DECLS
+#endif
diff --git a/sys/androidmedia/gstamc.c b/sys/androidmedia/gstamc.c
index 14f5e4c..b6146d0 100644
--- a/sys/androidmedia/gstamc.c
+++ b/sys/androidmedia/gstamc.c
@@ -30,6 +30,7 @@
#endif
#include "gstahcsrc.h"
+#include "gstahssrc.h"
#include "gstamc.h"
#include "gstamc-constants.h"
@@ -3361,11 +3362,6 @@
if (!register_codecs (plugin))
return FALSE;
- if (!gst_android_graphics_surfacetexture_init ()) {
- GST_ERROR ("Failed to init android surface texture");
- return FALSE;
- }
-
if (!gst_android_graphics_imageformat_init ()) {
GST_ERROR ("Failed to init android image format");
goto failed_surfacetexture;
@@ -3375,19 +3371,29 @@
goto failed_graphics_imageformat;
}
+ if (!gst_android_hardware_sensor_init ()) {
+ goto failed_hardware_camera;
+ }
+
if (!gst_element_register (plugin, "ahcsrc", GST_RANK_NONE, GST_TYPE_AHC_SRC)) {
GST_ERROR ("Failed to register android camera source");
- goto failed_hardware_camera;
+ goto failed_hardware_sensor;
+ }
+
+ if (!gst_element_register (plugin, "ahssrc", GST_RANK_NONE, GST_TYPE_AHS_SRC)) {
+ GST_ERROR ("Failed to register android sensor source");
+ goto failed_hardware_sensor;
}
return TRUE;
+failed_hardware_sensor:
+ gst_android_hardware_sensor_deinit ();
failed_hardware_camera:
gst_android_hardware_camera_deinit ();
failed_graphics_imageformat:
gst_android_graphics_imageformat_deinit ();
failed_surfacetexture:
- gst_android_graphics_surfacetexture_deinit ();
return FALSE;
}
diff --git a/sys/androidmedia/gstamcaudiodec.c b/sys/androidmedia/gstamcaudiodec.c
index 9a34c37..49c8c60 100644
--- a/sys/androidmedia/gstamcaudiodec.c
+++ b/sys/androidmedia/gstamcaudiodec.c
@@ -670,9 +670,7 @@
gst_event_new_eos ());
gst_pad_pause_task (GST_AUDIO_DECODER_SRC_PAD (self));
} else if (flow_ret < GST_FLOW_EOS) {
- GST_ELEMENT_ERROR (self, STREAM, FAILED,
- ("Internal data stream error."), ("stream stopped, reason %s",
- gst_flow_get_name (flow_ret)));
+ GST_ELEMENT_FLOW_ERROR (self, flow_ret);
gst_pad_push_event (GST_AUDIO_DECODER_SRC_PAD (self),
gst_event_new_eos ());
gst_pad_pause_task (GST_AUDIO_DECODER_SRC_PAD (self));
diff --git a/sys/androidmedia/gstamcvideodec.c b/sys/androidmedia/gstamcvideodec.c
index 7c99be0..bd772b7 100644
--- a/sys/androidmedia/gstamcvideodec.c
+++ b/sys/androidmedia/gstamcvideodec.c
@@ -1354,7 +1354,8 @@
(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);
+ &state->info, 0, NULL, GST_GL_TEXTURE_TARGET_EXTERNAL_OES,
+ GST_VIDEO_GL_TEXTURE_TYPE_RGBA);
self->oes_mem = (GstGLMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
(GstGLAllocationParams *) params);
@@ -1589,9 +1590,7 @@
gst_event_new_eos ());
gst_pad_pause_task (GST_VIDEO_DECODER_SRC_PAD (self));
} else if (flow_ret < GST_FLOW_EOS) {
- GST_ELEMENT_ERROR (self, STREAM, FAILED,
- ("Internal data stream error."), ("stream stopped, reason %s",
- gst_flow_get_name (flow_ret)));
+ GST_ELEMENT_FLOW_ERROR (self, flow_ret);
gst_pad_push_event (GST_VIDEO_DECODER_SRC_PAD (self),
gst_event_new_eos ());
gst_pad_pause_task (GST_VIDEO_DECODER_SRC_PAD (self));
diff --git a/sys/androidmedia/gstamcvideoenc.c b/sys/androidmedia/gstamcvideoenc.c
index 136df41..1742d44 100644
--- a/sys/androidmedia/gstamcvideoenc.c
+++ b/sys/androidmedia/gstamcvideoenc.c
@@ -1129,9 +1129,7 @@
gst_event_new_eos ());
gst_pad_pause_task (GST_VIDEO_ENCODER_SRC_PAD (self));
} else if (flow_ret == GST_FLOW_NOT_LINKED || flow_ret < GST_FLOW_EOS) {
- GST_ELEMENT_ERROR (self, STREAM, FAILED,
- ("Internal data stream error."), ("stream stopped, reason %s",
- gst_flow_get_name (flow_ret)));
+ GST_ELEMENT_FLOW_ERROR (self, flow_ret);
gst_pad_push_event (GST_VIDEO_ENCODER_SRC_PAD (self),
gst_event_new_eos ());
gst_pad_pause_task (GST_VIDEO_ENCODER_SRC_PAD (self));
diff --git a/sys/applemedia-nonpublic/Makefile.am b/sys/applemedia-nonpublic/Makefile.am
deleted file mode 100644
index e95abda..0000000
--- a/sys/applemedia-nonpublic/Makefile.am
+++ /dev/null
@@ -1,84 +0,0 @@
-plugin_LTLIBRARIES = libgstapplemedia_nonpublic.la
-
-libgstapplemedia_nonpublic_la_SOURCES = \
- plugin.m \
- bufferfactory.m \
- corevideobuffer.c \
- coremediabuffer.c \
- cvapi.c \
- cmapi.c \
- coremediactx.c \
- dynapi.c
-
-libgstapplemedia_nonpublic_la_CPPFLAGS = \
- -Dgst_dyn_api_get_type=gst_dyn_api_priv_get_type \
- -Dgst_dyn_api_debug=gst_dyn_api_priv_debug \
- -Dgst_dyn_api_new=gst_dyn_api_priv_new \
- -Dgst_core_media_buffer_new=gst_core_media_buffer_priv_new \
- -Dgst_core_media_buffer_get_type=gst_core_media_buffer_priv_get_type \
- -Dgst_core_media_buffer_get_pixel_buffer=gst_core_media_buffer_priv_get_pixel_buffer\
- -Dgst_core_video_buffer_new=gst_core_video_buffer_priv_new \
- -Dgst_core_video_buffer_get_type=gst_core_video_buffer_priv_get_type \
- -Dgst_core_media_ctx_new=gst_core_media_ctx_priv_new \
- -Dgst_core_media_ctx_get_type=gst_core_media_ctx_priv_get_type
-
-libgstapplemedia_nonpublic_la_CFLAGS = \
- $(GST_CFLAGS) \
- $(GST_BASE_CFLAGS) \
- $(GST_PLUGINS_BASE_CFLAGS)
-
-libgstapplemedia_nonpublic_la_OBJCFLAGS = \
- $(GST_OBJCFLAGS) \
- $(GST_BASE_CFLAGS) \
- $(GST_PLUGINS_BASE_CFLAGS)
-
-if HAVE_IOS
-libgstapplemedia_nonpublic_la_OBJCFLAGS += -fobjc-abi-version=2 -fobjc-legacy-dispatch
-endif
-
-libgstapplemedia_nonpublic_la_LIBADD = \
- $(GST_BASE_LIBS) \
- $(GST_PLUGINS_BASE_LIBS) \
- -lgstvideo-$(GST_API_VERSION) \
- $(GMODULE_NO_EXPORT_LIBS)
-
-libgstapplemedia_nonpublic_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS) --tag=CC
-
-libgstapplemedia_nonpublic_la_LDFLAGS = \
- $(GST_PLUGIN_LDFLAGS) \
- $(GST_BASE_LDFLAGS) \
- $(GST_PLUGINS_BASE_LDFLAGS) \
- -Wl,-framework -Wl,Foundation \
- -Wl,-framework -Wl,CoreFoundation \
- -Wl,-framework -Wl,CoreVideo
-
-noinst_HEADERS = \
- miovideosrc.h \
- miovideodevice.h \
- celvideosrc.h \
- bufferfactory.h \
- corevideobuffer.h \
- coremediabuffer.h \
- coremediactx.h \
- mioapi.h \
- mtapi.h \
- celapi.h \
- cvapi.h \
- cmapi.h \
- dynapi.h \
- dynapi-internal.h
-
-if HAVE_IOS
-
-#libgstapplemedia_nonpublic_la_SOURCES += \
-# celvideosrc.c \
-# mtapi.c \
-# celapi.c
-
-else
-
-libgstapplemedia_nonpublic_la_SOURCES += \
- mioapi.c
-
-endif
-
diff --git a/sys/applemedia-nonpublic/Makefile.in b/sys/applemedia-nonpublic/Makefile.in
deleted file mode 100644
index 548a94b..0000000
--- a/sys/applemedia-nonpublic/Makefile.in
+++ /dev/null
@@ -1,1293 +0,0 @@
-# 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_IOS_TRUE@am__append_1 = -fobjc-abi-version=2 -fobjc-legacy-dispatch
-
-#libgstapplemedia_nonpublic_la_SOURCES += \
-# celvideosrc.c \
-# mtapi.c \
-# celapi.c
-@HAVE_IOS_FALSE@am__append_2 = \
-@HAVE_IOS_FALSE@ mioapi.c
-
-subdir = sys/applemedia-nonpublic
-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/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 $(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)$(plugindir)"
-LTLIBRARIES = $(plugin_LTLIBRARIES)
-am__DEPENDENCIES_1 =
-libgstapplemedia_nonpublic_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am__libgstapplemedia_nonpublic_la_SOURCES_DIST = plugin.m \
- bufferfactory.m corevideobuffer.c coremediabuffer.c cvapi.c \
- cmapi.c coremediactx.c dynapi.c mioapi.c
-@HAVE_IOS_FALSE@am__objects_1 = \
-@HAVE_IOS_FALSE@ libgstapplemedia_nonpublic_la-mioapi.lo
-am_libgstapplemedia_nonpublic_la_OBJECTS = \
- libgstapplemedia_nonpublic_la-plugin.lo \
- libgstapplemedia_nonpublic_la-bufferfactory.lo \
- libgstapplemedia_nonpublic_la-corevideobuffer.lo \
- libgstapplemedia_nonpublic_la-coremediabuffer.lo \
- libgstapplemedia_nonpublic_la-cvapi.lo \
- libgstapplemedia_nonpublic_la-cmapi.lo \
- libgstapplemedia_nonpublic_la-coremediactx.lo \
- libgstapplemedia_nonpublic_la-dynapi.lo $(am__objects_1)
-libgstapplemedia_nonpublic_la_OBJECTS = \
- $(am_libgstapplemedia_nonpublic_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 =
-libgstapplemedia_nonpublic_la_LINK = $(LIBTOOL) $(AM_V_lt) \
- $(libgstapplemedia_nonpublic_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=link $(OBJCLD) \
- $(libgstapplemedia_nonpublic_la_OBJCFLAGS) $(OBJCFLAGS) \
- $(libgstapplemedia_nonpublic_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 =
-OBJCCOMPILE = $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS)
-LTOBJCCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) \
- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
- $(AM_OBJCFLAGS) $(OBJCFLAGS)
-AM_V_OBJC = $(am__v_OBJC_@AM_V@)
-am__v_OBJC_ = $(am__v_OBJC_@AM_DEFAULT_V@)
-am__v_OBJC_0 = @echo " OBJC " $@;
-am__v_OBJC_1 =
-OBJCLD = $(OBJC)
-OBJCLINK = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=link $(OBJCLD) $(AM_OBJCFLAGS) $(OBJCFLAGS) \
- $(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_OBJCLD = $(am__v_OBJCLD_@AM_V@)
-am__v_OBJCLD_ = $(am__v_OBJCLD_@AM_DEFAULT_V@)
-am__v_OBJCLD_0 = @echo " OBJCLD " $@;
-am__v_OBJCLD_1 =
-SOURCES = $(libgstapplemedia_nonpublic_la_SOURCES)
-DIST_SOURCES = $(am__libgstapplemedia_nonpublic_la_SOURCES_DIST)
-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
-# *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_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_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@
-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@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-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@
-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_2_1_CFLAGS = @OPENJPEG_2_1_CFLAGS@
-OPENJPEG_2_1_LIBS = @OPENJPEG_2_1_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_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@
-VULKAN_LIBS = @VULKAN_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@
-XCB_CFLAGS = @XCB_CFLAGS@
-XCB_LIBS = @XCB_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@
-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@
-plugin_LTLIBRARIES = libgstapplemedia_nonpublic.la
-libgstapplemedia_nonpublic_la_SOURCES = plugin.m bufferfactory.m \
- corevideobuffer.c coremediabuffer.c cvapi.c cmapi.c \
- coremediactx.c dynapi.c $(am__append_2)
-libgstapplemedia_nonpublic_la_CPPFLAGS = \
- -Dgst_dyn_api_get_type=gst_dyn_api_priv_get_type \
- -Dgst_dyn_api_debug=gst_dyn_api_priv_debug \
- -Dgst_dyn_api_new=gst_dyn_api_priv_new \
- -Dgst_core_media_buffer_new=gst_core_media_buffer_priv_new \
- -Dgst_core_media_buffer_get_type=gst_core_media_buffer_priv_get_type \
- -Dgst_core_media_buffer_get_pixel_buffer=gst_core_media_buffer_priv_get_pixel_buffer\
- -Dgst_core_video_buffer_new=gst_core_video_buffer_priv_new \
- -Dgst_core_video_buffer_get_type=gst_core_video_buffer_priv_get_type \
- -Dgst_core_media_ctx_new=gst_core_media_ctx_priv_new \
- -Dgst_core_media_ctx_get_type=gst_core_media_ctx_priv_get_type
-
-libgstapplemedia_nonpublic_la_CFLAGS = \
- $(GST_CFLAGS) \
- $(GST_BASE_CFLAGS) \
- $(GST_PLUGINS_BASE_CFLAGS)
-
-libgstapplemedia_nonpublic_la_OBJCFLAGS = $(GST_OBJCFLAGS) \
- $(GST_BASE_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(am__append_1)
-libgstapplemedia_nonpublic_la_LIBADD = \
- $(GST_BASE_LIBS) \
- $(GST_PLUGINS_BASE_LIBS) \
- -lgstvideo-$(GST_API_VERSION) \
- $(GMODULE_NO_EXPORT_LIBS)
-
-libgstapplemedia_nonpublic_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS) --tag=CC
-libgstapplemedia_nonpublic_la_LDFLAGS = \
- $(GST_PLUGIN_LDFLAGS) \
- $(GST_BASE_LDFLAGS) \
- $(GST_PLUGINS_BASE_LDFLAGS) \
- -Wl,-framework -Wl,Foundation \
- -Wl,-framework -Wl,CoreFoundation \
- -Wl,-framework -Wl,CoreVideo
-
-noinst_HEADERS = \
- miovideosrc.h \
- miovideodevice.h \
- celvideosrc.h \
- bufferfactory.h \
- corevideobuffer.h \
- coremediabuffer.h \
- coremediactx.h \
- mioapi.h \
- mtapi.h \
- celapi.h \
- cvapi.h \
- cmapi.h \
- dynapi.h \
- dynapi-internal.h
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .m .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 sys/applemedia-nonpublic/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu sys/applemedia-nonpublic/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-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)"; \
- }
-
-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}; \
- }
-
-libgstapplemedia_nonpublic.la: $(libgstapplemedia_nonpublic_la_OBJECTS) $(libgstapplemedia_nonpublic_la_DEPENDENCIES) $(EXTRA_libgstapplemedia_nonpublic_la_DEPENDENCIES)
- $(AM_V_OBJCLD)$(libgstapplemedia_nonpublic_la_LINK) -rpath $(plugindir) $(libgstapplemedia_nonpublic_la_OBJECTS) $(libgstapplemedia_nonpublic_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT)
-
-distclean-compile:
- -rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_nonpublic_la-bufferfactory.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_nonpublic_la-cmapi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_nonpublic_la-coremediabuffer.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_nonpublic_la-coremediactx.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_nonpublic_la-corevideobuffer.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_nonpublic_la-cvapi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_nonpublic_la-dynapi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_nonpublic_la-mioapi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_nonpublic_la-plugin.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 $@ $<
-
-libgstapplemedia_nonpublic_la-corevideobuffer.lo: corevideobuffer.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapplemedia_nonpublic_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_nonpublic_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_nonpublic_la_CFLAGS) $(CFLAGS) -MT libgstapplemedia_nonpublic_la-corevideobuffer.lo -MD -MP -MF $(DEPDIR)/libgstapplemedia_nonpublic_la-corevideobuffer.Tpo -c -o libgstapplemedia_nonpublic_la-corevideobuffer.lo `test -f 'corevideobuffer.c' || echo '$(srcdir)/'`corevideobuffer.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstapplemedia_nonpublic_la-corevideobuffer.Tpo $(DEPDIR)/libgstapplemedia_nonpublic_la-corevideobuffer.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='corevideobuffer.c' object='libgstapplemedia_nonpublic_la-corevideobuffer.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_nonpublic_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_nonpublic_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_nonpublic_la_CFLAGS) $(CFLAGS) -c -o libgstapplemedia_nonpublic_la-corevideobuffer.lo `test -f 'corevideobuffer.c' || echo '$(srcdir)/'`corevideobuffer.c
-
-libgstapplemedia_nonpublic_la-coremediabuffer.lo: coremediabuffer.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapplemedia_nonpublic_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_nonpublic_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_nonpublic_la_CFLAGS) $(CFLAGS) -MT libgstapplemedia_nonpublic_la-coremediabuffer.lo -MD -MP -MF $(DEPDIR)/libgstapplemedia_nonpublic_la-coremediabuffer.Tpo -c -o libgstapplemedia_nonpublic_la-coremediabuffer.lo `test -f 'coremediabuffer.c' || echo '$(srcdir)/'`coremediabuffer.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstapplemedia_nonpublic_la-coremediabuffer.Tpo $(DEPDIR)/libgstapplemedia_nonpublic_la-coremediabuffer.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coremediabuffer.c' object='libgstapplemedia_nonpublic_la-coremediabuffer.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_nonpublic_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_nonpublic_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_nonpublic_la_CFLAGS) $(CFLAGS) -c -o libgstapplemedia_nonpublic_la-coremediabuffer.lo `test -f 'coremediabuffer.c' || echo '$(srcdir)/'`coremediabuffer.c
-
-libgstapplemedia_nonpublic_la-cvapi.lo: cvapi.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapplemedia_nonpublic_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_nonpublic_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_nonpublic_la_CFLAGS) $(CFLAGS) -MT libgstapplemedia_nonpublic_la-cvapi.lo -MD -MP -MF $(DEPDIR)/libgstapplemedia_nonpublic_la-cvapi.Tpo -c -o libgstapplemedia_nonpublic_la-cvapi.lo `test -f 'cvapi.c' || echo '$(srcdir)/'`cvapi.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstapplemedia_nonpublic_la-cvapi.Tpo $(DEPDIR)/libgstapplemedia_nonpublic_la-cvapi.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cvapi.c' object='libgstapplemedia_nonpublic_la-cvapi.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_nonpublic_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_nonpublic_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_nonpublic_la_CFLAGS) $(CFLAGS) -c -o libgstapplemedia_nonpublic_la-cvapi.lo `test -f 'cvapi.c' || echo '$(srcdir)/'`cvapi.c
-
-libgstapplemedia_nonpublic_la-cmapi.lo: cmapi.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapplemedia_nonpublic_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_nonpublic_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_nonpublic_la_CFLAGS) $(CFLAGS) -MT libgstapplemedia_nonpublic_la-cmapi.lo -MD -MP -MF $(DEPDIR)/libgstapplemedia_nonpublic_la-cmapi.Tpo -c -o libgstapplemedia_nonpublic_la-cmapi.lo `test -f 'cmapi.c' || echo '$(srcdir)/'`cmapi.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstapplemedia_nonpublic_la-cmapi.Tpo $(DEPDIR)/libgstapplemedia_nonpublic_la-cmapi.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmapi.c' object='libgstapplemedia_nonpublic_la-cmapi.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_nonpublic_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_nonpublic_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_nonpublic_la_CFLAGS) $(CFLAGS) -c -o libgstapplemedia_nonpublic_la-cmapi.lo `test -f 'cmapi.c' || echo '$(srcdir)/'`cmapi.c
-
-libgstapplemedia_nonpublic_la-coremediactx.lo: coremediactx.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapplemedia_nonpublic_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_nonpublic_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_nonpublic_la_CFLAGS) $(CFLAGS) -MT libgstapplemedia_nonpublic_la-coremediactx.lo -MD -MP -MF $(DEPDIR)/libgstapplemedia_nonpublic_la-coremediactx.Tpo -c -o libgstapplemedia_nonpublic_la-coremediactx.lo `test -f 'coremediactx.c' || echo '$(srcdir)/'`coremediactx.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstapplemedia_nonpublic_la-coremediactx.Tpo $(DEPDIR)/libgstapplemedia_nonpublic_la-coremediactx.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coremediactx.c' object='libgstapplemedia_nonpublic_la-coremediactx.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_nonpublic_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_nonpublic_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_nonpublic_la_CFLAGS) $(CFLAGS) -c -o libgstapplemedia_nonpublic_la-coremediactx.lo `test -f 'coremediactx.c' || echo '$(srcdir)/'`coremediactx.c
-
-libgstapplemedia_nonpublic_la-dynapi.lo: dynapi.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapplemedia_nonpublic_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_nonpublic_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_nonpublic_la_CFLAGS) $(CFLAGS) -MT libgstapplemedia_nonpublic_la-dynapi.lo -MD -MP -MF $(DEPDIR)/libgstapplemedia_nonpublic_la-dynapi.Tpo -c -o libgstapplemedia_nonpublic_la-dynapi.lo `test -f 'dynapi.c' || echo '$(srcdir)/'`dynapi.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstapplemedia_nonpublic_la-dynapi.Tpo $(DEPDIR)/libgstapplemedia_nonpublic_la-dynapi.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dynapi.c' object='libgstapplemedia_nonpublic_la-dynapi.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_nonpublic_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_nonpublic_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_nonpublic_la_CFLAGS) $(CFLAGS) -c -o libgstapplemedia_nonpublic_la-dynapi.lo `test -f 'dynapi.c' || echo '$(srcdir)/'`dynapi.c
-
-libgstapplemedia_nonpublic_la-mioapi.lo: mioapi.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapplemedia_nonpublic_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_nonpublic_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_nonpublic_la_CFLAGS) $(CFLAGS) -MT libgstapplemedia_nonpublic_la-mioapi.lo -MD -MP -MF $(DEPDIR)/libgstapplemedia_nonpublic_la-mioapi.Tpo -c -o libgstapplemedia_nonpublic_la-mioapi.lo `test -f 'mioapi.c' || echo '$(srcdir)/'`mioapi.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstapplemedia_nonpublic_la-mioapi.Tpo $(DEPDIR)/libgstapplemedia_nonpublic_la-mioapi.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mioapi.c' object='libgstapplemedia_nonpublic_la-mioapi.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_nonpublic_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_nonpublic_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_nonpublic_la_CFLAGS) $(CFLAGS) -c -o libgstapplemedia_nonpublic_la-mioapi.lo `test -f 'mioapi.c' || echo '$(srcdir)/'`mioapi.c
-
-.m.o:
-@am__fastdepOBJC_TRUE@ $(AM_V_OBJC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
-@am__fastdepOBJC_TRUE@ $(OBJCCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
-@am__fastdepOBJC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
-@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ $(AM_V_OBJC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepOBJC_FALSE@ $(AM_V_OBJC@am__nodep@)$(OBJCCOMPILE) -c -o $@ $<
-
-.m.obj:
-@am__fastdepOBJC_TRUE@ $(AM_V_OBJC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
-@am__fastdepOBJC_TRUE@ $(OBJCCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
-@am__fastdepOBJC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
-@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ $(AM_V_OBJC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepOBJC_FALSE@ $(AM_V_OBJC@am__nodep@)$(OBJCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.m.lo:
-@am__fastdepOBJC_TRUE@ $(AM_V_OBJC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
-@am__fastdepOBJC_TRUE@ $(LTOBJCCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
-@am__fastdepOBJC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
-@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ $(AM_V_OBJC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepOBJC_FALSE@ $(AM_V_OBJC@am__nodep@)$(LTOBJCCOMPILE) -c -o $@ $<
-
-libgstapplemedia_nonpublic_la-plugin.lo: plugin.m
-@am__fastdepOBJC_TRUE@ $(AM_V_OBJC)$(LIBTOOL) $(AM_V_lt) $(libgstapplemedia_nonpublic_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_nonpublic_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_nonpublic_la_OBJCFLAGS) $(OBJCFLAGS) -MT libgstapplemedia_nonpublic_la-plugin.lo -MD -MP -MF $(DEPDIR)/libgstapplemedia_nonpublic_la-plugin.Tpo -c -o libgstapplemedia_nonpublic_la-plugin.lo `test -f 'plugin.m' || echo '$(srcdir)/'`plugin.m
-@am__fastdepOBJC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstapplemedia_nonpublic_la-plugin.Tpo $(DEPDIR)/libgstapplemedia_nonpublic_la-plugin.Plo
-@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ $(AM_V_OBJC)source='plugin.m' object='libgstapplemedia_nonpublic_la-plugin.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_nonpublic_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_nonpublic_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_nonpublic_la_OBJCFLAGS) $(OBJCFLAGS) -c -o libgstapplemedia_nonpublic_la-plugin.lo `test -f 'plugin.m' || echo '$(srcdir)/'`plugin.m
-
-libgstapplemedia_nonpublic_la-bufferfactory.lo: bufferfactory.m
-@am__fastdepOBJC_TRUE@ $(AM_V_OBJC)$(LIBTOOL) $(AM_V_lt) $(libgstapplemedia_nonpublic_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_nonpublic_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_nonpublic_la_OBJCFLAGS) $(OBJCFLAGS) -MT libgstapplemedia_nonpublic_la-bufferfactory.lo -MD -MP -MF $(DEPDIR)/libgstapplemedia_nonpublic_la-bufferfactory.Tpo -c -o libgstapplemedia_nonpublic_la-bufferfactory.lo `test -f 'bufferfactory.m' || echo '$(srcdir)/'`bufferfactory.m
-@am__fastdepOBJC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstapplemedia_nonpublic_la-bufferfactory.Tpo $(DEPDIR)/libgstapplemedia_nonpublic_la-bufferfactory.Plo
-@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ $(AM_V_OBJC)source='bufferfactory.m' object='libgstapplemedia_nonpublic_la-bufferfactory.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_nonpublic_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_nonpublic_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_nonpublic_la_OBJCFLAGS) $(OBJCFLAGS) -c -o libgstapplemedia_nonpublic_la-bufferfactory.lo `test -f 'bufferfactory.m' || echo '$(srcdir)/'`bufferfactory.m
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-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) $(HEADERS)
-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
-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:
-
-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-libtool clean-pluginLTLIBRARIES \
- 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-pluginLTLIBRARIES
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-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-pluginLTLIBRARIES
-
-.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 \
- 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
-
-.PRECIOUS: Makefile
-
-
-# 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/sys/applemedia-nonpublic/bufferfactory.m b/sys/applemedia-nonpublic/bufferfactory.m
deleted file mode 100644
index 7b2e845..0000000
--- a/sys/applemedia-nonpublic/bufferfactory.m
+++ /dev/null
@@ -1,61 +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.
- */
-
-#import "bufferfactory.h"
-
-#include "coremediabuffer.h"
-#include "corevideobuffer.h"
-
-@implementation GstAMBufferFactory
-
-- (id)initWithError:(GError **)error
-{
- GstCoreMediaCtx *ctx;
-
- ctx =
- gst_core_media_ctx_new (GST_API_CORE_VIDEO | GST_API_CORE_MEDIA, error);
- if (ctx == NULL)
- return nil;
-
- if ((self = [super init]))
- coreMediaCtx = ctx;
- else
- g_object_unref (ctx);
-
- return self;
-}
-
-- (void)finalize
-{
- g_object_unref (coreMediaCtx);
-
- [super finalize];
-}
-
-- (GstBuffer *)createGstBufferForCoreVideoBuffer:(CFTypeRef)cvbuf
-{
- return gst_core_video_buffer_new (coreMediaCtx, (CVBufferRef) cvbuf, NULL);
-}
-
-- (GstBuffer *)createGstBufferForSampleBuffer:(CFTypeRef)sbuf
-{
- return gst_core_media_buffer_new (coreMediaCtx, sbuf);
-}
-
-@end
diff --git a/sys/applemedia-nonpublic/celapi.h b/sys/applemedia-nonpublic/celapi.h
deleted file mode 100644
index 78855f9..0000000
--- a/sys/applemedia-nonpublic/celapi.h
+++ /dev/null
@@ -1,169 +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.
- */
-
-#ifndef __GST_CEL_API_H__
-#define __GST_CEL_API_H__
-
-#include "mtapi.h"
-
-G_BEGIN_DECLS
-
-typedef struct _GstCelApi GstCelApi;
-typedef struct _GstCelApiClass GstCelApiClass;
-
-enum
-{
- kCelError_ResourceBusy = -12780
-};
-
-struct _GstCelApi
-{
- GstDynApi parent;
-
- OSStatus (* FigCreateCaptureDevicesAndStreamsForPreset)
- (CFAllocatorRef allocator, CFStringRef capturePreset,
- CFDictionaryRef audioOptions,
- FigCaptureDeviceRef * outVideoDevice,
- FigCaptureStreamRef * outVideoStream,
- FigCaptureDeviceRef * outAudioDevice,
- FigCaptureStreamRef * outAudioStream);
-
- CFStringRef * kFigCaptureDeviceProperty_MultiplexStreams;
- CFStringRef * kFigCapturePortType_Bottom;
- CFStringRef * kFigCapturePortType_Camera;
- CFStringRef * kFigCapturePortType_FrontFacingCamera;
- CFStringRef * kFigCapturePortType_Top;
- CFStringRef * kFigCapturePropertyValue_AFEarlyOutAllowPeakAtStart;
- CFStringRef * kFigCapturePropertyValue_AFEarlyOutDecrementAmount;
- CFStringRef * kFigCapturePropertyValue_AFEarlyOutEnable;
- CFStringRef * kFigCapturePropertyValue_AFEarlyOutThreshold;
- CFStringRef * kFigCapturePropertyValue_AFPositionCurrent;
- CFStringRef * kFigCapturePropertyValue_AFPositionInfinity;
- CFStringRef * kFigCapturePropertyValue_AFPositionMacro;
- CFStringRef * kFigCapturePropertyValue_AFSearchPositionArray;
- CFStringRef * kFigCapturePropertyValue_AGC;
- CFStringRef * kFigCapturePropertyValue_CLPFControl;
- CFStringRef * kFigCapturePropertyValue_ColorRangeFull;
- CFStringRef * kFigCapturePropertyValue_ColorRangeSDVideo;
- CFStringRef * kFigCapturePropertyValue_ModuleDate;
- CFStringRef * kFigCapturePropertyValue_ModuleIntegratorInfo;
- CFStringRef * kFigCapturePropertyValue_SensorID;
- CFStringRef * kFigCapturePropertyValue_SigmaFilterControl;
- CFStringRef * kFigCapturePropertyValue_YLPFControl;
- CFStringRef * kFigCapturePropertyValue_hStart;
- CFStringRef * kFigCapturePropertyValue_height;
- CFStringRef * kFigCapturePropertyValue_ispDGain;
- CFStringRef * kFigCapturePropertyValue_sensorDGain;
- CFStringRef * kFigCapturePropertyValue_shutterSpeedDenominator;
- CFStringRef * kFigCapturePropertyValue_shutterSpeedNumerator;
- CFStringRef * kFigCapturePropertyValue_vStart;
- CFStringRef * kFigCapturePropertyValue_weight;
- CFStringRef * kFigCapturePropertyValue_width;
- CFStringRef * kFigCaptureStreamPropertyValue_AEBracketedCaptureParams;
- CFStringRef * kFigCaptureStreamPropertyValue_BLCCompensation;
- CFStringRef * kFigCaptureStreamPropertyValue_BLCDebugMode;
- CFStringRef * kFigCaptureStreamPropertyValue_BandHighFactor;
- CFStringRef * kFigCaptureStreamPropertyValue_BandLowFactor;
- CFStringRef * kFigCaptureStreamPropertyValue_CCMWarmUpWeight;
- CFStringRef * kFigCaptureStreamPropertyValue_EdgeColorSuppressionSlope;
- CFStringRef * kFigCaptureStreamPropertyValue_EdgeColorSuppressionThreshold;
- CFStringRef * kFigCaptureStreamPropertyValue_EnableAESceneDynamicMetering;
- CFStringRef * kFigCaptureStreamPropertyValue_EnableCCMWarmUp;
- CFStringRef * kFigCaptureStreamPropertyValue_EnableHistogram1MetaData;
- CFStringRef * kFigCaptureStreamPropertyValue_EnableHistogram2MetaData;
- CFStringRef * kFigCaptureStreamPropertyValue_EnableHistogram3MetaData;
- CFStringRef * kFigCaptureStreamPropertyValue_EnableHistogram4MetaData;
- CFStringRef * kFigCaptureStreamPropertyValue_EnableHistogram;
- CFStringRef * kFigCaptureStreamPropertyValue_HistogramBinMode;
- CFStringRef * kFigCaptureStreamPropertyValue_HistogramDataType;
- CFStringRef * kFigCaptureStreamPropertyValue_ImageCropRect;
- CFStringRef * kFigCaptureStreamPropertyValue_LPExposure;
- CFStringRef * kFigCaptureStreamPropertyValue_LPGain;
- CFStringRef * kFigCaptureStreamPropertyValue_LowWeight;
- CFStringRef * kFigCaptureStreamPropertyValue_MaxWeight;
- CFStringRef * kFigCaptureStreamPropertyValue_MediumWeight;
- CFStringRef * kFigCaptureStreamPropertyValue_MinWeight;
- CFStringRef * kFigCaptureStreamPropertyValue_WeightDropOff;
- CFStringRef * kFigCaptureStreamPropertyValue_WeightReduction;
- CFStringRef * kFigCaptureStreamProperty_AEConvergenceSpeed;
- CFStringRef * kFigCaptureStreamProperty_AEOutlierClipCount;
- CFStringRef * kFigCaptureStreamProperty_AESceneDynamicMetering;
- CFStringRef * kFigCaptureStreamProperty_AEStability;
- CFStringRef * kFigCaptureStreamProperty_AEWindowManualWeightMatrix;
- CFStringRef * kFigCaptureStreamProperty_AEWindowParams;
- CFStringRef * kFigCaptureStreamProperty_AFEarlyOutParams;
- CFStringRef * kFigCaptureStreamProperty_AFParams;
- CFStringRef * kFigCaptureStreamProperty_AFSearchPositions;
- CFStringRef * kFigCaptureStreamProperty_AFWindowParams;
- CFStringRef * kFigCaptureStreamProperty_AGC;
- CFStringRef * kFigCaptureStreamProperty_AWBWindowParams;
- CFStringRef * kFigCaptureStreamProperty_AdditionalPTSOffset;
- CFStringRef * kFigCaptureStreamProperty_AlternateAWB;
- CFStringRef * kFigCaptureStreamProperty_Apply3AWindowSettings;
- CFStringRef * kFigCaptureStreamProperty_AttachRAW;
- CFStringRef * kFigCaptureStreamProperty_CCMWarmUp;
- CFStringRef * kFigCaptureStreamProperty_ClientMaxBufferCountHint;
- CFStringRef * kFigCaptureStreamProperty_ColorRange;
- CFStringRef * kFigCaptureStreamProperty_ColorSaturation;
- CFStringRef * kFigCaptureStreamProperty_ColorTables;
- CFStringRef * kFigCaptureStreamProperty_EdgeColorSuppressionParams;
- CFStringRef * kFigCaptureStreamProperty_ExposureBias;
- CFStringRef * kFigCaptureStreamProperty_FastSwitchMode;
- CFStringRef * kFigCaptureStreamProperty_FlashMode;
- CFStringRef * kFigCaptureStreamProperty_HistogramParams;
- CFStringRef * kFigCaptureStreamProperty_LockAENow;
- CFStringRef * kFigCaptureStreamProperty_LockAWBNow;
- CFStringRef * kFigCaptureStreamProperty_ManualAENow;
- CFStringRef * kFigCaptureStreamProperty_ManualFocusNow;
- CFStringRef * kFigCaptureStreamProperty_MaxIntegrationTime;
- CFStringRef * kFigCaptureStreamProperty_ModuleInfo;
- CFStringRef * kFigCaptureStreamProperty_NoiseReductionControls;
- CFStringRef * kFigCaptureStreamProperty_PortType;
- CFStringRef * kFigCaptureStreamProperty_PreFrameAE;
- CFStringRef * kFigCaptureStreamProperty_RawImageProcessNow;
- CFStringRef * kFigCaptureStreamProperty_RedEyeReductionParams;
- CFStringRef * kFigCaptureStreamProperty_ResetParams;
- CFStringRef * kFigCaptureStreamProperty_ScalerSharpening;
- CFStringRef * kFigCaptureStreamProperty_SetGainCap;
- CFStringRef * kFigCaptureStreamProperty_SharpeningControl;
- CFStringRef * kFigCaptureStreamProperty_TorchLevel;
- CFStringRef * kFigCaptureStreamProperty_UnlockAENow;
- CFStringRef * kFigCaptureStreamProperty_UnlockAWBNow;
- CFStringRef * kFigCaptureStreamProperty_UseFlashAFAssist;
- CFStringRef * kFigCaptureStreamProperty_UseFlashRedEyeReduction;
- CFStringRef * kFigCaptureStreamProperty_UseHardwareShutter;
- CFStringRef * kFigCaptureStreamProperty_VideoRecordingInProgress;
- CFStringRef * kFigRecorderCapturePreset_AudioRecording;
- CFStringRef * kFigRecorderCapturePreset_AudioVideoRecording;
- CFStringRef * kFigRecorderCapturePreset_PhotoCapture;
- CFStringRef * kFigRecorderCapturePreset_VideoRecording;
-};
-
-struct _GstCelApiClass
-{
- GstDynApiClass parent_class;
-};
-
-GType gst_cel_api_get_type (void);
-
-GstCelApi * gst_cel_api_obtain (GError ** error);
-
-G_END_DECLS
-
-#endif
diff --git a/sys/applemedia-nonpublic/celvideosrc.h b/sys/applemedia-nonpublic/celvideosrc.h
deleted file mode 100644
index 5fa656c..0000000
--- a/sys/applemedia-nonpublic/celvideosrc.h
+++ /dev/null
@@ -1,89 +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.
- */
-
-#ifndef __GST_CEL_VIDEO_SRC_H__
-#define __GST_CEL_VIDEO_SRC_H__
-
-#include <gst/base/gstpushsrc.h>
-
-#include "coremediactx.h"
-
-G_BEGIN_DECLS
-
-#define GST_TYPE_CEL_VIDEO_SRC \
- (gst_cel_video_src_get_type ())
-#define GST_CEL_VIDEO_SRC(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_CEL_VIDEO_SRC, GstCelVideoSrc))
-#define GST_CEL_VIDEO_SRC_CAST(obj) \
- ((GstCelVideoSrc *) (obj))
-#define GST_CEL_VIDEO_SRC_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_CEL_VIDEO_SRC, GstCelVideoSrcClass))
-#define GST_IS_CEL_VIDEO_SRC(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_CEL_VIDEO_SRC))
-#define GST_IS_CEL_VIDEO_SRC_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_CEL_VIDEO_SRC))
-
-typedef struct _GstCelVideoSrc GstCelVideoSrc;
-typedef struct _GstCelVideoSrcClass GstCelVideoSrcClass;
-
-struct _GstCelVideoSrc
-{
- GstPushSrc push_src;
-
- gint device_index;
- gboolean do_stats;
-
- GstCoreMediaCtx *ctx;
-
- FigCaptureDeviceRef device;
- FigCaptureDeviceIface *device_iface;
- FigBaseObjectRef device_base;
- FigBaseIface *device_base_iface;
- FigCaptureStreamRef stream;
- FigCaptureStreamIface *stream_iface;
- FigBaseObjectRef stream_base;
- FigBaseIface *stream_base_iface;
-
- CMBufferQueueRef queue;
- CMBufferQueueTriggerToken ready_trigger;
- GstCaps *device_caps;
- GArray *device_formats;
- GstClockTime duration;
-
- volatile gint is_running;
- guint64 offset;
-
- GCond *ready_cond;
- volatile gboolean queue_is_ready;
-
- GstClockTime last_sampling;
- guint count;
- gint fps;
-};
-
-struct _GstCelVideoSrcClass
-{
- GstPushSrcClass parent_class;
-};
-
-GType gst_cel_video_src_get_type (void);
-
-G_END_DECLS
-
-#endif /* __GST_CEL_VIDEO_SRC_H__ */
diff --git a/sys/applemedia-nonpublic/cmapi.c b/sys/applemedia-nonpublic/cmapi.c
deleted file mode 100644
index 15c28ed..0000000
--- a/sys/applemedia-nonpublic/cmapi.c
+++ /dev/null
@@ -1,137 +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.
- */
-
-#include "cmapi.h"
-
-#include "dynapi-internal.h"
-
-#include <gmodule.h>
-
-#define CM_FRAMEWORK_PATH "/System/Library/Frameworks/" \
- "CoreMedia.framework/CoreMedia"
-#define CM_FRAMEWORK_PATH_OLD "/System/Library/PrivateFrameworks/" \
- "CoreMedia.framework/CoreMedia"
-
-G_DEFINE_TYPE (GstCMApi, gst_cm_api, GST_TYPE_DYN_API);
-
-static void
-gst_cm_api_init (GstCMApi * self)
-{
-}
-
-static void
-gst_cm_api_class_init (GstCMApiClass * klass)
-{
-}
-
-#define SYM_SPEC(name) GST_DYN_SYM_SPEC (GstCMApi, name)
-
-GstCMApi *
-gst_cm_api_obtain (GError ** error)
-{
- static const GstDynSymSpec symbols[] = {
- SYM_SPEC (FigBaseObjectGetVTable),
-
- SYM_SPEC (CMGetAttachment),
-
- SYM_SPEC (FigFormatDescriptionRelease),
- SYM_SPEC (FigFormatDescriptionRetain),
- SYM_SPEC (CMFormatDescriptionEqual),
- SYM_SPEC (CMFormatDescriptionGetExtension),
- SYM_SPEC (CMFormatDescriptionGetMediaType),
- SYM_SPEC (CMFormatDescriptionGetMediaSubType),
-
- SYM_SPEC (CMVideoFormatDescriptionCreate),
- SYM_SPEC
- (FigVideoFormatDescriptionCreateWithSampleDescriptionExtensionAtom),
- SYM_SPEC (CMVideoFormatDescriptionGetDimensions),
-
- SYM_SPEC (CMTimeMake),
-
- SYM_SPEC (CMSampleBufferCreate),
- SYM_SPEC (CMSampleBufferDataIsReady),
- SYM_SPEC (CMSampleBufferGetDataBuffer),
- SYM_SPEC (CMSampleBufferGetFormatDescription),
- SYM_SPEC (CMSampleBufferGetImageBuffer),
- SYM_SPEC (CMSampleBufferGetNumSamples),
- SYM_SPEC (CMSampleBufferGetSampleAttachmentsArray),
- SYM_SPEC (CMSampleBufferGetSampleSize),
- SYM_SPEC (FigSampleBufferRelease),
- SYM_SPEC (FigSampleBufferRetain),
-
- SYM_SPEC (CMBlockBufferCreateWithMemoryBlock),
- SYM_SPEC (CMBlockBufferGetDataLength),
- SYM_SPEC (CMBlockBufferGetDataPointer),
- SYM_SPEC (FigBlockBufferRelease),
- SYM_SPEC (FigBlockBufferRetain),
-
- SYM_SPEC (CMBufferQueueDequeueAndRetain),
- SYM_SPEC (CMBufferQueueGetBufferCount),
- SYM_SPEC (CMBufferQueueInstallTrigger),
- SYM_SPEC (CMBufferQueueIsEmpty),
- SYM_SPEC (FigBufferQueueRelease),
- SYM_SPEC (CMBufferQueueRemoveTrigger),
- SYM_SPEC (CMBufferQueueSetValidationCallback),
-
- SYM_SPEC (kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms),
- SYM_SPEC (kCMSampleAttachmentKey_DependsOnOthers),
- SYM_SPEC (kCMTimeInvalid),
-
- {NULL, 0},
- };
- GstCMApi *result;
- GModule *module;
-
- /* We cannot stat() the library as it may not be present on the filesystem.
- * This is the case on newer versions of iOS where system libraries are all
- * part of dyld_shared_cache... */
- module = g_module_open (CM_FRAMEWORK_PATH, 0);
- if (module != NULL) {
- result = _gst_dyn_api_new (gst_cm_api_get_type (), CM_FRAMEWORK_PATH,
- symbols, error);
- g_module_close (module);
- } else {
- GstDynSymSpec *old_symbols;
- guint i;
-
- old_symbols = g_memdup (symbols, sizeof (symbols));
- for (i = 0; old_symbols[i].name != NULL; i++) {
- const gchar *name = old_symbols[i].name;
- const gchar *translated_name;
-
- if (g_str_has_prefix (name, "CM"))
- translated_name = g_strconcat ("Fig", name + 2, NULL);
- else if (g_str_has_prefix (name, "kCM"))
- translated_name = g_strconcat ("kFig", name + 3, NULL);
- else
- translated_name = g_strdup (name);
-
- old_symbols[i].name = translated_name;
- }
-
- result = _gst_dyn_api_new (gst_cm_api_get_type (), CM_FRAMEWORK_PATH_OLD,
- old_symbols, error);
-
- for (i = 0; old_symbols[i].name != NULL; i++)
- g_free ((gpointer) old_symbols[i].name);
- g_free (old_symbols);
- }
-
- return result;
-}
diff --git a/sys/applemedia-nonpublic/cmapi.h b/sys/applemedia-nonpublic/cmapi.h
deleted file mode 100644
index 92565fc..0000000
--- a/sys/applemedia-nonpublic/cmapi.h
+++ /dev/null
@@ -1,212 +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.
- */
-
-#ifndef __GST_CM_API_H__
-#define __GST_CM_API_H__
-
-#include "dynapi.h"
-
-#include <CoreFoundation/CoreFoundation.h>
-#include "cvapi.h"
-
-G_BEGIN_DECLS
-
-typedef struct _GstCMApi GstCMApi;
-typedef struct _GstCMApiClass GstCMApiClass;
-
-typedef CFTypeRef FigBaseObjectRef;
-typedef struct _FigBaseVTable FigBaseVTable;
-typedef struct _FigBaseIface FigBaseIface;
-
-typedef CFTypeRef CMFormatDescriptionRef;
-typedef struct _CMVideoDimensions CMVideoDimensions;
-typedef struct _CMTime CMTime;
-
-typedef CFTypeRef CMBufferQueueRef;
-typedef SInt32 CMBufferQueueTriggerCondition;
-typedef struct _CMBufferQueueTriggerToken *CMBufferQueueTriggerToken;
-typedef CFTypeRef CMSampleBufferRef;
-typedef CFTypeRef CMBlockBufferRef;
-
-typedef void (* CMBufferQueueTriggerCallback) (void *triggerRefcon,
- CMBufferQueueTriggerToken triggerToken);
-typedef Boolean (* CMBufferQueueValidationCallback) (CMBufferQueueRef queue,
- CMSampleBufferRef buf, void *refCon);
-
-enum _FigMediaType
-{
- kFigMediaTypeVideo = 'vide'
-};
-
-enum _FigCodecType
-{
- kComponentVideoUnsigned = 'yuvs',
- kFigVideoCodecType_JPEG_OpenDML = 'dmb1',
- kYUV420vCodecType = '420v'
-};
-
-enum _CMBufferQueueTriggerCondition
-{
- kCMBufferQueueTrigger_WhenDurationBecomesLessThan = 1,
- kCMBufferQueueTrigger_WhenDurationBecomesLessThanOrEqualTo = 2,
- kCMBufferQueueTrigger_WhenDurationBecomesGreaterThan = 3,
- kCMBufferQueueTrigger_WhenDurationBecomesGreaterThanOrEqualTo = 4,
- kCMBufferQueueTrigger_WhenMinPresentationTimeStampChanges = 5,
- kCMBufferQueueTrigger_WhenMaxPresentationTimeStampChanges = 6,
- kCMBufferQueueTrigger_WhenDataBecomesReady = 7,
- kCMBufferQueueTrigger_WhenEndOfDataReached = 8,
- kCMBufferQueueTrigger_WhenReset = 9,
- kCMBufferQueueTrigger_WhenBufferCountBecomesLessThan = 10,
- kCMBufferQueueTrigger_WhenBufferCountBecomesGreaterThan = 11
-};
-
-struct _FigBaseVTable
-{
- gsize unk;
- FigBaseIface * base;
- void * derived;
-};
-
-struct _FigBaseIface
-{
- gsize unk1;
- gsize unk2;
- gsize unk3;
- OSStatus (* Invalidate) (FigBaseObjectRef obj);
- OSStatus (* Finalize) (FigBaseObjectRef obj);
- gpointer unk4;
- OSStatus (* CopyProperty) (FigBaseObjectRef obj, CFTypeRef key, void *unk,
- CFTypeRef * value);
- OSStatus (* SetProperty) (FigBaseObjectRef obj, CFTypeRef key,
- CFTypeRef value);
-};
-
-struct _CMVideoDimensions
-{
- UInt32 width;
- UInt32 height;
-};
-
-struct _CMTime
-{
- UInt8 data[24];
-};
-
-struct _GstCMApi
-{
- GstDynApi parent;
-
- FigBaseVTable * (* FigBaseObjectGetVTable) (FigBaseObjectRef obj);
-
- void * (* CMGetAttachment) (CFTypeRef obj, CFStringRef attachmentKey,
- UInt32 * foundWherePtr);
-
- void (* FigFormatDescriptionRelease) (CMFormatDescriptionRef desc);
- CMFormatDescriptionRef (* FigFormatDescriptionRetain) (
- CMFormatDescriptionRef desc);
- Boolean (* CMFormatDescriptionEqual) (CMFormatDescriptionRef desc1,
- CMFormatDescriptionRef desc2);
- CFTypeRef (* CMFormatDescriptionGetExtension) (
- const CMFormatDescriptionRef desc, CFStringRef extensionKey);
- UInt32 (* CMFormatDescriptionGetMediaType) (
- const CMFormatDescriptionRef desc);
- UInt32 (* CMFormatDescriptionGetMediaSubType) (
- const CMFormatDescriptionRef desc);
-
- OSStatus (* CMVideoFormatDescriptionCreate) (
- CFAllocatorRef allocator, UInt32 formatId, UInt32 width, UInt32 height,
- CFDictionaryRef extensions, CMFormatDescriptionRef * desc);
- OSStatus (* FigVideoFormatDescriptionCreateWithSampleDescriptionExtensionAtom)
- (CFAllocatorRef allocator, UInt32 formatId, UInt32 width, UInt32 height,
- UInt32 atomId, const UInt8 * data, CFIndex len, void *unk1,
- CMFormatDescriptionRef * formatDesc);
- CMVideoDimensions (* CMVideoFormatDescriptionGetDimensions) (
- const CMFormatDescriptionRef desc);
-
- CMTime (* CMTimeMake) (int64_t value, int32_t timescale);
-
- OSStatus (* CMSampleBufferCreate) (CFAllocatorRef allocator,
- CMBlockBufferRef blockBuf, Boolean dataReady,
- void *makeDataReadyCallback,
- void *makeDataReadyRefcon,
- CMFormatDescriptionRef fmtDesc, size_t numSamples,
- size_t numSampleTimingEntries,
- const void *sampleTimingArray,
- size_t numSampleSizeEntries, const size_t *sampleSizeArray,
- CMSampleBufferRef * sampleBuffer);
- Boolean (* CMSampleBufferDataIsReady) (
- const CMSampleBufferRef buf);
- CMBlockBufferRef (* CMSampleBufferGetDataBuffer) (
- const CMSampleBufferRef buf);
- CMFormatDescriptionRef (* CMSampleBufferGetFormatDescription) (
- const CMSampleBufferRef buf);
- CVImageBufferRef (* CMSampleBufferGetImageBuffer) (
- const CMSampleBufferRef buf);
- SInt32 (* CMSampleBufferGetNumSamples) (
- const CMSampleBufferRef buf);
- CFArrayRef (* CMSampleBufferGetSampleAttachmentsArray) (
- const CMSampleBufferRef buf, SInt32 sampleIndex);
- SInt32 (* CMSampleBufferGetSampleSize) (
- const CMSampleBufferRef buf, SInt32 sampleIndex);
- void (* FigSampleBufferRelease) (CMSampleBufferRef buf);
- CMSampleBufferRef (* FigSampleBufferRetain) (CMSampleBufferRef buf);
-
- OSStatus (* CMBlockBufferCreateWithMemoryBlock)
- (CFAllocatorRef allocator, void * memoryBlock, size_t blockLength,
- CFAllocatorRef dataAllocator, void *customBlockSource,
- size_t offsetToData, size_t dataLength,
- int flags, CMBlockBufferRef * blockBuffer);
- SInt32 (* CMBlockBufferGetDataLength) (const CMBlockBufferRef buf);
- OSStatus (* CMBlockBufferGetDataPointer) (
- const CMBlockBufferRef buf, UInt32 unk1, UInt32 unk2, UInt32 unk3,
- Byte ** dataPtr);
- void (* FigBlockBufferRelease) (CMBlockBufferRef buf);
- CMBlockBufferRef (* FigBlockBufferRetain) (CMBlockBufferRef buf);
-
- CMSampleBufferRef (* CMBufferQueueDequeueAndRetain)
- (CMBufferQueueRef queue);
- CFIndex (* CMBufferQueueGetBufferCount) (CMBufferQueueRef queue);
- OSStatus (* CMBufferQueueInstallTrigger) (CMBufferQueueRef queue,
- CMBufferQueueTriggerCallback triggerCallback, void * triggerRefCon,
- CMBufferQueueTriggerCondition triggerCondition, CMTime triggerTime,
- CMBufferQueueTriggerToken * triggerTokenOut);
- Boolean (* CMBufferQueueIsEmpty) (CMBufferQueueRef queue);
- void (* FigBufferQueueRelease) (CMBufferQueueRef queue);
- OSStatus (* CMBufferQueueRemoveTrigger) (CMBufferQueueRef queue,
- CMBufferQueueTriggerToken triggerToken);
- OSStatus (* CMBufferQueueSetValidationCallback) (CMBufferQueueRef queue,
- CMBufferQueueValidationCallback func, void *refCon);
-
- CFStringRef * kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms;
- CFStringRef * kCMSampleAttachmentKey_DependsOnOthers;
- CMTime * kCMTimeInvalid;
-};
-
-struct _GstCMApiClass
-{
- GstDynApiClass parent_class;
-};
-
-GType gst_cm_api_get_type (void);
-
-GstCMApi * gst_cm_api_obtain (GError ** error);
-
-G_END_DECLS
-
-#endif
diff --git a/sys/applemedia-nonpublic/coremediabuffer.c b/sys/applemedia-nonpublic/coremediabuffer.c
deleted file mode 100644
index a8136ba..0000000
--- a/sys/applemedia-nonpublic/coremediabuffer.c
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#include "coremediabuffer.h"
-
-static void
-gst_core_media_meta_free (GstCoreMediaMeta * meta, GstBuffer * buf)
-{
- if (meta->image_buf != NULL) {
- GstCVApi *cv = meta->ctx->cv;
- cv->CVPixelBufferUnlockBaseAddress (meta->image_buf,
- kCVPixelBufferLock_ReadOnly);
- }
- meta->ctx->cm->FigSampleBufferRelease (meta->sample_buf);
- g_object_unref (meta->ctx);
-}
-
-GType
-gst_core_media_meta_api_get_type (void)
-{
- static volatile GType type;
- static const gchar *tags[] = { "memory", NULL };
-
- if (g_once_init_enter (&type)) {
- GType _type = gst_meta_api_type_register ("GstCoreMediaMetaAPI", tags);
- g_once_init_leave (&type, _type);
- }
- return type;
-}
-
-static const GstMetaInfo *
-gst_core_media_meta_get_info (void)
-{
- static const GstMetaInfo *core_media_meta_info = NULL;
-
- if (g_once_init_enter (&core_media_meta_info)) {
- const GstMetaInfo *meta = gst_meta_register (GST_CORE_MEDIA_META_API_TYPE,
- "GstCoreMediaMeta", sizeof (GstCoreMediaMeta),
- (GstMetaInitFunction) NULL,
- (GstMetaFreeFunction) gst_core_media_meta_free,
- (GstMetaTransformFunction) NULL);
- g_once_init_leave (&core_media_meta_info, meta);
- }
- return core_media_meta_info;
-}
-
-GstBuffer *
-gst_core_media_buffer_new (GstCoreMediaCtx * ctx, CMSampleBufferRef sample_buf)
-{
- GstCVApi *cv = ctx->cv;
- GstCMApi *cm = ctx->cm;
- CVImageBufferRef image_buf;
- CVPixelBufferRef pixel_buf;
- CMBlockBufferRef block_buf;
- Byte *data = NULL;
- UInt32 size;
- OSStatus status;
- GstBuffer *buf;
- GstCoreMediaMeta *meta;
-
- image_buf = cm->CMSampleBufferGetImageBuffer (sample_buf);
- pixel_buf = NULL;
- block_buf = cm->CMSampleBufferGetDataBuffer (sample_buf);
-
- if (image_buf != NULL &&
- CFGetTypeID (image_buf) == cv->CVPixelBufferGetTypeID ()) {
- pixel_buf = (CVPixelBufferRef) image_buf;
-
- if (cv->CVPixelBufferLockBaseAddress (pixel_buf,
- kCVPixelBufferLock_ReadOnly) != kCVReturnSuccess) {
- goto error;
- }
-
- if (cv->CVPixelBufferIsPlanar (pixel_buf)) {
- gint plane_count, plane_idx;
-
- data = cv->CVPixelBufferGetBaseAddressOfPlane (pixel_buf, 0);
-
- size = 0;
- plane_count = cv->CVPixelBufferGetPlaneCount (pixel_buf);
- for (plane_idx = 0; plane_idx != plane_count; plane_idx++) {
- size += cv->CVPixelBufferGetBytesPerRowOfPlane (pixel_buf, plane_idx) *
- cv->CVPixelBufferGetHeightOfPlane (pixel_buf, plane_idx);
- }
- } else {
- data = cv->CVPixelBufferGetBaseAddress (pixel_buf);
- size = cv->CVPixelBufferGetBytesPerRow (pixel_buf) *
- cv->CVPixelBufferGetHeight (pixel_buf);
- }
- } else if (block_buf != NULL) {
- status = cm->CMBlockBufferGetDataPointer (block_buf, 0, 0, 0, &data);
- if (status != noErr)
- goto error;
- size = cm->CMBlockBufferGetDataLength (block_buf);
- } else {
- goto error;
- }
-
- buf = gst_buffer_new ();
-
- meta = (GstCoreMediaMeta *) gst_buffer_add_meta (buf,
- gst_core_media_meta_get_info (), NULL);
- meta->ctx = g_object_ref (ctx);
- meta->sample_buf = cm->FigSampleBufferRetain (sample_buf);
- meta->image_buf = image_buf;
- meta->pixel_buf = pixel_buf;
- meta->block_buf = block_buf;
-
- gst_buffer_append_memory (buf,
- gst_memory_new_wrapped (GST_MEMORY_FLAG_NO_SHARE, data,
- size, 0, size, NULL, NULL));
-
- return buf;
-
-error:
- return NULL;
-}
-
-CVPixelBufferRef
-gst_core_media_buffer_get_pixel_buffer (GstBuffer * buf)
-{
- GstCoreMediaMeta *meta = (GstCoreMediaMeta *) gst_buffer_get_meta (buf,
- GST_CORE_MEDIA_META_API_TYPE);
- g_return_val_if_fail (meta != NULL, NULL);
-
- return meta->ctx->cv->CVPixelBufferRetain (meta->pixel_buf);
-}
diff --git a/sys/applemedia-nonpublic/coremediabuffer.h b/sys/applemedia-nonpublic/coremediabuffer.h
deleted file mode 100644
index dffb43f..0000000
--- a/sys/applemedia-nonpublic/coremediabuffer.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#ifndef __GST_CORE_MEDIA_BUFFER_H__
-#define __GST_CORE_MEDIA_BUFFER_H__
-
-#include <gst/gst.h>
-
-#include "coremediactx.h"
-
-G_BEGIN_DECLS
-
-#define GST_CORE_MEDIA_META_API_TYPE (gst_core_media_meta_api_get_type())
-#define gst_buffer_get_core_media_meta(b) \
- ((GstCoreMediaMeta*)gst_buffer_get_meta((b),GST_CORE_MEDIA_META_API_TYPE))
-
-typedef struct _GstCoreMediaMeta
-{
- GstMeta meta;
-
- GstCoreMediaCtx * ctx;
- CMSampleBufferRef sample_buf;
- CVImageBufferRef image_buf;
- CVPixelBufferRef pixel_buf;
- CMBlockBufferRef block_buf;
-} GstCoreMediaMeta;
-
-
-GstBuffer * gst_core_media_buffer_new (GstCoreMediaCtx * ctx,
- CMSampleBufferRef sample_buf);
-CVPixelBufferRef gst_core_media_buffer_get_pixel_buffer
- (GstBuffer * buf);
-GType gst_core_media_meta_api_get_type (void);
-
-G_END_DECLS
-
-#endif /* __GST_CORE_MEDIA_BUFFER_H__ */
diff --git a/sys/applemedia-nonpublic/coremediactx.c b/sys/applemedia-nonpublic/coremediactx.c
deleted file mode 100644
index 2890205..0000000
--- a/sys/applemedia-nonpublic/coremediactx.c
+++ /dev/null
@@ -1,136 +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
-
-#include "coremediactx.h"
-
-#include <gst/gst.h>
-
-typedef struct _GstApiProvider GstApiProvider;
-
-typedef gpointer (*GstApiProviderObtainFunc) (GError ** error);
-
-struct _GstApiProvider
-{
- GstCoreMediaApi api;
- GstApiProviderObtainFunc obtain;
- guint offset;
-};
-
-#define API_PROVIDER(AN, a_n) \
- { GST_API_##AN, (GstApiProviderObtainFunc) gst_##a_n##_api_obtain, \
- G_STRUCT_OFFSET (GstCoreMediaCtx, a_n) }
-
-static const GstApiProvider api_provider[] = {
- API_PROVIDER (CORE_VIDEO, cv),
- API_PROVIDER (CORE_MEDIA, cm),
-#ifdef HAVE_IOS
-#if 0
- API_PROVIDER (MEDIA_TOOLBOX, mt),
- API_PROVIDER (CELESTIAL, cel)
-#endif
-#else
- API_PROVIDER (MIO, mio),
-#endif
-};
-
-G_DEFINE_TYPE (GstCoreMediaCtx, gst_core_media_ctx, G_TYPE_OBJECT);
-
-static void
-gst_core_media_ctx_init (GstCoreMediaCtx * self)
-{
-}
-
-static void
-gst_core_media_ctx_dispose (GObject * object)
-{
- GstCoreMediaCtx *self = GST_CORE_MEDIA_CTX_CAST (object);
- guint i;
-
- for (i = 0; i != G_N_ELEMENTS (api_provider); i++) {
- const GstApiProvider *ap = &api_provider[i];
- gpointer *api_ptr = (gpointer *) ((guint8 *) self + ap->offset);
-
- if (*api_ptr != NULL) {
- g_object_unref (*api_ptr);
- *api_ptr = NULL;
- }
- }
-
- G_OBJECT_CLASS (gst_core_media_ctx_parent_class)->dispose (object);
-}
-
-static void
-gst_core_media_ctx_class_init (GstCoreMediaCtxClass * klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->dispose = gst_core_media_ctx_dispose;
-}
-
-GstCoreMediaCtx *
-gst_core_media_ctx_new (GstCoreMediaApi required_apis, GError ** error)
-{
- GstCoreMediaCtx *ctx;
- GArray *error_messages;
- guint i;
-
- ctx = g_object_new (GST_TYPE_CORE_MEDIA_CTX, NULL);
-
- error_messages = g_array_new (TRUE, FALSE, sizeof (gchar *));
-
- for (i = 0; i != G_N_ELEMENTS (api_provider); i++) {
- const GstApiProvider *ap = &api_provider[i];
-
- if ((required_apis & ap->api) != 0) {
- gpointer *api_ptr = (gpointer *) ((guint8 *) ctx + ap->offset);
- GError *tmp_error = NULL;
-
- *api_ptr = ap->obtain (&tmp_error);
- if (tmp_error != NULL) {
- gchar *message_copy = g_strdup (tmp_error->message);
- g_array_append_val (error_messages, message_copy);
- g_clear_error (&tmp_error);
- }
- }
- }
-
- if (error_messages->len != 0) {
- gchar *errors_joined;
-
- errors_joined = g_strjoinv ("\n\t* ", (gchar **) error_messages->data);
- g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED,
- "Could not obtain required API%s:%s%s",
- (error_messages->len == 1) ? "" : "s",
- (error_messages->len == 1) ? " " : "\n\t* ", errors_joined);
- g_free (errors_joined);
-
- g_object_unref (ctx);
- ctx = NULL;
- }
-
- for (i = 0; i != error_messages->len; i++)
- g_free (g_array_index (error_messages, gchar *, i));
- g_array_free (error_messages, TRUE);
-
- return ctx;
-}
diff --git a/sys/applemedia-nonpublic/coremediactx.h b/sys/applemedia-nonpublic/coremediactx.h
deleted file mode 100644
index 45640bd..0000000
--- a/sys/applemedia-nonpublic/coremediactx.h
+++ /dev/null
@@ -1,93 +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.
- */
-
-#ifndef __GST_CORE_MEDIA_CTX_H__
-#define __GST_CORE_MEDIA_CTX_H__
-
-#include "cvapi.h"
-#include "cmapi.h"
-
-#include "mioapi.h"
-
-#include "mtapi.h"
-#include "celapi.h"
-
-#include <glib.h>
-
-G_BEGIN_DECLS
-
-#define GST_TYPE_CORE_MEDIA_CTX \
- (gst_core_media_ctx_get_type ())
-#define GST_CORE_MEDIA_CTX(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_CORE_MEDIA_CTX, GstCoreMediaCtx))
-#define GST_CORE_MEDIA_CTX_CAST(obj) \
- ((GstCoreMediaCtx *) (obj))
-#define GST_CORE_MEDIA_CTX_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_CORE_MEDIA_CTX, GstCoreMediaCtxClass))
-#define GST_IS_CORE_MEDIA_CTX(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_CORE_MEDIA_CTX))
-#define GST_IS_CORE_MEDIA_CTX_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_CORE_MEDIA_CTX))
-
-typedef struct _GstCoreMediaCtx GstCoreMediaCtx;
-typedef struct _GstCoreMediaCtxClass GstCoreMediaCtxClass;
-
-typedef enum _GstCoreMediaApi GstCoreMediaApi;
-
-struct _GstCoreMediaCtx
-{
- GObject parent;
-
- /* Common */
- GstCVApi *cv;
- GstCMApi *cm;
-
- /* OS X */
- GstMIOApi *mio;
-
- /* iPhone */
- GstMTApi *mt;
- GstCelApi *cel;
-};
-
-struct _GstCoreMediaCtxClass
-{
- GObjectClass parent_class;
-};
-
-enum _GstCoreMediaApi
-{
- GST_API_CORE_VIDEO = (1 << 0),
- GST_API_CORE_MEDIA = (1 << 1),
- GST_API_VIDEO_TOOLBOX = (1 << 2),
-
- GST_API_MIO = (1 << 3),
-
- GST_API_MEDIA_TOOLBOX = (1 << 4),
- GST_API_CELESTIAL = (1 << 5)
-};
-
-GType gst_core_media_ctx_get_type (void);
-
-GstCoreMediaCtx * gst_core_media_ctx_new (GstCoreMediaApi required_apis,
- GError ** error);
-
-G_END_DECLS
-
-#endif
diff --git a/sys/applemedia-nonpublic/corevideobuffer.c b/sys/applemedia-nonpublic/corevideobuffer.c
deleted file mode 100644
index 072fe6b..0000000
--- a/sys/applemedia-nonpublic/corevideobuffer.c
+++ /dev/null
@@ -1,140 +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.
- */
-
-#include "corevideobuffer.h"
-
-static void
-gst_core_video_meta_free (GstCoreVideoMeta * meta, GstBuffer * buf)
-{
- GstCVApi *cv = meta->ctx->cv;
-
- if (meta->pixbuf != NULL) {
- cv->CVPixelBufferUnlockBaseAddress (meta->pixbuf,
- kCVPixelBufferLock_ReadOnly);
- }
-
- cv->CVBufferRelease (meta->cvbuf);
- g_object_unref (meta->ctx);
-}
-
-GType
-gst_core_video_meta_api_get_type (void)
-{
- static volatile GType type;
- static const gchar *tags[] = { "memory", NULL };
-
- if (g_once_init_enter (&type)) {
- GType _type = gst_meta_api_type_register ("GstCoreVideoMetaAPI", tags);
- g_once_init_leave (&type, _type);
- }
- return type;
-}
-
-static const GstMetaInfo *
-gst_core_video_meta_get_info (void)
-{
- static const GstMetaInfo *core_video_meta_info = NULL;
-
- if (g_once_init_enter (&core_video_meta_info)) {
- const GstMetaInfo *meta = gst_meta_register (GST_CORE_VIDEO_META_API_TYPE,
- "GstCoreVideoMeta", sizeof (GstCoreVideoMeta),
- (GstMetaInitFunction) NULL,
- (GstMetaFreeFunction) gst_core_video_meta_free,
- (GstMetaTransformFunction) NULL);
- g_once_init_leave (&core_video_meta_info, meta);
- }
- return core_video_meta_info;
-}
-
-GstBuffer *
-gst_core_video_buffer_new (GstCoreMediaCtx * ctx, CVBufferRef cvbuf,
- GstVideoInfo * vinfo)
-{
- GstCVApi *cv = ctx->cv;
- void *data;
- size_t size;
- CVPixelBufferRef pixbuf = NULL;
- GstBuffer *buf;
- GstCoreVideoMeta *meta;
- guint width, height, n_planes, i;
- gsize offset[GST_VIDEO_MAX_PLANES];
- gint stride[GST_VIDEO_MAX_PLANES];
-
- if (CFGetTypeID (cvbuf) != cv->CVPixelBufferGetTypeID ())
- /* TODO: Do we need to handle other buffer types? */
- goto error;
-
- pixbuf = (CVPixelBufferRef) cvbuf;
-
- if (cv->CVPixelBufferLockBaseAddress (pixbuf,
- kCVPixelBufferLock_ReadOnly) != kCVReturnSuccess) {
- goto error;
- }
-
- buf = gst_buffer_new ();
-
- /* add the corevideo meta to free the underlying corevideo buffer */
- meta = (GstCoreVideoMeta *) gst_buffer_add_meta (buf,
- gst_core_video_meta_get_info (), NULL);
- meta->ctx = g_object_ref (ctx);
- meta->cvbuf = cv->CVBufferRetain (cvbuf);
- meta->pixbuf = pixbuf;
-
- /* set stride, offset and size */
- memset (&offset, 0, sizeof (offset));
- memset (&stride, 0, sizeof (stride));
-
- data = cv->CVPixelBufferGetBaseAddress (pixbuf);
- height = cv->CVPixelBufferGetHeight (pixbuf);
- if (cv->CVPixelBufferIsPlanar (pixbuf)) {
- GstVideoInfo tmp_vinfo;
-
- n_planes = cv->CVPixelBufferGetPlaneCount (pixbuf);
- for (i = 0; i < n_planes; ++i)
- stride[i] = cv->CVPixelBufferGetBytesPerRowOfPlane (pixbuf, i);
-
- /* FIXME: don't hardcode NV12 */
- gst_video_info_init (&tmp_vinfo);
- gst_video_info_set_format (&tmp_vinfo,
- GST_VIDEO_FORMAT_NV12, stride[0], height);
- offset[1] = tmp_vinfo.offset[1];
- size = tmp_vinfo.size;
- } else {
- n_planes = 1;
- size = cv->CVPixelBufferGetBytesPerRow (pixbuf) * height;
- }
-
- gst_buffer_append_memory (buf,
- gst_memory_new_wrapped (GST_MEMORY_FLAG_NO_SHARE, data,
- size, 0, size, NULL, NULL));
-
- if (vinfo) {
- GstVideoMeta *video_meta;
-
- width = vinfo->width;
- video_meta =
- gst_buffer_add_video_meta_full (buf, GST_VIDEO_FRAME_FLAG_NONE,
- GST_VIDEO_FORMAT_NV12, width, height, n_planes, offset, stride);
- }
-
- return buf;
-
-error:
- return NULL;
-}
diff --git a/sys/applemedia-nonpublic/corevideobuffer.h b/sys/applemedia-nonpublic/corevideobuffer.h
deleted file mode 100644
index 844d655..0000000
--- a/sys/applemedia-nonpublic/corevideobuffer.h
+++ /dev/null
@@ -1,51 +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.
- */
-
-#ifndef __GST_CORE_VIDEO_BUFFER_H__
-#define __GST_CORE_VIDEO_BUFFER_H__
-
-#include <gst/gst.h>
-#include <gst/video/video.h>
-#include <gst/video/gstvideometa.h>
-
-#include "coremediactx.h"
-
-G_BEGIN_DECLS
-
-#define GST_CORE_VIDEO_META_API_TYPE (gst_core_video_meta_api_get_type())
-#define gst_buffer_get_core_video_meta(b) \
- ((GstCoreVideoMeta*)gst_buffer_get_meta((b),GST_CORE_VIDEO_META_API_TYPE))
-
-typedef struct _GstCoreVideoMeta
-{
- GstMeta meta;
-
- GstCoreMediaCtx *ctx;
- CVBufferRef cvbuf;
- CVPixelBufferRef pixbuf;
-} GstCoreVideoMeta;
-
-GstBuffer * gst_core_video_buffer_new (GstCoreMediaCtx * ctx,
- CVBufferRef cvbuf,
- GstVideoInfo *info);
-GType gst_core_video_meta_api_get_type (void);
-
-G_END_DECLS
-
-#endif /* __GST_CORE_VIDEO_BUFFER_H__ */
diff --git a/sys/applemedia-nonpublic/cvapi.c b/sys/applemedia-nonpublic/cvapi.c
deleted file mode 100644
index 998428a..0000000
--- a/sys/applemedia-nonpublic/cvapi.c
+++ /dev/null
@@ -1,77 +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.
- */
-
-#include "cvapi.h"
-
-#include "dynapi-internal.h"
-
-#define CV_FRAMEWORK_PATH "/System/Library/Frameworks/CoreVideo.framework/" \
- "CoreVideo"
-
-G_DEFINE_TYPE (GstCVApi, gst_cv_api, GST_TYPE_DYN_API);
-
-static void
-gst_cv_api_init (GstCVApi * self)
-{
-}
-
-static void
-gst_cv_api_class_init (GstCVApiClass * klass)
-{
-}
-
-#define SYM_SPEC(name) GST_DYN_SYM_SPEC (GstCVApi, name)
-#define SYM_SPEC_OPTIONAL(name) GST_DYN_SYM_SPEC_OPTIONAL (GstCVApi, name)
-
-GstCVApi *
-gst_cv_api_obtain (GError ** error)
-{
- static const GstDynSymSpec symbols[] = {
- SYM_SPEC (CVBufferRelease),
- SYM_SPEC (CVBufferRetain),
-
- SYM_SPEC (CVPixelBufferCreateWithBytes),
- SYM_SPEC (CVPixelBufferCreateWithPlanarBytes),
- SYM_SPEC (CVPixelBufferGetBaseAddress),
- SYM_SPEC (CVPixelBufferGetBaseAddressOfPlane),
- SYM_SPEC (CVPixelBufferGetBytesPerRow),
- SYM_SPEC (CVPixelBufferGetBytesPerRowOfPlane),
- SYM_SPEC (CVPixelBufferGetHeight),
- SYM_SPEC (CVPixelBufferGetHeightOfPlane),
- SYM_SPEC_OPTIONAL (CVPixelBufferGetIOSurface),
- SYM_SPEC (CVPixelBufferGetPlaneCount),
- SYM_SPEC (CVPixelBufferGetTypeID),
- SYM_SPEC (CVPixelBufferIsPlanar),
- SYM_SPEC (CVPixelBufferLockBaseAddress),
- SYM_SPEC (CVPixelBufferRelease),
- SYM_SPEC (CVPixelBufferRetain),
- SYM_SPEC (CVPixelBufferUnlockBaseAddress),
-
- SYM_SPEC (kCVPixelBufferPixelFormatTypeKey),
- SYM_SPEC (kCVPixelBufferWidthKey),
- SYM_SPEC (kCVPixelBufferHeightKey),
- SYM_SPEC (kCVPixelBufferBytesPerRowAlignmentKey),
- SYM_SPEC (kCVPixelBufferPlaneAlignmentKey),
-
- {NULL, 0},
- };
-
- return _gst_dyn_api_new (gst_cv_api_get_type (), CV_FRAMEWORK_PATH, symbols,
- error);
-}
diff --git a/sys/applemedia-nonpublic/cvapi.h b/sys/applemedia-nonpublic/cvapi.h
deleted file mode 100644
index 63c8cba..0000000
--- a/sys/applemedia-nonpublic/cvapi.h
+++ /dev/null
@@ -1,126 +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.
- */
-
-#ifndef __GST_CV_API_H__
-#define __GST_CV_API_H__
-
-#include "dynapi.h"
-
-#include <CoreFoundation/CoreFoundation.h>
-
-G_BEGIN_DECLS
-
-typedef struct _GstCVApi GstCVApi;
-typedef struct _GstCVApiClass GstCVApiClass;
-
-typedef int32_t CVReturn;
-
-typedef uint64_t CVOptionFlags;
-
-typedef struct _CVBuffer * CVBufferRef;
-typedef CVBufferRef CVImageBufferRef;
-typedef CVImageBufferRef CVPixelBufferRef;
-
-typedef void (* CVPixelBufferReleaseBytesCallback) (void * releaseRefCon,
- const void * baseAddress);
-
-enum _CVReturn
-{
- kCVReturnSuccess = 0
-};
-
-enum _CVPixelFormatType
-{
- kCVPixelFormatType_420YpCbCr8Planar = 'y420',
- kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange = '420v',
- kCVPixelFormatType_422YpCbCr8Deprecated = 'yuvs',
- kCVPixelFormatType_422YpCbCr8 = '2vuy'
-};
-
-enum _CVPixelBufferLockFlags
-{
- kCVPixelBufferLock_ReadOnly = 0x00000001
-};
-
-struct _GstCVApi
-{
- GstDynApi parent;
-
- void (* CVBufferRelease) (CVBufferRef buffer);
- CVBufferRef (* CVBufferRetain) (CVBufferRef buffer);
-
- CVReturn (* CVPixelBufferCreateWithBytes)
- (CFAllocatorRef allocator, size_t width, size_t height,
- OSType pixelFormatType, void * baseAddress, size_t bytesPerRow,
- CVPixelBufferReleaseBytesCallback releaseCallback,
- void * releaseRefCon, CFDictionaryRef pixelBufferAttributes,
- CVPixelBufferRef * pixelBufferOut);
- CVReturn (* CVPixelBufferCreateWithPlanarBytes)
- (CFAllocatorRef allocator, size_t width, size_t height,
- OSType pixelFormatType, void * dataPtr, size_t dataSize,
- size_t numberOfPlanes, void *planeBaseAddress[],
- size_t planeWidth[], size_t planeHeight[],
- size_t planeBytesPerRow[],
- CVPixelBufferReleaseBytesCallback releaseCallback,
- void * releaseRefCon, CFDictionaryRef pixelBufferAttributes,
- CVPixelBufferRef * pixelBufferOut);
- void * (* CVPixelBufferGetBaseAddress)
- (CVPixelBufferRef pixelBuffer);
- void * (* CVPixelBufferGetBaseAddressOfPlane)
- (CVPixelBufferRef pixelBuffer, size_t planeIndex);
- size_t (* CVPixelBufferGetBytesPerRow)
- (CVPixelBufferRef pixelBuffer);
- size_t (* CVPixelBufferGetBytesPerRowOfPlane)
- (CVPixelBufferRef pixelBuffer, size_t planeIndex);
- size_t (* CVPixelBufferGetHeight) (CVPixelBufferRef pixelBuffer);
- size_t (* CVPixelBufferGetHeightOfPlane)
- (CVPixelBufferRef pixelBuffer, size_t planeIndex);
- void * (* CVPixelBufferGetIOSurface)
- (CVPixelBufferRef pixelBuffer);
- size_t (* CVPixelBufferGetPlaneCount)
- (CVPixelBufferRef pixelBuffer);
- CFTypeID (* CVPixelBufferGetTypeID) (void);
- Boolean (* CVPixelBufferIsPlanar) (CVPixelBufferRef pixelBuffer);
- CVReturn (* CVPixelBufferLockBaseAddress)
- (CVPixelBufferRef pixelBuffer, CVOptionFlags lockFlags);
- void (* CVPixelBufferRelease) (CVPixelBufferRef pixelBuffer);
- CVPixelBufferRef (* CVPixelBufferRetain)
- (CVPixelBufferRef pixelBuffer);
- CVReturn (* CVPixelBufferUnlockBaseAddress)
- (CVPixelBufferRef pixelBuffer, CVOptionFlags unlockFlags);
-
- CFStringRef * kCVPixelBufferPixelFormatTypeKey;
- CFStringRef * kCVPixelBufferWidthKey;
- CFStringRef * kCVPixelBufferHeightKey;
- CFStringRef * kCVPixelBufferBytesPerRowAlignmentKey;
- CFStringRef * kCVPixelBufferPlaneAlignmentKey;
-};
-
-struct _GstCVApiClass
-{
- GstDynApiClass parent_class;
-};
-
-GType gst_cv_api_get_type (void);
-
-GstCVApi * gst_cv_api_obtain (GError ** error);
-
-G_END_DECLS
-
-#endif
diff --git a/sys/applemedia-nonpublic/dynapi-internal.h b/sys/applemedia-nonpublic/dynapi-internal.h
deleted file mode 100644
index adcd4f1..0000000
--- a/sys/applemedia-nonpublic/dynapi-internal.h
+++ /dev/null
@@ -1,42 +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.
- */
-
-#ifndef __GST_DYN_API_INTERNAL_H__
-#define __GST_DYN_API_INTERNAL_H__
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-typedef struct _GstDynSymSpec GstDynSymSpec;
-
-struct _GstDynSymSpec
-{
- const gchar * name;
- guint offset;
- gboolean is_required;
-};
-
-gpointer _gst_dyn_api_new (GType derived_type, const gchar * filename,
- const GstDynSymSpec * symbols, GError ** error);
-
-G_END_DECLS
-
-#endif
-
diff --git a/sys/applemedia-nonpublic/dynapi.c b/sys/applemedia-nonpublic/dynapi.c
deleted file mode 100644
index 2317f80..0000000
--- a/sys/applemedia-nonpublic/dynapi.c
+++ /dev/null
@@ -1,193 +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.
- */
-
-#include "dynapi.h"
-
-#include "dynapi-internal.h"
-
-#include <gmodule.h>
-#include <gst/gst.h>
-
-GST_DEBUG_CATEGORY (gst_dyn_api_debug);
-#define GST_CAT_DEFAULT gst_dyn_api_debug
-
-enum
-{
- PROP_0,
- PROP_FILENAME
-};
-
-struct _GstDynApiPrivate
-{
- gchar *filename;
- GModule *module;
-};
-
-G_DEFINE_TYPE (GstDynApi, gst_dyn_api, G_TYPE_OBJECT);
-
-static void
-gst_dyn_api_init (GstDynApi * self)
-{
- self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GST_TYPE_DYN_API,
- GstDynApiPrivate);
-}
-
-static void
-gst_dyn_api_dispose (GObject * object)
-{
- GstDynApi *self = GST_DYN_API_CAST (object);
- GstDynApiPrivate *priv = self->priv;
-
- if (priv->module != NULL) {
- g_module_close (priv->module);
- priv->module = NULL;
- }
-
- G_OBJECT_CLASS (gst_dyn_api_parent_class)->dispose (object);
-}
-
-static void
-gst_dyn_api_finalize (GObject * object)
-{
- GstDynApi *self = GST_DYN_API_CAST (object);
- GstDynApiPrivate *priv = self->priv;
-
- g_free (priv->filename);
-
- G_OBJECT_CLASS (gst_dyn_api_parent_class)->finalize (object);
-}
-
-static void
-gst_dyn_api_get_property (GObject * object, guint prop_id,
- GValue * value, GParamSpec * pspec)
-{
- GstDynApi *self = GST_DYN_API (object);
-
- switch (prop_id) {
- case PROP_FILENAME:
- g_value_set_string (value, self->priv->filename);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gst_dyn_api_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec)
-{
- GstDynApi *self = GST_DYN_API (object);
-
- switch (prop_id) {
- case PROP_FILENAME:
- g_free (self->priv->filename);
- self->priv->filename = g_value_dup_string (value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gst_dyn_api_class_init (GstDynApiClass * klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->dispose = gst_dyn_api_dispose;
- gobject_class->finalize = gst_dyn_api_finalize;
- gobject_class->get_property = gst_dyn_api_get_property;
- gobject_class->set_property = gst_dyn_api_set_property;
-
- g_type_class_add_private (klass, sizeof (GstDynApiPrivate));
-
- g_object_class_install_property (gobject_class, PROP_FILENAME,
- g_param_spec_string ("filename", "Filename", "Filename", NULL,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-}
-
-gpointer
-_gst_dyn_api_new (GType derived_type, const gchar * filename,
- const GstDynSymSpec * symbols, GError ** error)
-{
- GstDynApi *api;
- GstDynApiPrivate *priv;
- guint i;
- GArray *names_not_found;
-
- api = g_object_new (derived_type, "filename", filename, NULL);
- priv = api->priv;
-
- priv->module = g_module_open (priv->filename, 0);
- if (priv->module == NULL)
- goto open_failed;
-
- names_not_found = g_array_new (TRUE, FALSE, sizeof (gchar *));
-
- for (i = 0; symbols[i].name != NULL; i++) {
- const GstDynSymSpec *s = &symbols[i];
- if (!g_module_symbol (priv->module, s->name,
- (gpointer *) (((guint8 *) api) + s->offset)) && s->is_required) {
- g_array_append_val (names_not_found, s->name);
- }
- }
-
- if (names_not_found->len > 0)
- goto one_or_more_name_not_found;
-
- g_array_free (names_not_found, TRUE);
-
- return api;
-
- /* ERRORS */
-open_failed:
- {
- gchar *basename;
-
- basename = g_path_get_basename (filename);
- g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED,
- "failed to open %s", basename);
- g_free (basename);
-
- goto any_error;
- }
-one_or_more_name_not_found:
- {
- gchar *basename, *names_joined;
-
- basename = g_path_get_basename (filename);
- names_joined = g_strjoinv (", ", (gchar **) names_not_found->data);
- g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED,
- "missing %u symbol%s in %s: %s",
- names_not_found->len, (names_not_found->len == 1) ? "" : "s",
- basename, names_joined);
- g_free (names_joined);
- g_free (basename);
- g_array_free (names_not_found, TRUE);
-
- goto any_error;
- }
-any_error:
- {
- g_object_unref (api);
-
- return NULL;
- }
-}
diff --git a/sys/applemedia-nonpublic/dynapi.h b/sys/applemedia-nonpublic/dynapi.h
deleted file mode 100644
index b8eda85..0000000
--- a/sys/applemedia-nonpublic/dynapi.h
+++ /dev/null
@@ -1,65 +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.
- */
-
-#ifndef __GST_DYN_API_H__
-#define __GST_DYN_API_H__
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define GST_TYPE_DYN_API \
- (gst_dyn_api_get_type ())
-#define GST_DYN_API(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DYN_API, GstDynApi))
-#define GST_DYN_API_CAST(obj) \
- ((GstDynApi *) (obj))
-#define GST_DYN_API_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DYN_API, GstDynApiClass))
-#define GST_IS_DYN_API(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DYN_API))
-#define GST_IS_DYN_API_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DYN_API))
-
-#define GST_DYN_SYM_SPEC(type, name) \
- { G_STRINGIFY (name), G_STRUCT_OFFSET (type, name), TRUE }
-#define GST_DYN_SYM_SPEC_OPTIONAL(type, name) \
- { G_STRINGIFY (name), G_STRUCT_OFFSET (type, name), FALSE }
-
-typedef struct _GstDynApi GstDynApi;
-typedef struct _GstDynApiClass GstDynApiClass;
-typedef struct _GstDynApiPrivate GstDynApiPrivate;
-
-struct _GstDynApi
-{
- GObject parent;
-
- GstDynApiPrivate * priv;
-};
-
-struct _GstDynApiClass
-{
- GObjectClass parent_class;
-};
-
-GType gst_dyn_api_get_type (void);
-
-G_END_DECLS
-
-#endif
diff --git a/sys/applemedia-nonpublic/mioapi.c b/sys/applemedia-nonpublic/mioapi.c
deleted file mode 100644
index 30d3d35..0000000
--- a/sys/applemedia-nonpublic/mioapi.c
+++ /dev/null
@@ -1,234 +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.
- */
-
-#include "mioapi.h"
-
-#include "dynapi-internal.h"
-
-#define MIO_FRAMEWORK_PATH "/System/Library/PrivateFrameworks/" \
- "CoreMediaIOServices.framework/CoreMediaIOServices"
-
-GType gst_mio_api_get_type (void);
-
-G_DEFINE_TYPE (GstMIOApi, gst_mio_api, GST_TYPE_DYN_API);
-
-static void
-gst_mio_api_init (GstMIOApi * self)
-{
-}
-
-static void
-gst_mio_api_class_init (GstMIOApiClass * klass)
-{
-}
-
-#define SYM_SPEC(name) GST_DYN_SYM_SPEC (GstMIOApi, name)
-
-GstMIOApi *
-gst_mio_api_obtain (GError ** error)
-{
- static const GstDynSymSpec symbols[] = {
- SYM_SPEC (TundraGraphCreate),
- SYM_SPEC (TundraGraphRelease),
- SYM_SPEC (TundraGraphCreateNode),
- SYM_SPEC (TundraGraphGetNodeInfo),
- SYM_SPEC (TundraGraphSetProperty),
- SYM_SPEC (TundraGraphConnectNodeInput),
- SYM_SPEC (TundraGraphInitialize),
- SYM_SPEC (TundraGraphUninitialize),
- SYM_SPEC (TundraGraphStart),
- SYM_SPEC (TundraGraphStop),
-
- SYM_SPEC (TundraObjectGetPropertyDataSize),
- SYM_SPEC (TundraObjectGetPropertyData),
- SYM_SPEC (TundraObjectIsPropertySettable),
- SYM_SPEC (TundraObjectSetPropertyData),
-
- SYM_SPEC (kTundraSampleBufferAttachmentKey_SequenceNumber),
- SYM_SPEC (kTundraSampleBufferAttachmentKey_HostTime),
-
- {NULL, 0},
- };
-
- return _gst_dyn_api_new (gst_mio_api_get_type (), MIO_FRAMEWORK_PATH, symbols,
- error);
-}
-
-gpointer
-gst_mio_object_get_pointer (gint obj, TundraTargetSpec * pspec, GstMIOApi * mio)
-{
- gpointer ptr;
- guint sz;
- TundraStatus status;
-
- sz = sizeof (ptr);
- status = mio->TundraObjectGetPropertyData (obj, pspec, 0, NULL, &sz, &ptr);
- if (status != kTundraSuccess)
- goto error;
-
- return ptr;
-
-error:
- return NULL;
-}
-
-gchar *
-gst_mio_object_get_string (gint obj, TundraTargetSpec * pspec, GstMIOApi * mio)
-{
- gchar *result = NULL;
- CFStringRef str;
- guint size;
- TundraStatus status;
- CFRange range;
-
- size = sizeof (str);
- status = mio->TundraObjectGetPropertyData (obj, pspec, 0, NULL, &size, &str);
- if (status != kTundraSuccess)
- goto error;
-
- range.location = 0;
- range.length = CFStringGetLength (str);
- result = g_malloc0 (range.length + 1);
- CFStringGetBytes (str, range, kCFStringEncodingUTF8, 0, FALSE,
- (UInt8 *) result, range.length, NULL);
- CFRelease (str);
-
- return result;
-
-error:
- return NULL;
-}
-
-guint32
-gst_mio_object_get_uint32 (gint obj, TundraTargetSpec * pspec, GstMIOApi * mio)
-{
- guint32 val;
- guint size;
- TundraStatus status;
-
- size = sizeof (val);
- status = mio->TundraObjectGetPropertyData (obj, pspec, 0, NULL, &size, &val);
- if (status != kTundraSuccess)
- goto error;
-
- return val;
-
-error:
- return 0;
-}
-
-GArray *
-gst_mio_object_get_array (gint obj, TundraTargetSpec * pspec,
- guint element_size, GstMIOApi * mio)
-{
- return gst_mio_object_get_array_full (obj, pspec, 0, NULL, element_size, mio);
-}
-
-GArray *
-gst_mio_object_get_array_full (gint obj, TundraTargetSpec * pspec,
- guint ctx_size, gpointer ctx, guint element_size, GstMIOApi * mio)
-{
- GArray *arr = NULL;
- guint size, num_elements;
- TundraStatus status;
-
- status = mio->TundraObjectGetPropertyDataSize (obj, pspec, ctx_size, ctx,
- &size);
- if (status != kTundraSuccess)
- goto error;
- else if (size % element_size != 0)
- goto error;
-
- num_elements = size / element_size;
- arr = g_array_sized_new (FALSE, TRUE, element_size, num_elements);
- g_array_set_size (arr, num_elements);
-
- status = mio->TundraObjectGetPropertyData (obj, pspec, ctx_size, ctx,
- &size, arr->data);
- if (status != kTundraSuccess)
- goto error;
-
- return arr;
-
-error:
- if (arr != NULL)
- g_array_free (arr, TRUE);
- return NULL;
-}
-
-gchar *
-gst_mio_object_get_fourcc (gint obj, TundraTargetSpec * pspec, GstMIOApi * mio)
-{
- guint32 fcc;
- guint size;
- TundraStatus status;
-
- size = sizeof (fcc);
- status = mio->TundraObjectGetPropertyData (obj, pspec, 0, NULL, &size, &fcc);
- if (status != kTundraSuccess)
- goto error;
-
- return gst_mio_fourcc_to_string (fcc);
-
-error:
- return NULL;
-}
-
-gpointer
-gst_mio_object_get_raw (gint obj, TundraTargetSpec * pspec, guint * size,
- GstMIOApi * mio)
-{
- gpointer data = NULL;
- guint sz;
- TundraStatus status;
-
- status = mio->TundraObjectGetPropertyDataSize (obj, pspec, 0, NULL, &sz);
- if (status != kTundraSuccess)
- goto error;
-
- data = g_malloc0 (sz);
-
- status = mio->TundraObjectGetPropertyData (obj, pspec, 0, NULL, &sz, data);
- if (status != kTundraSuccess)
- goto error;
-
- if (size != NULL)
- *size = sz;
- return data;
-
-error:
- g_free (data);
- if (size != NULL)
- *size = 0;
- return NULL;
-}
-
-gchar *
-gst_mio_fourcc_to_string (guint32 fcc)
-{
- gchar *result;
-
- result = g_malloc0 (5);
- result[0] = (fcc >> 24) & 0xff;
- result[1] = (fcc >> 16) & 0xff;
- result[2] = (fcc >> 8) & 0xff;
- result[3] = (fcc >> 0) & 0xff;
-
- return result;
-}
diff --git a/sys/applemedia-nonpublic/mioapi.h b/sys/applemedia-nonpublic/mioapi.h
deleted file mode 100644
index fe2cbd8..0000000
--- a/sys/applemedia-nonpublic/mioapi.h
+++ /dev/null
@@ -1,248 +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.
- */
-
-#ifndef __GST_MIO_API_H__
-#define __GST_MIO_API_H__
-
-#include "cmapi.h"
-
-#include <CoreFoundation/CoreFoundation.h>
-
-G_BEGIN_DECLS
-
-typedef struct _GstMIOApi GstMIOApi;
-typedef struct _GstMIOApiClass GstMIOApiClass;
-
-#define TUNDRA_SYSTEM_OBJECT_ID 1
-
-typedef int TundraObjectID;
-typedef int TundraDeviceID;
-typedef int TundraUnitID;
-
-typedef enum _TundraStatus TundraStatus;
-typedef enum _TundraVendor TundraVendor;
-typedef enum _TundraScope TundraScope;
-typedef enum _TundraUnit TundraUnit;
-typedef enum _TundraProperty TundraProperty;
-
-typedef enum _TundraDeviceTransportType TundraDeviceTransportType;
-
-typedef struct _TundraTargetSpec TundraTargetSpec;
-typedef struct _TundraFramerate TundraFramerate;
-
-typedef struct _TundraGraph TundraGraph;
-typedef struct _TundraNode TundraNode;
-
-typedef struct _TundraOutputDelegate TundraOutputDelegate;
-
-enum _TundraStatus
-{
- kTundraSuccess = 0,
- kTundraNotSupported = -67456
-};
-
-enum _TundraVendor
-{
- kTundraVendorApple = 'appl'
-};
-
-enum _TundraScope
-{
- kTundraScopeGlobal = 'glob',
- kTundraScopeDAL = 'dal ',
- kTundraScope2PRC = '2prc', /* TODO: Investigate this one */
- kTundraScopeInput = 'inpt',
- kTundraScopeVSyn = 'vsyn'
-};
-
-enum _TundraUnit
-{
- kTundraUnitInput = 'tinp',
- kTundraUnitOutput = 'tout',
- kTundraUnitSync = 'tefc'
-};
-
-enum _TundraProperty
-{
- kTundraSystemPropertyDevices = 'dev#',
-
- kTundraObjectPropertyClass = 'clas',
- kTundraObjectPropertyCreator = 'oplg',
- kTundraObjectPropertyName = 'lnam',
- kTundraObjectPropertyUID = 'uid ',
- kTundraObjectPropertyVendor = 'lmak',
-
- kTundraDevicePropertyConfigApp = 'capp', /* CFString: com.apple.mediaio.TundraDeviceSetup */
- kTundraDevicePropertyExclusiveMode = 'ixna',
- kTundraDevicePropertyHogMode = 'oink',
- kTundraDevicePropertyModelUID = 'muid',
- kTundraDevicePropertyStreams = 'stm#',
- kTundraDevicePropertySuspendedByUser = 'sbyu',
- kTundraDevicePropertyTransportType = 'tran',
-
- kTundraStreamPropertyFormatDescriptions = 'pfta',
- kTundraStreamPropertyFormatDescription = 'pft ',
- kTundraStreamPropertyFrameRates = 'nfr#',
- kTundraStreamPropertyFrameRate = 'nfrt'
-};
-
-struct _TundraTargetSpec
-{
- FourCharCode name;
- FourCharCode scope;
- FourCharCode vendor;
- FourCharCode unk1;
- FourCharCode unk2;
-};
-
-struct _TundraFramerate
-{
- gdouble value;
-};
-
-enum _TundraUnitProperty
-{
- kTundraInputPropertyDeviceID = 302,
-
- kTundraOutputPropertyDelegate = 5903,
-
- kTundraInputUnitProperty_SourcePath = 6780,
-
- kTundraSyncPropertyClockProvider = 7100,
- kTundraSyncPropertyMasterSynchronizer = 7102,
- kTundraSyncPropertySynchronizationDirection = 7104
-};
-
-enum _TundraDeviceTransportType
-{
- kTundraDeviceTransportInvalid = 0,
- kTundraDeviceTransportBuiltin = 'bltn',
- kTundraDeviceTransportScreen = 'scrn',
- kTundraDeviceTransportUSB = 'usb ',
-};
-
-typedef TundraStatus (* TundraOutputRenderFunc) (gpointer instance,
- gpointer unk1, gpointer unk2, gpointer unk3, CMSampleBufferRef sampleBuf);
-typedef TundraStatus (* TundraOutputInitializeFunc) (gpointer instance);
-typedef TundraStatus (* TundraOutputUninitializeFunc) (gpointer instance);
-typedef TundraStatus (* TundraOutputStartFunc) (gpointer instance);
-typedef TundraStatus (* TundraOutputStopFunc) (gpointer instance);
-typedef TundraStatus (* TundraOutputResetFunc) (gpointer instance);
-typedef TundraStatus (* TundraOutputDeallocateFunc) (gpointer instance);
-typedef gboolean (* TundraOutputCanRenderNowFunc) (gpointer instance,
- guint * unk);
-typedef CFArrayRef (* TundraOutputAvailableFormatsFunc) (gpointer instance,
- gboolean ensureOnly);
-typedef TundraStatus (* TundraOutputCopyClockFunc) (gpointer instance);
-typedef TundraStatus (* TundraOutputGetPropertyInfoFunc) (gpointer instance,
- guint propId);
-typedef TundraStatus (* TundraOutputGetPropertyFunc) (gpointer instance,
- guint propId);
-typedef TundraStatus (* TundraOutputSetPropertyFunc) (gpointer instance,
- guint propId);
-
-#pragma pack(push, 1)
-
-struct _TundraOutputDelegate
-{
- int unk1;
- gpointer instance;
- TundraOutputRenderFunc Render;
- TundraOutputInitializeFunc Initialize;
- TundraOutputUninitializeFunc Uninitialize;
- TundraOutputStartFunc Start;
- TundraOutputStopFunc Stop;
- TundraOutputResetFunc Reset;
- TundraOutputDeallocateFunc Deallocate;
- TundraOutputCanRenderNowFunc CanRenderNow;
- TundraOutputAvailableFormatsFunc AvailableFormats;
- TundraOutputCopyClockFunc CopyClock;
- TundraOutputGetPropertyInfoFunc GetPropertyInfo;
- TundraOutputGetPropertyFunc GetProperty;
- TundraOutputSetPropertyFunc SetProperty;
-};
-
-#pragma pack(pop)
-
-struct _GstMIOApi
-{
- GstDynApi parent;
-
- TundraStatus (* TundraGraphCreate) (CFAllocatorRef allocator,
- TundraGraph ** graph);
- void (* TundraGraphRelease) (TundraGraph * graph);
- TundraStatus (* TundraGraphCreateNode) (TundraGraph * graph,
- gint nodeId, UInt32 unk1, UInt32 unk2, TundraTargetSpec * spec,
- UInt32 unk3, TundraUnitID * node);
- TundraStatus (* TundraGraphGetNodeInfo) (TundraGraph * graph,
- gint nodeId, UInt32 unk1, UInt32 unk2, UInt32 unk3, UInt32 unk4,
- gpointer * info);
- TundraStatus (* TundraGraphSetProperty) (TundraGraph * graph,
- gint nodeId, UInt32 unk1, guint propId, UInt32 unk2, UInt32 unk3,
- gpointer data, guint size);
- TundraStatus (* TundraGraphConnectNodeInput) (TundraGraph * graph,
- TundraUnitID from_node, guint from_bus,
- TundraUnitID to_node, guint to_bus);
- TundraStatus (* TundraGraphInitialize) (TundraGraph * graph);
- TundraStatus (* TundraGraphUninitialize) (TundraGraph * graph);
- TundraStatus (* TundraGraphStart) (TundraGraph * graph);
- TundraStatus (* TundraGraphStop) (TundraGraph * graph);
-
- TundraStatus (* TundraObjectGetPropertyDataSize) (TundraObjectID obj,
- TundraTargetSpec * spec, UInt32 contextSize, void * context, guint * size);
- TundraStatus (* TundraObjectGetPropertyData) (TundraObjectID obj,
- TundraTargetSpec * spec, UInt32 contextSize, void * context, guint * size,
- gpointer data);
- TundraStatus (* TundraObjectIsPropertySettable) (TundraObjectID obj,
- TundraTargetSpec * spec, Boolean *isSettable);
- TundraStatus (* TundraObjectSetPropertyData) (TundraObjectID obj,
- TundraTargetSpec * spec, gpointer unk1, gpointer unk2, guint size,
- gpointer data);
-
- CFStringRef * kTundraSampleBufferAttachmentKey_SequenceNumber;
- CFStringRef * kTundraSampleBufferAttachmentKey_HostTime;
-};
-
-struct _GstMIOApiClass
-{
- GstDynApiClass parent_class;
-};
-
-GstMIOApi * gst_mio_api_obtain (GError ** error);
-
-gpointer gst_mio_object_get_pointer (gint obj, TundraTargetSpec * pspec,
- GstMIOApi * mio);
-gchar * gst_mio_object_get_string (gint obj, TundraTargetSpec * pspec,
- GstMIOApi * mio);
-guint32 gst_mio_object_get_uint32 (gint obj, TundraTargetSpec * pspec,
- GstMIOApi * mio);
-gchar * gst_mio_object_get_fourcc (gint obj, TundraTargetSpec * pspec,
- GstMIOApi * mio);
-GArray * gst_mio_object_get_array (gint obj, TundraTargetSpec * pspec,
- guint element_size, GstMIOApi * mio);
-GArray * gst_mio_object_get_array_full (gint obj, TundraTargetSpec * pspec,
- guint ctx_size, gpointer ctx, guint element_size, GstMIOApi * mio);
-gpointer gst_mio_object_get_raw (gint obj, TundraTargetSpec * pspec,
- guint * size, GstMIOApi * mio);
-
-gchar * gst_mio_fourcc_to_string (guint32 fcc);
-
-G_END_DECLS
-
-#endif
diff --git a/sys/applemedia-nonpublic/miovideodevice.h b/sys/applemedia-nonpublic/miovideodevice.h
deleted file mode 100644
index 87b86f3..0000000
--- a/sys/applemedia-nonpublic/miovideodevice.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#ifndef __GST_MIO_VIDEO_DEVICE_H__
-#define __GST_MIO_VIDEO_DEVICE_H__
-
-#include <gst/gst.h>
-
-#include "coremediactx.h"
-
-G_BEGIN_DECLS
-
-#define GST_TYPE_MIO_VIDEO_DEVICE \
- (gst_mio_video_device_get_type ())
-#define GST_MIO_VIDEO_DEVICE(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MIO_VIDEO_DEVICE, GstMIOVideoDevice))
-#define GST_MIO_VIDEO_DEVICE_CAST(obj) \
- ((GstMIOVideoDevice *) (obj))
-#define GST_MIO_VIDEO_DEVICE_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MIO_VIDEO_DEVICE, GstMIOVideoDeviceClass))
-#define GST_IS_MIO_VIDEO_DEVICE(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MIO_VIDEO_DEVICE))
-#define GST_IS_MIO_VIDEO_DEVICE_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MIO_VIDEO_DEVICE))
-
-typedef struct _GstMIOVideoDevice GstMIOVideoDevice;
-typedef struct _GstMIOVideoDeviceClass GstMIOVideoDeviceClass;
-
-struct _GstMIOVideoDevice
-{
- GObject parent;
-
- GstCoreMediaCtx *ctx;
- TundraObjectID handle;
-
- gchar *cached_uid;
- gchar *cached_name;
- TundraDeviceTransportType cached_transport;
- GstCaps *cached_caps;
- CMFormatDescriptionRef selected_format;
- gint selected_fps_n, selected_fps_d;
-};
-
-struct _GstMIOVideoDeviceClass
-{
- GObjectClass parent_class;
-};
-
-GType gst_mio_video_device_get_type (void);
-
-TundraObjectID gst_mio_video_device_get_handle (GstMIOVideoDevice * self);
-const gchar * gst_mio_video_device_get_uid (GstMIOVideoDevice * self);
-const gchar * gst_mio_video_device_get_name (GstMIOVideoDevice * self);
-TundraDeviceTransportType gst_mio_video_device_get_transport_type (
- GstMIOVideoDevice * self);
-
-gboolean gst_mio_video_device_open (GstMIOVideoDevice * self);
-void gst_mio_video_device_close (GstMIOVideoDevice * self);
-
-GstCaps * gst_mio_video_device_get_available_caps (GstMIOVideoDevice * self);
-gboolean gst_mio_video_device_set_caps (GstMIOVideoDevice * self,
- GstCaps * caps);
-CMFormatDescriptionRef gst_mio_video_device_get_selected_format (
- GstMIOVideoDevice * self);
-GstClockTime gst_mio_video_device_get_duration (GstMIOVideoDevice * self);
-
-void gst_mio_video_device_print_debug_info (GstMIOVideoDevice * self);
-
-GList * gst_mio_video_device_list_create (GstCoreMediaCtx * ctx);
-void gst_mio_video_device_list_destroy (GList * devices);
-
-G_END_DECLS
-
-#endif /* __GST_MIO_VIDEO_DEVICE_H__ */
diff --git a/sys/applemedia-nonpublic/miovideosrc.h b/sys/applemedia-nonpublic/miovideosrc.h
deleted file mode 100644
index 3fe82e7..0000000
--- a/sys/applemedia-nonpublic/miovideosrc.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#ifndef __GST_MIO_VIDEO_SRC_H__
-#define __GST_MIO_VIDEO_SRC_H__
-
-#include <gst/base/gstpushsrc.h>
-
-#include "coremediactx.h"
-#include "miovideodevice.h"
-
-G_BEGIN_DECLS
-
-#define GST_TYPE_MIO_VIDEO_SRC \
- (gst_mio_video_src_get_type ())
-#define GST_MIO_VIDEO_SRC(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MIO_VIDEO_SRC, GstMIOVideoSrc))
-#define GST_MIO_VIDEO_SRC_CAST(obj) \
- ((GstMIOVideoSrc *) (obj))
-#define GST_MIO_VIDEO_SRC_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MIO_VIDEO_SRC, GstMIOVideoSrcClass))
-#define GST_IS_MIO_VIDEO_SRC(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MIO_VIDEO_SRC))
-#define GST_IS_MIO_VIDEO_SRC_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MIO_VIDEO_SRC))
-
-typedef struct _GstMIOVideoSrc GstMIOVideoSrc;
-typedef struct _GstMIOVideoSrcClass GstMIOVideoSrcClass;
-
-struct _GstMIOVideoSrc
-{
- GstPushSrc push_src;
-
- gint cv_ratio_n;
- gint cv_ratio_d;
-
- gchar *device_uid;
- gchar *device_name;
- gint device_index;
-
- GThread *dispatcher_thread;
- GMainLoop *dispatcher_loop;
- GMainContext *dispatcher_ctx;
-
- GstCoreMediaCtx *ctx;
- GstMIOVideoDevice *device;
-
- TundraGraph *graph;
-
- volatile gboolean running;
- GQueue *queue;
- GMutex *qlock;
- GCond *qcond;
- guint64 prev_offset;
- CMFormatDescriptionRef prev_format;
-};
-
-struct _GstMIOVideoSrcClass
-{
- GstPushSrcClass parent_class;
-};
-
-GType gst_mio_video_src_get_type (void);
-
-G_END_DECLS
-
-#endif /* __GST_MIO_VIDEO_SRC_H__ */
diff --git a/sys/applemedia-nonpublic/mtapi.h b/sys/applemedia-nonpublic/mtapi.h
deleted file mode 100644
index 91d90e9..0000000
--- a/sys/applemedia-nonpublic/mtapi.h
+++ /dev/null
@@ -1,96 +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.
- */
-
-#ifndef __GST_MT_API_H__
-#define __GST_MT_API_H__
-
-#include "cmapi.h"
-
-G_BEGIN_DECLS
-
-typedef struct _GstMTApi GstMTApi;
-typedef struct _GstMTApiClass GstMTApiClass;
-
-typedef struct _FigCaptureDevice * FigCaptureDeviceRef;
-typedef struct _FigCaptureStream * FigCaptureStreamRef;
-typedef struct _FigCaptureDeviceIface FigCaptureDeviceIface;
-typedef struct _FigCaptureStreamIface FigCaptureStreamIface;
-
-struct _FigCaptureDeviceIface
-{
- gsize unk;
- OSStatus (* Func1) (FigCaptureDeviceRef stream);
-};
-
-struct _FigCaptureStreamIface
-{
- gsize unk;
- OSStatus (* Start) (FigCaptureStreamRef stream);
- OSStatus (* Stop) (FigCaptureStreamRef stream);
-};
-
-struct _GstMTApi
-{
- GstDynApi parent;
-
- FigBaseObjectRef (* FigCaptureDeviceGetFigBaseObject)
- (FigCaptureDeviceRef device);
- FigBaseObjectRef (* FigCaptureStreamGetFigBaseObject)
- (FigCaptureStreamRef stream);
-
- CFStringRef * kFigCaptureDeviceProperty_Clock;
- CFStringRef * kFigCaptureDeviceProperty_StreamArray;
- CFStringRef * kFigCaptureStreamProperty_AudioLevelArray;
- CFStringRef * kFigCaptureStreamProperty_AudioLevelMeteringEnable;
- CFStringRef * kFigCaptureStreamProperty_AudioLevelUnits;
- CFStringRef * kFigCaptureStreamProperty_AutoAENow;
- CFStringRef * kFigCaptureStreamProperty_AutoFocusNow;
- CFStringRef * kFigCaptureStreamProperty_BufferAllocator;
- CFStringRef * kFigCaptureStreamProperty_BufferQueue;
- CFStringRef * kFigCaptureStreamProperty_FixedFrameRate;
- CFStringRef * kFigCaptureStreamProperty_FormatDescription;
- CFStringRef * kFigCaptureStreamProperty_FormatIndex;
- CFStringRef * kFigCaptureStreamProperty_FrameDuration;
- CFStringRef * kFigCaptureStreamProperty_MaximumFrameRate;
- CFStringRef * kFigCaptureStreamProperty_MinimumFrameRate;
- CFStringRef * kFigCaptureStreamProperty_NeedSampleBufferDurations;
- CFStringRef * kFigCaptureStreamProperty_StillImageBufferQueue;
- CFStringRef * kFigCaptureStreamProperty_StillImageCaptureNow;
- CFStringRef * kFigCaptureStreamProperty_SupportedFormatsArray;
- CFStringRef * kFigSupportedFormat_AudioMaxSampleRate;
- CFStringRef * kFigSupportedFormat_AudioMinSampleRate;
- CFStringRef * kFigSupportedFormat_FormatDescription;
- CFStringRef * kFigSupportedFormat_VideoIsBinned;
- CFStringRef * kFigSupportedFormat_VideoMaxFrameRate;
- CFStringRef * kFigSupportedFormat_VideoMinFrameRate;
- CFStringRef * kFigSupportedFormat_VideoScaleFactor;
-};
-
-struct _GstMTApiClass
-{
- GstDynApiClass parent_class;
-};
-
-GType gst_mt_api_get_type (void);
-
-GstMTApi * gst_mt_api_obtain (GError ** error);
-
-G_END_DECLS
-
-#endif
diff --git a/sys/applemedia-nonpublic/plugin.m b/sys/applemedia-nonpublic/plugin.m
deleted file mode 100644
index f8cea93..0000000
--- a/sys/applemedia-nonpublic/plugin.m
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2009-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
-
-#ifdef HAVE_IOS
-#include "celvideosrc.h"
-#else
-#include "miovideosrc.h"
-#include <Foundation/Foundation.h>
-#endif
-
-#ifndef HAVE_IOS
-static void
-enable_mt_mode (void)
-{
- NSThread * th = [[NSThread alloc] init];
- [th start];
- [th release];
- g_assert ([NSThread isMultiThreaded]);
-}
-#endif
-
-static gboolean
-plugin_init (GstPlugin * plugin)
-{
- gboolean res = TRUE;
-
-#ifdef HAVE_IOS
-#if 0
- res &= gst_element_register (plugin, "celvideosrc", GST_RANK_NONE,
- GST_TYPE_CEL_VIDEO_SRC);
-#endif
-#else
- enable_mt_mode ();
-
-#if 0
- res &= gst_element_register (plugin, "miovideosrc", GST_RANK_NONE,
- GST_TYPE_MIO_VIDEO_SRC);
-#endif
-#endif
-
- return res;
-}
-
-GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
- GST_VERSION_MINOR,
- applemedia_nonpublic,
- "Elements for capture and codec access on Apple OS X and iOS using private Frameworks",
- plugin_init, VERSION, "LGPL", "GStreamer", "http://gstreamer.net/")
diff --git a/sys/applemedia/Makefile.am b/sys/applemedia/Makefile.am
index 4e41524..d77e47c 100644
--- a/sys/applemedia/Makefile.am
+++ b/sys/applemedia/Makefile.am
@@ -78,12 +78,14 @@
iosassetsrc.h \
iosurfacememory.h \
avfassetsrc.h \
- glcontexthelper.h
+ glcontexthelper.h \
+ iosglmemory.h
if HAVE_IOS
libgstapplemedia_la_SOURCES += \
- iosassetsrc.m
+ iosassetsrc.m \
+ iosglmemory.c
libgstapplemedia_la_LDFLAGS += \
-Wl,-framework -Wl,Foundation \
@@ -92,16 +94,23 @@
else
libgstapplemedia_la_SOURCES += \
- qtkitvideosrc.m \
iosurfacememory.c
libgstapplemedia_la_LDFLAGS += \
-Wl,-framework -Wl,Cocoa \
- -Wl,-framework -Wl,QTKit \
+ -Wl,-framework -Wl,OpenGL \
-Wl,-framework -Wl,IOSurface
endif
+if HAVE_QTKIT
+libgstapplemedia_la_SOURCES += \
+ qtkitvideosrc.m
+
+libgstapplemedia_la_LDFLAGS += \
+ -Wl,-framework -Wl,QTKit
+endif
+
if HAVE_AVFOUNDATION
libgstapplemedia_la_SOURCES += \
diff --git a/sys/applemedia/Makefile.in b/sys/applemedia/Makefile.in
index c5bcc63..5494832 100644
--- a/sys/applemedia/Makefile.in
+++ b/sys/applemedia/Makefile.in
@@ -92,34 +92,40 @@
target_triplet = @target@
@HAVE_IOS_TRUE@am__append_1 = -fobjc-abi-version=2 -fobjc-legacy-dispatch
@HAVE_IOS_TRUE@am__append_2 = \
-@HAVE_IOS_TRUE@ iosassetsrc.m
+@HAVE_IOS_TRUE@ iosassetsrc.m \
+@HAVE_IOS_TRUE@ iosglmemory.c
@HAVE_IOS_TRUE@am__append_3 = \
@HAVE_IOS_TRUE@ -Wl,-framework -Wl,Foundation \
@HAVE_IOS_TRUE@ -Wl,-framework -Wl,AssetsLibrary
@HAVE_IOS_FALSE@am__append_4 = \
-@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,OpenGL \
@HAVE_IOS_FALSE@ -Wl,-framework -Wl,IOSurface
-@HAVE_AVFOUNDATION_TRUE@am__append_6 = \
+@HAVE_QTKIT_TRUE@am__append_6 = \
+@HAVE_QTKIT_TRUE@ qtkitvideosrc.m
+
+@HAVE_QTKIT_TRUE@am__append_7 = \
+@HAVE_QTKIT_TRUE@ -Wl,-framework -Wl,QTKit
+
+@HAVE_AVFOUNDATION_TRUE@am__append_8 = \
@HAVE_AVFOUNDATION_TRUE@ avfvideosrc.m \
@HAVE_AVFOUNDATION_TRUE@ avfassetsrc.m \
@HAVE_AVFOUNDATION_TRUE@ avsamplevideosink.m
-@HAVE_AVFOUNDATION_TRUE@am__append_7 = \
+@HAVE_AVFOUNDATION_TRUE@am__append_9 = \
@HAVE_AVFOUNDATION_TRUE@ -Wl,-framework -Wl,AVFoundation
-@HAVE_VIDEOTOOLBOX_TRUE@am__append_8 = \
+@HAVE_VIDEOTOOLBOX_TRUE@am__append_10 = \
@HAVE_VIDEOTOOLBOX_TRUE@ vtenc.c \
@HAVE_VIDEOTOOLBOX_TRUE@ vtdec.c
-@HAVE_VIDEOTOOLBOX_TRUE@am__append_9 = -Wl,-weak_framework -Wl,VideoToolbox
+@HAVE_VIDEOTOOLBOX_TRUE@am__append_11 = -Wl,-weak_framework -Wl,VideoToolbox
subdir = sys/applemedia
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
@@ -199,16 +205,18 @@
am__libgstapplemedia_la_SOURCES_DIST = plugin.m vtutil.c \
corevideomemory.c corevideobuffer.c coremediabuffer.c \
videotexturecache.m atdec.c glcontexthelper.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 \
+ iosglmemory.c iosurfacememory.c qtkitvideosrc.m avfvideosrc.m \
+ avfassetsrc.m avsamplevideosink.m vtenc.c vtdec.c
+@HAVE_IOS_TRUE@am__objects_1 = libgstapplemedia_la-iosassetsrc.lo \
+@HAVE_IOS_TRUE@ libgstapplemedia_la-iosglmemory.lo
+@HAVE_IOS_FALSE@am__objects_2 = \
@HAVE_IOS_FALSE@ libgstapplemedia_la-iosurfacememory.lo
-@HAVE_AVFOUNDATION_TRUE@am__objects_3 = \
+@HAVE_QTKIT_TRUE@am__objects_3 = libgstapplemedia_la-qtkitvideosrc.lo
+@HAVE_AVFOUNDATION_TRUE@am__objects_4 = \
@HAVE_AVFOUNDATION_TRUE@ libgstapplemedia_la-avfvideosrc.lo \
@HAVE_AVFOUNDATION_TRUE@ libgstapplemedia_la-avfassetsrc.lo \
@HAVE_AVFOUNDATION_TRUE@ libgstapplemedia_la-avsamplevideosink.lo
-@HAVE_VIDEOTOOLBOX_TRUE@am__objects_4 = libgstapplemedia_la-vtenc.lo \
+@HAVE_VIDEOTOOLBOX_TRUE@am__objects_5 = libgstapplemedia_la-vtenc.lo \
@HAVE_VIDEOTOOLBOX_TRUE@ libgstapplemedia_la-vtdec.lo
am_libgstapplemedia_la_OBJECTS = libgstapplemedia_la-plugin.lo \
libgstapplemedia_la-vtutil.lo \
@@ -218,7 +226,8 @@
libgstapplemedia_la-videotexturecache.lo \
libgstapplemedia_la-atdec.lo \
libgstapplemedia_la-glcontexthelper.lo $(am__objects_1) \
- $(am__objects_2) $(am__objects_3) $(am__objects_4)
+ $(am__objects_2) $(am__objects_3) $(am__objects_4) \
+ $(am__objects_5)
libgstapplemedia_la_OBJECTS = $(am_libgstapplemedia_la_OBJECTS)
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
@@ -373,6 +382,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -394,6 +405,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -443,6 +456,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -588,6 +603,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -714,8 +731,6 @@
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@
@@ -758,8 +773,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -852,7 +872,7 @@
libgstapplemedia_la_SOURCES = plugin.m vtutil.c corevideomemory.c \
corevideobuffer.c coremediabuffer.c videotexturecache.m \
atdec.c glcontexthelper.c $(am__append_2) $(am__append_4) \
- $(am__append_6) $(am__append_8)
+ $(am__append_6) $(am__append_8) $(am__append_10)
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 \
@@ -888,7 +908,8 @@
$(GST_BASE_LDFLAGS) $(GST_PLUGINS_BASE_LDFLAGS) -Wl,-framework \
-Wl,CoreFoundation -Wl,-framework -Wl,CoreMedia -Wl,-framework \
-Wl,CoreVideo -Wl,-framework -Wl,AudioToolbox $(am__append_3) \
- $(am__append_5) $(am__append_7) $(am__append_9)
+ $(am__append_5) $(am__append_7) $(am__append_9) \
+ $(am__append_11)
noinst_HEADERS = \
qtkitvideosrc.h \
avfvideosrc.h \
@@ -904,7 +925,8 @@
iosassetsrc.h \
iosurfacememory.h \
avfassetsrc.h \
- glcontexthelper.h
+ glcontexthelper.h \
+ iosglmemory.h
all: all-am
@@ -993,6 +1015,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_la-corevideomemory.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_la-glcontexthelper.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-iosglmemory.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@
@@ -1067,6 +1090,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-glcontexthelper.lo `test -f 'glcontexthelper.c' || echo '$(srcdir)/'`glcontexthelper.c
+libgstapplemedia_la-iosglmemory.lo: iosglmemory.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-iosglmemory.lo -MD -MP -MF $(DEPDIR)/libgstapplemedia_la-iosglmemory.Tpo -c -o libgstapplemedia_la-iosglmemory.lo `test -f 'iosglmemory.c' || echo '$(srcdir)/'`iosglmemory.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstapplemedia_la-iosglmemory.Tpo $(DEPDIR)/libgstapplemedia_la-iosglmemory.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='iosglmemory.c' object='libgstapplemedia_la-iosglmemory.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-iosglmemory.lo `test -f 'iosglmemory.c' || echo '$(srcdir)/'`iosglmemory.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
diff --git a/sys/applemedia/atdec.c b/sys/applemedia/atdec.c
index c00f0b7..b14891f 100644
--- a/sys/applemedia/atdec.c
+++ b/sys/applemedia/atdec.c
@@ -93,10 +93,10 @@
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GstAudioDecoderClass *audio_decoder_class = GST_AUDIO_DECODER_CLASS (klass);
- gst_element_class_add_pad_template (GST_ELEMENT_CLASS (klass),
- gst_static_pad_template_get (&gst_atdec_src_template));
- gst_element_class_add_pad_template (GST_ELEMENT_CLASS (klass),
- gst_static_pad_template_get (&gst_atdec_sink_template));
+ gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS (klass),
+ &gst_atdec_src_template);
+ gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS (klass),
+ &gst_atdec_sink_template);
gst_element_class_set_static_metadata (GST_ELEMENT_CLASS (klass),
"AudioToolbox based audio decoder",
diff --git a/sys/applemedia/avfassetsrc.m b/sys/applemedia/avfassetsrc.m
index 9a00645..8568281 100644
--- a/sys/applemedia/avfassetsrc.m
+++ b/sys/applemedia/avfassetsrc.m
@@ -149,10 +149,8 @@
"Read and decode samples from AVFoundation assets using the AVFAssetReader API",
"Andoni Morales Alastruey amorales@fluendo.com");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&audio_factory));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&video_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &audio_factory);
+ gst_element_class_add_static_pad_template (gstelement_class, &video_factory);
gobject_class->set_property = gst_avf_asset_src_set_property;
gobject_class->get_property = gst_avf_asset_src_get_property;
@@ -537,8 +535,7 @@
}
if (combined_ret != GST_FLOW_OK) {
- GST_ELEMENT_ERROR (self, STREAM, FAILED, ("Internal data stream error."),
- ("stream stopped reason %s", gst_flow_get_name (ret)));
+ GST_ELEMENT_FLOW_ERROR (self, ret);
}
gst_pad_pause_task (pad);
@@ -1073,7 +1070,7 @@
return NULL;
}
- buf = gst_core_media_buffer_new (cmbuf, FALSE);
+ buf = gst_core_media_buffer_new (cmbuf, FALSE, NULL);
CFRelease (cmbuf);
if (buf == NULL)
return NULL;
diff --git a/sys/applemedia/avfvideosrc.m b/sys/applemedia/avfvideosrc.m
index 529bd85..4955953 100644
--- a/sys/applemedia/avfvideosrc.m
+++ b/sys/applemedia/avfvideosrc.m
@@ -138,6 +138,7 @@
- (GstVideoFormat)getGstVideoFormat:(NSNumber *)pixel_format;
#if !HAVE_IOS
- (CGDirectDisplayID)getDisplayIdFromDeviceIndex;
+- (float)getScaleFactorFromDeviceIndex;
#endif
- (GstCaps *)getDeviceCaps;
- (BOOL)setDeviceCaps:(GstVideoInfo *)info;
@@ -416,6 +417,20 @@
displayId = [description objectForKey:@"NSScreenNumber"];
return [displayId unsignedIntegerValue];
}
+
+- (float)getScaleFactorFromDeviceIndex
+{
+ NSArray *screens = [NSScreen screens];
+
+ if (deviceIndex == DEFAULT_DEVICE_INDEX)
+ return [[NSScreen mainScreen] backingScaleFactor];
+ if (deviceIndex >= [screens count]) {
+ GST_ELEMENT_ERROR (element, RESOURCE, NOT_FOUND,
+ ("Invalid screen capture device index"), (NULL));
+ return 1.0;
+ }
+ return [[screens objectAtIndex:deviceIndex] backingScaleFactor];
+}
#endif
- (GstCaps *)getDeviceCaps
@@ -648,12 +663,13 @@
if (captureScreen) {
#if !HAVE_IOS
CGRect rect = CGDisplayBounds ([self getDisplayIdFromDeviceIndex]);
+ float scale = [self getScaleFactorFromDeviceIndex];
for (NSNumber *pixel_format in pixel_formats) {
GstVideoFormat gst_format = [self getGstVideoFormat:pixel_format];
if (gst_format != GST_VIDEO_FORMAT_UNKNOWN)
gst_caps_append (result, gst_caps_new_simple ("video/x-raw",
- "width", G_TYPE_INT, (int)rect.size.width,
- "height", G_TYPE_INT, (int)rect.size.height,
+ "width", G_TYPE_INT, (int)(rect.size.width * scale),
+ "height", G_TYPE_INT, (int)(rect.size.height * scale),
"format", G_TYPE_STRING, gst_video_format_to_string (gst_format),
NULL));
}
@@ -938,19 +954,13 @@
}
}
- *buf = gst_core_media_buffer_new (sbuf, useVideoMeta);
+ *buf = gst_core_media_buffer_new (sbuf, useVideoMeta, textureCache);
if (*buf == NULL) {
CFRelease (sbuf);
return GST_FLOW_ERROR;
}
CFRelease (sbuf);
- if (textureCache != NULL) {
- *buf = gst_video_texture_cache_get_gl_buffer (textureCache, *buf);
- if (*buf == NULL)
- return GST_FLOW_ERROR;
- }
-
GST_BUFFER_OFFSET (*buf) = offset++;
GST_BUFFER_OFFSET_END (*buf) = GST_BUFFER_OFFSET (*buf) + 1;
GST_BUFFER_TIMESTAMP (*buf) = timestamp;
@@ -1180,8 +1190,7 @@
"Reads frames from an iOS AVFoundation device",
"Ole André Vadla Ravnås <oleavr@soundrop.com>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_template);
g_object_class_install_property (gobject_class, PROP_DEVICE_INDEX,
g_param_spec_int ("device-index", "Device Index",
diff --git a/sys/applemedia/avsamplevideosink.m b/sys/applemedia/avsamplevideosink.m
index 610b40a..ce17e98 100644
--- a/sys/applemedia/avsamplevideosink.m
+++ b/sys/applemedia/avsamplevideosink.m
@@ -106,8 +106,7 @@
"Sink/Video", "A videosink based on AVSampleBuffer's",
"Matthew Waters <matthew@centricular.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_av_sample_video_sink_template));
+ gst_element_class_add_static_pad_template (element_class, &gst_av_sample_video_sink_template);
gobject_class->finalize = gst_av_sample_video_sink_finalize;
@@ -749,7 +748,10 @@
_request_data (av_sink);
g_mutex_unlock (&av_sink->render_lock);
-#if defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1010
+#if defined(MAC_OS_X_VERSION_MAX_ALLOWED) && \
+ MAC_OS_X_VERSION_MAX_ALLOWED >= 1010 && \
+ defined(MAC_OS_X_VERSION_MIN_REQUIRED) && \
+ MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
if ([av_sink->layer status] == AVQueuedSampleBufferRenderingStatusFailed) {
GST_ERROR_OBJECT (av_sink, "failed to enqueue buffer on layer, %s",
[[[av_sink->layer error] description] UTF8String]);
diff --git a/sys/applemedia/coremediabuffer.c b/sys/applemedia/coremediabuffer.c
index cf34224..8f573be 100644
--- a/sys/applemedia/coremediabuffer.c
+++ b/sys/applemedia/coremediabuffer.c
@@ -48,6 +48,18 @@
meta->pixel_buf = NULL;
}
+static gboolean
+gst_core_media_meta_init (GstCoreMediaMeta * meta, gpointer params,
+ GstBuffer * buf)
+{
+ meta->sample_buf = NULL;
+ meta->image_buf = NULL;
+ meta->pixel_buf = NULL;
+ meta->block_buf = NULL;
+
+ return TRUE;
+}
+
static void
gst_core_media_meta_free (GstCoreMediaMeta * meta, GstBuffer * buf)
{
@@ -99,7 +111,7 @@
if (g_once_init_enter (&core_media_meta_info)) {
const GstMetaInfo *meta = gst_meta_register (GST_CORE_MEDIA_META_API_TYPE,
"GstCoreMediaMeta", sizeof (GstCoreMediaMeta),
- (GstMetaInitFunction) NULL,
+ (GstMetaInitFunction) gst_core_media_meta_init,
(GstMetaFreeFunction) gst_core_media_meta_free,
(GstMetaTransformFunction) gst_core_media_meta_transform);
g_once_init_leave (&core_media_meta_info, meta);
@@ -228,7 +240,7 @@
GstBuffer *
gst_core_media_buffer_new (CMSampleBufferRef sample_buf,
- gboolean use_video_meta)
+ gboolean use_video_meta, GstVideoTextureCache * cache)
{
CVImageBufferRef image_buf;
CMBlockBufferRef block_buf;
@@ -250,7 +262,8 @@
goto error;
}
- gst_core_video_wrap_pixel_buffer (buf, &info, pixel_buf, &has_padding);
+ gst_core_video_wrap_pixel_buffer (buf, &info, pixel_buf, cache,
+ &has_padding);
/* If the video meta API is not supported, remove padding by
* copying the core media buffer to a system memory buffer */
diff --git a/sys/applemedia/coremediabuffer.h b/sys/applemedia/coremediabuffer.h
index bc18acf..69299b7 100644
--- a/sys/applemedia/coremediabuffer.h
+++ b/sys/applemedia/coremediabuffer.h
@@ -22,6 +22,7 @@
#include <gst/gst.h>
#include <gst/video/gstvideometa.h>
+#include "videotexturecache.h"
#include "CoreMedia/CoreMedia.h"
@@ -43,7 +44,8 @@
GstBuffer * gst_core_media_buffer_new (CMSampleBufferRef sample_buf,
- gboolean use_video_meta);
+ gboolean use_video_meta,
+ GstVideoTextureCache *cache);
CVPixelBufferRef gst_core_media_buffer_get_pixel_buffer
(GstBuffer * buf);
GType gst_core_media_meta_api_get_type (void);
diff --git a/sys/applemedia/corevideobuffer.c b/sys/applemedia/corevideobuffer.c
index 67d899c..bf20139 100644
--- a/sys/applemedia/corevideobuffer.c
+++ b/sys/applemedia/corevideobuffer.c
@@ -17,8 +17,14 @@
* Boston, MA 02110-1301, USA.
*/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
#include "corevideobuffer.h"
#include "corevideomemory.h"
+#if !HAVE_IOS
+#include "iosurfacememory.h"
+#endif
static const GstMetaInfo *gst_core_video_meta_get_info (void);
@@ -33,6 +39,16 @@
meta->pixbuf = (CVPixelBufferRef) cvbuf;
}
+static gboolean
+gst_core_video_meta_init (GstCoreVideoMeta * meta, gpointer params,
+ GstBuffer * buf)
+{
+ meta->cvbuf = NULL;
+ meta->pixbuf = NULL;
+
+ return TRUE;
+}
+
static void
gst_core_video_meta_free (GstCoreVideoMeta * meta, GstBuffer * buf)
{
@@ -75,7 +91,7 @@
if (g_once_init_enter (&core_video_meta_info)) {
const GstMetaInfo *meta = gst_meta_register (GST_CORE_VIDEO_META_API_TYPE,
"GstCoreVideoMeta", sizeof (GstCoreVideoMeta),
- (GstMetaInitFunction) NULL,
+ (GstMetaInitFunction) gst_core_video_meta_init,
(GstMetaFreeFunction) gst_core_video_meta_free,
(GstMetaTransformFunction) gst_core_video_meta_transform);
g_once_init_leave (&core_video_meta_info, meta);
@@ -83,18 +99,46 @@
return core_video_meta_info;
}
+static GstMemory *
+_create_glmem (GstAppleCoreVideoPixelBuffer * gpixbuf,
+ GstVideoInfo * info, guint plane, gsize size, GstVideoTextureCache * cache)
+{
+#if HAVE_IOS
+ return gst_video_texture_cache_create_memory (cache, gpixbuf, plane, size);
+#else
+ GstIOSurfaceMemory *mem;
+ GstVideoGLTextureType tex_type =
+ gst_gl_texture_type_from_format (cache->ctx, GST_VIDEO_INFO_FORMAT (info),
+ plane);
+ CVPixelBufferRef pixel_buf = gpixbuf->buf;
+ IOSurfaceRef surface = CVPixelBufferGetIOSurface (pixel_buf);
+
+ CFRetain (pixel_buf);
+ mem = gst_io_surface_memory_wrapped (cache->ctx,
+ surface, GST_GL_TEXTURE_TARGET_RECTANGLE, tex_type,
+ info, plane, NULL, pixel_buf, (GDestroyNotify) CFRelease);
+ return GST_MEMORY_CAST (mem);
+#endif
+}
+
void
-gst_core_video_wrap_pixel_buffer (GstBuffer * buf, GstVideoInfo * info,
- CVPixelBufferRef pixel_buf, gboolean * has_padding)
+gst_core_video_wrap_pixel_buffer (GstBuffer * buf,
+ GstVideoInfo * info,
+ CVPixelBufferRef pixel_buf,
+ GstVideoTextureCache * cache, gboolean * has_padding)
{
guint n_planes;
gsize offset[GST_VIDEO_MAX_PLANES] = { 0 };
gint stride[GST_VIDEO_MAX_PLANES] = { 0 };
UInt32 size;
GstAppleCoreVideoPixelBuffer *gpixbuf;
+ GstMemory *mem = NULL;
+ gboolean do_gl = cache != NULL;
gpixbuf = gst_apple_core_video_pixel_buffer_new (pixel_buf);
- *has_padding = FALSE;
+
+ if (has_padding)
+ *has_padding = FALSE;
if (CVPixelBufferIsPlanar (pixel_buf)) {
gint i, size = 0, plane_offset = 0;
@@ -103,16 +147,20 @@
for (i = 0; i < n_planes; i++) {
stride[i] = CVPixelBufferGetBytesPerRowOfPlane (pixel_buf, i);
- if (stride[i] != GST_VIDEO_INFO_PLANE_STRIDE (info, i)) {
+ if (stride[i] != GST_VIDEO_INFO_PLANE_STRIDE (info, i) && has_padding)
*has_padding = TRUE;
- }
size = stride[i] * CVPixelBufferGetHeightOfPlane (pixel_buf, i);
offset[i] = plane_offset;
plane_offset += size;
- gst_buffer_append_memory (buf,
- gst_apple_core_video_memory_new_wrapped (gpixbuf, i, size));
+ if (do_gl)
+ mem = _create_glmem (gpixbuf, info, i, size, cache);
+ else
+ mem =
+ GST_MEMORY_CAST (gst_apple_core_video_memory_new_wrapped (gpixbuf,
+ i, size));
+ gst_buffer_append_memory (buf, mem);
}
} else {
n_planes = 1;
@@ -120,9 +168,13 @@
offset[0] = 0;
size = stride[0] * CVPixelBufferGetHeight (pixel_buf);
- gst_buffer_append_memory (buf,
- gst_apple_core_video_memory_new_wrapped (gpixbuf,
- GST_APPLE_CORE_VIDEO_NO_PLANE, size));
+ if (do_gl)
+ mem = _create_glmem (gpixbuf, info, 0, size, cache);
+ else
+ mem =
+ GST_MEMORY_CAST (gst_apple_core_video_memory_new_wrapped (gpixbuf, 0,
+ size));
+ gst_buffer_append_memory (buf, mem);
}
gst_apple_core_video_pixel_buffer_unref (gpixbuf);
@@ -137,13 +189,58 @@
}
}
+static GstVideoFormat
+gst_core_video_get_video_format (OSType format)
+{
+ switch (format) {
+ case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange:
+ return GST_VIDEO_FORMAT_NV12;
+ case kCVPixelFormatType_422YpCbCr8_yuvs:
+ return GST_VIDEO_FORMAT_YUY2;
+ case kCVPixelFormatType_422YpCbCr8:
+ return GST_VIDEO_FORMAT_UYVY;
+ case kCVPixelFormatType_32BGRA:
+ return GST_VIDEO_FORMAT_BGRA;
+ case kCVPixelFormatType_32RGBA:
+ return GST_VIDEO_FORMAT_RGBA;
+ default:
+ GST_WARNING ("Unknown OSType format: %d", (gint) format);
+ return GST_VIDEO_FORMAT_UNKNOWN;
+ }
+}
+
+
+gboolean
+gst_core_video_info_init_from_pixel_buffer (GstVideoInfo * info,
+ CVPixelBufferRef pixel_buf)
+{
+ size_t width, height;
+ OSType format_type;
+ GstVideoFormat video_format;
+
+ width = CVPixelBufferGetWidth (pixel_buf);
+ height = CVPixelBufferGetHeight (pixel_buf);
+ format_type = CVPixelBufferGetPixelFormatType (pixel_buf);
+ video_format = gst_core_video_get_video_format (format_type);
+
+ if (video_format == GST_VIDEO_FORMAT_UNKNOWN) {
+ return FALSE;
+ }
+
+ gst_video_info_init (info);
+ gst_video_info_set_format (info, video_format, width, height);
+
+ return TRUE;
+}
+
+
GstBuffer *
-gst_core_video_buffer_new (CVBufferRef cvbuf, GstVideoInfo * vinfo)
+gst_core_video_buffer_new (CVBufferRef cvbuf, GstVideoInfo * vinfo,
+ GstVideoTextureCache * cache)
{
CVPixelBufferRef pixbuf = NULL;
GstBuffer *buf;
GstCoreVideoMeta *meta;
- gboolean has_padding; /* not used for now */
if (CFGetTypeID (cvbuf) != CVPixelBufferGetTypeID ())
/* TODO: Do we need to handle other buffer types? */
@@ -159,7 +256,7 @@
meta->cvbuf = CVBufferRetain (cvbuf);
meta->pixbuf = pixbuf;
- gst_core_video_wrap_pixel_buffer (buf, vinfo, pixbuf, &has_padding);
+ gst_core_video_wrap_pixel_buffer (buf, vinfo, pixbuf, cache, NULL);
return buf;
}
diff --git a/sys/applemedia/corevideobuffer.h b/sys/applemedia/corevideobuffer.h
index 0ea7d1e..c051988 100644
--- a/sys/applemedia/corevideobuffer.h
+++ b/sys/applemedia/corevideobuffer.h
@@ -23,6 +23,7 @@
#include <gst/gst.h>
#include <gst/video/video.h>
#include <gst/video/gstvideometa.h>
+#include "videotexturecache.h"
#include "CoreVideo/CoreVideo.h"
@@ -41,10 +42,14 @@
} GstCoreVideoMeta;
GstBuffer * gst_core_video_buffer_new (CVBufferRef cvbuf,
- GstVideoInfo *info);
+ GstVideoInfo *info,
+ GstVideoTextureCache *cache);
+gboolean gst_core_video_info_init_from_pixel_buffer (GstVideoInfo * info,
+ CVPixelBufferRef pixel_buf);
void gst_core_video_wrap_pixel_buffer (GstBuffer * buf,
GstVideoInfo * info,
CVPixelBufferRef pixel_buf,
+ GstVideoTextureCache *cache,
gboolean * has_padding);
GType gst_core_video_meta_api_get_type (void);
diff --git a/sys/applemedia/corevideomemory.c b/sys/applemedia/corevideomemory.c
index 4cb085d..e8ab72f 100644
--- a/sys/applemedia/corevideomemory.c
+++ b/sys/applemedia/corevideomemory.c
@@ -300,7 +300,7 @@
* Helper function for gst_apple_core_video_mem_share().
* Users should call gst_apple_core_video_memory_new_wrapped() instead.
*/
-static GstMemory *
+static GstAppleCoreVideoMemory *
gst_apple_core_video_memory_new (GstMemoryFlags flags, GstMemory * parent,
GstAppleCoreVideoPixelBuffer * gpixbuf, gsize plane, gsize maxsize,
gsize align, gsize offset, gsize size)
@@ -320,18 +320,18 @@
GST_DEBUG ("%p: gpixbuf %p, plane: %" G_GSSIZE_FORMAT ", size %"
G_GSIZE_FORMAT, mem, mem->gpixbuf, mem->plane, mem->mem.size);
- return (GstMemory *) mem;
+ return mem;
}
/**
* gst_apple_core_video_memory_new_wrapped:
* @gpixbuf: the backing #GstAppleCoreVideoPixelBuffer
- * @plane: the plane this memory will represent, or #GST_APPLE_CORE_VIDEO_NO_PLANE for non-planar buffer
+ * @plane: the plane this memory will represent, or 0 for non-planar buffer
* @size: the size of the buffer or specific plane
*
* Returns: a newly allocated #GstAppleCoreVideoMemory
*/
-GstMemory *
+GstAppleCoreVideoMemory *
gst_apple_core_video_memory_new_wrapped (GstAppleCoreVideoPixelBuffer * gpixbuf,
gsize plane, gsize size)
{
@@ -349,7 +349,7 @@
if (!gst_apple_core_video_pixel_buffer_lock (mem->gpixbuf, flags))
return NULL;
- if (mem->plane != GST_APPLE_CORE_VIDEO_NO_PLANE) {
+ if (CVPixelBufferIsPlanar (mem->gpixbuf->buf)) {
ret = CVPixelBufferGetBaseAddressOfPlane (mem->gpixbuf->buf, mem->plane);
if (ret != NULL)
@@ -378,11 +378,8 @@
{
GstAppleCoreVideoMemory *mem = (GstAppleCoreVideoMemory *) gmem;
(void) gst_apple_core_video_pixel_buffer_unlock (mem->gpixbuf);
- if (mem->plane != GST_APPLE_CORE_VIDEO_NO_PLANE)
- GST_DEBUG ("%p: pixbuf %p plane %" G_GSIZE_FORMAT, mem,
- mem->gpixbuf->buf, mem->plane);
- else
- GST_DEBUG ("%p: pixbuf %p", mem, mem->gpixbuf->buf);
+ GST_DEBUG ("%p: pixbuf %p plane %" G_GSIZE_FORMAT, mem,
+ mem->gpixbuf->buf, mem->plane);
}
static GstMemory *
@@ -403,9 +400,9 @@
/* the shared memory is always readonly */
sub =
- gst_apple_core_video_memory_new (GST_MINI_OBJECT_FLAGS (parent) |
- GST_MINI_OBJECT_FLAG_LOCK_READONLY, parent, mem->gpixbuf, mem->plane,
- gmem->maxsize, gmem->align, gmem->offset + offset, size);
+ GST_MEMORY_CAST (gst_apple_core_video_memory_new (GST_MINI_OBJECT_FLAGS
+ (parent) | GST_MINI_OBJECT_FLAG_LOCK_READONLY, parent, mem->gpixbuf,
+ mem->plane, gmem->maxsize, gmem->align, gmem->offset + offset, size));
return sub;
}
diff --git a/sys/applemedia/corevideomemory.h b/sys/applemedia/corevideomemory.h
index d81781c..ba4468f 100644
--- a/sys/applemedia/corevideomemory.h
+++ b/sys/applemedia/corevideomemory.h
@@ -63,13 +63,6 @@
} GstAppleCoreVideoPixelBuffer;
/**
- * GST_APPLE_CORE_VIDEO_NO_PLANE:
- *
- * Indicates a non-planar pixel buffer.
- */
-#define GST_APPLE_CORE_VIDEO_NO_PLANE ((size_t)-1)
-
-/**
* GstAppleCoreVideoMemory:
*
* Represents a video plane or an entire (non-planar) video image,
@@ -101,7 +94,7 @@
gboolean
gst_is_apple_core_video_memory (GstMemory * mem);
-GstMemory *
+GstAppleCoreVideoMemory *
gst_apple_core_video_memory_new_wrapped (GstAppleCoreVideoPixelBuffer * shared, gsize plane, gsize size);
G_END_DECLS
diff --git a/sys/applemedia/iosassetsrc.m b/sys/applemedia/iosassetsrc.m
index 67a4557..e237c2e 100644
--- a/sys/applemedia/iosassetsrc.m
+++ b/sys/applemedia/iosassetsrc.m
@@ -129,8 +129,7 @@
"Read from arbitrary point in a iOS asset",
"Andoni Morales Alastruey <amorales@fluendo.com>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&srctemplate));
+ gst_element_class_add_static_pad_template (gstelement_class, &srctemplate);
gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_ios_asset_src_start);
gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_ios_asset_src_stop);
diff --git a/sys/applemedia/iosglmemory.c b/sys/applemedia/iosglmemory.c
new file mode 100644
index 0000000..65507b4
--- /dev/null
+++ b/sys/applemedia/iosglmemory.c
@@ -0,0 +1,166 @@
+/*
+ * 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 "iosglmemory.h"
+
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_IOS_GL_MEMORY);
+#define GST_CAT_DEFAULT GST_CAT_IOS_GL_MEMORY
+
+G_DEFINE_TYPE (GstIOSGLMemoryAllocator, gst_ios_gl_memory_allocator,
+ GST_TYPE_GL_MEMORY_ALLOCATOR);
+
+typedef struct
+{
+ GstIOSGLMemory *memory;
+} ContextThreadData;
+
+static GstAllocator *_ios_gl_memory_allocator;
+
+static void
+_ios_gl_memory_destroy (GstGLBaseMemory * gl_mem)
+{
+ GstIOSGLMemory *mem = (GstIOSGLMemory *) gl_mem;
+
+ gst_memory_unref (GST_MEMORY_CAST (mem->cv_mem));
+ GST_GL_BASE_MEMORY_ALLOCATOR_CLASS
+ (gst_ios_gl_memory_allocator_parent_class)->destroy (gl_mem);
+}
+
+static gpointer
+_ios_gl_memory_allocator_map (GstGLBaseMemory * bmem,
+ GstMapInfo * info, gsize size)
+{
+ GstGLMemory *gl_mem = (GstGLMemory *) bmem;
+ GstIOSGLMemory *mem = (GstIOSGLMemory *) gl_mem;
+
+ if (info->flags & GST_MAP_GL)
+ return &gl_mem->tex_id;
+ return GST_MEMORY_CAST (mem->cv_mem)->allocator->
+ mem_map (GST_MEMORY_CAST (mem->cv_mem), size, info->flags);
+}
+
+static void
+_ios_gl_memory_allocator_unmap (GstGLBaseMemory * bmem, GstMapInfo * info)
+{
+ GstIOSGLMemory *mem = (GstIOSGLMemory *) bmem;
+
+ if (!(info->flags & GST_MAP_GL))
+ GST_MEMORY_CAST (mem->cv_mem)->allocator->
+ mem_unmap (GST_MEMORY_CAST (mem->cv_mem));
+}
+
+static GstMemory *
+_mem_alloc (GstAllocator * allocator, gsize size, GstAllocationParams * params)
+{
+ g_warning ("use gst_ios_gl_memory_new_wrapped () to allocate from this "
+ "IOSGL allocator");
+
+ return NULL;
+}
+
+static void
+gst_ios_gl_memory_allocator_class_init (GstIOSGLMemoryAllocatorClass * klass)
+{
+ GstAllocatorClass *allocator_class = (GstAllocatorClass *) klass;
+ GstGLBaseMemoryAllocatorClass *gl_base_allocator_class =
+ (GstGLBaseMemoryAllocatorClass *) klass;
+
+ allocator_class->alloc = _mem_alloc;
+ gl_base_allocator_class->destroy = _ios_gl_memory_destroy;
+ gl_base_allocator_class->map = _ios_gl_memory_allocator_map;
+ gl_base_allocator_class->unmap = _ios_gl_memory_allocator_unmap;
+}
+
+static void
+gst_ios_gl_memory_allocator_init (GstIOSGLMemoryAllocator * allocator)
+{
+ GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator);
+
+ alloc->mem_type = GST_IOS_GL_MEMORY_ALLOCATOR_NAME;
+ GST_OBJECT_FLAG_SET (allocator, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC);
+}
+
+void
+gst_ios_gl_memory_init (void)
+{
+ static volatile gsize _init = 0;
+
+ if (g_once_init_enter (&_init)) {
+ GST_DEBUG_CATEGORY_INIT (GST_CAT_IOS_GL_MEMORY, "iosurface", 0,
+ "IOSGL Buffer");
+
+ _ios_gl_memory_allocator =
+ g_object_new (GST_TYPE_IOS_GL_MEMORY_ALLOCATOR, NULL);
+
+ gst_allocator_register (GST_IOS_GL_MEMORY_ALLOCATOR_NAME,
+ gst_object_ref (_ios_gl_memory_allocator));
+ g_once_init_leave (&_init, 1);
+ }
+}
+
+gboolean
+gst_is_ios_gl_memory (GstMemory * mem)
+{
+ return mem != NULL && mem->allocator != NULL &&
+ g_type_is_a (G_OBJECT_TYPE (mem->allocator),
+ GST_TYPE_IOS_GL_MEMORY_ALLOCATOR);
+}
+
+static GstIOSGLMemory *
+_ios_gl_memory_new (GstGLContext * context,
+ GstAppleCoreVideoMemory * cv_mem,
+ GstGLTextureTarget target,
+ GstVideoGLTextureType tex_type,
+ guint tex_id,
+ GstVideoInfo * info,
+ guint plane,
+ GstVideoAlignment * valign, gpointer user_data, GDestroyNotify notify)
+{
+ GstIOSGLMemory *mem;
+
+ mem = g_new0 (GstIOSGLMemory, 1);
+ mem->gl_mem.tex_id = tex_id;
+ mem->gl_mem.texture_wrapped = TRUE;
+ gst_gl_memory_init (&mem->gl_mem, _ios_gl_memory_allocator, NULL, context,
+ target, tex_type, NULL, info, plane, valign, user_data, notify);
+ mem->cv_mem = cv_mem;
+
+ GST_MINI_OBJECT_FLAG_SET (mem, GST_MEMORY_FLAG_READONLY);
+
+ return mem;
+}
+
+GstIOSGLMemory *
+gst_ios_gl_memory_new_wrapped (GstGLContext * context,
+ GstAppleCoreVideoMemory * cv_mem,
+ GstGLTextureTarget target,
+ GstVideoGLTextureType tex_type,
+ guint tex_id,
+ GstVideoInfo * info,
+ guint plane,
+ GstVideoAlignment * valign, gpointer user_data, GDestroyNotify notify)
+{
+ return _ios_gl_memory_new (context, cv_mem, target, tex_type, tex_id, info,
+ plane, valign, user_data, notify);
+}
diff --git a/sys/applemedia/iosglmemory.h b/sys/applemedia/iosglmemory.h
new file mode 100644
index 0000000..ae9816a
--- /dev/null
+++ b/sys/applemedia/iosglmemory.h
@@ -0,0 +1,78 @@
+/*
+ * GStreamer
+ * Copyright (C) 2016 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.
+ */
+
+#ifndef _GST_IOS_GL_MEMORY_H_
+#define _GST_IOS_GL_MEMORY_H_
+
+#include <gst/gst.h>
+#include <gst/gstallocator.h>
+#include <gst/video/video.h>
+#include <gst/gl/gl.h>
+#include "corevideomemory.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_IOS_GL_MEMORY_ALLOCATOR (gst_ios_gl_memory_allocator_get_type())
+GType gst_ios_gl_memory_allocator_get_type(void);
+
+#define GST_IS_IOS_GL_MEMORY_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_IOS_GL_MEMORY_ALLOCATOR))
+#define GST_IS_IOS_GL_MEMORY_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_IOS_GL_MEMORY_ALLOCATOR))
+#define GST_IOS_GL_MEMORY_ALLOCATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_IOS_GL_MEMORY_ALLOCATOR, GstIOSGLMemoryAllocatorClass))
+#define GST_IOS_GL_MEMORY_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_IOS_GL_MEMORY_ALLOCATOR, GstIOSGLMemoryAllocator))
+#define GST_IOS_GL_MEMORY_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_IOS_GL_MEMORY_ALLOCATOR, GstIOSGLMemoryAllocatorClass))
+#define GST_IOS_GL_MEMORY_ALLOCATOR_CAST(obj) ((GstIOSGLMemoryAllocator *)(obj))
+
+typedef struct _GstIOSGLMemory
+{
+ GstGLMemory gl_mem;
+ GstAppleCoreVideoMemory *cv_mem;
+} GstIOSGLMemory;
+
+#define GST_IOS_GL_MEMORY_ALLOCATOR_NAME "IOSGLMemory"
+
+void gst_ios_gl_memory_init (void);
+
+GstIOSGLMemory *
+gst_ios_gl_memory_new_wrapped (GstGLContext * context,
+ GstAppleCoreVideoMemory *cv_mem,
+ GstGLTextureTarget target,
+ GstVideoGLTextureType tex_type,
+ guint tex_id,
+ GstVideoInfo * info,
+ guint plane,
+ GstVideoAlignment *valign,
+ gpointer user_data,
+ GDestroyNotify notify);
+
+gboolean gst_is_ios_gl_memory (GstMemory * mem);
+
+typedef struct _GstIOSGLMemoryAllocator
+{
+ GstGLMemoryAllocator allocator;
+} GstIOSGLMemoryAllocator;
+
+typedef struct _GstIOSGLMemoryAllocatorClass
+{
+ GstGLMemoryAllocatorClass parent_class;
+} GstIOSGLMemoryAllocatorClass;
+
+G_END_DECLS
+
+#endif /* _GST_IOS_GL_MEMORY_H_ */
diff --git a/sys/applemedia/iosurfacememory.c b/sys/applemedia/iosurfacememory.c
index 694202c..e0d8b07 100644
--- a/sys/applemedia/iosurfacememory.c
+++ b/sys/applemedia/iosurfacememory.c
@@ -30,6 +30,12 @@
G_DEFINE_TYPE (GstIOSurfaceMemoryAllocator, gst_io_surface_memory_allocator,
GST_TYPE_GL_MEMORY_ALLOCATOR);
+typedef struct
+{
+ GstIOSurfaceMemory *memory;
+ IOSurfaceRef surface;
+} ContextThreadData;
+
static void _io_surface_memory_set_surface (GstIOSurfaceMemory * memory,
IOSurfaceRef surface);
@@ -160,6 +166,7 @@
_io_surface_memory_new (GstGLContext * context,
IOSurfaceRef surface,
GstGLTextureTarget target,
+ GstVideoGLTextureType tex_type,
GstVideoInfo * info,
guint plane,
GstVideoAlignment * valign, gpointer user_data, GDestroyNotify notify)
@@ -170,12 +177,12 @@
mem = g_new0 (GstIOSurfaceMemory, 1);
gst_gl_memory_init (&mem->gl_mem, _io_surface_memory_allocator, NULL, context,
- target, NULL, info, plane, valign, user_data, notify);
+ target, tex_type, NULL, info, plane, valign, user_data, notify);
GST_MINI_OBJECT_FLAG_SET (mem, GST_MEMORY_FLAG_READONLY);
mem->surface = NULL;
- _io_surface_memory_set_surface (mem, surface);
+ gst_io_surface_memory_set_surface (mem, surface);
return mem;
}
@@ -184,11 +191,12 @@
gst_io_surface_memory_wrapped (GstGLContext * context,
IOSurfaceRef surface,
GstGLTextureTarget target,
+ GstVideoGLTextureType tex_type,
GstVideoInfo * info,
guint plane,
GstVideoAlignment * valign, gpointer user_data, GDestroyNotify notify)
{
- return _io_surface_memory_new (context, surface, target, info,
+ return _io_surface_memory_new (context, surface, target, tex_type, info,
plane, valign, user_data, notify);
}
@@ -230,12 +238,22 @@
}
}
+static void
+_do_set_surface (GstGLContext * context, ContextThreadData * data)
+{
+ _io_surface_memory_set_surface (data->memory, data->surface);
+}
+
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);
+ GstGLContext *context;
+ ContextThreadData data = { memory, surface };
- _io_surface_memory_set_surface (memory, surface);
+ g_return_if_fail (gst_is_io_surface_memory ((GstMemory *) memory));
+
+ context = memory->gl_mem.mem.context;
+ gst_gl_context_thread_add (context,
+ (GstGLContextThreadFunc) _do_set_surface, &data);
}
diff --git a/sys/applemedia/iosurfacememory.h b/sys/applemedia/iosurfacememory.h
index 5d0fbe8..5d281ac 100644
--- a/sys/applemedia/iosurfacememory.h
+++ b/sys/applemedia/iosurfacememory.h
@@ -53,6 +53,7 @@
gst_io_surface_memory_wrapped (GstGLContext * context,
IOSurfaceRef surface,
GstGLTextureTarget target,
+ GstVideoGLTextureType tex_type,
GstVideoInfo * info,
guint plane,
GstVideoAlignment *valign,
diff --git a/sys/applemedia/plugin.m b/sys/applemedia/plugin.m
index 0ff4ec1..19384c7 100644
--- a/sys/applemedia/plugin.m
+++ b/sys/applemedia/plugin.m
@@ -25,7 +25,8 @@
#include "corevideomemory.h"
#ifdef HAVE_IOS
#include "iosassetsrc.h"
-#else
+#endif
+#ifdef HAVE_QTKIT
#include "qtkitvideosrc.h"
#endif
#ifdef HAVE_AVFOUNDATION
@@ -67,11 +68,15 @@
gst_apple_core_video_memory_init ();
#ifdef HAVE_IOS
+ gst_ios_gl_memory_init ();
+
res &= gst_element_register (plugin, "iosassetsrc", GST_RANK_SECONDARY,
GST_TYPE_IOS_ASSET_SRC);
#else
enable_mt_mode ();
+#endif
+#ifdef HAVE_QTKIT
res = gst_element_register (plugin, "qtkitvideosrc", GST_RANK_SECONDARY,
GST_TYPE_QTKIT_VIDEO_SRC);
#endif
diff --git a/sys/applemedia/qtkitvideosrc.m b/sys/applemedia/qtkitvideosrc.m
index e6b427f..a69e70f 100644
--- a/sys/applemedia/qtkitvideosrc.m
+++ b/sys/applemedia/qtkitvideosrc.m
@@ -18,8 +18,8 @@
*/
#include "qtkitvideosrc.h"
-
#import "corevideobuffer.h"
+#include "glcontexthelper.h"
#import <QTKit/QTKit.h>
@@ -100,9 +100,12 @@
BOOL stopRequest;
gint width, height;
- gint fps_n, fps_d;
+ gint fps_n, fps_d;
GstClockTime duration;
guint64 offset;
+ GstGLContextHelper *ctxh;
+ GstVideoTextureCache *textureCache;
+ GstVideoInfo outputInfo;
}
- (id)init;
@@ -149,6 +152,10 @@
gst_base_src_set_live (baseSrc, TRUE);
gst_base_src_set_format (baseSrc, GST_FORMAT_TIME);
+
+ self->ctxh = NULL;
+ textureCache = NULL;
+ gst_video_info_init (&outputInfo);
}
return self;
@@ -272,6 +279,17 @@
error:nil];
g_assert (success);
+ gst_gl_context_helper_ensure_context (ctxh);
+ GST_INFO_OBJECT (element, "pushing textures, context %p old context %p",
+ ctxh->context, textureCache ? textureCache->ctx : NULL);
+ if (textureCache && textureCache->ctx != ctxh->context) {
+ gst_video_texture_cache_free (textureCache);
+ textureCache = NULL;
+ }
+ textureCache = gst_video_texture_cache_new (ctxh->context);
+ gst_video_texture_cache_set_format (textureCache, GST_VIDEO_FORMAT_UYVY, caps);
+ gst_video_info_set_format (&outputInfo, GST_VIDEO_FORMAT_UYVY, width, height);
+
[output setDelegate:self];
[session startRunning];
@@ -291,6 +309,7 @@
fps_n = 0;
fps_d = 1;
duration = GST_CLOCK_TIME_NONE;
+ ctxh = gst_gl_context_helper_new (element);
/* this will trigger negotiation and open the device in setCaps */
gst_base_src_start_complete (baseSrc, GST_FLOW_OK);
@@ -306,7 +325,6 @@
[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}
-
return YES;
}
@@ -320,6 +338,12 @@
[queue release];
queue = nil;
+ gst_gl_context_helper_free (ctxh);
+ ctxh = NULL;
+ if (textureCache)
+ gst_video_texture_cache_free (textureCache);
+ textureCache = NULL;
+
return YES;
}
@@ -434,7 +458,7 @@
[queueLock unlockWithCondition:
([queue count] == 0) ? NO_FRAMES : HAS_FRAME_OR_STOP_REQUEST];
- *buf = gst_core_video_buffer_new ((CVBufferRef)frame, NULL);
+ *buf = gst_core_video_buffer_new ((CVBufferRef)frame, &outputInfo, textureCache);
CVBufferRelease (frame);
[self timestampBuffer:*buf];
@@ -518,8 +542,7 @@
"Reads frames from a Mac OS X QTKit device",
"Ole André Vadla Ravnås <oleavr@soundrop.com>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_template);
gobject_class->finalize = gst_qtkit_video_src_finalize;
gobject_class->get_property = gst_qtkit_video_src_get_property;
diff --git a/sys/applemedia/videotexturecache.h b/sys/applemedia/videotexturecache.h
index 0b43566..8dc927a 100644
--- a/sys/applemedia/videotexturecache.h
+++ b/sys/applemedia/videotexturecache.h
@@ -22,7 +22,7 @@
#include <gst/video/gstvideometa.h>
#include <gst/gl/gstglcontext.h>
-#include <CoreVideo/CoreVideo.h>
+#include "corevideomemory.h"
G_BEGIN_DECLS
@@ -47,8 +47,8 @@
void gst_video_texture_cache_set_format (GstVideoTextureCache * cache,
GstVideoFormat in_format, GstCaps * out_caps);
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);
+GstMemory *gst_video_texture_cache_create_memory (GstVideoTextureCache * cache,
+ GstAppleCoreVideoPixelBuffer *gpixbuf, guint plane, gsize size);
G_END_DECLS
diff --git a/sys/applemedia/videotexturecache.m b/sys/applemedia/videotexturecache.m
index e1bdb64..8315a3b 100644
--- a/sys/applemedia/videotexturecache.m
+++ b/sys/applemedia/videotexturecache.m
@@ -27,6 +27,7 @@
#include <gst/gl/gstglbufferpool.h>
#include "iosurfacememory.h"
#endif
+#include "iosglmemory.h"
#include "videotexturecache.h"
#include "coremediabuffer.h"
#include "corevideobuffer.h"
@@ -35,8 +36,10 @@
typedef struct _ContextThreadData
{
GstVideoTextureCache *cache;
- GstBuffer *input_buffer;
- GstBuffer *output_buffer;
+ GstAppleCoreVideoPixelBuffer *gpixbuf;
+ guint plane;
+ gsize size;
+ GstMemory *memory;
} ContextThreadData;
GstVideoTextureCache *
@@ -97,14 +100,12 @@
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)
@@ -127,40 +128,22 @@
#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 void
-_do_get_gl_buffer (GstGLContext * context, ContextThreadData * data)
+_do_create_memory (GstGLContext * context, ContextThreadData * data)
{
CVOpenGLESTextureRef texture = NULL;
GstVideoTextureCache *cache = data->cache;
- CVPixelBufferRef pixel_buf = cv_pixel_buffer_from_gst_buffer (data->input_buffer);
+ GstAppleCoreVideoPixelBuffer *gpixbuf = data->gpixbuf;
+ CVPixelBufferRef pixel_buf = gpixbuf->buf;
+ guint plane = data->plane;
+ gssize size = data->size;
GstGLTextureTarget gl_target;
- GstGLBaseMemoryAllocator *base_mem_alloc;
- GstGLVideoAllocationParams *params;
- GstBuffer *output_buffer;
-
- base_mem_alloc = GST_GL_BASE_MEMORY_ALLOCATOR (gst_gl_memory_allocator_get_default (cache->ctx));
- output_buffer = gst_buffer_new ();
- gst_buffer_copy_into (output_buffer, data->input_buffer, GST_BUFFER_COPY_ALL, 0, -1);
+ GstAppleCoreVideoMemory *memory;
+ GstIOSGLMemory *gl_memory;
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),
@@ -169,64 +152,36 @@
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);
-
- gst_buffer_replace_memory (output_buffer, 0,
- (GstMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
- (GstGLAllocationParams *) params));
- gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
+ memory = gst_apple_core_video_memory_new_wrapped (gpixbuf, plane, size);
+ gl_memory = gst_ios_gl_memory_new_wrapped (context, memory,
+ gl_target, GST_VIDEO_GL_TEXTURE_TYPE_RGBA,
+ CVOpenGLESTextureGetName (texture),
+ &cache->input_info,
+ 0, NULL, texture, (GDestroyNotify) CFRelease);
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);
-
- gst_buffer_replace_memory (output_buffer, 0,
- (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);
+ if (plane == 0)
+ textype = GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE;
+ else
+ textype = GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA;
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)
+ GST_VIDEO_INFO_COMP_WIDTH (&cache->input_info, plane),
+ GST_VIDEO_INFO_COMP_HEIGHT (&cache->input_info, plane),
+ texfmt, GL_UNSIGNED_BYTE, plane, &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);
-
- gst_buffer_replace_memory (output_buffer, 1,
- (GstMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
- (GstGLAllocationParams *) params));
- gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
+ memory = gst_apple_core_video_memory_new_wrapped (gpixbuf, plane, size);
+ gl_memory = gst_ios_gl_memory_new_wrapped (context, memory,
+ gl_target, textype, CVOpenGLESTextureGetName (texture), &cache->input_info,
+ plane, NULL, texture, (GDestroyNotify) CFRelease);
break;
}
default:
@@ -234,48 +189,27 @@
goto error;
}
- gst_object_unref (base_mem_alloc);
-
- data->output_buffer = output_buffer;
+ data->memory = GST_MEMORY_CAST (gl_memory);
return;
error:
- data->output_buffer = NULL;
-}
-#else /* !HAVE_IOS */
-static void
-_do_get_gl_buffer (GstGLContext * context, ContextThreadData * data)
-{
- GstVideoTextureCache *cache = data->cache;
- CVPixelBufferRef pixel_buf = cv_pixel_buffer_from_gst_buffer (data->input_buffer);
- IOSurfaceRef surface = CVPixelBufferGetIOSurface (pixel_buf);
-
- data->output_buffer = gst_buffer_new ();
- gst_buffer_copy_into (data->output_buffer, data->input_buffer, GST_BUFFER_COPY_ALL, 0, -1);
- 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);
-
- gst_buffer_replace_memory (data->output_buffer, i, (GstMemory *) mem);
- }
+ data->memory = NULL;
}
#endif
-GstBuffer *
-gst_video_texture_cache_get_gl_buffer (GstVideoTextureCache * cache,
- GstBuffer * cv_buffer)
+GstMemory *
+gst_video_texture_cache_create_memory (GstVideoTextureCache * cache,
+ GstAppleCoreVideoPixelBuffer *gpixbuf,
+ guint plane,
+ gsize size)
{
- ContextThreadData data = {cache, cv_buffer, NULL};
+ ContextThreadData data = {cache, gpixbuf, plane, size, NULL};
+#if HAVE_IOS
gst_gl_context_thread_add (cache->ctx,
- (GstGLContextThreadFunc) _do_get_gl_buffer, &data);
+ (GstGLContextThreadFunc) _do_create_memory, &data);
+#endif
- gst_buffer_unref (cv_buffer);
-
- return data.output_buffer;
+ return data.memory;
}
diff --git a/sys/applemedia/vtdec.c b/sys/applemedia/vtdec.c
index ae8a8e1..fc81774 100644
--- a/sys/applemedia/vtdec.c
+++ b/sys/applemedia/vtdec.c
@@ -96,7 +96,8 @@
GST_PAD_ALWAYS,
GST_STATIC_CAPS ("video/x-h264, stream-format=avc, alignment=au,"
" width=(int)[1, MAX], height=(int)[1, MAX];"
- "video/mpeg, mpegversion=2;" "image/jpeg")
+ "video/mpeg, mpegversion=2, systemstream=false, parsed=true;"
+ "image/jpeg")
);
/* define EnableHardwareAcceleratedVideoDecoder in < 10.9 */
@@ -126,8 +127,8 @@
/* Setting up pads and setting metadata should be moved to
base_class_init if you intend to subclass this class. */
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_vtdec_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_vtdec_sink_template);
gst_element_class_add_pad_template (element_class,
gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
gst_caps_from_string (VIDEO_SRC_CAPS)));
@@ -232,12 +233,30 @@
vtdec = GST_VTDEC (decoder);
if (vtdec->session)
gst_vtdec_push_frames_if_needed (vtdec, TRUE, FALSE);
- templcaps =
- gst_pad_get_pad_template_caps (GST_VIDEO_DECODER_SRC_PAD (decoder));
+
+ output_state = gst_video_decoder_get_output_state (GST_VIDEO_DECODER (vtdec));
+ if (output_state) {
+ prevcaps = gst_caps_ref (output_state->caps);
+ gst_video_codec_state_unref (output_state);
+ }
+
peercaps = gst_pad_peer_query_caps (GST_VIDEO_DECODER_SRC_PAD (vtdec), NULL);
- caps =
- gst_caps_intersect_full (peercaps, templcaps, GST_CAPS_INTERSECT_FIRST);
- gst_caps_unref (templcaps);
+ if (prevcaps && gst_caps_can_intersect (prevcaps, peercaps)) {
+ /* The hardware decoder can become (temporarily) unavailable across
+ * VTDecompressionSessionCreate/Destroy calls. So if the currently configured
+ * caps are still accepted by downstream we keep them so we don't have to
+ * destroy and recreate the session.
+ */
+ GST_INFO_OBJECT (vtdec,
+ "current and peer caps are compatible, keeping current caps");
+ caps = gst_caps_ref (prevcaps);
+ } else {
+ templcaps =
+ gst_pad_get_pad_template_caps (GST_VIDEO_DECODER_SRC_PAD (decoder));
+ caps =
+ gst_caps_intersect_full (peercaps, templcaps, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (templcaps);
+ }
gst_caps_unref (peercaps);
caps = gst_caps_truncate (gst_caps_make_writable (caps));
@@ -248,12 +267,6 @@
if (features)
features = gst_caps_features_copy (features);
- output_state = gst_video_decoder_get_output_state (GST_VIDEO_DECODER (vtdec));
- if (output_state) {
- prevcaps = gst_caps_ref (output_state->caps);
- gst_video_codec_state_unref (output_state);
- }
-
output_state = gst_video_decoder_set_output_state (GST_VIDEO_DECODER (vtdec),
format, vtdec->video_info.width, vtdec->video_info.height,
vtdec->input_state);
@@ -761,7 +774,9 @@
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);
+ buf =
+ gst_core_video_buffer_new (image_buffer, &state->info,
+ vtdec->texture_cache);
gst_video_codec_state_unref (state);
GST_BUFFER_PTS (buf) = pts.value;
GST_BUFFER_DURATION (buf) = duration.value;
@@ -805,13 +820,6 @@
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 && frame->output_buffer && vtdec->texture_cache != NULL) {
- frame->output_buffer =
- 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");
- }
/* we need to check this in case reorder_queue_length=0 (jpeg for
* example) or we're draining/flushing
diff --git a/sys/applemedia/vtenc.c b/sys/applemedia/vtenc.c
index de60272..d91ab82 100644
--- a/sys/applemedia/vtenc.c
+++ b/sys/applemedia/vtenc.c
@@ -47,6 +47,9 @@
const CFStringRef
kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder =
CFSTR ("EnableHardwareAcceleratedVideoEncoder");
+const CFStringRef
+ kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder =
+CFSTR ("RequireHardwareAcceleratedVideoEncoder");
const CFStringRef kVTCompressionPropertyKey_ProfileLevel =
CFSTR ("ProfileLevel");
const CFStringRef kVTProfileLevel_H264_Baseline_AutoLevel =
@@ -57,6 +60,12 @@
const CFStringRef kVTCompressionPropertyKey_Quality = CFSTR ("Quality");
#endif
+#ifdef HAVE_VIDEOTOOLBOX_10_9_6
+extern OSStatus
+VTCompressionSessionPrepareToEncodeFrames (VTCompressionSessionRef session)
+ __attribute__ ((weak_import));
+#endif
+
enum
{
PROP_0,
@@ -642,7 +651,7 @@
self->session = session;
GST_OBJECT_UNLOCK (self);
- return TRUE;
+ return session != NULL;
}
static gboolean
@@ -780,6 +789,8 @@
VTCompressionSessionRef session = NULL;
CFMutableDictionaryRef encoder_spec = NULL, pb_attrs;
OSStatus status;
+ const GstVTEncoderDetails *codec_details =
+ GST_VTENC_CLASS_GET_CODEC_DETAILS (G_OBJECT_GET_CLASS (self));
#if !HAVE_IOS
encoder_spec =
@@ -787,6 +798,10 @@
&kCFTypeDictionaryValueCallBacks);
gst_vtutil_dict_set_boolean (encoder_spec,
kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder, true);
+ if (codec_details->require_hardware)
+ gst_vtutil_dict_set_boolean (encoder_spec,
+ kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder,
+ TRUE);
#endif
pb_attrs = CFDictionaryCreateMutable (NULL, 0, &kCFTypeDictionaryKeyCallBacks,
@@ -1112,7 +1127,8 @@
goto cv_error;
}
- outbuf = gst_core_video_buffer_new ((CVBufferRef) pbuf, &self->video_info);
+ outbuf =
+ gst_core_video_buffer_new ((CVBufferRef) pbuf, &self->video_info, NULL);
if (!gst_video_frame_map (&outframe, &self->video_info, outbuf,
GST_MAP_WRITE)) {
gst_video_frame_unmap (&inframe);
@@ -1294,7 +1310,7 @@
/* We are dealing with block buffers here, so we don't need
* to enable the use of the video meta API on the core media buffer */
- frame->output_buffer = gst_core_media_buffer_new (sampleBuffer, FALSE);
+ frame->output_buffer = gst_core_media_buffer_new (sampleBuffer, FALSE, NULL);
beach:
/* needed anyway so the frame will be released */
@@ -1392,7 +1408,10 @@
}
static const GstVTEncoderDetails gst_vtenc_codecs[] = {
- {"H.264", "h264", "video/x-h264", kCMVideoCodecType_H264},
+ {"H.264", "h264", "video/x-h264", kCMVideoCodecType_H264, FALSE},
+#ifndef HAVE_IOS
+ {"H.264 (HW only)", "h264_hw", "video/x-h264", kCMVideoCodecType_H264, TRUE},
+#endif
};
void
diff --git a/sys/applemedia/vtenc.h b/sys/applemedia/vtenc.h
index 3bbe3c6..4c61000 100644
--- a/sys/applemedia/vtenc.h
+++ b/sys/applemedia/vtenc.h
@@ -44,6 +44,7 @@
const gchar * element_name;
const gchar * mimetype;
CMVideoCodecType format_id;
+ gboolean require_hardware;
};
struct _GstVTEncClass
diff --git a/sys/avc/Makefile.in b/sys/avc/Makefile.in
index 6724b6e..d4298c4 100644
--- a/sys/avc/Makefile.in
+++ b/sys/avc/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/avc/gstavcsrc.cpp b/sys/avc/gstavcsrc.cpp
index 6d926dc..09d3f05 100644
--- a/sys/avc/gstavcsrc.cpp
+++ b/sys/avc/gstavcsrc.cpp
@@ -99,8 +99,7 @@
{
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_avc_src_src_template));
+ gst_element_class_add_static_pad_template (element_class, &gst_avc_src_src_template);
gst_element_class_set_static_metadata (element_class,
"AVC Video Services Source", "Video/Source",
diff --git a/sys/bluez/Makefile.am b/sys/bluez/Makefile.am
index c6b13db..e1a87c9 100644
--- a/sys/bluez/Makefile.am
+++ b/sys/bluez/Makefile.am
@@ -5,7 +5,8 @@
gsta2dpsink.c \
gstavdtpsink.c \
gstavdtpsrc.c \
- gstavdtputil.c
+ gstavdtputil.c \
+ gstavrcputil.c
nodist_libgstbluez_la_SOURCES = \
$(BUILT_SOURCES)
@@ -32,7 +33,8 @@
gsta2dpsink.h \
gstavdtpsink.h \
gstavdtpsrc.h \
- gstavdtputil.h
+ gstavdtputil.h \
+ gstavrcputil.h
BUILT_SOURCES = \
bluez.h \
diff --git a/sys/bluez/Makefile.in b/sys/bluez/Makefile.in
index 862d62f..7cdd4cf 100644
--- a/sys/bluez/Makefile.in
+++ b/sys/bluez/Makefile.in
@@ -168,7 +168,8 @@
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
am_libgstbluez_la_OBJECTS = libgstbluez_la-bluez-plugin.lo \
libgstbluez_la-gsta2dpsink.lo libgstbluez_la-gstavdtpsink.lo \
- libgstbluez_la-gstavdtpsrc.lo libgstbluez_la-gstavdtputil.lo
+ libgstbluez_la-gstavdtpsrc.lo libgstbluez_la-gstavdtputil.lo \
+ libgstbluez_la-gstavrcputil.lo
am__objects_1 = libgstbluez_la-bluez.lo
nodist_libgstbluez_la_OBJECTS = $(am__objects_1)
libgstbluez_la_OBJECTS = $(am_libgstbluez_la_OBJECTS) \
@@ -308,6 +309,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -329,6 +332,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -378,6 +383,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -523,6 +530,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -649,8 +658,6 @@
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@
@@ -693,8 +700,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -789,7 +801,8 @@
gsta2dpsink.c \
gstavdtpsink.c \
gstavdtpsrc.c \
- gstavdtputil.c
+ gstavdtputil.c \
+ gstavrcputil.c
nodist_libgstbluez_la_SOURCES = \
$(BUILT_SOURCES)
@@ -817,7 +830,8 @@
gsta2dpsink.h \
gstavdtpsink.h \
gstavdtpsrc.h \
- gstavdtputil.h
+ gstavdtputil.h \
+ gstavrcputil.h
BUILT_SOURCES = \
bluez.h \
@@ -910,6 +924,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstbluez_la-gstavdtpsink.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstbluez_la-gstavdtpsrc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstbluez_la-gstavdtputil.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstbluez_la-gstavrcputil.Plo@am__quote@
.c.o:
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@@ -970,6 +985,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 $(libgstbluez_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstbluez_la_CFLAGS) $(CFLAGS) -c -o libgstbluez_la-gstavdtputil.lo `test -f 'gstavdtputil.c' || echo '$(srcdir)/'`gstavdtputil.c
+libgstbluez_la-gstavrcputil.lo: gstavrcputil.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstbluez_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstbluez_la_CFLAGS) $(CFLAGS) -MT libgstbluez_la-gstavrcputil.lo -MD -MP -MF $(DEPDIR)/libgstbluez_la-gstavrcputil.Tpo -c -o libgstbluez_la-gstavrcputil.lo `test -f 'gstavrcputil.c' || echo '$(srcdir)/'`gstavrcputil.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstbluez_la-gstavrcputil.Tpo $(DEPDIR)/libgstbluez_la-gstavrcputil.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstavrcputil.c' object='libgstbluez_la-gstavrcputil.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 $(libgstbluez_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstbluez_la_CFLAGS) $(CFLAGS) -c -o libgstbluez_la-gstavrcputil.lo `test -f 'gstavrcputil.c' || echo '$(srcdir)/'`gstavrcputil.c
+
libgstbluez_la-bluez.lo: bluez.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstbluez_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstbluez_la_CFLAGS) $(CFLAGS) -MT libgstbluez_la-bluez.lo -MD -MP -MF $(DEPDIR)/libgstbluez_la-bluez.Tpo -c -o libgstbluez_la-bluez.lo `test -f 'bluez.c' || echo '$(srcdir)/'`bluez.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstbluez_la-bluez.Tpo $(DEPDIR)/libgstbluez_la-bluez.Plo
diff --git a/sys/bluez/gsta2dpsink.c b/sys/bluez/gsta2dpsink.c
index 424b56c..6a2b50c 100644
--- a/sys/bluez/gsta2dpsink.c
+++ b/sys/bluez/gsta2dpsink.c
@@ -21,16 +21,10 @@
*
*/
-/* FIXME:
- * - the segment_event caching and re-sending should not be needed any
- * longer with sticky events
- */
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-#define GLIB_DISABLE_DEPRECATION_WARNINGS
-
#include <unistd.h>
#include "gsta2dpsink.h"
@@ -71,42 +65,17 @@
static gboolean gst_a2dp_sink_query (GstPad * pad, GstObject * parent,
GstQuery * query);
static GstCaps *gst_a2dp_sink_get_caps (GstA2dpSink * self);
-static gboolean gst_a2dp_sink_init_caps_filter (GstA2dpSink * self);
-static gboolean gst_a2dp_sink_init_fakesink (GstA2dpSink * self);
-static gboolean gst_a2dp_sink_remove_fakesink (GstA2dpSink * self);
-
-static void
-gst_a2dp_sink_finalize (GObject * obj)
-{
- GstA2dpSink *self = GST_A2DP_SINK (obj);
-
- g_mutex_clear (&self->cb_mutex);
-
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-static GstState
-gst_a2dp_sink_get_state (GstA2dpSink * self)
-{
- GstState current, pending;
-
- gst_element_get_state (GST_ELEMENT (self), ¤t, &pending, 0);
- if (pending == GST_STATE_VOID_PENDING)
- return current;
-
- return pending;
-}
/*
* Helper function to create elements, add to the bin and link it
* to another element.
*/
static GstElement *
-gst_a2dp_sink_init_element (GstA2dpSink * self,
- const gchar * elementname, const gchar * name, GstElement * link_to)
+gst_a2dp_sink_init_element (GstA2dpSink * self, const gchar * elementname,
+ const gchar * name)
{
GstElement *element;
- GstState state;
+ GstPad *sinkpad;
GST_LOG_OBJECT (self, "Initializing %s", elementname);
@@ -121,17 +90,16 @@
goto cleanup_and_fail;
}
- state = gst_a2dp_sink_get_state (self);
- if (gst_element_set_state (element, state) == GST_STATE_CHANGE_FAILURE) {
- GST_DEBUG_OBJECT (self, "%s failed to go to playing", elementname);
+ sinkpad = gst_element_get_static_pad (element, "sink");
+ if (!gst_ghost_pad_set_target (GST_GHOST_PAD (self->ghostpad), sinkpad)) {
+ GST_ERROR_OBJECT (self, "Failed to set target for ghost pad");
goto remove_element_and_fail;
}
- if (link_to != NULL)
- if (!gst_element_link (link_to, element)) {
- GST_DEBUG_OBJECT (self, "couldn't link %s", elementname);
- goto remove_element_and_fail;
- }
+ if (!gst_element_sync_state_with_parent (element)) {
+ GST_DEBUG_OBJECT (self, "%s failed to go to playing", elementname);
+ goto remove_element_and_fail;
+ }
return element;
@@ -221,21 +189,16 @@
static gboolean
gst_a2dp_sink_init_ghost_pad (GstA2dpSink * self)
{
- GstPad *capsfilter_pad;
-
- /* we search for the capsfilter sinkpad */
- capsfilter_pad = gst_element_get_static_pad (self->capsfilter, "sink");
+ GstPadTemplate *templ;
/* now we add a ghostpad */
- self->ghostpad = gst_ghost_pad_new ("sink", capsfilter_pad);
- g_object_unref (capsfilter_pad);
+ templ = gst_static_pad_template_get (&gst_a2dp_sink_factory);
+ self->ghostpad = gst_ghost_pad_new_no_target_from_template ("sink", templ);
+ g_object_unref (templ);
/* the getcaps of our ghostpad must reflect the device caps */
gst_pad_set_query_function (self->ghostpad, gst_a2dp_sink_query);
- /* we need to handle events on our own and we also need the eventfunc
- * of the ghostpad for forwarding calls */
- self->ghostpad_eventfunc = GST_PAD_EVENTFUNC (self->ghostpad);
gst_pad_set_event_function (self->ghostpad, gst_a2dp_sink_handle_event);
if (!gst_element_add_pad (GST_ELEMENT (self), self->ghostpad))
@@ -259,25 +222,15 @@
static GstStateChangeReturn
gst_a2dp_sink_change_state (GstElement * element, GstStateChange transition)
{
- GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+ GstStateChangeReturn ret;
GstA2dpSink *self = GST_A2DP_SINK (element);
switch (transition) {
case GST_STATE_CHANGE_READY_TO_PAUSED:
self->taglist = gst_tag_list_new_empty ();
-
- gst_a2dp_sink_init_fakesink (self);
break;
case GST_STATE_CHANGE_NULL_TO_READY:
- self->sink_is_in_bin = FALSE;
- self->sink =
- GST_AVDTP_SINK (gst_element_factory_make ("avdtpsink", "avdtpsink"));
- if (self->sink == NULL) {
- GST_WARNING_OBJECT (self, "failed to create avdtpsink");
- return GST_STATE_CHANGE_FAILURE;
- }
-
if (self->device != NULL)
gst_avdtp_sink_set_device (self->sink, self->device);
@@ -287,15 +240,12 @@
g_object_set (G_OBJECT (self->sink), "auto-connect",
self->autoconnect, NULL);
- ret = gst_element_set_state (GST_ELEMENT (self->sink), GST_STATE_READY);
break;
+
default:
break;
}
- if (ret == GST_STATE_CHANGE_FAILURE)
- return ret;
-
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
switch (transition) {
@@ -304,25 +254,11 @@
gst_tag_list_unref (self->taglist);
self->taglist = NULL;
}
- if (self->segment_event != NULL) {
- gst_event_unref (self->segment_event);
- self->segment_event = NULL;
- }
- gst_a2dp_sink_remove_fakesink (self);
break;
case GST_STATE_CHANGE_READY_TO_NULL:
- if (self->sink_is_in_bin) {
- if (!gst_bin_remove (GST_BIN (self), GST_ELEMENT (self->sink)))
- GST_WARNING_OBJECT (self, "Failed to remove " "avdtpsink from bin");
- } else if (self->sink != NULL) {
- gst_element_set_state (GST_ELEMENT (self->sink), GST_STATE_NULL);
- g_object_unref (G_OBJECT (self->sink));
- }
-
- self->sink = NULL;
-
gst_a2dp_sink_remove_dynamic_elements (self);
+
break;
default:
break;
@@ -342,8 +278,6 @@
object_class->set_property = GST_DEBUG_FUNCPTR (gst_a2dp_sink_set_property);
object_class->get_property = GST_DEBUG_FUNCPTR (gst_a2dp_sink_get_property);
- object_class->finalize = GST_DEBUG_FUNCPTR (gst_a2dp_sink_finalize);
-
element_class->change_state = GST_DEBUG_FUNCPTR (gst_a2dp_sink_change_state);
g_object_class_install_property (object_class, PROP_DEVICE,
@@ -366,8 +300,8 @@
GST_DEBUG_CATEGORY_INIT (gst_a2dp_sink_debug, "a2dpsink", 0,
"A2DP sink element");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_a2dp_sink_factory));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_a2dp_sink_factory);
}
GstCaps *
@@ -379,22 +313,16 @@
static GstCaps *
gst_a2dp_sink_get_caps (GstA2dpSink * self)
{
- GstCaps *caps;
- GstCaps *caps_aux;
+ GstCaps *caps = NULL;
- if (self->sink == NULL) {
- GST_DEBUG_OBJECT (self, "a2dpsink isn't initialized "
- "returning template caps");
- caps = gst_static_pad_template_get_caps (&gst_a2dp_sink_factory);
- } else {
+ if (self->sink != NULL) {
GST_LOG_OBJECT (self, "Getting device caps");
caps = gst_a2dp_sink_get_device_caps (self);
- if (caps == NULL)
- caps = gst_static_pad_template_get_caps (&gst_a2dp_sink_factory);
}
- caps_aux = gst_caps_copy (caps);
- g_object_set (self->capsfilter, "caps", caps_aux, NULL);
- gst_caps_unref (caps_aux);
+
+ if (!caps)
+ caps = gst_static_pad_template_get_caps (&gst_a2dp_sink_factory);
+
return caps;
}
@@ -403,10 +331,6 @@
{
GstElement *sink;
- /* check if we don't need a new sink */
- if (self->sink_is_in_bin)
- return TRUE;
-
if (self->sink == NULL)
sink = gst_element_factory_make ("avdtpsink", "avdtpsink");
else
@@ -422,30 +346,14 @@
goto cleanup_and_fail;
}
- if (gst_element_set_state (sink, GST_STATE_READY) == GST_STATE_CHANGE_FAILURE) {
- GST_ERROR_OBJECT (self, "avdtpsink failed to go to ready");
- goto remove_element_and_fail;
- }
-
- if (!gst_element_link (GST_ELEMENT (self->rtp), sink)) {
- GST_ERROR_OBJECT (self, "couldn't link rtpsbcpay " "to avdtpsink");
- goto remove_element_and_fail;
- }
-
self->sink = GST_AVDTP_SINK (sink);
- self->sink_is_in_bin = TRUE;
g_object_set (G_OBJECT (self->sink), "device", self->device, NULL);
g_object_set (G_OBJECT (self->sink), "transport", self->transport, NULL);
- gst_element_set_state (sink, GST_STATE_PAUSED);
+ gst_element_sync_state_with_parent (sink);
return TRUE;
-remove_element_and_fail:
- gst_element_set_state (sink, GST_STATE_NULL);
- gst_bin_remove (GST_BIN (self), sink);
- return FALSE;
-
cleanup_and_fail:
if (sink != NULL)
g_object_unref (G_OBJECT (sink));
@@ -462,8 +370,7 @@
if (self->rtp != NULL)
return TRUE;
- rtppay = gst_a2dp_sink_init_element (self, "rtpsbcpay", "rtp",
- self->capsfilter);
+ rtppay = gst_a2dp_sink_init_element (self, "rtpsbcpay", "rtp");
if (rtppay == NULL)
return FALSE;
@@ -485,12 +392,8 @@
return TRUE;
GST_LOG_OBJECT (self, "Initializing rtp mpeg element");
- /* if capsfilter is not created then we can't have our rtp element */
- if (self->capsfilter == NULL)
- return FALSE;
- rtppay = gst_a2dp_sink_init_element (self, "rtpmpapay", "rtp",
- self->capsfilter);
+ rtppay = gst_a2dp_sink_init_element (self, "rtpmpapay", "rtp");
if (rtppay == NULL)
return FALSE;
@@ -506,15 +409,11 @@
{
GstStructure *structure;
GstEvent *event;
- GstPad *capsfilterpad;
gboolean crc;
gchar *mode = NULL;
structure = gst_caps_get_structure (caps, 0);
- /* before everything we need to remove fakesink */
- gst_a2dp_sink_remove_fakesink (self);
-
/* first, we need to create our rtp payloader */
if (gst_structure_has_name (structure, "audio/x-sbc")) {
GST_LOG_OBJECT (self, "sbc media received");
@@ -529,8 +428,10 @@
return FALSE;
}
- if (!gst_a2dp_sink_init_avdtp_sink (self))
+ if (!gst_element_link (GST_ELEMENT (self->rtp), GST_ELEMENT (self->sink))) {
+ GST_ERROR_OBJECT (self, "couldn't link rtpsbcpay " "to avdtpsink");
return FALSE;
+ }
/* check if we should push the taglist FIXME should we push this?
* we can send the tags directly if needed */
@@ -545,71 +446,42 @@
if (gst_tag_list_get_string (self->taglist, "channel-mode", &mode))
gst_avdtp_sink_set_channel_mode (self->sink, mode);
- capsfilterpad = gst_ghost_pad_get_target (GST_GHOST_PAD (self->ghostpad));
- gst_pad_send_event (capsfilterpad, event);
+ gst_pad_send_event (self->ghostpad, event);
+
self->taglist = NULL;
g_free (mode);
}
- if (!gst_avdtp_sink_set_device_caps (self->sink, caps))
- return FALSE;
-
g_object_set (self->rtp, "mtu",
gst_avdtp_sink_get_link_mtu (self->sink), NULL);
-#if 0
- /* we forward our new segment here if we have one (FIXME: not needed any more) */
- if (self->segment_event) {
- gst_pad_send_event (GST_BASE_RTP_PAYLOAD_SINKPAD (self->rtp),
- self->segment_event);
- self->segment_event = NULL;
- }
-#endif
-
return TRUE;
}
-/* used for catching newsegment events while we don't have a sink, for
- * later forwarding it to the sink */
static gboolean
gst_a2dp_sink_handle_event (GstPad * pad, GstObject * pad_parent,
GstEvent * event)
{
GstA2dpSink *self;
GstTagList *taglist = NULL;
- GstObject *parent;
self = GST_A2DP_SINK (pad_parent);
- parent = gst_element_get_parent (GST_ELEMENT (self->sink));
- if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT &&
- parent != GST_OBJECT_CAST (self)) {
- if (self->segment_event != NULL)
- gst_event_unref (self->segment_event);
- self->segment_event = gst_event_ref (event);
-
- } else if (GST_EVENT_TYPE (event) == GST_EVENT_TAG &&
- parent != GST_OBJECT_CAST (self)) {
+ if (GST_EVENT_TYPE (event) == GST_EVENT_TAG) {
if (self->taglist == NULL)
gst_event_parse_tag (event, &self->taglist);
else {
gst_event_parse_tag (event, &taglist);
gst_tag_list_insert (self->taglist, taglist, GST_TAG_MERGE_REPLACE);
}
- } else if (GST_EVENT_TYPE (event) == GST_EVENT_CAPS &&
- parent != GST_OBJECT_CAST (self)) {
+ } else if (GST_EVENT_TYPE (event) == GST_EVENT_CAPS) {
GstCaps *caps = NULL;
- /* FIXME: really check for parent != self above? */
- /* now we know the caps */
gst_event_parse_caps (event, &caps);
gst_a2dp_sink_init_dynamic_elements (self, caps);
}
- if (parent != NULL)
- gst_object_unref (GST_OBJECT (parent));
-
- return self->ghostpad_eventfunc (self->ghostpad, GST_OBJECT (self), event);
+ return gst_pad_event_default (pad, pad_parent, event);
}
static gboolean
@@ -626,91 +498,24 @@
gst_caps_unref (caps);
ret = TRUE;
} else {
- ret = sink->ghostpad_queryfunc (pad, parent, query);
+ ret = gst_pad_query_default (pad, parent, query);
}
return ret;
}
-
-static gboolean
-gst_a2dp_sink_init_caps_filter (GstA2dpSink * self)
-{
- GstElement *element;
-
- element = gst_element_factory_make ("capsfilter", "filter");
- if (element == NULL)
- goto failed;
-
- if (!gst_bin_add (GST_BIN (self), element))
- goto failed;
-
- self->capsfilter = element;
- return TRUE;
-
-failed:
- GST_ERROR_OBJECT (self, "Failed to initialize caps filter");
- return FALSE;
-}
-
-static gboolean
-gst_a2dp_sink_init_fakesink (GstA2dpSink * self)
-{
- if (self->fakesink != NULL)
- return TRUE;
-
- g_mutex_lock (&self->cb_mutex);
- self->fakesink = gst_a2dp_sink_init_element (self, "fakesink",
- "fakesink", self->capsfilter);
- g_mutex_unlock (&self->cb_mutex);
-
- if (!self->fakesink)
- return FALSE;
-
- return TRUE;
-}
-
-static gboolean
-gst_a2dp_sink_remove_fakesink (GstA2dpSink * self)
-{
- g_mutex_lock (&self->cb_mutex);
-
- if (self->fakesink != NULL) {
- gst_element_set_locked_state (self->fakesink, TRUE);
- gst_element_set_state (self->fakesink, GST_STATE_NULL);
-
- gst_bin_remove (GST_BIN (self), self->fakesink);
- self->fakesink = NULL;
- }
-
- g_mutex_unlock (&self->cb_mutex);
-
- return TRUE;
-}
-
static void
gst_a2dp_sink_init (GstA2dpSink * self)
{
self->sink = NULL;
- self->fakesink = NULL;
self->rtp = NULL;
self->device = NULL;
self->transport = NULL;
self->autoconnect = DEFAULT_AUTOCONNECT;
- self->capsfilter = NULL;
- self->segment_event = NULL;
self->taglist = NULL;
self->ghostpad = NULL;
- self->sink_is_in_bin = FALSE;
-
- g_mutex_init (&self->cb_mutex);
-
- /* we initialize our capsfilter */
- gst_a2dp_sink_init_caps_filter (self);
- g_object_set (self->capsfilter, "caps",
- gst_static_pad_template_get_caps (&gst_a2dp_sink_factory), NULL);
-
- gst_a2dp_sink_init_fakesink (self);
gst_a2dp_sink_init_ghost_pad (self);
+
+ gst_a2dp_sink_init_avdtp_sink (self);
}
diff --git a/sys/bluez/gsta2dpsink.h b/sys/bluez/gsta2dpsink.h
index 20c40e8..bbfe87b 100644
--- a/sys/bluez/gsta2dpsink.h
+++ b/sys/bluez/gsta2dpsink.h
@@ -47,24 +47,16 @@
GstElement *rtp;
GstAvdtpSink *sink;
- GstElement *capsfilter;
- GstElement *fakesink;
gchar *device;
gchar *transport;
gboolean autoconnect;
- gboolean sink_is_in_bin;
GstPad *ghostpad;
- GstPadQueryFunction ghostpad_queryfunc;
- GstPadEventFunction ghostpad_eventfunc;
- GstEvent *segment_event;
/* Store the tags received before the a2dpsender sink is created
* when it is created we forward this to it */
GstTagList *taglist;
-
- GMutex cb_mutex;
};
struct _GstA2dpSinkClass
diff --git a/sys/bluez/gstavdtpsink.c b/sys/bluez/gstavdtpsink.c
index 0f72a74..c6463d5 100644
--- a/sys/bluez/gstavdtpsink.c
+++ b/sys/bluez/gstavdtpsink.c
@@ -244,7 +244,7 @@
gst_tag_list_foreach (taglist, gst_avdtp_sink_tag, self);
}
- return TRUE;
+ return GST_BASE_SINK_CLASS (parent_class)->event (basesink, event);
}
static gboolean
@@ -381,8 +381,8 @@
GST_DEBUG_CATEGORY_INIT (avdtp_sink_debug, "avdtpsink", 0,
"A2DP headset sink element");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&avdtp_sink_factory));
+ gst_element_class_add_static_pad_template (element_class,
+ &avdtp_sink_factory);
gst_element_class_set_static_metadata (element_class, "Bluetooth AVDTP sink",
"Sink/Audio", "Plays audio to an A2DP device",
@@ -427,21 +427,6 @@
return gst_caps_copy (sink->dev_caps);
}
-gboolean
-gst_avdtp_sink_set_device_caps (GstAvdtpSink * self, GstCaps * caps)
-{
- GST_DEBUG_OBJECT (self, "setting device caps");
- GST_AVDTP_SINK_MUTEX_LOCK (self);
-
- if (self->stream_caps)
- gst_caps_unref (self->stream_caps);
- self->stream_caps = gst_caps_ref (caps);
-
- GST_AVDTP_SINK_MUTEX_UNLOCK (self);
-
- return TRUE;
-}
-
guint
gst_avdtp_sink_get_link_mtu (GstAvdtpSink * sink)
{
diff --git a/sys/bluez/gstavdtpsink.h b/sys/bluez/gstavdtpsink.h
index 91eba40..c6b60b7 100644
--- a/sys/bluez/gstavdtpsink.h
+++ b/sys/bluez/gstavdtpsink.h
@@ -74,7 +74,6 @@
GType gst_avdtp_sink_get_type (void);
GstCaps *gst_avdtp_sink_get_device_caps (GstAvdtpSink * sink);
-gboolean gst_avdtp_sink_set_device_caps (GstAvdtpSink * sink, GstCaps * caps);
guint gst_avdtp_sink_get_link_mtu (GstAvdtpSink * sink);
diff --git a/sys/bluez/gstavdtpsrc.c b/sys/bluez/gstavdtpsrc.c
index fee5505..1c68e45 100644
--- a/sys/bluez/gstavdtpsrc.c
+++ b/sys/bluez/gstavdtpsrc.c
@@ -68,6 +68,8 @@
const GValue * value, GParamSpec * pspec);
static GstCaps *gst_avdtp_src_getcaps (GstBaseSrc * bsrc, GstCaps * filter);
+static gboolean gst_avdtp_src_query (GstPad * pad, GstObject * parent,
+ GstQuery * query);
static gboolean gst_avdtp_src_start (GstBaseSrc * bsrc);
static gboolean gst_avdtp_src_stop (GstBaseSrc * bsrc);
static GstFlowReturn gst_avdtp_src_create (GstBaseSrc * bsrc, guint64 offset,
@@ -108,8 +110,8 @@
GST_DEBUG_CATEGORY_INIT (avdtpsrc_debug, "avdtpsrc", 0,
"Bluetooth AVDTP Source");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_avdtp_src_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_avdtp_src_template);
}
static void
@@ -117,9 +119,14 @@
{
avdtpsrc->poll = gst_poll_new (TRUE);
+ avdtpsrc->duration = GST_CLOCK_TIME_NONE;
+
gst_base_src_set_format (GST_BASE_SRC (avdtpsrc), GST_FORMAT_TIME);
gst_base_src_set_live (GST_BASE_SRC (avdtpsrc), TRUE);
gst_base_src_set_do_timestamp (GST_BASE_SRC (avdtpsrc), TRUE);
+
+ gst_pad_set_query_function (GST_BASE_SRC_PAD (avdtpsrc),
+ GST_DEBUG_FUNCPTR (gst_avdtp_src_query));
}
static void
@@ -169,6 +176,35 @@
}
}
+static gboolean
+gst_avdtp_src_query (GstPad * pad, GstObject * parent, GstQuery * query)
+{
+ GstAvdtpSrc *avdtpsrc = GST_AVDTP_SRC (gst_pad_get_parent_element (pad));
+ gboolean ret = FALSE;
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_DURATION:{
+ GstFormat format;
+
+ if (avdtpsrc->duration != GST_CLOCK_TIME_NONE) {
+ gst_query_parse_duration (query, &format, NULL);
+
+ if (format == GST_FORMAT_TIME) {
+ gst_query_set_duration (query, format, (gint64) avdtpsrc->duration);
+ ret = TRUE;
+ }
+ }
+
+ break;
+ }
+
+ default:
+ ret = gst_pad_query_default (pad, parent, query);
+ }
+
+ return ret;
+}
+
static GstCaps *
gst_avdtp_src_getcaps (GstBaseSrc * bsrc, GstCaps * filter)
{
@@ -247,6 +283,54 @@
return ret;
}
+static void
+avrcp_metadata_cb (GstAvrcpConnection * avrcp, GstTagList * taglist,
+ gpointer user_data)
+{
+ GstAvdtpSrc *src = GST_AVDTP_SRC (user_data);
+ guint64 duration;
+
+ if (gst_tag_list_get_uint64 (taglist, GST_TAG_DURATION, &duration)) {
+ src->duration = duration;
+ gst_element_post_message (GST_ELEMENT (src),
+ gst_message_new_duration_changed (GST_OBJECT (src)));
+ }
+
+ gst_pad_push_event (GST_BASE_SRC_PAD (src),
+ gst_event_new_tag (gst_tag_list_copy (taglist)));
+ gst_element_post_message (GST_ELEMENT (src),
+ gst_message_new_tag (GST_OBJECT (src), taglist));
+}
+
+static void
+gst_avdtp_src_start_avrcp (GstAvdtpSrc * src)
+{
+ gchar *path, **strv;
+ int i;
+
+ /* Strip out the /fdX in /org/bluez/dev_.../fdX */
+ strv = g_strsplit (src->conn.transport, "/", -1);
+
+ for (i = 0; strv[i]; i++);
+ g_return_if_fail (i > 0);
+
+ g_free (strv[i - 1]);
+ strv[i - 1] = NULL;
+
+ path = g_strjoinv ("/", strv);
+ g_strfreev (strv);
+
+ src->avrcp = gst_avrcp_connection_new (path, avrcp_metadata_cb, src, NULL);
+
+ g_free (path);
+}
+
+static void
+gst_avdtp_src_stop_avrcp (GstAvdtpSrc * src)
+{
+ gst_avrcp_connection_free (src->avrcp);
+}
+
static gboolean
gst_avdtp_src_start (GstBaseSrc * bsrc)
{
@@ -291,6 +375,8 @@
g_atomic_int_set (&avdtpsrc->unlocked, FALSE);
+ gst_avdtp_src_start_avrcp (avdtpsrc);
+
return TRUE;
fail:
@@ -306,6 +392,7 @@
gst_poll_remove_fd (avdtpsrc->poll, &avdtpsrc->pfd);
gst_poll_set_flushing (avdtpsrc->poll, TRUE);
+ gst_avdtp_src_stop_avrcp (avdtpsrc);
gst_avdtp_connection_release (&avdtpsrc->conn);
if (avdtpsrc->dev_caps) {
diff --git a/sys/bluez/gstavdtpsrc.h b/sys/bluez/gstavdtpsrc.h
index 67027fa..334ff15 100644
--- a/sys/bluez/gstavdtpsrc.h
+++ b/sys/bluez/gstavdtpsrc.h
@@ -27,6 +27,7 @@
#include <gst/gst.h>
#include <gst/base/gstbasesrc.h>
#include "gstavdtputil.h"
+#include "gstavrcputil.h"
G_BEGIN_DECLS
#define GST_TYPE_AVDTP_SRC \
@@ -54,9 +55,13 @@
GstAvdtpConnection conn;
GstCaps *dev_caps;
+ GstAvrcpConnection *avrcp;
+
GstPoll *poll;
GstPollFD pfd;
volatile gint unlocked;
+
+ GstClockTime duration;
};
GType gst_avdtp_src_get_type (void);
diff --git a/sys/bluez/gstavrcputil.c b/sys/bluez/gstavrcputil.c
new file mode 100644
index 0000000..efce32d
--- /dev/null
+++ b/sys/bluez/gstavrcputil.c
@@ -0,0 +1,333 @@
+/*
+ * Copyright (C) 2015 Arun Raghavan <git@arunraghavan.net>
+ *
+ *
+ * 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gstavrcputil.h"
+#include "bluez.h"
+
+#include <gio/gio.h>
+
+#define BLUEZ_NAME "org.bluez"
+#define BLUEZ_PATH "/"
+#define BLUEZ_MEDIA_PLAYER_IFACE BLUEZ_NAME ".MediaPlayer1"
+
+struct _GstAvrcpConnection
+{
+ GMainContext *context;
+ GMainLoop *mainloop;
+ GThread *thread;
+
+ gchar *dev_path;
+ GDBusObjectManager *manager;
+ BluezMediaPlayer1 *player;
+
+ GstAvrcpMetadataCb cb;
+ gpointer user_data;
+ GDestroyNotify user_data_free_cb;
+};
+
+static const char *
+tag_from_property (const char *name)
+{
+ if (g_str_equal (name, "Title"))
+ return GST_TAG_TITLE;
+ else if (g_str_equal (name, "Artist"))
+ return GST_TAG_ARTIST;
+ else if (g_str_equal (name, "Album"))
+ return GST_TAG_ALBUM;
+ else if (g_str_equal (name, "Genre"))
+ return GST_TAG_GENRE;
+ else if (g_str_equal (name, "NumberOfTracks"))
+ return GST_TAG_TRACK_COUNT;
+ else if (g_str_equal (name, "TrackNumber"))
+ return GST_TAG_TRACK_NUMBER;
+ else if (g_str_equal (name, "Duration"))
+ return GST_TAG_DURATION;
+ else
+ return NULL;
+}
+
+static GstTagList *
+tag_list_from_variant (GVariant * properties, gboolean track)
+{
+ const gchar *name, *s;
+ GVariant *value;
+ GVariantIter *iter;
+ GstTagList *taglist = NULL;
+
+ iter = g_variant_iter_new (properties);
+
+ if (track)
+ taglist = gst_tag_list_new_empty ();
+
+ /* The properties are in two levels -- at the top level we have the position
+ * and the 'track'. The 'track' is another level of {sv} so we recurse one
+ * level to pick up the actual track data. We get the taglist from the
+ * recursive call, and ignore the position for now. */
+
+ while (g_variant_iter_next (iter, "{&sv}", &name, &value)) {
+ if (!track && g_str_equal (name, "Track")) {
+ /* Top level property */
+ taglist = tag_list_from_variant (value, TRUE);
+
+ } else if (track) {
+ /* If we get here, we are in the recursive call and we're dealing with
+ * properties under "Track" */
+ GType type;
+ const gchar *tag;
+ guint i;
+ guint64 i64;
+
+ tag = tag_from_property (name);
+ if (!tag)
+ goto next;
+
+ type = gst_tag_get_type (tag);
+
+ switch (type) {
+ case G_TYPE_STRING:
+ s = g_variant_get_string (value, NULL);
+ if (s && s[0] != '\0')
+ gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, tag, s, NULL);
+ break;
+
+ case G_TYPE_UINT:
+ i = g_variant_get_uint32 (value);
+ if (i > 0)
+ gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, tag, i, NULL);
+ break;
+
+ case G_TYPE_UINT64:
+ /* If we're here, the tag is 'duration' */
+ i64 = g_variant_get_uint32 (value);
+ if (i64 > 0 && i64 != (guint32) (-1)) {
+ gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, tag,
+ i64 * GST_MSECOND, NULL);
+ }
+ break;
+
+ default:
+ GST_WARNING ("Unknown property: %s", name);
+ break;
+ }
+ }
+
+ next:
+ g_variant_unref (value);
+ }
+
+ g_variant_iter_free (iter);
+
+ if (taglist && gst_tag_list_is_empty (taglist)) {
+ gst_tag_list_unref (taglist);
+ taglist = NULL;
+ }
+
+ return taglist;
+}
+
+static void
+player_property_changed_cb (GDBusProxy * proxy, GVariant * properties,
+ GStrv invalid, gpointer user_data)
+{
+ GstAvrcpConnection *avrcp = (GstAvrcpConnection *) user_data;
+ GstTagList *taglist;
+
+ taglist = tag_list_from_variant (properties, FALSE);
+
+ if (taglist)
+ avrcp->cb (avrcp, taglist, avrcp->user_data);
+}
+
+static GstTagList *
+player_get_taglist (BluezMediaPlayer1 * player)
+{
+ GstTagList *taglist = NULL;
+ GVariant *track;
+
+ track = bluez_media_player1_get_track (player);
+ if (track)
+ taglist = tag_list_from_variant (track, TRUE);
+
+ return taglist;
+}
+
+static void
+gst_avrcp_connection_set_player (GstAvrcpConnection * avrcp,
+ BluezMediaPlayer1 * player)
+{
+ GstTagList *taglist;
+
+ if (avrcp->player)
+ g_object_unref (avrcp->player);
+
+ if (!player) {
+ avrcp->player = NULL;
+ return;
+ }
+
+ avrcp->player = g_object_ref (player);
+
+ g_signal_connect (player, "g-properties-changed",
+ G_CALLBACK (player_property_changed_cb), avrcp);
+
+ taglist = player_get_taglist (avrcp->player);
+
+ if (taglist)
+ avrcp->cb (avrcp, taglist, avrcp->user_data);
+}
+
+static BluezMediaPlayer1 *
+media_player_from_dbus_object (GDBusObject * object)
+{
+ return (BluezMediaPlayer1 *) g_dbus_object_get_interface (object,
+ BLUEZ_MEDIA_PLAYER_IFACE);
+}
+
+static GType
+manager_proxy_type_func (GDBusObjectManagerClient * manager,
+ const gchar * object_path, const gchar * interface_name, gpointer user_data)
+{
+ if (!interface_name)
+ return G_TYPE_DBUS_OBJECT_PROXY;
+
+ if (g_str_equal (interface_name, BLUEZ_MEDIA_PLAYER_IFACE))
+ return BLUEZ_TYPE_MEDIA_PLAYER1_PROXY;
+
+ return G_TYPE_DBUS_PROXY;
+}
+
+static void
+manager_object_added_cb (GDBusObjectManager * manager,
+ GDBusObject * object, gpointer user_data)
+{
+ GstAvrcpConnection *avrcp = (GstAvrcpConnection *) user_data;
+ BluezMediaPlayer1 *player;
+
+ if (!(player = media_player_from_dbus_object (object)))
+ return;
+
+ gst_avrcp_connection_set_player (avrcp, player);
+}
+
+static void
+manager_object_removed_cb (GDBusObjectManager * manager,
+ GDBusObject * object, gpointer user_data)
+{
+ GstAvrcpConnection *avrcp = (GstAvrcpConnection *) user_data;
+ BluezMediaPlayer1 *player;
+
+ if (!(player = media_player_from_dbus_object (object)))
+ return;
+
+ if (player == avrcp->player)
+ gst_avrcp_connection_set_player (avrcp, NULL);
+}
+
+static void
+manager_ready_cb (GObject * object, GAsyncResult * res, gpointer user_data)
+{
+ GstAvrcpConnection *avrcp = (GstAvrcpConnection *) user_data;
+ GList *objects, *i;
+ GError *err = NULL;
+
+ avrcp->manager = g_dbus_object_manager_client_new_for_bus_finish (res, &err);
+ if (!avrcp->manager) {
+ GST_WARNING ("Could not create ObjectManager proxy: %s", err->message);
+ g_error_free (err);
+ return;
+ }
+
+ g_signal_connect (avrcp->manager, "object-added",
+ G_CALLBACK (manager_object_added_cb), avrcp);
+ g_signal_connect (avrcp->manager, "object-removed",
+ G_CALLBACK (manager_object_removed_cb), avrcp);
+
+ objects = g_dbus_object_manager_get_objects (avrcp->manager);
+
+ for (i = objects; i; i = i->next) {
+ BluezMediaPlayer1 *player =
+ media_player_from_dbus_object (G_DBUS_OBJECT (i->data));
+
+ if (player && g_str_equal (avrcp->dev_path,
+ bluez_media_player1_get_device (player))) {
+ gst_avrcp_connection_set_player (avrcp, player);
+ break;
+ }
+ }
+
+ g_list_free_full (objects, g_object_unref);
+}
+
+GstAvrcpConnection *
+gst_avrcp_connection_new (const gchar * dev_path, GstAvrcpMetadataCb cb,
+ gpointer user_data, GDestroyNotify user_data_free_cb)
+{
+ GstAvrcpConnection *avrcp;
+
+ avrcp = g_new0 (GstAvrcpConnection, 1);
+
+ avrcp->cb = cb;
+ avrcp->user_data = user_data;
+ avrcp->user_data_free_cb = user_data_free_cb;
+
+ avrcp->context = g_main_context_new ();
+ avrcp->mainloop = g_main_loop_new (avrcp->context, FALSE);
+
+ avrcp->dev_path = g_strdup (dev_path);
+
+ g_main_context_push_thread_default (avrcp->context);
+
+ g_dbus_object_manager_client_new_for_bus (G_BUS_TYPE_SYSTEM,
+ G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE, BLUEZ_NAME, BLUEZ_PATH,
+ manager_proxy_type_func, NULL, NULL, NULL, manager_ready_cb, avrcp);
+
+ g_main_context_pop_thread_default (avrcp->context);
+
+ avrcp->thread = g_thread_new ("gstavrcp", (GThreadFunc) g_main_loop_run,
+ avrcp->mainloop);
+
+ return avrcp;
+}
+
+void
+gst_avrcp_connection_free (GstAvrcpConnection * avrcp)
+{
+ g_main_loop_quit (avrcp->mainloop);
+ g_main_loop_unref (avrcp->mainloop);
+
+ g_main_context_unref (avrcp->context);
+
+ g_thread_join (avrcp->thread);
+
+ if (avrcp->player)
+ g_object_unref (avrcp->player);
+
+ if (avrcp->manager)
+ g_object_unref (avrcp->manager);
+
+ if (avrcp->user_data_free_cb)
+ avrcp->user_data_free_cb (avrcp->user_data);
+
+ g_free (avrcp->dev_path);
+ g_free (avrcp);
+}
diff --git a/sys/bluez/gstavrcputil.h b/sys/bluez/gstavrcputil.h
new file mode 100644
index 0000000..b59aa3c
--- /dev/null
+++ b/sys/bluez/gstavrcputil.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2015 Arun Raghavan <git@arunraghavan.net>
+ *
+ *
+ * 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef __GST_AVRCP_UTIL_H
+#define __GST_AVRCP_UTIL_H
+
+#include <gst/gst.h>
+
+typedef struct _GstAvrcpConnection GstAvrcpConnection;
+
+typedef void (*GstAvrcpMetadataCb) (GstAvrcpConnection *, GstTagList *,
+ gpointer);
+
+GstAvrcpConnection *
+gst_avrcp_connection_new (const gchar * dev_path, GstAvrcpMetadataCb cb,
+ gpointer user_data, GDestroyNotify user_data_free_cb);
+
+void gst_avrcp_connection_free (GstAvrcpConnection * avrcp);
+
+#endif /* __GST_AVRCP_UTIL_H */
diff --git a/sys/bluez/org.bluez.xml b/sys/bluez/org.bluez.xml
index ff52ee3..facae70 100644
--- a/sys/bluez/org.bluez.xml
+++ b/sys/bluez/org.bluez.xml
@@ -26,4 +26,28 @@
<property name="Delay" type="q" access="read"></property>
<property name="Volume" type="q" access="readwrite"></property>
</interface>
+
+<interface name="org.bluez.MediaPlayer1">
+ <method name="Play"/>
+ <method name="Pause"/>
+ <method name="Stop"/>
+ <method name="Next"/>
+ <method name="Previous"/>
+ <method name="FastForward"/>
+ <method name="Rewind"/>
+ <property name="Name" type="s" access="read"/>
+ <property name="Type" type="s" access="read"/>
+ <property name="Subtype" type="s" access="read"/>
+ <property name="Position" type="u" access="read"/>
+ <property name="Status" type="s" access="read"/>
+ <property name="Equalizer" type="s" access="readwrite"/>
+ <property name="Repeat" type="s" access="readwrite"/>
+ <property name="Shuffle" type="s" access="readwrite"/>
+ <property name="Scan" type="s" access="readwrite"/>
+ <property name="Track" type="a{sv}" access="read"/>
+ <property name="Device" type="o" access="read"/>
+ <property name="Browsable" type="b" access="read"/>
+ <property name="Searchable" type="b" access="read"/>
+ <property name="Playlist" type="o" access="read"/>
+</interface>
</node>
diff --git a/sys/d3dvideosink/Makefile.in b/sys/d3dvideosink/Makefile.in
index e14d0ce..4ba579a 100644
--- a/sys/d3dvideosink/Makefile.in
+++ b/sys/d3dvideosink/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/d3dvideosink/d3dhelpers.h b/sys/d3dvideosink/d3dhelpers.h
index 4145f78..3662329 100644
--- a/sys/d3dvideosink/d3dhelpers.h
+++ b/sys/d3dvideosink/d3dhelpers.h
@@ -44,7 +44,6 @@
#endif
#include <d3d9.h>
-#include <d3dx9tex.h>
typedef struct _GstD3DVideoSink GstD3DVideoSink;
typedef struct _GstD3DVideoSinkClass GstD3DVideoSinkClass;
diff --git a/sys/d3dvideosink/d3dvideosink.c b/sys/d3dvideosink/d3dvideosink.c
index 5888641..88e201e 100644
--- a/sys/d3dvideosink/d3dvideosink.c
+++ b/sys/d3dvideosink/d3dvideosink.c
@@ -156,8 +156,7 @@
"Display data using a Direct3D video renderer",
"David Hoyt <dhoyt@hoytsoft.org>, Roland Krikava <info@bluedigits.com>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_template));
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_template);
g_rec_mutex_init (&klass->lock);
}
diff --git a/sys/decklink/Makefile.in b/sys/decklink/Makefile.in
index b05c31c..23c0596 100644
--- a/sys/decklink/Makefile.in
+++ b/sys/decklink/Makefile.in
@@ -324,6 +324,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -345,6 +347,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -394,6 +398,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -539,6 +545,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -665,8 +673,6 @@
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@
@@ -709,8 +715,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/decklink/gstdecklink.cpp b/sys/decklink/gstdecklink.cpp
index 8df23af..184f124 100644
--- a/sys/decklink/gstdecklink.cpp
+++ b/sys/decklink/gstdecklink.cpp
@@ -38,44 +38,44 @@
{
static gsize id = 0;
static const GEnumValue modes[] = {
- {GST_DECKLINK_MODE_AUTO, "auto", "Automatic detection"},
+ {GST_DECKLINK_MODE_AUTO, "Automatic detection", "auto"},
- {GST_DECKLINK_MODE_NTSC, "ntsc", "NTSC SD 60i"},
- {GST_DECKLINK_MODE_NTSC2398, "ntsc2398", "NTSC SD 60i (24 fps)"},
- {GST_DECKLINK_MODE_PAL, "pal", "PAL SD 50i"},
- {GST_DECKLINK_MODE_NTSC_P, "ntsc-p", "NTSC SD 60p"},
- {GST_DECKLINK_MODE_PAL_P, "pal-p", "PAL SD 50p"},
+ {GST_DECKLINK_MODE_NTSC, "NTSC SD 60i", "ntsc"},
+ {GST_DECKLINK_MODE_NTSC2398, "NTSC SD 60i (24 fps)", "ntsc2398"},
+ {GST_DECKLINK_MODE_PAL, "PAL SD 50i", "pal"},
+ {GST_DECKLINK_MODE_NTSC_P, "NTSC SD 60p", "ntsc-p"},
+ {GST_DECKLINK_MODE_PAL_P, "PAL SD 50p", "pal-p"},
- {GST_DECKLINK_MODE_1080p2398, "1080p2398", "HD1080 23.98p"},
- {GST_DECKLINK_MODE_1080p24, "1080p24", "HD1080 24p"},
- {GST_DECKLINK_MODE_1080p25, "1080p25", "HD1080 25p"},
- {GST_DECKLINK_MODE_1080p2997, "1080p2997", "HD1080 29.97p"},
- {GST_DECKLINK_MODE_1080p30, "1080p30", "HD1080 30p"},
+ {GST_DECKLINK_MODE_1080p2398, "HD1080 23.98p", "1080p2398"},
+ {GST_DECKLINK_MODE_1080p24, "HD1080 24p", "1080p24"},
+ {GST_DECKLINK_MODE_1080p25, "HD1080 25p", "1080p25"},
+ {GST_DECKLINK_MODE_1080p2997, "HD1080 29.97p", "1080p2997"},
+ {GST_DECKLINK_MODE_1080p30, "HD1080 30p", "1080p30"},
- {GST_DECKLINK_MODE_1080i50, "1080i50", "HD1080 50i"},
- {GST_DECKLINK_MODE_1080i5994, "1080i5994", "HD1080 59.94i"},
- {GST_DECKLINK_MODE_1080i60, "1080i60", "HD1080 60i"},
+ {GST_DECKLINK_MODE_1080i50, "HD1080 50i", "1080i50"},
+ {GST_DECKLINK_MODE_1080i5994, "HD1080 59.94i", "1080i5994"},
+ {GST_DECKLINK_MODE_1080i60, "HD1080 60i", "1080i60"},
- {GST_DECKLINK_MODE_1080p50, "1080p50", "HD1080 50p"},
- {GST_DECKLINK_MODE_1080p5994, "1080p5994", "HD1080 59.94p"},
- {GST_DECKLINK_MODE_1080p60, "1080p60", "HD1080 60p"},
+ {GST_DECKLINK_MODE_1080p50, "HD1080 50p", "1080p50"},
+ {GST_DECKLINK_MODE_1080p5994, "HD1080 59.94p", "1080p5994"},
+ {GST_DECKLINK_MODE_1080p60, "HD1080 60p", "1080p60"},
- {GST_DECKLINK_MODE_720p50, "720p50", "HD720 50p"},
- {GST_DECKLINK_MODE_720p5994, "720p5994", "HD720 59.94p"},
- {GST_DECKLINK_MODE_720p60, "720p60", "HD720 60p"},
+ {GST_DECKLINK_MODE_720p50, "HD720 50p", "720p50"},
+ {GST_DECKLINK_MODE_720p5994, "HD720 59.94p", "720p5994"},
+ {GST_DECKLINK_MODE_720p60, "HD720 60p", "720p60"},
- {GST_DECKLINK_MODE_1556p2398, "1556p2398", "2k 23.98p"},
- {GST_DECKLINK_MODE_1556p24, "1556p24", "2k 24p"},
- {GST_DECKLINK_MODE_1556p25, "1556p25", "2k 25p"},
+ {GST_DECKLINK_MODE_1556p2398, "2k 23.98p", "1556p2398"},
+ {GST_DECKLINK_MODE_1556p24, "2k 24p", "1556p24"},
+ {GST_DECKLINK_MODE_1556p25, "2k 25p", "1556p25"},
- {GST_DECKLINK_MODE_2160p2398, "2160p2398", "4k 23.98p"},
- {GST_DECKLINK_MODE_2160p24, "2160p24", "4k 24p"},
- {GST_DECKLINK_MODE_2160p25, "2160p25", "4k 25p"},
- {GST_DECKLINK_MODE_2160p2997, "2160p2997", "4k 29.97p"},
- {GST_DECKLINK_MODE_2160p30, "2160p30", "4k 30p"},
- {GST_DECKLINK_MODE_2160p50, "2160p50", "4k 50p"},
- {GST_DECKLINK_MODE_2160p5994, "2160p5994", "4k 59.94p"},
- {GST_DECKLINK_MODE_2160p60, "2160p60", "4k 60p"},
+ {GST_DECKLINK_MODE_2160p2398, "4k 23.98p", "2160p2398"},
+ {GST_DECKLINK_MODE_2160p24, "4k 24p", "2160p24"},
+ {GST_DECKLINK_MODE_2160p25, "4k 25p", "2160p25"},
+ {GST_DECKLINK_MODE_2160p2997, "4k 29.97p", "2160p2997"},
+ {GST_DECKLINK_MODE_2160p30, "4k 30p", "2160p30"},
+ {GST_DECKLINK_MODE_2160p50, "4k 50p", "2160p50"},
+ {GST_DECKLINK_MODE_2160p5994, "4k 59.94p", "2160p5994"},
+ {GST_DECKLINK_MODE_2160p60, "4k 60p", "2160p60"},
{0, NULL, NULL}
};
@@ -93,13 +93,13 @@
{
static gsize id = 0;
static const GEnumValue connections[] = {
- {GST_DECKLINK_CONNECTION_AUTO, "auto", "Auto"},
- {GST_DECKLINK_CONNECTION_SDI, "sdi", "SDI"},
- {GST_DECKLINK_CONNECTION_HDMI, "hdmi", "HDMI"},
- {GST_DECKLINK_CONNECTION_OPTICAL_SDI, "optical-sdi", "Optical SDI"},
- {GST_DECKLINK_CONNECTION_COMPONENT, "component", "Component"},
- {GST_DECKLINK_CONNECTION_COMPOSITE, "composite", "Composite"},
- {GST_DECKLINK_CONNECTION_SVIDEO, "svideo", "S-Video"},
+ {GST_DECKLINK_CONNECTION_AUTO, "Auto", "auto"},
+ {GST_DECKLINK_CONNECTION_SDI, "SDI", "sdi"},
+ {GST_DECKLINK_CONNECTION_HDMI, "HDMI", "hdmi"},
+ {GST_DECKLINK_CONNECTION_OPTICAL_SDI, "Optical SDI", "optical-sdi"},
+ {GST_DECKLINK_CONNECTION_COMPONENT, "Component", "component"},
+ {GST_DECKLINK_CONNECTION_COMPOSITE, "Composite", "composite"},
+ {GST_DECKLINK_CONNECTION_SVIDEO, "S-Video", "svideo"},
{0, NULL, NULL}
};
@@ -112,19 +112,74 @@
}
GType
+gst_decklink_video_format_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue types[] = {
+ {GST_DECKLINK_VIDEO_FORMAT_AUTO, "Auto", "auto"},
+ {GST_DECKLINK_VIDEO_FORMAT_8BIT_YUV, "bmdFormat8BitYUV", "8bit-yuv"},
+ {GST_DECKLINK_VIDEO_FORMAT_10BIT_YUV, "bmdFormat10BitYUV", "10bit-yuv"},
+ {GST_DECKLINK_VIDEO_FORMAT_8BIT_ARGB, "bmdFormat8BitARGB", "8bit-argb"},
+ {GST_DECKLINK_VIDEO_FORMAT_8BIT_BGRA, "bmdFormat8BitBGRA", "8bit-bgra"},
+ /* Not yet supported:
+ {GST_DECKLINK_VIDEO_FORMAT_10BIT_RGB, "bmdFormat10BitRGB", "10bit-rgb"},
+ {GST_DECKLINK_VIDEO_FORMAT_12BIT_RGB, "bmdFormat12BitRGB", "12bit-rgb"},
+ {GST_DECKLINK_VIDEO_FORMAT_12BIT_RGBLE, "bmdFormat12BitRGBLE", "12bit-rgble"},
+ {GST_DECKLINK_VIDEO_FORMAT_10BIT_RGBXLE, "bmdFormat10BitRGBXLE", "10bit-rgbxle"},
+ {GST_DECKLINK_VIDEO_FORMAT_10BIT_RGBX, "bmdFormat10BitRGBX", "10bit-rgbx"},
+ */
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstDecklinkVideoFormat", types);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_decklink_timecode_format_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue timecodeformats[] = {
+ {GST_DECKLINK_TIMECODE_FORMAT_RP188VITC1, "bmdTimecodeRP188VITC1",
+ "rp188vitc1"},
+ {GST_DECKLINK_TIMECODE_FORMAT_RP188VITC2, "bmdTimecodeRP188VITC2",
+ "rp188vitc2"},
+ {GST_DECKLINK_TIMECODE_FORMAT_RP188LTC, "bmdTimecodeRP188LTC", "rp188ltc"},
+ {GST_DECKLINK_TIMECODE_FORMAT_RP188ANY, "bmdTimecodeRP188Any", "rp188any"},
+ {GST_DECKLINK_TIMECODE_FORMAT_VITC, "bmdTimecodeVITC", "vitc"},
+ {GST_DECKLINK_TIMECODE_FORMAT_VITCFIELD2, "bmdTimecodeVITCField2",
+ "vitcfield2"},
+ {GST_DECKLINK_TIMECODE_FORMAT_SERIAL, "bmdTimecodeSerial", "serial"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp =
+ g_enum_register_static ("GstDecklinkTimecodeFormat", timecodeformats);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
gst_decklink_audio_connection_get_type (void)
{
static gsize id = 0;
static const GEnumValue connections[] = {
- {GST_DECKLINK_AUDIO_CONNECTION_AUTO, "auto", "Automatic"},
- {GST_DECKLINK_AUDIO_CONNECTION_EMBEDDED, "embedded",
- "SDI/HDMI embedded audio"},
- {GST_DECKLINK_AUDIO_CONNECTION_AES_EBU, "aes", "AES/EBU input"},
- {GST_DECKLINK_AUDIO_CONNECTION_ANALOG, "analog", "Analog input"},
- {GST_DECKLINK_AUDIO_CONNECTION_ANALOG_XLR, "analog-xlr",
- "Analog input (XLR)"},
- {GST_DECKLINK_AUDIO_CONNECTION_ANALOG_RCA, "analog-rca",
- "Analog input (RCA)"},
+ {GST_DECKLINK_AUDIO_CONNECTION_AUTO, "Automatic", "auto"},
+ {GST_DECKLINK_AUDIO_CONNECTION_EMBEDDED, "SDI/HDMI embedded audio",
+ "embedded"},
+ {GST_DECKLINK_AUDIO_CONNECTION_AES_EBU, "AES/EBU input", "aes"},
+ {GST_DECKLINK_AUDIO_CONNECTION_ANALOG, "Analog input", "analog"},
+ {GST_DECKLINK_AUDIO_CONNECTION_ANALOG_XLR, "Analog input (XLR)",
+ "analog-xlr"},
+ {GST_DECKLINK_AUDIO_CONNECTION_ANALOG_RCA, "Analog input (RCA)",
+ "analog-rca"},
{0, NULL, NULL}
};
@@ -183,6 +238,43 @@
{bmdMode4K2160p60, 3840, 2160, 60, 1, false, UHD}
};
+static const struct
+{
+ BMDPixelFormat format;
+ gint bpp;
+ GstVideoFormat vformat;
+} formats[] = {
+ /* *INDENT-OFF* */
+ {bmdFormat8BitYUV, 2, GST_VIDEO_FORMAT_UYVY}, /* auto */
+ {bmdFormat8BitYUV, 2, GST_VIDEO_FORMAT_UYVY},
+ {bmdFormat10BitYUV, 4, GST_VIDEO_FORMAT_v210},
+ {bmdFormat8BitARGB, 4, GST_VIDEO_FORMAT_ARGB},
+ {bmdFormat8BitBGRA, 4, GST_VIDEO_FORMAT_BGRA},
+/* Not yet supported
+ {bmdFormat10BitRGB, FIXME, FIXME},
+ {bmdFormat12BitRGB, FIXME, FIXME},
+ {bmdFormat12BitRGBLE, FIXME, FIXME},
+ {bmdFormat10BitRGBXLE, FIXME, FIXME},
+ {bmdFormat10BitRGBX, FIXME, FIXME} */
+ /* *INDENT-ON* */
+};
+
+static const struct
+{
+ BMDTimecodeFormat format;
+ GstDecklinkTimecodeFormat gstformat;
+} tcformats[] = {
+ /* *INDENT-OFF* */
+ {bmdTimecodeRP188VITC1, GST_DECKLINK_TIMECODE_FORMAT_RP188VITC1},
+ {bmdTimecodeRP188VITC2, GST_DECKLINK_TIMECODE_FORMAT_RP188VITC2},
+ {bmdTimecodeRP188LTC, GST_DECKLINK_TIMECODE_FORMAT_RP188LTC},
+ {bmdTimecodeRP188Any, GST_DECKLINK_TIMECODE_FORMAT_RP188ANY},
+ {bmdTimecodeVITC, GST_DECKLINK_TIMECODE_FORMAT_VITC},
+ {bmdTimecodeVITCField2, GST_DECKLINK_TIMECODE_FORMAT_VITCFIELD2},
+ {bmdTimecodeSerial, GST_DECKLINK_TIMECODE_FORMAT_SERIAL}
+ /* *INDENT-ON* */
+};
+
const GstDecklinkMode *
gst_decklink_get_mode (GstDecklinkModeEnum e)
{
@@ -293,6 +385,50 @@
return displayMode;
}
+const BMDPixelFormat
+gst_decklink_pixel_format_from_type (GstDecklinkVideoFormat t)
+{
+ return formats[t].format;
+}
+
+const gint
+gst_decklink_bpp_from_type (GstDecklinkVideoFormat t)
+{
+ return formats[t].bpp;
+}
+
+const GstDecklinkVideoFormat
+gst_decklink_type_from_video_format (GstVideoFormat f)
+{
+ guint i;
+
+ for (i = 1; i < G_N_ELEMENTS (formats); i++) {
+ if (formats[i].vformat == f)
+ return (GstDecklinkVideoFormat) i;
+ }
+ g_assert_not_reached ();
+ return GST_DECKLINK_VIDEO_FORMAT_AUTO;
+}
+
+const BMDTimecodeFormat
+gst_decklink_timecode_format_from_enum (GstDecklinkTimecodeFormat f)
+{
+ return tcformats[f].format;
+}
+
+const GstDecklinkTimecodeFormat
+gst_decklink_timecode_format_to_enum (BMDTimecodeFormat f)
+{
+ guint i;
+
+ for (i = 0; i < G_N_ELEMENTS (tcformats); i++) {
+ if (tcformats[i].format == f)
+ return (GstDecklinkTimecodeFormat) i;
+ }
+ g_assert_not_reached ();
+ return GST_DECKLINK_TIMECODE_FORMAT_RP188ANY;
+}
+
static const BMDVideoConnection connections[] = {
0, /* auto */
bmdVideoConnectionSDI,
@@ -315,6 +451,21 @@
return connections[e];
}
+static gboolean
+gst_decklink_caps_get_pixel_format (GstCaps * caps, BMDPixelFormat * format)
+{
+ GstVideoInfo vinfo;
+ GstVideoFormat f;
+
+ if (gst_video_info_from_caps (&vinfo, caps) == FALSE) {
+ GST_ERROR ("Could not get video info from caps: %" GST_PTR_FORMAT, caps);
+ return FALSE;
+ }
+
+ f = vinfo.finfo->format;
+ return gst_decklink_type_from_video_format (f);
+}
+
static GstStructure *
gst_decklink_mode_get_structure (GstDecklinkModeEnum e, BMDPixelFormat f)
{
@@ -323,29 +474,30 @@
"width", G_TYPE_INT, mode->width,
"height", G_TYPE_INT, mode->height,
"pixel-aspect-ratio", GST_TYPE_FRACTION, mode->par_n, mode->par_d,
- "interlace-mode", G_TYPE_STRING, mode->interlaced ? "interleaved" : "progressive",
+ "interlace-mode", G_TYPE_STRING,
+ mode->interlaced ? "interleaved" : "progressive",
"framerate", GST_TYPE_FRACTION, mode->fps_n, mode->fps_d, NULL);
switch (f) {
- case bmdFormat8BitYUV: /* '2vuy' */
+ case bmdFormat8BitYUV: /* '2vuy' */
gst_structure_set (s, "format", G_TYPE_STRING, "UYVY",
"colorimetry", G_TYPE_STRING, mode->colorimetry,
"chroma-site", G_TYPE_STRING, "mpeg2", NULL);
break;
- case bmdFormat10BitYUV: /* 'v210' */
+ case bmdFormat10BitYUV: /* 'v210' */
gst_structure_set (s, "format", G_TYPE_STRING, "v210", NULL);
break;
- case bmdFormat8BitARGB: /* 'ARGB' */
+ case bmdFormat8BitARGB: /* 'ARGB' */
gst_structure_set (s, "format", G_TYPE_STRING, "ARGB", NULL);
break;
- case bmdFormat8BitBGRA: /* 'BGRA' */
+ case bmdFormat8BitBGRA: /* 'BGRA' */
gst_structure_set (s, "format", G_TYPE_STRING, "BGRA", NULL);
break;
- case bmdFormat10BitRGB: /* 'r210' Big-endian RGB 10-bit per component with SMPTE video levels (64-960). Packed as 2:10:10:10 */
- case bmdFormat12BitRGB: /* 'R12B' Big-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component */
- case bmdFormat12BitRGBLE: /* 'R12L' Little-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component */
+ case bmdFormat10BitRGB: /* 'r210' Big-endian RGB 10-bit per component with SMPTE video levels (64-960). Packed as 2:10:10:10 */
+ case bmdFormat12BitRGB: /* 'R12B' Big-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component */
+ case bmdFormat12BitRGBLE: /* 'R12L' Little-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component */
case bmdFormat10BitRGBXLE: /* 'R10l' Little-endian 10-bit RGB with SMPTE video levels (64-940) */
- case bmdFormat10BitRGBX: /* 'R10b' Big-endian 10-bit RGB with SMPTE video levels (64-940) */
+ case bmdFormat10BitRGBX: /* 'R10b' Big-endian 10-bit RGB with SMPTE video levels (64-940) */
default:
GST_WARNING ("format not supported %d", f);
gst_structure_free (s);
@@ -362,7 +514,39 @@
GstCaps *caps;
caps = gst_caps_new_empty ();
- gst_caps_append_structure (caps, gst_decklink_mode_get_structure (e, f));
+ caps =
+ gst_caps_merge_structure (caps, gst_decklink_mode_get_structure (e, f));
+
+ return caps;
+}
+
+GstCaps *
+gst_decklink_mode_get_caps_all_formats (GstDecklinkModeEnum e)
+{
+ GstCaps *caps;
+ guint i;
+
+ caps = gst_caps_new_empty ();
+ for (i = 1; i < G_N_ELEMENTS (formats); i++)
+ caps =
+ gst_caps_merge_structure (caps, gst_decklink_mode_get_structure (e,
+ formats[i].format));
+
+ return caps;
+}
+
+GstCaps *
+gst_decklink_pixel_format_get_caps (BMDPixelFormat f)
+{
+ int i;
+ GstCaps *caps;
+ GstStructure *s;
+
+ caps = gst_caps_new_empty ();
+ for (i = 1; i < (int) G_N_ELEMENTS (modes); i++) {
+ s = gst_decklink_mode_get_structure ((GstDecklinkModeEnum) i, f);
+ caps = gst_caps_merge_structure (caps, s);
+ }
return caps;
}
@@ -372,27 +556,29 @@
{
int i;
GstCaps *caps;
- GstStructure *s;
caps = gst_caps_new_empty ();
- for (i = 1; i < (int) G_N_ELEMENTS (modes); i++) {
- s = gst_decklink_mode_get_structure ((GstDecklinkModeEnum) i, bmdFormat8BitYUV);
- gst_caps_append_structure (caps, s);
- s = gst_decklink_mode_get_structure ((GstDecklinkModeEnum) i, bmdFormat8BitARGB);
- gst_caps_append_structure (caps, s);
- }
+ for (i = 1; i < (int) G_N_ELEMENTS (modes); i++)
+ caps =
+ gst_caps_merge (caps,
+ gst_decklink_mode_get_caps_all_formats ((GstDecklinkModeEnum) i));
return caps;
}
const GstDecklinkMode *
-gst_decklink_find_mode_for_caps (GstCaps * caps)
+gst_decklink_find_mode_and_format_for_caps (GstCaps * caps,
+ BMDPixelFormat * format)
{
int i;
GstCaps *mode_caps;
+ g_return_val_if_fail (gst_caps_is_fixed (caps), NULL);
+ if (!gst_decklink_caps_get_pixel_format (caps, format))
+ return NULL;
+
for (i = 1; i < (int) G_N_ELEMENTS (modes); i++) {
- mode_caps = gst_decklink_mode_get_caps ((GstDecklinkModeEnum) i, bmdFormat8BitYUV);
+ mode_caps = gst_decklink_mode_get_caps ((GstDecklinkModeEnum) i, *format);
if (gst_caps_can_intersect (caps, mode_caps)) {
gst_caps_unref (mode_caps);
return gst_decklink_get_mode ((GstDecklinkModeEnum) i);
@@ -403,6 +589,14 @@
return NULL;
}
+const GstDecklinkMode *
+gst_decklink_find_mode_for_caps (GstCaps * caps)
+{
+ BMDPixelFormat format;
+
+ return gst_decklink_find_mode_and_format_for_caps (caps, &format);
+}
+
#define GST_TYPE_DECKLINK_CLOCK \
(gst_decklink_clock_get_type())
#define GST_DECKLINK_CLOCK(obj) \
@@ -528,13 +722,21 @@
GstElement *videosrc = NULL, *audiosrc = NULL;
void (*got_video_frame) (GstElement * videosrc,
IDeckLinkVideoInputFrame * frame, GstDecklinkModeEnum mode,
- GstClockTime capture_time, GstClockTime capture_duration) = NULL;
+ GstClockTime capture_time, GstClockTime capture_duration, guint hours,
+ guint minutes, guint seconds, guint frames, BMDTimecodeFlags bflags) =
+ NULL;
void (*got_audio_packet) (GstElement * videosrc,
- IDeckLinkAudioInputPacket * packet, GstClockTime capture_time, gboolean discont) = NULL;
+ IDeckLinkAudioInputPacket * packet, GstClockTime capture_time,
+ gboolean discont) = NULL;
GstDecklinkModeEnum mode;
- BMDTimeValue capture_time = GST_CLOCK_TIME_NONE, capture_duration = GST_CLOCK_TIME_NONE;
+ BMDTimeValue capture_time = GST_CLOCK_TIME_NONE, capture_duration =
+ GST_CLOCK_TIME_NONE;
HRESULT res;
+ IDeckLinkTimecode *dtc;
+ uint8_t hours, minutes, seconds, frames;
+ BMDTimecodeFlags bflags;
+ hours = minutes = seconds = frames = bflags = 0;
if (video_frame == NULL)
goto no_video_frame;
@@ -547,6 +749,36 @@
capture_duration = GST_CLOCK_TIME_NONE;
}
+ if (m_input->videosrc) {
+ /* FIXME: Avoid circularity between gstdecklink.cpp and
+ * gstdecklinkvideosrc.cpp */
+ videosrc = GST_ELEMENT_CAST (gst_object_ref (m_input->videosrc));
+ res =
+ video_frame->
+ GetTimecode (GST_DECKLINK_VIDEO_SRC (videosrc)->timecode_format,
+ &dtc);
+
+ if (res != S_OK) {
+ GST_DEBUG_OBJECT (videosrc, "Failed to get timecode: 0x%08x", res);
+ dtc = NULL;
+ } else {
+ res = dtc->GetComponents (&hours, &minutes, &seconds, &frames);
+ if (res != S_OK) {
+ GST_ERROR ("Could not get components for timecode %p: 0x%08x", dtc,
+ res);
+ hours = 0;
+ minutes = 0;
+ seconds = 0;
+ frames = 0;
+ bflags = 0;
+ } else {
+ GST_DEBUG_OBJECT (videosrc, "Got timecode %02d:%02d:%02d:%02d", hours,
+ minutes, seconds, frames);
+ bflags = dtc->GetFlags ();
+ }
+ }
+ }
+
g_mutex_lock (&m_input->lock);
if (capture_time > (BMDTimeValue) m_input->clock_start_time)
@@ -560,7 +792,6 @@
capture_time = 0;
if (m_input->videosrc) {
- videosrc = GST_ELEMENT_CAST (gst_object_ref (m_input->videosrc));
got_video_frame = m_input->got_video_frame;
}
mode = gst_decklink_get_mode_enum_from_bmd (m_input->mode->mode);
@@ -573,17 +804,20 @@
if (got_video_frame && videosrc) {
got_video_frame (videosrc, video_frame, mode, capture_time,
- capture_duration);
+ capture_duration, (guint8) hours, (guint8) minutes, (guint8) seconds,
+ (guint8) frames, bflags);
}
-no_video_frame:
+ no_video_frame:
if (got_audio_packet && audiosrc && audio_packet) {
- m_input->got_audio_packet (audiosrc, audio_packet, capture_time, m_input->audio_discont);
+ m_input->got_audio_packet (audiosrc, audio_packet, capture_time,
+ m_input->audio_discont);
m_input->audio_discont = FALSE;
} else {
m_input->audio_discont = TRUE;
if (!audio_packet)
- GST_DEBUG ("Received no audio packet at %" GST_TIME_FORMAT, GST_TIME_ARGS (capture_time));
+ GST_DEBUG ("Received no audio packet at %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (capture_time));
}
gst_object_replace ((GstObject **) & videosrc, NULL);
@@ -681,7 +915,8 @@
ret = decklink->QueryInterface (IID_IDeckLinkInput,
(void **) &devices[i].input.input);
if (ret != S_OK) {
- GST_WARNING ("selected device does not have input interface");
+ GST_WARNING ("selected device does not have input interface: 0x%08x",
+ ret);
} else {
devices[i].input.device = decklink;
devices[i].input.clock = gst_decklink_clock_new ("GstDecklinkInputClock");
@@ -695,7 +930,8 @@
ret = decklink->QueryInterface (IID_IDeckLinkOutput,
(void **) &devices[i].output.output);
if (ret != S_OK) {
- GST_WARNING ("selected device does not have output interface");
+ GST_WARNING ("selected device does not have output interface: 0x%08x",
+ ret);
} else {
devices[i].output.device = decklink;
devices[i].output.clock =
@@ -707,13 +943,16 @@
ret = decklink->QueryInterface (IID_IDeckLinkConfiguration,
(void **) &devices[i].input.config);
if (ret != S_OK) {
- GST_WARNING ("selected device does not have config interface");
+ GST_WARNING ("selected device does not have config interface: 0x%08x",
+ ret);
}
ret = decklink->QueryInterface (IID_IDeckLinkAttributes,
(void **) &devices[i].input.attributes);
+ devices[i].output.attributes = devices[i].input.attributes;
if (ret != S_OK) {
- GST_WARNING ("selected device does not have attributes interface");
+ GST_WARNING ("selected device does not have attributes interface: 0x%08x",
+ ret);
}
ret = iterator->Next (&decklink);
diff --git a/sys/decklink/gstdecklink.h b/sys/decklink/gstdecklink.h
index bfe7d9f..9f95c56 100644
--- a/sys/decklink/gstdecklink.h
+++ b/sys/decklink/gstdecklink.h
@@ -23,6 +23,7 @@
#define _GST_DECKLINK_H_
#include <gst/gst.h>
+#include <gst/video/video.h>
#ifdef G_OS_UNIX
#include "linux/DeckLinkAPI.h"
#endif
@@ -109,6 +110,39 @@
#define GST_TYPE_DECKLINK_AUDIO_CONNECTION (gst_decklink_audio_connection_get_type ())
GType gst_decklink_audio_connection_get_type (void);
+typedef enum {
+ GST_DECKLINK_VIDEO_FORMAT_AUTO,
+ GST_DECKLINK_VIDEO_FORMAT_8BIT_YUV, /* bmdFormat8BitYUV */
+ GST_DECKLINK_VIDEO_FORMAT_10BIT_YUV, /* bmdFormat10BitYUV */
+ GST_DECKLINK_VIDEO_FORMAT_8BIT_ARGB, /* bmdFormat8BitARGB */
+ GST_DECKLINK_VIDEO_FORMAT_8BIT_BGRA, /* bmdFormat8BitBGRA */
+ GST_DECKLINK_VIDEO_FORMAT_10BIT_RGB, /* bmdFormat10BitRGB */
+ GST_DECKLINK_VIDEO_FORMAT_12BIT_RGB, /* bmdFormat12BitRGB */
+ GST_DECKLINK_VIDEO_FORMAT_12BIT_RGBLE, /* bmdFormat12BitRGBLE */
+ GST_DECKLINK_VIDEO_FORMAT_10BIT_RGBXLE, /* bmdFormat10BitRGBXLE */
+ GST_DECKLINK_VIDEO_FORMAT_10BIT_RGBX, /* bmdFormat10BitRGBX */
+} GstDecklinkVideoFormat;
+#define GST_TYPE_DECKLINK_VIDEO_FORMAT (gst_decklink_video_format_get_type ())
+GType gst_decklink_video_format_get_type (void);
+
+typedef enum {
+ GST_DECKLINK_TIMECODE_FORMAT_RP188VITC1, /*bmdTimecodeRP188VITC1 */
+ GST_DECKLINK_TIMECODE_FORMAT_RP188VITC2, /*bmdTimecodeRP188VITC2 */
+ GST_DECKLINK_TIMECODE_FORMAT_RP188LTC, /*bmdTimecodeRP188LTC */
+ GST_DECKLINK_TIMECODE_FORMAT_RP188ANY, /*bmdTimecodeRP188Any */
+ GST_DECKLINK_TIMECODE_FORMAT_VITC, /*bmdTimecodeVITC */
+ GST_DECKLINK_TIMECODE_FORMAT_VITCFIELD2, /*bmdTimecodeVITCField2 */
+ GST_DECKLINK_TIMECODE_FORMAT_SERIAL /* bmdTimecodeSerial */
+} GstDecklinkTimecodeFormat;
+#define GST_TYPE_DECKLINK_TIMECODE_FORMAT (gst_decklink_timecode_format_get_type ())
+GType gst_decklink_timecode_format_get_type (void);
+
+const BMDPixelFormat gst_decklink_pixel_format_from_type (GstDecklinkVideoFormat t);
+const gint gst_decklink_bpp_from_type (GstDecklinkVideoFormat t);
+const GstDecklinkVideoFormat gst_decklink_type_from_video_format (GstVideoFormat f);
+const BMDTimecodeFormat gst_decklink_timecode_format_from_enum (GstDecklinkTimecodeFormat f);
+const GstDecklinkTimecodeFormat gst_decklink_timecode_format_to_enum (BMDTimecodeFormat f);
+
typedef struct _GstDecklinkMode GstDecklinkMode;
struct _GstDecklinkMode {
BMDDisplayMode mode;
@@ -133,6 +167,7 @@
struct _GstDecklinkOutput {
IDeckLink *device;
IDeckLinkOutput *output;
+ IDeckLinkAttributes *attributes;
GstClock *clock;
GstClockTime clock_start_time, clock_last_time, clock_epoch;
GstClockTimeDiff clock_offset;
@@ -169,7 +204,7 @@
GMutex lock;
/* Set by the video source */
- void (*got_video_frame) (GstElement *videosrc, IDeckLinkVideoInputFrame * frame, GstDecklinkModeEnum mode, GstClockTime capture_time, GstClockTime capture_duration);
+ void (*got_video_frame) (GstElement *videosrc, IDeckLinkVideoInputFrame * frame, GstDecklinkModeEnum mode, GstClockTime capture_time, GstClockTime capture_duration, guint hours, guint minutes, guint seconds, guint frames, BMDTimecodeFlags bflags);
/* Configured mode or NULL */
const GstDecklinkMode *mode;
BMDPixelFormat format;
@@ -195,5 +230,8 @@
void gst_decklink_release_nth_input (gint n, GstElement * src, gboolean is_audio);
const GstDecklinkMode * gst_decklink_find_mode_for_caps (GstCaps * caps);
+const GstDecklinkMode * gst_decklink_find_mode_and_format_for_caps (GstCaps * caps, BMDPixelFormat * format);
+GstCaps * gst_decklink_mode_get_caps_all_formats (GstDecklinkModeEnum e);
+GstCaps * gst_decklink_pixel_format_get_caps (BMDPixelFormat f);
#endif
diff --git a/sys/decklink/gstdecklinkaudiosink.cpp b/sys/decklink/gstdecklinkaudiosink.cpp
index 1db9339..1d63154 100644
--- a/sys/decklink/gstdecklinkaudiosink.cpp
+++ b/sys/decklink/gstdecklinkaudiosink.cpp
@@ -310,13 +310,16 @@
GstDecklinkAudioSinkRingBuffer *self =
GST_DECKLINK_AUDIO_SINK_RING_BUFFER_CAST (rb);
guint ret = 0;
+ HRESULT res = S_OK;
if (self->output) {
- if (self->output->output->GetBufferedAudioSampleFrameCount (&ret) != S_OK)
+ if ((res =
+ self->output->output->GetBufferedAudioSampleFrameCount (&ret)) !=
+ S_OK)
ret = 0;
}
- GST_DEBUG_OBJECT (self->sink, "Delay: %u", ret);
+ GST_DEBUG_OBJECT (self->sink, "Delay: %u (0x%08x)", ret, res);
return ret;
}
@@ -409,7 +412,7 @@
}
ret = self->output->output->EnableAudioOutput (bmdAudioSampleRate48kHz,
- sample_depth, 2, bmdAudioOutputStreamContinuous);
+ sample_depth, spec->info.channels, bmdAudioOutputStreamContinuous);
if (ret != S_OK) {
GST_WARNING_OBJECT (self->sink, "Failed to enable audio output 0x%08x",
ret);
@@ -517,7 +520,7 @@
GST_PAD_SINK,
GST_PAD_ALWAYS,
GST_STATIC_CAPS
- ("audio/x-raw, format={S16LE,S32LE}, channels=2, rate=48000, "
+ ("audio/x-raw, format={S16LE,S32LE}, channels={2, 8, 16}, rate=48000, "
"layout=interleaved")
);
@@ -529,7 +532,8 @@
static GstStateChangeReturn gst_decklink_audio_sink_change_state (GstElement *
element, GstStateChange transition);
-
+static GstCaps *gst_decklink_audio_sink_get_caps (GstBaseSink * bsink,
+ GstCaps * filter);
static GstAudioRingBuffer
* gst_decklink_audio_sink_create_ringbuffer (GstAudioBaseSink * absink);
@@ -542,6 +546,7 @@
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ GstBaseSinkClass *basesink_class = GST_BASE_SINK_CLASS (klass);
GstAudioBaseSinkClass *audiobasesink_class =
GST_AUDIO_BASE_SINK_CLASS (klass);
@@ -552,6 +557,9 @@
element_class->change_state =
GST_DEBUG_FUNCPTR (gst_decklink_audio_sink_change_state);
+ basesink_class->get_caps =
+ GST_DEBUG_FUNCPTR (gst_decklink_audio_sink_get_caps);
+
audiobasesink_class->create_ringbuffer =
GST_DEBUG_FUNCPTR (gst_decklink_audio_sink_create_ringbuffer);
@@ -561,8 +569,7 @@
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT)));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_set_static_metadata (element_class, "Decklink Audio Sink",
"Audio/Sink", "Decklink Sink", "David Schleef <ds@entropywave.com>, "
@@ -652,6 +659,65 @@
return ret;
}
+static GstCaps *
+gst_decklink_audio_sink_get_caps (GstBaseSink * bsink, GstCaps * filter)
+{
+ GstDecklinkAudioSink *self = GST_DECKLINK_AUDIO_SINK_CAST (bsink);
+ GstDecklinkAudioSinkRingBuffer *buf =
+ GST_DECKLINK_AUDIO_SINK_RING_BUFFER_CAST (GST_AUDIO_BASE_SINK_CAST
+ (self)->ringbuffer);
+ GstCaps *caps = gst_pad_get_pad_template_caps (GST_BASE_SINK_PAD (bsink));
+
+ if (buf) {
+ GST_OBJECT_LOCK (buf);
+ if (buf->output && buf->output->attributes) {
+ int64_t max_channels = 0;
+ HRESULT ret;
+ GstStructure *s;
+ GValue arr = G_VALUE_INIT;
+ GValue v = G_VALUE_INIT;
+
+ ret =
+ buf->output->attributes->GetInt (BMDDeckLinkMaximumAudioChannels,
+ &max_channels);
+ /* 2 should always be supported */
+ if (ret != S_OK) {
+ max_channels = 2;
+ }
+
+ caps = gst_caps_make_writable (caps);
+ s = gst_caps_get_structure (caps, 0);
+
+ g_value_init (&arr, GST_TYPE_LIST);
+ g_value_init (&v, G_TYPE_INT);
+ if (max_channels >= 16) {
+ g_value_set_int (&v, 16);
+ gst_value_list_append_value (&arr, &v);
+ }
+ if (max_channels >= 8) {
+ g_value_set_int (&v, 8);
+ gst_value_list_append_value (&arr, &v);
+ }
+ g_value_set_int (&v, 2);
+ gst_value_list_append_value (&arr, &v);
+
+ gst_structure_set_value (s, "channels", &arr);
+ g_value_unset (&v);
+ g_value_unset (&arr);
+ }
+ GST_OBJECT_UNLOCK (buf);
+ }
+
+ if (filter) {
+ GstCaps *intersection =
+ gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (caps);
+ caps = intersection;
+ }
+
+ return caps;
+}
+
static GstAudioRingBuffer *
gst_decklink_audio_sink_create_ringbuffer (GstAudioBaseSink * absink)
{
diff --git a/sys/decklink/gstdecklinkaudiosrc.cpp b/sys/decklink/gstdecklinkaudiosrc.cpp
index be52175..5024bb5 100644
--- a/sys/decklink/gstdecklinkaudiosrc.cpp
+++ b/sys/decklink/gstdecklinkaudiosrc.cpp
@@ -171,8 +171,7 @@
G_MAXINT, DEFAULT_BUFFER_SIZE,
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_set_static_metadata (element_class, "Decklink Audio Source",
"Audio/Src", "Decklink Source", "David Schleef <ds@entropywave.com>, "
@@ -368,7 +367,7 @@
self->input->config->SetInt (bmdDeckLinkConfigAudioInputConnection,
conn);
if (ret != S_OK) {
- GST_ERROR ("set configuration (audio input connection)");
+ GST_ERROR ("set configuration (audio input connection): 0x%08x", ret);
return FALSE;
}
}
@@ -376,7 +375,7 @@
ret = self->input->input->EnableAudioInput (bmdAudioSampleRate48kHz,
sample_depth, 2);
if (ret != S_OK) {
- GST_WARNING_OBJECT (self, "Failed to enable audio input");
+ GST_WARNING_OBJECT (self, "Failed to enable audio input: 0x%08x", ret);
return FALSE;
}
@@ -492,8 +491,10 @@
sample_count = p->packet->GetSampleFrameCount ();
data_size = self->info.bpf * sample_count;
- if (p->capture_time == GST_CLOCK_TIME_NONE && self->next_offset == (guint64) - 1) {
- GST_DEBUG_OBJECT (self, "Got packet without timestamp before initial "
+ if (p->capture_time == GST_CLOCK_TIME_NONE
+ && self->next_offset == (guint64) - 1) {
+ GST_DEBUG_OBJECT (self,
+ "Got packet without timestamp before initial "
"timestamp after discont - dropping");
capture_packet_free (p);
goto retry;
diff --git a/sys/decklink/gstdecklinkvideosink.cpp b/sys/decklink/gstdecklinkvideosink.cpp
index eebeff3..db7fa9d 100644
--- a/sys/decklink/gstdecklinkvideosink.cpp
+++ b/sys/decklink/gstdecklinkvideosink.cpp
@@ -118,7 +118,9 @@
{
PROP_0,
PROP_MODE,
- PROP_DEVICE_NUMBER
+ PROP_DEVICE_NUMBER,
+ PROP_VIDEO_FORMAT,
+ PROP_TIMECODE_FORMAT
};
static void gst_decklink_video_sink_set_property (GObject * object,
@@ -205,6 +207,21 @@
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT)));
+ g_object_class_install_property (gobject_class, PROP_VIDEO_FORMAT,
+ g_param_spec_enum ("video-format", "Video format",
+ "Video format type to use for playback",
+ GST_TYPE_DECKLINK_VIDEO_FORMAT, GST_DECKLINK_VIDEO_FORMAT_8BIT_YUV,
+ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+ G_PARAM_CONSTRUCT)));
+
+ g_object_class_install_property (gobject_class, PROP_TIMECODE_FORMAT,
+ g_param_spec_enum ("timecode-format", "Timecode format",
+ "Timecode format type to use for playback",
+ GST_TYPE_DECKLINK_TIMECODE_FORMAT,
+ GST_DECKLINK_TIMECODE_FORMAT_RP188ANY,
+ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+ G_PARAM_CONSTRUCT)));
+
templ_caps = gst_decklink_mode_get_template_caps ();
templ_caps = gst_caps_make_writable (templ_caps);
/* For output we support any framerate and only really care about timestamps */
@@ -226,6 +243,9 @@
{
self->mode = GST_DECKLINK_MODE_NTSC;
self->device_number = 0;
+ self->video_format = GST_DECKLINK_VIDEO_FORMAT_8BIT_YUV;
+ /* VITC is legacy, we should expect RP188 in modern use cases */
+ self->timecode_format = bmdTimecodeRP188Any;
gst_base_sink_set_max_lateness (GST_BASE_SINK_CAST (self), 20 * GST_MSECOND);
gst_base_sink_set_qos_enabled (GST_BASE_SINK_CAST (self), TRUE);
@@ -244,6 +264,26 @@
case PROP_DEVICE_NUMBER:
self->device_number = g_value_get_int (value);
break;
+ case PROP_VIDEO_FORMAT:
+ self->video_format = (GstDecklinkVideoFormat) g_value_get_enum (value);
+ switch (self->video_format) {
+ case GST_DECKLINK_VIDEO_FORMAT_AUTO:
+ case GST_DECKLINK_VIDEO_FORMAT_8BIT_YUV:
+ case GST_DECKLINK_VIDEO_FORMAT_10BIT_YUV:
+ case GST_DECKLINK_VIDEO_FORMAT_8BIT_ARGB:
+ case GST_DECKLINK_VIDEO_FORMAT_8BIT_BGRA:
+ break;
+ default:
+ GST_ELEMENT_WARNING (GST_ELEMENT (self), CORE, NOT_IMPLEMENTED,
+ ("Format %d not supported", self->video_format), (NULL));
+ break;
+ }
+ break;
+ case PROP_TIMECODE_FORMAT:
+ self->timecode_format =
+ gst_decklink_timecode_format_from_enum ((GstDecklinkTimecodeFormat)
+ g_value_get_enum (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -263,6 +303,13 @@
case PROP_DEVICE_NUMBER:
g_value_set_int (value, self->device_number);
break;
+ case PROP_VIDEO_FORMAT:
+ g_value_set_enum (value, self->video_format);
+ break;
+ case PROP_TIMECODE_FORMAT:
+ g_value_set_enum (value,
+ gst_decklink_timecode_format_to_enum (self->timecode_format));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -283,6 +330,7 @@
GstDecklinkVideoSink *self = GST_DECKLINK_VIDEO_SINK_CAST (bsink);
const GstDecklinkMode *mode;
HRESULT ret;
+ BMDVideoOutputFlags flags;
GST_DEBUG_OBJECT (self, "Setting caps %" GST_PTR_FORMAT, caps);
@@ -293,21 +341,44 @@
GStreamerVideoOutputCallback (self));
if (self->mode == GST_DECKLINK_MODE_AUTO) {
- mode = gst_decklink_find_mode_for_caps (caps);
+ BMDPixelFormat f;
+ mode = gst_decklink_find_mode_and_format_for_caps (caps, &f);
if (mode == NULL) {
GST_WARNING_OBJECT (self,
"Failed to find compatible mode for caps %" GST_PTR_FORMAT, caps);
return FALSE;
}
+ if (self->video_format != GST_DECKLINK_VIDEO_FORMAT_AUTO &&
+ gst_decklink_pixel_format_from_type (self->video_format) != f) {
+ GST_WARNING_OBJECT (self, "Failed to set pixel format to %d",
+ self->video_format);
+ return FALSE;
+ }
} else {
+ /* We don't have to give the format in EnableVideoOutput. Therefore,
+ * even if it's AUTO, we have it stored in self->info and set it in
+ * gst_decklink_video_sink_prepare */
mode = gst_decklink_get_mode (self->mode);
g_assert (mode != NULL);
};
- ret = self->output->output->EnableVideoOutput (mode->mode,
- bmdVideoOutputFlagDefault);
+ /* The timecode_format itself is used when we embed the actual timecode data
+ * into the frame. Now we only need to know which of the two standards the
+ * timecode format will adhere to: VITC or RP188, and send the appropriate
+ * flag to EnableVideoOutput. The exact format is specified later.
+ *
+ * Note that this flag will have no effect in practice if the video stream
+ * does not contain timecode metadata.
+ */
+ if (self->timecode_format == GST_DECKLINK_TIMECODE_FORMAT_VITC ||
+ self->timecode_format == GST_DECKLINK_TIMECODE_FORMAT_VITCFIELD2)
+ flags = bmdVideoOutputVITC;
+ else
+ flags = bmdVideoOutputRP188;
+
+ ret = self->output->output->EnableVideoOutput (mode->mode, flags);
if (ret != S_OK) {
- GST_WARNING_OBJECT (self, "Failed to enable video output");
+ GST_WARNING_OBJECT (self, "Failed to enable video output: 0x%08x", ret);
return FALSE;
}
@@ -327,10 +398,19 @@
GstDecklinkVideoSink *self = GST_DECKLINK_VIDEO_SINK_CAST (bsink);
GstCaps *mode_caps, *caps;
- if (self->mode == GST_DECKLINK_MODE_AUTO)
+ if (self->mode == GST_DECKLINK_MODE_AUTO
+ && self->video_format == GST_DECKLINK_VIDEO_FORMAT_AUTO)
mode_caps = gst_decklink_mode_get_template_caps ();
+ else if (self->video_format == GST_DECKLINK_VIDEO_FORMAT_AUTO)
+ mode_caps = gst_decklink_mode_get_caps_all_formats (self->mode);
+ else if (self->mode == GST_DECKLINK_MODE_AUTO)
+ mode_caps =
+ gst_decklink_pixel_format_get_caps (gst_decklink_pixel_format_from_type
+ (self->video_format));
else
- mode_caps = gst_decklink_mode_get_caps (self->mode, bmdFormat8BitYUV);
+ mode_caps =
+ gst_decklink_mode_get_caps (self->mode,
+ gst_decklink_pixel_format_from_type (self->video_format));
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);
@@ -454,6 +534,10 @@
GstClockTime latency, render_delay;
GstClockTimeDiff ts_offset;
gint i;
+ GstDecklinkVideoFormat caps_format;
+ BMDPixelFormat format;
+ gint bpp;
+ GstVideoTimeCodeMeta *tc_meta;
GST_DEBUG_OBJECT (self, "Preparing buffer %p", buffer);
@@ -462,6 +546,10 @@
return GST_FLOW_ERROR;
}
+ caps_format = gst_decklink_type_from_video_format (self->info.finfo->format);
+ format = gst_decklink_pixel_format_from_type (caps_format);
+ bpp = gst_decklink_bpp_from_type (caps_format);
+
timestamp = GST_BUFFER_TIMESTAMP (buffer);
duration = GST_BUFFER_DURATION (buffer);
if (duration == GST_CLOCK_TIME_NONE) {
@@ -499,8 +587,8 @@
running_time = 0;
ret = self->output->output->CreateVideoFrame (self->info.width,
- self->info.height, self->info.stride[0], bmdFormat8BitYUV,
- bmdFrameFlagDefault, &frame);
+ self->info.height, self->info.stride[0], format, bmdFrameFlagDefault,
+ &frame);
if (ret != S_OK) {
GST_ELEMENT_ERROR (self, STREAM, FAILED,
(NULL), ("Failed to create video frame: 0x%08x", ret));
@@ -516,12 +604,41 @@
frame->GetBytes ((void **) &outdata);
indata = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&vframe, 0);
for (i = 0; i < self->info.height; i++) {
- memcpy (outdata, indata, GST_VIDEO_FRAME_WIDTH (&vframe) * 2);
+ memcpy (outdata, indata, GST_VIDEO_FRAME_WIDTH (&vframe) * bpp);
indata += GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 0);
outdata += frame->GetRowBytes ();
}
gst_video_frame_unmap (&vframe);
+ tc_meta = gst_buffer_get_video_time_code_meta (buffer);
+ if (tc_meta) {
+ BMDTimecodeFlags bflags = (BMDTimecodeFlags) 0;
+ gchar *tc_str;
+
+ if (((GstVideoTimeCodeFlags) (tc_meta->tc.
+ config.flags)) & GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME)
+ bflags = (BMDTimecodeFlags) (bflags | bmdTimecodeIsDropFrame);
+ else
+ bflags = (BMDTimecodeFlags) (bflags | bmdTimecodeFlagDefault);
+ if (tc_meta->tc.field_count == 2)
+ bflags = (BMDTimecodeFlags) (bflags | bmdTimecodeFieldMark);
+
+ tc_str = gst_video_time_code_to_string (&tc_meta->tc);
+ ret = frame->SetTimecodeFromComponents (self->timecode_format,
+ (uint8_t) tc_meta->tc.hours,
+ (uint8_t) tc_meta->tc.minutes,
+ (uint8_t) tc_meta->tc.seconds, (uint8_t) tc_meta->tc.frames, bflags);
+ if (ret != S_OK) {
+ GST_ERROR_OBJECT (self,
+ "Failed to set timecode %s to video frame: 0x%08x", tc_str, ret);
+ flow_ret = GST_FLOW_ERROR;
+ g_free (tc_str);
+ goto out;
+ }
+ GST_DEBUG_OBJECT (self, "Set frame timecode to %s", tc_str);
+ g_free (tc_str);
+ }
+
convert_to_internal_clock (self, &running_time, &running_time_duration);
GST_LOG_OBJECT (self, "Scheduling video frame %p at %" GST_TIME_FORMAT
@@ -631,6 +748,14 @@
|| self->output->audio_enabled)
&& (GST_STATE (self) == GST_STATE_PLAYING
|| GST_STATE_PENDING (self) == GST_STATE_PLAYING)) {
+ GstClock *clock = NULL;
+
+ clock = gst_element_get_clock (element);
+ if (!clock) {
+ GST_ELEMENT_ERROR (self, STREAM, FAILED, (NULL),
+ ("Scheduled playback supposed to start but we have no clock"));
+ return;
+ }
// Need to unlock to get the clock time
g_mutex_unlock (&self->output->lock);
@@ -638,7 +763,7 @@
// but what we need here is the start time of this element!
start_time = gst_element_get_base_time (element);
if (start_time != GST_CLOCK_TIME_NONE)
- start_time = gst_clock_get_time (GST_ELEMENT_CLOCK (self)) - start_time;
+ start_time = gst_clock_get_time (clock) - start_time;
// FIXME: This will probably not work
if (start_time == GST_CLOCK_TIME_NONE)
@@ -652,15 +777,16 @@
// because we might go to PLAYING later than the pipeline
self->internal_base_time =
gst_clock_get_internal_time (self->output->clock);
- self->external_base_time =
- gst_clock_get_internal_time (GST_ELEMENT_CLOCK (self));
+ self->external_base_time = gst_clock_get_internal_time (clock);
convert_to_internal_clock (self, &start_time, NULL);
g_mutex_lock (&self->output->lock);
// Check if someone else started in the meantime
- if (self->output->started)
+ if (self->output->started) {
+ gst_object_unref (clock);
return;
+ }
active = false;
self->output->output->IsScheduledPlaybackRunning (&active);
@@ -673,6 +799,7 @@
if (res != S_OK) {
GST_ELEMENT_ERROR (self, STREAM, FAILED,
(NULL), ("Failed to stop scheduled playback: 0x%08x", res));
+ gst_object_unref (clock);
return;
}
}
@@ -687,6 +814,7 @@
if (res != S_OK) {
GST_ELEMENT_ERROR (self, STREAM, FAILED,
(NULL), ("Failed to start scheduled playback: 0x%08x", res));
+ gst_object_unref (clock);
return;
}
@@ -700,9 +828,9 @@
// after we started scheduled playback
self->internal_base_time =
gst_clock_get_internal_time (self->output->clock);
- self->external_base_time =
- gst_clock_get_internal_time (GST_ELEMENT_CLOCK (self));
+ self->external_base_time = gst_clock_get_internal_time (clock);
g_mutex_lock (&self->output->lock);
+ gst_object_unref (clock);
} else {
GST_DEBUG_OBJECT (self, "Not starting scheduled playback yet");
}
@@ -713,7 +841,7 @@
GstStateChange transition)
{
GstDecklinkVideoSink *self = GST_DECKLINK_VIDEO_SINK_CAST (element);
- GstStateChangeReturn ret;
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
switch (transition) {
case GST_STATE_CHANGE_READY_TO_PAUSED:
@@ -731,14 +859,19 @@
GstClock *clock, *audio_clock;
clock = gst_element_get_clock (GST_ELEMENT_CAST (self));
- audio_clock = gst_decklink_output_get_audio_clock (self->output);
- if (clock && clock != self->output->clock && clock != audio_clock) {
- gst_clock_set_master (self->output->clock, clock);
- }
- if (clock)
+ if (clock) {
+ audio_clock = gst_decklink_output_get_audio_clock (self->output);
+ if (clock && clock != self->output->clock && clock != audio_clock) {
+ gst_clock_set_master (self->output->clock, clock);
+ }
gst_object_unref (clock);
- if (audio_clock)
- gst_object_unref (audio_clock);
+ if (audio_clock)
+ gst_object_unref (audio_clock);
+ } else {
+ GST_ELEMENT_ERROR (self, STREAM, FAILED,
+ (NULL), ("Need a clock to go to PLAYING"));
+ ret = GST_STATE_CHANGE_FAILURE;
+ }
break;
}
@@ -746,6 +879,8 @@
break;
}
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ return ret;
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
if (ret == GST_STATE_CHANGE_FAILURE)
return ret;
@@ -769,21 +904,31 @@
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:{
GstClockTime start_time;
HRESULT res;
+ GstClock *clock;
- // FIXME: start time is the same for the complete pipeline,
- // but what we need here is the start time of this element!
- start_time = gst_element_get_base_time (element);
- if (start_time != GST_CLOCK_TIME_NONE)
- start_time = gst_clock_get_time (GST_ELEMENT_CLOCK (self)) - start_time;
+ clock = gst_element_get_clock (GST_ELEMENT_CAST (self));
+ if (clock) {
+ // FIXME: start time is the same for the complete pipeline,
+ // but what we need here is the start time of this element!
+ start_time = gst_element_get_base_time (element);
+ if (start_time != GST_CLOCK_TIME_NONE)
+ start_time = gst_clock_get_time (clock) - start_time;
- // FIXME: This will probably not work
- if (start_time == GST_CLOCK_TIME_NONE)
+ // FIXME: This will probably not work
+ if (start_time == GST_CLOCK_TIME_NONE)
+ start_time = 0;
+
+ convert_to_internal_clock (self, &start_time, NULL);
+
+ // The start time is now the running time when we stopped
+ // playback
+
+ gst_object_unref (clock);
+ } else {
+ GST_WARNING_OBJECT (self,
+ "No clock, stopping scheduled playback immediately");
start_time = 0;
-
- convert_to_internal_clock (self, &start_time, NULL);
-
- // The start time is now the running time when we stopped
- // playback
+ }
GST_DEBUG_OBJECT (self,
"Stopping scheduled playback at %" GST_TIME_FORMAT,
diff --git a/sys/decklink/gstdecklinkvideosink.h b/sys/decklink/gstdecklinkvideosink.h
index 16b2fbb..b9aca28 100644
--- a/sys/decklink/gstdecklinkvideosink.h
+++ b/sys/decklink/gstdecklinkvideosink.h
@@ -51,6 +51,8 @@
GstDecklinkModeEnum mode;
gint device_number;
+ GstDecklinkVideoFormat video_format;
+ BMDTimecodeFormat timecode_format;
GstVideoInfo info;
diff --git a/sys/decklink/gstdecklinkvideosrc.cpp b/sys/decklink/gstdecklinkvideosrc.cpp
index 2b304f9..d82c5fc 100644
--- a/sys/decklink/gstdecklinkvideosrc.cpp
+++ b/sys/decklink/gstdecklinkvideosrc.cpp
@@ -39,7 +39,9 @@
PROP_MODE,
PROP_CONNECTION,
PROP_DEVICE_NUMBER,
- PROP_BUFFER_SIZE
+ PROP_BUFFER_SIZE,
+ PROP_VIDEO_FORMAT,
+ PROP_TIMECODE_FORMAT
};
typedef struct
@@ -48,6 +50,7 @@
GstClockTime capture_time, capture_duration;
GstDecklinkModeEnum mode;
BMDPixelFormat format;
+ GstVideoTimeCode *tc;
} CaptureFrame;
static void
@@ -161,6 +164,21 @@
G_MAXINT, DEFAULT_BUFFER_SIZE,
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
+ g_object_class_install_property (gobject_class, PROP_VIDEO_FORMAT,
+ g_param_spec_enum ("video-format", "Video format",
+ "Video format type to use for input (Only use auto for mode=auto)",
+ GST_TYPE_DECKLINK_VIDEO_FORMAT, GST_DECKLINK_VIDEO_FORMAT_AUTO,
+ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+ G_PARAM_CONSTRUCT)));
+
+ g_object_class_install_property (gobject_class, PROP_TIMECODE_FORMAT,
+ g_param_spec_enum ("timecode-format", "Timecode format",
+ "Timecode format type to use for input",
+ GST_TYPE_DECKLINK_TIMECODE_FORMAT,
+ GST_DECKLINK_TIMECODE_FORMAT_RP188ANY,
+ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+ G_PARAM_CONSTRUCT)));
+
templ_caps = gst_decklink_mode_get_template_caps ();
gst_element_class_add_pad_template (element_class,
gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, templ_caps));
@@ -183,6 +201,8 @@
self->connection = DEFAULT_CONNECTION;
self->device_number = 0;
self->buffer_size = DEFAULT_BUFFER_SIZE;
+ self->video_format = GST_DECKLINK_VIDEO_FORMAT_AUTO;
+ self->timecode_format = bmdTimecodeRP188Any;
gst_base_src_set_live (GST_BASE_SRC (self), TRUE);
gst_base_src_set_format (GST_BASE_SRC (self), GST_FORMAT_TIME);
@@ -202,6 +222,13 @@
switch (property_id) {
case PROP_MODE:
self->mode = (GstDecklinkModeEnum) g_value_get_enum (value);
+ /* setting the default value for caps_mode here: if mode==auto then we
+ * configure caps_mode from the caps, if mode!=auto we set caps_mode to
+ * the same value as the mode. so self->caps_mode is essentially
+ * self->mode with mode=auto filtered into whatever we got from the
+ * negotiation */
+ if (self->mode != GST_DECKLINK_MODE_AUTO)
+ self->caps_mode = self->mode;
break;
case PROP_CONNECTION:
self->connection = (GstDecklinkConnectionEnum) g_value_get_enum (value);
@@ -212,6 +239,28 @@
case PROP_BUFFER_SIZE:
self->buffer_size = g_value_get_uint (value);
break;
+ case PROP_VIDEO_FORMAT:
+ self->video_format = (GstDecklinkVideoFormat) g_value_get_enum (value);
+ switch (self->video_format) {
+ case GST_DECKLINK_VIDEO_FORMAT_8BIT_YUV:
+ case GST_DECKLINK_VIDEO_FORMAT_10BIT_YUV:
+ case GST_DECKLINK_VIDEO_FORMAT_8BIT_ARGB:
+ case GST_DECKLINK_VIDEO_FORMAT_8BIT_BGRA:
+ self->caps_format =
+ gst_decklink_pixel_format_from_type (self->video_format);
+ case GST_DECKLINK_VIDEO_FORMAT_AUTO:
+ break;
+ default:
+ GST_ELEMENT_WARNING (GST_ELEMENT (self), CORE, NOT_IMPLEMENTED,
+ ("Format %d not supported", self->video_format), (NULL));
+ break;
+ }
+ break;
+ case PROP_TIMECODE_FORMAT:
+ self->timecode_format =
+ gst_decklink_timecode_format_from_enum ((GstDecklinkTimecodeFormat)
+ g_value_get_enum (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -237,6 +286,13 @@
case PROP_BUFFER_SIZE:
g_value_set_uint (value, self->buffer_size);
break;
+ case PROP_VIDEO_FORMAT:
+ g_value_set_enum (value, self->video_format);
+ break;
+ case PROP_TIMECODE_FORMAT:
+ g_value_set_enum (value,
+ gst_decklink_timecode_format_to_enum (self->timecode_format));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -262,6 +318,7 @@
const GstDecklinkMode *mode;
BMDVideoInputFlags flags;
HRESULT ret;
+ BMDPixelFormat format;
GST_DEBUG_OBJECT (self, "Setting caps %" GST_PTR_FORMAT, caps);
@@ -289,7 +346,8 @@
ret = self->input->config->SetInt (bmdDeckLinkConfigVideoInputConnection,
gst_decklink_get_connection (self->connection));
if (ret != S_OK) {
- GST_ERROR_OBJECT (self, "Failed to set configuration (input source)");
+ GST_ERROR_OBJECT (self,
+ "Failed to set configuration (input source): 0x%08x", ret);
return FALSE;
}
@@ -298,7 +356,7 @@
bmdAnalogVideoFlagCompositeSetup75);
if (ret != S_OK) {
GST_ERROR_OBJECT (self,
- "Failed to set configuration (composite setup)");
+ "Failed to set configuration (composite setup): 0x%08x", ret);
return FALSE;
}
}
@@ -314,7 +372,8 @@
attributes->GetFlag (BMDDeckLinkSupportsInputFormatDetection,
&autoDetection);
if (ret != S_OK) {
- GST_ERROR_OBJECT (self, "Failed to get attribute (autodetection)");
+ GST_ERROR_OBJECT (self,
+ "Failed to get attribute (autodetection): 0x%08x", ret);
return FALSE;
}
if (autoDetection)
@@ -329,10 +388,10 @@
mode = gst_decklink_get_mode (self->mode);
g_assert (mode != NULL);
- ret = self->input->input->EnableVideoInput (mode->mode,
- bmdFormat8BitYUV, flags);
+ format = self->caps_format;
+ ret = self->input->input->EnableVideoInput (mode->mode, format, flags);
if (ret != S_OK) {
- GST_WARNING_OBJECT (self, "Failed to enable video input");
+ GST_WARNING_OBJECT (self, "Failed to enable video input: 0x%08x", ret);
return FALSE;
}
@@ -351,14 +410,16 @@
{
GstDecklinkVideoSrc *self = GST_DECKLINK_VIDEO_SRC_CAST (bsrc);
GstCaps *mode_caps, *caps;
+ BMDPixelFormat format;
+ GstDecklinkModeEnum mode;
g_mutex_lock (&self->lock);
- if (self->caps_mode != GST_DECKLINK_MODE_AUTO)
- mode_caps = gst_decklink_mode_get_caps (self->caps_mode, self->caps_format);
- else
- mode_caps = gst_decklink_mode_get_caps (self->mode, self->caps_format);
+ mode = self->caps_mode;
+ format = self->caps_format;
g_mutex_unlock (&self->lock);
+ mode_caps = gst_decklink_mode_get_caps (mode, format);
+
if (filter) {
caps =
gst_caps_intersect_full (filter, mode_caps, GST_CAPS_INTERSECT_FIRST);
@@ -454,7 +515,8 @@
static void
gst_decklink_video_src_got_frame (GstElement * element,
IDeckLinkVideoInputFrame * frame, GstDecklinkModeEnum mode,
- GstClockTime capture_time, GstClockTime capture_duration)
+ GstClockTime capture_time, GstClockTime capture_duration, guint hours,
+ guint minutes, guint seconds, guint frames, BMDTimecodeFlags bflags)
{
GstDecklinkVideoSrc *self = GST_DECKLINK_VIDEO_SRC_CAST (element);
@@ -470,6 +532,9 @@
g_mutex_lock (&self->lock);
if (!self->flushing) {
CaptureFrame *f;
+ const GstDecklinkMode *bmode;
+ GstVideoTimeCodeFlags flags = GST_VIDEO_TIME_CODE_FLAGS_NONE;
+ guint field_count = 0;
while (g_queue_get_length (&self->current_frames) >= self->buffer_size) {
f = (CaptureFrame *) g_queue_pop_head (&self->current_frames);
@@ -484,6 +549,24 @@
f->capture_duration = capture_duration;
f->mode = mode;
f->format = frame->GetPixelFormat ();
+ bmode = gst_decklink_get_mode (mode);
+ if (bmode->interlaced) {
+ flags =
+ (GstVideoTimeCodeFlags) (flags |
+ GST_VIDEO_TIME_CODE_FLAGS_INTERLACED);
+ if (bflags & bmdTimecodeFieldMark)
+ field_count = 2;
+ else
+ field_count = 1;
+ }
+ if (bflags & bmdTimecodeIsDropFrame)
+ flags =
+ (GstVideoTimeCodeFlags) (flags |
+ GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME);
+ f->tc =
+ gst_video_time_code_new (bmode->fps_n, bmode->fps_d, NULL, flags, hours,
+ minutes, seconds, frames, field_count);
+
frame->AddRef ();
g_queue_push_tail (&self->current_frames, f);
g_cond_signal (&self->cond);
@@ -501,6 +584,7 @@
VideoFrame *vf;
CaptureFrame *f;
GstCaps *caps;
+ gboolean caps_changed = FALSE;
g_mutex_lock (&self->lock);
while (g_queue_is_empty (&self->current_frames) && !self->flushing) {
@@ -516,23 +600,50 @@
GST_DEBUG_OBJECT (self, "Flushing");
return GST_FLOW_FLUSHING;
}
+ // If we're not flushing, we should have a valid frame from the queue
+ g_assert (f != NULL);
g_mutex_lock (&self->lock);
- if (self->mode == GST_DECKLINK_MODE_AUTO &&
- (self->caps_mode != f->mode || self->caps_format != f->format)) {
- GST_DEBUG_OBJECT (self, "Mode/Format changed from %d/%d to %d/%d",
- self->caps_mode, self->caps_format, f->mode, f->format);
- self->caps_mode = f->mode;
- self->caps_format = f->format;
- g_mutex_unlock (&self->lock);
+ if (self->caps_mode != f->mode) {
+ if (self->mode == GST_DECKLINK_MODE_AUTO) {
+ GST_DEBUG_OBJECT (self, "Mode changed from %d to %d", self->caps_mode,
+ f->mode);
+ caps_changed = TRUE;
+ self->caps_mode = f->mode;
+ } else {
+ g_mutex_unlock (&self->lock);
+ GST_ELEMENT_ERROR (self, CORE, NEGOTIATION,
+ ("Invalid mode in captured frame"),
+ ("Mode set to %d but captured %d", self->caps_mode, f->mode));
+ capture_frame_free (f);
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+ }
+ if (self->caps_format != f->format) {
+ if (self->video_format == GST_DECKLINK_VIDEO_FORMAT_AUTO) {
+ GST_DEBUG_OBJECT (self, "Format changed from %d to %d", self->caps_format,
+ f->format);
+ caps_changed = TRUE;
+ self->caps_format = f->format;
+ } else {
+ g_mutex_unlock (&self->lock);
+ GST_ELEMENT_ERROR (self, CORE, NEGOTIATION,
+ ("Invalid pixel format in captured frame"),
+ ("Format set to %d but captured %d", self->caps_format, f->format));
+ capture_frame_free (f);
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+ }
+
+ g_mutex_unlock (&self->lock);
+ if (caps_changed) {
caps = gst_decklink_mode_get_caps (f->mode, f->format);
gst_video_info_from_caps (&self->info, caps);
gst_base_src_set_caps (GST_BASE_SRC_CAST (bsrc), caps);
gst_element_post_message (GST_ELEMENT_CAST (self),
gst_message_new_latency (GST_OBJECT_CAST (self)));
gst_caps_unref (caps);
- } else {
- g_mutex_unlock (&self->lock);
+
}
f->frame->GetBytes ((gpointer *) & data);
@@ -552,6 +663,7 @@
GST_BUFFER_TIMESTAMP (*buffer) = f->capture_time;
GST_BUFFER_DURATION (*buffer) = f->capture_duration;
+ gst_buffer_add_video_time_code_meta (*buffer, f->tc);
GST_DEBUG_OBJECT (self,
"Outputting buffer %p with timestamp %" GST_TIME_FORMAT " and duration %"
@@ -576,10 +688,7 @@
const GstDecklinkMode *mode;
g_mutex_lock (&self->lock);
- if (self->caps_mode != GST_DECKLINK_MODE_AUTO)
- mode = gst_decklink_get_mode (self->caps_mode);
- else
- mode = gst_decklink_get_mode (self->mode);
+ mode = gst_decklink_get_mode (self->caps_mode);
g_mutex_unlock (&self->lock);
min = gst_util_uint64_scale_ceil (GST_SECOND, mode->fps_d, mode->fps_n);
@@ -710,12 +819,22 @@
|| self->input->audio_enabled)
&& (GST_STATE (self) == GST_STATE_PLAYING
|| GST_STATE_PENDING (self) == GST_STATE_PLAYING)) {
+ GstClock *clock;
+
+ clock = gst_element_get_clock (element);
+ if (!clock) {
+ GST_ELEMENT_ERROR (self, STREAM, FAILED, (NULL),
+ ("Streams supposed to start but we have no clock"));
+ return;
+ }
+
GST_DEBUG_OBJECT (self, "Starting streams");
res = self->input->input->StartStreams ();
if (res != S_OK) {
GST_ELEMENT_ERROR (self, STREAM, FAILED,
(NULL), ("Failed to start streams: 0x%08x", res));
+ gst_object_unref (clock);
return;
}
@@ -732,9 +851,9 @@
// We can't use the normal base time for the external clock
// because we might go to PLAYING later than the pipeline
self->internal_base_time = gst_clock_get_internal_time (self->input->clock);
- self->external_base_time =
- gst_clock_get_internal_time (GST_ELEMENT_CLOCK (self));
+ self->external_base_time = gst_clock_get_internal_time (clock);
+ gst_object_unref (clock);
g_mutex_lock (&self->input->lock);
} else {
GST_DEBUG_OBJECT (self, "Not starting streams yet");
@@ -746,7 +865,7 @@
GstStateChange transition)
{
GstDecklinkVideoSrc *self = GST_DECKLINK_VIDEO_SRC_CAST (element);
- GstStateChangeReturn ret;
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
switch (transition) {
case GST_STATE_CHANGE_NULL_TO_READY:
@@ -754,6 +873,11 @@
ret = GST_STATE_CHANGE_FAILURE;
goto out;
}
+ if (self->mode == GST_DECKLINK_MODE_AUTO &&
+ self->video_format != GST_DECKLINK_VIDEO_FORMAT_AUTO) {
+ GST_WARNING_OBJECT (self, "Warning: mode=auto and format!=auto may \
+ not work");
+ }
break;
case GST_STATE_CHANGE_READY_TO_PAUSED:
g_mutex_lock (&self->input->lock);
@@ -771,11 +895,17 @@
GstClock *clock;
clock = gst_element_get_clock (GST_ELEMENT_CAST (self));
- if (clock && clock != self->input->clock) {
- gst_clock_set_master (self->input->clock, clock);
- }
- if (clock)
+ if (clock) {
+ if (clock != self->input->clock) {
+ gst_clock_set_master (self->input->clock, clock);
+ }
+
gst_object_unref (clock);
+ } else {
+ GST_ELEMENT_ERROR (self, STREAM, FAILED,
+ (NULL), ("Need a clock to go to PLAYING"));
+ ret = GST_STATE_CHANGE_FAILURE;
+ }
break;
}
@@ -783,6 +913,8 @@
break;
}
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ return ret;
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
if (ret == GST_STATE_CHANGE_FAILURE)
return ret;
diff --git a/sys/decklink/gstdecklinkvideosrc.h b/sys/decklink/gstdecklinkvideosrc.h
index b83495f..b1e7351 100644
--- a/sys/decklink/gstdecklinkvideosrc.h
+++ b/sys/decklink/gstdecklinkvideosrc.h
@@ -57,6 +57,8 @@
gint device_number;
GstVideoInfo info;
+ GstDecklinkVideoFormat video_format;
+ BMDTimecodeFormat timecode_format;
GstDecklinkInput *input;
diff --git a/sys/decklink/linux/DeckLinkAPI.h b/sys/decklink/linux/DeckLinkAPI.h
index c46ed77..6b0ac18 100644
--- a/sys/decklink/linux/DeckLinkAPI.h
+++ b/sys/decklink/linux/DeckLinkAPI.h
@@ -1,5 +1,5 @@
/* -LICENSE-START-
-** Copyright (c) 2014 Blackmagic Design
+** Copyright (c) 2016 Blackmagic Design
**
** Permission is hereby granted, free of charge, to any person or organization
** obtaining a copy of the software and accompanying documentation covered by
@@ -57,23 +57,31 @@
BMD_CONST REFIID IID_IDeckLinkVideoOutputCallback = /* 20AA5225-1958-47CB-820B-80A8D521A6EE */ {0x20,0xAA,0x52,0x25,0x19,0x58,0x47,0xCB,0x82,0x0B,0x80,0xA8,0xD5,0x21,0xA6,0xEE};
BMD_CONST REFIID IID_IDeckLinkInputCallback = /* DD04E5EC-7415-42AB-AE4A-E80C4DFC044A */ {0xDD,0x04,0xE5,0xEC,0x74,0x15,0x42,0xAB,0xAE,0x4A,0xE8,0x0C,0x4D,0xFC,0x04,0x4A};
+BMD_CONST REFIID IID_IDeckLinkEncoderInputCallback = /* ACF13E61-F4A0-4974-A6A7-59AFF6268B31 */ {0xAC,0xF1,0x3E,0x61,0xF4,0xA0,0x49,0x74,0xA6,0xA7,0x59,0xAF,0xF6,0x26,0x8B,0x31};
BMD_CONST REFIID IID_IDeckLinkMemoryAllocator = /* B36EB6E7-9D29-4AA8-92EF-843B87A289E8 */ {0xB3,0x6E,0xB6,0xE7,0x9D,0x29,0x4A,0xA8,0x92,0xEF,0x84,0x3B,0x87,0xA2,0x89,0xE8};
BMD_CONST REFIID IID_IDeckLinkAudioOutputCallback = /* 403C681B-7F46-4A12-B993-2BB127084EE6 */ {0x40,0x3C,0x68,0x1B,0x7F,0x46,0x4A,0x12,0xB9,0x93,0x2B,0xB1,0x27,0x08,0x4E,0xE6};
BMD_CONST REFIID IID_IDeckLinkIterator = /* 50FB36CD-3063-4B73-BDBB-958087F2D8BA */ {0x50,0xFB,0x36,0xCD,0x30,0x63,0x4B,0x73,0xBD,0xBB,0x95,0x80,0x87,0xF2,0xD8,0xBA};
BMD_CONST REFIID IID_IDeckLinkAPIInformation = /* 7BEA3C68-730D-4322-AF34-8A7152B532A4 */ {0x7B,0xEA,0x3C,0x68,0x73,0x0D,0x43,0x22,0xAF,0x34,0x8A,0x71,0x52,0xB5,0x32,0xA4};
BMD_CONST REFIID IID_IDeckLinkOutput = /* CC5C8A6E-3F2F-4B3A-87EA-FD78AF300564 */ {0xCC,0x5C,0x8A,0x6E,0x3F,0x2F,0x4B,0x3A,0x87,0xEA,0xFD,0x78,0xAF,0x30,0x05,0x64};
BMD_CONST REFIID IID_IDeckLinkInput = /* AF22762B-DFAC-4846-AA79-FA8883560995 */ {0xAF,0x22,0x76,0x2B,0xDF,0xAC,0x48,0x46,0xAA,0x79,0xFA,0x88,0x83,0x56,0x09,0x95};
+BMD_CONST REFIID IID_IDeckLinkEncoderInput = /* 270587DA-6B7D-42E7-A1F0-6D853F581185 */ {0x27,0x05,0x87,0xDA,0x6B,0x7D,0x42,0xE7,0xA1,0xF0,0x6D,0x85,0x3F,0x58,0x11,0x85};
BMD_CONST REFIID IID_IDeckLinkVideoFrame = /* 3F716FE0-F023-4111-BE5D-EF4414C05B17 */ {0x3F,0x71,0x6F,0xE0,0xF0,0x23,0x41,0x11,0xBE,0x5D,0xEF,0x44,0x14,0xC0,0x5B,0x17};
BMD_CONST REFIID IID_IDeckLinkMutableVideoFrame = /* 69E2639F-40DA-4E19-B6F2-20ACE815C390 */ {0x69,0xE2,0x63,0x9F,0x40,0xDA,0x4E,0x19,0xB6,0xF2,0x20,0xAC,0xE8,0x15,0xC3,0x90};
BMD_CONST REFIID IID_IDeckLinkVideoFrame3DExtensions = /* DA0F7E4A-EDC7-48A8-9CDD-2DB51C729CD7 */ {0xDA,0x0F,0x7E,0x4A,0xED,0xC7,0x48,0xA8,0x9C,0xDD,0x2D,0xB5,0x1C,0x72,0x9C,0xD7};
+BMD_CONST REFIID IID_IDeckLinkVideoFrameMetadataExtensions = /* D5973DC9-6432-46D0-8F0B-2496F8A1238F */ {0xD5,0x97,0x3D,0xC9,0x64,0x32,0x46,0xD0,0x8F,0x0B,0x24,0x96,0xF8,0xA1,0x23,0x8F};
BMD_CONST REFIID IID_IDeckLinkVideoInputFrame = /* 05CFE374-537C-4094-9A57-680525118F44 */ {0x05,0xCF,0xE3,0x74,0x53,0x7C,0x40,0x94,0x9A,0x57,0x68,0x05,0x25,0x11,0x8F,0x44};
BMD_CONST REFIID IID_IDeckLinkVideoFrameAncillary = /* 732E723C-D1A4-4E29-9E8E-4A88797A0004 */ {0x73,0x2E,0x72,0x3C,0xD1,0xA4,0x4E,0x29,0x9E,0x8E,0x4A,0x88,0x79,0x7A,0x00,0x04};
+BMD_CONST REFIID IID_IDeckLinkEncoderPacket = /* B693F36C-316E-4AF1-B6C2-F389A4BCA620 */ {0xB6,0x93,0xF3,0x6C,0x31,0x6E,0x4A,0xF1,0xB6,0xC2,0xF3,0x89,0xA4,0xBC,0xA6,0x20};
+BMD_CONST REFIID IID_IDeckLinkEncoderVideoPacket = /* 4E7FD944-E8C7-4EAC-B8C0-7B77F80F5AE0 */ {0x4E,0x7F,0xD9,0x44,0xE8,0xC7,0x4E,0xAC,0xB8,0xC0,0x7B,0x77,0xF8,0x0F,0x5A,0xE0};
+BMD_CONST REFIID IID_IDeckLinkEncoderAudioPacket = /* 49E8EDC8-693B-4E14-8EF6-12C658F5A07A */ {0x49,0xE8,0xED,0xC8,0x69,0x3B,0x4E,0x14,0x8E,0xF6,0x12,0xC6,0x58,0xF5,0xA0,0x7A};
+BMD_CONST REFIID IID_IDeckLinkH265NALPacket = /* 639C8E0B-68D5-4BDE-A6D4-95F3AEAFF2E7 */ {0x63,0x9C,0x8E,0x0B,0x68,0xD5,0x4B,0xDE,0xA6,0xD4,0x95,0xF3,0xAE,0xAF,0xF2,0xE7};
BMD_CONST REFIID IID_IDeckLinkAudioInputPacket = /* E43D5870-2894-11DE-8C30-0800200C9A66 */ {0xE4,0x3D,0x58,0x70,0x28,0x94,0x11,0xDE,0x8C,0x30,0x08,0x00,0x20,0x0C,0x9A,0x66};
BMD_CONST REFIID IID_IDeckLinkScreenPreviewCallback = /* B1D3F49A-85FE-4C5D-95C8-0B5D5DCCD438 */ {0xB1,0xD3,0xF4,0x9A,0x85,0xFE,0x4C,0x5D,0x95,0xC8,0x0B,0x5D,0x5D,0xCC,0xD4,0x38};
BMD_CONST REFIID IID_IDeckLinkGLScreenPreviewHelper = /* 504E2209-CAC7-4C1A-9FB4-C5BB6274D22F */ {0x50,0x4E,0x22,0x09,0xCA,0xC7,0x4C,0x1A,0x9F,0xB4,0xC5,0xBB,0x62,0x74,0xD2,0x2F};
BMD_CONST REFIID IID_IDeckLinkNotificationCallback = /* B002A1EC-070D-4288-8289-BD5D36E5FF0D */ {0xB0,0x02,0xA1,0xEC,0x07,0x0D,0x42,0x88,0x82,0x89,0xBD,0x5D,0x36,0xE5,0xFF,0x0D};
BMD_CONST REFIID IID_IDeckLinkNotification = /* 0A1FB207-E215-441B-9B19-6FA1575946C5 */ {0x0A,0x1F,0xB2,0x07,0xE2,0x15,0x44,0x1B,0x9B,0x19,0x6F,0xA1,0x57,0x59,0x46,0xC5};
BMD_CONST REFIID IID_IDeckLinkAttributes = /* ABC11843-D966-44CB-96E2-A1CB5D3135C4 */ {0xAB,0xC1,0x18,0x43,0xD9,0x66,0x44,0xCB,0x96,0xE2,0xA1,0xCB,0x5D,0x31,0x35,0xC4};
+BMD_CONST REFIID IID_IDeckLinkStatus = /* 5F558200-4028-49BC-BEAC-DB3FA4A96E46 */ {0x5F,0x55,0x82,0x00,0x40,0x28,0x49,0xBC,0xBE,0xAC,0xDB,0x3F,0xA4,0xA9,0x6E,0x46};
BMD_CONST REFIID IID_IDeckLinkKeyer = /* 89AFCAF5-65F8-421E-98F7-96FE5F5BFBA3 */ {0x89,0xAF,0xCA,0xF5,0x65,0xF8,0x42,0x1E,0x98,0xF7,0x96,0xFE,0x5F,0x5B,0xFB,0xA3};
BMD_CONST REFIID IID_IDeckLinkVideoConversion = /* 3BBCB8A2-DA2C-42D9-B5D8-88083644E99A */ {0x3B,0xBC,0xB8,0xA2,0xDA,0x2C,0x42,0xD9,0xB5,0xD8,0x88,0x08,0x36,0x44,0xE9,0x9A};
BMD_CONST REFIID IID_IDeckLinkDeviceNotificationCallback = /* 4997053B-0ADF-4CC8-AC70-7A50C4BE728F */ {0x49,0x97,0x05,0x3B,0x0A,0xDF,0x4C,0xC8,0xAC,0x70,0x7A,0x50,0xC4,0xBE,0x72,0x8F};
@@ -90,12 +98,21 @@
bmdVideoOutputDualStream3D = 1 << 4
};
+/* Enum BMDPacketType - Type of packet */
+
+typedef uint32_t BMDPacketType;
+enum _BMDPacketType {
+ bmdPacketTypeStreamInterruptedMarker = /* 'sint' */ 0x73696E74, // A packet of this type marks the time when a video stream was interrupted, for example by a disconnected cable
+ bmdPacketTypeStreamData = /* 'sdat' */ 0x73646174 // Regular stream data
+};
+
/* Enum BMDFrameFlags - Frame flags */
typedef uint32_t BMDFrameFlags;
enum _BMDFrameFlags {
bmdFrameFlagDefault = 0,
bmdFrameFlagFlipVertical = 1 << 0,
+ bmdFrameContainsHDRMetadata = 1 << 1,
/* Flags that are applicable only to instances of IDeckLinkVideoInputFrame */
@@ -133,6 +150,7 @@
typedef uint32_t BMDDeckLinkCapturePassthroughMode;
enum _BMDDeckLinkCapturePassthroughMode {
+ bmdDeckLinkCapturePassthroughModeDisabled = /* 'pdis' */ 0x70646973,
bmdDeckLinkCapturePassthroughModeDirect = /* 'pdir' */ 0x70646972,
bmdDeckLinkCapturePassthroughModeCleanSwitch = /* 'pcln' */ 0x70636C6E
};
@@ -155,6 +173,13 @@
bmdReferenceLocked = 1 << 1
};
+/* Enum BMDAudioFormat - Audio Format */
+
+typedef uint32_t BMDAudioFormat;
+enum _BMDAudioFormat {
+ bmdAudioFormatPCM = /* 'lpcm' */ 0x6C70636D // Linear signed PCM samples
+};
+
/* Enum BMDAudioSampleRate - Audio sample rates supported for output/input */
typedef uint32_t BMDAudioSampleRate;
@@ -267,8 +292,71 @@
typedef uint32_t BMDIdleVideoOutputOperation;
enum _BMDIdleVideoOutputOperation {
bmdIdleVideoOutputBlack = /* 'blac' */ 0x626C6163,
- bmdIdleVideoOutputLastFrame = /* 'lafa' */ 0x6C616661,
- bmdIdleVideoOutputDesktop = /* 'desk' */ 0x6465736B
+ bmdIdleVideoOutputLastFrame = /* 'lafa' */ 0x6C616661
+};
+
+/* Enum BMDVideoEncoderFrameCodingMode - Video frame coding mode */
+
+typedef uint32_t BMDVideoEncoderFrameCodingMode;
+enum _BMDVideoEncoderFrameCodingMode {
+ bmdVideoEncoderFrameCodingModeInter = /* 'inte' */ 0x696E7465,
+ bmdVideoEncoderFrameCodingModeIntra = /* 'intr' */ 0x696E7472
+};
+
+/* Enum BMDDNxHRLevel - DNxHR Levels */
+
+typedef uint32_t BMDDNxHRLevel;
+enum _BMDDNxHRLevel {
+ bmdDNxHRLevelSQ = /* 'dnsq' */ 0x646E7371,
+ bmdDNxHRLevelLB = /* 'dnlb' */ 0x646E6C62,
+ bmdDNxHRLevelHQ = /* 'dnhq' */ 0x646E6871,
+ bmdDNxHRLevelHQX = /* 'dhqx' */ 0x64687178,
+ bmdDNxHRLevel444 = /* 'd444' */ 0x64343434
+};
+
+/* Enum BMDLinkConfiguration - Video link configuration */
+
+typedef uint32_t BMDLinkConfiguration;
+enum _BMDLinkConfiguration {
+ bmdLinkConfigurationSingleLink = /* 'lcsl' */ 0x6C63736C,
+ bmdLinkConfigurationDualLink = /* 'lcdl' */ 0x6C63646C,
+ bmdLinkConfigurationQuadLink = /* 'lcql' */ 0x6C63716C
+};
+
+/* Enum BMDDeviceInterface - Device interface type */
+
+typedef uint32_t BMDDeviceInterface;
+enum _BMDDeviceInterface {
+ bmdDeviceInterfacePCI = /* 'pci ' */ 0x70636920,
+ bmdDeviceInterfaceUSB = /* 'usb ' */ 0x75736220,
+ bmdDeviceInterfaceThunderbolt = /* 'thun' */ 0x7468756E
+};
+
+/* Enum BMDDeckLinkFrameMetadataID - DeckLink Frame Metadata ID */
+
+typedef uint32_t BMDDeckLinkFrameMetadataID;
+enum _BMDDeckLinkFrameMetadataID {
+ bmdDeckLinkFrameMetadataHDRElectroOpticalTransferFunc = /* 'eotf' */ 0x656F7466, // EOTF in range 0-7 as per CEA 861.3
+ bmdDeckLinkFrameMetadataHDRDisplayPrimariesRedX = /* 'hdrx' */ 0x68647278, // Red display primaries in range 0.0 - 1.0
+ bmdDeckLinkFrameMetadataHDRDisplayPrimariesRedY = /* 'hdry' */ 0x68647279, // Red display primaries in range 0.0 - 1.0
+ bmdDeckLinkFrameMetadataHDRDisplayPrimariesGreenX = /* 'hdgx' */ 0x68646778, // Green display primaries in range 0.0 - 1.0
+ bmdDeckLinkFrameMetadataHDRDisplayPrimariesGreenY = /* 'hdgy' */ 0x68646779, // Green display primaries in range 0.0 - 1.0
+ bmdDeckLinkFrameMetadataHDRDisplayPrimariesBlueX = /* 'hdbx' */ 0x68646278, // Blue display primaries in range 0.0 - 1.0
+ bmdDeckLinkFrameMetadataHDRDisplayPrimariesBlueY = /* 'hdby' */ 0x68646279, // Blue display primaries in range 0.0 - 1.0
+ bmdDeckLinkFrameMetadataHDRWhitePointX = /* 'hdwx' */ 0x68647778, // White point in range 0.0 - 1.0
+ bmdDeckLinkFrameMetadataHDRWhitePointY = /* 'hdwy' */ 0x68647779, // White point in range 0.0 - 1.0
+ bmdDeckLinkFrameMetadataHDRMaxDisplayMasteringLuminance = /* 'hdml' */ 0x68646D6C, // Max display mastering luminance in range 1 cd/m2 - 65535 cd/m2
+ bmdDeckLinkFrameMetadataHDRMinDisplayMasteringLuminance = /* 'hmil' */ 0x686D696C, // Min display mastering luminance in range 0.0001 cd/m2 - 6.5535 cd/m2
+ bmdDeckLinkFrameMetadataHDRMaximumContentLightLevel = /* 'mcll' */ 0x6D636C6C, // Maximum Content Light Level in range 1 cd/m2 - 65535 cd/m2
+ bmdDeckLinkFrameMetadataHDRMaximumFrameAverageLightLevel = /* 'fall' */ 0x66616C6C // Maximum Frame Average Light Level in range 1 cd/m2 - 65535 cd/m2
+};
+
+/* Enum BMDDuplexMode - Duplex for configurable ports */
+
+typedef uint32_t BMDDuplexMode;
+enum _BMDDuplexMode {
+ bmdDuplexModeFull = /* 'fdup' */ 0x66647570,
+ bmdDuplexModeHalf = /* 'hdup' */ 0x68647570
};
/* Enum BMDDeckLinkAttributeID - DeckLink Attribute ID */
@@ -288,10 +376,16 @@
BMDDeckLinkCanOnlyAdjustOverallVideoOutputGain = /* 'ovog' */ 0x6F766F67,
BMDDeckLinkHasVideoInputAntiAliasingFilter = /* 'aafl' */ 0x6161666C,
BMDDeckLinkHasBypass = /* 'byps' */ 0x62797073,
- BMDDeckLinkSupportsDesktopDisplay = /* 'extd' */ 0x65787464,
BMDDeckLinkSupportsClockTimingAdjustment = /* 'ctad' */ 0x63746164,
BMDDeckLinkSupportsFullDuplex = /* 'fdup' */ 0x66647570,
BMDDeckLinkSupportsFullFrameReferenceInputTimingOffset = /* 'frin' */ 0x6672696E,
+ BMDDeckLinkSupportsSMPTELevelAOutput = /* 'lvla' */ 0x6C766C61,
+ BMDDeckLinkSupportsDualLinkSDI = /* 'sdls' */ 0x73646C73,
+ BMDDeckLinkSupportsQuadLinkSDI = /* 'sqls' */ 0x73716C73,
+ BMDDeckLinkSupportsIdleOutput = /* 'idou' */ 0x69646F75,
+ BMDDeckLinkHasLTCTimecodeInput = /* 'hltc' */ 0x686C7463,
+ BMDDeckLinkSupportsDuplexModeConfiguration = /* 'dupx' */ 0x64757078,
+ BMDDeckLinkSupportsHDRMetadata = /* 'hdrm' */ 0x6864726D,
/* Integers */
@@ -300,13 +394,20 @@
BMDDeckLinkNumberOfSubDevices = /* 'nsbd' */ 0x6E736264,
BMDDeckLinkSubDeviceIndex = /* 'subi' */ 0x73756269,
BMDDeckLinkPersistentID = /* 'peid' */ 0x70656964,
+ BMDDeckLinkDeviceGroupID = /* 'dgid' */ 0x64676964,
BMDDeckLinkTopologicalID = /* 'toid' */ 0x746F6964,
BMDDeckLinkVideoOutputConnections = /* 'vocn' */ 0x766F636E,
BMDDeckLinkVideoInputConnections = /* 'vicn' */ 0x7669636E,
BMDDeckLinkAudioOutputConnections = /* 'aocn' */ 0x616F636E,
BMDDeckLinkAudioInputConnections = /* 'aicn' */ 0x6169636E,
- BMDDeckLinkDeviceBusyState = /* 'dbst' */ 0x64627374,
BMDDeckLinkVideoIOSupport = /* 'vios' */ 0x76696F73, // Returns a BMDVideoIOSupport bit field
+ BMDDeckLinkDeckControlConnections = /* 'dccn' */ 0x6463636E,
+ BMDDeckLinkDeviceInterface = /* 'dbus' */ 0x64627573, // Returns a BMDDeviceInterface
+ BMDDeckLinkAudioInputRCAChannelCount = /* 'airc' */ 0x61697263,
+ BMDDeckLinkAudioInputXLRChannelCount = /* 'aixc' */ 0x61697863,
+ BMDDeckLinkAudioOutputRCAChannelCount = /* 'aorc' */ 0x616F7263,
+ BMDDeckLinkAudioOutputXLRChannelCount = /* 'aoxc' */ 0x616F7863,
+ BMDDeckLinkPairedDevicePersistentID = /* 'ppid' */ 0x70706964,
/* Floats */
@@ -314,10 +415,16 @@
BMDDeckLinkVideoInputGainMaximum = /* 'vigx' */ 0x76696778,
BMDDeckLinkVideoOutputGainMinimum = /* 'vogm' */ 0x766F676D,
BMDDeckLinkVideoOutputGainMaximum = /* 'vogx' */ 0x766F6778,
+ BMDDeckLinkMicrophoneInputGainMinimum = /* 'migm' */ 0x6D69676D,
+ BMDDeckLinkMicrophoneInputGainMaximum = /* 'migx' */ 0x6D696778,
/* Strings */
- BMDDeckLinkSerialPortDeviceName = /* 'slpn' */ 0x736C706E
+ BMDDeckLinkSerialPortDeviceName = /* 'slpn' */ 0x736C706E,
+ BMDDeckLinkVendorName = /* 'vndr' */ 0x766E6472,
+ BMDDeckLinkDisplayName = /* 'dspn' */ 0x6473706E,
+ BMDDeckLinkModelName = /* 'mdln' */ 0x6D646C6E,
+ BMDDeckLinkDeviceHandle = /* 'devh' */ 0x64657668
};
/* Enum BMDDeckLinkAPIInformationID - DeckLinkAPI information ID */
@@ -327,6 +434,52 @@
BMDDeckLinkAPIVersion = /* 'vers' */ 0x76657273
};
+/* Enum BMDDeckLinkStatusID - DeckLink Status ID */
+
+typedef uint32_t BMDDeckLinkStatusID;
+enum _BMDDeckLinkStatusID {
+
+ /* Integers */
+
+ bmdDeckLinkStatusDetectedVideoInputMode = /* 'dvim' */ 0x6476696D,
+ bmdDeckLinkStatusDetectedVideoInputFlags = /* 'dvif' */ 0x64766966,
+ bmdDeckLinkStatusCurrentVideoInputMode = /* 'cvim' */ 0x6376696D,
+ bmdDeckLinkStatusCurrentVideoInputPixelFormat = /* 'cvip' */ 0x63766970,
+ bmdDeckLinkStatusCurrentVideoInputFlags = /* 'cvif' */ 0x63766966,
+ bmdDeckLinkStatusCurrentVideoOutputMode = /* 'cvom' */ 0x63766F6D,
+ bmdDeckLinkStatusCurrentVideoOutputFlags = /* 'cvof' */ 0x63766F66,
+ bmdDeckLinkStatusPCIExpressLinkWidth = /* 'pwid' */ 0x70776964,
+ bmdDeckLinkStatusPCIExpressLinkSpeed = /* 'plnk' */ 0x706C6E6B,
+ bmdDeckLinkStatusLastVideoOutputPixelFormat = /* 'opix' */ 0x6F706978,
+ bmdDeckLinkStatusReferenceSignalMode = /* 'refm' */ 0x7265666D,
+ bmdDeckLinkStatusReferenceSignalFlags = /* 'reff' */ 0x72656666,
+ bmdDeckLinkStatusDuplexMode = /* 'dupx' */ 0x64757078,
+ bmdDeckLinkStatusBusy = /* 'busy' */ 0x62757379,
+
+ /* Flags */
+
+ bmdDeckLinkStatusVideoInputSignalLocked = /* 'visl' */ 0x7669736C,
+ bmdDeckLinkStatusReferenceSignalLocked = /* 'refl' */ 0x7265666C
+};
+
+/* Enum BMDDeckLinkVideoStatusFlags - */
+
+typedef uint32_t BMDDeckLinkVideoStatusFlags;
+enum _BMDDeckLinkVideoStatusFlags {
+ bmdDeckLinkVideoStatusPsF = 1 << 0,
+ bmdDeckLinkVideoStatusDualStream3D = 1 << 1
+};
+
+/* Enum BMDDuplexStatus - Duplex status of the device */
+
+typedef uint32_t BMDDuplexStatus;
+enum _BMDDuplexStatus {
+ bmdDuplexStatusFullDuplex = /* 'fdup' */ 0x66647570,
+ bmdDuplexStatusHalfDuplex = /* 'hdup' */ 0x68647570,
+ bmdDuplexStatusSimplex = /* 'splx' */ 0x73706C78,
+ bmdDuplexStatusInactive = /* 'inac' */ 0x696E6163
+};
+
/* Enum BMDDeviceBusyState - Current device busy state */
typedef uint32_t BMDDeviceBusyState;
@@ -359,7 +512,8 @@
typedef uint32_t BMDNotifications;
enum _BMDNotifications {
- bmdPreferencesChanged = /* 'pref' */ 0x70726566
+ bmdPreferencesChanged = /* 'pref' */ 0x70726566,
+ bmdStatusChanged = /* 'stat' */ 0x73746174
};
#if defined(__cplusplus)
@@ -368,23 +522,31 @@
class IDeckLinkVideoOutputCallback;
class IDeckLinkInputCallback;
+class IDeckLinkEncoderInputCallback;
class IDeckLinkMemoryAllocator;
class IDeckLinkAudioOutputCallback;
class IDeckLinkIterator;
class IDeckLinkAPIInformation;
class IDeckLinkOutput;
class IDeckLinkInput;
+class IDeckLinkEncoderInput;
class IDeckLinkVideoFrame;
class IDeckLinkMutableVideoFrame;
class IDeckLinkVideoFrame3DExtensions;
+class IDeckLinkVideoFrameMetadataExtensions;
class IDeckLinkVideoInputFrame;
class IDeckLinkVideoFrameAncillary;
+class IDeckLinkEncoderPacket;
+class IDeckLinkEncoderVideoPacket;
+class IDeckLinkEncoderAudioPacket;
+class IDeckLinkH265NALPacket;
class IDeckLinkAudioInputPacket;
class IDeckLinkScreenPreviewCallback;
class IDeckLinkGLScreenPreviewHelper;
class IDeckLinkNotificationCallback;
class IDeckLinkNotification;
class IDeckLinkAttributes;
+class IDeckLinkStatus;
class IDeckLinkKeyer;
class IDeckLinkVideoConversion;
class IDeckLinkDeviceNotificationCallback;
@@ -414,6 +576,19 @@
virtual ~IDeckLinkInputCallback () {} // call Release method to drop reference count
};
+/* Interface IDeckLinkEncoderInputCallback - Frame arrival callback. */
+
+class IDeckLinkEncoderInputCallback : public IUnknown
+{
+public:
+ virtual HRESULT VideoInputSignalChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0;
+ virtual HRESULT VideoPacketArrived (/* in */ IDeckLinkEncoderVideoPacket* videoPacket) = 0;
+ virtual HRESULT AudioPacketArrived (/* in */ IDeckLinkEncoderAudioPacket* audioPacket) = 0;
+
+protected:
+ virtual ~IDeckLinkEncoderInputCallback () {} // call Release method to drop reference count
+};
+
/* Interface IDeckLinkMemoryAllocator - Memory allocator for video frames. */
class IDeckLinkMemoryAllocator : public IUnknown
@@ -552,6 +727,43 @@
virtual ~IDeckLinkInput () {} // call Release method to drop reference count
};
+/* Interface IDeckLinkEncoderInput - Created by QueryInterface from IDeckLink. */
+
+class IDeckLinkEncoderInput : public IUnknown
+{
+public:
+ virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags, /* out */ BMDDisplayModeSupport *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0;
+ virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator **iterator) = 0;
+
+ /* Video Input */
+
+ virtual HRESULT EnableVideoInput (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags) = 0;
+ virtual HRESULT DisableVideoInput (void) = 0;
+ virtual HRESULT GetAvailablePacketsCount (/* out */ uint32_t *availablePacketsCount) = 0;
+ virtual HRESULT SetMemoryAllocator (/* in */ IDeckLinkMemoryAllocator *theAllocator) = 0;
+
+ /* Audio Input */
+
+ virtual HRESULT EnableAudioInput (/* in */ BMDAudioFormat audioFormat, /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount) = 0;
+ virtual HRESULT DisableAudioInput (void) = 0;
+ virtual HRESULT GetAvailableAudioSampleFrameCount (/* out */ uint32_t *availableSampleFrameCount) = 0;
+
+ /* Input Control */
+
+ virtual HRESULT StartStreams (void) = 0;
+ virtual HRESULT StopStreams (void) = 0;
+ virtual HRESULT PauseStreams (void) = 0;
+ virtual HRESULT FlushStreams (void) = 0;
+ virtual HRESULT SetCallback (/* in */ IDeckLinkEncoderInputCallback *theCallback) = 0;
+
+ /* Hardware Timing */
+
+ virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0;
+
+protected:
+ virtual ~IDeckLinkEncoderInput () {} // call Release method to drop reference count
+};
+
/* Interface IDeckLinkVideoFrame - Interface to encapsulate a video frame; can be caller-implemented. */
class IDeckLinkVideoFrame : public IUnknown
@@ -599,6 +811,20 @@
virtual ~IDeckLinkVideoFrame3DExtensions () {} // call Release method to drop reference count
};
+/* Interface IDeckLinkVideoFrameMetadataExtensions - Optional interface implemented on IDeckLinkVideoFrame to support frame metadata such as HDMI HDR information */
+
+class IDeckLinkVideoFrameMetadataExtensions : public IUnknown
+{
+public:
+ virtual HRESULT GetInt (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ int64_t *value) = 0;
+ virtual HRESULT GetFloat (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ double *value) = 0;
+ virtual HRESULT GetFlag (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ bool* value) = 0;
+ virtual HRESULT GetString (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ const char **value) = 0;
+
+protected:
+ virtual ~IDeckLinkVideoFrameMetadataExtensions () {} // call Release method to drop reference count
+};
+
/* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */
class IDeckLinkVideoInputFrame : public IDeckLinkVideoFrame
@@ -625,6 +851,58 @@
virtual ~IDeckLinkVideoFrameAncillary () {} // call Release method to drop reference count
};
+/* Interface IDeckLinkEncoderPacket - Interface to encapsulate an encoded packet. */
+
+class IDeckLinkEncoderPacket : public IUnknown
+{
+public:
+ virtual HRESULT GetBytes (/* out */ void **buffer) = 0;
+ virtual long GetSize (void) = 0;
+ virtual HRESULT GetStreamTime (/* out */ BMDTimeValue *frameTime, /* in */ BMDTimeScale timeScale) = 0;
+ virtual BMDPacketType GetPacketType (void) = 0;
+
+protected:
+ virtual ~IDeckLinkEncoderPacket () {} // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkEncoderVideoPacket - Provided by the IDeckLinkEncoderInput video packet arrival callback. */
+
+class IDeckLinkEncoderVideoPacket : public IDeckLinkEncoderPacket
+{
+public:
+ virtual BMDPixelFormat GetPixelFormat (void) = 0;
+ virtual HRESULT GetHardwareReferenceTimestamp (/* in */ BMDTimeScale timeScale, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration) = 0;
+
+ virtual HRESULT GetTimecode (/* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode **timecode) = 0;
+
+protected:
+ virtual ~IDeckLinkEncoderVideoPacket () {} // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkEncoderAudioPacket - Provided by the IDeckLinkEncoderInput audio packet arrival callback. */
+
+class IDeckLinkEncoderAudioPacket : public IDeckLinkEncoderPacket
+{
+public:
+ virtual BMDAudioFormat GetAudioFormat (void) = 0;
+
+protected:
+ virtual ~IDeckLinkEncoderAudioPacket () {} // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkH265NALPacket - Obtained through QueryInterface() on an IDeckLinkEncoderVideoPacket object */
+
+class IDeckLinkH265NALPacket : public IDeckLinkEncoderVideoPacket
+{
+public:
+ virtual HRESULT GetUnitType (/* out */ uint8_t *unitType) = 0;
+ virtual HRESULT GetBytesNoPrefix (/* out */ void **buffer) = 0;
+ virtual long GetSizeNoPrefix (void) = 0;
+
+protected:
+ virtual ~IDeckLinkH265NALPacket () {} // call Release method to drop reference count
+};
+
/* Interface IDeckLinkAudioInputPacket - Provided by the IDeckLinkInput callback. */
class IDeckLinkAudioInputPacket : public IUnknown
@@ -697,6 +975,21 @@
virtual ~IDeckLinkAttributes () {} // call Release method to drop reference count
};
+/* Interface IDeckLinkStatus - DeckLink Status interface */
+
+class IDeckLinkStatus : public IUnknown
+{
+public:
+ virtual HRESULT GetFlag (/* in */ BMDDeckLinkStatusID statusID, /* out */ bool *value) = 0;
+ virtual HRESULT GetInt (/* in */ BMDDeckLinkStatusID statusID, /* out */ int64_t *value) = 0;
+ virtual HRESULT GetFloat (/* in */ BMDDeckLinkStatusID statusID, /* out */ double *value) = 0;
+ virtual HRESULT GetString (/* in */ BMDDeckLinkStatusID statusID, /* out */ const char **value) = 0;
+ virtual HRESULT GetBytes (/* in */ BMDDeckLinkStatusID statusID, /* out */ void *buffer, /* in, out */ uint32_t *bufferSize) = 0;
+
+protected:
+ virtual ~IDeckLinkStatus () {} // call Release method to drop reference count
+};
+
/* Interface IDeckLinkKeyer - DeckLink Keyer interface */
class IDeckLinkKeyer : public IUnknown
diff --git a/sys/decklink/linux/DeckLinkAPIConfiguration.h b/sys/decklink/linux/DeckLinkAPIConfiguration.h
index def498c..3a6ab69 100644
--- a/sys/decklink/linux/DeckLinkAPIConfiguration.h
+++ b/sys/decklink/linux/DeckLinkAPIConfiguration.h
@@ -1,5 +1,5 @@
/* -LICENSE-START-
-** Copyright (c) 2014 Blackmagic Design
+** Copyright (c) 2016 Blackmagic Design
**
** Permission is hereby granted, free of charge, to any person or organization
** obtaining a copy of the software and accompanying documentation covered by
@@ -42,7 +42,8 @@
// Interface ID Declarations
-BMD_CONST REFIID IID_IDeckLinkConfiguration = /* 1E69FCF6-4203-4936-8076-2A9F4CFD50CB */ {0x1E,0x69,0xFC,0xF6,0x42,0x03,0x49,0x36,0x80,0x76,0x2A,0x9F,0x4C,0xFD,0x50,0xCB};
+BMD_CONST REFIID IID_IDeckLinkConfiguration = /* CB71734A-FE37-4E8D-8E13-802133A1C3F2 */ {0xCB,0x71,0x73,0x4A,0xFE,0x37,0x4E,0x8D,0x8E,0x13,0x80,0x21,0x33,0xA1,0xC3,0xF2};
+BMD_CONST REFIID IID_IDeckLinkEncoderConfiguration = /* 138050E5-C60A-4552-BF3F-0F358049327E */ {0x13,0x80,0x50,0xE5,0xC6,0x0A,0x45,0x52,0xBF,0x3F,0x0F,0x35,0x80,0x49,0x32,0x7E};
/* Enum BMDDeckLinkConfigurationID - DeckLink Configuration ID */
@@ -62,6 +63,7 @@
bmdDeckLinkConfigHDMI3DPackingFormat = /* '3dpf' */ 0x33647066,
bmdDeckLinkConfigBypass = /* 'byps' */ 0x62797073,
bmdDeckLinkConfigClockTimingAdjustment = /* 'ctad' */ 0x63746164,
+ bmdDeckLinkConfigDuplexMode = /* 'dupx' */ 0x64757078,
/* Audio Input/Output Flags */
@@ -72,9 +74,10 @@
bmdDeckLinkConfigFieldFlickerRemoval = /* 'fdfr' */ 0x66646672,
bmdDeckLinkConfigHD1080p24ToHD1080i5994Conversion = /* 'to59' */ 0x746F3539,
bmdDeckLinkConfig444SDIVideoOutput = /* '444o' */ 0x3434346F,
- bmdDeckLinkConfigSingleLinkVideoOutput = /* 'sglo' */ 0x73676C6F,
bmdDeckLinkConfigBlackVideoOutputDuringCapture = /* 'bvoc' */ 0x62766F63,
bmdDeckLinkConfigLowLatencyVideoOutput = /* 'llvo' */ 0x6C6C766F,
+ bmdDeckLinkConfigDownConversionOnAllAnalogOutput = /* 'caao' */ 0x6361616F,
+ bmdDeckLinkConfigSMPTELevelAOutput = /* 'smta' */ 0x736D7461,
/* Video Output Integers */
@@ -85,6 +88,7 @@
bmdDeckLinkConfigVideoOutputIdleOperation = /* 'voio' */ 0x766F696F,
bmdDeckLinkConfigDefaultVideoOutputMode = /* 'dvom' */ 0x64766F6D,
bmdDeckLinkConfigDefaultVideoOutputModeFlags = /* 'dvof' */ 0x64766F66,
+ bmdDeckLinkConfigSDIOutputLinkConfiguration = /* 'solc' */ 0x736F6C63,
/* Video Output Floats */
@@ -100,6 +104,7 @@
bmdDeckLinkConfigVideoInputScanning = /* 'visc' */ 0x76697363, // Applicable to H264 Pro Recorder only
bmdDeckLinkConfigUseDedicatedLTCInput = /* 'dltc' */ 0x646C7463, // Use timecode from LTC input instead of SDI stream
+ bmdDeckLinkConfigSDIInput3DPayloadOverride = /* '3dds' */ 0x33646473,
/* Video Input Integers */
@@ -122,6 +127,10 @@
bmdDeckLinkConfigVideoInputSVideoLumaGain = /* 'islg' */ 0x69736C67,
bmdDeckLinkConfigVideoInputSVideoChromaGain = /* 'iscg' */ 0x69736367,
+ /* Audio Input Flags */
+
+ bmdDeckLinkConfigMicrophonePhantomPower = /* 'mphp' */ 0x6D706870,
+
/* Audio Input Integers */
bmdDeckLinkConfigAudioInputConnection = /* 'aicn' */ 0x6169636E,
@@ -133,6 +142,7 @@
bmdDeckLinkConfigAnalogAudioInputScaleChannel3 = /* 'ais3' */ 0x61697333,
bmdDeckLinkConfigAnalogAudioInputScaleChannel4 = /* 'ais4' */ 0x61697334,
bmdDeckLinkConfigDigitalAudioInputScale = /* 'dais' */ 0x64616973,
+ bmdDeckLinkConfigMicrophoneInputGain = /* 'micg' */ 0x6D696367,
/* Audio Output Integers */
@@ -144,12 +154,55 @@
bmdDeckLinkConfigAnalogAudioOutputScaleChannel2 = /* 'aos2' */ 0x616F7332,
bmdDeckLinkConfigAnalogAudioOutputScaleChannel3 = /* 'aos3' */ 0x616F7333,
bmdDeckLinkConfigAnalogAudioOutputScaleChannel4 = /* 'aos4' */ 0x616F7334,
- bmdDeckLinkConfigDigitalAudioOutputScale = /* 'daos' */ 0x64616F73
+ bmdDeckLinkConfigDigitalAudioOutputScale = /* 'daos' */ 0x64616F73,
+ bmdDeckLinkConfigHeadphoneVolume = /* 'hvol' */ 0x68766F6C,
+
+ /* Device Information Strings */
+
+ bmdDeckLinkConfigDeviceInformationLabel = /* 'dila' */ 0x64696C61,
+ bmdDeckLinkConfigDeviceInformationSerialNumber = /* 'disn' */ 0x6469736E,
+ bmdDeckLinkConfigDeviceInformationCompany = /* 'dico' */ 0x6469636F,
+ bmdDeckLinkConfigDeviceInformationPhone = /* 'diph' */ 0x64697068,
+ bmdDeckLinkConfigDeviceInformationEmail = /* 'diem' */ 0x6469656D,
+ bmdDeckLinkConfigDeviceInformationDate = /* 'dida' */ 0x64696461,
+
+ /* Deck Control Integers */
+
+ bmdDeckLinkConfigDeckControlConnection = /* 'dcco' */ 0x6463636F
+};
+
+/* Enum BMDDeckLinkEncoderConfigurationID - DeckLink Encoder Configuration ID */
+
+typedef uint32_t BMDDeckLinkEncoderConfigurationID;
+enum _BMDDeckLinkEncoderConfigurationID {
+
+ /* Video Encoder Integers */
+
+ bmdDeckLinkEncoderConfigPreferredBitDepth = /* 'epbr' */ 0x65706272,
+ bmdDeckLinkEncoderConfigFrameCodingMode = /* 'efcm' */ 0x6566636D,
+
+ /* HEVC/H.265 Encoder Integers */
+
+ bmdDeckLinkEncoderConfigH265TargetBitrate = /* 'htbr' */ 0x68746272,
+
+ /* DNxHR/DNxHD Compression ID */
+
+ bmdDeckLinkEncoderConfigDNxHRCompressionID = /* 'dcid' */ 0x64636964,
+
+ /* DNxHR/DNxHD Level */
+
+ bmdDeckLinkEncoderConfigDNxHRLevel = /* 'dlev' */ 0x646C6576,
+
+ /* Encoded Sample Decriptions */
+
+ bmdDeckLinkEncoderConfigMPEG4SampleDescription = /* 'stsE' */ 0x73747345, // Full MPEG4 sample description (aka SampleEntry of an 'stsd' atom-box). Useful for MediaFoundation, QuickTime, MKV and more
+ bmdDeckLinkEncoderConfigMPEG4CodecSpecificDesc = /* 'esds' */ 0x65736473 // Sample description extensions only (atom stream, each with size and fourCC header). Useful for AVFoundation, VideoToolbox, MKV and more
};
// Forward Declarations
class IDeckLinkConfiguration;
+class IDeckLinkEncoderConfiguration;
/* Interface IDeckLinkConfiguration - DeckLink Configuration interface */
@@ -170,6 +223,25 @@
virtual ~IDeckLinkConfiguration () {} // call Release method to drop reference count
};
+/* Interface IDeckLinkEncoderConfiguration - DeckLink Encoder Configuration interface. Obtained from IDeckLinkEncoderInput */
+
+class IDeckLinkEncoderConfiguration : public IUnknown
+{
+public:
+ virtual HRESULT SetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ bool value) = 0;
+ virtual HRESULT GetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ bool *value) = 0;
+ virtual HRESULT SetInt (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ int64_t value) = 0;
+ virtual HRESULT GetInt (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ int64_t *value) = 0;
+ virtual HRESULT SetFloat (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ double value) = 0;
+ virtual HRESULT GetFloat (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ double *value) = 0;
+ virtual HRESULT SetString (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ const char *value) = 0;
+ virtual HRESULT GetString (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ const char **value) = 0;
+ virtual HRESULT GetBytes (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ void *buffer /* optional */, /* in, out */ uint32_t *bufferSize) = 0;
+
+protected:
+ virtual ~IDeckLinkEncoderConfiguration () {} // call Release method to drop reference count
+};
+
/* Functions */
extern "C" {
diff --git a/sys/decklink/linux/DeckLinkAPIDeckControl.h b/sys/decklink/linux/DeckLinkAPIDeckControl.h
index b83d013..24f72d2 100644
--- a/sys/decklink/linux/DeckLinkAPIDeckControl.h
+++ b/sys/decklink/linux/DeckLinkAPIDeckControl.h
@@ -1,5 +1,5 @@
/* -LICENSE-START-
-** Copyright (c) 2014 Blackmagic Design
+** Copyright (c) 2016 Blackmagic Design
**
** Permission is hereby granted, free of charge, to any person or organization
** obtaining a copy of the software and accompanying documentation covered by
diff --git a/sys/decklink/linux/DeckLinkAPIDiscovery.h b/sys/decklink/linux/DeckLinkAPIDiscovery.h
index 424d9d5..fac3099 100644
--- a/sys/decklink/linux/DeckLinkAPIDiscovery.h
+++ b/sys/decklink/linux/DeckLinkAPIDiscovery.h
@@ -1,5 +1,5 @@
/* -LICENSE-START-
-** Copyright (c) 2014 Blackmagic Design
+** Copyright (c) 2016 Blackmagic Design
**
** Permission is hereby granted, free of charge, to any person or organization
** obtaining a copy of the software and accompanying documentation covered by
diff --git a/sys/decklink/linux/DeckLinkAPIModes.h b/sys/decklink/linux/DeckLinkAPIModes.h
index 394d68c..2788e7a 100644
--- a/sys/decklink/linux/DeckLinkAPIModes.h
+++ b/sys/decklink/linux/DeckLinkAPIModes.h
@@ -1,5 +1,5 @@
/* -LICENSE-START-
-** Copyright (c) 2014 Blackmagic Design
+** Copyright (c) 2016 Blackmagic Design
**
** Permission is hereby granted, free of charge, to any person or organization
** obtaining a copy of the software and accompanying documentation covered by
@@ -135,7 +135,12 @@
bmdFormat12BitRGB = /* 'R12B' */ 0x52313242, // Big-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component
bmdFormat12BitRGBLE = /* 'R12L' */ 0x5231324C, // Little-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component
bmdFormat10BitRGBXLE = /* 'R10l' */ 0x5231306C, // Little-endian 10-bit RGB with SMPTE video levels (64-940)
- bmdFormat10BitRGBX = /* 'R10b' */ 0x52313062 // Big-endian 10-bit RGB with SMPTE video levels (64-940)
+ bmdFormat10BitRGBX = /* 'R10b' */ 0x52313062, // Big-endian 10-bit RGB with SMPTE video levels (64-940)
+ bmdFormatH265 = /* 'hev1' */ 0x68657631, // High Efficiency Video Coding (HEVC/h.265)
+
+ /* AVID DNxHR */
+
+ bmdFormatDNxHR = /* 'AVdh' */ 0x41566468
};
/* Enum BMDDisplayModeFlags - Flags to describe the characteristics of an IDeckLinkDisplayMode. */
diff --git a/sys/decklink/linux/DeckLinkAPITypes.h b/sys/decklink/linux/DeckLinkAPITypes.h
index 55e015f..e3379e3 100644
--- a/sys/decklink/linux/DeckLinkAPITypes.h
+++ b/sys/decklink/linux/DeckLinkAPITypes.h
@@ -1,5 +1,5 @@
/* -LICENSE-START-
-** Copyright (c) 2014 Blackmagic Design
+** Copyright (c) 2016 Blackmagic Design
**
** Permission is hereby granted, free of charge, to any person or organization
** obtaining a copy of the software and accompanying documentation covered by
@@ -77,7 +77,17 @@
bmdAudioConnectionAESEBU = 1 << 1,
bmdAudioConnectionAnalog = 1 << 2,
bmdAudioConnectionAnalogXLR = 1 << 3,
- bmdAudioConnectionAnalogRCA = 1 << 4
+ bmdAudioConnectionAnalogRCA = 1 << 4,
+ bmdAudioConnectionMicrophone = 1 << 5,
+ bmdAudioConnectionHeadphones = 1 << 6
+};
+
+/* Enum BMDDeckControlConnection - Deck control connections */
+
+typedef uint32_t BMDDeckControlConnection;
+enum _BMDDeckControlConnection {
+ bmdDeckControlConnectionRS422Remote1 = 1 << 0,
+ bmdDeckControlConnectionRS422Remote2 = 1 << 1
};
// Forward Declarations
diff --git a/sys/decklink/osx/DeckLinkAPI.h b/sys/decklink/osx/DeckLinkAPI.h
index 8c334c0..fe8e03b 100644
--- a/sys/decklink/osx/DeckLinkAPI.h
+++ b/sys/decklink/osx/DeckLinkAPI.h
@@ -1,5 +1,5 @@
/* -LICENSE-START-
-** Copyright (c) 2014 Blackmagic Design
+** Copyright (c) 2016 Blackmagic Design
**
** Permission is hereby granted, free of charge, to any person or organization
** obtaining a copy of the software and accompanying documentation covered by
@@ -60,17 +60,24 @@
BMD_CONST REFIID IID_IDeckLinkVideoOutputCallback = /* 20AA5225-1958-47CB-820B-80A8D521A6EE */ {0x20,0xAA,0x52,0x25,0x19,0x58,0x47,0xCB,0x82,0x0B,0x80,0xA8,0xD5,0x21,0xA6,0xEE};
BMD_CONST REFIID IID_IDeckLinkInputCallback = /* DD04E5EC-7415-42AB-AE4A-E80C4DFC044A */ {0xDD,0x04,0xE5,0xEC,0x74,0x15,0x42,0xAB,0xAE,0x4A,0xE8,0x0C,0x4D,0xFC,0x04,0x4A};
+BMD_CONST REFIID IID_IDeckLinkEncoderInputCallback = /* ACF13E61-F4A0-4974-A6A7-59AFF6268B31 */ {0xAC,0xF1,0x3E,0x61,0xF4,0xA0,0x49,0x74,0xA6,0xA7,0x59,0xAF,0xF6,0x26,0x8B,0x31};
BMD_CONST REFIID IID_IDeckLinkMemoryAllocator = /* B36EB6E7-9D29-4AA8-92EF-843B87A289E8 */ {0xB3,0x6E,0xB6,0xE7,0x9D,0x29,0x4A,0xA8,0x92,0xEF,0x84,0x3B,0x87,0xA2,0x89,0xE8};
BMD_CONST REFIID IID_IDeckLinkAudioOutputCallback = /* 403C681B-7F46-4A12-B993-2BB127084EE6 */ {0x40,0x3C,0x68,0x1B,0x7F,0x46,0x4A,0x12,0xB9,0x93,0x2B,0xB1,0x27,0x08,0x4E,0xE6};
BMD_CONST REFIID IID_IDeckLinkIterator = /* 50FB36CD-3063-4B73-BDBB-958087F2D8BA */ {0x50,0xFB,0x36,0xCD,0x30,0x63,0x4B,0x73,0xBD,0xBB,0x95,0x80,0x87,0xF2,0xD8,0xBA};
BMD_CONST REFIID IID_IDeckLinkAPIInformation = /* 7BEA3C68-730D-4322-AF34-8A7152B532A4 */ {0x7B,0xEA,0x3C,0x68,0x73,0x0D,0x43,0x22,0xAF,0x34,0x8A,0x71,0x52,0xB5,0x32,0xA4};
BMD_CONST REFIID IID_IDeckLinkOutput = /* CC5C8A6E-3F2F-4B3A-87EA-FD78AF300564 */ {0xCC,0x5C,0x8A,0x6E,0x3F,0x2F,0x4B,0x3A,0x87,0xEA,0xFD,0x78,0xAF,0x30,0x05,0x64};
BMD_CONST REFIID IID_IDeckLinkInput = /* AF22762B-DFAC-4846-AA79-FA8883560995 */ {0xAF,0x22,0x76,0x2B,0xDF,0xAC,0x48,0x46,0xAA,0x79,0xFA,0x88,0x83,0x56,0x09,0x95};
+BMD_CONST REFIID IID_IDeckLinkEncoderInput = /* 270587DA-6B7D-42E7-A1F0-6D853F581185 */ {0x27,0x05,0x87,0xDA,0x6B,0x7D,0x42,0xE7,0xA1,0xF0,0x6D,0x85,0x3F,0x58,0x11,0x85};
BMD_CONST REFIID IID_IDeckLinkVideoFrame = /* 3F716FE0-F023-4111-BE5D-EF4414C05B17 */ {0x3F,0x71,0x6F,0xE0,0xF0,0x23,0x41,0x11,0xBE,0x5D,0xEF,0x44,0x14,0xC0,0x5B,0x17};
BMD_CONST REFIID IID_IDeckLinkMutableVideoFrame = /* 69E2639F-40DA-4E19-B6F2-20ACE815C390 */ {0x69,0xE2,0x63,0x9F,0x40,0xDA,0x4E,0x19,0xB6,0xF2,0x20,0xAC,0xE8,0x15,0xC3,0x90};
BMD_CONST REFIID IID_IDeckLinkVideoFrame3DExtensions = /* DA0F7E4A-EDC7-48A8-9CDD-2DB51C729CD7 */ {0xDA,0x0F,0x7E,0x4A,0xED,0xC7,0x48,0xA8,0x9C,0xDD,0x2D,0xB5,0x1C,0x72,0x9C,0xD7};
+BMD_CONST REFIID IID_IDeckLinkVideoFrameMetadataExtensions = /* D5973DC9-6432-46D0-8F0B-2496F8A1238F */ {0xD5,0x97,0x3D,0xC9,0x64,0x32,0x46,0xD0,0x8F,0x0B,0x24,0x96,0xF8,0xA1,0x23,0x8F};
BMD_CONST REFIID IID_IDeckLinkVideoInputFrame = /* 05CFE374-537C-4094-9A57-680525118F44 */ {0x05,0xCF,0xE3,0x74,0x53,0x7C,0x40,0x94,0x9A,0x57,0x68,0x05,0x25,0x11,0x8F,0x44};
BMD_CONST REFIID IID_IDeckLinkVideoFrameAncillary = /* 732E723C-D1A4-4E29-9E8E-4A88797A0004 */ {0x73,0x2E,0x72,0x3C,0xD1,0xA4,0x4E,0x29,0x9E,0x8E,0x4A,0x88,0x79,0x7A,0x00,0x04};
+BMD_CONST REFIID IID_IDeckLinkEncoderPacket = /* B693F36C-316E-4AF1-B6C2-F389A4BCA620 */ {0xB6,0x93,0xF3,0x6C,0x31,0x6E,0x4A,0xF1,0xB6,0xC2,0xF3,0x89,0xA4,0xBC,0xA6,0x20};
+BMD_CONST REFIID IID_IDeckLinkEncoderVideoPacket = /* 4E7FD944-E8C7-4EAC-B8C0-7B77F80F5AE0 */ {0x4E,0x7F,0xD9,0x44,0xE8,0xC7,0x4E,0xAC,0xB8,0xC0,0x7B,0x77,0xF8,0x0F,0x5A,0xE0};
+BMD_CONST REFIID IID_IDeckLinkEncoderAudioPacket = /* 49E8EDC8-693B-4E14-8EF6-12C658F5A07A */ {0x49,0xE8,0xED,0xC8,0x69,0x3B,0x4E,0x14,0x8E,0xF6,0x12,0xC6,0x58,0xF5,0xA0,0x7A};
+BMD_CONST REFIID IID_IDeckLinkH265NALPacket = /* 639C8E0B-68D5-4BDE-A6D4-95F3AEAFF2E7 */ {0x63,0x9C,0x8E,0x0B,0x68,0xD5,0x4B,0xDE,0xA6,0xD4,0x95,0xF3,0xAE,0xAF,0xF2,0xE7};
BMD_CONST REFIID IID_IDeckLinkAudioInputPacket = /* E43D5870-2894-11DE-8C30-0800200C9A66 */ {0xE4,0x3D,0x58,0x70,0x28,0x94,0x11,0xDE,0x8C,0x30,0x08,0x00,0x20,0x0C,0x9A,0x66};
BMD_CONST REFIID IID_IDeckLinkScreenPreviewCallback = /* B1D3F49A-85FE-4C5D-95C8-0B5D5DCCD438 */ {0xB1,0xD3,0xF4,0x9A,0x85,0xFE,0x4C,0x5D,0x95,0xC8,0x0B,0x5D,0x5D,0xCC,0xD4,0x38};
BMD_CONST REFIID IID_IDeckLinkCocoaScreenPreviewCallback = /* D174152F-8F96-4C07-83A5-DD5F5AF0A2AA */ {0xD1,0x74,0x15,0x2F,0x8F,0x96,0x4C,0x07,0x83,0xA5,0xDD,0x5F,0x5A,0xF0,0xA2,0xAA};
@@ -78,6 +85,7 @@
BMD_CONST REFIID IID_IDeckLinkNotificationCallback = /* B002A1EC-070D-4288-8289-BD5D36E5FF0D */ {0xB0,0x02,0xA1,0xEC,0x07,0x0D,0x42,0x88,0x82,0x89,0xBD,0x5D,0x36,0xE5,0xFF,0x0D};
BMD_CONST REFIID IID_IDeckLinkNotification = /* 0A1FB207-E215-441B-9B19-6FA1575946C5 */ {0x0A,0x1F,0xB2,0x07,0xE2,0x15,0x44,0x1B,0x9B,0x19,0x6F,0xA1,0x57,0x59,0x46,0xC5};
BMD_CONST REFIID IID_IDeckLinkAttributes = /* ABC11843-D966-44CB-96E2-A1CB5D3135C4 */ {0xAB,0xC1,0x18,0x43,0xD9,0x66,0x44,0xCB,0x96,0xE2,0xA1,0xCB,0x5D,0x31,0x35,0xC4};
+BMD_CONST REFIID IID_IDeckLinkStatus = /* 5F558200-4028-49BC-BEAC-DB3FA4A96E46 */ {0x5F,0x55,0x82,0x00,0x40,0x28,0x49,0xBC,0xBE,0xAC,0xDB,0x3F,0xA4,0xA9,0x6E,0x46};
BMD_CONST REFIID IID_IDeckLinkKeyer = /* 89AFCAF5-65F8-421E-98F7-96FE5F5BFBA3 */ {0x89,0xAF,0xCA,0xF5,0x65,0xF8,0x42,0x1E,0x98,0xF7,0x96,0xFE,0x5F,0x5B,0xFB,0xA3};
BMD_CONST REFIID IID_IDeckLinkVideoConversion = /* 3BBCB8A2-DA2C-42D9-B5D8-88083644E99A */ {0x3B,0xBC,0xB8,0xA2,0xDA,0x2C,0x42,0xD9,0xB5,0xD8,0x88,0x08,0x36,0x44,0xE9,0x9A};
BMD_CONST REFIID IID_IDeckLinkDeviceNotificationCallback = /* 4997053B-0ADF-4CC8-AC70-7A50C4BE728F */ {0x49,0x97,0x05,0x3B,0x0A,0xDF,0x4C,0xC8,0xAC,0x70,0x7A,0x50,0xC4,0xBE,0x72,0x8F};
@@ -94,12 +102,21 @@
bmdVideoOutputDualStream3D = 1 << 4
};
+/* Enum BMDPacketType - Type of packet */
+
+typedef uint32_t BMDPacketType;
+enum _BMDPacketType {
+ bmdPacketTypeStreamInterruptedMarker = 'sint', // A packet of this type marks the time when a video stream was interrupted, for example by a disconnected cable
+ bmdPacketTypeStreamData = 'sdat' // Regular stream data
+};
+
/* Enum BMDFrameFlags - Frame flags */
typedef uint32_t BMDFrameFlags;
enum _BMDFrameFlags {
bmdFrameFlagDefault = 0,
bmdFrameFlagFlipVertical = 1 << 0,
+ bmdFrameContainsHDRMetadata = 1 << 1,
/* Flags that are applicable only to instances of IDeckLinkVideoInputFrame */
@@ -137,6 +154,7 @@
typedef uint32_t BMDDeckLinkCapturePassthroughMode;
enum _BMDDeckLinkCapturePassthroughMode {
+ bmdDeckLinkCapturePassthroughModeDisabled = 'pdis',
bmdDeckLinkCapturePassthroughModeDirect = 'pdir',
bmdDeckLinkCapturePassthroughModeCleanSwitch = 'pcln'
};
@@ -159,6 +177,13 @@
bmdReferenceLocked = 1 << 1
};
+/* Enum BMDAudioFormat - Audio Format */
+
+typedef uint32_t BMDAudioFormat;
+enum _BMDAudioFormat {
+ bmdAudioFormatPCM = 'lpcm' // Linear signed PCM samples
+};
+
/* Enum BMDAudioSampleRate - Audio sample rates supported for output/input */
typedef uint32_t BMDAudioSampleRate;
@@ -271,8 +296,71 @@
typedef uint32_t BMDIdleVideoOutputOperation;
enum _BMDIdleVideoOutputOperation {
bmdIdleVideoOutputBlack = 'blac',
- bmdIdleVideoOutputLastFrame = 'lafa',
- bmdIdleVideoOutputDesktop = 'desk'
+ bmdIdleVideoOutputLastFrame = 'lafa'
+};
+
+/* Enum BMDVideoEncoderFrameCodingMode - Video frame coding mode */
+
+typedef uint32_t BMDVideoEncoderFrameCodingMode;
+enum _BMDVideoEncoderFrameCodingMode {
+ bmdVideoEncoderFrameCodingModeInter = 'inte',
+ bmdVideoEncoderFrameCodingModeIntra = 'intr'
+};
+
+/* Enum BMDDNxHRLevel - DNxHR Levels */
+
+typedef uint32_t BMDDNxHRLevel;
+enum _BMDDNxHRLevel {
+ bmdDNxHRLevelSQ = 'dnsq',
+ bmdDNxHRLevelLB = 'dnlb',
+ bmdDNxHRLevelHQ = 'dnhq',
+ bmdDNxHRLevelHQX = 'dhqx',
+ bmdDNxHRLevel444 = 'd444'
+};
+
+/* Enum BMDLinkConfiguration - Video link configuration */
+
+typedef uint32_t BMDLinkConfiguration;
+enum _BMDLinkConfiguration {
+ bmdLinkConfigurationSingleLink = 'lcsl',
+ bmdLinkConfigurationDualLink = 'lcdl',
+ bmdLinkConfigurationQuadLink = 'lcql'
+};
+
+/* Enum BMDDeviceInterface - Device interface type */
+
+typedef uint32_t BMDDeviceInterface;
+enum _BMDDeviceInterface {
+ bmdDeviceInterfacePCI = 'pci ',
+ bmdDeviceInterfaceUSB = 'usb ',
+ bmdDeviceInterfaceThunderbolt = 'thun'
+};
+
+/* Enum BMDDeckLinkFrameMetadataID - DeckLink Frame Metadata ID */
+
+typedef uint32_t BMDDeckLinkFrameMetadataID;
+enum _BMDDeckLinkFrameMetadataID {
+ bmdDeckLinkFrameMetadataHDRElectroOpticalTransferFunc = 'eotf', // EOTF in range 0-7 as per CEA 861.3
+ bmdDeckLinkFrameMetadataHDRDisplayPrimariesRedX = 'hdrx', // Red display primaries in range 0.0 - 1.0
+ bmdDeckLinkFrameMetadataHDRDisplayPrimariesRedY = 'hdry', // Red display primaries in range 0.0 - 1.0
+ bmdDeckLinkFrameMetadataHDRDisplayPrimariesGreenX = 'hdgx', // Green display primaries in range 0.0 - 1.0
+ bmdDeckLinkFrameMetadataHDRDisplayPrimariesGreenY = 'hdgy', // Green display primaries in range 0.0 - 1.0
+ bmdDeckLinkFrameMetadataHDRDisplayPrimariesBlueX = 'hdbx', // Blue display primaries in range 0.0 - 1.0
+ bmdDeckLinkFrameMetadataHDRDisplayPrimariesBlueY = 'hdby', // Blue display primaries in range 0.0 - 1.0
+ bmdDeckLinkFrameMetadataHDRWhitePointX = 'hdwx', // White point in range 0.0 - 1.0
+ bmdDeckLinkFrameMetadataHDRWhitePointY = 'hdwy', // White point in range 0.0 - 1.0
+ bmdDeckLinkFrameMetadataHDRMaxDisplayMasteringLuminance = 'hdml', // Max display mastering luminance in range 1 cd/m2 - 65535 cd/m2
+ bmdDeckLinkFrameMetadataHDRMinDisplayMasteringLuminance = 'hmil', // Min display mastering luminance in range 0.0001 cd/m2 - 6.5535 cd/m2
+ bmdDeckLinkFrameMetadataHDRMaximumContentLightLevel = 'mcll', // Maximum Content Light Level in range 1 cd/m2 - 65535 cd/m2
+ bmdDeckLinkFrameMetadataHDRMaximumFrameAverageLightLevel = 'fall' // Maximum Frame Average Light Level in range 1 cd/m2 - 65535 cd/m2
+};
+
+/* Enum BMDDuplexMode - Duplex for configurable ports */
+
+typedef uint32_t BMDDuplexMode;
+enum _BMDDuplexMode {
+ bmdDuplexModeFull = 'fdup',
+ bmdDuplexModeHalf = 'hdup'
};
/* Enum BMDDeckLinkAttributeID - DeckLink Attribute ID */
@@ -292,10 +380,16 @@
BMDDeckLinkCanOnlyAdjustOverallVideoOutputGain = 'ovog',
BMDDeckLinkHasVideoInputAntiAliasingFilter = 'aafl',
BMDDeckLinkHasBypass = 'byps',
- BMDDeckLinkSupportsDesktopDisplay = 'extd',
BMDDeckLinkSupportsClockTimingAdjustment = 'ctad',
BMDDeckLinkSupportsFullDuplex = 'fdup',
BMDDeckLinkSupportsFullFrameReferenceInputTimingOffset = 'frin',
+ BMDDeckLinkSupportsSMPTELevelAOutput = 'lvla',
+ BMDDeckLinkSupportsDualLinkSDI = 'sdls',
+ BMDDeckLinkSupportsQuadLinkSDI = 'sqls',
+ BMDDeckLinkSupportsIdleOutput = 'idou',
+ BMDDeckLinkHasLTCTimecodeInput = 'hltc',
+ BMDDeckLinkSupportsDuplexModeConfiguration = 'dupx',
+ BMDDeckLinkSupportsHDRMetadata = 'hdrm',
/* Integers */
@@ -304,13 +398,20 @@
BMDDeckLinkNumberOfSubDevices = 'nsbd',
BMDDeckLinkSubDeviceIndex = 'subi',
BMDDeckLinkPersistentID = 'peid',
+ BMDDeckLinkDeviceGroupID = 'dgid',
BMDDeckLinkTopologicalID = 'toid',
BMDDeckLinkVideoOutputConnections = 'vocn',
BMDDeckLinkVideoInputConnections = 'vicn',
BMDDeckLinkAudioOutputConnections = 'aocn',
BMDDeckLinkAudioInputConnections = 'aicn',
- BMDDeckLinkDeviceBusyState = 'dbst',
BMDDeckLinkVideoIOSupport = 'vios', // Returns a BMDVideoIOSupport bit field
+ BMDDeckLinkDeckControlConnections = 'dccn',
+ BMDDeckLinkDeviceInterface = 'dbus', // Returns a BMDDeviceInterface
+ BMDDeckLinkAudioInputRCAChannelCount = 'airc',
+ BMDDeckLinkAudioInputXLRChannelCount = 'aixc',
+ BMDDeckLinkAudioOutputRCAChannelCount = 'aorc',
+ BMDDeckLinkAudioOutputXLRChannelCount = 'aoxc',
+ BMDDeckLinkPairedDevicePersistentID = 'ppid',
/* Floats */
@@ -318,10 +419,16 @@
BMDDeckLinkVideoInputGainMaximum = 'vigx',
BMDDeckLinkVideoOutputGainMinimum = 'vogm',
BMDDeckLinkVideoOutputGainMaximum = 'vogx',
+ BMDDeckLinkMicrophoneInputGainMinimum = 'migm',
+ BMDDeckLinkMicrophoneInputGainMaximum = 'migx',
/* Strings */
- BMDDeckLinkSerialPortDeviceName = 'slpn'
+ BMDDeckLinkSerialPortDeviceName = 'slpn',
+ BMDDeckLinkVendorName = 'vndr',
+ BMDDeckLinkDisplayName = 'dspn',
+ BMDDeckLinkModelName = 'mdln',
+ BMDDeckLinkDeviceHandle = 'devh'
};
/* Enum BMDDeckLinkAPIInformationID - DeckLinkAPI information ID */
@@ -331,6 +438,52 @@
BMDDeckLinkAPIVersion = 'vers'
};
+/* Enum BMDDeckLinkStatusID - DeckLink Status ID */
+
+typedef uint32_t BMDDeckLinkStatusID;
+enum _BMDDeckLinkStatusID {
+
+ /* Integers */
+
+ bmdDeckLinkStatusDetectedVideoInputMode = 'dvim',
+ bmdDeckLinkStatusDetectedVideoInputFlags = 'dvif',
+ bmdDeckLinkStatusCurrentVideoInputMode = 'cvim',
+ bmdDeckLinkStatusCurrentVideoInputPixelFormat = 'cvip',
+ bmdDeckLinkStatusCurrentVideoInputFlags = 'cvif',
+ bmdDeckLinkStatusCurrentVideoOutputMode = 'cvom',
+ bmdDeckLinkStatusCurrentVideoOutputFlags = 'cvof',
+ bmdDeckLinkStatusPCIExpressLinkWidth = 'pwid',
+ bmdDeckLinkStatusPCIExpressLinkSpeed = 'plnk',
+ bmdDeckLinkStatusLastVideoOutputPixelFormat = 'opix',
+ bmdDeckLinkStatusReferenceSignalMode = 'refm',
+ bmdDeckLinkStatusReferenceSignalFlags = 'reff',
+ bmdDeckLinkStatusDuplexMode = 'dupx',
+ bmdDeckLinkStatusBusy = 'busy',
+
+ /* Flags */
+
+ bmdDeckLinkStatusVideoInputSignalLocked = 'visl',
+ bmdDeckLinkStatusReferenceSignalLocked = 'refl'
+};
+
+/* Enum BMDDeckLinkVideoStatusFlags - */
+
+typedef uint32_t BMDDeckLinkVideoStatusFlags;
+enum _BMDDeckLinkVideoStatusFlags {
+ bmdDeckLinkVideoStatusPsF = 1 << 0,
+ bmdDeckLinkVideoStatusDualStream3D = 1 << 1
+};
+
+/* Enum BMDDuplexStatus - Duplex status of the device */
+
+typedef uint32_t BMDDuplexStatus;
+enum _BMDDuplexStatus {
+ bmdDuplexStatusFullDuplex = 'fdup',
+ bmdDuplexStatusHalfDuplex = 'hdup',
+ bmdDuplexStatusSimplex = 'splx',
+ bmdDuplexStatusInactive = 'inac'
+};
+
/* Enum BMDDeviceBusyState - Current device busy state */
typedef uint32_t BMDDeviceBusyState;
@@ -363,7 +516,8 @@
typedef uint32_t BMDNotifications;
enum _BMDNotifications {
- bmdPreferencesChanged = 'pref'
+ bmdPreferencesChanged = 'pref',
+ bmdStatusChanged = 'stat'
};
#if defined(__cplusplus)
@@ -372,17 +526,24 @@
class IDeckLinkVideoOutputCallback;
class IDeckLinkInputCallback;
+class IDeckLinkEncoderInputCallback;
class IDeckLinkMemoryAllocator;
class IDeckLinkAudioOutputCallback;
class IDeckLinkIterator;
class IDeckLinkAPIInformation;
class IDeckLinkOutput;
class IDeckLinkInput;
+class IDeckLinkEncoderInput;
class IDeckLinkVideoFrame;
class IDeckLinkMutableVideoFrame;
class IDeckLinkVideoFrame3DExtensions;
+class IDeckLinkVideoFrameMetadataExtensions;
class IDeckLinkVideoInputFrame;
class IDeckLinkVideoFrameAncillary;
+class IDeckLinkEncoderPacket;
+class IDeckLinkEncoderVideoPacket;
+class IDeckLinkEncoderAudioPacket;
+class IDeckLinkH265NALPacket;
class IDeckLinkAudioInputPacket;
class IDeckLinkScreenPreviewCallback;
class IDeckLinkCocoaScreenPreviewCallback;
@@ -390,6 +551,7 @@
class IDeckLinkNotificationCallback;
class IDeckLinkNotification;
class IDeckLinkAttributes;
+class IDeckLinkStatus;
class IDeckLinkKeyer;
class IDeckLinkVideoConversion;
class IDeckLinkDeviceNotificationCallback;
@@ -419,6 +581,19 @@
virtual ~IDeckLinkInputCallback () {} // call Release method to drop reference count
};
+/* Interface IDeckLinkEncoderInputCallback - Frame arrival callback. */
+
+class IDeckLinkEncoderInputCallback : public IUnknown
+{
+public:
+ virtual HRESULT VideoInputSignalChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0;
+ virtual HRESULT VideoPacketArrived (/* in */ IDeckLinkEncoderVideoPacket* videoPacket) = 0;
+ virtual HRESULT AudioPacketArrived (/* in */ IDeckLinkEncoderAudioPacket* audioPacket) = 0;
+
+protected:
+ virtual ~IDeckLinkEncoderInputCallback () {} // call Release method to drop reference count
+};
+
/* Interface IDeckLinkMemoryAllocator - Memory allocator for video frames. */
class IDeckLinkMemoryAllocator : public IUnknown
@@ -557,6 +732,43 @@
virtual ~IDeckLinkInput () {} // call Release method to drop reference count
};
+/* Interface IDeckLinkEncoderInput - Created by QueryInterface from IDeckLink. */
+
+class IDeckLinkEncoderInput : public IUnknown
+{
+public:
+ virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags, /* out */ BMDDisplayModeSupport *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0;
+ virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator **iterator) = 0;
+
+ /* Video Input */
+
+ virtual HRESULT EnableVideoInput (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags) = 0;
+ virtual HRESULT DisableVideoInput (void) = 0;
+ virtual HRESULT GetAvailablePacketsCount (/* out */ uint32_t *availablePacketsCount) = 0;
+ virtual HRESULT SetMemoryAllocator (/* in */ IDeckLinkMemoryAllocator *theAllocator) = 0;
+
+ /* Audio Input */
+
+ virtual HRESULT EnableAudioInput (/* in */ BMDAudioFormat audioFormat, /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount) = 0;
+ virtual HRESULT DisableAudioInput (void) = 0;
+ virtual HRESULT GetAvailableAudioSampleFrameCount (/* out */ uint32_t *availableSampleFrameCount) = 0;
+
+ /* Input Control */
+
+ virtual HRESULT StartStreams (void) = 0;
+ virtual HRESULT StopStreams (void) = 0;
+ virtual HRESULT PauseStreams (void) = 0;
+ virtual HRESULT FlushStreams (void) = 0;
+ virtual HRESULT SetCallback (/* in */ IDeckLinkEncoderInputCallback *theCallback) = 0;
+
+ /* Hardware Timing */
+
+ virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0;
+
+protected:
+ virtual ~IDeckLinkEncoderInput () {} // call Release method to drop reference count
+};
+
/* Interface IDeckLinkVideoFrame - Interface to encapsulate a video frame; can be caller-implemented. */
class IDeckLinkVideoFrame : public IUnknown
@@ -604,6 +816,20 @@
virtual ~IDeckLinkVideoFrame3DExtensions () {} // call Release method to drop reference count
};
+/* Interface IDeckLinkVideoFrameMetadataExtensions - Optional interface implemented on IDeckLinkVideoFrame to support frame metadata such as HDMI HDR information */
+
+class IDeckLinkVideoFrameMetadataExtensions : public IUnknown
+{
+public:
+ virtual HRESULT GetInt (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ int64_t *value) = 0;
+ virtual HRESULT GetFloat (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ double *value) = 0;
+ virtual HRESULT GetFlag (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ bool* value) = 0;
+ virtual HRESULT GetString (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ CFStringRef *value) = 0;
+
+protected:
+ virtual ~IDeckLinkVideoFrameMetadataExtensions () {} // call Release method to drop reference count
+};
+
/* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */
class IDeckLinkVideoInputFrame : public IDeckLinkVideoFrame
@@ -630,6 +856,58 @@
virtual ~IDeckLinkVideoFrameAncillary () {} // call Release method to drop reference count
};
+/* Interface IDeckLinkEncoderPacket - Interface to encapsulate an encoded packet. */
+
+class IDeckLinkEncoderPacket : public IUnknown
+{
+public:
+ virtual HRESULT GetBytes (/* out */ void **buffer) = 0;
+ virtual long GetSize (void) = 0;
+ virtual HRESULT GetStreamTime (/* out */ BMDTimeValue *frameTime, /* in */ BMDTimeScale timeScale) = 0;
+ virtual BMDPacketType GetPacketType (void) = 0;
+
+protected:
+ virtual ~IDeckLinkEncoderPacket () {} // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkEncoderVideoPacket - Provided by the IDeckLinkEncoderInput video packet arrival callback. */
+
+class IDeckLinkEncoderVideoPacket : public IDeckLinkEncoderPacket
+{
+public:
+ virtual BMDPixelFormat GetPixelFormat (void) = 0;
+ virtual HRESULT GetHardwareReferenceTimestamp (/* in */ BMDTimeScale timeScale, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration) = 0;
+
+ virtual HRESULT GetTimecode (/* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode **timecode) = 0;
+
+protected:
+ virtual ~IDeckLinkEncoderVideoPacket () {} // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkEncoderAudioPacket - Provided by the IDeckLinkEncoderInput audio packet arrival callback. */
+
+class IDeckLinkEncoderAudioPacket : public IDeckLinkEncoderPacket
+{
+public:
+ virtual BMDAudioFormat GetAudioFormat (void) = 0;
+
+protected:
+ virtual ~IDeckLinkEncoderAudioPacket () {} // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkH265NALPacket - Obtained through QueryInterface() on an IDeckLinkEncoderVideoPacket object */
+
+class IDeckLinkH265NALPacket : public IDeckLinkEncoderVideoPacket
+{
+public:
+ virtual HRESULT GetUnitType (/* out */ uint8_t *unitType) = 0;
+ virtual HRESULT GetBytesNoPrefix (/* out */ void **buffer) = 0;
+ virtual long GetSizeNoPrefix (void) = 0;
+
+protected:
+ virtual ~IDeckLinkH265NALPacket () {} // call Release method to drop reference count
+};
+
/* Interface IDeckLinkAudioInputPacket - Provided by the IDeckLinkInput callback. */
class IDeckLinkAudioInputPacket : public IUnknown
@@ -712,6 +990,21 @@
virtual ~IDeckLinkAttributes () {} // call Release method to drop reference count
};
+/* Interface IDeckLinkStatus - DeckLink Status interface */
+
+class IDeckLinkStatus : public IUnknown
+{
+public:
+ virtual HRESULT GetFlag (/* in */ BMDDeckLinkStatusID statusID, /* out */ bool *value) = 0;
+ virtual HRESULT GetInt (/* in */ BMDDeckLinkStatusID statusID, /* out */ int64_t *value) = 0;
+ virtual HRESULT GetFloat (/* in */ BMDDeckLinkStatusID statusID, /* out */ double *value) = 0;
+ virtual HRESULT GetString (/* in */ BMDDeckLinkStatusID statusID, /* out */ CFStringRef *value) = 0;
+ virtual HRESULT GetBytes (/* in */ BMDDeckLinkStatusID statusID, /* out */ void *buffer, /* in, out */ uint32_t *bufferSize) = 0;
+
+protected:
+ virtual ~IDeckLinkStatus () {} // call Release method to drop reference count
+};
+
/* Interface IDeckLinkKeyer - DeckLink Keyer interface */
class IDeckLinkKeyer : public IUnknown
diff --git a/sys/decklink/osx/DeckLinkAPIConfiguration.h b/sys/decklink/osx/DeckLinkAPIConfiguration.h
index 693fa38..717d17d 100644
--- a/sys/decklink/osx/DeckLinkAPIConfiguration.h
+++ b/sys/decklink/osx/DeckLinkAPIConfiguration.h
@@ -1,5 +1,5 @@
/* -LICENSE-START-
-** Copyright (c) 2014 Blackmagic Design
+** Copyright (c) 2016 Blackmagic Design
**
** Permission is hereby granted, free of charge, to any person or organization
** obtaining a copy of the software and accompanying documentation covered by
@@ -42,7 +42,8 @@
// Interface ID Declarations
-BMD_CONST REFIID IID_IDeckLinkConfiguration = /* 1E69FCF6-4203-4936-8076-2A9F4CFD50CB */ {0x1E,0x69,0xFC,0xF6,0x42,0x03,0x49,0x36,0x80,0x76,0x2A,0x9F,0x4C,0xFD,0x50,0xCB};
+BMD_CONST REFIID IID_IDeckLinkConfiguration = /* CB71734A-FE37-4E8D-8E13-802133A1C3F2 */ {0xCB,0x71,0x73,0x4A,0xFE,0x37,0x4E,0x8D,0x8E,0x13,0x80,0x21,0x33,0xA1,0xC3,0xF2};
+BMD_CONST REFIID IID_IDeckLinkEncoderConfiguration = /* 138050E5-C60A-4552-BF3F-0F358049327E */ {0x13,0x80,0x50,0xE5,0xC6,0x0A,0x45,0x52,0xBF,0x3F,0x0F,0x35,0x80,0x49,0x32,0x7E};
/* Enum BMDDeckLinkConfigurationID - DeckLink Configuration ID */
@@ -62,6 +63,7 @@
bmdDeckLinkConfigHDMI3DPackingFormat = '3dpf',
bmdDeckLinkConfigBypass = 'byps',
bmdDeckLinkConfigClockTimingAdjustment = 'ctad',
+ bmdDeckLinkConfigDuplexMode = 'dupx',
/* Audio Input/Output Flags */
@@ -72,9 +74,10 @@
bmdDeckLinkConfigFieldFlickerRemoval = 'fdfr',
bmdDeckLinkConfigHD1080p24ToHD1080i5994Conversion = 'to59',
bmdDeckLinkConfig444SDIVideoOutput = '444o',
- bmdDeckLinkConfigSingleLinkVideoOutput = 'sglo',
bmdDeckLinkConfigBlackVideoOutputDuringCapture = 'bvoc',
bmdDeckLinkConfigLowLatencyVideoOutput = 'llvo',
+ bmdDeckLinkConfigDownConversionOnAllAnalogOutput = 'caao',
+ bmdDeckLinkConfigSMPTELevelAOutput = 'smta',
/* Video Output Integers */
@@ -85,6 +88,7 @@
bmdDeckLinkConfigVideoOutputIdleOperation = 'voio',
bmdDeckLinkConfigDefaultVideoOutputMode = 'dvom',
bmdDeckLinkConfigDefaultVideoOutputModeFlags = 'dvof',
+ bmdDeckLinkConfigSDIOutputLinkConfiguration = 'solc',
/* Video Output Floats */
@@ -100,6 +104,7 @@
bmdDeckLinkConfigVideoInputScanning = 'visc', // Applicable to H264 Pro Recorder only
bmdDeckLinkConfigUseDedicatedLTCInput = 'dltc', // Use timecode from LTC input instead of SDI stream
+ bmdDeckLinkConfigSDIInput3DPayloadOverride = '3dds',
/* Video Input Integers */
@@ -122,6 +127,10 @@
bmdDeckLinkConfigVideoInputSVideoLumaGain = 'islg',
bmdDeckLinkConfigVideoInputSVideoChromaGain = 'iscg',
+ /* Audio Input Flags */
+
+ bmdDeckLinkConfigMicrophonePhantomPower = 'mphp',
+
/* Audio Input Integers */
bmdDeckLinkConfigAudioInputConnection = 'aicn',
@@ -133,6 +142,7 @@
bmdDeckLinkConfigAnalogAudioInputScaleChannel3 = 'ais3',
bmdDeckLinkConfigAnalogAudioInputScaleChannel4 = 'ais4',
bmdDeckLinkConfigDigitalAudioInputScale = 'dais',
+ bmdDeckLinkConfigMicrophoneInputGain = 'micg',
/* Audio Output Integers */
@@ -144,12 +154,55 @@
bmdDeckLinkConfigAnalogAudioOutputScaleChannel2 = 'aos2',
bmdDeckLinkConfigAnalogAudioOutputScaleChannel3 = 'aos3',
bmdDeckLinkConfigAnalogAudioOutputScaleChannel4 = 'aos4',
- bmdDeckLinkConfigDigitalAudioOutputScale = 'daos'
+ bmdDeckLinkConfigDigitalAudioOutputScale = 'daos',
+ bmdDeckLinkConfigHeadphoneVolume = 'hvol',
+
+ /* Device Information Strings */
+
+ bmdDeckLinkConfigDeviceInformationLabel = 'dila',
+ bmdDeckLinkConfigDeviceInformationSerialNumber = 'disn',
+ bmdDeckLinkConfigDeviceInformationCompany = 'dico',
+ bmdDeckLinkConfigDeviceInformationPhone = 'diph',
+ bmdDeckLinkConfigDeviceInformationEmail = 'diem',
+ bmdDeckLinkConfigDeviceInformationDate = 'dida',
+
+ /* Deck Control Integers */
+
+ bmdDeckLinkConfigDeckControlConnection = 'dcco'
+};
+
+/* Enum BMDDeckLinkEncoderConfigurationID - DeckLink Encoder Configuration ID */
+
+typedef uint32_t BMDDeckLinkEncoderConfigurationID;
+enum _BMDDeckLinkEncoderConfigurationID {
+
+ /* Video Encoder Integers */
+
+ bmdDeckLinkEncoderConfigPreferredBitDepth = 'epbr',
+ bmdDeckLinkEncoderConfigFrameCodingMode = 'efcm',
+
+ /* HEVC/H.265 Encoder Integers */
+
+ bmdDeckLinkEncoderConfigH265TargetBitrate = 'htbr',
+
+ /* DNxHR/DNxHD Compression ID */
+
+ bmdDeckLinkEncoderConfigDNxHRCompressionID = 'dcid',
+
+ /* DNxHR/DNxHD Level */
+
+ bmdDeckLinkEncoderConfigDNxHRLevel = 'dlev',
+
+ /* Encoded Sample Decriptions */
+
+ bmdDeckLinkEncoderConfigMPEG4SampleDescription = 'stsE', // Full MPEG4 sample description (aka SampleEntry of an 'stsd' atom-box). Useful for MediaFoundation, QuickTime, MKV and more
+ bmdDeckLinkEncoderConfigMPEG4CodecSpecificDesc = 'esds' // Sample description extensions only (atom stream, each with size and fourCC header). Useful for AVFoundation, VideoToolbox, MKV and more
};
// Forward Declarations
class IDeckLinkConfiguration;
+class IDeckLinkEncoderConfiguration;
/* Interface IDeckLinkConfiguration - DeckLink Configuration interface */
@@ -170,6 +223,25 @@
virtual ~IDeckLinkConfiguration () {} // call Release method to drop reference count
};
+/* Interface IDeckLinkEncoderConfiguration - DeckLink Encoder Configuration interface. Obtained from IDeckLinkEncoderInput */
+
+class IDeckLinkEncoderConfiguration : public IUnknown
+{
+public:
+ virtual HRESULT SetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ bool value) = 0;
+ virtual HRESULT GetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ bool *value) = 0;
+ virtual HRESULT SetInt (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ int64_t value) = 0;
+ virtual HRESULT GetInt (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ int64_t *value) = 0;
+ virtual HRESULT SetFloat (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ double value) = 0;
+ virtual HRESULT GetFloat (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ double *value) = 0;
+ virtual HRESULT SetString (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ CFStringRef value) = 0;
+ virtual HRESULT GetString (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ CFStringRef *value) = 0;
+ virtual HRESULT GetBytes (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ void *buffer /* optional */, /* in, out */ uint32_t *bufferSize) = 0;
+
+protected:
+ virtual ~IDeckLinkEncoderConfiguration () {} // call Release method to drop reference count
+};
+
/* Functions */
extern "C" {
diff --git a/sys/decklink/osx/DeckLinkAPIDeckControl.h b/sys/decklink/osx/DeckLinkAPIDeckControl.h
index 4075f32..0fd4e96 100644
--- a/sys/decklink/osx/DeckLinkAPIDeckControl.h
+++ b/sys/decklink/osx/DeckLinkAPIDeckControl.h
@@ -1,5 +1,5 @@
/* -LICENSE-START-
-** Copyright (c) 2014 Blackmagic Design
+** Copyright (c) 2016 Blackmagic Design
**
** Permission is hereby granted, free of charge, to any person or organization
** obtaining a copy of the software and accompanying documentation covered by
diff --git a/sys/decklink/osx/DeckLinkAPIDiscovery.h b/sys/decklink/osx/DeckLinkAPIDiscovery.h
index adbde29..ac17a1e 100644
--- a/sys/decklink/osx/DeckLinkAPIDiscovery.h
+++ b/sys/decklink/osx/DeckLinkAPIDiscovery.h
@@ -1,5 +1,5 @@
/* -LICENSE-START-
-** Copyright (c) 2014 Blackmagic Design
+** Copyright (c) 2016 Blackmagic Design
**
** Permission is hereby granted, free of charge, to any person or organization
** obtaining a copy of the software and accompanying documentation covered by
diff --git a/sys/decklink/osx/DeckLinkAPIDispatch.cpp b/sys/decklink/osx/DeckLinkAPIDispatch.cpp
index cb646de..cde0634 100644
--- a/sys/decklink/osx/DeckLinkAPIDispatch.cpp
+++ b/sys/decklink/osx/DeckLinkAPIDispatch.cpp
@@ -53,7 +53,7 @@
static CreateDeckLinkDiscoveryInstanceFunc gCreateDeckLinkDiscoveryFunc= NULL;
-void InitDeckLinkAPI (void)
+static void InitDeckLinkAPI (void)
{
CFURLRef bundleURL;
@@ -74,6 +74,7 @@
}
}
+#if 0
bool IsDeckLinkAPIPresent (void)
{
// If the DeckLink API bundle was successfully loaded, return this knowledge to the caller
@@ -82,6 +83,7 @@
return false;
}
+#endif
IDeckLinkIterator* CreateDeckLinkIteratorInstance (void)
{
diff --git a/sys/decklink/osx/DeckLinkAPIModes.h b/sys/decklink/osx/DeckLinkAPIModes.h
index 478a2fd..7bd6852 100644
--- a/sys/decklink/osx/DeckLinkAPIModes.h
+++ b/sys/decklink/osx/DeckLinkAPIModes.h
@@ -1,5 +1,5 @@
/* -LICENSE-START-
-** Copyright (c) 2014 Blackmagic Design
+** Copyright (c) 2016 Blackmagic Design
**
** Permission is hereby granted, free of charge, to any person or organization
** obtaining a copy of the software and accompanying documentation covered by
@@ -135,7 +135,12 @@
bmdFormat12BitRGB = 'R12B', // Big-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component
bmdFormat12BitRGBLE = 'R12L', // Little-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component
bmdFormat10BitRGBXLE = 'R10l', // Little-endian 10-bit RGB with SMPTE video levels (64-940)
- bmdFormat10BitRGBX = 'R10b' // Big-endian 10-bit RGB with SMPTE video levels (64-940)
+ bmdFormat10BitRGBX = 'R10b', // Big-endian 10-bit RGB with SMPTE video levels (64-940)
+ bmdFormatH265 = 'hev1', // High Efficiency Video Coding (HEVC/h.265)
+
+ /* AVID DNxHR */
+
+ bmdFormatDNxHR = 'AVdh'
};
/* Enum BMDDisplayModeFlags - Flags to describe the characteristics of an IDeckLinkDisplayMode. */
diff --git a/sys/decklink/osx/DeckLinkAPIStreaming.h b/sys/decklink/osx/DeckLinkAPIStreaming.h
index 725c187..625ae55 100644
--- a/sys/decklink/osx/DeckLinkAPIStreaming.h
+++ b/sys/decklink/osx/DeckLinkAPIStreaming.h
@@ -1,5 +1,5 @@
/* -LICENSE-START-
-** Copyright (c) 2014 Blackmagic Design
+** Copyright (c) 2016 Blackmagic Design
**
** Permission is hereby granted, free of charge, to any person or organization
** obtaining a copy of the software and accompanying documentation covered by
diff --git a/sys/decklink/osx/DeckLinkAPITypes.h b/sys/decklink/osx/DeckLinkAPITypes.h
index 396680c..65866d9 100644
--- a/sys/decklink/osx/DeckLinkAPITypes.h
+++ b/sys/decklink/osx/DeckLinkAPITypes.h
@@ -1,5 +1,5 @@
/* -LICENSE-START-
-** Copyright (c) 2014 Blackmagic Design
+** Copyright (c) 2016 Blackmagic Design
**
** Permission is hereby granted, free of charge, to any person or organization
** obtaining a copy of the software and accompanying documentation covered by
@@ -77,7 +77,17 @@
bmdAudioConnectionAESEBU = 1 << 1,
bmdAudioConnectionAnalog = 1 << 2,
bmdAudioConnectionAnalogXLR = 1 << 3,
- bmdAudioConnectionAnalogRCA = 1 << 4
+ bmdAudioConnectionAnalogRCA = 1 << 4,
+ bmdAudioConnectionMicrophone = 1 << 5,
+ bmdAudioConnectionHeadphones = 1 << 6
+};
+
+/* Enum BMDDeckControlConnection - Deck control connections */
+
+typedef uint32_t BMDDeckControlConnection;
+enum _BMDDeckControlConnection {
+ bmdDeckControlConnectionRS422Remote1 = 1 << 0,
+ bmdDeckControlConnectionRS422Remote2 = 1 << 1
};
// Forward Declarations
diff --git a/sys/decklink/osx/DeckLinkAPIVersion.h b/sys/decklink/osx/DeckLinkAPIVersion.h
index 4e41492..e19fa11 100644
--- a/sys/decklink/osx/DeckLinkAPIVersion.h
+++ b/sys/decklink/osx/DeckLinkAPIVersion.h
@@ -30,8 +30,8 @@
#ifndef __DeckLink_API_Version_h__
#define __DeckLink_API_Version_h__
-#define BLACKMAGIC_DECKLINK_API_VERSION 0x0a030100
-#define BLACKMAGIC_DECKLINK_API_VERSION_STRING "10.3.1"
+#define BLACKMAGIC_DECKLINK_API_VERSION 0x0a080000
+#define BLACKMAGIC_DECKLINK_API_VERSION_STRING "10.8"
#endif // __DeckLink_API_Version_h__
diff --git a/sys/directsound/Makefile.in b/sys/directsound/Makefile.in
index 38f85a0..9257db8 100644
--- a/sys/directsound/Makefile.in
+++ b/sys/directsound/Makefile.in
@@ -306,6 +306,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -327,6 +329,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -376,6 +380,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -521,6 +527,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -647,8 +655,6 @@
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@
@@ -691,8 +697,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/directsound/gstdirectsoundsrc.c b/sys/directsound/gstdirectsoundsrc.c
index 8f31f22..8687e86 100644
--- a/sys/directsound/gstdirectsoundsrc.c
+++ b/sys/directsound/gstdirectsoundsrc.c
@@ -213,8 +213,8 @@
"Capture from a soundcard via DirectSound",
"Joni Valtanen <joni.valtanen@movial.fi>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&directsound_src_src_factory));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &directsound_src_src_factory);
g_object_class_install_property
(gobject_class, PROP_DEVICE_NAME,
diff --git a/sys/dshowdecwrapper/Makefile.in b/sys/dshowdecwrapper/Makefile.in
index 3693411..8b8bd6e 100644
--- a/sys/dshowdecwrapper/Makefile.in
+++ b/sys/dshowdecwrapper/Makefile.in
@@ -308,6 +308,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -329,6 +331,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -378,6 +382,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -523,6 +529,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -649,8 +657,6 @@
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@
@@ -693,8 +699,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/dshowsrcwrapper/Makefile.in b/sys/dshowsrcwrapper/Makefile.in
index 027dde7..aab2d38 100644
--- a/sys/dshowsrcwrapper/Makefile.in
+++ b/sys/dshowsrcwrapper/Makefile.in
@@ -219,6 +219,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -240,6 +242,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -289,6 +293,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -434,6 +440,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -560,8 +568,6 @@
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@
@@ -604,8 +610,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/dshowsrcwrapper/gstdshow.cpp b/sys/dshowsrcwrapper/gstdshow.cpp
index 705adc9..421e49c 100644
--- a/sys/dshowsrcwrapper/gstdshow.cpp
+++ b/sys/dshowsrcwrapper/gstdshow.cpp
@@ -406,6 +406,18 @@
if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_UYVY, FORMAT_VideoInfo))
return GST_VIDEO_FORMAT_UYVY;
+ if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_RGB32, FORMAT_VideoInfo))
+ return GST_VIDEO_FORMAT_BGRx;
+
+ if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_RGB565, FORMAT_VideoInfo))
+ return GST_VIDEO_FORMAT_BGR16;
+
+ if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_RGB555, FORMAT_VideoInfo))
+ return GST_VIDEO_FORMAT_BGR15;
+
+ if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_RGB8, FORMAT_VideoInfo))
+ return GST_VIDEO_FORMAT_GRAY8;
+
return GST_VIDEO_FORMAT_UNKNOWN;
}
@@ -449,6 +461,18 @@
case GST_VIDEO_FORMAT_UYVY:
video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("UYVY"));
break;
+ case GST_VIDEO_FORMAT_BGRx:
+ video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("BGRx"));
+ break;
+ case GST_VIDEO_FORMAT_BGR16:
+ video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("BGR16"));
+ break;
+ case GST_VIDEO_FORMAT_BGR15:
+ video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("BGR15"));
+ break;
+ case GST_VIDEO_FORMAT_GRAY8:
+ video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("GRAY8"));
+ break;
default:
break;
}
diff --git a/sys/dshowsrcwrapper/gstdshowaudiosrc.cpp b/sys/dshowsrcwrapper/gstdshowaudiosrc.cpp
index c4d33e5..d78f139 100644
--- a/sys/dshowsrcwrapper/gstdshowaudiosrc.cpp
+++ b/sys/dshowsrcwrapper/gstdshowaudiosrc.cpp
@@ -122,8 +122,7 @@
"Human-readable name of the sound device", NULL,
static_cast < GParamFlags > (G_PARAM_READWRITE)));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_template);
gst_element_class_set_static_metadata (gstelement_class,
"Directshow audio capture source", "Source/Audio",
diff --git a/sys/dshowsrcwrapper/gstdshowfakesink.cpp b/sys/dshowsrcwrapper/gstdshowfakesink.cpp
index c524c7c..3c5fca8 100644
--- a/sys/dshowsrcwrapper/gstdshowfakesink.cpp
+++ b/sys/dshowsrcwrapper/gstdshowfakesink.cpp
@@ -46,12 +46,19 @@
HRESULT CDshowFakeSink::CheckMediaType (const CMediaType * pmt)
{
- if (pmt != NULL) {
- if (*pmt == m_MediaType)
- return S_OK;
- }
+ if (!IsEqualGUID(pmt->majortype, m_MediaType.majortype) ||
+ !IsEqualGUID(pmt->subtype, m_MediaType.subtype) ||
+ !IsEqualGUID(pmt->formattype, m_MediaType.formattype) ||
+ (pmt->cbFormat != m_MediaType.cbFormat))
+ return S_FALSE;
- return S_FALSE;
+ VIDEOINFOHEADER *info1 = (VIDEOINFOHEADER*)pmt->pbFormat;
+ VIDEOINFOHEADER *info2 = (VIDEOINFOHEADER*)m_MediaType.pbFormat;
+
+ if (memcmp(&info1->bmiHeader, &info2->bmiHeader, sizeof(BITMAPINFOHEADER)))
+ return S_FALSE;
+
+ return S_OK;
}
HRESULT CDshowFakeSink::DoRenderSample (IMediaSample * pMediaSample)
diff --git a/sys/dshowsrcwrapper/gstdshowvideosrc.cpp b/sys/dshowsrcwrapper/gstdshowvideosrc.cpp
index 7725fcb..9b478db 100644
--- a/sys/dshowsrcwrapper/gstdshowvideosrc.cpp
+++ b/sys/dshowsrcwrapper/gstdshowvideosrc.cpp
@@ -144,8 +144,7 @@
"Human-readable name of the sound device", NULL,
static_cast < GParamFlags > (G_PARAM_READWRITE)));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_template);
gst_element_class_set_static_metadata (gstelement_class,
"DirectShow video capture source", "Source/Video",
@@ -683,6 +682,12 @@
src->filter_graph->Disconnect (input_pin);
}
+ hres = src->pVSC->SetFormat(pin_mediatype->mediatype);
+ if (FAILED (hres)) {
+ GST_ERROR ("Failed to set capture pin format (error=0x%x)", hres);
+ goto error;
+ }
+
hres = src->filter_graph->ConnectDirect (pin_mediatype->capture_pin,
input_pin, pin_mediatype->mediatype);
input_pin->Release ();
diff --git a/sys/dshowvideosink/Makefile.in b/sys/dshowvideosink/Makefile.in
index f38fed8..b76897f 100644
--- a/sys/dshowvideosink/Makefile.in
+++ b/sys/dshowvideosink/Makefile.in
@@ -219,6 +219,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -240,6 +242,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -289,6 +293,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -434,6 +440,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -560,8 +568,6 @@
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@
@@ -604,8 +610,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/dshowvideosink/dshowvideosink.cpp b/sys/dshowvideosink/dshowvideosink.cpp
index c3d4bc3..cc9d332 100644
--- a/sys/dshowvideosink/dshowvideosink.cpp
+++ b/sys/dshowvideosink/dshowvideosink.cpp
@@ -206,8 +206,7 @@
"Pioneers of the Inevitable <songbird@songbirdnest.com>, " \
"FLUENDO S.A. <support@fluendo.com>");
- gst_element_class_add_pad_template (e_class,
- gst_static_pad_template_get (&sink_template));
+ gst_element_class_add_static_pad_template (e_class, &sink_template);
e_class->change_state = GST_DEBUG_FUNCPTR (gst_dshowvideosink_change_state);
diff --git a/sys/dvb/Makefile.in b/sys/dvb/Makefile.in
index e7e76b6..3adcbbc 100644
--- a/sys/dvb/Makefile.in
+++ b/sys/dvb/Makefile.in
@@ -312,6 +312,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -333,6 +335,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -382,6 +386,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -527,6 +533,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -653,8 +661,6 @@
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@
@@ -697,8 +703,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/dvb/dvbbasebin.c b/sys/dvb/dvbbasebin.c
index a293617..c05f65e 100644
--- a/sys/dvb/dvbbasebin.c
+++ b/sys/dvb/dvbbasebin.c
@@ -335,10 +335,8 @@
element_class->request_new_pad = dvb_base_bin_request_new_pad;
element_class->release_pad = dvb_base_bin_release_pad;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&program_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (element_class, &program_template);
+ gst_element_class_add_static_pad_template (element_class, &src_template);
gst_element_class_set_static_metadata (element_class, "DVB bin",
"Source/Bin/Video",
@@ -539,7 +537,7 @@
dvbbasebin->task =
gst_task_new ((GstTaskFunction) dvb_base_bin_task, dvbbasebin, NULL);
gst_task_set_lock (dvbbasebin->task, &dvbbasebin->lock);
- dvbbasebin->poll = gst_poll_new_timer ();
+ dvbbasebin->poll = gst_poll_new (TRUE);
}
static void
@@ -1175,14 +1173,13 @@
if (location == NULL)
goto no_location;
+ /* FIXME: here is where we parse channels.conf */
if (!set_properties_for_channel (GST_ELEMENT (dvbbasebin), location, &err))
goto set_properties_failed;
- /* FIXME: here is where we parse channels.conf */
-
g_free (location);
return TRUE;
-/* ERRORS */
+
post_error_and_exit:
{
gst_element_message_full (GST_ELEMENT (dvbbasebin), GST_MESSAGE_ERROR,
@@ -1200,6 +1197,9 @@
set_properties_failed:
{
g_free (location);
+ if (!err)
+ g_set_error (&err, GST_URI_ERROR, GST_URI_ERROR_BAD_REFERENCE,
+ "Could not find information for channel");
goto post_error_and_exit;
}
}
diff --git a/sys/dvb/gstdvbsrc.c b/sys/dvb/gstdvbsrc.c
index b93255f..3376a05 100644
--- a/sys/dvb/gstdvbsrc.c
+++ b/sys/dvb/gstdvbsrc.c
@@ -23,7 +23,7 @@
* SECTION:element-dvbsrc
*
* dvbsrc can be used to capture media from DVB cards. Supported DTV
- * broadcasting standards include DVB-T/C/S, ATSC ,ISDB-T and DTMB.
+ * broadcasting standards include DVB-T/C/S, ATSC, ISDB-T and DTMB.
*
* <refsect2>
* <title>Example launch line</title>
@@ -37,8 +37,11 @@
* 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-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
+ * 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.
+ * |[
+ * gst-launch-1.0 dvbsrc frequency=503000000 delsys="atsc" modulation="8vsb" pids=48:49:52 ! decodebin name=dec dec. ! videoconvert ! autovideosink dec. ! audioconvert ! autoaudiosink
+ * ]| Captures and renders KOFY-HD in San Jose, California. This is an ATSC broadcast, PMT ID 48, Audio/Video elementary stream PIDs 49 and 52 respectively.
* </refsect2>
*/
@@ -551,11 +554,14 @@
static gboolean gst_dvbsrc_tune (GstDvbSrc * object);
static gboolean gst_dvbsrc_set_fe_params (GstDvbSrc * object,
struct dtv_properties *props);
+static void gst_dvbsrc_guess_delsys (GstDvbSrc * object);
static gboolean gst_dvbsrc_tune_fe (GstDvbSrc * object);
static void gst_dvbsrc_set_pes_filters (GstDvbSrc * object);
static void gst_dvbsrc_unset_pes_filters (GstDvbSrc * object);
static gboolean gst_dvbsrc_is_valid_modulation (guint delsys, guint mod);
+static gboolean gst_dvbsrc_is_valid_trans_mode (guint delsys, guint mode);
+static gboolean gst_dvbsrc_is_valid_bandwidth (guint delsys, guint bw);
/**
* This loop should be safe enough considering:
@@ -614,8 +620,7 @@
gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_dvbsrc_change_state);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&ts_src_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &ts_src_factory);
gst_element_class_set_static_metadata (gstelement_class, "DVB Source",
"Source/Video",
@@ -660,7 +665,9 @@
g_object_class_install_property (gobject_class, ARG_DVBSRC_PIDS,
g_param_spec_string ("pids", "pids",
- "Colon seperated list of pids (eg. 110:120)",
+ "Colon-separated list of PIDs (eg. 110:120) to capture. ACT and CAT "
+ "are automatically included but PMT should be added explicitly. "
+ "Special value 8192 gets full MPEG-TS",
DEFAULT_PIDS, GST_PARAM_MUTABLE_PLAYING | G_PARAM_WRITABLE));
g_object_class_install_property (gobject_class, ARG_DVBSRC_SYM_RATE,
@@ -681,11 +688,9 @@
"DiSEqC switch. Otherwise leave at -1 (disabled)", -1, 7,
DEFAULT_DISEQC_SRC, GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
- /* DVB-T, additional properties */
-
g_object_class_install_property (gobject_class, ARG_DVBSRC_BANDWIDTH_HZ,
g_param_spec_uint ("bandwidth-hz", "bandwidth-hz",
- "(DVB-T) Bandwidth in Hz", 0, G_MAXUINT, DEFAULT_BANDWIDTH_HZ,
+ "Channel bandwidth in Hz", 0, G_MAXUINT, DEFAULT_BANDWIDTH_HZ,
GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
#ifndef GST_REMOVE_DEPRECATED
@@ -797,7 +802,7 @@
g_object_class_install_property (gobject_class,
ARG_DVBSRC_ISDBT_LAYER_ENABLED,
g_param_spec_uint ("isdbt-layer-enabled",
- "ISB-T layer enabled",
+ "ISDB-T layer enabled",
"(ISDB-T) Layer Enabled (7 = All layers)", 1, 7,
DEFAULT_ISDBT_LAYER_ENABLED,
GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
@@ -805,7 +810,7 @@
g_object_class_install_property (gobject_class,
ARG_DVBSRC_ISDBT_PARTIAL_RECEPTION,
g_param_spec_int ("isdbt-partial-reception",
- "ISB-T partial reception",
+ "ISDB-T partial reception",
"(ISDB-T) Partial Reception (-1 = AUTO)", -1, 1,
DEFAULT_ISDBT_PARTIAL_RECEPTION,
GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
@@ -813,7 +818,7 @@
g_object_class_install_property (gobject_class,
ARG_DVBSRC_ISDBT_SOUND_BROADCASTING,
g_param_spec_int ("isdbt-sound-broadcasting",
- "ISB-T sound broadcasting",
+ "ISDB-T sound broadcasting",
"(ISDB-T) Sound Broadcasting", 0, 1,
DEFAULT_ISDBT_SOUND_BROADCASTING,
GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
@@ -821,7 +826,7 @@
g_object_class_install_property (gobject_class,
ARG_DVBSRC_ISDBT_SB_SUBCHANNEL_ID,
g_param_spec_int ("isdbt-sb-subchannel-id",
- "ISB-T SB subchannel ID",
+ "ISDB-T SB subchannel ID",
"(ISDB-T) SB Subchannel ID (-1 = AUTO)", -1, 41,
DEFAULT_ISDBT_SB_SEGMENT_IDX,
GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
@@ -829,7 +834,7 @@
g_object_class_install_property (gobject_class,
ARG_DVBSRC_ISDBT_SB_SEGMENT_IDX,
g_param_spec_int ("isdbt-sb-segment-idx",
- "ISB-T SB segment IDX",
+ "ISDB-T SB segment IDX",
"(ISDB-T) SB segment IDX", 0, 12,
DEFAULT_ISDBT_SB_SEGMENT_IDX,
GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
@@ -837,7 +842,7 @@
g_object_class_install_property (gobject_class,
ARG_DVBSRC_ISDBT_SB_SEGMENT_COUNT,
g_param_spec_uint ("isdbt-sb-segment-count",
- "ISB-T SB segment count",
+ "ISDB-T SB segment count",
"(ISDB-T) SB segment count", 1, 13,
DEFAULT_ISDBT_SB_SEGMENT_COUNT,
GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
@@ -884,7 +889,7 @@
g_object_class_install_property (gobject_class,
ARG_DVBSRC_ISDBT_LAYERA_SEGMENT_COUNT,
g_param_spec_int ("isdbt-layera-segment-count",
- "ISB-T layer A segment count",
+ "ISDB-T layer A segment count",
"(ISDB-T) Layer A segment count (-1 = AUTO)", -1, 13,
DEFAULT_ISDBT_LAYERA_SEGMENT_COUNT,
GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
@@ -892,7 +897,7 @@
g_object_class_install_property (gobject_class,
ARG_DVBSRC_ISDBT_LAYERB_SEGMENT_COUNT,
g_param_spec_int ("isdbt-layerb-segment-count",
- "ISB-T layer B segment count",
+ "ISDB-T layer B segment count",
"(ISDB-T) Layer B segment count (-1 = AUTO)", -1, 13,
DEFAULT_ISDBT_LAYERB_SEGMENT_COUNT,
GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
@@ -900,7 +905,7 @@
g_object_class_install_property (gobject_class,
ARG_DVBSRC_ISDBT_LAYERC_SEGMENT_COUNT,
g_param_spec_int ("isdbt-layerc-segment-count",
- "ISB-T layer C segment count",
+ "ISDB-T layer C segment count",
"(ISDB-T) Layer C segment count (-1 = AUTO)", -1, 13,
DEFAULT_ISDBT_LAYERC_SEGMENT_COUNT,
GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
@@ -908,7 +913,7 @@
g_object_class_install_property (gobject_class,
ARG_DVBSRC_ISDBT_LAYERA_TIME_INTERLEAVING,
g_param_spec_int ("isdbt-layera-time-interleaving",
- "ISB-T layer A time interleaving ",
+ "ISDB-T layer A time interleaving",
"(ISDB-T) Layer A time interleaving (-1 = AUTO)", -1, 8,
DEFAULT_ISDBT_LAYERA_TIME_INTERLEAVING,
GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
@@ -916,7 +921,7 @@
g_object_class_install_property (gobject_class,
ARG_DVBSRC_ISDBT_LAYERB_TIME_INTERLEAVING,
g_param_spec_int ("isdbt-layerb-time-interleaving",
- "ISB-T layer B time interleaving ",
+ "ISDB-T layer B time interleaving",
"(ISDB-T) Layer B time interleaving (-1 = AUTO)", -1, 8,
DEFAULT_ISDBT_LAYERB_TIME_INTERLEAVING,
GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
@@ -924,7 +929,7 @@
g_object_class_install_property (gobject_class,
ARG_DVBSRC_ISDBT_LAYERC_TIME_INTERLEAVING,
g_param_spec_int ("isdbt-layerc-time-interleaving",
- "ISB-T layer C time interleaving ",
+ "ISDB-T layer C time interleaving",
"(ISDB-T) Layer C time interleaving (-1 = AUTO)", -1, 8,
DEFAULT_ISDBT_LAYERC_TIME_INTERLEAVING,
GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
@@ -1013,7 +1018,6 @@
{
int i = 0;
- GST_INFO_OBJECT (object, "gst_dvbsrc_init");
GST_DEBUG_OBJECT (object, "Kernel DVB API version %d.%d", DVB_API_VERSION,
DVB_API_VERSION_MINOR);
@@ -1025,13 +1029,15 @@
object->fd_frontend = -1;
object->fd_dvr = -1;
+ object->supported_delsys = NULL;
for (i = 0; i < MAX_FILTERS; i++) {
- object->pids[i] = G_MAXUINT16;
object->fd_filters[i] = -1;
}
+
/* PID 8192 on DVB gets the whole transport stream */
object->pids[0] = 8192;
+ object->pids[1] = G_MAXUINT16;
object->dvb_buffer_size = DEFAULT_DVB_BUFFER_SIZE;
object->adapter_number = DEFAULT_ADAPTER;
object->frontend_number = DEFAULT_FRONTEND;
@@ -1090,48 +1096,46 @@
static void
gst_dvbsrc_set_pids (GstDvbSrc * dvbsrc, const gchar * pid_string)
{
+ int pid = 0;
+ int pid_count;
+ gchar **pids;
+ char **tmp;
+
if (!strcmp (pid_string, "8192")) {
- /* get the whole ts */
- int pid_count = 1;
+ /* get the whole TS */
dvbsrc->pids[0] = 8192;
- while (pid_count < MAX_FILTERS) {
- dvbsrc->pids[pid_count++] = G_MAXUINT16;
- }
- } else {
- int pid = 0;
- int pid_count;
- gchar **pids;
- char **tmp;
-
- tmp = pids = g_strsplit (pid_string, ":", MAX_FILTERS);
-
- /* always add the PAT and CAT pids */
- dvbsrc->pids[0] = 0;
- dvbsrc->pids[1] = 1;
-
- pid_count = 2;
- while (*pids != NULL && pid_count < MAX_FILTERS) {
- pid = strtol (*pids, NULL, 0);
- if (pid > 1 && pid <= 8192) {
- GST_INFO_OBJECT (dvbsrc, "\tParsed Pid: %d", pid);
- dvbsrc->pids[pid_count] = pid;
- pid_count++;
- }
- pids++;
- }
- while (pid_count < MAX_FILTERS) {
- dvbsrc->pids[pid_count++] = G_MAXUINT16;
- }
-
- g_strfreev (tmp);
+ dvbsrc->pids[1] = G_MAXUINT16;
+ goto done;
}
- /* if we are in playing or paused, then set filters now */
- GST_INFO_OBJECT (dvbsrc, "checking if playing for setting pes filters");
- if (GST_ELEMENT (dvbsrc)->current_state == GST_STATE_PLAYING ||
- GST_ELEMENT (dvbsrc)->current_state == GST_STATE_PAUSED) {
- GST_INFO_OBJECT (dvbsrc, "Setting pes filters now");
+
+ /* always add the PAT and CAT pids */
+ dvbsrc->pids[0] = 0;
+ dvbsrc->pids[1] = 1;
+ pid_count = 2;
+
+ tmp = pids = g_strsplit (pid_string, ":", MAX_FILTERS);
+
+ while (*pids != NULL && pid_count < MAX_FILTERS) {
+ pid = strtol (*pids, NULL, 0);
+ if (pid > 1 && pid <= 8192) {
+ GST_INFO_OBJECT (dvbsrc, "Parsed PID: %d", pid);
+ dvbsrc->pids[pid_count] = pid;
+ pid_count++;
+ }
+ pids++;
+ }
+
+ g_strfreev (tmp);
+
+ if (pid_count < MAX_FILTERS)
+ dvbsrc->pids[pid_count] = G_MAXUINT16;
+
+done:
+ if (GST_ELEMENT (dvbsrc)->current_state > GST_STATE_READY) {
+ GST_INFO_OBJECT (dvbsrc, "Setting PES filters now");
gst_dvbsrc_set_pes_filters (dvbsrc);
- }
+ } else
+ GST_INFO_OBJECT (dvbsrc, "Not setting PES filters because state < PAUSED");
}
static void
@@ -1169,9 +1173,8 @@
s = g_value_get_string (value);
if (s != NULL) {
object->pol = (s[0] == 'h' || s[0] == 'H') ? DVB_POL_H : DVB_POL_V;
- GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_POLARITY");
- GST_INFO_OBJECT (object, "\t%s", (s[0] == 'h'
- || s[0] == 'H') ? "DVB_POL_H" : "DVB_POL_V");
+ GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_POLARITY to %s",
+ object->pol ? "Vertical" : "Horizontal");
}
break;
}
@@ -1574,6 +1577,11 @@
return FALSE;
}
+ if (object->supported_delsys)
+ goto delsys_detection_done;
+
+ /* Perform delivery system autodetection */
+
GST_DEBUG_OBJECT (object, "Device opened, querying information");
LOOP_WHILE_EINTR (err, ioctl (object->fd_frontend, FE_GET_INFO, &fe_info));
@@ -1587,7 +1595,7 @@
return FALSE;
}
- GST_DEBUG_OBJECT (object, "check delivery systems");
+ GST_DEBUG_OBJECT (object, "Get list of supported delivery systems");
dvb_prop[0].cmd = DTV_ENUM_DELSYS;
props.num = 1;
@@ -1604,7 +1612,7 @@
return FALSE;
}
- GST_DEBUG_OBJECT (object, "Got information about adapter : %s", fe_info.name);
+ GST_INFO_OBJECT (object, "Got information about adapter: %s", fe_info.name);
adapter_name = g_strdup (fe_info.name);
@@ -1621,117 +1629,136 @@
/* Capability delivery systems */
if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DVBC_ANNEX_A)) {
+ object->supported_delsys = g_list_append (object->supported_delsys,
+ GINT_TO_POINTER (SYS_DVBC_ANNEX_A));
gst_structure_set (adapter_structure, "dvb-c-a", G_TYPE_STRING,
"DVB-C ANNEX A", NULL);
- object->best_guess_delsys = SYS_DVBC_ANNEX_A;
}
if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DVBC_ANNEX_B)) {
+ object->supported_delsys = g_list_append (object->supported_delsys,
+ GINT_TO_POINTER (SYS_DVBC_ANNEX_B));
gst_structure_set (adapter_structure, "dvb-c-b", G_TYPE_STRING,
"DVB-C ANNEX C", NULL);
- object->best_guess_delsys = SYS_DVBC_ANNEX_B;
}
if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DVBT)) {
+ object->supported_delsys = g_list_append (object->supported_delsys,
+ GINT_TO_POINTER (SYS_DVBT));
gst_structure_set (adapter_structure, "dvb-t", G_TYPE_STRING, "DVB-T",
NULL);
- object->best_guess_delsys = SYS_DVBT;
}
if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DSS)) {
+ object->supported_delsys = g_list_append (object->supported_delsys,
+ GINT_TO_POINTER (SYS_DSS));
gst_structure_set (adapter_structure, "dss", G_TYPE_STRING, "DSS", NULL);
- object->best_guess_delsys = SYS_DSS;
}
if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DVBS)) {
+ object->supported_delsys = g_list_append (object->supported_delsys,
+ GINT_TO_POINTER (SYS_DVBS));
gst_structure_set (adapter_structure, "dvb-s", G_TYPE_STRING, "DVB-S",
NULL);
- object->best_guess_delsys = SYS_DVBS;
}
if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DVBS2)) {
+ object->supported_delsys = g_list_append (object->supported_delsys,
+ GINT_TO_POINTER (SYS_DVBS2));
gst_structure_set (adapter_structure, "dvb-s2", G_TYPE_STRING, "DVB-S2",
NULL);
- object->best_guess_delsys = SYS_DVBS2;
}
if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DVBH)) {
+ object->supported_delsys = g_list_append (object->supported_delsys,
+ GINT_TO_POINTER (SYS_DVBH));
gst_structure_set (adapter_structure, "dvb-h", G_TYPE_STRING, "DVB-H",
NULL);
- object->best_guess_delsys = SYS_DVBH;
}
if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_ISDBT)) {
+ object->supported_delsys = g_list_append (object->supported_delsys,
+ GINT_TO_POINTER (SYS_ISDBT));
gst_structure_set (adapter_structure, "isdb-t", G_TYPE_STRING, "ISDB-T",
NULL);
- object->best_guess_delsys = SYS_ISDBT;
}
if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_ISDBS)) {
+ object->supported_delsys = g_list_append (object->supported_delsys,
+ GINT_TO_POINTER (SYS_ISDBS));
gst_structure_set (adapter_structure, "isdb-s", G_TYPE_STRING, "ISDB-S",
NULL);
- object->best_guess_delsys = SYS_ISDBS;
}
if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_ISDBC)) {
+ object->supported_delsys = g_list_append (object->supported_delsys,
+ GINT_TO_POINTER (SYS_ISDBC));
gst_structure_set (adapter_structure, "isdb-c", G_TYPE_STRING, "ISDB-C",
NULL);
- object->best_guess_delsys = SYS_ISDBC;
}
if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_ATSC)) {
+ object->supported_delsys = g_list_append (object->supported_delsys,
+ GINT_TO_POINTER (SYS_ATSC));
gst_structure_set (adapter_structure, "atsc", G_TYPE_STRING, "ATSC", NULL);
- object->best_guess_delsys = SYS_ATSC;
}
if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_ATSCMH)) {
+ object->supported_delsys = g_list_append (object->supported_delsys,
+ GINT_TO_POINTER (SYS_ATSCMH));
gst_structure_set (adapter_structure, "atsc-mh", G_TYPE_STRING, "ATSC-MH",
NULL);
- object->best_guess_delsys = SYS_ATSCMH;
}
#if HAVE_V5_MINOR(7)
if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DTMB)) {
+ object->supported_delsys = g_list_append (object->supported_delsys,
+ GINT_TO_POINTER (SYS_DTMB));
gst_structure_set (adapter_structure, "dtmb", G_TYPE_STRING, "DTMB", NULL);
- object->best_guess_delsys = SYS_DTMB;
}
#endif
if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_CMMB)) {
+ object->supported_delsys = g_list_append (object->supported_delsys,
+ GINT_TO_POINTER (SYS_CMMB));
gst_structure_set (adapter_structure, "cmmb", G_TYPE_STRING, "CMMB", NULL);
- object->best_guess_delsys = SYS_CMMB;
}
if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DAB)) {
+ object->supported_delsys = g_list_append (object->supported_delsys,
+ GINT_TO_POINTER (SYS_DAB));
gst_structure_set (adapter_structure, "dab", G_TYPE_STRING, "DAB", NULL);
- object->best_guess_delsys = SYS_DAB;
}
if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DVBT2)) {
+ object->supported_delsys = g_list_append (object->supported_delsys,
+ GINT_TO_POINTER (SYS_DVBT2));
gst_structure_set (adapter_structure, "dvb-t2", G_TYPE_STRING, "DVB-T2",
NULL);
- object->best_guess_delsys = SYS_DVBT2;
}
if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_TURBO)) {
+ object->supported_delsys = g_list_append (object->supported_delsys,
+ GINT_TO_POINTER (SYS_TURBO));
gst_structure_set (adapter_structure, "turbo", G_TYPE_STRING, "TURBO",
NULL);
- object->best_guess_delsys = SYS_TURBO;
}
if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DVBC_ANNEX_C)) {
+ object->supported_delsys = g_list_append (object->supported_delsys,
+ GINT_TO_POINTER (SYS_DVBC_ANNEX_C));
gst_structure_set (adapter_structure, "dvb-c-c", G_TYPE_STRING,
"DVB-C ANNEX C", NULL);
- object->best_guess_delsys = SYS_DVBC_ANNEX_C;
}
- GST_INFO_OBJECT (object, "DVB card: %s ", adapter_name);
GST_TRACE_OBJECT (object, "%s description: %" GST_PTR_FORMAT, adapter_name,
adapter_structure);
gst_element_post_message (GST_ELEMENT_CAST (object), gst_message_new_element
(GST_OBJECT (object), adapter_structure));
- g_free (frontend_dev);
g_free (adapter_name);
+delsys_detection_done:
+ g_free (frontend_dev);
+
return TRUE;
}
@@ -1743,7 +1770,7 @@
dvr_dev = g_strdup_printf ("/dev/dvb/adapter%d/dvr%d",
object->adapter_number, object->frontend_number);
- GST_INFO_OBJECT (object, "Using dvr device: %s", dvr_dev);
+ GST_INFO_OBJECT (object, "Using DVR device: %s", dvr_dev);
/* open DVR */
if ((object->fd_dvr = open (dvr_dev, O_RDONLY | O_NONBLOCK)) < 0) {
@@ -1763,7 +1790,7 @@
}
g_free (dvr_dev);
- GST_INFO_OBJECT (object, "Setting DVB kernel buffer size to %d ",
+ GST_INFO_OBJECT (object, "Setting DVB kernel buffer size to %d",
object->dvb_buffer_size);
LOOP_WHILE_EINTR (err, ioctl (object->fd_dvr, DMX_SET_BUFFER_SIZE,
object->dvb_buffer_size));
@@ -1931,7 +1958,10 @@
switch (transition) {
case GST_STATE_CHANGE_NULL_TO_READY:
/* open frontend then close it again, just so caps sent */
- gst_dvbsrc_open_frontend (src, FALSE);
+ if (!gst_dvbsrc_open_frontend (src, FALSE)) {
+ GST_ERROR_OBJECT (src, "Could not open frontend device");
+ ret = GST_STATE_CHANGE_FAILURE;
+ }
if (src->fd_frontend) {
close (src->fd_frontend);
}
@@ -1949,35 +1979,35 @@
{
GstDvbSrc *src = GST_DVBSRC (bsrc);
- gst_dvbsrc_open_frontend (src, TRUE);
- if (!gst_dvbsrc_tune (src)) {
- GST_ERROR_OBJECT (src, "Not able to lock on to the dvb channel");
- gst_dvbsrc_unset_pes_filters (src);
- close (src->fd_frontend);
+ if (!gst_dvbsrc_open_frontend (src, TRUE)) {
+ GST_ERROR_OBJECT (src, "Could not open frontend device");
return FALSE;
}
+ if (!gst_dvbsrc_tune (src)) {
+ GST_ERROR_OBJECT (src, "Not able to lock on to the dvb channel");
+ goto fail;
+ }
if (!gst_dvbsrc_open_dvr (src)) {
- GST_ERROR_OBJECT (src, "Not able to open dvr_device");
- /* unset filters also */
- gst_dvbsrc_unset_pes_filters (src);
- close (src->fd_frontend);
- return FALSE;
+ GST_ERROR_OBJECT (src, "Not able to open DVR device");
+ goto fail;
}
if (!(src->poll = gst_poll_new (TRUE))) {
GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE, (NULL),
- ("could not create an fdset: %s (%d)", g_strerror (errno), errno));
- /* unset filters also */
- gst_dvbsrc_unset_pes_filters (src);
- close (src->fd_frontend);
- return FALSE;
- } else {
- gst_poll_fd_init (&src->poll_fd_dvr);
- src->poll_fd_dvr.fd = src->fd_dvr;
- gst_poll_add_fd (src->poll, &src->poll_fd_dvr);
- gst_poll_fd_ctl_read (src->poll, &src->poll_fd_dvr, TRUE);
+ ("Could not create an fd set: %s (%d)", g_strerror (errno), errno));
+ goto fail;
}
+ gst_poll_fd_init (&src->poll_fd_dvr);
+ src->poll_fd_dvr.fd = src->fd_dvr;
+ gst_poll_add_fd (src->poll, &src->poll_fd_dvr);
+ gst_poll_fd_ctl_read (src->poll, &src->poll_fd_dvr, TRUE);
+
return TRUE;
+
+fail:
+ gst_dvbsrc_unset_pes_filters (src);
+ close (src->fd_frontend);
+ return FALSE;
}
static gboolean
@@ -1986,6 +2016,8 @@
GstDvbSrc *src = GST_DVBSRC (bsrc);
gst_dvbsrc_close_devices (src);
+ g_list_free (src->supported_delsys);
+ src->supported_delsys = NULL;
if (src->poll) {
gst_poll_free (src->poll);
src->poll = NULL;
@@ -2019,6 +2051,41 @@
}
static gboolean
+gst_dvbsrc_is_valid_trans_mode (guint delsys, guint mode)
+{
+ /* FIXME: check valid transmission modes for other broadcast standards */
+ switch (delsys) {
+ case SYS_DVBT:
+ if (mode == TRANSMISSION_MODE_AUTO || mode == TRANSMISSION_MODE_2K ||
+ mode == TRANSMISSION_MODE_8K) {
+ return TRUE;
+ }
+ break;
+ case SYS_DVBT2:
+ if (mode == TRANSMISSION_MODE_AUTO || mode == TRANSMISSION_MODE_1K ||
+ mode == TRANSMISSION_MODE_2K || mode == TRANSMISSION_MODE_4K ||
+ mode == TRANSMISSION_MODE_8K || mode == TRANSMISSION_MODE_16K ||
+ mode == TRANSMISSION_MODE_32K) {
+ return TRUE;
+ }
+ break;
+#if HAVE_V5_MINOR(7)
+ case SYS_DTMB:
+ if (mode == TRANSMISSION_MODE_AUTO || mode == TRANSMISSION_MODE_C1 ||
+ mode == TRANSMISSION_MODE_C3780) {
+ return TRUE;
+ }
+ break;
+#endif
+ default:
+ GST_FIXME ("No delsys/transmission-mode sanity checks implemented for "
+ "this delivery system");
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static gboolean
gst_dvbsrc_is_valid_modulation (guint delsys, guint mod)
{
/* FIXME: check valid modulations for other broadcast standards */
@@ -2028,6 +2095,18 @@
mod == QAM_64 || mod == DQPSK)
return TRUE;
break;
+ case SYS_ATSC:
+ if (mod == VSB_8 || mod == VSB_16)
+ return TRUE;
+ break;
+ case SYS_DVBT:
+ if (mod == QPSK || mod == QAM_16 || mod == QAM_64)
+ return TRUE;
+ break;
+ case SYS_DVBT2:
+ if (mod == QPSK || mod == QAM_16 || mod == QAM_64 || mod == QAM_256)
+ return TRUE;
+ break;
default:
GST_FIXME ("No delsys/modulation sanity checks implemented for this "
"delivery system");
@@ -2037,6 +2116,37 @@
}
static gboolean
+gst_dvbsrc_is_valid_bandwidth (guint delsys, guint bw)
+{
+ /* FIXME: check valid bandwidth values for other broadcast standards */
+
+ /* Bandwidth == 0 means auto, this should be valid for every delivery system
+ * for which the bandwidth parameter makes sense */
+
+ switch (delsys) {
+ case SYS_DVBT:
+ if (bw == 6000000 || bw == 7000000 || bw == 8000000 || bw == 0)
+ return TRUE;
+ break;
+ case SYS_DVBT2:
+ if (bw == 1172000 || bw == 5000000 || bw == 6000000 || bw == 0 ||
+ bw == 7000000 || bw == 8000000 || bw == 10000000) {
+ return TRUE;
+ }
+ break;
+ case SYS_ISDBT:
+ if (bw == 6000000 || bw == 0)
+ return TRUE;
+ break;
+ default:
+ GST_FIXME ("No bandwidth sanity checks implemented for this "
+ "delivery system");
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static gboolean
gst_dvbsrc_get_size (GstBaseSrc * src, guint64 * size)
{
return FALSE;
@@ -2055,7 +2165,7 @@
gst_dvbsrc_output_frontend_stats (GstDvbSrc * src)
{
fe_status_t status;
- guint16 snr, _signal;
+ guint16 snr, signal;
guint32 ber, bad_blks;
GstMessage *message;
GstStructure *structure;
@@ -2063,36 +2173,41 @@
gint err;
LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_STATUS, &status));
- if (err)
- goto error_out;
+ if (!err) {
+ structure = gst_structure_new ("dvb-frontend-stats",
+ "status", G_TYPE_INT, status,
+ "lock", G_TYPE_BOOLEAN, status & FE_HAS_LOCK, NULL);
+ } else {
+ GST_ERROR_OBJECT (src, "Error getting frontend status: '%s'",
+ g_strerror (errno));
+ return;
+ }
- LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_SIGNAL_STRENGTH, &_signal));
- if (err)
- goto error_out;
+ errno = 0;
+ LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_SIGNAL_STRENGTH, &signal));
+ if (!err)
+ gst_structure_set (structure, "signal", G_TYPE_INT, signal, NULL);
LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_SNR, &snr));
- if (err)
- goto error_out;
+ if (!err)
+ gst_structure_set (structure, "snr", G_TYPE_INT, snr, NULL);
LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_BER, &ber));
- if (err)
- goto error_out;
+ if (!err)
+ gst_structure_set (structure, "ber", G_TYPE_INT, ber, NULL);
LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_UNCORRECTED_BLOCKS, &bad_blks));
- if (err)
- goto error_out;
+ if (!err)
+ gst_structure_set (structure, "unc", G_TYPE_INT, bad_blks, NULL);
- structure = gst_structure_new ("dvb-frontend-stats", "status", G_TYPE_INT,
- status, "signal", G_TYPE_INT, _signal, "snr", G_TYPE_INT, snr,
- "ber", G_TYPE_INT, ber, "unc", G_TYPE_INT, bad_blks,
- "lock", G_TYPE_BOOLEAN, status & FE_HAS_LOCK, NULL);
+ if (errno)
+ GST_WARNING_OBJECT (src,
+ "There were errors getting frontend status information: '%s'",
+ g_strerror (errno));
+
+ GST_INFO_OBJECT (src, "Frontend stats: %" GST_PTR_FORMAT, structure);
message = gst_message_new_element (GST_OBJECT (src), structure);
gst_element_post_message (GST_ELEMENT (src), message);
- return;
-
-error_out:
- GST_WARNING_OBJECT (src, "Failed to get statistics from the device: %s",
- g_strerror (errno));
}
struct diseqc_cmd
@@ -2186,12 +2301,10 @@
static gboolean
gst_dvbsrc_tune_fe (GstDvbSrc * object)
{
- GstPoll *poll_set;
- GstPollFD fe_fd;
fe_status_t status;
struct dtv_properties props;
struct dtv_property dvb_prop[NUM_DTV_PROPS];
- GstClockTimeDiff elapsed_time, timeout_step = 500 * GST_MSECOND;
+ GstClockTimeDiff elapsed_time;
GstClockTime start;
gint err;
@@ -2202,46 +2315,27 @@
return FALSE;
}
- GST_DEBUG_OBJECT (object, "check delivery systems");
-
- dvb_prop[0].cmd = DTV_ENUM_DELSYS;
- props.num = 1;
- props.props = dvb_prop;
-
- LOOP_WHILE_EINTR (err, ioctl (object->fd_frontend, FE_GET_PROPERTY, &props));
- if (err) {
- GST_WARNING_OBJECT (object, "Error enumerating delsys: %s",
- g_strerror (errno));
-
- return FALSE;
- }
-
- /* If there's no delivery system set yet. Choose the
- * last from the list of frontend supported ones */
- if (object->delsys == SYS_UNDEFINED) {
- object->delsys = object->best_guess_delsys;
- } else if (!gst_dvbsrc_check_delsys (&dvb_prop[0], object->delsys)) {
- GST_WARNING_OBJECT (object, "Delsys fail %u", object->delsys);
- return FALSE;
+ /* If set, confirm the choosen delivery system is actually
+ * supported by the hardware */
+ if (object->delsys != SYS_UNDEFINED) {
+ GST_DEBUG_OBJECT (object, "Confirming delsys '%u' is supported",
+ object->delsys);
+ if (!g_list_find (object->supported_delsys,
+ GINT_TO_POINTER (object->delsys))) {
+ GST_WARNING_OBJECT (object, "Adapter does not support delsys '%u'",
+ object->delsys);
+ return FALSE;
+ }
}
gst_dvbsrc_unset_pes_filters (object);
g_mutex_lock (&object->tune_mutex);
- gst_poll_fd_init (&fe_fd);
- fe_fd.fd = object->fd_frontend;
- poll_set = gst_poll_new (TRUE);
-
- if (!gst_poll_add_fd (poll_set, &fe_fd)) {
- GST_WARNING_OBJECT (object, "Could not add frontend fd to poll set");
- goto fail;
- }
-
- gst_poll_fd_ctl_read (poll_set, &fe_fd, TRUE);
-
memset (dvb_prop, 0, sizeof (dvb_prop));
dvb_prop[0].cmd = DTV_CLEAR;
+ props.num = 1;
+ props.props = dvb_prop;
LOOP_WHILE_EINTR (err, ioctl (object->fd_frontend, FE_SET_PROPERTY, &props));
if (err) {
@@ -2265,21 +2359,11 @@
}
g_signal_emit (object, gst_dvbsrc_signals[SIGNAL_TUNING_START], 0);
-
- LOOP_WHILE_EINTR (err, ioctl (object->fd_frontend, FE_READ_STATUS, &status));
- if (err) {
- GST_WARNING_OBJECT (object, "Failed querying frontend for tuning status:"
- " %s (%d)", g_strerror (errno), errno);
- goto fail_with_signal;
- }
-
- /* signal locking loop */
elapsed_time = 0;
start = gst_util_get_timestamp ();
- while (!(status & FE_HAS_LOCK) && elapsed_time <= object->tuning_timeout) {
- if (gst_poll_wait (poll_set, timeout_step) == -1)
- goto fail_with_signal;
+ /* signal locking loop */
+ do {
LOOP_WHILE_EINTR (err, ioctl (object->fd_frontend, FE_READ_STATUS,
&status));
if (err) {
@@ -2292,9 +2376,9 @@
if (object->tuning_timeout)
elapsed_time = GST_CLOCK_DIFF (start, gst_util_get_timestamp ());
GST_LOG_OBJECT (object,
- "Tuning. Time elapsed %" GST_STIME_FORMAT " Limit %" G_GUINT64_FORMAT,
- GST_STIME_ARGS (elapsed_time), object->tuning_timeout);
- }
+ "Tuning. Time elapsed %" GST_STIME_FORMAT " Limit %" GST_TIME_FORMAT,
+ GST_STIME_ARGS (elapsed_time), GST_TIME_ARGS (object->tuning_timeout));
+ } while (!(status & FE_HAS_LOCK) && elapsed_time <= object->tuning_timeout);
if (!(status & FE_HAS_LOCK)) {
GST_WARNING_OBJECT (object,
@@ -2307,7 +2391,6 @@
g_signal_emit (object, gst_dvbsrc_signals[SIGNAL_TUNING_DONE], 0);
GST_DEBUG_OBJECT (object, "Successfully set frontend tuning params");
- gst_poll_free (poll_set);
g_mutex_unlock (&object->tune_mutex);
return TRUE;
@@ -2315,11 +2398,80 @@
g_signal_emit (object, gst_dvbsrc_signals[SIGNAL_TUNING_FAIL], 0);
fail:
GST_WARNING_OBJECT (object, "Could not tune to desired frequency");
- gst_poll_free (poll_set);
g_mutex_unlock (&object->tune_mutex);
return FALSE;
}
+static void
+gst_dvbsrc_guess_delsys (GstDvbSrc * object)
+{
+ GList *valid, *candidate;
+ guint alternatives;
+
+ if (g_list_length (object->supported_delsys) == 1) {
+ object->delsys = GPOINTER_TO_INT (object->supported_delsys->data);
+ GST_DEBUG_OBJECT (object, "Adapter supports a single delsys: '%u'",
+ object->delsys);
+ goto autoselection_done;
+ }
+
+ /* Automatic delivery system selection based on known-correct
+ * parameter combinations */
+
+ valid = g_list_copy (object->supported_delsys);
+
+ candidate = valid;
+ while (candidate) {
+ GList *next = candidate->next;
+ if (!gst_dvbsrc_is_valid_modulation (GPOINTER_TO_INT (candidate->data),
+ object->modulation) ||
+ !gst_dvbsrc_is_valid_trans_mode (GPOINTER_TO_INT (candidate->data),
+ object->transmission_mode) ||
+ !gst_dvbsrc_is_valid_bandwidth (GPOINTER_TO_INT (candidate->data),
+ object->bandwidth)) {
+ valid = g_list_delete_link (valid, candidate);
+ }
+ candidate = next;
+ }
+
+ alternatives = g_list_length (valid);
+
+ switch (alternatives) {
+ case 0:
+ GST_WARNING_OBJECT (object, "Delivery system autodetection provided no "
+ "valid alternative");
+ candidate = g_list_last (object->supported_delsys);
+ break;
+ case 1:
+ candidate = g_list_last (valid);
+ GST_DEBUG_OBJECT (object, "Delivery system autodetection provided only "
+ "one valid alternative: '%d'", GPOINTER_TO_INT (candidate->data));
+ break;
+ default:
+ /* More than one alternative. Selection based on best guess */
+ if (g_list_find (valid, GINT_TO_POINTER (SYS_DVBT)) &&
+ g_list_find (valid, GINT_TO_POINTER (SYS_DVBT2))) {
+ /* There is no way to tell one over the other when parameters seem valid
+ * for DVB-T and DVB-T2 and the adapter supports both. Reason to go with
+ * the former here is that, from experience, most DVB-T2 channels out
+ * there seem to use parameters that are not valid for DVB-T, like
+ * QAM_256 */
+ GST_WARNING_OBJECT (object, "Channel parameters valid for DVB-T and "
+ "DVB-T2. Choosing DVB-T");
+ candidate = g_list_find (valid, GINT_TO_POINTER (SYS_DVBT));
+ } else {
+ candidate = g_list_last (valid);
+ }
+ }
+
+ object->delsys = GPOINTER_TO_INT (candidate->data);
+ g_list_free (valid);
+
+autoselection_done:
+ GST_INFO_OBJECT (object, "Automatically selecting delivery system '%u'",
+ object->delsys);
+}
+
static gboolean
gst_dvbsrc_set_fe_params (GstDvbSrc * object, struct dtv_properties *props)
{
@@ -2330,6 +2482,10 @@
int n;
gint err;
+ /* If delsys hasn't been set, ask for it to be automatically selected */
+ if (object->delsys == SYS_UNDEFINED)
+ gst_dvbsrc_guess_delsys (object);
+
/* first 3 entries are reserved */
n = 3;
@@ -2391,6 +2547,11 @@
set_prop (props->props, &n, DTV_MODULATION, object->modulation);
if (object->delsys == SYS_DVBS2) {
+ if (object->stream_id > 255) {
+ GST_WARNING_OBJECT (object, "Invalid (> 255) DVB-S2 stream ID '%d'. "
+ "Disabling sub-stream filtering", object->stream_id);
+ object->stream_id = NO_STREAM_ID_FILTER;
+ }
set_prop (props->props, &n, DTV_PILOT, object->pilot);
set_prop (props->props, &n, DTV_ROLLOFF, object->rolloff);
set_prop (props->props, &n, DTV_STREAM_ID, object->stream_id);
@@ -2398,31 +2559,6 @@
break;
case SYS_DVBT:
case SYS_DVBT2:
- if (object->delsys == SYS_DVBT) {
- if (object->transmission_mode != TRANSMISSION_MODE_AUTO &&
- object->transmission_mode != TRANSMISSION_MODE_2K &&
- object->transmission_mode != TRANSMISSION_MODE_8K) {
- GST_WARNING_OBJECT (object, "Wrong DVB-T parameter combination: "
- "transmission mode should be either AUTO, 2K or 8K");
- }
- if (object->bandwidth != 6000000 && object->bandwidth != 7000000 &&
- object->bandwidth != 8000000) {
- GST_WARNING_OBJECT (object, "Wrong DVB-T parameter value: bandwidth "
- "is %d but only 6, 7 and 8 MHz are allowed", object->bandwidth);
- }
- } else if (object->delsys == SYS_DVBT2) {
- if (object->transmission_mode != TRANSMISSION_MODE_AUTO &&
- object->transmission_mode != TRANSMISSION_MODE_1K &&
- object->transmission_mode != TRANSMISSION_MODE_2K &&
- object->transmission_mode != TRANSMISSION_MODE_4K &&
- object->transmission_mode != TRANSMISSION_MODE_8K &&
- object->transmission_mode != TRANSMISSION_MODE_16K &&
- object->transmission_mode != TRANSMISSION_MODE_32K) {
- GST_WARNING_OBJECT (object, "Wrong DVB-T2 parameter combination: "
- "transmission mode should be either AUTO, 1K, 2K, 4K, 8K, 16K "
- "or 32K");
- }
- }
set_prop (props->props, &n, DTV_BANDWIDTH_HZ, object->bandwidth);
set_prop (props->props, &n, DTV_CODE_RATE_HP, object->code_rate_hp);
set_prop (props->props, &n, DTV_CODE_RATE_LP, object->code_rate_lp);
@@ -2431,7 +2567,13 @@
object->transmission_mode);
set_prop (props->props, &n, DTV_GUARD_INTERVAL, object->guard_interval);
set_prop (props->props, &n, DTV_HIERARCHY, object->hierarchy_information);
+
if (object->delsys == SYS_DVBT2) {
+ if (object->stream_id > 255) {
+ GST_WARNING_OBJECT (object, "Invalid (> 255) DVB-T2 stream ID '%d'. "
+ "Disabling sub-stream filtering", object->stream_id);
+ object->stream_id = NO_STREAM_ID_FILTER;
+ }
set_prop (props->props, &n, DTV_STREAM_ID, object->stream_id);
}
@@ -2476,11 +2618,6 @@
"layer C modulation is DQPSK but layer B modulation is different");
}
- if (object->bandwidth != 6000000) {
- GST_WARNING_OBJECT (object, "Wrong ISDB-T parameter value: bandwidth "
- "is %d but only 6 MHz is allowed", object->bandwidth);
- }
-
GST_INFO_OBJECT (object, "Tuning ISDB-T to %d", freq);
set_prop (props->props, &n, DTV_BANDWIDTH_HZ, object->bandwidth);
set_prop (props->props, &n, DTV_GUARD_INTERVAL, object->guard_interval);
@@ -2547,9 +2684,22 @@
return FALSE;
}
+ /* Informative checks */
if (!gst_dvbsrc_is_valid_modulation (object->delsys, object->modulation)) {
GST_WARNING_OBJECT (object,
- "Attempting an invalid modulation/delsys combination");
+ "Attempting invalid modulation '%u' for delivery system '%u'",
+ object->modulation, object->delsys);
+ }
+ if (!gst_dvbsrc_is_valid_trans_mode (object->delsys,
+ object->transmission_mode)) {
+ GST_WARNING_OBJECT (object,
+ "Attempting invalid transmission mode '%u' for delivery system '%u'",
+ object->transmission_mode, object->delsys);
+ }
+ if (!gst_dvbsrc_is_valid_bandwidth (object->delsys, object->bandwidth)) {
+ GST_WARNING_OBJECT (object,
+ "Attempting invalid bandwidth '%u' for delivery system '%u'",
+ object->bandwidth, object->delsys);
}
set_prop (props->props, &n, DTV_TUNE, 0);
@@ -2611,6 +2761,12 @@
GST_INFO_OBJECT (object, "Setting PES filter");
+ /* Set common params for all filters */
+ pes_filter.input = DMX_IN_FRONTEND;
+ pes_filter.output = DMX_OUT_TS_TAP;
+ pes_filter.pes_type = DMX_PES_OTHER;
+ pes_filter.flags = DMX_IMMEDIATE_START;
+
for (i = 0; i < MAX_FILTERS; i++) {
if (object->pids[i] == G_MAXUINT16)
break;
@@ -2628,12 +2784,8 @@
g_return_if_fail (*fd != -1);
pes_filter.pid = pid;
- pes_filter.input = DMX_IN_FRONTEND;
- pes_filter.output = DMX_OUT_TS_TAP;
- pes_filter.pes_type = DMX_PES_OTHER;
- pes_filter.flags = DMX_IMMEDIATE_START;
- GST_INFO_OBJECT (object, "Setting pes-filter, pid = %d, type = %d",
+ GST_INFO_OBJECT (object, "Setting PES filter: pid = %d, type = %d",
pes_filter.pid, pes_filter.pes_type);
LOOP_WHILE_EINTR (err, ioctl (*fd, DMX_SET_PES_FILTER, &pes_filter));
diff --git a/sys/dvb/gstdvbsrc.h b/sys/dvb/gstdvbsrc.h
index 27a27b7..e504ea8 100644
--- a/sys/dvb/gstdvbsrc.h
+++ b/sys/dvb/gstdvbsrc.h
@@ -64,8 +64,8 @@
GMutex tune_mutex;
gboolean need_tune;
+ GList * supported_delsys;
guchar delsys;
- guchar best_guess_delsys;
int adapter_number;
int frontend_number;
diff --git a/sys/dvb/parsechannels.c b/sys/dvb/parsechannels.c
index 1d30580..e39cd94 100644
--- a/sys/dvb/parsechannels.c
+++ b/sys/dvb/parsechannels.c
@@ -37,6 +37,20 @@
#include <linux/dvb/frontend.h>
+typedef enum
+{
+ CHANNEL_CONF_FORMAT_NONE,
+ CHANNEL_CONF_FORMAT_DVBV5,
+ CHANNEL_CONF_FORMAT_ZAP
+} GstDvbChannelConfFormat;
+
+static gboolean parse_and_configure_from_v5_conf_file (GstElement * dvbbasebin,
+ const gchar * filename, const gchar * channel_name, GError ** error);
+static gboolean parse_and_configure_from_zap_conf_file (GstElement * dvbbasebin,
+ const gchar * filename, const gchar * channel_name, GError ** error);
+static GstDvbChannelConfFormat detect_file_format (const gchar * filename);
+
+
GST_DEBUG_CATEGORY_EXTERN (dvb_base_bin_debug);
#define GST_CAT_DEFAULT dvb_base_bin_debug
@@ -45,6 +59,342 @@
* Detect when the file changed on disk
*/
+typedef gboolean (*GstDvbV5ChannelsConfPropSetFunction) (GstElement *
+ dvbbasebin, const gchar * property, GKeyFile * kf,
+ const gchar * channel_name, const gchar * key);
+
+static gint
+gst_dvb_base_bin_find_string_in_array (const gchar ** array, const gchar * str)
+{
+ gint i = 0;
+ const gchar *cur;
+ while ((cur = array[i])) {
+ if (strcmp (cur, str) == 0)
+ return i;
+
+ i++;
+ }
+
+ return -1;
+}
+
+static gboolean
+gst_dvb_base_bin_conf_set_property_from_string_array (GstElement * dvbbasebin,
+ const gchar * property, GKeyFile * kf, const gchar * channel_name,
+ const gchar * key, const gchar ** strings, gint default_value)
+{
+ gchar *str;
+ gint v;
+
+ str = g_key_file_get_string (kf, channel_name, key, NULL);
+ v = gst_dvb_base_bin_find_string_in_array (strings, str);
+ if (v == -1) {
+ GST_WARNING_OBJECT (dvbbasebin, "Unexpected value '%s' for property "
+ "'%s', using default: %d", str, property, default_value);
+ v = default_value;
+ }
+
+ g_free (str);
+ g_object_set (dvbbasebin, property, v, NULL);
+ return TRUE;
+}
+
+static gboolean
+gst_dvb_base_bin_conf_set_string (GstElement * dvbbasebin,
+ const gchar * property, GKeyFile * kf, const gchar * channel_name,
+ const gchar * key)
+{
+ gchar *str;
+
+ str = g_key_file_get_string (kf, channel_name, key, NULL);
+ if (!str) {
+ GST_WARNING_OBJECT (dvbbasebin,
+ "Could not get value for '%s' on channel '%s'", key, channel_name);
+ return FALSE;
+ }
+
+ g_object_set (dvbbasebin, property, str, NULL);
+ g_free (str);
+ return TRUE;
+}
+
+static gboolean
+gst_dvb_base_bin_conf_set_uint (GstElement * dvbbasebin, const gchar * property,
+ GKeyFile * kf, const gchar * channel_name, const gchar * key)
+{
+ guint64 v;
+
+ v = g_key_file_get_uint64 (kf, channel_name, key, NULL);
+ if (!v) {
+ GST_WARNING_OBJECT (dvbbasebin,
+ "Could not get value for '%s' on channel '%s'", key, channel_name);
+ return FALSE;
+ }
+
+ g_object_set (dvbbasebin, property, (guint) v, NULL);
+ return TRUE;
+}
+
+static gboolean
+gst_dvb_base_bin_conf_set_int (GstElement * dvbbasebin, const gchar * property,
+ GKeyFile * kf, const gchar * channel_name, const gchar * key)
+{
+ gint v;
+
+ v = g_key_file_get_integer (kf, channel_name, key, NULL);
+ if (!v) {
+ GST_WARNING_OBJECT (dvbbasebin,
+ "Could not get value for '%s' on channel '%s'", key, channel_name);
+ return FALSE;
+ }
+
+ g_object_set (dvbbasebin, property, v, NULL);
+ return TRUE;
+}
+
+static gboolean
+gst_dvb_base_bin_conf_set_inversion (GstElement * dvbbasebin,
+ const gchar * property, GKeyFile * kf, const gchar * channel_name,
+ const gchar * key)
+{
+ gchar *str;
+ gint v;
+
+ str = g_key_file_get_string (kf, channel_name, key, NULL);
+ if (!str) {
+ GST_WARNING_OBJECT (dvbbasebin,
+ "Could not get value for '%s' on channel '%s'", key, channel_name);
+ return FALSE;
+ }
+
+ if (strcmp (str, "AUTO") == 0)
+ v = 2;
+ else if (strcmp (str, "ON") == 0)
+ v = 1;
+ else
+ v = 0; /* OFF */
+
+ g_free (str);
+ g_object_set (dvbbasebin, property, v, NULL);
+ return TRUE;
+}
+
+static gboolean
+gst_dvb_base_bin_conf_set_guard (GstElement * dvbbasebin,
+ const gchar * property, GKeyFile * kf, const gchar * channel_name,
+ const gchar * key)
+{
+ const gchar *guards[] = {
+ "32", "16", "8", "4", "auto",
+ "128", "19/128", "19/256",
+ "PN420", "PN595", "PN945", NULL
+ };
+ return gst_dvb_base_bin_conf_set_property_from_string_array (dvbbasebin,
+ property, kf, channel_name, key, guards, 4);
+}
+
+static gboolean
+gst_dvb_base_bin_conf_set_trans_mode (GstElement * dvbbasebin,
+ const gchar * property, GKeyFile * kf, const gchar * channel_name,
+ const gchar * key)
+{
+ const gchar *trans_modes[] = {
+ "2K", "8K", "AUTO", "4K", "1K",
+ "16K", "32K", "C1", "C3780", NULL
+ };
+ return gst_dvb_base_bin_conf_set_property_from_string_array (dvbbasebin,
+ property, kf, channel_name, key, trans_modes, 2);
+}
+
+static gboolean
+gst_dvb_base_bin_conf_set_code_rate (GstElement * dvbbasebin,
+ const gchar * property, GKeyFile * kf, const gchar * channel_name,
+ const gchar * key)
+{
+ const gchar *code_rates[] = {
+ "NONE", "1/2", "2/3", "3/4", "4/5",
+ "5/6", "6/7", "7/8", "8/9", "AUTO",
+ "3/5", "9/10", "2/5", NULL
+ };
+ return gst_dvb_base_bin_conf_set_property_from_string_array (dvbbasebin,
+ property, kf, channel_name, key, code_rates, 9);
+}
+
+static gboolean
+gst_dvb_base_bin_conf_set_delsys (GstElement * dvbbasebin,
+ const gchar * property, GKeyFile * kf, const gchar * channel_name,
+ const gchar * key)
+{
+ const gchar *delsys[] = {
+ "UNDEFINED", "DVBCA", "DVBCB", "DVBT", "DSS",
+ "DVBS", "DVBS2", "DVBH", "ISDBT", "ISDBS",
+ "ISDBC", "ATSC", "ATSCMH", "DTMB", "CMMB",
+ "DAB", "DVBT2", "TURBO", "DVBCC", NULL
+ };
+ return gst_dvb_base_bin_conf_set_property_from_string_array (dvbbasebin,
+ property, kf, channel_name, key, delsys, 0);
+}
+
+static gboolean
+gst_dvb_base_bin_conf_set_modulation (GstElement * dvbbasebin,
+ const gchar * property, GKeyFile * kf, const gchar * channel_name,
+ const gchar * key)
+{
+ const gchar *modulations[] = {
+ "QPSK", "QAM/16", "QAM/32", "QAM/64",
+ "QAM/128", "QAM/256", "QAM/AUTO", "VSB/8",
+ "VSB/16", "PSK/8", "APSK/16", "APSK/32",
+ "DQPSK", "QAM/4_NR", NULL
+ };
+ return gst_dvb_base_bin_conf_set_property_from_string_array (dvbbasebin,
+ property, kf, channel_name, key, modulations, 6);
+}
+
+typedef struct
+{
+ const gchar *conf_property;
+ const gchar *elem_property;
+ GstDvbV5ChannelsConfPropSetFunction set_func;
+} GstDvbV5ChannelsConfToPropertyMap;
+
+GstDvbV5ChannelsConfToPropertyMap dvbv5_prop_map[] = {
+ {"SERVICE_ID", "program-numbers", gst_dvb_base_bin_conf_set_string},
+ {"FREQUENCY", "frequency", gst_dvb_base_bin_conf_set_uint},
+ {"BANDWIDTH_HZ", "bandwidth-hz", gst_dvb_base_bin_conf_set_uint},
+ {"INVERSION", "inversion", gst_dvb_base_bin_conf_set_inversion},
+ {"GUARD_INTERVAL", "guard", gst_dvb_base_bin_conf_set_guard},
+ {"TRANSMISSION_MODE", "trans-mode", gst_dvb_base_bin_conf_set_trans_mode},
+ {"MODULATION", "modulation", gst_dvb_base_bin_conf_set_modulation},
+ {"ISDBT_LAYER_ENABLED", "isdbt-layer-enabled",
+ gst_dvb_base_bin_conf_set_uint},
+ {"ISDBT_PARTIAL_RECEPTION", "isdbt-partial-reception",
+ gst_dvb_base_bin_conf_set_int},
+ {"ISDBT_SOUND_BROADCASTING", "isdbt-sound-broadcasting",
+ gst_dvb_base_bin_conf_set_int},
+ {"ISDBT_SB_SUBCHANNEL_ID", "isdbt-sb-subchannel-id",
+ gst_dvb_base_bin_conf_set_int},
+ {"ISDBT_SB_SEGMENT_IDX", "isdbt-sb-segment-idx",
+ gst_dvb_base_bin_conf_set_int},
+ {"ISDBT_SB_SEGMENT_COUNT", "isdbt-sb-segment-count", gst_dvb_base_bin_conf_set_int}, /* Range in files start from 0, property starts from 1 */
+ {"ISDBT_LAYERA_FEC", "isdbt-layera-fec", gst_dvb_base_bin_conf_set_code_rate},
+ {"ISDBT_LAYERA_MODULATION", "isdbt-layera-modulation",
+ gst_dvb_base_bin_conf_set_modulation},
+ {"ISDBT_LAYERA_SEGMENT_COUNT", "isdbt-layera-segment-count",
+ gst_dvb_base_bin_conf_set_int},
+ {"ISDBT_LAYERA_TIME_INTERLEAVING", "isdbt-layera-time-interleaving",
+ gst_dvb_base_bin_conf_set_int},
+ {"ISDBT_LAYERB_FEC", "isdbt-layerb-fec", gst_dvb_base_bin_conf_set_code_rate},
+ {"ISDBT_LAYERB_MODULATION", "isdbt-layerb-modulation",
+ gst_dvb_base_bin_conf_set_modulation},
+ {"ISDBT_LAYERB_SEGMENT_COUNT", "isdbt-layerb-segment-count",
+ gst_dvb_base_bin_conf_set_int},
+ {"ISDBT_LAYERB_TIME_INTERLEAVING", "isdbt-layerb-time-interleaving",
+ gst_dvb_base_bin_conf_set_int},
+ {"ISDBT_LAYERC_FEC", "isdbt-layerc-fec", gst_dvb_base_bin_conf_set_code_rate},
+ {"ISDBT_LAYERC_MODULATION", "isdbt-layerc-modulation",
+ gst_dvb_base_bin_conf_set_modulation},
+ {"ISDBT_LAYERC_SEGMENT_COUNT", "isdbt-layerc-segment-count",
+ gst_dvb_base_bin_conf_set_int},
+ {"ISDBT_LAYERC_TIME_INTERLEAVING", "isdbt-layerc-time-interleaving",
+ gst_dvb_base_bin_conf_set_int},
+ {"DELIVERY_SYSTEM", "delsys", gst_dvb_base_bin_conf_set_delsys},
+ {NULL,}
+};
+
+static gboolean
+parse_and_configure_from_v5_conf_file (GstElement * dvbbasebin,
+ const gchar * filename, const gchar * channel_name, GError ** error)
+{
+ GKeyFile *keyfile;
+ gchar **keys, **keys_p;
+ GError *err = NULL;
+
+ keyfile = g_key_file_new ();
+ if (!g_key_file_load_from_file (keyfile, filename, G_KEY_FILE_NONE, &err))
+ goto load_error;
+
+ if (!g_key_file_has_group (keyfile, channel_name))
+ goto unknown_channel;
+
+ keys = g_key_file_get_keys (keyfile, channel_name, NULL, &err);
+ if (!keys)
+ goto no_properties;
+
+ keys_p = keys;
+ while (*keys_p) {
+ const gchar *k = *keys_p;
+ const GstDvbV5ChannelsConfToPropertyMap *map_entry = dvbv5_prop_map;
+ gboolean property_found = FALSE;
+
+ GST_LOG_OBJECT (dvbbasebin, "Setting property %s", k);
+
+ while (map_entry->conf_property) {
+ if (strcmp (map_entry->conf_property, k) == 0) {
+ if (!map_entry->set_func (dvbbasebin, map_entry->elem_property, keyfile,
+ channel_name, k))
+ goto property_error;
+ property_found = TRUE;
+ break;
+ }
+ map_entry++;
+ }
+
+ if (!property_found)
+ GST_WARNING_OBJECT (dvbbasebin, "Failed to map property '%s'", k);
+
+ keys_p++;
+ }
+
+ GST_DEBUG_OBJECT (dvbbasebin, "Successfully parsed channel configuration "
+ "file '%s'", filename);
+ g_strfreev (keys);
+ g_key_file_unref (keyfile);
+ return TRUE;
+
+load_error:
+ if ((err->domain == G_FILE_ERROR && err->code == G_FILE_ERROR_NOENT) ||
+ (err->domain == G_KEY_FILE_ERROR
+ && err->code == G_KEY_FILE_ERROR_NOT_FOUND)) {
+ 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 FALSE;
+
+unknown_channel:
+ {
+ /* FIXME: is channel name guaranteed to be ASCII or UTF-8? */
+ g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_NOT_FOUND,
+ _("Couldn't find details for DVB channel %s"), channel_name);
+ g_key_file_unref (keyfile);
+ g_clear_error (&err);
+ return FALSE;
+ }
+
+no_properties:
+ {
+ /* FIXME: is channel name guaranteed to be ASCII or UTF-8? */
+ g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_NOT_FOUND,
+ _("No properties for the DVB channel %s"), channel_name);
+ g_key_file_unref (keyfile);
+ g_clear_error (&err);
+ return FALSE;
+ }
+
+property_error:
+ {
+ /* FIXME: is channel name guaranteed to be ASCII or UTF-8? */
+ g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED,
+ _("Failed to set properties for the DVB channel %s"), channel_name);
+ g_key_file_unref (keyfile);
+ g_clear_error (&err);
+ return FALSE;
+ }
+}
+
/* this will do zap style channels.conf only for the moment */
static GHashTable *
parse_channels_conf_from_file (GstElement * dvbbasebin, const gchar * filename,
@@ -162,7 +512,7 @@
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"));
+ _("Couldn't find DVB channel configuration file: %s"), err->message);
} else {
g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_READ,
_("Couldn't load DVB channel configuration file: %s"), err->message);
@@ -192,23 +542,26 @@
g_hash_table_foreach_remove (channels, remove_channel_from_hash, NULL);
}
-gboolean
-set_properties_for_channel (GstElement * dvbbasebin,
- const gchar * channel_name, GError ** error)
+static gboolean
+parse_and_configure_from_zap_conf_file (GstElement * dvbbasebin,
+ const gchar * filename, const gchar * channel_name, GError ** error)
{
gboolean ret = FALSE;
GHashTable *channels, *params;
- gchar *filename;
gchar *type;
- const gchar *adapter;
- filename = g_strdup (g_getenv ("GST_DVB_CHANNELS_CONF"));
- if (filename == NULL) {
- filename = g_build_filename (g_get_user_config_dir (),
- "gstreamer-" GST_API_VERSION, "dvb-channels.conf", NULL);
- }
+ /**
+ * Assumptions are made here about a format that is loosely
+ * defined. Particularly, we assume a given delivery system
+ * out of counting the number of fields per line. dvbsrc has
+ * smarter code to auto-detect a delivery system based on
+ * known-correct combinations of parameters so if you ever
+ * encounter cases where the delivery system is being
+ * wrongly set here, just remove the offending
+ * g_object_set line and let dvbsrc work his magic out.
+ */
+
channels = parse_channels_conf_from_file (dvbbasebin, filename, error);
- g_free (filename);
if (!channels)
goto beach;
@@ -221,24 +574,19 @@
g_object_set (dvbbasebin, "program-numbers",
g_hash_table_lookup (params, "sid"), NULL);
/* check if it is terrestrial or satellite */
- adapter = g_getenv ("GST_DVB_ADAPTER");
- if (adapter)
- g_object_set (dvbbasebin, "adapter", atoi (adapter), NULL);
g_object_set (dvbbasebin, "frequency",
atoi (g_hash_table_lookup (params, "frequency")), NULL);
type = g_hash_table_lookup (params, "type");
if (strcmp (type, "terrestrial") == 0) {
gchar *val;
- g_object_set (dvbbasebin, "delsys", SYS_DVBT, NULL);
-
val = g_hash_table_lookup (params, "inversion");
if (strcmp (val, "INVERSION_OFF") == 0)
- g_object_set (dvbbasebin, "inversion", 0, NULL);
+ g_object_set (dvbbasebin, "inversion", INVERSION_OFF, NULL);
else if (strcmp (val, "INVERSION_ON") == 0)
- g_object_set (dvbbasebin, "inversion", 1, NULL);
+ g_object_set (dvbbasebin, "inversion", INVERSION_ON, NULL);
else
- g_object_set (dvbbasebin, "inversion", 2, NULL);
+ g_object_set (dvbbasebin, "inversion", INVERSION_AUTO, NULL);
val = g_hash_table_lookup (params, "bandwidth");
if (strcmp (val, "BANDWIDTH_8_MHZ") == 0)
@@ -247,6 +595,12 @@
g_object_set (dvbbasebin, "bandwidth", 1, NULL);
else if (strcmp (val, "BANDWIDTH_6_MHZ") == 0)
g_object_set (dvbbasebin, "bandwidth", 2, NULL);
+ else if (strcmp (val, "BANDWIDTH_5_MHZ") == 0)
+ g_object_set (dvbbasebin, "bandwidth", 4, NULL);
+ else if (strcmp (val, "BANDWIDTH_10_MHZ") == 0)
+ g_object_set (dvbbasebin, "bandwidth", 5, NULL);
+ else if (strcmp (val, "BANDWIDTH_1_712_MHZ") == 0)
+ g_object_set (dvbbasebin, "bandwidth", 6, NULL);
else
g_object_set (dvbbasebin, "bandwidth", 3, NULL);
@@ -451,3 +805,82 @@
return FALSE;
}
}
+
+static GstDvbChannelConfFormat
+detect_file_format (const gchar * filename)
+{
+ gchar *contents;
+ gchar **lines;
+ gchar **line;
+ GstDvbChannelConfFormat ret = CHANNEL_CONF_FORMAT_NONE;
+
+ if (!g_file_get_contents (filename, &contents, NULL, NULL))
+ return ret;
+
+ lines = g_strsplit (contents, "\n", 0);
+ line = lines;
+
+ while (*line) {
+ if (g_str_has_prefix (*line, "[") && g_str_has_suffix (*line, "]")) {
+ ret = CHANNEL_CONF_FORMAT_DVBV5;
+ break;
+ } else if (g_strrstr (*line, ":")) {
+ ret = CHANNEL_CONF_FORMAT_ZAP;
+ break;
+ }
+ line++;
+ }
+
+ g_strfreev (lines);
+ g_free (contents);
+ return ret;
+}
+
+gboolean
+set_properties_for_channel (GstElement * dvbbasebin,
+ const gchar * channel_name, GError ** error)
+{
+ gboolean ret = FALSE;
+ gchar *filename;
+ const gchar *adapter;
+
+ filename = g_strdup (g_getenv ("GST_DVB_CHANNELS_CONF"));
+ if (filename == NULL) {
+ filename = g_build_filename (g_get_user_config_dir (),
+ "gstreamer-" GST_API_VERSION, "dvb-channels.conf", NULL);
+ }
+
+ adapter = g_getenv ("GST_DVB_ADAPTER");
+ if (adapter)
+ g_object_set (dvbbasebin, "adapter", atoi (adapter), NULL);
+
+ switch (detect_file_format (filename)) {
+ case CHANNEL_CONF_FORMAT_DVBV5:
+ if (!parse_and_configure_from_v5_conf_file (dvbbasebin, filename,
+ channel_name, error)) {
+ GST_WARNING_OBJECT (dvbbasebin, "Could not parse libdvbv5 channel "
+ "configuration file '%s'", filename);
+ } else {
+ GST_INFO_OBJECT (dvbbasebin, "Parsed libdvbv5 channel configuration "
+ "file");
+ ret = TRUE;
+ }
+ break;
+ case CHANNEL_CONF_FORMAT_ZAP:
+ if (!parse_and_configure_from_zap_conf_file (dvbbasebin, filename,
+ channel_name, error)) {
+ GST_WARNING_OBJECT (dvbbasebin, "Could not parse ZAP channel "
+ "configuration file '%s'", filename);
+ } else {
+ GST_INFO_OBJECT (dvbbasebin, "Parsed ZAP channel configuration file");
+ ret = TRUE;
+ }
+ break;
+ default:
+ GST_WARNING_OBJECT (dvbbasebin, "Unknown configuration file format. "
+ "Can not get parameters for channel");
+ }
+
+ g_free (filename);
+ return ret;
+}
diff --git a/sys/fbdev/Makefile.in b/sys/fbdev/Makefile.in
index 9bd0561..554ba4d 100644
--- a/sys/fbdev/Makefile.in
+++ b/sys/fbdev/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/fbdev/gstfbdevsink.c b/sys/fbdev/gstfbdevsink.c
index b559a7e..166c543 100644
--- a/sys/fbdev/gstfbdevsink.c
+++ b/sys/fbdev/gstfbdevsink.c
@@ -34,8 +34,14 @@
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
+
+#ifdef HAVE_UNISTD_H
#include <unistd.h>
-#include "_stdint.h"
+#endif
+
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
#include "gstfbdevsink.h"
@@ -227,7 +233,8 @@
gst_structure_get_int (structure, "height", &fbdevsink->height);
/* calculate centering and scanlengths for the video */
- fbdevsink->bytespp = fbdevsink->fixinfo.line_length / fbdevsink->varinfo.xres_virtual;
+ fbdevsink->bytespp =
+ fbdevsink->fixinfo.line_length / fbdevsink->varinfo.xres_virtual;
fbdevsink->cx = ((int) fbdevsink->varinfo.xres - fbdevsink->width) / 2;
if (fbdevsink->cx < 0)
@@ -432,8 +439,7 @@
"Sink/Video", "Linux framebuffer videosink",
"Sean D'Epagnier <sean@depagnier.com>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_template));
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_template);
}
static void
diff --git a/sys/kms/Makefile.am b/sys/kms/Makefile.am
new file mode 100644
index 0000000..9b12c72
--- /dev/null
+++ b/sys/kms/Makefile.am
@@ -0,0 +1,41 @@
+plugin_LTLIBRARIES = libgstkmssink.la
+
+libgstkmssink_la_SOURCES = \
+ gstkmssink.c \
+ gstkmsutils.c \
+ gstkmsallocator.c \
+ gstkmsbufferpool.c \
+ $(NUL)
+
+libgstkmssink_la_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(GST_VIDEO_CFLAGS) \
+ $(GST_ALLOCATORS_CFLAGS) \
+ $(GST_CFLAGS) \
+ $(DRM_CFLAGS) \
+ $(NULL)
+
+libgstkmssink_la_LIBADD = \
+ $(GST_PLUGINS_BASE_LIBS) \
+ $(GST_BASE_LIBS) \
+ $(GST_VIDEO_LIBS) \
+ $(GST_ALLOCATORS_LIBS) \
+ $(GST_LIBS) \
+ $(DRM_LIBS) \
+ $(NULL)
+
+libgstkmssink_la_LDFLAGS = \
+ $(GST_PLUGIN_LDFLAGS) \
+ $(NULL)
+
+libgstkmssink_la_LIBTOOLFLAGS = \
+ $(GST_PLUGIN_LIBTOOLFLAGS) \
+ $(NULL)
+
+noinst_HEADERS = \
+ gstkmssink.h \
+ gstkmsutils.h \
+ gstkmsallocator.h \
+ gstkmsbufferpool.h \
+ $(NULL)
diff --git a/tests/examples/gl/gtk/gtkvideooverlay/Makefile.in b/sys/kms/Makefile.in
similarity index 68%
copy from tests/examples/gl/gtk/gtkvideooverlay/Makefile.in
copy to sys/kms/Makefile.in
index aef9ed4..0201bdc 100644
--- a/tests/examples/gl/gtk/gtkvideooverlay/Makefile.in
+++ b/sys/kms/Makefile.in
@@ -14,6 +14,7 @@
@SET_MAKE@
+
VPATH = @srcdir@
am__is_gnu_make = { \
if test -z '$(MAKELEVEL)'; then \
@@ -89,8 +90,7 @@
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
-noinst_PROGRAMS = gtkvideooverlay$(EXEEXT)
-subdir = tests/examples/gl/gtk/gtkvideooverlay
+subdir = sys/kms
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 \
@@ -127,27 +127,59 @@
$(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 $(am__DIST_COMMON)
+DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \
+ $(am__DIST_COMMON)
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
-PROGRAMS = $(noinst_PROGRAMS)
-am_gtkvideooverlay_OBJECTS = gtkvideooverlay-main.$(OBJEXT)
-gtkvideooverlay_OBJECTS = $(am_gtkvideooverlay_OBJECTS)
+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)
am__DEPENDENCIES_1 =
-gtkvideooverlay_DEPENDENCIES = ../libgstgtkhelper.la \
+libgstkmssink_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1)
+am_libgstkmssink_la_OBJECTS = libgstkmssink_la-gstkmssink.lo \
+ libgstkmssink_la-gstkmsutils.lo \
+ libgstkmssink_la-gstkmsallocator.lo \
+ libgstkmssink_la-gstkmsbufferpool.lo
+libgstkmssink_la_OBJECTS = $(am_libgstkmssink_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 =
-gtkvideooverlay_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
- $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
- $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
+libgstkmssink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstkmssink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstkmssink_la_CFLAGS) $(CFLAGS) \
+ $(libgstkmssink_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
@@ -164,31 +196,32 @@
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
am__mv = mv -f
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+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_CXXFLAGS) $(CXXFLAGS)
-AM_V_CXX = $(am__v_CXX_@AM_V@)
-am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
-am__v_CXX_0 = @echo " CXX " $@;
-am__v_CXX_1 =
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
- $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
-am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
-am__v_CXXLD_0 = @echo " CXXLD " $@;
-am__v_CXXLD_1 =
-SOURCES = $(gtkvideooverlay_SOURCES)
-DIST_SOURCES = $(gtkvideooverlay_SOURCES)
+ $(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 = $(libgstkmssink_la_SOURCES)
+DIST_SOURCES = $(libgstkmssink_la_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 +307,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -295,6 +330,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -344,6 +381,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -489,6 +528,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -615,8 +656,6 @@
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@
@@ -659,8 +698,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -749,19 +793,51 @@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
wayland_scanner = @wayland_scanner@
-gtkvideooverlay_SOURCES = main.cpp
-gtkvideooverlay_CXXFLAGS = -I$(top_srcdir)/gst-libs -I$(top_builddir)/gst-libs \
- $(GST_PLUGINS_BASE_CFLAGS) $(GST_CXXFLAGS) \
- $(GL_CFLAGS) $(GTK3_CFLAGS) $(X11_CFLAGS)
+plugin_LTLIBRARIES = libgstkmssink.la
+libgstkmssink_la_SOURCES = \
+ gstkmssink.c \
+ gstkmsutils.c \
+ gstkmsallocator.c \
+ gstkmsbufferpool.c \
+ $(NUL)
-gtkvideooverlay_LDADD = ../libgstgtkhelper.la \
- $(GTK3_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \
- $(GL_LIBS) -lgstvideo-$(GST_API_VERSION) $(X11_LIBS)
+libgstkmssink_la_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(GST_VIDEO_CFLAGS) \
+ $(GST_ALLOCATORS_CFLAGS) \
+ $(GST_CFLAGS) \
+ $(DRM_CFLAGS) \
+ $(NULL)
+
+libgstkmssink_la_LIBADD = \
+ $(GST_PLUGINS_BASE_LIBS) \
+ $(GST_BASE_LIBS) \
+ $(GST_VIDEO_LIBS) \
+ $(GST_ALLOCATORS_LIBS) \
+ $(GST_LIBS) \
+ $(DRM_LIBS) \
+ $(NULL)
+
+libgstkmssink_la_LDFLAGS = \
+ $(GST_PLUGIN_LDFLAGS) \
+ $(NULL)
+
+libgstkmssink_la_LIBTOOLFLAGS = \
+ $(GST_PLUGIN_LIBTOOLFLAGS) \
+ $(NULL)
+
+noinst_HEADERS = \
+ gstkmssink.h \
+ gstkmsutils.h \
+ gstkmsallocator.h \
+ gstkmsbufferpool.h \
+ $(NULL)
all: all-am
.SUFFIXES:
-.SUFFIXES: .cpp .lo .o .obj
+.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 \
@@ -771,9 +847,9 @@
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/gl/gtk/gtkvideooverlay/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/kms/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu tests/examples/gl/gtk/gtkvideooverlay/Makefile
+ $(AUTOMAKE) --gnu sys/kms/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
@@ -792,18 +868,43 @@
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
-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
+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)"; \
+ }
-gtkvideooverlay$(EXEEXT): $(gtkvideooverlay_OBJECTS) $(gtkvideooverlay_DEPENDENCIES) $(EXTRA_gtkvideooverlay_DEPENDENCIES)
- @rm -f gtkvideooverlay$(EXEEXT)
- $(AM_V_CXXLD)$(gtkvideooverlay_LINK) $(gtkvideooverlay_OBJECTS) $(gtkvideooverlay_LDADD) $(LIBS)
+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}; \
+ }
+
+libgstkmssink.la: $(libgstkmssink_la_OBJECTS) $(libgstkmssink_la_DEPENDENCIES) $(EXTRA_libgstkmssink_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstkmssink_la_LINK) -rpath $(plugindir) $(libgstkmssink_la_OBJECTS) $(libgstkmssink_la_LIBADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@@ -811,45 +912,62 @@
distclean-compile:
-rm -f *.tab.c
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtkvideooverlay-main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstkmssink_la-gstkmsallocator.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstkmssink_la-gstkmsbufferpool.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstkmssink_la-gstkmssink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstkmssink_la-gstkmsutils.Plo@am__quote@
-.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 $@ $< &&\
-@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+.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 $@ $<
-.cpp.obj:
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
-@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
-@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+.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) '$<'`
-.cpp.lo:
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
-@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
-@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+.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 $@ $<
-gtkvideooverlay-main.o: main.cpp
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) -MT gtkvideooverlay-main.o -MD -MP -MF $(DEPDIR)/gtkvideooverlay-main.Tpo -c -o gtkvideooverlay-main.o `test -f 'main.cpp' || echo '$(srcdir)/'`main.cpp
-@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gtkvideooverlay-main.Tpo $(DEPDIR)/gtkvideooverlay-main.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='main.cpp' object='gtkvideooverlay-main.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) -c -o gtkvideooverlay-main.o `test -f 'main.cpp' || echo '$(srcdir)/'`main.cpp
+libgstkmssink_la-gstkmssink.lo: gstkmssink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstkmssink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstkmssink_la_CFLAGS) $(CFLAGS) -MT libgstkmssink_la-gstkmssink.lo -MD -MP -MF $(DEPDIR)/libgstkmssink_la-gstkmssink.Tpo -c -o libgstkmssink_la-gstkmssink.lo `test -f 'gstkmssink.c' || echo '$(srcdir)/'`gstkmssink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstkmssink_la-gstkmssink.Tpo $(DEPDIR)/libgstkmssink_la-gstkmssink.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstkmssink.c' object='libgstkmssink_la-gstkmssink.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 $(libgstkmssink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstkmssink_la_CFLAGS) $(CFLAGS) -c -o libgstkmssink_la-gstkmssink.lo `test -f 'gstkmssink.c' || echo '$(srcdir)/'`gstkmssink.c
-gtkvideooverlay-main.obj: main.cpp
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) -MT gtkvideooverlay-main.obj -MD -MP -MF $(DEPDIR)/gtkvideooverlay-main.Tpo -c -o gtkvideooverlay-main.obj `if test -f 'main.cpp'; then $(CYGPATH_W) 'main.cpp'; else $(CYGPATH_W) '$(srcdir)/main.cpp'; fi`
-@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gtkvideooverlay-main.Tpo $(DEPDIR)/gtkvideooverlay-main.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='main.cpp' object='gtkvideooverlay-main.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkvideooverlay_CXXFLAGS) $(CXXFLAGS) -c -o gtkvideooverlay-main.obj `if test -f 'main.cpp'; then $(CYGPATH_W) 'main.cpp'; else $(CYGPATH_W) '$(srcdir)/main.cpp'; fi`
+libgstkmssink_la-gstkmsutils.lo: gstkmsutils.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstkmssink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstkmssink_la_CFLAGS) $(CFLAGS) -MT libgstkmssink_la-gstkmsutils.lo -MD -MP -MF $(DEPDIR)/libgstkmssink_la-gstkmsutils.Tpo -c -o libgstkmssink_la-gstkmsutils.lo `test -f 'gstkmsutils.c' || echo '$(srcdir)/'`gstkmsutils.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstkmssink_la-gstkmsutils.Tpo $(DEPDIR)/libgstkmssink_la-gstkmsutils.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstkmsutils.c' object='libgstkmssink_la-gstkmsutils.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 $(libgstkmssink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstkmssink_la_CFLAGS) $(CFLAGS) -c -o libgstkmssink_la-gstkmsutils.lo `test -f 'gstkmsutils.c' || echo '$(srcdir)/'`gstkmsutils.c
+
+libgstkmssink_la-gstkmsallocator.lo: gstkmsallocator.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstkmssink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstkmssink_la_CFLAGS) $(CFLAGS) -MT libgstkmssink_la-gstkmsallocator.lo -MD -MP -MF $(DEPDIR)/libgstkmssink_la-gstkmsallocator.Tpo -c -o libgstkmssink_la-gstkmsallocator.lo `test -f 'gstkmsallocator.c' || echo '$(srcdir)/'`gstkmsallocator.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstkmssink_la-gstkmsallocator.Tpo $(DEPDIR)/libgstkmssink_la-gstkmsallocator.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstkmsallocator.c' object='libgstkmssink_la-gstkmsallocator.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 $(libgstkmssink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstkmssink_la_CFLAGS) $(CFLAGS) -c -o libgstkmssink_la-gstkmsallocator.lo `test -f 'gstkmsallocator.c' || echo '$(srcdir)/'`gstkmsallocator.c
+
+libgstkmssink_la-gstkmsbufferpool.lo: gstkmsbufferpool.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstkmssink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstkmssink_la_CFLAGS) $(CFLAGS) -MT libgstkmssink_la-gstkmsbufferpool.lo -MD -MP -MF $(DEPDIR)/libgstkmssink_la-gstkmsbufferpool.Tpo -c -o libgstkmssink_la-gstkmsbufferpool.lo `test -f 'gstkmsbufferpool.c' || echo '$(srcdir)/'`gstkmsbufferpool.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstkmssink_la-gstkmsbufferpool.Tpo $(DEPDIR)/libgstkmssink_la-gstkmsbufferpool.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstkmsbufferpool.c' object='libgstkmssink_la-gstkmsbufferpool.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 $(libgstkmssink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstkmssink_la_CFLAGS) $(CFLAGS) -c -o libgstkmssink_la-gstkmsbufferpool.lo `test -f 'gstkmsbufferpool.c' || echo '$(srcdir)/'`gstkmsbufferpool.c
mostlyclean-libtool:
-rm -f *.lo
@@ -941,8 +1059,11 @@
done
check-am: all-am
check: check-am
-all-am: Makefile $(PROGRAMS)
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
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
@@ -975,7 +1096,7 @@
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
-clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \
mostlyclean-am
distclean: distclean-am
@@ -996,7 +1117,7 @@
info-am:
-install-data-am:
+install-data-am: install-pluginLTLIBRARIES
install-dvi: install-dvi-am
@@ -1042,23 +1163,24 @@
ps-am:
-uninstall-am:
+uninstall-am: uninstall-pluginLTLIBRARIES
.MAKE: install-am install-strip
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
- clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \
+ 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 \
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-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
+ 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
.PRECIOUS: Makefile
diff --git a/sys/kms/gstkmsallocator.c b/sys/kms/gstkmsallocator.c
new file mode 100644
index 0000000..e031848
--- /dev/null
+++ b/sys/kms/gstkmsallocator.c
@@ -0,0 +1,437 @@
+/* GStreamer
+ *
+ * Copyright (C) 2016 Igalia
+ *
+ * Authors:
+ * Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+ * Javier Martin <javiermartin@by.com.es>
+ *
+ * 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 <xf86drm.h>
+#include <xf86drmMode.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "gstkmsallocator.h"
+#include "gstkmsutils.h"
+
+#define GST_CAT_DEFAULT kmsallocator_debug
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
+
+#define GST_KMS_MEMORY_TYPE "KMSMemory"
+
+struct _GstKMSAllocatorPrivate
+{
+ int fd;
+ struct kms_driver *driver;
+};
+
+#define parent_class gst_kms_allocator_parent_class
+G_DEFINE_TYPE_WITH_CODE (GstKMSAllocator, gst_kms_allocator, GST_TYPE_ALLOCATOR,
+ G_ADD_PRIVATE (GstKMSAllocator);
+ GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "kmsallocator", 0,
+ "KMS allocator"));
+
+enum
+{
+ PROP_DRM_FD = 1,
+ PROP_N,
+};
+
+static GParamSpec *g_props[PROP_N] = { NULL, };
+
+gboolean
+gst_is_kms_memory (GstMemory * mem)
+{
+ return gst_memory_is_type (mem, GST_KMS_MEMORY_TYPE);
+}
+
+guint32
+gst_kms_memory_get_fb_id (GstMemory * mem)
+{
+ if (!gst_is_kms_memory (mem))
+ return 0;
+ return ((GstKMSMemory *) mem)->fb_id;
+}
+
+static gboolean
+ensure_kms_driver (GstKMSAllocator * alloc)
+{
+ GstKMSAllocatorPrivate *priv;
+ int err;
+
+ priv = alloc->priv;
+
+ if (priv->driver)
+ return TRUE;
+
+ if (priv->fd < 0)
+ return FALSE;
+
+ err = kms_create (priv->fd, &priv->driver);
+ if (err) {
+ GST_ERROR_OBJECT (alloc, "Could not create KMS driver: %s",
+ strerror (-err));
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void
+gst_kms_allocator_memory_reset (GstKMSAllocator * allocator, GstKMSMemory * mem)
+{
+ if (mem->fb_id) {
+ GST_DEBUG_OBJECT (allocator, "removing fb id %d", mem->fb_id);
+ drmModeRmFB (allocator->priv->fd, mem->fb_id);
+ mem->fb_id = 0;
+ }
+
+ if (!ensure_kms_driver (allocator))
+ return;
+
+ if (mem->bo) {
+ kms_bo_destroy (&mem->bo);
+ mem->bo = NULL;
+ }
+}
+
+static gboolean
+gst_kms_allocator_memory_create (GstKMSAllocator * allocator,
+ GstKMSMemory * kmsmem, GstVideoInfo * vinfo)
+{
+ gint ret;
+ guint attrs[] = {
+ KMS_WIDTH, GST_VIDEO_INFO_WIDTH (vinfo),
+ KMS_HEIGHT, GST_VIDEO_INFO_HEIGHT (vinfo),
+ KMS_TERMINATE_PROP_LIST,
+ };
+
+ if (kmsmem->bo)
+ return TRUE;
+
+ if (!ensure_kms_driver (allocator))
+ return FALSE;
+
+ ret = kms_bo_create (allocator->priv->driver, attrs, &kmsmem->bo);
+ if (ret) {
+ GST_ERROR_OBJECT (allocator, "Failed to create buffer object: %s (%d)",
+ strerror (-ret), ret);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void
+gst_kms_allocator_free (GstAllocator * allocator, GstMemory * mem)
+{
+ GstKMSAllocator *alloc;
+ GstKMSMemory *kmsmem;
+
+ alloc = GST_KMS_ALLOCATOR (allocator);
+ kmsmem = (GstKMSMemory *) mem;
+
+ gst_kms_allocator_memory_reset (alloc, kmsmem);
+ g_slice_free (GstKMSMemory, kmsmem);
+}
+
+static void
+gst_kms_allocator_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstKMSAllocator *alloc;
+
+ alloc = GST_KMS_ALLOCATOR (object);
+
+ switch (prop_id) {
+ case PROP_DRM_FD:{
+ int fd = g_value_get_int (value);
+ if (fd > -1)
+ alloc->priv->fd = dup (fd);
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_kms_allocator_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstKMSAllocator *alloc;
+
+ alloc = GST_KMS_ALLOCATOR (object);
+
+ switch (prop_id) {
+ case PROP_DRM_FD:
+ g_value_set_int (value, alloc->priv->fd);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_kms_allocator_finalize (GObject * obj)
+{
+ GstKMSAllocator *alloc;
+
+ alloc = GST_KMS_ALLOCATOR (obj);
+
+ if (alloc->priv->driver)
+ kms_destroy (&alloc->priv->driver);
+
+ if (alloc->priv->fd > -1)
+ close (alloc->priv->fd);
+
+ G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+static void
+gst_kms_allocator_class_init (GstKMSAllocatorClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstAllocatorClass *allocator_class;
+
+ allocator_class = GST_ALLOCATOR_CLASS (klass);
+ gobject_class = G_OBJECT_CLASS (klass);
+
+ allocator_class->free = gst_kms_allocator_free;
+
+ gobject_class->set_property = gst_kms_allocator_set_property;
+ gobject_class->get_property = gst_kms_allocator_get_property;
+ gobject_class->finalize = gst_kms_allocator_finalize;
+
+ g_props[PROP_DRM_FD] = g_param_spec_int ("drm-fd", "DRM fd",
+ "DRM file descriptor", -1, G_MAXINT, -1,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
+
+ g_object_class_install_properties (gobject_class, PROP_N, g_props);
+}
+
+static gpointer
+gst_kms_memory_map (GstMemory * mem, gsize maxsize, GstMapFlags flags)
+{
+ GstKMSMemory *kmsmem;
+ int err;
+ gpointer out;
+
+ if (!ensure_kms_driver ((GstKMSAllocator *) mem->allocator))
+ return NULL;
+
+ kmsmem = (GstKMSMemory *) mem;
+ if (!kmsmem->bo)
+ return NULL;
+
+ out = NULL;
+ err = kms_bo_map (kmsmem->bo, &out);
+ if (err) {
+ GST_ERROR ("could not map memory: %s %d", strerror (-err), err);
+ return NULL;
+ }
+
+ return out;
+}
+
+static void
+gst_kms_memory_unmap (GstMemory * mem)
+{
+ GstKMSMemory *kmsmem;
+
+ if (!ensure_kms_driver ((GstKMSAllocator *) mem->allocator))
+ return;
+
+ kmsmem = (GstKMSMemory *) mem;
+ if (kmsmem->bo)
+ kms_bo_unmap (kmsmem->bo);
+}
+
+static void
+gst_kms_allocator_init (GstKMSAllocator * allocator)
+{
+ GstAllocator *alloc;
+
+ alloc = GST_ALLOCATOR_CAST (allocator);
+
+ allocator->priv = gst_kms_allocator_get_instance_private (allocator);
+ allocator->priv->fd = -1;
+
+ alloc->mem_type = GST_KMS_MEMORY_TYPE;
+ alloc->mem_map = gst_kms_memory_map;
+ alloc->mem_unmap = gst_kms_memory_unmap;
+ /* Use the default, fallback copy function */
+
+ GST_OBJECT_FLAG_SET (allocator, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC);
+}
+
+GstAllocator *
+gst_kms_allocator_new (int fd)
+{
+ return g_object_new (GST_TYPE_KMS_ALLOCATOR, "name",
+ "KMSMemory::allocator", "drm-fd", fd, NULL);
+}
+
+/* The mem_offsets are relative to the GstMemory start, unlike the vinfo->offset
+ * which are relative to the GstBuffer start. */
+static gboolean
+gst_kms_allocator_add_fb (GstKMSAllocator * alloc, GstKMSMemory * kmsmem,
+ gsize mem_offsets[GST_VIDEO_MAX_PLANES], GstVideoInfo * vinfo)
+{
+ int i, ret;
+ gint num_planes = GST_VIDEO_INFO_N_PLANES (vinfo);
+ guint32 w, h, fmt, pitch = 0, bo_handles[4] = { 0, };
+ guint32 offsets[4] = { 0, };
+ guint32 pitches[4] = { 0, };
+
+ if (kmsmem->fb_id)
+ return TRUE;
+
+ w = GST_VIDEO_INFO_WIDTH (vinfo);
+ h = GST_VIDEO_INFO_HEIGHT (vinfo);
+ fmt = gst_drm_format_from_video (GST_VIDEO_INFO_FORMAT (vinfo));
+
+ if (kmsmem->bo) {
+ kms_bo_get_prop (kmsmem->bo, KMS_HANDLE, &bo_handles[0]);
+ for (i = 1; i < num_planes; i++)
+ bo_handles[i] = bo_handles[0];
+
+ /* Get the bo pitch calculated by the kms driver.
+ * If it's defined, it will overwrite the video info's stride */
+ kms_bo_get_prop (kmsmem->bo, KMS_PITCH, &pitch);
+ } else {
+ for (i = 0; i < num_planes; i++)
+ bo_handles[i] = kmsmem->gem_handle[i];
+ }
+
+ GST_DEBUG_OBJECT (alloc, "bo handles: %d, %d, %d, %d", bo_handles[0],
+ bo_handles[1], bo_handles[2], bo_handles[3]);
+
+ for (i = 0; i < num_planes; i++) {
+ offsets[i] = mem_offsets[i];
+ if (pitch)
+ GST_VIDEO_INFO_PLANE_STRIDE (vinfo, i) = pitch;
+ pitches[i] = GST_VIDEO_INFO_PLANE_STRIDE (vinfo, i);
+ GST_DEBUG_OBJECT (alloc, "Create FB plane %i with stride %u and offset %u",
+ i, pitches[i], offsets[i]);
+ }
+
+ ret = drmModeAddFB2 (alloc->priv->fd, w, h, fmt, bo_handles, pitches,
+ offsets, &kmsmem->fb_id, 0);
+ if (ret) {
+ GST_ERROR_OBJECT (alloc, "Failed to bind to framebuffer: %s (%d)",
+ strerror (-ret), ret);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static GstMemory *
+gst_kms_allocator_alloc_empty (GstAllocator * allocator, GstVideoInfo * vinfo)
+{
+ GstKMSMemory *kmsmem;
+ GstMemory *mem;
+
+ kmsmem = g_slice_new0 (GstKMSMemory);
+ if (!kmsmem)
+ return NULL;
+ mem = GST_MEMORY_CAST (kmsmem);
+
+ gst_memory_init (mem, GST_MEMORY_FLAG_NO_SHARE, allocator, NULL,
+ GST_VIDEO_INFO_SIZE (vinfo), 0, 0, GST_VIDEO_INFO_SIZE (vinfo));
+
+ return mem;
+}
+
+GstMemory *
+gst_kms_allocator_bo_alloc (GstAllocator * allocator, GstVideoInfo * vinfo)
+{
+ GstKMSAllocator *alloc;
+ GstKMSMemory *kmsmem;
+ GstMemory *mem;
+
+ mem = gst_kms_allocator_alloc_empty (allocator, vinfo);
+ if (!mem)
+ return NULL;
+
+ alloc = GST_KMS_ALLOCATOR (allocator);
+ kmsmem = (GstKMSMemory *) mem;
+ if (!gst_kms_allocator_memory_create (alloc, kmsmem, vinfo))
+ goto fail;
+ if (!gst_kms_allocator_add_fb (alloc, kmsmem, vinfo->offset, vinfo))
+ goto fail;
+
+ return mem;
+
+ /* ERRORS */
+fail:
+ gst_memory_unref (mem);
+ return NULL;
+}
+
+GstKMSMemory *
+gst_kms_allocator_dmabuf_import (GstAllocator * allocator, gint * prime_fds,
+ gint n_planes, gsize offsets[GST_VIDEO_MAX_PLANES], GstVideoInfo * vinfo)
+{
+ GstKMSAllocator *alloc;
+ GstMemory *mem;
+ GstKMSMemory *tmp;
+ gint i, ret;
+
+ g_return_val_if_fail (n_planes <= GST_VIDEO_MAX_PLANES, FALSE);
+
+ mem = gst_kms_allocator_alloc_empty (allocator, vinfo);
+ if (!mem)
+ return FALSE;
+
+ tmp = (GstKMSMemory *) mem;
+ alloc = GST_KMS_ALLOCATOR (allocator);
+ for (i = 0; i < n_planes; i++) {
+ ret = drmPrimeFDToHandle (alloc->priv->fd, prime_fds[i],
+ &tmp->gem_handle[i]);
+ if (ret)
+ goto import_fd_failed;
+ }
+
+ if (!gst_kms_allocator_add_fb (alloc, tmp, offsets, vinfo))
+ goto failed;
+
+ return tmp;
+
+ /* ERRORS */
+import_fd_failed:
+ {
+ GST_ERROR_OBJECT (alloc, "Failed to import prime fd %d: %s (%d)",
+ prime_fds[i], strerror (-ret), ret);
+ /* fallback */
+ }
+
+failed:
+ {
+ gst_memory_unref (mem);
+ return NULL;
+ }
+}
diff --git a/sys/kms/gstkmsallocator.h b/sys/kms/gstkmsallocator.h
new file mode 100644
index 0000000..fefd4c2
--- /dev/null
+++ b/sys/kms/gstkmsallocator.h
@@ -0,0 +1,91 @@
+/* GStreamer
+ *
+ * Copyright (C) 2016 Igalia
+ *
+ * Authors:
+ * Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+ * Javier Martin <javiermartin@by.com.es>
+ *
+ * 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_KMS_ALLOCATOR_H__
+#define __GST_KMS_ALLOCATOR_H__
+
+#include <gst/gst.h>
+#include <gst/video/video.h>
+#include <libkms.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_KMS_ALLOCATOR \
+ (gst_kms_allocator_get_type())
+#define GST_IS_KMS_ALLOCATOR(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_KMS_ALLOCATOR))
+#define GST_IS_KMS_ALLOCATOR_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_KMS_ALLOCATOR))
+#define GST_KMS_ALLOCATOR_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_KMS_ALLOCATOR, GstKMSAllocatorClass))
+#define GST_KMS_ALLOCATOR(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_KMS_ALLOCATOR, GstKMSAllocator))
+#define GST_KMS_ALLOCATOR_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_KMS_ALLOCATOR, GstKMSAllocatorClass))
+
+typedef struct _GstKMSAllocator GstKMSAllocator;
+typedef struct _GstKMSAllocatorClass GstKMSAllocatorClass;
+typedef struct _GstKMSAllocatorPrivate GstKMSAllocatorPrivate;
+typedef struct _GstKMSMemory GstKMSMemory;
+
+struct _GstKMSMemory
+{
+ GstMemory parent;
+
+ guint32 fb_id;
+ guint32 gem_handle[GST_VIDEO_MAX_PLANES];
+ struct kms_bo *bo;
+};
+
+struct _GstKMSAllocator
+{
+ GstAllocator parent;
+ GstKMSAllocatorPrivate *priv;
+};
+
+struct _GstKMSAllocatorClass {
+ GstAllocatorClass parent_class;
+};
+
+GType gst_kms_allocator_get_type (void) G_GNUC_CONST;
+
+gboolean gst_is_kms_memory (GstMemory *mem);
+guint32 gst_kms_memory_get_fb_id (GstMemory *mem);
+
+GstAllocator* gst_kms_allocator_new (gint fd);
+
+GstMemory* gst_kms_allocator_bo_alloc (GstAllocator *allocator,
+ GstVideoInfo *vinfo);
+
+GstKMSMemory* gst_kms_allocator_dmabuf_import (GstAllocator *allocator,
+ gint *prime_fds,
+ gint n_planes,
+ gsize offsets[GST_VIDEO_MAX_PLANES],
+ GstVideoInfo *vinfo);
+
+G_END_DECLS
+
+
+#endif /* __GST_KMS_ALLOCATOR_H__ */
diff --git a/sys/kms/gstkmsbufferpool.c b/sys/kms/gstkmsbufferpool.c
new file mode 100644
index 0000000..329135c
--- /dev/null
+++ b/sys/kms/gstkmsbufferpool.c
@@ -0,0 +1,213 @@
+/*
+ * GStreamer
+ * Copyright (C) 2016 Igalia
+ *
+ * Authors:
+ * Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+ * Javier Martin <javiermartin@by.com.es>
+ *
+ * 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/video/gstvideometa.h>
+
+#include "gstkmsbufferpool.h"
+#include "gstkmsallocator.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_kms_buffer_pool_debug);
+#define GST_CAT_DEFAULT gst_kms_buffer_pool_debug
+
+struct _GstKMSBufferPoolPrivate
+{
+ gint fd;
+ GstVideoInfo vinfo;
+ GstAllocator *allocator;
+ gboolean add_videometa;
+};
+
+#define parent_class gst_kms_buffer_pool_parent_class
+G_DEFINE_TYPE_WITH_CODE (GstKMSBufferPool, gst_kms_buffer_pool,
+ GST_TYPE_VIDEO_BUFFER_POOL, G_ADD_PRIVATE (GstKMSBufferPool);
+ GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "kmsbufferpool", 0,
+ "KMS buffer pool"));
+
+static const gchar **
+gst_kms_buffer_pool_get_options (GstBufferPool * pool)
+{
+ static const gchar *options[] = { GST_BUFFER_POOL_OPTION_VIDEO_META,
+ GST_BUFFER_POOL_OPTION_KMS_BUFFER, NULL
+ };
+ return options;
+}
+
+static gboolean
+gst_kms_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
+{
+ GstKMSBufferPool *vpool;
+ GstKMSBufferPoolPrivate *priv;
+ GstCaps *caps;
+ GstVideoInfo vinfo;
+ GstAllocator *allocator;
+ GstAllocationParams params;
+
+ vpool = GST_KMS_BUFFER_POOL_CAST (pool);
+ priv = vpool->priv;
+
+ if (!gst_buffer_pool_config_get_params (config, &caps, NULL, NULL, NULL))
+ goto wrong_config;
+
+ if (!caps)
+ goto no_caps;
+
+ /* now parse the caps from the config */
+ if (!gst_video_info_from_caps (&vinfo, caps))
+ goto wrong_caps;
+
+ allocator = NULL;
+ gst_buffer_pool_config_get_allocator (config, &allocator, ¶ms);
+
+ /* not our allocator, not our buffers */
+ if (allocator && GST_IS_KMS_ALLOCATOR (allocator)) {
+ if (priv->allocator)
+ gst_object_unref (priv->allocator);
+ if ((priv->allocator = allocator))
+ gst_object_ref (allocator);
+ }
+ if (!priv->allocator)
+ goto no_allocator;
+
+ priv->vinfo = vinfo;
+
+ /* enable metadata based on config of the pool */
+ priv->add_videometa = gst_buffer_pool_config_has_option (config,
+ GST_BUFFER_POOL_OPTION_VIDEO_META);
+
+ return GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config);
+
+ /* ERRORS */
+wrong_config:
+ {
+ GST_WARNING_OBJECT (pool, "invalid config");
+ return FALSE;
+ }
+no_caps:
+ {
+ GST_WARNING_OBJECT (pool, "no caps in config");
+ return FALSE;
+ }
+wrong_caps:
+ {
+ GST_WARNING_OBJECT (pool,
+ "failed getting geometry from caps %" GST_PTR_FORMAT, caps);
+ return FALSE;
+ }
+no_allocator:
+ {
+ GST_WARNING_OBJECT (pool, "no valid allocator in pool");
+ return FALSE;
+ }
+}
+
+static GstFlowReturn
+gst_kms_buffer_pool_alloc_buffer (GstBufferPool * pool, GstBuffer ** buffer,
+ GstBufferPoolAcquireParams * params)
+{
+ GstKMSBufferPool *vpool;
+ GstKMSBufferPoolPrivate *priv;
+ GstVideoInfo *info;
+ GstMemory *mem;
+
+ vpool = GST_KMS_BUFFER_POOL_CAST (pool);
+ priv = vpool->priv;
+ info = &priv->vinfo;
+
+ *buffer = gst_buffer_new ();
+ if (*buffer == NULL)
+ goto no_memory;
+ mem = gst_kms_allocator_bo_alloc (priv->allocator, info);
+ if (!mem) {
+ gst_buffer_unref (*buffer);
+ goto no_memory;
+ }
+ gst_buffer_append_memory (*buffer, mem);
+
+ if (priv->add_videometa) {
+ GST_DEBUG_OBJECT (pool, "adding GstVideoMeta");
+
+ gst_buffer_add_video_meta_full (*buffer, GST_VIDEO_FRAME_FLAG_NONE,
+ GST_VIDEO_INFO_FORMAT (info),
+ GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info),
+ GST_VIDEO_INFO_N_PLANES (info), info->offset, info->stride);
+ }
+
+ return GST_FLOW_OK;
+
+ /* ERROR */
+no_memory:
+ {
+ GST_WARNING_OBJECT (pool, "can't create memory");
+ return GST_FLOW_ERROR;
+ }
+}
+
+static void
+gst_kms_buffer_pool_finalize (GObject * object)
+{
+ GstKMSBufferPool *pool;
+ GstKMSBufferPoolPrivate *priv;
+
+ pool = GST_KMS_BUFFER_POOL (object);
+ priv = pool->priv;
+
+ if (priv->allocator)
+ gst_object_unref (priv->allocator);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_kms_buffer_pool_init (GstKMSBufferPool * pool)
+{
+ pool->priv = gst_kms_buffer_pool_get_instance_private (pool);
+ pool->priv->fd = -1;
+}
+
+static void
+gst_kms_buffer_pool_class_init (GstKMSBufferPoolClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstBufferPoolClass *gstbufferpool_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstbufferpool_class = (GstBufferPoolClass *) klass;
+
+ gobject_class->finalize = gst_kms_buffer_pool_finalize;
+
+ gstbufferpool_class->get_options = gst_kms_buffer_pool_get_options;
+ gstbufferpool_class->set_config = gst_kms_buffer_pool_set_config;
+ gstbufferpool_class->alloc_buffer = gst_kms_buffer_pool_alloc_buffer;
+}
+
+GstBufferPool *
+gst_kms_buffer_pool_new (void)
+{
+ return g_object_new (GST_TYPE_KMS_BUFFER_POOL, NULL);
+}
diff --git a/sys/kms/gstkmsbufferpool.h b/sys/kms/gstkmsbufferpool.h
new file mode 100644
index 0000000..1ed9884
--- /dev/null
+++ b/sys/kms/gstkmsbufferpool.h
@@ -0,0 +1,75 @@
+/*
+ * GStreamer
+ * Copyright (C) 2016 Igalia
+ *
+ * Authors:
+ * Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+ * Javier Martin <javiermartin@by.com.es>
+ *
+ * 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_KMS_BUFFER_POOL_H__
+#define __GST_KMS_BUFFER_POOL_H__
+
+#include <gst/gst.h>
+#include <gst/video/video.h>
+
+#include "gstkmssink.h"
+
+G_BEGIN_DECLS
+
+/**
+ * GST_BUFFER_POOL_OPTION_KMS_BUFFER:
+ *
+ * An option that can be activated on buffer pool to request KMS
+ * buffers.
+ */
+#define GST_BUFFER_POOL_OPTION_KMS_BUFFER "GstBufferPoolOptionKMSBuffer"
+
+/* video bufferpool */
+typedef struct _GstKMSBufferPool GstKMSBufferPool;
+typedef struct _GstKMSBufferPoolClass GstKMSBufferPoolClass;
+typedef struct _GstKMSBufferPoolPrivate GstKMSBufferPoolPrivate;
+
+#define GST_TYPE_KMS_BUFFER_POOL \
+ (gst_kms_buffer_pool_get_type())
+#define GST_IS_KMS_BUFFER_POOL(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_KMS_BUFFER_POOL))
+#define GST_KMS_BUFFER_POOL(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_KMS_BUFFER_POOL, GstKMSBufferPool))
+#define GST_KMS_BUFFER_POOL_CAST(obj) \
+ ((GstKMSBufferPool*)(obj))
+
+struct _GstKMSBufferPool
+{
+ GstVideoBufferPool parent;
+ GstKMSBufferPoolPrivate *priv;
+};
+
+struct _GstKMSBufferPoolClass
+{
+ GstVideoBufferPoolClass parent_class;
+};
+
+GType gst_kms_buffer_pool_get_type (void) G_GNUC_CONST;
+
+GstBufferPool *gst_kms_buffer_pool_new (void);
+
+G_END_DECLS
+
+#endif /* __GST_KMS_BUFFER_POOL_H__ */
diff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
new file mode 100644
index 0000000..8508b0d
--- /dev/null
+++ b/sys/kms/gstkmssink.c
@@ -0,0 +1,1316 @@
+/* GStreamer
+ *
+ * Copyright (C) 2016 Igalia
+ *
+ * Authors:
+ * Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+ * Javier Martin <javiermartin@by.com.es>
+ *
+ * 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-kmssink
+ * @short_description: A KMS/DRM based video sink
+ *
+ * kmssink is a simple video sink that renders video frames directly
+ * in a plane of a DRM device.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 videotestsrc ! kmssink
+ * ]|
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/video/video.h>
+#include <gst/allocators/gstdmabuf.h>
+
+#include <drm.h>
+#include <xf86drm.h>
+#include <xf86drmMode.h>
+#include <drm_fourcc.h>
+
+#include <string.h>
+
+#include "gstkmssink.h"
+#include "gstkmsutils.h"
+#include "gstkmsbufferpool.h"
+#include "gstkmsallocator.h"
+
+#define GST_PLUGIN_NAME "kmssink"
+#define GST_PLUGIN_DESC "Video sink using the Linux kernel mode setting API"
+
+GST_DEBUG_CATEGORY_STATIC (gst_kms_sink_debug);
+GST_DEBUG_CATEGORY_STATIC (CAT_PERFORMANCE);
+#define GST_CAT_DEFAULT gst_kms_sink_debug
+
+#define parent_class gst_kms_sink_parent_class
+G_DEFINE_TYPE_WITH_CODE (GstKMSSink, gst_kms_sink, GST_TYPE_VIDEO_SINK,
+ GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, GST_PLUGIN_NAME, 0,
+ GST_PLUGIN_DESC);
+ GST_DEBUG_CATEGORY_GET (CAT_PERFORMANCE, "GST_PERFORMANCE"));
+
+enum
+{
+ PROP_DRIVER_NAME = 1,
+ PROP_CONNECTOR_ID,
+ PROP_PLANE_ID,
+ PROP_N
+};
+
+static GParamSpec *g_properties[PROP_N] = { NULL, };
+
+static int
+kms_open (gchar ** driver)
+{
+ static const char *drivers[] = { "i915", "radeon", "nouveau", "vmwgfx",
+ "exynos", "amdgpu", "imx-drm", "rockchip", "atmel-hlcdc"
+ };
+ int i, fd = -1;
+
+ for (i = 0; i < G_N_ELEMENTS (drivers); i++) {
+ fd = drmOpen (drivers[i], NULL);
+ if (fd >= 0) {
+ if (driver)
+ *driver = g_strdup (drivers[i]);
+ break;
+ }
+ }
+
+ return fd;
+}
+
+static drmModePlane *
+find_plane_for_crtc (int fd, drmModeRes * res, drmModePlaneRes * pres,
+ int crtc_id)
+{
+ drmModePlane *plane;
+ int i, pipe;
+
+ plane = NULL;
+ pipe = -1;
+ for (i = 0; i < res->count_crtcs; i++) {
+ if (crtc_id == res->crtcs[i]) {
+ pipe = i;
+ break;
+ }
+ }
+
+ if (pipe == -1)
+ return NULL;
+
+ for (i = 0; i < pres->count_planes; i++) {
+ plane = drmModeGetPlane (fd, pres->planes[i]);
+ if (plane->possible_crtcs & (1 << pipe))
+ return plane;
+ drmModeFreePlane (plane);
+ }
+
+ return NULL;
+}
+
+static drmModeCrtc *
+find_crtc_for_connector (int fd, drmModeRes * res, drmModeConnector * conn,
+ guint * pipe)
+{
+ int i;
+ int crtc_id;
+ drmModeEncoder *enc;
+ drmModeCrtc *crtc;
+
+ crtc_id = -1;
+ for (i = 0; i < res->count_encoders; i++) {
+ enc = drmModeGetEncoder (fd, res->encoders[i]);
+ if (enc) {
+ if (enc->encoder_id == conn->encoder_id) {
+ crtc_id = enc->crtc_id;
+ drmModeFreeEncoder (enc);
+ break;
+ }
+ drmModeFreeEncoder (enc);
+ }
+ }
+
+ if (crtc_id == -1)
+ return NULL;
+
+ for (i = 0; i < res->count_crtcs; i++) {
+ crtc = drmModeGetCrtc (fd, res->crtcs[i]);
+ if (crtc) {
+ if (crtc_id == crtc->crtc_id) {
+ if (pipe)
+ *pipe = i;
+ return crtc;
+ }
+ drmModeFreeCrtc (crtc);
+ }
+ }
+
+ return NULL;
+}
+
+static gboolean
+connector_is_used (int fd, drmModeRes * res, drmModeConnector * conn)
+{
+ gboolean result;
+ drmModeCrtc *crtc;
+
+ result = FALSE;
+ crtc = find_crtc_for_connector (fd, res, conn, NULL);
+ if (crtc) {
+ result = crtc->buffer_id != 0;
+ drmModeFreeCrtc (crtc);
+ }
+
+ return result;
+}
+
+static drmModeConnector *
+find_used_connector_by_type (int fd, drmModeRes * res, int type)
+{
+ int i;
+ drmModeConnector *conn;
+
+ conn = NULL;
+ for (i = 0; i < res->count_connectors; i++) {
+ conn = drmModeGetConnector (fd, res->connectors[i]);
+ if (conn) {
+ if ((conn->connector_type == type) && connector_is_used (fd, res, conn))
+ return conn;
+ drmModeFreeConnector (conn);
+ }
+ }
+
+ return NULL;
+}
+
+static drmModeConnector *
+find_first_used_connector (int fd, drmModeRes * res)
+{
+ int i;
+ drmModeConnector *conn;
+
+ conn = NULL;
+ for (i = 0; i < res->count_connectors; i++) {
+ conn = drmModeGetConnector (fd, res->connectors[i]);
+ if (conn) {
+ if (connector_is_used (fd, res, conn))
+ return conn;
+ drmModeFreeConnector (conn);
+ }
+ }
+
+ return NULL;
+}
+
+static drmModeConnector *
+find_main_monitor (int fd, drmModeRes * res)
+{
+ /* Find the LVDS and eDP connectors: those are the main screens. */
+ static const int priority[] = { DRM_MODE_CONNECTOR_LVDS,
+ DRM_MODE_CONNECTOR_eDP
+ };
+ int i;
+ drmModeConnector *conn;
+
+ conn = NULL;
+ for (i = 0; !conn && i < G_N_ELEMENTS (priority); i++)
+ conn = find_used_connector_by_type (fd, res, priority[i]);
+
+ /* if we didn't find a connector, grab the first one in use */
+ if (!conn)
+ conn = find_first_used_connector (fd, res);
+
+ return conn;
+}
+
+static void
+log_drm_version (GstKMSSink * self)
+{
+#ifndef GST_DISABLE_GST_DEBUG
+ drmVersion *v;
+
+ v = drmGetVersion (self->fd);
+ if (v) {
+ GST_INFO_OBJECT (self, "DRM v%d.%d.%d [%s — %s — %s]", v->version_major,
+ v->version_minor, v->version_patchlevel, GST_STR_NULL (v->name),
+ GST_STR_NULL (v->desc), GST_STR_NULL (v->date));
+ drmFreeVersion (v);
+ } else {
+ GST_WARNING_OBJECT (self, "could not get driver information: %s",
+ GST_STR_NULL (self->devname));
+ }
+#endif
+ return;
+}
+
+static gboolean
+get_drm_caps (GstKMSSink * self)
+{
+ gint ret;
+ guint64 has_dumb_buffer;
+ guint64 has_prime;
+ guint64 has_async_page_flip;
+
+ has_dumb_buffer = 0;
+ ret = drmGetCap (self->fd, DRM_CAP_DUMB_BUFFER, &has_dumb_buffer);
+ if (ret)
+ GST_WARNING_OBJECT (self, "could not get dumb buffer capability");
+ if (has_dumb_buffer == 0) {
+ GST_ERROR_OBJECT (self, "driver cannot handle dumb buffers");
+ return FALSE;
+ }
+
+ has_prime = 0;
+ ret = drmGetCap (self->fd, DRM_CAP_PRIME, &has_prime);
+ if (ret)
+ GST_WARNING_OBJECT (self, "could not get prime capability");
+ else
+ self->has_prime_import = (gboolean) (has_prime & DRM_PRIME_CAP_IMPORT);
+
+ has_async_page_flip = 0;
+ ret = drmGetCap (self->fd, DRM_CAP_ASYNC_PAGE_FLIP, &has_async_page_flip);
+ if (ret)
+ GST_WARNING_OBJECT (self, "could not get async page flip capability");
+ else
+ self->has_async_page_flip = (gboolean) has_async_page_flip;
+
+ GST_INFO_OBJECT (self, "prime import (%s) / async page flip (%s)",
+ self->has_prime_import ? "✓" : "✗",
+ self->has_async_page_flip ? "✓" : "✗");
+
+ return TRUE;
+}
+
+static gboolean
+ensure_allowed_caps (GstKMSSink * self, drmModePlane * plane, drmModeRes * res)
+{
+ GstCaps *out_caps, *caps;
+ int i;
+ GstVideoFormat fmt;
+ const gchar *format;
+
+ if (self->allowed_caps)
+ return TRUE;
+
+ out_caps = gst_caps_new_empty ();
+ if (!out_caps)
+ return FALSE;
+
+ for (i = 0; i < plane->count_formats; i++) {
+ fmt = gst_video_format_from_drm (plane->formats[i]);
+ if (fmt == GST_VIDEO_FORMAT_UNKNOWN) {
+ GST_INFO_OBJECT (self, "ignoring format %" GST_FOURCC_FORMAT,
+ GST_FOURCC_ARGS (plane->formats[i]));
+ continue;
+ }
+
+ format = gst_video_format_to_string (fmt);
+ caps = gst_caps_new_simple ("video/x-raw", "format", G_TYPE_STRING, format,
+ "width", GST_TYPE_INT_RANGE, res->min_width, res->max_width,
+ "height", GST_TYPE_INT_RANGE, res->min_height, res->max_height,
+ "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
+ if (!caps)
+ continue;
+
+ out_caps = gst_caps_merge (out_caps, caps);
+ }
+
+ self->allowed_caps = gst_caps_simplify (out_caps);
+
+ GST_DEBUG_OBJECT (self, "allowed caps = %" GST_PTR_FORMAT,
+ self->allowed_caps);
+
+ return TRUE;
+}
+
+static gboolean
+gst_kms_sink_start (GstBaseSink * bsink)
+{
+ GstKMSSink *self;
+ drmModeRes *res;
+ drmModeConnector *conn;
+ drmModeCrtc *crtc;
+ drmModePlaneRes *pres;
+ drmModePlane *plane;
+ gboolean universal_planes;
+ gboolean ret;
+
+ self = GST_KMS_SINK (bsink);
+ universal_planes = FALSE;
+ ret = FALSE;
+ res = NULL;
+ conn = NULL;
+ crtc = NULL;
+ pres = NULL;
+ plane = NULL;
+
+ if (self->devname)
+ self->fd = drmOpen (self->devname, NULL);
+ else
+ self->fd = kms_open (&self->devname);
+ if (self->fd < 0)
+ goto open_failed;
+
+ log_drm_version (self);
+ if (!get_drm_caps (self))
+ goto bail;
+
+ res = drmModeGetResources (self->fd);
+ if (!res)
+ goto resources_failed;
+
+ if (self->conn_id == -1)
+ conn = find_main_monitor (self->fd, res);
+ else
+ conn = drmModeGetConnector (self->fd, self->conn_id);
+ if (!conn)
+ goto connector_failed;
+
+ crtc = find_crtc_for_connector (self->fd, res, conn, &self->pipe);
+ if (!crtc)
+ goto crtc_failed;
+
+retry_find_plane:
+ if (universal_planes &&
+ drmSetClientCap (self->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1))
+ goto set_cap_failed;
+
+ pres = drmModeGetPlaneResources (self->fd);
+ if (!pres)
+ goto plane_resources_failed;
+
+ if (self->plane_id == -1)
+ plane = find_plane_for_crtc (self->fd, res, pres, crtc->crtc_id);
+ else
+ plane = drmModeGetPlane (self->fd, self->plane_id);
+ if (!plane)
+ goto plane_failed;
+
+ /* let's get the available color formats in plane */
+ if (!ensure_allowed_caps (self, plane, res))
+ goto bail;
+
+ self->conn_id = conn->connector_id;
+ self->crtc_id = crtc->crtc_id;
+ self->plane_id = plane->plane_id;
+
+ GST_INFO_OBJECT (self, "connector id = %d / crtc id = %d / plane id = %d",
+ self->conn_id, self->crtc_id, self->plane_id);
+
+ self->hdisplay = crtc->mode.hdisplay;
+ self->vdisplay = crtc->mode.vdisplay;
+ self->buffer_id = crtc->buffer_id;
+
+ self->mm_width = conn->mmWidth;
+ self->mm_height = conn->mmHeight;
+
+ GST_INFO_OBJECT (self, "display size: pixels = %dx%d / millimeters = %dx%d",
+ self->hdisplay, self->vdisplay, self->mm_width, self->mm_height);
+
+ self->pollfd.fd = self->fd;
+ gst_poll_add_fd (self->poll, &self->pollfd);
+ gst_poll_fd_ctl_read (self->poll, &self->pollfd, TRUE);
+
+ ret = TRUE;
+
+bail:
+ if (plane)
+ drmModeFreePlane (plane);
+ if (pres)
+ drmModeFreePlaneResources (pres);
+ if (crtc)
+ drmModeFreeCrtc (crtc);
+ if (conn)
+ drmModeFreeConnector (conn);
+ if (res)
+ drmModeFreeResources (res);
+
+ if (!ret && self->fd >= 0) {
+ drmClose (self->fd);
+ self->fd = -1;
+ }
+
+ return ret;
+
+ /* ERRORS */
+open_failed:
+ {
+ GST_ERROR_OBJECT (self, "Could not open DRM module %s: %s",
+ GST_STR_NULL (self->devname), strerror (errno));
+ return FALSE;
+ }
+
+resources_failed:
+ {
+ GST_ERROR_OBJECT (self, "drmModeGetResources failed: %s (%d)",
+ strerror (errno), errno);
+ goto bail;
+ }
+
+connector_failed:
+ {
+ GST_ERROR_OBJECT (self, "Could not find a valid monitor connector");
+ goto bail;
+ }
+
+crtc_failed:
+ {
+ GST_ERROR_OBJECT (self, "Could not find a crtc for connector");
+ goto bail;
+ }
+
+set_cap_failed:
+ {
+ GST_ERROR_OBJECT (self, "Could not set universal planes capability bit");
+ goto bail;
+ }
+
+plane_resources_failed:
+ {
+ GST_ERROR_OBJECT (self, "drmModeGetPlaneResources failed: %s (%d)",
+ strerror (errno), errno);
+ goto bail;
+ }
+
+plane_failed:
+ {
+ if (universal_planes) {
+ GST_ERROR_OBJECT (self, "Could not find a plane for crtc");
+ goto bail;
+ } else {
+ universal_planes = TRUE;
+ goto retry_find_plane;
+ }
+ }
+}
+
+static gboolean
+gst_kms_sink_stop (GstBaseSink * bsink)
+{
+ GstKMSSink *self;
+
+ self = GST_KMS_SINK (bsink);
+
+ gst_buffer_replace (&self->last_buffer, NULL);
+ gst_caps_replace (&self->allowed_caps, NULL);
+ gst_object_replace ((GstObject **) & self->pool, NULL);
+ gst_object_replace ((GstObject **) & self->allocator, NULL);
+
+ gst_poll_remove_fd (self->poll, &self->pollfd);
+ gst_poll_restart (self->poll);
+ gst_poll_fd_init (&self->pollfd);
+
+ if (self->fd >= 0) {
+ drmClose (self->fd);
+ self->fd = -1;
+ }
+
+ return TRUE;
+}
+
+static GstCaps *
+gst_kms_sink_get_allowed_caps (GstKMSSink * self)
+{
+ if (!self->allowed_caps)
+ return NULL; /* base class will return the template caps */
+ return gst_caps_ref (self->allowed_caps);
+}
+
+static GstCaps *
+gst_kms_sink_get_caps (GstBaseSink * bsink, GstCaps * filter)
+{
+ GstKMSSink *self;
+ GstCaps *caps, *out_caps;
+
+ self = GST_KMS_SINK (bsink);
+
+ caps = gst_kms_sink_get_allowed_caps (self);
+ if (caps && filter) {
+ out_caps = gst_caps_intersect_full (caps, filter, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (caps);
+ } else {
+ out_caps = caps;
+ }
+
+ return out_caps;
+}
+
+static void
+ensure_kms_allocator (GstKMSSink * self)
+{
+ if (self->allocator)
+ return;
+ self->allocator = gst_kms_allocator_new (self->fd);
+}
+
+static GstBufferPool *
+gst_kms_sink_create_pool (GstKMSSink * self, GstCaps * caps, gsize size,
+ gint min)
+{
+ GstBufferPool *pool;
+ GstStructure *config;
+
+ pool = gst_kms_buffer_pool_new ();
+ if (!pool)
+ goto pool_failed;
+
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_set_params (config, caps, size, min, 0);
+ gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META);
+
+ ensure_kms_allocator (self);
+ gst_buffer_pool_config_set_allocator (config, self->allocator, NULL);
+
+ if (!gst_buffer_pool_set_config (pool, config))
+ goto config_failed;
+
+ return pool;
+
+ /* ERRORS */
+pool_failed:
+ {
+ GST_ERROR_OBJECT (self, "failed to create buffer pool");
+ return NULL;
+ }
+config_failed:
+ {
+ GST_ERROR_OBJECT (self, "failed to set config");
+ gst_object_unref (pool);
+ return NULL;
+ }
+}
+
+static gboolean
+gst_kms_sink_calculate_display_ratio (GstKMSSink * self, GstVideoInfo * vinfo)
+{
+ guint dar_n, dar_d;
+ guint video_width, video_height;
+ guint video_par_n, video_par_d;
+ guint dpy_par_n, dpy_par_d;
+
+ video_width = GST_VIDEO_INFO_WIDTH (vinfo);
+ video_height = GST_VIDEO_INFO_HEIGHT (vinfo);
+ video_par_n = GST_VIDEO_INFO_PAR_N (vinfo);
+ video_par_d = GST_VIDEO_INFO_PAR_D (vinfo);
+
+ gst_video_calculate_device_ratio (self->hdisplay, self->vdisplay,
+ self->mm_width, self->mm_height, &dpy_par_n, &dpy_par_d);
+
+ if (!gst_video_calculate_display_ratio (&dar_n, &dar_d, video_width,
+ video_height, video_par_n, video_par_d, dpy_par_n, dpy_par_d))
+ return FALSE;
+
+ GST_DEBUG_OBJECT (self, "video calculated display ratio: %d/%d", dar_n,
+ dar_d);
+
+ /* now find a width x height that respects this display ratio.
+ * prefer those that have one of w/h the same as the incoming video
+ * using wd / hd = dar_n / dar_d */
+
+ /* start with same height, because of interlaced video */
+ /* check hd / dar_d is an integer scale factor, and scale wd with the PAR */
+ if (video_height % dar_d == 0) {
+ GST_DEBUG_OBJECT (self, "keeping video height");
+ GST_VIDEO_SINK_WIDTH (self) = (guint)
+ gst_util_uint64_scale_int (video_height, dar_n, dar_d);
+ GST_VIDEO_SINK_HEIGHT (self) = video_height;
+ } else if (video_width % dar_n == 0) {
+ GST_DEBUG_OBJECT (self, "keeping video width");
+ GST_VIDEO_SINK_WIDTH (self) = video_width;
+ GST_VIDEO_SINK_HEIGHT (self) = (guint)
+ gst_util_uint64_scale_int (video_width, dar_d, dar_n);
+ } else {
+ GST_DEBUG_OBJECT (self, "approximating while keeping video height");
+ GST_VIDEO_SINK_WIDTH (self) = (guint)
+ gst_util_uint64_scale_int (video_height, dar_n, dar_d);
+ GST_VIDEO_SINK_HEIGHT (self) = video_height;
+ }
+ GST_DEBUG_OBJECT (self, "scaling to %dx%d", GST_VIDEO_SINK_WIDTH (self),
+ GST_VIDEO_SINK_HEIGHT (self));
+
+ return TRUE;
+}
+
+static gboolean
+gst_kms_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
+{
+ GstKMSSink *self;
+ GstVideoInfo vinfo;
+ GstBufferPool *newpool, *oldpool;
+
+ self = GST_KMS_SINK (bsink);
+
+ if (!gst_video_info_from_caps (&vinfo, caps))
+ goto invalid_format;
+
+ if (!gst_kms_sink_calculate_display_ratio (self, &vinfo))
+ goto no_disp_ratio;
+
+ if (GST_VIDEO_SINK_WIDTH (self) <= 0 || GST_VIDEO_SINK_HEIGHT (self) <= 0)
+ goto invalid_size;
+
+ /* create a new pool for the new configuration */
+ newpool = gst_kms_sink_create_pool (self, caps, GST_VIDEO_INFO_SIZE (&vinfo),
+ 2);
+ if (!newpool)
+ goto no_pool;
+
+ /* we don't activate the internal pool yet as it may not be needed */
+ oldpool = self->pool;
+ self->pool = newpool;
+
+ if (oldpool) {
+ gst_buffer_pool_set_active (oldpool, FALSE);
+ gst_object_unref (oldpool);
+ }
+
+ self->vinfo = vinfo;
+
+ GST_DEBUG_OBJECT (self, "negotiated caps = %" GST_PTR_FORMAT, caps);
+
+ return TRUE;
+
+ /* ERRORS */
+invalid_format:
+ {
+ GST_ERROR_OBJECT (self, "caps invalid");
+ return FALSE;
+ }
+
+invalid_size:
+ {
+ GST_ELEMENT_ERROR (self, CORE, NEGOTIATION, (NULL),
+ ("Invalid image size."));
+ return FALSE;
+ }
+
+no_disp_ratio:
+ {
+ GST_ELEMENT_ERROR (self, CORE, NEGOTIATION, (NULL),
+ ("Error calculating the output display ratio of the video."));
+ return FALSE;
+ }
+no_pool:
+ {
+ /* Already warned in create_pool */
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_kms_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
+{
+ GstKMSSink *self;
+ GstCaps *caps;
+ gboolean need_pool;
+ GstVideoInfo vinfo;
+ GstBufferPool *pool;
+ gsize size;
+
+ self = GST_KMS_SINK (bsink);
+
+ gst_query_parse_allocation (query, &caps, &need_pool);
+ if (!caps)
+ goto no_caps;
+ if (!gst_video_info_from_caps (&vinfo, caps))
+ goto invalid_caps;
+
+ size = GST_VIDEO_INFO_SIZE (&vinfo);
+
+ pool = NULL;
+ if (need_pool) {
+ pool = gst_kms_sink_create_pool (self, caps, size, 0);
+ if (!pool)
+ goto no_pool;
+ }
+
+ if (pool) {
+ /* we need at least 2 buffer because we hold on to the last one */
+ gst_query_add_allocation_pool (query, pool, size, 2, 0);
+ gst_object_unref (pool);
+ }
+
+ gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL);
+ gst_query_add_allocation_meta (query, GST_VIDEO_CROP_META_API_TYPE, NULL);
+
+ return TRUE;
+
+ /* ERRORS */
+no_caps:
+ {
+ GST_DEBUG_OBJECT (bsink, "no caps specified");
+ return FALSE;
+ }
+invalid_caps:
+ {
+ GST_DEBUG_OBJECT (bsink, "invalid caps specified");
+ return FALSE;
+ }
+no_pool:
+ {
+ /* Already warned in create_pool */
+ return FALSE;
+ }
+}
+
+static void
+gst_kms_sink_get_times (GstBaseSink * bsink, GstBuffer * buf,
+ GstClockTime * start, GstClockTime * end)
+{
+ GstKMSSink *self;
+
+ self = GST_KMS_SINK (bsink);
+
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
+ *start = GST_BUFFER_TIMESTAMP (buf);
+ if (GST_BUFFER_DURATION_IS_VALID (buf))
+ *end = *start + GST_BUFFER_DURATION (buf);
+ else {
+ if (GST_VIDEO_INFO_FPS_N (&self->vinfo) > 0) {
+ *end = *start +
+ gst_util_uint64_scale_int (GST_SECOND,
+ GST_VIDEO_INFO_FPS_D (&self->vinfo),
+ GST_VIDEO_INFO_FPS_N (&self->vinfo));
+ }
+ }
+ }
+}
+
+static void
+sync_handler (gint fd, guint frame, guint sec, guint usec, gpointer data)
+{
+ gboolean *waiting;
+
+ waiting = data;
+ *waiting = FALSE;
+}
+
+static gboolean
+gst_kms_sink_sync (GstKMSSink * self)
+{
+ gint ret;
+ gboolean waiting;
+ drmEventContext evctxt = {
+ .version = DRM_EVENT_CONTEXT_VERSION,
+ .page_flip_handler = sync_handler,
+ .vblank_handler = sync_handler,
+ };
+ drmVBlank vbl = {
+ .request = {
+ .type = DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT,
+ .sequence = 1,
+ .signal = (gulong) & waiting,
+ },
+ };
+
+ if (self->pipe == 1)
+ vbl.request.type |= DRM_VBLANK_SECONDARY;
+ else if (self->pipe > 1)
+ vbl.request.type |= self->pipe << DRM_VBLANK_HIGH_CRTC_SHIFT;
+
+ waiting = TRUE;
+ if (!self->has_async_page_flip) {
+ ret = drmWaitVBlank (self->fd, &vbl);
+ if (ret)
+ goto vblank_failed;
+ } else {
+ ret = drmModePageFlip (self->fd, self->crtc_id, self->buffer_id,
+ DRM_MODE_PAGE_FLIP_EVENT, &waiting);
+ if (ret)
+ goto pageflip_failed;
+ }
+
+ while (waiting) {
+ do {
+ ret = gst_poll_wait (self->poll, 3 * GST_SECOND);
+ } while (ret == -1 && (errno == EAGAIN || errno == EINTR));
+
+ ret = drmHandleEvent (self->fd, &evctxt);
+ if (ret)
+ goto event_failed;
+ }
+
+ return TRUE;
+
+ /* ERRORS */
+vblank_failed:
+ {
+ GST_WARNING_OBJECT (self, "drmWaitVBlank failed: %s (%d)", strerror (-ret),
+ ret);
+ return FALSE;
+ }
+pageflip_failed:
+ {
+ GST_WARNING_OBJECT (self, "drmModePageFlip failed: %s (%d)",
+ strerror (-ret), ret);
+ return FALSE;
+ }
+event_failed:
+ {
+ GST_ERROR_OBJECT (self, "drmHandleEvent failed: %s (%d)", strerror (-ret),
+ ret);
+ return FALSE;
+ }
+}
+
+static GstMemory *
+get_cached_kmsmem (GstMemory * mem)
+{
+ return gst_mini_object_get_qdata (GST_MINI_OBJECT (mem),
+ g_quark_from_static_string ("kmsmem"));
+}
+
+static void
+set_cached_kmsmem (GstMemory * mem, GstMemory * kmsmem)
+{
+ return gst_mini_object_set_qdata (GST_MINI_OBJECT (mem),
+ g_quark_from_static_string ("kmsmem"), kmsmem,
+ (GDestroyNotify) gst_memory_unref);
+}
+
+static gboolean
+gst_kms_sink_import_dmabuf (GstKMSSink * self, GstBuffer * inbuf,
+ GstBuffer ** outbuf)
+{
+ gint prime_fds[GST_VIDEO_MAX_PLANES] = { 0, };
+ GstVideoMeta *meta;
+ guint i, n_mem, n_planes;
+ GstKMSMemory *kmsmem;
+ guint mems_idx[GST_VIDEO_MAX_PLANES];
+ gsize mems_skip[GST_VIDEO_MAX_PLANES];
+ GstMemory *mems[GST_VIDEO_MAX_PLANES];
+
+ if (!self->has_prime_import)
+ return FALSE;
+
+ /* This will eliminate most non-dmabuf out there */
+ if (!gst_is_dmabuf_memory (gst_buffer_peek_memory (inbuf, 0)))
+ return FALSE;
+
+ n_planes = GST_VIDEO_INFO_N_PLANES (&self->vinfo);
+ n_mem = gst_buffer_n_memory (inbuf);
+ meta = gst_buffer_get_video_meta (inbuf);
+
+ GST_TRACE_OBJECT (self, "Found a dmabuf with %u planes and %u memories",
+ n_planes, n_mem);
+
+ /* We cannot have multiple dmabuf per plane */
+ if (n_mem > n_planes)
+ return FALSE;
+
+ /* Update video info based on video meta */
+ if (meta) {
+ GST_VIDEO_INFO_WIDTH (&self->vinfo) = meta->width;
+ GST_VIDEO_INFO_HEIGHT (&self->vinfo) = meta->height;
+
+ for (i = 0; i < meta->n_planes; i++) {
+ GST_VIDEO_INFO_PLANE_OFFSET (&self->vinfo, i) = meta->offset[i];
+ GST_VIDEO_INFO_PLANE_STRIDE (&self->vinfo, i) = meta->stride[i];
+ }
+ }
+
+ /* Find and validate all memories */
+ for (i = 0; i < n_planes; i++) {
+ guint length;
+
+ if (!gst_buffer_find_memory (inbuf,
+ GST_VIDEO_INFO_PLANE_OFFSET (&self->vinfo, i), 1,
+ &mems_idx[i], &length, &mems_skip[i]))
+ return FALSE;
+
+ mems[i] = gst_buffer_peek_memory (inbuf, mems_idx[i]);
+
+ /* And all memory found must be dmabuf */
+ if (!gst_is_dmabuf_memory (mems[i]))
+ return FALSE;
+ }
+
+ kmsmem = (GstKMSMemory *) get_cached_kmsmem (mems[0]);
+ if (kmsmem) {
+ GST_LOG_OBJECT (self, "found KMS mem %p in DMABuf mem %p with fb id = %d",
+ kmsmem, mems[0], kmsmem->fb_id);
+ goto wrap_mem;
+ }
+
+ for (i = 0; i < n_planes; i++)
+ prime_fds[i] = gst_dmabuf_memory_get_fd (mems[i]);
+
+ GST_LOG_OBJECT (self, "found these prime ids: %d, %d, %d, %d", prime_fds[0],
+ prime_fds[1], prime_fds[2], prime_fds[3]);
+
+ kmsmem = gst_kms_allocator_dmabuf_import (self->allocator, prime_fds,
+ n_planes, mems_skip, &self->vinfo);
+ if (!kmsmem)
+ return FALSE;
+
+ GST_LOG_OBJECT (self, "setting KMS mem %p to DMABuf mem %p with fb id = %d",
+ kmsmem, mems[0], kmsmem->fb_id);
+ set_cached_kmsmem (mems[0], GST_MEMORY_CAST (kmsmem));
+
+wrap_mem:
+ *outbuf = gst_buffer_new ();
+ if (!*outbuf)
+ return FALSE;
+ gst_buffer_append_memory (*outbuf, gst_memory_ref (GST_MEMORY_CAST (kmsmem)));
+ gst_buffer_add_parent_buffer_meta (*outbuf, inbuf);
+
+ return TRUE;
+}
+
+static GstBuffer *
+gst_kms_sink_get_input_buffer (GstKMSSink * self, GstBuffer * inbuf)
+{
+ GstMemory *mem;
+ GstBuffer *buf;
+ GstFlowReturn ret;
+ GstVideoFrame inframe, outframe;
+ gboolean success;
+
+ mem = gst_buffer_peek_memory (inbuf, 0);
+ if (!mem)
+ return NULL;
+
+ if (gst_is_kms_memory (mem))
+ return gst_buffer_ref (inbuf);
+
+ buf = NULL;
+ if (gst_kms_sink_import_dmabuf (self, inbuf, &buf))
+ return buf;
+
+ GST_CAT_INFO_OBJECT (CAT_PERFORMANCE, self, "frame copy");
+
+ if (!gst_buffer_pool_set_active (self->pool, TRUE))
+ goto activate_pool_failed;
+
+ ret = gst_buffer_pool_acquire_buffer (self->pool, &buf, NULL);
+ if (ret != GST_FLOW_OK)
+ goto create_buffer_failed;
+
+ if (!gst_video_frame_map (&inframe, &self->vinfo, inbuf, GST_MAP_READ))
+ goto error_map_src_buffer;
+
+ if (!gst_video_frame_map (&outframe, &self->vinfo, buf, GST_MAP_WRITE))
+ goto error_map_dst_buffer;
+
+ success = gst_video_frame_copy (&outframe, &inframe);
+ gst_video_frame_unmap (&outframe);
+ gst_video_frame_unmap (&inframe);
+ if (!success)
+ goto error_copy_buffer;
+
+ return buf;
+
+bail:
+ {
+ if (buf)
+ gst_buffer_unref (buf);
+ return NULL;
+ }
+
+ /* ERRORS */
+activate_pool_failed:
+ {
+ GST_ELEMENT_ERROR (self, STREAM, FAILED, ("failed to activate buffer pool"),
+ ("failed to activate buffer pool"));
+ goto bail;
+ }
+create_buffer_failed:
+ {
+ GST_ELEMENT_ERROR (self, STREAM, FAILED, ("allocation failed"),
+ ("failed to create buffer"));
+ goto bail;
+ }
+error_copy_buffer:
+ {
+ GST_WARNING_OBJECT (self, "failed to upload buffer");
+ goto bail;
+ }
+error_map_dst_buffer:
+ {
+ gst_video_frame_unmap (&inframe);
+ /* fall-through */
+ }
+error_map_src_buffer:
+ {
+ GST_WARNING_OBJECT (self, "failed to map buffer");
+ goto bail;
+ }
+}
+
+static GstFlowReturn
+gst_kms_sink_show_frame (GstVideoSink * vsink, GstBuffer * buf)
+{
+ gint ret;
+ GstBuffer *buffer;
+ guint32 fb_id;
+ GstKMSSink *self;
+ GstVideoCropMeta *crop;
+ GstVideoRectangle src = { 0, };
+ GstVideoRectangle dst = { 0, };
+ GstVideoRectangle result;
+ GstFlowReturn res;
+
+ self = GST_KMS_SINK (vsink);
+
+ res = GST_FLOW_ERROR;
+
+ buffer = gst_kms_sink_get_input_buffer (self, buf);
+ if (!buffer)
+ return GST_FLOW_ERROR;
+ fb_id = gst_kms_memory_get_fb_id (gst_buffer_peek_memory (buffer, 0));
+ if (fb_id == 0)
+ goto buffer_invalid;
+
+ GST_TRACE_OBJECT (self, "displaying fb %d", fb_id);
+
+ if ((crop = gst_buffer_get_video_crop_meta (buffer))) {
+ GstVideoInfo vinfo = self->vinfo;
+ vinfo.width = crop->width;
+ vinfo.height = crop->height;
+
+ if (!gst_kms_sink_calculate_display_ratio (self, &vinfo))
+ goto no_disp_ratio;
+
+ src.x = crop->x;
+ src.y = crop->y;
+ }
+
+ src.w = GST_VIDEO_SINK_WIDTH (self);
+ src.h = GST_VIDEO_SINK_HEIGHT (self);
+
+ dst.w = self->hdisplay;
+ dst.h = self->vdisplay;
+
+ gst_video_sink_center_rect (src, dst, &result, TRUE);
+
+ if (crop) {
+ src.w = crop->width;
+ src.h = crop->height;
+ } else {
+ src.w = GST_VIDEO_INFO_WIDTH (&self->vinfo);
+ src.h = GST_VIDEO_INFO_HEIGHT (&self->vinfo);
+ }
+
+ GST_TRACE_OBJECT (self,
+ "drmModeSetPlane at (%i,%i) %ix%i sourcing at (%i,%i) %ix%i",
+ result.x, result.y, result.w, result.h, src.x, src.y, src.w, src.h);
+
+ ret = drmModeSetPlane (self->fd, self->plane_id, self->crtc_id, fb_id, 0,
+ result.x, result.y, result.w, result.h,
+ /* source/cropping coordinates are given in Q16 */
+ src.x << 16, src.y << 16, src.w << 16, src.h << 16);
+ if (ret)
+ goto set_plane_failed;
+
+ /* Wait for the previous frame to complete redraw */
+ if (!gst_kms_sink_sync (self))
+ goto bail;
+
+ gst_buffer_replace (&self->last_buffer, buffer);
+
+ res = GST_FLOW_OK;
+
+bail:
+ gst_buffer_unref (buffer);
+ return res;
+
+ /* ERRORS */
+buffer_invalid:
+ {
+ GST_ERROR_OBJECT (self, "invalid buffer: it doesn't have a fb id");
+ goto bail;
+ }
+set_plane_failed:
+ {
+ GST_DEBUG_OBJECT (self, "result = { %d, %d, %d, %d} / "
+ "src = { %d, %d, %d %d } / dst = { %d, %d, %d %d }", result.x, result.y,
+ result.w, result.h, src.x, src.y, src.w, src.h, dst.x, dst.y, dst.w,
+ dst.h);
+ GST_ELEMENT_ERROR (self, RESOURCE, FAILED,
+ (NULL), ("drmModeSetPlane failed: %s (%d)", strerror (-ret), ret));
+ goto bail;
+ }
+no_disp_ratio:
+ {
+ GST_ELEMENT_ERROR (self, CORE, NEGOTIATION, (NULL),
+ ("Error calculating the output display ratio of the video."));
+ goto bail;
+ }
+}
+
+static void
+gst_kms_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstKMSSink *sink;
+
+ sink = GST_KMS_SINK (object);
+
+ switch (prop_id) {
+ case PROP_DRIVER_NAME:
+ sink->devname = g_value_dup_string (value);
+ break;
+ case PROP_CONNECTOR_ID:
+ sink->conn_id = g_value_get_int (value);
+ break;
+ case PROP_PLANE_ID:
+ sink->plane_id = g_value_get_int (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_kms_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstKMSSink *sink;
+
+ sink = GST_KMS_SINK (object);
+
+ switch (prop_id) {
+ case PROP_DRIVER_NAME:
+ g_value_take_string (value, sink->devname);
+ break;
+ case PROP_CONNECTOR_ID:
+ g_value_set_int (value, sink->conn_id);
+ break;
+ case PROP_PLANE_ID:
+ g_value_set_int (value, sink->plane_id);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_kms_sink_finalize (GObject * object)
+{
+ GstKMSSink *sink;
+
+ sink = GST_KMS_SINK (object);
+ g_clear_pointer (&sink->devname, g_free);
+ gst_poll_free (sink->poll);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_kms_sink_init (GstKMSSink * sink)
+{
+ sink->fd = -1;
+ sink->conn_id = -1;
+ sink->plane_id = -1;
+ gst_poll_fd_init (&sink->pollfd);
+ sink->poll = gst_poll_new (TRUE);
+ gst_video_info_init (&sink->vinfo);
+}
+
+static void
+gst_kms_sink_class_init (GstKMSSinkClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *element_class;
+ GstBaseSinkClass *basesink_class;
+ GstVideoSinkClass *videosink_class;
+ GstCaps *caps;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ element_class = GST_ELEMENT_CLASS (klass);
+ basesink_class = GST_BASE_SINK_CLASS (klass);
+ videosink_class = GST_VIDEO_SINK_CLASS (klass);
+
+ gst_element_class_set_static_metadata (element_class, "KMS video sink",
+ "Sink/Video", GST_PLUGIN_DESC, "Víctor Jáquez <vjaquez@igalia.com>");
+
+ caps = gst_kms_sink_caps_template_fill ();
+ gst_element_class_add_pad_template (element_class,
+ gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, caps));
+ gst_caps_unref (caps);
+
+ basesink_class->start = GST_DEBUG_FUNCPTR (gst_kms_sink_start);
+ basesink_class->stop = GST_DEBUG_FUNCPTR (gst_kms_sink_stop);
+ basesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_kms_sink_set_caps);
+ basesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_kms_sink_get_caps);
+ basesink_class->propose_allocation = gst_kms_sink_propose_allocation;
+ basesink_class->get_times = gst_kms_sink_get_times;
+
+ videosink_class->show_frame = gst_kms_sink_show_frame;
+
+ gobject_class->finalize = gst_kms_sink_finalize;
+ gobject_class->set_property = gst_kms_sink_set_property;
+ gobject_class->get_property = gst_kms_sink_get_property;
+
+ /**
+ * kmssink:driver-name:
+ *
+ * If you have a system with multiple GPUs, you can choose which GPU
+ * to use setting the DRM device driver name. Otherwise, the first
+ * one from an internal list is used.
+ */
+ g_properties[PROP_DRIVER_NAME] = g_param_spec_string ("driver-name",
+ "device name", "DRM device driver name", NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT);
+
+ /**
+ * kmssink:connector-id:
+ *
+ * A GPU has several output connectors, for example: LVDS, VGA,
+ * HDMI, etc. By default the first LVDS is tried, then the first
+ * eDP, and at the end, the first connected one.
+ */
+ g_properties[PROP_CONNECTOR_ID] = g_param_spec_int ("connector-id",
+ "Connector ID", "DRM connector id", -1, G_MAXINT32, -1,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT);
+
+ /**
+ * kmssink:plane-id:
+ *
+ * There could be several planes associated with a CRTC.
+ * By default the first plane that's possible to use with a given
+ * CRTC is tried.
+ */
+ g_properties[PROP_PLANE_ID] = g_param_spec_int ("plane-id",
+ "Plane ID", "DRM plane id", -1, G_MAXINT32, -1,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT);
+
+ g_object_class_install_properties (gobject_class, PROP_N, g_properties);
+}
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ if (!gst_element_register (plugin, GST_PLUGIN_NAME, GST_RANK_SECONDARY,
+ GST_TYPE_KMS_SINK))
+ return FALSE;
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, kms,
+ GST_PLUGIN_DESC, plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME,
+ GST_PACKAGE_ORIGIN)
diff --git a/sys/kms/gstkmssink.h b/sys/kms/gstkmssink.h
new file mode 100644
index 0000000..494f440
--- /dev/null
+++ b/sys/kms/gstkmssink.h
@@ -0,0 +1,87 @@
+/* GStreamer
+ *
+ * Copyright (C) 2016 Igalia
+ *
+ * Authors:
+ * Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+ * Javier Martin <javiermartin@by.com.es>
+ *
+ * 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_KMS_SINK_H__
+#define __GST_KMS_SINK_H__
+
+#include <gst/video/gstvideosink.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_KMS_SINK \
+ (gst_kms_sink_get_type())
+#define GST_KMS_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_KMS_SINK, GstKMSSink))
+#define GST_KMS_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_KMS_SINK, GstKMSSinkClass))
+#define GST_IS_KMS_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_KMS_SINK))
+#define GST_IS_KMS_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_KMS_SINK))
+
+typedef struct _GstKMSSink GstKMSSink;
+typedef struct _GstKMSSinkClass GstKMSSinkClass;
+
+struct _GstKMSSink {
+ GstVideoSink videosink;
+
+ /*< private >*/
+ gint fd;
+ gint conn_id;
+ gint crtc_id;
+ gint plane_id;
+ guint pipe;
+
+ /* crtc data */
+ guint16 hdisplay, vdisplay;
+ guint32 buffer_id;
+
+ /* capabilities */
+ gboolean has_prime_import;
+ gboolean has_async_page_flip;
+
+ GstVideoInfo vinfo;
+ GstCaps *allowed_caps;
+ GstBufferPool *pool;
+ GstAllocator *allocator;
+ GstBuffer *last_buffer;
+
+ gchar *devname;
+
+ guint32 mm_width, mm_height;
+
+ GstPoll *poll;
+ GstPollFD pollfd;
+};
+
+struct _GstKMSSinkClass {
+ GstVideoSinkClass parent_class;
+};
+
+GType gst_kms_sink_get_type (void) G_GNUC_CONST;
+
+G_END_DECLS
+
+#endif /* __GST_KMS_SINK_H__ */
diff --git a/sys/kms/gstkmsutils.c b/sys/kms/gstkmsutils.c
new file mode 100644
index 0000000..ddf8d2d
--- /dev/null
+++ b/sys/kms/gstkmsutils.c
@@ -0,0 +1,179 @@
+/* GStreamer
+ *
+ * Copyright (C) 2016 Igalia
+ *
+ * Authors:
+ * Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+ * Javier Martin <javiermartin@by.com.es>
+ *
+ * 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 <drm_fourcc.h>
+
+#include "gstkmsutils.h"
+
+/* *INDENT-OFF* */
+static const struct
+{
+ guint32 fourcc;
+ GstVideoFormat format;
+} format_map[] = {
+#define DEF_FMT(fourcc, fmt) \
+ { DRM_FORMAT_##fourcc,GST_VIDEO_FORMAT_##fmt }
+
+ /* DEF_FMT (XRGB1555, ???), */
+ /* DEF_FMT (XBGR1555, ???), */
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ DEF_FMT (ARGB8888, BGRA),
+ DEF_FMT (XRGB8888, BGRx),
+ DEF_FMT (ABGR8888, RGBA),
+ DEF_FMT (XBGR8888, RGBx),
+#else
+ DEF_FMT (ARGB8888, ARGB),
+ DEF_FMT (XRGB8888, xRGB),
+ DEF_FMT (ABGR8888, ABGR),
+ DEF_FMT (XBGR8888, xBGR),
+#endif
+ DEF_FMT (UYVY, UYVY),
+ DEF_FMT (YUYV, YUY2),
+ DEF_FMT (YVYU, YVYU),
+ DEF_FMT (YUV420, I420),
+ DEF_FMT (YVU420, YV12),
+ DEF_FMT (YUV422, Y42B),
+ DEF_FMT (NV12, NV12),
+ DEF_FMT (NV21, NV21),
+ DEF_FMT (NV16, NV16),
+
+#undef DEF_FMT
+};
+/* *INDENT-ON* */
+
+GstVideoFormat
+gst_video_format_from_drm (guint32 drmfmt)
+{
+ gint i;
+
+ for (i = 0; i < G_N_ELEMENTS (format_map); i++) {
+ if (format_map[i].fourcc == drmfmt)
+ return format_map[i].format;
+ }
+
+ return GST_VIDEO_FORMAT_UNKNOWN;
+}
+
+guint32
+gst_drm_format_from_video (GstVideoFormat fmt)
+{
+ gint i;
+
+ for (i = 0; i < G_N_ELEMENTS (format_map); i++) {
+ if (format_map[i].format == fmt)
+ return format_map[i].fourcc;
+ }
+
+ return 0;
+}
+
+static GstStructure *
+gst_video_format_to_structure (GstVideoFormat format)
+{
+ GstStructure *structure;
+
+ structure = NULL;
+ if (format != GST_VIDEO_FORMAT_UNKNOWN)
+ structure = gst_structure_new ("video/x-raw", "format", G_TYPE_STRING,
+ gst_video_format_to_string (format), NULL);
+
+ return structure;
+}
+
+GstCaps *
+gst_kms_sink_caps_template_fill (void)
+{
+ gint i;
+ GstCaps *caps;
+ GstStructure *template;
+
+ caps = gst_caps_new_empty ();
+ for (i = 0; i < G_N_ELEMENTS (format_map); i++) {
+ template = gst_video_format_to_structure (format_map[i].format);
+ gst_structure_set (template,
+ "width", GST_TYPE_INT_RANGE, 1, G_MAXINT,
+ "height", GST_TYPE_INT_RANGE, 1, G_MAXINT,
+ "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
+ gst_caps_append_structure (caps, template);
+ }
+ return gst_caps_simplify (caps);
+}
+
+static const gint device_par_map[][2] = {
+ {1, 1}, /* regular screen */
+ {16, 15}, /* PAL TV */
+ {11, 10}, /* 525 line Rec.601 video */
+ {54, 59}, /* 625 line Rec.601 video */
+ {64, 45}, /* 1280x1024 on 16:9 display */
+ {5, 3}, /* 1280x1024 on 4:3 display */
+ {4, 3} /* 800x600 on 16:9 display */
+};
+
+#define DELTA(ratio, idx, w) \
+ (ABS(ratio - ((gdouble)device_par_map[idx][w] / device_par_map[idx][!(w)])))
+
+void
+gst_video_calculate_device_ratio (guint dev_width, guint dev_height,
+ guint dev_width_mm, guint dev_height_mm,
+ guint * dpy_par_n, guint * dpy_par_d)
+{
+ gdouble ratio, delta, cur_delta;
+ gint i, j, index, windex;
+
+ /* First, calculate the "real" ratio based on the X values; which is
+ * the "physical" w/h divided by the w/h in pixels of the display */
+ if (dev_width == 0 || dev_height == 0
+ || dev_width_mm == 0 || dev_height_mm == 0)
+ ratio = 1.0;
+ else
+ ratio = (gdouble) (dev_width_mm * dev_height) / (dev_height_mm * dev_width);
+
+ /* Now, find the one from device_par_map[][2] with the lowest delta
+ * to the real one */
+ delta = DELTA (ratio, 0, 0);
+ index = 0;
+ windex = 0;
+
+ for (i = 1; i < G_N_ELEMENTS (device_par_map); i++) {
+ for (j = 0; j < 2; j++) {
+ cur_delta = DELTA (ratio, i, j);
+ if (cur_delta < delta) {
+ index = i;
+ windex = j;
+ delta = cur_delta;
+ }
+ }
+ }
+
+ if (dpy_par_n)
+ *dpy_par_n = device_par_map[index][windex];
+
+ if (dpy_par_d)
+ *dpy_par_d = device_par_map[index][windex ^ 1];
+}
diff --git a/sys/kms/gstkmsutils.h b/sys/kms/gstkmsutils.h
new file mode 100644
index 0000000..75e9ba3
--- /dev/null
+++ b/sys/kms/gstkmsutils.h
@@ -0,0 +1,45 @@
+/* GStreamer
+ *
+ * Copyright (C) 2016 Igalia
+ *
+ * Authors:
+ * Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+ * Javier Martin <javiermartin@by.com.es>
+ *
+ * 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_KMS_UTILS_H__
+#define __GST_KMS_UTILS_H__
+
+#include <gst/video/video.h>
+
+G_BEGIN_DECLS
+
+GstVideoFormat gst_video_format_from_drm (guint32 drmfmt);
+guint32 gst_drm_format_from_video (GstVideoFormat fmt);
+GstCaps * gst_kms_sink_caps_template_fill (void);
+void gst_video_calculate_device_ratio (guint dev_width,
+ guint dev_height,
+ guint dev_width_mm,
+ guint dev_height_mm,
+ guint * dpy_par_n,
+ guint * dpy_par_d);
+
+G_END_DECLS
+
+#endif
diff --git a/sys/linsys/Makefile.in b/sys/linsys/Makefile.in
index b609dd0..fd5824e 100644
--- a/sys/linsys/Makefile.in
+++ b/sys/linsys/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/linsys/gstlinsyssdisink.c b/sys/linsys/gstlinsyssdisink.c
index b093bb5..a8edf37 100644
--- a/sys/linsys/gstlinsyssdisink.c
+++ b/sys/linsys/gstlinsyssdisink.c
@@ -99,8 +99,8 @@
{
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_linsys_sdi_sink_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_linsys_sdi_sink_sink_template);
gst_element_class_set_static_metadata (element_class, "SDI video sink",
"Sink/Video", "Writes video from SDI transmit device",
diff --git a/sys/linsys/gstlinsyssdisrc.c b/sys/linsys/gstlinsyssdisrc.c
index 94a4e5a..43e2898 100644
--- a/sys/linsys/gstlinsyssdisrc.c
+++ b/sys/linsys/gstlinsyssdisrc.c
@@ -103,8 +103,8 @@
{
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_linsys_sdi_src_src_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_linsys_sdi_src_src_template);
gst_element_class_set_static_metadata (element_class, "SDI video source",
"Source/Video", "Reads video from SDI capture device",
diff --git a/sys/nvenc/Makefile.in b/sys/nvenc/Makefile.in
index 80ec3ff..39922d6 100644
--- a/sys/nvenc/Makefile.in
+++ b/sys/nvenc/Makefile.in
@@ -308,6 +308,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -329,6 +331,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -378,6 +382,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -523,6 +529,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -649,8 +657,6 @@
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@
@@ -693,8 +699,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/nvenc/gstnvbaseenc.c b/sys/nvenc/gstnvbaseenc.c
index 2bc1ef3..9c457ff 100644
--- a/sys/nvenc/gstnvbaseenc.c
+++ b/sys/nvenc/gstnvbaseenc.c
@@ -50,6 +50,95 @@
#define parent_class gst_nv_base_enc_parent_class
G_DEFINE_ABSTRACT_TYPE (GstNvBaseEnc, gst_nv_base_enc, GST_TYPE_VIDEO_ENCODER);
+#define GST_TYPE_NV_PRESET (gst_nv_preset_get_type())
+static GType
+gst_nv_preset_get_type (void)
+{
+ static GType nv_preset_type = 0;
+
+ static const GEnumValue presets[] = {
+ {GST_NV_PRESET_DEFAULT, "Default", "default"},
+ {GST_NV_PRESET_HP, "High Performance", "hp"},
+ {GST_NV_PRESET_HQ, "High Quality", "hq"},
+/* {GST_NV_PRESET_BD, "BD", "bd"}, */
+ {GST_NV_PRESET_LOW_LATENCY_DEFAULT, "Low Latency", "low-latency"},
+ {GST_NV_PRESET_LOW_LATENCY_HQ, "Low Latency, High Quality",
+ "low-latency-hq"},
+ {GST_NV_PRESET_LOW_LATENCY_HP, "Low Latency, High Performance",
+ "low-latency-hp"},
+ {GST_NV_PRESET_LOSSLESS_DEFAULT, "Lossless", "lossless"},
+ {GST_NV_PRESET_LOSSLESS_HP, "Lossless, High Performance", "lossless-hp"},
+ {0, NULL, NULL},
+ };
+
+ if (!nv_preset_type) {
+ nv_preset_type = g_enum_register_static ("GstNvPreset", presets);
+ }
+ return nv_preset_type;
+}
+
+static GUID
+_nv_preset_to_guid (GstNvPreset preset)
+{
+ GUID null = { 0, };
+
+ switch (preset) {
+#define CASE(gst,nv) case G_PASTE(GST_NV_PRESET_,gst): return G_PASTE(G_PASTE(NV_ENC_PRESET_,nv),_GUID)
+ CASE (DEFAULT, DEFAULT);
+ CASE (HP, HP);
+ CASE (HQ, HQ);
+/* CASE (BD, BD);*/
+ CASE (LOW_LATENCY_DEFAULT, LOW_LATENCY_DEFAULT);
+ CASE (LOW_LATENCY_HQ, LOW_LATENCY_HQ);
+ CASE (LOW_LATENCY_HP, LOW_LATENCY_HQ);
+ CASE (LOSSLESS_DEFAULT, LOSSLESS_DEFAULT);
+ CASE (LOSSLESS_HP, LOSSLESS_HP);
+#undef CASE
+ default:
+ return null;
+ }
+}
+
+#define GST_TYPE_NV_RC_MODE (gst_nv_rc_mode_get_type())
+static GType
+gst_nv_rc_mode_get_type (void)
+{
+ static GType nv_rc_mode_type = 0;
+
+ static const GEnumValue modes[] = {
+ {GST_NV_RC_MODE_DEFAULT, "Default (from NVENC preset)", "default"},
+ {GST_NV_RC_MODE_CONSTQP, "Constant Quantization", "constqp"},
+ {GST_NV_RC_MODE_CBR, "Constant Bit Rate", "cbr"},
+ {GST_NV_RC_MODE_VBR, "Variable Bit Rate", "vbr"},
+ {GST_NV_RC_MODE_VBR_MINQP,
+ "Variable Bit Rate (with minimum quantization parameter)",
+ "vbr-minqp"},
+ {0, NULL, NULL},
+ };
+
+ if (!nv_rc_mode_type) {
+ nv_rc_mode_type = g_enum_register_static ("GstNvRCMode", modes);
+ }
+ return nv_rc_mode_type;
+}
+
+static NV_ENC_PARAMS_RC_MODE
+_rc_mode_to_nv (GstNvRCMode mode)
+{
+ switch (mode) {
+ case GST_NV_RC_MODE_DEFAULT:
+ return -1;
+#define CASE(gst,nv) case G_PASTE(GST_NV_RC_MODE_,gst): return G_PASTE(NV_ENC_PARAMS_RC_,nv)
+ CASE (CONSTQP, CONSTQP);
+ CASE (CBR, CBR);
+ CASE (VBR, VBR);
+ CASE (VBR_MINQP, VBR_MINQP);
+#undef CASE
+ default:
+ return -1;
+ }
+}
+
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
@@ -71,8 +160,21 @@
{
PROP_0,
PROP_DEVICE_ID,
+ PROP_PRESET,
+ PROP_BITRATE,
+ PROP_RC_MODE,
+ PROP_QP_MIN,
+ PROP_QP_MAX,
+ PROP_QP_CONST,
};
+#define DEFAULT_PRESET GST_NV_PRESET_DEFAULT
+#define DEFAULT_BITRATE 0
+#define DEFAULT_RC_MODE GST_NV_RC_MODE_DEFAULT
+#define DEFAULT_QP_MIN -1
+#define DEFAULT_QP_MAX -1
+#define DEFAULT_QP_CONST -1
+
/* 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. */
@@ -147,14 +249,40 @@
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));
+ gst_element_class_add_static_pad_template (element_class, &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));
+ g_object_class_install_property (gobject_class, PROP_PRESET,
+ g_param_spec_enum ("preset", "Encoding Preset",
+ "Encoding Preset",
+ GST_TYPE_NV_PRESET,
+ DEFAULT_PRESET, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_RC_MODE,
+ g_param_spec_enum ("rc-mode", "RC Mode",
+ "Rate Control Mode",
+ GST_TYPE_NV_RC_MODE,
+ DEFAULT_RC_MODE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_QP_MIN,
+ g_param_spec_int ("qp-min", "Minimum Quantizer",
+ "Minimum quantizer (-1 = from NVENC preset)", -1, 51, DEFAULT_QP_MIN,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_QP_MAX,
+ g_param_spec_int ("qp-max", "Maximum Quantizer",
+ "Maximum quantizer (-1 = from NVENC preset)", -1, 51, DEFAULT_QP_MAX,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_QP_CONST,
+ g_param_spec_int ("qp-const", "Constant Quantizer",
+ "Constant quantizer (-1 = from NVENC preset)",
+ -1, 51, DEFAULT_QP_CONST,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_BITRATE,
+ g_param_spec_uint ("bitrate", "Bitrate",
+ "Bitrate in kbit/sec (0 = from NVENC preset)", 0, 2000 * 1024,
+ DEFAULT_BITRATE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}
static gboolean
@@ -518,6 +646,14 @@
{
GstVideoEncoder *encoder = GST_VIDEO_ENCODER (nvenc);
+ nvenc->preset_enum = DEFAULT_PRESET;
+ nvenc->selected_preset = _nv_preset_to_guid (nvenc->preset_enum);
+ nvenc->rate_control_mode = DEFAULT_RC_MODE;
+ nvenc->qp_min = DEFAULT_QP_MIN;
+ nvenc->qp_max = DEFAULT_QP_MAX;
+ nvenc->qp_const = DEFAULT_QP_CONST;
+ nvenc->bitrate = DEFAULT_BITRATE;
+
GST_VIDEO_ENCODER_STREAM_LOCK (encoder);
GST_VIDEO_ENCODER_STREAM_UNLOCK (encoder);
}
@@ -910,22 +1046,163 @@
GstNvBaseEnc *nvenc = GST_NV_BASE_ENC (enc);
GstVideoInfo *info = &state->info;
GstVideoCodecState *old_state = nvenc->input_state;
+ 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;
- g_assert (nvenc_class->initialize_encoder);
+ if (old_state) {
+ reconfigure_params.version = NV_ENC_RECONFIGURE_PARAMS_VER;
+ params = &reconfigure_params.reInitEncodeParams;
+ } else {
+ params = &init_params;
+ }
+
+ params->version = NV_ENC_INITIALIZE_PARAMS_VER;
+ params->encodeGUID = nvenc_class->codec_id;
+ params->encodeWidth = GST_VIDEO_INFO_WIDTH (info);
+ params->encodeHeight = GST_VIDEO_INFO_HEIGHT (info);
+
+ {
+ guint32 n_presets;
+ GUID *presets;
+ guint32 i;
+
+ nv_ret =
+ NvEncGetEncodePresetCount (nvenc->encoder,
+ params->encodeGUID, &n_presets);
+ if (nv_ret != NV_ENC_SUCCESS) {
+ GST_ELEMENT_ERROR (nvenc, LIBRARY, SETTINGS, (NULL),
+ ("Failed to get encoder presets"));
+ return FALSE;
+ }
+
+ presets = g_new0 (GUID, n_presets);
+ nv_ret =
+ NvEncGetEncodePresetGUIDs (nvenc->encoder,
+ params->encodeGUID, presets, n_presets, &n_presets);
+ if (nv_ret != NV_ENC_SUCCESS) {
+ GST_ELEMENT_ERROR (nvenc, LIBRARY, SETTINGS, (NULL),
+ ("Failed to get encoder presets"));
+ g_free (presets);
+ return FALSE;
+ }
+
+ for (i = 0; i < n_presets; i++) {
+ if (gst_nvenc_cmp_guid (presets[i], nvenc->selected_preset))
+ break;
+ }
+ g_free (presets);
+ if (i >= n_presets) {
+ GST_ELEMENT_ERROR (nvenc, LIBRARY, SETTINGS, (NULL),
+ ("Selected preset not supported"));
+ return FALSE;
+ }
+
+ params->presetGUID = nvenc->selected_preset;
+ }
+
+ 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 (nvenc, params->maxEncodeWidth,
+ params->maxEncodeHeight);
+ } else {
+ guint max_width, max_height;
+
+ gst_nv_base_enc_get_max_encode_size (nvenc, &max_width, &max_height);
+
+ if (GST_VIDEO_INFO_WIDTH (info) > max_width
+ || GST_VIDEO_INFO_HEIGHT (info) > max_height) {
+ GST_ELEMENT_ERROR (nvenc, 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 (nvenc->encoder,
+ params->encodeGUID, params->presetGUID, &preset_config);
+ if (nv_ret != NV_ENC_SUCCESS) {
+ GST_ELEMENT_ERROR (nvenc, LIBRARY, SETTINGS, (NULL),
+ ("Failed to get encode preset configuration: %d", nv_ret));
+ return FALSE;
+ }
+
+ params->encodeConfig = &preset_config.presetCfg;
+
+ 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 (nvenc, "variable framerate");
+ }
+
+ if (nvenc->rate_control_mode != GST_NV_RC_MODE_DEFAULT) {
+ params->encodeConfig->rcParams.rateControlMode =
+ _rc_mode_to_nv (nvenc->rate_control_mode);
+ if (nvenc->bitrate > 0) {
+ /* FIXME: this produces larger bitrates?! */
+ params->encodeConfig->rcParams.averageBitRate = nvenc->bitrate * 1024;
+ params->encodeConfig->rcParams.maxBitRate = nvenc->bitrate * 1024;
+ }
+ if (nvenc->qp_const > 0) {
+ params->encodeConfig->rcParams.constQP.qpInterB = nvenc->qp_const;
+ params->encodeConfig->rcParams.constQP.qpInterP = nvenc->qp_const;
+ params->encodeConfig->rcParams.constQP.qpIntra = nvenc->qp_const;
+ }
+ if (nvenc->qp_min >= 0) {
+ params->encodeConfig->rcParams.enableMinQP = 1;
+ params->encodeConfig->rcParams.minQP.qpInterB = nvenc->qp_min;
+ params->encodeConfig->rcParams.minQP.qpInterP = nvenc->qp_min;
+ params->encodeConfig->rcParams.minQP.qpIntra = nvenc->qp_min;
+ }
+ if (nvenc->qp_max >= 0) {
+ params->encodeConfig->rcParams.enableMaxQP = 1;
+ params->encodeConfig->rcParams.maxQP.qpInterB = nvenc->qp_max;
+ params->encodeConfig->rcParams.maxQP.qpInterP = nvenc->qp_max;
+ params->encodeConfig->rcParams.maxQP.qpIntra = nvenc->qp_max;
+ }
+ }
+
+ g_assert (nvenc_class->set_encoder_config);
+ if (!nvenc_class->set_encoder_config (nvenc, state, params->encodeConfig)) {
+ GST_ERROR_OBJECT (enc, "Subclass failed to set encoder configuration");
+ return FALSE;
+ }
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;
+ if (old_state) {
+ nv_ret = NvEncReconfigureEncoder (nvenc->encoder, &reconfigure_params);
+ } else {
+ nv_ret = NvEncInitializeEncoder (nvenc->encoder, params);
}
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 (nv_ret != NV_ENC_SUCCESS) {
+ GST_ELEMENT_ERROR (nvenc, LIBRARY, SETTINGS, (NULL),
+ ("Failed to %sinit encoder: %d", old_state ? "re" : "", nv_ret));
+ return FALSE;
}
+ GST_INFO_OBJECT (nvenc, "configured encoder");
if (!old_state) {
nvenc->input_info = *info;
@@ -1209,9 +1486,8 @@
}
cuda_ret =
- cudaGraphicsResourceGetMappedPointer (&data->
- in_gl_resource->cuda_plane_pointers[i],
- &data->in_gl_resource->cuda_num_bytes,
+ 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 "
@@ -1591,6 +1867,25 @@
case PROP_DEVICE_ID:
nvenc->cuda_device_id = g_value_get_uint (value);
break;
+ case PROP_PRESET:
+ nvenc->preset_enum = g_value_get_enum (value);
+ nvenc->selected_preset = _nv_preset_to_guid (nvenc->preset_enum);
+ break;
+ case PROP_RC_MODE:
+ nvenc->rate_control_mode = g_value_get_enum (value);
+ break;
+ case PROP_QP_MIN:
+ nvenc->qp_min = g_value_get_int (value);
+ break;
+ case PROP_QP_MAX:
+ nvenc->qp_max = g_value_get_int (value);
+ break;
+ case PROP_QP_CONST:
+ nvenc->qp_const = g_value_get_int (value);
+ break;
+ case PROP_BITRATE:
+ nvenc->bitrate = g_value_get_uint (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1607,6 +1902,24 @@
case PROP_DEVICE_ID:
g_value_set_uint (value, nvenc->cuda_device_id);
break;
+ case PROP_PRESET:
+ g_value_set_enum (value, nvenc->preset_enum);
+ break;
+ case PROP_RC_MODE:
+ g_value_set_enum (value, nvenc->rate_control_mode);
+ break;
+ case PROP_QP_MIN:
+ g_value_set_int (value, nvenc->qp_min);
+ break;
+ case PROP_QP_MAX:
+ g_value_set_int (value, nvenc->qp_max);
+ break;
+ case PROP_QP_CONST:
+ g_value_set_int (value, nvenc->qp_const);
+ break;
+ case PROP_BITRATE:
+ g_value_set_uint (value, nvenc->bitrate);
+ 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
index 0a843e9..6623cc3 100644
--- a/sys/nvenc/gstnvbaseenc.h
+++ b/sys/nvenc/gstnvbaseenc.h
@@ -37,11 +37,38 @@
#define GST_IS_NV_BASE_ENC_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_NV_BASE_ENC))
+typedef enum {
+ GST_NV_PRESET_DEFAULT,
+ GST_NV_PRESET_HP,
+ GST_NV_PRESET_HQ,
+/* FIXME: problematic GST_NV_PRESET_BD, */
+ GST_NV_PRESET_LOW_LATENCY_DEFAULT,
+ GST_NV_PRESET_LOW_LATENCY_HQ,
+ GST_NV_PRESET_LOW_LATENCY_HP,
+ GST_NV_PRESET_LOSSLESS_DEFAULT,
+ GST_NV_PRESET_LOSSLESS_HP,
+} GstNvPreset;
+
+typedef enum {
+ GST_NV_RC_MODE_DEFAULT,
+ GST_NV_RC_MODE_CONSTQP,
+ GST_NV_RC_MODE_CBR,
+ GST_NV_RC_MODE_VBR,
+ GST_NV_RC_MODE_VBR_MINQP,
+} GstNvRCMode;
+
typedef struct {
GstVideoEncoder video_encoder;
/* properties */
guint cuda_device_id;
+ GstNvPreset preset_enum;
+ GUID selected_preset;
+ GstNvRCMode rate_control_mode;
+ gint qp_min;
+ gint qp_max;
+ gint qp_const;
+ guint bitrate;
CUcontext cuda_ctx;
void * encoder;
@@ -90,14 +117,14 @@
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);
+ gboolean (*set_encoder_config) (GstNvBaseEnc * nvenc,
+ GstVideoCodecState * state,
+ NV_ENC_CONFIG * config);
} GstNvBaseEncClass;
G_GNUC_INTERNAL
diff --git a/sys/nvenc/gstnvenc.c b/sys/nvenc/gstnvenc.c
index 6b0d568..30b5b13 100644
--- a/sys/nvenc/gstnvenc.c
+++ b/sys/nvenc/gstnvenc.c
@@ -78,6 +78,24 @@
}
NVENCSTATUS
+NvEncGetEncodePresetCount (void *encoder, GUID encodeGUID,
+ uint32_t * encodePresetGUIDCount)
+{
+ g_assert (nvenc_api.nvEncGetEncodeProfileGUIDCount != NULL);
+ return nvenc_api.nvEncGetEncodePresetCount (encoder, encodeGUID,
+ encodePresetGUIDCount);
+}
+
+NVENCSTATUS
+NvEncGetEncodePresetGUIDs (void *encoder, GUID encodeGUID,
+ GUID * presetGUIDs, uint32_t guidArraySize, uint32_t * GUIDCount)
+{
+ g_assert (nvenc_api.nvEncGetEncodeProfileGUIDs != NULL);
+ return nvenc_api.nvEncGetEncodePresetGUIDs (encoder, encodeGUID,
+ presetGUIDs, guidArraySize, GUIDCount);
+}
+
+NVENCSTATUS
NvEncGetEncodePresetConfig (void *encoder, GUID encodeGUID,
GUID presetGUID, NV_ENC_PRESET_CONFIG * presetConfig)
{
diff --git a/sys/nvenc/gstnvh264enc.c b/sys/nvenc/gstnvh264enc.c
index 170e3f7..2e60b3d 100644
--- a/sys/nvenc/gstnvh264enc.c
+++ b/sys/nvenc/gstnvh264enc.c
@@ -57,8 +57,8 @@
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_encoder_config (GstNvBaseEnc * nvenc,
+ GstVideoCodecState * state, NV_ENC_CONFIG * config);
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,
@@ -85,12 +85,11 @@
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_encoder_config = gst_nv_h264_enc_set_encoder_config;
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_add_static_pad_template (element_class, &src_factory);
gst_element_class_set_static_metadata (element_class,
"NVENC H.264 Video Encoder",
@@ -412,27 +411,14 @@
}
static gboolean
-gst_nv_h264_enc_initialize_encoder (GstNvBaseEnc * nvenc,
- GstVideoCodecState * old_state, GstVideoCodecState * state)
+gst_nv_h264_enc_set_encoder_config (GstNvBaseEnc * nvenc,
+ GstVideoCodecState * state, NV_ENC_CONFIG * config)
{
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;
- }
+ GstVideoInfo *info = &state->info;
template_caps = gst_static_pad_template_get_caps (&src_factory);
allowed_caps = gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (h264enc));
@@ -482,96 +468,19 @@
}
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;
+ config->profileGUID = selected_profile;
+ config->encodeCodecConfig.h264Config.level = level_idc;
+ config->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;
+ config->encodeCodecConfig.h264Config.separateColourPlaneFlag = 1;
+ config->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");
+ config->encodeCodecConfig.h264Config.outputAUD = 1;
return TRUE;
}
diff --git a/sys/opensles/Makefile.am b/sys/opensles/Makefile.am
index 6236833..764078e 100644
--- a/sys/opensles/Makefile.am
+++ b/sys/opensles/Makefile.am
@@ -20,5 +20,6 @@
noinst_HEADERS = openslescommon.h \
openslesringbuffer.h \
openslessink.h \
- openslessrc.h
+ openslessrc.h \
+ opensles.h
diff --git a/sys/opensles/Makefile.in b/sys/opensles/Makefile.in
index 955e522..a804960 100644
--- a/sys/opensles/Makefile.in
+++ b/sys/opensles/Makefile.in
@@ -305,6 +305,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -326,6 +328,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -375,6 +379,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -520,6 +526,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -646,8 +654,6 @@
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@
@@ -690,8 +696,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -801,7 +812,8 @@
noinst_HEADERS = openslescommon.h \
openslesringbuffer.h \
openslessink.h \
- openslessrc.h
+ openslessrc.h \
+ opensles.h
all: all-am
diff --git a/sys/applemedia-nonpublic/bufferfactory.h b/sys/opensles/opensles.h
similarity index 67%
rename from sys/applemedia-nonpublic/bufferfactory.h
rename to sys/opensles/opensles.h
index 132b953..dbc341c 100644
--- a/sys/applemedia-nonpublic/bufferfactory.h
+++ b/sys/opensles/opensles.h
@@ -1,5 +1,6 @@
-/*
- * Copyright (C) 2010 Ole André Vadla Ravnås <oleavr@soundrop.com>
+/* GStreamer
+ * Copyright (C) 2012 Collabora Ltd.
+ * Author: Sebastian Dröge <sebastian.droege@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
@@ -17,18 +18,13 @@
* Boston, MA 02110-1301, USA.
*/
-#import <Foundation/Foundation.h>
+#ifndef __OPENSLES_H__
+#define __OPENSLES_H__
#include <gst/gst.h>
+#include <SLES/OpenSLES.h>
-@interface GstAMBufferFactory : NSObject {
- gpointer coreMediaCtx;
-}
+SLObjectItf gst_opensles_get_engine (void);
+void gst_opensles_release_engine (SLObjectItf engine_object);
-- (id)initWithError:(GError **)error;
-- (void)finalize;
-
-- (GstBuffer *)createGstBufferForCoreVideoBuffer:(CFTypeRef)cvbuf;
-- (GstBuffer *)createGstBufferForSampleBuffer:(CFTypeRef)sbuf;
-
-@end
+#endif /* __OPENSLES_H__ */
diff --git a/sys/opensles/openslessink.c b/sys/opensles/openslessink.c
index c2ec806..2493853 100644
--- a/sys/opensles/openslessink.c
+++ b/sys/opensles/openslessink.c
@@ -272,8 +272,7 @@
GST_TYPE_OPENSLES_STREAM_TYPE, DEFAULT_STREAM_TYPE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_factory);
gst_element_class_set_static_metadata (gstelement_class, "OpenSL ES Sink",
"Sink/Audio",
diff --git a/sys/opensles/openslessrc.c b/sys/opensles/openslessrc.c
index 6505ab1..f32984a 100644
--- a/sys/opensles/openslessrc.c
+++ b/sys/opensles/openslessrc.c
@@ -131,8 +131,7 @@
GST_TYPE_OPENSLES_RECORDING_PRESET, DEFAULT_PRESET,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_factory));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
gst_element_class_set_static_metadata (gstelement_class, "OpenSL ES Src",
"Source/Audio",
diff --git a/sys/pvr2d/Makefile.in b/sys/pvr2d/Makefile.in
index 447d445..45bcbdb 100644
--- a/sys/pvr2d/Makefile.in
+++ b/sys/pvr2d/Makefile.in
@@ -306,6 +306,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -327,6 +329,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -376,6 +380,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -521,6 +527,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -647,8 +655,6 @@
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@
@@ -691,8 +697,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/pvr2d/gstpvrbufferpool.c b/sys/pvr2d/gstpvrbufferpool.c
index 81106dc..620d581 100644
--- a/sys/pvr2d/gstpvrbufferpool.c
+++ b/sys/pvr2d/gstpvrbufferpool.c
@@ -37,6 +37,15 @@
GST_DEBUG_CATEGORY_EXTERN (gst_debug_pvrvideosink);
#define GST_CAT_DEFAULT gst_debug_pvrvideosink
+static gboolean
+gst_pvr_meta_init (GstPVRMeta * meta, gpointer params, GstBuffer * buffer)
+{
+ meta->src_mem = NULL;
+ meta->sink = NULL;
+
+ return TRUE;
+}
+
static void
gst_pvr_meta_free (GstPVRMeta * meta, GstBuffer * buffer)
{
@@ -74,9 +83,9 @@
if (g_once_init_enter (&pvr_meta_info)) {
const GstMetaInfo *meta = gst_meta_register ("GstPVRMeta", "GstPVRMeta",
sizeof (GstPVRMeta),
- (GstMetaInitFunction) NULL,
+ (GstMetaInitFunction) gst_pvr_meta_init,
(GstMetaFreeFunction) gst_pvr_meta_free,
- (GstMetaCopyFunction) NULL, (GstMetaTransformFunction) NULL);
+ (GstMetaTransformFunction) NULL);
g_once_init_leave (&pvr_meta_info, meta);
}
return pvr_meta_info;
diff --git a/sys/pvr2d/gstpvrvideosink.c b/sys/pvr2d/gstpvrvideosink.c
index 7c10243..4e32a8c 100644
--- a/sys/pvr2d/gstpvrvideosink.c
+++ b/sys/pvr2d/gstpvrvideosink.c
@@ -1464,8 +1464,8 @@
"A PVR videosink",
"Luciana Fujii Pontello <luciana.fujii@collabora.co.uk");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_pvrvideosink_sink_template_factory));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_pvrvideosink_sink_template_factory);
gstelement_class->change_state = gst_pvrvideosink_change_state;
diff --git a/sys/shm/Makefile.in b/sys/shm/Makefile.in
index e212d99..07d3e25 100644
--- a/sys/shm/Makefile.in
+++ b/sys/shm/Makefile.in
@@ -304,6 +304,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -325,6 +327,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -374,6 +378,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -519,6 +525,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -645,8 +653,6 @@
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@
@@ -689,8 +695,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/shm/gstshmsink.c b/sys/shm/gstshmsink.c
index 13d67bd..a44097b 100644
--- a/sys/shm/gstshmsink.c
+++ b/sys/shm/gstshmsink.c
@@ -419,8 +419,7 @@
GST_TYPE_SHM_SINK, G_SIGNAL_RUN_LAST, 0, NULL, NULL,
g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sinktemplate));
+ gst_element_class_add_static_pad_template (gstelement_class, &sinktemplate);
gst_element_class_set_static_metadata (gstelement_class,
"Shared Memory Sink",
diff --git a/sys/shm/gstshmsrc.c b/sys/shm/gstshmsrc.c
index 3caf90b..59fe44d 100644
--- a/sys/shm/gstshmsrc.c
+++ b/sys/shm/gstshmsrc.c
@@ -138,8 +138,7 @@
"The name of the shared memory area used to get buffers",
NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&srctemplate));
+ gst_element_class_add_static_pad_template (gstelement_class, &srctemplate);
gst_element_class_set_static_metadata (gstelement_class,
"Shared Memory Source",
@@ -273,11 +272,11 @@
if (self->pipe) {
gst_shm_pipe_dec (self->pipe);
self->pipe = NULL;
+
+ gst_poll_remove_fd (self->poll, &self->pollfd);
}
- gst_poll_remove_fd (self->poll, &self->pollfd);
gst_poll_fd_init (&self->pollfd);
-
gst_poll_set_flushing (self->poll, TRUE);
}
diff --git a/sys/tinyalsa/Makefile.in b/sys/tinyalsa/Makefile.in
index c87f829..fff9a69 100644
--- a/sys/tinyalsa/Makefile.in
+++ b/sys/tinyalsa/Makefile.in
@@ -303,6 +303,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -324,6 +326,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -373,6 +377,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -518,6 +524,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -644,8 +652,6 @@
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@
@@ -688,8 +694,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/tinyalsa/tinyalsasink.c b/sys/tinyalsa/tinyalsasink.c
index c29755e..7c7799c 100644
--- a/sys/tinyalsa/tinyalsasink.c
+++ b/sys/tinyalsa/tinyalsasink.c
@@ -473,8 +473,7 @@
"Sink/Audio", "Plays audio to an ALSA device",
"Arun Raghavan <arun@centricular.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
g_object_class_install_property (gobject_class,
PROP_CARD,
diff --git a/sys/uvch264/Makefile.in b/sys/uvch264/Makefile.in
index b2a71c1..7eda0dd 100644
--- a/sys/uvch264/Makefile.in
+++ b/sys/uvch264/Makefile.in
@@ -307,6 +307,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -328,6 +330,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -377,6 +381,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -522,6 +528,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -648,8 +656,6 @@
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@
@@ -692,8 +698,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/uvch264/gstuvch264_mjpgdemux.c b/sys/uvch264/gstuvch264_mjpgdemux.c
index 1f9b1c4..e253a04 100644
--- a/sys/uvch264/gstuvch264_mjpgdemux.c
+++ b/sys/uvch264/gstuvch264_mjpgdemux.c
@@ -190,20 +190,16 @@
gobject_class->get_property = gst_uvc_h264_mjpg_demux_get_property;
gobject_class->dispose = gst_uvc_h264_mjpg_demux_dispose;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&mjpgsink_pad_template));
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&jpegsrc_pad_template));
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&h264src_pad_template));
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&yuy2src_pad_template));
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&nv12src_pad_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &mjpgsink_pad_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &jpegsrc_pad_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &h264src_pad_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &yuy2src_pad_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &nv12src_pad_template);
gst_element_class_set_static_metadata (element_class,
"UVC H264 MJPG Demuxer",
diff --git a/sys/uvch264/gstuvch264_src.c b/sys/uvch264/gstuvch264_src.c
index eae7d82..38397c3 100644
--- a/sys/uvch264/gstuvch264_src.c
+++ b/sys/uvch264/gstuvch264_src.c
@@ -281,14 +281,11 @@
"UVC H264 Encoding camera source",
"Youness Alaoui <youness.alaoui@collabora.co.uk>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&vidsrc_template));
-
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&imgsrc_template));
-
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&vfsrc_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &vidsrc_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &imgsrc_template);
+ gst_element_class_add_static_pad_template (gstelement_class, &vfsrc_template);
/* Properties */
g_object_class_install_property (gobject_class, PROP_COLORSPACE_NAME,
diff --git a/sys/vcd/Makefile.in b/sys/vcd/Makefile.in
index 88ed312..a60f7f8 100644
--- a/sys/vcd/Makefile.in
+++ b/sys/vcd/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/vcd/vcdsrc.c b/sys/vcd/vcdsrc.c
index 7372ac5..1bf3cc5 100644
--- a/sys/vcd/vcdsrc.c
+++ b/sys/vcd/vcdsrc.c
@@ -118,8 +118,7 @@
"Source/File",
"Asynchronous read from VCD disk", "Erik Walthinsen <omega@cse.ogi.edu>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&srctemplate));
+ gst_element_class_add_static_pad_template (element_class, &srctemplate);
}
static void
diff --git a/sys/vdpau/Makefile.in b/sys/vdpau/Makefile.in
index cc681e3..ea82b95 100644
--- a/sys/vdpau/Makefile.in
+++ b/sys/vdpau/Makefile.in
@@ -310,6 +310,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -331,6 +333,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -380,6 +384,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -525,6 +531,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -651,8 +659,6 @@
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@
@@ -695,8 +701,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/vdpau/mpeg/gstvdpmpegdec.c b/sys/vdpau/mpeg/gstvdpmpegdec.c
index e6f6f95..1bcf9d9 100644
--- a/sys/vdpau/mpeg/gstvdpmpegdec.c
+++ b/sys/vdpau/mpeg/gstvdpmpegdec.c
@@ -525,8 +525,7 @@
"Decode mpeg stream with vdpau",
"Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com>");
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
+ gst_element_class_add_static_pad_template (element_class, &sink_template);
video_decoder_class->start = gst_vdp_mpeg_dec_start;
video_decoder_class->stop = gst_vdp_mpeg_dec_stop;
diff --git a/sys/wasapi/Makefile.in b/sys/wasapi/Makefile.in
index 55a66ed..431242e 100644
--- a/sys/wasapi/Makefile.in
+++ b/sys/wasapi/Makefile.in
@@ -306,6 +306,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -327,6 +329,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -376,6 +380,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -521,6 +527,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -647,8 +655,6 @@
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@
@@ -691,8 +697,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/wasapi/gstwasapisink.c b/sys/wasapi/gstwasapisink.c
index 53f5c45..5b35b8e 100644
--- a/sys/wasapi/gstwasapisink.c
+++ b/sys/wasapi/gstwasapisink.c
@@ -77,8 +77,7 @@
gobject_class->dispose = gst_wasapi_sink_dispose;
gobject_class->finalize = gst_wasapi_sink_finalize;
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&sink_template));
+ gst_element_class_add_static_pad_template (gstelement_class, &sink_template);
gst_element_class_set_static_metadata (gstelement_class, "WasapiSrc",
"Sink/Audio",
"Stream audio to an audio capture device through WASAPI",
diff --git a/sys/wasapi/gstwasapisrc.c b/sys/wasapi/gstwasapisrc.c
index 402875f..20c3929 100644
--- a/sys/wasapi/gstwasapisrc.c
+++ b/sys/wasapi/gstwasapisrc.c
@@ -50,13 +50,15 @@
static void gst_wasapi_src_dispose (GObject * object);
static void gst_wasapi_src_finalize (GObject * object);
-static GstCaps * gst_wasapi_src_get_caps (GstBaseSrc * bsrc, GstCaps * filter);
+static GstCaps *gst_wasapi_src_get_caps (GstBaseSrc * bsrc, GstCaps * filter);
static gboolean gst_wasapi_src_open (GstAudioSrc * asrc);
static gboolean gst_wasapi_src_close (GstAudioSrc * asrc);
-static gboolean gst_wasapi_src_prepare (GstAudioSrc * asrc, GstAudioRingBufferSpec * spec);
+static gboolean gst_wasapi_src_prepare (GstAudioSrc * asrc,
+ GstAudioRingBufferSpec * spec);
static gboolean gst_wasapi_src_unprepare (GstAudioSrc * asrc);
-static guint gst_wasapi_src_read (GstAudioSrc * asrc, gpointer data, guint length, GstClockTime * timestamp);
+static guint gst_wasapi_src_read (GstAudioSrc * asrc, gpointer data,
+ guint length, GstClockTime * timestamp);
static guint gst_wasapi_src_delay (GstAudioSrc * asrc);
static void gst_wasapi_src_reset (GstAudioSrc * asrc);
@@ -76,8 +78,7 @@
gobject_class->dispose = gst_wasapi_src_dispose;
gobject_class->finalize = gst_wasapi_src_finalize;
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_template);
gst_element_class_set_static_metadata (gstelement_class, "WasapiSrc",
"Source/Audio",
"Stream audio from an audio capture device through WASAPI",
@@ -89,8 +90,7 @@
gstaudiosrc_class->close = GST_DEBUG_FUNCPTR (gst_wasapi_src_close);
gstaudiosrc_class->read = GST_DEBUG_FUNCPTR (gst_wasapi_src_read);
gstaudiosrc_class->prepare = GST_DEBUG_FUNCPTR (gst_wasapi_src_prepare);
- gstaudiosrc_class->unprepare =
- GST_DEBUG_FUNCPTR (gst_wasapi_src_unprepare);
+ gstaudiosrc_class->unprepare = GST_DEBUG_FUNCPTR (gst_wasapi_src_unprepare);
gstaudiosrc_class->delay = GST_DEBUG_FUNCPTR (gst_wasapi_src_delay);
gstaudiosrc_class->reset = GST_DEBUG_FUNCPTR (gst_wasapi_src_reset);
@@ -147,9 +147,10 @@
{
GstWasapiSrc *self = GST_WASAPI_SRC (asrc);
gboolean res = FALSE;
- IAudioClient * client = NULL;
+ IAudioClient *client = NULL;
- if (!gst_wasapi_util_get_default_device_client (GST_ELEMENT (self), TRUE, &client)) {
+ if (!gst_wasapi_util_get_default_device_client (GST_ELEMENT (self), TRUE,
+ &client)) {
GST_ELEMENT_ERROR (self, RESOURCE, OPEN_READ, (NULL),
("Failed to get default device"));
goto beach;
@@ -197,8 +198,9 @@
gst_wasapi_util_audio_info_to_waveformatex (&spec->info, &format);
self->info = spec->info;
- hr = IAudioClient_Initialize (self->client, AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK,
- spec->buffer_time / 100, 0, (WAVEFORMATEX *) & format, NULL);
+ hr = IAudioClient_Initialize (self->client, AUDCLNT_SHAREMODE_SHARED,
+ AUDCLNT_STREAMFLAGS_EVENTCALLBACK, spec->buffer_time / 100, 0,
+ (WAVEFORMATEX *) & format, NULL);
if (hr != S_OK) {
GST_ELEMENT_ERROR (self, RESOURCE, OPEN_READ, (NULL),
("IAudioClient::Initialize () failed: %s",
diff --git a/sys/wininet/Makefile.in b/sys/wininet/Makefile.in
index 1b9d397..cc663ea 100644
--- a/sys/wininet/Makefile.in
+++ b/sys/wininet/Makefile.in
@@ -302,6 +302,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -323,6 +325,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -372,6 +376,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -517,6 +523,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -643,8 +651,6 @@
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@
@@ -687,8 +693,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/wininet/gstwininetsrc.c b/sys/wininet/gstwininetsrc.c
index 4cd9bf3..60d2944 100644
--- a/sys/wininet/gstwininetsrc.c
+++ b/sys/wininet/gstwininetsrc.c
@@ -83,8 +83,7 @@
{
GstElementClass *element_class = GST_ELEMENT_CLASS (gclass);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (element_class, &src_template);
gst_element_class_set_static_metadata (element_class,
"Windows Network Source", "Source/Network",
diff --git a/sys/winks/Makefile.in b/sys/winks/Makefile.in
index b780516..117eae2 100644
--- a/sys/winks/Makefile.in
+++ b/sys/winks/Makefile.in
@@ -307,6 +307,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -328,6 +330,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -377,6 +381,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -522,6 +528,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -648,8 +656,6 @@
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@
@@ -692,8 +698,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/winscreencap/Makefile.in b/sys/winscreencap/Makefile.in
index 5fef8fa..c464bf3 100644
--- a/sys/winscreencap/Makefile.in
+++ b/sys/winscreencap/Makefile.in
@@ -306,6 +306,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -327,6 +329,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -376,6 +380,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -521,6 +527,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -647,8 +655,6 @@
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@
@@ -691,8 +697,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/sys/winscreencap/gstdx9screencapsrc.c b/sys/winscreencap/gstdx9screencapsrc.c
index 0f889b2..d3bd61c 100644
--- a/sys/winscreencap/gstdx9screencapsrc.c
+++ b/sys/winscreencap/gstdx9screencapsrc.c
@@ -139,8 +139,7 @@
"Height of screen capture area (0 = maximum)",
0, G_MAXINT, 0, G_PARAM_READWRITE));
- gst_element_class_add_pad_template (e_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (e_class, &src_template);
gst_element_class_set_static_metadata (e_class,
"DirectX 9 screen capture source", "Source/Video", "Captures screen",
@@ -203,10 +202,6 @@
switch (prop_id) {
case PROP_MONITOR:
- if (g_value_get_int (value) >= GetSystemMetrics (SM_CMONITORS)) {
- G_OBJECT_WARN_INVALID_PSPEC (object, "Monitor", prop_id, pspec);
- break;
- }
src->monitor = g_value_get_int (value);
break;
case PROP_X_POS:
@@ -311,8 +306,13 @@
RECT rect_dst;
GstCaps *caps;
- if (src->monitor >= IDirect3D9_GetAdapterCount (g_d3d9) ||
- FAILED (IDirect3D9_GetAdapterDisplayMode (g_d3d9, src->monitor,
+ if (src->monitor >= IDirect3D9_GetAdapterCount (g_d3d9)) {
+ GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND,
+ ("Specified monitor with index %d not found", src->monitor), (NULL));
+ return NULL;
+ }
+
+ if (FAILED (IDirect3D9_GetAdapterDisplayMode (g_d3d9, src->monitor,
&src->disp_mode))) {
return NULL;
}
@@ -383,6 +383,12 @@
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
+ if (src->monitor >= IDirect3D9_GetAdapterCount (g_d3d9)) {
+ GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND,
+ ("Specified monitor with index %d not found", src->monitor), (NULL));
+ return FALSE;
+ }
+
res = IDirect3D9_CreateDevice (g_d3d9, src->monitor, D3DDEVTYPE_HAL,
GetDesktopWindow (), D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &src->d3d9_device);
diff --git a/sys/winscreencap/gstgdiscreencapsrc.c b/sys/winscreencap/gstgdiscreencapsrc.c
index 55bd4b5..65f0bd9 100644
--- a/sys/winscreencap/gstgdiscreencapsrc.c
+++ b/sys/winscreencap/gstgdiscreencapsrc.c
@@ -146,8 +146,7 @@
"Height of screen capture area (0 = maximum)",
0, G_MAXINT, 0, G_PARAM_READWRITE));
- gst_element_class_add_pad_template (e_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (e_class, &src_template);
gst_element_class_set_static_metadata (e_class,
"GDI screen capture source", "Source/Video", "Captures screen",
"Haakon Sporsheim <hakon.sporsheim@tandberg.com>");
diff --git a/tests/Makefile.in b/tests/Makefile.in
index 610f24a..02adc4e 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -275,6 +275,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -296,6 +298,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -345,6 +349,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -490,6 +496,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -616,8 +624,6 @@
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@
@@ -660,8 +666,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am
index 3f9ad9d..2c0cdb2 100644
--- a/tests/check/Makefile.am
+++ b/tests/check/Makefile.am
@@ -17,7 +17,7 @@
GST_STATE_IGNORE_ELEMENTS="apexsink avdtpsrc camerabin dc1394src \
dccpclientsrc dccpclientsink dccpserversrc dccpserversink decklinksrc \
decklinksink dtlssrtpdec dtlssrtpenc dvbsrc dvbbasebin dfbvideosink festival fluidsynth \
- linsyssdisrc linsyssdisink nassink \
+ linsyssdisrc linsyssdisink nassink kmssink \
rsndvdbin sdlaudiosink sdlvideosink vcdsrc rfbsrc vdpauyuvvideo vdpauvideoyuv \
vdpaumpegdec vdpaumpeg4dec vdpauh264dec vdpauvideopostprocess vdpausink neonhttpsrc"
@@ -41,7 +41,7 @@
endif
if USE_DASH
-check_dash = elements/dash_mpd
+check_dash = elements/dash_mpd elements/dash_isoff
check_dash_demux = elements/dash_demux
else
check_dash =
@@ -211,7 +211,8 @@
libs/gstglcolorconvert \
libs/gstglquery \
libs/gstglsl \
- elements/glimagesink
+ elements/glimagesink \
+ pipelines/simple-launch-lines
else
check_gl=
endif
@@ -227,15 +228,17 @@
# these tests don't even pass
# neon: too flaky (almost always fails 'the first time')
+# dashdemux: fails because it uses random data streams but dashdemux nowadays
+# actually looks at the data and doesn't like randomness
noinst_PROGRAMS = \
pipelines/streamheader \
+ $(check_dash_demux) \
$(check_neon)
check_PROGRAMS = \
generic/states \
$(check_assrender) \
$(check_dash) \
- $(check_dash_demux) \
$(check_faac) \
$(check_faad) \
$(check_voaacenc) \
@@ -272,6 +275,9 @@
elements/mxfmux \
elements/netsim \
elements/pcapparse \
+ elements/pnm \
+ elements/rawaudioparse \
+ elements/rawvideoparse \
elements/rtponvifparse \
elements/rtponviftimestamp \
elements/id3mux \
@@ -296,14 +302,14 @@
$(check_player) \
$(EXPERIMENTAL_CHECKS)
-noinst_HEADERS = elements/mxfdemux.h
+noinst_HEADERS = elements/mxfdemux.h elements/dash_isoff.h
TESTS = $(check_PROGRAMS)
AM_CFLAGS = $(GST_CFLAGS) $(GST_CHECK_CFLAGS) $(GST_OPTION_CFLAGS) \
-DGST_CHECK_TEST_ENVIRONMENT_BEACON="\"GST_PLUGIN_LOADING_WHITELIST\"" \
-DGST_TEST_FILES_PATH="\"$(TEST_FILES_DIRECTORY)\"" \
- -UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS
+ -UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS $(PTHREAD_CFLAGS)
LDADD = $(GST_CHECK_LIBS)
generic_states_CFLAGS = $(AM_CFLAGS) $(GMODULE_NO_EXPORT_CFLAGS)
@@ -312,9 +318,15 @@
elements_audiomixer_LDADD = $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) -lgstbase-@GST_API_VERSION@ $(LDADD)
elements_audiomixer_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(AM_CFLAGS)
-elements_audiointerleave_LDADD = $(GST_BASE_LIBS) -lgstbase-@GST_API_VERSION@ -lgstaudio-@GST_API_VERSION@ $(LDADD)
+elements_audiointerleave_LDADD = $(GST_BASE_LIBS) -lgstbase-@GST_API_VERSION@ $(GST_AUDIO_LIBS) $(LDADD)
elements_audiointerleave_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+elements_pnm_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS)
+ $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
+elements_pnm_LDADD = \
+ $(GST_PLUGINS_BASE_LIBS) -lgstapp-$(GST_API_VERSION) $(GST_BASE_LIBS) $(LDADD)
+#
# parser unit test convenience lib
noinst_LTLIBRARIES = libparser.la
libparser_la_SOURCES = elements/parser.c elements/parser.h
@@ -332,6 +344,12 @@
elements_pcapparse_LDADD = libparser.la $(LDADD)
+elements_rawaudioparse_LDADD = $(GST_BASE_LIBS) -lgstbase-@GST_API_VERSION@ $(GST_AUDIO_LIBS) $(LDADD)
+elements_rawaudioparse_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+
+elements_rawvideoparse_LDADD = $(GST_BASE_LIBS) -lgstbase-@GST_API_VERSION@ $(GST_VIDEO_LIBS) $(LDADD)
+elements_rawvideoparse_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+
libs_mpegvideoparser_CFLAGS = \
$(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
-DGST_USE_UNSTABLE_API \
@@ -344,7 +362,8 @@
libs_mpegts_CFLAGS = \
$(GST_PLUGINS_BAD_CFLAGS) \
-DGST_USE_UNSTABLE_API \
- $(GST_CFLAGS)
+ $(GST_CFLAGS) \
+ $(PTHREAD_CFLAGS)
libs_mpegts_LDADD = \
$(top_builddir)/gst-libs/gst/mpegts/libgstmpegts-@GST_API_VERSION@.la \
@@ -384,21 +403,21 @@
$(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@
+ $(GST_AUDIO_LIBS)
elements_faad_CFLAGS = \
$(GST_PLUGINS_BASE_CFLAGS) \
$(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
elements_faad_LDADD = \
$(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD) \
- -lgstaudio-@GST_API_VERSION@
+ $(GST_AUDIO_LIBS)
elements_faac_CFLAGS = \
$(GST_PLUGINS_BASE_CFLAGS) \
$(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
elements_faac_LDADD = \
$(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD) \
- -lgstaudio-@GST_API_VERSION@
+ $(GST_AUDIO_LIBS)
elements_gdppay_CFLAGS = \
$(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
@@ -413,7 +432,7 @@
$(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
elements_voaacenc_LDADD = \
$(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD) \
- -lgstaudio-@GST_API_VERSION@
+ $(GST_AUDIO_LIBS)
elements_camerabin_CFLAGS = \
$(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
@@ -436,10 +455,10 @@
elements_kate_LDADD = $(GST_BASE_LIBS) $(LDADD)
elements_assrender_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS)
-elements_assrender_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) -lgstapp-$(GST_API_VERSION) $(GST_BASE_LIBS) $(LDADD)
+elements_assrender_LDADD = $(GST_PLUGINS_BASE_LIBS) $(GST_VIDEO_LIBS) -lgstapp-$(GST_API_VERSION) $(GST_BASE_LIBS) $(LDADD)
elements_mpegtsmux_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS)
-elements_mpegtsmux_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) $(GST_BASE_LIBS) $(LDADD)
+elements_mpegtsmux_LDADD = $(GST_PLUGINS_BASE_LIBS) $(GST_VIDEO_LIBS) $(GST_BASE_LIBS) $(LDADD)
elements_uvch264demux_CFLAGS = -DUVCH264DEMUX_DATADIR="$(srcdir)/elements/uvch264demux_data" \
$(AM_CFLAGS)
@@ -449,18 +468,24 @@
$(top_builddir)/gst-libs/gst/uridownloader/libgsturidownloader-@GST_API_VERSION@.la
elements_dash_mpd_SOURCES = elements/dash_mpd.c
+elements_dash_isoff_CFLAGS = $(AM_CFLAGS) $(GST_BASE_CFLAGS)
+elements_dash_isoff_LDADD = $(LDADD) $(GST_BASE_LIBS)
+elements_dash_isoff_SOURCES = elements/dash_isoff.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) \
+ $(LDADD) $(LIBXML2_LIBS) $(GST_BASE_LIBS) $(GST_PLUGINS_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
+elements_neonhttpsrc_CFLAGS = $(AM_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS)
+
elements_mssdemux_CFLAGS = $(AM_CFLAGS) $(LIBXML2_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_PLUGINS_BAD_CFLAGS)
elements_mssdemux_LDADD = \
- $(LDADD) $(LIBXML2_LIBS) $(GST_BASE_LIBS) \
+ $(LDADD) $(LIBXML2_LIBS) $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) \
-lgsttag-$(GST_API_VERSION) \
-lgstapp-$(GST_API_VERSION) \
$(top_builddir)/gst-libs/gst/adaptivedemux/libgstadaptivedemux-@GST_API_VERSION@.la
@@ -480,9 +505,10 @@
libs_player_LDADD = \
$(top_builddir)/gst-libs/gst/player/libgstplayer-@GST_API_VERSION@.la \
- $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD)
+ $(GST_VIDEO_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) \
+ $(LDADD)
libs_player_CFLAGS = \
- $(GST_PLUGINS_BAD_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS) \
+ $(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS) \
-DTEST_PATH=\"$(builddir)/media\"
if WITH_GST_PLAYER_TESTS
@@ -532,7 +558,8 @@
libs_gstglcontext_LDADD = \
$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
- $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD)
+ $(GST_PLUGINS_BASE_LIBS) $(GST_VIDEO_LIBS) $(GST_BASE_LIBS) \
+ $(GST_LIBS) $(LDADD)
libs_gstglcontext_CFLAGS = \
$(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
@@ -541,8 +568,8 @@
libs_gstglmemory_LDADD = \
$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
- $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) \
- $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD)
+ $(GST_PLUGINS_BASE_LIBS) $(GST_VIDEO_LIBS) $(GST_BASE_LIBS) \
+ $(GST_LIBS) $(LDADD)
libs_gstglmemory_CFLAGS = \
$(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
@@ -556,8 +583,8 @@
libs_gstglupload_LDADD = \
$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
- $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) \
- $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD)
+ $(GST_PLUGINS_BASE_LIBS) $(GST_VIDEO_LIBS) $(GST_BASE_LIBS) \
+ $(GST_LIBS) $(LDADD)
libs_gstglcolorconvert_CFLAGS = \
$(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
@@ -566,8 +593,8 @@
libs_gstglcolorconvert_LDADD = \
$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
- $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) \
- $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD)
+ $(GST_PLUGINS_BASE_LIBS) $(GST_VIDEO_LIBS) $(GST_BASE_LIBS) \
+ $(GST_LIBS) $(LDADD)
libs_gstglquery_LDADD = \
$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
@@ -594,7 +621,15 @@
elements_glimagesink_LDADD = \
$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
- $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) \
+ $(GST_PLUGINS_BASE_LIBS) $(GST_VIDEO_LIBS) $(GST_BASE_LIBS) \
+ $(GST_LIBS) $(LDADD)
+
+pipelines_simple_launch_lines_CFLAGS = \
+ $(GST_PLUGINS_BAD_CFLAGS) \
+ -DGST_USE_UNSTABLE_API \
+ $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
+
+pipelines_simple_launch_lines_LDADD = \
$(GST_BASE_LIBS) $(GST_LIBS) $(LDADD)
libs_aggregator_LDADD = \
@@ -608,8 +643,7 @@
$(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
elements_compositor_LDADD = \
- $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) \
- $(GST_BASE_LIBS) $(LDADD)
+ $(GST_PLUGINS_BASE_LIBS) $(GST_VIDEO_LIBS) $(GST_BASE_LIBS) $(LDADD)
elements_compositor_CFLAGS = \
$(GST_PLUGINS_BASE_CFLAGS) \
$(GST_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS)
@@ -619,7 +653,7 @@
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) \
+elements_hls_demux_LDADD = $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) $(LDADD) \
-lgsttag-$(GST_API_VERSION) \
-lgstapp-$(GST_API_VERSION) \
$(top_builddir)/gst-libs/gst/adaptivedemux/libgstadaptivedemux-@GST_API_VERSION@.la
diff --git a/tests/check/Makefile.in b/tests/check/Makefile.in
index ee20570..cf3a183 100644
--- a/tests/check/Makefile.in
+++ b/tests/check/Makefile.in
@@ -91,14 +91,14 @@
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
-noinst_PROGRAMS = pipelines/streamheader$(EXEEXT) $(am__EXEEXT_29)
+noinst_PROGRAMS = pipelines/streamheader$(EXEEXT) $(am__EXEEXT_28) \
+ $(am__EXEEXT_29)
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_14) $(am__EXEEXT_16) $(am__EXEEXT_17) \
- elements/aiffparse$(EXEEXT) \
+ $(am__EXEEXT_15) $(am__EXEEXT_16) elements/aiffparse$(EXEEXT) \
elements/videoframe-audiolevel$(EXEEXT) \
elements/autoconvert$(EXEEXT) \
elements/autovideoconvert$(EXEEXT) \
@@ -106,21 +106,24 @@
elements/asfmux$(EXEEXT) elements/camerabin$(EXEEXT) \
elements/dataurisrc$(EXEEXT) elements/gdppay$(EXEEXT) \
elements/gdpdepay$(EXEEXT) elements/compositor$(EXEEXT) \
- $(am__EXEEXT_18) elements/jpegparse$(EXEEXT) \
+ $(am__EXEEXT_17) elements/jpegparse$(EXEEXT) \
elements/h263parse$(EXEEXT) elements/h264parse$(EXEEXT) \
elements/mpegtsmux$(EXEEXT) elements/mpegvideoparse$(EXEEXT) \
elements/mpeg4videoparse$(EXEEXT) elements/mxfdemux$(EXEEXT) \
elements/mxfmux$(EXEEXT) elements/netsim$(EXEEXT) \
- elements/pcapparse$(EXEEXT) elements/rtponvifparse$(EXEEXT) \
+ elements/pcapparse$(EXEEXT) elements/pnm$(EXEEXT) \
+ elements/rawaudioparse$(EXEEXT) \
+ elements/rawvideoparse$(EXEEXT) \
+ elements/rtponvifparse$(EXEEXT) \
elements/rtponviftimestamp$(EXEEXT) elements/id3mux$(EXEEXT) \
- pipelines/mxf$(EXEEXT) $(am__EXEEXT_19) \
+ pipelines/mxf$(EXEEXT) $(am__EXEEXT_18) \
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) $(am__EXEEXT_27) $(am__EXEEXT_28)
+ libs/aggregator$(EXEEXT) $(am__EXEEXT_19) \
+ libs/vc1parser$(EXEEXT) $(am__EXEEXT_20) $(am__EXEEXT_21) \
+ elements/viewfinderbin$(EXEEXT) $(am__EXEEXT_22) \
+ $(am__EXEEXT_23) libs/insertbin$(EXEEXT) $(am__EXEEXT_24) \
+ $(am__EXEEXT_25) $(am__EXEEXT_26) $(am__EXEEXT_27)
@WITH_GST_PLAYER_TESTS_TRUE@am__append_1 = $(PLAYER_MEDIA_FILES) libs/player_dummy.c
subdir = tests/check
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -178,42 +181,44 @@
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libparser_la_CFLAGS) \
$(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_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_SMOOTHSTREAMING_TRUE@am__EXEEXT_10 = elements/mssdemux$(EXEEXT)
-@USE_OFA_TRUE@am__EXEEXT_11 = elements/ofa$(EXEEXT)
-@USE_TIMIDITY_TRUE@am__EXEEXT_12 = elements/timidity$(EXEEXT)
-@USE_KATE_TRUE@am__EXEEXT_13 = elements/kate$(EXEEXT)
-@USE_OPENCV_TRUE@am__EXEEXT_14 = elements/templatematch$(EXEEXT)
-@USE_SSH2_TRUE@am__EXEEXT_15 = elements/curlsftpsink$(EXEEXT)
-@USE_CURL_TRUE@am__EXEEXT_16 = elements/curlhttpsink$(EXEEXT) \
+@USE_DASH_TRUE@am__EXEEXT_2 = elements/dash_mpd$(EXEEXT) \
+@USE_DASH_TRUE@ elements/dash_isoff$(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_SMOOTHSTREAMING_TRUE@am__EXEEXT_9 = elements/mssdemux$(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_SSH2_TRUE@am__EXEEXT_14 = elements/curlsftpsink$(EXEEXT)
+@USE_CURL_TRUE@am__EXEEXT_15 = elements/curlhttpsink$(EXEEXT) \
@USE_CURL_TRUE@ elements/curlfilesink$(EXEEXT) \
-@USE_CURL_TRUE@ elements/curlftpsink$(EXEEXT) $(am__EXEEXT_15) \
+@USE_CURL_TRUE@ elements/curlftpsink$(EXEEXT) $(am__EXEEXT_14) \
@USE_CURL_TRUE@ elements/curlsmtpsink$(EXEEXT)
-@USE_SHM_TRUE@am__EXEEXT_17 = elements/shm$(EXEEXT)
-@USE_EXIF_TRUE@am__EXEEXT_18 = elements/jifmux$(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_16 = elements/shm$(EXEEXT)
+@USE_EXIF_TRUE@am__EXEEXT_17 = elements/jifmux$(EXEEXT)
+@USE_MIMIC_TRUE@am__EXEEXT_18 = pipelines/mimic$(EXEEXT)
+@USE_UVCH264_TRUE@am__EXEEXT_19 = elements/uvch264demux$(EXEEXT)
+@USE_SCHRO_TRUE@am__EXEEXT_20 = elements/schroenc$(EXEEXT)
+@USE_X265_TRUE@am__EXEEXT_21 = elements/x265enc$(EXEEXT)
+@USE_ZBAR_TRUE@am__EXEEXT_22 = elements/zbar$(EXEEXT)
+@HAVE_ORC_TRUE@am__EXEEXT_23 = 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_24 = 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/gstglquery$(EXEEXT) libs/gstglsl$(EXEEXT) \
-@USE_GL_TRUE@ elements/glimagesink$(EXEEXT)
-@USE_HLS_TRUE@am__EXEEXT_26 = elements/hlsdemux_m3u8$(EXEEXT)
-@USE_HLS_TRUE@am__EXEEXT_27 = elements/hls_demux$(EXEEXT)
-@WITH_GST_PLAYER_TESTS_TRUE@am__EXEEXT_28 = libs/player$(EXEEXT)
+@USE_GL_TRUE@ elements/glimagesink$(EXEEXT) \
+@USE_GL_TRUE@ pipelines/simple-launch-lines$(EXEEXT)
+@USE_HLS_TRUE@am__EXEEXT_25 = elements/hlsdemux_m3u8$(EXEEXT)
+@USE_HLS_TRUE@am__EXEEXT_26 = elements/hls_demux$(EXEEXT)
+@WITH_GST_PLAYER_TESTS_TRUE@am__EXEEXT_27 = libs/player$(EXEEXT)
+@USE_DASH_TRUE@am__EXEEXT_28 = elements/dash_demux$(EXEEXT)
@USE_NEON_TRUE@am__EXEEXT_29 = elements/neonhttpsrc$(EXEEXT)
PROGRAMS = $(noinst_PROGRAMS)
elements_aiffparse_SOURCES = elements/aiffparse.c
@@ -230,7 +235,8 @@
elements/elements_assrender-assrender.$(OBJEXT)
am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
elements_assrender_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_2)
elements_assrender_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
$(elements_assrender_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
@@ -239,7 +245,7 @@
elements_audiointerleave_OBJECTS = \
elements/elements_audiointerleave-audiointerleave.$(OBJEXT)
elements_audiointerleave_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_2)
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
elements_audiointerleave_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
$(elements_audiointerleave_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
@@ -277,7 +283,8 @@
elements_compositor_OBJECTS = \
elements/elements_compositor-compositor.$(OBJEXT)
elements_compositor_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_2)
elements_compositor_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
$(elements_compositor_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
@@ -310,11 +317,21 @@
elements_dash_demux_OBJECTS = $(am_elements_dash_demux_OBJECTS)
elements_dash_demux_DEPENDENCIES = $(am__DEPENDENCIES_2) \
$(am__DEPENDENCIES_1) $(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_isoff_OBJECTS = \
+ elements/elements_dash_isoff-dash_isoff.$(OBJEXT)
+elements_dash_isoff_OBJECTS = $(am_elements_dash_isoff_OBJECTS)
+elements_dash_isoff_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+ $(am__DEPENDENCIES_1)
+elements_dash_isoff_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(elements_dash_isoff_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)
@@ -333,7 +350,7 @@
elements_faac_OBJECTS = elements/elements_faac-faac.$(OBJEXT)
elements_faac_DEPENDENCIES = $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_2)
+ $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
elements_faac_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(elements_faac_CFLAGS) \
$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
@@ -341,7 +358,7 @@
elements_faad_OBJECTS = elements/elements_faad-faad.$(OBJEXT)
elements_faad_DEPENDENCIES = $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_2)
+ $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
elements_faad_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(elements_faad_CFLAGS) \
$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
@@ -368,7 +385,8 @@
elements_glimagesink_DEPENDENCIES = \
$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_2)
elements_glimagesink_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
$(elements_glimagesink_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
@@ -386,7 +404,7 @@
elements/elements_hls_demux-hls_demux.$(OBJEXT)
elements_hls_demux_OBJECTS = $(am_elements_hls_demux_OBJECTS)
elements_hls_demux_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_2) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) \
$(top_builddir)/gst-libs/gst/adaptivedemux/libgstadaptivedemux-@GST_API_VERSION@.la
elements_hls_demux_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
@@ -438,7 +456,8 @@
elements_mpegtsmux_OBJECTS = \
elements/elements_mpegtsmux-mpegtsmux.$(OBJEXT)
elements_mpegtsmux_DEPENDENCIES = $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_2)
elements_mpegtsmux_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
$(elements_mpegtsmux_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
@@ -459,6 +478,7 @@
elements_mssdemux_OBJECTS = $(am_elements_mssdemux_OBJECTS)
elements_mssdemux_DEPENDENCIES = $(am__DEPENDENCIES_2) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) \
$(top_builddir)/gst-libs/gst/adaptivedemux/libgstadaptivedemux-@GST_API_VERSION@.la
elements_mssdemux_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
@@ -473,9 +493,14 @@
elements_mxfmux_LDADD = $(LDADD)
elements_mxfmux_DEPENDENCIES = $(am__DEPENDENCIES_1)
elements_neonhttpsrc_SOURCES = elements/neonhttpsrc.c
-elements_neonhttpsrc_OBJECTS = elements/neonhttpsrc.$(OBJEXT)
+elements_neonhttpsrc_OBJECTS = \
+ elements/elements_neonhttpsrc-neonhttpsrc.$(OBJEXT)
elements_neonhttpsrc_LDADD = $(LDADD)
elements_neonhttpsrc_DEPENDENCIES = $(am__DEPENDENCIES_1)
+elements_neonhttpsrc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(elements_neonhttpsrc_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
elements_netsim_SOURCES = elements/netsim.c
elements_netsim_OBJECTS = elements/netsim.$(OBJEXT)
elements_netsim_LDADD = $(LDADD)
@@ -487,6 +512,31 @@
elements_pcapparse_SOURCES = elements/pcapparse.c
elements_pcapparse_OBJECTS = elements/pcapparse.$(OBJEXT)
elements_pcapparse_DEPENDENCIES = libparser.la $(am__DEPENDENCIES_2)
+elements_pnm_SOURCES = elements/pnm.c
+elements_pnm_OBJECTS = elements/elements_pnm-pnm.$(OBJEXT)
+elements_pnm_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+elements_pnm_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(elements_pnm_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+elements_rawaudioparse_SOURCES = elements/rawaudioparse.c
+elements_rawaudioparse_OBJECTS = \
+ elements/elements_rawaudioparse-rawaudioparse.$(OBJEXT)
+elements_rawaudioparse_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+elements_rawaudioparse_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(elements_rawaudioparse_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+elements_rawvideoparse_SOURCES = elements/rawvideoparse.c
+elements_rawvideoparse_OBJECTS = \
+ elements/elements_rawvideoparse-rawvideoparse.$(OBJEXT)
+elements_rawvideoparse_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+elements_rawvideoparse_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(elements_rawvideoparse_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
elements_rtponvifparse_SOURCES = elements/rtponvifparse.c
elements_rtponvifparse_OBJECTS = \
elements/elements_rtponvifparse-rtponvifparse.$(OBJEXT)
@@ -541,7 +591,7 @@
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)
+ $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
elements_videoframe_audiolevel_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
$(elements_videoframe_audiolevel_CFLAGS) $(CFLAGS) \
@@ -555,7 +605,7 @@
elements/elements_voaacenc-voaacenc.$(OBJEXT)
elements_voaacenc_DEPENDENCIES = $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_2)
+ $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
elements_voaacenc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
$(elements_voaacenc_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
@@ -595,7 +645,8 @@
libs_gstglcolorconvert_DEPENDENCIES = \
$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_2)
libs_gstglcolorconvert_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
$(libs_gstglcolorconvert_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
@@ -606,7 +657,8 @@
libs_gstglcontext_DEPENDENCIES = \
$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_2)
libs_gstglcontext_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
$(libs_gstglcontext_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
@@ -617,7 +669,8 @@
libs_gstglmemory_DEPENDENCIES = \
$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_2)
libs_gstglmemory_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
$(libs_gstglmemory_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
@@ -647,7 +700,8 @@
libs_gstglupload_DEPENDENCIES = \
$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_2)
libs_gstglupload_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
$(libs_gstglupload_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
@@ -694,7 +748,8 @@
$(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)
+ $(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 $@
@@ -746,6 +801,15 @@
pipelines_mxf_OBJECTS = pipelines/mxf.$(OBJEXT)
pipelines_mxf_LDADD = $(LDADD)
pipelines_mxf_DEPENDENCIES = $(am__DEPENDENCIES_1)
+pipelines_simple_launch_lines_SOURCES = \
+ pipelines/simple-launch-lines.c
+pipelines_simple_launch_lines_OBJECTS = pipelines/pipelines_simple_launch_lines-simple-launch-lines.$(OBJEXT)
+pipelines_simple_launch_lines_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+pipelines_simple_launch_lines_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(pipelines_simple_launch_lines_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
pipelines_streamheader_SOURCES = pipelines/streamheader.c
pipelines_streamheader_OBJECTS = \
pipelines/pipelines_streamheader-streamheader.$(OBJEXT)
@@ -797,10 +861,11 @@
elements/curlfilesink.c elements/curlftpsink.c \
elements/curlhttpsink.c elements/curlsftpsink.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_hls_demux_SOURCES) \
+ $(elements_dash_isoff_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_hls_demux_SOURCES) \
$(elements_hlsdemux_m3u8_SOURCES) elements/id3mux.c \
$(elements_jifmux_SOURCES) elements/jpegparse.c \
elements/kate.c elements/mpeg2enc.c elements/mpeg4videoparse.c \
@@ -808,20 +873,23 @@
elements/mplex.c $(elements_mssdemux_SOURCES) \
elements/mxfdemux.c elements/mxfmux.c elements/neonhttpsrc.c \
elements/netsim.c elements/ofa.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/gstglquery.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
+ elements/pnm.c elements/rawaudioparse.c \
+ elements/rawvideoparse.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/gstglquery.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/simple-launch-lines.c \
+ pipelines/streamheader.c
DIST_SOURCES = $(libparser_la_SOURCES) elements/aiffparse.c \
elements/asfmux.c elements/assrender.c \
elements/audiointerleave.c elements/audiomixer.c \
@@ -830,10 +898,11 @@
elements/curlfilesink.c elements/curlftpsink.c \
elements/curlhttpsink.c elements/curlsftpsink.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_hls_demux_SOURCES) \
+ $(elements_dash_isoff_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_hls_demux_SOURCES) \
$(elements_hlsdemux_m3u8_SOURCES) elements/id3mux.c \
$(elements_jifmux_SOURCES) elements/jpegparse.c \
elements/kate.c elements/mpeg2enc.c elements/mpeg4videoparse.c \
@@ -841,18 +910,20 @@
elements/mplex.c $(elements_mssdemux_SOURCES) \
elements/mxfdemux.c elements/mxfmux.c elements/neonhttpsrc.c \
elements/netsim.c elements/ofa.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/gstglquery.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
+ elements/pnm.c elements/rawaudioparse.c \
+ elements/rawvideoparse.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/gstglquery.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/simple-launch-lines.c pipelines/streamheader.c
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
@@ -1149,6 +1220,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -1170,6 +1243,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -1219,6 +1294,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -1364,6 +1441,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -1490,8 +1569,6 @@
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@
@@ -1534,8 +1611,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -1634,10 +1716,10 @@
dc1394src dccpclientsrc dccpclientsink dccpserversrc \
dccpserversink decklinksrc decklinksink dtlssrtpdec \
dtlssrtpenc dvbsrc dvbbasebin dfbvideosink festival fluidsynth \
- linsyssdisrc linsyssdisink nassink rsndvdbin sdlaudiosink \
- sdlvideosink vcdsrc rfbsrc vdpauyuvvideo vdpauvideoyuv \
- vdpaumpegdec vdpaumpeg4dec vdpauh264dec vdpauvideopostprocess \
- vdpausink neonhttpsrc"
+ linsyssdisrc linsyssdisink nassink kmssink rsndvdbin \
+ sdlaudiosink sdlvideosink vcdsrc rfbsrc vdpauyuvvideo \
+ vdpauvideoyuv vdpaumpegdec vdpaumpeg4dec vdpauh264dec \
+ vdpauvideopostprocess vdpausink neonhttpsrc"
# inspect every plugin feature
GST_INSPECT = $(GST_TOOLS_DIR)/gst-inspect-$(GST_API_VERSION)
@@ -1653,7 +1735,7 @@
@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_TRUE@check_dash = elements/dash_mpd elements/dash_isoff
@USE_DASH_FALSE@check_dash_demux =
@USE_DASH_TRUE@check_dash_demux = elements/dash_demux
@USE_FAAC_FALSE@check_faac =
@@ -1725,7 +1807,8 @@
@USE_GL_TRUE@ libs/gstglcolorconvert \
@USE_GL_TRUE@ libs/gstglquery \
@USE_GL_TRUE@ libs/gstglsl \
-@USE_GL_TRUE@ elements/glimagesink
+@USE_GL_TRUE@ elements/glimagesink \
+@USE_GL_TRUE@ pipelines/simple-launch-lines
VALGRIND_TO_FIX = \
elements/mpeg2enc \
@@ -1737,21 +1820,27 @@
VALGRIND_TESTS_DISABLE = \
$(VALGRIND_TO_FIX)
-noinst_HEADERS = elements/mxfdemux.h
+noinst_HEADERS = elements/mxfdemux.h elements/dash_isoff.h
TESTS = $(check_PROGRAMS)
AM_CFLAGS = $(GST_CFLAGS) $(GST_CHECK_CFLAGS) $(GST_OPTION_CFLAGS) \
-DGST_CHECK_TEST_ENVIRONMENT_BEACON="\"GST_PLUGIN_LOADING_WHITELIST\"" \
-DGST_TEST_FILES_PATH="\"$(TEST_FILES_DIRECTORY)\"" \
- -UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS
+ -UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS $(PTHREAD_CFLAGS)
LDADD = $(GST_CHECK_LIBS)
generic_states_CFLAGS = $(AM_CFLAGS) $(GMODULE_NO_EXPORT_CFLAGS)
generic_states_LDADD = $(LDADD) $(GMODULE_NO_EXPORT_LIBS)
elements_audiomixer_LDADD = $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) -lgstbase-@GST_API_VERSION@ $(LDADD)
elements_audiomixer_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(AM_CFLAGS)
-elements_audiointerleave_LDADD = $(GST_BASE_LIBS) -lgstbase-@GST_API_VERSION@ -lgstaudio-@GST_API_VERSION@ $(LDADD)
+elements_audiointerleave_LDADD = $(GST_BASE_LIBS) -lgstbase-@GST_API_VERSION@ $(GST_AUDIO_LIBS) $(LDADD)
elements_audiointerleave_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+elements_pnm_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS)
+elements_pnm_LDADD = \
+ $(GST_PLUGINS_BASE_LIBS) -lgstapp-$(GST_API_VERSION) $(GST_BASE_LIBS) $(LDADD)
+
+#
# parser unit test convenience lib
noinst_LTLIBRARIES = libparser.la
libparser_la_SOURCES = elements/parser.c elements/parser.h
@@ -1764,6 +1853,10 @@
elements_h263parse_LDADD = libparser.la $(LDADD)
elements_h264parse_LDADD = libparser.la $(LDADD)
elements_pcapparse_LDADD = libparser.la $(LDADD)
+elements_rawaudioparse_LDADD = $(GST_BASE_LIBS) -lgstbase-@GST_API_VERSION@ $(GST_AUDIO_LIBS) $(LDADD)
+elements_rawaudioparse_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+elements_rawvideoparse_LDADD = $(GST_BASE_LIBS) -lgstbase-@GST_API_VERSION@ $(GST_VIDEO_LIBS) $(LDADD)
+elements_rawvideoparse_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS)
libs_mpegvideoparser_CFLAGS = \
$(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
-DGST_USE_UNSTABLE_API \
@@ -1776,7 +1869,8 @@
libs_mpegts_CFLAGS = \
$(GST_PLUGINS_BAD_CFLAGS) \
-DGST_USE_UNSTABLE_API \
- $(GST_CFLAGS)
+ $(GST_CFLAGS) \
+ $(PTHREAD_CFLAGS)
libs_mpegts_LDADD = \
$(top_builddir)/gst-libs/gst/mpegts/libgstmpegts-@GST_API_VERSION@.la \
@@ -1817,7 +1911,7 @@
elements_videoframe_audiolevel_LDADD = \
$(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD) \
- -lgstaudio-@GST_API_VERSION@
+ $(GST_AUDIO_LIBS)
elements_faad_CFLAGS = \
$(GST_PLUGINS_BASE_CFLAGS) \
@@ -1825,7 +1919,7 @@
elements_faad_LDADD = \
$(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD) \
- -lgstaudio-@GST_API_VERSION@
+ $(GST_AUDIO_LIBS)
elements_faac_CFLAGS = \
$(GST_PLUGINS_BASE_CFLAGS) \
@@ -1833,7 +1927,7 @@
elements_faac_LDADD = \
$(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD) \
- -lgstaudio-@GST_API_VERSION@
+ $(GST_AUDIO_LIBS)
elements_gdppay_CFLAGS = \
$(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
@@ -1849,7 +1943,7 @@
elements_voaacenc_LDADD = \
$(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD) \
- -lgstaudio-@GST_API_VERSION@
+ $(GST_AUDIO_LIBS)
elements_camerabin_CFLAGS = \
$(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
@@ -1870,9 +1964,9 @@
elements_kate_CFLAGS = $(GST_BASE_CFLAGS) $(AM_CFLAGS)
elements_kate_LDADD = $(GST_BASE_LIBS) $(LDADD)
elements_assrender_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS)
-elements_assrender_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) -lgstapp-$(GST_API_VERSION) $(GST_BASE_LIBS) $(LDADD)
+elements_assrender_LDADD = $(GST_PLUGINS_BASE_LIBS) $(GST_VIDEO_LIBS) -lgstapp-$(GST_API_VERSION) $(GST_BASE_LIBS) $(LDADD)
elements_mpegtsmux_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS)
-elements_mpegtsmux_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) $(GST_BASE_LIBS) $(LDADD)
+elements_mpegtsmux_LDADD = $(GST_PLUGINS_BASE_LIBS) $(GST_VIDEO_LIBS) $(GST_BASE_LIBS) $(LDADD)
elements_uvch264demux_CFLAGS = -DUVCH264DEMUX_DATADIR="$(srcdir)/elements/uvch264demux_data" \
$(AM_CFLAGS)
@@ -1881,17 +1975,21 @@
$(top_builddir)/gst-libs/gst/uridownloader/libgsturidownloader-@GST_API_VERSION@.la
elements_dash_mpd_SOURCES = elements/dash_mpd.c
+elements_dash_isoff_CFLAGS = $(AM_CFLAGS) $(GST_BASE_CFLAGS)
+elements_dash_isoff_LDADD = $(LDADD) $(GST_BASE_LIBS)
+elements_dash_isoff_SOURCES = elements/dash_isoff.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) \
+ $(LDADD) $(LIBXML2_LIBS) $(GST_BASE_LIBS) $(GST_PLUGINS_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
+elements_neonhttpsrc_CFLAGS = $(AM_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS)
elements_mssdemux_CFLAGS = $(AM_CFLAGS) $(LIBXML2_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_PLUGINS_BAD_CFLAGS)
elements_mssdemux_LDADD = \
- $(LDADD) $(LIBXML2_LIBS) $(GST_BASE_LIBS) \
+ $(LDADD) $(LIBXML2_LIBS) $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) \
-lgsttag-$(GST_API_VERSION) \
-lgstapp-$(GST_API_VERSION) \
$(top_builddir)/gst-libs/gst/adaptivedemux/libgstadaptivedemux-@GST_API_VERSION@.la
@@ -1909,10 +2007,11 @@
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)
+ $(GST_VIDEO_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) \
+ $(LDADD)
libs_player_CFLAGS = \
- $(GST_PLUGINS_BAD_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS) \
+ $(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS) \
-DTEST_PATH=\"$(builddir)/media\"
@WITH_GST_PLAYER_TESTS_TRUE@PLAYER_MEDIA_FILES = \
@@ -1937,7 +2036,8 @@
nodist_orc_audiomixer_SOURCES = orc/audiomixer.c
libs_gstglcontext_LDADD = \
$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
- $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD)
+ $(GST_PLUGINS_BASE_LIBS) $(GST_VIDEO_LIBS) $(GST_BASE_LIBS) \
+ $(GST_LIBS) $(LDADD)
libs_gstglcontext_CFLAGS = \
$(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
@@ -1946,8 +2046,8 @@
libs_gstglmemory_LDADD = \
$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
- $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) \
- $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD)
+ $(GST_PLUGINS_BASE_LIBS) $(GST_VIDEO_LIBS) $(GST_BASE_LIBS) \
+ $(GST_LIBS) $(LDADD)
libs_gstglmemory_CFLAGS = \
$(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
@@ -1961,8 +2061,8 @@
libs_gstglupload_LDADD = \
$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
- $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) \
- $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD)
+ $(GST_PLUGINS_BASE_LIBS) $(GST_VIDEO_LIBS) $(GST_BASE_LIBS) \
+ $(GST_LIBS) $(LDADD)
libs_gstglcolorconvert_CFLAGS = \
$(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
@@ -1971,8 +2071,8 @@
libs_gstglcolorconvert_LDADD = \
$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
- $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) \
- $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD)
+ $(GST_PLUGINS_BASE_LIBS) $(GST_VIDEO_LIBS) $(GST_BASE_LIBS) \
+ $(GST_LIBS) $(LDADD)
libs_gstglquery_LDADD = \
$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
@@ -1999,7 +2099,15 @@
elements_glimagesink_LDADD = \
$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
- $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) \
+ $(GST_PLUGINS_BASE_LIBS) $(GST_VIDEO_LIBS) $(GST_BASE_LIBS) \
+ $(GST_LIBS) $(LDADD)
+
+pipelines_simple_launch_lines_CFLAGS = \
+ $(GST_PLUGINS_BAD_CFLAGS) \
+ -DGST_USE_UNSTABLE_API \
+ $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
+
+pipelines_simple_launch_lines_LDADD = \
$(GST_BASE_LIBS) $(GST_LIBS) $(LDADD)
libs_aggregator_LDADD = \
@@ -2013,8 +2121,7 @@
$(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
elements_compositor_LDADD = \
- $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) \
- $(GST_BASE_LIBS) $(LDADD)
+ $(GST_PLUGINS_BASE_LIBS) $(GST_VIDEO_LIBS) $(GST_BASE_LIBS) $(LDADD)
elements_compositor_CFLAGS = \
$(GST_PLUGINS_BASE_CFLAGS) \
@@ -2024,7 +2131,7 @@
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) \
+elements_hls_demux_LDADD = $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) $(LDADD) \
-lgsttag-$(GST_API_VERSION) \
-lgstapp-$(GST_API_VERSION) \
$(top_builddir)/gst-libs/gst/adaptivedemux/libgstadaptivedemux-@GST_API_VERSION@.la
@@ -2204,6 +2311,12 @@
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_isoff-dash_isoff.$(OBJEXT): \
+ elements/$(am__dirstamp) elements/$(DEPDIR)/$(am__dirstamp)
+
+elements/dash_isoff$(EXEEXT): $(elements_dash_isoff_OBJECTS) $(elements_dash_isoff_DEPENDENCIES) $(EXTRA_elements_dash_isoff_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/dash_isoff$(EXEEXT)
+ $(AM_V_CCLD)$(elements_dash_isoff_LINK) $(elements_dash_isoff_OBJECTS) $(elements_dash_isoff_LDADD) $(LIBS)
elements/elements_dash_mpd-dash_mpd.$(OBJEXT): \
elements/$(am__dirstamp) elements/$(DEPDIR)/$(am__dirstamp)
@@ -2354,12 +2467,12 @@
elements/mxfmux$(EXEEXT): $(elements_mxfmux_OBJECTS) $(elements_mxfmux_DEPENDENCIES) $(EXTRA_elements_mxfmux_DEPENDENCIES) elements/$(am__dirstamp)
@rm -f elements/mxfmux$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(elements_mxfmux_OBJECTS) $(elements_mxfmux_LDADD) $(LIBS)
-elements/neonhttpsrc.$(OBJEXT): elements/$(am__dirstamp) \
- elements/$(DEPDIR)/$(am__dirstamp)
+elements/elements_neonhttpsrc-neonhttpsrc.$(OBJEXT): \
+ elements/$(am__dirstamp) elements/$(DEPDIR)/$(am__dirstamp)
elements/neonhttpsrc$(EXEEXT): $(elements_neonhttpsrc_OBJECTS) $(elements_neonhttpsrc_DEPENDENCIES) $(EXTRA_elements_neonhttpsrc_DEPENDENCIES) elements/$(am__dirstamp)
@rm -f elements/neonhttpsrc$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(elements_neonhttpsrc_OBJECTS) $(elements_neonhttpsrc_LDADD) $(LIBS)
+ $(AM_V_CCLD)$(elements_neonhttpsrc_LINK) $(elements_neonhttpsrc_OBJECTS) $(elements_neonhttpsrc_LDADD) $(LIBS)
elements/netsim.$(OBJEXT): elements/$(am__dirstamp) \
elements/$(DEPDIR)/$(am__dirstamp)
@@ -2378,6 +2491,24 @@
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_pnm-pnm.$(OBJEXT): elements/$(am__dirstamp) \
+ elements/$(DEPDIR)/$(am__dirstamp)
+
+elements/pnm$(EXEEXT): $(elements_pnm_OBJECTS) $(elements_pnm_DEPENDENCIES) $(EXTRA_elements_pnm_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/pnm$(EXEEXT)
+ $(AM_V_CCLD)$(elements_pnm_LINK) $(elements_pnm_OBJECTS) $(elements_pnm_LDADD) $(LIBS)
+elements/elements_rawaudioparse-rawaudioparse.$(OBJEXT): \
+ elements/$(am__dirstamp) elements/$(DEPDIR)/$(am__dirstamp)
+
+elements/rawaudioparse$(EXEEXT): $(elements_rawaudioparse_OBJECTS) $(elements_rawaudioparse_DEPENDENCIES) $(EXTRA_elements_rawaudioparse_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/rawaudioparse$(EXEEXT)
+ $(AM_V_CCLD)$(elements_rawaudioparse_LINK) $(elements_rawaudioparse_OBJECTS) $(elements_rawaudioparse_LDADD) $(LIBS)
+elements/elements_rawvideoparse-rawvideoparse.$(OBJEXT): \
+ elements/$(am__dirstamp) elements/$(DEPDIR)/$(am__dirstamp)
+
+elements/rawvideoparse$(EXEEXT): $(elements_rawvideoparse_OBJECTS) $(elements_rawvideoparse_DEPENDENCIES) $(EXTRA_elements_rawvideoparse_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/rawvideoparse$(EXEEXT)
+ $(AM_V_CCLD)$(elements_rawvideoparse_LINK) $(elements_rawvideoparse_OBJECTS) $(elements_rawvideoparse_LDADD) $(LIBS)
elements/elements_rtponvifparse-rtponvifparse.$(OBJEXT): \
elements/$(am__dirstamp) elements/$(DEPDIR)/$(am__dirstamp)
@@ -2602,6 +2733,12 @@
pipelines/mxf$(EXEEXT): $(pipelines_mxf_OBJECTS) $(pipelines_mxf_DEPENDENCIES) $(EXTRA_pipelines_mxf_DEPENDENCIES) pipelines/$(am__dirstamp)
@rm -f pipelines/mxf$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(pipelines_mxf_OBJECTS) $(pipelines_mxf_LDADD) $(LIBS)
+pipelines/pipelines_simple_launch_lines-simple-launch-lines.$(OBJEXT): \
+ pipelines/$(am__dirstamp) pipelines/$(DEPDIR)/$(am__dirstamp)
+
+pipelines/simple-launch-lines$(EXEEXT): $(pipelines_simple_launch_lines_OBJECTS) $(pipelines_simple_launch_lines_DEPENDENCIES) $(EXTRA_pipelines_simple_launch_lines_DEPENDENCIES) pipelines/$(am__dirstamp)
+ @rm -f pipelines/simple-launch-lines$(EXEEXT)
+ $(AM_V_CCLD)$(pipelines_simple_launch_lines_LINK) $(pipelines_simple_launch_lines_OBJECTS) $(pipelines_simple_launch_lines_LDADD) $(LIBS)
pipelines/pipelines_streamheader-streamheader.$(OBJEXT): \
pipelines/$(am__dirstamp) pipelines/$(DEPDIR)/$(am__dirstamp)
@@ -2640,6 +2777,7 @@
@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_isoff-dash_isoff.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@
@@ -2658,6 +2796,10 @@
@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_mssdemux-adaptive_demux_engine.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_mssdemux-mssdemux.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_mssdemux-test_http_src.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_neonhttpsrc-neonhttpsrc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_pnm-pnm.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_rawaudioparse-rawaudioparse.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_rawvideoparse-rawvideoparse.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@
@@ -2675,7 +2817,6 @@
@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/mplex.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/mxfdemux.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/mxfmux.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/neonhttpsrc.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/netsim.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/ofa.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/pcapparse.Po@am__quote@
@@ -2707,6 +2848,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@orc/$(DEPDIR)/orc_compositor-compositor.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@pipelines/$(DEPDIR)/mimic.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@pipelines/$(DEPDIR)/mxf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@pipelines/$(DEPDIR)/pipelines_simple_launch_lines-simple-launch-lines.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@pipelines/$(DEPDIR)/pipelines_streamheader-streamheader.Po@am__quote@
.c.o:
@@ -2866,6 +3008,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_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_isoff-dash_isoff.o: elements/dash_isoff.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_dash_isoff_CFLAGS) $(CFLAGS) -MT elements/elements_dash_isoff-dash_isoff.o -MD -MP -MF elements/$(DEPDIR)/elements_dash_isoff-dash_isoff.Tpo -c -o elements/elements_dash_isoff-dash_isoff.o `test -f 'elements/dash_isoff.c' || echo '$(srcdir)/'`elements/dash_isoff.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_dash_isoff-dash_isoff.Tpo elements/$(DEPDIR)/elements_dash_isoff-dash_isoff.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/dash_isoff.c' object='elements/elements_dash_isoff-dash_isoff.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_isoff_CFLAGS) $(CFLAGS) -c -o elements/elements_dash_isoff-dash_isoff.o `test -f 'elements/dash_isoff.c' || echo '$(srcdir)/'`elements/dash_isoff.c
+
+elements/elements_dash_isoff-dash_isoff.obj: elements/dash_isoff.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_dash_isoff_CFLAGS) $(CFLAGS) -MT elements/elements_dash_isoff-dash_isoff.obj -MD -MP -MF elements/$(DEPDIR)/elements_dash_isoff-dash_isoff.Tpo -c -o elements/elements_dash_isoff-dash_isoff.obj `if test -f 'elements/dash_isoff.c'; then $(CYGPATH_W) 'elements/dash_isoff.c'; else $(CYGPATH_W) '$(srcdir)/elements/dash_isoff.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_dash_isoff-dash_isoff.Tpo elements/$(DEPDIR)/elements_dash_isoff-dash_isoff.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/dash_isoff.c' object='elements/elements_dash_isoff-dash_isoff.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_isoff_CFLAGS) $(CFLAGS) -c -o elements/elements_dash_isoff-dash_isoff.obj `if test -f 'elements/dash_isoff.c'; then $(CYGPATH_W) 'elements/dash_isoff.c'; else $(CYGPATH_W) '$(srcdir)/elements/dash_isoff.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
@@ -3118,6 +3274,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_mssdemux_CFLAGS) $(CFLAGS) -c -o elements/elements_mssdemux-mssdemux.obj `if test -f 'elements/mssdemux.c'; then $(CYGPATH_W) 'elements/mssdemux.c'; else $(CYGPATH_W) '$(srcdir)/elements/mssdemux.c'; fi`
+elements/elements_neonhttpsrc-neonhttpsrc.o: elements/neonhttpsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_neonhttpsrc_CFLAGS) $(CFLAGS) -MT elements/elements_neonhttpsrc-neonhttpsrc.o -MD -MP -MF elements/$(DEPDIR)/elements_neonhttpsrc-neonhttpsrc.Tpo -c -o elements/elements_neonhttpsrc-neonhttpsrc.o `test -f 'elements/neonhttpsrc.c' || echo '$(srcdir)/'`elements/neonhttpsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_neonhttpsrc-neonhttpsrc.Tpo elements/$(DEPDIR)/elements_neonhttpsrc-neonhttpsrc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/neonhttpsrc.c' object='elements/elements_neonhttpsrc-neonhttpsrc.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_neonhttpsrc_CFLAGS) $(CFLAGS) -c -o elements/elements_neonhttpsrc-neonhttpsrc.o `test -f 'elements/neonhttpsrc.c' || echo '$(srcdir)/'`elements/neonhttpsrc.c
+
+elements/elements_neonhttpsrc-neonhttpsrc.obj: elements/neonhttpsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_neonhttpsrc_CFLAGS) $(CFLAGS) -MT elements/elements_neonhttpsrc-neonhttpsrc.obj -MD -MP -MF elements/$(DEPDIR)/elements_neonhttpsrc-neonhttpsrc.Tpo -c -o elements/elements_neonhttpsrc-neonhttpsrc.obj `if test -f 'elements/neonhttpsrc.c'; then $(CYGPATH_W) 'elements/neonhttpsrc.c'; else $(CYGPATH_W) '$(srcdir)/elements/neonhttpsrc.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_neonhttpsrc-neonhttpsrc.Tpo elements/$(DEPDIR)/elements_neonhttpsrc-neonhttpsrc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/neonhttpsrc.c' object='elements/elements_neonhttpsrc-neonhttpsrc.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_neonhttpsrc_CFLAGS) $(CFLAGS) -c -o elements/elements_neonhttpsrc-neonhttpsrc.obj `if test -f 'elements/neonhttpsrc.c'; then $(CYGPATH_W) 'elements/neonhttpsrc.c'; else $(CYGPATH_W) '$(srcdir)/elements/neonhttpsrc.c'; fi`
+
+elements/elements_pnm-pnm.o: elements/pnm.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_pnm_CFLAGS) $(CFLAGS) -MT elements/elements_pnm-pnm.o -MD -MP -MF elements/$(DEPDIR)/elements_pnm-pnm.Tpo -c -o elements/elements_pnm-pnm.o `test -f 'elements/pnm.c' || echo '$(srcdir)/'`elements/pnm.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_pnm-pnm.Tpo elements/$(DEPDIR)/elements_pnm-pnm.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/pnm.c' object='elements/elements_pnm-pnm.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_pnm_CFLAGS) $(CFLAGS) -c -o elements/elements_pnm-pnm.o `test -f 'elements/pnm.c' || echo '$(srcdir)/'`elements/pnm.c
+
+elements/elements_pnm-pnm.obj: elements/pnm.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_pnm_CFLAGS) $(CFLAGS) -MT elements/elements_pnm-pnm.obj -MD -MP -MF elements/$(DEPDIR)/elements_pnm-pnm.Tpo -c -o elements/elements_pnm-pnm.obj `if test -f 'elements/pnm.c'; then $(CYGPATH_W) 'elements/pnm.c'; else $(CYGPATH_W) '$(srcdir)/elements/pnm.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_pnm-pnm.Tpo elements/$(DEPDIR)/elements_pnm-pnm.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/pnm.c' object='elements/elements_pnm-pnm.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_pnm_CFLAGS) $(CFLAGS) -c -o elements/elements_pnm-pnm.obj `if test -f 'elements/pnm.c'; then $(CYGPATH_W) 'elements/pnm.c'; else $(CYGPATH_W) '$(srcdir)/elements/pnm.c'; fi`
+
+elements/elements_rawaudioparse-rawaudioparse.o: elements/rawaudioparse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rawaudioparse_CFLAGS) $(CFLAGS) -MT elements/elements_rawaudioparse-rawaudioparse.o -MD -MP -MF elements/$(DEPDIR)/elements_rawaudioparse-rawaudioparse.Tpo -c -o elements/elements_rawaudioparse-rawaudioparse.o `test -f 'elements/rawaudioparse.c' || echo '$(srcdir)/'`elements/rawaudioparse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_rawaudioparse-rawaudioparse.Tpo elements/$(DEPDIR)/elements_rawaudioparse-rawaudioparse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rawaudioparse.c' object='elements/elements_rawaudioparse-rawaudioparse.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_rawaudioparse_CFLAGS) $(CFLAGS) -c -o elements/elements_rawaudioparse-rawaudioparse.o `test -f 'elements/rawaudioparse.c' || echo '$(srcdir)/'`elements/rawaudioparse.c
+
+elements/elements_rawaudioparse-rawaudioparse.obj: elements/rawaudioparse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rawaudioparse_CFLAGS) $(CFLAGS) -MT elements/elements_rawaudioparse-rawaudioparse.obj -MD -MP -MF elements/$(DEPDIR)/elements_rawaudioparse-rawaudioparse.Tpo -c -o elements/elements_rawaudioparse-rawaudioparse.obj `if test -f 'elements/rawaudioparse.c'; then $(CYGPATH_W) 'elements/rawaudioparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/rawaudioparse.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_rawaudioparse-rawaudioparse.Tpo elements/$(DEPDIR)/elements_rawaudioparse-rawaudioparse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rawaudioparse.c' object='elements/elements_rawaudioparse-rawaudioparse.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_rawaudioparse_CFLAGS) $(CFLAGS) -c -o elements/elements_rawaudioparse-rawaudioparse.obj `if test -f 'elements/rawaudioparse.c'; then $(CYGPATH_W) 'elements/rawaudioparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/rawaudioparse.c'; fi`
+
+elements/elements_rawvideoparse-rawvideoparse.o: elements/rawvideoparse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rawvideoparse_CFLAGS) $(CFLAGS) -MT elements/elements_rawvideoparse-rawvideoparse.o -MD -MP -MF elements/$(DEPDIR)/elements_rawvideoparse-rawvideoparse.Tpo -c -o elements/elements_rawvideoparse-rawvideoparse.o `test -f 'elements/rawvideoparse.c' || echo '$(srcdir)/'`elements/rawvideoparse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_rawvideoparse-rawvideoparse.Tpo elements/$(DEPDIR)/elements_rawvideoparse-rawvideoparse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rawvideoparse.c' object='elements/elements_rawvideoparse-rawvideoparse.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_rawvideoparse_CFLAGS) $(CFLAGS) -c -o elements/elements_rawvideoparse-rawvideoparse.o `test -f 'elements/rawvideoparse.c' || echo '$(srcdir)/'`elements/rawvideoparse.c
+
+elements/elements_rawvideoparse-rawvideoparse.obj: elements/rawvideoparse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rawvideoparse_CFLAGS) $(CFLAGS) -MT elements/elements_rawvideoparse-rawvideoparse.obj -MD -MP -MF elements/$(DEPDIR)/elements_rawvideoparse-rawvideoparse.Tpo -c -o elements/elements_rawvideoparse-rawvideoparse.obj `if test -f 'elements/rawvideoparse.c'; then $(CYGPATH_W) 'elements/rawvideoparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/rawvideoparse.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_rawvideoparse-rawvideoparse.Tpo elements/$(DEPDIR)/elements_rawvideoparse-rawvideoparse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rawvideoparse.c' object='elements/elements_rawvideoparse-rawvideoparse.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_rawvideoparse_CFLAGS) $(CFLAGS) -c -o elements/elements_rawvideoparse-rawvideoparse.obj `if test -f 'elements/rawvideoparse.c'; then $(CYGPATH_W) 'elements/rawvideoparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/rawvideoparse.c'; fi`
+
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
@@ -3468,6 +3680,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) $(orc_compositor_CFLAGS) $(CFLAGS) -c -o orc/orc_compositor-compositor.obj `if test -f 'orc/compositor.c'; then $(CYGPATH_W) 'orc/compositor.c'; else $(CYGPATH_W) '$(srcdir)/orc/compositor.c'; fi`
+pipelines/pipelines_simple_launch_lines-simple-launch-lines.o: pipelines/simple-launch-lines.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_simple_launch_lines_CFLAGS) $(CFLAGS) -MT pipelines/pipelines_simple_launch_lines-simple-launch-lines.o -MD -MP -MF pipelines/$(DEPDIR)/pipelines_simple_launch_lines-simple-launch-lines.Tpo -c -o pipelines/pipelines_simple_launch_lines-simple-launch-lines.o `test -f 'pipelines/simple-launch-lines.c' || echo '$(srcdir)/'`pipelines/simple-launch-lines.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pipelines/$(DEPDIR)/pipelines_simple_launch_lines-simple-launch-lines.Tpo pipelines/$(DEPDIR)/pipelines_simple_launch_lines-simple-launch-lines.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/simple-launch-lines.c' object='pipelines/pipelines_simple_launch_lines-simple-launch-lines.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) $(pipelines_simple_launch_lines_CFLAGS) $(CFLAGS) -c -o pipelines/pipelines_simple_launch_lines-simple-launch-lines.o `test -f 'pipelines/simple-launch-lines.c' || echo '$(srcdir)/'`pipelines/simple-launch-lines.c
+
+pipelines/pipelines_simple_launch_lines-simple-launch-lines.obj: pipelines/simple-launch-lines.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_simple_launch_lines_CFLAGS) $(CFLAGS) -MT pipelines/pipelines_simple_launch_lines-simple-launch-lines.obj -MD -MP -MF pipelines/$(DEPDIR)/pipelines_simple_launch_lines-simple-launch-lines.Tpo -c -o pipelines/pipelines_simple_launch_lines-simple-launch-lines.obj `if test -f 'pipelines/simple-launch-lines.c'; then $(CYGPATH_W) 'pipelines/simple-launch-lines.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/simple-launch-lines.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pipelines/$(DEPDIR)/pipelines_simple_launch_lines-simple-launch-lines.Tpo pipelines/$(DEPDIR)/pipelines_simple_launch_lines-simple-launch-lines.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/simple-launch-lines.c' object='pipelines/pipelines_simple_launch_lines-simple-launch-lines.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) $(pipelines_simple_launch_lines_CFLAGS) $(CFLAGS) -c -o pipelines/pipelines_simple_launch_lines-simple-launch-lines.obj `if test -f 'pipelines/simple-launch-lines.c'; then $(CYGPATH_W) 'pipelines/simple-launch-lines.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/simple-launch-lines.c'; fi`
+
pipelines/pipelines_streamheader-streamheader.o: pipelines/streamheader.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_streamheader_CFLAGS) $(CFLAGS) -MT pipelines/pipelines_streamheader-streamheader.o -MD -MP -MF pipelines/$(DEPDIR)/pipelines_streamheader-streamheader.Tpo -c -o pipelines/pipelines_streamheader-streamheader.o `test -f 'pipelines/streamheader.c' || echo '$(srcdir)/'`pipelines/streamheader.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pipelines/$(DEPDIR)/pipelines_streamheader-streamheader.Tpo pipelines/$(DEPDIR)/pipelines_streamheader-streamheader.Po
@@ -3707,9 +3933,9 @@
--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'; \
+elements/dash_isoff.log: elements/dash_isoff$(EXEEXT)
+ @p='elements/dash_isoff$(EXEEXT)'; \
+ b='elements/dash_isoff'; \
$(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) \
@@ -3994,6 +4220,27 @@
--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/pnm.log: elements/pnm$(EXEEXT)
+ @p='elements/pnm$(EXEEXT)'; \
+ b='elements/pnm'; \
+ $(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/rawaudioparse.log: elements/rawaudioparse$(EXEEXT)
+ @p='elements/rawaudioparse$(EXEEXT)'; \
+ b='elements/rawaudioparse'; \
+ $(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/rawvideoparse.log: elements/rawvideoparse$(EXEEXT)
+ @p='elements/rawvideoparse$(EXEEXT)'; \
+ b='elements/rawvideoparse'; \
+ $(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/rtponvifparse.log: elements/rtponvifparse$(EXEEXT)
@p='elements/rtponvifparse$(EXEEXT)'; \
b='elements/rtponvifparse'; \
@@ -4183,6 +4430,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)
+pipelines/simple-launch-lines.log: pipelines/simple-launch-lines$(EXEEXT)
+ @p='pipelines/simple-launch-lines$(EXEEXT)'; \
+ b='pipelines/simple-launch-lines'; \
+ $(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/hlsdemux_m3u8.log: elements/hlsdemux_m3u8$(EXEEXT)
@p='elements/hlsdemux_m3u8$(EXEEXT)'; \
b='elements/hlsdemux_m3u8'; \
@@ -4632,6 +4886,7 @@
clean-local: clean-local-check
distclean-local: distclean-local-orc
+ $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
@WITH_GST_PLAYER_TESTS_TRUE@$(PLAYER_MEDIA_FILES):
@WITH_GST_PLAYER_TESTS_TRUE@ $(MKDIR_P) media
diff --git a/tests/check/elements/adaptive_demux_common.c b/tests/check/elements/adaptive_demux_common.c
index e310446..814b0ea 100644
--- a/tests/check/elements/adaptive_demux_common.c
+++ b/tests/check/elements/adaptive_demux_common.c
@@ -25,11 +25,6 @@
#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);
@@ -202,11 +197,6 @@
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];
@@ -242,8 +232,19 @@
return TRUE;
}
-/* function to check total size of data received by AppSink
- * will be called when AppSink receives eos.
+/* AppSink EOS callback.
+ * To be used by tests that don't expect AppSink to receive EOS.
+ */
+void
+gst_adaptive_demux_test_unexpected_eos (GstAdaptiveDemuxTestEngine *
+ engine, GstAdaptiveDemuxTestOutputStream * stream, gpointer user_data)
+{
+ fail_if (TRUE);
+}
+
+/* AppSink EOS callback.
+ * To be used by tests that expect AppSink to receive EOS.
+ * Will check total size of data received by AppSink.
*/
void
gst_adaptive_demux_test_check_size_of_received_data (GstAdaptiveDemuxTestEngine
@@ -430,6 +431,7 @@
TEST_TASK_STATE_WAITING_FOR_TESTSRC_STATE_CHANGE) {
GST_DEBUG ("changing test_task_state");
testData->test_task_state = TEST_TASK_STATE_EXITING;
+ gst_bus_remove_signal_watch (bus);
g_cond_signal (&testData->test_task_state_cond);
}
g_mutex_unlock (&testData->test_task_state_lock);
@@ -453,6 +455,7 @@
gst_bus_add_signal_watch (bus);
g_signal_connect (bus, "message::state-changed",
G_CALLBACK (testSeekOnStateChanged), testData);
+ gst_object_unref (bus);
}
static void
diff --git a/tests/check/elements/adaptive_demux_common.h b/tests/check/elements/adaptive_demux_common.h
index f830387..448671b 100644
--- a/tests/check/elements/adaptive_demux_common.h
+++ b/tests/check/elements/adaptive_demux_common.h
@@ -77,7 +77,11 @@
gboolean segment_verification_needed;
} GstAdaptiveDemuxTestExpectedOutput;
-typedef struct _GstAdaptiveDemuxTestCaseClass GstAdaptiveDemuxTestCaseClass;
+typedef struct _GstAdaptiveDemuxTestCaseClass
+{
+ GObjectClass parent_class;
+} GstAdaptiveDemuxTestCaseClass;
+
typedef struct _GstAdaptiveDemuxTestCase
{
GObject parent;
@@ -149,6 +153,19 @@
/* Utility functions for use within a unit test */
/**
+ * gst_adaptive_demux_test_unexpected_eos:
+ * @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 by tests that don't expect
+ * AppSink to receive EOS.
+ */
+void
+gst_adaptive_demux_test_unexpected_eos (GstAdaptiveDemuxTestEngine *
+ engine, GstAdaptiveDemuxTestOutputStream * stream, gpointer user_data);
+
+/**
* gst_adaptive_demux_test_check_size_of_received_data:
* @engine: The #GstAdaptiveDemuxTestEngine that caused this callback
* @stream: The #GstAdaptiveDemuxTestOutputStream that caused this callback
diff --git a/tests/check/elements/adaptive_demux_engine.c b/tests/check/elements/adaptive_demux_engine.c
index b571fe3..b969831 100644
--- a/tests/check/elements/adaptive_demux_engine.c
+++ b/tests/check/elements/adaptive_demux_engine.c
@@ -19,6 +19,7 @@
*/
#include <gst/check/gstcheck.h>
+#include <gst/check/gsttestclock.h>
#include "adaptive_demux_engine.h"
typedef struct _GstAdaptiveDemuxTestEnginePrivate
@@ -26,6 +27,7 @@
GstAdaptiveDemuxTestEngine engine;
const GstAdaptiveDemuxTestCallbacks *callbacks;
gpointer user_data;
+ guint clock_update_id;
} GstAdaptiveDemuxTestEnginePrivate;
@@ -193,6 +195,29 @@
return GST_PAD_PROBE_OK;
}
+/* callback called when dash sends event to AppSink */
+static GstPadProbeReturn
+on_demux_sent_event (GstPad * pad, GstPadProbeInfo * info, gpointer data)
+{
+ GstAdaptiveDemuxTestEnginePrivate *priv =
+ (GstAdaptiveDemuxTestEnginePrivate *) data;
+ GstAdaptiveDemuxTestOutputStream *stream = NULL;
+ GstEvent *event;
+
+ event = GST_PAD_PROBE_INFO_EVENT (info);
+
+ GST_TEST_LOCK (&priv->engine);
+
+ if (priv->callbacks->demux_sent_event) {
+ stream = getTestOutputDataByPad (priv, pad, TRUE);
+ (*priv->callbacks->demux_sent_event) (&priv->engine,
+ stream, event, priv->user_data);
+ }
+
+ GST_TEST_UNLOCK (&priv->engine);
+ return GST_PAD_PROBE_OK;
+}
+
/* callback called when demux receives events from GstFakeSoupHTTPSrc */
static GstPadProbeReturn
on_demuxReceivesEvent (GstPad * pad, GstPadProbeInfo * info, gpointer data)
@@ -308,6 +333,9 @@
gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER,
(GstPadProbeCallback) on_demux_sent_data, priv, NULL);
+ gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM |
+ GST_PAD_PROBE_TYPE_EVENT_FLUSH,
+ (GstPadProbeCallback) on_demux_sent_event, 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");
@@ -399,6 +427,38 @@
}
static gboolean
+gst_adaptive_demux_update_test_clock (gpointer user_data)
+{
+ GstAdaptiveDemuxTestEnginePrivate *priv =
+ (GstAdaptiveDemuxTestEnginePrivate *) user_data;
+ GstClockID id;
+ GstClockTime next_entry;
+ GstTestClock *clock = GST_TEST_CLOCK (priv->engine.clock);
+
+ fail_unless (clock != NULL);
+ next_entry = gst_test_clock_get_next_entry_time (clock);
+ if (next_entry != GST_CLOCK_TIME_NONE) {
+ /* tests that do not want the manifest to update will set the update period
+ * to a big value, eg 500s. The manifest update task will register an alarm
+ * for that value.
+ * We do not want the clock to jump to that. If it does, the manifest update
+ * task will keep scheduling and use all the cpu power, starving the other
+ * threads.
+ * Usually the test require the clock to update with approx 3s, so we will
+ * allow only updates smaller than 100s
+ */
+ GstClockTime curr_time = gst_clock_get_time (GST_CLOCK (clock));
+ if (next_entry - curr_time < 100 * GST_SECOND) {
+ gst_test_clock_set_time (clock, next_entry);
+ id = gst_test_clock_process_next_clock_id (clock);
+ fail_unless (id != NULL);
+ gst_clock_id_unref (id);
+ }
+ }
+ return TRUE;
+}
+
+static gboolean
start_pipeline_playing (gpointer user_data)
{
GstAdaptiveDemuxTestEnginePrivate *priv =
@@ -473,6 +533,20 @@
ret = gst_element_link (manifest_source, demux);
fail_unless_equals_int (ret, TRUE);
+ priv->engine.clock = gst_system_clock_obtain ();
+ if (GST_IS_TEST_CLOCK (priv->engine.clock)) {
+ /*
+ * live tests will want to manipulate the clock, so they will register a
+ * gst_test_clock as the system clock.
+ * The on demand tests do not care about the clock, so they will let the
+ * system clock to the default one.
+ * If a gst_test_clock was installed as system clock, we register a
+ * periodic callback to update its value.
+ */
+ priv->clock_update_id =
+ g_timeout_add (100, gst_adaptive_demux_update_test_clock, priv);
+ }
+
/* call a test callback before we start the pipeline */
if (callbacks->pre_test)
(*callbacks->pre_test) (&priv->engine, priv->user_data);
@@ -514,10 +588,14 @@
priv);
GST_DEBUG ("main thread pipeline stopped");
+ if (priv->clock_update_id != 0)
+ g_source_remove (priv->clock_update_id);
+ gst_object_unref (priv->engine.clock);
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_object_unref (bus);
GST_TEST_UNLOCK (priv);
g_mutex_clear (&priv->engine.lock);
diff --git a/tests/check/elements/adaptive_demux_engine.h b/tests/check/elements/adaptive_demux_engine.h
index f715ecb..372431e 100644
--- a/tests/check/elements/adaptive_demux_engine.h
+++ b/tests/check/elements/adaptive_demux_engine.h
@@ -136,6 +136,17 @@
GstBuffer * buffer, gpointer user_data);
/**
+ * demux_sent_event: called each time the demux sends event to AppSink
+ * @engine: #GstAdaptiveDemuxTestEngine
+ * @stream: #GstAdaptiveDemuxTestOutputStream
+ * @event: the #GstEvent that was sent by demux
+ * @user_data: the user_data passed to gst_adaptive_demux_test_run()
+ */
+ gboolean (*demux_sent_event) (GstAdaptiveDemuxTestEngine *engine,
+ GstAdaptiveDemuxTestOutputStream * stream,
+ GstEvent * event, gpointer user_data);
+
+ /**
* bus_error_message: called if an error is posted to the bus
* @engine: #GstAdaptiveDemuxTestEngine
* @msg: the #GstMessage that contains the error
@@ -154,6 +165,7 @@
struct _GstAdaptiveDemuxTestEngine
{
GstElement *pipeline;
+ GstClock *clock;
GstElement *demux;
GstElement *manifest_source;
GMainLoop *loop;
diff --git a/tests/check/elements/aiffparse.c b/tests/check/elements/aiffparse.c
index ebf2028..5828ce1 100644
--- a/tests/check/elements/aiffparse.c
+++ b/tests/check/elements/aiffparse.c
@@ -112,15 +112,21 @@
gst_event_parse_tag (event, &aiff_tags);
fail_unless (aiff_tags != NULL);
+ have_tags = TRUE;
for (i = 0; i < sizeof (tags) / sizeof (*tags); i++) {
buf = NULL;
- fail_unless (gst_tag_list_get_string (aiff_tags, tags[i][0], &buf));
+ if (!gst_tag_list_get_string (aiff_tags, tags[i][0], &buf)) {
+ have_tags = FALSE;
+ continue;
+ }
ret = g_strcmp0 (buf, tags[i][1]);
g_free (buf);
- fail_unless (ret == 0);
+ if (ret != 0) {
+ have_tags = FALSE;
+ continue;
+ }
}
- have_tags = TRUE;
break;
}
default:
diff --git a/tests/check/elements/audiointerleave.c b/tests/check/elements/audiointerleave.c
index 222cd4d..cb992f3 100644
--- a/tests/check/elements/audiointerleave.c
+++ b/tests/check/elements/audiointerleave.c
@@ -269,6 +269,7 @@
g_cond_wait (&data_cond, &data_mutex);
g_mutex_unlock (&data_mutex);
+ gst_bus_set_flushing (bus, TRUE);
gst_element_set_state (interleave, GST_STATE_NULL);
gst_element_set_state (queue, GST_STATE_NULL);
@@ -410,6 +411,7 @@
g_cond_wait (&data_cond, &data_mutex);
g_mutex_unlock (&data_mutex);
+ gst_bus_set_flushing (bus, TRUE);
gst_element_set_state (interleave, GST_STATE_NULL);
gst_element_set_state (queue, GST_STATE_NULL);
diff --git a/tests/check/elements/audiomixer.c b/tests/check/elements/audiomixer.c
index 55ea92e..9ef5c3c 100644
--- a/tests/check/elements/audiomixer.c
+++ b/tests/check/elements/audiomixer.c
@@ -431,7 +431,7 @@
/* cleanup */
g_main_loop_unref (main_loop);
gst_consistency_checker_free (consist);
- gst_event_ref (play_seek_event);
+ gst_event_unref (play_seek_event);
gst_bus_remove_signal_watch (bus);
gst_object_unref (bus);
gst_object_unref (bin);
@@ -536,7 +536,7 @@
/* cleanup */
g_main_loop_unref (main_loop);
- gst_event_ref (play_seek_event);
+ gst_event_unref (play_seek_event);
gst_consistency_checker_free (consist);
gst_bus_remove_signal_watch (bus);
gst_object_unref (bus);
@@ -723,6 +723,7 @@
g_main_loop_unref (main_loop);
if (play_seek_event)
gst_event_unref (play_seek_event);
+ gst_bus_remove_signal_watch (bus);
gst_object_unref (bus);
gst_object_unref (bin);
}
diff --git a/tests/check/elements/autoconvert.c b/tests/check/elements/autoconvert.c
index 532f6b8..c1c040f 100644
--- a/tests/check/elements/autoconvert.c
+++ b/tests/check/elements/autoconvert.c
@@ -78,7 +78,7 @@
g_object_set (G_OBJECT (autoconvert), "factories", factories, NULL);
- g_list_free (factories);
+ g_list_free_full (factories, gst_object_unref);
}
GST_START_TEST (test_autoconvert_simple)
@@ -140,6 +140,7 @@
gst_bus_set_flushing (bus, TRUE);
gst_object_unref (bus);
+ gst_check_drop_buffers ();
gst_pad_set_active (test_src_pad, FALSE);
gst_pad_set_active (test_sink_pad, FALSE);
gst_check_teardown_src_pad (autoconvert);
@@ -202,13 +203,9 @@
test_element1_class_init (TestElement1Class * klass)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
- GstPadTemplate *src_template, *sink_template;
- src_template = gst_static_pad_template_get (&src_factory);
- gst_element_class_add_pad_template (element_class, src_template);
-
- sink_template = gst_static_pad_template_get (&sink_factory);
- gst_element_class_add_pad_template (element_class, sink_template);
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
}
static void
@@ -221,13 +218,10 @@
test_element2_class_init (TestElement2Class * klass)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
- GstPadTemplate *src_template, *sink_template;
- src_template = gst_static_pad_template_get (&src_factory);
- gst_element_class_add_pad_template (element_class, src_template);
+ gst_element_class_add_static_pad_template (element_class, &src_factory);
- sink_template = gst_static_pad_template_get (&sink_factory);
- gst_element_class_add_pad_template (element_class, sink_template);
+ gst_element_class_add_static_pad_template (element_class, &sink_factory);
}
static void
diff --git a/tests/check/elements/autovideoconvert.c b/tests/check/elements/autovideoconvert.c
index 268f094..56757ab 100644
--- a/tests/check/elements/autovideoconvert.c
+++ b/tests/check/elements/autovideoconvert.c
@@ -77,8 +77,6 @@
g_signal_connect (bus, "message", (GCallback) on_message_cb, &omud);
- gst_object_unref (bus);
-
ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
fail_unless (ret == GST_STATE_CHANGE_SUCCESS
|| ret == GST_STATE_CHANGE_ASYNC);
@@ -90,6 +88,8 @@
fail_unless (omud.eos == TRUE);
+ gst_bus_remove_signal_watch (bus);
+ gst_object_unref (bus);
gst_object_unref (pipeline);
g_main_loop_unref (loop);
diff --git a/tests/check/elements/camerabin.c b/tests/check/elements/camerabin.c
index 3458cac..e554b0b 100644
--- a/tests/check/elements/camerabin.c
+++ b/tests/check/elements/camerabin.c
@@ -162,12 +162,11 @@
"Some test camera src",
"Thiago Santos <thiago.sousa.santos@collabora.com>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&vidsrc_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&imgsrc_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&vfsrc_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &vidsrc_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &imgsrc_template);
+ gst_element_class_add_static_pad_template (gstelement_class, &vfsrc_template);
}
static void
@@ -372,8 +371,7 @@
"Video/Src",
"Test camera video src", "Thiago Santos <thiagoss@osg.samsung.com>");
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&src_template));
+ gst_element_class_add_static_pad_template (gstelement_class, &src_template);
gobject_class->get_property = gst_test_video_src_get_property;
gobject_class->set_property = gst_test_video_src_set_property;
@@ -441,7 +439,7 @@
static GstElement *camera;
static GstElement *testsrc;
-static guint bus_source;
+static GstBus *bus = NULL;
static GMainLoop *main_loop;
static gint capture_count = 0;
guint32 test_id = 0;
@@ -617,21 +615,20 @@
gchar *pipeline_str = g_strdup_printf ("filesrc location=%s ! "
"jpegparse ! fakesink", filepath);
GstElement *pipeline;
- guint source;
pipeline = gst_parse_launch (pipeline_str, NULL);
fail_unless (pipeline != NULL);
g_free (pipeline_str);
bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
- source = gst_bus_add_watch (bus, (GstBusFunc) validity_bus_cb, loop);
+ gst_bus_add_watch (bus, (GstBusFunc) validity_bus_cb, loop);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
g_main_loop_run (loop);
gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_bus_remove_watch (bus);
gst_object_unref (bus);
- g_source_remove (source);
gst_object_unref (pipeline);
g_main_loop_unref (loop);
}
@@ -639,9 +636,7 @@
static void
setup_camerabin_common (void)
{
- GstBus *bus;
test_id = g_random_int ();
- bus_source = 0;
main_loop = g_main_loop_new (NULL, TRUE);
@@ -649,8 +644,7 @@
fail_unless (camera != NULL, "failed to create camerabin element");
bus = gst_pipeline_get_bus (GST_PIPELINE (camera));
- bus_source = gst_bus_add_watch (bus, (GstBusFunc) capture_bus_cb, main_loop);
- gst_object_unref (bus);
+ gst_bus_add_watch (bus, (GstBusFunc) capture_bus_cb, main_loop);
tags_found = NULL;
capture_count = 0;
@@ -750,8 +744,10 @@
gst_check_teardown_element (camera);
camera = NULL;
- if (bus_source)
- g_source_remove (bus_source);
+ if (bus) {
+ gst_bus_remove_watch (bus);
+ gst_object_unref (bus);
+ }
if (main_loop)
g_main_loop_unref (main_loop);
@@ -844,7 +840,6 @@
GstCaps *caps;
gint caps_width, caps_height;
GstState state;
- guint source;
GMainLoop *loop = g_main_loop_new (NULL, FALSE);
GstElement *playbin = gst_element_factory_make ("playbin", NULL);
@@ -858,7 +853,7 @@
"audio-sink", fakeaudio, NULL);
bus = gst_pipeline_get_bus (GST_PIPELINE (playbin));
- source = gst_bus_add_watch (bus, (GstBusFunc) validity_bus_cb, loop);
+ gst_bus_add_watch (bus, (GstBusFunc) validity_bus_cb, loop);
gst_element_set_state (playbin, GST_STATE_PAUSED);
gst_element_get_state (playbin, &state, NULL, GST_SECOND * 3);
@@ -901,7 +896,7 @@
}
g_free (uri);
- g_source_remove (source);
+ gst_bus_remove_watch (bus);
gst_object_unref (bus);
gst_object_unref (playbin);
g_main_loop_unref (loop);
@@ -1874,6 +1869,7 @@
g_free (filenames[i]);
}
g_signal_handler_disconnect (src, notify_id);
+ gst_object_unref (src);
}
GST_END_TEST;
diff --git a/tests/check/elements/compositor.c b/tests/check/elements/compositor.c
index 8b5fd5b..e9f0165 100644
--- a/tests/check/elements/compositor.c
+++ b/tests/check/elements/compositor.c
@@ -355,6 +355,15 @@
gst_caps_unref (caps);
gst_caps_unref (restriction_caps);
+ /* check that compositor proxies downstream interlaced-mode */
+ restriction_caps =
+ gst_caps_from_string ("video/x-raw, interlace-mode=(string)interleaved");
+ g_object_set (capsfilter, "caps", restriction_caps, NULL);
+ caps = gst_pad_query_caps (sinkpad, NULL);
+ fail_unless (gst_caps_is_subset (caps, restriction_caps));
+ gst_caps_unref (caps);
+ gst_caps_unref (restriction_caps);
+
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_element_release_request_pad (compositor, sinkpad);
gst_object_unref (sinkpad);
@@ -365,6 +374,82 @@
GST_END_TEST;
+
+GST_START_TEST (test_caps_query_interlaced)
+{
+ GstElement *compositor, *sink;
+ GstElement *pipeline;
+ gboolean res;
+ GstStateChangeReturn state_res;
+ GstPad *sinkpad;
+ GstCaps *caps;
+ GstCaps *caps_mixed, *caps_progressive, *caps_interleaved;
+ GstEvent *caps_event;
+
+ caps_interleaved =
+ gst_caps_from_string ("video/x-raw, interlace-mode=interleaved");
+ caps_mixed = gst_caps_from_string ("video/x-raw, interlace-mode=mixed");
+ caps_progressive =
+ gst_caps_from_string ("video/x-raw, interlace-mode=progressive");
+
+ /* initial setup */
+ compositor = gst_element_factory_make ("compositor", "compositor");
+ sink = gst_element_factory_make ("fakesink", "sink");
+ pipeline = gst_pipeline_new ("test-pipeline");
+
+ gst_bin_add_many (GST_BIN (pipeline), compositor, sink, NULL);
+ res = gst_element_link (compositor, sink);
+ fail_unless (res == TRUE, NULL);
+ sinkpad = gst_element_get_request_pad (compositor, "sink_%u");
+
+ state_res = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_if (state_res == GST_STATE_CHANGE_FAILURE);
+
+ /* try an unrestricted caps query, should be compatible with all formats */
+ caps = gst_pad_query_caps (sinkpad, NULL);
+ fail_unless (gst_caps_can_intersect (caps, caps_interleaved));
+ fail_unless (gst_caps_can_intersect (caps, caps_progressive));
+ fail_unless (gst_caps_can_intersect (caps, caps_mixed));
+ gst_caps_unref (caps);
+
+ /* now set caps on the pad, it should restrict the interlaced-mode for
+ * future caps */
+ caps = gst_caps_from_string ("video/x-raw, width=100, height=100, "
+ "format=RGB, framerate=1/1, interlace-mode=progressive");
+ caps_event = gst_event_new_caps (caps);
+ gst_caps_unref (caps);
+ fail_unless (gst_pad_send_event (sinkpad, caps_event));
+
+ /* now recheck the interlace-mode */
+ gst_object_unref (sinkpad);
+ sinkpad = gst_element_get_request_pad (compositor, "sink_%u");
+ caps = gst_pad_query_caps (sinkpad, NULL);
+ fail_if (gst_caps_can_intersect (caps, caps_interleaved));
+ fail_unless (gst_caps_can_intersect (caps, caps_progressive));
+ fail_if (gst_caps_can_intersect (caps, caps_mixed));
+ gst_object_unref (sinkpad);
+ gst_caps_unref (caps);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ gst_caps_unref (caps_interleaved);
+ gst_caps_unref (caps_mixed);
+ gst_caps_unref (caps_progressive);
+}
+
+GST_END_TEST;
+
+static void
+add_interlaced_mode_to_caps (GstCaps * caps, const gchar * mode)
+{
+ GstStructure *s;
+
+ for (gint i = 0; i < gst_caps_get_size (caps); i++) {
+ s = gst_caps_get_structure (caps, i);
+ gst_structure_set (s, "interlace-mode", G_TYPE_STRING, mode, NULL);
+ }
+}
+
#define MODE_ALL 1
#define MODE_NON_ALPHA 2
@@ -384,6 +469,11 @@
all_caps = _compositor_get_all_supported_caps ();
non_alpha_caps = _compositor_get_non_alpha_supported_caps ();
+ /* add progressive mode as it is what is used in the test, otherwise
+ * is_equal checks would fail */
+ add_interlaced_mode_to_caps (all_caps, "progressive");
+ add_interlaced_mode_to_caps (non_alpha_caps, "progressive");
+
compositor = gst_element_factory_make ("compositor", "compositor");
capsfilter = gst_element_factory_make ("capsfilter", "out-cf");
sink = gst_element_factory_make ("fakesink", "sink");
@@ -450,7 +540,6 @@
rgb_caps = gst_caps_from_string ("video/x-raw, format=(string)RGB, "
"width=(int)100, height=(int)100, framerate=(fraction)1/1");
-
non_alpha_caps = gst_caps_from_string ("video/x-raw, format=(string)RGB");
/* check that a 2nd pad that is added late to compositor will be able to
@@ -465,6 +554,80 @@
GST_END_TEST;
+static void
+run_late_caps_set_test (GstCaps * first_caps, GstCaps * expected_query_caps,
+ GstCaps * second_caps, gboolean accept_caps)
+{
+ GstElement *capsfilter_1;
+ GstElement *compositor;
+ GstElement *pipeline;
+ GstStateChangeReturn state_res;
+ GstPad *sinkpad_2;
+ GstCaps *caps;
+ GstEvent *caps_event;
+ GstBus *bus;
+ GstMessage *msg;
+
+ pipeline =
+ gst_parse_launch ("videotestsrc num-buffers=10 ! capsfilter name=cf1 !"
+ " compositor name=c ! fakesink sync=true", NULL);
+ fail_unless (pipeline != NULL);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+
+ compositor = gst_bin_get_by_name (GST_BIN (pipeline), "c");
+ capsfilter_1 = gst_bin_get_by_name (GST_BIN (pipeline), "cf1");
+
+ g_object_set (capsfilter_1, "caps", first_caps, NULL);
+
+ state_res = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ fail_if (state_res == GST_STATE_CHANGE_FAILURE);
+
+ /* wait for pipeline to get to paused */
+ msg =
+ gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE,
+ GST_MESSAGE_ASYNC_DONE);
+ fail_unless (msg != NULL);
+ fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ASYNC_DONE);
+ gst_message_unref (msg);
+
+ /* try to set the second caps */
+ sinkpad_2 = gst_element_get_request_pad (compositor, "sink_%u");
+ caps = gst_pad_query_caps (sinkpad_2, NULL);
+ fail_unless (gst_caps_is_subset (expected_query_caps, caps));
+ caps_event = gst_event_new_caps (second_caps);
+ fail_unless (gst_pad_send_event (sinkpad_2, caps_event) == accept_caps);
+ gst_caps_unref (caps);
+ gst_object_unref (sinkpad_2);
+
+ gst_object_unref (bus);
+ gst_object_unref (compositor);
+ gst_object_unref (capsfilter_1);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+}
+
+GST_START_TEST (test_late_caps_different_interlaced)
+{
+ GstCaps *non_interlaced_caps;
+ GstCaps *interlaced_caps;
+
+ non_interlaced_caps =
+ gst_caps_from_string ("video/x-raw, interlace-mode=progressive, "
+ "format=RGB, width=100, height=100, framerate=1/1");
+ interlaced_caps =
+ gst_caps_from_string ("video/x-raw, interlace-mode=interleaved, "
+ "format=RGB, width=100, height=100, framerate=1/1");
+
+ run_late_caps_set_test (non_interlaced_caps, non_interlaced_caps,
+ interlaced_caps, FALSE);
+
+ gst_caps_unref (non_interlaced_caps);
+ gst_caps_unref (interlaced_caps);
+}
+
+GST_END_TEST;
+
static guint play_count = 0;
static GstEvent *play_seek_event = NULL;
@@ -591,7 +754,7 @@
/* cleanup */
g_main_loop_unref (main_loop);
gst_consistency_checker_free (consist);
- gst_event_ref (play_seek_event);
+ gst_event_unref (play_seek_event);
gst_bus_remove_signal_watch (bus);
gst_object_unref (bus);
gst_object_unref (bin);
@@ -694,7 +857,7 @@
/* cleanup */
g_main_loop_unref (main_loop);
- gst_event_ref (play_seek_event);
+ gst_event_unref (play_seek_event);
gst_consistency_checker_free (consist);
gst_bus_remove_signal_watch (bus);
gst_object_unref (bus);
@@ -1708,6 +1871,40 @@
GST_END_TEST;
+/*
+ * Test that the pad numbering assigned by aggregator behaves as follows:
+ * 1. If a pad number is requested, it must be assigned if it is available
+ * 2. When numbering automatically, the largest available pad number is used
+ * 3. Pad names must be unique
+ */
+GST_START_TEST (test_pad_numbering)
+{
+ GstElement *mixer;
+ GstPad *sinkpad1, *sinkpad2, *sinkpad3, *sinkpad4;
+
+ GST_INFO ("preparing test");
+
+ mixer = gst_element_factory_make ("compositor", NULL);
+ sinkpad1 = gst_element_get_request_pad (mixer, "sink_%u");
+ sinkpad2 = gst_element_get_request_pad (mixer, "sink_7");
+ sinkpad3 = gst_element_get_request_pad (mixer, "sink_1");
+ sinkpad4 = gst_element_get_request_pad (mixer, "sink_%u");
+
+ ck_assert_str_eq (GST_PAD_NAME (sinkpad1), "sink_0");
+ ck_assert_str_eq (GST_PAD_NAME (sinkpad2), "sink_7");
+ ck_assert_str_eq (GST_PAD_NAME (sinkpad3), "sink_1");
+ ck_assert_str_eq (GST_PAD_NAME (sinkpad4), "sink_8");
+
+ /* cleanup */
+ gst_object_unref (mixer);
+ gst_object_unref (sinkpad1);
+ gst_object_unref (sinkpad2);
+ gst_object_unref (sinkpad3);
+ gst_object_unref (sinkpad4);
+}
+
+GST_END_TEST;
+
typedef struct
{
gint buffers_sent;
@@ -1881,7 +2078,9 @@
tcase_add_test (tc_chain, test_caps);
tcase_add_test (tc_chain, test_event);
tcase_add_test (tc_chain, test_caps_query);
+ tcase_add_test (tc_chain, test_caps_query_interlaced);
tcase_add_test (tc_chain, test_late_caps_query);
+ tcase_add_test (tc_chain, test_late_caps_different_interlaced);
tcase_add_test (tc_chain, test_play_twice);
tcase_add_test (tc_chain, test_play_twice_then_add_and_play_again);
tcase_add_test (tc_chain, test_add_pad);
@@ -1895,6 +2094,7 @@
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_pad_numbering);
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/dash_demux.c b/tests/check/elements/dash_demux.c
index 961e12e..7733044 100644
--- a/tests/check/elements/dash_demux.c
+++ b/tests/check/elements/dash_demux.c
@@ -26,7 +26,7 @@
#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]); \
+ GST_ADAPTIVE_DEMUX_TEST_CASE (testData)->output_streams = g_list_append (GST_ADAPTIVE_DEMUX_TEST_CASE (testData)->output_streams, &(outputTestData)[otdPos]); \
} \
} while(0)
@@ -37,18 +37,112 @@
guint64 size;
} GstDashDemuxTestInputData;
+typedef struct _GstTestHTTPSrcTestData
+{
+ const GstDashDemuxTestInputData *input;
+ GstStructure *data;
+} GstTestHTTPSrcTestData;
+
+typedef struct _GstDashDemuxTestCase
+{
+ GstAdaptiveDemuxTestCase parent;
+
+ /* the number of Protection Events sent to each pad */
+ GstStructure *countContentProtectionEvents;
+} GstDashDemuxTestCase;
+
+GType gst_dash_demux_test_case_get_type (void);
+static void gst_dash_demux_test_case_dispose (GObject * object);
+static void gst_dash_demux_test_case_finalize (GObject * object);
+static void gst_dash_demux_test_case_clear (GstDashDemuxTestCase * test_case);
+
+static GstDashDemuxTestCase *
+gst_dash_demux_test_case_new (void)
+ G_GNUC_MALLOC;
+
+#define GST_TYPE_DASH_DEMUX_TEST_CASE \
+ (gst_dash_demux_test_case_get_type())
+#define GST_DASH_DEMUX_TEST_CASE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DASH_DEMUX_TEST_CASE, GstDashDemuxTestCase))
+#define GST_DASH_DEMUX_TEST_CASE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DASH_DEMUX_TEST_CASE, GstDashDemuxTestCaseClass))
+#define GST_DASH_DEMUX_TEST_CASE_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DASH_DEMUX_TEST_CASE, GstDashDemuxTestCaseClass))
+#define GST_IS_DASH_DEMUX_TEST_CASE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DASH_DEMUX_TEST_CASE))
+#define GST_IS_DASH_DEMUX_TEST_CASE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DASH_DEMUX_TEST_CASE))
+
+ static GstDashDemuxTestCase *gst_dash_demux_test_case_new (void)
+{
+ return g_object_newv (GST_TYPE_DASH_DEMUX_TEST_CASE, 0, NULL);
+}
+
+typedef struct _GstDashDemuxTestCaseClass
+{
+ GstAdaptiveDemuxTestCaseClass parent_class;
+} GstDashDemuxTestCaseClass;
+
+#define gst_dash_demux_test_case_parent_class parent_class
+
+G_DEFINE_TYPE (GstDashDemuxTestCase, gst_dash_demux_test_case,
+ GST_TYPE_ADAPTIVE_DEMUX_TEST_CASE);
+
+static void
+gst_dash_demux_test_case_class_init (GstDashDemuxTestCaseClass * klass)
+{
+ GObjectClass *object = G_OBJECT_CLASS (klass);
+
+ object->dispose = gst_dash_demux_test_case_dispose;
+ object->finalize = gst_dash_demux_test_case_finalize;
+}
+
+static void
+gst_dash_demux_test_case_init (GstDashDemuxTestCase * test_case)
+{
+ test_case->countContentProtectionEvents = NULL;
+ gst_dash_demux_test_case_clear (test_case);
+}
+
+static void
+gst_dash_demux_test_case_clear (GstDashDemuxTestCase * test_case)
+{
+ if (test_case->countContentProtectionEvents) {
+ gst_structure_free (test_case->countContentProtectionEvents);
+ test_case->countContentProtectionEvents = NULL;
+ }
+}
+
+static void
+gst_dash_demux_test_case_dispose (GObject * object)
+{
+ GstDashDemuxTestCase *testData = GST_DASH_DEMUX_TEST_CASE (object);
+
+ gst_dash_demux_test_case_clear (testData);
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+gst_dash_demux_test_case_finalize (GObject * object)
+{
+ /*GstDashDemuxTestCase *testData = GST_DASH_DEMUX_TEST_CASE (object); */
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
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);
+ const GstTestHTTPSrcTestData *test_case =
+ (const GstTestHTTPSrcTestData *) user_data;
+ for (guint i = 0; test_case->input[i].uri; ++i) {
+ if (g_strcmp0 (test_case->input[i].uri, uri) == 0) {
+ input_data->context = (gpointer) & test_case->input[i];
+ input_data->size = test_case->input[i].size;
+ if (test_case->input[i].size == 0)
+ input_data->size = strlen ((gchar *) test_case->input[i].payload);
return TRUE;
}
}
@@ -60,8 +154,6 @@
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;
@@ -140,34 +232,42 @@
" <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}
};
+ GstTestHTTPSrcCallbacks http_src_callbacks = { 0 };
+ GstTestHTTPSrcTestData http_src_test_data = { 0 };
GstAdaptiveDemuxTestCallbacks test_callbacks = { 0 };
- GstAdaptiveDemuxTestCase *testData;
+ GstDashDemuxTestCase *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);
+ http_src_test_data.input = inputTestData;
+ gst_test_http_src_install_callbacks (&http_src_callbacks,
+ &http_src_test_data);
- 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;
+ testData = gst_dash_demux_test_case_new ();
+ COPY_OUTPUT_TEST_DATA (outputTestData, testData);
+
gst_adaptive_demux_test_run (DEMUX_ELEMENT_NAME, "http://unit.test/test.mpd",
&test_callbacks, testData);
+
g_object_unref (testData);
+ if (http_src_test_data.data)
+ gst_structure_free (http_src_test_data.data);
}
GST_END_TEST;
@@ -262,29 +362,37 @@
{"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},
};
+ GstTestHTTPSrcCallbacks http_src_callbacks = { 0 };
+ GstTestHTTPSrcTestData http_src_test_data = { 0 };
GstAdaptiveDemuxTestCallbacks test_callbacks = { 0 };
- GstAdaptiveDemuxTestCase *testData;
+ GstDashDemuxTestCase *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);
+ http_src_test_data.input = inputTestData;
+ gst_test_http_src_install_callbacks (&http_src_callbacks,
+ &http_src_test_data);
+
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);
+ testData = gst_dash_demux_test_case_new ();
+ COPY_OUTPUT_TEST_DATA (outputTestData, testData);
+
gst_adaptive_demux_test_run (DEMUX_ELEMENT_NAME,
"http://unit.test/test.mpd", &test_callbacks, testData);
- gst_object_unref (testData);
+
+ g_object_unref (testData);
+ if (http_src_test_data.data)
+ gst_structure_free (http_src_test_data.data);
}
GST_END_TEST;
@@ -344,7 +452,7 @@
static void
setAndTestDashParams (GstAdaptiveDemuxTestEngine * engine, gpointer user_data)
{
- /* GstAdaptiveDemuxTestCase * testData = (GstAdaptiveDemuxTestCase*)user_data; */
+ /* GstDashDemuxTestCase * testData = (GstDashDemuxTestCase*)user_data; */
GObject *dashdemux = G_OBJECT (engine->demux);
test_int_prop (dashdemux, "connection-speed", 1000);
@@ -401,27 +509,35 @@
{"http://unit.test/audio.webm", NULL, 5000},
{NULL, NULL, 0},
};
- GstTestHTTPSrcCallbacks http_src_callbacks = { 0 };
GstAdaptiveDemuxTestExpectedOutput outputTestData[] = {
{"audio_00", 5000, NULL},
};
+ GstTestHTTPSrcCallbacks http_src_callbacks = { 0 };
+ GstTestHTTPSrcTestData http_src_test_data = { 0 };
GstAdaptiveDemuxTestCallbacks test_callbacks = { 0 };
- GstAdaptiveDemuxTestCase *testData;
+ GstDashDemuxTestCase *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);
+ http_src_test_data.input = inputTestData;
+ gst_test_http_src_install_callbacks (&http_src_callbacks,
+ &http_src_test_data);
+
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);
+ testData = gst_dash_demux_test_case_new ();
+ COPY_OUTPUT_TEST_DATA (outputTestData, testData);
+
gst_adaptive_demux_test_run (DEMUX_ELEMENT_NAME, "http://unit.test/test.mpd",
&test_callbacks, testData);
- gst_object_unref (testData);
+
+ g_object_unref (testData);
+ if (http_src_test_data.data)
+ gst_structure_free (http_src_test_data.data);
}
GST_END_TEST;
@@ -458,21 +574,26 @@
" <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 ();
+ GstTestHTTPSrcCallbacks http_src_callbacks = { 0 };
+ GstTestHTTPSrcTestData http_src_test_data = { 0 };
+ GstDashDemuxTestCase *testData;
http_src_callbacks.src_start = gst_dashdemux_http_src_start;
http_src_callbacks.src_create = gst_dashdemux_http_src_create;
+ http_src_test_data.input = inputTestData;
+ gst_test_http_src_install_callbacks (&http_src_callbacks,
+ &http_src_test_data);
+
+ testData = gst_dash_demux_test_case_new ();
COPY_OUTPUT_TEST_DATA (outputTestData, testData);
/* media segment starts at 4687
@@ -480,21 +601,23 @@
* 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_ADAPTIVE_DEMUX_TEST_CASE (testData)->threshold_for_seek = 4687 + 1;
/* seek to 5ms.
* Because there is only one fragment, we expect the whole file to be
* downloaded again
*/
- testData->seek_event =
+ GST_ADAPTIVE_DEMUX_TEST_CASE (testData)->seek_event =
gst_event_new_seek (1.0, GST_FORMAT_TIME,
GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT, GST_SEEK_TYPE_SET,
5 * GST_MSECOND, GST_SEEK_TYPE_NONE, 0);
- 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);
+ "http://unit.test/test.mpd", GST_ADAPTIVE_DEMUX_TEST_CASE (testData));
+
+ g_object_unref (testData);
+ if (http_src_test_data.data)
+ gst_structure_free (http_src_test_data.data);
}
GST_END_TEST;
@@ -538,6 +661,7 @@
" value=\"2\"> "
" </AudioChannelConfiguration> "
" </Representation></AdaptationSet></Period></MPD>";
+
GstDashDemuxTestInputData inputTestData[] = {
{"http://unit.test/test.mpd", (guint8 *) mpd, 0},
{"http://unit.test/init-audio.mp4", NULL, 10000},
@@ -548,16 +672,20 @@
{NULL, NULL, 0},
};
GstTestHTTPSrcCallbacks http_src_callbacks = { 0 };
+ GstTestHTTPSrcTestData http_src_test_data = { 0 };
GstAdaptiveDemuxTestExpectedOutput outputTestData[] = {
/* 1 from the init segment */
{"audio_00", (segments ? 1 + segments : 0) * 10000, NULL},
};
- GstAdaptiveDemuxTestCase *testData;
-
- testData = gst_adaptive_demux_test_case_new ();
+ GstDashDemuxTestCase *testData;
http_src_callbacks.src_start = gst_dashdemux_http_src_start;
http_src_callbacks.src_create = gst_dashdemux_http_src_create;
+ http_src_test_data.input = inputTestData;
+ gst_test_http_src_install_callbacks (&http_src_callbacks,
+ &http_src_test_data);
+
+ testData = gst_dash_demux_test_case_new ();
COPY_OUTPUT_TEST_DATA (outputTestData, testData);
/* media segment starts at 4687
@@ -566,9 +694,10 @@
* first chunk of at least one byte has already arrived in AppSink
*/
if (seek_threshold_bytes)
- testData->threshold_for_seek = seek_threshold_bytes;
+ GST_ADAPTIVE_DEMUX_TEST_CASE (testData)->threshold_for_seek =
+ seek_threshold_bytes;
else
- testData->threshold_for_seek = 4687 + 1;
+ GST_ADAPTIVE_DEMUX_TEST_CASE (testData)->threshold_for_seek = 4687 + 1;
/* FIXME hack to avoid having a 0 seqnum */
gst_util_seqnum_next ();
@@ -577,14 +706,16 @@
* Because there is only one fragment, we expect the whole file to be
* downloaded again
*/
- testData->seek_event =
+ GST_ADAPTIVE_DEMUX_TEST_CASE (testData)->seek_event =
gst_event_new_seek (rate, GST_FORMAT_TIME, flags, start_type,
seek_start, stop_type, seek_stop);
- 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);
+ "http://unit.test/test.mpd", GST_ADAPTIVE_DEMUX_TEST_CASE (testData));
+
+ g_object_unref (testData);
+ if (http_src_test_data.data)
+ gst_structure_free (http_src_test_data.data);
}
GST_START_TEST (testSeekKeyUnitPosition)
@@ -696,7 +827,6 @@
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);
@@ -738,27 +868,315 @@
{"http://unit.test/test.mpd", (guint8 *) mpd, 0},
{NULL, NULL, 0},
};
- GstTestHTTPSrcCallbacks http_src_callbacks = { 0 };
GstAdaptiveDemuxTestExpectedOutput outputTestData[] = {
{"audio_00", 0, NULL},
};
+ GstTestHTTPSrcCallbacks http_src_callbacks = { 0 };
+ GstTestHTTPSrcTestData http_src_test_data = { 0 };
GstAdaptiveDemuxTestCallbacks test_callbacks = { 0 };
- GstAdaptiveDemuxTestCase *testData;
+ GstDashDemuxTestCase *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);
+ http_src_test_data.input = inputTestData;
+ gst_test_http_src_install_callbacks (&http_src_callbacks,
+ &http_src_test_data);
+
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_unexpected_eos;
+
+ testData = gst_dash_demux_test_case_new ();
+ COPY_OUTPUT_TEST_DATA (outputTestData, testData);
+
+ gst_adaptive_demux_test_run (DEMUX_ELEMENT_NAME, "http://unit.test/test.mpd",
+ &test_callbacks, testData);
+
+ g_object_unref (testData);
+ if (http_src_test_data.data)
+ gst_structure_free (http_src_test_data.data);
+}
+
+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;
+ const GstTestHTTPSrcTestData *http_src_test_data =
+ (const GstTestHTTPSrcTestData *) user_data;
+ guint64 threshold_for_trigger;
+
+ fail_unless (input != NULL);
+ gst_structure_get_uint64 (http_src_test_data->data, "threshold_for_trigger",
+ &threshold_for_trigger);
+
+ if (!g_str_has_suffix (input->uri, ".mpd") && offset >= threshold_for_trigger) {
+ GST_DEBUG ("network_error %s %" G_GUINT64_FORMAT " @ %" G_GUINT64_FORMAT,
+ input->uri, offset, threshold_for_trigger);
+ 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);
+}
+
+/*
+ * Test header download error
+ * Let the adaptive demux download a few bytes, then instruct the
+ * GstTestHTTPSrc element to generate an error while the fragment header
+ * is still being downloaded.
+ */
+GST_START_TEST (testHeaderDownloadError)
+{
+ 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\""
+ " 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>";
+
+ /* generate error while the headers are still being downloaded
+ * threshold_for_trigger must be less than the size of headers
+ * (initialization + index) which is 4687.
+ */
+ guint64 threshold_for_trigger = 2000;
+
+ GstDashDemuxTestInputData inputTestData[] = {
+ {"http://unit.test/test.mpd", (guint8 *) mpd, 0},
+ {"http://unit.test/audio.webm", NULL, 5000},
+ {NULL, NULL, 0},
+ };
+ GstAdaptiveDemuxTestExpectedOutput outputTestData[] = {
+ /* adaptive demux tries for 4 times (MAX_DOWNLOAD_ERROR_COUNT + 1) before giving up */
+ {"audio_00", threshold_for_trigger * 4, NULL},
+ };
+ GstTestHTTPSrcCallbacks http_src_callbacks = { 0 };
+ GstTestHTTPSrcTestData http_src_test_data = { 0 };
+ GstAdaptiveDemuxTestCallbacks test_callbacks = { 0 };
+ GstDashDemuxTestCase *testData;
+
+ http_src_callbacks.src_start = gst_dashdemux_http_src_start;
+ http_src_callbacks.src_create = test_fragment_download_error_src_create;
+ http_src_test_data.data = gst_structure_new_empty (__FUNCTION__);
+ gst_structure_set (http_src_test_data.data, "threshold_for_trigger",
+ G_TYPE_UINT64, threshold_for_trigger, NULL);
+ http_src_test_data.input = inputTestData;
+ gst_test_http_src_install_callbacks (&http_src_callbacks,
+ &http_src_test_data);
+
+ test_callbacks.appsink_received_data =
+ gst_adaptive_demux_test_check_received_data;
+ test_callbacks.appsink_eos = gst_adaptive_demux_test_unexpected_eos;
+ test_callbacks.bus_error_message = testDownloadErrorMessageCallback;
+
+ testData = gst_dash_demux_test_case_new ();
+ COPY_OUTPUT_TEST_DATA (outputTestData, testData);
+
+ /* download in chunks of threshold_for_trigger size.
+ * This means the first chunk will succeed, the second will generate
+ * error because we already exceeded threshold_for_trigger bytes.
+ */
+ gst_test_http_src_set_default_blocksize (threshold_for_trigger);
+
+ gst_adaptive_demux_test_run (DEMUX_ELEMENT_NAME,
+ "http://unit.test/test.mpd", &test_callbacks, testData);
+
+ g_object_unref (testData);
+ if (http_src_test_data.data)
+ gst_structure_free (http_src_test_data.data);
+}
+
+GST_END_TEST;
+
+/*
+ * Test media download error on the last media fragment.
+ * Let the adaptive demux download a few bytes, then instruct the
+ * GstTestHTTPSrc element to generate an error while the last media fragment
+ * is being downloaded.
+ * Adaptive demux will not retry downloading the last media fragment. It will
+ * be considered eos.
+ */
+GST_START_TEST (testMediaDownloadErrorLastFragment)
+{
+ 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\""
+ " 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>";
+
+ /* generate error on the first media fragment */
+ guint64 threshold_for_trigger = 4687;
+
+ GstDashDemuxTestInputData inputTestData[] = {
+ {"http://unit.test/test.mpd", (guint8 *) mpd, 0},
+ {"http://unit.test/audio.webm", NULL, 5000},
+ {NULL, NULL, 0},
+ };
+ GstAdaptiveDemuxTestExpectedOutput outputTestData[] = {
+ /* adaptive demux will not retry because this is the last fragment */
+ {"audio_00", threshold_for_trigger, NULL},
+ };
+ GstTestHTTPSrcCallbacks http_src_callbacks = { 0 };
+ GstTestHTTPSrcTestData http_src_test_data = { 0 };
+ GstAdaptiveDemuxTestCallbacks test_callbacks = { 0 };
+ GstDashDemuxTestCase *testData;
+
+ http_src_callbacks.src_start = gst_dashdemux_http_src_start;
+ http_src_callbacks.src_create = test_fragment_download_error_src_create;
+ http_src_test_data.data = gst_structure_new_empty (__FUNCTION__);
+ gst_structure_set (http_src_test_data.data, "threshold_for_trigger",
+ G_TYPE_UINT64, threshold_for_trigger, NULL);
+ http_src_test_data.input = inputTestData;
+ gst_test_http_src_install_callbacks (&http_src_callbacks,
+ &http_src_test_data);
+
+ 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);
+ testData = gst_dash_demux_test_case_new ();
+ COPY_OUTPUT_TEST_DATA (outputTestData, testData);
+
+ gst_adaptive_demux_test_run (DEMUX_ELEMENT_NAME,
+ "http://unit.test/test.mpd", &test_callbacks, testData);
+
+ g_object_unref (testData);
+ if (http_src_test_data.data)
+ gst_structure_free (http_src_test_data.data);
+}
+
+GST_END_TEST;
+
+/*
+ * Test media download error on a media fragment which is not the last one.
+ * Let the adaptive demux download a few bytes, then instruct the
+ * GstTestHTTPSrc element to generate an error while a media fragment
+ * is being downloaded.
+ */
+GST_START_TEST (testMediaDownloadErrorMiddleFragment)
+{
+ 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\""
+ " profiles=\"urn:mpeg:dash:profile:isoff-on-demand:2011\""
+ " type=\"static\""
+ " minBufferTime=\"PT1.500S\""
+ " mediaPresentationDuration=\"PT10S\">"
+ " <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>"
+ " <SegmentList duration=\"1\">"
+ " <SegmentURL indexRange=\"1-10\""
+ " mediaRange=\"11-30\">"
+ " </SegmentURL>"
+ " <SegmentURL indexRange=\"31-60\""
+ " mediaRange=\"61-100\">"
+ " </SegmentURL>"
+ " <SegmentURL indexRange=\"101-150\""
+ " mediaRange=\"151-210\">"
+ " </SegmentURL>"
+ " </SegmentList>"
+ " </Representation></AdaptationSet></Period></MPD>";
+
+ /* generate error on the second media fragment */
+ guint64 threshold_for_trigger = 31;
+
+ GstDashDemuxTestInputData inputTestData[] = {
+ {"http://unit.test/test.mpd", (guint8 *) mpd, 0},
+ {"http://unit.test/audio.webm", NULL, 5000},
+ {NULL, NULL, 0},
+ };
+ GstAdaptiveDemuxTestExpectedOutput outputTestData[] = {
+ /* adaptive demux will download only the first media fragment */
+ {"audio_00", 20, NULL},
+ };
+ GstTestHTTPSrcCallbacks http_src_callbacks = { 0 };
+ GstTestHTTPSrcTestData http_src_test_data = { 0 };
+ GstAdaptiveDemuxTestCallbacks test_callbacks = { 0 };
+ GstDashDemuxTestCase *testData;
+
+ http_src_callbacks.src_start = gst_dashdemux_http_src_start;
+ http_src_callbacks.src_create = test_fragment_download_error_src_create;
+ http_src_test_data.data = gst_structure_new_empty (__FUNCTION__);
+ gst_structure_set (http_src_test_data.data, "threshold_for_trigger",
+ G_TYPE_UINT64, threshold_for_trigger, NULL);
+ http_src_test_data.input = inputTestData;
+ gst_test_http_src_install_callbacks (&http_src_callbacks,
+ &http_src_test_data);
+
+ test_callbacks.appsink_received_data =
+ gst_adaptive_demux_test_check_received_data;
+ test_callbacks.appsink_eos = gst_adaptive_demux_test_unexpected_eos;
+ test_callbacks.bus_error_message = testDownloadErrorMessageCallback;
+
+ testData = gst_dash_demux_test_case_new ();
+ COPY_OUTPUT_TEST_DATA (outputTestData, testData);
+
+ gst_adaptive_demux_test_run (DEMUX_ELEMENT_NAME,
+ "http://unit.test/test.mpd", &test_callbacks, testData);
+
+ g_object_unref (testData);
+ if (http_src_test_data.data)
+ gst_structure_free (http_src_test_data.data);
}
GST_END_TEST;
@@ -777,6 +1195,9 @@
gboolean seekable;
gint64 segment_start;
gint64 segment_end;
+ gboolean live;
+ GstClockTime min_latency;
+ GstClockTime max_latency;
gchar *uri;
gchar *redirect_uri;
gboolean redirect_permanent;
@@ -788,13 +1209,16 @@
fail_unless (g_list_length (pads) == 1);
pad = GST_PAD (pads->data);
+ /* duration query */
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);
+ /* mediaPresentationDuration=\"PT135.743S\" */
fail_unless (duration == 135743 * GST_MSECOND);
gst_query_unref (query);
+ /* seek query */
query = gst_query_new_seeking (GST_FORMAT_TIME);
ret = gst_pad_peer_query (pad, query);
fail_unless (ret == TRUE);
@@ -805,13 +1229,24 @@
fail_unless (segment_end == duration);
gst_query_unref (query);
+ /* latency query */
+ query = gst_query_new_latency ();
+ ret = gst_pad_peer_query (pad, query);
+ fail_unless (ret == TRUE);
+ gst_query_parse_latency (query, &live, &min_latency, &max_latency);
+ fail_unless (live == FALSE);
+ fail_unless (min_latency == 0);
+ fail_unless (max_latency == -1);
+ gst_query_unref (query);
+
+ /* uri 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);
+ fail_unless (g_strcmp0 (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);
@@ -855,86 +1290,123 @@
" <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},
};
+ GstTestHTTPSrcCallbacks http_src_callbacks = { 0 };
+ GstTestHTTPSrcTestData http_src_test_data = { 0 };
GstAdaptiveDemuxTestCallbacks test_callbacks = { 0 };
- GstAdaptiveDemuxTestCase *testData;
+ GstDashDemuxTestCase *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);
+ http_src_test_data.input = inputTestData;
+ gst_test_http_src_install_callbacks (&http_src_callbacks,
+ &http_src_test_data);
+
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);
+ testData = gst_dash_demux_test_case_new ();
+ COPY_OUTPUT_TEST_DATA (outputTestData, testData);
+
gst_adaptive_demux_test_run (DEMUX_ELEMENT_NAME,
"http://unit.test/test.mpd", &test_callbacks, testData);
- gst_object_unref (testData);
+
+ g_object_unref (testData);
+ if (http_src_test_data.data)
+ gst_structure_free (http_src_test_data.data);
}
GST_END_TEST;
-static GstFlowReturn
-test_fragment_download_error_src_create (GstTestHTTPSrc * src,
- guint64 offset,
- guint length, GstBuffer ** retbuf, gpointer context, gpointer user_data)
+static gboolean
+testContentProtectionDashdemuxSendsEvent (GstAdaptiveDemuxTestEngine * engine,
+ GstAdaptiveDemuxTestOutputStream * stream,
+ GstEvent * event, 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;
+ GstDashDemuxTestCase *test_case = GST_DASH_DEMUX_TEST_CASE (user_data);
+ const gchar *system_id;
+ GstBuffer *data;
+ const gchar *origin;
+ GstMapInfo info;
+ gchar *value;
+ gchar *name;
+ guint event_count = 0;
+
+ GST_DEBUG ("received event %s", GST_EVENT_TYPE_NAME (event));
+
+ if (GST_EVENT_TYPE (event) != GST_EVENT_PROTECTION) {
+ return TRUE;
}
- 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;
+ /* we expect content protection events only on video pad */
+ name = gst_pad_get_name (stream->pad);
+ fail_unless (g_strcmp0 (name, "video_00") == 0);
+ gst_event_parse_protection (event, &system_id, &data, &origin);
- testOutputStreamData =
- gst_adaptive_demux_test_find_test_data_by_stream (testData, stream, NULL);
- fail_unless (testOutputStreamData != NULL);
+ gst_buffer_map (data, &info, GST_MAP_READ);
- /* 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);
+ value = g_malloc (info.size + 1);
+ strncpy (value, (gchar *) info.data, info.size);
+ value[info.size] = 0;
+ gst_buffer_unmap (data, &info);
- /* 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 (g_strcmp0 (system_id, "11111111-AAAA-BBBB-CCCC-123456789ABC") == 0) {
+ fail_unless (g_strcmp0 (origin, "dash/mpd") == 0);
+ fail_unless (g_strcmp0 (value, "test value") == 0);
+ } else if (g_strcmp0 (system_id, "5e629af5-38da-4063-8977-97ffbd9902d4") == 0) {
+ const gchar *str;
+
+ fail_unless (g_strcmp0 (origin, "dash/mpd") == 0);
+
+ /* We can't do a simple compare of value (which should be an XML dump
+ of the ContentProtection element), because the whitespace
+ formatting from xmlDump might differ between versions of libxml */
+ str = strstr (value, "<ContentProtection");
+ fail_if (str == NULL);
+ str = strstr (value, "<mas:MarlinContentIds>");
+ fail_if (str == NULL);
+ str = strstr (value, "<mas:MarlinContentId>");
+ fail_if (str == NULL);
+ str = strstr (value, "urn:marlin:kid:02020202020202020202020202020202");
+ fail_if (str == NULL);
+ str = strstr (value, "</ContentProtection>");
+ fail_if (str == NULL);
+ } else {
+ fail ("unexpected content protection event '%s'", system_id);
+ }
+
+ g_free (value);
+
+ fail_if (test_case->countContentProtectionEvents == NULL);
+ gst_structure_get_uint (test_case->countContentProtectionEvents, name,
+ &event_count);
+ event_count++;
+ gst_structure_set (test_case->countContentProtectionEvents, name, G_TYPE_UINT,
+ event_count, NULL);
+
+ g_free (name);
+ return TRUE;
}
/*
- * Test fragment download error
- * Let the adaptive demux download a few bytes, then instruct the
- * GstTestHTTPSrc element to generate an error.
+ * Test content protection
+ * Configure 3 content protection sources:
+ * - a uuid scheme/value pair
+ * - a non uuid scheme/value pair (dash recognises only uuid schemes)
+ * - a complex uuid scheme, with trailing spaces and capital letters in scheme uri
+ * Only the uuid scheme will be recognised. We expect to receive 2 content
+ * protection events
*/
-GST_START_TEST (testFragmentDownloadError)
+GST_START_TEST (testContentProtection)
{
const gchar *mpd =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
@@ -944,7 +1416,7 @@
" profiles=\"urn:mpeg:dash:profile:isoff-on-demand:2011\""
" type=\"static\""
" minBufferTime=\"PT1.500S\""
- " mediaPresentationDuration=\"PT0.5S\">"
+ " mediaPresentationDuration=\"PT135.743S\">"
" <Period>"
" <AdaptationSet mimeType=\"audio/webm\""
" subsegmentAlignment=\"true\">"
@@ -961,35 +1433,75 @@
" indexRangeExact=\"true\">"
" <Initialization range=\"0-4451\" />"
" </SegmentBase>"
+ " </Representation>"
+ " </AdaptationSet>"
+ " <AdaptationSet mimeType=\"video/webm\""
+ " subsegmentAlignment=\"true\">"
+ " <ContentProtection schemeIdUri=\"urn:uuid:11111111-AAAA-BBBB-CCCC-123456789ABC\" value=\"test value\"/>"
+ " <ContentProtection schemeIdUri=\"urn:mpeg:dash:mp4protection:2011\" value=\"cenc\"/>"
+ " <ContentProtection schemeIdUri=\" URN:UUID:5e629af5-38da-4063-8977-97ffbd9902d4\" xmlns:mas=\"urn:marlin:mas:1-0:services:schemas:mpd\">"
+ " <mas:MarlinContentIds>"
+ " <mas:MarlinContentId>urn:marlin:kid:02020202020202020202020202020202</mas:MarlinContentId>"
+ " </mas:MarlinContentIds>"
+ " </ContentProtection>"
+ " <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},
};
+ GstTestHTTPSrcCallbacks http_src_callbacks = { 0 };
+ GstTestHTTPSrcTestData http_src_test_data = { 0 };
GstAdaptiveDemuxTestCallbacks test_callbacks = { 0 };
- GstAdaptiveDemuxTestCase *testData;
+ GstDashDemuxTestCase *testData;
+ guint event_count = 0;
- 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);
+ http_src_callbacks.src_create = gst_dashdemux_http_src_create;
+ http_src_test_data.input = inputTestData;
+ gst_test_http_src_install_callbacks (&http_src_callbacks,
+ &http_src_test_data);
+
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.appsink_eos =
+ gst_adaptive_demux_test_check_size_of_received_data;
+ test_callbacks.demux_sent_event = testContentProtectionDashdemuxSendsEvent;
- test_callbacks.bus_error_message = testDownloadErrorMessageCallback;
+ testData = gst_dash_demux_test_case_new ();
+ COPY_OUTPUT_TEST_DATA (outputTestData, testData);
+ testData->countContentProtectionEvents =
+ gst_structure_new_empty ("countContentProtectionEvents");
+ gst_adaptive_demux_test_run (DEMUX_ELEMENT_NAME, "http://unit.test/test.mpd",
+ &test_callbacks, testData);
- 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);
+ fail_unless (gst_structure_has_field_typed
+ (testData->countContentProtectionEvents, "video_00", G_TYPE_UINT));
+
+ gst_structure_get_uint (testData->countContentProtectionEvents, "video_00",
+ &event_count);
+ fail_unless (event_count == 2);
+
+ g_object_unref (testData);
+ if (http_src_test_data.data)
+ gst_structure_free (http_src_test_data.data);
}
GST_END_TEST;
@@ -1014,8 +1526,11 @@
tcase_add_test (tc_basicTest, testReverseSeekSnapBeforePosition);
tcase_add_test (tc_basicTest, testReverseSeekSnapAfterPosition);
tcase_add_test (tc_basicTest, testDownloadError);
- tcase_add_test (tc_basicTest, testFragmentDownloadError);
+ tcase_add_test (tc_basicTest, testHeaderDownloadError);
+ tcase_add_test (tc_basicTest, testMediaDownloadErrorLastFragment);
+ tcase_add_test (tc_basicTest, testMediaDownloadErrorMiddleFragment);
tcase_add_test (tc_basicTest, testQuery);
+ tcase_add_test (tc_basicTest, testContentProtection);
tcase_add_unchecked_fixture (tc_basicTest, gst_adaptive_demux_test_setup,
gst_adaptive_demux_test_teardown);
diff --git a/tests/check/elements/dash_isoff.c b/tests/check/elements/dash_isoff.c
new file mode 100644
index 0000000..500747b
--- /dev/null
+++ b/tests/check/elements/dash_isoff.c
@@ -0,0 +1,206 @@
+#include "../../ext/dash/gstisoff.c"
+#undef GST_CAT_DEFAULT
+
+#include <gst/check/gstcheck.h>
+#include <gst/base/base.h>
+
+#include "dash_isoff.h"
+
+GST_START_TEST (dash_isoff_box_header_minimal)
+{
+ /* INDENT-OFF */
+ static const guint8 data[] = {
+ 16, 32, 64, 128,
+ 't', 'e', 's', 't'
+ };
+ /* INDENT-ON */
+ GstByteReader reader = GST_BYTE_READER_INIT (data, sizeof (data));
+ guint32 type;
+ guint8 extended_type[16];
+ guint header_size;
+ guint64 size;
+
+ fail_unless (gst_isoff_parse_box_header (&reader, &type, extended_type,
+ &header_size, &size));
+ fail_unless (type == GST_MAKE_FOURCC ('t', 'e', 's', 't'));
+ fail_unless_equals_int (header_size, 8);
+ fail_unless_equals_uint64 (size, 0x10204080);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (dash_isoff_box_header_long_size)
+{
+ /* INDENT-OFF */
+ static const guint8 data[] = {
+ 0, 0, 0, 1,
+ 't', 'e', 's', 't',
+ 1, 2, 4, 8, 16, 32, 64, 128
+ };
+ /* INDENT-ON */
+ GstByteReader reader = GST_BYTE_READER_INIT (data, sizeof (data));
+ guint32 type;
+ guint8 extended_type[16];
+ guint header_size;
+ guint64 size;
+
+ fail_unless (gst_isoff_parse_box_header (&reader, &type, extended_type,
+ &header_size, &size));
+ fail_unless (type == GST_MAKE_FOURCC ('t', 'e', 's', 't'));
+ fail_unless_equals_int (header_size, 16);
+ fail_unless_equals_uint64 (size, G_GUINT64_CONSTANT (0x0102040810204080));
+}
+
+GST_END_TEST;
+
+GST_START_TEST (dash_isoff_box_header_uuid_type)
+{
+ /* INDENT-OFF */
+ static const guint8 data[] = {
+ 16, 32, 64, 128,
+ 'u', 'u', 'i', 'd',
+ 'a', 'b', 'c', 'd',
+ 'e', 'f', 'g', 'h',
+ 'i', 'j', 'k', 'l',
+ 'm', 'n', 'o', 'p'
+ };
+ /* INDENT-ON */
+ GstByteReader reader = GST_BYTE_READER_INIT (data, sizeof (data));
+ guint32 type;
+ guint8 extended_type[16];
+ guint header_size;
+ guint64 size;
+
+ fail_unless (gst_isoff_parse_box_header (&reader, &type, extended_type,
+ &header_size, &size));
+ fail_unless (type == GST_MAKE_FOURCC ('u', 'u', 'i', 'd'));
+ fail_unless_equals_int (header_size, 24);
+ fail_unless_equals_uint64 (size, 0x10204080);
+ fail_unless (memcmp (data + 8, extended_type, 16) == 0);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (dash_isoff_box_header_uuid_type_long_size)
+{
+ /* INDENT-OFF */
+ static const guint8 data[] = {
+ 0, 0, 0, 1,
+ 'u', 'u', 'i', 'd',
+ 1, 2, 4, 8, 16, 32, 64, 128,
+ 'a', 'b', 'c', 'd',
+ 'e', 'f', 'g', 'h',
+ 'i', 'j', 'k', 'l',
+ 'm', 'n', 'o', 'p'
+ };
+ /* INDENT-ON */
+ GstByteReader reader = GST_BYTE_READER_INIT (data, sizeof (data));
+ guint32 type;
+ guint8 extended_type[16];
+ guint header_size;
+ guint64 size;
+
+ fail_unless (gst_isoff_parse_box_header (&reader, &type, extended_type,
+ &header_size, &size));
+ fail_unless (type == GST_MAKE_FOURCC ('u', 'u', 'i', 'd'));
+ fail_unless_equals_int (header_size, 32);
+ fail_unless_equals_uint64 (size, G_GUINT64_CONSTANT (0x0102040810204080));
+ fail_unless (memcmp (data + 16, extended_type, 16) == 0);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (dash_isoff_moof_parse)
+{
+ /* INDENT-ON */
+ GstByteReader reader = GST_BYTE_READER_INIT (moof1, sizeof (moof1));
+ guint32 type;
+ guint8 extended_type[16];
+ guint header_size;
+ guint64 size;
+ GstMoofBox *moof;
+ GstTrafBox *traf;
+ GstTrunBox *trun;
+ guint i;
+
+ fail_unless (gst_isoff_parse_box_header (&reader, &type, extended_type,
+ &header_size, &size));
+ fail_unless (type == GST_MAKE_FOURCC ('m', 'o', 'o', 'f'));
+ fail_unless_equals_int (header_size, 8);
+ fail_unless_equals_uint64 (size, sizeof (moof1));
+
+ moof = gst_isoff_moof_box_parse (&reader);
+ fail_unless (moof != NULL);
+
+ fail_unless_equals_int (moof->mfhd.sequence_number, 1);
+ fail_unless_equals_int (moof->traf->len, 1);
+
+ traf = &g_array_index (moof->traf, GstTrafBox, 0);
+ fail_unless_equals_int (traf->tfhd.version, 0);
+ fail_unless_equals_int (traf->tfhd.flags,
+ GST_TFHD_FLAGS_DEFAULT_SAMPLE_DURATION_PRESENT);
+ fail_unless_equals_int (traf->tfhd.track_id, 1);
+ fail_unless_equals_uint64 (traf->tfhd.base_data_offset, 0);
+ fail_unless_equals_int (traf->tfhd.sample_description_index, 0);
+ fail_unless_equals_int (traf->tfhd.default_sample_duration, 8);
+ fail_unless_equals_int (traf->tfhd.default_sample_size, 0);
+ fail_unless_equals_int (traf->tfhd.default_sample_flags, 0);
+
+ fail_unless_equals_int (traf->trun->len, 1);
+ trun = &g_array_index (traf->trun, GstTrunBox, 0);
+
+ fail_unless_equals_int (trun->version, 1);
+ fail_unless_equals_int (trun->flags,
+ GST_TRUN_FLAGS_SAMPLE_COMPOSITION_TIME_OFFSETS_PRESENT |
+ GST_TRUN_FLAGS_SAMPLE_FLAGS_PRESENT | GST_TRUN_FLAGS_SAMPLE_SIZE_PRESENT |
+ GST_TRUN_FLAGS_DATA_OFFSET_PRESENT);
+ fail_unless_equals_int (trun->sample_count, 96);
+ fail_unless_equals_int (trun->data_offset, size + header_size);
+ fail_unless_equals_int (trun->first_sample_flags, 0);
+
+ fail_unless_equals_int (trun->samples->len, 96);
+
+ for (i = 0; i < 96; i++) {
+ GstTrunSample *sample = &g_array_index (trun->samples, GstTrunSample, i);
+
+ fail_unless_equals_int (sample->sample_duration, 0);
+ if (i == 0) {
+ /* sample_depends_on = 2 => I-frame */
+ /* sample_is_non_sync_sample = 0 */
+ fail_unless_equals_int (sample->sample_flags, 0x02000000);
+ } else {
+ /* sample_depends_on = 1 => non-I-frame */
+ /* sample_is_non_sync_sample = 1 */
+ fail_unless_equals_int (sample->sample_flags, 0x01010000);
+ }
+
+ /* sample size and CTO is changing for each sample */
+ }
+
+ gst_isoff_moof_box_free (moof);
+}
+
+GST_END_TEST;
+
+static Suite *
+dash_isoff_suite (void)
+{
+ Suite *s = suite_create ("dash-isoff");
+ TCase *tc_isoff_box = tcase_create ("isoff-box-parsing");
+ TCase *tc_moof = tcase_create ("moof");
+
+ tcase_add_test (tc_isoff_box, dash_isoff_box_header_minimal);
+ tcase_add_test (tc_isoff_box, dash_isoff_box_header_long_size);
+ tcase_add_test (tc_isoff_box, dash_isoff_box_header_uuid_type);
+ tcase_add_test (tc_isoff_box, dash_isoff_box_header_uuid_type_long_size);
+
+ suite_add_tcase (s, tc_isoff_box);
+
+
+ tcase_add_test (tc_moof, dash_isoff_moof_parse);
+ suite_add_tcase (s, tc_moof);
+
+ return s;
+}
+
+GST_CHECK_MAIN (dash_isoff);
diff --git a/tests/check/elements/dash_isoff.h b/tests/check/elements/dash_isoff.h
new file mode 100644
index 0000000..ab4c30c
--- /dev/null
+++ b/tests/check/elements/dash_isoff.h
@@ -0,0 +1,113 @@
+#ifndef __DASH_ISOFF_H__
+#define __DASH_ISOFF_H__
+
+#include <glib.h>
+
+static const guint8 moof1[] = {
+ 0x00, 0x00, 0x04, 0xdc, 0x6d, 0x6f, 0x6f, 0x66, 0x00, 0x00, 0x00, 0x10,
+ 0x6d, 0x66, 0x68, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x04, 0xc4, 0x74, 0x72, 0x61, 0x66, 0x00, 0x00, 0x00, 0x14,
+ 0x74, 0x66, 0x68, 0x64, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x74, 0x66, 0x64, 0x74,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x04, 0x94, 0x74, 0x72, 0x75, 0x6e, 0x01, 0x00, 0x0e, 0x01,
+ 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x04, 0xe4, 0x00, 0x00, 0x00, 0xd1,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x05, 0xa5,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x09, 0x47,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x07, 0xdd,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x0a, 0x70,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x06, 0xb4,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x08, 0x92,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x9b,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8f,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+#endif
diff --git a/tests/check/elements/dash_mpd.c b/tests/check/elements/dash_mpd.c
index 348b65c..783ecae 100644
--- a/tests/check/elements/dash_mpd.c
+++ b/tests/check/elements/dash_mpd.c
@@ -44,6 +44,14 @@
return ms;
}
+static GstClockTime
+duration_to_clocktime (guint year, guint month, guint day, guint hour,
+ guint minute, guint second, guint millisecond)
+{
+ return (GST_MSECOND * duration_to_ms (year, month, day, hour, minute, second,
+ millisecond));
+}
+
/*
* Test to ensure a simple mpd file successfully parses.
*
@@ -3154,19 +3162,23 @@
assert_equals_int (represendationIndex, 1);
represendationIndex =
- gst_mpdparser_get_rep_idx_with_max_bandwidth (representations, 0);
+ gst_mpdparser_get_rep_idx_with_max_bandwidth (representations, 0, 0, 0, 0,
+ 1);
assert_equals_int (represendationIndex, 1);
represendationIndex =
- gst_mpdparser_get_rep_idx_with_max_bandwidth (representations, 100000);
+ gst_mpdparser_get_rep_idx_with_max_bandwidth (representations, 100000, 0,
+ 0, 0, 1);
assert_equals_int (represendationIndex, -1);
represendationIndex =
- gst_mpdparser_get_rep_idx_with_max_bandwidth (representations, 300000);
+ gst_mpdparser_get_rep_idx_with_max_bandwidth (representations, 300000, 0,
+ 0, 0, 1);
assert_equals_int (represendationIndex, 1);
represendationIndex =
- gst_mpdparser_get_rep_idx_with_max_bandwidth (representations, 500000);
+ gst_mpdparser_get_rep_idx_with_max_bandwidth (representations, 500000, 0,
+ 0, 0, 1);
assert_equals_int (represendationIndex, 0);
gst_mpd_client_free (mpdclient);
@@ -4821,6 +4833,103 @@
GST_END_TEST;
/*
+ * Test SegmentList with multiple segmentURL
+ *
+ */
+GST_START_TEST (dash_mpdparser_multipleSegmentURL)
+{
+ 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.
+ *
+ * Segment duration is 25 seconds. There are 2 segments in the list.
+ * We expect first segment to have a duration of 20 seconds (limited by the period)
+ * and the second segment to not exist.
+ */
+ 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\">"
+ " <Representation>"
+ " <SegmentList duration=\"25\">"
+ " <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></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, 20, 0);
+ expectedTimestamp = duration_to_ms (0, 0, 0, 0, 0, 0, 0);
+
+ /* the representation contains 2 segments. The first is partially
+ * clipped, and the second entirely (and thus discarded).
+ */
+
+ /* check first segment */
+ ret = gst_mpd_client_get_next_fragment (mpdclient, 0, &fragment);
+ assert_equals_int (ret, TRUE);
+ assert_equals_string (fragment.uri, "/TestMedia0");
+ assert_equals_int64 (fragment.range_start, 10);
+ assert_equals_int64 (fragment.range_end, 20);
+ assert_equals_string (fragment.index_uri, "/TestIndex0");
+ assert_equals_int64 (fragment.index_range_start, 100);
+ assert_equals_int64 (fragment.index_range_end, 200);
+ 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_EOS);
+
+ gst_mpd_client_free (mpdclient);
+}
+
+GST_END_TEST;
+
+/*
* Test parsing empty xml string
*
*/
@@ -5348,6 +5457,74 @@
GST_END_TEST;
/*
+ * Test that the maximum_segment_duration correctly implements the
+ * rules in the DASH specification
+ */
+GST_START_TEST (dash_mpdparser_maximum_segment_duration)
+{
+ const gchar *xml_template =
+ "<?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\""
+ " %s "
+ " mediaPresentationDuration=\"P100Y\">"
+ " <Period id=\"Period0\" start=\"PT0S\">"
+ " <AdaptationSet mimeType=\"video/mp4\" >"
+ " <SegmentTemplate timescale=\"90000\" initialization=\"$RepresentationID$/Header.m4s\" media=\"$RepresentationID$/$Number$.m4s\" duration=\"360000\" />"
+ " <Representation id=\"video1\" width=\"576\" height=\"324\" frameRate=\"25\" sar=\"1:1\" bandwidth=\"900000\" codecs=\"avc1.4D401E\"/>"
+ " </AdaptationSet>"
+ " <AdaptationSet mimeType=\"audio/mp4\" >"
+ " <SegmentTemplate timescale=\"90000\" initialization=\"$RepresentationID$/Header.m4s\" media=\"$RepresentationID$/$Number$.m4s\" duration=\"340000\" />"
+ " <Representation id=\"audio1\" audioSamplingRate=\"22050\" bandwidth=\"29600\" codecs=\"mp4a.40.2\">"
+ " <AudioChannelConfiguration schemeIdUri=\"urn:mpeg:dash:23003:3:audio_channel_configuration:2011\" value=\"2\"/>"
+ " </Representation>" " </AdaptationSet>" " </Period></MPD>";
+ gboolean ret;
+ GstMpdClient *mpdclient;
+ gchar *xml;
+ GstClockTime dur;
+ GList *adapt_sets, *iter;
+
+ xml = g_strdup_printf (xml_template, "maxSegmentDuration=\"PT4.5S\"");
+ mpdclient = gst_mpd_client_new ();
+ ret = gst_mpd_parse (mpdclient, xml, (gint) strlen (xml));
+ g_free (xml);
+ assert_equals_int (ret, TRUE);
+
+ assert_equals_uint64 (mpdclient->mpd_node->maxSegmentDuration,
+ duration_to_ms (0, 0, 0, 0, 0, 4, 500));
+ dur = gst_mpd_client_get_maximum_segment_duration (mpdclient);
+ assert_equals_uint64 (dur, duration_to_clocktime (0, 0, 0, 0, 0, 4, 500));
+ gst_mpd_client_free (mpdclient);
+
+ /* now parse without the maxSegmentDuration attribute, to check that
+ gst_mpd_client_get_maximum_segment_duration uses the maximum
+ duration of any segment
+ */
+ xml = g_strdup_printf (xml_template, "");
+ mpdclient = gst_mpd_client_new ();
+ ret = gst_mpd_parse (mpdclient, xml, (gint) strlen (xml));
+ g_free (xml);
+ assert_equals_int (ret, TRUE);
+ ret =
+ gst_mpd_client_setup_media_presentation (mpdclient, GST_CLOCK_TIME_NONE,
+ -1, NULL);
+ assert_equals_int (ret, TRUE);
+ adapt_sets = gst_mpd_client_get_adaptation_sets (mpdclient);
+ for (iter = adapt_sets; iter; iter = g_list_next (iter)) {
+ GstAdaptationSetNode *adapt_set_node = iter->data;
+
+ ret = gst_mpd_client_setup_streaming (mpdclient, adapt_set_node);
+ assert_equals_int (ret, TRUE);
+ }
+ dur = gst_mpd_client_get_maximum_segment_duration (mpdclient);
+ assert_equals_uint64 (dur, duration_to_clocktime (0, 0, 0, 0, 0, 4, 0));
+ gst_mpd_client_free (mpdclient);
+}
+
+GST_END_TEST;
+
+/*
* create a test suite containing all dash testcases
*/
static Suite *
@@ -5482,6 +5659,7 @@
tcase_add_test (tc_complexMPD, dash_mpdparser_get_period_at_time);
tcase_add_test (tc_complexMPD, dash_mpdparser_adaptationSet_handling);
tcase_add_test (tc_complexMPD, dash_mpdparser_representation_selection);
+ tcase_add_test (tc_complexMPD, dash_mpdparser_multipleSegmentURL);
tcase_add_test (tc_complexMPD, dash_mpdparser_activeStream_selection);
tcase_add_test (tc_complexMPD, dash_mpdparser_activeStream_parameters);
tcase_add_test (tc_complexMPD, dash_mpdparser_get_audio_languages);
@@ -5527,6 +5705,7 @@
tcase_add_test (tc_stringTests, dash_mpdparser_rfc1738_strings);
tcase_add_test (tc_duration, dash_mpdparser_duration);
+ tcase_add_test (tc_duration, dash_mpdparser_maximum_segment_duration);
suite_add_tcase (s, tc_simpleMPD);
suite_add_tcase (s, tc_complexMPD);
diff --git a/tests/check/elements/glimagesink.c b/tests/check/elements/glimagesink.c
index 07f6899..b0f9e30 100644
--- a/tests/check/elements/glimagesink.c
+++ b/tests/check/elements/glimagesink.c
@@ -116,8 +116,6 @@
loop = g_main_loop_new (NULL, FALSE);
#endif
- setup_glimagesink ();
-
/* GstBaseSink handles the drain query as well. */
g_object_set (sinkelement, "enable-last-sample", TRUE, NULL);
@@ -188,6 +186,7 @@
* releases the buffers it currently owns, upon drain query. */
query = gst_query_new_drain ();
DO_CALL (do_peer_query_func, query);
+ gst_query_unref (query);
/* Transfer buffers back to the downstream pool to be release
* properly. This also make sure that all buffers are returned.
@@ -210,8 +209,6 @@
fail_unless (gst_buffer_pool_set_active (pool, FALSE));
gst_object_unref (pool);
- cleanup_glimagesink ();
-
if (loop)
g_main_loop_unref (loop);
}
@@ -226,7 +223,7 @@
tcase_set_timeout (tc, 5);
- tcase_add_checked_fixture (tc, setup_glimagesink, NULL);
+ tcase_add_checked_fixture (tc, setup_glimagesink, cleanup_glimagesink);
tcase_add_test (tc, test_query_drain);
suite_add_tcase (s, tc);
diff --git a/tests/check/elements/hls_demux.c b/tests/check/elements/hls_demux.c
index 8d07ea0..fca76b3 100644
--- a/tests/check/elements/hls_demux.c
+++ b/tests/check/elements/hls_demux.c
@@ -687,13 +687,20 @@
{"http://unit.test/002.ts", NULL, segment_size},
{NULL, NULL, 0}
};
+ const guint64 failure_position = 2048;
GstAdaptiveDemuxTestExpectedOutput outputTestData[] = {
- {"src_0", 2 * segment_size, NULL},
+ /* adaptive demux tries for 4 times (MAX_DOWNLOAD_ERROR_COUNT + 1) before giving up */
+ {"src_0", failure_position * 4, NULL},
{NULL, 0, NULL}
};
- const guint64 failure_position = 2048;
TESTCASE_INIT_BOILERPLATE (segment_size);
+ /* download in chunks of failure_position size.
+ * This means the first chunk will succeed, the second will generate
+ * error because we already exceeded failure_position bytes.
+ */
+ gst_test_http_src_set_default_blocksize (failure_position);
+
http_src_callbacks.src_start = gst_hlsdemux_test_src_start;
http_src_callbacks.src_create = gst_hlsdemux_test_network_error_src_create;
gst_structure_set (hlsTestCase.state,
diff --git a/tests/check/elements/hlsdemux_m3u8.c b/tests/check/elements/hlsdemux_m3u8.c
index f49e901..02f50f1 100644
--- a/tests/check/elements/hlsdemux_m3u8.c
+++ b/tests/check/elements/hlsdemux_m3u8.c
@@ -322,44 +322,41 @@
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=65000,CODECS=\"mp4a.40.5\"\r\n\
http://example.com/audio-only.m3u8";
-static GstM3U8Client *
+static GstHLSMasterPlaylist *
load_playlist (const gchar * data)
{
- gboolean ret;
- GstM3U8Client *client;
+ GstHLSMasterPlaylist *master;
- client = gst_m3u8_client_new ("http://localhost/test.m3u8", NULL);
- ret = gst_m3u8_client_update (client, g_strdup (data));
- assert_equals_int (ret, TRUE);
+ master = gst_hls_master_playlist_new_from_data (g_strdup (data),
+ "http://localhost/test.m3u8");
+ fail_unless (master != NULL);
- return client;
+ return master;
}
GST_START_TEST (test_load_main_playlist_invalid)
{
- gboolean ret;
- GstM3U8Client *client =
- gst_m3u8_client_new ("http://localhost/test.m3u8", NULL);
+ GstHLSMasterPlaylist *master;
- ret = gst_m3u8_client_update (client, g_strdup (INVALID_PLAYLIST));
- assert_equals_int (ret, FALSE);
-
- gst_m3u8_client_free (client);
+ master =
+ gst_hls_master_playlist_new_from_data (g_strdup (INVALID_PLAYLIST), NULL);
+ fail_unless (master == NULL);
}
GST_END_TEST;
GST_START_TEST (test_load_main_playlist_rendition)
{
- GstM3U8Client *client;
+ GstHLSMasterPlaylist *master;
+ GstHLSVariantStream *variant;
- client = load_playlist (ON_DEMAND_PLAYLIST);
+ master = load_playlist (ON_DEMAND_PLAYLIST);
+ variant = master->default_variant;
- assert_equals_int (g_list_length (client->main->files), 4);
- assert_equals_int (g_list_length (client->current->files), 4);
- assert_equals_int (client->sequence, 0);
+ assert_equals_int (g_list_length (variant->m3u8->files), 4);
+ assert_equals_int (master->version, 0);
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
@@ -367,17 +364,18 @@
static void
do_test_load_main_playlist_variant (const gchar * playlist)
{
- GstM3U8Client *client;
- GstM3U8 *stream;
+ GstHLSMasterPlaylist *master;
+ GstHLSVariantStream *stream;
GList *tmp;
- client = load_playlist (playlist);
+ master = gst_hls_master_playlist_new_from_data (g_strdup (playlist), NULL);
+ fail_unless (master != NULL);
- assert_equals_int (g_list_length (client->main->lists), 4);
+ assert_equals_int (g_list_length (master->variants), 4);
/* Audio-Only */
- tmp = g_list_first (client->main->lists);
- stream = GST_M3U8 (tmp->data);
+ tmp = g_list_first (master->variants);
+ stream = tmp->data;
assert_equals_int (stream->bandwidth, 65000);
assert_equals_int (stream->program_id, 1);
assert_equals_string (stream->uri, "http://example.com/audio-only.m3u8");
@@ -385,30 +383,30 @@
/* Low */
tmp = g_list_next (tmp);
- stream = GST_M3U8 (tmp->data);
+ stream = tmp->data;
assert_equals_int (stream->bandwidth, 128000);
assert_equals_int (stream->program_id, 1);
assert_equals_string (stream->uri, "http://example.com/low.m3u8");
/* Mid */
tmp = g_list_next (tmp);
- stream = GST_M3U8 (tmp->data);
+ stream = tmp->data;
assert_equals_int (stream->bandwidth, 256000);
assert_equals_int (stream->program_id, 1);
assert_equals_string (stream->uri, "http://example.com/mid.m3u8");
/* High */
tmp = g_list_next (tmp);
- stream = GST_M3U8 (tmp->data);
+ stream = tmp->data;
assert_equals_int (stream->bandwidth, 768000);
assert_equals_int (stream->program_id, 1);
assert_equals_string (stream->uri, "http://example.com/hi.m3u8");
/* Check the first playlist is selected */
- assert_equals_int (client->current != NULL, TRUE);
- assert_equals_int (client->current->bandwidth, 128000);
+ assert_equals_int (master->default_variant != NULL, TRUE);
+ assert_equals_int (master->default_variant->bandwidth, 128000);
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
}
GST_START_TEST (test_load_main_playlist_variant)
@@ -420,11 +418,11 @@
GST_START_TEST (test_load_main_playlist_variant_with_missing_uri)
{
- GstM3U8Client *client;
+ GstHLSMasterPlaylist *master;
- client = load_playlist (VARIANT_PLAYLIST_WITH_URI_MISSING);
- assert_equals_int (g_list_length (client->main->lists), 3);
- gst_m3u8_client_free (client);
+ master = load_playlist (VARIANT_PLAYLIST_WITH_URI_MISSING);
+ assert_equals_int (g_list_length (master->variants), 3);
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
@@ -453,17 +451,17 @@
static void
check_on_demand_playlist (const gchar * data)
{
- GstM3U8Client *client;
+ GstHLSMasterPlaylist *master;
GstM3U8 *pl;
GstM3U8MediaFile *file;
- client = load_playlist (data);
- pl = client->current;
+ master = load_playlist (data);
+ pl = master->default_variant->m3u8;
/* Sequence should be 0 as it's an ondemand playlist */
- assert_equals_int (client->sequence, 0);
+ assert_equals_int (pl->sequence, 0);
/* Check that we are not live */
- assert_equals_int (gst_m3u8_client_is_live (client), FALSE);
+ assert_equals_int (gst_m3u8_is_live (pl), FALSE);
/* Check number of entries */
assert_equals_int (g_list_length (pl->files), 4);
/* Check first media segments */
@@ -475,7 +473,7 @@
assert_equals_string (file->uri, "http://media.example.com/004.ts");
assert_equals_int (file->sequence, 3);
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
}
GST_START_TEST (test_on_demand_playlist)
@@ -508,18 +506,18 @@
GST_START_TEST (test_live_playlist)
{
- GstM3U8Client *client;
+ GstHLSMasterPlaylist *master;
GstM3U8 *pl;
GstM3U8MediaFile *file;
gint64 start = -1;
gint64 stop = -1;
- client = load_playlist (LIVE_PLAYLIST);
+ master = load_playlist (LIVE_PLAYLIST);
- pl = client->current;
+ pl = master->default_variant->m3u8;
/* Check that we are live */
- assert_equals_int (gst_m3u8_client_is_live (client), TRUE);
- assert_equals_int (client->sequence, 2681);
+ assert_equals_int (gst_m3u8_is_live (pl), TRUE);
+ assert_equals_int (pl->sequence, 2681);
/* Check number of entries */
assert_equals_int (g_list_length (pl->files), 4);
/* Check first media segments */
@@ -532,11 +530,11 @@
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));
+ fail_unless (gst_m3u8_get_seek_range (pl, &start, &stop));
assert_equals_int64 (start, 0);
assert_equals_float (stop / (double) GST_SECOND, 16.0);
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
@@ -546,44 +544,45 @@
* there is a jump in the media sequence that must be handled correctly. */
GST_START_TEST (test_live_playlist_rotated)
{
- GstM3U8Client *client;
+ GstHLSMasterPlaylist *master;
GstM3U8 *pl;
GstM3U8MediaFile *file;
gboolean ret;
- client = load_playlist (LIVE_PLAYLIST);
- pl = client->current;
- assert_equals_int (client->sequence, 2681);
+ master = load_playlist (LIVE_PLAYLIST);
+ pl = master->default_variant->m3u8;
+
+ assert_equals_int (pl->sequence, 2681);
/* Check first media segments */
file = GST_M3U8_MEDIA_FILE (g_list_first (pl->files)->data);
assert_equals_int (file->sequence, 2680);
- ret = gst_m3u8_client_update (client, g_strdup (LIVE_ROTATED_PLAYLIST));
+ ret = gst_m3u8_update (pl, g_strdup (LIVE_ROTATED_PLAYLIST));
assert_equals_int (ret, TRUE);
- gst_m3u8_client_get_next_fragment (client, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, TRUE);
+ gst_m3u8_get_next_fragment (pl, TRUE, NULL, NULL);
+
/* FIXME: Sequence should last - 3. Should it? */
- assert_equals_int (client->sequence, 3001);
+ assert_equals_int (pl->sequence, 3001);
/* Check first media segments */
file = GST_M3U8_MEDIA_FILE (g_list_first (pl->files)->data);
assert_equals_int (file->sequence, 3001);
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
GST_START_TEST (test_playlist_with_doubles_duration)
{
- GstM3U8Client *client;
+ GstHLSMasterPlaylist *master;
GstM3U8 *pl;
GstM3U8MediaFile *file;
gint64 start = -1;
gint64 stop = -1;
- client = load_playlist (DOUBLES_PLAYLIST);
+ master = load_playlist (DOUBLES_PLAYLIST);
+ pl = master->default_variant->m3u8;
- pl = client->current;
/* Check first media segments */
file = GST_M3U8_MEDIA_FILE (g_list_nth_data (pl->files, 0));
assert_equals_float (file->duration / (double) GST_SECOND, 10.321);
@@ -593,18 +592,19 @@
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));
+ fail_unless (gst_m3u8_get_seek_range (pl, &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);
+
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
GST_START_TEST (test_playlist_with_encryption)
{
- GstM3U8Client *client;
+ GstHLSMasterPlaylist *master;
GstM3U8 *pl;
GstM3U8MediaFile *file;
guint8 iv1[16] = { 0, };
@@ -613,9 +613,9 @@
iv1[15] = 1;
iv2[15] = 2;
- client = load_playlist (AES_128_ENCRYPTED_PLAYLIST);
+ master = load_playlist (AES_128_ENCRYPTED_PLAYLIST);
+ pl = master->default_variant->m3u8;
- pl = client->current;
assert_equals_int (g_list_length (pl->files), 5);
/* Check all media segments */
@@ -640,72 +640,73 @@
assert_equals_string (file->key, "https://priv.example.com/key2.bin");
fail_unless (memcmp (&file->iv, iv1, 16) == 0);
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
+
GST_START_TEST (test_update_invalid_playlist)
{
- GstM3U8Client *client;
+ GstHLSMasterPlaylist *master;
GstM3U8 *pl;
gboolean ret;
/* Test updates in on-demand playlists */
- client = load_playlist (ON_DEMAND_PLAYLIST);
- pl = client->current;
+ master = load_playlist (ON_DEMAND_PLAYLIST);
+ pl = master->default_variant->m3u8;
assert_equals_int (g_list_length (pl->files), 4);
- ret = gst_m3u8_client_update (client, g_strdup ("#INVALID"));
+ ret = gst_m3u8_update (pl, g_strdup ("#INVALID"));
assert_equals_int (ret, FALSE);
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
GST_START_TEST (test_update_playlist)
{
- GstM3U8Client *client;
+ GstHLSMasterPlaylist *master;
GstM3U8 *pl;
gchar *live_pl;
gboolean ret;
/* Test updates in on-demand playlists */
- client = load_playlist (ON_DEMAND_PLAYLIST);
- pl = client->current;
+ master = load_playlist (ON_DEMAND_PLAYLIST);
+ pl = master->default_variant->m3u8;
assert_equals_int (g_list_length (pl->files), 4);
- ret = gst_m3u8_client_update (client, g_strdup (ON_DEMAND_PLAYLIST));
+ ret = gst_m3u8_update (pl, g_strdup (ON_DEMAND_PLAYLIST));
assert_equals_int (ret, TRUE);
assert_equals_int (g_list_length (pl->files), 4);
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
/* Test updates in live playlists */
- client = load_playlist (LIVE_PLAYLIST);
- pl = client->current;
+ master = load_playlist (LIVE_PLAYLIST);
+ pl = master->default_variant->m3u8;
assert_equals_int (g_list_length (pl->files), 4);
/* Add a new entry to the playlist and check the update */
live_pl = g_strdup_printf ("%s\n%s\n%s", LIVE_PLAYLIST, "#EXTINF:8",
"https://priv.example.com/fileSequence2683.ts");
- ret = gst_m3u8_client_update (client, live_pl);
+ ret = gst_m3u8_update (pl, live_pl);
assert_equals_int (ret, TRUE);
assert_equals_int (g_list_length (pl->files), 5);
/* Test sliding window */
- ret = gst_m3u8_client_update (client, g_strdup (LIVE_PLAYLIST));
+ ret = gst_m3u8_update (pl, g_strdup (LIVE_PLAYLIST));
assert_equals_int (ret, TRUE);
assert_equals_int (g_list_length (pl->files), 4);
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
GST_START_TEST (test_playlist_media_files)
{
- GstM3U8Client *client;
+ GstHLSMasterPlaylist *master;
GstM3U8 *pl;
GstM3U8MediaFile *file;
- client = load_playlist (ON_DEMAND_PLAYLIST);
- pl = client->current;
+ master = load_playlist (ON_DEMAND_PLAYLIST);
+ pl = master->default_variant->m3u8;
/* Check number of entries */
assert_equals_int (g_list_length (pl->files), 4);
@@ -718,19 +719,19 @@
assert_equals_int (file->size, -1);
assert_equals_string (file->title, "Test");
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
GST_START_TEST (test_playlist_byte_range_media_files)
{
- GstM3U8Client *client;
+ GstHLSMasterPlaylist *master;
GstM3U8 *pl;
GstM3U8MediaFile *file;
- client = load_playlist (BYTE_RANGES_PLAYLIST);
- pl = client->current;
+ master = load_playlist (BYTE_RANGES_PLAYLIST);
+ pl = master->default_variant->m3u8;
/* Check number of entries */
assert_equals_int (g_list_length (pl->files), 4);
@@ -749,11 +750,11 @@
assert_equals_int (file->offset, 3000);
assert_equals_int (file->size, 1000);
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
- client = load_playlist (BYTE_RANGES_ACC_OFFSET_PLAYLIST);
- pl = client->current;
+ master = load_playlist (BYTE_RANGES_ACC_OFFSET_PLAYLIST);
+ pl = master->default_variant->m3u8;
/* Check number of entries */
assert_equals_int (g_list_length (pl->files), 4);
@@ -772,90 +773,93 @@
assert_equals_int (file->offset, 3000);
assert_equals_int (file->size, 1000);
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
GST_START_TEST (test_get_next_fragment)
{
- GstM3U8Client *client;
+ GstHLSMasterPlaylist *master;
+ GstM3U8 *pl;
+ GstM3U8MediaFile *mf;
gboolean discontinous;
- gchar *uri;
- GstClockTime duration, timestamp;
- gint64 range_start, range_end;
+ GstClockTime timestamp;
- client = load_playlist (BYTE_RANGES_PLAYLIST);
+ master = load_playlist (BYTE_RANGES_PLAYLIST);
+ pl = master->default_variant->m3u8;
/* Check the next fragment */
- gst_m3u8_client_get_next_fragment (client, &discontinous, &uri, &duration,
- ×tamp, &range_start, &range_end, NULL, NULL, TRUE);
+ mf = gst_m3u8_get_next_fragment (pl, TRUE, ×tamp, &discontinous);
+ fail_unless (mf != NULL);
assert_equals_int (discontinous, FALSE);
- assert_equals_string (uri, "http://media.example.com/all.ts");
+ assert_equals_string (mf->uri, "http://media.example.com/all.ts");
assert_equals_uint64 (timestamp, 0);
- assert_equals_uint64 (duration, 10 * GST_SECOND);
- assert_equals_uint64 (range_start, 100);
- assert_equals_uint64 (range_end, 1099);
- g_free (uri);
+ assert_equals_uint64 (mf->duration, 10 * GST_SECOND);
+ assert_equals_uint64 (mf->offset, 100);
+ assert_equals_uint64 (mf->offset + mf->size, 1100);
- gst_m3u8_client_advance_fragment (client, TRUE);
+ gst_m3u8_advance_fragment (pl, TRUE);
/* Check next media segments */
- gst_m3u8_client_get_next_fragment (client, &discontinous, &uri, &duration,
- ×tamp, &range_start, &range_end, NULL, NULL, TRUE);
+ mf = gst_m3u8_get_next_fragment (pl, TRUE, ×tamp, &discontinous);
+ fail_unless (mf != NULL);
assert_equals_int (discontinous, FALSE);
- assert_equals_string (uri, "http://media.example.com/all.ts");
+ assert_equals_string (mf->uri, "http://media.example.com/all.ts");
assert_equals_uint64 (timestamp, 10 * GST_SECOND);
- assert_equals_uint64 (duration, 10 * GST_SECOND);
- assert_equals_uint64 (range_start, 1000);
- assert_equals_uint64 (range_end, 1999);
- g_free (uri);
+ assert_equals_uint64 (mf->duration, 10 * GST_SECOND);
+ assert_equals_uint64 (mf->offset, 1000);
+ assert_equals_uint64 (mf->offset + mf->size, 2000);
- gst_m3u8_client_advance_fragment (client, TRUE);
+ gst_m3u8_advance_fragment (pl, TRUE);
/* Check next media segments */
- gst_m3u8_client_get_next_fragment (client, &discontinous, &uri, &duration,
- ×tamp, &range_start, &range_end, NULL, NULL, TRUE);
+ mf = gst_m3u8_get_next_fragment (pl, TRUE, ×tamp, &discontinous);
assert_equals_int (discontinous, FALSE);
- assert_equals_string (uri, "http://media.example.com/all.ts");
+ assert_equals_string (mf->uri, "http://media.example.com/all.ts");
assert_equals_uint64 (timestamp, 20 * GST_SECOND);
- assert_equals_uint64 (duration, 10 * GST_SECOND);
- assert_equals_uint64 (range_start, 2000);
- assert_equals_uint64 (range_end, 2999);
- g_free (uri);
+ assert_equals_uint64 (mf->duration, 10 * GST_SECOND);
+ assert_equals_uint64 (mf->offset, 2000);
+ assert_equals_uint64 (mf->offset + mf->size, 3000);
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
GST_START_TEST (test_get_duration)
{
- GstM3U8Client *client;
+ GstHLSMasterPlaylist *master;
+ GstM3U8 *pl;
/* Test duration for on-demand playlists */
- client = load_playlist (ON_DEMAND_PLAYLIST);
- assert_equals_uint64 (gst_m3u8_client_get_duration (client), 40 * GST_SECOND);
- gst_m3u8_client_free (client);
+ master = load_playlist (ON_DEMAND_PLAYLIST);
+ pl = master->default_variant->m3u8;
+
+ assert_equals_uint64 (gst_m3u8_get_duration (pl), 40 * GST_SECOND);
+ gst_hls_master_playlist_unref (master);
/* Test duration for live playlists */
- client = load_playlist (LIVE_PLAYLIST);
- assert_equals_uint64 (gst_m3u8_client_get_duration (client),
- GST_CLOCK_TIME_NONE);
- gst_m3u8_client_free (client);
+ master = load_playlist (LIVE_PLAYLIST);
+ pl = master->default_variant->m3u8;
+ assert_equals_uint64 (gst_m3u8_get_duration (pl), GST_CLOCK_TIME_NONE);
+
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
GST_START_TEST (test_get_target_duration)
{
- GstM3U8Client *client;
+ GstHLSMasterPlaylist *master;
+ GstM3U8 *pl;
- client = load_playlist (ON_DEMAND_PLAYLIST);
- assert_equals_uint64 (gst_m3u8_client_get_target_duration (client),
- 10 * GST_SECOND);
+ master = load_playlist (ON_DEMAND_PLAYLIST);
+ pl = master->default_variant->m3u8;
- gst_m3u8_client_free (client);
+ assert_equals_uint64 (gst_m3u8_get_target_duration (pl), 10 * GST_SECOND);
+
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
@@ -863,23 +867,29 @@
GST_START_TEST (test_get_stream_for_bitrate)
{
- GstM3U8Client *client;
- GstM3U8 *stream;
+ GstHLSMasterPlaylist *master;
+ GstHLSVariantStream *stream;
- client = load_playlist (VARIANT_PLAYLIST);
- stream = gst_m3u8_client_get_playlist_for_bitrate (client, 0)->data;
+ master = load_playlist (VARIANT_PLAYLIST);
+ stream = gst_hls_master_playlist_get_variant_for_bitrate (master, NULL, 0);
+
assert_equals_int (stream->bandwidth, 65000);
- stream = gst_m3u8_client_get_playlist_for_bitrate (client, G_MAXINT32)->data;
+
+ stream =
+ gst_hls_master_playlist_get_variant_for_bitrate (master, NULL,
+ G_MAXINT32);
assert_equals_int (stream->bandwidth, 768000);
- stream = gst_m3u8_client_get_playlist_for_bitrate (client, 300000)->data;
+ stream =
+ gst_hls_master_playlist_get_variant_for_bitrate (master, NULL, 300000);
assert_equals_int (stream->bandwidth, 256000);
- stream = gst_m3u8_client_get_playlist_for_bitrate (client, 500000)->data;
+ stream =
+ gst_hls_master_playlist_get_variant_for_bitrate (master, NULL, 500000);
assert_equals_int (stream->bandwidth, 256000);
- stream = gst_m3u8_client_get_playlist_for_bitrate (client, 255000)->data;
+ stream =
+ gst_hls_master_playlist_get_variant_for_bitrate (master, NULL, 255000);
assert_equals_int (stream->bandwidth, 128000);
-
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
@@ -905,7 +915,7 @@
{
GstM3U8Client *client;
- client = load_playlist (ON_DEMAND_PLAYLIST);
+ master = load_playlist (ON_DEMAND_PLAYLIST);
/* Test seek in the middle of a fragment */
do_test_seek (client, 1, 0);
@@ -922,10 +932,10 @@
/* Test invalid seeks (end if list should be 30 + 10) */
do_test_seek (client, 39, 30);
do_test_seek (client, 40, -1);
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
/* Test seeks on a live playlist */
- client = load_playlist (LIVE_PLAYLIST);
+ master = load_playlist (LIVE_PLAYLIST);
do_test_seek (client, 0, 0);
do_test_seek (client, 8, 8);
@@ -933,7 +943,7 @@
do_test_seek (client, 30, 24);
do_test_seek (client, 3000, -1);
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
@@ -944,7 +954,7 @@
GstM3U8Media *media;
GList *alternates;
- client = load_playlist (ALTERNATE_AUDIO_PLAYLIST);
+ master = load_playlist (ALTERNATE_AUDIO_PLAYLIST);
assert_equals_int (g_list_length (client->main->streams), 4);
assert_equals_int (g_hash_table_size (client->main->video_rendition_groups),
@@ -980,7 +990,7 @@
assert_equals_string (g_list_nth_data (alternates, 1), "Commentary");
assert_equals_string (g_list_nth_data (alternates, 2), "Deutsche");
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
@@ -991,7 +1001,7 @@
GstM3U8Media *media;
GList *alternates;
- client = load_playlist (SUBTITLES_PLAYLIST);
+ master = load_playlist (SUBTITLES_PLAYLIST);
assert_equals_int (g_list_length (client->main->streams), 3);
assert_equals_int (g_hash_table_size (client->main->video_rendition_groups),
@@ -1028,7 +1038,7 @@
assert_equals_string (g_list_nth_data (alternates, 1), "Spanish");
assert_equals_string (g_list_nth_data (alternates, 2), "English");
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
@@ -1041,7 +1051,7 @@
/* Check with a playlist with alternative audio renditions where the video
* stream is video-only and therefor we always have 2 playlists, one for
* video and another one for audio */
- client = load_playlist (SUBTITLES_PLAYLIST);
+ master = load_playlist (SUBTITLES_PLAYLIST);
gst_m3u8_client_get_current_uri (client, &v_uri, &a_uri, &s_uri);
assert_equals_int (a_uri == NULL, TRUE);
assert_equals_int (s_uri != NULL, TRUE);
@@ -1081,7 +1091,7 @@
assert_equals_string (v_uri, "http://localhost/low/video-audio.m3u8");
assert_equals_int (s_uri == NULL, TRUE);
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
@@ -1094,7 +1104,7 @@
/* Check with a playlist with alternative audio renditions where the video
* stream is video-only and therefor we always have 2 playlists, one for
* video and another one for audio */
- client = load_playlist (ALTERNATE_AUDIO_PLAYLIST);
+ master = load_playlist (ALTERNATE_AUDIO_PLAYLIST);
gst_m3u8_client_get_current_uri (client, &v_uri, &a_uri, &s_uri);
assert_equals_int (a_uri != NULL, TRUE);
assert_equals_string (a_uri, "http://localhost/main/english-audio.m3u8");
@@ -1123,13 +1133,13 @@
assert_equals_int (v_uri == NULL, TRUE);
assert_equals_int (s_uri == NULL, TRUE);
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
/* Now check with a playlist with alternative audio renditions where the
* video * stream has the default audio rendition muxed and therefore we
* only have 2 playlists when the audio alternative rendition is not the
* default one */
- client = load_playlist (ALT_AUDIO_PLAYLIST_WITH_VIDEO_AUDIO);
+ master = load_playlist (ALT_AUDIO_PLAYLIST_WITH_VIDEO_AUDIO);
gst_m3u8_client_get_current_uri (client, &v_uri, &a_uri, &s_uri);
assert_equals_int (a_uri == NULL, TRUE);
assert_equals_int (v_uri != NULL, TRUE);
@@ -1161,7 +1171,7 @@
assert_equals_string (v_uri, "http://localhost/low/video-audio.m3u8");
assert_equals_int (s_uri == NULL, TRUE);
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
@@ -1173,7 +1183,7 @@
GstFragment *a_frag, *v_frag, *s_frag;
gboolean ret;
- client = load_playlist (ALTERNATE_AUDIO_PLAYLIST);
+ master = load_playlist (ALTERNATE_AUDIO_PLAYLIST);
/* The default selection should be audio-only, which only has audio and not
* video */
gst_m3u8_client_get_current_uri (client, &v_uri, &a_uri, &s_uri);
@@ -1184,7 +1194,7 @@
assert_equals_int (s_uri == NULL, TRUE);
/* Update the playlists */
- ret = gst_m3u8_client_update (client,
+ ret = gst_m3u8_update (client,
g_strdup (ON_DEMAND_LOW_VIDEO_ONLY_PLAYLIST),
g_strdup (ON_DEMAND_ENGLISH_PLAYLIST), NULL);
assert_equals_int (ret, TRUE);
@@ -1229,7 +1239,7 @@
assert_equals_int (s_uri == NULL, TRUE);
/* Update the new uri's */
ret =
- gst_m3u8_client_update (client,
+ gst_m3u8_update (client,
g_strdup (ON_DEMAND_LOW_VIDEO_ONLY_PLAYLIST),
g_strdup (ON_DEMAND_GERMAN_PLAYLIST), NULL);
assert_equals_int (ret, TRUE);
@@ -1254,7 +1264,7 @@
assert_equals_string (v_uri, "http://localhost/mid/video-only.m3u8");
assert_equals_int (s_uri == NULL, TRUE);
ret =
- gst_m3u8_client_update (client,
+ gst_m3u8_update (client,
g_strdup (ON_DEMAND_MID_VIDEO_ONLY_PLAYLIST),
g_strdup (ON_DEMAND_GERMAN_PLAYLIST), NULL);
assert_equals_int (ret, TRUE);
@@ -1327,7 +1337,7 @@
ret = gst_m3u8_client_get_next_fragment (client, &v_frag, &a_frag, &s_frag);
assert_equals_int (ret, FALSE);
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
@@ -1339,16 +1349,19 @@
"#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;
+ GstHLSMasterPlaylist *master;
+ GstHLSVariantStream *stream;
GstM3U8 *media;
- client = load_playlist (MASTER_PLAYLIST);
+ master = 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_int (g_list_length (master->variants), 1);
+ stream = g_list_nth_data (master->variants, 0);
+ media = stream->m3u8;
+
assert_equals_string (media->uri,
"http://localhost/1251/media.m3u8?acl=/*1054559_h264_1500k.mp4");
- gst_m3u8_client_free (client);
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
@@ -1359,19 +1372,20 @@
"#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;
+ GstHLSMasterPlaylist *master;
+ GstHLSVariantStream *stream;
- client = load_playlist (MASTER_PLAYLIST);
+ master = 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);
+ assert_equals_int (g_list_length (master->variants), 1);
+ stream = g_list_nth_data (master->variants, 0);
+
+ assert_equals_int64 (stream->program_id, 1);
+ assert_equals_int64 (stream->width, 640);
+ assert_equals_int64 (stream->height, 352);
+ assert_equals_int64 (stream->bandwidth, 1251135);
+ assert_equals_string (stream->codecs, "avc1.42001f, mp4a.40.2");
+ gst_hls_master_playlist_unref (master);
}
GST_END_TEST;
@@ -1398,6 +1412,8 @@
tcase_add_test (tc_m3u8, test_empty_lines_playlist);
tcase_add_test (tc_m3u8, test_live_playlist);
tcase_add_test (tc_m3u8, test_live_playlist_rotated);
+ 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_update_invalid_playlist);
tcase_add_test (tc_m3u8, test_update_playlist);
tcase_add_test (tc_m3u8, test_playlist_media_files);
@@ -1414,8 +1430,6 @@
tcase_add_test (tc_m3u8, test_select_subs_alternate);
tcase_add_test (tc_m3u8, test_simulation);
#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/mssdemux.c b/tests/check/elements/mssdemux.c
index 78a1863..d5cc96c 100644
--- a/tests/check/elements/mssdemux.c
+++ b/tests/check/elements/mssdemux.c
@@ -206,7 +206,7 @@
gst_test_http_src_install_callbacks (&http_src_callbacks, inputTestData);
gst_adaptive_demux_test_seek (DEMUX_ELEMENT_NAME,
"http://unit.test/Manifest", testData);
- gst_object_unref (testData);
+ g_object_unref (testData);
}
GST_END_TEST;
@@ -273,7 +273,7 @@
gst_test_http_src_install_callbacks (&http_src_callbacks, inputTestData);
gst_adaptive_demux_test_seek (DEMUX_ELEMENT_NAME,
"http://unit.test/Manifest", testData);
- gst_object_unref (testData);
+ g_object_unref (testData);
}
GST_START_TEST (testSeekKeyUnitPosition)
@@ -404,7 +404,7 @@
gst_test_http_src_install_callbacks (&http_src_callbacks, inputTestData);
gst_adaptive_demux_test_run (DEMUX_ELEMENT_NAME, "http://unit.test/Manifest",
&test_callbacks, testData);
- gst_object_unref (testData);
+ g_object_unref (testData);
}
GST_END_TEST;
@@ -505,7 +505,7 @@
gst_test_http_src_install_callbacks (&http_src_callbacks, inputTestData);
gst_adaptive_demux_test_run (DEMUX_ELEMENT_NAME,
"http://unit.test/Manifest", &test_callbacks, testData);
- gst_object_unref (testData);
+ g_object_unref (testData);
}
GST_END_TEST;
@@ -597,7 +597,7 @@
gst_test_http_src_install_callbacks (&http_src_callbacks, inputTestData);
gst_adaptive_demux_test_run (DEMUX_ELEMENT_NAME,
"http://unit.test/Manifest", &test_callbacks, testData);
- gst_object_unref (testData);
+ g_object_unref (testData);
}
GST_END_TEST;
diff --git a/tests/check/elements/pnm.c b/tests/check/elements/pnm.c
new file mode 100644
index 0000000..b3be8cb
--- /dev/null
+++ b/tests/check/elements/pnm.c
@@ -0,0 +1,119 @@
+/* GStreamer
+ *
+ * unit test for PNM encoder / decoder
+ *
+ * Copyright (C) <2016> Jan Schmidt <jan@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/check/gstcheck.h>
+#include <gst/app/gstappsink.h>
+
+/* Create a pnmenc ! pnmdec and push in
+ * frames, checking that what comes out is what
+ * went in */
+GST_START_TEST (test_pnm_enc_dec)
+{
+ GstElement *pipeline;
+ GstElement *incf, *outcf, *enc;
+ GstElement *sink;
+ GstSample *sample;
+ GstBuffer *buffer;
+ gint i, n;
+
+ struct
+ {
+ const gchar *in_fmt;
+ const gchar *out_fmt;
+ } test_formats[] = {
+ {
+ "RGB", "RGB"}, {
+ "GRAY8", "GRAY8"}, {
+ "GRAY16_BE", "GRAY16_BE"}, {
+ "GRAY16_BE", "GRAY16_LE"}, {
+ "GRAY16_LE", "GRAY16_BE"}, {
+ "GRAY16_LE", "GRAY16_LE"}
+ };
+
+ pipeline =
+ gst_parse_launch
+ ("videotestsrc num-buffers=1 ! capsfilter name=incf ! pnmenc name=enc ! pnmdec ! capsfilter name=outcf ! appsink name=sink",
+ NULL);
+ g_assert (pipeline != NULL);
+
+ incf = gst_bin_get_by_name (GST_BIN (pipeline), "incf");
+ enc = gst_bin_get_by_name (GST_BIN (pipeline), "enc");
+ outcf = gst_bin_get_by_name (GST_BIN (pipeline), "outcf");
+ sink = gst_bin_get_by_name (GST_BIN (pipeline), "sink");
+
+ for (n = 0; n < 2; n++) {
+ for (i = 0; i < G_N_ELEMENTS (test_formats); i++) {
+ GstCaps *incaps = gst_caps_new_simple ("video/x-raw", "width", G_TYPE_INT,
+ 320, "height", G_TYPE_INT, 240, "framerate",
+ GST_TYPE_FRACTION, 1, 1, "format", G_TYPE_STRING,
+ test_formats[i].in_fmt, NULL);
+ GstCaps *outcaps =
+ gst_caps_new_simple ("video/x-raw", "width", G_TYPE_INT,
+ 320, "height", G_TYPE_INT, 240, "framerate",
+ GST_TYPE_FRACTION, 1, 1, "format", G_TYPE_STRING,
+ test_formats[i].out_fmt, NULL);
+
+ GST_DEBUG ("Setting in caps %" GST_PTR_FORMAT, incaps);
+ g_object_set (G_OBJECT (incf), "caps", incaps, NULL);
+ GST_DEBUG ("Setting out caps %" GST_PTR_FORMAT, outcaps);
+ g_object_set (G_OBJECT (outcf), "caps", outcaps, NULL);
+
+ gst_caps_unref (incaps);
+ gst_caps_unref (outcaps);
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ sample = gst_app_sink_pull_sample (GST_APP_SINK (sink));
+
+ fail_unless (sample != NULL);
+ buffer = gst_sample_get_buffer (sample);
+ fail_unless (buffer != NULL);
+ gst_sample_unref (sample);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ }
+
+ g_object_set (enc, "ascii", TRUE, NULL);
+ }
+
+ gst_object_unref (pipeline);
+ gst_object_unref (sink);
+ gst_object_unref (outcf);
+ gst_object_unref (enc);
+ gst_object_unref (incf);
+
+}
+
+GST_END_TEST;
+
+static Suite *
+pnm_suite (void)
+{
+ Suite *s = suite_create ("pnm");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_pnm_enc_dec);
+
+ return s;
+}
+
+GST_CHECK_MAIN (pnm);
diff --git a/tests/check/elements/rawaudioparse.c b/tests/check/elements/rawaudioparse.c
new file mode 100644
index 0000000..029aab5
--- /dev/null
+++ b/tests/check/elements/rawaudioparse.c
@@ -0,0 +1,395 @@
+/* GStreamer
+ *
+ * unit test for rawaudioparse
+ *
+ * Copyright (C) <2016> Carlos Rafael Giani <dv at pseudoterminal 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.
+ */
+
+/* FIXME: GValueArray is deprecated, but there is currently no viabla alternative
+ * See https://bugzilla.gnome.org/show_bug.cgi?id=667228 */
+#define GLIB_DISABLE_DEPRECATION_WARNINGS
+
+#include <gst/check/gstcheck.h>
+#include <gst/audio/audio.h>
+
+/* Checks are hardcoded to expect stereo 16-bit data. The sample rate
+ * however varies from the default of 40 kHz in some tests to see the
+ * differences in calculated buffer durations. */
+#define NUM_TEST_SAMPLES 512
+#define NUM_TEST_CHANNELS 2
+#define TEST_SAMPLE_RATE 40000
+#define TEST_SAMPLE_FORMAT GST_AUDIO_FORMAT_S16
+
+/* 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;
+
+typedef struct
+{
+ GstElement *rawaudioparse;
+ GstAdapter *test_data_adapter;
+}
+RawAudParseTestCtx;
+
+/* Sets up a rawaudioparse element and a GstAdapter that contains 512 test
+ * audio samples. The samples a monotonically increasing set from the values
+ * 0 to 511 for the left and 512 to 1023 for the right channel. The result
+ * is a GstAdapter that contains the interleaved 16-bit integer values:
+ * 0,512,1,513,2,514, ... 511,1023 . This set is used in the checks to see
+ * if rawaudioparse's output buffers contain valid data. */
+static void
+setup_rawaudioparse (RawAudParseTestCtx * testctx, gboolean use_sink_caps,
+ gboolean set_properties, GstCaps * incaps, GstFormat format)
+{
+ GstElement *rawaudioparse;
+ GstAdapter *test_data_adapter;
+ GstBuffer *buffer;
+ guint i;
+ guint16 samples[NUM_TEST_SAMPLES * NUM_TEST_CHANNELS];
+
+
+ /* Setup the rawaudioparse element and the pads */
+
+ static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_AUDIO_CAPS_MAKE (GST_AUDIO_FORMATS_ALL))
+ );
+ static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+ rawaudioparse = gst_check_setup_element ("rawaudioparse");
+
+ g_object_set (G_OBJECT (rawaudioparse), "use-sink-caps", use_sink_caps, NULL);
+ if (set_properties)
+ g_object_set (G_OBJECT (rawaudioparse), "sample-rate", TEST_SAMPLE_RATE,
+ "num-channels", NUM_TEST_CHANNELS, "pcm-format", TEST_SAMPLE_FORMAT,
+ NULL);
+
+ fail_unless (gst_element_set_state (rawaudioparse,
+ GST_STATE_PAUSED) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to paused");
+
+ mysrcpad = gst_check_setup_src_pad (rawaudioparse, &srctemplate);
+ mysinkpad = gst_check_setup_sink_pad (rawaudioparse, &sinktemplate);
+
+ gst_pad_set_active (mysrcpad, TRUE);
+ gst_pad_set_active (mysinkpad, TRUE);
+
+ gst_check_setup_events (mysrcpad, rawaudioparse, incaps, format);
+ if (incaps)
+ gst_caps_unref (incaps);
+
+
+ /* Fill the adapter with the interleaved 0..511 and
+ * 512..1023 samples */
+ for (i = 0; i < NUM_TEST_SAMPLES; ++i) {
+ guint c;
+ for (c = 0; c < NUM_TEST_CHANNELS; ++c)
+ samples[i * NUM_TEST_CHANNELS + c] = c * NUM_TEST_SAMPLES + i;
+ }
+
+ test_data_adapter = gst_adapter_new ();
+ buffer = gst_buffer_new_allocate (NULL, sizeof (samples), NULL);
+ gst_buffer_fill (buffer, 0, samples, sizeof (samples));
+ gst_adapter_push (test_data_adapter, buffer);
+
+
+ testctx->rawaudioparse = rawaudioparse;
+ testctx->test_data_adapter = test_data_adapter;
+}
+
+static void
+cleanup_rawaudioparse (RawAudParseTestCtx * testctx)
+{
+ int num_buffers, i;
+
+ gst_pad_set_active (mysrcpad, FALSE);
+ gst_pad_set_active (mysinkpad, FALSE);
+ gst_check_teardown_src_pad (testctx->rawaudioparse);
+ gst_check_teardown_sink_pad (testctx->rawaudioparse);
+ gst_check_teardown_element (testctx->rawaudioparse);
+
+ g_object_unref (G_OBJECT (testctx->test_data_adapter));
+
+ if (buffers != NULL) {
+ num_buffers = g_list_length (buffers);
+ for (i = 0; i < num_buffers; ++i) {
+ GstBuffer *buf = GST_BUFFER (buffers->data);
+ buffers = g_list_remove (buffers, buf);
+ gst_buffer_unref (buf);
+ }
+
+ g_list_free (buffers);
+ buffers = NULL;
+ }
+}
+
+
+static void
+push_data_and_check_output (RawAudParseTestCtx * testctx, gsize num_in_bytes,
+ gsize expected_num_out_bytes, gint64 expected_pts, gint64 expected_dur,
+ guint expected_num_buffers_in_list, guint bpf, guint16 channel0_start,
+ guint16 channel1_start)
+{
+ GstBuffer *inbuf, *outbuf;
+ guint num_buffers;
+
+ /* Simulate upstream input by taking num_in_bytes bytes from the adapter */
+ inbuf = gst_adapter_take_buffer (testctx->test_data_adapter, num_in_bytes);
+ fail_unless (inbuf != NULL);
+
+ /* Push the input data and check that the output buffers list grew as
+ * expected */
+ fail_unless (gst_pad_push (mysrcpad, inbuf) == GST_FLOW_OK);
+ num_buffers = g_list_length (buffers);
+ fail_unless_equals_int (num_buffers, expected_num_buffers_in_list);
+
+ /* Take the latest output buffer */
+ outbuf = g_list_nth_data (buffers, num_buffers - 1);
+ fail_unless (outbuf != NULL);
+
+ /* Verify size, PTS, duration of the output buffer */
+ fail_unless_equals_uint64 (expected_num_out_bytes,
+ gst_buffer_get_size (outbuf));
+ fail_unless_equals_uint64 (expected_pts, GST_BUFFER_PTS (outbuf));
+ fail_unless_equals_uint64 (expected_dur, GST_BUFFER_DURATION (outbuf));
+
+ /* Go through all of the samples in the output buffer and check that they are
+ * valid. The samples are interleaved. The offsets specified by channel0_start
+ * and channel1_start are the expected values of the first sample for each
+ * channel in the buffer. So, if channel0_start is 512, then sample #0 in the
+ * buffer must have value 512, and if channel1_start is 700, then sample #1
+ * in the buffer must have value 700 etc. */
+ {
+ guint i, num_frames;
+ guint16 *s;
+ GstMapInfo map_info;
+ guint channel_starts[2] = { channel0_start, channel1_start };
+
+ gst_buffer_map (outbuf, &map_info, GST_MAP_READ);
+ num_frames = map_info.size / bpf;
+ s = (guint16 *) (map_info.data);
+
+ for (i = 0; i < num_frames; ++i) {
+ guint c;
+
+ for (c = 0; i < NUM_TEST_CHANNELS; ++i) {
+ guint16 expected = channel_starts[c] + i;
+ guint16 actual = s[i * NUM_TEST_CHANNELS + c];
+
+ fail_unless_equals_int (expected, actual);
+ }
+ }
+
+ gst_buffer_unmap (outbuf, &map_info);
+ }
+}
+
+
+GST_START_TEST (test_push_unaligned_data_properties_config)
+{
+ RawAudParseTestCtx testctx;
+
+ setup_rawaudioparse (&testctx, FALSE, TRUE, NULL, GST_FORMAT_BYTES);
+
+ /* Send in data buffers that are not aligned to multiples of the
+ * frame size (= sample size * num_channels). This tests if rawaudioparse
+ * aligns output data properly.
+ *
+ * The second line sends in 99 bytes, and expects 100 bytes in the
+ * output buffer. This is because the first buffer contains 45 bytes,
+ * and rawaudioparse is expected to output 44 bytes (which is an integer
+ * multiple of the frame size). The leftover 1 byte then gets prepended
+ * to the input buffer with 99 bytes, resulting in 100 bytes, which is
+ * an integer multiple of the frame size.
+ */
+
+ push_data_and_check_output (&testctx, 45, 44, GST_USECOND * 0,
+ GST_USECOND * 275, 1, 4, 0, 512);
+ push_data_and_check_output (&testctx, 99, 100, GST_USECOND * 275,
+ GST_USECOND * 625, 2, 4, 11, 523);
+ push_data_and_check_output (&testctx, 18, 16, GST_USECOND * 900,
+ GST_USECOND * 100, 3, 4, 36, 548);
+
+ cleanup_rawaudioparse (&testctx);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_push_unaligned_data_sink_caps_config)
+{
+ RawAudParseTestCtx testctx;
+ GstAudioInfo ainfo;
+ GstCaps *caps;
+
+ /* This test is essentially the same as test_push_unaligned_data_properties_config,
+ * except that rawaudioparse uses the sink caps config instead of the property config. */
+
+ gst_audio_info_set_format (&ainfo, TEST_SAMPLE_FORMAT, TEST_SAMPLE_RATE,
+ NUM_TEST_CHANNELS, NULL);
+ caps = gst_audio_info_to_caps (&ainfo);
+
+ setup_rawaudioparse (&testctx, TRUE, FALSE, caps, GST_FORMAT_BYTES);
+
+ push_data_and_check_output (&testctx, 45, 44, GST_USECOND * 0,
+ GST_USECOND * 275, 1, 4, 0, 512);
+ push_data_and_check_output (&testctx, 99, 100, GST_USECOND * 275,
+ GST_USECOND * 625, 2, 4, 11, 523);
+ push_data_and_check_output (&testctx, 18, 16, GST_USECOND * 900,
+ GST_USECOND * 100, 3, 4, 36, 548);
+
+ cleanup_rawaudioparse (&testctx);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_push_swapped_channels)
+{
+ RawAudParseTestCtx testctx;
+ GValueArray *valarray;
+ GValue val = G_VALUE_INIT;
+
+ /* Send in 40 bytes and use a nonstandard channel order (left and right channels
+ * swapped). Expected behavior is for rawaudioparse to reorder the samples inside
+ * output buffers to conform to the GStreamer channel order. For this reason,
+ * channel0 offset is 512 and channel1 offset is 0 in the check below. */
+
+ setup_rawaudioparse (&testctx, FALSE, TRUE, NULL, GST_FORMAT_BYTES);
+
+ valarray = g_value_array_new (2);
+ g_value_init (&val, GST_TYPE_AUDIO_CHANNEL_POSITION);
+ g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT);
+ g_value_array_insert (valarray, 0, &val);
+ g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT);
+ g_value_array_insert (valarray, 1, &val);
+ g_object_set (G_OBJECT (testctx.rawaudioparse), "channel-positions",
+ valarray, NULL);
+ g_value_array_free (valarray);
+ g_value_unset (&val);
+
+ push_data_and_check_output (&testctx, 40, 40, GST_USECOND * 0,
+ GST_USECOND * 250, 1, 4, 512, 0);
+
+ cleanup_rawaudioparse (&testctx);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_config_switch)
+{
+ RawAudParseTestCtx testctx;
+ GstAudioInfo ainfo;
+ GstCaps *caps;
+
+ /* Start processing with the properties config active, then mid-stream switch to
+ * the sink caps config. The properties config is altered to have a different
+ * sample rate than the sink caps to be able to detect the switch. The net effect
+ * is that output buffer durations are altered. For example, 40 bytes equal
+ * 10 samples, and this equals 500 us with 20 kHz or 250 us with 40 kHz. */
+
+ gst_audio_info_set_format (&ainfo, TEST_SAMPLE_FORMAT, TEST_SAMPLE_RATE,
+ NUM_TEST_CHANNELS, NULL);
+ caps = gst_audio_info_to_caps (&ainfo);
+
+ setup_rawaudioparse (&testctx, FALSE, TRUE, caps, GST_FORMAT_BYTES);
+
+ g_object_set (G_OBJECT (testctx.rawaudioparse), "sample-rate", 20000, NULL);
+
+ /* Push in data with properties config active, expecting duration calculations
+ * to be based on the 20 kHz sample rate */
+ push_data_and_check_output (&testctx, 40, 40, GST_USECOND * 0,
+ GST_USECOND * 500, 1, 4, 0, 512);
+ push_data_and_check_output (&testctx, 20, 20, GST_USECOND * 500,
+ GST_USECOND * 250, 2, 4, 10, 522);
+
+ /* Perform the switch */
+ g_object_set (G_OBJECT (testctx.rawaudioparse), "use-sink-caps", TRUE, NULL);
+
+ /* Push in data with sink caps config active, expecting duration calculations
+ * to be based on the 40 kHz sample rate */
+ push_data_and_check_output (&testctx, 40, 40, GST_USECOND * 750,
+ GST_USECOND * 250, 3, 4, 15, 527);
+
+ cleanup_rawaudioparse (&testctx);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_change_caps)
+{
+ RawAudParseTestCtx testctx;
+ GstAudioInfo ainfo;
+ GstCaps *caps;
+
+ /* Start processing with the sink caps config active, using the
+ * default channel count and sample format and 20 kHz sample rate
+ * for the caps. Push some data, then change caps (20 kHz -> 40 kHz).
+ * Check that the changed caps are handled properly. */
+
+ gst_audio_info_set_format (&ainfo, TEST_SAMPLE_FORMAT, 20000,
+ NUM_TEST_CHANNELS, NULL);
+ caps = gst_audio_info_to_caps (&ainfo);
+
+ setup_rawaudioparse (&testctx, TRUE, FALSE, caps, GST_FORMAT_BYTES);
+
+ /* Push in data with caps sink config active, expecting duration calculations
+ * to be based on the 20 kHz sample rate */
+ push_data_and_check_output (&testctx, 40, 40, GST_USECOND * 0,
+ GST_USECOND * 500, 1, 4, 0, 512);
+ push_data_and_check_output (&testctx, 20, 20, GST_USECOND * 500,
+ GST_USECOND * 250, 2, 4, 10, 522);
+
+ /* Change caps */
+ gst_audio_info_set_format (&ainfo, TEST_SAMPLE_FORMAT, 40000,
+ NUM_TEST_CHANNELS, NULL);
+ caps = gst_audio_info_to_caps (&ainfo);
+ fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_caps (caps)));
+ gst_caps_unref (caps);
+
+ /* Push in data with the new caps, expecting duration calculations
+ * to be based on the 40 kHz sample rate */
+ push_data_and_check_output (&testctx, 40, 40, GST_USECOND * 750,
+ GST_USECOND * 250, 3, 4, 15, 527);
+
+ cleanup_rawaudioparse (&testctx);
+}
+
+GST_END_TEST;
+
+
+static Suite *
+rawaudioparse_suite (void)
+{
+ Suite *s = suite_create ("rawaudioparse");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_push_unaligned_data_properties_config);
+ tcase_add_test (tc_chain, test_push_unaligned_data_sink_caps_config);
+ tcase_add_test (tc_chain, test_push_swapped_channels);
+ tcase_add_test (tc_chain, test_config_switch);
+ tcase_add_test (tc_chain, test_change_caps);
+
+ return s;
+}
+
+GST_CHECK_MAIN (rawaudioparse);
diff --git a/tests/check/elements/rawvideoparse.c b/tests/check/elements/rawvideoparse.c
new file mode 100644
index 0000000..477e767
--- /dev/null
+++ b/tests/check/elements/rawvideoparse.c
@@ -0,0 +1,628 @@
+/* GStreamer
+ *
+ * unit test for rawvideoparse
+ *
+ * Copyright (C) <2016> Carlos Rafael Giani <dv at pseudoterminal 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.
+ */
+
+/* FIXME: GValueArray is deprecated, but there is currently no viabla alternative
+ * See https://bugzilla.gnome.org/show_bug.cgi?id=667228 */
+#define GLIB_DISABLE_DEPRECATION_WARNINGS
+
+#include <gst/check/gstcheck.h>
+#include <gst/video/video.h>
+
+/* The checks use as test data an 8x8 Y444 image, with 25 Hz framerate. In the
+ * sink caps configuration, the stride is 8 bytes, and the frames are tightly
+ * packed together. In the properties configuration, the stride is 10 bytes, the
+ * planes aren't tightly packed (there are 20 bytes between the planes), and the
+ * frames overall have padding between them (the overall frame size is
+ * stride (10) * height (8) * num-planes (3) + bytes-between-planes (20) * 2
+ * = 280 bytes, and the frame stride is 500 bytes, so there are 220 bytes of
+ * extra padding between frames).
+ *
+ * In the test 8x8 frame, the pixels are all set to #000000, except for two
+ * pixels: (xofs+1 yofs+0) is set to #8899AA, (xofs+0 yofs+1) is set to #112233.
+ * The first frame uses the offsets xofs=0 yofs=0. The second frame uses
+ * xofs=1 yofs=0 etc. For each configuration, there is a separate set of frames,
+ * each stored in the GstAdapter in the Context struct.
+ *
+ * During the tests, as part of the checks, the pixels are verified to have the
+ * right values. The pattern of the pixels was chosen to easily detect stride
+ * errors, incorrect plane offsets etc.
+ */
+
+#define TEST_WIDTH 8
+#define TEST_HEIGHT 8
+#define TEST_FRAMERATE_N 25
+#define TEST_FRAMERATE_D 1
+#define TEST_FRAME_FORMAT GST_VIDEO_FORMAT_Y444
+#define NUM_TEST_PLANES 3
+
+#define PROP_CTX_PLANE_STRIDE 10
+#define PROP_CTX_FRAME_STRIDE 500
+#define PROP_CTX_PLANE_PADDING 20
+#define PROP_CTX_PLANE_SIZE (PROP_CTX_PLANE_STRIDE * TEST_HEIGHT + PROP_CTX_PLANE_PADDING)
+
+GstElement *rawvideoparse;
+
+/* 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;
+
+typedef struct
+{
+ GstAdapter *data;
+ guint plane_stride;
+ guint plane_size;
+}
+Context;
+
+static Context properties_ctx, sinkcaps_ctx;
+
+static void
+set_pixel (Context const *ctx, guint8 * pixels, guint x, guint y, guint32 color)
+{
+ guint i;
+ guint ofs = y * ctx->plane_stride + x;
+ for (i = 0; i < NUM_TEST_PLANES; ++i)
+ pixels[ctx->plane_size * i + ofs] =
+ (color >> ((NUM_TEST_PLANES - 1 - i) * 8)) & 0xFF;
+}
+
+static guint32
+get_pixel (Context const *ctx, const guint8 * pixels, guint x, guint y)
+{
+ guint i;
+ guint ofs = y * ctx->plane_stride + x;
+ guint32 color = 0;
+ for (i = 0; i < NUM_TEST_PLANES; ++i)
+ color |=
+ ((guint32) (pixels[ctx->plane_size * i + ofs])) << ((NUM_TEST_PLANES -
+ 1 - i) * 8);
+ return color;
+}
+
+static void
+fill_test_pattern (Context const *ctx, GstBuffer * buffer, guint xofs,
+ guint yofs)
+{
+ guint8 *pixels;
+ GstMapInfo map_info;
+
+ gst_buffer_map (buffer, &map_info, GST_MAP_WRITE);
+ pixels = map_info.data;
+
+ memset (pixels, 0, ctx->plane_size * NUM_TEST_PLANES);
+ set_pixel (ctx, pixels, 1 + xofs, 0 + yofs, 0x8899AA);
+ set_pixel (ctx, pixels, 0 + xofs, 1 + yofs, 0x112233);
+
+ gst_buffer_unmap (buffer, &map_info);
+}
+
+static void
+check_test_pattern (Context const *ctx, GstBuffer * buffer, guint xofs,
+ guint yofs)
+{
+ guint x, y;
+ guint8 *pixels;
+ GstMapInfo map_info;
+
+ gst_buffer_map (buffer, &map_info, GST_MAP_READ);
+ pixels = map_info.data;
+
+ fail_unless_equals_uint64_hex (get_pixel (ctx, pixels, 1 + xofs, 0 + yofs),
+ 0x8899AA);
+ fail_unless_equals_uint64_hex (get_pixel (ctx, pixels, 0 + xofs, 1 + yofs),
+ 0x112233);
+
+ for (y = 0; y < TEST_HEIGHT; ++y) {
+ for (x = 0; x < TEST_WIDTH; ++x) {
+ if ((x == (1 + xofs) && y == (0 + yofs)) || (x == (0 + xofs)
+ && y == (1 + yofs)))
+ continue;
+
+ fail_unless_equals_uint64_hex (get_pixel (ctx, pixels, x, y), 0x000000);
+ }
+ }
+
+ gst_buffer_unmap (buffer, &map_info);
+}
+
+
+static void
+setup_rawvideoparse (gboolean use_sink_caps,
+ gboolean set_properties, GstCaps * incaps, GstFormat format)
+{
+ guint i;
+
+
+ /* Setup the rawvideoparse element and the pads */
+
+ static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (GST_VIDEO_FORMATS_ALL))
+ );
+ static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+ rawvideoparse = gst_check_setup_element ("rawvideoparse");
+
+ properties_ctx.plane_stride = PROP_CTX_PLANE_STRIDE;
+ properties_ctx.plane_size = PROP_CTX_PLANE_SIZE;
+ properties_ctx.data = gst_adapter_new ();
+
+ sinkcaps_ctx.plane_stride = TEST_WIDTH;
+ sinkcaps_ctx.plane_size = TEST_WIDTH * TEST_HEIGHT;
+ sinkcaps_ctx.data = gst_adapter_new ();
+
+ g_object_set (G_OBJECT (rawvideoparse), "use-sink-caps", use_sink_caps, NULL);
+ if (set_properties) {
+ GValueArray *plane_offsets, *plane_strides;
+ GValue val = G_VALUE_INIT;
+
+ g_value_init (&val, G_TYPE_UINT);
+
+ plane_offsets = g_value_array_new (NUM_TEST_PLANES);
+ for (i = 0; i < NUM_TEST_PLANES; ++i) {
+ g_value_set_uint (&val, properties_ctx.plane_size * i);
+ g_value_array_insert (plane_offsets, i, &val);
+ }
+
+ plane_strides = g_value_array_new (NUM_TEST_PLANES);
+ for (i = 0; i < NUM_TEST_PLANES; ++i) {
+ g_value_set_uint (&val, properties_ctx.plane_stride);
+ g_value_array_insert (plane_strides, i, &val);
+ }
+
+ g_value_unset (&val);
+
+ g_object_set (G_OBJECT (rawvideoparse), "width", TEST_WIDTH, "height",
+ TEST_HEIGHT, "frame-stride", PROP_CTX_FRAME_STRIDE, "framerate",
+ TEST_FRAMERATE_N, TEST_FRAMERATE_D, "plane-offsets", plane_offsets,
+ "plane-strides", plane_strides, "format", TEST_FRAME_FORMAT, NULL);
+
+ g_value_array_free (plane_offsets);
+ g_value_array_free (plane_strides);
+ }
+
+ /* Check that the plane stride/offset values are correct */
+ {
+ GValueArray *plane_offsets_array;
+ GValueArray *plane_strides_array;
+ /* By default, 320x240 i420 is used as format */
+ guint plane_offsets[3] = { 0, 76800, 96000 };
+ guint plane_strides[3] = { 320, 160, 160 };
+
+ if (set_properties) {
+ /* When properties are explicitely set, we use Y444 as video format,
+ * so in that case, plane stride values are all the same */
+ plane_offsets[0] = properties_ctx.plane_size * 0;
+ plane_offsets[1] = properties_ctx.plane_size * 1;
+ plane_offsets[2] = properties_ctx.plane_size * 2;
+ plane_strides[0] = plane_strides[1] = plane_strides[2] =
+ properties_ctx.plane_stride;
+ }
+
+ g_object_get (G_OBJECT (rawvideoparse), "plane-offsets",
+ &plane_offsets_array, "plane-strides", &plane_strides_array, NULL);
+ fail_unless (plane_offsets_array != NULL);
+ fail_unless (plane_strides_array != NULL);
+ fail_unless (plane_offsets_array->n_values ==
+ plane_strides_array->n_values);
+
+ for (i = 0; i < plane_offsets_array->n_values; ++i) {
+ GValue *gvalue;
+
+ gvalue = g_value_array_get_nth (plane_offsets_array, i);
+ fail_unless (gvalue != NULL);
+ fail_unless_equals_uint64 (plane_offsets[i], g_value_get_uint (gvalue));
+
+ gvalue = g_value_array_get_nth (plane_strides_array, i);
+ fail_unless (gvalue != NULL);
+ fail_unless_equals_uint64 (plane_strides[i], g_value_get_uint (gvalue));
+ }
+
+ g_value_array_free (plane_offsets_array);
+ g_value_array_free (plane_strides_array);
+ }
+
+ fail_unless (gst_element_set_state (rawvideoparse,
+ GST_STATE_PAUSED) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to paused");
+
+ mysrcpad = gst_check_setup_src_pad (rawvideoparse, &srctemplate);
+ mysinkpad = gst_check_setup_sink_pad (rawvideoparse, &sinktemplate);
+
+ gst_pad_set_active (mysrcpad, TRUE);
+ gst_pad_set_active (mysinkpad, TRUE);
+
+ gst_check_setup_events (mysrcpad, rawvideoparse, incaps, format);
+ if (incaps)
+ gst_caps_unref (incaps);
+
+
+ /* Fill the adapters with test frames */
+
+ for (i = 0; i < 10; ++i) {
+ GstBuffer *buffer =
+ gst_buffer_new_allocate (NULL, PROP_CTX_FRAME_STRIDE, NULL);
+ gst_buffer_memset (buffer, 0, 0xCC, gst_buffer_get_size (buffer));
+ fill_test_pattern (&properties_ctx, buffer, i, 0);
+ gst_adapter_push (properties_ctx.data, buffer);
+ }
+
+ for (i = 0; i < 10; ++i) {
+ GstBuffer *buffer =
+ gst_buffer_new_allocate (NULL, sinkcaps_ctx.plane_size * 3, NULL);
+ gst_buffer_memset (buffer, 0, 0xCC, gst_buffer_get_size (buffer));
+ fill_test_pattern (&sinkcaps_ctx, buffer, i, 0);
+ gst_adapter_push (sinkcaps_ctx.data, buffer);
+ }
+}
+
+static void
+cleanup_rawvideoparse (void)
+{
+ int num_buffers, i;
+
+ gst_pad_set_active (mysrcpad, FALSE);
+ gst_pad_set_active (mysinkpad, FALSE);
+ gst_check_teardown_src_pad (rawvideoparse);
+ gst_check_teardown_sink_pad (rawvideoparse);
+ gst_check_teardown_element (rawvideoparse);
+
+ g_object_unref (G_OBJECT (properties_ctx.data));
+ g_object_unref (G_OBJECT (sinkcaps_ctx.data));
+
+ if (buffers != NULL) {
+ num_buffers = g_list_length (buffers);
+ for (i = 0; i < num_buffers; ++i) {
+ GstBuffer *buf = GST_BUFFER (buffers->data);
+ buffers = g_list_remove (buffers, buf);
+ gst_buffer_unref (buf);
+ }
+
+ g_list_free (buffers);
+ buffers = NULL;
+ }
+}
+
+static void
+push_data_and_check_output (Context * ctx, gsize num_in_bytes,
+ gsize expected_num_out_bytes, gint64 expected_pts, gint64 expected_dur,
+ guint expected_num_buffers_in_list, guint buf_idx, guint xofs, guint yofs)
+{
+ GstBuffer *inbuf, *outbuf;
+ guint num_buffers;
+
+ /* Simulate upstream input by taking num_in_bytes bytes from the adapter */
+ inbuf = gst_adapter_take_buffer (ctx->data, num_in_bytes);
+ fail_unless (inbuf != NULL);
+
+ /* Push the input data and check that the output buffers list grew as
+ * expected */
+ fail_unless (gst_pad_push (mysrcpad, inbuf) == GST_FLOW_OK);
+ num_buffers = g_list_length (buffers);
+ fail_unless_equals_int (num_buffers, expected_num_buffers_in_list);
+
+ /* Take the output buffer */
+ outbuf = g_list_nth_data (buffers, buf_idx);
+ fail_unless (outbuf != NULL);
+
+ /* Verify size, PTS, duration of the output buffer */
+ fail_unless_equals_uint64 (expected_num_out_bytes,
+ gst_buffer_get_size (outbuf));
+ fail_unless_equals_uint64 (expected_pts, GST_BUFFER_PTS (outbuf));
+ fail_unless_equals_uint64 (expected_dur, GST_BUFFER_DURATION (outbuf));
+
+ /* Check that the pixels have the correct values */
+ check_test_pattern (ctx, outbuf, xofs, yofs);
+}
+
+
+GST_START_TEST (test_push_unaligned_data_properties_config)
+{
+ setup_rawvideoparse (FALSE, TRUE, NULL, GST_FORMAT_BYTES);
+
+ /* Send in data buffers that are not aligned to multiples of the
+ * frame size (= sample size * num_channels). This tests if rawvideoparse
+ * aligns output data properly.
+ *
+ * The second line sends a buffer with multiple frames inside.
+ * rawvideoparse will then parse this buffer repeatedly (and prepend
+ * leftover data from the earlier parse iteration), explaining why
+ * all of a sudden there are 4 output buffers, compared to just one
+ * earlier. The output data is expected to be 280 bytes large, since this
+ * is the size of the actual frame, without extra padding at the end.
+ */
+ push_data_and_check_output (&properties_ctx, 511, 280, GST_MSECOND * 0,
+ GST_MSECOND * 40, 1, 0, 0, 0);
+ push_data_and_check_output (&properties_ctx, 1940, 280, GST_MSECOND * 40,
+ GST_MSECOND * 40, 4, 1, 1, 0);
+ push_data_and_check_output (&properties_ctx, 10, 280, GST_MSECOND * 80,
+ GST_MSECOND * 40, 4, 2, 2, 0);
+
+ cleanup_rawvideoparse ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_push_unaligned_data_sink_caps_config)
+{
+ GstVideoInfo vinfo;
+ GstCaps *caps;
+
+ /* This test is essentially the same as test_push_unaligned_data_properties_config,
+ * except that rawvideoparse uses the sink caps config instead of the property config.
+ * Also, the input sizes are different, since the sink caps config does not use extra
+ * padding between planes and does use a stride that directly corresponds to the width,
+ * resulting in smaller frame size (192 bytes vs 280 bytes). */
+
+ gst_video_info_set_format (&vinfo, TEST_FRAME_FORMAT, TEST_WIDTH,
+ TEST_HEIGHT);
+ GST_VIDEO_INFO_FPS_N (&vinfo) = 25;
+ GST_VIDEO_INFO_FPS_D (&vinfo) = 1;
+ caps = gst_video_info_to_caps (&vinfo);
+
+ setup_rawvideoparse (TRUE, FALSE, caps, GST_FORMAT_BYTES);
+
+ push_data_and_check_output (&sinkcaps_ctx, 250, 192, GST_MSECOND * 0,
+ GST_MSECOND * 40, 1, 0, 0, 0);
+ push_data_and_check_output (&sinkcaps_ctx, 811, 192, GST_MSECOND * 40,
+ GST_MSECOND * 40, 5, 1, 1, 0);
+ push_data_and_check_output (&sinkcaps_ctx, 10, 192, GST_MSECOND * 80,
+ GST_MSECOND * 40, 5, 2, 2, 0);
+
+ cleanup_rawvideoparse ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_config_switch)
+{
+ GstVideoInfo vinfo;
+ GstCaps *caps;
+
+ /* Start processing with the properties config active, then mid-stream switch to
+ * the sink caps config. Since the sink caps config does not use padding, its
+ * frame size is smaller. The buffer duration stays the same (since it only depends
+ * on the framerate), but the expected output buffer size is different). */
+
+ gst_video_info_set_format (&vinfo, TEST_FRAME_FORMAT, TEST_WIDTH,
+ TEST_HEIGHT);
+ GST_VIDEO_INFO_FPS_N (&vinfo) = 25;
+ GST_VIDEO_INFO_FPS_D (&vinfo) = 1;
+ caps = gst_video_info_to_caps (&vinfo);
+
+ setup_rawvideoparse (FALSE, TRUE, caps, GST_FORMAT_BYTES);
+
+ /* Push in data with properties config active */
+ push_data_and_check_output (&properties_ctx, 500, 280, GST_MSECOND * 0,
+ GST_MSECOND * 40, 1, 0, 0, 0);
+ push_data_and_check_output (&properties_ctx, 500, 280, GST_MSECOND * 40,
+ GST_MSECOND * 40, 2, 1, 1, 0);
+
+ /* Perform the switch */
+ g_object_set (G_OBJECT (rawvideoparse), "use-sink-caps", TRUE, NULL);
+
+ /* Push in data with sink caps config active, expecting a different frame size */
+ push_data_and_check_output (&sinkcaps_ctx, 192, 192, GST_MSECOND * 80,
+ GST_MSECOND * 40, 3, 2, 0, 0);
+
+ cleanup_rawvideoparse ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_push_with_no_framerate)
+{
+ /* Test the special case when no framerate is set. The parser is expected to
+ * still work then, but without setting duration or PTS/DTS (it cannot do that,
+ * because these require a nonzero framerate). The output buffers have PTS 0,
+ * all subsequent ones have no set PTS. */
+
+ setup_rawvideoparse (FALSE, TRUE, NULL, GST_FORMAT_BYTES);
+ g_object_set (G_OBJECT (rawvideoparse), "framerate", 0, 1, NULL);
+
+ push_data_and_check_output (&properties_ctx, 500, 280, 0, GST_CLOCK_TIME_NONE,
+ 1, 0, 0, 0);
+ push_data_and_check_output (&properties_ctx, 500, 280, GST_CLOCK_TIME_NONE,
+ GST_CLOCK_TIME_NONE, 2, 1, 1, 0);
+
+ cleanup_rawvideoparse ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_computed_plane_strides)
+{
+ /* Test how plane strides & offsets are (re)computed if custom offsets/strides
+ * are disabled, and how they are preserved if they are enabled. */
+
+ GValueArray *plane_offsets_array;
+ GValueArray *plane_strides_array;
+ guint i;
+ guint const expected_comp_psize = TEST_WIDTH * TEST_HEIGHT;
+
+ setup_rawvideoparse (FALSE, TRUE, NULL, GST_FORMAT_BYTES);
+
+
+ /* The setup set a custom set of plane offsets and strides together with
+ * width=TEST_WIDTH and height=TEST_HEIGHT. Check that the offsets & strides
+ * are preserved even after setting new, different width & height values. */
+
+ g_object_set (G_OBJECT (rawvideoparse), "width", TEST_WIDTH * 2,
+ "height", TEST_HEIGHT * 2, NULL);
+
+ g_object_get (G_OBJECT (rawvideoparse), "plane-offsets",
+ &plane_offsets_array, "plane-strides", &plane_strides_array, NULL);
+
+ for (i = 0; i < plane_offsets_array->n_values; ++i) {
+ GValue *gvalue;
+
+ /* See setup_rawvideoparse() for how the offsets & strides are defined
+ * there. Offsets are set to plane_size*plane_index, and strides are
+ * set to the properties_ctx.plane_stride value. */
+
+ gvalue = g_value_array_get_nth (plane_offsets_array, i);
+ fail_unless (gvalue != NULL);
+ fail_unless_equals_uint64 (properties_ctx.plane_size * i,
+ g_value_get_uint (gvalue));
+
+ gvalue = g_value_array_get_nth (plane_strides_array, i);
+ fail_unless (gvalue != NULL);
+ fail_unless_equals_uint64 (properties_ctx.plane_stride,
+ g_value_get_uint (gvalue));
+ }
+
+ g_value_array_free (plane_offsets_array);
+ g_value_array_free (plane_strides_array);
+
+
+ /* Discard the custom planes&offsets, re-enabling computed values. */
+ g_object_set (G_OBJECT (rawvideoparse), "plane-offsets", (GValueArray *) NULL,
+ "plane-strides", (GValueArray *) NULL, NULL);
+
+
+ /* The strides & offsets should have been recomputed by now. Since the Y444
+ * format is used, all strides are the same, and should equal the frame width
+ * (which was set to TEST_WIDTH*2 earlier). Plane offsets should be
+ * plane_size*plane_index, with plane_size set to (TEST_WIDTH*2 * TEST_HEIGHT*2),
+ * or TEST_WIDTH*TEST_HEIGHT*4 (-> expected_comp_psize*4). */
+
+ g_object_get (G_OBJECT (rawvideoparse), "plane-offsets",
+ &plane_offsets_array, "plane-strides", &plane_strides_array, NULL);
+
+ for (i = 0; i < plane_offsets_array->n_values; ++i) {
+ GValue *gvalue;
+
+ gvalue = g_value_array_get_nth (plane_offsets_array, i);
+ fail_unless (gvalue != NULL);
+ fail_unless_equals_uint64 (expected_comp_psize * 4 * i,
+ g_value_get_uint (gvalue));
+
+ gvalue = g_value_array_get_nth (plane_strides_array, i);
+ fail_unless (gvalue != NULL);
+ fail_unless_equals_uint64 (TEST_WIDTH * 2, g_value_get_uint (gvalue));
+ }
+
+ g_value_array_free (plane_offsets_array);
+ g_value_array_free (plane_strides_array);
+
+
+ /* Again change the width & height values. width=TEST_WIDTH, height=TEST_HEIGHT.
+ * However, this time, offsets&strides are computed; the current values should
+ * not be preserved. Expected plane stride and offset values are similar to
+ * above, expect that no multiplications by 2 are present (since the TEST_WIDTH
+ * and TEST_HEIGHT values were passed without multiplying them). */
+
+ g_object_set (G_OBJECT (rawvideoparse), "width", TEST_WIDTH,
+ "height", TEST_HEIGHT, NULL);
+
+
+ g_object_get (G_OBJECT (rawvideoparse), "plane-offsets",
+ &plane_offsets_array, "plane-strides", &plane_strides_array, NULL);
+
+ for (i = 0; i < plane_offsets_array->n_values; ++i) {
+ GValue *gvalue;
+
+ gvalue = g_value_array_get_nth (plane_offsets_array, i);
+ fail_unless (gvalue != NULL);
+ fail_unless_equals_uint64 (expected_comp_psize * i,
+ g_value_get_uint (gvalue));
+
+ gvalue = g_value_array_get_nth (plane_strides_array, i);
+ fail_unless (gvalue != NULL);
+ fail_unless_equals_uint64 (TEST_WIDTH, g_value_get_uint (gvalue));
+ }
+
+ g_value_array_free (plane_offsets_array);
+ g_value_array_free (plane_strides_array);
+
+
+ cleanup_rawvideoparse ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_change_caps)
+{
+ GstVideoInfo vinfo;
+ GstCaps *caps;
+
+ /* Start processing with the sink caps config active, using the
+ * default width/height/format and 25 Hz frame rate for the caps.
+ * Push some data, then change caps (25 Hz -> 50 Hz).
+ * Check that the changed caps are handled properly. */
+
+ gst_video_info_set_format (&vinfo, TEST_FRAME_FORMAT, TEST_WIDTH,
+ TEST_HEIGHT);
+ GST_VIDEO_INFO_FPS_N (&vinfo) = 25;
+ GST_VIDEO_INFO_FPS_D (&vinfo) = 1;
+ caps = gst_video_info_to_caps (&vinfo);
+
+ setup_rawvideoparse (TRUE, FALSE, caps, GST_FORMAT_BYTES);
+
+ /* Push in data with sink config active, expecting duration calculations
+ * to be based on the 25 Hz frame rate */
+ push_data_and_check_output (&sinkcaps_ctx, 192, 192, GST_MSECOND * 0,
+ GST_MSECOND * 40, 1, 0, 0, 0);
+ push_data_and_check_output (&sinkcaps_ctx, 192, 192, GST_MSECOND * 40,
+ GST_MSECOND * 40, 2, 1, 1, 0);
+
+ /* Change caps */
+ GST_VIDEO_INFO_FPS_N (&vinfo) = 50;
+ GST_VIDEO_INFO_FPS_D (&vinfo) = 1;
+ caps = gst_video_info_to_caps (&vinfo);
+ fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_caps (caps)));
+ gst_caps_unref (caps);
+
+ /* Push in data with sink config active, expecting duration calculations
+ * to be based on the 50 Hz frame rate */
+ push_data_and_check_output (&sinkcaps_ctx, 192, 192, GST_MSECOND * 80,
+ GST_MSECOND * 20, 3, 2, 2, 0);
+
+ cleanup_rawvideoparse ();
+}
+
+GST_END_TEST;
+
+
+static Suite *
+rawvideoparse_suite (void)
+{
+ Suite *s = suite_create ("rawvideoparse");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_push_unaligned_data_properties_config);
+ tcase_add_test (tc_chain, test_push_unaligned_data_sink_caps_config);
+ tcase_add_test (tc_chain, test_config_switch);
+ tcase_add_test (tc_chain, test_push_with_no_framerate);
+ tcase_add_test (tc_chain, test_computed_plane_strides);
+ tcase_add_test (tc_chain, test_change_caps);
+
+ return s;
+}
+
+GST_CHECK_MAIN (rawvideoparse);
diff --git a/tests/check/elements/rtponviftimestamp.c b/tests/check/elements/rtponviftimestamp.c
index 09413a8..f5c6c7c 100644
--- a/tests/check/elements/rtponviftimestamp.c
+++ b/tests/check/elements/rtponviftimestamp.c
@@ -250,7 +250,8 @@
/* 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)
+ gboolean end_contiguous, gboolean discont, guint64 ntp_offset, guint8 cseq,
+ gboolean first_buffer)
{
GstBuffer *buffer_out;
GstRTPBuffer rtpbuffer_out = GST_RTP_BUFFER_INIT;
@@ -273,6 +274,8 @@
ntp_offset));
/* C E D mbz */
+ if (first_buffer)
+ flags |= (1 << 5);
if (clean_point)
flags |= (1 << 7);
if (end_contiguous)
@@ -304,7 +307,7 @@
buffer_in = create_rtp_buffer (TIMESTAMP, clean_point);
buffer_out = create_extension_buffer (buffer_in, clean_point, FALSE, FALSE,
- NTP_OFFSET, CSEQ);
+ NTP_OFFSET, CSEQ, TRUE);
/* push initial events */
gst_check_setup_events (mysrcpad, element, NULL, GST_FORMAT_TIME);
@@ -331,7 +334,7 @@
buffer_in = create_rtp_buffer (TIMESTAMP, FALSE);
buffer_out = create_extension_buffer (buffer_in, FALSE, end_contiguous,
- FALSE, NTP_OFFSET, CSEQ);
+ FALSE, NTP_OFFSET, CSEQ, TRUE);
/* push initial events */
gst_check_setup_events (mysrcpad, element, NULL, GST_FORMAT_TIME);
@@ -367,7 +370,7 @@
/* Last buffer always has the 'E' flag */
buffer_out = create_extension_buffer (buffer_in, FALSE, TRUE, end_contiguous,
- NTP_OFFSET, CSEQ);
+ NTP_OFFSET, CSEQ, FALSE);
node = g_list_last (buffers);
check_buffer_equal ((GstBuffer *) node->data, buffer_out);
gst_buffer_unref (buffer_out);
@@ -546,12 +549,12 @@
/* push an ntp-offset event */
fail_unless (gst_pad_push_event (mysrcpad,
- create_ntp_offset_event (NTP_OFFSET, FALSE)));
+ create_ntp_offset_event (NTP_OFFSET, TRUE)));
/* 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);
+ NTP_OFFSET, 0, TRUE);
fail_unless_equals_int (gst_pad_push (mysrcpad, buffer_in), GST_FLOW_OK);
/* push a new ntp offset */
@@ -561,7 +564,7 @@
/* 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);
+ 2 * NTP_OFFSET, 0, FALSE);
fail_unless_equals_int (gst_pad_push (mysrcpad, buffer_in), GST_FLOW_OK);
/* the first buffer should have been pushed now */
diff --git a/tests/check/elements/templatematch.c b/tests/check/elements/templatematch.c
index 99fc794..3a78d54 100644
--- a/tests/check/elements/templatematch.c
+++ b/tests/check/elements/templatematch.c
@@ -144,6 +144,7 @@
gst_bus_set_flushing (bus, TRUE);
gst_object_unref (bus);
gst_caps_unref (caps);
+ gst_check_drop_buffers ();
gst_pad_set_active (srcpad, FALSE);
gst_pad_set_active (sinkpad, FALSE);
gst_object_unref (srcpad);
diff --git a/tests/check/elements/test_http_src.c b/tests/check/elements/test_http_src.c
index 915bb51..14f2043 100644
--- a/tests/check/elements/test_http_src.c
+++ b/tests/check/elements/test_http_src.c
@@ -192,8 +192,8 @@
"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));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &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);
@@ -314,7 +314,8 @@
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");
+ src->input.request_headers =
+ gst_structure_new_empty (TEST_HTTP_SRC_REQUEST_HEADERS_NAME);
}
if (!gst_structure_has_field_typed (src->input.request_headers,
"User-Agent", G_TYPE_STRING)) {
@@ -334,10 +335,11 @@
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);
+ gst_structure_set (http_headers, TEST_HTTP_SRC_REQUEST_HEADERS_NAME,
+ GST_TYPE_STRUCTURE, src->input.request_headers, NULL);
if (!src->input.response_headers) {
- src->input.response_headers = gst_structure_new_empty ("response-headers");
+ src->input.response_headers =
+ gst_structure_new_empty (TEST_HTTP_SRC_RESPONSE_HEADERS_NAME);
}
if (!gst_structure_has_field_typed (src->input.response_headers,
"Connection", G_TYPE_STRING)) {
@@ -359,8 +361,8 @@
g_free (date_str);
g_date_time_unref (now);
}
- gst_structure_set (http_headers, "response-headers", GST_TYPE_STRUCTURE,
- src->input.response_headers, NULL);
+ gst_structure_set (http_headers, TEST_HTTP_SRC_RESPONSE_HEADERS_NAME,
+ GST_TYPE_STRUCTURE, src->input.response_headers, NULL);
if (src->http_headers_event) {
gst_event_unref (src->http_headers_event);
}
diff --git a/tests/check/elements/test_http_src.h b/tests/check/elements/test_http_src.h
index 61161af..3a83e25 100644
--- a/tests/check/elements/test_http_src.h
+++ b/tests/check/elements/test_http_src.h
@@ -27,6 +27,20 @@
#define GST_TYPE_TEST_HTTP_SRC (gst_test_http_src_get_type ())
+/**
+ * TEST_HTTP_SRC_REQUEST_HEADERS_NAME:
+ * The name of the #GstStructure that will contain all the HTTP request
+ * headers
+ */
+#define TEST_HTTP_SRC_REQUEST_HEADERS_NAME "request-headers"
+
+/**
+ * TEST_HTTP_SRC_RESPONSE_HEADERS_NAME:
+ * The name of the #GstStructure that will contain all the HTTP response
+ * headers
+ */
+#define TEST_HTTP_SRC_RESPONSE_HEADERS_NAME "response-headers"
+
/* structure used by src_start function to configure the
* GstTestHTTPSrc plugin.
* It specifies information about a given URI.
diff --git a/tests/check/elements/uvch264demux.c b/tests/check/elements/uvch264demux.c
index fb8b17f..cf5c26a 100644
--- a/tests/check/elements/uvch264demux.c
+++ b/tests/check/elements/uvch264demux.c
@@ -373,6 +373,7 @@
fail_unless (buffer_h264 == NULL && buffer_jpg != NULL);
fail_unless (buffer_nv12 == NULL && buffer_yuy2 == NULL);
fail_unless (gerror == NULL && error_debug == NULL);
+ gst_buffer_unref (buffer_jpg);
_teardown_test ();
}
@@ -644,6 +645,7 @@
fail_unless (gerror == NULL);
fail_unless (gst_buffer_get_size (buffer_h264) == sizeof (h264_data));
fail_if (gst_buffer_memcmp (buffer_h264, 0, h264_data, sizeof (h264_data)));
+ gst_buffer_unref (buffer_h264);
_teardown_test ();
}
diff --git a/tests/check/libs/aggregator.c b/tests/check/libs/aggregator.c
index 16355b9..5f6ae2e 100644
--- a/tests/check/libs/aggregator.c
+++ b/tests/check/libs/aggregator.c
@@ -152,11 +152,9 @@
GST_STATIC_PAD_TEMPLATE ("sink_%u", GST_PAD_SINK, GST_PAD_REQUEST,
GST_STATIC_CAPS_ANY);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&_src_template));
+ gst_element_class_add_static_pad_template (gstelement_class, &_src_template);
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&_sink_template));
+ gst_element_class_add_static_pad_template (gstelement_class, &_sink_template);
gst_element_class_set_static_metadata (gstelement_class, "Aggregator",
"Testing", "Combine N buffers", "Stefan Sauer <ensonic@users.sf.net>");
@@ -344,6 +342,8 @@
g_atomic_int_inc (&test->flush_stop_events);
}
+ gst_mini_object_unref (info->data);
+
return GST_PAD_PROBE_HANDLED;
}
diff --git a/tests/check/libs/gstglcolorconvert.c b/tests/check/libs/gstglcolorconvert.c
index f2be514..d891c8b 100644
--- a/tests/check/libs/gstglcolorconvert.c
+++ b/tests/check/libs/gstglcolorconvert.c
@@ -141,13 +141,15 @@
/* create GL buffer */
inbuf = gst_buffer_new ();
for (j = 0; j < GST_VIDEO_INFO_N_PLANES (&in_info); j++) {
+ GstVideoGLTextureType tex_type = gst_gl_texture_type_from_format (context,
+ GST_VIDEO_INFO_FORMAT (&in_info), 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);
+ &in_info, j, NULL, GST_GL_TEXTURE_TARGET_2D, tex_type,
+ frames[i].data[j], &ref_count, _frame_unref);
mem = gst_gl_base_memory_alloc (base_mem_alloc,
(GstGLAllocationParams *) params);
diff --git a/tests/check/libs/gstglcontext.c b/tests/check/libs/gstglcontext.c
index f2f27f8..25f3e00 100644
--- a/tests/check/libs/gstglcontext.c
+++ b/tests/check/libs/gstglcontext.c
@@ -42,7 +42,8 @@
gst_object_unref (display);
}
-static GLuint vbo, vbo_indices, vao, fbo_id, rbo, tex;
+static GstGLMemory *gl_tex;
+static GLuint vbo, vbo_indices, vao;
static GstGLFramebuffer *fbo;
static GstGLShader *shader;
static GLint shader_attr_position_loc;
@@ -63,15 +64,27 @@
{
GstGLContext *context = data;
GError *error = NULL;
+ GstVideoInfo v_info;
+ GstGLMemoryAllocator *allocator;
+ GstGLVideoAllocationParams *params;
+
+ gst_video_info_set_format (&v_info, GST_VIDEO_FORMAT_RGBA, 320, 240);
+ allocator = gst_gl_memory_allocator_get_default (context);
+ params =
+ gst_gl_video_allocation_params_new (context, NULL, &v_info, 0, NULL,
+ GST_GL_TEXTURE_TARGET_2D, GST_VIDEO_GL_TEXTURE_TYPE_RGBA);
/* has to be called in the thread that is going to use the framebuffer */
- fbo = gst_gl_framebuffer_new (context);
+ fbo = gst_gl_framebuffer_new_with_default_depth (context, 320, 240);
- gst_gl_framebuffer_generate (fbo, 320, 240, &fbo_id, &rbo);
- fail_if (fbo == NULL || fbo_id == 0, "failed to create framebuffer object");
+ fail_if (fbo == NULL, "failed to create framebuffer object");
- gst_gl_context_gen_texture (context, &tex, GST_VIDEO_FORMAT_RGBA, 320, 240);
- fail_if (tex == 0, "failed to create texture");
+ gl_tex =
+ (GstGLMemory *) gst_gl_base_memory_alloc ((GstGLBaseMemoryAllocator *)
+ allocator, (GstGLAllocationParams *) params);
+ gst_object_unref (allocator);
+ gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
+ fail_if (gl_tex == NULL, "failed to create texture");
shader = gst_gl_shader_new_default (context, &error);
fail_if (shader == NULL, "failed to create shader object: %s",
@@ -88,14 +101,14 @@
{
GstGLContext *context = data;
GstGLFuncs *gl = context->gl_vtable;
- gl->DeleteTextures (1, &tex);
if (vao)
gl->DeleteVertexArrays (1, &vao);
gst_object_unref (fbo);
gst_object_unref (shader);
+ gst_memory_unref (GST_MEMORY_CAST (gl_tex));
}
-static void
+static gboolean
clear_tex (gpointer data)
{
GstGLContext *context = data;
@@ -108,13 +121,15 @@
r = r > 1.0 ? 0.0 : r + 0.03;
g = g > 1.0 ? 0.0 : g + 0.01;
b = b > 1.0 ? 0.0 : b + 0.015;
+
+ return TRUE;
}
static void
draw_tex (gpointer data)
{
- gst_gl_framebuffer_use_v2 (fbo, 320, 240, fbo_id, rbo, tex,
- (GLCB_V2) clear_tex, data);
+ gst_gl_framebuffer_draw_to_texture (fbo, gl_tex,
+ (GstGLFramebufferFunc) clear_tex, data);
}
static void
@@ -210,7 +225,7 @@
gst_gl_shader_use (shader);
gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, tex);
+ gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (gl_tex));
gst_gl_shader_set_uniform_1i (shader, "s_texture", 0);
if (gl->GenVertexArrays)
@@ -261,7 +276,8 @@
gst_gl_window_set_preferred_size (window, 320, 240);
gst_gl_window_draw (window);
- gst_gl_window_send_message (other_window, GST_GL_WINDOW_CB (init), context);
+ gst_gl_window_send_message (other_window, GST_GL_WINDOW_CB (init),
+ other_context);
gst_gl_window_send_message (window, GST_GL_WINDOW_CB (init_blit), context);
while (i < 10) {
@@ -272,7 +288,8 @@
i++;
}
- gst_gl_window_send_message (other_window, GST_GL_WINDOW_CB (deinit), context);
+ gst_gl_window_send_message (other_window, GST_GL_WINDOW_CB (deinit),
+ other_context);
gst_gl_window_send_message (window, GST_GL_WINDOW_CB (deinit_blit), context);
gst_object_unref (window);
@@ -366,7 +383,8 @@
gst_gl_window_set_preferred_size (window, 320, 240);
gst_gl_window_draw (window);
- gst_gl_window_send_message (other_window, GST_GL_WINDOW_CB (init), context);
+ gst_gl_window_send_message (other_window, GST_GL_WINDOW_CB (init),
+ other_context);
gst_gl_window_send_message (window, GST_GL_WINDOW_CB (init_blit), context);
while (i < 10) {
@@ -380,7 +398,8 @@
gst_gl_window_send_message (window, GST_GL_WINDOW_CB (check_wrapped),
wrapped_context);
- gst_gl_window_send_message (other_window, GST_GL_WINDOW_CB (deinit), context);
+ gst_gl_window_send_message (other_window, GST_GL_WINDOW_CB (deinit),
+ other_context);
gst_gl_window_send_message (window, GST_GL_WINDOW_CB (deinit_blit), context);
gst_object_unref (other_context);
diff --git a/tests/check/libs/gstglmemory.c b/tests/check/libs/gstglmemory.c
index 4130e3b..0cdd1dd 100644
--- a/tests/check/libs/gstglmemory.c
+++ b/tests/check/libs/gstglmemory.c
@@ -75,10 +75,12 @@
gst_video_info_set_format (&v_info, formats[i], width, height);
for (j = 0; j < GST_VIDEO_INFO_N_PLANES (&v_info); j++) {
+ GstVideoGLTextureType tex_type = gst_gl_texture_type_from_format (context,
+ GST_VIDEO_INFO_FORMAT (&v_info), j);
GstGLVideoAllocationParams *params;
params = gst_gl_video_allocation_params_new (context, NULL, &v_info, j,
- NULL, GST_GL_TEXTURE_TARGET_2D);
+ NULL, GST_GL_TEXTURE_TARGET_2D, tex_type);
mem = (GstMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
(GstGLAllocationParams *) params);
@@ -100,10 +102,6 @@
&gl_mem->info) == FALSE);
fail_if (gl_mem->mem.context != gl_mem2->mem.context);
- if (gst_gl_context_get_error ())
- 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);
@@ -137,7 +135,7 @@
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);
+ NULL, GST_GL_TEXTURE_TARGET_2D, GST_VIDEO_GL_TEXTURE_TYPE_RGBA);
/* texture creation */
mem = (GstMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
@@ -150,7 +148,8 @@
/* 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);
+ &v_info, 0, NULL, GST_GL_TEXTURE_TARGET_2D,
+ GST_VIDEO_GL_TEXTURE_TYPE_RGBA, rgba_pixel, NULL, NULL);
mem2 =
(GstMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
(GstGLAllocationParams *) params);
@@ -164,8 +163,9 @@
/* wrapped texture creation */
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);
+ &v_info, 0, NULL, GST_GL_TEXTURE_TARGET_2D,
+ GST_VIDEO_GL_TEXTURE_TYPE_RGBA, ((GstGLMemory *) mem)->tex_id, NULL,
+ NULL);
mem3 =
(GstMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
(GstGLAllocationParams *) params);
@@ -268,10 +268,6 @@
fail_unless (GST_MEMORY_FLAG_IS_SET (mem3,
GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
- if (gst_gl_context_get_error ())
- printf ("%s\n", gst_gl_context_get_error ());
- fail_if (gst_gl_context_get_error () != NULL);
-
gst_memory_unref (mem);
gst_memory_unref (mem2);
gst_memory_unref (mem3);
@@ -303,7 +299,8 @@
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);
+ &v_info, 0, NULL, GST_GL_TEXTURE_TARGET_2D,
+ GST_VIDEO_GL_TEXTURE_TYPE_RGBA, rgba_pixel, NULL, NULL);
mem =
(GstMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
(GstGLAllocationParams *) params);
@@ -329,10 +326,6 @@
/* FIXME: add download transfer */
- if (gst_gl_context_get_error ())
- printf ("%s\n", gst_gl_context_get_error ());
- fail_if (gst_gl_context_get_error () != NULL);
-
gst_memory_unref (mem);
gst_object_unref (gl_allocator);
}
diff --git a/tests/check/libs/gstglupload.c b/tests/check/libs/gstglupload.c
index 64d7a33..7c52a85 100644
--- a/tests/check/libs/gstglupload.c
+++ b/tests/check/libs/gstglupload.c
@@ -37,6 +37,16 @@
static GstGLShader *shader;
static GLint shader_attr_position_loc;
static GLint shader_attr_texture_loc;
+static guint vbo, vbo_indices, vao;
+
+static const GLfloat vertices[] = {
+ 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 GLushort indices[] = { 0, 1, 2, 0, 2, 3 };
#define FORMAT GST_VIDEO_GL_TEXTURE_TYPE_RGBA
#define WIDTH 10
@@ -86,11 +96,46 @@
gst_object_unref (window);
gst_object_unref (context);
gst_object_unref (display);
+ if (shader)
+ gst_object_unref (shader);
+}
+
+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 (gpointer data)
{
+ const GstGLFuncs *gl = context->gl_vtable;
GError *error = NULL;
shader = gst_gl_shader_new_default (context, &error);
@@ -99,7 +144,49 @@
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");
+ gst_gl_shader_get_attribute_location (shader, "a_texcoord");
+
+ 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 (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
@@ -108,32 +195,15 @@
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
- };
-
- 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);
+ if (gl->GenVertexArrays)
+ gl->BindVertexArray (vao);
+ else
+ _bind_buffer (context);
gl->ActiveTexture (GL_TEXTURE0);
gl->BindTexture (GL_TEXTURE_2D, tex_id);
@@ -141,6 +211,11 @@
gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);
+ if (gl->GenVertexArrays)
+ gl->BindVertexArray (0);
+ else
+ _unbind_buffer (context);
+
context_class->swap_buffers (context);
}
@@ -163,8 +238,7 @@
0, WIDTH * HEIGHT * 4, NULL, NULL);
res = gst_gl_upload_perform_with_buffer (upload, inbuf, &outbuf);
- fail_if (res == FALSE, "Failed to upload buffer: %s\n",
- gst_gl_context_get_error ());
+ fail_if (res == FALSE, "Failed to upload buffer");
fail_unless (GST_IS_BUFFER (outbuf));
res = gst_buffer_map (outbuf, &map_info, GST_MAP_READ | GST_MAP_GL);
@@ -184,6 +258,7 @@
context);
i++;
}
+ gst_gl_window_send_message (window, GST_GL_WINDOW_CB (deinit), context);
gst_caps_unref (in_caps);
gst_caps_unref (out_caps);
@@ -193,13 +268,14 @@
GST_END_TEST;
-GST_START_TEST (test_upload_buffer)
+GST_START_TEST (test_upload_gl_memory)
{
GstGLBaseMemoryAllocator *base_mem_alloc;
GstGLVideoAllocationParams *params;
GstBuffer *buffer, *outbuf;
GstGLMemory *gl_mem;
GstCaps *in_caps, *out_caps;
+ GstStructure *out_s;
GstVideoInfo in_info;
GstMapInfo map_info;
gint i = 0;
@@ -215,7 +291,8 @@
/* create GL buffer */
buffer = gst_buffer_new ();
params = gst_gl_video_allocation_params_new_wrapped_data (context, NULL,
- &in_info, 0, NULL, GST_GL_TEXTURE_TARGET_2D, rgba_data, NULL, NULL);
+ &in_info, 0, NULL, GST_GL_TEXTURE_TARGET_2D,
+ GST_VIDEO_GL_TEXTURE_TYPE_RGBA, rgba_data, NULL, NULL);
gl_mem = (GstGLMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
(GstGLAllocationParams *) params);
gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
@@ -229,14 +306,53 @@
gst_buffer_append_memory (buffer, (GstMemory *) gl_mem);
+ /* at this point glupload hasn't received any buffers so can output anything */
+ out_caps = gst_gl_upload_transform_caps (upload, context,
+ GST_PAD_SINK, in_caps, NULL);
+ out_s = gst_caps_get_structure (out_caps, 0);
+ fail_unless (gst_structure_has_field_typed (out_s, "texture-target",
+ GST_TYPE_LIST));
+ gst_caps_unref (out_caps);
+
+ /* set some output caps without setting texture-target: this should trigger RECONFIGURE */
out_caps = gst_caps_from_string ("video/x-raw(memory:GLMemory),"
"format=RGBA,width=10,height=10");
+ /* set caps with texture-target not fixed. This should trigger RECONFIGURE. */
gst_gl_upload_set_caps (upload, in_caps, out_caps);
+ gst_caps_unref (out_caps);
+
+ /* push a texture-target=2D buffer */
+ res = gst_gl_upload_perform_with_buffer (upload, buffer, &outbuf);
+ fail_unless (res == GST_GL_UPLOAD_RECONFIGURE);
+ fail_if (outbuf);
+
+ /* now glupload has seen a 2D buffer and so wants to transform to that */
+ out_caps = gst_gl_upload_transform_caps (upload, context,
+ GST_PAD_SINK, in_caps, NULL);
+ out_s = gst_caps_get_structure (out_caps, 0);
+ fail_unless_equals_string (gst_structure_get_string (out_s, "texture-target"),
+ "2D");
+ gst_caps_unref (out_caps);
+
+ /* try setting the wrong type first tho */
+ out_caps = gst_caps_from_string ("video/x-raw(memory:GLMemory),"
+ "format=RGBA,width=10,height=10,texture-target=RECTANGLE");
+ gst_gl_upload_set_caps (upload, in_caps, out_caps);
+ gst_caps_unref (out_caps);
res = gst_gl_upload_perform_with_buffer (upload, buffer, &outbuf);
- fail_if (res == FALSE, "Failed to upload buffer: %s\n",
- gst_gl_context_get_error ());
+ fail_unless (res == GST_GL_UPLOAD_RECONFIGURE);
+ fail_if (outbuf);
+
+ /* finally do set the correct texture-target */
+ out_caps = gst_caps_from_string ("video/x-raw(memory:GLMemory),"
+ "format=RGBA,width=10,height=10,texture-target=2D");
+ gst_gl_upload_set_caps (upload, in_caps, out_caps);
+ gst_caps_unref (out_caps);
+
+ res = gst_gl_upload_perform_with_buffer (upload, buffer, &outbuf);
+ fail_unless (res == GST_GL_UPLOAD_DONE, "Failed to upload buffer");
fail_unless (GST_IS_BUFFER (outbuf));
gst_gl_window_set_preferred_size (window, WIDTH, HEIGHT);
@@ -248,9 +364,9 @@
context);
i++;
}
+ gst_gl_window_send_message (window, GST_GL_WINDOW_CB (deinit), context);
gst_caps_unref (in_caps);
- gst_caps_unref (out_caps);
gst_buffer_unref (buffer);
gst_buffer_unref (outbuf);
gst_object_unref (base_mem_alloc);
@@ -268,7 +384,7 @@
suite_add_tcase (s, tc_chain);
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_gl_memory);
return s;
}
diff --git a/tests/check/libs/player.c b/tests/check/libs/player.c
index 3f2b25f..8c203b9 100644
--- a/tests/check/libs/player.c
+++ b/tests/check/libs/player.c
@@ -100,20 +100,17 @@
{
GstPlayer *player;
guint interval = 0;
+ GstStructure *config;
player = gst_player_new (NULL, NULL);
fail_unless (player != NULL);
- gst_player_set_position_update_interval (player, 500);
- interval = gst_player_get_position_update_interval (player);
-
+ config = gst_player_get_config (player);
+ gst_player_config_set_position_update_interval (config, 500);
+ interval = gst_player_config_get_position_update_interval (config);
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);
+ gst_player_set_config (player, config);
g_object_unref (player);
}
@@ -132,6 +129,7 @@
STATE_CHANGE_VIDEO_DIMENSIONS_CHANGED,
STATE_CHANGE_MEDIA_INFO_UPDATED,
STATE_CHANGE_SEEK_DONE,
+ STATE_CHANGE_URI_LOADED,
} TestPlayerStateChange;
static const gchar *
@@ -158,6 +156,8 @@
return "media-info-updated";
case STATE_CHANGE_SEEK_DONE:
return "seek-done";
+ case STATE_CHANGE_URI_LOADED:
+ return "uri-loaded";
default:
g_assert_not_reached ();
break;
@@ -175,6 +175,8 @@
GstPlayerState state;
gint width, height;
GstPlayerMediaInfo *media_info;
+ gchar *uri_loaded;
+ gboolean stopping;
void (*test_callback) (GstPlayer * player, TestPlayerStateChange change,
TestPlayerState * old_state, TestPlayerState * new_state);
@@ -196,7 +198,8 @@
"\tseek_done %d -> %d\n"
"\tstate %s -> %s\n"
"\twidth/height %d/%d -> %d/%d\n"
- "\tmedia_info %p -> %p",
+ "\tmedia_info %p -> %p\n"
+ "\turi_loaded %s -> %s",
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),
@@ -208,7 +211,8 @@
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);
+ old_state->media_info, new_state->media_info,
+ old_state->uri_loaded, new_state->uri_loaded);
}
static void
@@ -220,6 +224,8 @@
state->state = GST_PLAYER_STATE_STOPPED;
state->width = state->height = 0;
state->media_info = NULL;
+ state->stopping = FALSE;
+ g_clear_pointer (&state->uri_loaded, g_free);
}
static void
@@ -227,6 +233,8 @@
{
TestPlayerState old_state = *state;
+ g_assert (!state->stopping);
+
state->buffering_percent = percent;
test_player_state_change_debug (player, STATE_CHANGE_BUFFERING, &old_state,
state);
@@ -239,6 +247,8 @@
{
TestPlayerState old_state = *state;
+ g_assert (!state->stopping);
+
state->duration = duration;
test_player_state_change_debug (player, STATE_CHANGE_DURATION_CHANGED,
&old_state, state);
@@ -251,6 +261,8 @@
{
TestPlayerState old_state = *state;
+ g_assert (!state->stopping);
+
state->end_of_stream = TRUE;
test_player_state_change_debug (player, STATE_CHANGE_END_OF_STREAM,
&old_state, state);
@@ -262,6 +274,8 @@
{
TestPlayerState old_state = *state;
+ g_assert (!state->stopping);
+
state->error = TRUE;
test_player_state_change_debug (player, STATE_CHANGE_ERROR, &old_state,
state);
@@ -273,6 +287,8 @@
{
TestPlayerState old_state = *state;
+ g_assert (!state->stopping);
+
state->warning = TRUE;
test_player_state_change_debug (player, STATE_CHANGE_WARNING, &old_state,
state);
@@ -285,6 +301,8 @@
{
TestPlayerState old_state = *state;
+ g_assert (!state->stopping);
+
state->position = position;
test_player_state_change_debug (player, STATE_CHANGE_POSITION_UPDATED,
&old_state, state);
@@ -298,6 +316,8 @@
{
TestPlayerState old_state = *state;
+ g_assert (!state->stopping);
+
state->media_info = media_info;
test_player_state_change_debug (player, STATE_CHANGE_MEDIA_INFO_UPDATED,
@@ -312,6 +332,8 @@
{
TestPlayerState old_state = *state;
+ g_assert (!state->stopping || player_state == GST_PLAYER_STATE_STOPPED);
+
state->state = player_state;
if (player_state == GST_PLAYER_STATE_STOPPED)
@@ -328,6 +350,8 @@
{
TestPlayerState old_state = *state;
+ g_assert (!state->stopping);
+
state->width = width;
state->height = height;
test_player_state_change_debug (player, STATE_CHANGE_VIDEO_DIMENSIONS_CHANGED,
@@ -341,6 +365,8 @@
{
TestPlayerState old_state = *state;
+ g_assert (!state->stopping);
+
state->seek_done = TRUE;
state->seek_done_position = position;
test_player_state_change_debug (player, STATE_CHANGE_SEEK_DONE,
@@ -348,6 +374,15 @@
state->test_callback (player, STATE_CHANGE_SEEK_DONE, &old_state, state);
}
+static void
+uri_loaded_cb (GstPlayer * player, const gchar * uri, TestPlayerState * state)
+{
+ TestPlayerState old_state = *state;
+
+ state->uri_loaded = g_strdup (uri);
+ state->test_callback (player, STATE_CHANGE_URI_LOADED, &old_state, state);
+}
+
static GstPlayer *
test_player_new (TestPlayerState * state)
{
@@ -386,11 +421,34 @@
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);
+ g_signal_connect (player, "uri-loaded", G_CALLBACK (uri_loaded_cb), state);
return player;
}
static void
+test_player_stopped_cb (GstPlayer * player, TestPlayerStateChange change,
+ TestPlayerState * old_state, TestPlayerState * new_state)
+{
+ if (new_state->state == GST_PLAYER_STATE_STOPPED) {
+ g_main_loop_quit (new_state->loop);
+ }
+}
+
+static void
+stop_player (GstPlayer * player, TestPlayerState * state)
+{
+ if (state->state != GST_PLAYER_STATE_STOPPED) {
+ /* Make sure all pending operations are finished so the player won't be
+ * appear as 'leaked' to leak detection tools. */
+ state->test_callback = test_player_stopped_cb;
+ gst_player_stop (player);
+ state->stopping = TRUE;
+ g_main_loop_run (state->loop);
+ }
+}
+
+static void
test_play_audio_video_eos_cb (GstPlayer * player, TestPlayerStateChange change,
TestPlayerState * old_state, TestPlayerState * new_state)
{
@@ -402,18 +460,29 @@
switch (step) {
case 0:
+ fail_unless_equals_int (change, STATE_CHANGE_URI_LOADED);
+ if (video)
+ fail_unless (g_str_has_suffix (new_state->uri_loaded,
+ "audio-video-short.ogg"));
+ else
+ fail_unless (g_str_has_suffix (new_state->uri_loaded,
+ "audio-short.ogg"));
+ new_state->test_data =
+ GINT_TO_POINTER ((video ? 0x10 : 0x00) | (step + 1));
+ break;
+ case 1:
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:
+ case 2:
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:
+ case 3:
fail_unless_equals_int (change, STATE_CHANGE_VIDEO_DIMENSIONS_CHANGED);
if (video) {
fail_unless_equals_int (new_state->width, 320);
@@ -425,27 +494,27 @@
new_state->test_data =
GINT_TO_POINTER ((video ? 0x10 : 0x00) | (step + 1));
break;
- case 3:
+ case 4:
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:
+ case 5:
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:
+ case 6:
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:
+ case 7:
if (change == STATE_CHANGE_POSITION_UPDATED) {
fail_unless (old_state->position <= new_state->position);
} else {
@@ -455,7 +524,7 @@
GINT_TO_POINTER ((video ? 0x10 : 0x00) | (step + 1));
}
break;
- case 7:
+ case 8:
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);
@@ -492,8 +561,9 @@
gst_player_play (player);
g_main_loop_run (state.loop);
- fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 8);
+ fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 9);
+ stop_player (player, &state);
g_object_unref (player);
g_main_loop_unref (state.loop);
}
@@ -672,6 +742,7 @@
g_main_loop_run (state.loop);
fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 1);
+ stop_player (player, &state);
g_object_unref (player);
g_main_loop_unref (state.loop);
}
@@ -693,7 +764,7 @@
new_state->test_data = GINT_TO_POINTER (steps + 1);
/* load invalid suburi */
- fail_unless (gst_player_set_subtitle_uri (player, suburi) != FALSE);
+ gst_player_set_subtitle_uri (player, suburi);
g_free (suburi);
} else if (steps && change == STATE_CHANGE_WARNING) {
@@ -764,6 +835,7 @@
fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 0x33);
+ stop_player (player, &state);
g_object_unref (player);
g_main_loop_unref (state.loop);
}
@@ -828,6 +900,7 @@
fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 2);
+ stop_player (player, &state);
g_object_unref (player);
g_main_loop_unref (state.loop);
}
@@ -892,6 +965,7 @@
fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 2);
+ stop_player (player, &state);
g_object_unref (player);
g_main_loop_unref (state.loop);
}
@@ -923,6 +997,7 @@
fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 2);
+ stop_player (player, &state);
g_object_unref (player);
g_main_loop_unref (state.loop);
}
@@ -951,7 +1026,7 @@
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);
+ gst_player_set_subtitle_uri (player, suburi);
g_free (suburi);
new_state->test_data = GINT_TO_POINTER (steps + 1);
@@ -1001,6 +1076,7 @@
fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 2);
+ stop_player (player, &state);
g_object_unref (player);
g_main_loop_unref (state.loop);
}
@@ -1072,6 +1148,7 @@
fail_unless_equals_int (GPOINTER_TO_INT (state.test_data) & 0xf, 10);
+ stop_player (player, &state);
g_object_unref (player);
g_main_loop_unref (state.loop);
}
@@ -1103,6 +1180,7 @@
fail_unless_equals_int (GPOINTER_TO_INT (state.test_data) & 0xf, 10);
+ stop_player (player, &state);
g_object_unref (player);
g_main_loop_unref (state.loop);
}
@@ -1132,8 +1210,9 @@
gst_player_play (player);
g_main_loop_run (state.loop);
- fail_unless_equals_int (GPOINTER_TO_INT (state.test_data) & (~0x10), 8);
+ fail_unless_equals_int (GPOINTER_TO_INT (state.test_data) & (~0x10), 9);
+ stop_player (player, &state);
g_object_unref (player);
g_main_loop_unref (state.loop);
}
@@ -1149,16 +1228,21 @@
switch (step) {
case 0:
+ fail_unless_equals_int (change, STATE_CHANGE_URI_LOADED);
+ fail_unless_equals_string (new_state->uri_loaded, "foo://bar");
+ new_state->test_data = GINT_TO_POINTER (step + 1);
+ break;
+ case 1:
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:
+ case 2:
fail_unless_equals_int (change, STATE_CHANGE_ERROR);
new_state->test_data = GINT_TO_POINTER (step + 1);
break;
- case 2:
+ case 3:
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);
@@ -1190,8 +1274,9 @@
gst_player_play (player);
g_main_loop_run (state.loop);
- fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 3);
+ fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 4);
+ stop_player (player, &state);
g_object_unref (player);
g_main_loop_unref (state.loop);
}
@@ -1208,16 +1293,21 @@
switch (step) {
case 0:
+ fail_unless_equals_int (change, STATE_CHANGE_URI_LOADED);
+ fail_unless_equals_string (new_state->uri_loaded, "foo://bar");
+ new_state->test_data = GINT_TO_POINTER (step + 1);
+ break;
+ case 1:
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:
+ case 2:
fail_unless_equals_int (change, STATE_CHANGE_ERROR);
new_state->test_data = GINT_TO_POINTER (step + 1);
break;
- case 2:
+ case 3:
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);
@@ -1230,34 +1320,39 @@
gst_player_play (player);
break;
- case 3:
+ case 4:
+ fail_unless_equals_int (change, STATE_CHANGE_URI_LOADED);
+ fail_unless (g_str_has_suffix (new_state->uri_loaded, "audio-short.ogg"));
+ new_state->test_data = GINT_TO_POINTER (step + 1);
+ break;
+ case 5:
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:
+ case 6:
fail_unless_equals_int (change, STATE_CHANGE_MEDIA_INFO_UPDATED);
new_state->test_data = GINT_TO_POINTER (step + 1);
break;
- case 5:
+ case 7:
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:
+ case 8:
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:
+ case 9:
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:
+ case 10:
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);
@@ -1289,8 +1384,9 @@
gst_player_play (player);
g_main_loop_run (state.loop);
- fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 9);
+ fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 11);
+ stop_player (player, &state);
g_object_unref (player);
g_main_loop_unref (state.loop);
}
@@ -1341,6 +1437,7 @@
fail_unless_equals_int (GPOINTER_TO_INT (state.test_data) & (~0x10), 2);
+ stop_player (player, &state);
g_object_unref (player);
g_main_loop_unref (state.loop);
}
@@ -1376,7 +1473,6 @@
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 ||
@@ -1399,6 +1495,7 @@
GstPlayer *player;
TestPlayerState state;
gchar *uri;
+ GstStructure *config;
memset (&state, 0, sizeof (state));
state.loop = g_main_loop_new (NULL, FALSE);
@@ -1406,7 +1503,10 @@
state.test_data = GINT_TO_POINTER (0);
player = test_player_new (&state);
- gst_player_set_position_update_interval (player, 600);
+
+ config = gst_player_get_config (player);
+ gst_player_config_set_position_update_interval (config, 600);
+ gst_player_set_config (player, config);
fail_unless (player != NULL);
@@ -1420,17 +1520,157 @@
fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 5);
+ /* Disable position updates */
+ gst_player_stop (player);
+
+ config = gst_player_get_config (player);
+ gst_player_config_set_position_update_interval (config, 0);
+ gst_player_set_config (player, config);
+
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);
+ stop_player (player, &state);
g_object_unref (player);
g_main_loop_unref (state.loop);
}
END_TEST;
+static void
+test_restart_cb (GstPlayer * player,
+ TestPlayerStateChange change, TestPlayerState * old_state,
+ TestPlayerState * new_state)
+{
+ gint steps = GPOINTER_TO_INT (new_state->test_data);
+
+ if (!steps && change == STATE_CHANGE_URI_LOADED) {
+ fail_unless (g_str_has_suffix (new_state->uri_loaded, "sintel.mkv"));
+ new_state->test_data = GINT_TO_POINTER (steps + 1);
+ } else if (change == STATE_CHANGE_STATE_CHANGED
+ && new_state->state == GST_PLAYER_STATE_BUFFERING) {
+ new_state->test_data = GINT_TO_POINTER (steps + 1);
+ g_main_loop_quit (new_state->loop);
+ }
+}
+
+static void
+test_restart_cb2 (GstPlayer * player,
+ TestPlayerStateChange change, TestPlayerState * old_state,
+ TestPlayerState * new_state)
+{
+ gint steps = GPOINTER_TO_INT (new_state->test_data);
+
+ if (!steps && change == STATE_CHANGE_URI_LOADED) {
+ fail_unless (g_str_has_suffix (new_state->uri_loaded, "audio-short.ogg"));
+ new_state->test_data = GINT_TO_POINTER (steps + 1);
+ } else if (change == STATE_CHANGE_STATE_CHANGED
+ && new_state->state == GST_PLAYER_STATE_BUFFERING) {
+ new_state->test_data = GINT_TO_POINTER (steps + 1);
+ g_main_loop_quit (new_state->loop);
+ }
+}
+
+
+START_TEST (test_restart)
+{
+ GstPlayer *player;
+ TestPlayerState state;
+ gchar *uri;
+
+ memset (&state, 0, sizeof (state));
+ state.loop = g_main_loop_new (NULL, FALSE);
+ state.test_callback = test_restart_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);
+ stop_player (player, &state);
+
+ /* Try again with another URI */
+ state.test_data = GINT_TO_POINTER (0);
+ state.test_callback = test_restart_cb2;
+
+ 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), 2);
+ stop_player (player, &state);
+
+ g_object_unref (player);
+ g_main_loop_unref (state.loop);
+}
+
+END_TEST;
+
+#define TEST_USER_AGENT "test user agent"
+
+static void
+source_setup_cb (GstElement * playbin, GstElement * source, GMainLoop * loop)
+{
+ gchar *user_agent;
+
+ g_object_get (source, "user-agent", &user_agent, NULL);
+ fail_unless_equals_string (user_agent, TEST_USER_AGENT);
+ g_free (user_agent);
+
+ g_main_loop_quit (loop);
+}
+
+START_TEST (test_user_agent)
+{
+ GstPlayer *player;
+ GMainLoop *loop;
+ GstElement *pipeline;
+ GstStructure *config;
+ gchar *user_agent;
+
+ loop = g_main_loop_new (NULL, FALSE);
+ player = gst_player_new (NULL, NULL);
+ fail_unless (player != NULL);
+
+ gst_player_set_uri (player, "http://badger.com/test.mkv");
+
+ config = gst_player_get_config (player);
+ gst_player_config_set_user_agent (config, TEST_USER_AGENT);
+
+ user_agent = gst_player_config_get_user_agent (config);
+ fail_unless_equals_string (user_agent, TEST_USER_AGENT);
+ g_free (user_agent);
+
+ gst_player_set_config (player, config);
+
+ pipeline = gst_player_get_pipeline (player);
+ g_signal_connect (pipeline, "source-setup", G_CALLBACK (source_setup_cb),
+ loop);
+
+ gst_player_pause (player);
+ g_main_loop_run (loop);
+
+ gst_object_unref (pipeline);
+
+ g_object_unref (player);
+ g_main_loop_unref (loop);
+}
+
+END_TEST;
+
static Suite *
player_suite (void)
{
@@ -1472,6 +1712,8 @@
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);
+ tcase_add_test (tc_general, test_restart);
+ tcase_add_test (tc_general, test_user_agent);
suite_add_tcase (s, tc_general);
diff --git a/tests/check/pipelines/simple-launch-lines.c b/tests/check/pipelines/simple-launch-lines.c
new file mode 100644
index 0000000..f03fc94
--- /dev/null
+++ b/tests/check/pipelines/simple-launch-lines.c
@@ -0,0 +1,361 @@
+/* GStreamer
+ * Copyright (C) 2005 Andy Wingo <wingo@pobox.com>
+ *
+ * simple_launch_lines.c: Unit test for simple pipelines
+ *
+ * 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/gstglconfig.h>
+
+#ifndef GST_DISABLE_PARSE
+
+static GstElement *
+setup_pipeline (const gchar * pipe_descr)
+{
+ GstElement *pipeline;
+
+ pipeline = gst_parse_launch (pipe_descr, NULL);
+ g_return_val_if_fail (GST_IS_PIPELINE (pipeline), NULL);
+ return pipeline;
+}
+
+/*
+ * run_pipeline:
+ * @pipe: the pipeline to run
+ * @desc: the description for use in messages
+ * @events: is a mask of expected events
+ * @tevent: is the expected terminal event.
+ *
+ * the poll call will time out after half a second.
+ */
+static void
+run_pipeline (GstElement * pipe, const gchar * descr,
+ GstMessageType events, GstMessageType tevent, GstState target_state)
+{
+ GstBus *bus;
+ GstMessage *message;
+ GstMessageType revent;
+ GstStateChangeReturn ret;
+
+ g_assert (pipe);
+ bus = gst_element_get_bus (pipe);
+ g_assert (bus);
+
+ fail_if (gst_element_set_state (pipe, target_state) ==
+ GST_STATE_CHANGE_FAILURE, "Could not set pipeline %s to playing", descr);
+ ret = gst_element_get_state (pipe, NULL, NULL, 10 * GST_SECOND);
+ if (ret == GST_STATE_CHANGE_ASYNC) {
+ g_critical ("Pipeline '%s' failed to go to PAUSED fast enough", descr);
+ goto done;
+ } else if ((ret != GST_STATE_CHANGE_SUCCESS)
+ && (ret != GST_STATE_CHANGE_NO_PREROLL)) {
+ g_critical ("Pipeline '%s' failed to go into PAUSED state (%s)", descr,
+ gst_element_state_change_return_get_name (ret));
+ goto done;
+ }
+
+ while (1) {
+ message = gst_bus_poll (bus, GST_MESSAGE_ANY, GST_SECOND / 2);
+
+ /* always have to pop the message before getting back into poll */
+ if (message) {
+ revent = GST_MESSAGE_TYPE (message);
+ gst_message_unref (message);
+ } else {
+ revent = GST_MESSAGE_UNKNOWN;
+ }
+
+ if (revent == tevent) {
+ break;
+ } else if (revent == GST_MESSAGE_UNKNOWN) {
+ g_critical ("Unexpected timeout in gst_bus_poll, looking for %d: %s",
+ tevent, descr);
+ break;
+ } else if (revent & events) {
+ continue;
+ }
+ g_critical
+ ("Unexpected message received of type %d, '%s', looking for %d: %s",
+ revent, gst_message_type_get_name (revent), tevent, descr);
+ }
+
+done:
+ fail_if (gst_element_set_state (pipe, GST_STATE_NULL) ==
+ GST_STATE_CHANGE_FAILURE, "Could not set pipeline %s to NULL", descr);
+ gst_element_get_state (pipe, NULL, NULL, GST_CLOCK_TIME_NONE);
+ gst_object_unref (pipe);
+
+ gst_bus_set_flushing (bus, TRUE);
+ gst_object_unref (bus);
+}
+
+GST_START_TEST (test_glimagesink)
+{
+ const gchar *s;
+ GstState target_state = GST_STATE_PLAYING;
+
+ s = "videotestsrc num-buffers=10 ! glimagesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN, target_state);
+}
+
+GST_END_TEST
+GST_START_TEST (test_glfiltercube)
+{
+ const gchar *s;
+ GstState target_state = GST_STATE_PLAYING;
+
+ s = "videotestsrc num-buffers=10 ! glupload ! glfiltercube ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN, target_state);
+}
+
+GST_END_TEST
+#define N_EFFECTS 18
+GST_START_TEST (test_gleffects)
+{
+ gchar *s;
+ GstState target_state = GST_STATE_PLAYING;
+ guint i;
+
+ for (i = 0; i < N_EFFECTS; i++) {
+ s = g_strdup_printf ("videotestsrc num-buffers=10 ! glupload ! "
+ "gleffects effect=%i ! fakesink", i);
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN, target_state);
+ g_free (s);
+ }
+}
+
+GST_END_TEST
+#undef N_EFFECTS
+GST_START_TEST (test_glshader)
+{
+ const gchar *s;
+ GstState target_state = GST_STATE_PLAYING;
+
+ s = "videotestsrc num-buffers=10 ! glupload ! glshader ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN, target_state);
+
+#if GST_GL_HAVE_OPENGL
+ s = "gltestsrc num-buffers=10 ! glshader ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN, target_state);
+#endif
+}
+
+GST_END_TEST
+GST_START_TEST (test_glfilterapp)
+{
+ const gchar *s;
+ GstState target_state = GST_STATE_PLAYING;
+
+ s = "videotestsrc num-buffers=10 ! glupload ! glfilterapp ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN, target_state);
+
+#if GST_GL_HAVE_OPENGL
+ s = "gltestsrc num-buffers=10 ! glfilterapp ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN, target_state);
+#endif
+}
+
+GST_END_TEST
+#ifdef HAVE_PNG
+#if HAVE_JPEG
+GST_START_TEST (test_gloverlay)
+{
+ const gchar *s;
+ GstState target_state = GST_STATE_PLAYING;
+
+ s = "videotestsrc num-buffers=10 ! glupload ! gloverlay ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN, target_state);
+
+#if GST_GL_HAVE_OPENGL
+ s = "gltestsrc num-buffers=10 ! gloverlay ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN, target_state);
+#endif
+}
+
+GST_END_TEST
+#endif
+#endif
+#if GST_GL_HAVE_OPENGL
+#define N_SRCS 13
+GST_START_TEST (test_gltestsrc)
+{
+ gchar *s;
+ GstState target_state = GST_STATE_PLAYING;
+ guint i;
+
+ for (i = 0; i < N_SRCS; i++) {
+ s = g_strdup_printf ("gltestsrc pattern=%i num-buffers=10 ! fakesink", i);
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN, target_state);
+ g_free (s);
+ }
+}
+
+GST_END_TEST
+#undef N_SRCS
+GST_START_TEST (test_glfilterglass)
+{
+ const gchar *s;
+ GstState target_state = GST_STATE_PLAYING;
+
+ s = "videotestsrc num-buffers=10 ! glupload ! glfilterglass ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN, target_state);
+
+ s = "gltestsrc num-buffers=10 ! glfilterglass ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN, target_state);
+}
+
+GST_END_TEST
+#if 0
+GST_START_TEST (test_glfilterreflectedscreen)
+{
+ const gchar *s;
+ GstState target_state = GST_STATE_PLAYING;
+
+ s = "videotestsrc num-buffers=10 ! glupload ! glfilterreflectedscreen ! "
+ "fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN, target_state);
+
+ s = "gltestsrc num-buffers=10 ! glfilterreflectedscreen ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN, target_state);
+}
+
+GST_END_TEST
+#endif
+GST_START_TEST (test_gldeinterlace)
+{
+ const gchar *s;
+ GstState target_state = GST_STATE_PLAYING;
+
+ s = "videotestsrc num-buffers=10 ! glupload ! gldeinterlace ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN, target_state);
+
+ s = "gltestsrc num-buffers=10 ! gldeinterlace ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN, target_state);
+}
+
+GST_END_TEST
+GST_START_TEST (test_glmosaic)
+{
+ const gchar *s;
+ GstState target_state = GST_STATE_PLAYING;
+
+ s = "videotestsrc num-buffers=10 ! glupload ! glmosaic ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN, target_state);
+
+ s = "gltestsrc num-buffers=10 ! glmosaic ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN, target_state);
+}
+
+GST_END_TEST
+GST_START_TEST (test_gldifferencematte)
+{
+ const gchar *s;
+ GstState target_state = GST_STATE_PLAYING;
+
+ s = "videotestsrc num-buffers=10 ! glupload ! gldifferencematte ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN, target_state);
+
+ s = "gltestsrc num-buffers=10 ! gldifferencematte ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN, target_state);
+}
+
+GST_END_TEST
+#endif /* GST_GL_HAVE_OPENGL */
+#endif /* !GST_DISABLE_PARSE */
+static Suite *
+simple_launch_lines_suite (void)
+{
+ Suite *s = suite_create ("Pipelines");
+ TCase *tc_chain = tcase_create ("linear");
+
+ /* time out after 60s, not the default 3 */
+ tcase_set_timeout (tc_chain, 60);
+
+ suite_add_tcase (s, tc_chain);
+#ifndef GST_DISABLE_PARSE
+ tcase_add_test (tc_chain, test_glimagesink);
+ tcase_add_test (tc_chain, test_glfiltercube);
+ tcase_add_test (tc_chain, test_gleffects);
+ tcase_add_test (tc_chain, test_glshader);
+ tcase_add_test (tc_chain, test_glfilterapp);
+#ifdef HAVE_PNG
+#if HAVE_JPEG
+ tcase_add_test (tc_chain, test_gloverlay);
+#endif
+#endif
+#if GST_GL_HAVE_OPENGL
+ tcase_add_test (tc_chain, test_gltestsrc);
+ tcase_add_test (tc_chain, test_glfilterglass);
+/* tcase_add_test (tc_chain, test_glfilterreflectedscreen);*/
+ tcase_add_test (tc_chain, test_glmosaic);
+ tcase_add_test (tc_chain, test_gldeinterlace);
+#ifdef HAVE_PNG
+ tcase_add_test (tc_chain, test_gldifferencematte);
+/* tcase_add_test (tc_chain, test_glbumper);*/
+#if HAVE_JPEG
+#endif /* HAVE_JPEG */
+#endif /* HAVE_PNG */
+#endif /* GST_GL_HAVE_OPENGL */
+#endif /* !GST_DISABLE_PARSE */
+ return s;
+}
+
+GST_CHECK_MAIN (simple_launch_lines);
diff --git a/tests/examples/Makefile.in b/tests/examples/Makefile.in
index 3872c0f..135e2b9 100644
--- a/tests/examples/Makefile.in
+++ b/tests/examples/Makefile.in
@@ -318,6 +318,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -339,6 +341,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -388,6 +392,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -533,6 +539,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -659,8 +667,6 @@
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@
@@ -703,8 +709,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/avsamplesink/Makefile.in b/tests/examples/avsamplesink/Makefile.in
index a9fbae1..8440a9b 100644
--- a/tests/examples/avsamplesink/Makefile.in
+++ b/tests/examples/avsamplesink/Makefile.in
@@ -272,6 +272,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -293,6 +295,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -342,6 +346,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -487,6 +493,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -613,8 +621,6 @@
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@
@@ -657,8 +663,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/camerabin2/Makefile.in b/tests/examples/camerabin2/Makefile.in
index e788b01..164721e 100644
--- a/tests/examples/camerabin2/Makefile.in
+++ b/tests/examples/camerabin2/Makefile.in
@@ -290,6 +290,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -311,6 +313,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -360,6 +364,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -505,6 +511,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -631,8 +639,6 @@
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@
@@ -675,8 +681,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/codecparsers/Makefile.in b/tests/examples/codecparsers/Makefile.in
index a809599..4eb2cc7 100644
--- a/tests/examples/codecparsers/Makefile.in
+++ b/tests/examples/codecparsers/Makefile.in
@@ -275,6 +275,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -296,6 +298,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -345,6 +349,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -490,6 +496,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -616,8 +624,6 @@
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@
@@ -660,8 +666,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/directfb/Makefile.in b/tests/examples/directfb/Makefile.in
index 621282f..863c88f 100644
--- a/tests/examples/directfb/Makefile.in
+++ b/tests/examples/directfb/Makefile.in
@@ -269,6 +269,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -290,6 +292,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -339,6 +343,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -484,6 +490,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -610,8 +618,6 @@
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@
@@ -654,8 +660,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/gl/Makefile.in b/tests/examples/gl/Makefile.in
index 41a15c5..a4f8f34 100644
--- a/tests/examples/gl/Makefile.in
+++ b/tests/examples/gl/Makefile.in
@@ -280,6 +280,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -301,6 +303,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -350,6 +354,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -495,6 +501,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -621,8 +629,6 @@
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@
@@ -665,8 +671,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/gl/clutter/Makefile.am b/tests/examples/gl/clutter/Makefile.am
index cb8796c..a8e3115 100644
--- a/tests/examples/gl/clutter/Makefile.am
+++ b/tests/examples/gl/clutter/Makefile.am
@@ -30,7 +30,7 @@
$(GL_CFLAGS) $(CLUTTER_CFLAGS) \
$(CLUTTER_GLX_CFLAGS) $(CLUTTER_X11_CFLAGS) $(XCOMPOSITE_CFLAGS)
clutteractor_LDADD=$(CLUTTER_LIBS) $(CLUTTER_GLX_LIBS) $(CLUTTER_X11_LIBS) \
- $(GST_PLUGINS_GL_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \
+ $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \
$(GL_LIBS) $(XCOMPOSITE_LIBS) -lgstvideo-$(GST_API_VERSION)
clutteractortee_SOURCES = clutteractortee.c
@@ -40,7 +40,7 @@
$(GL_CFLAGS) $(CLUTTER_CFLAGS) \
$(CLUTTER_GLX_CFLAGS) $(CLUTTER_X11_CFLAGS) $(XCOMPOSITE_CFLAGS)
clutteractortee_LDADD=$(CLUTTER_LIBS) $(CLUTTER_GLX_LIBS) $(CLUTTER_X11_LIBS) \
- $(GST_PLUGINS_GL_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \
+ $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \
$(GL_LIBS) $(XCOMPOSITE_LIBS) -lgstvideo-$(GST_API_VERSION)
endif
diff --git a/tests/examples/gl/clutter/Makefile.in b/tests/examples/gl/clutter/Makefile.in
index aeda840..b570e19 100644
--- a/tests/examples/gl/clutter/Makefile.in
+++ b/tests/examples/gl/clutter/Makefile.in
@@ -312,6 +312,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -333,6 +335,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -382,6 +386,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -527,6 +533,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -653,8 +661,6 @@
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@
@@ -697,8 +703,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -803,7 +814,7 @@
@HAVE_CLUTTER_GLX_TRUE@@HAVE_CLUTTER_X11_TRUE@@HAVE_XCOMPOSITE_TRUE@ $(CLUTTER_GLX_CFLAGS) $(CLUTTER_X11_CFLAGS) $(XCOMPOSITE_CFLAGS)
@HAVE_CLUTTER_GLX_TRUE@@HAVE_CLUTTER_X11_TRUE@@HAVE_XCOMPOSITE_TRUE@clutteractor_LDADD = $(CLUTTER_LIBS) $(CLUTTER_GLX_LIBS) $(CLUTTER_X11_LIBS) \
-@HAVE_CLUTTER_GLX_TRUE@@HAVE_CLUTTER_X11_TRUE@@HAVE_XCOMPOSITE_TRUE@ $(GST_PLUGINS_GL_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \
+@HAVE_CLUTTER_GLX_TRUE@@HAVE_CLUTTER_X11_TRUE@@HAVE_XCOMPOSITE_TRUE@ $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \
@HAVE_CLUTTER_GLX_TRUE@@HAVE_CLUTTER_X11_TRUE@@HAVE_XCOMPOSITE_TRUE@ $(GL_LIBS) $(XCOMPOSITE_LIBS) -lgstvideo-$(GST_API_VERSION)
@HAVE_CLUTTER_GLX_TRUE@@HAVE_CLUTTER_X11_TRUE@@HAVE_XCOMPOSITE_TRUE@clutteractortee_SOURCES = clutteractortee.c
@@ -813,7 +824,7 @@
@HAVE_CLUTTER_GLX_TRUE@@HAVE_CLUTTER_X11_TRUE@@HAVE_XCOMPOSITE_TRUE@ $(CLUTTER_GLX_CFLAGS) $(CLUTTER_X11_CFLAGS) $(XCOMPOSITE_CFLAGS)
@HAVE_CLUTTER_GLX_TRUE@@HAVE_CLUTTER_X11_TRUE@@HAVE_XCOMPOSITE_TRUE@clutteractortee_LDADD = $(CLUTTER_LIBS) $(CLUTTER_GLX_LIBS) $(CLUTTER_X11_LIBS) \
-@HAVE_CLUTTER_GLX_TRUE@@HAVE_CLUTTER_X11_TRUE@@HAVE_XCOMPOSITE_TRUE@ $(GST_PLUGINS_GL_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \
+@HAVE_CLUTTER_GLX_TRUE@@HAVE_CLUTTER_X11_TRUE@@HAVE_XCOMPOSITE_TRUE@ $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \
@HAVE_CLUTTER_GLX_TRUE@@HAVE_CLUTTER_X11_TRUE@@HAVE_XCOMPOSITE_TRUE@ $(GL_LIBS) $(XCOMPOSITE_LIBS) -lgstvideo-$(GST_API_VERSION)
all: all-am
diff --git a/tests/examples/gl/cocoa/Makefile.in b/tests/examples/gl/cocoa/Makefile.in
index 1ee387b..099ff94 100644
--- a/tests/examples/gl/cocoa/Makefile.in
+++ b/tests/examples/gl/cocoa/Makefile.in
@@ -275,6 +275,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -296,6 +298,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -345,6 +349,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -490,6 +496,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -616,8 +624,6 @@
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@
@@ -660,8 +666,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/gl/generic/Makefile.in b/tests/examples/gl/generic/Makefile.in
index 8455ec5..2853eb0 100644
--- a/tests/examples/gl/generic/Makefile.in
+++ b/tests/examples/gl/generic/Makefile.in
@@ -276,6 +276,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -297,6 +299,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -346,6 +350,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -491,6 +497,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -617,8 +625,6 @@
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@
@@ -661,8 +667,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/gl/generic/cube/Makefile.in b/tests/examples/gl/generic/cube/Makefile.in
index 9c8a066..15e8308 100644
--- a/tests/examples/gl/generic/cube/Makefile.in
+++ b/tests/examples/gl/generic/cube/Makefile.in
@@ -271,6 +271,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -292,6 +294,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -341,6 +345,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -486,6 +492,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -612,8 +620,6 @@
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@
@@ -656,8 +662,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/gl/generic/cubeyuv/Makefile.in b/tests/examples/gl/generic/cubeyuv/Makefile.in
index 967f181..4015864 100644
--- a/tests/examples/gl/generic/cubeyuv/Makefile.in
+++ b/tests/examples/gl/generic/cubeyuv/Makefile.in
@@ -271,6 +271,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -292,6 +294,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -341,6 +345,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -486,6 +492,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -612,8 +620,6 @@
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@
@@ -656,8 +662,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/gl/generic/doublecube/Makefile.in b/tests/examples/gl/generic/doublecube/Makefile.in
index 80da624..3b7f8a5 100644
--- a/tests/examples/gl/generic/doublecube/Makefile.in
+++ b/tests/examples/gl/generic/doublecube/Makefile.in
@@ -271,6 +271,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -292,6 +294,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -341,6 +345,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -486,6 +492,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -612,8 +620,6 @@
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@
@@ -656,8 +662,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/gl/generic/recordgraphic/Makefile.in b/tests/examples/gl/generic/recordgraphic/Makefile.in
index ccbb38e..e1d9308 100644
--- a/tests/examples/gl/generic/recordgraphic/Makefile.in
+++ b/tests/examples/gl/generic/recordgraphic/Makefile.in
@@ -272,6 +272,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -293,6 +295,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -342,6 +346,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -487,6 +493,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -613,8 +621,6 @@
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@
@@ -657,8 +663,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/gl/gtk/3dvideo/Makefile.in b/tests/examples/gl/gtk/3dvideo/Makefile.in
index eea6a64..850bb28 100644
--- a/tests/examples/gl/gtk/3dvideo/Makefile.in
+++ b/tests/examples/gl/gtk/3dvideo/Makefile.in
@@ -295,6 +295,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -316,6 +318,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -365,6 +369,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -510,6 +516,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -636,8 +644,6 @@
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@
@@ -680,8 +686,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/gl/gtk/3dvideo/main.cpp b/tests/examples/gl/gtk/3dvideo/main.cpp
index 1d8e5b7..16692f2 100644
--- a/tests/examples/gl/gtk/3dvideo/main.cpp
+++ b/tests/examples/gl/gtk/3dvideo/main.cpp
@@ -47,6 +47,9 @@
static GstBusSyncReply
create_window (GstBus * bus, GstMessage * message, GtkWidget * widget)
{
+ if (gst_gtk_handle_need_context (bus, message, NULL))
+ return GST_BUS_DROP;
+
/* ignore anything but 'prepare-window-handle' element messages */
if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT)
return GST_BUS_PASS;
@@ -107,6 +110,17 @@
return FALSE;
}
+static gboolean
+resize_cb (GtkWidget * widget, GdkEvent * event, gpointer sink)
+{
+ GtkAllocation allocation;
+
+ gtk_widget_get_allocation (widget, &allocation);
+ gst_video_overlay_set_render_rectangle (GST_VIDEO_OVERLAY (sink), allocation.x, allocation.y, allocation.width, allocation.height);
+
+ return G_SOURCE_CONTINUE;
+}
+
static void
destroy_cb (GtkWidget * widget, GdkEvent * event, GstElement * pipeline)
{
@@ -406,6 +420,7 @@
/* Redraw needed when paused or stopped (PAUSED or READY) */
g_signal_connect (area, "draw", G_CALLBACK (draw_cb), videosink);
+ g_signal_connect(area, "configure-event", G_CALLBACK(resize_cb), videosink);
gtk_widget_show_all (window);
diff --git a/tests/examples/gl/gtk/Makefile.am b/tests/examples/gl/gtk/Makefile.am
index 3c18679..5728905 100644
--- a/tests/examples/gl/gtk/Makefile.am
+++ b/tests/examples/gl/gtk/Makefile.am
@@ -1,5 +1,5 @@
-SUBDIRS = . gtkvideooverlay filternovideooverlay filtervideooverlay fxtest switchvideooverlay 3dvideo
+SUBDIRS = . filternovideooverlay filtervideooverlay fxtest switchvideooverlay 3dvideo
noinst_LTLIBRARIES = libgstgtkhelper.la
diff --git a/tests/examples/gl/gtk/Makefile.in b/tests/examples/gl/gtk/Makefile.in
index 34d00c8..4b1db57 100644
--- a/tests/examples/gl/gtk/Makefile.in
+++ b/tests/examples/gl/gtk/Makefile.in
@@ -312,6 +312,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -333,6 +335,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -382,6 +386,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -527,6 +533,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -653,8 +661,6 @@
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@
@@ -697,8 +703,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -787,7 +798,7 @@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
wayland_scanner = @wayland_scanner@
-SUBDIRS = . gtkvideooverlay filternovideooverlay filtervideooverlay fxtest switchvideooverlay 3dvideo
+SUBDIRS = . filternovideooverlay filtervideooverlay fxtest switchvideooverlay 3dvideo
noinst_LTLIBRARIES = libgstgtkhelper.la
libgstgtkhelper_la_SOURCES = gstgtk.c gstgtk.h
libgstgtkhelper_la_CFLAGS = -I$(top_srcdir)/gst-libs \
diff --git a/tests/examples/gl/gtk/filternovideooverlay/Makefile.in b/tests/examples/gl/gtk/filternovideooverlay/Makefile.in
index 82ae551..9bad27c 100644
--- a/tests/examples/gl/gtk/filternovideooverlay/Makefile.in
+++ b/tests/examples/gl/gtk/filternovideooverlay/Makefile.in
@@ -273,6 +273,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -294,6 +296,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -343,6 +347,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -488,6 +494,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -614,8 +622,6 @@
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@
@@ -658,8 +664,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/gl/gtk/filtervideooverlay/Makefile.in b/tests/examples/gl/gtk/filtervideooverlay/Makefile.in
index b9cc5a0..a22742a 100644
--- a/tests/examples/gl/gtk/filtervideooverlay/Makefile.in
+++ b/tests/examples/gl/gtk/filtervideooverlay/Makefile.in
@@ -274,6 +274,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -295,6 +297,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -344,6 +348,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -489,6 +495,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -615,8 +623,6 @@
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@
@@ -659,8 +665,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/gl/gtk/fxtest/Makefile.in b/tests/examples/gl/gtk/fxtest/Makefile.in
index d5a8867..ac50a68 100644
--- a/tests/examples/gl/gtk/fxtest/Makefile.in
+++ b/tests/examples/gl/gtk/fxtest/Makefile.in
@@ -280,6 +280,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -301,6 +303,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -350,6 +354,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -495,6 +501,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -621,8 +629,6 @@
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@
@@ -665,8 +671,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/gl/gtk/fxtest/fxtest.c b/tests/examples/gl/gtk/fxtest/fxtest.c
index 4b60b54..8b56b96 100644
--- a/tests/examples/gl/gtk/fxtest/fxtest.c
+++ b/tests/examples/gl/gtk/fxtest/fxtest.c
@@ -40,6 +40,9 @@
static GstBusSyncReply
create_window (GstBus * bus, GstMessage * message, GtkWidget * widget)
{
+ if (gst_gtk_handle_need_context (bus, message, NULL))
+ return GST_BUS_DROP;
+
/* ignore anything but 'prepare-window-handle' element messages */
if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT)
return GST_BUS_PASS;
@@ -98,6 +101,22 @@
}
static gboolean
+resize_cb (GtkWidget * widget, GdkEvent * event, gpointer data)
+{
+ GtkAllocation allocation;
+ GstVideoOverlay *overlay =
+ GST_VIDEO_OVERLAY (gst_bin_get_by_interface (GST_BIN (data),
+ GST_TYPE_VIDEO_OVERLAY));
+
+ gtk_widget_get_allocation (widget, &allocation);
+ gst_video_overlay_set_render_rectangle (overlay, allocation.x, allocation.y,
+ allocation.width, allocation.height);
+ gst_object_unref (overlay);
+
+ return G_SOURCE_CONTINUE;
+}
+
+static gboolean
expose_cb (GtkWidget * widget, gpointer unused, gpointer data)
{
GstVideoOverlay *overlay =
@@ -330,7 +349,7 @@
gtk_container_add (GTK_CONTAINER (window), vbox);
g_signal_connect (screen, "draw", G_CALLBACK (expose_cb), pipeline);
- g_signal_connect (screen, "configure-event", G_CALLBACK (expose_cb),
+ g_signal_connect (screen, "configure-event", G_CALLBACK (resize_cb),
pipeline);
gtk_widget_realize (screen);
diff --git a/tests/examples/gl/gtk/gtkvideooverlay/Makefile.am b/tests/examples/gl/gtk/gtkvideooverlay/Makefile.am
deleted file mode 100644
index d6da10d..0000000
--- a/tests/examples/gl/gtk/gtkvideooverlay/Makefile.am
+++ /dev/null
@@ -1,11 +0,0 @@
-noinst_PROGRAMS = gtkvideooverlay
-
-gtkvideooverlay_SOURCES = main.cpp
-
-gtkvideooverlay_CXXFLAGS=-I$(top_srcdir)/gst-libs -I$(top_builddir)/gst-libs \
- $(GST_PLUGINS_BASE_CFLAGS) $(GST_CXXFLAGS) \
- $(GL_CFLAGS) $(GTK3_CFLAGS) $(X11_CFLAGS)
-gtkvideooverlay_LDADD=../libgstgtkhelper.la \
- $(GTK3_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \
- $(GL_LIBS) -lgstvideo-$(GST_API_VERSION) $(X11_LIBS)
-
diff --git a/tests/examples/gl/gtk/gtkvideooverlay/main.cpp b/tests/examples/gl/gtk/gtkvideooverlay/main.cpp
deleted file mode 100644
index 5ca8108..0000000
--- a/tests/examples/gl/gtk/gtkvideooverlay/main.cpp
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * GStreamer
- * Copyright (C) 2008-2009 Julien Isorce <julien.isorce@gmail.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <gst/gst.h>
-#include <gtk/gtk.h>
-#include <gdk/gdk.h>
-
-#include "../gstgtk.h"
-
-#ifdef HAVE_X11
-#include <X11/Xlib.h>
-#endif
-
-
-static GstBusSyncReply create_window (GstBus* bus, GstMessage* message, GtkWidget* widget)
-{
- /* ignore anything but 'prepare-window-handle' element messages */
- if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT)
- return GST_BUS_PASS;
-
- if (!gst_is_video_overlay_prepare_window_handle_message (message))
- return GST_BUS_PASS;
-
- g_print ("setting window handle\n");
-
- /* do not call gdk_window_ensure_native for the first time here because
- * we are in a different thread than the main thread */
- gst_video_overlay_set_gtk_window (GST_VIDEO_OVERLAY (GST_MESSAGE_SRC (message)), widget);
-
- gst_message_unref (message);
-
- return GST_BUS_DROP;
-}
-
-
-static void end_stream_cb(GstBus* bus, GstMessage* message, GstElement* pipeline)
-{
- switch (GST_MESSAGE_TYPE (message))
- {
- case GST_MESSAGE_EOS:
- g_print ("End of stream\n");
-
- gst_element_set_state (pipeline, GST_STATE_NULL);
- gst_object_unref(pipeline);
- gtk_main_quit ();
- break;
- case GST_MESSAGE_ERROR:
- {
- gchar *debug = NULL;
- GError *err = NULL;
-
- gst_message_parse_error (message, &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 (pipeline, GST_STATE_NULL);
- gst_object_unref(pipeline);
- gtk_main_quit ();
- break;
- }
- default:
- break;
- }
-}
-
-static gboolean draw_cb(GtkWidget* widget, cairo_t *cr, GstElement* videosink)
-{
- g_print ("draw_cb\n");
- gst_video_overlay_expose (GST_VIDEO_OVERLAY (videosink));
- return FALSE;
-}
-
-
-static void destroy_cb(GtkWidget* widget, GdkEvent* event, GstElement* pipeline)
-{
- g_print("Close\n");
-
- gst_element_set_state (pipeline, GST_STATE_NULL);
- gst_object_unref(pipeline);
-
- gtk_main_quit();
-}
-
-
-static void button_state_null_cb(GtkWidget* widget, GstElement* pipeline)
-{
- gst_element_set_state (pipeline, GST_STATE_NULL);
- g_print ("GST_STATE_NULL\n");
-}
-
-
-static void button_state_ready_cb(GtkWidget* widget, GstElement* pipeline)
-{
- gst_element_set_state (pipeline, GST_STATE_READY);
- g_print ("GST_STATE_READY\n");
-}
-
-
-static void button_state_paused_cb(GtkWidget* widget, GstElement* pipeline)
-{
- gst_element_set_state (pipeline, GST_STATE_PAUSED);
- g_print ("GST_STATE_PAUSED\n");
-}
-
-
-static void button_state_playing_cb(GtkWidget* widget, GstElement* pipeline)
-{
- gst_element_set_state (pipeline, GST_STATE_PLAYING);
- g_print ("GST_STATE_PLAYING\n");
-}
-
-
-static gchar* slider_fps_cb (GtkScale* scale, gdouble value, GstElement* pipeline)
-{
- //change the video frame rate dynamically
- return g_strdup_printf ("video framerate: %0.*g", gtk_scale_get_digits (scale), value);
-}
-
-
-
-gint main (gint argc, gchar *argv[])
-{
-#ifdef HAVE_X11
- XInitThreads ();
-#endif
-
- GtkWidget *area;
- gst_init (&argc, &argv);
- gtk_init (&argc, &argv);
-
- GstElement* pipeline = gst_pipeline_new ("pipeline");
- GstElement* videosrc = gst_element_factory_make ("videotestsrc", "videotestsrc");
- GstElement* videosink = gst_element_factory_make ("glimagesink", "glimagesink");
-
- gst_bin_add_many (GST_BIN (pipeline), videosrc, videosink, NULL);
-
- gboolean link_ok = gst_element_link_many(videosrc, videosink, NULL) ;
- if(!link_ok)
- {
- g_warning("Failed to link an element!\n") ;
- return -1;
- }
-
- //set window id on this event
- GstBus* bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
- gst_bus_add_signal_watch (bus);
- g_signal_connect(bus, "message::error", G_CALLBACK(end_stream_cb), pipeline);
- g_signal_connect(bus, "message::warning", G_CALLBACK(end_stream_cb), pipeline);
- g_signal_connect(bus, "message::eos", G_CALLBACK(end_stream_cb), pipeline);
-
- gst_element_set_state(pipeline, GST_STATE_READY);
-
- area = gtk_drawing_area_new();
- gst_bus_set_sync_handler (bus, (GstBusSyncHandler) create_window, area, NULL);
- gst_object_unref (bus);
-
- //window that contains an area where the video is drawn
- GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_widget_set_size_request (window, 640, 480);
- gtk_window_move (GTK_WINDOW (window), 300, 10);
- gtk_window_set_title (GTK_WINDOW (window), "glimagesink implement the gstvideooverlay interface");
- GdkGeometry geometry;
- geometry.min_width = 1;
- geometry.min_height = 1;
- geometry.max_width = -1;
- geometry.max_height = -1;
- gtk_window_set_geometry_hints (GTK_WINDOW (window), window, &geometry, GDK_HINT_MIN_SIZE);
-
- //window to control the states
- GtkWidget* window_control = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- geometry.min_width = 1;
- geometry.min_height = 1;
- geometry.max_width = -1;
- geometry.max_height = -1;
- gtk_window_set_geometry_hints (GTK_WINDOW (window_control), window_control, &geometry, GDK_HINT_MIN_SIZE);
- gtk_window_set_resizable (GTK_WINDOW (window_control), FALSE);
- gtk_window_move (GTK_WINDOW (window_control), 10, 10);
- GtkWidget* table = gtk_grid_new ();
- gtk_container_add (GTK_CONTAINER (window_control), table);
-
- //control state null
- GtkWidget* button_state_null = gtk_button_new_with_label ("GST_STATE_NULL");
- g_signal_connect (G_OBJECT (button_state_null), "clicked",
- G_CALLBACK (button_state_null_cb), pipeline);
- gtk_grid_attach (GTK_GRID (table), button_state_null, 0, 0, 1, 1);
- gtk_widget_show (button_state_null);
-
- //control state ready
- GtkWidget* button_state_ready = gtk_button_new_with_label ("GST_STATE_READY");
- g_signal_connect (G_OBJECT (button_state_ready), "clicked",
- G_CALLBACK (button_state_ready_cb), pipeline);
- gtk_grid_attach (GTK_GRID (table), button_state_ready, 0, 1, 1, 1);
- gtk_widget_show (button_state_ready);
-
- //control state paused
- GtkWidget* button_state_paused = gtk_button_new_with_label ("GST_STATE_PAUSED");
- g_signal_connect (G_OBJECT (button_state_paused), "clicked",
- G_CALLBACK (button_state_paused_cb), pipeline);
- gtk_grid_attach (GTK_GRID (table), button_state_paused, 0, 2, 1, 1);
- gtk_widget_show (button_state_paused);
-
- //control state playing
- GtkWidget* button_state_playing = gtk_button_new_with_label ("GST_STATE_PLAYING");
- g_signal_connect (G_OBJECT (button_state_playing), "clicked",
- G_CALLBACK (button_state_playing_cb), pipeline);
- gtk_grid_attach (GTK_GRID (table), button_state_playing, 0, 3, 1, 1);
- gtk_widget_show (button_state_playing);
-
- //change framerate
- GtkWidget* slider_fps = gtk_scale_new_with_range (GTK_ORIENTATION_VERTICAL,
- 1, 30, 2);
- g_signal_connect (G_OBJECT (slider_fps), "format-value",
- G_CALLBACK (slider_fps_cb), pipeline);
- gtk_grid_attach (GTK_GRID (table), slider_fps, 1, 0, 1, 4);
- gtk_widget_show (slider_fps);
-
- gtk_widget_show (table);
- gtk_widget_show (window_control);
-
- //configure the pipeline
- g_signal_connect(G_OBJECT(window), "delete-event", G_CALLBACK(destroy_cb), pipeline);
-
- //area where the video is drawn
- gtk_container_add (GTK_CONTAINER (window), area);
-
- gtk_widget_realize(area);
-
- //needed when being in GST_STATE_READY, GST_STATE_PAUSED
- //or resizing/obscuring the window
- g_signal_connect(area, "draw", G_CALLBACK(draw_cb), videosink);
-
- gtk_widget_show_all (window);
-
- gst_element_set_state(pipeline, GST_STATE_PLAYING);
-
- gtk_main();
-
- return 0;
-}
-
diff --git a/tests/examples/gl/gtk/switchvideooverlay/Makefile.am b/tests/examples/gl/gtk/switchvideooverlay/Makefile.am
index dbe007c..e6ebf70 100644
--- a/tests/examples/gl/gtk/switchvideooverlay/Makefile.am
+++ b/tests/examples/gl/gtk/switchvideooverlay/Makefile.am
@@ -4,8 +4,8 @@
switchvideooverlay_CXXFLAGS=-I$(top_srcdir)/gst-libs -I$(top_builddir)/gst-libs \
$(GST_PLUGINS_BASE_CFLAGS) $(GST_CXXFLAGS) \
- $(GL_CFLAGS) $(GTK3_CFLAGS)
+ $(GL_CFLAGS) $(GTK3_CFLAGS) $(X_CFLAGS)
switchvideooverlay_LDADD=../libgstgtkhelper.la \
$(GTK3_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \
- $(GL_LIBS) -lgstvideo-$(GST_API_VERSION)
+ $(GL_LIBS) -lgstvideo-$(GST_API_VERSION) $(X_LIBS)
diff --git a/tests/examples/gl/gtk/switchvideooverlay/Makefile.in b/tests/examples/gl/gtk/switchvideooverlay/Makefile.in
index 07dbf2b..e5ec574 100644
--- a/tests/examples/gl/gtk/switchvideooverlay/Makefile.in
+++ b/tests/examples/gl/gtk/switchvideooverlay/Makefile.in
@@ -138,7 +138,8 @@
am__DEPENDENCIES_1 =
switchvideooverlay_DEPENDENCIES = ../libgstgtkhelper.la \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
am__v_lt_0 = --silent
@@ -273,6 +274,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -294,6 +297,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -343,6 +348,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -488,6 +495,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -614,8 +623,6 @@
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@
@@ -658,8 +665,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
@@ -751,11 +763,11 @@
switchvideooverlay_SOURCES = main.cpp
switchvideooverlay_CXXFLAGS = -I$(top_srcdir)/gst-libs -I$(top_builddir)/gst-libs \
$(GST_PLUGINS_BASE_CFLAGS) $(GST_CXXFLAGS) \
- $(GL_CFLAGS) $(GTK3_CFLAGS)
+ $(GL_CFLAGS) $(GTK3_CFLAGS) $(X_CFLAGS)
switchvideooverlay_LDADD = ../libgstgtkhelper.la \
$(GTK3_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \
- $(GL_LIBS) -lgstvideo-$(GST_API_VERSION)
+ $(GL_LIBS) -lgstvideo-$(GST_API_VERSION) $(X_LIBS)
all: all-am
diff --git a/tests/examples/gl/gtk/switchvideooverlay/main.cpp b/tests/examples/gl/gtk/switchvideooverlay/main.cpp
index ea53ea1..476478d 100644
--- a/tests/examples/gl/gtk/switchvideooverlay/main.cpp
+++ b/tests/examples/gl/gtk/switchvideooverlay/main.cpp
@@ -18,12 +18,19 @@
* Boston, MA 02110-1301, USA.
*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
#include <gst/gst.h>
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include "../gstgtk.h"
+#ifdef HAVE_X11
+#include <X11/Xlib.h>
+#endif
static GstBusSyncReply create_window (GstBus* bus, GstMessage* message, GtkWidget* widget)
{
@@ -59,7 +66,7 @@
gtk_widget_get_allocation (widget, &allocation);
gst_video_overlay_set_render_rectangle (GST_VIDEO_OVERLAY (sink), allocation.x, allocation.y, allocation.width, allocation.height);
- return G_SOURCE_CONTINUE;
+ return FALSE;
}
static void end_stream_cb(GstBus* bus, GstMessage* message, GstElement* pipeline)
@@ -104,6 +111,7 @@
static gboolean on_click_drawing_area(GtkWidget* widget, GdkEventButton* event, GstElement* videosink)
{
GtkAllocation allocation;
+ GtkWidget *parent = gtk_widget_get_parent (widget);
g_print ("switch the drawing area %p\n", widget);
gst_video_overlay_set_gtk_window (GST_VIDEO_OVERLAY (videosink), widget);
@@ -111,6 +119,11 @@
gtk_widget_get_allocation (widget, &allocation);
gst_video_overlay_set_render_rectangle (GST_VIDEO_OVERLAY (videosink), allocation.x, allocation.y, allocation.width, allocation.height);
+ /* XXX: required on wayland as changing the window handle (subsurface)
+ * requires a wl_surface::commit from the parent */
+ if (parent)
+ gtk_widget_queue_draw (parent);
+
return FALSE;
}
@@ -153,16 +166,12 @@
g_print ("GST_STATE_PLAYING\n");
}
-static void area_realize_cb(GtkWidget* widget, gpointer data)
-{
- g_print ("realize %p\n", widget);
- if (!gdk_window_ensure_native (gtk_widget_get_window (widget)))
- g_error ("Failed to create native window!");
-}
-
-
gint main (gint argc, gchar *argv[])
{
+#ifdef HAVE_X11
+ XInitThreads();
+#endif
+
gtk_init (&argc, &argv);
gst_init (&argc, &argv);
@@ -250,10 +259,6 @@
gtk_widget_set_size_request (area_top_right, 320, 240);
gtk_grid_attach (GTK_GRID (table_areas), area_top_right, 1, 0, 1, 1);
- //set window id on this event
- g_signal_connect(area_top_left, "realize", G_CALLBACK(area_realize_cb), NULL);
- g_signal_connect(area_top_right, "realize", G_CALLBACK(area_realize_cb), NULL);
-
gtk_widget_set_redraw_on_allocate (area_top_left, TRUE);
gtk_widget_set_redraw_on_allocate (area_top_right, TRUE);
gtk_widget_realize(area_top_left);
diff --git a/tests/examples/gl/qt/Makefile.in b/tests/examples/gl/qt/Makefile.in
index 290c83a..9562426 100644
--- a/tests/examples/gl/qt/Makefile.in
+++ b/tests/examples/gl/qt/Makefile.in
@@ -216,6 +216,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -237,6 +239,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -286,6 +290,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -431,6 +437,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -557,8 +565,6 @@
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@
@@ -601,8 +607,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/gl/sdl/Makefile.in b/tests/examples/gl/sdl/Makefile.in
index 349fcc1..a82243a 100644
--- a/tests/examples/gl/sdl/Makefile.in
+++ b/tests/examples/gl/sdl/Makefile.in
@@ -287,6 +287,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -308,6 +310,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -357,6 +361,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -502,6 +508,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -628,8 +636,6 @@
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@
@@ -672,8 +678,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/gtk/Makefile.in b/tests/examples/gtk/Makefile.in
index e07c396..c5dcb57 100644
--- a/tests/examples/gtk/Makefile.in
+++ b/tests/examples/gtk/Makefile.in
@@ -299,6 +299,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -320,6 +322,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -369,6 +373,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -514,6 +520,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -640,8 +648,6 @@
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@
@@ -684,8 +690,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/mpegts/Makefile.in b/tests/examples/mpegts/Makefile.in
index 75ac0dd..1ab72cf 100644
--- a/tests/examples/mpegts/Makefile.in
+++ b/tests/examples/mpegts/Makefile.in
@@ -269,6 +269,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -290,6 +292,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -339,6 +343,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -484,6 +490,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -610,8 +618,6 @@
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@
@@ -654,8 +660,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/mxf/Makefile.in b/tests/examples/mxf/Makefile.in
index 76275c9..f2032eb 100644
--- a/tests/examples/mxf/Makefile.in
+++ b/tests/examples/mxf/Makefile.in
@@ -274,6 +274,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -295,6 +297,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -344,6 +348,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -489,6 +495,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -615,8 +623,6 @@
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@
@@ -659,8 +665,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/opencv/Makefile.in b/tests/examples/opencv/Makefile.in
index 8a23179..3410221 100644
--- a/tests/examples/opencv/Makefile.in
+++ b/tests/examples/opencv/Makefile.in
@@ -291,6 +291,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -312,6 +314,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -361,6 +365,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -506,6 +512,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -632,8 +640,6 @@
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@
@@ -676,8 +682,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/opencv/gstfacedetect_test.c b/tests/examples/opencv/gstfacedetect_test.c
index 9ecf3d0..d8334cb 100644
--- a/tests/examples/opencv/gstfacedetect_test.c
+++ b/tests/examples/opencv/gstfacedetect_test.c
@@ -1,7 +1,7 @@
/* GStreamer
* Copyright (C) 2015 Vanessa Chipirrás <vchipirras6@gmail.com>
*
- * gstfacedetect_test: gsteramer facedetect plugin demo application,
+ * gstfacedetect_test: gstreamer facedetect plugin demo application,
* part work of Outreachy 2015 project
*
* This library is free software; you can redistribute it and/or
diff --git a/tests/examples/opencv/gsthanddetect_test.c b/tests/examples/opencv/gsthanddetect_test.c
index 1cc9616..02a90de 100644
--- a/tests/examples/opencv/gsthanddetect_test.c
+++ b/tests/examples/opencv/gsthanddetect_test.c
@@ -1,7 +1,7 @@
/* GStreamer
* Copyright (C) 2012 Andol Li <andol@andol.info>
*
- * gsthanddetect_test: gsteramer handdetect plugin demo application,
+ * gsthanddetect_test: gstreamer handdetect plugin demo application,
* part work of GSoc 2012 project
*
* This library is free software; you can redistribute it and/or
diff --git a/tests/examples/uvch264/Makefile.in b/tests/examples/uvch264/Makefile.in
index e92f3fb..58b010b 100644
--- a/tests/examples/uvch264/Makefile.in
+++ b/tests/examples/uvch264/Makefile.in
@@ -277,6 +277,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -298,6 +300,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -347,6 +351,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -492,6 +498,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -618,8 +626,6 @@
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@
@@ -662,8 +668,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/examples/waylandsink/Makefile.in b/tests/examples/waylandsink/Makefile.in
index 3326bc9..2281cdf 100644
--- a/tests/examples/waylandsink/Makefile.in
+++ b/tests/examples/waylandsink/Makefile.in
@@ -273,6 +273,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -294,6 +296,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -343,6 +347,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -488,6 +494,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -614,8 +622,6 @@
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@
@@ -658,8 +664,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/files/Makefile.in b/tests/files/Makefile.in
index c8e1634..91d84fc 100644
--- a/tests/files/Makefile.in
+++ b/tests/files/Makefile.in
@@ -216,6 +216,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -237,6 +239,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -286,6 +290,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -431,6 +437,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -557,8 +565,6 @@
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@
@@ -601,8 +607,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tests/icles/Makefile.in b/tests/icles/Makefile.in
index 1b604df..46afe54 100644
--- a/tests/icles/Makefile.in
+++ b/tests/icles/Makefile.in
@@ -274,6 +274,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -295,6 +297,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -344,6 +348,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -489,6 +495,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -615,8 +623,6 @@
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@
@@ -659,8 +665,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tools/Makefile.in b/tools/Makefile.in
index 7380ae3..a159425 100644
--- a/tools/Makefile.in
+++ b/tools/Makefile.in
@@ -216,6 +216,8 @@
DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
DLLTOOL = @DLLTOOL@
+DRM_CFLAGS = @DRM_CFLAGS@
+DRM_LIBS = @DRM_LIBS@
DSYMUTIL = @DSYMUTIL@
DTLS_CFLAGS = @DTLS_CFLAGS@
DTLS_LIBS = @DTLS_LIBS@
@@ -237,6 +239,8 @@
EXIF_LIBS = @EXIF_LIBS@
FAAC_LIBS = @FAAC_LIBS@
FAAD_LIBS = @FAAD_LIBS@
+FDK_AAC_CFLAGS = @FDK_AAC_CFLAGS@
+FDK_AAC_LIBS = @FDK_AAC_LIBS@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
FLITE_CFLAGS = @FLITE_CFLAGS@
@@ -286,6 +290,8 @@
GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
GST_API_VERSION = @GST_API_VERSION@
+GST_AUDIO_CFLAGS = @GST_AUDIO_CFLAGS@
+GST_AUDIO_LIBS = @GST_AUDIO_LIBS@
GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
GST_BASE_LIBS = @GST_BASE_LIBS@
GST_CFLAGS = @GST_CFLAGS@
@@ -431,6 +437,8 @@
LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
LIBXML2_LIBS = @LIBXML2_LIBS@
+LILV_CFLAGS = @LILV_CFLAGS@
+LILV_LIBS = @LILV_LIBS@
LIPO = @LIPO@
LN_S = @LN_S@
LOCALEDIR = @LOCALEDIR@
@@ -557,8 +565,6 @@
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@
@@ -601,8 +607,13 @@
WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
WAYLAND_LIBS = @WAYLAND_LIBS@
+WAYLAND_PROTOCOLS_CFLAGS = @WAYLAND_PROTOCOLS_CFLAGS@
+WAYLAND_PROTOCOLS_DATADIR = @WAYLAND_PROTOCOLS_DATADIR@
+WAYLAND_PROTOCOLS_LIBS = @WAYLAND_PROTOCOLS_LIBS@
WEBP_CFLAGS = @WEBP_CFLAGS@
WEBP_LIBS = @WEBP_LIBS@
+WEBRTCDSP_CFLAGS = @WEBRTCDSP_CFLAGS@
+WEBRTCDSP_LIBS = @WEBRTCDSP_LIBS@
WGET = @WGET@
WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
WILDMIDI_LIBS = @WILDMIDI_LIBS@
diff --git a/tools/element-templates/sinkpad b/tools/element-templates/sinkpad
index 6d3bad1..ec8a980 100644
--- a/tools/element-templates/sinkpad
+++ b/tools/element-templates/sinkpad
@@ -30,8 +30,8 @@
);
% base-init
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_replace_sink_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_replace_sink_template);
% instance-init
replace->sinkpad = gst_pad_new_from_static_template (&gst_replace_sink_template
diff --git a/tools/element-templates/sinkpad-audio b/tools/element-templates/sinkpad-audio
index 3af5072..13d52d7 100644
--- a/tools/element-templates/sinkpad-audio
+++ b/tools/element-templates/sinkpad-audio
@@ -13,8 +13,8 @@
);
% base-init
- gst_element_class_add_pad_template (GST_ELEMENT_CLASS(klass),
- gst_static_pad_template_get (&gst_replace_sink_template));
+ gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS(klass),
+ &gst_replace_sink_template);
% instance-init
% methods
% end
diff --git a/tools/element-templates/sinkpad-simple b/tools/element-templates/sinkpad-simple
index 2500e3f..9d7619b 100644
--- a/tools/element-templates/sinkpad-simple
+++ b/tools/element-templates/sinkpad-simple
@@ -11,8 +11,8 @@
);
% base-init
- gst_element_class_add_pad_template (GST_ELEMENT_CLASS(klass),
- gst_static_pad_template_get (&gst_replace_sink_template));
+ gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS(klass),
+ &gst_replace_sink_template);
% instance-init
% methods
% end
diff --git a/tools/element-templates/sinkpad-template b/tools/element-templates/sinkpad-template
index 785365d..b06b346 100644
--- a/tools/element-templates/sinkpad-template
+++ b/tools/element-templates/sinkpad-template
@@ -11,8 +11,8 @@
);
% base-init
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_replace_sink_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_replace_sink_template);
% instance-init
% methods
% end
diff --git a/tools/element-templates/srcpad b/tools/element-templates/srcpad
index 1afd7e7..82e0eea 100644
--- a/tools/element-templates/srcpad
+++ b/tools/element-templates/srcpad
@@ -28,8 +28,8 @@
);
% base-init
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_replace_src_template));
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_replace_src_template);
% instance-init
replace->srcpad = gst_pad_new_from_static_template (&gst_replace_src_template
diff --git a/tools/element-templates/srcpad-audio b/tools/element-templates/srcpad-audio
index 047c7c7..18698dd 100644
--- a/tools/element-templates/srcpad-audio
+++ b/tools/element-templates/srcpad-audio
@@ -13,8 +13,8 @@
);
% base-init
- gst_element_class_add_pad_template (GST_ELEMENT_CLASS(klass),
- gst_static_pad_template_get (&gst_replace_src_template));
+ gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS(klass),
+ &gst_replace_src_template);
% instance-init
% methods
% end
diff --git a/tools/element-templates/srcpad-simple b/tools/element-templates/srcpad-simple
index 5971809..e705f80 100644
--- a/tools/element-templates/srcpad-simple
+++ b/tools/element-templates/srcpad-simple
@@ -11,8 +11,8 @@
);
% base-init
- gst_element_class_add_pad_template (GST_ELEMENT_CLASS(klass),
- gst_static_pad_template_get (&gst_replace_src_template));
+ gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS(klass),
+ &gst_replace_src_template);
% instance-init
% methods
% end
diff --git a/tools/element-templates/srcpad-template b/tools/element-templates/srcpad-template
index 020f6a2..dd0842b 100644
--- a/tools/element-templates/srcpad-template
+++ b/tools/element-templates/srcpad-template
@@ -11,8 +11,8 @@
);
% base-init
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_replace_src_template);
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_replace_src_template);
% instance-init
% methods
% end
diff --git a/win32/common/config.h b/win32/common/config.h
index a87558c..20cbc17 100644
--- a/win32/common/config.h
+++ b/win32/common/config.h
@@ -86,7 +86,7 @@
#define GST_PACKAGE_ORIGIN "Unknown package origin"
/* GStreamer package release date/time for plugins as YYYY-MM-DD */
-#define GST_PACKAGE_RELEASE_DATETIME "2016-08-19"
+#define GST_PACKAGE_RELEASE_DATETIME "2016-09-30"
/* Define if static plugins should be built */
#undef GST_PLUGIN_BUILD_STATIC
@@ -226,6 +226,9 @@
/* Define to enable DVB Source (used by dvb). */
#undef HAVE_DVB
+/* Define to 1 if the system has the type `EGLAttrib'. */
+#undef HAVE_EGLATTRIB
+
/* Define to enable building of experimental plug-ins. */
#undef HAVE_EXPERIMENTAL
@@ -244,6 +247,9 @@
/* Define to 1 if you have the <fcntl.h> header file. */
#undef HAVE_FCNTL_H
+/* Define to enable fdkaac plugin (used by fdkaac). */
+#undef HAVE_FDK_AAC
+
/* FIONREAD ioctl found in sys/filio.h */
#undef HAVE_FIONREAD_IN_SYS_FILIO
@@ -325,6 +331,9 @@
/* Define to enable Kate (used by kate). */
#undef HAVE_KATE
+/* Define to enable drm/kms libraries (used by kms). */
+#undef HAVE_KMS
+
/* Define to enable ladspa (used by ladspa). */
#undef HAVE_LADSPA
@@ -352,6 +361,9 @@
/* Define to enable libvisual visualization library (used by libvisual). */
#undef HAVE_LIBVISUAL
+/* Define if we have liblilv >= 0.22 */
+#undef HAVE_LILV_0_22
+
/* Define to enable Linear Systems SDI plugin (used by linsys). */
#undef HAVE_LINSYS
@@ -418,15 +430,9 @@
/* Define to enable opencv plugins (used by opencv). */
#undef HAVE_OPENCV
-/* Define to 1 if you have the <opencv2/contrib/contrib.hpp> header file. */
-#undef HAVE_OPENCV2_CONTRIB_CONTRIB_HPP
-
/* Define to 1 if you have the <opencv2/core/core_c.h> header file. */
#undef HAVE_OPENCV2_CORE_CORE_C_H
-/* Define to 1 if you have the <opencv2/core/types_c.h> header file. */
-#undef HAVE_OPENCV2_CORE_TYPES_C_H
-
/* Define to 1 if you have the <opencv2/core/version.hpp> header file. */
#undef HAVE_OPENCV2_CORE_VERSION_HPP
@@ -439,12 +445,6 @@
/* Define to 1 if you have the <opencv2/imgproc/imgproc.hpp> header file. */
#undef HAVE_OPENCV2_IMGPROC_IMGPROC_HPP
-/* Define to 1 if you have the <opencv2/legacy/compat.hpp> header file. */
-#undef HAVE_OPENCV2_LEGACY_COMPAT_HPP
-
-/* Define to 1 if you have the <opencv2/legacy/legacy.hpp> header file. */
-#undef HAVE_OPENCV2_LEGACY_LEGACY_HPP
-
/* Define to 1 if you have the <opencv2/objdetect/objdetect.hpp> header file.
*/
#undef HAVE_OPENCV2_OBJDETECT_OBJDETECT_HPP
@@ -504,6 +504,9 @@
/* Define to enable Qt elements (used by qt). */
#undef HAVE_QT
+/* Define if building with QTKit */
+#undef HAVE_QTKIT
+
/* Define if Qt eglfs integration is installed */
#undef HAVE_QT_EGLFS
@@ -651,6 +654,9 @@
/* Define to enable WebP (used by webp ). */
#undef HAVE_WEBP
+/* Define to enable WebRTC Audio Processing (used by webrtcdsp). */
+#undef HAVE_WEBRTCDSP
+
/* Define to enable wildmidi midi soft synth plugin (used by wildmidi). */
#undef HAVE_WILDMIDI
@@ -731,7 +737,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.8.3"
+#define PACKAGE_STRING "GStreamer Bad Plug-ins 1.9.90"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "gst-plugins-bad"
@@ -740,7 +746,7 @@
#undef PACKAGE_URL
/* Define to the version of this package. */
-#define PACKAGE_VERSION "1.8.3"
+#define PACKAGE_VERSION "1.9.90"
/* directory where plugins are located */
#ifdef _DEBUG
@@ -784,7 +790,7 @@
#undef USE_EGL_RPI
/* Version number of package */
-#define VERSION "1.8.3"
+#define VERSION "1.9.90"
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
significant byte first (like Motorola and SPARC, unlike Intel). */