summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xautogen.sh4
-rw-r--r--configure.ac133
-rw-r--r--docs/plugins/inspect/plugin-aiff.xml2
-rw-r--r--docs/plugins/inspect/plugin-apexsink.xml2
-rw-r--r--docs/plugins/inspect/plugin-asfmux.xml2
-rw-r--r--docs/plugins/inspect/plugin-camerabin.xml2
-rw-r--r--docs/plugins/inspect/plugin-cdaudio.xml2
-rw-r--r--docs/plugins/inspect/plugin-cdxaparse.xml2
-rw-r--r--docs/plugins/inspect/plugin-chromaprint.xml34
-rw-r--r--docs/plugins/inspect/plugin-cog.xml2
-rw-r--r--docs/plugins/inspect/plugin-coloreffects.xml2
-rw-r--r--docs/plugins/inspect/plugin-colorspace.xml2
-rw-r--r--docs/plugins/inspect/plugin-curl.xml2
-rw-r--r--docs/plugins/inspect/plugin-dc1394.xml2
-rw-r--r--docs/plugins/inspect/plugin-dccp.xml2
-rw-r--r--docs/plugins/inspect/plugin-decklink.xml6
-rw-r--r--docs/plugins/inspect/plugin-dfbvideosink.xml2
-rw-r--r--docs/plugins/inspect/plugin-dirac.xml2
-rw-r--r--docs/plugins/inspect/plugin-dvb.xml2
-rw-r--r--docs/plugins/inspect/plugin-faceoverlay.xml2
-rw-r--r--docs/plugins/inspect/plugin-fbdevsink.xml2
-rw-r--r--docs/plugins/inspect/plugin-festival.xml2
-rw-r--r--docs/plugins/inspect/plugin-fieldanalysis.xml2
-rw-r--r--docs/plugins/inspect/plugin-fragmented.xml6
-rw-r--r--docs/plugins/inspect/plugin-freeverb.xml34
-rw-r--r--docs/plugins/inspect/plugin-freeze.xml2
-rw-r--r--docs/plugins/inspect/plugin-frei0r.xml1983
-rw-r--r--docs/plugins/inspect/plugin-gaudieffects.xml2
-rw-r--r--docs/plugins/inspect/plugin-geometrictransform.xml4
-rw-r--r--docs/plugins/inspect/plugin-gsettings.xml2
-rw-r--r--docs/plugins/inspect/plugin-gstsiren.xml2
-rw-r--r--docs/plugins/inspect/plugin-hdvparse.xml2
-rw-r--r--docs/plugins/inspect/plugin-id3tag.xml2
-rw-r--r--docs/plugins/inspect/plugin-inter.xml32
-rw-r--r--docs/plugins/inspect/plugin-interlace.xml2
-rw-r--r--docs/plugins/inspect/plugin-ivfparse.xml2
-rw-r--r--docs/plugins/inspect/plugin-jp2kdecimator.xml2
-rw-r--r--docs/plugins/inspect/plugin-jpegformat.xml2
-rw-r--r--docs/plugins/inspect/plugin-kate.xml29
-rw-r--r--docs/plugins/inspect/plugin-ladspa.xml8168
-rw-r--r--docs/plugins/inspect/plugin-legacyresample.xml2
-rw-r--r--docs/plugins/inspect/plugin-linsys.xml2
-rw-r--r--docs/plugins/inspect/plugin-liveadder.xml2
-rw-r--r--docs/plugins/inspect/plugin-mimic.xml2
-rw-r--r--docs/plugins/inspect/plugin-mpegpsmux.xml4
-rw-r--r--docs/plugins/inspect/plugin-mpegtsmux.xml4
-rw-r--r--docs/plugins/inspect/plugin-musepack.xml4
-rw-r--r--docs/plugins/inspect/plugin-musicbrainz.xml2
-rw-r--r--docs/plugins/inspect/plugin-mve.xml2
-rw-r--r--docs/plugins/inspect/plugin-mxf.xml2
-rw-r--r--docs/plugins/inspect/plugin-mythtv.xml2
-rw-r--r--docs/plugins/inspect/plugin-neon.xml2
-rw-r--r--docs/plugins/inspect/plugin-nsf.xml2
-rw-r--r--docs/plugins/inspect/plugin-nuvdemux.xml2
-rw-r--r--docs/plugins/inspect/plugin-ofa.xml2
-rw-r--r--docs/plugins/inspect/plugin-patchdetect.xml2
-rw-r--r--docs/plugins/inspect/plugin-pnm.xml2
-rw-r--r--docs/plugins/inspect/plugin-real.xml2
-rw-r--r--docs/plugins/inspect/plugin-removesilence.xml35
-rw-r--r--docs/plugins/inspect/plugin-resindvd.xml2
-rw-r--r--docs/plugins/inspect/plugin-rfbsrc.xml2
-rw-r--r--docs/plugins/inspect/plugin-rsvg.xml2
-rw-r--r--docs/plugins/inspect/plugin-rtmp.xml2
-rw-r--r--docs/plugins/inspect/plugin-sdi.xml2
-rw-r--r--docs/plugins/inspect/plugin-smooth.xml34
-rw-r--r--docs/plugins/inspect/plugin-sndfile.xml2
-rw-r--r--docs/plugins/inspect/plugin-soundtouch.xml2
-rw-r--r--docs/plugins/inspect/plugin-speed.xml2
-rw-r--r--docs/plugins/inspect/plugin-stereo.xml2
-rw-r--r--docs/plugins/inspect/plugin-subenc.xml23
-rw-r--r--docs/plugins/inspect/plugin-tta.xml2
-rw-r--r--docs/plugins/inspect/plugin-vcdsrc.xml2
-rw-r--r--docs/plugins/inspect/plugin-vdpau.xml2
-rw-r--r--docs/plugins/inspect/plugin-videofiltersbad.xml2
-rw-r--r--docs/plugins/inspect/plugin-videomeasure.xml2
-rw-r--r--docs/plugins/inspect/plugin-videosignal.xml2
-rw-r--r--docs/plugins/inspect/plugin-vmnc.xml2
-rw-r--r--docs/plugins/inspect/plugin-wildmidi.xml2
-rw-r--r--docs/plugins/inspect/plugin-xvid.xml4
-rw-r--r--ext/Makefile.am8
-rw-r--r--ext/assrender/gstassrender.c3
-rw-r--r--ext/celt/gstceltdec.c4
-rw-r--r--ext/cog/gstcogcolorspace.c2
-rw-r--r--ext/curl/gstcurlsink.c2
-rw-r--r--ext/directfb/dfbvideosink.c2
-rw-r--r--ext/dts/gstdtsdec.c32
-rw-r--r--ext/dts/gstdtsdec.h2
-rw-r--r--ext/faad/gstfaad.c2
-rw-r--r--ext/flite/gstflite.c3
-rw-r--r--ext/flite/gstflitetestsrc.c3
-rw-r--r--ext/gme/gstgme.c4
-rw-r--r--ext/gsettings/gstgsettingsaudiosink.c5
-rw-r--r--ext/gsettings/gstgsettingsaudiosrc.c4
-rw-r--r--ext/gsettings/gstgsettingsvideosink.c4
-rw-r--r--ext/gsettings/gstgsettingsvideosrc.c4
-rw-r--r--ext/modplug/gstmodplug.cc19
-rw-r--r--ext/musepack/gstmusepackdec.c4
-rw-r--r--ext/openal/gstopenalsink.c4
-rw-r--r--ext/opencv/MotionCells.cpp7
-rw-r--r--ext/opencv/MotionCells.h5
-rw-r--r--ext/opencv/gstfaceblur.c3
-rw-r--r--ext/opencv/gstfacedetect.c172
-rw-r--r--ext/opencv/gstopencvutils.c4
-rw-r--r--ext/opencv/gstopencvvideofilter.c2
-rw-r--r--ext/opencv/gsttemplatematch.h7
-rw-r--r--ext/opencv/motioncells_wrapper.cpp7
-rw-r--r--ext/opus/gstopusenc.c83
-rw-r--r--ext/resindvd/resindvdsrc.c58
-rw-r--r--ext/rsvg/gstrsvgoverlay.c13
-rw-r--r--ext/timidity/gstwildmidi.c4
-rw-r--r--ext/vp8/gstvp8enc.c2
-rw-r--r--ext/wayland/Makefile.am13
-rw-r--r--ext/wayland/gstwaylandsink.c681
-rw-r--r--ext/wayland/gstwaylandsink.h131
-rw-r--r--gst-libs/gst/codecparsers/gsth264parser.c13
-rw-r--r--gst-libs/gst/codecparsers/gsth264parser.h3
-rw-r--r--gst-libs/gst/codecparsers/gstmpeg4parser.c4
-rw-r--r--gst-libs/gst/codecparsers/gstmpegvideoparser.c18
-rw-r--r--gst-libs/gst/codecparsers/gstvc1parser.c2
-rw-r--r--gst-libs/gst/video/gstbasevideocodec.c21
-rw-r--r--gst-libs/gst/video/gstbasevideocodec.h52
-rw-r--r--gst-libs/gst/video/gstbasevideodecoder.c22
-rw-r--r--gst-libs/gst/video/gstbasevideodecoder.h5
-rw-r--r--gst-libs/gst/video/gstbasevideoencoder.c17
-rw-r--r--gst-libs/gst/video/gstbasevideoencoder.h9
-rw-r--r--gst/adpcmdec/Makefile.am5
-rw-r--r--gst/aiff/aiffmux.c33
-rw-r--r--gst/audiovisualizers/README7
-rw-r--r--gst/audiovisualizers/gstbaseaudiovisualizer.c2
-rw-r--r--gst/camerabin2/gstwrappercamerabinsrc.c12
-rw-r--r--gst/dccp/gstdccp.c11
-rw-r--r--gst/faceoverlay/gstfaceoverlay.c358
-rw-r--r--gst/faceoverlay/gstfaceoverlay.h9
-rw-r--r--gst/geometrictransform/gstgeometrictransform.c18
-rw-r--r--gst/hls/gsthlsdemux.c13
-rw-r--r--gst/hls/m3u8.c58
-rw-r--r--gst/hls/m3u8.h4
-rw-r--r--gst/inter/gstinteraudiosink.c46
-rw-r--r--gst/inter/gstinteraudiosink.h1
-rw-r--r--gst/inter/gstinteraudiosrc.c100
-rw-r--r--gst/inter/gstinteraudiosrc.h1
-rw-r--r--gst/inter/gstintersubsink.c45
-rw-r--r--gst/inter/gstintersubsink.h1
-rw-r--r--gst/inter/gstintersubsrc.c51
-rw-r--r--gst/inter/gstintersubsrc.h1
-rw-r--r--gst/inter/gstintertest.c14
-rw-r--r--gst/inter/gstintervideosink.c21
-rw-r--r--gst/inter/gstintervideosrc.c33
-rw-r--r--gst/jp2kdecimator/jp2kcodestream.c18
-rw-r--r--gst/mpegdemux/flutspmtinfo.c4
-rw-r--r--gst/mpegdemux/flutspmtstreaminfo.c4
-rw-r--r--gst/mpegdemux/gstmpegdemux.c2
-rw-r--r--gst/mpegdemux/gstmpegtsdemux.c6
-rw-r--r--gst/mpegdemux/mpegtspacketizer.c4
-rw-r--r--gst/mpegdemux/mpegtsparse.c2
-rw-r--r--gst/mpegtsdemux/Makefile.am2
-rw-r--r--gst/mpegtsdemux/TODO114
-rw-r--r--gst/mpegtsdemux/gstmpegdefs.h2
-rw-r--r--gst/mpegtsdemux/gstmpegdesc.h193
-rw-r--r--gst/mpegtsdemux/mpegtsbase.c287
-rw-r--r--gst/mpegtsdemux/mpegtsbase.h19
-rw-r--r--gst/mpegtsdemux/mpegtspacketizer.c538
-rw-r--r--gst/mpegtsdemux/mpegtspacketizer.h48
-rw-r--r--gst/mpegtsdemux/payload_parsers.c313
-rw-r--r--gst/mpegtsdemux/payload_parsers.h36
-rw-r--r--gst/mpegtsdemux/tsdemux.c1429
-rw-r--r--gst/mpegtsdemux/tsdemux.h29
-rw-r--r--gst/mxf/mxfdemux.c2
-rw-r--r--gst/mxf/mxfmpeg.c24
-rw-r--r--gst/removesilence/vad_private.c2
-rw-r--r--gst/rtpvp8/gstrtpvp8depay.c4
-rw-r--r--gst/rtpvp8/gstrtpvp8pay.c2
-rw-r--r--gst/siren/Makefile.am2
-rw-r--r--gst/siren/gstsirendec.c223
-rw-r--r--gst/siren/gstsirendec.h12
-rw-r--r--gst/siren/gstsirenenc.c198
-rw-r--r--gst/siren/gstsirenenc.h12
-rw-r--r--gst/videoparsers/gsth263parse.c7
-rw-r--r--gst/videoparsers/gsth264parse.c20
-rw-r--r--gst/videoparsers/gstmpegvideoparse.c4
-rw-r--r--sys/Makefile.am84
-rw-r--r--sys/d3dvideosink/Makefile.am4
-rw-r--r--sys/d3dvideosink/d3dvideosink.c86
-rw-r--r--sys/d3dvideosink/directx/d3d.h6
-rw-r--r--sys/d3dvideosink/directx/dx.h2
-rw-r--r--sys/decklink/Makefile.am30
-rw-r--r--sys/decklink/capture.cpp13
-rw-r--r--sys/decklink/gstdecklink.cpp86
-rw-r--r--sys/decklink/gstdecklink.h29
-rw-r--r--sys/decklink/gstdecklinksink.cpp262
-rw-r--r--sys/decklink/gstdecklinksink.h1
-rw-r--r--sys/decklink/gstdecklinksrc.cpp352
-rw-r--r--sys/decklink/gstdecklinksrc.h2
-rw-r--r--sys/decklink/osx/DeckLinkAPI.h695
-rw-r--r--sys/decklink/osx/DeckLinkAPIConfiguration.h167
-rw-r--r--sys/decklink/osx/DeckLinkAPIDeckControl.h206
-rw-r--r--sys/decklink/osx/DeckLinkAPIDiscovery.h62
-rw-r--r--sys/decklink/osx/DeckLinkAPIDispatch-osx.cpp178
-rw-r--r--sys/decklink/osx/DeckLinkAPIModes.h155
-rw-r--r--sys/decklink/osx/DeckLinkAPIStreaming.h366
-rw-r--r--sys/decklink/osx/DeckLinkAPITypes.h89
-rw-r--r--sys/decklink/osx/DeckLinkAPIVersion.h37
-rw-r--r--sys/dvb/camutils.c4
-rw-r--r--sys/dvb/gstdvbsrc.c4
-rw-r--r--sys/shm/gstshmsink.c14
-rw-r--r--sys/shm/gstshmsrc.c18
-rw-r--r--sys/vdpau/gstvdp/gstvdpbufferpool.c3
-rw-r--r--sys/vdpau/gstvdp/gstvdpdevice.c4
-rw-r--r--sys/vdpau/gstvdp/gstvdpoutputbufferpool.c26
-rw-r--r--sys/vdpau/gstvdp/gstvdpoutputbufferpool.h26
-rw-r--r--sys/vdpau/gstvdp/gstvdpvideobufferpool.c26
-rw-r--r--sys/vdpau/gstvdp/gstvdpvideobufferpool.h26
-rw-r--r--sys/vdpau/gstvdpsink.c4
-rw-r--r--sys/vdpau/h264/gstvdph264dec.c18
-rw-r--r--sys/vdpau/mpeg/gstvdpmpegdec.c8
-rw-r--r--sys/winscreencap/Makefile.am15
-rw-r--r--sys/winscreencap/gstdx9screencapsrc.c31
-rw-r--r--sys/winscreencap/gstgdiscreencapsrc.c19
-rw-r--r--tests/check/elements/.gitignore1
-rw-r--r--tests/check/libs/.gitignore1
-rw-r--r--tests/examples/scaletempo/demo-gui.c4
-rw-r--r--tools/element-templates/basesrc16
-rw-r--r--tools/element-templates/element12
-rw-r--r--tools/element-templates/sinkpad-template19
-rw-r--r--tools/element-templates/sinkpad-template-video33
-rw-r--r--tools/element-templates/srcpad-template19
-rw-r--r--tools/element-templates/srcpad-template-video33
-rw-r--r--tools/element-templates/videofilter78
228 files changed, 8578 insertions, 11334 deletions
diff --git a/autogen.sh b/autogen.sh
index 8a56c7acc..a7f26dfe2 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -29,6 +29,10 @@ then
ln -s ../../common/hooks/pre-commit.hook .git/hooks/pre-commit
fi
+# GNU gettext automake support doesn't get along with git.
+# https://bugzilla.gnome.org/show_bug.cgi?id=661128
+touch -t 200001010000 po/$package-0.10.pot
+
CONFIGURE_DEF_OPT='--enable-maintainer-mode --enable-gtk-doc'
autogen_options $@
diff --git a/configure.ac b/configure.ac
index d86ca235c..a0b33f5b2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -41,6 +41,14 @@ dnl we override it here if we need to for the release candidate of new series
GST_MAJORMINOR=0.11
AC_SUBST(GST_MAJORMINOR)
+dnl CURRENT, REVISION, AGE
+dnl - library source changed -> increment REVISION
+dnl - interfaces added/removed/changed -> increment CURRENT, REVISION = 0
+dnl - interfaces added -> increment AGE
+dnl - interfaces removed -> AGE = 0
+dnl sets GST_LT_LDFLAGS
+AS_LIBTOOL(GST, 24, 0, 0)
+
AG_GST_LIBTOOL_PREPARE
dnl FIXME: this macro doesn't actually work;
@@ -52,8 +60,13 @@ AC_LIBTOOL_WIN32_DLL
AM_PROG_LIBTOOL
dnl *** required versions of GStreamer stuff ***
+<<<<<<< HEAD
GST_REQ=0.11.3
GSTPB_REQ=0.11.3
+=======
+GST_REQ=0.10.36
+GSTPB_REQ=0.10.36
+>>>>>>> origin/0.10
dnl *** autotools stuff ****
@@ -437,19 +450,14 @@ AG_GST_CHECK_FEATURE(DIRECTSOUND, [DirectSound], directsoundsrc, [
LDFLAGS="$LDFLAGS $DIRECTX_LDFLAGS"
LIBS="$LIBS -ldsound -ldxerr9 -luser32"
AC_MSG_CHECKING(for DirectSound LDFLAGS)
- AC_LINK_IFELSE([
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <windows.h>
#include <dxerr9.h>
#include <dsound.h>
-
-int main ()
-{
+]], [[
DXGetErrorString9 (0);
DirectSoundCreate(NULL, NULL, NULL);
-
- return 0;
-}
-],
+]])],
[HAVE_DIRECTSOUND="yes"],
[HAVE_DIRECTSOUND="no"])
AC_MSG_RESULT($HAVE_DIRECTSOUND)
@@ -478,17 +486,12 @@ AG_GST_CHECK_FEATURE(DIRECT3D, [Direct3D plug-in], direct3dsink, [
LDFLAGS="$LDFLAGS $DIRECTX_LDFLAGS"
LIBS="$LIBS -ld3d9 -lgdi32"
AC_MSG_CHECKING(for Direct3D LDFLAGS)
- AC_LINK_IFELSE([
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <windows.h>
#include <d3d9.h>
-
-int main ()
-{
+]], [[
Direct3DCreate9(D3D_SDK_VERSION);
-
- return 0;
-}
-],
+]])],
[HAVE_DIRECT3D="yes"],
[HAVE_DIRECT3D="no"])
AC_MSG_RESULT($HAVE_DIRECT3D)
@@ -514,18 +517,13 @@ AG_GST_CHECK_FEATURE(DIRECTDRAW, [DirectDraw plug-in], directdrawsink, [
LDFLAGS="$LDFLAGS $DIRECTX_LDFLAGS"
LIBS="$LIBS -lddraw -lgdi32"
AC_MSG_CHECKING(for DirectDraw LDFLAGS)
- AC_LINK_IFELSE([
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <windows.h>
#include <ddraw.h>
-
-int main ()
-{
+]], [[
GetStockObject(0);
DirectDrawCreate(NULL, NULL, NULL);
-
- return 0;
-}
-],
+]])],
[HAVE_DIRECTDRAW="yes"],
[HAVE_DIRECTDRAW="no"])
AC_MSG_RESULT($HAVE_DIRECTDRAW)
@@ -543,6 +541,36 @@ int main ()
AC_SUBST(HAVE_DIRECTDRAW)
])
+dnl Direct3D9
+AM_CONDITIONAL(USE_DIRECT3D9, true)
+AG_GST_CHECK_FEATURE(DIRECT3D9, [Direct3D9], winscreencap, [
+ HAVE_DIRECT3D="no"
+
+ save_LIBS="$LIBS"
+
+ LIBS="$LIBS -ld3d9 -lgdi32"
+ AC_MSG_CHECKING(for Direct3D9 LDFLAGS)
+
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#include <windows.h>
+#include <d3d9.h>
+]], [[
+ Direct3DCreate9(D3D_SDK_VERSION);
+]])],
+ [HAVE_DIRECT3D9="yes"],
+ [HAVE_DIRECT3D9="no"])
+ AC_MSG_RESULT($HAVE_DIRECT3D9)
+
+ LIBS=$save_LIBS
+
+ if test "x$HAVE_DIRECT3D9" = "xyes"; then
+
+ DIRECT3D9_LIBS="-ld3d9 -lgdi32"
+ AC_SUBST(DIRECT3D9_LIBS)
+ fi
+ AC_SUBST(HAVE_DIRECT3D9)
+])
+
dnl *** AppleMedia (OS X and iOS) ***
translit(dnm, m, l) AM_CONDITIONAL(USE_APPLE_MEDIA, true)
HAVE_APPLE_MEDIA="no"
@@ -811,11 +839,23 @@ AG_GST_CHECK_FEATURE(DECKLINK, [decklink], decklink, [
])
fi
;;
+ *-*darwin*)
+ if test "x$HAVE_PTHREAD_H" = "xyes"; then
+ AC_CHECK_LIB(dl, dlopen,
+ [
+ HAVE_DECKLINK=yes
+ DECKLINK_CXXFLAGS=
+ DECKLINK_LIBS="-lpthread -ldl"
+ HAVE_DECKLINK_OSX=yes
+ ])
+ fi
+ ;;
*)
HAVE_DECKLINK=no
;;
esac
+ AM_CONDITIONAL(DECKLINK_OSX, test "x$HAVE_DECKLINK_OSX" = xyes)
AC_SUBST(DECKLINK_CXXFLAGS)
AC_SUBST(DECKLINK_LIBS)
])
@@ -828,6 +868,31 @@ AG_GST_CHECK_FEATURE(DIRECTFB, [directfb], dfbvideosink , [
])
])
+dnl **** Wayland ****
+translit(dnm, m, l) AM_CONDITIONAL(USE_WAYLAND, true)
+AG_GST_CHECK_FEATURE(WAYLAND, [wayland sink], wayland , [
+ PKG_CHECK_MODULES(WAYLAND, wayland-client >= 0.1, [
+ AC_CHECK_HEADER(wayland-client.h, HAVE_WAYLAND_CLIENT="yes", HAVE_WAYLAND_CLIENT="no")
+ AC_CHECK_HEADER(wayland-client-protocol.h, HAVE_WAYLAND_CLIENT_PROTOCOL="yes", HAVE_WAYLAND_CLIENT_PROTOCOL="no")
+ if test "x$HAVE_WAYLAND_CLIENT" = "xno"; then
+ AC_MSG_RESULT(wayland-client.h could not be found.)
+ HAVE_WAYLAND="no"
+ elif test "x$HAVE_WAYLAND_CLIENT_PROTOCOL" = "xno"; then
+ AC_MSG_RESULT(wayland-client-protocol.h could not be found.)
+ HAVE_WAYLAND="no"
+ else
+ HAVE_WAYLAND="yes"
+ WAYLAND_LIBS="-lwayland-client"
+ fi
+ ], [
+ AC_MSG_RESULT(no wayland.)
+ HAVE_WAYLAND="no"
+ ])
+WAYLAND_CFLAGS=""
+AC_SUBST(WAYLAND_CFLAGS)
+AC_SUBST(WAYLAND_LIBS)
+])
+
dnl **** Dirac ****
translit(dnm, m, l) AM_CONDITIONAL(USE_DIRAC, true)
AG_GST_CHECK_FEATURE(DIRAC, [dirac], dirac, [
@@ -1392,22 +1457,22 @@ AG_GST_CHECK_FEATURE(OPENCV, [opencv plugins], opencv, [
AC_LANG_CPLUSPLUS
OLD_CPPFLAGS=$CPPFLAGS
CPPFLAGS=$OPENCV_CFLAGS
- AC_CHECK_HEADER(highgui.h, HAVE_HIGHGUI="yes", HAVE_HIGHGUI="no")
- AC_CHECK_HEADER(cvaux.h, HAVE_CVAUX="yes", HAVE_CVAUX="no")
+ AC_CHECK_HEADERS([highgui.h opencv2/highgui/highgui_c.h])
CPPFLAGS=$OLD_CPPFLAGS
AC_LANG_C
- if test "x$HAVE_HIGHGUI" = "xno"; then
- AC_MSG_RESULT(highgui.h could not be found.)
- HAVE_OPENCV="no"
- elif test "x$HAVE_CVAUX" = "xno"; then
- AC_MSG_RESULT(cvaux.h could not be found.)
- HAVE_OPENCV="no"
- else
+
+ if test $ac_cv_header_highgui_h = "yes" -o $ac_cv_header_opencv2_highgui_highgui_c_h = "yes" ; then
HAVE_OPENCV="yes"
+ else
+ AC_MSG_RESULT([neither highgui.h nor opencv2/highgui/highgui_c.h could not be found])
+ HAVE_OPENCV="no"
fi
], [
HAVE_OPENCV="no"
])
+ OPENCV_PREFIX="`$PKG_CONFIG --variable=prefix opencv`"
+ AC_DEFINE_UNQUOTED(OPENCV_PREFIX, "$OPENCV_PREFIX", [opencv install prefix])
+ AC_SUBST(OPENCV_PREFIX)
AC_SUBST(OPENCV_CFLAGS)
AC_SUBST(OPENCV_LIBS)
])
@@ -1804,6 +1869,7 @@ AM_CONDITIONAL(USE_CURL, false)
AM_CONDITIONAL(USE_DC1394, false)
AM_CONDITIONAL(USE_DECKLINK, false)
AM_CONDITIONAL(USE_DIRECTFB, false)
+AM_CONDITIONAL(USE_WAYLAND, false)
AM_CONDITIONAL(USE_DIRAC, false)
AM_CONDITIONAL(USE_DTS, false)
AM_CONDITIONAL(USE_DIVX, false)
@@ -2059,6 +2125,7 @@ ext/curl/Makefile
ext/dc1394/Makefile
ext/dirac/Makefile
ext/directfb/Makefile
+ext/wayland/Makefile
ext/divx/Makefile
ext/dts/Makefile
ext/faac/Makefile
diff --git a/docs/plugins/inspect/plugin-aiff.xml b/docs/plugins/inspect/plugin-aiff.xml
index e31c7d971..b6ed5362f 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-apexsink.xml b/docs/plugins/inspect/plugin-apexsink.xml
index 2af03ecc1..ae6e639bc 100644
--- a/docs/plugins/inspect/plugin-apexsink.xml
+++ b/docs/plugins/inspect/plugin-apexsink.xml
@@ -3,7 +3,7 @@
<description>Apple AirPort Express Plugin</description>
<filename>../../ext/apexsink/.libs/libgstapexsink.so</filename>
<basename>libgstapexsink.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-asfmux.xml b/docs/plugins/inspect/plugin-asfmux.xml
index 5fd612979..20f137b21 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-camerabin.xml b/docs/plugins/inspect/plugin-camerabin.xml
index 4dd64ab3a..b9d6b0e52 100644
--- a/docs/plugins/inspect/plugin-camerabin.xml
+++ b/docs/plugins/inspect/plugin-camerabin.xml
@@ -3,7 +3,7 @@
<description>High level api for DC (Digital Camera) application</description>
<filename>../../gst/camerabin/.libs/libgstcamerabin.so</filename>
<basename>libgstcamerabin.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-cdaudio.xml b/docs/plugins/inspect/plugin-cdaudio.xml
index 1b4e2d565..0bb15d0f3 100644
--- a/docs/plugins/inspect/plugin-cdaudio.xml
+++ b/docs/plugins/inspect/plugin-cdaudio.xml
@@ -3,7 +3,7 @@
<description>Play CD audio through the CD Drive</description>
<filename>../../ext/cdaudio/.libs/libgstcdaudio.so</filename>
<basename>libgstcdaudio.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-cdxaparse.xml b/docs/plugins/inspect/plugin-cdxaparse.xml
index a0443a5af..f87074409 100644
--- a/docs/plugins/inspect/plugin-cdxaparse.xml
+++ b/docs/plugins/inspect/plugin-cdxaparse.xml
@@ -3,7 +3,7 @@
<description>Parse a .dat file (VCD) into raw mpeg1</description>
<filename>../../gst/cdxaparse/.libs/libgstcdxaparse.so</filename>
<basename>libgstcdxaparse.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-chromaprint.xml b/docs/plugins/inspect/plugin-chromaprint.xml
new file mode 100644
index 000000000..0e88b0a04
--- /dev/null
+++ b/docs/plugins/inspect/plugin-chromaprint.xml
@@ -0,0 +1,34 @@
+<plugin>
+ <name>chromaprint</name>
+ <description>Calculate Chromaprint fingerprint from audio files</description>
+ <filename>../../ext/chromaprint/.libs/libgstchromaprint.so</filename>
+ <basename>libgstchromaprint.so</basename>
+ <version>0.10.23.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>chromaprint</name>
+ <longname>Chromaprint fingerprinting element</longname>
+ <class>Filter/Analyzer/Audio</class>
+ <description>Find an audio fingerprint using the Chromaprint library</description>
+ <author>Lukáš Lalinský &lt;lalinsky@gmail.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int){ 1234 }, width=(int){ 16 }, depth=(int){ 16 }, signed=(boolean)true</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int){ 1234 }, width=(int){ 16 }, depth=(int){ 16 }, signed=(boolean)true</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin> \ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-cog.xml b/docs/plugins/inspect/plugin-cog.xml
index 51bbcd37b..7b613c53c 100644
--- a/docs/plugins/inspect/plugin-cog.xml
+++ b/docs/plugins/inspect/plugin-cog.xml
@@ -3,7 +3,7 @@
<description>Cog plugin</description>
<filename>../../ext/cog/.libs/libgstcog.so</filename>
<basename>libgstcog.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-coloreffects.xml b/docs/plugins/inspect/plugin-coloreffects.xml
index 7d2d235cc..e7291b411 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-colorspace.xml b/docs/plugins/inspect/plugin-colorspace.xml
index a5cf26c21..55b0b136b 100644
--- a/docs/plugins/inspect/plugin-colorspace.xml
+++ b/docs/plugins/inspect/plugin-colorspace.xml
@@ -3,7 +3,7 @@
<description>Colorspace conversion</description>
<filename>../../gst/colorspace/.libs/libgstcolorspace.so</filename>
<basename>libgstcolorspace.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package></package>
diff --git a/docs/plugins/inspect/plugin-curl.xml b/docs/plugins/inspect/plugin-curl.xml
index 4074b87cb..4d315bd6c 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-dc1394.xml b/docs/plugins/inspect/plugin-dc1394.xml
index 425a6237d..e9988675b 100644
--- a/docs/plugins/inspect/plugin-dc1394.xml
+++ b/docs/plugins/inspect/plugin-dc1394.xml
@@ -3,7 +3,7 @@
<description>1394 IIDC Video Source</description>
<filename>../../ext/dc1394/.libs/libgstdc1394.so</filename>
<basename>libgstdc1394.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-dccp.xml b/docs/plugins/inspect/plugin-dccp.xml
index 8beb7089d..5d9181add 100644
--- a/docs/plugins/inspect/plugin-dccp.xml
+++ b/docs/plugins/inspect/plugin-dccp.xml
@@ -3,7 +3,7 @@
<description>transfer data over the network via DCCP.</description>
<filename>../../gst/dccp/.libs/libgstdccp.so</filename>
<basename>libgstdccp.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>DCCP</package>
diff --git a/docs/plugins/inspect/plugin-decklink.xml b/docs/plugins/inspect/plugin-decklink.xml
index a72e85079..d04375f70 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins</package>
@@ -26,7 +26,7 @@
<name>videosink</name>
<direction>sink</direction>
<presence>always</presence>
- <details>video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)486, framerate=(fraction)30000/1001, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)486, framerate=(fraction)24000/1001, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)576, framerate=(fraction)25/1, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)486, framerate=(fraction)30000/1001, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)576, framerate=(fraction)25/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)24000/1001, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)24/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)25/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30000/1001, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)25/1, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30000/1001, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)50/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)60000/1001, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)60/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)50/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)60000/1001, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)60/1, interlaced=(boolean)false</details>
+ <details>video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)720, height=(int)486, framerate=(fraction)30000/1001, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)720, height=(int)486, framerate=(fraction)24000/1001, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)720, height=(int)576, framerate=(fraction)25/1, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)720, height=(int)486, framerate=(fraction)30000/1001, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)720, height=(int)576, framerate=(fraction)25/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)24000/1001, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)24/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)25/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)30000/1001, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)25/1, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)30000/1001, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)50/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)60000/1001, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)60/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1280, height=(int)720, framerate=(fraction)50/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1280, height=(int)720, framerate=(fraction)60000/1001, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1280, height=(int)720, framerate=(fraction)60/1, interlaced=(boolean)false</details>
</caps>
</pads>
</element>
@@ -47,7 +47,7 @@
<name>videosrc</name>
<direction>source</direction>
<presence>always</presence>
- <details>video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)486, framerate=(fraction)30000/1001, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)10/11, color-matrix=(string)sdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)486, framerate=(fraction)24000/1001, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)10/11, color-matrix=(string)sdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)576, framerate=(fraction)25/1, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)sdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)486, framerate=(fraction)30000/1001, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)10/11, color-matrix=(string)sdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)576, framerate=(fraction)25/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)sdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)24000/1001, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)24/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)25/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30000/1001, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)25/1, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30000/1001, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)50/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30000/1001, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)60/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)50/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)60000/1001, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)60/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2</details>
+ <details>video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)486, framerate=(fraction)30000/1001, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)10/11, color-matrix=(string)sdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)486, framerate=(fraction)24000/1001, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)10/11, color-matrix=(string)sdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)576, framerate=(fraction)25/1, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)sdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)486, framerate=(fraction)30000/1001, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)10/11, color-matrix=(string)sdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)576, framerate=(fraction)25/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)sdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)24000/1001, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)24/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)25/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30000/1001, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)25/1, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30000/1001, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)50/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30000/1001, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)60/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)50/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)60000/1001, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)60/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2</details>
</caps>
</pads>
</element>
diff --git a/docs/plugins/inspect/plugin-dfbvideosink.xml b/docs/plugins/inspect/plugin-dfbvideosink.xml
index 1469567b6..d9451a4ba 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-dirac.xml b/docs/plugins/inspect/plugin-dirac.xml
index 6df76dcde..8918e7907 100644
--- a/docs/plugins/inspect/plugin-dirac.xml
+++ b/docs/plugins/inspect/plugin-dirac.xml
@@ -3,7 +3,7 @@
<description>Dirac plugin</description>
<filename>../../ext/dirac/.libs/libgstdirac.so</filename>
<basename>libgstdirac.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-dvb.xml b/docs/plugins/inspect/plugin-dvb.xml
index 3f74b7a03..42788ff09 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-faceoverlay.xml b/docs/plugins/inspect/plugin-faceoverlay.xml
index cab7839ae..970bf2fc3 100644
--- a/docs/plugins/inspect/plugin-faceoverlay.xml
+++ b/docs/plugins/inspect/plugin-faceoverlay.xml
@@ -3,7 +3,7 @@
<description>SVG Face Overlay</description>
<filename>../../gst/faceoverlay/.libs/libgstfaceoverlay.so</filename>
<basename>libgstfaceoverlay.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer</package>
diff --git a/docs/plugins/inspect/plugin-fbdevsink.xml b/docs/plugins/inspect/plugin-fbdevsink.xml
index 6544ef5e0..09db197f3 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-festival.xml b/docs/plugins/inspect/plugin-festival.xml
index f793f1315..d3d21ffdf 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-fieldanalysis.xml b/docs/plugins/inspect/plugin-fieldanalysis.xml
index 185a18881..27a32cb04 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer</package>
diff --git a/docs/plugins/inspect/plugin-fragmented.xml b/docs/plugins/inspect/plugin-fragmented.xml
index 1103511e7..62650d67d 100644
--- a/docs/plugins/inspect/plugin-fragmented.xml
+++ b/docs/plugins/inspect/plugin-fragmented.xml
@@ -3,7 +3,7 @@
<description>Fragmented streaming plugins</description>
<filename>../../gst/hls/.libs/libgstfragmented.so</filename>
<basename>libgstfragmented.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins</package>
@@ -24,9 +24,9 @@ Andoni Morales Alastruey &lt;ylatuya@gmail.com&gt;</author>
<details>application/x-hls</details>
</caps>
<caps>
- <name>src</name>
+ <name>src%d</name>
<direction>source</direction>
- <presence>always</presence>
+ <presence>sometimes</presence>
<details>ANY</details>
</caps>
</pads>
diff --git a/docs/plugins/inspect/plugin-freeverb.xml b/docs/plugins/inspect/plugin-freeverb.xml
new file mode 100644
index 000000000..e96a89265
--- /dev/null
+++ b/docs/plugins/inspect/plugin-freeverb.xml
@@ -0,0 +1,34 @@
+<plugin>
+ <name>freeverb</name>
+ <description>Reverberation/room effect</description>
+ <filename>../../gst/freeverb/.libs/libgstfreeverb.so</filename>
+ <basename>libgstfreeverb.so</basename>
+ <version>0.10.23.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>freeverb</name>
+ <longname>Stereo positioning</longname>
+ <class>Filter/Effect/Audio</class>
+ <description>Reverberation/room effect</description>
+ <author>Stefan Sauer &lt;ensonic@users.sf.net&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)32; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)2, endianness=(int)1234, width=(int)32; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)2, endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin> \ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-freeze.xml b/docs/plugins/inspect/plugin-freeze.xml
index 0028326f5..eaab6ab4f 100644
--- a/docs/plugins/inspect/plugin-freeze.xml
+++ b/docs/plugins/inspect/plugin-freeze.xml
@@ -3,7 +3,7 @@
<description>Stream freezer</description>
<filename>../../gst/freeze/.libs/libgstfreeze.so</filename>
<basename>libgstfreeze.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-frei0r.xml b/docs/plugins/inspect/plugin-frei0r.xml
index ca9f6fe57..ab8fbfadc 100644
--- a/docs/plugins/inspect/plugin-frei0r.xml
+++ b/docs/plugins/inspect/plugin-frei0r.xml
@@ -3,11 +3,1992 @@
<description>frei0r plugin library</description>
<filename>../../gst/frei0r/.libs/libgstfrei0r.so</filename>
<basename>libgstfrei0r.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.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>frei0r-filter-3-point-color-balance</name>
+ <longname>3 point color balance</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Adjust color balance with 3 color points</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Maksim Golovkin</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-3dflippo</name>
+ <longname>3dflippo</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Frame rotation in 3d-space</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, c.e. prelz AS FLUIDO &lt;fluido@fluido.as&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-b</name>
+ <longname>B</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Extracts Blue from Image</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Richard Spindler</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-baltan</name>
+ <longname>Baltan</longname>
+ <class>Filter/Effect/Video</class>
+ <description>delayed alpha smoothed blit of time</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Kentaro, Jaromil</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-bluescreen0r</name>
+ <longname>bluescreen0r</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Color to alpha (blit SRCALPHA)</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Hedde Bosman</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-brightness</name>
+ <longname>Brightness</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Adjusts the brightness of a source image</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-bw0r</name>
+ <longname>bw0r</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Turns image black/white.</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, coma@gephex.org</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-cartoon</name>
+ <longname>Cartoon</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Cartoonify video, do a form of edge detect</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Dries Pruimboom, Jaromil</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-color-distance</name>
+ <longname>Color Distance</longname>
+ <class>Filter/Effect/Video</class>
+ <description></description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Richard Spindler</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-contrast0r</name>
+ <longname>Contrast0r</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Adjusts the contrast of a source image</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-curves</name>
+ <longname>Curves</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Adjust luminance or color channel intensity with curve level mapping</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Maksim Golovkin</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-dealygrab</name>
+ <longname>Dealygrab</longname>
+ <class>Filter/Effect/Video</class>
+ <description>delayed frame blitting mapped on a time bitmap</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Bill Spinhover, Andreas Schiffler, Jaromil</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-delay0r</name>
+ <longname>delay0r</longname>
+ <class>Filter/Effect/Video</class>
+ <description>video delay</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Martin Bayer</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-distort0r</name>
+ <longname>Distort0r</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Plasma</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Gephex crew</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-edgeglow</name>
+ <longname>Edgeglow</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Edgeglow filter</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Salsaman</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-equaliz0r</name>
+ <longname>Equaliz0r</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Equalizes the intensity histograms</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal (Drone)</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-flippo</name>
+ <longname>Flippo</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Flipping in x and y axis</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Carlo Emilio, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-g</name>
+ <longname>G</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Extracts Green from Image</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Richard Spindler</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-gamma</name>
+ <longname>Gamma</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Adjusts the gamma value of a source image</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-glow</name>
+ <longname>Glow</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Creates a Glamorous Glow</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Richard Spindler</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-hueshift0r</name>
+ <longname>Hueshift0r</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Shifts the hue of a source image</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-invert0r</name>
+ <longname>Invert0r</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Inverts all colors of a source image</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Gephex crew</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-k-means-clustering</name>
+ <longname>K-Means Clustering</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Clusters of a source image by color and spatial distance</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, binarymillenium</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-lens-correction</name>
+ <longname>Lens Correction</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Allows compensation of lens distortion</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Richard Spindler</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-letterb0xed</name>
+ <longname>LetterB0xed</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Adds Black Borders at top and bottom for Cinema Look</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Richard Spindler</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-levels</name>
+ <longname>Levels</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Adjust luminance or color channel intensity</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Maksim Golovkin</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-luminance</name>
+ <longname>Luminance</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Creates a luminance map of the image</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Richard Spindler</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-mask0mate</name>
+ <longname>Mask0Mate</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Creates an square alpha-channel mask</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Richard Spindler</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-nervous</name>
+ <longname>Nervous</longname>
+ <class>Filter/Effect/Video</class>
+ <description>flushes frames in time in a nervous way</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Tannenbaum, Kentaro, Jaromil</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-nosync0r</name>
+ <longname>nosync0r</longname>
+ <class>Filter/Effect/Video</class>
+ <description>broken tv</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Martin Bayer</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-opencvfacedetect</name>
+ <longname>opencvfacedetect</longname>
+ <class>Filter/Effect/Video</class>
+ <description>detect faces</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, binarymillenium</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-perspective</name>
+ <longname>Perspective</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Distorts the image for a pseudo perspective</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Richard Spindler</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-pixeliz0r</name>
+ <longname>pixeliz0r</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Pixelize input image.</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Gephex crew</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-primaries</name>
+ <longname>primaries</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Reduce image to primary colors</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Hedde Bosman</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-r</name>
+ <longname>R</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Extracts Red from Image</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Richard Spindler</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-rgb-parade</name>
+ <longname>RGB-Parade</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Displays a histogram of R, G and B of the video-data</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Albert Frisch</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-saturat0r</name>
+ <longname>Saturat0r</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Adjusts the saturation of a source image</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-scale0tilt</name>
+ <longname>Scale0Tilt</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Scales, Tilts and Crops an Image</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Richard Spindler</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-scanline0r</name>
+ <longname>scanline0r</longname>
+ <class>Filter/Effect/Video</class>
+ <description>interlaced blak lines</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Martin Bayer</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-sobel</name>
+ <longname>Sobel</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Sobel filter</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal (Drone)</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-squareblur</name>
+ <longname>Squareblur</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Variable-size square blur</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Drone</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-tehroxx0r</name>
+ <longname>TehRoxx0r</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Something videowall-ish</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Coma</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-threelay0r</name>
+ <longname>threelay0r</longname>
+ <class>Filter/Effect/Video</class>
+ <description>dynamic 3 level thresholding</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Hedde Bosman</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-threshold0r</name>
+ <longname>Threshold0r</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Thresholds a source image</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-tint0r</name>
+ <longname>Tint0r</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Tint a source image with specified color</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Maksim Golovkin</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-transparency</name>
+ <longname>Transparency</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Tunes the alpha channel.</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Richard Spindler</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-twolay0r</name>
+ <longname>Twolay0r</longname>
+ <class>Filter/Effect/Video</class>
+ <description>dynamic thresholding</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Martin Bayer</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-vectorscope</name>
+ <longname>Vectorscope</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Displays the vectorscope of the video-data</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Albert Frisch</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-vertigo</name>
+ <longname>Vertigo</longname>
+ <class>Filter/Effect/Video</class>
+ <description>alpha blending with zoomed and rotated images</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Fukuchi Kentarou</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-water</name>
+ <longname>Water</longname>
+ <class>Filter/Effect/Video</class>
+ <description>water drops on a video surface</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jaromil</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-filter-white-balance</name>
+ <longname>White Balance</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Adjust the white balance / color temperature</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Dan Dennedy</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-addition</name>
+ <longname>addition</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Perform an RGB[A] addition operation of the pixel sources.</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-alpha-injection</name>
+ <longname>Alpha Injection</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Averages Input 1 and uses this as Alpha Channel on Input 2</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Richard Spindler</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-alphaatop</name>
+ <longname>alphaatop</longname>
+ <class>Filter/Editor/Video</class>
+ <description>the alpha ATOP operation</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-alphain</name>
+ <longname>alphain</longname>
+ <class>Filter/Editor/Video</class>
+ <description>the alpha IN operation</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-alphaout</name>
+ <longname>alphaout</longname>
+ <class>Filter/Editor/Video</class>
+ <description>the alpha OUT operation</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-alphaover</name>
+ <longname>alphaover</longname>
+ <class>Filter/Editor/Video</class>
+ <description>the alpha OVER operation</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-alphaxor</name>
+ <longname>alphaxor</longname>
+ <class>Filter/Editor/Video</class>
+ <description>the alpha XOR operation</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-blend</name>
+ <longname>blend</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Perform a blend operation between two sources</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-burn</name>
+ <longname>burn</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Perform an RGB[A] dodge operation between the pixel sources, using the generalised algorithm:
+D = saturation of 255 or depletion of 0, of ((255 - A) * 256) / (B + 1)</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-color-only</name>
+ <longname>color_only</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Perform a conversion to color only of the source input1 using the hue and saturation values of input2.</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-composition</name>
+ <longname>Composition</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Composites Image 2 onto Image 1 according to its Alpha Channel</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Richard Spindler</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-darken</name>
+ <longname>darken</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Perform a darken operation between two sources (minimum value of both sources).</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-difference</name>
+ <longname>difference</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Perform an RGB[A] difference operation between the pixel sources.</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-divide</name>
+ <longname>divide</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Perform an RGB[A] divide operation between the pixel sources: input1 is the numerator, input2 the denominator</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-dodge</name>
+ <longname>dodge</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Perform an RGB[A] dodge operation between the pixel sources, using the generalised algorithm:
+D = saturation of 255 or (A * 256) / (256 - B)</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-grain-extract</name>
+ <longname>grain_extract</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Perform an RGB[A] grain-extract operation between the pixel sources.</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-grain-merge</name>
+ <longname>grain_merge</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Perform an RGB[A] grain-merge operation between the pixel sources.</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-hardlight</name>
+ <longname>hardlight</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Perform an RGB[A] hardlight operation between the pixel sources</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-hue</name>
+ <longname>hue</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Perform a conversion to hue only of the source input1 using the hue of input2.</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-lighten</name>
+ <longname>lighten</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Perform a lighten operation between two sources (maximum value of both sources).</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-multiply</name>
+ <longname>multiply</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Perform an RGB[A] multiply operation between the pixel sources.</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-overlay</name>
+ <longname>overlay</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Perform an RGB[A] overlay operation between the pixel sources, using the generalised algorithm:
+D = A * (B + (2 * B) * (255 - A))</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-rgb</name>
+ <longname>RGB</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Averages each Input and uses each as R, G or B channel of the Output</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Richard Spindler</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_2</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-saturation</name>
+ <longname>saturation</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Perform a conversion to saturation only of the source input1 using the saturation level of input2.</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-screen</name>
+ <longname>screen</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Perform an RGB[A] screen operation between the pixel sources, using the generalised algorithm:
+D = 255 - (255 - A) * (255 - B)</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-softlight</name>
+ <longname>softlight</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Perform an RGB[A] softlight operation between the pixel sources.</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-subtract</name>
+ <longname>subtract</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Perform an RGB[A] subtract operation of the pixel source input2 from input1.</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-uv-map</name>
+ <longname>UV Map</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Uses Input 1 as UV Map to distort Input 2</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Richard Spindler</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-value</name>
+ <longname>value</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Perform a conversion to value only of the source input1 using the value of input2.</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jean-Sebastien Senecal</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-mixer-xfade0r</name>
+ <longname>xfade0r</longname>
+ <class>Filter/Editor/Video</class>
+ <description>a simple xfader</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Martin Bayer</author>
+ <pads>
+ <caps>
+ <name>sink_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>sink_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, 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-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-src-ising0r</name>
+ <longname>Ising0r</longname>
+ <class>Src/Video</class>
+ <description>Generates ising noise</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Gephex crew</author>
+ <pads>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-src-lissajous0r</name>
+ <longname>Lissajous0r</longname>
+ <class>Src/Video</class>
+ <description>Generates Lissajous0r images</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Martin Bayer</author>
+ <pads>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-src-nois0r</name>
+ <longname>Nois0r</longname>
+ <class>Src/Video</class>
+ <description>Generates white noise images</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Martin Bayer</author>
+ <pads>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-src-onecol0r</name>
+ <longname>onecol0r</longname>
+ <class>Src/Video</class>
+ <description>image with just one color</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Martin Bayer</author>
+ <pads>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-src-partik0l</name>
+ <longname>Partik0l</longname>
+ <class>Src/Video</class>
+ <description>Particles generated on prime number sinusoidal blossoming</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jaromil</author>
+ <pads>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>frei0r-src-plasma</name>
+ <longname>Plasma</longname>
+ <class>Src/Video</class>
+ <description>Demo scene 8bit plasma</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;, Jaromil</author>
+ <pads>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, 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-gaudieffects.xml b/docs/plugins/inspect/plugin-gaudieffects.xml
index a46a4965f..c458ac8b2 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer</package>
diff --git a/docs/plugins/inspect/plugin-geometrictransform.xml b/docs/plugins/inspect/plugin-geometrictransform.xml
index 17528fc7f..f5e532028 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
@@ -181,7 +181,7 @@
<name>rotate</name>
<longname>rotate</longname>
<class>Transform/Effect/Video</class>
- <description>Warps the picture into an arc shaped form</description>
+ <description>Rotates the picture by an arbitrary angle</description>
<author>Thiago Santos&lt;thiago.sousa.santos@collabora.co.uk&gt;</author>
<pads>
<caps>
diff --git a/docs/plugins/inspect/plugin-gsettings.xml b/docs/plugins/inspect/plugin-gsettings.xml
index a80d9b1bf..472fa4b49 100644
--- a/docs/plugins/inspect/plugin-gsettings.xml
+++ b/docs/plugins/inspect/plugin-gsettings.xml
@@ -3,7 +3,7 @@
<description>GSettings plugin</description>
<filename>../../ext/gsettings/.libs/libgstgsettingselements.so</filename>
<basename>libgstgsettingselements.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-gstsiren.xml b/docs/plugins/inspect/plugin-gstsiren.xml
index 95b17fdb9..2548297c0 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-hdvparse.xml b/docs/plugins/inspect/plugin-hdvparse.xml
index ade21ad22..bfd251a5f 100644
--- a/docs/plugins/inspect/plugin-hdvparse.xml
+++ b/docs/plugins/inspect/plugin-hdvparse.xml
@@ -3,7 +3,7 @@
<description>HDV private stream parser</description>
<filename>../../gst/hdvparse/.libs/libgsthdvparse.so</filename>
<basename>libgsthdvparse.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer</package>
diff --git a/docs/plugins/inspect/plugin-id3tag.xml b/docs/plugins/inspect/plugin-id3tag.xml
index 33f65587a..45f5cff73 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-inter.xml b/docs/plugins/inspect/plugin-inter.xml
index ce764a22b..4883ad632 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins</package>
@@ -40,6 +40,36 @@
</pads>
</element>
<element>
+ <name>intersubsink</name>
+ <longname>FIXME Long name</longname>
+ <class>Generic</class>
+ <description>FIXME Description</description>
+ <author>FIXME &lt;fixme@example.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>text/plain</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>intersubsrc</name>
+ <longname>Inter-pipeline subtitle source</longname>
+ <class>Source/Subtitle</class>
+ <description>Inter-pipeline subtitle source</description>
+ <author>David Schleef &lt;ds@entropywave.com&gt;</author>
+ <pads>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>application/unknown</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
<name>intervideosink</name>
<longname>FIXME Long name</longname>
<class>Generic</class>
diff --git a/docs/plugins/inspect/plugin-interlace.xml b/docs/plugins/inspect/plugin-interlace.xml
index caa1efeb7..ae157e818 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-ivfparse.xml b/docs/plugins/inspect/plugin-ivfparse.xml
index a524b5e01..8004f2026 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-jp2kdecimator.xml b/docs/plugins/inspect/plugin-jp2kdecimator.xml
index b1fbd20d9..805a1d91c 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-jpegformat.xml b/docs/plugins/inspect/plugin-jpegformat.xml
index e99567331..b893f8135 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-kate.xml b/docs/plugins/inspect/plugin-kate.xml
index 1ff9aabbf..288b52f5d 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
@@ -93,5 +93,32 @@
</caps>
</pads>
</element>
+ <element>
+ <name>tiger</name>
+ <longname>Kate stream renderer</longname>
+ <class>Mixer/Video/Overlay/Subtitle</class>
+ <description>Decodes and renders Kate streams on top of a video</description>
+ <author>Vincent Penquerc&apos;h &lt;ogg.k.ogg.k@googlemail.com&gt;</author>
+ <pads>
+ <caps>
+ <name>subtitle_sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>subtitle/x-kate; application/x-kate</details>
+ </caps>
+ <caps>
+ <name>video_sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc){ I420, YV12, AYUV, YUY2, UYVY, v308, v210, v216, Y41B, Y42B, Y444, Y800, Y16 , NV12, NV21, UYVP, A420, YUV9, IYU1 }, 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-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc){ I420, YV12, AYUV, YUY2, UYVY, v308, v210, v216, Y41B, Y42B, Y444, Y800, Y16 , NV12, NV21, UYVP, A420, YUV9, IYU1 }, 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 1863ee22c..a8225e047 100644
--- a/docs/plugins/inspect/plugin-ladspa.xml
+++ b/docs/plugins/inspect/plugin-ladspa.xml
@@ -3,1471 +3,13 @@
<description>All LADSPA plugins</description>
<filename>../../ext/ladspa/.libs/libgstladspa.so</filename>
<basename>libgstladspa.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.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>ladspa-AWfilt</name>
- <longname>A-weighting filter</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>A-weighting filter</description>
- <author>Fons Adriaensen &lt;fons.adriaensen@skynet.be&gt;</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Accumulate</name>
- <longname>spectral accumulator</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>spectral accumulator</description>
- <author>Richard Dobson, Trevor Wishart, Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Ambisonics-11-cube-decoder</name>
- <longname>AMB order 1,1 cube decoder</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>AMB order 1,1 cube decoder</description>
- <author>Fons Adriaensen &lt;fons@kokkinizita.net&gt;</author>
- <pads>
- <caps>
- <name>In-W</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-X</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-Y</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-Z</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-DLB</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-DLF</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-DRB</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-DRF</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-ULB</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-ULF</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-URB</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-URF</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Ambisonics-11-hexagon-decoder</name>
- <longname>AMB order 1,1 hexagon decoder</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>AMB order 1,1 hexagon decoder</description>
- <author>Fons Adriaensen &lt;fons@kokkinizita.net&gt;</author>
- <pads>
- <caps>
- <name>In-W</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-X</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-Y</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-Z</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-L-LF</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-LB-LB</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-LF-F</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-R-RB</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-RB-B</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-RF-RF</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Ambisonics-11-mono-panner</name>
- <longname>AMB order 1,1 mono panner</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>AMB order 1,1 mono panner</description>
- <author>Fons Adriaensen &lt;fons@kokkinizita.net&gt;</author>
- <pads>
- <caps>
- <name>In</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-W</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-X</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Y</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Z</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Ambisonics-11-rotator</name>
- <longname>AMB order 1,1 rotator</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>AMB order 1,1 rotator</description>
- <author>Fons Adriaensen &lt;fons@kokkinizita.net&gt;</author>
- <pads>
- <caps>
- <name>In-W</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-X</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-Y</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-Z</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-W</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-X</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Y</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Z</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Ambisonics-11-square-decoder</name>
- <longname>AMB order 1,1 square decoder</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>AMB order 1,1 square decoder</description>
- <author>Fons Adriaensen &lt;fons@kokkinizita.net&gt;</author>
- <pads>
- <caps>
- <name>In-W</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-X</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-Y</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-Z</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-LB-L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-LF-F</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-RB-B</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-RF-R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Ambisonics-11-stereo-panner</name>
- <longname>AMB order 1,1 stereo panner</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>AMB order 1,1 stereo panner</description>
- <author>Fons Adriaensen &lt;fons@kokkinizita.net&gt;</author>
- <pads>
- <caps>
- <name>In-L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-W</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-X</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Y</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Z</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Ambisonics-21-panner</name>
- <longname>AMB order 2,1 panner</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>AMB order 2,1 panner</description>
- <author>Fons Adriaensen &lt;fons@kokkinizita.net&gt;</author>
- <pads>
- <caps>
- <name>In</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-U</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-V</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-W</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-X</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Y</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Z</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Ambisonics-21-rotator</name>
- <longname>AMB order 2,1 rotator</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>AMB order 2,1 rotator</description>
- <author>Fons Adriaensen &lt;fons@kokkinizita.net&gt;</author>
- <pads>
- <caps>
- <name>In-U</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-V</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-W</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-X</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-Y</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-Z</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-U</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-V</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-W</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-X</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Y</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Z</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Ambisonics-22-panner</name>
- <longname>AMB order 2,2 panner</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>AMB order 2,2 panner</description>
- <author>Fons Adriaensen &lt;fons@kokkinizita.net&gt;</author>
- <pads>
- <caps>
- <name>In</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-S</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-T</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-U</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-V</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-W</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-X</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Y</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Z</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Ambisonics-22-rotator</name>
- <longname>AMB order 2,2 rotator</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>AMB order 2,2 rotator</description>
- <author>Fons Adriaensen &lt;fons@kokkinizita.net&gt;</author>
- <pads>
- <caps>
- <name>In-R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-S</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-T</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-U</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-V</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-W</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-X</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-Y</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-Z</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-S</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-T</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-U</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-V</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-W</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-X</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Y</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Z</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Ambisonics-31-panner</name>
- <longname>AMB order 3,1 panner</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>AMB order 3,1 panner</description>
- <author>Joern Nettingsmeier &lt;nettings@stackingdwarves.net&gt;</author>
- <pads>
- <caps>
- <name>In</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>OUT-P</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>OUT-Q</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-U</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-V</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-W</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-X</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Y</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Z</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Ambisonics-31-rotator</name>
- <longname>AMB order 3,1 rotator</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>AMB order 3,1 rotator</description>
- <author>Joern Nettingsmeier &lt;nettings@stackingdwarves.net&gt;</author>
- <pads>
- <caps>
- <name>In-P</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-Q</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-U</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-V</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-W</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-X</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-Y</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-Z</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-P</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Q</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-U</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-V</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-W</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-X</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Y</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Z</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Ambisonics-33-panner</name>
- <longname>AMB order 3,3 panner</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>AMB order 3,3 panner</description>
- <author>Joern Nettingsmeier &lt;nettings@stackingdwarves.net&gt;</author>
- <pads>
- <caps>
- <name>In</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-K</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-M</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-N</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-O</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-P</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Q</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-S</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-T</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-U</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-V</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-W</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-X</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Y</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Z</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Ambisonics-33-rotator</name>
- <longname>AMB order 3,3 rotator</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>AMB order 3,3 rotator</description>
- <author>Joern Nettingsmeier &lt;nettings@stackingdwarves.net&gt;</author>
- <pads>
- <caps>
- <name>In-K</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-M</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-N</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-O</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-P</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-Q</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-S</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-T</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-U</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-V</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-W</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-X</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-Y</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-Z</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-K</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-M</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-N</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-O</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-P</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Q</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-S</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-T</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-U</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-V</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-W</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-X</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Y</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Z</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-AmpIII</name>
- <longname>C* AmpIII - Tube amp</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* AmpIII - Tube amp</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-AmpIV</name>
- <longname>C* AmpIV - Tube amp + tone controls</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* AmpIV - Tube amp + tone controls</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-AmpV</name>
- <longname>C* AmpV - Tube amp</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* AmpV - Tube amp</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-AmpVTS</name>
- <longname>C* AmpVTS - Tube amp + Tone stack</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* AmpVTS - Tube amp + Tone stack</description>
- <author>David Yeh &lt;dtyeh@ccrma.stanford.edu&gt; &amp; Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-AutoWah</name>
- <longname>C* AutoWah - Resonant envelope-following filter</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* AutoWah - Resonant envelope-following filter</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-BassEnhancer</name>
- <longname>Calf Bass Enhancer LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf Bass Enhancer LADSPA</description>
- <author>Markus Schmidt / Krzysztof Foltman</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-BoosterM</name>
- <longname>Clipping Booster (mono)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Clipping Booster (mono)</description>
- <author>Artemiy Pavlov</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-BoosterS</name>
- <longname>Clipping Booster (stereo)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Clipping Booster (stereo)</description>
- <author>Artemiy Pavlov</author>
- <pads>
- <caps>
- <name>Input_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-CEO</name>
- <longname>C* CEO - Chief Executive Oscillator</longname>
- <class>Source/Audio/LADSPA</class>
- <description>C* CEO - Chief Executive Oscillator</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-CVFreq</name>
- <longname>CV to Frequency convertor</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>CV to Frequency convertor</description>
- <author>Joost Yervante Damad</author>
- <pads>
- <caps>
- <name>Freq_-CV-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Freq_-Hz-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-CabinetI</name>
- <longname>C* CabinetI - Loudspeaker cabinet emulation</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* CabinetI - Loudspeaker cabinet emulation</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-CabinetII</name>
- <longname>C* CabinetII - Refined loudspeaker cabinet emulation</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* CabinetII - Refined loudspeaker cabinet emulation</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-Chorus1</name>
<longname>Chorus1 - Based on CSound orchestra by Sean Costello</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -1489,39 +31,6 @@
</pads>
</element>
<element>
- <name>ladspa-Chorus1-2x2</name>
- <longname>LEET Chorus1_2x2 - 2x2 by Dan Lyons - Based on MCP Chorus by F. Adriaensen</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>LEET Chorus1_2x2 - 2x2 by Dan Lyons - Based on MCP Chorus by F. Adriaensen</description>
- <author>Dan Lyons &lt;socal_dan2000@yahoo.com&gt;</author>
- <pads>
- <caps>
- <name>Input_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-Chorus2</name>
<longname>Chorus2 - Based on CSound orchestra by Sean Costello</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -1543,492 +52,6 @@
</pads>
</element>
<element>
- <name>ladspa-ChorusI</name>
- <longname>C* ChorusI - Mono chorus/flanger</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* ChorusI - Mono chorus/flanger</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-ChorusII</name>
- <longname>C* ChorusII - Mono chorus/flanger modulated by a fractal</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* ChorusII - Mono chorus/flanger modulated by a fractal</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Click</name>
- <longname>C* Click - Metronome</longname>
- <class>Source/Audio/LADSPA</class>
- <description>C* Click - Metronome</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Clip</name>
- <longname>C* Clip - Hard clipper, 8x oversampled</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* Clip - Hard clipper, 8x oversampled</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Compress</name>
- <longname>C* Compress - Mono compressor</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* Compress - Mono compressor</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;, Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Compressor</name>
- <longname>Calf Compressor LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf Compressor LADSPA</description>
- <author>Thor Harald Johansen</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Deesser</name>
- <longname>Calf Deesser LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf Deesser LADSPA</description>
- <author>Markus Schmidt / Thor Harald Johansen</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Dirac</name>
- <longname>C* Dirac - One-sample impulse generator</longname>
- <class>Source/Audio/LADSPA</class>
- <description>C* Dirac - One-sample impulse generator</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Eq</name>
- <longname>C* Eq - 10-band equalizer</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* Eq - 10-band equalizer</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Eq2x2</name>
- <longname>C* Eq2x2 - stereo 10-band equalizer</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* Eq2x2 - stereo 10-band equalizer</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in-l</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>in-r</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out-l</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out-r</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Equalizer12Band</name>
- <longname>Calf Equalizer 12 Band LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf Equalizer 12 Band LADSPA</description>
- <author>Markus Schmidt</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Equalizer5Band</name>
- <longname>Calf Equalizer 5 Band LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf Equalizer 5 Band LADSPA</description>
- <author>Markus Schmidt</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Equalizer8Band</name>
- <longname>Calf Equalizer 8 Band LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf Equalizer 8 Band LADSPA</description>
- <author>Markus Schmidt</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Exaggerate</name>
- <longname>spectral exaggerator</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>spectral exaggerator</description>
- <author>Richard Dobson, Trevor Wishart, Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Exciter</name>
- <longname>Calf Exciter LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf Exciter LADSPA</description>
- <author>Markus Schmidt / Krzysztof Foltman</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Filter</name>
- <longname>Calf Filter LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf Filter LADSPA</description>
- <author>Krzysztof Foltman</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Filterclavier</name>
- <longname>Calf Filterclavier LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf Filterclavier LADSPA</description>
- <author>Krzysztof Foltman / Hans Baier</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Flanger</name>
- <longname>Calf Flanger LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf Flanger LADSPA</description>
- <author>Krzysztof Foltman</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-G2reverb</name>
<longname>Stereo reverb</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -2062,246 +85,6 @@
</pads>
</element>
<element>
- <name>ladspa-Gate</name>
- <longname>Calf Gate LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf Gate LADSPA</description>
- <author>Damien Zammit / Thor Harald Johansen</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-HRTF</name>
- <longname>C* HRTF - Head-related transfer function at elevation 0</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* HRTF - Head-related transfer function at elevation 0</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out-l</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out-r</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-JVRev</name>
- <longname>C* JVRev - Stanford-style reverb from STK</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* JVRev - Stanford-style reverb from STK</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out-l</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out-r</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Lorenz</name>
- <longname>C* Lorenz - The sound of a Lorenz attractor</longname>
- <class>Source/Audio/LADSPA</class>
- <description>C* Lorenz - The sound of a Lorenz attractor</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-MUSIC</name>
- <longname>MUSIC channel</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>MUSIC channel</description>
- <author>Joost Yervante Damad</author>
- <pads>
- <caps>
- <name>Freq_-Hz-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Gate</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-MUSICDrum</name>
- <longname>MUSIC Drum instruments</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>MUSIC Drum instruments</description>
- <author>Joost Yervante Damad</author>
- <pads>
- <caps>
- <name>Gate_Bass_Drum</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Gate_High-Hat</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Gate_Snare_Drum</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Gate_Tom-Tom</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Gate_Top_Cymbal</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-MultiChorus</name>
- <longname>Calf MultiChorus LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf MultiChorus LADSPA</description>
- <author>Krzysztof Foltman</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Multibandcompressor</name>
- <longname>Calf Multiband Compressor LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf Multiband Compressor LADSPA</description>
- <author>Markus Schmidt / Thor Harald Johansen</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-Mvchpf-1</name>
<longname>Mvchpf-1 Digital implementation of the VC HP filter invented by R.A. Moog</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -2491,168 +274,6 @@
</pads>
</element>
<element>
- <name>ladspa-NoisifierM</name>
- <longname>Noisifier (mono)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Noisifier (mono)</description>
- <author>Artemiy Pavlov</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-NoisifierS</name>
- <longname>Noisifier (stereo)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Noisifier (stereo)</description>
- <author>Artemiy Pavlov</author>
- <pads>
- <caps>
- <name>Input_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-PSG</name>
- <longname>PSG channel</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>PSG channel</description>
- <author>Joost Yervante Damad</author>
- <pads>
- <caps>
- <name>Freq_-Hz-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Gate</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Pan</name>
- <longname>C* Pan - Pan and width</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* Pan - Pan and width</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out-l</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out-r</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Parametric1</name>
- <longname>4-band parametric filter</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>4-band parametric filter</description>
- <author>Fons Adriaensen &lt;fons@kokkinizita.net&gt;</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Phaser</name>
- <longname>Calf Phaser LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf Phaser LADSPA</description>
- <author>Krzysztof Foltman</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-Phaser1</name>
<longname>Phaser1 - Similar to CSound&apos;s phaser1 by Sean Costello</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -2713,972 +334,6 @@
</pads>
</element>
<element>
- <name>ladspa-PhaserI</name>
- <longname>C* PhaserI - Mono phaser</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* PhaserI - Mono phaser</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-PhaserII</name>
- <longname>C* PhaserII - Mono phaser modulated by a Lorenz fractal</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* PhaserII - Mono phaser modulated by a Lorenz fractal</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Plate</name>
- <longname>C* Plate - Versatile plate reverb</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* Plate - Versatile plate reverb</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out-l</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out-r</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Plate2x2</name>
- <longname>C* Plate2x2 - Versatile plate reverb, stereo inputs</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* Plate2x2 - Versatile plate reverb, stereo inputs</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in-l</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>in-r</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out-l</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out-r</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-PreampIII</name>
- <longname>C* PreampIII - Tube preamp emulation</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* PreampIII - Tube preamp emulation</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-PreampIV</name>
- <longname>C* PreampIV - Tube preamp emulation + tone controls</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* PreampIV - Tube preamp emulation + tone controls</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Pulsator</name>
- <longname>Calf Pulsator LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf Pulsator LADSPA</description>
- <author>Markus Schmidt</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Pulse-VCO</name>
- <longname>Pulse-VCO -- Anti-aliased oscillator</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Pulse-VCO -- Anti-aliased oscillator</description>
- <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
- <pads>
- <caps>
- <name>Exp_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Lin_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Rec-VCO</name>
- <longname>Rec-VCO -- Anti-aliased oscillator</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Rec-VCO -- Anti-aliased oscillator</description>
- <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
- <pads>
- <caps>
- <name>Exp_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Lin_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Mod</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Sync</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Reverb</name>
- <longname>Calf Reverb LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf Reverb LADSPA</description>
- <author>Krzysztof Foltman</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Roessler</name>
- <longname>C* Roessler - The sound of a Roessler attractor</longname>
- <class>Source/Audio/LADSPA</class>
- <description>C* Roessler - The sound of a Roessler attractor</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-RotarySpeaker</name>
- <longname>Calf Rotary Speaker LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf Rotary Speaker LADSPA</description>
- <author>Krzysztof Foltman</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-SCC</name>
- <longname>SCC channel</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>SCC channel</description>
- <author>Joost Yervante Damad</author>
- <pads>
- <caps>
- <name>Freq_-Hz-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-SID</name>
- <longname>SID chip</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>SID chip</description>
- <author>Joost Yervante Damad</author>
- <pads>
- <caps>
- <name>Freq_-Hz-_1</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Freq_-Hz-_2</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Freq_-Hz-_3</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Gate_1</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Gate_2</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Gate_3</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Saturator</name>
- <longname>Calf Saturator LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf Saturator LADSPA</description>
- <author>Markus Schmidt / Krzysztof Foltman</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Saw-VCO</name>
- <longname>Saw-VCO -- Anti-aliased oscillator</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Saw-VCO -- Anti-aliased oscillator</description>
- <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
- <pads>
- <caps>
- <name>Exp_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Lin_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Sync</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Scape</name>
- <longname>C* Scape - Stereo delay + Filters</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* Scape - Stereo delay + Filters</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out-l</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out-r</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Sidechaincompressor</name>
- <longname>Calf Sidechain Compressor LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf Sidechain Compressor LADSPA</description>
- <author>Markus Schmidt / Thor Harald Johansen</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Sidechaingate</name>
- <longname>Calf Sidechain Gate LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf Sidechain Gate LADSPA</description>
- <author>Markus Schmidt / Damien Zammit / Thor Harald Johansen</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Sin</name>
- <longname>C* Sin - Sine wave generator</longname>
- <class>Source/Audio/LADSPA</class>
- <description>C* Sin - Sine wave generator</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-SooperLooper</name>
- <longname>SooperLooper</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>SooperLooper</description>
- <author>Jesse Chappell</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-StereoChorusI</name>
- <longname>C* StereoChorusI - Stereo chorus/flanger</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* StereoChorusI - Stereo chorus/flanger</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out-l</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out-r</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-StereoChorusII</name>
- <longname>C* StereoChorusII - Stereo chorus/flanger modulated by a fractal</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* StereoChorusII - Stereo chorus/flanger modulated by a fractal</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out-l</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out-r</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-SweepVFI</name>
- <longname>C* SweepVFI - Resonant filter swept by a Lorenz fractal</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* SweepVFI - Resonant filter swept by a Lorenz fractal</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-SweepVFII</name>
- <longname>C* SweepVFII - Resonant filter, f and Q swept by a Lorenz fractal</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* SweepVFII - Resonant filter, f and Q swept by a Lorenz fractal</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Sync-Rect-VCO</name>
- <longname>Sync-Rect-VCO -- Hard-sync-capable anti-aliased oscillator</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Sync-Rect-VCO -- Hard-sync-capable anti-aliased oscillator</description>
- <author>Sean Bolton &lt;musound AT jps DOT net&gt;</author>
- <pads>
- <caps>
- <name>Exp_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Lin_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Sync_In</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Wave_Mod</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Sync_Out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Sync-Saw-VCO</name>
- <longname>Sync-Saw-VCO -- Hard-sync-capable anti-aliased oscillator</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Sync-Saw-VCO -- Hard-sync-capable anti-aliased oscillator</description>
- <author>Sean Bolton &lt;musound AT jps DOT net&gt;</author>
- <pads>
- <caps>
- <name>Exp_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Lin_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Sync_In</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Sync_Out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Sync-Tri-VCO</name>
- <longname>Sync-Tri-VCO -- Hard-sync-capable anti-aliased oscillator</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Sync-Tri-VCO -- Hard-sync-capable anti-aliased oscillator</description>
- <author>Sean Bolton &lt;musound AT jps DOT net&gt;</author>
- <pads>
- <caps>
- <name>Exp_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Lin_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Sync_In</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Wave_Mod</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Sync_Out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-ToneStack</name>
- <longname>C* ToneStack - Tone stack emulation</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* ToneStack - Tone stack emulation</description>
- <author>David Yeh &lt;dtyeh@ccrma.stanford.edu&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-ToneStackLT</name>
- <longname>C* ToneStackLT - Tone stack emulation, lattice filter 44.1</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>C* ToneStackLT - Tone stack emulation, lattice filter 44.1</description>
- <author>David Yeh &lt;dtyeh@ccrma.stanford.edu&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Transpose</name>
- <longname>phase-vocoder based pitch shifter</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>phase-vocoder based pitch shifter</description>
- <author>Richard Dobson, Trevor Wishart, Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Tricardioid-to-AMB</name>
- <longname>Three cardioids to AMB matrix</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Three cardioids to AMB matrix</description>
- <author>Fons Adriaensen &lt;fons@kokkinizita.net&gt;</author>
- <pads>
- <caps>
- <name>In-B</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-W</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-X</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Y</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-Z</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-TripleChorus</name>
<longname>Triple chorus</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -3712,327 +367,6 @@
</pads>
</element>
<element>
- <name>ladspa-VCOd</name>
- <longname>C* VCOd - Double VCO with detune and hard sync options</longname>
- <class>Source/Audio/LADSPA</class>
- <description>C* VCOd - Double VCO with detune and hard sync options</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-VCOs</name>
- <longname>C* VCOs - Virtual &apos;analogue&apos; oscillator</longname>
- <class>Source/Audio/LADSPA</class>
- <description>C* VCOs - Virtual &apos;analogue&apos; oscillator</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-VariNoiseM</name>
- <longname>Variable Noise (mono)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Variable Noise (mono)</description>
- <author>Artemiy Pavlov</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-VariNoiseS</name>
- <longname>Variable Noise (stereo)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Variable Noise (stereo)</description>
- <author>Artemiy Pavlov</author>
- <pads>
- <caps>
- <name>Output_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-VintageDelay</name>
- <longname>Calf Vintage Delay LADSPA</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Calf Vintage Delay LADSPA</description>
- <author>Krzysztof Foltman</author>
- <pads>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Virtualmic</name>
- <longname>Virtual stereo microphone</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Virtual stereo microphone</description>
- <author>Fons Adriaensen &lt;fons@kokkinizita.net&gt;</author>
- <pads>
- <caps>
- <name>In-W</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-X</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-Y</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In-Z</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out-R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-White</name>
- <longname>C* White - White noise generator</longname>
- <class>Source/Audio/LADSPA</class>
- <description>C* White - White noise generator</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-XShaperM</name>
- <longname>X-Shaper (mono)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>X-Shaper (mono)</description>
- <author>Artemiy Pavlov</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-XShaperS</name>
- <longname>X-Shaper (stereo)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>X-Shaper (stereo)</description>
- <author>Artemiy Pavlov</author>
- <pads>
- <caps>
- <name>Input_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-adenv</name>
- <longname>Percussive AD Envelope</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Percussive AD Envelope</description>
- <author>Loki Davison &lt;ltdav1[at]student.monash.edu.au&gt;</author>
- <pads>
- <caps>
- <name>Gate</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Trigger</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Envelope_Out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-adenv-lvl</name>
- <longname>Percussive AD Envelope with levels</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Percussive AD Envelope with levels</description>
- <author>Loki Davison &lt;ltdav1[at]student.monash.edu.au&gt;</author>
- <pads>
- <caps>
- <name>Gate</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Reset_Level</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Trigger</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Envelope_Out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-adsr</name>
- <longname>ADSR Envelope</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>ADSR Envelope</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Driving_Signal</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Envelope_Out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-adsr-g+t</name>
- <longname>ADSR Envelope with Gate and Trigger</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>ADSR Envelope with Gate and Trigger</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Gate</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Trigger</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Envelope_Out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-alias</name>
<longname>Aliasing</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -4054,60 +388,6 @@
</pads>
</element>
<element>
- <name>ladspa-alienwah-mono</name>
- <longname>AlienWah for mono</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>AlienWah for mono</description>
- <author>Plugin: Paul&lt;set@pobox.com&gt; Effect: Nasca O. Paul&lt;paulnasca@yahoo.com&gt;</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-alienwah-stereo</name>
- <longname>AlienWah for stereo</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>AlienWah for stereo</description>
- <author>Plugin: Paul&lt;set@pobox.com&gt; Effect: Nasca O. Paul&lt;paulnasca@yahoo.com&gt;</author>
- <pads>
- <caps>
- <name>Input1</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input2</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output1</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output2</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-allpass-c</name>
<longname>Allpass delay line, cubic spline interpolation</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -4171,33 +451,6 @@
</pads>
</element>
<element>
- <name>ladspa-am</name>
- <longname>Amplitude Modulator</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Amplitude Modulator</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input_1</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_2</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-amPitchshift</name>
<longname>AM pitchshifter</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -4240,59 +493,11 @@
</pads>
</element>
<element>
- <name>ladspa-amp-gaia-oa</name>
- <longname>Amplifier (GAIA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Amplifier (GAIA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Gain_-dB-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-amp-gcia-oa</name>
- <longname>Amplifier (GCIA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Amplifier (GCIA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-amp-mono</name>
- <longname>Amplifier (Mono)</longname>
+ <longname>Mono Amplifier</longname>
<class>Filter/Effect/Audio/LADSPA</class>
- <description>Amplifier (Mono)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
+ <description>Mono Amplifier</description>
+ <author>Richard Furse (LADSPA example plugins)</author>
<pads>
<caps>
<name>Input</name>
@@ -4310,10 +515,10 @@
</element>
<element>
<name>ladspa-amp-stereo</name>
- <longname>Amplifier (Stereo)</longname>
+ <longname>Stereo Amplifier</longname>
<class>Filter/Effect/Audio/LADSPA</class>
- <description>Amplifier (Stereo)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
+ <description>Stereo Amplifier</description>
+ <author>Richard Furse (LADSPA example plugins)</author>
<pads>
<caps>
<name>Input_-Left-</name>
@@ -4342,21 +547,6 @@
</pads>
</element>
<element>
- <name>ladspa-analogue</name>
- <longname>Analogue Voice</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Analogue Voice</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by David A. Bartold)</author>
- <pads>
- <caps>
- <name>Out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-analogueOsc</name>
<longname>Analogue Oscillator</longname>
<class>Source/Audio/LADSPA</class>
@@ -4456,246 +646,6 @@
</pads>
</element>
<element>
- <name>ladspa-bf-rotate-z</name>
- <longname>Ambisonic Rotation (B-Format, Horizontal)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Ambisonic Rotation (B-Format, Horizontal)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input_-W-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-X-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-Y-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-Z-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-W-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-X-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Y-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Z-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-bf2cube</name>
- <longname>Ambisonic Decoder (B-Format to Cube)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Ambisonic Decoder (B-Format to Cube)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input_-W-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-X-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-Y-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-Z-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Base_Back_Left-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Base_Back_Right-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Base_Front_Left-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Base_Front_Right-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Top_Back_Left-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Top_Back_Right-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Top_Front_Left-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Top_Front_Right-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-bf2quad</name>
- <longname>Ambisonic Decoder (B-Format to Quad)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Ambisonic Decoder (B-Format to Quad)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input_-W-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-X-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-Y-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-Z-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Back_Left-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Back_Right-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Front_Left-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Front_Right-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-bf2stereo</name>
- <longname>Ambisonic Decoder (B-Format to Stereo)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Ambisonic Decoder (B-Format to Stereo)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input_-W-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-X-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-Y-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-Z-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Left-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Right-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-bodeShifter</name>
<longname>Bode frequency shifter</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -4762,42 +712,6 @@
</pads>
</element>
<element>
- <name>ladspa-branch-ia-oaoa</name>
- <longname>Signal Branch (IA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Signal Branch (IA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>First_Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Second_Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-branch-ic-ococ</name>
- <longname>Signal Branch (IC)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Signal Branch (IC)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- </pads>
- </element>
- <element>
<name>ladspa-butthigh-iir</name>
<longname>GLAME Butterworth Highpass</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -4867,39 +781,6 @@
</pads>
</element>
<element>
- <name>ladspa-canyon-delay</name>
- <longname>Canyon Delay</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Canyon Delay</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by David A. Bartold)</author>
- <pads>
- <caps>
- <name>In_-Left-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_-Right-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_-Left-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_-Right-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-chebstortion</name>
<longname>Chebyshev distortion</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -4921,27 +802,6 @@
</pads>
</element>
<element>
- <name>ladspa-clipper</name>
- <longname>hard clipper (no antialiasing)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>hard clipper (no antialiasing)</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-comb</name>
<longname>Comb Filter</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -5053,132 +913,6 @@
</pads>
</element>
<element>
- <name>ladspa-comp-aa</name>
- <longname>Comparison (AA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Comparison (AA)</description>
- <author>Thorsten Wilms</author>
- <pads>
- <caps>
- <name>A</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>B</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>A_=_B</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>A_&gt;_B</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Larger</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Smaller</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-comp-ac</name>
- <longname>Comparison (AC)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Comparison (AC)</description>
- <author>Thorsten Wilms</author>
- <pads>
- <caps>
- <name>A</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>A_=_B</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>A_&gt;_B</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Larger</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Smaller</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-compress-peak</name>
- <longname>Simple Compressor (Peak Envelope Tracking)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Simple Compressor (Peak Envelope Tracking)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-compress-rms</name>
- <longname>Simple Compressor (RMS Envelope Tracking)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Simple Compressor (RMS Envelope Tracking)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-const</name>
<longname>Constant Signal Generator</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -5221,165 +955,6 @@
</pads>
</element>
<element>
- <name>ladspa-dahdsr-cg+t-control</name>
- <longname>DAHDSR Envelope with Control Gate and Trigger (Control Inputs)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>DAHDSR Envelope with Control Gate and Trigger (Control Inputs)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Envelope_Out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-dahdsr-fexp</name>
- <longname>DAHDSR Envelope full exp, adr</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>DAHDSR Envelope full exp, adr</description>
- <author>Loki Davison &lt;ltdav1[at]student.monash.edu.au&gt;</author>
- <pads>
- <caps>
- <name>Gate</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Trigger</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Envelope_Out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-dahdsr-g+t-audio</name>
- <longname>DAHDSR Envelope with Gate and Trigger (Audio-Rate Inputs)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>DAHDSR Envelope with Gate and Trigger (Audio-Rate Inputs)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Attack_Time_-s-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Decay_Time_-s-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Delay_Time_-s-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Gate</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Hold_Time_-s-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Release_Time_-s-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Sustain_Level</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Trigger</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Envelope_Out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-dahdsr-g+t-control</name>
- <longname>DAHDSR Envelope with Gate and Trigger (Control Inputs)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>DAHDSR Envelope with Gate and Trigger (Control Inputs)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Gate</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Trigger</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Envelope_Out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-dahdsr-hexp</name>
- <longname>DAHDSR Envelope linear attack exp dr</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>DAHDSR Envelope linear attack exp dr</description>
- <author>Loki Davison &lt;ltdav1[at]student.monash.edu.au&gt;</author>
- <pads>
- <caps>
- <name>Gate</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Trigger</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Envelope_Out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-dcRemove</name>
<longname>DC Offset Remover</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -5464,69 +1039,6 @@
</pads>
</element>
<element>
- <name>ladspa-delay-0-01s</name>
- <longname>Echo Delay Line (Maximum Delay 0.01s)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Echo Delay Line (Maximum Delay 0.01s)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-delay-0-1s</name>
- <longname>Echo Delay Line (Maximum Delay 0.1s)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Echo Delay Line (Maximum Delay 0.1s)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-delay-1s</name>
- <longname>Echo Delay Line (Maximum Delay 1s)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Echo Delay Line (Maximum Delay 1s)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-delay-5s</name>
<longname>Simple Delay Line</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -5548,27 +1060,6 @@
</pads>
</element>
<element>
- <name>ladspa-delay-60s</name>
- <longname>Echo Delay Line (Maximum Delay 60s)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Echo Delay Line (Maximum Delay 60s)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-delay-c</name>
<longname>Simple delay line, cubic spline interpolation</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -5653,84 +1144,6 @@
</pads>
</element>
<element>
- <name>ladspa-difference-iama-oa</name>
- <longname>Signal Difference (IAMA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Signal Difference (IAMA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_to_Subtract</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Difference_Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-difference-iamc-oa</name>
- <longname>Signal Difference (IAMC)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Signal Difference (IAMC)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Difference_Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-difference-icma-oa</name>
- <longname>Signal Difference (ICMA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Signal Difference (ICMA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Input_to_Subtract</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Difference_Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-difference-icmc-oc</name>
- <longname>Signal Difference (ICMC)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Signal Difference (ICMC)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- </pads>
- </element>
- <element>
<name>ladspa-diode</name>
<longname>Diode Processor</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -5752,27 +1165,6 @@
</pads>
</element>
<element>
- <name>ladspa-disintegrator</name>
- <longname>Disintegrator</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Disintegrator</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Nathaniel Virgo)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-divider</name>
<longname>Audio Divider (Suboctave Generator)</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -5890,177 +1282,6 @@
</pads>
</element>
<element>
- <name>ladspa-eir</name>
- <longname>Experiments in Representation</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Experiments in Representation</description>
- <author>Nick Lamb &lt;njl195@zepler.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Intput</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-encode-bformat</name>
- <longname>Ambisonic Encoder (B-Format)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Ambisonic Encoder (B-Format)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-W-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-X-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Y-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Z-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-encode-fmh</name>
- <longname>Ambisonic Encoder (FMH-Format)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Ambisonic Encoder (FMH-Format)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-R-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-S-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-T-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-U-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-V-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-W-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-X-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Y-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Z-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-expand-peak</name>
- <longname>Simple Expander (Peak Envelope Tracking)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Simple Expander (Peak Envelope Tracking)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-expand-rms</name>
- <longname>Simple Expander (RMS Envelope Tracking)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Simple Expander (RMS Envelope Tracking)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-fadDelay</name>
<longname>Fractionally Addressed Delay Line</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -6082,39 +1303,6 @@
</pads>
</element>
<element>
- <name>ladspa-fast-xfade</name>
- <longname>Fast Crossfade</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Fast Crossfade</description>
- <author>Thorsten Wilms</author>
- <pads>
- <caps>
- <name>A</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>B</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Level</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-fastLookaheadLimiter</name>
<longname>Fast Lookahead limiter</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -6148,111 +1336,6 @@
</pads>
</element>
<element>
- <name>ladspa-fbdelay-0-01s</name>
- <longname>Feedback Delay Line (Maximum Delay 0.01s)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Feedback Delay Line (Maximum Delay 0.01s)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-fbdelay-0-1s</name>
- <longname>Feedback Delay Line (Maximum Delay 0.1s)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Feedback Delay Line (Maximum Delay 0.1s)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-fbdelay-1s</name>
- <longname>Feedback Delay Line (Maximum Delay 1s)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Feedback Delay Line (Maximum Delay 1s)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-fbdelay-5s</name>
- <longname>Feedback Delay Line (Maximum Delay 5s)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Feedback Delay Line (Maximum Delay 5s)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-fbdelay-60s</name>
- <longname>Feedback Delay Line (Maximum Delay 60s)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Feedback Delay Line (Maximum Delay 60s)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-flanger</name>
<longname>Flanger</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -6274,21 +1357,6 @@
</pads>
</element>
<element>
- <name>ladspa-floatNoise</name>
- <longname>IEEE Single Precision Noise</longname>
- <class>Source/Audio/LADSPA</class>
- <description>IEEE Single Precision Noise</description>
- <author>Nick Lamb &lt;njl195@zepler.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-fmOsc</name>
<longname>FM Oscillator</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -6310,399 +1378,6 @@
</pads>
</element>
<element>
- <name>ladspa-fmh-rotate-z</name>
- <longname>Ambisonic Rotation (FMH-Format, Horizontal)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Ambisonic Rotation (FMH-Format, Horizontal)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input_-R-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-S-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-T-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-U-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-V-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-W-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-X-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-Y-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-Z-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-R-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-S-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-T-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-U-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-V-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-W-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-X-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Y-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Z-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-fmh2bf</name>
- <longname>FMH-Format to B-Format (Discards RSTUV Channels)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>FMH-Format to B-Format (Discards RSTUV Channels)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input_-R-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-S-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-T-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-U-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-V-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-W-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-X-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-Y-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-Z-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-W-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-X-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Y-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Z-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-fmh2oct</name>
- <longname>Ambisonic Decoder (FMH-Format to Octagon)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Ambisonic Decoder (FMH-Format to Octagon)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input_-R-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-S-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-T-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-U-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-V-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-W-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-X-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-Y-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-Z-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Back_Back_Left-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Back_Back_Right-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Back_Left_Left-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Back_Right_Right-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Front_Front_Left-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Front_Front_Right-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Front_Left_Left-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Front_Right_Right-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-fmod-fama-oa</name>
- <longname>Frequency Modulator (FAMA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Frequency Modulator (FAMA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Frequency_-Hz-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Modulation_-Octaves-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Modulated_Frequency_-Hz-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-fmod-famc-oa</name>
- <longname>Frequency Modulator (FAMC)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Frequency Modulator (FAMC)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Frequency_-Hz-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Modulated_Frequency_-Hz-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-fmod-fcma-oa</name>
- <longname>Frequency Modulator (FCMA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Frequency Modulator (FCMA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Modulation_-Octaves-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Modulated_Frequency_-Hz-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-fmod-fcmc-oc</name>
- <longname>Frequency Modulator (FCMC)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Frequency Modulator (FCMC)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- </pads>
- </element>
- <element>
<name>ladspa-foldover</name>
<longname>Foldover distortion</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -6724,210 +1399,6 @@
</pads>
</element>
<element>
- <name>ladspa-foo-chop-liver</name>
- <longname>Foo Chop Liver</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Foo Chop Liver</description>
- <author>Sampo Savolainen &lt;v2@iki.fi&gt;</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-foo-driver</name>
- <longname>Foo Driver</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Foo Driver</description>
- <author>Sampo Savolainen &lt;v2@iki.fi&gt;</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-foo-limiter</name>
- <longname>Foo Lookahead Limiter</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Foo Lookahead Limiter</description>
- <author>Sampo Savolainen &lt;v2@iki.fi&gt;</author>
- <pads>
- <caps>
- <name>Input_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-foo-limiter-v2</name>
- <longname>Foo Lookahead Limiter v2</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Foo Lookahead Limiter v2</description>
- <author>Sampo Savolainen &lt;v2@iki.fi&gt;</author>
- <pads>
- <caps>
- <name>Input_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-foo-saturator</name>
- <longname>Foo Saturator</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Foo Saturator</description>
- <author>Sampo Savolainen &lt;v2@iki.fi&gt;</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-foo-transients</name>
- <longname>Foo Transient Architect</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Foo Transient Architect</description>
- <author>Sampo Savolainen &lt;v2@iki.fi&gt;</author>
- <pads>
- <caps>
- <name>Input_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-foo-transients-mono</name>
- <longname>Foo Transient Architect (mono)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Foo Transient Architect (mono)</description>
- <author>Sampo Savolainen &lt;v2@iki.fi&gt;</author>
- <pads>
- <caps>
- <name>Input_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-formant-vc</name>
- <longname>Formant Filter (CR vowel)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Formant Filter (CR vowel)</description>
- <author>Dave Robillard</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-fourByFourPole</name>
<longname>4 x 4 pole allpass</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -6970,39 +1441,6 @@
</pads>
</element>
<element>
- <name>ladspa-freeverb3</name>
- <longname>Freeverb (Version 3)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Freeverb (Version 3)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Jezar at Dreampoint, ported by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input_-Left-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_-Right-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Left-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_-Right-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-freqTracker</name>
<longname>Frequency tracker</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -7108,27 +1546,6 @@
</pads>
</element>
<element>
- <name>ladspa-grain-scatter</name>
- <longname>Granular Scatter Processor</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Granular Scatter Processor</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-gsm</name>
<longname>GSM simulator</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -7177,27 +1594,6 @@
</pads>
</element>
<element>
- <name>ladspa-hard-gate</name>
- <longname>Hard Gate</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Hard Gate</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Nathaniel Virgo)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-hardLimiter</name>
<longname>Hard Limiter</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -7310,61 +1706,10 @@
</element>
<element>
<name>ladspa-hpf</name>
- <longname>High Pass Filter (One Pole)</longname>
+ <longname>Simple High Pass Filter</longname>
<class>Filter/Effect/Audio/LADSPA</class>
- <description>High Pass Filter (One Pole)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-hz-voct-ar</name>
- <longname>Hz to V/Oct Converter (AR)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Hz to V/Oct Converter (AR)</description>
- <author>Dave Robillard</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-hz-voct-cr</name>
- <longname>Hz to V/Oct Converter (CR)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Hz to V/Oct Converter (CR)</description>
- <author>Dave Robillard</author>
- <pads>
- </pads>
- </element>
- <element>
- <name>ladspa-identity-audio</name>
- <longname>Identity (Audio)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Identity (Audio)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
+ <description>Simple High Pass Filter</description>
+ <author>Richard Furse (LADSPA example plugins)</author>
<pads>
<caps>
<name>Input</name>
@@ -7381,15 +1726,6 @@
</pads>
</element>
<element>
- <name>ladspa-identity-control</name>
- <longname>Identity (Control)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Identity (Control)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- </pads>
- </element>
- <element>
<name>ladspa-imp</name>
<longname>Impulse convolver</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -7426,36 +1762,6 @@
</pads>
</element>
<element>
- <name>ladspa-intNoise</name>
- <longname>Integer Noise</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Integer Noise</description>
- <author>Nick Lamb &lt;njl195@zepler.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-interpolator</name>
- <longname>Control to Audio Interpolator</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Control to Audio Interpolator</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Interpolated_Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-inv</name>
<longname>Inverter</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -7543,72 +1849,6 @@
</pads>
</element>
<element>
- <name>ladspa-leet-equalizer-bw2x2</name>
- <longname>LEET Equalizer/BW 2x2 8 Band</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>LEET Equalizer/BW 2x2 8 Band</description>
- <author>Dan Lyons modded from TAP</author>
- <pads>
- <caps>
- <name>Input_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-leet-equalizer-bw2x2-1</name>
- <longname>LEET Equalizer/BW 2x2 1 band</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>LEET Equalizer/BW 2x2 1 band</description>
- <author>Dan Lyons modded from TAP</author>
- <pads>
- <caps>
- <name>Input_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-lfoPhaser</name>
<longname>LFO Phaser</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -7630,96 +1870,6 @@
</pads>
</element>
<element>
- <name>ladspa-limit-peak</name>
- <longname>Simple Limiter (Peak Envelope Tracking)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Simple Limiter (Peak Envelope Tracking)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-limit-rms</name>
- <longname>Simple Limiter (RMS Envelope Tracking)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Simple Limiter (RMS Envelope Tracking)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-lofi</name>
- <longname>Lo Fi</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Lo Fi</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by David A. Bartold)</author>
- <pads>
- <caps>
- <name>In_-Left-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>In_-Right-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_-Left-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out_-Right-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-logistic</name>
- <longname>Logistic Map Control Generator</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Logistic Map Control Generator</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Nathaniel Virgo)</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-lowpass-iir</name>
<longname>Glame Lowpass Filter</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -7741,65 +1891,11 @@
</pads>
</element>
<element>
- <name>ladspa-lp4pole-faraia-oa</name>
- <longname>4 Pole Low-Pass Filter with Resonance (FARAIA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>4 Pole Low-Pass Filter with Resonance (FARAIA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Cutoff_Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Resonance</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-lp4pole-fcrcia-oa</name>
- <longname>4 Pole Low-Pass Filter with Resonance (FCRCIA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>4 Pole Low-Pass Filter with Resonance (FCRCIA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-lpf</name>
- <longname>Low Pass Filter (One Pole)</longname>
+ <longname>Simple Low Pass Filter</longname>
<class>Filter/Effect/Audio/LADSPA</class>
- <description>Low Pass Filter (One Pole)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
+ <description>Simple Low Pass Filter</description>
+ <author>Richard Furse (LADSPA example plugins)</author>
<pads>
<caps>
<name>Input</name>
@@ -7837,27 +1933,6 @@
</pads>
</element>
<element>
- <name>ladspa-matched</name>
- <longname>matched (amp tone)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>matched (amp tone)</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-matrixMSSt</name>
<longname>Matrix: MS to Stereo</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -7978,33 +2053,6 @@
</pads>
</element>
<element>
- <name>ladspa-mixer</name>
- <longname>Mixer (Stereo to Mono)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Mixer (Stereo to Mono)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input_1</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_2</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-modDelay</name>
<longname>Modulatable delay</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -8053,69 +2101,6 @@
</pads>
</element>
<element>
- <name>ladspa-mux-ar</name>
- <longname>Multiplexer (AR)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Multiplexer (AR)</description>
- <author>Thorsten Wilms</author>
- <pads>
- <caps>
- <name>Gate</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Off</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>On</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-mux-cr</name>
- <longname>Multiplexer (CR)</longname>
- <class>Sink/Analyzer/Audio/LADSPA</class>
- <description>Multiplexer (CR)</description>
- <author>Thorsten Wilms</author>
- <pads>
- <caps>
- <name>Gate</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-noise-source-white</name>
- <longname>Noise Source (White)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Noise Source (White)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-noise-white</name>
<longname>White Noise Source</longname>
<class>Source/Audio/LADSPA</class>
@@ -8152,144 +2137,6 @@
</pads>
</element>
<element>
- <name>ladspa-null-ai</name>
- <longname>Null (Audio Input)</longname>
- <class>Sink/Audio/LADSPA</class>
- <description>Null (Audio Input)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-null-ao</name>
- <longname>Null (Audio Output)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Null (Audio Output)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-null-ci</name>
- <longname>Null (Control Input)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Null (Control Input)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- </pads>
- </element>
- <element>
- <name>ladspa-null-co</name>
- <longname>Null (Control Output)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Null (Control Output)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- </pads>
- </element>
- <element>
- <name>ladspa-organ</name>
- <longname>Organ</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Organ</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by David A. Bartold)</author>
- <pads>
- <caps>
- <name>Out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-peak</name>
- <longname>Peak Monitor</longname>
- <class>Sink/Analyzer/Audio/LADSPA</class>
- <description>Peak Monitor</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-phasemod</name>
- <longname>Phase Modulated Voice</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Phase Modulated Voice</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by David A. Bartold)</author>
- <pads>
- <caps>
- <name>Out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-pink-full-frequency</name>
- <longname>Pink Noise (full frequency range)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Pink Noise (full frequency range)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Nathaniel Virgo)</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-pink-interpolated-audio</name>
- <longname>Pink Noise (Interpolated)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Pink Noise (Interpolated)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Nathaniel Virgo)</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-pink-sh</name>
- <longname>Pink Noise (sample and hold)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Pink Noise (sample and hold)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Nathaniel Virgo)</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-pitchScale</name>
<longname>Pitch Scaler</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -8380,495 +2227,6 @@
</pads>
</element>
<element>
- <name>ladspa-power</name>
- <longname>Power (AR)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Power (AR)</description>
- <author>Thorsten Wilms</author>
- <pads>
- <caps>
- <name>Base</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Exponent</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Result</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-power-cr</name>
- <longname>Power (CR)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Power (CR)</description>
- <author>Thorsten Wilms</author>
- <pads>
- </pads>
- </element>
- <element>
- <name>ladspa-preamp</name>
- <longname>valve preamplifier model</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>valve preamplifier model</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-prob-switch-ar</name>
- <longname>Probability Switch (AR Controls)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Probability Switch (AR Controls)</description>
- <author>Loki Davison</author>
- <pads>
- <caps>
- <name>Input_1</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_2</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Probability</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-prob-switch-cr</name>
- <longname>Probability Switch (CR Controls)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Probability Switch (CR Controls)</description>
- <author>Loki Davison</author>
- <pads>
- <caps>
- <name>Input_1</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_2</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-product-iaia-oa</name>
- <longname>Signal Product (IAIA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Signal Product (IAIA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>First_Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Second_Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Product_Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-product-iaic-oa</name>
- <longname>Signal Product (IAIC)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Signal Product (IAIC)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>First_Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Product_Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-product-icic-oc</name>
- <longname>Signal Product (ICIC)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Signal Product (ICIC)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- </pads>
- </element>
- <element>
- <name>ladspa-pulse-fapa-oa</name>
- <longname>Bandlimited Variable Width Pulse Oscillator (FAPA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Bandlimited Variable Width Pulse Oscillator (FAPA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Pulse_Width</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-pulse-fapc-oa</name>
- <longname>Bandlimited Variable Width Pulse Oscillator (FAPC)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Bandlimited Variable Width Pulse Oscillator (FAPC)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-pulse-fcpa-oa</name>
- <longname>Bandlimited Variable Width Pulse Oscillator (FCPA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Bandlimited Variable Width Pulse Oscillator (FCPA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Pulse_Width</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-pulse-fcpc-oa</name>
- <longname>Bandlimited Variable Width Pulse Oscillator (FCPC)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Bandlimited Variable Width Pulse Oscillator (FCPC)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-quantiser100</name>
- <longname>Quantiser (100 Steps)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Quantiser (100 Steps)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_Changed</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Quantised_Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-quantiser20</name>
- <longname>Quantiser (20 Steps)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Quantiser (20 Steps)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_Changed</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Quantised_Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-quantiser50</name>
- <longname>Quantiser (50 Steps)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Quantiser (50 Steps)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_Changed</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Quantised_Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-random-fasa-oa</name>
- <longname>Random Wave Generator (FASA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Random Wave Generator (FASA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Frequency_-Hz-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Wave_Smoothness</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-random-fasc-oa</name>
- <longname>Random Wave Generator (FASC)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Random Wave Generator (FASC)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Frequency_-Hz-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-random-fcsa-oa</name>
- <longname>Random Wave Generator (FCSA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Random Wave Generator (FCSA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Wave_Smoothness</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-random-fcsc-oa</name>
- <longname>Random Wave Generator (FCSC)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Random Wave Generator (FCSC)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-range-trans-ar</name>
- <longname>Range Translator (AR Controls)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Range Translator (AR Controls)</description>
- <author>Dave Robillard</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_Max</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_Min</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_Max</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_Min</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-range-trans-cr</name>
- <longname>Range Translator (CR Controls)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Range Translator (CR Controls)</description>
- <author>Dave Robillard</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-rateShifter</name>
<longname>Rate shifter</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -8890,84 +2248,6 @@
</pads>
</element>
<element>
- <name>ladspa-ratio-nada-oa</name>
- <longname>Signal Ratio (NADA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Signal Ratio (NADA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Denominator</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Numerator</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Ratio_Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-ratio-nadc-oa</name>
- <longname>Signal Ratio (NADC)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Signal Ratio (NADC)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Numerator</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Ratio_Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-ratio-ncda-oa</name>
- <longname>Signal Ratio (NCDA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Signal Ratio (NCDA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Denominator</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Ratio_Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-ratio-ncdc-oc</name>
- <longname>Signal Ratio (NCDC)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Signal Ratio (NCDC)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- </pads>
- </element>
- <element>
<name>ladspa-retroFlange</name>
<longname>Retro Flanger</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -9058,75 +2338,6 @@
</pads>
</element>
<element>
- <name>ladspa-rissetScales</name>
- <longname>Continuous Risset Scales</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Continuous Risset Scales</description>
- <author>Nick Lamb &lt;njl195@zepler.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-rubberband-pitchshifter-mono</name>
- <longname>Rubber Band Mono Pitch Shifter</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Rubber Band Mono Pitch Shifter</description>
- <author>Breakfast Quay</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-rubberband-pitchshifter-stereo</name>
- <longname>Rubber Band Stereo Pitch Shifter</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Rubber Band Stereo Pitch Shifter</description>
- <author>Breakfast Quay</author>
- <pads>
- <caps>
- <name>Input_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-satanMaximiser</name>
<longname>Barry&apos;s Satan Maximiser</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -9148,42 +2359,6 @@
</pads>
</element>
<element>
- <name>ladspa-sawtooth-fa-oa</name>
- <longname>Bandlimited Sawtooth Oscillator (FA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Bandlimited Sawtooth Oscillator (FA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-sawtooth-fc-oa</name>
- <longname>Bandlimited Sawtooth Oscillator (FC)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Bandlimited Sawtooth Oscillator (FC)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-sc1</name>
<longname>SC1</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -9358,147 +2533,6 @@
</pads>
</element>
<element>
- <name>ladspa-sequencer16</name>
- <longname>Analogue Style 16 Step Sequencer</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Analogue Style 16 Step Sequencer</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Gate_-Open_&gt;_0-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Step_Trigger</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Value_Out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-sequencer32</name>
- <longname>Analogue Style 32 Step Sequencer</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Analogue Style 32 Step Sequencer</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Gate_-Open_&gt;_0-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Step_Trigger</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Value_Out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-sequencer64</name>
- <longname>Analogue Style 64 Step Sequencer</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Analogue Style 64 Step Sequencer</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Gate_-Open_&gt;_0-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Step_Trigger</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Value_Out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-sh-ar</name>
- <longname>Sample and Hold (AR Threshold)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Sample and Hold (AR Threshold)</description>
- <author>Thorsten Wilms</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Threshold</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Trigger</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-sh-cr</name>
- <longname>Sample and Hold (CR Threshold)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Sample and Hold (CR Threshold)</description>
- <author>Thorsten Wilms</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Trigger</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-shaper</name>
<longname>Wave shaper</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -9541,54 +2575,6 @@
</pads>
</element>
<element>
- <name>ladspa-signal-abs-ar</name>
- <longname>Signal Absolute value, negative or positive (AR Controls)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Signal Absolute value, negative or positive (AR Controls)</description>
- <author>Loki Davison</author>
- <pads>
- <caps>
- <name>Input_1</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Sign</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-signal-abs-cr</name>
- <longname>Signal Absolute value, negative or positive (CR Controls)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Signal Absolute value, negative or positive (CR Controls)</description>
- <author>Loki Davison</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-sinCos</name>
<longname>Sine + cosine oscillator</longname>
<class>Source/Audio/LADSPA</class>
@@ -9614,7 +2600,7 @@
<longname>Sine Oscillator (Freq:audio, Amp:audio)</longname>
<class>Filter/Effect/Audio/LADSPA</class>
<description>Sine Oscillator (Freq:audio, Amp:audio)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
+ <author>Richard Furse (LADSPA example plugins)</author>
<pads>
<caps>
<name>Amplitude</name>
@@ -9623,7 +2609,7 @@
<details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
</caps>
<caps>
- <name>Frequency</name>
+ <name>Frequency_-Hz-</name>
<direction>sink</direction>
<presence>always</presence>
<details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
@@ -9641,10 +2627,10 @@
<longname>Sine Oscillator (Freq:audio, Amp:control)</longname>
<class>Filter/Effect/Audio/LADSPA</class>
<description>Sine Oscillator (Freq:audio, Amp:control)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
+ <author>Richard Furse (LADSPA example plugins)</author>
<pads>
<caps>
- <name>Frequency</name>
+ <name>Frequency_-Hz-</name>
<direction>sink</direction>
<presence>always</presence>
<details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
@@ -9662,7 +2648,7 @@
<longname>Sine Oscillator (Freq:control, Amp:audio)</longname>
<class>Filter/Effect/Audio/LADSPA</class>
<description>Sine Oscillator (Freq:control, Amp:audio)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
+ <author>Richard Furse (LADSPA example plugins)</author>
<pads>
<caps>
<name>Amplitude</name>
@@ -9683,7 +2669,7 @@
<longname>Sine Oscillator (Freq:control, Amp:control)</longname>
<class>Source/Audio/LADSPA</class>
<description>Sine Oscillator (Freq:control, Amp:control)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
+ <author>Richard Furse (LADSPA example plugins)</author>
<pads>
<caps>
<name>Output</name>
@@ -9736,141 +2722,6 @@
</pads>
</element>
<element>
- <name>ladspa-sledgehammer</name>
- <longname>Dynamic Sledgehammer</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Dynamic Sledgehammer</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Nathaniel Virgo)</author>
- <pads>
- <caps>
- <name>Carrier</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Modulator</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-slew-limiter-ra</name>
- <longname>Slew limiter (RA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Slew limiter (RA)</description>
- <author>Lars Luthman &lt;larsl@users.sourceforge.net&gt;</author>
- <pads>
- <caps>
- <name>Fall_rate_-1-s-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Rise_rate_-1-s-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-slew-limiter-rc</name>
- <longname>Slew limiter (RC)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Slew limiter (RC)</description>
- <author>Lars Luthman &lt;larsl@users.sourceforge.net&gt;</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-slide-ta</name>
- <longname>Slide (TA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Slide (TA)</description>
- <author>Lars Luthman &lt;larsl@users.sourceforge.net&gt;</author>
- <pads>
- <caps>
- <name>Fall_time_-s-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Rise_time_-s-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-slide-tc</name>
- <longname>Slide (TC)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Slide (TC)</description>
- <author>Lars Luthman &lt;larsl@users.sourceforge.net&gt;</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-smoothDecimate</name>
<longname>Smooth Decimator</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -9919,63 +2770,6 @@
</pads>
</element>
<element>
- <name>ladspa-square-fa-oa</name>
- <longname>Bandlimited Square Oscillator (FA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Bandlimited Square Oscillator (FA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-square-fc-oa</name>
- <longname>Bandlimited Square Oscillator (FC)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Bandlimited Square Oscillator (FC)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-ssm-masher</name>
- <longname>Masher</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Masher</description>
- <author>Dave Griffiths</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-stepMuxer</name>
<longname>Step Demuxer</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -10045,84 +2839,6 @@
</pads>
</element>
<element>
- <name>ladspa-sum-iaia-oa</name>
- <longname>Signal Sum (IAIA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Signal Sum (IAIA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>First_Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Second_Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Summed_Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-sum-iaic-oa</name>
- <longname>Signal Sum (IAIC)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Signal Sum (IAIC)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>First_Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Summed_Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-sum-icic-oc</name>
- <longname>Signal Sum (ICIC)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Signal Sum (ICIC)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- </pads>
- </element>
- <element>
- <name>ladspa-super-60</name>
- <longname>super 60 (amp tone)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>super 60 (amp tone)</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-surroundEncoder</name>
<longname>Surround matrix encoder</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -10189,123 +2905,6 @@
</pads>
</element>
<element>
- <name>ladspa-syncpulse-fapaga-oa</name>
- <longname>Clock Pulse Oscillator with Gate (FAPAGA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Clock Pulse Oscillator with Gate (FAPAGA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Gate</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Pulse_Width</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-syncpulse-fcpcga-oa</name>
- <longname>Clock Pulse Oscillator with Gate (FCPCGA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Clock Pulse Oscillator with Gate (FCPCGA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Gate</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-syncsquare-faga-oa</name>
- <longname>Clock Oscillator with Gate (FAGA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Clock Oscillator with Gate (FAGA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Gate</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-syncsquare-fcga-oa</name>
- <longname>Clock Oscillator with Gate (FCGA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Clock Oscillator with Gate (FCGA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Gate</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-syndrum</name>
- <longname>Syn Drum</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Syn Drum</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by David A. Bartold)</author>
- <pads>
- <caps>
- <name>Out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-tap-autopan</name>
<longname>TAP AutoPanner</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -10810,144 +3409,6 @@
</pads>
</element>
<element>
- <name>ladspa-track-max-peak</name>
- <longname>Envelope Tracker (Maximum Peak)</longname>
- <class>Sink/Analyzer/Audio/LADSPA</class>
- <description>Envelope Tracker (Maximum Peak)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-track-max-rms</name>
- <longname>Envelope Tracker (Maximum RMS)</longname>
- <class>Sink/Analyzer/Audio/LADSPA</class>
- <description>Envelope Tracker (Maximum RMS)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-track-peak</name>
- <longname>Envelope Tracker (Peak)</longname>
- <class>Sink/Analyzer/Audio/LADSPA</class>
- <description>Envelope Tracker (Peak)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-track-rms</name>
- <longname>Envelope Tracker (RMS)</longname>
- <class>Sink/Analyzer/Audio/LADSPA</class>
- <description>Envelope Tracker (RMS)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tracker-gaaadaia-oa</name>
- <longname>Signal Tracker (Audio Rates)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Signal Tracker (Audio Rates)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Attack_Rate_-Hz-_when_Gate_High</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Attack_Rate_-Hz-_when_Gate_Low</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Decay_Rate_-Hz-_when_Gate_High</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Decay_Rate_-Hz-_when_Gate_Low</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Gate</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tracker-gaacdcia-oa</name>
- <longname>Signal Tracker (Control Rates)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Signal Tracker (Control Rates)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Gate</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-transient</name>
<longname>Transient mangler</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -10969,111 +3430,6 @@
</pads>
</element>
<element>
- <name>ladspa-triangle-fasa-oa</name>
- <longname>Bandlimited Variable Slope Triangle Oscillator (FASA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Bandlimited Variable Slope Triangle Oscillator (FASA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Slope</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-triangle-fasc-oa</name>
- <longname>Bandlimited Variable Slope Triangle Oscillator (FASC)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Bandlimited Variable Slope Triangle Oscillator (FASC)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-triangle-fcsa-oa</name>
- <longname>Bandlimited Variable Slope Triangle Oscillator (FCSA)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Bandlimited Variable Slope Triangle Oscillator (FCSA)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Slope</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-triangle-fcsc-oa</name>
- <longname>Bandlimited Variable Slope Triangle Oscillator (FCSC)</longname>
- <class>Source/Audio/LADSPA</class>
- <description>Bandlimited Variable Slope Triangle Oscillator (FCSC)</description>
- <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-trigger</name>
- <longname>Trigger</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Trigger</description>
- <author>Thorsten Edelhaeusser</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-triplePara</name>
<longname>Triple band parametric with shelves</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -11095,27 +3451,6 @@
</pads>
</element>
<element>
- <name>ladspa-unmatched</name>
- <longname>unmatched (Amp Tone)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>unmatched (Amp Tone)</description>
- <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
- <pads>
- <caps>
- <name>in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-valve</name>
<longname>Valve saturation</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -11158,423 +3493,6 @@
</pads>
</element>
<element>
- <name>ladspa-vcf-bp1</name>
- <longname>Bandpass Filter I</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Bandpass Filter I</description>
- <author>LADSPA code by Matthias Nagorni, Filter formula by Robert Bristow-Johnson</author>
- <pads>
- <caps>
- <name>Frequency_Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Resonance</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-vcf-bp2</name>
- <longname>Bandpass Filter II</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Bandpass Filter II</description>
- <author>LADSPA code by Matthias Nagorni, Filter formula by Robert Bristow-Johnson</author>
- <pads>
- <caps>
- <name>Frequency_Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Resonance</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-vcf-hp</name>
- <longname>Highpass Filter</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Highpass Filter</description>
- <author>LADSPA code by Matthias Nagorni, Filter formula by Robert Bristow-Johnson</author>
- <pads>
- <caps>
- <name>Frequency_Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Resonance</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-vcf-hshelf</name>
- <longname>High Shelf Filter</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>High Shelf Filter</description>
- <author>LADSPA code by Matthias Nagorni, Filter formula by Robert Bristow-Johnson</author>
- <pads>
- <caps>
- <name>Frequency_Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Resonance</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>dBgain_Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-vcf-lp</name>
- <longname>Lowpass Filter</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Lowpass Filter</description>
- <author>LADSPA code by Matthias Nagorni, Filter formula by Robert Bristow-Johnson</author>
- <pads>
- <caps>
- <name>Frequency_Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Resonance</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-vcf-lshelf</name>
- <longname>Low Shelf Filter</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Low Shelf Filter</description>
- <author>LADSPA code by Matthias Nagorni, Filter formula by Robert Bristow-Johnson</author>
- <pads>
- <caps>
- <name>Frequency_Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Resonance</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>dBgain_Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-vcf-notch</name>
- <longname>Notch Filter</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Notch Filter</description>
- <author>LADSPA code by Matthias Nagorni, Filter formula by Robert Bristow-Johnson</author>
- <pads>
- <caps>
- <name>Frequency_Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Resonance</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-vcf-peakeq</name>
- <longname>Peaking EQ Filter</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Peaking EQ Filter</description>
- <author>LADSPA code by Matthias Nagorni, Filter formula by Robert Bristow-Johnson</author>
- <pads>
- <caps>
- <name>Frequency_Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Resonance</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>dBgain_Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-vcf-reslp</name>
- <longname>Resonant Lowpass Filter</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Resonant Lowpass Filter</description>
- <author>LADSPA code by Matthias Nagorni, Filter formula by Paul Kellett</author>
- <pads>
- <caps>
- <name>Frequency_Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Resonance</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-vcf303</name>
- <longname>VCF 303</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>VCF 303</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by David A. Bartold)</author>
- <pads>
- <caps>
- <name>In</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-vlevel-mono</name>
- <longname>VLevel (Mono)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>VLevel (Mono)</description>
- <author>Tom Felker</author>
- <pads>
- <caps>
- <name>Input_1</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_1</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-vlevel-stereo</name>
- <longname>VLevel (Stereo)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>VLevel (Stereo)</description>
- <author>Tom Felker</author>
- <pads>
- <caps>
- <name>Input_1</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Input_2</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_1</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output_2</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-vocoder</name>
- <longname>Vocoder</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Vocoder</description>
- <author>Achim Settelmeier (adapted to LADSPA by Josh Green)</author>
- <pads>
- <caps>
- <name>Carrier</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Formant</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-vynil</name>
<longname>VyNil (Vinyl Effect)</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -11635,54 +3553,6 @@
</pads>
</element>
<element>
- <name>ladspa-wg-mesh-cr</name>
- <longname>Simple waveguide mesh (CR Controls)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Simple waveguide mesh (CR Controls)</description>
- <author>Loki Davison</author>
- <pads>
- <caps>
- <name>Power</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Trigger</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-wshape-sine</name>
- <longname>Wave Shaper (Sine-Based)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Wave Shaper (Sine-Based)</description>
- <author>CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse)</author>
- <pads>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-xfade</name>
<longname>Crossfade</longname>
<class>Filter/Effect/Audio/LADSPA</class>
diff --git a/docs/plugins/inspect/plugin-legacyresample.xml b/docs/plugins/inspect/plugin-legacyresample.xml
index c09822064..77451a30b 100644
--- a/docs/plugins/inspect/plugin-legacyresample.xml
+++ b/docs/plugins/inspect/plugin-legacyresample.xml
@@ -3,7 +3,7 @@
<description>Resamples audio</description>
<filename>../../gst/legacyresample/.libs/libgstlegacyresample.so</filename>
<basename>libgstlegacyresample.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-linsys.xml b/docs/plugins/inspect/plugin-linsys.xml
index de4598dcd..d46bd381c 100644
--- a/docs/plugins/inspect/plugin-linsys.xml
+++ b/docs/plugins/inspect/plugin-linsys.xml
@@ -3,7 +3,7 @@
<description>FIXME</description>
<filename>../../sys/linsys/.libs/libgstlinsys.so</filename>
<basename>libgstlinsys.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-liveadder.xml b/docs/plugins/inspect/plugin-liveadder.xml
index 169589bc5..aa3264a8f 100644
--- a/docs/plugins/inspect/plugin-liveadder.xml
+++ b/docs/plugins/inspect/plugin-liveadder.xml
@@ -3,7 +3,7 @@
<description>Adds multiple live discontinuous streams</description>
<filename>../../gst/liveadder/.libs/libgstliveadder.so</filename>
<basename>libgstliveadder.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-mimic.xml b/docs/plugins/inspect/plugin-mimic.xml
index 4b23cbfd4..b44b5adca 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-mpegpsmux.xml b/docs/plugins/inspect/plugin-mpegpsmux.xml
index b9b38d3ba..47ff527b8 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
@@ -20,7 +20,7 @@
<name>sink_%d</name>
<direction>sink</direction>
<presence>request</presence>
- <details>video/mpeg, mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false; video/x-dirac; video/x-h264; audio/mpeg, mpegversion=(int){ 1, 2, 4 }; 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 }</details>
+ <details>video/mpeg, mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false; video/x-dirac; video/x-h264; audio/mpeg, mpegversion=(int){ 1, 2 }; audio/mpeg, mpegversion=(int)4, stream-format=(string){ raw, adts }; 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 }</details>
</caps>
<caps>
<name>src</name>
diff --git a/docs/plugins/inspect/plugin-mpegtsmux.xml b/docs/plugins/inspect/plugin-mpegtsmux.xml
index 9132feb08..303bd9bd3 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
@@ -20,7 +20,7 @@
<name>sink_%d</name>
<direction>sink</direction>
<presence>request</presence>
- <details>video/mpeg, mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false; video/x-dirac; video/x-h264, stream-format=(string)byte-stream; audio/mpeg, mpegversion=(int){ 1, 2, 4 }; 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-dts</details>
+ <details>video/mpeg, mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false; video/x-dirac; video/x-h264, stream-format=(string)byte-stream; audio/mpeg, mpegversion=(int){ 1, 2 }; audio/mpeg, mpegversion=(int)4, stream-format=(string){ raw, adts }; 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-dts</details>
</caps>
<caps>
<name>src</name>
diff --git a/docs/plugins/inspect/plugin-musepack.xml b/docs/plugins/inspect/plugin-musepack.xml
index 63b165228..7d05a48fe 100644
--- a/docs/plugins/inspect/plugin-musepack.xml
+++ b/docs/plugins/inspect/plugin-musepack.xml
@@ -3,7 +3,7 @@
<description>Musepack decoder</description>
<filename>../../ext/musepack/.libs/libgstmusepack.so</filename>
<basename>libgstmusepack.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
@@ -20,7 +20,7 @@
<name>sink</name>
<direction>sink</direction>
<presence>always</presence>
- <details>audio/x-musepack, streamversion=(int)7</details>
+ <details>audio/x-musepack, streamversion=(int){ 7, 8 }</details>
</caps>
<caps>
<name>src</name>
diff --git a/docs/plugins/inspect/plugin-musicbrainz.xml b/docs/plugins/inspect/plugin-musicbrainz.xml
index b783131a3..1a5fc0500 100644
--- a/docs/plugins/inspect/plugin-musicbrainz.xml
+++ b/docs/plugins/inspect/plugin-musicbrainz.xml
@@ -3,7 +3,7 @@
<description>A TRM signature producer based on libmusicbrainz</description>
<filename>../../ext/musicbrainz/.libs/libgsttrm.so</filename>
<basename>libgsttrm.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-mve.xml b/docs/plugins/inspect/plugin-mve.xml
index f4cdd7092..74fcea734 100644
--- a/docs/plugins/inspect/plugin-mve.xml
+++ b/docs/plugins/inspect/plugin-mve.xml
@@ -3,7 +3,7 @@
<description>Interplay MVE movie format manipulation</description>
<filename>../../gst/mve/.libs/libgstmve.so</filename>
<basename>libgstmve.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-mxf.xml b/docs/plugins/inspect/plugin-mxf.xml
index 62825ec4a..4394d08c5 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-mythtv.xml b/docs/plugins/inspect/plugin-mythtv.xml
index ffc8eb7aa..231c9dc90 100644
--- a/docs/plugins/inspect/plugin-mythtv.xml
+++ b/docs/plugins/inspect/plugin-mythtv.xml
@@ -3,7 +3,7 @@
<description>lib MythTV src</description>
<filename>../../ext/mythtv/.libs/libgstmythtvsrc.so</filename>
<basename>libgstmythtvsrc.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-neon.xml b/docs/plugins/inspect/plugin-neon.xml
index 33fa934a8..12c4c7e65 100644
--- a/docs/plugins/inspect/plugin-neon.xml
+++ b/docs/plugins/inspect/plugin-neon.xml
@@ -3,7 +3,7 @@
<description>lib neon http client src</description>
<filename>../../ext/neon/.libs/libgstneonhttpsrc.so</filename>
<basename>libgstneonhttpsrc.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-nsf.xml b/docs/plugins/inspect/plugin-nsf.xml
index 5f9cfe8ff..7554379b3 100644
--- a/docs/plugins/inspect/plugin-nsf.xml
+++ b/docs/plugins/inspect/plugin-nsf.xml
@@ -3,7 +3,7 @@
<description>Uses nosefart to decode .nsf files</description>
<filename>../../gst/nsf/.libs/libgstnsf.so</filename>
<basename>libgstnsf.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>GPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-nuvdemux.xml b/docs/plugins/inspect/plugin-nuvdemux.xml
index 9d3d67f4e..0d4e316ab 100644
--- a/docs/plugins/inspect/plugin-nuvdemux.xml
+++ b/docs/plugins/inspect/plugin-nuvdemux.xml
@@ -3,7 +3,7 @@
<description>Demuxes MythTV NuppelVideo files</description>
<filename>../../gst/nuvdemux/.libs/libgstnuvdemux.so</filename>
<basename>libgstnuvdemux.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-ofa.xml b/docs/plugins/inspect/plugin-ofa.xml
index 2a5c80779..73f348df9 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>GPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-patchdetect.xml b/docs/plugins/inspect/plugin-patchdetect.xml
index b9efcfadd..5631d4877 100644
--- a/docs/plugins/inspect/plugin-patchdetect.xml
+++ b/docs/plugins/inspect/plugin-patchdetect.xml
@@ -3,7 +3,7 @@
<description>patchdetect element</description>
<filename>../../gst/patchdetect/.libs/libgstpatchdetect.so</filename>
<basename>libgstpatchdetect.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-pnm.xml b/docs/plugins/inspect/plugin-pnm.xml
index 25678072e..e6301472d 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-real.xml b/docs/plugins/inspect/plugin-real.xml
index 280285269..3806dc3ba 100644
--- a/docs/plugins/inspect/plugin-real.xml
+++ b/docs/plugins/inspect/plugin-real.xml
@@ -3,7 +3,7 @@
<description>Decode REAL streams</description>
<filename>../../gst/real/.libs/libgstreal.so</filename>
<basename>libgstreal.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-removesilence.xml b/docs/plugins/inspect/plugin-removesilence.xml
new file mode 100644
index 000000000..00e3bce40
--- /dev/null
+++ b/docs/plugins/inspect/plugin-removesilence.xml
@@ -0,0 +1,35 @@
+<plugin>
+ <name>removesilence</name>
+ <description>Removes silence from an audio stream</description>
+ <filename>../../gst/removesilence/.libs/libgstremovesilence.so</filename>
+ <basename>libgstremovesilence.so</basename>
+ <version>0.10.23.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>removesilence</name>
+ <longname>RemoveSilence</longname>
+ <class>Filter/Effect/Audio</class>
+ <description>Removes all the silence periods from the audio stream.</description>
+ <author>Tiago Katcipis &lt;tiagokatcipis@gmail.com&gt;
+ Paulo Pizarro &lt;paulo.pizarro@gmail.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin> \ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-resindvd.xml b/docs/plugins/inspect/plugin-resindvd.xml
index bda861cef..61848db36 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/libresindvd.so</filename>
<basename>libresindvd.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>GPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer</package>
diff --git a/docs/plugins/inspect/plugin-rfbsrc.xml b/docs/plugins/inspect/plugin-rfbsrc.xml
index fe5aba0c4..97b501acc 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-rsvg.xml b/docs/plugins/inspect/plugin-rsvg.xml
index 4b0c0d0f8..94c31f3a2 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-rtmp.xml b/docs/plugins/inspect/plugin-rtmp.xml
index 7d9ae4fdc..446cc4cec 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-sdi.xml b/docs/plugins/inspect/plugin-sdi.xml
index 36b1d3ed7..43e8d6b39 100644
--- a/docs/plugins/inspect/plugin-sdi.xml
+++ b/docs/plugins/inspect/plugin-sdi.xml
@@ -3,7 +3,7 @@
<description>SDI elements</description>
<filename>../../gst/sdi/.libs/libgstsdi.so</filename>
<basename>libgstsdi.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-smooth.xml b/docs/plugins/inspect/plugin-smooth.xml
new file mode 100644
index 000000000..85dcdb283
--- /dev/null
+++ b/docs/plugins/inspect/plugin-smooth.xml
@@ -0,0 +1,34 @@
+<plugin>
+ <name>smooth</name>
+ <description>Apply a smooth filter to an image</description>
+ <filename>../../gst/smooth/.libs/libgstsmooth.so</filename>
+ <basename>libgstsmooth.so</basename>
+ <version>0.10.23.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>smooth</name>
+ <longname>Smooth effect</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Apply a smooth filter to an image</description>
+ <author>Wim Taymans &lt;wim.taymans@chello.be&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-yuv, format=(fourcc)I420, 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-yuv, format=(fourcc)I420, 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-sndfile.xml b/docs/plugins/inspect/plugin-sndfile.xml
index 1b08aad05..10d060740 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 audio from and to files</description>
<filename>../../ext/sndfile/.libs/libgstsndfile.so</filename>
<basename>libgstsndfile.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-soundtouch.xml b/docs/plugins/inspect/plugin-soundtouch.xml
index 17797310d..626347ff3 100644
--- a/docs/plugins/inspect/plugin-soundtouch.xml
+++ b/docs/plugins/inspect/plugin-soundtouch.xml
@@ -3,7 +3,7 @@
<description>Audio Pitch Controller &amp; BPM Detection</description>
<filename>../../ext/soundtouch/.libs/libgstsoundtouch.so</filename>
<basename>libgstsoundtouch.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-speed.xml b/docs/plugins/inspect/plugin-speed.xml
index 1408eebcc..502b5e459 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-stereo.xml b/docs/plugins/inspect/plugin-stereo.xml
index 89fd60d6e..cf2a342e6 100644
--- a/docs/plugins/inspect/plugin-stereo.xml
+++ b/docs/plugins/inspect/plugin-stereo.xml
@@ -3,7 +3,7 @@
<description>Muck with the stereo signal, enhance it&apos;s &apos;stereo-ness&apos;</description>
<filename>../../gst/stereo/.libs/libgststereo.so</filename>
<basename>libgststereo.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-subenc.xml b/docs/plugins/inspect/plugin-subenc.xml
index 5e7de4de8..1aff047bd 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
@@ -30,5 +30,26 @@
</caps>
</pads>
</element>
+ <element>
+ <name>webvttenc</name>
+ <longname>WebVTT encoder</longname>
+ <class>Codec/Encoder/Subtitle</class>
+ <description>WebVTT subtitle encoder</description>
+ <author>David Schleef &lt;ds@schleef.org&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>text/plain; text/x-pango-markup</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>text/webvtt</details>
+ </caps>
+ </pads>
+ </element>
</elements>
</plugin> \ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-tta.xml b/docs/plugins/inspect/plugin-tta.xml
index c40acd26c..8b09489a2 100644
--- a/docs/plugins/inspect/plugin-tta.xml
+++ b/docs/plugins/inspect/plugin-tta.xml
@@ -3,7 +3,7 @@
<description>TTA lossless audio format handling</description>
<filename>../../gst/tta/.libs/libgsttta.so</filename>
<basename>libgsttta.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-vcdsrc.xml b/docs/plugins/inspect/plugin-vcdsrc.xml
index 1e71ecfc9..beefe2c73 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-vdpau.xml b/docs/plugins/inspect/plugin-vdpau.xml
index 385e840b7..3758f6d9a 100644
--- a/docs/plugins/inspect/plugin-vdpau.xml
+++ b/docs/plugins/inspect/plugin-vdpau.xml
@@ -3,7 +3,7 @@
<description>Various elements utilizing VDPAU</description>
<filename>../../sys/vdpau/.libs/libgstvdpau.so</filename>
<basename>libgstvdpau.so</basename>
- <version>0.10.21.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer</package>
diff --git a/docs/plugins/inspect/plugin-videofiltersbad.xml b/docs/plugins/inspect/plugin-videofiltersbad.xml
index 2d125eacf..629306f6f 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-videomeasure.xml b/docs/plugins/inspect/plugin-videomeasure.xml
index 2ed789493..2efa4627b 100644
--- a/docs/plugins/inspect/plugin-videomeasure.xml
+++ b/docs/plugins/inspect/plugin-videomeasure.xml
@@ -3,7 +3,7 @@
<description>Various video measurers</description>
<filename>../../gst/videomeasure/.libs/libgstvideomeasure.so</filename>
<basename>libgstvideomeasure.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-videosignal.xml b/docs/plugins/inspect/plugin-videosignal.xml
index a3cfd021e..39ee3abed 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-vmnc.xml b/docs/plugins/inspect/plugin-vmnc.xml
index 97268e82f..088c56239 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-wildmidi.xml b/docs/plugins/inspect/plugin-wildmidi.xml
index bc4fa9f77..233d339ba 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>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>GPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
diff --git a/docs/plugins/inspect/plugin-xvid.xml b/docs/plugins/inspect/plugin-xvid.xml
index eca1e9929..26de3c0bc 100644
--- a/docs/plugins/inspect/plugin-xvid.xml
+++ b/docs/plugins/inspect/plugin-xvid.xml
@@ -3,7 +3,7 @@
<description>XviD plugin library</description>
<filename>../../ext/xvid/.libs/libgstxvid.so</filename>
<basename>libgstxvid.so</basename>
- <version>0.10.22.1</version>
+ <version>0.10.23.1</version>
<license>GPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git</package>
@@ -47,7 +47,7 @@
<name>src</name>
<direction>source</direction>
<presence>always</presence>
- <details>video/x-xvid, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ <details>video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], profile=(string)simple, level=(string){ 0, 1, 2, 3, 4a, 5, 6 }; video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], profile=(string)advanced-real-time-simple, level=(string){ 1, 2, 3, 4 }; video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], profile=(string)advanced-simple, level=(string){ 0, 1, 2, 3, 4 }; video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ]; video/x-xvid, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
</caps>
</pads>
</element>
diff --git a/ext/Makefile.am b/ext/Makefile.am
index a1636f690..0d57dc3bb 100644
--- a/ext/Makefile.am
+++ b/ext/Makefile.am
@@ -94,6 +94,12 @@ else
DIRECTFB_DIR=
endif
+if USE_WAYLAND
+WAYLAND_DIR=wayland
+else
+WAYLAND_DIR=
+endif
+
if USE_DIVX
DIVX_DIR=divx
else
@@ -409,6 +415,7 @@ SUBDIRS=\
$(DC1394_DIR) \
$(DIRAC_DIR) \
$(DIRECTFB_DIR) \
+ $(WAYLAND_DIR) \
$(DIVX_DIR) \
$(DTS_DIR) \
$(RESINDVD_DIR) \
@@ -469,6 +476,7 @@ DIST_SUBDIRS = \
dc1394 \
dirac \
directfb \
+ wayland \
faac \
faad \
flite \
diff --git a/ext/assrender/gstassrender.c b/ext/assrender/gstassrender.c
index 882efc92e..b33444d81 100644
--- a/ext/assrender/gstassrender.c
+++ b/ext/assrender/gstassrender.c
@@ -31,6 +31,9 @@
* </refsect2>
*/
+/* 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>
diff --git a/ext/celt/gstceltdec.c b/ext/celt/gstceltdec.c
index be93a831c..f647baac7 100644
--- a/ext/celt/gstceltdec.c
+++ b/ext/celt/gstceltdec.c
@@ -291,8 +291,8 @@ gst_celt_dec_parse_comments (GstCeltDec * dec, GstBuffer * buf)
GST_INFO_OBJECT (dec, "tags: %" GST_PTR_FORMAT, list);
- gst_pad_push_event (GST_AUDIO_DECODER_SRC_PAD (dec),
- gst_event_new_tag (list));
+ gst_audio_decoder_merge_tags (GST_AUDIO_DECODER (dec), list,
+ GST_TAG_MERGE_REPLACE);
g_free (encoder);
g_free (ver);
diff --git a/ext/cog/gstcogcolorspace.c b/ext/cog/gstcogcolorspace.c
index f81df6cc2..f3de99ade 100644
--- a/ext/cog/gstcogcolorspace.c
+++ b/ext/cog/gstcogcolorspace.c
@@ -372,7 +372,7 @@ gst_cogcolorspace_caps_get_chroma_site (GstCaps * caps)
s = gst_video_parse_caps_chroma_site (caps);
if (s == NULL)
- return COG_COLOR_MATRIX_SDTV;
+ return COG_CHROMA_SITE_MPEG2;
if (strcmp (s, "jpeg") == 0) {
return COG_CHROMA_SITE_JPEG;
diff --git a/ext/curl/gstcurlsink.c b/ext/curl/gstcurlsink.c
index a06843522..2ed5b20a6 100644
--- a/ext/curl/gstcurlsink.c
+++ b/ext/curl/gstcurlsink.c
@@ -850,7 +850,7 @@ gst_curl_sink_handle_transfer (GstCurlSink * sink)
if (!proxy_conn_established && (resp_proxy != RESPONSE_CONNECT_PROXY)
&& proxy_auth) {
curl_easy_getinfo (sink->curl, CURLINFO_HTTP_CONNECTCODE, &resp_proxy);
- if ((resp_proxy == RESPONSE_CONNECT_PROXY)) {
+ if (resp_proxy == RESPONSE_CONNECT_PROXY) {
GST_LOG ("received HTTP/1.0 200 Connection Established");
/* Workaround: redefine HTTP headers before connecting to HTTP server.
* When talking to proxy, the Content-Length: 0 is send with the request.
diff --git a/ext/directfb/dfbvideosink.c b/ext/directfb/dfbvideosink.c
index 038e3ee33..0d73172e3 100644
--- a/ext/directfb/dfbvideosink.c
+++ b/ext/directfb/dfbvideosink.c
@@ -1658,7 +1658,7 @@ gst_dfbvideosink_show_frame (GstBaseSink * bsink, GstBuffer * buf)
res = dest->Unlock (dest);
- res = dest->Release (dest);
+ dest->Release (dest);
if (dfbvideosink->backbuffer) {
if (dfbvideosink->vsync) {
diff --git a/ext/dts/gstdtsdec.c b/ext/dts/gstdtsdec.c
index 07335d84a..ca7e35dc6 100644
--- a/ext/dts/gstdtsdec.c
+++ b/ext/dts/gstdtsdec.c
@@ -132,8 +132,6 @@ static gboolean gst_dtsdec_parse (GstAudioDecoder * dec, GstAdapter * adapter,
gint * offset, gint * length);
static GstFlowReturn gst_dtsdec_handle_frame (GstAudioDecoder * dec,
GstBuffer * buffer);
-static GstFlowReturn gst_dtsdec_pre_push (GstAudioDecoder * bdec,
- GstBuffer ** buffer);
static GstFlowReturn gst_dtsdec_chain (GstPad * pad, GstObject * parent,
GstBuffer * buf);
@@ -173,7 +171,6 @@ gst_dtsdec_class_init (GstDtsDecClass * klass)
gstbase_class->set_format = GST_DEBUG_FUNCPTR (gst_dtsdec_set_format);
gstbase_class->parse = GST_DEBUG_FUNCPTR (gst_dtsdec_parse);
gstbase_class->handle_frame = GST_DEBUG_FUNCPTR (gst_dtsdec_handle_frame);
- gstbase_class->pre_push = GST_DEBUG_FUNCPTR (gst_dtsdec_pre_push);
/**
* GstDtsDec::drc
@@ -257,10 +254,6 @@ gst_dtsdec_stop (GstAudioDecoder * dec)
dca_free (dts->state);
dts->state = NULL;
}
- if (dts->pending_tags) {
- gst_tag_list_free (dts->pending_tags);
- dts->pending_tags = NULL;
- }
return TRUE;
}
@@ -284,7 +277,7 @@ gst_dtsdec_parse (GstAudioDecoder * bdec, GstAdapter * adapter,
bit_rate = dts->bit_rate;
sample_rate = dts->sample_rate;
flags = 0;
- while (av >= 7) {
+ while (size >= 7) {
length = dca_syncinfo (dts->state, data, &flags,
&sample_rate, &bit_rate, &frame_length);
@@ -447,28 +440,9 @@ gst_dtsdec_update_streaminfo (GstDtsDec * dts)
/* 1 => open bitrate, 2 => variable bitrate, 3 => lossless */
gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_BITRATE,
(guint) dts->bit_rate, NULL);
-
- if (dts->pending_tags) {
- gst_tag_list_free (dts->pending_tags);
- dts->pending_tags = NULL;
- }
-
- dts->pending_tags = taglist;
- }
-}
-
-static GstFlowReturn
-gst_dtsdec_pre_push (GstAudioDecoder * bdec, GstBuffer ** buffer)
-{
- GstDtsDec *dts = GST_DTSDEC (bdec);
-
- if (G_UNLIKELY (dts->pending_tags)) {
- gst_pad_push_event (GST_AUDIO_DECODER_SRC_PAD (dts),
- gst_event_new_tag (dts->pending_tags));
- dts->pending_tags = NULL;
+ gst_audio_decoder_merge_tags (GST_AUDIO_DECODER (dts), taglist,
+ GST_TAG_MERGE_REPLACE);
}
-
- return GST_FLOW_OK;
}
static GstFlowReturn
diff --git a/ext/dts/gstdtsdec.h b/ext/dts/gstdtsdec.h
index 16b7e91ea..b37b59024 100644
--- a/ext/dts/gstdtsdec.h
+++ b/ext/dts/gstdtsdec.h
@@ -68,8 +68,6 @@ struct _GstDtsDec {
#else
dts_state_t *state;
#endif
-
- GstTagList *pending_tags;
};
struct _GstDtsDecClass {
diff --git a/ext/faad/gstfaad.c b/ext/faad/gstfaad.c
index 1db422986..f753a55f1 100644
--- a/ext/faad/gstfaad.c
+++ b/ext/faad/gstfaad.c
@@ -828,6 +828,8 @@ decode_failed:
{
GST_AUDIO_DECODER_ERROR (faad, 1, STREAM, DECODE, (NULL),
("decoding error: %s", faacDecGetErrorMessage (info.error)), ret);
+ if (ret == GST_FLOW_OK)
+ gst_audio_decoder_finish_frame (dec, NULL, 1);
goto out;
}
negotiation_failed:
diff --git a/ext/flite/gstflite.c b/ext/flite/gstflite.c
index 2995d9f3e..d75bd2ffe 100644
--- a/ext/flite/gstflite.c
+++ b/ext/flite/gstflite.c
@@ -24,7 +24,6 @@
#include <gst/gst.h>
#include <flite/flite.h>
-GType gst_flite_synth_get_type (void);
GType gst_flite_test_src_get_type (void);
@@ -33,8 +32,6 @@ plugin_init (GstPlugin * plugin)
{
flite_init ();
-// gst_element_register (plugin, "flitesynth", GST_RANK_NONE,
-// gst_flite_synth_get_type ());
gst_element_register (plugin, "flitetestsrc", GST_RANK_NONE,
gst_flite_test_src_get_type ());
diff --git a/ext/flite/gstflitetestsrc.c b/ext/flite/gstflitetestsrc.c
index a08dcbb7f..e7efc20b8 100644
--- a/ext/flite/gstflitetestsrc.c
+++ b/ext/flite/gstflitetestsrc.c
@@ -372,10 +372,9 @@ gst_flite_test_src_get_times (GstBaseSrc * basesrc, GstBuffer * buffer,
}
#endif
+/* there is no header for libflite_cmu_us_kal */
cst_voice *register_cmu_us_kal ();
-
-
static gboolean
gst_flite_test_src_start (GstBaseSrc * basesrc)
{
diff --git a/ext/gme/gstgme.c b/ext/gme/gstgme.c
index 9ba59e1fa..07e240e47 100644
--- a/ext/gme/gstgme.c
+++ b/ext/gme/gstgme.c
@@ -18,6 +18,10 @@
* Boston, MA 02111-1307, 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
diff --git a/ext/gsettings/gstgsettingsaudiosink.c b/ext/gsettings/gstgsettingsaudiosink.c
index f4155b3bc..12d848938 100644
--- a/ext/gsettings/gstgsettingsaudiosink.c
+++ b/ext/gsettings/gstgsettingsaudiosink.c
@@ -160,8 +160,9 @@ static void
on_changed (GSettings * settings, gchar * key, GstGSettingsAudioSink * sink)
{
gboolean changed = FALSE;
- if (!g_str_has_suffix (key, "audiosink"));
- return;
+
+ if (!g_str_has_suffix (key, "audiosink"))
+ return;
GST_OBJECT_LOCK (sink);
if ((sink->profile == GST_GSETTINGS_AUDIOSINK_PROFILE_SOUNDS &&
diff --git a/ext/gsettings/gstgsettingsaudiosrc.c b/ext/gsettings/gstgsettingsaudiosrc.c
index 7b9bd1f18..c30f12271 100644
--- a/ext/gsettings/gstgsettingsaudiosrc.c
+++ b/ext/gsettings/gstgsettingsaudiosrc.c
@@ -104,8 +104,8 @@ fail:
static void
on_changed (GSettings * settings, gchar * key, GstGSettingsAudioSrc * src)
{
- if (!g_str_equal (key, "audiosrc"));
- return;
+ if (!g_str_equal (key, "audiosrc"))
+ return;
gst_gsettings_audio_src_change_child (src);
}
diff --git a/ext/gsettings/gstgsettingsvideosink.c b/ext/gsettings/gstgsettingsvideosink.c
index f04e8054c..e225ec14e 100644
--- a/ext/gsettings/gstgsettingsvideosink.c
+++ b/ext/gsettings/gstgsettingsvideosink.c
@@ -104,8 +104,8 @@ fail:
static void
on_changed (GSettings * settings, gchar * key, GstGSettingsVideoSink * sink)
{
- if (!g_str_has_suffix (key, "videosink"));
- return;
+ if (!g_str_has_suffix (key, "videosink"))
+ return;
gst_gsettings_video_sink_change_child (sink);
}
diff --git a/ext/gsettings/gstgsettingsvideosrc.c b/ext/gsettings/gstgsettingsvideosrc.c
index 877656814..6c2a5b03e 100644
--- a/ext/gsettings/gstgsettingsvideosrc.c
+++ b/ext/gsettings/gstgsettingsvideosrc.c
@@ -104,8 +104,8 @@ fail:
static void
on_changed (GSettings * settings, gchar * key, GstGSettingsVideoSrc * src)
{
- if (!g_str_equal (key, "videosrc"));
- return;
+ if (!g_str_equal (key, "videosrc"))
+ return;
gst_gsettings_video_src_change_child (src);
}
diff --git a/ext/modplug/gstmodplug.cc b/ext/modplug/gstmodplug.cc
index d849a44e1..3d7cbc04f 100644
--- a/ext/modplug/gstmodplug.cc
+++ b/ext/modplug/gstmodplug.cc
@@ -491,6 +491,10 @@ gst_modplug_load_song (GstModPlug * modplug)
gst_structure_get_int (structure, "channels", &modplug->channel);
gst_structure_get_int (structure, "rate", &modplug->frequency);
+
+ GST_DEBUG_OBJECT (modplug,
+ "Audio settings: %d bits, %d channel(s), %d Hz sampling rate",
+ modplug->bits, modplug->channel, modplug->frequency);
gst_pad_set_caps (modplug->srcpad, newcaps);
gst_caps_unref (newcaps);
@@ -672,7 +676,8 @@ gst_modplug_loop (GstModPlug * modplug)
if (modplug->offset == modplug->song_size) {
GstTagList *tags;
gboolean ok;
- gchar comment[16384];
+ #define COMMENT_SIZE 16384
+ gchar comment[COMMENT_SIZE];
GstSegment seg;
ok = gst_modplug_load_song (modplug);
@@ -695,7 +700,9 @@ gst_modplug_loop (GstModPlug * modplug)
GST_TAG_BEATS_PER_MINUTE,
(gdouble) modplug->mSoundFile->GetMusicTempo (), NULL);
- if (modplug->mSoundFile->GetSongComments ((gchar *) & comment, 16384, 32)) {
+ if (modplug->mSoundFile->GetSongComments ((gchar *) & comment,
+ COMMENT_SIZE, 32)) {
+ comment[COMMENT_SIZE - 1] = '\0';
gst_tag_list_add (tags, GST_TAG_MERGE_APPEND,
GST_TAG_COMMENT, comment, NULL);
}
@@ -713,7 +720,7 @@ gst_modplug_loop (GstModPlug * modplug)
gfloat temp;
temp = (gfloat) modplug->song_length / modplug->seek_at;
- seek_to_pos = (int) (modplug->mSoundFile->GetMaxPosition () / temp);
+ seek_to_pos = (gint) (modplug->mSoundFile->GetMaxPosition () / temp);
GST_DEBUG_OBJECT (modplug, "Seeking to row %d", seek_to_pos);
@@ -722,7 +729,9 @@ gst_modplug_loop (GstModPlug * modplug)
}
/* read and output a buffer */
- out = gst_buffer_new_allocate (NULL, modplug->read_bytes, NULL);
+ GST_LOG_OBJECT (modplug, "Read %d bytes", (gint)modplug->read_bytes);
+ /* libmodplug 0.8.7 trashes memory */
+ out = gst_buffer_new_allocate (NULL, modplug->read_bytes * 2, NULL);
gst_buffer_map (out, &map, GST_MAP_WRITE);
if (!modplug->mSoundFile->Read (map.data, modplug->read_bytes)) {
@@ -730,6 +739,7 @@ gst_modplug_loop (GstModPlug * modplug)
goto eos;
}
gst_buffer_unmap (out, &map);
+ gst_buffer_resize (out, 0, modplug->read_bytes);
GST_BUFFER_DURATION (out) =
gst_util_uint64_scale_int (modplug->read_samples, GST_SECOND,
@@ -796,6 +806,7 @@ gst_modplug_change_state (GstElement * element, GstStateChange transition)
}
if (modplug->mSoundFile) {
modplug->mSoundFile->Destroy ();
+ delete modplug->mSoundFile;
modplug->mSoundFile = NULL;
}
break;
diff --git a/ext/musepack/gstmusepackdec.c b/ext/musepack/gstmusepackdec.c
index 30a34bff3..0401686bb 100644
--- a/ext/musepack/gstmusepackdec.c
+++ b/ext/musepack/gstmusepackdec.c
@@ -19,6 +19,10 @@
* Boston, MA 02111-1307, 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
diff --git a/ext/openal/gstopenalsink.c b/ext/openal/gstopenalsink.c
index ece590531..70398ee49 100644
--- a/ext/openal/gstopenalsink.c
+++ b/ext/openal/gstopenalsink.c
@@ -20,6 +20,10 @@
* Boston, MA 02111-1307, USA.
*/
+/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex
+ * with newer GLib versions (>= 2.31.0) */
+#define GLIB_DISABLE_DEPRECATION_WARNINGS
+
/**
* SECTION:element-openalsink
*
diff --git a/ext/opencv/MotionCells.cpp b/ext/opencv/MotionCells.cpp
index 5223bc7f7..6d18a9993 100644
--- a/ext/opencv/MotionCells.cpp
+++ b/ext/opencv/MotionCells.cpp
@@ -42,6 +42,13 @@
* Boston, MA 02111-1307, USA.
*/
+/* This breaks the build for reasons that aren't entirely clear to me yet */
+#if 0
+//#ifdef HAVE_CONFIG_H
+//#include "config.h"
+//#endif
+#endif
+
#include <cstdlib>
#include <errno.h>
#include <math.h>
diff --git a/ext/opencv/MotionCells.h b/ext/opencv/MotionCells.h
index ee84fd6b5..68a2fec57 100644
--- a/ext/opencv/MotionCells.h
+++ b/ext/opencv/MotionCells.h
@@ -46,7 +46,12 @@
#define MOTIONCELLS_H_
#include <cv.h> // includes OpenCV definitions
+#ifdef HAVE_HIGHGUI_H
#include <highgui.h> // includes highGUI definitions
+#endif
+#ifdef HAVE_OPENCV2_HIGHGUI_HIGHGUI_C_H
+#include <opencv2/highgui/highgui_c.h> // includes highGUI definitions
+#endif
#include <iostream>
#include <fstream>
#include <vector>
diff --git a/ext/opencv/gstfaceblur.c b/ext/opencv/gstfaceblur.c
index b4b6711b8..6a73db915 100644
--- a/ext/opencv/gstfaceblur.c
+++ b/ext/opencv/gstfaceblur.c
@@ -68,7 +68,8 @@
GST_DEBUG_CATEGORY_STATIC (gst_face_blur_debug);
#define GST_CAT_DEFAULT gst_face_blur_debug
-#define DEFAULT_PROFILE "/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml"
+#define HAAR_CASCADES_DIR OPENCV_PREFIX "/share/opencv/haarcascades/"
+#define DEFAULT_PROFILE HAAR_CASCADES_DIR "haarcascade_frontalface_default.xml"
/* Filter signals and args */
enum
diff --git a/ext/opencv/gstfacedetect.c b/ext/opencv/gstfacedetect.c
index 7f2121626..5a0c09fd2 100644
--- a/ext/opencv/gstfacedetect.c
+++ b/ext/opencv/gstfacedetect.c
@@ -82,10 +82,11 @@
GST_DEBUG_CATEGORY_STATIC (gst_face_detect_debug);
#define GST_CAT_DEFAULT gst_face_detect_debug
-#define DEFAULT_FACE_PROFILE "/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml"
-#define DEFAULT_NOSE_PROFILE "/usr/share/opencv/haarcascades/haarcascade_mcs_nose.xml"
-#define DEFAULT_MOUTH_PROFILE "/usr/share/opencv/haarcascades/haarcascade_mcs_mouth.xml"
-#define DEFAULT_EYES_PROFILE "/usr/share/opencv/haarcascades/haarcascade_mcs_eyepair_small.xml"
+#define HAAR_CASCADES_DIR OPENCV_PREFIX "/share/opencv/haarcascades/"
+#define DEFAULT_FACE_PROFILE HAAR_CASCADES_DIR "haarcascade_frontalface_default.xml"
+#define DEFAULT_NOSE_PROFILE HAAR_CASCADES_DIR "haarcascade_mcs_nose.xml"
+#define DEFAULT_MOUTH_PROFILE HAAR_CASCADES_DIR "haarcascade_mcs_mouth.xml"
+#define DEFAULT_EYES_PROFILE HAAR_CASCADES_DIR "haarcascade_mcs_eyepair_small.xml"
#define DEFAULT_SCALE_FACTOR 1.1
#define DEFAULT_FLAGS 0
#define DEFAULT_MIN_NEIGHBORS 3
@@ -471,6 +472,19 @@ gst_face_detect_message_new (GstFaceDetect * filter, GstBuffer * buf)
return gst_message_new_element (GST_OBJECT (filter), s);
}
+static CvSeq *
+gst_face_detect_run_detector (GstFaceDetect * filter,
+ CvHaarClassifierCascade * detector, gint min_size_width,
+ gint min_size_height)
+{
+ return cvHaarDetectObjects (filter->cvGray, detector,
+ filter->cvStorage, filter->scale_factor, filter->min_neighbors,
+ filter->flags, cvSize (min_size_width, min_size_height)
+#if (CV_MAJOR_VERSION >= 2) && (CV_MINOR_VERSION >= 2)
+ , cvSize (min_size_width + 2, min_size_height + 2)
+#endif
+ );
+}
/*
* Performs the face detection
@@ -483,9 +497,11 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf,
if (filter->cvFaceDetect) {
GstMessage *msg = NULL;
+ GstStructure *s;
GValue facelist = { 0 };
+ GValue facedata = { 0 };
CvSeq *faces;
- CvSeq *mouth, *nose, *eyes;
+ CvSeq *mouth = NULL, *nose = NULL, *eyes = NULL;
gint i;
gboolean do_display = FALSE;
@@ -500,96 +516,77 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf,
cvCvtColor (img, filter->cvGray, CV_RGB2GRAY);
cvClearMemStorage (filter->cvStorage);
- faces =
- cvHaarDetectObjects (filter->cvGray, filter->cvFaceDetect,
- filter->cvStorage, filter->scale_factor, filter->min_neighbors,
- filter->flags, cvSize (filter->min_size_width, filter->min_size_height)
-#if (CV_MAJOR_VERSION >= 2) && (CV_MINOR_VERSION >= 2)
- , cvSize (filter->min_size_width + 2, filter->min_size_height + 2)
-#endif
- );
+ faces = gst_face_detect_run_detector (filter, filter->cvFaceDetect,
+ filter->min_size_width, filter->min_size_height);
- if (faces && faces->total > 0) {
- msg = gst_face_detect_message_new (filter, buf);
- g_value_init (&facelist, GST_TYPE_LIST);
- }
+ msg = gst_face_detect_message_new (filter, buf);
+ g_value_init (&facelist, GST_TYPE_LIST);
for (i = 0; i < (faces ? faces->total : 0); i++) {
CvRect *r = (CvRect *) cvGetSeqElem (faces, i);
- GValue value = { 0 };
- GstStructure *s;
guint mw = filter->min_size_width / 8;
guint mh = filter->min_size_height / 8;
- guint rnx, rny, rnw, rnh;
- guint rmx, rmy, rmw, rmh;
- guint rex, rey, rew, reh;
+ guint rnx = 0, rny = 0, rnw, rnh;
+ guint rmx = 0, rmy = 0, rmw, rmh;
+ guint rex = 0, rey = 0, rew, reh;
gboolean have_nose, have_mouth, have_eyes;
/* detect face features */
- rnx = r->x + r->width / 4;
- rny = r->y + r->height / 4;
- rnw = r->width / 2;
- rnh = r->height / 2;
- cvSetImageROI (filter->cvGray, cvRect (rnx, rny, rnw, rnh));
- nose =
- cvHaarDetectObjects (filter->cvGray, filter->cvNoseDetect,
- filter->cvStorage, filter->scale_factor, filter->min_neighbors,
- filter->flags, cvSize (mw, mh)
-#if (CV_MAJOR_VERSION >= 2) && (CV_MINOR_VERSION >= 2)
- , cvSize (mw + 2, mh + 2)
-#endif
- );
- have_nose = (nose && nose->total);
- cvResetImageROI (filter->cvGray);
-
- rmx = r->x;
- rmy = r->y + r->height / 2;
- rmw = r->width;
- rmh = r->height / 2;
- cvSetImageROI (filter->cvGray, cvRect (rmx, rmy, rmw, rmh));
- mouth =
- cvHaarDetectObjects (filter->cvGray, filter->cvMouthDetect,
- filter->cvStorage, filter->scale_factor, filter->min_neighbors,
- filter->flags, cvSize (mw, mh)
-#if (CV_MAJOR_VERSION >= 2) && (CV_MINOR_VERSION >= 2)
- , cvSize (mw + 2, mh + 2)
-#endif
- );
- have_mouth = (mouth && mouth->total);
- cvResetImageROI (filter->cvGray);
-
- rex = r->x;
- rey = r->y;
- rew = r->width;
- reh = r->height / 2;
- cvSetImageROI (filter->cvGray, cvRect (rex, rey, rew, reh));
- eyes =
- cvHaarDetectObjects (filter->cvGray, filter->cvEyesDetect,
- filter->cvStorage, filter->scale_factor, filter->min_neighbors,
- filter->flags, cvSize (mw, mh)
-#if (CV_MAJOR_VERSION >= 2) && (CV_MINOR_VERSION >= 2)
- , cvSize (mw + 2, mh + 2)
-#endif
- );
- have_eyes = (eyes && eyes->total);
- cvResetImageROI (filter->cvGray);
+ if (filter->cvNoseDetect) {
+ rnx = r->x + r->width / 4;
+ rny = r->y + r->height / 4;
+ rnw = r->width / 2;
+ rnh = r->height / 2;
+ cvSetImageROI (filter->cvGray, cvRect (rnx, rny, rnw, rnh));
+ nose =
+ gst_face_detect_run_detector (filter, filter->cvNoseDetect, mw, mh);
+ have_nose = (nose && nose->total);
+ cvResetImageROI (filter->cvGray);
+ } else {
+ have_nose = FALSE;
+ }
+
+ if (filter->cvMouthDetect) {
+ rmx = r->x;
+ rmy = r->y + r->height / 2;
+ rmw = r->width;
+ rmh = r->height / 2;
+ cvSetImageROI (filter->cvGray, cvRect (rmx, rmy, rmw, rmh));
+ mouth =
+ gst_face_detect_run_detector (filter, filter->cvMouthDetect, mw,
+ mh);
+ have_mouth = (mouth && mouth->total);
+ cvResetImageROI (filter->cvGray);
+ } else {
+ have_mouth = FALSE;
+ }
+
+ if (filter->cvEyesDetect) {
+ rex = r->x;
+ rey = r->y;
+ rew = r->width;
+ reh = r->height / 2;
+ cvSetImageROI (filter->cvGray, cvRect (rex, rey, rew, reh));
+ eyes =
+ gst_face_detect_run_detector (filter, filter->cvEyesDetect, mw, mh);
+ have_eyes = (eyes && eyes->total);
+ cvResetImageROI (filter->cvGray);
+ } else {
+ have_eyes = FALSE;
+ }
GST_LOG_OBJECT (filter,
"%2d/%2d: x,y = %4u,%4u: w.h = %4u,%4u : features(e,n,m) = %d,%d,%d",
i, faces->total, r->x, r->y, r->width, r->height,
have_eyes, have_nose, have_mouth);
- /* ignore 'face' where we don't fix mount/nose/eyes ? */
- if (!(have_eyes && have_nose && have_mouth))
- continue;
-
s = gst_structure_new ("face",
"x", G_TYPE_UINT, r->x,
"y", G_TYPE_UINT, r->y,
"width", G_TYPE_UINT, r->width,
"height", G_TYPE_UINT, r->height, NULL);
- if (nose && nose->total) {
+ if (have_nose) {
CvRect *sr = (CvRect *) cvGetSeqElem (nose, 0);
GST_LOG_OBJECT (filter, "nose/%d: x,y = %4u,%4u: w.h = %4u,%4u",
nose->total, rnx + sr->x, rny + sr->y, sr->width, sr->height);
@@ -599,7 +596,7 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf,
"nose->width", G_TYPE_UINT, sr->width,
"nose->height", G_TYPE_UINT, sr->height, NULL);
}
- if (mouth && mouth->total) {
+ if (have_mouth) {
CvRect *sr = (CvRect *) cvGetSeqElem (mouth, 0);
GST_LOG_OBJECT (filter, "mouth/%d: x,y = %4u,%4u: w.h = %4u,%4u",
mouth->total, rmx + sr->x, rmy + sr->y, sr->width, sr->height);
@@ -609,7 +606,7 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf,
"mouth->width", G_TYPE_UINT, sr->width,
"mouth->height", G_TYPE_UINT, sr->height, NULL);
}
- if (eyes && eyes->total) {
+ if (have_eyes) {
CvRect *sr = (CvRect *) cvGetSeqElem (eyes, 0);
GST_LOG_OBJECT (filter, "eyes/%d: x,y = %4u,%4u: w.h = %4u,%4u",
eyes->total, rex + sr->x, rey + sr->y, sr->width, sr->height);
@@ -620,10 +617,11 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf,
"eyes->height", G_TYPE_UINT, sr->height, NULL);
}
- g_value_init (&value, GST_TYPE_STRUCTURE);
- gst_value_set_structure (&value, s);
- gst_value_list_append_value (&facelist, &value);
- g_value_unset (&value);
+ g_value_init (&facedata, GST_TYPE_STRUCTURE);
+ g_value_take_boxed (&facedata, s);
+ gst_value_list_append_value (&facelist, &facedata);
+ g_value_unset (&facedata);
+ s = NULL;
if (do_display) {
CvPoint center;
@@ -642,7 +640,7 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf,
cvEllipse (img, center, axes, 0.0, 0.0, 360.0, CV_RGB (cr, cg, cb),
3, 8, 0);
- if (nose && nose->total) {
+ if (have_nose) {
CvRect *sr = (CvRect *) cvGetSeqElem (nose, 0);
w = sr->width / 2;
@@ -654,7 +652,7 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf,
cvEllipse (img, center, axes, 0.0, 0.0, 360.0, CV_RGB (cr, cg, cb),
1, 8, 0);
}
- if (mouth && mouth->total) {
+ if (have_mouth) {
CvRect *sr = (CvRect *) cvGetSeqElem (mouth, 0);
w = sr->width / 2;
@@ -666,7 +664,7 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf,
cvEllipse (img, center, axes, 0.0, 0.0, 360.0, CV_RGB (cr, cg, cb),
1, 8, 0);
}
- if (eyes && eyes->total) {
+ if (have_eyes) {
CvRect *sr = (CvRect *) cvGetSeqElem (eyes, 0);
w = sr->width / 2;
@@ -681,11 +679,9 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf,
}
}
- if (msg) {
- gst_structure_set_value (msg->structure, "faces", &facelist);
- g_value_unset (&facelist);
- gst_element_post_message (GST_ELEMENT (filter), msg);
- }
+ gst_structure_set_value (msg->structure, "faces", &facelist);
+ g_value_unset (&facelist);
+ gst_element_post_message (GST_ELEMENT (filter), msg);
}
return GST_FLOW_OK;
diff --git a/ext/opencv/gstopencvutils.c b/ext/opencv/gstopencvutils.c
index 554b38be9..daaf0651f 100644
--- a/ext/opencv/gstopencvutils.c
+++ b/ext/opencv/gstopencvutils.c
@@ -19,6 +19,10 @@
* Boston, MA 02111-1307, USA.
*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
#include "gstopencvutils.h"
static gboolean
diff --git a/ext/opencv/gstopencvvideofilter.c b/ext/opencv/gstopencvvideofilter.c
index 2d6cb6d84..5eeda942b 100644
--- a/ext/opencv/gstopencvvideofilter.c
+++ b/ext/opencv/gstopencvvideofilter.c
@@ -122,6 +122,8 @@ gst_opencv_video_filter_finalize (GObject * obj)
if (transform->cvImage)
cvReleaseImage (&transform->cvImage);
+ if (transform->out_cvImage)
+ cvReleaseImage (&transform->out_cvImage);
G_OBJECT_CLASS (parent_class)->finalize (obj);
}
diff --git a/ext/opencv/gsttemplatematch.h b/ext/opencv/gsttemplatematch.h
index 7b4b38852..8d99f982e 100644
--- a/ext/opencv/gsttemplatematch.h
+++ b/ext/opencv/gsttemplatematch.h
@@ -48,7 +48,12 @@
#include <gst/gst.h>
#include <cv.h>
-#include <highgui.h>
+#ifdef HAVE_HIGHGUI_H
+#include <highgui.h> // includes highGUI definitions
+#endif
+#ifdef HAVE_OPENCV2_HIGHGUI_HIGHGUI_C_H
+#include <opencv2/highgui/highgui_c.h> // includes highGUI definitions
+#endif
G_BEGIN_DECLS
/* #defines don't like whitespacey bits */
diff --git a/ext/opencv/motioncells_wrapper.cpp b/ext/opencv/motioncells_wrapper.cpp
index d50968677..f55802bb4 100644
--- a/ext/opencv/motioncells_wrapper.cpp
+++ b/ext/opencv/motioncells_wrapper.cpp
@@ -42,6 +42,13 @@
* Boston, MA 02111-1307, USA.
*/
+/* This breaks the build for reasons that aren't entirely clear to me yet */
+#if 0
+//#ifdef HAVE_CONFIG_H
+//#include "config.h"
+//#endif
+#endif
+
#include <stdio.h>
#include <limits.h>
#include "motioncells_wrapper.h"
diff --git a/ext/opus/gstopusenc.c b/ext/opus/gstopusenc.c
index 9c10d1a4b..be95fb798 100644
--- a/ext/opus/gstopusenc.c
+++ b/ext/opus/gstopusenc.c
@@ -368,11 +368,9 @@ gst_opus_enc_setup_base_class (GstOpusEnc * enc, GstAudioEncoder * benc)
{
gst_audio_encoder_set_latency (benc,
gst_opus_enc_get_latency (enc), gst_opus_enc_get_latency (enc));
- gst_audio_encoder_set_frame_samples_min (benc,
- enc->frame_samples * enc->n_channels * 2);
- gst_audio_encoder_set_frame_samples_max (benc,
- enc->frame_samples * enc->n_channels * 2);
- gst_audio_encoder_set_frame_max (benc, 0);
+ gst_audio_encoder_set_frame_samples_min (benc, enc->frame_samples);
+ gst_audio_encoder_set_frame_samples_max (benc, enc->frame_samples);
+ gst_audio_encoder_set_frame_max (benc, 1);
}
static gint
@@ -789,6 +787,9 @@ gst_opus_enc_encode (GstOpusEnc * enc, GstBuffer * buf)
gsize bytes = enc->frame_samples * enc->n_channels * 2;
gint ret = GST_FLOW_OK;
GstMapInfo map;
+ GstMapInfo omap;
+ gint outsize;
+ GstBuffer *outbuf;
g_mutex_lock (enc->property_lock);
@@ -813,50 +814,46 @@ gst_opus_enc_encode (GstOpusEnc * enc, GstBuffer * buf)
goto done;
}
- while (size) {
- gint encoded_size;
- GstBuffer *outbuf;
- GstMapInfo omap;
-
- outbuf = gst_buffer_new_and_alloc (enc->max_payload_size * enc->n_channels);
- if (!outbuf)
- goto done;
-
- GST_DEBUG_OBJECT (enc, "encoding %d samples (%d bytes)",
- enc->frame_samples, (int) bytes);
-
- gst_buffer_map (outbuf, &omap, GST_MAP_WRITE);
- encoded_size =
- opus_multistream_encode (enc->state, (const gint16 *) data,
- enc->frame_samples, omap.data, enc->max_payload_size * enc->n_channels);
- gst_buffer_unmap (outbuf, &omap);
-
- if (encoded_size < 0) {
- GST_ERROR_OBJECT (enc, "Encoding failed: %d", encoded_size);
- ret = GST_FLOW_ERROR;
- goto done;
- } else if (encoded_size > enc->max_payload_size) {
- GST_WARNING_OBJECT (enc,
- "Encoded size %d is higher than max payload size (%d bytes)",
- encoded_size, enc->max_payload_size);
- ret = GST_FLOW_ERROR;
- goto done;
- }
+ g_assert (size == bytes);
+
+ outbuf = gst_buffer_new_and_alloc (enc->max_payload_size * enc->n_channels);
+ if (!outbuf)
+ goto done;
+
+ GST_DEBUG_OBJECT (enc, "encoding %d samples (%d bytes)",
+ enc->frame_samples, (int) bytes);
+
+ gst_buffer_map (outbuf, &omap, GST_MAP_WRITE);
- GST_DEBUG_OBJECT (enc, "Output packet is %u bytes", encoded_size);
- gst_buffer_set_size (outbuf, encoded_size);
+ GST_DEBUG_OBJECT (enc, "encoding %d samples (%d bytes)",
+ enc->frame_samples, (int) bytes);
- ret =
- gst_audio_encoder_finish_frame (GST_AUDIO_ENCODER (enc), outbuf,
- enc->frame_samples);
+ outsize =
+ opus_multistream_encode (enc->state, (const gint16 *) data,
+ enc->frame_samples, GST_BUFFER_DATA (outbuf),
+ enc->max_payload_size * enc->n_channels);
- if ((GST_FLOW_OK != ret) && (GST_FLOW_NOT_LINKED != ret))
- goto done;
+ gst_buffer_unmap (outbuf, &omap);
- data += bytes;
- size -= bytes;
+ if (outsize < 0) {
+ GST_ERROR_OBJECT (enc, "Encoding failed: %d", outsize);
+ ret = GST_FLOW_ERROR;
+ goto done;
+ } else if (outsize > enc->max_payload_size) {
+ GST_WARNING_OBJECT (enc,
+ "Encoded size %d is higher than max payload size (%d bytes)",
+ outsize, enc->max_payload_size);
+ ret = GST_FLOW_ERROR;
+ goto done;
}
+ GST_DEBUG_OBJECT (enc, "Output packet is %u bytes", outsize);
+ GST_BUFFER_SIZE (outbuf) = outsize;
+
+ ret =
+ gst_audio_encoder_finish_frame (GST_AUDIO_ENCODER (enc), outbuf,
+ enc->frame_samples);
+
done:
if (bdata)
diff --git a/ext/resindvd/resindvdsrc.c b/ext/resindvd/resindvdsrc.c
index 8ce39a1b2..0b29615bf 100644
--- a/ext/resindvd/resindvdsrc.c
+++ b/ext/resindvd/resindvdsrc.c
@@ -1037,6 +1037,7 @@ rsn_dvdsrc_step (resinDvdSrc * src, gboolean have_dvd_lock)
break;
case DVDNAV_CELL_CHANGE:{
dvdnav_cell_change_event_t *event = (dvdnav_cell_change_event_t *) data;
+ GstMessage *message;
src->pgc_duration = MPEGTIME_TO_GSTTIME (event->pgc_length);
/* event->cell_start has the wrong time - it doesn't handle
@@ -1050,6 +1051,10 @@ rsn_dvdsrc_step (resinDvdSrc * src, gboolean have_dvd_lock)
GST_TIME_FORMAT, GST_TIME_ARGS (src->pgc_duration),
GST_TIME_ARGS (src->cur_position));
+ message = gst_message_new_duration (GST_OBJECT (src), GST_FORMAT_TIME,
+ src->pgc_duration);
+ gst_element_post_message (GST_ELEMENT (src), message);
+
rsn_dvdsrc_prepare_streamsinfo_event (src);
src->need_tag_update = TRUE;
@@ -2423,6 +2428,53 @@ rsn_dvdsrc_src_event (GstBaseSrc * basesrc, GstEvent * event)
return res;
}
+static void
+rsn_dvdsrc_post_title_info (GstElement * element)
+{
+ resinDvdSrc *src = RESINDVDSRC (element);
+ GstMessage *message;
+ GstStructure *s;
+ int32_t n, ntitles;
+ int res;
+ GValue array = { 0 };
+
+ res = dvdnav_get_number_of_titles (src->dvdnav, &ntitles);
+ if (res != DVDNAV_STATUS_OK) {
+ GST_WARNING_OBJECT (src, "Failed to get number of titles: %d", res);
+ return;
+ }
+
+ g_value_init (&array, GST_TYPE_ARRAY);
+
+ s = gst_structure_new ("application/x-gst-dvd", "event",
+ G_TYPE_STRING, "dvd-title-info", NULL);
+
+ for (n = 0; n < ntitles; ++n) {
+ uint64_t *times, duration;
+ uint32_t nchapters;
+ GValue item = { 0 };
+
+ g_value_init (&item, G_TYPE_UINT64);
+
+ nchapters =
+ dvdnav_describe_title_chapters (src->dvdnav, n, &times, &duration);
+ if (nchapters == 0) {
+ GST_WARNING_OBJECT (src, "Failed to get title %d info", n);
+ g_value_set_uint64 (&item, GST_CLOCK_TIME_NONE);
+ } else {
+ g_value_set_uint64 (&item, gst_util_uint64_scale (duration, GST_SECOND,
+ 90000));
+ }
+ gst_value_array_append_value (&array, &item);
+ g_value_unset (&item);
+ }
+ gst_structure_set_value (s, "title-durations", &array);
+ g_value_unset (&array);
+
+ message = gst_message_new_element (GST_OBJECT (src), s);
+ gst_element_post_message (GST_ELEMENT_CAST (src), message);
+}
+
static GstStateChangeReturn
rsn_dvdsrc_change_state (GstElement * element, GstStateChange transition)
{
@@ -2459,6 +2511,9 @@ rsn_dvdsrc_change_state (GstElement * element, GstStateChange transition)
rsn_dvdsrc_check_nav_blocks (src);
g_mutex_unlock (src->dvd_lock);
break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ rsn_dvdsrc_post_title_info (element);
+ break;
default:
break;
}
@@ -2486,6 +2541,9 @@ rsn_dvdsrc_src_query (GstBaseSrc * basesrc, GstQuery * query)
if (format == GST_FORMAT_TIME) {
if (src->pgc_duration != GST_CLOCK_TIME_NONE) {
val = src->pgc_duration;
+
+ GST_DEBUG_OBJECT (src, "duration : %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (val));
gst_query_set_duration (query, format, val);
res = TRUE;
}
diff --git a/ext/rsvg/gstrsvgoverlay.c b/ext/rsvg/gstrsvgoverlay.c
index 9d4ce6025..5c9efba74 100644
--- a/ext/rsvg/gstrsvgoverlay.c
+++ b/ext/rsvg/gstrsvgoverlay.c
@@ -72,7 +72,7 @@ enum
{
PROP_0,
PROP_DATA,
- PROP_FILENAME,
+ PROP_LOCATION,
PROP_FIT_TO_FRAME,
PROP_X,
PROP_Y,
@@ -164,6 +164,8 @@ gst_rsvg_overlay_set_svg_data (GstRsvgOverlay * overlay, const gchar * data,
overlay->svg_width = svg_dimension.width;
overlay->svg_height = svg_dimension.height;
gst_base_transform_set_passthrough (btrans, FALSE);
+ GST_INFO_OBJECT (overlay, "updated SVG, %d x %d", overlay->svg_width,
+ overlay->svg_height);
}
}
}
@@ -184,7 +186,7 @@ gst_rsvg_overlay_set_property (GObject * object, guint prop_id,
FALSE);
break;
}
- case PROP_FILENAME:
+ case PROP_LOCATION:
{
gst_rsvg_overlay_set_svg_data (overlay, g_value_get_string (value), TRUE);
break;
@@ -336,7 +338,7 @@ gst_rsvg_overlay_data_sink_event (GstPad * pad, GstEvent * event)
GST_RSVG_UNLOCK (overlay);
}
- case GST_EVENT_FLUSH_START:
+ case GST_EVENT_FLUSH_STOP:
gst_adapter_clear (overlay->adapter);
break;
@@ -436,10 +438,11 @@ gst_rsvg_overlay_stop (GstBaseTransform * btrans)
if (overlay->handle) {
g_object_unref (overlay->handle);
- g_object_unref (overlay->adapter);
overlay->handle = NULL;
}
+ gst_adapter_clear (overlay->adapter);
+
return TRUE;
}
@@ -474,7 +477,7 @@ gst_rsvg_overlay_class_init (GstRsvgOverlayClass * klass)
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DATA,
g_param_spec_string ("data", "data", "SVG data.", "",
G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
- g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FILENAME,
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_LOCATION,
g_param_spec_string ("location", "location", "SVG file location.", "",
G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FIT_TO_FRAME,
diff --git a/ext/timidity/gstwildmidi.c b/ext/timidity/gstwildmidi.c
index 59d433237..c8570a05b 100644
--- a/ext/timidity/gstwildmidi.c
+++ b/ext/timidity/gstwildmidi.c
@@ -38,6 +38,10 @@
* </refsect2>
*/
+/* 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
diff --git a/ext/vp8/gstvp8enc.c b/ext/vp8/gstvp8enc.c
index 189d8df0b..d21ed23f4 100644
--- a/ext/vp8/gstvp8enc.c
+++ b/ext/vp8/gstvp8enc.c
@@ -827,7 +827,7 @@ gst_vp8_enc_set_format (GstBaseVideoEncoder * base_video_encoder,
/* prepare cached image buffer setup */
image = &encoder->image;
- memset (image, 0, sizeof (image));
+ memset (image, 0, sizeof (*image));
image->fmt = VPX_IMG_FMT_I420;
image->bps = 12;
diff --git a/ext/wayland/Makefile.am b/ext/wayland/Makefile.am
new file mode 100644
index 000000000..122e8f09e
--- /dev/null
+++ b/ext/wayland/Makefile.am
@@ -0,0 +1,13 @@
+plugin_LTLIBRARIES = libgstwaylandsink.la
+
+libgstwaylandsink_la_SOURCES = gstwaylandsink.c
+libgstwaylandsink_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
+ $(WAYLAND_CFLAGS)
+libgstwaylandsink_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \
+ -lgstvideo-$(GST_MAJORMINOR) \
+ -lgstinterfaces-$(GST_MAJORMINOR) \
+ $(WAYLAND_LIBS) $(LIBOIL_LIBS)
+libgstwaylandsink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstwaylandsink_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = gstwaylandsink.h
diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c
new file mode 100644
index 000000000..ecc026dc4
--- /dev/null
+++ b/ext/wayland/gstwaylandsink.c
@@ -0,0 +1,681 @@
+/*
+ * GStreamer Wayland video sink
+ *
+ * Copyright (C) 2011 Intel Corporation
+ * Copyright (C) 2011 Sreerenj Balachandran <sreerenj.balachandran@intel.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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/**
+ * SECTION:element-waylandsink
+ *
+ * The waylandsink is creating its own window and render the decoded video frames to that.
+ * Setup the Wayland environment as described in
+ * <ulink url="http://wayland.freedesktop.org/building.html">Wayland</ulink> home page.
+ * The current implementaion is based on weston compositor.
+ *
+ * <refsect2>
+ * <title>Example pipelines</title>
+ * |[
+ * gst-launch -v videotestsrc ! waylandsink
+ * ]| test the video rendering in wayland
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gstwaylandsink.h"
+
+/* signals */
+enum
+{
+ SIGNAL_0,
+ SIGNAL_FRAME_READY,
+ LAST_SIGNAL
+};
+
+/* Properties */
+enum
+{
+ PROP_0,
+ PROP_WAYLAND_DISPLAY
+};
+
+GST_DEBUG_CATEGORY (gstwayland_debug);
+#define GST_CAT_DEFAULT gstwayland_debug
+
+static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("video/x-raw-rgb, "
+ "framerate = (fraction) [ 0, MAX ], "
+ "endianness = (int) 4321,"
+ "red_mask = (int) 65280, "
+ "green_mask = (int) 16711680, "
+ "blue_mask = (int) -16777216,"
+ "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ] "));
+
+G_DEFINE_TYPE (GstWlBuffer, gst_wlbuffer, GST_TYPE_BUFFER);
+
+/*Fixme: Add more interfaces */
+GST_BOILERPLATE (GstWaylandSink, gst_wayland_sink, GstVideoSink,
+ GST_TYPE_VIDEO_SINK);
+
+static void gst_wlbuffer_finalize (GstWlBuffer * wbuffer);
+
+static void gst_wayland_sink_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+static void gst_wayland_sink_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_wayland_sink_finalize (GObject * object);
+static GstCaps *gst_wayland_sink_get_caps (GstBaseSink * bsink);
+static gboolean gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps);
+static gboolean gst_wayland_sink_start (GstBaseSink * bsink);
+static gboolean gst_wayland_sink_stop (GstBaseSink * bsink);
+static GstFlowReturn
+gst_wayland_sink_buffer_alloc (GstBaseSink * bsink, guint64 offset,
+ guint size, GstCaps * caps, GstBuffer ** buf);
+static gboolean gst_wayland_sink_preroll (GstBaseSink * bsink,
+ GstBuffer * buffer);
+static gboolean gst_wayland_sink_render (GstBaseSink * bsink,
+ GstBuffer * buffer);
+static void gst_wayland_bufferpool_clear (GstWaylandSink * sink);
+static void
+gst_wayland_buffer_destroy (GstWaylandSink * sink, GstWlBuffer * buffer);
+
+static int event_mask_update (uint32_t mask, void *data);
+static struct display *create_display (void);
+static void display_handle_global (struct wl_display *display, uint32_t id,
+ const char *interface, uint32_t version, void *data);
+static void redraw (void *data, struct wl_callback *callback, uint32_t time);
+static void create_window (GstWaylandSink * sink, struct display *display,
+ int width, int height);
+
+static void
+gst_wlbuffer_init (GstWlBuffer * buffer)
+{
+ buffer->wbuffer = NULL;
+ buffer->wlsink = NULL;
+}
+
+static void
+gst_wlbuffer_class_init (GstWlBufferClass * klass)
+{
+ GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (klass);
+
+ mini_object_class->finalize = (GstMiniObjectFinalizeFunction)
+ gst_wlbuffer_finalize;
+}
+
+static void
+gst_wlbuffer_finalize (GstWlBuffer * wbuffer)
+{
+ GstWaylandSink *sink = NULL;
+
+ g_return_if_fail (wbuffer != NULL);
+
+ GST_DEBUG_OBJECT (sink, "Finalizing the WlBuffer");
+ sink = wbuffer->wlsink;
+ if (!sink) {
+ GST_WARNING_OBJECT (wbuffer, "No sink..");
+ goto beach;
+ }
+
+ GST_DEBUG_OBJECT (sink, "recycling buffer %p in pool", wbuffer);
+ /* need to increment the refcount again to recycle */
+ gst_buffer_ref (GST_BUFFER (wbuffer));
+ g_mutex_lock (sink->pool_lock);
+ sink->buffer_pool = g_slist_prepend (sink->buffer_pool, wbuffer);
+ g_mutex_unlock (sink->pool_lock);
+
+beach:
+ return;
+}
+
+static void
+gst_wayland_sink_base_init (gpointer gclass)
+{
+
+ GstElementClass *element_class = GST_ELEMENT_CLASS (gclass);
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&sink_template));
+
+ gst_element_class_set_details_simple (element_class,
+ "wayland video sink", "Sink/Video",
+ "Output to wayland surface",
+ "Sreerenj Balachandran <sreerenj.balachandran@intel.com>");
+}
+
+static void
+gst_wayland_sink_class_init (GstWaylandSinkClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstBaseSinkClass *gstbasesink_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstbasesink_class = (GstBaseSinkClass *) 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);
+
+ 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->start = GST_DEBUG_FUNCPTR (gst_wayland_sink_start);
+ gstbasesink_class->buffer_alloc =
+ GST_DEBUG_FUNCPTR (gst_wayland_sink_buffer_alloc);
+ gstbasesink_class->stop = GST_DEBUG_FUNCPTR (gst_wayland_sink_stop);
+ gstbasesink_class->preroll = GST_DEBUG_FUNCPTR (gst_wayland_sink_preroll);
+ gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_wayland_sink_render);
+
+ g_object_class_install_property (gobject_class, PROP_WAYLAND_DISPLAY,
+ g_param_spec_pointer ("wayland-display", "Wayland Display",
+ "Wayland Display handle created by the application ",
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ parent_class = g_type_class_peek_parent (klass);
+}
+
+static void
+gst_wayland_sink_init (GstWaylandSink * sink,
+ GstWaylandSinkClass * wayland_sink_class)
+{
+
+ sink->caps = NULL;
+ sink->render_finish = TRUE;
+ sink->display = NULL;
+ sink->window = NULL;
+
+ sink->pool_lock = g_mutex_new ();
+ sink->buffer_pool = NULL;
+
+ sink->wayland_lock = g_mutex_new ();
+}
+
+static void
+gst_wayland_sink_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec)
+{
+ GstWaylandSink *sink = GST_WAYLAND_SINK (object);
+
+ switch (prop_id) {
+ case PROP_WAYLAND_DISPLAY:
+ g_value_set_pointer (value, sink->display);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_wayland_sink_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec)
+{
+ GstWaylandSink *sink = GST_WAYLAND_SINK (object);
+
+ switch (prop_id) {
+ case PROP_WAYLAND_DISPLAY:
+ sink->display = g_value_get_pointer (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+destroy_display (struct display *display)
+{
+ if (display->shm)
+ wl_shm_destroy (display->shm);
+
+ if (display->shell)
+ wl_shell_destroy (display->shell);
+
+ if (display->compositor)
+ wl_compositor_destroy (display->compositor);
+
+ wl_display_flush (display->display);
+ wl_display_destroy (display->display);
+ free (display);
+}
+
+static void
+destroy_window (struct window *window)
+{
+ if (window->shell_surface)
+ wl_shell_surface_destroy (window->shell_surface);
+ if (window->surface)
+ wl_surface_destroy (window->surface);
+ free (window);
+}
+
+static void
+gst_wayland_sink_finalize (GObject * object)
+{
+ GstWaylandSink *sink = GST_WAYLAND_SINK (object);
+
+ GST_DEBUG_OBJECT (sink, "Finalizing the sink..");
+
+ if (sink->window)
+ destroy_window (sink->window);
+ if (sink->display)
+ destroy_display (sink->display);
+
+ if (sink->pool_lock) {
+ g_mutex_free (sink->pool_lock);
+ sink->pool_lock = NULL;
+ }
+
+ if (sink->buffer_pool) {
+ gst_wayland_bufferpool_clear (sink);
+ }
+
+ g_mutex_free (sink->wayland_lock);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static GstCaps *
+gst_wayland_sink_get_caps (GstBaseSink * bsink)
+{
+ return gst_caps_copy (gst_static_pad_template_get_caps (&sink_template));
+}
+
+static int
+event_mask_update (uint32_t mask, void *data)
+{
+ struct display *d = data;
+
+ d->mask = mask;
+
+ return 0;
+}
+
+static void
+shm_format (void *data, struct wl_shm *wl_shm, uint32_t format)
+{
+ struct display *d = data;
+
+ d->formats |= (1 << format);
+}
+
+struct wl_shm_listener shm_listenter = {
+ shm_format
+};
+
+static void
+display_handle_global (struct wl_display *display, uint32_t id,
+ const char *interface, uint32_t version, void *data)
+{
+ struct display *d = data;
+
+ if (strcmp (interface, "wl_compositor") == 0) {
+ d->compositor = wl_display_bind (display, id, &wl_compositor_interface);
+ } else if (strcmp (interface, "wl_shell") == 0) {
+ d->shell = wl_display_bind (display, id, &wl_shell_interface);
+ } else if (strcmp (interface, "wl_shm") == 0) {
+ d->shm = wl_display_bind (display, id, &wl_shm_interface);
+ wl_shm_add_listener (d->shm, &shm_listenter, d);
+ }
+
+}
+
+static struct display *
+create_display (void)
+{
+ struct display *display;
+
+ display = malloc (sizeof *display);
+ display->display = wl_display_connect (NULL);
+ assert (display->display);
+
+ wl_display_add_global_listener (display->display,
+ display_handle_global, display);
+
+ wl_display_iterate (display->display, WL_DISPLAY_READABLE);
+ wl_display_roundtrip (display->display);
+
+ if (!(display->formats & (1 << WL_SHM_FORMAT_XRGB8888))) {
+ GST_ERROR ("WL_SHM_FORMAT_XRGB32 not available");
+ return NULL;
+ }
+
+ wl_display_get_fd (display->display, event_mask_update, display);
+
+ return display;
+}
+
+static GstWlBuffer *
+wayland_buffer_create (GstWaylandSink * sink)
+{
+ char filename[1024];
+ int fd, size, stride;
+ static void *data;
+ static int init = 0;
+ GstWlBuffer *wbuffer;
+
+ GST_DEBUG_OBJECT (sink, "Creating wayland-shm buffers");
+
+ wbuffer = (GstWlBuffer *) gst_mini_object_new (GST_TYPE_WLBUFFER);
+ wbuffer->wlsink = gst_object_ref (sink);
+
+ snprintf (filename, 256, "%s-%d-%s", "/tmp/wayland-shm", init++, "XXXXXX");
+
+ fd = mkstemp (filename);
+ if (fd < 0) {
+ GST_ERROR_OBJECT (sink, "open %s failed:", filename);
+ exit (0);
+ }
+
+ stride = sink->video_width * 4;
+ size = stride * sink->video_height;
+
+ if (ftruncate (fd, size) < 0) {
+ GST_ERROR_OBJECT (sink, "ftruncate failed:");
+ close (fd);
+ exit (0);
+ }
+
+ data = mmap (NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ unlink (filename);
+ if (data == MAP_FAILED) {
+ GST_ELEMENT_ERROR (sink, LIBRARY, SHUTDOWN, (NULL),
+ ("mmap() failed: %s", strerror (errno)));
+ close (fd);
+ exit (0);
+ }
+
+ wbuffer->wbuffer = wl_shm_create_buffer (sink->display->shm, fd,
+ sink->video_width, sink->video_height, stride, WL_SHM_FORMAT_XRGB8888);
+
+ close (fd);
+
+ GST_BUFFER_DATA (wbuffer) = data;
+ GST_BUFFER_SIZE (wbuffer) = size;
+
+ return wbuffer;
+}
+
+static void
+gst_wayland_buffer_destroy (GstWaylandSink * sink, GstWlBuffer * buffer)
+{
+ if (buffer->wlsink) {
+ buffer->wlsink = NULL;
+ gst_object_unref (sink);
+ }
+
+ GST_MINI_OBJECT_CLASS (gst_wlbuffer_parent_class)->finalize (GST_MINI_OBJECT
+ (buffer));
+}
+
+static void
+gst_wayland_bufferpool_clear (GstWaylandSink * sink)
+{
+ g_mutex_lock (sink->pool_lock);
+ while (sink->buffer_pool) {
+ GstWlBuffer *buffer = sink->buffer_pool->data;
+
+ sink->buffer_pool = g_slist_delete_link (sink->buffer_pool,
+ sink->buffer_pool);
+ gst_wayland_buffer_destroy (sink, buffer);
+ }
+ g_mutex_unlock (sink->pool_lock);
+}
+
+static GstFlowReturn
+gst_wayland_sink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size,
+ GstCaps * caps, GstBuffer ** buf)
+{
+ GstWaylandSink *sink = GST_WAYLAND_SINK (bsink);
+ GstWlBuffer *buffer = NULL;
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstStructure *structure = NULL;
+ GstCaps *desired_caps = NULL;
+
+ GST_LOG_OBJECT (sink, "a buffer of %u bytes was requested with caps "
+ "%" GST_PTR_FORMAT " and offset %" G_GUINT64_FORMAT, size, caps, offset);
+
+ desired_caps = gst_caps_copy (caps);
+ structure = gst_caps_get_structure (desired_caps, 0);
+
+ if (gst_structure_get_int (structure, "width", &sink->video_width) &&
+ gst_structure_get_int (structure, "height", &sink->video_height)) {
+ sink->bpp = size / sink->video_width / sink->video_height;
+ }
+
+ g_mutex_lock (sink->pool_lock);
+ while (sink->buffer_pool) {
+ buffer = (GstWlBuffer *) sink->buffer_pool->data;
+
+ if (buffer) {
+ sink->buffer_pool =
+ g_slist_delete_link (sink->buffer_pool, sink->buffer_pool);
+ } else {
+ break;
+ }
+ }
+
+ g_mutex_unlock (sink->pool_lock);
+
+ if (!buffer)
+ buffer = wayland_buffer_create (sink);
+
+ if (buffer)
+ gst_buffer_set_caps (GST_BUFFER (buffer), caps);
+
+ *buf = GST_BUFFER (buffer);
+
+ gst_caps_unref (desired_caps);
+
+ return ret;
+}
+
+static gboolean
+gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
+{
+ GstWaylandSink *sink = GST_WAYLAND_SINK (bsink);
+ const GstStructure *structure;
+ GstCaps *allowed_caps;
+ gboolean ret = TRUE;
+
+ GST_LOG_OBJECT (sink, "set caps %" GST_PTR_FORMAT, caps);
+
+ allowed_caps = gst_pad_get_caps (GST_BASE_SINK_PAD (bsink));
+
+ if (!gst_caps_can_intersect (allowed_caps, caps))
+ return FALSE;
+
+ structure = gst_caps_get_structure (caps, 0);
+
+ ret &= gst_structure_get_int (structure, "width", &sink->video_width);
+ ret &= gst_structure_get_int (structure, "height", &sink->video_height);
+
+ if (!ret)
+ return FALSE;
+
+ gst_caps_replace (&sink->caps, caps);
+
+ return TRUE;
+}
+
+static const struct wl_callback_listener frame_listener;
+
+static void
+redraw (void *data, struct wl_callback *callback, uint32_t time)
+{
+
+ GstWaylandSink *sink = (GstWaylandSink *) data;
+
+ sink->render_finish = TRUE;
+}
+
+static void
+create_window (GstWaylandSink * sink, struct display *display, int width,
+ int height)
+{
+ struct window *window;
+
+ if (sink->window)
+ return;
+
+ g_mutex_lock (sink->wayland_lock);
+
+ window = malloc (sizeof *window);
+ window->display = display;
+ window->width = width;
+ window->height = height;
+ window->surface = wl_compositor_create_surface (display->compositor);
+
+ window->shell_surface = wl_shell_get_shell_surface (display->shell,
+ window->surface);
+ /* wl_shell_surface_set_toplevel (window->shell_surface); */
+ wl_shell_surface_set_fullscreen (window->shell_surface,
+ WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT, 0, NULL);
+
+ sink->window = window;
+
+ g_mutex_unlock (sink->wayland_lock);
+}
+
+static gboolean
+gst_wayland_sink_start (GstBaseSink * bsink)
+{
+ GstWaylandSink *sink = (GstWaylandSink *) bsink;
+ gboolean result = TRUE;
+
+ GST_DEBUG_OBJECT (sink, "start");
+
+ if (!sink->display)
+ sink->display = create_display ();
+
+ return result;
+}
+
+static gboolean
+gst_wayland_sink_stop (GstBaseSink * bsink)
+{
+ GstWaylandSink *sink = (GstWaylandSink *) bsink;
+
+ GST_DEBUG_OBJECT (sink, "stop");
+
+ return TRUE;
+}
+
+static GstFlowReturn
+gst_wayland_sink_preroll (GstBaseSink * bsink, GstBuffer * buffer)
+{
+ GST_DEBUG_OBJECT (bsink, "preroll buffer %p, data = %p", buffer,
+ GST_BUFFER_DATA (buffer));
+ return gst_wayland_sink_render (bsink, buffer);
+}
+
+static GstFlowReturn
+gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer)
+{
+ GstWaylandSink *sink = GST_WAYLAND_SINK (bsink);
+ gboolean mem_cpy = TRUE;
+ GstVideoRectangle src, dst, res;
+
+ GST_LOG_OBJECT (sink,
+ "render buffer %p, data = %p, timestamp = %" GST_TIME_FORMAT, buffer,
+ GST_BUFFER_DATA (buffer), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)));
+
+ if (!sink->window)
+ create_window (sink, sink->display, sink->video_width, sink->video_height);
+
+ if (sink->render_finish) {
+ if (GST_IS_WLBUFFER (buffer)) {
+ GstWlBuffer *tmp_buffer = (GstWlBuffer *) buffer;
+
+ /* Does it have a waylandbuffer ? */
+ if (tmp_buffer->wbuffer) {
+ mem_cpy = FALSE;
+ GST_DEBUG_OBJECT (sink, "we have a buffer (%p) we allocated "
+ "ourselves and it has a wayland buffer, no memcpy then", buffer);
+ sink->window->buffer = tmp_buffer->wbuffer;
+ } else {
+ /* No wayland buffer, that's a malloc */
+ GST_DEBUG_OBJECT (sink, "we have a buffer (%p) we allocated "
+ "ourselves but it does not hold a wayland buffer", buffer);
+ }
+ } else {
+ /* Not our baby! */
+ GST_DEBUG_OBJECT (sink, "we have a buffer (%p) we did not allocate",
+ buffer);
+ }
+
+ if (mem_cpy) {
+
+ GstWlBuffer *wlbuf = wayland_buffer_create (sink);
+
+ memcpy (GST_BUFFER_DATA (wlbuf), GST_BUFFER_DATA (buffer),
+ GST_BUFFER_SIZE (buffer));
+ sink->window->buffer = wlbuf->wbuffer;
+ }
+
+ src.w = sink->video_width;
+ src.h = sink->video_height;
+ dst.w = sink->window->width;
+ dst.h = sink->window->height;
+
+ gst_video_sink_center_rect (src, dst, &res, FALSE);
+
+ sink->render_finish = FALSE;
+
+ wl_buffer_damage (sink->window->buffer, 0, 0, res.w, res.h);
+
+ wl_surface_attach (sink->window->surface, sink->window->buffer, 0, 0);
+
+ wl_surface_damage (sink->window->surface, 0, 0, res.w, res.h);
+
+ if (sink->callback)
+ wl_callback_destroy (sink->callback);
+
+ sink->callback = wl_surface_frame (sink->window->surface);
+ wl_callback_add_listener (sink->callback, &frame_listener, sink);
+ wl_display_iterate (sink->display->display, sink->display->mask);
+
+ } else
+ GST_LOG_OBJECT (sink,
+ "Waiting to get the signal from compositor to render the next frame..");
+
+ return GST_FLOW_OK;
+}
+
+static const struct wl_callback_listener frame_listener = {
+ redraw
+};
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ GST_DEBUG_CATEGORY_INIT (gstwayland_debug, "waylandsink", 0,
+ " wayland video sink");
+
+ return gst_element_register (plugin, "waylandsink", GST_RANK_MARGINAL,
+ GST_TYPE_WAYLAND_SINK);
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "waylandsink",
+ "Wayland Video Sink", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME,
+ GST_PACKAGE_ORIGIN)
diff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h
new file mode 100644
index 000000000..f9c1ca87c
--- /dev/null
+++ b/ext/wayland/gstwaylandsink.h
@@ -0,0 +1,131 @@
+/*
+ * GStreamer Wayland video sink
+ * Copyright (C) 2011 Intel Corporation
+ * Copyright (C) 2011 Sreerenj Balachandran <sreerenj.balachandran@intel.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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __GST_WAYLAND_VIDEO_SINK_H__
+#define __GST_WAYLAND_VIDEO_SINK_H__
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <fcntl.h>
+#include <assert.h>
+#include <unistd.h>
+
+#include <gst/gst.h>
+#include <gst/video/video.h>
+#include <gst/video/gstvideosink.h>
+
+#include <wayland-client.h>
+
+#define GST_TYPE_WAYLAND_SINK \
+ (gst_wayland_sink_get_type())
+#define GST_WAYLAND_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WAYLAND_SINK,GstWaylandSink))
+#define GST_WAYLAND_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_WAYLAND_SINK,GstWaylandSinkClass))
+#define GST_IS_WAYLAND_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WAYLAND_SINK))
+#define GST_IS_WAYLAND_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_WAYLAND_SINK))
+#define GST_WAYLAND_SINK_GET_CLASS(inst) \
+ (G_TYPE_INSTANCE_GET_CLASS ((inst), GST_TYPE_WAYLAND_SINK, GstWaylandSinkClass))
+
+struct display
+{
+ struct wl_display *display;
+ struct wl_compositor *compositor;
+ struct wl_shell *shell;
+ struct wl_shm *shm;
+ uint32_t formats;
+ uint32_t mask;
+};
+
+struct window
+{
+ struct display *display;
+ int width, height;
+ struct wl_surface *surface;
+ struct wl_shell_surface *shell_surface;
+ struct wl_buffer *buffer;
+};
+
+typedef struct _GstWaylandSink GstWaylandSink;
+typedef struct _GstWaylandSinkClass GstWaylandSinkClass;
+
+#define GST_TYPE_WLBUFFER (gst_wlbuffer_get_type())
+#define GST_IS_WLBUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_WLBUFFER))
+#define GST_WLBUFFER (obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_WLBUFFER, GstWlBuffer))
+
+typedef struct _GstWlBuffer GstWlBuffer;
+typedef struct _GstWlBufferClass GstWlBufferClass;
+
+struct _GstWlBuffer {
+ GstBuffer buffer; /* Extending GstBuffer */
+
+ struct wl_buffer *wbuffer;
+
+ GstWaylandSink *wlsink;
+};
+
+struct _GstWlBufferClass
+{
+ GstBufferClass parent_class;
+};
+
+struct _GstWaylandSink
+{
+
+ GstVideoSink parent;
+
+ GstCaps *caps;
+
+ struct display *display;
+ struct window *window;
+ struct wl_callback *callback;
+
+ GMutex *pool_lock;
+ GSList *buffer_pool;
+
+ GMutex *wayland_lock;
+
+ gint video_width;
+ gint video_height;
+ guint bpp;
+
+ gboolean render_finish;
+
+};
+
+struct _GstWaylandSinkClass
+{
+ GstVideoSinkClass parent;
+};
+
+GType gst_wayland_sink_get_type (void) G_GNUC_CONST;
+GType gst_wlbuffer_get_type (void);
+
+G_END_DECLS
+#endif /* __GST_WAYLAND_VIDEO_SINK_H__ */
diff --git a/gst-libs/gst/codecparsers/gsth264parser.c b/gst-libs/gst/codecparsers/gsth264parser.c
index 572a28ded..00c151799 100644
--- a/gst-libs/gst/codecparsers/gsth264parser.c
+++ b/gst-libs/gst/codecparsers/gsth264parser.c
@@ -167,6 +167,7 @@ typedef struct
const guint8 *data;
guint size;
+ guint n_epb; /* Number of emulation prevention bytes */
guint byte; /* Byte position */
guint bits_in_cache; /* bitpos in the cache of next bit */
guint8 first_byte;
@@ -178,6 +179,7 @@ nal_reader_init (NalReader * nr, const guint8 * data, guint size)
{
nr->data = data;
nr->size = size;
+ nr->n_epb = 0;
nr->byte = 0;
nr->bits_in_cache = 0;
@@ -211,6 +213,7 @@ nal_reader_read (NalReader * nr, guint nbits)
((nr->cache & 0xff) == 0)) {
/* next byte goes unconditionally to the cache, even if it's 0x03 */
check_three_byte = FALSE;
+ nr->n_epb++;
goto next_byte;
}
nr->cache = (nr->cache << 8) | nr->first_byte;
@@ -263,6 +266,12 @@ nal_reader_get_remaining (const NalReader * nr)
return (nr->size - nr->byte) * 8 + nr->bits_in_cache;
}
+static inline guint
+nal_reader_get_epb_count (const NalReader * nr)
+{
+ return nr->n_epb;
+}
+
#define GST_NAL_READER_READ_BITS(bits) \
static gboolean \
nal_reader_get_bits_uint##bits (NalReader *nr, guint##bits *val, guint nbits) \
@@ -1300,7 +1309,8 @@ gst_h264_parser_identify_nalu_avc (GstH264NalParser * nalparser,
size = size - offset;
gst_bit_reader_init (&br, data + offset, size);
- gst_bit_reader_get_bits_uint32 (&br, &nalu->size, nal_length_size * 8);
+ nalu->size = gst_bit_reader_get_bits_uint32_unchecked (&br,
+ nal_length_size * 8);
nalu->sc_offset = offset;
nalu->offset = offset + nal_length_size;
@@ -1882,6 +1892,7 @@ gst_h264_parser_parse_slice_hdr (GstH264NalParser * nalparser,
}
slice->header_size = nal_reader_get_pos (&nr);
+ slice->n_emulation_prevention_bytes = nal_reader_get_epb_count (&nr);
return GST_H264_PARSER_OK;
diff --git a/gst-libs/gst/codecparsers/gsth264parser.h b/gst-libs/gst/codecparsers/gsth264parser.h
index 3c221560e..2e570c8a9 100644
--- a/gst-libs/gst/codecparsers/gsth264parser.h
+++ b/gst-libs/gst/codecparsers/gsth264parser.h
@@ -599,6 +599,9 @@ struct _GstH264SliceHdr
/* Size of the slice_header() in bits */
guint header_size;
+
+ /* Number of emulation prevention bytes (EPB) in this slice_header() */
+ guint n_emulation_prevention_bytes;
};
diff --git a/gst-libs/gst/codecparsers/gstmpeg4parser.c b/gst-libs/gst/codecparsers/gstmpeg4parser.c
index 4b0acb6b5..1166b872f 100644
--- a/gst-libs/gst/codecparsers/gstmpeg4parser.c
+++ b/gst-libs/gst/codecparsers/gstmpeg4parser.c
@@ -277,7 +277,7 @@ find_psc (GstByteReader * br)
psc_pos = gst_byte_reader_get_pos (br);
break;
} else
- gst_byte_reader_skip (br, 1);
+ gst_byte_reader_skip_unchecked (br, 1);
}
failed:
@@ -543,7 +543,7 @@ gst_h263_parse (GstMpeg4Packet * packet,
packet->offset = off1 + offset;
packet->data = data;
- gst_byte_reader_skip (&br, 3);
+ gst_byte_reader_skip_unchecked (&br, 3);
off2 = find_psc (&br);
if (off2 == -1) {
diff --git a/gst-libs/gst/codecparsers/gstmpegvideoparser.c b/gst-libs/gst/codecparsers/gstmpegvideoparser.c
index b725d9d35..b45156a8d 100644
--- a/gst-libs/gst/codecparsers/gstmpegvideoparser.c
+++ b/gst-libs/gst/codecparsers/gstmpegvideoparser.c
@@ -97,9 +97,8 @@ find_start_code (GstBitReader * b)
while (gst_bit_reader_peek_bits_uint32 (b, &bits, 32)) {
if (bits >> 8 == 0x1) {
return TRUE;
- } else {
- gst_bit_reader_skip (b, 8);
- }
+ } else if (gst_bit_reader_skip (b, 8) == FALSE)
+ break;
}
return FALSE;
@@ -324,10 +323,13 @@ gst_mpeg_video_parse (const guint8 * data, gsize size, guint offset)
while (off >= 0 && off + 3 < size) {
GstMpegVideoTypeOffsetSize *codoffsize;
- gst_byte_reader_skip (&br, off + 3);
+
+ if (gst_byte_reader_skip (&br, off + 3) == FALSE)
+ goto failed;
codoffsize = g_malloc (sizeof (GstMpegVideoTypeOffsetSize));
- gst_byte_reader_get_uint8 (&br, &codoffsize->type);
+ if (gst_byte_reader_get_uint8 (&br, &codoffsize->type) == FALSE)
+ goto failed;
codoffsize->offset = gst_byte_reader_get_pos (&br) + offset;
@@ -346,6 +348,12 @@ gst_mpeg_video_parse (const guint8 * data, gsize size, guint offset)
}
return g_list_reverse (ret);
+
+failed:
+ {
+ GST_WARNING ("Failed to parse");
+ return g_list_reverse (ret);
+ }
}
/**
diff --git a/gst-libs/gst/codecparsers/gstvc1parser.c b/gst-libs/gst/codecparsers/gstvc1parser.c
index 8f2937f01..a82e46e16 100644
--- a/gst-libs/gst/codecparsers/gstvc1parser.c
+++ b/gst-libs/gst/codecparsers/gstvc1parser.c
@@ -692,7 +692,7 @@ get_unary (GstBitReader * br, gint stop, gint len)
guint8 current = 0xff;
for (i = 0; i < len; i++) {
- gst_bit_reader_get_bits_uint8 (br, &current, 1);
+ current = gst_bit_reader_get_bits_uint8_unchecked (br, 1);
if (current == stop)
return i;
}
diff --git a/gst-libs/gst/video/gstbasevideocodec.c b/gst-libs/gst/video/gstbasevideocodec.c
index ddd71fa48..9f839ccb8 100644
--- a/gst-libs/gst/video/gstbasevideocodec.c
+++ b/gst-libs/gst/video/gstbasevideocodec.c
@@ -27,6 +27,12 @@
#include "config.h"
#endif
+/**
+ * SECTION:gstbasevideocodec
+ * @short_description: Base class for video codecs
+ * @see_also: #GstBaseVideoDecoder , #GstBaseVideoEncoder
+ */
+
/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex
* with newer GLib versions (>= 2.31.0) */
#define GLIB_DISABLE_DEPRECATION_WARNINGS
@@ -300,6 +306,14 @@ gst_base_video_codec_new_frame (GstBaseVideoCodec * base_video_codec)
return frame;
}
+/**
+ * gst_video_frame_state_ref:
+ * @frame: a #GstVideoFrameState
+ *
+ * Increases the refcount of the given frame by one.
+ *
+ * Returns: @buf
+ */
GstVideoFrameState *
gst_video_frame_state_ref (GstVideoFrameState * frame)
{
@@ -310,6 +324,13 @@ gst_video_frame_state_ref (GstVideoFrameState * frame)
return frame;
}
+/**
+ * gst_video_frame_state_unref:
+ * @frame: a #GstVideoFrameState
+ *
+ * Decreases the refcount of the frame. If the refcount reaches 0, the frame
+ * will be freed.
+ */
void
gst_video_frame_state_unref (GstVideoFrameState * frame)
{
diff --git a/gst-libs/gst/video/gstbasevideocodec.h b/gst-libs/gst/video/gstbasevideocodec.h
index 92195af7a..256279d78 100644
--- a/gst-libs/gst/video/gstbasevideocodec.h
+++ b/gst-libs/gst/video/gstbasevideocodec.h
@@ -78,10 +78,27 @@ G_BEGIN_DECLS
/**
* GST_BASE_VIDEO_CODEC_FLOW_NEED_DATA:
*
+ * Returned while parsing to indicate more data is needed.
*/
#define GST_BASE_VIDEO_CODEC_FLOW_NEED_DATA GST_FLOW_CUSTOM_SUCCESS
+/**
+ * GST_BASE_VIDEO_CODEC_STREAM_LOCK:
+ * @codec: video codec instance
+ *
+ * Obtain a lock to protect the codec function from concurrent access.
+ *
+ * Since: 0.10.22
+ */
#define GST_BASE_VIDEO_CODEC_STREAM_LOCK(codec) g_rec_mutex_lock (&GST_BASE_VIDEO_CODEC (codec)->stream_lock)
+/**
+ * GST_BASE_VIDEO_CODEC_STREAM_UNLOCK:
+ * @codec: video codec instance
+ *
+ * Release the lock that protects the codec function from concurrent access.
+ *
+ * Since: 0.10.22
+ */
#define GST_BASE_VIDEO_CODEC_STREAM_UNLOCK(codec) g_rec_mutex_unlock (&GST_BASE_VIDEO_CODEC (codec)->stream_lock)
typedef struct _GstVideoState GstVideoState;
@@ -203,39 +220,52 @@ struct _GstVideoFrameState
GList *events;
};
+/**
+ * GstBaseVideoCodec:
+ *
+ * The opaque #GstBaseVideoCodec data structure.
+ */
struct _GstBaseVideoCodec
{
- GstElement element;
-
/*< private >*/
- GstPad *sinkpad;
- GstPad *srcpad;
+ GstElement element;
+
+ /*< protected >*/
+ GstPad *sinkpad;
+ GstPad *srcpad;
/* protects all data processing, i.e. is locked
* in the chain function, finish_frame and when
* processing serialized events */
GRecMutex stream_lock;
- guint64 system_frame_number;
+ guint64 system_frame_number;
GList *frames; /* Protected with OBJECT_LOCK */
GstVideoState state; /* Compressed video pad */
GstVideoInfo info; /* Raw video pad */
GstSegment segment;
- gdouble proportion;
- GstClockTime earliest_time;
- gboolean discont;
+ /* QoS properties */
+ gdouble proportion;
+ GstClockTime earliest_time;
+ gboolean discont;
- gint64 bytes;
- gint64 time;
+ gint64 bytes;
+ gint64 time;
/* FIXME before moving to base */
- void *padding[GST_PADDING_LARGE];
+ void *padding[GST_PADDING_LARGE];
};
+/**
+ * GstBaseVideoCodecClass:
+ *
+ * The opaque #GstBaseVideoCodecClass data structure.
+ */
struct _GstBaseVideoCodecClass
{
+ /*< private >*/
GstElementClass element_class;
/* FIXME before moving to base */
diff --git a/gst-libs/gst/video/gstbasevideodecoder.c b/gst-libs/gst/video/gstbasevideodecoder.c
index d6ad3020f..e3ec9aa6c 100644
--- a/gst-libs/gst/video/gstbasevideodecoder.c
+++ b/gst-libs/gst/video/gstbasevideodecoder.c
@@ -1675,7 +1675,7 @@ done:
}
/**
- * gst_base_video_decoder_finish_frame:
+ * gst_base_video_decoder_add_to_frame:
* @base_video_decoder: a #GstBaseVideoDecoder
* @n_bytes: an encoded #GstVideoFrameState
*
@@ -1872,11 +1872,15 @@ exit:
* gst_base_video_decoder_get_state:
* @base_video_decoder: a #GstBaseVideoDecoder
*
+ * Get the current #GstVideoState
+ *
* Returns: #GstVideoState describing format of video data.
*/
GstVideoState *
gst_base_video_decoder_get_state (GstBaseVideoDecoder * base_video_decoder)
{
+ /* FIXME : Move to base codec class */
+
return &GST_BASE_VIDEO_CODEC (base_video_decoder)->state;
}
@@ -1925,6 +1929,8 @@ gst_base_video_decoder_set_sync_point (GstBaseVideoDecoder * base_video_decoder)
* gst_base_video_decoder_get_oldest_frame:
* @base_video_decoder: a #GstBaseVideoDecoder
*
+ * Get the oldest pending unfinished #GstVideoFrameState
+ *
* Returns: oldest pending unfinished #GstVideoFrameState.
*/
GstVideoFrameState *
@@ -1933,6 +1939,8 @@ gst_base_video_decoder_get_oldest_frame (GstBaseVideoDecoder *
{
GList *g;
+ /* FIXME : Move to base codec class */
+
GST_BASE_VIDEO_CODEC_STREAM_LOCK (base_video_decoder);
g = g_list_first (GST_BASE_VIDEO_CODEC (base_video_decoder)->frames);
GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_decoder);
@@ -1947,6 +1955,8 @@ gst_base_video_decoder_get_oldest_frame (GstBaseVideoDecoder *
* @base_video_decoder: a #GstBaseVideoDecoder
* @frame_number: system_frame_number of a frame
*
+ * Get a pending unfinished #GstVideoFrameState
+ *
* Returns: pending unfinished #GstVideoFrameState identified by @frame_number.
*/
GstVideoFrameState *
@@ -1975,8 +1985,6 @@ gst_base_video_decoder_get_frame (GstBaseVideoDecoder * base_video_decoder,
* gst_base_video_decoder_set_src_caps:
* @base_video_decoder: a #GstBaseVideoDecoder
*
- * Sets src pad caps according to currently configured #GstVideoState.
- *
* The #GstVideoInfo and #GstBufferPool will be created and negotiated
* according to those values.
*
@@ -2100,7 +2108,7 @@ gst_base_video_decoder_set_src_caps (GstBaseVideoDecoder * base_video_decoder)
* Helper function that returns a buffer from the decoders' configured
* #GstBufferPool.
*
- * Returns: allocated buffer
+ * Returns: (transfer full): allocated buffer
*/
GstBuffer *
gst_base_video_decoder_alloc_src_buffer (GstBaseVideoDecoder *
@@ -2122,7 +2130,7 @@ gst_base_video_decoder_alloc_src_buffer (GstBaseVideoDecoder *
* @base_video_decoder: a #GstBaseVideoDecoder
* @frame: a #GstVideoFrameState
*
- * Helper function that uses gst_pad_alloc_buffer_and_set_caps
+ * Helper function that uses @gst_pad_alloc_buffer_and_set_caps()
* to allocate a buffer to hold a video frame for @base_video_decoder's
* current #GstVideoState. Subclass should already have configured video state
* and set src pad caps.
@@ -2190,8 +2198,10 @@ gst_base_video_decoder_get_max_decode_time (GstBaseVideoDecoder *
}
/**
- * gst_base_video_decoder_get_oldest_frame:
+ * gst_base_video_decoder_class_set_capture_pattern:
* @base_video_decoder_class: a #GstBaseVideoDecoderClass
+ * @mask: The mask used for scanning
+ * @pattern: The pattern used for matching
*
* Sets the mask and pattern that will be scanned for to obtain parse sync.
* Note that a non-zero @mask implies that @scan_for_sync will be ignored.
diff --git a/gst-libs/gst/video/gstbasevideodecoder.h b/gst-libs/gst/video/gstbasevideodecoder.h
index 891d02ba3..4e65b65a7 100644
--- a/gst-libs/gst/video/gstbasevideodecoder.h
+++ b/gst-libs/gst/video/gstbasevideodecoder.h
@@ -122,6 +122,7 @@ G_STMT_START { \
*/
struct _GstBaseVideoDecoder
{
+ /*< private >*/
GstBaseVideoCodec base_video_codec;
/*< protected >*/
@@ -226,8 +227,10 @@ struct _GstBaseVideoDecoder
*/
struct _GstBaseVideoDecoderClass
{
+ /*< private >*/
GstBaseVideoCodecClass base_video_codec_class;
+ /*< public >*/
gboolean (*start) (GstBaseVideoDecoder *coder);
gboolean (*stop) (GstBaseVideoDecoder *coder);
@@ -254,7 +257,7 @@ struct _GstBaseVideoDecoderClass
void *padding[GST_PADDING_LARGE];
};
-void gst_base_video_decoder_class_set_capture_pattern (GstBaseVideoDecoderClass *klass,
+void gst_base_video_decoder_class_set_capture_pattern (GstBaseVideoDecoderClass *base_video_decoder_class,
guint32 mask, guint32 pattern);
GstVideoFrameState *gst_base_video_decoder_get_frame (GstBaseVideoDecoder *coder,
diff --git a/gst-libs/gst/video/gstbasevideoencoder.c b/gst-libs/gst/video/gstbasevideoencoder.c
index 6b1cfb0fb..36248bb06 100644
--- a/gst-libs/gst/video/gstbasevideoencoder.c
+++ b/gst-libs/gst/video/gstbasevideoencoder.c
@@ -241,6 +241,13 @@ gst_base_video_encoder_init (GstBaseVideoEncoder * base_video_encoder)
base_video_encoder->sink_clipping = TRUE;
}
+/**
+ * gst_base_video_encoder_set_headers:
+ * @base_video_encoder: a #GstBaseVideoEncoder
+ * @headers: (transfer full): the #GstBuffer containing the codec header
+ *
+ * Set the codec headers to be sent downstream whenever requested.
+ */
void
gst_base_video_encoder_set_headers (GstBaseVideoEncoder * base_video_encoder,
GstBuffer * headers)
@@ -1117,11 +1124,15 @@ done:
* gst_base_video_encoder_get_state:
* @base_video_encoder: a #GstBaseVideoEncoder
*
+ * Get the current #GstVideoState
+ *
* Returns: #GstVideoState describing format of video data.
*/
const GstVideoState *
gst_base_video_encoder_get_state (GstBaseVideoEncoder * base_video_encoder)
{
+ /* FIXME : Move to base codec class */
+
return &GST_BASE_VIDEO_CODEC (base_video_encoder)->state;
}
@@ -1152,7 +1163,7 @@ gst_base_video_encoder_set_latency (GstBaseVideoEncoder * base_video_encoder,
/**
* gst_base_video_encoder_set_latency_fields:
* @base_video_encoder: a #GstBaseVideoEncoder
- * @fields: latency in fields
+ * @n_fields: latency in fields
*
* Informs baseclass of encoding latency in terms of fields (both min
* and max latency).
@@ -1179,6 +1190,8 @@ gst_base_video_encoder_set_latency_fields (GstBaseVideoEncoder *
* gst_base_video_encoder_get_oldest_frame:
* @base_video_encoder: a #GstBaseVideoEncoder
*
+ * Get the oldest unfinished pending #GstVideoFrameState
+ *
* Returns: oldest unfinished pending #GstVideoFrameState
*/
GstVideoFrameState *
@@ -1187,6 +1200,8 @@ gst_base_video_encoder_get_oldest_frame (GstBaseVideoEncoder *
{
GList *g;
+ /* FIXME : Move to base codec class */
+
GST_BASE_VIDEO_CODEC_STREAM_LOCK (base_video_encoder);
g = g_list_first (GST_BASE_VIDEO_CODEC (base_video_encoder)->frames);
GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_encoder);
diff --git a/gst-libs/gst/video/gstbasevideoencoder.h b/gst-libs/gst/video/gstbasevideoencoder.h
index 547d0ac2d..c969629a3 100644
--- a/gst-libs/gst/video/gstbasevideoencoder.h
+++ b/gst-libs/gst/video/gstbasevideoencoder.h
@@ -70,12 +70,12 @@ typedef struct _GstBaseVideoEncoderClass GstBaseVideoEncoderClass;
/**
* GstBaseVideoEncoder:
- * @element: the parent element.
*
* The opaque #GstBaseVideoEncoder data structure.
*/
struct _GstBaseVideoEncoder
{
+ /*< private >*/
GstBaseVideoCodec base_video_codec;
/*< protected >*/
@@ -115,6 +115,8 @@ struct _GstBaseVideoEncoder
* GstVideoInfo fields have already been
* set according to provided caps.
* @handle_frame: Provides input frame to subclass.
+ * @reset: Optional.
+ * Allows subclass (codec) to perform post-seek semantics reset.
* @finish: Optional.
* Called to request subclass to dispatch any pending remaining
* data (e.g. at EOS).
@@ -133,6 +135,7 @@ struct _GstBaseVideoEncoder
*/
struct _GstBaseVideoEncoderClass
{
+ /*< private >*/
GstBaseVideoCodecClass base_video_codec_class;
/*< public >*/
@@ -164,7 +167,7 @@ struct _GstBaseVideoEncoderClass
GType gst_base_video_encoder_get_type (void);
-const GstVideoState* gst_base_video_encoder_get_state (GstBaseVideoEncoder *coder);
+const GstVideoState* gst_base_video_encoder_get_state (GstBaseVideoEncoder *base_video_encoder);
GstVideoFrameState* gst_base_video_encoder_get_oldest_frame (GstBaseVideoEncoder *coder);
GstFlowReturn gst_base_video_encoder_finish_frame (GstBaseVideoEncoder *base_video_encoder,
@@ -175,7 +178,7 @@ void gst_base_video_encoder_set_latency (GstBaseVideoEncoder *
void gst_base_video_encoder_set_latency_fields (GstBaseVideoEncoder *base_video_encoder,
int n_fields);
void gst_base_video_encoder_set_headers (GstBaseVideoEncoder *base_video_encoder,
- GstBuffer *headers);
+ GstBuffer *headers);
G_END_DECLS
#endif
diff --git a/gst/adpcmdec/Makefile.am b/gst/adpcmdec/Makefile.am
index 23dbfb247..f82cb9b46 100644
--- a/gst/adpcmdec/Makefile.am
+++ b/gst/adpcmdec/Makefile.am
@@ -6,8 +6,9 @@ libgstadpcmdec_la_SOURCES = adpcmdec.c
# flags used to compile this plugin
# add other _CFLAGS and _LIBS as needed
libgstadpcmdec_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
-libgstadpcmdec_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) -lgstaudio-@GST_MAJORMINOR@ \
- $(GST_LIBS)
+libgstadpcmdec_la_LIBADD = \
+ $(GST_PLUGINS_BASE_LIBS) -lgstaudio-@GST_MAJORMINOR@ \
+ $(GST_BASE_LIBS) $(GST_LIBS)
libgstadpcmdec_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
libgstadpcmdec_la_LIBTOOLFLAGS = --tag=disable-static
diff --git a/gst/aiff/aiffmux.c b/gst/aiff/aiffmux.c
index a2d99f587..14f802daa 100644
--- a/gst/aiff/aiffmux.c
+++ b/gst/aiff/aiffmux.c
@@ -165,11 +165,14 @@ gst_aiff_mux_write_form_header (GstAiffMux * aiffmux, guint32 audio_data_size,
GstByteWriter * writer)
{
/* ckID == 'FORM' */
- gst_byte_writer_put_uint32_le (writer, GST_MAKE_FOURCC ('F', 'O', 'R', 'M'));
+ gst_byte_writer_put_uint32_le_unchecked (writer,
+ GST_MAKE_FOURCC ('F', 'O', 'R', 'M'));
/* ckSize is currently bogus but we'll know what it is later */
- gst_byte_writer_put_uint32_be (writer, audio_data_size + AIFF_HEADER_LEN - 8);
+ gst_byte_writer_put_uint32_be_unchecked (writer,
+ audio_data_size + AIFF_HEADER_LEN - 8);
/* formType == 'AIFF' */
- gst_byte_writer_put_uint32_le (writer, GST_MAKE_FOURCC ('A', 'I', 'F', 'F'));
+ gst_byte_writer_put_uint32_le_unchecked (writer,
+ GST_MAKE_FOURCC ('A', 'I', 'F', 'F'));
}
/*
@@ -220,8 +223,8 @@ gst_aiff_mux_write_ext (GstByteWriter * writer, double d)
if (d < 0)
ext.exponent[0] |= 0x80;
- gst_byte_writer_put_data (writer, ext.exponent, 2);
- gst_byte_writer_put_data (writer, ext.mantissa, 8);
+ gst_byte_writer_put_data_unchecked (writer, ext.exponent, 2);
+ gst_byte_writer_put_data_unchecked (writer, ext.mantissa, 8);
}
/*
@@ -232,13 +235,14 @@ static void
gst_aiff_mux_write_comm_header (GstAiffMux * aiffmux, guint32 audio_data_size,
GstByteWriter * writer)
{
- gst_byte_writer_put_uint32_le (writer, GST_MAKE_FOURCC ('C', 'O', 'M', 'M'));
- gst_byte_writer_put_uint32_be (writer, 18);
- gst_byte_writer_put_uint16_be (writer, aiffmux->channels);
+ gst_byte_writer_put_uint32_le_unchecked (writer,
+ GST_MAKE_FOURCC ('C', 'O', 'M', 'M'));
+ gst_byte_writer_put_uint32_be_unchecked (writer, 18);
+ gst_byte_writer_put_uint16_be_unchecked (writer, aiffmux->channels);
/* numSampleFrames value will be overwritten when known */
- gst_byte_writer_put_uint32_be (writer,
+ gst_byte_writer_put_uint32_be_unchecked (writer,
audio_data_size / (aiffmux->width / 8 * aiffmux->channels));
- gst_byte_writer_put_uint16_be (writer, aiffmux->depth);
+ gst_byte_writer_put_uint16_be_unchecked (writer, aiffmux->depth);
gst_aiff_mux_write_ext (writer, aiffmux->rate);
}
@@ -246,13 +250,14 @@ static void
gst_aiff_mux_write_ssnd_header (GstAiffMux * aiffmux, guint32 audio_data_size,
GstByteWriter * writer)
{
- gst_byte_writer_put_uint32_le (writer, GST_MAKE_FOURCC ('S', 'S', 'N', 'D'));
+ gst_byte_writer_put_uint32_le_unchecked (writer,
+ GST_MAKE_FOURCC ('S', 'S', 'N', 'D'));
/* ckSize will be overwritten when known */
- gst_byte_writer_put_uint32_be (writer,
+ gst_byte_writer_put_uint32_be_unchecked (writer,
audio_data_size + AIFF_SSND_HEADER_LEN - 8);
/* offset and blockSize are set to 0 as we don't support block-aligned sample data yet */
- gst_byte_writer_put_uint32_be (writer, 0);
- gst_byte_writer_put_uint32_be (writer, 0);
+ gst_byte_writer_put_uint32_be_unchecked (writer, 0);
+ gst_byte_writer_put_uint32_be_unchecked (writer, 0);
}
static GstFlowReturn
diff --git a/gst/audiovisualizers/README b/gst/audiovisualizers/README
index be2491e06..3c59f0e01 100644
--- a/gst/audiovisualizers/README
+++ b/gst/audiovisualizers/README
@@ -58,6 +58,11 @@ xxxscope
- element maker template
- test for baseclass
+- actors
+ - we use the wave, filtered waves, balance and fft so far
+ - we could have narrow filters over harmonic frequencies
+ - we could use loudness like determined in level-meter
+
- we probably want a VisBin like the gnome video effects
- this way we can specify pipeline fragments
- VisBin can use a videomixer to switch effects based on time or song
@@ -82,3 +87,5 @@ GST_PLUGIN_PATH=$GST_PLUGIN_PATH:$PWD gst-launch filesrc location=$HOME/Music/1.
GST_PLUGIN_PATH=$GST_PLUGIN_PATH:$PWD gst-launch filesrc location=$HOME/Music/1.mp3 ! decodebin2 ! tee name=t ! queue ! audioconvert ! synaesthesia ! ximagesink t. ! queue ! synaescope shade-amount=0x00040404 ! colorspace ! ximagesink
+gst-launch filesrc location=$HOME/Music/1.mp3 ! decodebin2 ! tee name=t ! queue ! audioconvert ! wavescope style=color-lines shade-amount=0x00080402 ! alpha alpha=0.5 ! videomixer2 name=m background=black ! colorspace ! vertigotv ! ximagesink t. ! queue ! audioconvert ! spacescope style=color-lines shade-amount=0x00080402 ! alpha alpha=0.5 ! m. t. ! queue ! pulsesink
+
diff --git a/gst/audiovisualizers/gstbaseaudiovisualizer.c b/gst/audiovisualizers/gstbaseaudiovisualizer.c
index 7a76a99ce..b36dd328f 100644
--- a/gst/audiovisualizers/gstbaseaudiovisualizer.c
+++ b/gst/audiovisualizers/gstbaseaudiovisualizer.c
@@ -913,7 +913,7 @@ gst_base_audio_visualizer_chain (GstPad * pad, GstObject * parent,
if (avail - sbpf >= sbpf) {
gst_adapter_flush (scope->adapter, sbpf);
gst_adapter_unmap (scope->adapter);
- } else if (avail - sbpf >= 0) {
+ } else if (avail >= sbpf) {
/* just flush a bit and stop */
gst_adapter_flush (scope->adapter, (avail - sbpf));
gst_adapter_unmap (scope->adapter);
diff --git a/gst/camerabin2/gstwrappercamerabinsrc.c b/gst/camerabin2/gstwrappercamerabinsrc.c
index 7b2a6d5cb..6ffe0843a 100644
--- a/gst/camerabin2/gstwrappercamerabinsrc.c
+++ b/gst/camerabin2/gstwrappercamerabinsrc.c
@@ -154,6 +154,18 @@ gst_wrapper_camera_bin_reset_video_src_caps (GstWrapperCameraBinSrc * self,
GST_DEBUG_OBJECT (self, "Resetting src caps to %" GST_PTR_FORMAT, caps);
if (self->src_vid_src) {
+ GstCaps *old_caps;
+
+ g_object_get (G_OBJECT (self->src_filter), "caps", &old_caps, NULL);
+ if (gst_caps_is_equal (caps, old_caps)) {
+ GST_DEBUG_OBJECT (self, "old and new caps are same, do not reset it");
+ if (old_caps)
+ gst_caps_unref (old_caps);
+ return;
+ }
+ if (old_caps)
+ gst_caps_unref (old_caps);
+
clock = gst_element_get_clock (self->src_vid_src);
base_time = gst_element_get_base_time (self->src_vid_src);
diff --git a/gst/dccp/gstdccp.c b/gst/dccp/gstdccp.c
index af652f2de..cbe7c4689 100644
--- a/gst/dccp/gstdccp.c
+++ b/gst/dccp/gstdccp.c
@@ -333,7 +333,7 @@ gst_dccp_socket_write (GstElement * element, int socket, const void *buf,
size_t size, int packet_size)
{
size_t bytes_written = 0;
- ssize_t wrote;
+ ssize_t wrote = 0;
#ifndef G_OS_WIN32
struct iovec iov;
@@ -362,11 +362,14 @@ gst_dccp_socket_write (GstElement * element, int socket, const void *buf,
} while (wrote == SOCKET_ERROR && errorCode == EAGAIN);
#endif
- /* TODO print the send error */
- bytes_written += wrote;
+ /* give up on error */
+ if (wrote >= 0)
+ bytes_written += wrote;
+ else
+ break;
}
- if (bytes_written < 0)
+ if (wrote < 0)
GST_WARNING ("Error while writing.");
else
GST_LOG_OBJECT (element, "Wrote %" G_GSIZE_FORMAT " bytes succesfully.",
diff --git a/gst/faceoverlay/gstfaceoverlay.c b/gst/faceoverlay/gstfaceoverlay.c
index feb07b5bd..01c8f1b72 100644
--- a/gst/faceoverlay/gstfaceoverlay.c
+++ b/gst/faceoverlay/gstfaceoverlay.c
@@ -1,5 +1,4 @@
-/*
- * GStreamer faceoverlay plugin
+/* GStreamer faceoverlay plugin
* Copyright (C) 2011 Laura Lucas Alday <lauralucas@gmail.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a
@@ -52,7 +51,6 @@
* <title>Example launch line</title>
* |[
* gst-launch autovideosrc ! ffmpegcolorspace ! faceoverlay location=/path/to/gnome-video-effects/pixmaps/bow.svg x=-5 y=-15 w=0.3 h=0.1 ! ffmpegcolorspace ! autovideosink
-
* ]|
* </refsect2>
*/
@@ -70,19 +68,6 @@
GST_DEBUG_CATEGORY_STATIC (gst_face_overlay_debug);
#define GST_CAT_DEFAULT gst_face_overlay_debug
-#if G_BYTE_ORDER == G_LITTLE_ENDIAN
-#define GST_STR_VIDEO_CAPS GST_VIDEO_CAPS_BGRA
-#else
-#define GST_STR_VIDEO_CAPS GST_VIDEO_CAPS_ARGB
-#endif
-
-/* Filter signals and args */
-enum
-{
- /* FILL ME */
- LAST_SIGNAL
-};
-
enum
{
PROP_0,
@@ -93,17 +78,16 @@ enum
PROP_H
};
-/* the capabilities of the inputs and outputs. */
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
- GST_STATIC_CAPS (GST_STR_VIDEO_CAPS)
+ GST_STATIC_CAPS ("video/x-raw-rgb; video/x-raw-yuv")
);
static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
- GST_STATIC_CAPS (GST_STR_VIDEO_CAPS)
+ GST_STATIC_CAPS ("video/x-raw-rgb; video/x-raw-yuv")
);
GST_BOILERPLATE (GstFaceOverlay, gst_face_overlay, GstBin, GST_TYPE_BIN);
@@ -117,121 +101,62 @@ static void gst_face_overlay_message_handler (GstBin * bin,
static GstStateChangeReturn gst_face_overlay_change_state (GstElement * element,
GstStateChange transition);
static gboolean gst_face_overlay_create_children (GstFaceOverlay * filter);
-static gboolean gst_face_overlay_reset (GstFaceOverlay * filter);
-static gboolean gst_face_overlay_create_pad (GstFaceOverlay * filter,
- GstPad * filter_pad, const char *pad_name, GstElement * child_element);
-static gboolean toggle_pads_link_state (GstPad * pad1, GstPad * pad2);
-
-
-static gboolean
-toggle_pads_link_state (GstPad * pad1, GstPad * pad2)
-{
- gboolean ok = TRUE;
- if (gst_pad_is_linked (pad1)) {
- if (gst_pad_get_direction (pad1) == GST_PAD_SINK)
- gst_pad_unlink (pad2, pad1);
- else
- gst_pad_unlink (pad1, pad2);
- } else {
- if (gst_pad_get_direction (pad1) == GST_PAD_SINK)
- ok &= (gst_pad_link (pad2, pad1) == 0);
- else
- ok &= (gst_pad_link (pad1, pad2) == 0);
- }
-
- return ok;
-}
-
-/* Unlinks and removes the pad that was created in gst_face_overlay_init ()
- * and adds the internal element ghost pad instead */
static gboolean
-gst_face_overlay_create_pad (GstFaceOverlay * filter, GstPad * filter_pad,
- const char *pad_name, GstElement * child_element)
+gst_face_overlay_create_children (GstFaceOverlay * filter)
{
- GstPad *peer = NULL;
- GstPad *pad = NULL;
- gboolean ok = TRUE;
+ GstElement *csp, *face_detect, *overlay;
+ GstPad *pad;
- /* get the outside world pad connected to faceoverlay src/sink pad */
- peer = gst_pad_get_peer (filter_pad);
+ csp = gst_element_factory_make ("ffmpegcolorspace", NULL);
+ face_detect = gst_element_factory_make ("facedetect", NULL);
+ overlay = gst_element_factory_make ("rsvgoverlay", NULL);
- /* unlink and remove the faceoverlay src/sink pad */
- toggle_pads_link_state (peer, filter_pad);
+ /* FIXME: post missing-plugin messages on NULL->READY if needed */
+ if (csp == NULL || face_detect == NULL || overlay == NULL)
+ goto missing_element;
- gst_element_remove_pad (GST_ELEMENT (filter), filter_pad);
+ g_object_set (face_detect, "display", FALSE, NULL);
- /* add a ghost pad pointing to the child element pad (facedetect sink or
- * svg_overlay src depending on filter_pad direction) and add it to
- * faceoverlay bin */
- pad = gst_element_get_static_pad (child_element, pad_name);
- filter_pad = gst_ghost_pad_new (pad_name, pad);
- gst_object_unref (GST_OBJECT (pad));
+ gst_bin_add_many (GST_BIN (filter), face_detect, csp, overlay, NULL);
+ filter->svg_overlay = overlay;
- gst_element_add_pad (GST_ELEMENT (filter), filter_pad);
+ if (!gst_element_link_many (face_detect, csp, overlay, NULL))
+ GST_ERROR_OBJECT (filter, "couldn't link elements");
- /* link the child element pad to the outside world thru the ghost pad */
- toggle_pads_link_state (peer, filter_pad);
+ pad = gst_element_get_static_pad (face_detect, "sink");
+ if (!gst_ghost_pad_set_target (GST_GHOST_PAD (filter->sinkpad), pad))
+ GST_ERROR_OBJECT (filter->sinkpad, "couldn't set sinkpad target");
+ gst_object_unref (pad);
- g_object_unref (peer);
-
- return ok;
-}
-
-static gboolean
-gst_face_overlay_reset (GstFaceOverlay * filter)
-{
- gst_element_set_state (filter->face_detect, GST_STATE_NULL);
- gst_bin_remove (GST_BIN (filter), filter->face_detect);
- filter->face_detect = NULL;
-
- gst_element_set_state (filter->svg_overlay, GST_STATE_NULL);
- gst_bin_remove (GST_BIN (filter), filter->svg_overlay);
- filter->svg_overlay = NULL;
-
- gst_element_set_state (filter->colorspace, GST_STATE_NULL);
- gst_bin_remove (GST_BIN (filter), filter->colorspace);
- filter->colorspace = NULL;
+ pad = gst_element_get_static_pad (overlay, "src");
+ if (!gst_ghost_pad_set_target (GST_GHOST_PAD (filter->srcpad), pad))
+ GST_ERROR_OBJECT (filter->srcpad, "couldn't set srcpad target");
+ gst_object_unref (pad);
return TRUE;
-}
-static gboolean
-gst_face_overlay_create_children (GstFaceOverlay * filter)
-{
- gboolean ret = TRUE;
+/* ERRORS */
+missing_element:
+ {
+ /* clean up */
+ if (csp == NULL)
+ GST_ERROR_OBJECT (filter, "ffmpegcolorspace element not found");
+ else
+ gst_object_unref (csp);
- if ((filter->colorspace = gst_element_factory_make ("ffmpegcolorspace",
- NULL)) == NULL) {
- return FALSE;
- }
+ if (face_detect == NULL)
+ GST_ERROR_OBJECT (filter, "facedetect element not found (opencv plugin)");
+ else
+ gst_object_unref (face_detect);
- if ((filter->face_detect = gst_element_factory_make ("facedetect",
- NULL)) == NULL) {
- return FALSE;
- }
- g_object_set (filter->face_detect, "display", 0, NULL);
+ if (overlay == NULL)
+ GST_ERROR_OBJECT (filter, "rsvgoverlay element not found (rsvg plugin)");
+ else
+ gst_object_unref (overlay);
- if ((filter->svg_overlay = gst_element_factory_make ("rsvgoverlay",
- NULL)) == NULL) {
return FALSE;
}
-
- gst_bin_add_many (GST_BIN (filter),
- filter->face_detect, filter->colorspace, filter->svg_overlay, NULL);
-
- ret &= gst_element_link_pads (filter->face_detect, "src",
- filter->colorspace, "sink");
- ret &= gst_element_link_pads (filter->colorspace, "src",
- filter->svg_overlay, "sink");
-
- ret &= gst_face_overlay_create_pad (filter, filter->sinkpad, "sink",
- filter->face_detect);
- ret &= gst_face_overlay_create_pad (filter, filter->srcpad, "src",
- filter->svg_overlay);
-
- return ret;
-
}
static GstStateChangeReturn
@@ -242,8 +167,13 @@ gst_face_overlay_change_state (GstElement * element, GstStateChange transition)
switch (transition) {
case GST_STATE_CHANGE_NULL_TO_READY:
- if (!gst_face_overlay_create_children (filter))
+ if (filter->svg_overlay == NULL) {
+ GST_ELEMENT_ERROR (filter, CORE, MISSING_PLUGIN, (NULL),
+ ("Some required plugins are missing, probably either the opencv "
+ "facedetect element or rsvgoverlay"));
return GST_STATE_CHANGE_FAILURE;
+ }
+ filter->update_svg = TRUE;
break;
default:
break;
@@ -252,9 +182,6 @@ gst_face_overlay_change_state (GstElement * element, GstStateChange transition)
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
switch (transition) {
- case GST_STATE_CHANGE_READY_TO_NULL:
- gst_face_overlay_reset (filter);
- break;
default:
break;
}
@@ -263,65 +190,91 @@ gst_face_overlay_change_state (GstElement * element, GstStateChange transition)
}
static void
+gst_face_overlay_handle_faces (GstFaceOverlay * filter, const GstStructure * s)
+{
+ guint x, y, width, height;
+ gint svg_x, svg_y, svg_width, svg_height;
+ const GstStructure *face;
+ const GValue *faces_list, *face_val;
+ gchar *new_location = NULL;
+ gint face_count;
+
+#if 0
+ /* optionally draw the image once every two messages for better performance */
+ filter->process_message = !filter->process_message;
+ if (!filter->process_message)
+ return;
+#endif
+
+ faces_list = gst_structure_get_value (s, "faces");
+ face_count = gst_value_list_get_size (faces_list);
+ GST_LOG_OBJECT (filter, "face count: %d", face_count);
+
+ if (face_count == 0) {
+ GST_DEBUG_OBJECT (filter, "no face, clearing overlay");
+ g_object_set (filter->svg_overlay, "location", NULL, NULL);
+ GST_OBJECT_LOCK (filter);
+ filter->update_svg = TRUE;
+ GST_OBJECT_UNLOCK (filter);
+ return;
+ }
+
+ /* The last face in the list seems to be the right one, objects mistakenly
+ * detected as faces for a couple of frames seem to be in the list
+ * beginning. TODO: needs confirmation. */
+ face_val = gst_value_list_get_value (faces_list, face_count - 1);
+ face = gst_value_get_structure (face_val);
+ gst_structure_get_uint (face, "x", &x);
+ gst_structure_get_uint (face, "y", &y);
+ gst_structure_get_uint (face, "width", &width);
+ gst_structure_get_uint (face, "height", &height);
+
+ /* Apply x and y offsets relative to face position and size.
+ * Set image width and height as a fraction of face width and height.
+ * Cast to int since face position and size will never be bigger than
+ * G_MAX_INT and we may have negative values as svg_x or svg_y */
+
+ GST_OBJECT_LOCK (filter);
+
+ svg_x = (gint) x + (gint) (filter->x * width);
+ svg_y = (gint) y + (gint) (filter->y * height);
+
+ svg_width = (gint) (filter->w * width);
+ svg_height = (gint) (filter->h * height);
+
+ if (filter->update_svg) {
+ new_location = g_strdup (filter->location);
+ filter->update_svg = FALSE;
+ }
+ GST_OBJECT_UNLOCK (filter);
+
+ if (new_location != NULL) {
+ GST_DEBUG_OBJECT (filter, "set rsvgoverlay location=%s", new_location);
+ g_object_set (filter->svg_overlay, "location", new_location, NULL);
+ g_free (new_location);
+ }
+
+ GST_LOG_OBJECT (filter, "overlay dimensions: %d x %d @ %d,%d",
+ svg_width, svg_height, svg_x, svg_y);
+
+ g_object_set (filter->svg_overlay,
+ "x", svg_x, "y", svg_y, "width", svg_width, "height", svg_height, NULL);
+}
+
+static void
gst_face_overlay_message_handler (GstBin * bin, GstMessage * message)
{
- if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT &&
- strcmp (gst_structure_get_name (message->structure), "facedetect") == 0) {
- GstFaceOverlay *filter = GST_FACEOVERLAY (bin);
-
- /* optionally draw the image once every two messages for better performance
- * filter->process_message = !filter->process_message;
- * if(!filter->process_message)
- * return;
- */
-
- guint x, y, width, height;
- int delta_x, delta_y, svg_x, svg_y, svg_width, svg_height;
- const GstStructure *face;
- int face_count;
-
- face_count =
- gst_value_list_get_size (gst_structure_get_value (message->structure,
- "faces"));
-
- /* The last face in the list seems to be the right one, objects mistakenly
- * detected as faces for a couple of frames seem to be in the list
- * beginning. TODO: needs confirmation. */
- face =
- gst_value_get_structure (gst_value_list_get_value
- (gst_structure_get_value (message->structure, "faces"),
- face_count - 1));
- gst_structure_get_uint (face, "x", &x);
- gst_structure_get_uint (face, "y", &y);
- gst_structure_get_uint (face, "width", &width);
- gst_structure_get_uint (face, "height", &height);
-
- /* Apply x and y offsets relative to face position and size.
- * Set image width and height as a fraction of face width and height.
- * Cast to int since face position and size will never be bigger than
- * G_MAX_INT and we may have negative values as svg_x or svg_y */
-
- delta_x = (int) (filter->x * (int) width);
- svg_x = (int) x + delta_x;
-
- delta_y = (int) (filter->y * (int) height);
- svg_y = (int) y + delta_y;
-
- svg_width = (int) width *filter->w;
- svg_height = (int) height *filter->h;
-
- g_object_set (filter->svg_overlay,
- "location", filter->location,
- "x", svg_x, "y", svg_y, "width", svg_width, "height", svg_height, NULL);
+ if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT) {
+ const GstStructure *s = gst_message_get_structure (message);
+ if (gst_structure_has_name (s, "facedetect")) {
+ gst_face_overlay_handle_faces (GST_FACEOVERLAY (bin), s);
+ }
}
GST_BIN_CLASS (parent_class)->handle_message (bin, message);
}
-/* GObject vmethod implementations */
-/* the _base_init() function is meant to initialize class and child class
- * properties during each new child class creation */
static void
gst_face_overlay_base_init (gpointer gclass)
{
@@ -339,10 +292,6 @@ gst_face_overlay_base_init (gpointer gclass)
gst_static_pad_template_get (&sink_factory));
}
-/* initialize the faceoverlay's class */
-/* the _class_init() function is used to initialise the class only once
- * (specifying what signals, arguments and virtual functions the class has and
- * setting up global state) */
static void
gst_face_overlay_class_init (GstFaceOverlayClass * klass)
{
@@ -382,34 +331,32 @@ gst_face_overlay_class_init (GstFaceOverlayClass * klass)
GST_DEBUG_FUNCPTR (gst_face_overlay_message_handler);
gstelement_class->change_state =
GST_DEBUG_FUNCPTR (gst_face_overlay_change_state);
-
}
-/* initialize the new element
- * instantiate pads and add them to element
- * set pad calback functions
- * initialize instance structure
- * the _init() function is used to initialise a specific instance of this type.
- */
static void
gst_face_overlay_init (GstFaceOverlay * filter, GstFaceOverlayClass * gclass)
{
+ GstPadTemplate *tmpl;
+
filter->x = 0;
filter->y = 0;
filter->w = 1;
filter->h = 1;
- filter->colorspace = NULL;
filter->svg_overlay = NULL;
- filter->face_detect = NULL;
filter->location = NULL;
filter->process_message = TRUE;
- filter->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink");
+ tmpl = gst_static_pad_template_get (&sink_factory);
+ filter->sinkpad = gst_ghost_pad_new_no_target_from_template ("sink", tmpl);
+ gst_object_unref (tmpl);
gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad);
- filter->srcpad = gst_pad_new_from_static_template (&src_factory, "src");
+ tmpl = gst_static_pad_template_get (&src_factory);
+ filter->srcpad = gst_ghost_pad_new_no_target_from_template ("src", tmpl);
+ gst_object_unref (tmpl);
gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad);
+ gst_face_overlay_create_children (filter);
}
static void
@@ -420,19 +367,31 @@ gst_face_overlay_set_property (GObject * object, guint prop_id,
switch (prop_id) {
case PROP_LOCATION:
+ GST_OBJECT_LOCK (filter);
+ g_free (filter->location);
filter->location = g_value_dup_string (value);
+ filter->update_svg = TRUE;
+ GST_OBJECT_UNLOCK (filter);
break;
case PROP_X:
+ GST_OBJECT_LOCK (filter);
filter->x = g_value_get_float (value);
+ GST_OBJECT_UNLOCK (filter);
break;
case PROP_Y:
+ GST_OBJECT_LOCK (filter);
filter->y = g_value_get_float (value);
+ GST_OBJECT_UNLOCK (filter);
break;
case PROP_W:
+ GST_OBJECT_LOCK (filter);
filter->w = g_value_get_float (value);
+ GST_OBJECT_UNLOCK (filter);
break;
case PROP_H:
+ GST_OBJECT_LOCK (filter);
filter->h = g_value_get_float (value);
+ GST_OBJECT_UNLOCK (filter);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -448,19 +407,29 @@ gst_face_overlay_get_property (GObject * object, guint prop_id,
switch (prop_id) {
case PROP_LOCATION:
+ GST_OBJECT_LOCK (filter);
g_value_set_string (value, filter->location);
+ GST_OBJECT_UNLOCK (filter);
break;
case PROP_X:
+ GST_OBJECT_LOCK (filter);
g_value_set_float (value, filter->x);
+ GST_OBJECT_UNLOCK (filter);
break;
case PROP_Y:
+ GST_OBJECT_LOCK (filter);
g_value_set_float (value, filter->y);
+ GST_OBJECT_UNLOCK (filter);
break;
case PROP_W:
+ GST_OBJECT_LOCK (filter);
g_value_set_float (value, filter->w);
+ GST_OBJECT_UNLOCK (filter);
break;
case PROP_H:
+ GST_OBJECT_LOCK (filter);
g_value_set_float (value, filter->h);
+ GST_OBJECT_UNLOCK (filter);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -468,14 +437,9 @@ gst_face_overlay_get_property (GObject * object, guint prop_id,
}
}
-/* entry point to initialize the plug-in
- * initialize the plug-in itself
- * register the element factories and other features
- */
static gboolean
faceoverlay_init (GstPlugin * faceoverlay)
{
- /* debug category for fltering log messages */
GST_DEBUG_CATEGORY_INIT (gst_face_overlay_debug, "faceoverlay",
0, "SVG Face Overlay");
@@ -483,18 +447,8 @@ faceoverlay_init (GstPlugin * faceoverlay)
GST_TYPE_FACEOVERLAY);
}
-/* PACKAGE: this is usually set by autotools depending on some _INIT macro
- * in configure.ac and then written into and defined in config.h, but we can
- * just set it ourselves here in case someone doesn't use autotools to
- * compile this code. GST_PLUGIN_DEFINE needs PACKAGE to be defined.
- */
-#ifndef PACKAGE
-#define PACKAGE "faceoverlay"
-#endif
-
-/* gstreamer looks for this structure to register plugins */
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
GST_VERSION_MINOR,
"faceoverlay",
"SVG Face Overlay",
- faceoverlay_init, VERSION, "LGPL", "GStreamer", "http://gstreamer.net/")
+ faceoverlay_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/gst/faceoverlay/gstfaceoverlay.h b/gst/faceoverlay/gstfaceoverlay.h
index 7b8e50c00..c21327b11 100644
--- a/gst/faceoverlay/gstfaceoverlay.h
+++ b/gst/faceoverlay/gstfaceoverlay.h
@@ -1,5 +1,4 @@
-/*
- * GStreamer faceoverlay plugin
+/* GStreamer faceoverlay plugin
* Copyright (C) 2011 Laura Lucas Alday <lauralucas@gmail.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a
@@ -47,7 +46,7 @@
#include <gst/gst.h>
G_BEGIN_DECLS
-/* #defines don't like whitespacey bits */
+
#define GST_TYPE_FACEOVERLAY \
(gst_face_overlay_get_type())
#define GST_FACEOVERLAY(obj) \
@@ -58,6 +57,7 @@ G_BEGIN_DECLS
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FACEOVERLAY))
#define GST_IS_FACEOVERLAY_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FACEOVERLAY))
+
typedef struct _GstFaceOverlay GstFaceOverlay;
typedef struct _GstFaceOverlayClass GstFaceOverlayClass;
@@ -73,6 +73,8 @@ struct _GstFaceOverlay
gboolean process_message;
+ gboolean update_svg;
+
gchar *location;
gfloat x;
gfloat y;
@@ -88,4 +90,5 @@ struct _GstFaceOverlayClass
GType gst_face_overlay_get_type (void);
G_END_DECLS
+
#endif /* __GST_FACEOVERLAY_H__ */
diff --git a/gst/geometrictransform/gstgeometrictransform.c b/gst/geometrictransform/gstgeometrictransform.c
index 11e45fb50..4fceaef52 100644
--- a/gst/geometrictransform/gstgeometrictransform.c
+++ b/gst/geometrictransform/gstgeometrictransform.c
@@ -113,6 +113,8 @@ gst_geometric_transform_generate_map (GstGeometricTransform * gt)
GstGeometricTransformClass *klass;
gdouble *ptr;
+ GST_INFO_OBJECT (gt, "Generating new transform map");
+
/* cleanup old map */
g_free (gt->map);
gt->map = NULL;
@@ -143,9 +145,11 @@ gst_geometric_transform_generate_map (GstGeometricTransform * gt)
}
end:
- if (!ret)
+ if (!ret) {
+ GST_WARNING_OBJECT (gt, "Generating transform map failed");
g_free (gt->map);
- else
+ gt->map = NULL;
+ } else
gt->needs_remap = FALSE;
return ret;
}
@@ -174,8 +178,8 @@ gst_geometric_transform_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
/* regenerate the map */
GST_OBJECT_LOCK (gt);
- if (old_width == 0 || old_height == 0 || gt->width != old_width ||
- gt->height != old_height) {
+ if (gt->map == NULL || old_width == 0 || old_height == 0
+ || gt->width != old_width || gt->height != old_height) {
if (klass->prepare_func)
if (!klass->prepare_func (gt)) {
GST_OBJECT_UNLOCK (gt);
@@ -347,7 +351,13 @@ gst_geometric_transform_stop (GstBaseTransform * trans)
{
GstGeometricTransform *gt = GST_GEOMETRIC_TRANSFORM_CAST (trans);
+ GST_INFO_OBJECT (gt, "Deleting transform map");
+
+ gt->width = 0;
+ gt->height = 0;
+
g_free (gt->map);
+ gt->map = NULL;
return TRUE;
}
diff --git a/gst/hls/gsthlsdemux.c b/gst/hls/gsthlsdemux.c
index eeb2ff38a..5e9ebb595 100644
--- a/gst/hls/gsthlsdemux.c
+++ b/gst/hls/gsthlsdemux.c
@@ -343,9 +343,8 @@ gst_hls_demux_src_event (GstPad * pad, GstEvent * event)
GstSeekType start_type, stop_type;
gint64 start, stop;
GList *walk;
- gint current_pos;
+ GstClockTime current_pos, target_pos;
gint current_sequence;
- gint target_second;
GstM3U8MediaFile *file;
GST_INFO_OBJECT (demux, "Received GST_EVENT_SEEK");
@@ -369,14 +368,13 @@ gst_hls_demux_src_event (GstPad * pad, GstEvent * event)
file = GST_M3U8_MEDIA_FILE (demux->client->current->files->data);
current_sequence = file->sequence;
current_pos = 0;
- target_second = start / GST_SECOND;
- GST_DEBUG_OBJECT (demux, "Target seek to %d", target_second);
+ target_pos = (GstClockTime) start;
for (walk = demux->client->current->files; walk; walk = walk->next) {
file = walk->data;
current_sequence = file->sequence;
- if (current_pos <= target_second
- && target_second < current_pos + file->duration) {
+ if (current_pos <= target_pos
+ && target_pos < current_pos + file->duration) {
break;
}
current_pos += file->duration;
@@ -847,7 +845,6 @@ gst_hls_demux_make_fetcher_locked (GstHLSDemux * demux, const gchar * uri)
demux->stopping_fetcher = FALSE;
gst_element_set_bus (GST_ELEMENT (demux->fetcher), demux->fetcher_bus);
- g_object_set (G_OBJECT (demux->fetcher), "location", uri, NULL);
pad = gst_element_get_static_pad (demux->fetcher, "src");
if (pad) {
gst_pad_link (pad, demux->fetcherpad);
@@ -1069,6 +1066,8 @@ gst_hls_demux_cache_fragments (GstHLSDemux * demux)
gst_m3u8_client_get_target_duration (demux->client)
/ GST_SECOND * G_USEC_PER_SEC);
if (!gst_hls_demux_get_next_fragment (demux)) {
+ if (demux->end_of_playlist)
+ break;
if (!demux->cancelled)
GST_ERROR_OBJECT (demux, "Error caching the first fragments");
return FALSE;
diff --git a/gst/hls/m3u8.c b/gst/hls/m3u8.c
index c27f159b5..eecb467e2 100644
--- a/gst/hls/m3u8.c
+++ b/gst/hls/m3u8.c
@@ -20,6 +20,7 @@
*/
#include <stdlib.h>
+#include <math.h>
#include <errno.h>
#include <glib.h>
@@ -34,7 +35,7 @@ static void gst_m3u8_free (GstM3U8 * m3u8);
static gboolean gst_m3u8_update (GstM3U8 * m3u8, gchar * data,
gboolean * updated);
static GstM3U8MediaFile *gst_m3u8_media_file_new (gchar * uri,
- gchar * title, gint duration, guint sequence);
+ gchar * title, GstClockTime duration, guint sequence);
static void gst_m3u8_media_file_free (GstM3U8MediaFile * self);
static GstM3U8 *
@@ -77,7 +78,7 @@ gst_m3u8_free (GstM3U8 * self)
}
static GstM3U8MediaFile *
-gst_m3u8_media_file_new (gchar * uri, gchar * title, gint duration,
+gst_m3u8_media_file_new (gchar * uri, gchar * title, GstClockTime duration,
guint sequence)
{
GstM3U8MediaFile *file;
@@ -132,6 +133,36 @@ int_from_string (gchar * ptr, gchar ** endptr, gint * val)
}
static gboolean
+double_from_string (gchar * ptr, gchar ** endptr, gdouble * val)
+{
+ gchar *end;
+ gdouble ret;
+
+ g_return_val_if_fail (ptr != NULL, FALSE);
+ g_return_val_if_fail (val != NULL, FALSE);
+
+ errno = 0;
+ ret = strtod (ptr, &end);
+ if ((errno == ERANGE && (ret == HUGE_VAL || ret == -HUGE_VAL))
+ || (errno != 0 && ret == 0)) {
+ GST_WARNING ("%s", g_strerror (errno));
+ return FALSE;
+ }
+
+ if (!isfinite (ret)) {
+ GST_WARNING ("%s", g_strerror (ERANGE));
+ return FALSE;
+ }
+
+ if (endptr)
+ *endptr = end;
+
+ *val = (gint) ret;
+
+ return end != ptr;
+}
+
+static gboolean
parse_attributes (gchar ** ptr, gchar ** a, gchar ** v)
{
gchar *end, *p;
@@ -186,7 +217,8 @@ gst_m3u8_compare_playlist_by_bitrate (gconstpointer a, gconstpointer b)
static gboolean
gst_m3u8_update (GstM3U8 * self, gchar * data, gboolean * updated)
{
- gint val, duration;
+ gint val;
+ GstClockTime duration;
gchar *title, *end;
// gboolean discontinuity;
GstM3U8 *list;
@@ -222,7 +254,7 @@ gst_m3u8_update (GstM3U8 * self, gchar * data, gboolean * updated)
}
list = NULL;
- duration = -1;
+ duration = 0;
title = NULL;
data += 7;
while (TRUE) {
@@ -233,7 +265,7 @@ gst_m3u8_update (GstM3U8 * self, gchar * data, gboolean * updated)
if (data[0] != '#') {
gchar *r;
- if (duration < 0 && list == NULL) {
+ if (duration <= 0 && list == NULL) {
GST_LOG ("%s: got line without EXTINF or EXTSTREAMINF, dropping", data);
goto next_line;
}
@@ -277,7 +309,7 @@ gst_m3u8_update (GstM3U8 * self, gchar * data, gboolean * updated)
file =
gst_m3u8_media_file_new (data, title, duration,
self->mediasequence++);
- duration = -1;
+ duration = 0;
title = NULL;
self->files = g_list_append (self->files, file);
}
@@ -321,7 +353,7 @@ gst_m3u8_update (GstM3U8 * self, gchar * data, gboolean * updated)
}
} else if (g_str_has_prefix (data, "#EXT-X-TARGETDURATION:")) {
if (int_from_string (data + 22, &data, &val))
- self->targetduration = val;
+ self->targetduration = val * GST_SECOND;
} else if (g_str_has_prefix (data, "#EXT-X-MEDIA-SEQUENCE:")) {
if (int_from_string (data + 22, &data, &val))
self->mediasequence = val;
@@ -334,11 +366,12 @@ gst_m3u8_update (GstM3U8 * self, gchar * data, gboolean * updated)
g_free (self->allowcache);
self->allowcache = g_strdup (data + 19);
} else if (g_str_has_prefix (data, "#EXTINF:")) {
- if (!int_from_string (data + 8, &data, &val)) {
+ gdouble fval;
+ if (!double_from_string (data + 8, &data, &fval)) {
GST_WARNING ("Can't read EXTINF duration");
goto next_line;
}
- duration = val;
+ duration = fval * (gdouble) GST_SECOND;
if (duration > self->targetduration)
GST_WARNING ("EXTINF duration > TARGETDURATION");
if (!data || *data != ',')
@@ -485,7 +518,6 @@ gst_m3u8_client_get_current_position (GstM3U8Client * client,
break;
*timestamp += GST_M3U8_MEDIA_FILE (walk->data)->duration;
}
- *timestamp *= GST_SECOND;
}
gboolean
@@ -517,7 +549,7 @@ gst_m3u8_client_get_next_fragment (GstM3U8Client * client,
client->sequence = file->sequence + 1;
*uri = file->uri;
- *duration = file->duration * GST_SECOND;
+ *duration = file->duration;
GST_M3U8_CLIENT_UNLOCK (client);
return TRUE;
@@ -545,7 +577,7 @@ gst_m3u8_client_get_duration (GstM3U8Client * client)
g_list_foreach (client->current->files, (GFunc) _sum_duration, &duration);
GST_M3U8_CLIENT_UNLOCK (client);
- return duration * GST_SECOND;
+ return duration;
}
GstClockTime
@@ -558,7 +590,7 @@ gst_m3u8_client_get_target_duration (GstM3U8Client * client)
GST_M3U8_CLIENT_LOCK (client);
duration = client->current->targetduration;
GST_M3U8_CLIENT_UNLOCK (client);
- return duration * GST_SECOND;
+ return duration;
}
const gchar *
diff --git a/gst/hls/m3u8.h b/gst/hls/m3u8.h
index a428a67a4..a03828716 100644
--- a/gst/hls/m3u8.h
+++ b/gst/hls/m3u8.h
@@ -41,7 +41,7 @@ struct _GstM3U8
gboolean endlist; /* if ENDLIST has been reached */
gint version; /* last EXT-X-VERSION */
- gint targetduration; /* last EXT-X-TARGETDURATION */
+ GstClockTime targetduration; /* last EXT-X-TARGETDURATION */
gchar *allowcache; /* last EXT-X-ALLOWCACHE */
gint bandwidth;
@@ -62,7 +62,7 @@ struct _GstM3U8
struct _GstM3U8MediaFile
{
gchar *title;
- gint duration;
+ GstClockTime duration;
gchar *uri;
guint sequence; /* the sequence nb of this file */
};
diff --git a/gst/inter/gstinteraudiosink.c b/gst/inter/gstinteraudiosink.c
index e5ba92687..fd5987e35 100644
--- a/gst/inter/gstinteraudiosink.c
+++ b/gst/inter/gstinteraudiosink.c
@@ -19,14 +19,21 @@
/**
* SECTION:element-gstinteraudiosink
*
- * The interaudiosink element does FIXME stuff.
+ * The interaudiosink element is an audio sink element. It is used
+ * in connection with a interaudiosrc element in a different pipeline,
+ * similar to intervideosink and intervideosrc.
*
* <refsect2>
* <title>Example launch line</title>
* |[
- * gst-launch -v fakesrc ! interaudiosink ! FIXME ! fakesink
+ * gst-launch -v audiotestsrc ! queue ! interaudiosink
* ]|
- * FIXME Describe what the pipeline does.
+ *
+ * The interaudiosink element cannot be used effectively with gst-launch,
+ * as it requires a second pipeline in the application to receive the
+ * audio.
+ * See the gstintertest.c example in the gst-plugins-bad source code for
+ * more details.
* </refsect2>
*/
@@ -91,8 +98,7 @@ GST_STATIC_PAD_TEMPLATE ("sink",
"endianness = (int) BYTE_ORDER, "
"signed = (boolean) true, "
"width = (int) 16, "
- "depth = (int) 16, "
- "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]")
+ "depth = (int) 16, " "rate = (int) 48000, " "channels = (int) 2")
);
@@ -113,8 +119,11 @@ gst_inter_audio_sink_base_init (gpointer g_class)
gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&gst_inter_audio_sink_sink_template));
- gst_element_class_set_details_simple (element_class, "FIXME Long name",
- "Generic", "FIXME Description", "FIXME <fixme@example.com>");
+ gst_element_class_set_details_simple (element_class,
+ "Internal audio sink",
+ "Sink/Audio",
+ "Virtual audio sink for internal process communication",
+ "David Schleef <ds@schleef.org>");
}
static void
@@ -151,26 +160,32 @@ gst_inter_audio_sink_class_init (GstInterAudioSinkClass * klass)
base_sink_class->unlock_stop =
GST_DEBUG_FUNCPTR (gst_inter_audio_sink_unlock_stop);
+#if 0
g_object_class_install_property (gobject_class, PROP_CHANNEL,
g_param_spec_string ("channel", "Channel",
"Channel name to match inter src and sink elements",
"default", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+#endif
}
static void
gst_inter_audio_sink_init (GstInterAudioSink * interaudiosink,
GstInterAudioSinkClass * interaudiosink_class)
{
- interaudiosink->surface = gst_inter_surface_get ("default");
+ interaudiosink->channel = g_strdup ("default");
}
void
gst_inter_audio_sink_set_property (GObject * object, guint property_id,
const GValue * value, GParamSpec * pspec)
{
- /* GstInterAudioSink *interaudiosink = GST_INTER_AUDIO_SINK (object); */
+ GstInterAudioSink *interaudiosink = GST_INTER_AUDIO_SINK (object);
switch (property_id) {
+ case PROP_CHANNEL:
+ g_free (interaudiosink->channel);
+ interaudiosink->channel = g_value_dup_string (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -181,9 +196,12 @@ void
gst_inter_audio_sink_get_property (GObject * object, guint property_id,
GValue * value, GParamSpec * pspec)
{
- /* GstInterAudioSink *interaudiosink = GST_INTER_AUDIO_SINK (object); */
+ GstInterAudioSink *interaudiosink = GST_INTER_AUDIO_SINK (object);
switch (property_id) {
+ case PROP_CHANNEL:
+ g_value_set_string (value, interaudiosink->channel);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -259,6 +277,11 @@ gst_inter_audio_sink_get_times (GstBaseSink * sink, GstBuffer * buffer,
static gboolean
gst_inter_audio_sink_start (GstBaseSink * sink)
{
+ GstInterAudioSink *interaudiosink = GST_INTER_AUDIO_SINK (sink);
+
+ GST_DEBUG ("start");
+
+ interaudiosink->surface = gst_inter_surface_get (interaudiosink->channel);
return TRUE;
}
@@ -274,6 +297,9 @@ gst_inter_audio_sink_stop (GstBaseSink * sink)
gst_adapter_clear (interaudiosink->surface->audio_adapter);
g_mutex_unlock (interaudiosink->surface->mutex);
+ gst_inter_surface_unref (interaudiosink->surface);
+ interaudiosink->surface = NULL;
+
return TRUE;
}
diff --git a/gst/inter/gstinteraudiosink.h b/gst/inter/gstinteraudiosink.h
index b0a32769e..5ea09997a 100644
--- a/gst/inter/gstinteraudiosink.h
+++ b/gst/inter/gstinteraudiosink.h
@@ -39,6 +39,7 @@ struct _GstInterAudioSink
GstBaseSink base_interaudiosink;
GstInterSurface *surface;
+ char *channel;
int fps_n;
int fps_d;
diff --git a/gst/inter/gstinteraudiosrc.c b/gst/inter/gstinteraudiosrc.c
index e659bf024..de2b2687a 100644
--- a/gst/inter/gstinteraudiosrc.c
+++ b/gst/inter/gstinteraudiosrc.c
@@ -19,14 +19,19 @@
/**
* SECTION:element-gstinteraudiosrc
*
- * The interaudiosrc element does FIXME stuff.
+ * The interaudiosrc element is an audio source element. It is used
+ * in connection with a interaudiosink element in a different pipeline.
*
* <refsect2>
* <title>Example launch line</title>
* |[
- * gst-launch -v fakesrc ! interaudiosrc ! FIXME ! fakesink
+ * gst-launch -v interaudiosrc ! queue ! audiosink
* ]|
- * FIXME Describe what the pipeline does.
+ *
+ * The interaudiosrc element cannot be used effectively with gst-launch,
+ * as it requires a second pipeline in the application to send audio.
+ * See the gstintertest.c example in the gst-plugins-bad source code for
+ * more details.
* </refsect2>
*/
@@ -93,8 +98,7 @@ GST_STATIC_PAD_TEMPLATE ("src",
"endianness = (int) BYTE_ORDER, "
"signed = (boolean) true, "
"width = (int) 16, "
- "depth = (int) 16, "
- "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]")
+ "depth = (int) 16, " "rate = (int) 48000, " "channels = (int) 2")
);
@@ -115,8 +119,11 @@ gst_inter_audio_src_base_init (gpointer g_class)
gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&gst_inter_audio_src_src_template));
- gst_element_class_set_details_simple (element_class, "FIXME Long name",
- "Generic", "FIXME Description", "FIXME <fixme@example.com>");
+ gst_element_class_set_details_simple (element_class,
+ "Internal audio source",
+ "Source/Audio",
+ "Virtual audio source for internal process communication",
+ "David Schleef <ds@schleef.org>");
}
static void
@@ -159,11 +166,12 @@ gst_inter_audio_src_class_init (GstInterAudioSrcClass * klass)
base_src_class->prepare_seek_segment =
GST_DEBUG_FUNCPTR (gst_inter_audio_src_prepare_seek_segment);
+#if 0
g_object_class_install_property (gobject_class, PROP_CHANNEL,
g_param_spec_string ("channel", "Channel",
"Channel name to match inter src and sink elements",
"default", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
+#endif
}
static void
@@ -174,16 +182,20 @@ gst_inter_audio_src_init (GstInterAudioSrc * interaudiosrc,
gst_base_src_set_live (GST_BASE_SRC (interaudiosrc), TRUE);
gst_base_src_set_blocksize (GST_BASE_SRC (interaudiosrc), -1);
- interaudiosrc->surface = gst_inter_surface_get ("default");
+ interaudiosrc->channel = g_strdup ("default");
}
void
gst_inter_audio_src_set_property (GObject * object, guint property_id,
const GValue * value, GParamSpec * pspec)
{
- /* GstInterAudioSrc *interaudiosrc = GST_INTER_AUDIO_SRC (object); */
+ GstInterAudioSrc *interaudiosrc = GST_INTER_AUDIO_SRC (object);
switch (property_id) {
+ case PROP_CHANNEL:
+ g_free (interaudiosrc->channel);
+ interaudiosrc->channel = g_value_dup_string (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -194,9 +206,12 @@ void
gst_inter_audio_src_get_property (GObject * object, guint property_id,
GValue * value, GParamSpec * pspec)
{
- /* GstInterAudioSrc *interaudiosrc = GST_INTER_AUDIO_SRC (object); */
+ GstInterAudioSrc *interaudiosrc = GST_INTER_AUDIO_SRC (object);
switch (property_id) {
+ case PROP_CHANNEL:
+ g_value_set_string (value, interaudiosrc->channel);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -281,6 +296,8 @@ gst_inter_audio_src_start (GstBaseSrc * src)
GST_DEBUG_OBJECT (interaudiosrc, "start");
+ interaudiosrc->surface = gst_inter_surface_get (interaudiosrc->channel);
+
return TRUE;
}
@@ -291,6 +308,9 @@ gst_inter_audio_src_stop (GstBaseSrc * src)
GST_DEBUG_OBJECT (interaudiosrc, "stop");
+ gst_inter_surface_unref (interaudiosrc->surface);
+ interaudiosrc->surface = NULL;
+
return TRUE;
}
@@ -345,12 +365,20 @@ static gboolean
gst_inter_audio_src_event (GstBaseSrc * src, GstEvent * event)
{
GstInterAudioSrc *interaudiosrc = GST_INTER_AUDIO_SRC (src);
+ gboolean ret;
GST_DEBUG_OBJECT (interaudiosrc, "event");
- return TRUE;
+ switch (GST_EVENT_TYPE (event)) {
+ default:
+ ret = GST_BASE_SRC_CLASS (parent_class)->event (src, event);
+ }
+
+ return ret;
}
+#define SIZE 1600
+
static GstFlowReturn
gst_inter_audio_src_create (GstBaseSrc * src, guint64 offset, guint size,
GstBuffer ** buf)
@@ -365,31 +393,31 @@ gst_inter_audio_src_create (GstBaseSrc * src, guint64 offset, guint size,
g_mutex_lock (interaudiosrc->surface->mutex);
n = gst_adapter_available (interaudiosrc->surface->audio_adapter) / 4;
- if (n > 1600 * 2) {
- GST_DEBUG ("flushing %d samples", 800);
- gst_adapter_flush (interaudiosrc->surface->audio_adapter, 800 * 4);
- n -= 800;
+ if (n > SIZE * 2) {
+ GST_DEBUG ("flushing %d samples", SIZE / 2);
+ gst_adapter_flush (interaudiosrc->surface->audio_adapter, (SIZE / 2) * 4);
+ n -= (SIZE / 2);
}
- if (n > 1600)
- n = 1600;
+ if (n > SIZE)
+ n = SIZE;
if (n > 0) {
buffer = gst_adapter_take_buffer (interaudiosrc->surface->audio_adapter,
n * 4);
}
g_mutex_unlock (interaudiosrc->surface->mutex);
- if (n < 1600) {
- GstBuffer *newbuf = gst_buffer_new_and_alloc (1600 * 4);
+ if (n < SIZE) {
+ GstBuffer *newbuf = gst_buffer_new_and_alloc (SIZE * 4);
- GST_DEBUG ("creating %d samples of silence", 1600 - n);
- memset (GST_BUFFER_DATA (newbuf) + n * 4, 0, 1600 * 4 - n * 4);
+ GST_DEBUG ("creating %d samples of silence", SIZE - n);
+ memset (GST_BUFFER_DATA (newbuf) + n * 4, 0, SIZE * 4 - n * 4);
if (buffer) {
memcpy (GST_BUFFER_DATA (newbuf), GST_BUFFER_DATA (buffer), n * 4);
gst_buffer_unref (buffer);
}
buffer = newbuf;
}
- n = 1600;
+ n = SIZE;
GST_BUFFER_OFFSET (buffer) = interaudiosrc->n_samples;
GST_BUFFER_OFFSET_END (buffer) = interaudiosrc->n_samples + n;
@@ -429,10 +457,34 @@ static gboolean
gst_inter_audio_src_query (GstBaseSrc * src, GstQuery * query)
{
GstInterAudioSrc *interaudiosrc = GST_INTER_AUDIO_SRC (src);
+ gboolean ret;
GST_DEBUG_OBJECT (interaudiosrc, "query");
- return TRUE;
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_LATENCY:{
+ GstClockTime min_latency, max_latency;
+
+ min_latency = 30 * gst_util_uint64_scale_int (GST_SECOND, SIZE, 48000);
+
+ max_latency = min_latency;
+
+ GST_ERROR_OBJECT (src,
+ "report latency min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency));
+
+ gst_query_set_latency (query,
+ gst_base_src_is_live (src), min_latency, max_latency);
+
+ ret = TRUE;
+ break;
+ }
+ default:
+ ret = GST_BASE_SRC_CLASS (parent_class)->query (src, query);
+ break;
+ }
+
+ return ret;
}
static gboolean
diff --git a/gst/inter/gstinteraudiosrc.h b/gst/inter/gstinteraudiosrc.h
index 958a1a53d..4ccc7f5c5 100644
--- a/gst/inter/gstinteraudiosrc.h
+++ b/gst/inter/gstinteraudiosrc.h
@@ -39,6 +39,7 @@ struct _GstInterAudioSrc
GstBaseSrc base_interaudiosrc;
GstInterSurface *surface;
+ char *channel;
guint64 n_samples;
int sample_rate;
diff --git a/gst/inter/gstintersubsink.c b/gst/inter/gstintersubsink.c
index 1328b18a5..a42b3e573 100644
--- a/gst/inter/gstintersubsink.c
+++ b/gst/inter/gstintersubsink.c
@@ -19,14 +19,19 @@
/**
* SECTION:element-gstintersubsink
*
- * The intersubsink element does FIXME stuff.
+ * The intersubsink element is a subtitle sink element. It is used
+ * in connection with a intersubsrc element in a different pipeline.
*
* <refsect2>
* <title>Example launch line</title>
* |[
- * gst-launch -v fakesrc ! intersubsink ! FIXME ! fakesink
+ * gst-launch -v ... ! intersubsink
* ]|
- * FIXME Describe what the pipeline does.
+ *
+ * The intersubsink element cannot be used effectively with gst-launch,
+ * as it requires a second pipeline in the application to send audio.
+ * See the gstintertest.c example in the gst-plugins-bad source code for
+ * more details.
* </refsect2>
*/
@@ -73,7 +78,8 @@ static gboolean gst_inter_sub_sink_unlock_stop (GstBaseSink * sink);
enum
{
- PROP_0
+ PROP_0,
+ PROP_CHANNEL
};
/* pad templates */
@@ -103,8 +109,11 @@ gst_inter_sub_sink_base_init (gpointer g_class)
gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&gst_inter_sub_sink_sink_template));
- gst_element_class_set_details_simple (element_class, "FIXME Long name",
- "Generic", "FIXME Description", "FIXME <fixme@example.com>");
+ gst_element_class_set_details_simple (element_class,
+ "Internal subtitle sink",
+ "Sink/Subtitle",
+ "Virtual subtitle sink for internal process communication",
+ "David Schleef <ds@schleef.org>");
}
static void
@@ -139,6 +148,11 @@ gst_inter_sub_sink_class_init (GstInterSubSinkClass * klass)
base_sink_class->unlock_stop =
GST_DEBUG_FUNCPTR (gst_inter_sub_sink_unlock_stop);
+ g_object_class_install_property (gobject_class, PROP_CHANNEL,
+ g_param_spec_string ("channel", "Channel",
+ "Channel name to match inter src and sink elements",
+ "default", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
}
static void
@@ -146,7 +160,7 @@ gst_inter_sub_sink_init (GstInterSubSink * intersubsink,
GstInterSubSinkClass * intersubsink_class)
{
- intersubsink->surface = gst_inter_surface_get ("default");
+ intersubsink->channel = g_strdup ("default");
intersubsink->fps_n = 1;
intersubsink->fps_d = 1;
@@ -156,9 +170,13 @@ void
gst_inter_sub_sink_set_property (GObject * object, guint property_id,
const GValue * value, GParamSpec * pspec)
{
- /* GstInterSubSink *intersubsink = GST_INTER_SUB_SINK (object); */
+ GstInterSubSink *intersubsink = GST_INTER_SUB_SINK (object);
switch (property_id) {
+ case PROP_CHANNEL:
+ g_free (intersubsink->channel);
+ intersubsink->channel = g_value_dup_string (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -169,9 +187,12 @@ void
gst_inter_sub_sink_get_property (GObject * object, guint property_id,
GValue * value, GParamSpec * pspec)
{
- /* GstInterSubSink *intersubsink = GST_INTER_SUB_SINK (object); */
+ GstInterSubSink *intersubsink = GST_INTER_SUB_SINK (object);
switch (property_id) {
+ case PROP_CHANNEL:
+ g_value_set_string (value, intersubsink->channel);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -247,6 +268,9 @@ gst_inter_sub_sink_get_times (GstBaseSink * sink, GstBuffer * buffer,
static gboolean
gst_inter_sub_sink_start (GstBaseSink * sink)
{
+ GstInterSubSink *intersubsink = GST_INTER_SUB_SINK (sink);
+
+ intersubsink->surface = gst_inter_surface_get (intersubsink->channel);
return TRUE;
}
@@ -263,6 +287,9 @@ gst_inter_sub_sink_stop (GstBaseSink * sink)
intersubsink->surface->sub_buffer = NULL;
g_mutex_unlock (intersubsink->surface->mutex);
+ gst_inter_surface_unref (intersubsink->surface);
+ intersubsink->surface = NULL;
+
return TRUE;
}
diff --git a/gst/inter/gstintersubsink.h b/gst/inter/gstintersubsink.h
index be2da9b3b..33b48f78f 100644
--- a/gst/inter/gstintersubsink.h
+++ b/gst/inter/gstintersubsink.h
@@ -40,6 +40,7 @@ struct _GstInterSubSink
GstPad *sinkpad;
GstInterSurface *surface;
+ char *channel;
int fps_n;
int fps_d;
diff --git a/gst/inter/gstintersubsrc.c b/gst/inter/gstintersubsrc.c
index 60a29b3d7..437a3e1ea 100644
--- a/gst/inter/gstintersubsrc.c
+++ b/gst/inter/gstintersubsrc.c
@@ -31,6 +31,8 @@
*
* The intersubsrc element cannot be used effectively with gst-launch,
* as it requires a second pipeline in the application to send subtitles.
+ * See the gstintertest.c example in the gst-plugins-bad source code for
+ * more details.
* </refsect2>
*/
@@ -82,7 +84,8 @@ gst_inter_sub_src_prepare_seek_segment (GstBaseSrc * src, GstEvent * seek,
enum
{
- PROP_0
+ PROP_0,
+ PROP_CHANNEL
};
/* pad templates */
@@ -113,9 +116,10 @@ gst_inter_sub_src_base_init (gpointer g_class)
gst_static_pad_template_get (&gst_inter_sub_src_src_template));
gst_element_class_set_details_simple (element_class,
- "Inter-pipeline subtitle source",
- "Source/Subtitle", "Inter-pipeline subtitle source",
- "David Schleef <ds@entropywave.com>");
+ "Internal subtitle source",
+ "Source/Subtitle",
+ "Virtual subtitle source for internal process communication",
+ "David Schleef <ds@schleef.org>");
}
static void
@@ -159,7 +163,10 @@ gst_inter_sub_src_class_init (GstInterSubSrcClass * klass)
base_src_class->prepare_seek_segment =
GST_DEBUG_FUNCPTR (gst_inter_sub_src_prepare_seek_segment);
-
+ g_object_class_install_property (gobject_class, PROP_CHANNEL,
+ g_param_spec_string ("channel", "Channel",
+ "Channel name to match inter src and sink elements",
+ "default", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}
static void
@@ -173,16 +180,20 @@ gst_inter_sub_src_init (GstInterSubSrc * intersubsrc,
gst_base_src_set_format (GST_BASE_SRC (intersubsrc), GST_FORMAT_TIME);
gst_base_src_set_live (GST_BASE_SRC (intersubsrc), TRUE);
- intersubsrc->surface = gst_inter_surface_get ("default");
+ intersubsrc->channel = g_strdup ("default");
}
void
gst_inter_sub_src_set_property (GObject * object, guint property_id,
const GValue * value, GParamSpec * pspec)
{
- /* GstInterSubSrc *intersubsrc = GST_INTER_SUB_SRC (object); */
+ GstInterSubSrc *intersubsrc = GST_INTER_SUB_SRC (object);
switch (property_id) {
+ case PROP_CHANNEL:
+ g_free (intersubsrc->channel);
+ intersubsrc->channel = g_value_dup_string (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -193,9 +204,12 @@ void
gst_inter_sub_src_get_property (GObject * object, guint property_id,
GValue * value, GParamSpec * pspec)
{
- /* GstInterSubSrc *intersubsrc = GST_INTER_SUB_SRC (object); */
+ GstInterSubSrc *intersubsrc = GST_INTER_SUB_SRC (object);
switch (property_id) {
+ case PROP_CHANNEL:
+ g_value_set_string (value, intersubsrc->channel);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -270,6 +284,8 @@ gst_inter_sub_src_start (GstBaseSrc * src)
GST_DEBUG_OBJECT (intersubsrc, "start");
+ intersubsrc->surface = gst_inter_surface_get (intersubsrc->channel);
+
return TRUE;
}
@@ -280,6 +296,9 @@ gst_inter_sub_src_stop (GstBaseSrc * src)
GST_DEBUG_OBJECT (intersubsrc, "stop");
+ gst_inter_surface_unref (intersubsrc->surface);
+ intersubsrc->surface = NULL;
+
return TRUE;
}
@@ -334,10 +353,16 @@ static gboolean
gst_inter_sub_src_event (GstBaseSrc * src, GstEvent * event)
{
GstInterSubSrc *intersubsrc = GST_INTER_SUB_SRC (src);
+ gboolean ret;
GST_DEBUG_OBJECT (intersubsrc, "event");
- return TRUE;
+ switch (GST_EVENT_TYPE (event)) {
+ default:
+ ret = GST_BASE_SRC_CLASS (parent_class)->event (src, event);
+ }
+
+ return ret;
}
static GstFlowReturn
@@ -409,10 +434,16 @@ static gboolean
gst_inter_sub_src_query (GstBaseSrc * src, GstQuery * query)
{
GstInterSubSrc *intersubsrc = GST_INTER_SUB_SRC (src);
+ gboolean ret;
GST_DEBUG_OBJECT (intersubsrc, "query");
- return TRUE;
+ switch (GST_QUERY_TYPE (query)) {
+ default:
+ ret = GST_BASE_SRC_CLASS (parent_class)->query (src, query);
+ }
+
+ return ret;
}
static gboolean
diff --git a/gst/inter/gstintersubsrc.h b/gst/inter/gstintersubsrc.h
index 74bfed1e7..38f7a6696 100644
--- a/gst/inter/gstintersubsrc.h
+++ b/gst/inter/gstintersubsrc.h
@@ -40,6 +40,7 @@ struct _GstInterSubSrc
GstPad *srcpad;
GstInterSurface *surface;
+ char *channel;
int rate;
int n_frames;
diff --git a/gst/inter/gstintertest.c b/gst/inter/gstintertest.c
index ff4c65f47..269d64279 100644
--- a/gst/inter/gstintertest.c
+++ b/gst/inter/gstintertest.c
@@ -1,5 +1,5 @@
/* GstInterTest
- * Copyright (C) 2011 FIXME <fixme@example.com>
+ * Copyright (C) 2011 David Schleef <ds@schleef.org>
* Copyright (C) 2010 Entropy Wave Inc
*
* Redistribution and use in source and binary forms, with or without
@@ -86,7 +86,7 @@ main (int argc, char *argv[])
g_thread_init (NULL);
#endif
- context = g_option_context_new ("- FIXME");
+ context = g_option_context_new ("- Internal src/sink test");
g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);
g_option_context_add_group (context, gst_init_get_option_group ());
if (!g_option_context_parse (context, &argc, &argv, &error)) {
@@ -188,14 +188,14 @@ gst_inter_test_create_pipeline_vts (GstInterTest * intertest)
pipe_desc = g_string_new ("");
- g_string_append (pipe_desc, "videotestsrc name=source num-buffers=10000 ! ");
+ g_string_append (pipe_desc, "videotestsrc name=source num-buffers=100 ! ");
g_string_append (pipe_desc,
"video/x-raw-yuv,format=(fourcc)I420,width=320,height=240 ! ");
g_string_append (pipe_desc, "timeoverlay ! ");
g_string_append (pipe_desc, "intervideosink name=sink sync=true ");
g_string_append (pipe_desc,
- "audiotestsrc samplesperbuffer=1600 num-buffers=100 ! ");
- g_string_append (pipe_desc, "interaudiosink ");
+ "audiotestsrc samplesperbuffer=1600 num-buffers=100 ! audioconvert ! ");
+ g_string_append (pipe_desc, "interaudiosink sync=true ");
if (verbose)
g_print ("pipeline: %s\n", pipe_desc->str);
@@ -232,7 +232,7 @@ gst_inter_test_create_pipeline_server (GstInterTest * intertest)
g_string_append (pipe_desc, "intervideosrc ! queue ! ");
g_string_append (pipe_desc, "xvimagesink name=sink ");
g_string_append (pipe_desc, "interaudiosrc ! queue ! ");
- g_string_append (pipe_desc, "alsasink latency-time=100000000 ");
+ g_string_append (pipe_desc, "alsasink ");
if (verbose)
g_print ("pipeline: %s\n", pipe_desc->str);
@@ -337,7 +337,7 @@ gst_inter_test_handle_paused_to_ready (GstInterTest * intertest)
static void
gst_inter_test_handle_ready_to_null (GstInterTest * intertest)
{
- g_main_loop_quit (intertest->main_loop);
+ //g_main_loop_quit (intertest->main_loop);
}
diff --git a/gst/inter/gstintervideosink.c b/gst/inter/gstintervideosink.c
index b6be4e99a..d80047e0d 100644
--- a/gst/inter/gstintervideosink.c
+++ b/gst/inter/gstintervideosink.c
@@ -19,14 +19,20 @@
/**
* SECTION:element-gstintervideosink
*
- * The intervideosink element does FIXME stuff.
+ * The intervideosink element is a video sink element. It is used
+ * in connection with an intervideosrc element in a different pipeline,
+ * similar to interaudiosink and interaudiosrc.
*
* <refsect2>
* <title>Example launch line</title>
* |[
- * gst-launch -v fakesrc ! intervideosink ! FIXME ! fakesink
+ * gst-launch -v videotestsrc ! intervideosink
* ]|
- * FIXME Describe what the pipeline does.
+ *
+ * The intervideosink element cannot be used effectively with gst-launch,
+ * as it requires a second pipeline in the application to send video to.
+ * See the gstintertest.c example in the gst-plugins-bad source code for
+ * more details.
* </refsect2>
*/
@@ -107,8 +113,11 @@ gst_inter_video_sink_base_init (gpointer g_class)
gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&gst_inter_video_sink_sink_template));
- gst_element_class_set_details_simple (element_class, "FIXME Long name",
- "Generic", "FIXME Description", "FIXME <fixme@example.com>");
+ gst_element_class_set_details_simple (element_class,
+ "Internal video sink",
+ "Sink/Video",
+ "Virtual video sink for internal process communication",
+ "David Schleef <ds@schleef.org>");
}
static void
@@ -155,8 +164,6 @@ static void
gst_inter_video_sink_init (GstInterVideoSink * intervideosink,
GstInterVideoSinkClass * intervideosink_class)
{
- intervideosink->surface = gst_inter_surface_get ("default");
-
intervideosink->channel = g_strdup ("default");
}
diff --git a/gst/inter/gstintervideosrc.c b/gst/inter/gstintervideosrc.c
index 65fc7f0e5..ec323e372 100644
--- a/gst/inter/gstintervideosrc.c
+++ b/gst/inter/gstintervideosrc.c
@@ -19,14 +19,18 @@
/**
* SECTION:element-gstintervideosrc
*
- * The intervideosrc element does FIXME stuff.
+ * The intervideosrc element is a video source element. It is used
+ * in connection with a intervideosink element in a different pipeline,
+ * similar to interaudiosink and interaudiosrc.
*
* <refsect2>
* <title>Example launch line</title>
* |[
- * gst-launch -v fakesrc ! intervideosrc ! FIXME ! fakesink
+ * gst-launch -v intervideosrc ! queue ! xvimagesink
* ]|
- * FIXME Describe what the pipeline does.
+ *
+ * The intersubsrc element cannot be used effectively with gst-launch,
+ * as it requires a second pipeline in the application to send subtitles.
* </refsect2>
*/
@@ -111,8 +115,11 @@ gst_inter_video_src_base_init (gpointer g_class)
gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&gst_inter_video_src_src_template));
- gst_element_class_set_details_simple (element_class, "FIXME Long name",
- "Generic", "FIXME Description", "FIXME <fixme@example.com>");
+ gst_element_class_set_details_simple (element_class,
+ "Internal video source",
+ "Source/Video",
+ "Virtual video source for internal process communication",
+ "David Schleef <ds@schleef.org>");
}
static void
@@ -361,10 +368,16 @@ static gboolean
gst_inter_video_src_event (GstBaseSrc * src, GstEvent * event)
{
GstInterVideoSrc *intervideosrc = GST_INTER_VIDEO_SRC (src);
+ gboolean ret;
GST_DEBUG_OBJECT (intervideosrc, "event");
- return TRUE;
+ switch (GST_EVENT_TYPE (event)) {
+ default:
+ ret = GST_BASE_SRC_CLASS (parent_class)->event (src, event);
+ }
+
+ return ret;
}
static GstFlowReturn
@@ -450,10 +463,16 @@ static gboolean
gst_inter_video_src_query (GstBaseSrc * src, GstQuery * query)
{
GstInterVideoSrc *intervideosrc = GST_INTER_VIDEO_SRC (src);
+ gboolean ret;
GST_DEBUG_OBJECT (intervideosrc, "query");
- return TRUE;
+ switch (GST_QUERY_TYPE (query)) {
+ default:
+ ret = GST_BASE_SRC_CLASS (parent_class)->query (src, query);
+ }
+
+ return ret;
}
static gboolean
diff --git a/gst/jp2kdecimator/jp2kcodestream.c b/gst/jp2kdecimator/jp2kcodestream.c
index cbff65414..9c85a0bd7 100644
--- a/gst/jp2kdecimator/jp2kcodestream.c
+++ b/gst/jp2kdecimator/jp2kcodestream.c
@@ -574,8 +574,8 @@ parse_cod (GstJP2kDecimator * self, GstByteReader * reader,
}
Scod = gst_byte_reader_get_uint8_unchecked (reader);
- cod->sop = !!(Scod & 0x02);
- cod->eph = !!(Scod & 0x04);
+ cod->sop = ! !(Scod & 0x02);
+ cod->eph = ! !(Scod & 0x04);
/* SGcod */
cod->progression_order = gst_byte_reader_get_uint8_unchecked (reader);
@@ -828,7 +828,11 @@ write_plt (GstJP2kDecimator * self, GstByteWriter * writer,
plt_end_pos = gst_byte_writer_get_pos (writer);
gst_byte_writer_set_pos (writer, plt_start_pos);
- gst_byte_writer_put_uint16_be (writer, plt_end_pos - plt_start_pos);
+ if (!gst_byte_writer_put_uint16_be (writer, plt_end_pos - plt_start_pos)) {
+ GST_ERROR_OBJECT (self, "Not enough space to write plt size");
+ return GST_FLOW_ERROR;
+ }
+
gst_byte_writer_set_pos (writer, plt_end_pos);
return GST_FLOW_OK;
@@ -1328,9 +1332,9 @@ write_packet (GstJP2kDecimator * self, GstByteWriter * writer,
}
if (packet->sop) {
- gst_byte_writer_put_uint16_be (writer, MARKER_SOP);
- gst_byte_writer_put_uint16_be (writer, 4);
- gst_byte_writer_put_uint16_be (writer, packet->seqno);
+ gst_byte_writer_put_uint16_be_unchecked (writer, MARKER_SOP);
+ gst_byte_writer_put_uint16_be_unchecked (writer, 4);
+ gst_byte_writer_put_uint16_be_unchecked (writer, packet->seqno);
}
if (packet->data) {
@@ -1696,7 +1700,7 @@ write_main_header (GstJP2kDecimator * self, GstByteWriter * writer,
return GST_FLOW_ERROR;
}
- gst_byte_writer_put_uint16_be (writer, MARKER_SOC);
+ gst_byte_writer_put_uint16_be_unchecked (writer, MARKER_SOC);
ret = write_siz (self, writer, &header->siz);
if (ret != GST_FLOW_OK)
diff --git a/gst/mpegdemux/flutspmtinfo.c b/gst/mpegdemux/flutspmtinfo.c
index 65402e738..5b25e258c 100644
--- a/gst/mpegdemux/flutspmtinfo.c
+++ b/gst/mpegdemux/flutspmtinfo.c
@@ -45,6 +45,10 @@
#include "config.h"
#endif
+/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex
+ * with newer GLib versions (>= 2.31.0) */
+#define GLIB_DISABLE_DEPRECATION_WARNINGS
+
#include <gst/gst.h>
#include "flutspmtinfo.h"
diff --git a/gst/mpegdemux/flutspmtstreaminfo.c b/gst/mpegdemux/flutspmtstreaminfo.c
index 7ab5ba43c..95177f82f 100644
--- a/gst/mpegdemux/flutspmtstreaminfo.c
+++ b/gst/mpegdemux/flutspmtstreaminfo.c
@@ -45,6 +45,10 @@
#include "config.h"
#endif
+/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex
+ * with newer GLib versions (>= 2.31.0) */
+#define GLIB_DISABLE_DEPRECATION_WARNINGS
+
#include <gst/gst.h>
#include "flutspmtstreaminfo.h"
diff --git a/gst/mpegdemux/gstmpegdemux.c b/gst/mpegdemux/gstmpegdemux.c
index 1b67ce0d0..e87642d67 100644
--- a/gst/mpegdemux/gstmpegdemux.c
+++ b/gst/mpegdemux/gstmpegdemux.c
@@ -662,7 +662,7 @@ gst_flups_demux_handle_dvd_event (GstFluPSDemux * demux, GstEvent * event)
/* Store the language codes event on the element, then iterate over the
* streams it specifies and retrieve them. The stream creation code then
* creates the pad appropriately and sends tag events as needed */
- p_ev = &demux->lang_codes, event;
+ p_ev = &demux->lang_codes;
gst_event_replace (p_ev, event);
GST_DEBUG_OBJECT (demux, "Handling language codes event");
diff --git a/gst/mpegdemux/gstmpegtsdemux.c b/gst/mpegdemux/gstmpegtsdemux.c
index 012c1cc71..78bf6568d 100644
--- a/gst/mpegdemux/gstmpegtsdemux.c
+++ b/gst/mpegdemux/gstmpegtsdemux.c
@@ -45,6 +45,10 @@
#include "config.h"
#endif
+/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex
+ * with newer GLib versions (>= 2.31.0) */
+#define GLIB_DISABLE_DEPRECATION_WARNINGS
+
#include <string.h>
#include <stdlib.h>
@@ -3547,7 +3551,7 @@ gboolean
gst_mpegts_demux_plugin_init (GstPlugin * plugin)
{
if (!gst_element_register (plugin, "mpegtsdemux",
- GST_RANK_PRIMARY, GST_TYPE_MPEGTS_DEMUX))
+ GST_RANK_SECONDARY, GST_TYPE_MPEGTS_DEMUX))
return FALSE;
return TRUE;
diff --git a/gst/mpegdemux/mpegtspacketizer.c b/gst/mpegdemux/mpegtspacketizer.c
index ed1d0ac0e..089254d2f 100644
--- a/gst/mpegdemux/mpegtspacketizer.c
+++ b/gst/mpegdemux/mpegtspacketizer.c
@@ -22,6 +22,10 @@
* Boston, MA 02111-1307, USA.
*/
+/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex
+ * with newer GLib versions (>= 2.31.0) */
+#define GLIB_DISABLE_DEPRECATION_WARNINGS
+
#include <string.h>
#include "mpegtspacketizer.h"
diff --git a/gst/mpegdemux/mpegtsparse.c b/gst/mpegdemux/mpegtsparse.c
index bac482462..f7ba07b0f 100644
--- a/gst/mpegdemux/mpegtsparse.c
+++ b/gst/mpegdemux/mpegtsparse.c
@@ -1042,7 +1042,7 @@ mpegts_parse_apply_pmt (MpegTSParse * parse,
MpegTSParseProgram *program;
guint program_number;
guint pcr_pid;
- guint pid;
+ guint pid = 0;
guint stream_type;
GstStructure *stream;
gint i;
diff --git a/gst/mpegtsdemux/Makefile.am b/gst/mpegtsdemux/Makefile.am
index 10e3f39e0..fb68be463 100644
--- a/gst/mpegtsdemux/Makefile.am
+++ b/gst/mpegtsdemux/Makefile.am
@@ -9,7 +9,6 @@ libgstmpegtsdemux_la_SOURCES = \
mpegtsbase.c \
mpegtspacketizer.c \
mpegtsparse.c \
- payload_parsers.c \
tsdemux.c \
pesparse.c
@@ -28,7 +27,6 @@ noinst_HEADERS = \
mpegtsbase.h \
mpegtspacketizer.h \
mpegtsparse.h \
- payload_parsers.h \
tsdemux.h \
pesparse.h
diff --git a/gst/mpegtsdemux/TODO b/gst/mpegtsdemux/TODO
index 66e1d5f1f..d4d2563a7 100644
--- a/gst/mpegtsdemux/TODO
+++ b/gst/mpegtsdemux/TODO
@@ -1,35 +1,30 @@
tsdemux/tsparse TODO
--------------------
-* clock for live streams
- In order for playback to happen at the same rate as on the producer,
- we need to estimate the remote clock based on capture time and PCR
- values.
- For this estimation to be as accurate as possible, the capture time
- needs to happen on the sources.
- => Ensure live sources actually timestamp their buffers
- Once we have accurate timestamps, we can use an algorithm to
- calculate the PCR/local-clock skew.
- => Use the EPTLA algorithm as used in -good/rtp/rtpmanager/
- gstrtpjitterbuffer
-
-* Seeking
- => Split out in a separate file/object. It is polluting tsdemux for
- code readability/clarity.
-
-* Perfomance : Creation/Destruction of buffers is slow
- * => This is due to g_type_instance_create using a dogslow rwlock
- which take up to 50% of gst_adapter_take_buffer()
- => Bugzilla #585375 (performance and contention problems)
-
-* mpegtspacketizer
- * offset/timestamp of incoming buffers need to be carried on to the
- sub-buffers in order for several demuxer features to work correctly.
+* Perfomance
+ * Bufferlist : Creating/Destroying very small buffers is too
+ costly. Switch to pre-/re-allocating outgoing buffers in which we
+ copy the data.
+ * Adapter : Use gst_adapter_peek()/_flush() instead of constantly
+ creating buffers.
+
+* Latency
+ * Calculate the actual latency instead of returning a fixed
+ value. The latency (for live streams) is the difference between the
+ currently inputted buffer timestamp (can be stored in the
+ packetizer) and the buffer we're pushing out.
+ This value should be reported/updated (leave a bit of extra margin
+ in addition to the calculated value).
* mpegtsparser
- * SERIOUS room for improvement performance-wise (see callgrind)
-
+ * SERIOUS room for improvement performance-wise (see callgrind),
+ mostly related to performance issues mentionned above.
+* Random-access seeking
+ * Do minimal parsing of video headers to detect keyframes and use
+ that to compute the keyframe intervals. Use that interval to offset
+ the seek position in order to maximize the chance of pushing out the
+ requested frames.
Synchronization, Scheduling and Timestamping
@@ -50,6 +45,9 @@ pay extra attention to the outgoing NEWSEGMENT event and buffer
timestamps in order to guarantee proper playback and synchronization
of the stream.
+ In the following, 'timestamps' correspond to GStreamer
+ buffer/segment values. The mpeg-ts PCR/DTS/PTS values are indicated
+ with their actual name.
1) Live push-based scheduling
@@ -60,26 +58,25 @@ of the stream.
the outgoing buffer timestamps need to correspond to the incoming
buffer timestamp values.
- => A delta, DTS_delta between incoming buffer timestamp and
- DTS/PTS needs to be computed.
+ => mpegtspacketizer keeps track of PCR and input timestamp and
+ extrapolates a clock skew using the EPTLA algorithm.
=> The outgoing buffers will be timestamped with their PTS values
- (overflow corrected) offseted by that initial DTS_delta.
+ (overflow corrected) corrected by that calculated clock skew.
A latency is introduced between the time the buffer containing the
first bit of a Access Unit is received in the demuxer and the moment
the demuxer pushed out the buffer corresponding to that Access Unit.
- => That latency needs to be reported. It corresponds to the
- biggest Access Unit spacing, in this case 1/video-framerate.
+ => That latency needs to be reported.
According to the ISO/IEC 13818-1:2007 specifications, D.0.1 Timing
mode, the "coded audio and video that represent sound and pictures
that are to be presented simultaneously may be separated in time
within the coded bit stream by ==>as much as one second<=="
- => The demuxer will therefore report an added latency of 1s to
- handle this interleave.
+ => The algorithm to calculate the latency should take that into
+ account.
2) Non-live push-based scheduling
@@ -97,11 +94,22 @@ of the stream.
do not have capture timestamps, we need to ensure the first buffer
we push out corresponds to the base segment start runing time.
- => A delta between the first DTS to output and the segment start
- position needs to be computed.
+ => The packetizer keeps track of PCR locations and offsets in
+ addition to the clock skew (in the case of upstream buffers
+ being timestamped, which is the case for HLS).
+
+ => The demuxer indicates to the packetizer when he sees the
+ 'beginning' of the program (i.e. the first valid PAT/PMT
+ combination). The packetizer will then use that location as
+ "timestamp 0", or "reference position/PCR".
+
+ => The lowest DTS is passed to the packetizer to be converted to
+ timestamp. That value is computed in the same way as live
+ streams if upstream buffers have timestamps, or will be
+ subtracted from the reference PCR.
=> The outgoing buffers will be timestamped with their PTS values
- (overflow corrected) offseted by that initial delta.
+ (overflow corrected) adjusted by the packetizer.
Latency is reported just as with the live use-case.
@@ -111,37 +119,13 @@ of the stream.
We do not get a NEWSEGMENT event from upstream, we therefore need to
compute the outgoing values.
- The base stream/running time corresponds to the DTS of the first
- buffer we will output. The DTS_delta becomes that earliest DTS.
-
- => FILLME
-
- X) General notes
-
- It is assumed that PTS/DTS rollovers are detected and corrected such
- as the outgoing timestamps never rollover. This can be easily
- handled by correcting the DTS_delta when such rollovers are
- detected. The maximum value of a GstClockTimeDiff is almost 3
- centuries, we therefore have enough margin to handle a decent number
- of rollovers.
-
- The generic equation for calculating outgoing buffer timestamps
- therefore becomes:
-
- D = DTS_delta, with rollover corrections
- PTS = PTS of the buffer we are going to push out
- TS = Timestamp of the outgoing buffer
-
- ==> TS = PTS + D
+ => The outgoing values for the newsegment are calculated like for
+ the non-live push-based mode when upstream doesn't provide
+ timestamp'ed buffers.
- If seeking is handled upstream for push-based cases, whether live or
- not, no extra modification is required.
+ => The outgoing buffer timestamps are timestamped with their PTS
+ values (overflow corrected) adjusted by the packetizer.
- If seeking is handled by the demuxer in the non-live push-based
- cases (converting from TIME to BYTES), the demuxer will need to
- set the segment start/time values to the requested seek position.
- The DTS_delta will also have to be recomputed to take into account
- the seek position.
[0] When talking about live sources, we mean this in the GStreamer
diff --git a/gst/mpegtsdemux/gstmpegdefs.h b/gst/mpegtsdemux/gstmpegdefs.h
index 66f922b71..62d98c75b 100644
--- a/gst/mpegtsdemux/gstmpegdefs.h
+++ b/gst/mpegtsdemux/gstmpegdefs.h
@@ -206,6 +206,8 @@
GST_MSECOND/10, CLOCK_BASE))
#define GSTTIME_TO_MPEGTIME(time) (gst_util_uint64_scale ((time), \
CLOCK_BASE, GST_MSECOND/10))
+#define GSTTIME_TO_PCRTIME(time) (gst_util_uint64_scale ((time), \
+ 300 * CLOCK_BASE, GST_MSECOND/10))
#define MPEG_MUX_RATE_MULT 50
diff --git a/gst/mpegtsdemux/gstmpegdesc.h b/gst/mpegtsdemux/gstmpegdesc.h
index 06aa17b95..c4ae91c0a 100644
--- a/gst/mpegtsdemux/gstmpegdesc.h
+++ b/gst/mpegtsdemux/gstmpegdesc.h
@@ -29,6 +29,7 @@
#define __GST_MPEG_DESC_H__
#include <glib.h>
+
/*
* descriptor_tag TS PS Identification
* 0 n/a n/a Reserved
@@ -53,93 +54,94 @@
* 19-63 n/a n/a ITU-T Rec. H.222.0 | ISO/IEC 13818-1 Reserved
* 64-255 n/a n/a User Private
*/
-#define DESC_VIDEO_STREAM 2
-#define DESC_AUDIO_STREAM 3
-#define DESC_HIERARCHY 4
-#define DESC_REGISTRATION 5
-#define DESC_DATA_STREAM_ALIGNMENT 6
-#define DESC_TARGET_BACKGROUND_GRID 7
-#define DESC_VIDEO_WINDOW 8
-#define DESC_CA 9
-#define DESC_ISO_639_LANGUAGE 10
-#define DESC_SYSTEM_CLOCK 11
-#define DESC_MULTIPLEX_BUFFER_UTILISATION 12
-#define DESC_COPYRIGHT 13
-#define DESC_MAXIMUM_BITRATE 14
-#define DESC_PRIVATE_DATA_INDICATOR 15
-#define DESC_SMOOTHING_BUFFER 16
-#define DESC_STD 17
-#define DESC_IBP 18
-
-#define DESC_DIRAC_TC_PRIVATE 0xAC
+#define DESC_VIDEO_STREAM 0x02
+#define DESC_AUDIO_STREAM 0x03
+#define DESC_HIERARCHY 0x04
+#define DESC_REGISTRATION 0x05
+#define DESC_DATA_STREAM_ALIGNMENT 0x06
+#define DESC_TARGET_BACKGROUND_GRID 0x07
+#define DESC_VIDEO_WINDOW 0x08
+#define DESC_CA 0x09
+#define DESC_ISO_639_LANGUAGE 0x0A
+#define DESC_SYSTEM_CLOCK 0x0B
+#define DESC_MULTIPLEX_BUFFER_UTILISATION 0x0C
+#define DESC_COPYRIGHT 0x0D
+#define DESC_MAXIMUM_BITRATE 0x0E
+#define DESC_PRIVATE_DATA_INDICATOR 0x0F
+#define DESC_SMOOTHING_BUFFER 0x10
+#define DESC_STD 0x11
+#define DESC_IBP 0x12
+
+#define DESC_DIRAC_TC_PRIVATE 0xAC
/* DVB tags */
-#define DESC_DVB_CAROUSEL_IDENTIFIER 0x13
-#define DESC_DVB_NETWORK_NAME 0x40
-#define DESC_DVB_SERVICE_LIST 0x41
-#define DESC_DVB_STUFFING 0x42
+#define DESC_DVB_CAROUSEL_IDENTIFIER 0x13
+#define DESC_DVB_NETWORK_NAME 0x40
+#define DESC_DVB_SERVICE_LIST 0x41
+#define DESC_DVB_STUFFING 0x42
#define DESC_DVB_SATELLITE_DELIVERY_SYSTEM 0x43
-#define DESC_DVB_CABLE_DELIVERY_SYSTEM 0x44
-#define DESC_DVB_VBI_DATA 0x45
-#define DESC_DVB_VBI_TELETEXT 0x46
-#define DESC_DVB_BOUQUET_NAME 0x47
-#define DESC_DVB_SERVICE 0x48
-#define DESC_DVB_COUNTRY_AVAILABILITY 0x49
-#define DESC_DVB_LINKAGE 0x4A
-#define DESC_DVB_NVOD_REFERENCE 0x4B
-#define DESC_DVB_TIME_SHIFTED_SERVICE 0x4C
-#define DESC_DVB_SHORT_EVENT 0x4D
-#define DESC_DVB_EXTENDED_EVENT 0x4E
-#define DESC_DVB_TIME_SHIFTED_EVENT 0x4F
-#define DESC_DVB_COMPONENT 0x50
-#define DESC_DVB_MOSAIC 0x51
-#define DESC_DVB_STREAM_IDENTIFIER 0x52
-#define DESC_DVB_CA_IDENTIFIER 0x53
-#define DESC_DVB_CONTENT 0x54
-#define DESC_DVB_PARENTAL_RATING 0x55
-#define DESC_DVB_TELETEXT 0x56
-#define DESC_DVB_TELEPHONE 0x57
-#define DESC_DVB_LOCAL_TIME_OFFSET 0x58
-#define DESC_DVB_SUBTITLING 0x59
+#define DESC_DVB_CABLE_DELIVERY_SYSTEM 0x44
+#define DESC_DVB_VBI_DATA 0x45
+#define DESC_DVB_VBI_TELETEXT 0x46
+#define DESC_DVB_BOUQUET_NAME 0x47
+#define DESC_DVB_SERVICE 0x48
+#define DESC_DVB_COUNTRY_AVAILABILITY 0x49
+#define DESC_DVB_LINKAGE 0x4A
+#define DESC_DVB_NVOD_REFERENCE 0x4B
+#define DESC_DVB_TIME_SHIFTED_SERVICE 0x4C
+#define DESC_DVB_SHORT_EVENT 0x4D
+#define DESC_DVB_EXTENDED_EVENT 0x4E
+#define DESC_DVB_TIME_SHIFTED_EVENT 0x4F
+#define DESC_DVB_COMPONENT 0x50
+#define DESC_DVB_MOSAIC 0x51
+#define DESC_DVB_STREAM_IDENTIFIER 0x52
+#define DESC_DVB_CA_IDENTIFIER 0x53
+#define DESC_DVB_CONTENT 0x54
+#define DESC_DVB_PARENTAL_RATING 0x55
+#define DESC_DVB_TELETEXT 0x56
+#define DESC_DVB_TELEPHONE 0x57
+#define DESC_DVB_LOCAL_TIME_OFFSET 0x58
+#define DESC_DVB_SUBTITLING 0x59
#define DESC_DVB_TERRESTRIAL_DELIVERY_SYSTEM 0x5A
#define DESC_DVB_MULTILINGUAL_NETWORK_NAME 0x5B
#define DESC_DVB_MULTILINGUAL_BOUQUET_NAME 0x5C
#define DESC_DVB_MULTILINGUAL_SERVICE_NAME 0x5D
-#define DESC_DVB_MULTILINGUAL_COMPONENT 0x5E
-#define DESC_DVB_PRIVATE_DATA 0x5F
-#define DESC_DVB_SERVICE_MOVE 0x60
-#define DESC_DVB_SHORT_SMOOTHING_BUFFER 0x61
-#define DESC_DVB_FREQUENCY_LIST 0x62
-#define DESC_DVB_PARTIAL_TRANSPORT_STREAM 0x63
-#define DESC_DVB_DATA_BROADCAST 0x64
-#define DESC_DVB_SCRAMBLING 0x65
-#define DESC_DVB_DATA_BROADCAST_ID 0x66
-#define DESC_DVB_TRANSPORT_STREAM 0x67
-#define DESC_DVB_DSNG 0x68
-#define DESC_DVB_PDC 0x69
-#define DESC_DVB_AC3 0x6A
-#define DESC_DVB_ANCILLARY_DATA 0x6B
-#define DESC_DVB_CELL_LIST 0x6C
-#define DESC_DVB_CELL_FREQUENCY_LINK 0x6D
-#define DESC_DVB_ANNOUNCEMENT_SUPPORT 0x6E
-#define DESC_DVB_APPLICATION_SIGNALLING 0x6F
-#define DESC_DVB_ADAPTATION_FIELD_DATA 0x70
-#define DESC_DVB_SERVICE_IDENTIFIER 0x71
-#define DESC_DVB_SERVICE_AVAILABILITY 0x72
-#define DESC_DVB_DEFAULT_AUTHORITY 0x73
-#define DESC_DVB_RELATED_CONTENT 0x74
-#define DESC_DVB_TVA_ID 0x75
-#define DESC_DVB_CONTENT_IDENTIFIER 0x76
-#define DESC_DVB_TIMESLICE_FEC_IDENTIFIER 0x77
-#define DESC_DVB_ECM_REPETITION_RATE 0x78
-#define DESC_DVB_S2_SATELLITE_DELIVERY_SYSTEM 0x79
-#define DESC_DVB_ENHANCED_AC3 0x7A
-#define DESC_DVB_DTS 0x7B
-#define DESC_DVB_AAC 0x7C
+#define DESC_DVB_MULTILINGUAL_COMPONENT 0x5E
+#define DESC_DVB_PRIVATE_DATA 0x5F
+#define DESC_DVB_SERVICE_MOVE 0x60
+#define DESC_DVB_SHORT_SMOOTHING_BUFFER 0x61
+#define DESC_DVB_FREQUENCY_LIST 0x62
+#define DESC_DVB_PARTIAL_TRANSPORT_STREAM 0x63
+#define DESC_DVB_DATA_BROADCAST 0x64
+#define DESC_DVB_SCRAMBLING 0x65
+#define DESC_DVB_DATA_BROADCAST_ID 0x66
+#define DESC_DVB_TRANSPORT_STREAM 0x67
+#define DESC_DVB_DSNG 0x68
+#define DESC_DVB_PDC 0x69
+#define DESC_DVB_AC3 0x6A
+#define DESC_DVB_ANCILLARY_DATA 0x6B
+#define DESC_DVB_CELL_LIST 0x6C
+#define DESC_DVB_CELL_FREQUENCY_LINK 0x6D
+#define DESC_DVB_ANNOUNCEMENT_SUPPORT 0x6E
+#define DESC_DVB_APPLICATION_SIGNALLING 0x6F
+#define DESC_DVB_ADAPTATION_FIELD_DATA 0x70
+#define DESC_DVB_SERVICE_IDENTIFIER 0x71
+#define DESC_DVB_SERVICE_AVAILABILITY 0x72
+#define DESC_DVB_DEFAULT_AUTHORITY 0x73
+#define DESC_DVB_RELATED_CONTENT 0x74
+#define DESC_DVB_TVA_ID 0x75
+#define DESC_DVB_CONTENT_IDENTIFIER 0x76
+#define DESC_DVB_TIMESLICE_FEC_IDENTIFIER 0x77
+#define DESC_DVB_ECM_REPETITION_RATE 0x78
+#define DESC_DVB_S2_SATELLITE_DELIVERY_SYSTEM 0x79
+#define DESC_DVB_ENHANCED_AC3 0x7A
+#define DESC_DVB_DTS 0x7B
+#define DESC_DVB_AAC 0x7C
/* 0x7D and 0x7E are reserved for future use */
-#define DESC_DVB_EXTENSION 0x7F
+#define DESC_DVB_EXTENSION 0x7F
/* 0x80 - 0xFE are user defined */
-#define DESC_DTG_LOGICAL_CHANNEL 0x83 /* from DTG D-Book */
+#define DESC_AC3_AUDIO_STREAM 0x81
+#define DESC_DTG_LOGICAL_CHANNEL 0x83 /* from DTG D-Book */
/* 0xFF is forbidden */
/* common for all descriptors */
@@ -196,7 +198,7 @@
#define DESC_ISO_639_LANGUAGE_language_code_nth(desc,i) (&(desc[2 + (4*i)]))
#define DESC_ISO_639_LANGUAGE_audio_type_nth(desc,i) ((desc)[5 + (4*i)])
-/* system_clock_descriptor */
+/* system_clock_descriptor */
#define DESC_SYSTEM_CLOCK_external_clock_reference_indicator(desc) (((desc)[2] & 0x80) == 0x80)
#define DESC_SYSTEM_CLOCK_clock_accuracy_integer(desc) ((desc)[2] & 0x3f)
#define DESC_SYSTEM_CLOCK_clock_accuracy_exponent(desc) (((desc)[3] & 0xe0) >> 5)
@@ -213,7 +215,7 @@
/* maximum_bitrate_descriptor */
#define DESC_MAXIMUM_BITRAT_maximum_bitrate(desc) (((((guint32)desc[2]) & 0x3f) << 16) | \
- GST_READ_UINT16_BE ((desc)+3))
+ GST_READ_UINT16_BE ((desc)+3))
/* private_data_indicator_descriptor */
#define DESC_PRIVATE_DATA_INDICATOR_indicator(desc) (GST_READ_UINT32_BE(&desc[2]))
@@ -268,7 +270,7 @@
#define DESC_DVB_EXTENDED_EVENT_last_descriptor_number(desc) (desc[2] & 0x0F)
#define DESC_DVB_EXTENDED_EVENT_iso639_language_code(desc) (desc + 3)
#define DESC_DVB_EXTENDED_EVENT_items_length(desc) (desc[6])
-#define DESC_DVB_EXTENDED_EVENT_items(desc) (desc + 7)
+#define DESC_DVB_EXTENDED_EVENT_items(desc) (desc + 7)
#define DESC_DVB_EXTENDED_EVENT_text_length(desc) (desc[7 + DESC_DVB_EXTENDED_EVENT_items_length(desc)])
#define DESC_DVB_EXTENDED_EVENT_text(desc) (desc + 7 + DESC_DVB_EXTENDED_EVENT_items_length(desc) + 1)
@@ -315,24 +317,31 @@
/* DVB Carousel Identifier Descriptor */
#define DESC_DVB_CAROUSEL_IDENTIFIER_carousel_id(desc) (GST_READ_UINT32_BE((desc) + 2))
+/* AC3_audio_stream_descriptor */
+#define DESC_AC_AUDIO_STREAM_bsid(desc) ((desc)[2] & 0x1f)
+
/* registration_descriptor format IDs */
#define DRF_ID_HDMV 0x48444d56
#define DRF_ID_VC1 0x56432D31 /* defined in RP227 */
-
-typedef struct {
- guint n_desc;
- guint8 data_length;
- guint8 *data;
+#define DRF_ID_DTS1 0x44545331
+#define DRF_ID_DTS2 0x44545332
+#define DRF_ID_DTS3 0x44545333
+
+typedef struct
+{
+ guint n_desc;
+ guint8 data_length;
+ guint8 *data;
} GstMPEGDescriptor;
void gst_mpegtsdesc_init_debug (void);
-GstMPEGDescriptor* gst_mpeg_descriptor_parse (guint8 *data, guint size);
-void gst_mpeg_descriptor_free (GstMPEGDescriptor *desc);
+GstMPEGDescriptor *gst_mpeg_descriptor_parse (guint8 * data, guint size);
+void gst_mpeg_descriptor_free (GstMPEGDescriptor * desc);
-guint gst_mpeg_descriptor_n_desc (GstMPEGDescriptor *desc);
-guint8* gst_mpeg_descriptor_find (GstMPEGDescriptor *desc, gint tag);
-GArray* gst_mpeg_descriptor_find_all (GstMPEGDescriptor * desc, gint tag);
+guint gst_mpeg_descriptor_n_desc (GstMPEGDescriptor * desc);
+guint8 *gst_mpeg_descriptor_find (GstMPEGDescriptor * desc, gint tag);
+GArray *gst_mpeg_descriptor_find_all (GstMPEGDescriptor * desc, gint tag);
-guint8* gst_mpeg_descriptor_nth (GstMPEGDescriptor *desc, guint i);
+guint8 *gst_mpeg_descriptor_nth (GstMPEGDescriptor * desc, guint i);
#endif /* __GST_MPEG_DESC_H__ */
diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c
index 2e4fcedb5..863c5ec19 100644
--- a/gst/mpegtsdemux/mpegtsbase.c
+++ b/gst/mpegtsdemux/mpegtsbase.c
@@ -217,9 +217,10 @@ mpegts_base_reset (MpegTSBase * base)
base->mode = BASE_MODE_STREAMING;
base->seen_pat = FALSE;
- base->first_pat_offset = -1;
- base->in_gap = 0;
- base->first_buf_ts = GST_CLOCK_TIME_NONE;
+ base->seek_offset = -1;
+
+ base->upstream_live = FALSE;
+ base->queried_latency = FALSE;
base->upstream_live = FALSE;
base->query_latency = FALSE;
@@ -574,6 +575,74 @@ mpegts_base_program_remove_stream (MpegTSBase * base,
program->streams[pid] = NULL;
}
+/* Return TRUE if programs are equal */
+static gboolean
+mpegts_base_is_same_program (MpegTSBase * base, MpegTSBaseProgram * oldprogram,
+ guint16 new_pmt_pid, GstStructure * new_pmt_info)
+{
+ guint i, nbstreams;
+ guint pcr_pid;
+ guint pid;
+ guint stream_type;
+ GstStructure *stream;
+ MpegTSBaseStream *oldstream;
+ gboolean sawpcrpid = FALSE;
+ const GValue *new_streams;
+ const GValue *value;
+
+ if (oldprogram->pmt_pid != new_pmt_pid) {
+ GST_DEBUG ("Different pmt_pid (new:0x%04x, old:0x%04x)", new_pmt_pid,
+ oldprogram->pmt_pid);
+ return FALSE;
+ }
+
+ gst_structure_id_get (new_pmt_info, QUARK_PCR_PID, G_TYPE_UINT, &pcr_pid,
+ NULL);
+ if (oldprogram->pcr_pid != pcr_pid) {
+ GST_DEBUG ("Different pcr_pid (new:0x%04x, old:0x%04x)",
+ pcr_pid, oldprogram->pcr_pid);
+ return FALSE;
+ }
+
+ /* Check the streams */
+ new_streams = gst_structure_id_get_value (new_pmt_info, QUARK_STREAMS);
+ nbstreams = gst_value_list_get_size (new_streams);
+
+ for (i = 0; i < nbstreams; ++i) {
+ value = gst_value_list_get_value (new_streams, i);
+ stream = g_value_get_boxed (value);
+
+ gst_structure_id_get (stream, QUARK_PID, G_TYPE_UINT, &pid,
+ QUARK_STREAM_TYPE, G_TYPE_UINT, &stream_type, NULL);
+ oldstream = oldprogram->streams[pid];
+ if (!oldstream) {
+ GST_DEBUG ("New stream 0x%04x not present in old program", pid);
+ return FALSE;
+ }
+ if (oldstream->stream_type != stream_type) {
+ GST_DEBUG
+ ("New stream 0x%04x has a different stream type (new:%d, old:%d)",
+ pid, stream_type, oldstream->stream_type);
+ return FALSE;
+ }
+ if (pid == oldprogram->pcr_pid)
+ sawpcrpid = TRUE;
+ }
+
+ /* If the pcr is not shared with an existing stream, we'll have one extra stream */
+ if (!sawpcrpid)
+ nbstreams += 1;
+
+ if (nbstreams != g_list_length (oldprogram->stream_list)) {
+ GST_DEBUG ("Different number of streams (new:%d, old:%d)",
+ nbstreams, g_list_length (oldprogram->stream_list));
+ return FALSE;
+ }
+
+ GST_DEBUG ("Programs are equal");
+ return TRUE;
+}
+
static void
mpegts_base_deactivate_program (MpegTSBase * base, MpegTSBaseProgram * program)
{
@@ -624,7 +693,7 @@ mpegts_base_deactivate_program (MpegTSBase * base, MpegTSBaseProgram * program)
static void
mpegts_base_activate_program (MpegTSBase * base, MpegTSBaseProgram * program,
- guint16 pmt_pid, GstStructure * pmt_info)
+ guint16 pmt_pid, GstStructure * pmt_info, gboolean initial_program)
{
guint i, nbstreams;
guint pcr_pid;
@@ -669,8 +738,8 @@ mpegts_base_activate_program (MpegTSBase * base, MpegTSBaseProgram * program,
mpegts_base_program_add_stream (base, program, (guint16) pcr_pid, -1, NULL);
MPEGTS_BIT_SET (base->is_pes, pcr_pid);
-
program->active = TRUE;
+ program->initial_program = initial_program;
klass = GST_MPEGTS_BASE_GET_CLASS (base);
if (klass->program_started != NULL)
@@ -683,7 +752,7 @@ gboolean
mpegts_base_is_psi (MpegTSBase * base, MpegTSPacketizerPacket * packet)
{
gboolean retval = FALSE;
- guint8 table_id;
+ guint8 *data, table_id, pointer;
int i;
static const guint8 si_tables[] =
{ 0x00, 0x01, 0x02, 0x03, 0x40, 0x41, 0x42, 0x46, 0x4A,
@@ -702,6 +771,18 @@ mpegts_base_is_psi (MpegTSBase * base, MpegTSPacketizerPacket * packet)
if (!retval) {
if (packet->payload_unit_start_indicator) {
+ data = packet->data;
+ pointer = *data++;
+ data += pointer;
+ /* 'pointer' value may be invalid on malformed packet
+ * so we need to avoid out of range
+ */
+ if (!(data < packet->data_end)) {
+ GST_WARNING_OBJECT (base,
+ "Wrong offset when retrieving table id: 0x%x", pointer);
+ return FALSE;
+ }
+
table_id = *(packet->data);
i = 0;
while (si_tables[i] != TABLE_ID_UNSET) {
@@ -846,6 +927,7 @@ mpegts_base_apply_pmt (MpegTSBase * base,
{
MpegTSBaseProgram *program, *old_program;
guint program_number;
+ gboolean initial_program = TRUE;
/* FIXME : not so sure this is valid anymore */
if (G_UNLIKELY (base->seen_pat == FALSE)) {
@@ -870,6 +952,10 @@ mpegts_base_apply_pmt (MpegTSBase * base,
if (G_UNLIKELY (old_program == NULL))
goto no_program;
+ if (G_UNLIKELY (mpegts_base_is_same_program (base, old_program, pmt_pid,
+ pmt_info)))
+ goto same_program;
+
/* If the current program is active, this means we have a new program */
if (old_program->active) {
old_program = mpegts_base_steal_program (base, program_number);
@@ -880,11 +966,13 @@ mpegts_base_apply_pmt (MpegTSBase * base,
/* Desactivate the old program */
mpegts_base_deactivate_program (base, old_program);
mpegts_base_free_program (old_program);
+ initial_program = FALSE;
} else
program = old_program;
/* First activate program */
- mpegts_base_activate_program (base, program, pmt_pid, pmt_info);
+ mpegts_base_activate_program (base, program, pmt_pid, pmt_info,
+ initial_program);
/* if (program->pmt_info) */
/* gst_structure_free (program->pmt_info); */
@@ -901,6 +989,12 @@ no_program:
GST_ERROR ("Attempted to apply a PMT on a program that wasn't created");
return;
}
+
+same_program:
+ {
+ GST_DEBUG ("Not applying identical program");
+ return;
+ }
}
static void
@@ -959,8 +1053,6 @@ mpegts_base_handle_psi (MpegTSBase * base, MpegTSPacketizerSection * section)
{
gboolean res = TRUE;
GstStructure *structure = NULL;
- gint program_number;
- MpegTSBaseProgram *program = NULL;
/* table ids 0x70 - 0x73 do not have a crc */
if (G_LIKELY (section->table_id < 0x70 || section->table_id > 0x73)) {
@@ -983,9 +1075,10 @@ mpegts_base_handle_psi (MpegTSBase * base, MpegTSPacketizerSection * section)
mpegts_base_apply_pat (base, structure);
if (base->seen_pat == FALSE) {
base->seen_pat = TRUE;
- base->first_pat_offset = GST_BUFFER_OFFSET (section->buffer);
GST_DEBUG ("First PAT offset: %" G_GUINT64_FORMAT,
- base->first_pat_offset);
+ GST_BUFFER_OFFSET (section->buffer));
+ mpegts_packetizer_set_reference_offset (base->packetizer,
+ GST_BUFFER_OFFSET (section->buffer));
}
} else
@@ -994,22 +1087,10 @@ mpegts_base_handle_psi (MpegTSBase * base, MpegTSPacketizerSection * section)
break;
case 0x02:
structure = mpegts_packetizer_parse_pmt (base->packetizer, section);
- if (G_UNLIKELY (structure == NULL))
- return FALSE;
-
- gst_structure_id_get (structure, QUARK_PROGRAM_NUMBER, G_TYPE_UINT,
- &program_number, NULL);
- program = mpegts_base_get_program (base, program_number);
-
- /* We already have the same PMT for the current program in use, so we do
- * not need to reset it */
- if (program && program->active && program->pmt_pid == section->pid) {
- GST_DEBUG ("Already have the PMT %u for program %i, not applying again",
- program->pmt_pid, program_number);
- res = TRUE;
- } else {
+ if (G_LIKELY (structure))
mpegts_base_apply_pmt (base, section->pid, structure);
- }
+ else
+ res = FALSE;
break;
case 0x40:
@@ -1213,14 +1294,9 @@ mpegts_base_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_SEGMENT:
- {
gst_event_copy_segment (event, &base->segment);
gst_event_unref (event);
-
- base->in_gap = GST_CLOCK_TIME_NONE;
- base->first_buf_ts = GST_CLOCK_TIME_NONE;
- }
break;
case GST_EVENT_EOS:
res = gst_mpegts_base_handle_eos (base);
@@ -1239,7 +1315,6 @@ mpegts_base_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
case GST_EVENT_FLUSH_STOP:
gst_segment_init (&base->segment, GST_FORMAT_UNDEFINED);
base->seen_pat = FALSE;
- base->first_pat_offset = -1;
/* Passthrough */
default:
res = GST_MPEGTS_BASE_GET_CLASS (base)->push_event (base, event);
@@ -1263,7 +1338,7 @@ query_upstream_latency (MpegTSBase * base)
} else
GST_WARNING_OBJECT (base, "Failed to query upstream latency");
gst_query_unref (query);
- base->query_latency = TRUE;
+ base->queried_latency = TRUE;
}
static inline GstFlowReturn
@@ -1294,17 +1369,10 @@ mpegts_base_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
base = GST_MPEGTS_BASE (parent);
packetizer = base->packetizer;
- if (G_UNLIKELY (base->query_latency == FALSE)) {
+ if (G_UNLIKELY (base->queried_latency == FALSE)) {
query_upstream_latency (base);
}
- if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (base->first_buf_ts)) &&
- GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
- base->first_buf_ts = GST_BUFFER_TIMESTAMP (buf);
- GST_DEBUG_OBJECT (base, "first buffer timestamp %" GST_TIME_FORMAT,
- GST_TIME_ARGS (base->first_buf_ts));
- }
-
mpegts_packetizer_push (base->packetizer, buf);
while (res == GST_FLOW_OK) {
@@ -1364,18 +1432,20 @@ mpegts_base_scan (MpegTSBase * base)
GstFlowReturn ret;
GstBuffer *buf;
guint i;
- MpegTSBaseClass *klass = GST_MPEGTS_BASE_GET_CLASS (base);
+ gboolean done = FALSE;
+ MpegTSPacketizerPacketReturn pret;
+ gint64 tmpval;
+ guint64 upstream_size, seek_pos;
+ GstFormat format;
+ guint initial_pcr_seen;
GST_DEBUG ("Scanning for initial sync point");
- /* Find initial sync point */
- for (i = 0; i < 10; i++) {
- GST_DEBUG ("Grabbing %d => %d", i * 50 * MPEGTS_MAX_PACKETSIZE,
- 50 * MPEGTS_MAX_PACKETSIZE);
+ /* Find initial sync point and at least 5 PCR values */
+ for (i = 0; i < 10 && !done; i++) {
+ GST_DEBUG ("Grabbing %d => %d", i * 65536, 65536);
- buf = NULL;
- ret = gst_pad_pull_range (base->sinkpad, i * 50 * MPEGTS_MAX_PACKETSIZE,
- 50 * MPEGTS_MAX_PACKETSIZE, &buf);
+ ret = gst_pad_pull_range (base->sinkpad, i * 65536, 65536, &buf);
if (G_UNLIKELY (ret != GST_FLOW_OK))
goto beach;
@@ -1383,34 +1453,81 @@ mpegts_base_scan (MpegTSBase * base)
mpegts_packetizer_push (base->packetizer, buf);
if (mpegts_packetizer_has_packets (base->packetizer)) {
- /* Mark the initial sync point and remember the packetsize */
- base->initial_sync_point = base->seek_offset = base->packetizer->offset;
- GST_DEBUG ("Sync point is now %" G_GUINT64_FORMAT, base->seek_offset);
- base->packetsize = base->packetizer->packet_size;
+ if (base->seek_offset == -1) {
+ /* Mark the initial sync point and remember the packetsize */
+ base->seek_offset = base->packetizer->offset;
+ GST_DEBUG ("Sync point is now %" G_GUINT64_FORMAT, base->seek_offset);
+ base->packetsize = base->packetizer->packet_size;
+ }
+ while (1) {
+ /* Eat up all packets */
+ pret = mpegts_packetizer_process_next_packet (base->packetizer);
+ if (pret == PACKET_NEED_MORE)
+ break;
+ if (pret != PACKET_BAD &&
+ mpegts_packetizer_get_seen_pcr (base->packetizer) >= 5) {
+ GST_DEBUG ("Got enough initial PCR");
+ done = TRUE;
+ break;
+ }
+ }
+ }
+ }
- /* If the subclass can seek for timestamps, do that */
- if (klass->find_timestamps) {
- guint64 offset;
- mpegts_packetizer_clear (base->packetizer);
+ initial_pcr_seen = mpegts_packetizer_get_seen_pcr (base->packetizer);
+ if (G_UNLIKELY (initial_pcr_seen == 0))
+ goto no_initial_pcr;
+ GST_DEBUG ("Seen %d initial PCR", initial_pcr_seen);
- ret = klass->find_timestamps (base, 0, &offset);
+ /* Now send data from the end */
+ mpegts_packetizer_clear (base->packetizer);
- base->initial_sync_point = base->seek_offset =
- base->packetizer->offset = base->first_pat_offset;
- GST_DEBUG ("Sync point is now %" G_GUINT64_FORMAT, base->seek_offset);
- }
+ /* Get the size of upstream */
+ format = GST_FORMAT_BYTES;
+ if (!gst_pad_query_peer_duration (base->sinkpad, &format, &tmpval))
+ goto beach;
+ upstream_size = tmpval;
+ done = FALSE;
+
+ /* Find last PCR value */
+ for (seek_pos = MAX (0, upstream_size - 655360);
+ seek_pos < upstream_size && !done; seek_pos += 65536) {
+ GST_DEBUG ("Grabbing %" G_GUINT64_FORMAT " => %d", seek_pos, 65536);
+
+ ret = gst_pad_pull_range (base->sinkpad, seek_pos, 65536, &buf);
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
goto beach;
+
+ /* Push to packetizer */
+ mpegts_packetizer_push (base->packetizer, buf);
+
+ if (mpegts_packetizer_has_packets (base->packetizer)) {
+ while (1) {
+ /* Eat up all packets */
+ pret = mpegts_packetizer_process_next_packet (base->packetizer);
+ if (pret == PACKET_NEED_MORE)
+ break;
+ if (pret != PACKET_BAD &&
+ mpegts_packetizer_get_seen_pcr (base->packetizer) >
+ initial_pcr_seen) {
+ GST_DEBUG ("Got last PCR");
+ done = TRUE;
+ break;
+ }
+ }
}
}
- GST_WARNING ("Didn't find initial sync point");
- ret = GST_FLOW_ERROR;
-
beach:
GST_DEBUG ("Returning %s", gst_flow_get_name (ret));
mpegts_packetizer_clear (base->packetizer);
return ret;
+no_initial_pcr:
+ 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;
}
@@ -1429,7 +1546,7 @@ mpegts_base_loop (MpegTSBase * base)
GST_DEBUG ("Changing to Streaming");
break;
case BASE_MODE_SEEKING:
- /* FIXME : yes, we should do something here */
+ /* FIXME : unclear if we still need mode_seeking... */
base->mode = BASE_MODE_STREAMING;
break;
case BASE_MODE_STREAMING:
@@ -1460,9 +1577,16 @@ error:
const gchar *reason = gst_flow_get_name (ret);
GST_DEBUG_OBJECT (base, "Pausing task, reason %s", reason);
- if (ret == GST_FLOW_EOS)
- GST_MPEGTS_BASE_GET_CLASS (base)->push_event (base, gst_event_new_eos ());
- else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_EOS) {
+ if (ret == GST_FLOW_EOS) {
+ /* Push EOS downstream */
+ if (!GST_MPEGTS_BASE_GET_CLASS (base)->push_event (base,
+ gst_event_new_eos ())) {
+ /* If that failed, emit an error so the pipeline can be stopped */
+ GST_ELEMENT_ERROR (base, STREAM, DEMUX, (NULL),
+ ("got eos but no streams (yet)"));
+
+ }
+ } 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));
@@ -1485,8 +1609,6 @@ mpegts_base_handle_seek_event (MpegTSBase * base, GstPad * pad,
GstSeekFlags flags;
GstSeekType start_type, stop_type;
gint64 start, stop;
- gchar *pad_name;
- guint16 pid = 0;
gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start,
&stop_type, &stop);
@@ -1505,20 +1627,11 @@ mpegts_base_handle_seek_event (MpegTSBase * base, GstPad * pad,
" stop: %" GST_TIME_FORMAT, rate, GST_TIME_ARGS (start),
GST_TIME_ARGS (stop));
- /* extract the pid from the pad name */
- pad_name = gst_pad_get_name (pad);
- if (pad_name) {
- gchar *pidstr = g_strrstr (pad_name, "_");
- if (pidstr) {
- pidstr++;
- pid = g_ascii_strtoull (pidstr, NULL, 16);
- }
- g_free (pad_name);
- }
-
flush = flags & GST_SEEK_FLAG_FLUSH;
if (base->mode == BASE_MODE_PUSHING) {
+ /* FIXME : Actually ... it is supported, we just need to convert
+ * the seek event to BYTES */
GST_ERROR ("seeking in push mode not supported");
goto push_mode;
}
@@ -1532,6 +1645,7 @@ mpegts_base_handle_seek_event (MpegTSBase * base, GstPad * pad,
gst_event_new_flush_start ());
} else
gst_pad_pause_task (base->sinkpad);
+
/* wait for streaming to finish */
GST_PAD_STREAM_LOCK (base->sinkpad);
@@ -1539,6 +1653,9 @@ mpegts_base_handle_seek_event (MpegTSBase * base, GstPad * pad,
/* send a FLUSH_STOP for the sinkpad, since we need data for seeking */
GST_DEBUG_OBJECT (base, "sending flush stop");
gst_pad_push_event (base->sinkpad, gst_event_new_flush_stop (TRUE));
+ /* And actually flush our pending data */
+ mpegts_base_flush (base);
+ mpegts_packetizer_flush (base->packetizer);
}
if (flags & (GST_SEEK_FLAG_SEGMENT | GST_SEEK_FLAG_SKIP)) {
@@ -1550,14 +1667,12 @@ mpegts_base_handle_seek_event (MpegTSBase * base, GstPad * pad,
if (format == GST_FORMAT_TIME) {
/* If the subclass can seek, do that */
if (klass->seek) {
- ret = klass->seek (base, event, pid);
+ ret = klass->seek (base, event);
if (G_UNLIKELY (ret != GST_FLOW_OK)) {
GST_WARNING ("seeking failed %s", gst_flow_get_name (ret));
- goto done;
}
} else {
GST_WARNING ("subclass has no seek implementation");
- goto done;
}
}
@@ -1616,11 +1731,13 @@ mpegts_base_sink_activate_mode (GstPad * pad, GstObject * parent,
switch (mode) {
case GST_PAD_MODE_PUSH:
base->mode = BASE_MODE_PUSHING;
+ base->packetizer->calculate_skew = TRUE;
res = TRUE;
break;
case GST_PAD_MODE_PULL:
if (active) {
base->mode = BASE_MODE_SCANNING;
+ base->packetizer->calculate_offset = TRUE;
res =
gst_pad_start_task (pad, (GstTaskFunction) mpegts_base_loop, base);
} else
diff --git a/gst/mpegtsdemux/mpegtsbase.h b/gst/mpegtsdemux/mpegtsbase.h
index 499ea6a31..8521b5786 100644
--- a/gst/mpegtsdemux/mpegtsbase.h
+++ b/gst/mpegtsdemux/mpegtsbase.h
@@ -48,6 +48,8 @@ G_BEGIN_DECLS
#define GST_MPEGTS_BASE_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_MPEGTS_BASE, MpegTSBaseClass))
+#define MPEG_TS_BASE_PACKETIZER(b) (((MpegTSBase*)b)->packetizer)
+
typedef struct _MpegTSBase MpegTSBase;
typedef struct _MpegTSBaseClass MpegTSBaseClass;
typedef struct _MpegTSBaseStream MpegTSBaseStream;
@@ -76,6 +78,8 @@ struct _MpegTSBaseProgram
/* TRUE if the program is currently being used */
gboolean active;
+ /* TRUE if this is the first program created */
+ gboolean initial_program;
};
typedef enum {
@@ -96,9 +100,6 @@ struct _MpegTSBase {
/* pull-based behaviour */
MpegTSBaseMode mode;
- /* location of first sync point */
- guint64 initial_sync_point;
-
/* Current pull offset (also set by seek handler) */
guint64 seek_offset;
@@ -130,12 +131,10 @@ struct _MpegTSBase {
/* Whether we saw a PAT yet */
gboolean seen_pat;
- /* Offset from the origin to the first PAT (pullmode) */
- guint64 first_pat_offset;
-
- /* interpolation gap between the upstream timestamp and the pts */
- GstClockTime in_gap;
- GstClockTime first_buf_ts;
+ /* Whether upstream is live or not */
+ gboolean upstream_live;
+ /* Whether we queried the upstream latency or not */
+ gboolean queried_latency;
/* Whether upstream is live or not */
gboolean upstream_live;
@@ -168,7 +167,7 @@ struct _MpegTSBaseClass {
GstFlowReturn (*find_timestamps) (MpegTSBase * base, guint64 initoff, guint64 *offset);
/* seek is called to wait for seeking */
- GstFlowReturn (*seek) (MpegTSBase * base, GstEvent * event, guint16 pid);
+ GstFlowReturn (*seek) (MpegTSBase * base, GstEvent * event);
/* flush all streams */
void (*flush) (MpegTSBase * base);
diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c
index f79bdfe4e..bf6e4afaf 100644
--- a/gst/mpegtsdemux/mpegtspacketizer.c
+++ b/gst/mpegtsdemux/mpegtspacketizer.c
@@ -28,6 +28,12 @@
* with newer GLib versions (>= 2.31.0) */
#define GLIB_DISABLE_DEPRECATION_WARNINGS
+/* Skew calculation pameters */
+#define MAX_TIME (2 * GST_SECOND)
+
+/* maximal PCR time */
+#define PCR_MAX_VALUE (((((guint64)1)<<33) * 300) + 298)
+#define PTS_DTS_MAX_VALUE (((guint64)1) << 33)
#include "mpegtspacketizer.h"
#include "gstmpegdesc.h"
@@ -67,10 +73,37 @@ static GQuark QUARK_SEGMENT_LAST_SECTION_NUMBER;
static GQuark QUARK_LAST_TABLE_ID;
static GQuark QUARK_EVENTS;
+
+#define MPEGTS_PACKETIZER_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_MPEGTS_PACKETIZER, MpegTSPacketizerPrivate))
+
static void _init_local (void);
G_DEFINE_TYPE_EXTENDED (MpegTSPacketizer2, mpegts_packetizer, G_TYPE_OBJECT, 0,
_init_local ());
+typedef struct
+{
+ guint64 offset; /* offset in upstream */
+ guint64 pcr; /* pcr (wraparound not fixed) */
+} MpegTSPacketizerOffset;
+
+struct _MpegTSPacketizerPrivate
+{
+ /* Used for bitrate calculation */
+ /* FIXME : Replace this later on with a balanced tree or sequence */
+ guint64 first_offset;
+ guint64 first_pcr;
+ GstClockTime first_pcr_ts;
+ guint64 last_offset;
+ guint64 last_pcr;
+ GstClockTime last_pcr_ts;
+
+ /* Reference offset */
+ guint64 refoffset;
+
+ guint nb_seen_offsets;
+};
+
static void mpegts_packetizer_dispose (GObject * object);
static void mpegts_packetizer_finalize (GObject * object);
static gchar *convert_to_utf8 (const gchar * text, gint length, guint start,
@@ -78,6 +111,11 @@ static gchar *convert_to_utf8 (const gchar * text, gint length, guint start,
static gchar *get_encoding (const gchar * text, guint * start_text,
gboolean * is_multibyte);
static gchar *get_encoding_and_convert (const gchar * text, guint length);
+static GstClockTime calculate_skew (MpegTSPacketizer2 * packetizer,
+ guint64 pcrtime, GstClockTime time);
+static void record_pcr (MpegTSPacketizer2 * packetizer, guint64 pcr,
+ guint64 offset);
+static void mpegts_packetizer_reset_skew (MpegTSPacketizer2 * packetizer);
#define CONTINUITY_UNSET 255
#define MAX_CONTINUITY 15
@@ -151,6 +189,8 @@ mpegts_packetizer_class_init (MpegTSPacketizer2Class * klass)
{
GObjectClass *gobject_class;
+ g_type_class_add_private (klass, sizeof (MpegTSPacketizerPrivate));
+
gobject_class = G_OBJECT_CLASS (klass);
gobject_class->dispose = mpegts_packetizer_dispose;
@@ -160,11 +200,24 @@ mpegts_packetizer_class_init (MpegTSPacketizer2Class * klass)
static void
mpegts_packetizer_init (MpegTSPacketizer2 * packetizer)
{
+ packetizer->priv = MPEGTS_PACKETIZER_GET_PRIVATE (packetizer);
packetizer->adapter = gst_adapter_new ();
packetizer->offset = 0;
packetizer->empty = TRUE;
packetizer->streams = g_new0 (MpegTSPacketizerStream *, 8192);
packetizer->know_packet_size = FALSE;
+ packetizer->calculate_skew = FALSE;
+ packetizer->calculate_offset = FALSE;
+ mpegts_packetizer_reset_skew (packetizer);
+
+ packetizer->priv->first_offset = -1;
+ packetizer->priv->first_pcr = -1;
+ packetizer->priv->first_pcr_ts = GST_CLOCK_TIME_NONE;
+ packetizer->priv->last_offset = -1;
+ packetizer->priv->last_pcr = -1;
+ packetizer->priv->last_pcr_ts = GST_CLOCK_TIME_NONE;
+ packetizer->priv->nb_seen_offsets = 0;
+ packetizer->priv->refoffset = -1;
}
static void
@@ -205,7 +258,7 @@ mpegts_packetizer_finalize (GObject * object)
G_OBJECT_CLASS (mpegts_packetizer_parent_class)->finalize (object);
}
-guint64
+static inline guint64
mpegts_packetizer_compute_pcr (const guint8 * data)
{
guint32 pcr1;
@@ -263,12 +316,23 @@ mpegts_packetizer_parse_adaptation_field_control (MpegTSPacketizer2 *
if (afcflags & MPEGTS_AFC_PCR_FLAG) {
packet->pcr = mpegts_packetizer_compute_pcr (data);
*data += 6;
+ GST_DEBUG ("pcr %" G_GUINT64_FORMAT " (%" GST_TIME_FORMAT ")",
+ packet->pcr, GST_TIME_ARGS (PCRTIME_TO_GSTTIME (packet->pcr)));
+
+ if (packetizer->calculate_skew)
+ GST_BUFFER_TIMESTAMP (packet->buffer) =
+ calculate_skew (packetizer, packet->pcr,
+ GST_BUFFER_TIMESTAMP (packet->buffer));
+ if (packetizer->calculate_offset)
+ record_pcr (packetizer, packet->pcr, packet->offset);
}
/* OPCR */
if (afcflags & MPEGTS_AFC_OPCR_FLAG) {
packet->opcr = mpegts_packetizer_compute_pcr (data);
- *data += 6;
+ /* *data += 6; */
+ GST_DEBUG ("opcr %" G_GUINT64_FORMAT " (%" GST_TIME_FORMAT ")",
+ packet->pcr, GST_TIME_ARGS (PCRTIME_TO_GSTTIME (packet->pcr)));
}
return TRUE;
@@ -2316,6 +2380,8 @@ mpegts_packetizer_next_packet (MpegTSPacketizer2 * packetizer,
packetizer->offset += packetizer->packet_size;
GST_MEMDUMP ("buffer", bufdata, 16);
GST_MEMDUMP ("data_start", packet->data_start, 16);
+ GST_BUFFER_TIMESTAMP (packet->buffer) =
+ gst_adapter_prev_timestamp (packetizer->adapter, NULL);
/* Check sync byte */
if (G_LIKELY (packet->data_start[0] == 0x47))
@@ -2360,6 +2426,14 @@ got_valid_packet:
return mpegts_packetizer_parse_packet (packetizer, packet);
}
+MpegTSPacketizerPacketReturn
+mpegts_packetizer_process_next_packet (MpegTSPacketizer2 * packetizer)
+{
+ MpegTSPacketizerPacket packet;
+
+ return mpegts_packetizer_next_packet (packetizer, &packet);
+}
+
void
mpegts_packetizer_clear_packet (MpegTSPacketizer2 * packetizer,
MpegTSPacketizerPacket * packet)
@@ -2400,6 +2474,12 @@ mpegts_packetizer_push_section (MpegTSPacketizer2 * packetizer,
if (packet->pid == 0x14) {
table_id = data[0];
section->section_length = GST_READ_UINT24_BE (data) & 0x000FFF;
+ if (data - packet->bufmap.data + section->section_length + 3 >
+ packet->bufmap.size) {
+ GST_WARNING ("PID %dd PSI section length extends past the end "
+ "of the buffer", packet->pid);
+ goto out;
+ }
section->buffer =
gst_buffer_copy_region (packet->buffer, GST_BUFFER_COPY_ALL,
data - packet->bufmap.data, section->section_length + 3);
@@ -2588,13 +2668,22 @@ get_encoding (const gchar * text, guint * start_text, gboolean * is_multibyte)
*start_text = 1;
*is_multibyte = TRUE;
} else if (firstbyte == 0x12) {
- /* That's korean encoding.
- * The spec says it's encoded in KSC 5601, but iconv only knows KSC 5636.
- * Couldn't find any information about either of them.
- */
- encoding = NULL;
+ /* EUC-KR implements KSX1001 */
+ encoding = g_strdup ("EUC-KR");
*start_text = 1;
*is_multibyte = TRUE;
+ } else if (firstbyte == 0x13) {
+ encoding = g_strdup ("GB2312");
+ *start_text = 1;
+ *is_multibyte = FALSE;
+ } else if (firstbyte == 0x14) {
+ encoding = g_strdup ("UTF-16BE");
+ *start_text = 1;
+ *is_multibyte = TRUE;
+ } else if (firstbyte == 0x15) {
+ encoding = g_strdup ("ISO-10646/UTF8");
+ *start_text = 1;
+ *is_multibyte = FALSE;
} else {
/* reserved */
encoding = NULL;
@@ -2646,7 +2735,7 @@ convert_to_utf8 (const gchar * text, gint length, guint start,
/* skip it */
break;
case 0xE08A:{
- guint8 nl[] = { 0x0A, 0x00 }; /* new line */
+ guint8 nl[] = { 0x00, 0x0A }; /* new line */
g_byte_array_append (sb, nl, 2);
break;
}
@@ -2667,7 +2756,7 @@ convert_to_utf8 (const gchar * text, gint length, guint start,
/* skip it */
break;
case 0xE08A:{
- guint8 nl[] = { 0x0A, 0x00 }; /* new line */
+ guint8 nl[] = { 0x00, 0x0A }; /* new line */
g_byte_array_append (sb, nl, 2);
break;
}
@@ -2795,3 +2884,434 @@ failed:
return g_strndup (text, length - start_text);
}
}
+
+/**
+ * mpegts_packetizer_reset_skew:
+ * @packetizer: an #MpegTSPacketizer2
+ *
+ * Reset the skew calculations in @packetizer.
+ */
+static void
+mpegts_packetizer_reset_skew (MpegTSPacketizer2 * packetizer)
+{
+ /* FIXME : These variables should be *per* PCR PID */
+ packetizer->base_time = GST_CLOCK_TIME_NONE;
+ packetizer->base_pcrtime = GST_CLOCK_TIME_NONE;
+ packetizer->last_pcrtime = GST_CLOCK_TIME_NONE;
+ packetizer->window_pos = 0;
+ packetizer->window_filling = TRUE;
+ packetizer->window_min = 0;
+ packetizer->skew = 0;
+ packetizer->prev_send_diff = GST_CLOCK_TIME_NONE;
+ packetizer->prev_out_time = GST_CLOCK_TIME_NONE;
+ GST_DEBUG ("reset skew correction");
+}
+
+static void
+mpegts_packetizer_resync (MpegTSPacketizer2 * packetizer, GstClockTime time,
+ GstClockTime gstpcrtime, gboolean reset_skew)
+{
+ /* FIXME : These variables should be *per* PCR PID */
+ packetizer->base_time = time;
+ packetizer->base_pcrtime = gstpcrtime;
+ packetizer->prev_out_time = GST_CLOCK_TIME_NONE;
+ packetizer->prev_send_diff = GST_CLOCK_TIME_NONE;
+ if (reset_skew) {
+ packetizer->window_filling = TRUE;
+ packetizer->window_pos = 0;
+ packetizer->window_min = 0;
+ packetizer->window_size = 0;
+ packetizer->skew = 0;
+ }
+}
+
+
+/* Code mostly copied from -good/gst/rtpmanager/rtpjitterbuffer.c */
+
+/* For the clock skew we use a windowed low point averaging algorithm as can be
+ * found in Fober, Orlarey and Letz, 2005, "Real Time Clock Skew Estimation
+ * over Network Delays":
+ * http://www.grame.fr/Ressources/pub/TR-050601.pdf
+ * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.102.1546
+ *
+ * The idea is that the jitter is composed of:
+ *
+ * J = N + n
+ *
+ * N : a constant network delay.
+ * n : random added noise. The noise is concentrated around 0
+ *
+ * In the receiver we can track the elapsed time at the sender with:
+ *
+ * send_diff(i) = (Tsi - Ts0);
+ *
+ * Tsi : The time at the sender at packet i
+ * Ts0 : The time at the sender at the first packet
+ *
+ * This is the difference between the RTP timestamp in the first received packet
+ * and the current packet.
+ *
+ * At the receiver we have to deal with the jitter introduced by the network.
+ *
+ * recv_diff(i) = (Tri - Tr0)
+ *
+ * Tri : The time at the receiver at packet i
+ * Tr0 : The time at the receiver at the first packet
+ *
+ * Both of these values contain a jitter Ji, a jitter for packet i, so we can
+ * write:
+ *
+ * recv_diff(i) = (Cri + D + ni) - (Cr0 + D + n0))
+ *
+ * Cri : The time of the clock at the receiver for packet i
+ * D + ni : The jitter when receiving packet i
+ *
+ * We see that the network delay is irrelevant here as we can elliminate D:
+ *
+ * recv_diff(i) = (Cri + ni) - (Cr0 + n0))
+ *
+ * The drift is now expressed as:
+ *
+ * Drift(i) = recv_diff(i) - send_diff(i);
+ *
+ * We now keep the W latest values of Drift and find the minimum (this is the
+ * one with the lowest network jitter and thus the one which is least affected
+ * by it). We average this lowest value to smooth out the resulting network skew.
+ *
+ * Both the window and the weighting used for averaging influence the accuracy
+ * of the drift estimation. Finding the correct parameters turns out to be a
+ * compromise between accuracy and inertia.
+ *
+ * We use a 2 second window or up to 512 data points, which is statistically big
+ * enough to catch spikes (FIXME, detect spikes).
+ * We also use a rather large weighting factor (125) to smoothly adapt. During
+ * startup, when filling the window, we use a parabolic weighting factor, the
+ * more the window is filled, the faster we move to the detected possible skew.
+ *
+ * Returns: @time adjusted with the clock skew.
+ */
+static GstClockTime
+calculate_skew (MpegTSPacketizer2 * packetizer, guint64 pcrtime,
+ GstClockTime time)
+{
+ guint64 send_diff, recv_diff;
+ gint64 delta;
+ gint64 old;
+ gint pos, i;
+ GstClockTime gstpcrtime, out_time;
+ guint64 slope;
+
+ gstpcrtime = PCRTIME_TO_GSTTIME (pcrtime);
+
+ /* keep track of the last extended pcrtime */
+ packetizer->last_pcrtime = gstpcrtime;
+
+ /* first time, lock on to time and gstpcrtime */
+ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (packetizer->base_time))) {
+ packetizer->base_time = time;
+ packetizer->prev_out_time = GST_CLOCK_TIME_NONE;
+ GST_DEBUG ("Taking new base time %" GST_TIME_FORMAT, GST_TIME_ARGS (time));
+ }
+
+ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (packetizer->base_pcrtime))) {
+ packetizer->base_pcrtime = gstpcrtime;
+ packetizer->prev_send_diff = -1;
+ GST_DEBUG ("Taking new base pcrtime %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (gstpcrtime));
+ }
+
+ if (G_LIKELY (gstpcrtime >= packetizer->base_pcrtime))
+ send_diff = gstpcrtime - packetizer->base_pcrtime;
+ else if (GST_CLOCK_TIME_IS_VALID (time)) {
+ /* elapsed time at sender, timestamps can go backwards and thus be smaller
+ * than our base time, take a new base time in that case. */
+ GST_WARNING ("backward timestamps at server, taking new base time");
+ mpegts_packetizer_resync (packetizer, time, gstpcrtime, FALSE);
+ send_diff = 0;
+ } else {
+ GST_WARNING ("backward timestamps at server but no timestamps");
+ send_diff = 0;
+ /* at least try to get a new timestamp.. */
+ packetizer->base_time = -1;
+ }
+
+ GST_DEBUG ("gstpcr %" GST_TIME_FORMAT ", buftime %" GST_TIME_FORMAT ", base %"
+ GST_TIME_FORMAT ", send_diff %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (gstpcrtime), GST_TIME_ARGS (time),
+ GST_TIME_ARGS (packetizer->base_pcrtime), GST_TIME_ARGS (send_diff));
+
+ /* we don't have an arrival timestamp so we can't do skew detection. we
+ * should still apply a timestamp based on RTP timestamp and base_time */
+ if (!GST_CLOCK_TIME_IS_VALID (time)
+ || !GST_CLOCK_TIME_IS_VALID (packetizer->base_time))
+ goto no_skew;
+
+ /* elapsed time at receiver, includes the jitter */
+ recv_diff = time - packetizer->base_time;
+
+ /* Ignore packets received at 100% the same time (i.e. from the same input buffer) */
+ if (G_UNLIKELY (time == packetizer->prev_in_time
+ && GST_CLOCK_TIME_IS_VALID (packetizer->prev_in_time)))
+ goto no_skew;
+
+ /* measure the diff */
+ delta = ((gint64) recv_diff) - ((gint64) send_diff);
+
+ /* measure the slope, this gives a rought estimate between the sender speed
+ * and the receiver speed. This should be approximately 8, higher values
+ * indicate a burst (especially when the connection starts) */
+ slope = recv_diff > 0 ? (send_diff * 8) / recv_diff : 8;
+
+ GST_DEBUG ("time %" GST_TIME_FORMAT ", base %" GST_TIME_FORMAT ", recv_diff %"
+ GST_TIME_FORMAT ", slope %" G_GUINT64_FORMAT, GST_TIME_ARGS (time),
+ GST_TIME_ARGS (packetizer->base_time), GST_TIME_ARGS (recv_diff), slope);
+
+ /* if the difference between the sender timeline and the receiver timeline
+ * changed too quickly we have to resync because the server likely restarted
+ * its timestamps. */
+ if (ABS (delta - packetizer->skew) > GST_SECOND) {
+ GST_WARNING ("delta - skew: %" GST_TIME_FORMAT " too big, reset skew",
+ GST_TIME_ARGS (delta - packetizer->skew));
+ mpegts_packetizer_resync (packetizer, time, gstpcrtime, TRUE);
+ send_diff = 0;
+ delta = 0;
+ }
+
+ pos = packetizer->window_pos;
+
+ if (G_UNLIKELY (packetizer->window_filling)) {
+ /* we are filling the window */
+ GST_DEBUG ("filling %d, delta %" G_GINT64_FORMAT, pos, delta);
+ packetizer->window[pos++] = delta;
+ /* calc the min delta we observed */
+ if (G_UNLIKELY (pos == 1 || delta < packetizer->window_min))
+ packetizer->window_min = delta;
+
+ if (G_UNLIKELY (send_diff >= MAX_TIME || pos >= MAX_WINDOW)) {
+ packetizer->window_size = pos;
+
+ /* window filled */
+ GST_DEBUG ("min %" G_GINT64_FORMAT, packetizer->window_min);
+
+ /* the skew is now the min */
+ packetizer->skew = packetizer->window_min;
+ packetizer->window_filling = FALSE;
+ } else {
+ gint perc_time, perc_window, perc;
+
+ /* figure out how much we filled the window, this depends on the amount of
+ * time we have or the max number of points we keep. */
+ perc_time = send_diff * 100 / MAX_TIME;
+ perc_window = pos * 100 / MAX_WINDOW;
+ perc = MAX (perc_time, perc_window);
+
+ /* make a parabolic function, the closer we get to the MAX, the more value
+ * we give to the scaling factor of the new value */
+ perc = perc * perc;
+
+ /* quickly go to the min value when we are filling up, slowly when we are
+ * just starting because we're not sure it's a good value yet. */
+ packetizer->skew =
+ (perc * packetizer->window_min + ((10000 -
+ perc) * packetizer->skew)) / 10000;
+ packetizer->window_size = pos + 1;
+ }
+ } else {
+ /* pick old value and store new value. We keep the previous value in order
+ * to quickly check if the min of the window changed */
+ old = packetizer->window[pos];
+ packetizer->window[pos++] = delta;
+
+ if (G_UNLIKELY (delta <= packetizer->window_min)) {
+ /* if the new value we inserted is smaller or equal to the current min,
+ * it becomes the new min */
+ packetizer->window_min = delta;
+ } else if (G_UNLIKELY (old == packetizer->window_min)) {
+ gint64 min = G_MAXINT64;
+
+ /* if we removed the old min, we have to find a new min */
+ for (i = 0; i < packetizer->window_size; i++) {
+ /* we found another value equal to the old min, we can stop searching now */
+ if (packetizer->window[i] == old) {
+ min = old;
+ break;
+ }
+ if (packetizer->window[i] < min)
+ min = packetizer->window[i];
+ }
+ packetizer->window_min = min;
+ }
+ /* average the min values */
+ packetizer->skew =
+ (packetizer->window_min + (124 * packetizer->skew)) / 125;
+ GST_DEBUG ("delta %" G_GINT64_FORMAT ", new min: %" G_GINT64_FORMAT, delta,
+ packetizer->window_min);
+ }
+ /* wrap around in the window */
+ if (G_UNLIKELY (pos >= packetizer->window_size))
+ pos = 0;
+
+ packetizer->window_pos = pos;
+
+no_skew:
+ /* the output time is defined as the base timestamp plus the PCR time
+ * adjusted for the clock skew .*/
+ if (packetizer->base_time != -1) {
+ out_time = packetizer->base_time + send_diff;
+ /* skew can be negative and we don't want to make invalid timestamps */
+ if (packetizer->skew < 0 && out_time < -packetizer->skew) {
+ out_time = 0;
+ } else {
+ out_time += packetizer->skew;
+ }
+ /* check if timestamps are not going backwards, we can only check this if we
+ * have a previous out time and a previous send_diff */
+ if (G_LIKELY (packetizer->prev_out_time != -1
+ && packetizer->prev_send_diff != -1)) {
+ /* now check for backwards timestamps */
+ if (G_UNLIKELY (
+ /* if the server timestamps went up and the out_time backwards */
+ (send_diff > packetizer->prev_send_diff
+ && out_time < packetizer->prev_out_time) ||
+ /* if the server timestamps went backwards and the out_time forwards */
+ (send_diff < packetizer->prev_send_diff
+ && out_time > packetizer->prev_out_time) ||
+ /* if the server timestamps did not change */
+ send_diff == packetizer->prev_send_diff)) {
+ GST_DEBUG ("backwards timestamps, using previous time");
+ out_time = GSTTIME_TO_MPEGTIME (out_time);
+ }
+ }
+ } else {
+ /* We simply use the pcrtime without applying any skew compensation */
+ out_time = time;
+ }
+
+ packetizer->prev_out_time = out_time;
+ packetizer->prev_in_time = time;
+ packetizer->prev_send_diff = send_diff;
+
+ GST_DEBUG ("skew %" G_GINT64_FORMAT ", out %" GST_TIME_FORMAT,
+ packetizer->skew, GST_TIME_ARGS (out_time));
+
+ return out_time;
+}
+
+static void
+record_pcr (MpegTSPacketizer2 * packetizer, guint64 pcr, guint64 offset)
+{
+ MpegTSPacketizerPrivate *priv = packetizer->priv;
+
+ /* Check against first PCR */
+ if (priv->first_pcr == -1 || priv->first_offset > offset) {
+ GST_DEBUG ("Recording first value. PCR:%" G_GUINT64_FORMAT " offset:%"
+ G_GUINT64_FORMAT, pcr, offset);
+ priv->first_pcr = pcr;
+ priv->first_pcr_ts = PCRTIME_TO_GSTTIME (pcr);
+ priv->first_offset = offset;
+ priv->nb_seen_offsets++;
+ } else
+ /* If we didn't update the first PCR, let's check against last PCR */
+ if (priv->last_pcr == -1 || priv->last_offset < offset) {
+ GST_DEBUG ("Recording last value. PCR:%" G_GUINT64_FORMAT " offset:%"
+ G_GUINT64_FORMAT, pcr, offset);
+ if (G_UNLIKELY (priv->first_pcr != -1 && pcr < priv->first_pcr)) {
+ GST_DEBUG ("rollover detected");
+ pcr += PCR_MAX_VALUE;
+ }
+ priv->last_pcr = pcr;
+ priv->last_pcr_ts = PCRTIME_TO_GSTTIME (pcr);
+ priv->last_offset = offset;
+ priv->nb_seen_offsets++;
+ }
+}
+
+guint
+mpegts_packetizer_get_seen_pcr (MpegTSPacketizer2 * packetizer)
+{
+ return packetizer->priv->nb_seen_offsets;
+}
+
+GstClockTime
+mpegts_packetizer_offset_to_ts (MpegTSPacketizer2 * packetizer, guint64 offset)
+{
+ MpegTSPacketizerPrivate *priv = packetizer->priv;
+ GstClockTime res;
+
+ if (G_UNLIKELY (!packetizer->calculate_offset))
+ return GST_CLOCK_TIME_NONE;
+
+ if (G_UNLIKELY (priv->refoffset == -1))
+ return GST_CLOCK_TIME_NONE;
+
+ if (G_UNLIKELY (offset < priv->refoffset))
+ return GST_CLOCK_TIME_NONE;
+
+ /* Convert byte difference into time difference */
+ res = PCRTIME_TO_GSTTIME (gst_util_uint64_scale (offset - priv->refoffset,
+ priv->last_pcr - priv->first_pcr,
+ priv->last_offset - priv->first_offset));
+ GST_DEBUG ("Returning timestamp %" GST_TIME_FORMAT " for offset %"
+ G_GUINT64_FORMAT, GST_TIME_ARGS (res), offset);
+
+ return res;
+}
+
+GstClockTime
+mpegts_packetizer_pts_to_ts (MpegTSPacketizer2 * packetizer, GstClockTime pts)
+{
+ GstClockTime res = GST_CLOCK_TIME_NONE;
+
+ /* Use clock skew if present */
+ if (packetizer->calculate_skew
+ && GST_CLOCK_TIME_IS_VALID (packetizer->base_time)) {
+ GST_DEBUG ("pts %" G_GUINT64_FORMAT " base_pcrtime:%" G_GUINT64_FORMAT
+ " base_time:%" GST_TIME_FORMAT, pts, packetizer->base_pcrtime,
+ GST_TIME_ARGS (packetizer->base_time));
+ res = pts - packetizer->base_pcrtime + packetizer->base_time +
+ packetizer->skew;
+ } else
+ /* If not, use pcr observations */
+ if (packetizer->calculate_offset && packetizer->priv->first_pcr != -1) {
+ /* Rollover */
+ if (G_UNLIKELY (pts < packetizer->priv->first_pcr_ts))
+ pts += MPEGTIME_TO_GSTTIME (PTS_DTS_MAX_VALUE);
+ res = pts - packetizer->priv->first_pcr_ts;
+ }
+
+ GST_DEBUG ("Returning timestamp %" GST_TIME_FORMAT " for pts %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (res), GST_TIME_ARGS (pts));
+ return res;
+}
+
+guint64
+mpegts_packetizer_ts_to_offset (MpegTSPacketizer2 * packetizer, GstClockTime ts)
+{
+ MpegTSPacketizerPrivate *priv = packetizer->priv;
+ guint64 res;
+
+ if (!packetizer->calculate_offset || packetizer->priv->first_pcr == -1)
+ return -1;
+
+ GST_DEBUG ("ts(pcr) %" G_GUINT64_FORMAT " first_pcr:%" G_GUINT64_FORMAT,
+ GSTTIME_TO_MPEGTIME (ts), priv->first_pcr);
+
+ /* Convert ts to PCRTIME */
+ res = gst_util_uint64_scale (GSTTIME_TO_PCRTIME (ts),
+ priv->last_offset - priv->first_offset, priv->last_pcr - priv->first_pcr);
+ res += priv->first_offset + priv->refoffset;
+
+ GST_DEBUG ("Returning offset %" G_GUINT64_FORMAT " for ts %" GST_TIME_FORMAT,
+ res, GST_TIME_ARGS (ts));
+
+ return res;
+}
+
+void
+mpegts_packetizer_set_reference_offset (MpegTSPacketizer2 * packetizer,
+ guint64 refoffset)
+{
+ GST_DEBUG ("Setting reference offset to %" G_GUINT64_FORMAT, refoffset);
+
+ packetizer->priv->refoffset = refoffset;
+}
diff --git a/gst/mpegtsdemux/mpegtspacketizer.h b/gst/mpegtsdemux/mpegtspacketizer.h
index ab6db621a..243d9561a 100644
--- a/gst/mpegtsdemux/mpegtspacketizer.h
+++ b/gst/mpegtsdemux/mpegtspacketizer.h
@@ -28,6 +28,8 @@
#include <gst/base/gstadapter.h>
#include <glib.h>
+#include "gstmpegdefs.h"
+
#define MPEGTS_NORMAL_PACKETSIZE 188
#define MPEGTS_M2TS_PACKETSIZE 192
#define MPEGTS_DVB_ASI_PACKETSIZE 204
@@ -39,6 +41,8 @@
#define MPEGTS_AFC_PCR_FLAG 0x10
#define MPEGTS_AFC_OPCR_FLAG 0x08
+#define MAX_WINDOW 512
+
G_BEGIN_DECLS
#define GST_TYPE_MPEGTS_PACKETIZER \
@@ -54,6 +58,7 @@ G_BEGIN_DECLS
typedef struct _MpegTSPacketizer2 MpegTSPacketizer2;
typedef struct _MpegTSPacketizer2Class MpegTSPacketizer2Class;
+typedef struct _MpegTSPacketizerPrivate MpegTSPacketizerPrivate;
typedef struct
{
@@ -70,6 +75,7 @@ struct _MpegTSPacketizer2 {
GstAdapter *adapter;
/* streams hashed by pid */
+ /* FIXME : be more memory efficient (see how it's done in mpegtsbase) */
MpegTSPacketizerStream **streams;
gboolean disposed;
gboolean know_packet_size;
@@ -79,6 +85,30 @@ struct _MpegTSPacketizer2 {
/* current offset of the tip of the adapter */
guint64 offset;
gboolean empty;
+
+ /* clock skew calculation */
+ gboolean calculate_skew;
+
+ /* Following variables are only active/used when
+ * calculate_skew is TRUE */
+ /* FIXME : These variables should be *per* PCR PID */
+ GstClockTime base_time;
+ GstClockTime base_pcrtime;
+ GstClockTime prev_out_time;
+ GstClockTime prev_in_time;
+ GstClockTime last_pcrtime;
+ gint64 window[MAX_WINDOW];
+ guint window_pos;
+ guint window_size;
+ gboolean window_filling;
+ gint64 window_min;
+ gint64 skew;
+ gint64 prev_send_diff;
+
+ /* offset/bitrate calculator */
+ gboolean calculate_offset;
+
+ MpegTSPacketizerPrivate *priv;
};
struct _MpegTSPacketizer2Class {
@@ -146,6 +176,8 @@ void mpegts_packetizer_push (MpegTSPacketizer2 *packetizer, GstBuffer *buffer);
gboolean mpegts_packetizer_has_packets (MpegTSPacketizer2 *packetizer);
MpegTSPacketizerPacketReturn mpegts_packetizer_next_packet (MpegTSPacketizer2 *packetizer,
MpegTSPacketizerPacket *packet);
+MpegTSPacketizerPacketReturn
+mpegts_packetizer_process_next_packet(MpegTSPacketizer2 * packetizer);
void mpegts_packetizer_clear_packet (MpegTSPacketizer2 *packetizer,
MpegTSPacketizerPacket *packet);
void mpegts_packetizer_remove_stream(MpegTSPacketizer2 *packetizer,
@@ -165,8 +197,22 @@ GstStructure *mpegts_packetizer_parse_eit (MpegTSPacketizer2 *packetizer,
MpegTSPacketizerSection *section);
GstStructure *mpegts_packetizer_parse_tdt (MpegTSPacketizer2 *packetizer,
MpegTSPacketizerSection *section);
-guint64 mpegts_packetizer_compute_pcr(const guint8 * data);
+/* Only valid if calculate_offset is TRUE */
+guint mpegts_packetizer_get_seen_pcr (MpegTSPacketizer2 *packetizer);
+
+GstClockTime
+mpegts_packetizer_offset_to_ts (MpegTSPacketizer2 * packetizer,
+ guint64 offset);
+guint64
+mpegts_packetizer_ts_to_offset (MpegTSPacketizer2 * packetizer,
+ GstClockTime ts);
+GstClockTime
+mpegts_packetizer_pts_to_ts (MpegTSPacketizer2 * packetizer,
+ GstClockTime pts);
+void
+mpegts_packetizer_set_reference_offset (MpegTSPacketizer2 * packetizer,
+ guint64 refoffset);
G_END_DECLS
#endif /* GST_MPEGTS_PACKETIZER_H */
diff --git a/gst/mpegtsdemux/payload_parsers.c b/gst/mpegtsdemux/payload_parsers.c
deleted file mode 100644
index ca2c75efd..000000000
--- a/gst/mpegtsdemux/payload_parsers.c
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * payload_parsers.c
- * Copyright (C) 2011 Janne Grunau
- *
- * Authors:
- * Janne Grunau <janne.grunau@collabora.co.uk>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include "payload_parsers.h"
-#include <gst/base/gstbitreader.h>
-
-#define PICTURE_START_CODE 0x00000100
-#define GROUP_START_CODE 0x000001B8
-
-#define SLICE_NAL_UNIT_TYPE 0x01
-#define SLICE_IDR_NAL_UNIT_TYPE 0x05
-#define SEI_NAL_UNIT_TYPE 0x06
-
-#define SEI_TYPE_RECOVERY_POINT 0x06
-
-typedef struct Mpeg2PictureHeader
-{
- guint16 temporal_reference;
- guint8 picture_coding_type;
- guint16 vbv_delay;
-
- /* picture_coding_type == 2 || picture_coding_type */
- guint8 full_pel_forward_vector;
- guint8 forward_f_code;
-
- /* picture_coding_type == 3 */
- guint8 full_pel_backward_vector;
- guint8 backward_f_code;
-} Mpeg2PictureHeader;
-
-/* shortened slice header */
-typedef struct H264SliceHeader
-{
- guint32 first_mb_in_slice;
- guint8 slice_type;
-} H264SliceHeader;
-
-
-static guint8 *
-find_start_code (guint32 * start_code, guint8 * buffer, guint8 * buffer_end)
-{
- if (G_UNLIKELY (buffer == NULL) || G_UNLIKELY (buffer_end == NULL)
- || G_UNLIKELY (start_code == NULL))
- return NULL;
-
- while (buffer <= buffer_end) {
-
- *start_code <<= 8;
- *start_code |= *buffer++;
-
- if ((*start_code & 0xffffff00) == 0x00000100)
- return buffer;
- }
-
- return NULL;
-}
-
-static gboolean
-parse_mpeg2_picture_header (Mpeg2PictureHeader * hdr, guint8 * buffer,
- guint8 * buffer_end)
-{
- GstBitReader br = GST_BIT_READER_INIT (buffer, buffer_end - buffer);
-
- if (gst_bit_reader_get_remaining (&br) < 40)
- return FALSE;
-
- hdr->temporal_reference = gst_bit_reader_get_bits_uint16_unchecked (&br, 10);
- hdr->picture_coding_type = gst_bit_reader_get_bits_uint8_unchecked (&br, 3);
- hdr->vbv_delay = gst_bit_reader_get_bits_uint16_unchecked (&br, 16);
-
- if (hdr->picture_coding_type == 2 || hdr->picture_coding_type == 3) {
- hdr->full_pel_forward_vector =
- gst_bit_reader_get_bits_uint8_unchecked (&br, 1);
- hdr->forward_f_code = gst_bit_reader_get_bits_uint8_unchecked (&br, 3);
- }
- if (hdr->picture_coding_type == 3) {
- hdr->full_pel_backward_vector =
- gst_bit_reader_get_bits_uint8_unchecked (&br, 1);
- hdr->backward_f_code = gst_bit_reader_get_bits_uint8_unchecked (&br, 3);
- }
- return TRUE;
-}
-
-gboolean
-gst_tsdemux_has_mpeg2_keyframe (guint32 * state,
- MpegTSPacketizerPacket * packet, gboolean * need_more)
-{
- guint8 *data = packet->payload;
- guint8 *data_end = packet->data_end;
-
- GST_LOG ("state: 0x%08x", *state);
-
- while (data <= data_end) {
-
- data = find_start_code (state, data, data_end);
-
- if (!data)
- return FALSE;
-
- GST_LOG ("found start code: 0x%08x", *state);
-
- if (*state == GROUP_START_CODE) {
- GST_DEBUG ("found group start code");
- *state = 0xffffffff;
- *need_more = FALSE;
- return TRUE;
- } else if (*state == PICTURE_START_CODE) {
- Mpeg2PictureHeader hdr = { 0 };
- gboolean success;
-
- success = parse_mpeg2_picture_header (&hdr, data, data_end);
- GST_DEBUG ("found picture start code, %sparsed, picture coding type: %d",
- success ? "" : "not ", hdr.picture_coding_type);
-
- *state = 0xffffffff;
- *need_more = FALSE;
- return success && hdr.picture_coding_type == 1;
- }
- }
-
- return FALSE;
-}
-
-/* variable length Exp-Golomb parsing according to H.264 spec 9.1*/
-static gboolean
-read_golomb (GstBitReader * br, guint32 * value)
-{
- guint8 b, leading_zeros = -1;
- *value = 1;
-
- for (b = 0; !b; leading_zeros++) {
- if (!gst_bit_reader_get_bits_uint8 (br, &b, 1))
- return FALSE;
- *value *= 2;
- }
-
- *value = (*value >> 1) - 1;
- if (leading_zeros > 0) {
- guint32 tmp = 0;
- if (!gst_bit_reader_get_bits_uint32 (br, &tmp, leading_zeros))
- return FALSE;
- *value += tmp;
- }
-
- return TRUE;
-}
-
-/* just parse the requirred bits of the slice header */
-static gboolean
-parse_h264_slice_header (H264SliceHeader * hdr, guint8 * buffer,
- guint8 * buffer_end)
-{
- guint32 value;
- GstBitReader br = GST_BIT_READER_INIT (buffer, buffer_end - buffer);
-
- if (!read_golomb (&br, &value))
- return FALSE;
- hdr->first_mb_in_slice = value;
-
- if (!read_golomb (&br, &value))
- return FALSE;
- hdr->slice_type = value;
-
- return TRUE;
-}
-
-enum H264SliceTypes
-{
- h264_p_slice = 0,
- h264_b_slice,
- h264_i_slice,
- h264_sp_slice,
- h264_si_slice,
- h264_p_slice_a,
- h264_b_slice_a,
- h264_i_slice_a,
- h264_sp_slice_a,
- h264_si_slice_a,
-};
-
-static gboolean
-is_key_slice (guint8 slice_type)
-{
- switch (slice_type) {
- case h264_i_slice:
- case h264_si_slice:
- case h264_i_slice_a:
- case h264_si_slice_a:
- return TRUE;
- }
- return FALSE;
-}
-
-gboolean
-gst_tsdemux_has_h264_keyframe (guint32 * state, MpegTSPacketizerPacket * packet,
- gboolean * need_more)
-{
- guint8 *data = packet->payload;
- guint8 *data_end = packet->data_end;
-
- GST_LOG ("state: 0x%08x", *state);
-
- while (data <= data_end) {
- guint8 nal_unit_type;
- guint8 *next_data = NULL;
-
- data = find_start_code (state, data, data_end);
-
- if (!data)
- goto beach;
-
- GST_LOG ("found start code: 0x%08x", *state);
-
- /* determine length */
- nal_unit_type = *state & 0x1f;
- next_data = find_start_code (state, data, data_end);
-
- if (nal_unit_type == SEI_NAL_UNIT_TYPE && !next_data) {
- GST_WARNING ("NAL unit 0x%02x not completely in ts packet",
- nal_unit_type);
- goto beach;
- }
- next_data -= 4;
-
- switch (nal_unit_type) {
- case SLICE_IDR_NAL_UNIT_TYPE:
- GST_DEBUG ("found SLICE_IDR NAL unit type");
- *state = 0xffffffff;
- *need_more = FALSE;
- return TRUE;
- case SLICE_NAL_UNIT_TYPE:
- {
- H264SliceHeader hdr = { 0 };
- gboolean success;
-
- success = parse_h264_slice_header (&hdr, data, data_end);
- GST_DEBUG ("found SLICE NAL unit type with slice type %d",
- hdr.slice_type);
-
- *state = 0xffffffff;
- *need_more = FALSE;
- return success && is_key_slice (hdr.slice_type);
- }
- case SEI_NAL_UNIT_TYPE:
- {
- guint32 recovery_frame_count;
- GstBitReader br = GST_BIT_READER_INIT (data, next_data - data);
-
- break;
-
- /* SEI message is at least 24 bit long */
- while (gst_bit_reader_get_remaining (&br) >= 24) {
- gint type = 0, size = 0;
- guint8 tmp = 0;
-
- do {
- if (!gst_bit_reader_get_bits_uint8 (&br, &tmp, 8))
- goto beach;
- type += tmp;
- } while (tmp == 255);
-
- do {
- if (!gst_bit_reader_get_bits_uint8 (&br, &tmp, 8))
- goto beach;
- size += tmp;
- } while (tmp == 255);
-
-
- GST_LOG ("found SEI msg type: %d, len: %d", type, size);
-
- switch (type) {
- case SEI_TYPE_RECOVERY_POINT:
- if (!read_golomb (&br, &recovery_frame_count))
- return FALSE;
- gst_bit_reader_skip (&br, 1); /* exact_match */
- gst_bit_reader_skip (&br, 1); /* broken_link_flag */
- gst_bit_reader_skip (&br, 2); /* changing_slice_group_idc */
- GST_DEBUG ("found SEI with recovery point message, "
- "recovery_frame_count: %d", recovery_frame_count);
- return TRUE;
- default:
- /* skip all other sei messages */
- gst_bit_reader_skip (&br, size * 8);
- }
- }
- }
- data = next_data;
- *state = 0xffffffff;
- }
- }
-beach:
- return FALSE;
-}
diff --git a/gst/mpegtsdemux/payload_parsers.h b/gst/mpegtsdemux/payload_parsers.h
deleted file mode 100644
index 7f7a48005..000000000
--- a/gst/mpegtsdemux/payload_parsers.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * payload_parsers.h
- * Copyright (C) 2011 Janne Grunau
- *
- * Authors:
- * Janne Grunau <janne.grunau@collabora.co.uk>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include "mpegtspacketizer.h"
-
-typedef gboolean (*payload_parse_keyframe) (guint32 *state,
- MpegTSPacketizerPacket * packet,
- gboolean *need_more);
-
-gboolean gst_tsdemux_has_mpeg2_keyframe (guint32 *state,
- MpegTSPacketizerPacket * packet,
- gboolean *need_more);
-
-gboolean gst_tsdemux_has_h264_keyframe (guint32 *state,
- MpegTSPacketizerPacket * packet,
- gboolean *need_more);
diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c
index 06f813910..cf68672e2 100644
--- a/gst/mpegtsdemux/tsdemux.c
+++ b/gst/mpegtsdemux/tsdemux.c
@@ -41,7 +41,6 @@
#include "gstmpegdesc.h"
#include "gstmpegdefs.h"
#include "mpegtspacketizer.h"
-#include "payload_parsers.h"
#include "pesparse.h"
/*
@@ -65,10 +64,23 @@
#define PCR_MAX_VALUE (((((guint64)1)<<33) * 300) + 298)
#define PTS_DTS_MAX_VALUE (((guint64)1) << 33)
+/* Seeking/Scanning related variables */
+
/* seek to SEEK_TIMESTAMP_OFFSET before the desired offset and search then
* either accurately or for the next timestamp
*/
-#define SEEK_TIMESTAMP_OFFSET (1000 * GST_MSECOND)
+#define SEEK_TIMESTAMP_OFFSET (500 * GST_MSECOND)
+
+#define SEGMENT_FORMAT "[format:%s, rate:%f, start:%" \
+ GST_TIME_FORMAT", stop:%"GST_TIME_FORMAT", time:%"GST_TIME_FORMAT \
+ ", accum:%"GST_TIME_FORMAT", last_stop:%"GST_TIME_FORMAT \
+ ", duration:%"GST_TIME_FORMAT"]"
+
+#define SEGMENT_ARGS(a) gst_format_get_name((a).format), (a).rate, \
+ GST_TIME_ARGS((a).start), GST_TIME_ARGS((a).stop), \
+ GST_TIME_ARGS((a).time), GST_TIME_ARGS((a).accum), \
+ GST_TIME_ARGS((a).last_stop), GST_TIME_ARGS((a).duration)
+
GST_DEBUG_CATEGORY_STATIC (ts_demux_debug);
#define GST_CAT_DEFAULT ts_demux_debug
@@ -102,6 +114,8 @@ struct _TSDemuxStream
MpegTSBaseStream stream;
GstPad *pad;
+ /* Whether the pad was added or not */
+ gboolean active;
/* the return of the latest push */
GstFlowReturn flow_return;
@@ -114,6 +128,11 @@ struct _TSDemuxStream
GstBuffer *pendingbuffers[TS_MAX_PENDING_BUFFERS];
guint8 nbpending;
+ /* Size of data to push (if known) */
+ guint expected_size;
+ /* Size of currently queued data */
+ guint current_size;
+
/* Current data to be pushed out */
GList *currentlist;
@@ -123,9 +142,15 @@ struct _TSDemuxStream
/* Raw value of current PTS/DTS */
guint64 raw_pts;
guint64 raw_dts;
+ /* PTS/DTS with rollover fixed */
+ guint64 fixed_pts;
+ guint64 fixed_dts;
/* Number of rollover seen for PTS/DTS (default:0) */
guint nb_pts_rollover;
guint nb_dts_rollover;
+
+ /* Whether this stream needs to send a newsegment */
+ gboolean need_newsegment;
};
#define VIDEO_CAPS \
@@ -146,8 +171,11 @@ struct _TSDemuxStream
"audio/mpeg, " \
"mpegversion = (int) 1;" \
"audio/mpeg, " \
+ "mpegversion = (int) 2, " \
+ "stream-format = (string) adts; " \
+ "audio/mpeg, " \
"mpegversion = (int) 4, " \
- "stream-format = (string) {adts, loas}; " \
+ "stream-format = (string) latm; " \
"audio/x-lpcm, " \
"width = (int) { 16, 20, 24 }, " \
"rate = (int) { 48000, 96000 }, " \
@@ -196,9 +224,6 @@ enum
};
/* Pad functions */
-static gboolean gst_ts_demux_srcpad_query (GstPad * pad, GstObject * parent,
- GstQuery * query);
-
/* mpegtsbase methods */
static void
@@ -213,20 +238,11 @@ gst_ts_demux_stream_added (MpegTSBase * base, MpegTSBaseStream * stream,
MpegTSBaseProgram * program);
static void
gst_ts_demux_stream_removed (MpegTSBase * base, MpegTSBaseStream * stream);
-static GstFlowReturn gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event,
- guint16 pid);
-static GstFlowReturn find_pcr_packet (MpegTSBase * base, guint64 offset,
- gint64 length, TSPcrOffset * pcroffset);
-static GstFlowReturn find_timestamps (MpegTSBase * base, guint64 initoff,
- guint64 * offset);
+static GstFlowReturn gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event);
static void gst_ts_demux_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_ts_demux_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
-static void gst_ts_demux_finalize (GObject * object);
-static GstFlowReturn
-process_pcr (MpegTSBase * base, guint64 initoff, TSPcrOffset * pcroffset,
- guint numpcr, gboolean isinitial);
static void gst_ts_demux_flush_streams (GstTSDemux * tsdemux);
static GstFlowReturn
gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream);
@@ -259,7 +275,6 @@ gst_ts_demux_class_init (GstTSDemuxClass * klass)
gobject_class = G_OBJECT_CLASS (klass);
gobject_class->set_property = gst_ts_demux_set_property;
gobject_class->get_property = gst_ts_demux_get_property;
- gobject_class->finalize = gst_ts_demux_finalize;
g_object_class_install_property (gobject_class, PROP_PROGRAM_NUMBER,
g_param_spec_int ("program-number", "Program number",
@@ -295,58 +310,37 @@ gst_ts_demux_class_init (GstTSDemuxClass * klass)
ts_class->program_started = GST_DEBUG_FUNCPTR (gst_ts_demux_program_started);
ts_class->stream_added = gst_ts_demux_stream_added;
ts_class->stream_removed = gst_ts_demux_stream_removed;
- ts_class->find_timestamps = GST_DEBUG_FUNCPTR (find_timestamps);
ts_class->seek = GST_DEBUG_FUNCPTR (gst_ts_demux_do_seek);
ts_class->flush = GST_DEBUG_FUNCPTR (gst_ts_demux_flush);
}
static void
-gst_ts_demux_init (GstTSDemux * demux)
-{
- demux->need_newsegment = TRUE;
- demux->program_number = -1;
- demux->duration = GST_CLOCK_TIME_NONE;
- demux->pts_delta = GST_CLOCK_TIME_NONE;
- GST_MPEGTS_BASE (demux)->stream_size = sizeof (TSDemuxStream);
- gst_segment_init (&demux->segment, GST_FORMAT_TIME);
- demux->first_pcr = (TSPcrOffset) {
- GST_CLOCK_TIME_NONE, 0, 0};
- demux->cur_pcr = (TSPcrOffset) {
- 0};
- demux->last_pcr = (TSPcrOffset) {
- 0};
-}
-
-static void
gst_ts_demux_reset (MpegTSBase * base)
{
GstTSDemux *demux = (GstTSDemux *) base;
- if (demux->index) {
- g_array_free (demux->index, TRUE);
- demux->index = NULL;
- }
- demux->index_size = 0;
- demux->need_newsegment = TRUE;
demux->program_number = -1;
- demux->duration = GST_CLOCK_TIME_NONE;
- demux->pts_delta = GST_CLOCK_TIME_NONE;
+ demux->calculate_update_segment = FALSE;
+
gst_segment_init (&demux->segment, GST_FORMAT_TIME);
- demux->first_pcr = (TSPcrOffset) {
- GST_CLOCK_TIME_NONE, 0, 0};
- demux->cur_pcr = (TSPcrOffset) {
- 0};
- demux->last_pcr = (TSPcrOffset) {
- 0};
+ if (demux->segment_event) {
+ gst_event_unref (demux->segment_event);
+ demux->segment_event = NULL;
+ }
+
+ if (demux->update_segment) {
+ gst_event_unref (demux->update_segment);
+ demux->update_segment = NULL;
+ }
}
static void
-gst_ts_demux_finalize (GObject * object)
+gst_ts_demux_init (GstTSDemux * demux, GstTSDemuxClass * klass)
{
- if (G_OBJECT_CLASS (parent_class)->finalize)
- G_OBJECT_CLASS (parent_class)->finalize (object);
-}
+ GST_MPEGTS_BASE (demux)->stream_size = sizeof (TSDemuxStream);
+ gst_ts_demux_reset ((MpegTSBase *) demux);
+}
static void
@@ -387,6 +381,19 @@ gst_ts_demux_get_property (GObject * object, guint prop_id,
}
}
+static const GstQueryType *
+gst_ts_demux_srcpad_query_types (GstPad * pad)
+{
+ static const GstQueryType query_types[] = {
+ GST_QUERY_DURATION,
+ GST_QUERY_SEEKING,
+ GST_QUERY_LATENCY,
+ 0
+ };
+
+ return query_types;
+}
+
static gboolean
gst_ts_demux_srcpad_query (GstPad * pad, GstObject * parent, GstQuery * query)
{
@@ -400,17 +407,31 @@ gst_ts_demux_srcpad_query (GstPad * pad, GstObject * parent, GstQuery * query)
switch (GST_QUERY_TYPE (query)) {
case GST_QUERY_DURATION:
+ {
GST_DEBUG ("query duration");
gst_query_parse_duration (query, &format, NULL);
if (format == GST_FORMAT_TIME) {
- if (!gst_pad_peer_query (base->sinkpad, query))
- gst_query_set_duration (query, GST_FORMAT_TIME,
- demux->segment.duration);
+ if (!gst_pad_peer_query (base->sinkpad, query)) {
+ gint64 val;
+
+ format = GST_FORMAT_BYTES;
+ if (!gst_pad_query_peer_duration (base->sinkpad, &format, &val))
+ res = FALSE;
+ else {
+ GstClockTime dur =
+ mpegts_packetizer_offset_to_ts (base->packetizer, val);
+ if (GST_CLOCK_TIME_IS_VALID (dur))
+ gst_query_set_duration (query, GST_FORMAT_TIME, dur);
+ else
+ res = FALSE;
+ }
+ }
} else {
GST_DEBUG_OBJECT (demux, "only query duration on TIME is supported");
res = FALSE;
}
break;
+ }
case GST_QUERY_LATENCY:
{
GST_DEBUG ("query latency");
@@ -433,9 +454,10 @@ gst_ts_demux_srcpad_query (GstPad * pad, GstObject * parent, GstQuery * query)
max_lat += 700 * GST_MSECOND;
gst_query_set_latency (query, live, min_lat, max_lat);
}
- }
break;
+ }
case GST_QUERY_SEEKING:
+ {
GST_DEBUG ("query seeking");
gst_query_parse_seeking (query, &format, NULL, NULL, NULL);
if (format == GST_FORMAT_TIME) {
@@ -455,6 +477,7 @@ gst_ts_demux_srcpad_query (GstPad * pad, GstObject * parent, GstQuery * query)
res = FALSE;
}
break;
+ }
default:
res = gst_pad_query_default (pad, parent, query);
}
@@ -463,376 +486,8 @@ gst_ts_demux_srcpad_query (GstPad * pad, GstObject * parent, GstQuery * query)
}
-static inline GstClockTime
-calculate_gsttime (TSPcrOffset * start, guint64 pcr)
-{
-
- GstClockTime time = start->gsttime;
-
- if (start->pcr > pcr)
- time += PCRTIME_TO_GSTTIME (PCR_MAX_VALUE - start->pcr) +
- PCRTIME_TO_GSTTIME (pcr);
- else
- time += PCRTIME_TO_GSTTIME (pcr - start->pcr);
-
- return time;
-}
-
-static GstFlowReturn
-gst_ts_demux_parse_pes_header_pts (GstTSDemux * demux,
- MpegTSPacketizerPacket * packet, guint64 * time)
-{
- PESHeader header;
- gint offset = 0;
-
- if (mpegts_parse_pes_header (packet->payload,
- packet->data_end - packet->payload, &header, &offset))
- return GST_FLOW_ERROR;
-
- *time = header.PTS;
- return GST_FLOW_OK;
-}
-
-/* performs a accurate/key_unit seek */
-static GstFlowReturn
-gst_ts_demux_perform_auxiliary_seek (MpegTSBase * base, GstClockTime seektime,
- TSPcrOffset * pcroffset, gint64 length, gint16 pid, GstSeekFlags flags,
- payload_parse_keyframe auxiliary_seek_fn)
-{
- GstTSDemux *demux = (GstTSDemux *) base;
- GstFlowReturn res = GST_FLOW_ERROR;
- gboolean done = FALSE;
- gboolean found_keyframe = FALSE, found_accurate = FALSE, need_more = TRUE;
- GstBuffer *buf;
- MpegTSPacketizerPacket packet;
- MpegTSPacketizerPacketReturn pret;
- gint64 offset = pcroffset->offset;
- gint64 scan_offset = MIN (length, 50 * MPEGTS_MAX_PACKETSIZE);
- guint32 state = 0xffffffff;
- TSPcrOffset key_pos = { 0 };
-
- GST_DEBUG ("auxiliary seek for %" GST_TIME_FORMAT " from offset: %"
- G_GINT64_FORMAT " in %" G_GINT64_FORMAT " bytes for PID: %d "
- "%s %s", GST_TIME_ARGS (seektime), pcroffset->offset, length, pid,
- (flags & GST_SEEK_FLAG_ACCURATE) ? "accurate" : "",
- (flags & GST_SEEK_FLAG_KEY_UNIT) ? "key_unit" : "");
-
- mpegts_packetizer_flush (base->packetizer);
-
- if (base->packetizer->packet_size == MPEGTS_M2TS_PACKETSIZE)
- offset -= 4;
-
- while (!done && scan_offset <= length) {
- buf = NULL;
- res =
- gst_pad_pull_range (base->sinkpad, offset + scan_offset,
- 50 * MPEGTS_MAX_PACKETSIZE, &buf);
- if (res != GST_FLOW_OK)
- goto beach;
- mpegts_packetizer_push (base->packetizer, buf);
-
- while ((!done)
- && ((pret =
- mpegts_packetizer_next_packet (base->packetizer,
- &packet)) != PACKET_NEED_MORE)) {
- if (G_UNLIKELY (pret == PACKET_BAD))
- /* bad header, skip the packet */
- goto next;
-
- if (packet.payload_unit_start_indicator)
- GST_DEBUG ("found packet for PID: %d with pcr: %" GST_TIME_FORMAT
- " at offset: %" G_GINT64_FORMAT, packet.pid,
- GST_TIME_ARGS (packet.pcr), packet.offset);
-
- if (packet.payload != NULL && packet.pid == pid) {
-
- if (packet.payload_unit_start_indicator) {
- guint64 pts = 0;
- GstFlowReturn ok =
- gst_ts_demux_parse_pes_header_pts (demux, &packet, &pts);
- if (ok == GST_FLOW_OK) {
- GstClockTime time = calculate_gsttime (pcroffset, pts * 300);
-
- GST_DEBUG ("packet has PTS: %" GST_TIME_FORMAT,
- GST_TIME_ARGS (time));
-
- if (time <= seektime) {
- pcroffset->gsttime = time;
- pcroffset->pcr = packet.pcr;
- pcroffset->offset = packet.offset;
- } else
- found_accurate = TRUE;
- } else
- goto next;
- /* reset state for new packet */
- state = 0xffffffff;
- need_more = TRUE;
- }
-
- if (auxiliary_seek_fn) {
- if (need_more) {
- if (auxiliary_seek_fn (&state, &packet, &need_more)) {
- found_keyframe = TRUE;
- key_pos = *pcroffset;
- GST_DEBUG ("found keyframe: time: %" GST_TIME_FORMAT " pcr: %"
- GST_TIME_FORMAT " offset %" G_GINT64_FORMAT,
- GST_TIME_ARGS (pcroffset->gsttime),
- GST_TIME_ARGS (pcroffset->pcr), pcroffset->offset);
- }
- }
- } else {
- /* if we don't have a payload parsing function
- * every frame is a keyframe */
- found_keyframe = TRUE;
- }
- }
- if (flags & GST_SEEK_FLAG_ACCURATE)
- done = found_accurate && found_keyframe;
- else
- done = found_keyframe;
- if (done)
- *pcroffset = key_pos;
- next:
- mpegts_packetizer_clear_packet (base->packetizer, &packet);
- }
- scan_offset += 50 * MPEGTS_MAX_PACKETSIZE;
- }
-
-beach:
- if (done)
- res = GST_FLOW_OK;
- else if (GST_FLOW_OK == res)
- res = GST_FLOW_CUSTOM_ERROR_1;
-
- mpegts_packetizer_flush (base->packetizer);
- return res;
-}
-
-static gint
-TSPcrOffset_find (gconstpointer a, gconstpointer b, gpointer user_data)
-{
-
-/* GST_INFO ("a: %" GST_TIME_FORMAT " offset: %" G_GINT64_FORMAT, */
-/* GST_TIME_ARGS (((TSPcrOffset *) a)->gsttime), ((TSPcrOffset *) a)->offset); */
-/* GST_INFO ("b: %" GST_TIME_FORMAT " offset: %" G_GINT64_FORMAT, */
-/* GST_TIME_ARGS (((TSPcrOffset *) b)->gsttime), ((TSPcrOffset *) b)->offset); */
-
- if (((TSPcrOffset *) a)->gsttime < ((TSPcrOffset *) b)->gsttime)
- return -1;
- else if (((TSPcrOffset *) a)->gsttime > ((TSPcrOffset *) b)->gsttime)
- return 1;
- else
- return 0;
-}
-
-static GstFlowReturn
-gst_ts_demux_perform_seek (MpegTSBase * base, GstSegment * segment, guint16 pid)
-{
- GstTSDemux *demux = (GstTSDemux *) base;
- GstFlowReturn res = GST_FLOW_ERROR;
- int max_loop_cnt, loop_cnt = 0;
- gint64 seekpos = 0;
- gint64 time_diff;
- GstClockTime seektime;
- TSPcrOffset seekpcroffset, pcr_start, pcr_stop, *tmp;
-
- max_loop_cnt = (segment->flags & GST_SEEK_FLAG_ACCURATE) ? 25 : 10;
-
- seektime =
- MAX (0, segment->stop - SEEK_TIMESTAMP_OFFSET) + demux->first_pcr.gsttime;
- seekpcroffset.gsttime = seektime;
-
- GST_DEBUG ("seeking to %" GST_TIME_FORMAT, GST_TIME_ARGS (seektime));
-
- gst_ts_demux_flush_streams (demux);
-
- if (G_UNLIKELY (!demux->index)) {
- GST_ERROR ("no index");
- goto done;
- }
-
- /* get the first index entry before the seek position */
- tmp = gst_util_array_binary_search (demux->index->data, demux->index_size,
- sizeof (*tmp), TSPcrOffset_find, GST_SEARCH_MODE_BEFORE, &seekpcroffset,
- NULL);
-
- if (G_UNLIKELY (!tmp)) {
- GST_ERROR ("value not found");
- goto done;
- }
-
- pcr_start = *tmp;
- pcr_stop = *(++tmp);
-
- if (G_UNLIKELY (!pcr_stop.offset)) {
- GST_ERROR ("invalid entry");
- goto done;
- }
-
- /* check if the last recorded pcr can be used */
- if (pcr_start.offset < demux->cur_pcr.offset
- && demux->cur_pcr.offset < pcr_stop.offset) {
- demux->cur_pcr.gsttime = calculate_gsttime (&pcr_start, demux->cur_pcr.pcr);
- if (demux->cur_pcr.gsttime < seekpcroffset.gsttime)
- pcr_start = demux->cur_pcr;
- else
- pcr_stop = demux->cur_pcr;
- }
-
- GST_DEBUG ("start %" GST_TIME_FORMAT " offset: %" G_GINT64_FORMAT,
- GST_TIME_ARGS (pcr_start.gsttime), pcr_start.offset);
- GST_DEBUG ("stop %" GST_TIME_FORMAT " offset: %" G_GINT64_FORMAT,
- GST_TIME_ARGS (pcr_stop.gsttime), pcr_stop.offset);
-
- time_diff = seektime - pcr_start.gsttime;
- seekpcroffset = pcr_start;
-
- GST_DEBUG ("cur %" GST_TIME_FORMAT " offset: %" G_GINT64_FORMAT
- " time diff: %" G_GINT64_FORMAT,
- GST_TIME_ARGS (demux->cur_pcr.gsttime), demux->cur_pcr.offset, time_diff);
-
- /* seek loop */
- while (loop_cnt++ < max_loop_cnt && (time_diff > SEEK_TIMESTAMP_OFFSET >> 1)
- && (pcr_stop.gsttime - pcr_start.gsttime > SEEK_TIMESTAMP_OFFSET)) {
- gint64 duration = pcr_stop.gsttime - pcr_start.gsttime;
- gint64 size = pcr_stop.offset - pcr_start.offset;
-
- if (loop_cnt & 1)
- seekpos = pcr_start.offset + (size >> 1);
- else
- seekpos =
- pcr_start.offset + size * ((double) (seektime -
- pcr_start.gsttime) / duration);
-
- /* look a litle bit behind */
- seekpos =
- MAX (pcr_start.offset + 188, seekpos - 55 * MPEGTS_MAX_PACKETSIZE);
-
- GST_DEBUG ("looking for time: %" GST_TIME_FORMAT " .. %" GST_TIME_FORMAT
- " .. %" GST_TIME_FORMAT,
- GST_TIME_ARGS (pcr_start.gsttime),
- GST_TIME_ARGS (seektime), GST_TIME_ARGS (pcr_stop.gsttime));
- GST_DEBUG ("looking in bytes: %" G_GINT64_FORMAT " .. %" G_GINT64_FORMAT
- " .. %" G_GINT64_FORMAT, pcr_start.offset, seekpos, pcr_stop.offset);
-
- res =
- find_pcr_packet (&demux->parent, seekpos, 4000 * MPEGTS_MAX_PACKETSIZE,
- &seekpcroffset);
- if (G_UNLIKELY (res == GST_FLOW_EOS)) {
- seekpos =
- MAX ((gint64) pcr_start.offset,
- seekpos - 2000 * MPEGTS_MAX_PACKETSIZE) + 188;
- res =
- find_pcr_packet (&demux->parent, seekpos,
- 8000 * MPEGTS_MAX_PACKETSIZE, &seekpcroffset);
- }
- if (G_UNLIKELY (res != GST_FLOW_OK)) {
- GST_WARNING ("seeking failed %s", gst_flow_get_name (res));
- goto done;
- }
-
- seekpcroffset.gsttime = calculate_gsttime (&pcr_start, seekpcroffset.pcr);
-
- /* validate */
- if (G_UNLIKELY ((seekpcroffset.gsttime < pcr_start.gsttime) ||
- (seekpcroffset.gsttime > pcr_stop.gsttime))) {
- GST_ERROR ("Unexpected timestamp found, seeking failed! %"
- GST_TIME_FORMAT, GST_TIME_ARGS (seekpcroffset.gsttime));
- res = GST_FLOW_ERROR;
- goto done;
- }
-
- if (seekpcroffset.gsttime > seektime) {
- pcr_stop = seekpcroffset;
- } else {
- pcr_start = seekpcroffset;
- }
- time_diff = seektime - pcr_start.gsttime;
- GST_DEBUG ("seeking: %" GST_TIME_FORMAT " found: %" GST_TIME_FORMAT
- " diff = %" G_GINT64_FORMAT, GST_TIME_ARGS (seektime),
- GST_TIME_ARGS (seekpcroffset.gsttime), time_diff);
- }
-
- GST_DEBUG ("seeking finished after %d loops", loop_cnt);
-
- /* use correct seek position for the auxiliary search */
- seektime += SEEK_TIMESTAMP_OFFSET;
-
- {
- payload_parse_keyframe keyframe_seek = NULL;
- MpegTSBaseProgram *program = demux->program;
- guint64 avg_bitrate, length;
-
- if (program->streams[pid]) {
- switch (program->streams[pid]->stream_type) {
- case ST_VIDEO_MPEG1:
- case ST_VIDEO_MPEG2:
- keyframe_seek = gst_tsdemux_has_mpeg2_keyframe;
- break;
- case ST_VIDEO_H264:
- keyframe_seek = gst_tsdemux_has_h264_keyframe;
- break;
- case ST_VIDEO_MPEG4:
- case ST_VIDEO_DIRAC:
- GST_WARNING ("no payload parser for stream 0x%04x type: 0x%02x", pid,
- program->streams[pid]->stream_type);
- break;
- }
- } else
- GST_WARNING ("no stream info for PID: 0x%04x", pid);
-
- avg_bitrate =
- (pcr_stop.offset -
- pcr_start.offset) * 1000 * GST_MSECOND / (pcr_stop.gsttime -
- pcr_start.gsttime);
-
- seekpcroffset = pcr_start;
- /* search in 2500ms for a keyframe */
- length =
- MIN (demux->last_pcr.offset - pcr_start.offset,
- (avg_bitrate * 25) / 10);
- res =
- gst_ts_demux_perform_auxiliary_seek (base, seektime, &seekpcroffset,
- length, pid, segment->flags, keyframe_seek);
-
- if (res == GST_FLOW_CUSTOM_ERROR_1) {
- GST_ERROR ("no keyframe found in %" G_GUINT64_FORMAT
- " bytes starting from %" G_GUINT64_FORMAT, length,
- seekpcroffset.offset);
- res = GST_FLOW_ERROR;
- }
- if (res != GST_FLOW_OK)
- goto done;
- }
-
-
- /* update seektime to the actual timestamp of the found keyframe */
- if (segment->flags & GST_SEEK_FLAG_KEY_UNIT)
- seektime = seekpcroffset.gsttime;
-
- seektime -= demux->first_pcr.gsttime;
-
-#if 0
- segment->last_stop = seektime;
-#endif
- segment->time = seektime;
-
- /* we stop at the end */
- if (segment->stop == -1)
- segment->stop = demux->first_pcr.gsttime + segment->duration;
-
- demux->need_newsegment = TRUE;
- demux->parent.seek_offset = seekpcroffset.offset;
- GST_DEBUG ("seeked to postion:%" GST_TIME_FORMAT, GST_TIME_ARGS (seektime));
- res = GST_FLOW_OK;
-
-done:
- return res;
-}
-
-
static GstFlowReturn
-gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event, guint16 pid)
+gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event)
{
GstTSDemux *demux = (GstTSDemux *) base;
GstFlowReturn res = GST_FLOW_ERROR;
@@ -843,6 +498,7 @@ gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event, guint16 pid)
gint64 start, stop;
GstSegment seeksegment;
gboolean update;
+ guint64 start_offset;
gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start,
&stop_type, &stop);
@@ -863,28 +519,35 @@ gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event, guint16 pid)
/* copy segment, we need this because we still need the old
* segment when we close the current segment. */
memcpy (&seeksegment, &demux->segment, sizeof (GstSegment));
-
+ if (demux->segment_event) {
+ gst_event_unref (demux->segment_event);
+ demux->segment_event = NULL;
+ }
/* configure the segment with the seek variables */
GST_DEBUG_OBJECT (demux, "configuring seek");
- GST_DEBUG ("seeksegment: start: %" GST_TIME_FORMAT " stop: %"
- GST_TIME_FORMAT " time: %" GST_TIME_FORMAT
- " duration: %" GST_TIME_FORMAT,
- GST_TIME_ARGS (seeksegment.start), GST_TIME_ARGS (seeksegment.stop),
- GST_TIME_ARGS (seeksegment.time), GST_TIME_ARGS (seeksegment.duration));
- gst_segment_do_seek (&seeksegment, rate, format, flags, start_type, start,
+ GST_DEBUG ("seeksegment before set_seek " SEGMENT_FORMAT,
+ SEGMENT_ARGS (seeksegment));
+
+ gst_segment_set_seek (&seeksegment, rate, format, flags, start_type, start,
stop_type, stop, &update);
- GST_DEBUG ("seeksegment: start: %" GST_TIME_FORMAT " stop: %"
- GST_TIME_FORMAT " time: %" GST_TIME_FORMAT
- " duration: %" GST_TIME_FORMAT,
- GST_TIME_ARGS (seeksegment.start), GST_TIME_ARGS (seeksegment.stop),
- GST_TIME_ARGS (seeksegment.time), GST_TIME_ARGS (seeksegment.duration));
-
- res = gst_ts_demux_perform_seek (base, &seeksegment, pid);
- if (G_UNLIKELY (res != GST_FLOW_OK)) {
- GST_WARNING ("seeking failed %s", gst_flow_get_name (res));
+
+ GST_DEBUG ("seeksegment after set_seek " SEGMENT_FORMAT,
+ SEGMENT_ARGS (seeksegment));
+
+ /* Convert start/stop to offset */
+ start_offset =
+ mpegts_packetizer_ts_to_offset (base->packetizer, MAX (0,
+ start - SEEK_TIMESTAMP_OFFSET));
+
+ if (G_UNLIKELY (start_offset == -1)) {
+ GST_WARNING ("Couldn't convert start position to an offset");
goto done;
}
+ /* record offset */
+ base->seek_offset = start_offset;
+ res = GST_FLOW_OK;
+
/* commit the new segment */
memcpy (&demux->segment, &seeksegment, sizeof (GstSegment));
@@ -1012,8 +675,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
break;
case ST_PRIVATE_DATA:
GST_LOG ("private data");
- desc =
- mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream,
+ desc = mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream,
DESC_DVB_AC3);
if (desc) {
GST_LOG ("ac3 audio");
@@ -1023,8 +685,8 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
g_free (desc);
break;
}
- desc =
- mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream,
+
+ desc = mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream,
DESC_DVB_ENHANCED_AC3);
if (desc) {
GST_LOG ("ac3 audio");
@@ -1034,8 +696,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
g_free (desc);
break;
}
- desc =
- mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream,
+ desc = mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream,
DESC_DVB_TELETEXT);
if (desc) {
GST_LOG ("teletext");
@@ -1056,6 +717,26 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
g_free (desc);
break;
}
+
+ desc = mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream,
+ DESC_REGISTRATION);
+ if (desc) {
+ switch (DESC_REGISTRATION_format_identifier (desc)) {
+ case DRF_ID_DTS1:
+ case DRF_ID_DTS2:
+ case DRF_ID_DTS3:
+ /* SMPTE registered DTS */
+ GST_LOG ("subtitling");
+ template = gst_static_pad_template_get (&private_template);
+ name = g_strdup_printf ("private_%04x", bstream->pid);
+ caps = gst_caps_new_simple ("audio/x-dts", NULL);
+ break;
+ }
+ g_free (desc);
+ }
+ if (template)
+ break;
+
/* hack for itv hd (sid 10510, video pid 3401 */
if (program->program_number == 10510 && bstream->pid == 3401) {
template = gst_static_pad_template_get (&video_template);
@@ -1090,7 +771,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
template = gst_static_pad_template_get (&audio_template);
name = g_strdup_printf ("audio_%04x", bstream->pid);
caps = gst_caps_new_simple ("audio/mpeg",
- "mpegversion", G_TYPE_INT, 4,
+ "mpegversion", G_TYPE_INT, 2,
"stream-format", G_TYPE_STRING, "adts", NULL);
break;
case ST_AUDIO_AAC_LATM:
@@ -1098,7 +779,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
name = g_strdup_printf ("audio_%04x", bstream->pid);
caps = gst_caps_new_simple ("audio/mpeg",
"mpegversion", G_TYPE_INT, 4,
- "stream-format", G_TYPE_STRING, "loas", NULL);
+ "stream-format", G_TYPE_STRING, "latm", NULL);
break;
case ST_VIDEO_MPEG4:
template = gst_static_pad_template_get (&video_template);
@@ -1158,18 +839,34 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
desc = mpegts_get_descriptor_from_program (program, DESC_REGISTRATION);
if (desc) {
if (DESC_REGISTRATION_format_identifier (desc) == DRF_ID_HDMV) {
- template = gst_static_pad_template_get (&audio_template);
- name = g_strdup_printf ("audio_%04x", bstream->pid);
- caps = gst_caps_new_empty_simple ("audio/x-eac3");
+ guint8 *ac3_desc;
+
+ /* ATSC ac3 audio descriptor */
+ ac3_desc =
+ mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream,
+ DESC_AC3_AUDIO_STREAM);
+ if (ac3_desc && DESC_AC_AUDIO_STREAM_bsid (ac3_desc) != 16) {
+ GST_LOG ("ac3 audio");
+ template = gst_static_pad_template_get (&audio_template);
+ name = g_strdup_printf ("audio_%04x", bstream->pid);
+ caps = gst_caps_new_simple ("audio/x-ac3", NULL);
+
+ g_free (ac3_desc);
+ } else {
+ template = gst_static_pad_template_get (&audio_template);
+ name = g_strdup_printf ("audio_%04x", bstream->pid);
+ caps = gst_caps_new_simple ("audio/x-eac3", NULL);
+ }
}
+
g_free (desc);
}
if (template)
break;
+
/* DVB_ENHANCED_AC3 */
- desc =
- mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream,
+ desc = mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream,
DESC_DVB_ENHANCED_AC3);
if (desc) {
template = gst_static_pad_template_get (&audio_template);
@@ -1261,11 +958,15 @@ gst_ts_demux_stream_added (MpegTSBase * base, MpegTSBaseStream * bstream,
/* Create the pad */
if (bstream->stream_type != 0xff)
stream->pad = create_pad_for_stream (base, bstream, program);
+ stream->active = FALSE;
+ stream->need_newsegment = TRUE;
stream->pts = GST_CLOCK_TIME_NONE;
stream->dts = GST_CLOCK_TIME_NONE;
stream->raw_pts = 0;
stream->raw_dts = 0;
+ stream->fixed_pts = 0;
+ stream->fixed_dts = 0;
stream->nb_pts_rollover = 0;
stream->nb_dts_rollover = 0;
}
@@ -1275,29 +976,20 @@ gst_ts_demux_stream_added (MpegTSBase * base, MpegTSBaseStream * bstream,
static void
gst_ts_demux_stream_removed (MpegTSBase * base, MpegTSBaseStream * bstream)
{
- GstTSDemux *demux = GST_TS_DEMUX (base);
TSDemuxStream *stream = (TSDemuxStream *) bstream;
if (stream->pad) {
- if (gst_pad_is_active (stream->pad)) {
- gboolean need_newsegment = demux->need_newsegment;
-
- /* We must not send the newsegment when flushing the pending data
- on the removed stream. We should only push it when the newly added
- stream finishes parsing its PTS */
- demux->need_newsegment = FALSE;
-
+ if (stream->active && 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);
- demux->need_newsegment = need_newsegment;
-
GST_DEBUG_OBJECT (stream->pad, "Pushing out EOS");
gst_pad_push_event (stream->pad, gst_event_new_eos ());
GST_DEBUG_OBJECT (stream->pad, "Deactivating and removing pad");
gst_pad_set_active (stream->pad, FALSE);
gst_element_remove_pad (GST_ELEMENT_CAST (base), stream->pad);
+ stream->active = FALSE;
}
stream->pad = NULL;
}
@@ -1311,6 +1003,7 @@ activate_pad_for_stream (GstTSDemux * tsdemux, TSDemuxStream * stream)
GST_DEBUG_OBJECT (tsdemux, "Activating pad %s:%s for stream %p",
GST_DEBUG_PAD_NAME (stream->pad), stream);
gst_element_add_pad ((GstElement *) tsdemux, stream->pad);
+ stream->active = TRUE;
GST_DEBUG_OBJECT (stream->pad, "done adding pad");
} else
GST_WARNING_OBJECT (tsdemux,
@@ -1330,6 +1023,19 @@ gst_ts_demux_stream_flush (TSDemuxStream * stream)
gst_buffer_unref (stream->pendingbuffers[i]);
memset (stream->pendingbuffers, 0, TS_MAX_PENDING_BUFFERS);
stream->nbpending = 0;
+
+ stream->expected_size = 0;
+ stream->current_size = 0;
+ stream->current = NULL;
+ stream->need_newsegment = TRUE;
+ stream->pts = GST_CLOCK_TIME_NONE;
+ stream->dts = GST_CLOCK_TIME_NONE;
+ stream->raw_pts = 0;
+ stream->raw_dts = 0;
+ stream->fixed_pts = 0;
+ stream->fixed_dts = 0;
+ stream->nb_pts_rollover = 0;
+ stream->nb_dts_rollover = 0;
}
static void
@@ -1349,504 +1055,32 @@ gst_ts_demux_program_started (MpegTSBase * base, MpegTSBaseProgram * program)
if (demux->program_number == -1 ||
demux->program_number == program->program_number) {
- GList *tmp;
GST_LOG ("program %d started", program->program_number);
demux->program_number = program->program_number;
demux->program = program;
- /* Activate all stream pads, pads will already have been created */
- if (base->mode != BASE_MODE_SCANNING) {
- for (tmp = program->stream_list; tmp; tmp = tmp->next)
- activate_pad_for_stream (demux, (TSDemuxStream *) tmp->data);
- gst_element_no_more_pads ((GstElement *) demux);
+ /* If this is not the initial program, we need to calculate
+ * an update newsegment */
+ demux->calculate_update_segment = !program->initial_program;
+
+ /* If we have an upstream time segment and it's the initial program, just use that */
+ if (program->initial_program && base->segment.format == GST_FORMAT_TIME) {
+ demux->segment = base->segment;
+ demux->segment_event =
+ gst_event_new_new_segment_full (FALSE, base->segment.rate,
+ base->segment.applied_rate, GST_FORMAT_TIME, base->segment.start,
+ base->segment.stop, base->segment.time);
+ GST_EVENT_SRC (demux->segment_event) = gst_object_ref (demux);
}
+ /* FIXME : When do we emit no_more_pads ? */
+
/* Inform scanner we have got our program */
demux->current_program_number = program->program_number;
- demux->need_newsegment = TRUE;
}
}
-static gboolean
-process_section (MpegTSBase * base)
-{
- GstTSDemux *demux = GST_TS_DEMUX (base);
- gboolean based;
- gboolean done = FALSE;
- MpegTSPacketizerPacket packet;
- MpegTSPacketizerPacketReturn pret;
-
- while ((!done) &&
- ((pret = mpegts_packetizer_next_packet (base->packetizer, &packet))
- != PACKET_NEED_MORE)) {
-
- if (G_UNLIKELY (pret == PACKET_BAD))
- /* bad header, skip the packet */
- goto next;
-
- /* base PSI data */
- if (packet.payload != NULL && mpegts_base_is_psi (base, &packet)) {
- MpegTSPacketizerSection section;
-
- based = mpegts_packetizer_push_section (base->packetizer, &packet,
- &section);
-
- if (G_UNLIKELY (!based))
- /* bad section data */
- goto next;
-
- if (G_LIKELY (section.complete)) {
- /* section complete */
- GST_DEBUG ("Section Complete");
- based = mpegts_base_handle_psi (base, &section);
- gst_buffer_unref (section.buffer);
- if (G_UNLIKELY (!based))
- /* bad PSI table */
- goto next;
-
- }
-
- if (demux->program != NULL) {
- GST_DEBUG ("Got Program");
- done = TRUE;
- }
- }
- next:
- mpegts_packetizer_clear_packet (base->packetizer, &packet);
- }
-
- return done;
-}
-
-static gboolean
-process_pes (MpegTSBase * base, TSPcrOffset * pcroffset)
-{
- gboolean based, done = FALSE;
- MpegTSPacketizerPacket packet;
- MpegTSPacketizerPacketReturn pret;
- GstTSDemux *demux = GST_TS_DEMUX (base);
- guint16 pcr_pid = 0;
-
- while ((!done) &&
- ((pret = mpegts_packetizer_next_packet (base->packetizer, &packet))
- != PACKET_NEED_MORE)) {
- if (G_UNLIKELY (pret == PACKET_BAD))
- /* bad header, skip the packet */
- goto next;
-
- if (demux->program != NULL) {
- pcr_pid = demux->program->pcr_pid;
- }
-
- /* base PSI data */
- if (packet.payload != NULL && mpegts_base_is_psi (base, &packet)) {
- MpegTSPacketizerSection section;
-
- based = mpegts_packetizer_push_section (base->packetizer, &packet,
- &section);
-
- if (G_UNLIKELY (!based))
- /* bad section data */
- goto next;
-
- if (G_LIKELY (section.complete)) {
- /* section complete */
- GST_DEBUG ("Section Complete");
- based = mpegts_base_handle_psi (base, &section);
- gst_buffer_unref (section.buffer);
- if (G_UNLIKELY (!based))
- /* bad PSI table */
- goto next;
-
- }
- }
- if (packet.pid == pcr_pid && (packet.adaptation_field_control & 0x02)
- && (packet.afc_flags & MPEGTS_AFC_PCR_FLAG)) {
- GST_DEBUG ("PCR[0x%x]: %" G_GINT64_FORMAT, packet.pid, packet.pcr);
- pcroffset->pcr = packet.pcr;
- pcroffset->offset = packet.offset;
- done = TRUE;
- }
- next:
- mpegts_packetizer_clear_packet (base->packetizer, &packet);
- }
- return done;
-}
-
-static GstFlowReturn
-find_pcr_packet (MpegTSBase * base, guint64 offset, gint64 length,
- TSPcrOffset * pcroffset)
-{
- GstFlowReturn ret = GST_FLOW_OK;
- GstTSDemux *demux = GST_TS_DEMUX (base);
- MpegTSBaseProgram *program;
- GstBuffer *buf;
- gboolean done = FALSE;
- guint64 scan_offset = 0;
-
- GST_DEBUG ("Scanning for PCR between:%" G_GINT64_FORMAT
- " and the end:%" G_GINT64_FORMAT, offset, offset + length);
-
- /* Get the program */
- program = demux->program;
- if (G_UNLIKELY (program == NULL))
- return GST_FLOW_ERROR;
-
- mpegts_packetizer_flush (base->packetizer);
- if (offset >= 4 && base->packetizer->packet_size == MPEGTS_M2TS_PACKETSIZE)
- offset -= 4;
-
- while (!done && scan_offset < length) {
- buf = NULL;
- ret =
- gst_pad_pull_range (base->sinkpad, offset + scan_offset,
- 50 * MPEGTS_MAX_PACKETSIZE, &buf);
- if (ret != GST_FLOW_OK)
- goto beach;
- mpegts_packetizer_push (base->packetizer, buf);
- done = process_pes (base, pcroffset);
- scan_offset += 50 * MPEGTS_MAX_PACKETSIZE;
- }
-
- if (!done || scan_offset >= length) {
- GST_WARNING ("No PCR found!");
- ret = GST_FLOW_ERROR;
- goto beach;
- }
-
-beach:
- mpegts_packetizer_flush (base->packetizer);
- return ret;
-}
-
-static gboolean
-verify_timestamps (MpegTSBase * base, TSPcrOffset * first, TSPcrOffset * last)
-{
- GstTSDemux *demux = GST_TS_DEMUX (base);
- guint64 length = 4000 * MPEGTS_MAX_PACKETSIZE;
- guint64 offset = PCR_WRAP_SIZE_128KBPS;
-
- demux->index =
- g_array_sized_new (TRUE, TRUE, sizeof (*first),
- 2 + 1 + ((last->offset - first->offset) / PCR_WRAP_SIZE_128KBPS));
-
- first->gsttime = PCRTIME_TO_GSTTIME (first->pcr);
- demux->index = g_array_append_val (demux->index, *first);
- demux->index_size++;
- demux->first_pcr = *first;
- demux->index_pcr = *first;
- GST_DEBUG ("first time: %" GST_TIME_FORMAT " pcr: %" GST_TIME_FORMAT
- " offset: %" G_GINT64_FORMAT
- " last pcr: %" GST_TIME_FORMAT " offset: %" G_GINT64_FORMAT,
- GST_TIME_ARGS (first->gsttime),
- GST_TIME_ARGS (PCRTIME_TO_GSTTIME (first->pcr)), first->offset,
- GST_TIME_ARGS (PCRTIME_TO_GSTTIME (last->pcr)), last->offset);
-
- while (offset + length < last->offset) {
- TSPcrOffset half;
- GstFlowReturn ret;
- gint tries = 0;
-
- retry:
- ret = find_pcr_packet (base, offset, length, &half);
- if (G_UNLIKELY (ret != GST_FLOW_OK)) {
- GST_WARNING ("no pcr found, retrying");
- if (tries++ < 3) {
- offset += length;
- length *= 2;
- goto retry;
- }
- return FALSE;
- }
-
- half.gsttime = calculate_gsttime (first, half.pcr);
-
- GST_DEBUG ("add half time: %" GST_TIME_FORMAT " pcr: %" GST_TIME_FORMAT
- " offset: %" G_GINT64_FORMAT,
- GST_TIME_ARGS (half.gsttime),
- GST_TIME_ARGS (PCRTIME_TO_GSTTIME (half.pcr)), half.offset);
- demux->index = g_array_append_val (demux->index, half);
- demux->index_size++;
-
- length = 4000 * MPEGTS_MAX_PACKETSIZE;
- offset += PCR_WRAP_SIZE_128KBPS;
- *first = half;
- }
-
- last->gsttime = calculate_gsttime (first, last->pcr);
-
- GST_DEBUG ("add last time: %" GST_TIME_FORMAT " pcr: %" GST_TIME_FORMAT
- " offset: %" G_GINT64_FORMAT,
- GST_TIME_ARGS (last->gsttime),
- GST_TIME_ARGS (PCRTIME_TO_GSTTIME (last->pcr)), last->offset);
-
- demux->index = g_array_append_val (demux->index, *last);
- demux->index_size++;
-
- demux->last_pcr = *last;
- return TRUE;
-}
-
-static GstFlowReturn
-find_timestamps (MpegTSBase * base, guint64 initoff, guint64 * offset)
-{
-
- GstFlowReturn ret = GST_FLOW_OK;
- GstBuffer *buf;
- gboolean done = FALSE;
- gint64 total_bytes;
- guint64 scan_offset;
- guint i = 0;
- TSPcrOffset initial, final;
- GstTSDemux *demux = GST_TS_DEMUX (base);
-
- GST_DEBUG ("Scanning for timestamps");
-
- /* Start scanning from now PAT offset */
-
- while (!done) {
- buf = NULL;
- ret = gst_pad_pull_range (base->sinkpad, i * 50 * MPEGTS_MAX_PACKETSIZE,
- 50 * MPEGTS_MAX_PACKETSIZE, &buf);
-
- if (ret != GST_FLOW_OK)
- goto beach;
-
- mpegts_packetizer_push (base->packetizer, buf);
- done = process_section (base);
- i++;
- }
- mpegts_packetizer_clear (base->packetizer);
- done = FALSE;
- i = 1;
-
- *offset = base->seek_offset;
-
- /* Search for the first PCRs */
- ret = process_pcr (base, base->first_pat_offset, &initial, 10, TRUE);
-
- if (ret != GST_FLOW_OK && ret != GST_FLOW_EOS) {
- GST_WARNING ("Problem getting initial PCRs");
- goto beach;
- }
-
- mpegts_packetizer_clear (base->packetizer);
- /* Remove current program so we ensure looking for a PAT when scanning
- * for the final PCR */
- gst_structure_free (base->pat);
- base->pat = NULL;
- mpegts_base_remove_program (base, demux->current_program_number);
- demux->program = NULL;
-
- /* Find end position */
- if (G_UNLIKELY (!gst_pad_peer_query_duration (base->sinkpad, GST_FORMAT_BYTES,
- &total_bytes))) {
- GST_WARNING_OBJECT (base, "Couldn't get upstream size in bytes");
- mpegts_packetizer_clear (base->packetizer);
-
- return GST_FLOW_ERROR;
- }
- GST_DEBUG ("Upstream is %" G_GINT64_FORMAT " bytes", total_bytes);
-
-
- /* Let's start scanning 4000 packets from the end */
- scan_offset = MAX (188, total_bytes - 4000 * MPEGTS_MAX_PACKETSIZE);
-
- GST_DEBUG ("Scanning for last sync point between:%" G_GINT64_FORMAT
- " and the end:%" G_GINT64_FORMAT, scan_offset, total_bytes);
-
- while ((!done) && (scan_offset < total_bytes)) {
- buf = NULL;
- ret = gst_pad_pull_range (base->sinkpad, scan_offset,
- 50 * MPEGTS_MAX_PACKETSIZE, &buf);
-
- if (ret != GST_FLOW_OK)
- goto beach;
-
- mpegts_packetizer_push (base->packetizer, buf);
- done = process_section (base);
- scan_offset += 50 * MPEGTS_MAX_PACKETSIZE;
- }
-
- mpegts_packetizer_clear (base->packetizer);
-
- ret = process_pcr (base, scan_offset - 50 * MPEGTS_MAX_PACKETSIZE, &final,
- 10, FALSE);
-
- if (ret != GST_FLOW_OK) {
- GST_DEBUG ("Problem getting last PCRs");
- goto beach;
- }
-
- verify_timestamps (base, &initial, &final);
-
- demux->duration = demux->segment.duration =
- demux->last_pcr.gsttime - demux->first_pcr.gsttime;
- GST_DEBUG ("Done, duration:%" GST_TIME_FORMAT,
- GST_TIME_ARGS (demux->duration));
-
-beach:
-
- mpegts_packetizer_clear (base->packetizer);
- /* Remove current program */
- if (base->pat) {
- gst_structure_free (base->pat);
- base->pat = NULL;
- }
- mpegts_base_remove_program (base, demux->current_program_number);
- demux->program = NULL;
-
- return ret;
-}
-
-static GstFlowReturn
-process_pcr (MpegTSBase * base, guint64 initoff, TSPcrOffset * pcroffset,
- guint numpcr, gboolean isinitial)
-{
- GstTSDemux *demux = GST_TS_DEMUX (base);
- GstFlowReturn ret = GST_FLOW_OK;
- MpegTSBaseProgram *program;
- GstBuffer *buf;
- guint i, nbpcr = 0;
- guint32 pcrmask, pcrpattern;
- guint64 pcrs[50];
- guint64 pcroffs[50];
- GstByteReader br;
-
- GST_DEBUG ("initoff:%" G_GUINT64_FORMAT ", numpcr:%d, isinitial:%d",
- initoff, numpcr, isinitial);
-
- /* Get the program */
- program = demux->program;
- if (G_UNLIKELY (program == NULL)) {
- GST_DEBUG ("No program set, can not keep processing pcr");
-
- ret = GST_FLOW_ERROR;
- goto beach;
- }
-
- /* First find the first X PCR */
- nbpcr = 0;
- /* Mask/pattern is PID:PCR_PID, AFC&0x02 */
- /* sync_byte (0x47) : 8bits => 0xff
- * transport_error_indicator : 1bit ACTIVATE
- * payload_unit_start_indicator : 1bit IGNORE
- * transport_priority : 1bit IGNORE
- * PID : 13bit => 0x9f 0xff
- * transport_scrambling_control : 2bit
- * adaptation_field_control : 2bit
- * continuity_counter : 4bit => 0x30
- */
- pcrmask = 0xff9fff20;
- pcrpattern = 0x47000020 | ((program->pcr_pid & 0x1fff) << 8);
-
- for (i = 0; (i < 20) && (nbpcr < numpcr); i++) {
- guint offset;
- GstMapInfo map;
- gsize size;
-
- buf = NULL;
- ret = gst_pad_pull_range (base->sinkpad,
- initoff + i * 500 * base->packetsize, 500 * base->packetsize, &buf);
-
- if (G_UNLIKELY (ret != GST_FLOW_OK))
- goto beach;
-
- gst_buffer_map (buf, &map, GST_MAP_READ);
- size = map.size;
-
- gst_byte_reader_init (&br, map.data, map.size);
-
- offset = 0;
-
- resync:
- offset = gst_byte_reader_masked_scan_uint32 (&br, 0xff000000, 0x47000000,
- 0, base->packetsize);
-
- if (offset == -1) {
- gst_buffer_unmap (buf, &map);
- continue;
- }
-
- while ((nbpcr < numpcr) && (size >= base->packetsize)) {
-
- guint32 header = GST_READ_UINT32_BE (br.data + offset);
-
- if ((header >> 24) != 0x47)
- goto resync;
-
- if ((header & pcrmask) != pcrpattern) {
- /* Move offset forward by 1 packet */
- size -= base->packetsize;
- offset += base->packetsize;
- continue;
- }
-
- /* Potential PCR */
-/* GST_DEBUG ("offset %" G_GUINT64_FORMAT, GST_BUFFER_OFFSET (buf) + offset);
- GST_MEMDUMP ("something", GST_BUFFER_DATA (buf) + offset, 16);*/
- if ((*(br.data + offset + 5)) & MPEGTS_AFC_PCR_FLAG) {
- guint64 lpcr = mpegts_packetizer_compute_pcr (br.data + offset + 6);
-
- GST_INFO ("Found PCR %" G_GUINT64_FORMAT " %" GST_TIME_FORMAT
- " at offset %" G_GUINT64_FORMAT, lpcr,
- GST_TIME_ARGS (PCRTIME_TO_GSTTIME (lpcr)),
- GST_BUFFER_OFFSET (buf) + offset);
- pcrs[nbpcr] = lpcr;
- pcroffs[nbpcr] = GST_BUFFER_OFFSET (buf) + offset;
- /* Safeguard against bogus PCR (by detecting if it's the same as the
- * previous one or wheter the difference with the previous one is
- * greater than 10mins */
- if (nbpcr > 1) {
- if (pcrs[nbpcr] == pcrs[nbpcr - 1]) {
- GST_WARNING ("Found same PCR at different offset");
- } else if (pcrs[nbpcr] < pcrs[nbpcr - 1]) {
- GST_WARNING ("Found PCR wraparound");
- nbpcr += 1;
- } else if ((pcrs[nbpcr] - pcrs[nbpcr - 1]) >
- (guint64) 10 * 60 * 27000000) {
- GST_WARNING ("PCR differs with previous PCR by more than 10 mins");
- } else
- nbpcr += 1;
- } else
- nbpcr += 1;
- }
- /* Move offset forward by 1 packet */
- size -= base->packetsize;
- offset += base->packetsize;
- }
- gst_buffer_unmap (buf, &map);
- }
-
-beach:
- GST_DEBUG ("Found %d PCR", nbpcr);
- if (nbpcr) {
- if (isinitial) {
- pcroffset->pcr = pcrs[0];
- pcroffset->offset = pcroffs[0];
- } else {
- pcroffset->pcr = pcrs[nbpcr - 1];
- pcroffset->offset = pcroffs[nbpcr - 1];
- }
- if (nbpcr > 1) {
- GST_DEBUG ("pcrdiff:%" GST_TIME_FORMAT " offsetdiff %" G_GUINT64_FORMAT,
- GST_TIME_ARGS (PCRTIME_TO_GSTTIME (pcrs[nbpcr - 1] - pcrs[0])),
- pcroffs[nbpcr - 1] - pcroffs[0]);
- GST_DEBUG ("Estimated bitrate %" G_GUINT64_FORMAT,
- gst_util_uint64_scale (GST_SECOND, pcroffs[nbpcr - 1] - pcroffs[0],
- PCRTIME_TO_GSTTIME (pcrs[nbpcr - 1] - pcrs[0])));
- GST_DEBUG ("Average PCR interval %" G_GUINT64_FORMAT,
- (pcroffs[nbpcr - 1] - pcroffs[0]) / nbpcr);
- }
- }
- /* Swallow any errors if it happened during the end scanning */
- if (!isinitial)
- ret = GST_FLOW_OK;
- return ret;
-}
-
-
static inline void
@@ -1859,17 +1093,7 @@ gst_ts_demux_record_pcr (GstTSDemux * demux, TSDemuxStream * stream,
G_GUINT64_FORMAT, bs->pid,
GST_TIME_ARGS (PCRTIME_TO_GSTTIME (pcr)), offset);
- if (G_LIKELY (bs->pid == demux->program->pcr_pid)) {
- demux->cur_pcr.gsttime = GST_CLOCK_TIME_NONE;
- demux->cur_pcr.offset = offset;
- demux->cur_pcr.pcr = pcr;
- /* set first_pcr in push mode */
- if (G_UNLIKELY (!demux->first_pcr.gsttime == GST_CLOCK_TIME_NONE)) {
- demux->first_pcr.gsttime = PCRTIME_TO_GSTTIME (pcr);
- demux->first_pcr.offset = offset;
- demux->first_pcr.pcr = pcr;
- }
- }
+ /* FIXME : packetizer should record this */
if (G_UNLIKELY (demux->emit_statistics)) {
GstStructure *st;
@@ -1893,6 +1117,8 @@ gst_ts_demux_record_opcr (GstTSDemux * demux, TSDemuxStream * stream,
G_GUINT64_FORMAT, bs->pid,
GST_TIME_ARGS (PCRTIME_TO_GSTTIME (opcr)), offset);
+ /* FIXME : packetizer should record this */
+
if (G_UNLIKELY (demux->emit_statistics)) {
GstStructure *st;
st = gst_structure_new_id_empty (QUARK_TSDEMUX);
@@ -1932,8 +1158,8 @@ gst_ts_demux_record_pts (GstTSDemux * demux, TSDemuxStream * stream,
/* Compute PTS in GstClockTime */
stream->raw_pts = pts;
- stream->pts =
- MPEGTIME_TO_GSTTIME (pts + stream->nb_pts_rollover * PTS_DTS_MAX_VALUE);
+ stream->fixed_pts = pts + stream->nb_pts_rollover * PTS_DTS_MAX_VALUE;
+ stream->pts = MPEGTIME_TO_GSTTIME (stream->fixed_pts);
GST_LOG ("pid 0x%04x Stored PTS %" G_GUINT64_FORMAT " (%" GST_TIME_FORMAT ")",
bs->pid, stream->raw_pts, GST_TIME_ARGS (stream->pts));
@@ -1978,8 +1204,8 @@ gst_ts_demux_record_dts (GstTSDemux * demux, TSDemuxStream * stream,
/* Compute DTS in GstClockTime */
stream->raw_dts = dts;
- stream->dts =
- MPEGTIME_TO_GSTTIME (dts + stream->nb_dts_rollover * PTS_DTS_MAX_VALUE);
+ stream->fixed_dts = dts + stream->nb_dts_rollover * PTS_DTS_MAX_VALUE;
+ stream->dts = MPEGTIME_TO_GSTTIME (stream->fixed_dts);
GST_LOG ("pid 0x%04x Stored DTS %" G_GUINT64_FORMAT " (%" GST_TIME_FORMAT ")",
bs->pid, stream->raw_dts, GST_TIME_ARGS (stream->dts));
@@ -1996,32 +1222,6 @@ gst_ts_demux_record_dts (GstTSDemux * demux, TSDemuxStream * stream,
}
}
-static inline GstClockTime
-calc_gsttime_from_pts (TSPcrOffset * start, guint64 pts)
-{
- GstClockTime time = start->gsttime - PCRTIME_TO_GSTTIME (start->pcr);
-
- if (start->pcr > pts * 300)
- time += PCRTIME_TO_GSTTIME (PCR_MAX_VALUE) + MPEGTIME_TO_GSTTIME (pts);
- else
- time += MPEGTIME_TO_GSTTIME (pts);
-
- return time;
-}
-
-#if 0
-static gint
-TSPcrOffset_find_offset (gconstpointer a, gconstpointer b, gpointer user_data)
-{
- if (((TSPcrOffset *) a)->offset < ((TSPcrOffset *) b)->offset)
- return -1;
- else if (((TSPcrOffset *) a)->offset > ((TSPcrOffset *) b)->offset)
- return 1;
- else
- return 0;
-}
-#endif
-
static GstFlowReturn
gst_ts_demux_parse_pes_header (GstTSDemux * demux, TSDemuxStream * stream)
{
@@ -2057,83 +1257,19 @@ gst_ts_demux_parse_pes_header (GstTSDemux * demux, TSDemuxStream * stream)
if (header.PTS != -1) {
gst_ts_demux_record_pts (demux, stream, header.PTS, bufferoffset);
-#if 0
- /* WTH IS THIS ??? */
- if (demux->index_pcr.offset + PCR_WRAP_SIZE_128KBPS + 1000 * 128 < offset
- || (demux->index_pcr.offset > offset)) {
- /* find next entry */
- TSPcrOffset *next;
- demux->index_pcr.offset = offset;
- next = gst_util_array_binary_search (demux->index->data,
- demux->index_size, sizeof (*next), TSPcrOffset_find_offset,
- GST_SEARCH_MODE_BEFORE, &demux->index_pcr, NULL);
- if (next) {
- GST_INFO ("new index_pcr %" GST_TIME_FORMAT " offset: %"
- G_GINT64_FORMAT, GST_TIME_ARGS (next->gsttime), next->offset);
-
- demux->index_pcr = *next;
- }
- }
- time = calc_gsttime_from_pts (&demux->index_pcr, pts);
-#endif
-
GST_DEBUG_OBJECT (base,
"stream PTS %" GST_TIME_FORMAT " DTS %" GST_TIME_FORMAT,
GST_TIME_ARGS (stream->pts),
GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (header.DTS)));
- /* FIXME : This will only work if the PES header is contained
- * at the beginning of an incoming GstBuffer */
- /* FIXME : Handle wrap-around ? */
- if (base->upstream_live && GST_CLOCK_TIME_IS_VALID (origts)
- && !GST_CLOCK_TIME_IS_VALID (demux->pts_delta)) {
- if (GST_CLOCK_TIME_IS_VALID (MPEGTIME_TO_GSTTIME (header.DTS)))
- demux->pts_delta = MPEGTIME_TO_GSTTIME (header.DTS) - origts;
- else
- demux->pts_delta = stream->pts - origts;
- GST_DEBUG_OBJECT (base, "buffer timestamp %" GST_TIME_FORMAT,
- GST_TIME_ARGS (origts));
- GST_DEBUG_OBJECT (base, "delta %" GST_TIME_FORMAT,
- GST_TIME_ARGS (demux->pts_delta));
- }
-
- /* safe default if insufficient upstream info */
- if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (base->in_gap) &&
- GST_CLOCK_TIME_IS_VALID (base->first_buf_ts) &&
- base->mode == BASE_MODE_PUSHING &&
- base->segment.format == GST_FORMAT_TIME)) {
- /* Find the earliest current PTS we're going to push */
- GstClockTime firstpts = GST_CLOCK_TIME_NONE;
- GList *tmp;
-
- for (tmp = demux->program->stream_list; tmp; tmp = tmp->next) {
- TSDemuxStream *pstream = (TSDemuxStream *) tmp->data;
- if (!GST_CLOCK_TIME_IS_VALID (firstpts) || pstream->pts < firstpts)
- firstpts = pstream->pts;
- }
+ {
+ MpegTSPacketizer2 *packetizer = base->packetizer;
- base->in_gap = base->first_buf_ts - firstpts;
- GST_DEBUG_OBJECT (base, "upstream segment start %" GST_TIME_FORMAT
- ", first buffer timestamp: %" GST_TIME_FORMAT
- ", first PTS: %" GST_TIME_FORMAT
- ", interpolation gap: %" GST_TIME_FORMAT,
- GST_TIME_ARGS (base->segment.start),
- GST_TIME_ARGS (base->first_buf_ts), GST_TIME_ARGS (firstpts),
- GST_TIME_ARGS (base->in_gap));
+ GST_BUFFER_TIMESTAMP (stream->pendingbuffers[0]) =
+ mpegts_packetizer_pts_to_ts (packetizer, stream->pts);
}
-
- if (!GST_CLOCK_TIME_IS_VALID (base->in_gap))
- base->in_gap = 0;
-
- if (base->upstream_live) {
- if (GST_CLOCK_TIME_IS_VALID (demux->pts_delta))
- GST_BUFFER_TIMESTAMP (buf) = stream->pts - demux->pts_delta;
- else
- GST_BUFFER_TIMESTAMP (buf) = GST_CLOCK_TIME_NONE;
- } else
- GST_BUFFER_TIMESTAMP (buf) = stream->pts + base->in_gap;
GST_DEBUG ("buf %" GST_TIME_FORMAT,
- GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (stream->pendingbuffers[0])));
}
if (header.DTS != -1)
@@ -2142,7 +1278,10 @@ gst_ts_demux_parse_pes_header (GstTSDemux * demux, TSDemuxStream * stream)
gst_buffer_unmap (buf, &map);
/* Remove PES headers */
- GST_DEBUG ("Moving data forward by %d bytes", header.header_size);
+ GST_DEBUG ("Moving data forward by %d bytes (packet_size:%d, have:%d)",
+ header.header_size, header.packet_length,
+ GST_BUFFER_SIZE (stream->pendingbuffers[0]));
+ stream->expected_size = header.packet_length;
gst_buffer_resize (buf, header.header_size, map.size - header.header_size);
/* FIXME : responsible for switching to PENDING_PACKET_BUFFER and
@@ -2206,12 +1345,14 @@ gst_ts_demux_queue_data (GstTSDemux * demux, TSDemuxStream * stream,
GST_LOG ("HEADER: appending data to array");
/* Append to the array */
stream->pendingbuffers[stream->nbpending++] = buf;
+ stream->current_size += GST_BUFFER_SIZE (buf);
/* parse the header */
gst_ts_demux_parse_pes_header (demux, stream);
} else if (stream->state == PENDING_PACKET_BUFFER) {
GST_LOG ("BUFFER: appending data to bufferlist");
stream->currentlist = g_list_prepend (stream->currentlist, buf);
+ stream->current_size += GST_BUFFER_SIZE (buf);
}
@@ -2222,86 +1363,73 @@ static void
calculate_and_push_newsegment (GstTSDemux * demux, TSDemuxStream * stream)
{
MpegTSBase *base = (MpegTSBase *) demux;
- GstEvent *newsegmentevent;
- gint64 start = 0, stop = GST_CLOCK_TIME_NONE, position = 0;
- GstClockTime firstpts = GST_CLOCK_TIME_NONE;
+ GstClockTime lowest_pts = GST_CLOCK_TIME_NONE;
+ GstClockTime firstts = 0;
GList *tmp;
GST_DEBUG ("Creating new newsegment for stream %p", stream);
- /* Outgoing newsegment values
- * start : The first/start PTS
- * stop : The last PTS (or -1)
- * position : The stream time corresponding to start
- *
- * Except for live mode with incoming GST_TIME_FORMAT newsegment where
- * it is the same values as that incoming newsegment (and we convert the
- * PTS to that remote clock).
- */
+ /* 1) If we need to calculate an update newsegment, do it
+ * 2) If we need to calculate a new newsegment, do it
+ * 3) If an update_segment is valid, push it
+ * 4) If a newsegment is valid, push it */
+
+ /* Speedup : if we don't need to calculate anything, go straight to pushing */
+ if (!demux->calculate_update_segment && demux->segment_event)
+ goto push_new_segment;
+ /* Calculate the 'new_start' value, used for both updates and newsegment */
for (tmp = demux->program->stream_list; tmp; tmp = tmp->next) {
TSDemuxStream *pstream = (TSDemuxStream *) tmp->data;
- if (!GST_CLOCK_TIME_IS_VALID (firstpts) || pstream->pts < firstpts)
- firstpts = pstream->pts;
+ if (GST_CLOCK_TIME_IS_VALID (pstream->pts)) {
+ if (!GST_CLOCK_TIME_IS_VALID (lowest_pts) || pstream->pts < lowest_pts)
+ lowest_pts = pstream->pts;
+ }
+ if (GST_CLOCK_TIME_IS_VALID (pstream->dts)) {
+ if (!GST_CLOCK_TIME_IS_VALID (lowest_pts) || pstream->dts < lowest_pts)
+ lowest_pts = pstream->dts;
+ }
}
- if (base->mode == BASE_MODE_PUSHING) {
- /* FIXME : We're just ignore the upstream format for the time being */
- /* FIXME : We should use base->segment.format and a upstream latency query
- * to decide if we need to use live values or not */
- GST_DEBUG ("push-based. base Segment start:%" GST_TIME_FORMAT " duration:%"
- GST_TIME_FORMAT ", stop:%" GST_TIME_FORMAT ", time:%" GST_TIME_FORMAT,
- GST_TIME_ARGS (base->segment.start),
- GST_TIME_ARGS (base->segment.duration),
- GST_TIME_ARGS (base->segment.stop), GST_TIME_ARGS (base->segment.time));
- GST_DEBUG ("push-based. demux Segment start:%" GST_TIME_FORMAT " duration:%"
- GST_TIME_FORMAT ", stop:%" GST_TIME_FORMAT ", time:%" GST_TIME_FORMAT,
- GST_TIME_ARGS (demux->segment.start),
- GST_TIME_ARGS (demux->segment.duration),
- GST_TIME_ARGS (demux->segment.stop),
- GST_TIME_ARGS (demux->segment.time));
-
- GST_DEBUG ("stream pts: %" GST_TIME_FORMAT " first pts: %" GST_TIME_FORMAT,
- GST_TIME_ARGS (stream->pts), GST_TIME_ARGS (firstpts));
-
- if (base->segment.format == GST_FORMAT_TIME) {
- start = base->segment.start;
- stop = base->segment.stop;
- if (!base->upstream_live) {
- /* Shift the start depending on our position in the stream */
- start += firstpts + base->in_gap - base->first_buf_ts;
- }
+ if (GST_CLOCK_TIME_IS_VALID (lowest_pts))
+ firstts = mpegts_packetizer_pts_to_ts (base->packetizer, lowest_pts);
+ GST_DEBUG ("lowest_pts %" G_GUINT64_FORMAT " => clocktime %" GST_TIME_FORMAT,
+ lowest_pts, GST_TIME_ARGS (firstts));
+
+ if (demux->calculate_update_segment) {
+ GST_DEBUG ("Calculating update segment");
+ /* If we have a valid segment, create an update of that */
+ if (demux->segment.format == GST_FORMAT_TIME) {
+ GST_DEBUG ("Re-using segment " SEGMENT_FORMAT,
+ SEGMENT_ARGS (demux->segment));
+ demux->update_segment = gst_event_new_segment (&demux->segment);
+ GST_EVENT_SRC (demux->update_segment) = gst_object_ref (demux);
}
- position = start;
- } else {
- /* pull mode */
- GST_DEBUG ("pull-based. Segment start:%" GST_TIME_FORMAT " duration:%"
- GST_TIME_FORMAT ", time:%" GST_TIME_FORMAT,
- GST_TIME_ARGS (demux->segment.start),
- GST_TIME_ARGS (demux->segment.duration),
- GST_TIME_ARGS (demux->segment.time));
-
- GST_DEBUG ("firstpcr gsttime : %" GST_TIME_FORMAT,
- GST_TIME_ARGS (demux->first_pcr.gsttime));
-
- /* FIXME : This is not entirely correct. We should be using the PTS time
- * realm and not the PCR one. Doesn't matter *too* much if PTS/PCR values
- * aren't too far apart, but still. */
- start = demux->first_pcr.gsttime + demux->segment.start;
- stop = demux->first_pcr.gsttime + demux->segment.duration;
- position = demux->segment.time;
+ demux->calculate_update_segment = FALSE;
}
- GST_DEBUG ("new segment: start: %" GST_TIME_FORMAT " stop: %"
- GST_TIME_FORMAT " time: %" GST_TIME_FORMAT, GST_TIME_ARGS (start),
- GST_TIME_ARGS (stop), GST_TIME_ARGS (position));
+ if (!demux->segment_event) {
+ GST_DEBUG ("Calculating actual segment");
+ /* FIXME : Set proper values */
+ demux->segment_event = gst_event_new_segment (&demux->segment);
+ GST_EVENT_SRC (demux->segment_event) = gst_object_ref (demux);
+ }
- newsegmentevent = gst_event_new_segment (&demux->segment);
+push_new_segment:
+ if (demux->update_segment) {
+ GST_DEBUG_OBJECT (stream->pad, "Pushing update segment");
+ gst_event_ref (demux->update_segment);
+ gst_pad_push_event (stream->pad, demux->update_segment);
+ }
- push_event ((MpegTSBase *) demux, newsegmentevent);
+ if (demux->segment_event) {
+ GST_DEBUG_OBJECT (stream->pad, "Pushing newsegment event");
+ gst_event_ref (demux->segment_event);
+ gst_pad_push_event (stream->pad, demux->segment_event);
+ }
- demux->need_newsegment = FALSE;
+ stream->need_newsegment = FALSE;
}
static GstFlowReturn
@@ -2310,8 +1438,9 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream)
GstFlowReturn res = GST_FLOW_OK;
GList *tmp;
MpegTSBaseStream *bs = (MpegTSBaseStream *) stream;
- GstBuffer *buf;
- GstClockTime ts;
+ /* MpegTSBase *base = (MpegTSBase*) demux; */
+ GstBuffer *firstbuffer = NULL;
+ MpegTSPacketizer2 *packetizer = MPEG_TS_BASE_PACKETIZER (demux);
GST_DEBUG_OBJECT (stream->pad,
"stream:%p, pid:0x%04x stream_type:%d state:%d", stream, bs->pid,
@@ -2330,6 +1459,9 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream)
if (G_UNLIKELY (stream->state != PENDING_PACKET_BUFFER))
goto beach;
+ if (G_UNLIKELY (!stream->active))
+ activate_pad_for_stream (demux, stream);
+
if (G_UNLIKELY (stream->pad == NULL)) {
g_list_foreach (stream->currentlist, (GFunc) gst_buffer_unref, NULL);
g_list_free (stream->currentlist);
@@ -2337,12 +1469,11 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream)
goto beach;
}
- if (G_UNLIKELY (demux->need_newsegment))
+ if (G_UNLIKELY (stream->need_newsegment))
calculate_and_push_newsegment (demux, stream);
/* We have a confirmed buffer, let's push it out */
- GST_LOG ("Putting pending data into GstBufferList");
-
+ GST_LOG_OBJECT (stream->pad, "Putting pending data into buffer list");
stream->currentlist = g_list_reverse (stream->currentlist);
buf = (GstBuffer *) stream->currentlist->data;
@@ -2363,10 +1494,18 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream)
buf = gst_buffer_append (buf, (GstBuffer *) tmp->data);
}
- GST_BUFFER_TIMESTAMP (buf) = ts;
+ firstbuffer = gst_buffer_list_get (stream->current, 0, 0);
+
+ GST_DEBUG_OBJECT (stream->pad, "stream->pts %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (stream->pts));
+ if (GST_CLOCK_TIME_IS_VALID (stream->pts)
+ && !GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (firstbuffer)))
+ GST_BUFFER_TIMESTAMP (firstbuffer) =
+ mpegts_packetizer_pts_to_ts (packetizer, stream->pts);
+
GST_DEBUG_OBJECT (stream->pad,
- "Pushing buffer with timestamp: %" GST_TIME_FORMAT,
- GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));
+ "Pushing buffer list with timestamp: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (firstbuffer)));
res = gst_pad_push (stream->pad, buf);
GST_DEBUG_OBJECT (stream->pad, "Returned %s", gst_flow_get_name (res));
@@ -2375,13 +1514,13 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream)
beach:
/* Reset everything */
- GST_LOG ("Resetting to EMPTY");
+ GST_LOG ("Resetting to EMPTY, returning %s", gst_flow_get_name (res));
stream->state = PENDING_PACKET_EMPTY;
memset (stream->pendingbuffers, 0, TS_MAX_PENDING_BUFFERS);
stream->nbpending = 0;
- if (stream->currentlist)
- g_list_free (stream->currentlist);
- stream->currentlist = NULL;
+ stream->current = NULL;
+ stream->expected_size = 0;
+ stream->current_size = 0;
return res;
}
@@ -2422,9 +1561,14 @@ gst_ts_demux_handle_packet (GstTSDemux * demux, TSDemuxStream * stream,
GST_BUFFER_OFFSET (packet->buffer));
}
- if (packet->payload)
+ if (packet->payload && (res == GST_FLOW_OK || res == GST_FLOW_NOT_LINKED)) {
gst_ts_demux_queue_data (demux, stream, packet);
- else
+ GST_DEBUG ("current_size:%d, expected_size:%d",
+ stream->current_size, stream->expected_size);
+ /* Finally check if the data we queued completes a packet */
+ if (stream->expected_size && stream->current_size == stream->expected_size)
+ res = gst_ts_demux_push_pending_data (demux, stream);
+ } else
gst_buffer_unref (packet->buffer);
return res;
@@ -2435,7 +1579,6 @@ gst_ts_demux_flush (MpegTSBase * base)
{
GstTSDemux *demux = GST_TS_DEMUX_CAST (base);
- demux->need_newsegment = TRUE;
gst_ts_demux_flush_streams (demux);
}
@@ -2471,5 +1614,5 @@ gst_ts_demux_plugin_init (GstPlugin * plugin)
init_pes_parser ();
return gst_element_register (plugin, "tsdemux",
- GST_RANK_SECONDARY, GST_TYPE_TS_DEMUX);
+ GST_RANK_PRIMARY, GST_TYPE_TS_DEMUX);
}
diff --git a/gst/mpegtsdemux/tsdemux.h b/gst/mpegtsdemux/tsdemux.h
index 5eaaa0900..d23e9d2ee 100644
--- a/gst/mpegtsdemux/tsdemux.h
+++ b/gst/mpegtsdemux/tsdemux.h
@@ -48,14 +48,6 @@ G_BEGIN_DECLS
#define GST_TS_DEMUX_CAST(obj) ((GstTSDemux*) obj)
typedef struct _GstTSDemux GstTSDemux;
typedef struct _GstTSDemuxClass GstTSDemuxClass;
-typedef struct _TSPcrOffset TSPcrOffset;
-
-struct _TSPcrOffset
-{
- guint64 gsttime;
- guint64 pcr;
- guint64 offset;
-};
struct _GstTSDemux
{
@@ -69,23 +61,18 @@ struct _GstTSDemux
/*< private >*/
MpegTSBaseProgram *program; /* Current program */
guint current_program_number;
- gboolean need_newsegment;
- /* Downstream segment */
+ /* segments to be sent */
GstSegment segment;
- GstClockTime duration; /* Total duration */
+ GstEvent *segment_event;
- /* pcr wrap and seeking */
- GArray *index;
- gint index_size;
- TSPcrOffset first_pcr;
- TSPcrOffset last_pcr;
- TSPcrOffset cur_pcr;
- TSPcrOffset index_pcr;
+ /* Set when program change */
+ gboolean calculate_update_segment;
+ /* update segment is */
+ GstEvent *update_segment;
- /* LIVE MODE ONLY */
- /* Delta between incoming ts and PTS */
- GstClockTime pts_delta;
+ /* Full stream duration */
+ GstClockTime duration;
};
struct _GstTSDemuxClass
diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c
index 0be16b3b8..e11a568a4 100644
--- a/gst/mxf/mxfdemux.c
+++ b/gst/mxf/mxfdemux.c
@@ -2385,7 +2385,7 @@ gst_mxf_demux_find_essence_element (GstMXFDemux * demux,
GstFlowReturn ret = GST_FLOW_OK;
guint64 old_offset = demux->offset;
GstMXFDemuxPartition *old_partition = demux->current_partition;
- guint i;
+ gint i;
GST_DEBUG_OBJECT (demux, "Trying to find essence element %" G_GINT64_FORMAT
" of track %u with body_sid %u (keyframe %d)", *position,
diff --git a/gst/mxf/mxfmpeg.c b/gst/mxf/mxfmpeg.c
index f1b74f964..30142486e 100644
--- a/gst/mxf/mxfmpeg.c
+++ b/gst/mxf/mxfmpeg.c
@@ -441,7 +441,7 @@ mxf_mpeg_is_mpeg2_keyframe (GstBuffer * buffer)
guint8 type = 0;
/* Found sync code */
- gst_byte_reader_skip (&reader, 3);
+ gst_byte_reader_skip_unchecked (&reader, 3);
if (!gst_byte_reader_get_uint8 (&reader, &type))
break;
@@ -465,9 +465,8 @@ mxf_mpeg_is_mpeg2_keyframe (GstBuffer * buffer)
return FALSE;
}
}
- } else {
- gst_byte_reader_skip (&reader, 1);
- }
+ } else if (gst_byte_reader_skip (&reader, 1) == FALSE)
+ break;
}
return FALSE;
@@ -484,7 +483,7 @@ mxf_mpeg_is_mpeg4_keyframe (GstBuffer * buffer)
guint8 type = 0;
/* Found sync code */
- gst_byte_reader_skip (&reader, 3);
+ gst_byte_reader_skip_unchecked (&reader, 3);
if (!gst_byte_reader_get_uint8 (&reader, &type))
break;
@@ -502,9 +501,8 @@ mxf_mpeg_is_mpeg4_keyframe (GstBuffer * buffer)
return FALSE;
}
}
- } else {
- gst_byte_reader_skip (&reader, 1);
- }
+ } else if (gst_byte_reader_skip (&reader, 1) == FALSE)
+ break;
}
return FALSE;
@@ -1024,7 +1022,7 @@ mxf_mpeg_is_mpeg2_frame (GstBuffer * buffer)
guint8 type = 0;
/* Found sync code */
- gst_byte_reader_skip (&reader, 3);
+ gst_byte_reader_skip_unchecked (&reader, 3);
if (!gst_byte_reader_get_uint8 (&reader, &type))
break;
@@ -1034,7 +1032,8 @@ mxf_mpeg_is_mpeg2_frame (GstBuffer * buffer)
return TRUE;
}
} else {
- gst_byte_reader_skip (&reader, 1);
+ if (gst_byte_reader_skip (&reader, 1) == FALSE)
+ break;
}
}
@@ -1052,7 +1051,7 @@ mxf_mpeg_is_mpeg4_frame (GstBuffer * buffer)
guint8 type = 0;
/* Found sync code */
- gst_byte_reader_skip (&reader, 3);
+ gst_byte_reader_skip_unchecked (&reader, 3);
if (!gst_byte_reader_get_uint8 (&reader, &type))
break;
@@ -1062,7 +1061,8 @@ mxf_mpeg_is_mpeg4_frame (GstBuffer * buffer)
return TRUE;
}
} else {
- gst_byte_reader_skip (&reader, 1);
+ if (gst_byte_reader_skip (&reader, 1) == FALSE)
+ break;
}
}
diff --git a/gst/removesilence/vad_private.c b/gst/removesilence/vad_private.c
index f187a0614..0b8653103 100644
--- a/gst/removesilence/vad_private.c
+++ b/gst/removesilence/vad_private.c
@@ -74,7 +74,7 @@ vad_new (guint64 hysteresis)
void
vad_reset (VADFilter * vad)
{
- memset (vad, 0, sizeof (vad));
+ memset (vad, 0, sizeof (*vad));
vad->cqueue.base.s = vad->vad_buffer;
vad->cqueue.tail.a = vad->cqueue.head.a = 0;
vad->cqueue.size = VAD_BUFFER_SIZE;
diff --git a/gst/rtpvp8/gstrtpvp8depay.c b/gst/rtpvp8/gstrtpvp8depay.c
index 4c163fa70..48a17ab56 100644
--- a/gst/rtpvp8/gstrtpvp8depay.c
+++ b/gst/rtpvp8/gstrtpvp8depay.c
@@ -153,8 +153,8 @@ gst_rtp_vp8_depay_process (GstRTPBaseDepayload * depay, GstBuffer * buf)
/* Check L optional header */
if ((data[1] & 0x40) != 0)
offset++;
- /* Check T optional header */
- if ((data[1] & 0x20) != 0)
+ /* Check T or K optional headers */
+ if ((data[1] & 0x20) != 0 || (data[1] & 0x10) != 0)
offset++;
}
diff --git a/gst/rtpvp8/gstrtpvp8pay.c b/gst/rtpvp8/gstrtpvp8pay.c
index 082de2c3e..8907552cc 100644
--- a/gst/rtpvp8/gstrtpvp8pay.c
+++ b/gst/rtpvp8/gstrtpvp8pay.c
@@ -323,7 +323,7 @@ gst_rtp_vp8_create_header_buffer (GstRtpVP8Pay * self, guint8 partid,
if (self->picture_id_mode != VP8_PAY_NO_PICTURE_ID) {
/* Enable X=1 */
p[0] |= 0x80;
- /* X: I=1,L=0,T=0,RSVA=0 */
+ /* X: I=1,L=0,T=0,K=0,RSV=0 */
p[1] = 0x80;
if (self->picture_id_mode == VP8_PAY_PICTURE_ID_7BITS) {
/* I: 7 bit picture_id */
diff --git a/gst/siren/Makefile.am b/gst/siren/Makefile.am
index 2be9ede49..c6d1d8cba 100644
--- a/gst/siren/Makefile.am
+++ b/gst/siren/Makefile.am
@@ -10,7 +10,7 @@ libgstsiren_la_SOURCES = gstsiren.c \
libgstsiren_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) \
$(GST_CFLAGS)
-libgstsiren_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstrtp-@GST_MAJORMINOR@ \
+libgstsiren_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-@GST_MAJORMINOR@ \
$(GST_BASE_LIBS) $(GST_LIBS) $(LIBM)
libgstsiren_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
libgstsiren_la_LIBTOOLFLAGS = --tag=disable-static
diff --git a/gst/siren/gstsirendec.c b/gst/siren/gstsirendec.c
index 2e517199f..9dd12c359 100644
--- a/gst/siren/gstsirendec.c
+++ b/gst/siren/gstsirendec.c
@@ -69,14 +69,14 @@ enum
ARG_0,
};
-static void gst_siren_dec_finalize (GObject * object);
-
-static GstStateChangeReturn
-gst_siren_change_state (GstElement * element, GstStateChange transition);
-
-static gboolean gst_siren_dec_sink_setcaps (GstPad * pad, GstCaps * caps);
-static gboolean gst_siren_dec_sink_event (GstPad * pad, GstEvent * event);
-static GstFlowReturn gst_siren_dec_chain (GstPad * pad, GstBuffer * buf);
+static gboolean gst_siren_dec_start (GstAudioDecoder * dec);
+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,
+ GstAdapter * adapter, gint * offset, gint * length);
+static GstFlowReturn gst_siren_dec_handle_frame (GstAudioDecoder * dec,
+ GstBuffer * buffer);
static void
_do_init (GType type)
@@ -84,8 +84,8 @@ _do_init (GType type)
GST_DEBUG_CATEGORY_INIT (sirendec_debug, "sirendec", 0, "sirendec");
}
-GST_BOILERPLATE_FULL (GstSirenDec, gst_siren_dec, GstElement,
- GST_TYPE_ELEMENT, _do_init);
+GST_BOILERPLATE_FULL (GstSirenDec, gst_siren_dec, GstAudioDecoder,
+ GST_TYPE_AUDIO_DECODER, _do_init);
static void
gst_siren_dec_base_init (gpointer klass)
@@ -106,17 +106,15 @@ gst_siren_dec_base_init (gpointer klass)
static void
gst_siren_dec_class_init (GstSirenDecClass * klass)
{
- GObjectClass *gobject_class;
- GstElementClass *gstelement_class;
-
- gobject_class = (GObjectClass *) klass;
- gstelement_class = (GstElementClass *) klass;
+ GstAudioDecoderClass *base_class = GST_AUDIO_DECODER_CLASS (klass);
GST_DEBUG ("Initializing Class");
- gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_siren_dec_finalize);
-
- gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_siren_change_state);
+ base_class->start = GST_DEBUG_FUNCPTR (gst_siren_dec_start);
+ base_class->stop = GST_DEBUG_FUNCPTR (gst_siren_dec_stop);
+ base_class->set_format = GST_DEBUG_FUNCPTR (gst_siren_dec_set_format);
+ base_class->parse = GST_DEBUG_FUNCPTR (gst_siren_dec_parse);
+ base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_siren_dec_handle_frame);
GST_DEBUG ("Class Init done");
}
@@ -124,119 +122,103 @@ gst_siren_dec_class_init (GstSirenDecClass * klass)
static void
gst_siren_dec_init (GstSirenDec * dec, GstSirenDecClass * klass)
{
+}
- GST_DEBUG_OBJECT (dec, "Initializing");
- dec->decoder = Siren7_NewDecoder (16000);;
-
- dec->sinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink");
- dec->srcpad = gst_pad_new_from_static_template (&srctemplate, "src");
+static gboolean
+gst_siren_dec_start (GstAudioDecoder * dec)
+{
+ GstSirenDec *sdec = GST_SIREN_DEC (dec);
- gst_pad_set_setcaps_function (dec->sinkpad,
- GST_DEBUG_FUNCPTR (gst_siren_dec_sink_setcaps));
- gst_pad_set_event_function (dec->sinkpad,
- GST_DEBUG_FUNCPTR (gst_siren_dec_sink_event));
- gst_pad_set_chain_function (dec->sinkpad,
- GST_DEBUG_FUNCPTR (gst_siren_dec_chain));
+ GST_DEBUG_OBJECT (dec, "start");
- gst_element_add_pad (GST_ELEMENT (dec), dec->sinkpad);
- gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad);
+ sdec->decoder = Siren7_NewDecoder (16000);;
- dec->adapter = gst_adapter_new ();
+ /* no flushing please */
+ gst_audio_decoder_set_drainable (dec, FALSE);
- GST_DEBUG_OBJECT (dec, "Init done");
+ return TRUE;
}
-static void
-gst_siren_dec_finalize (GObject * object)
+static gboolean
+gst_siren_dec_stop (GstAudioDecoder * dec)
{
- GstSirenDec *dec = GST_SIREN_DEC (object);
+ GstSirenDec *sdec = GST_SIREN_DEC (dec);
- GST_DEBUG_OBJECT (dec, "Finalize");
+ GST_DEBUG_OBJECT (dec, "stop");
- Siren7_CloseDecoder (dec->decoder);
- g_object_unref (dec->adapter);
+ Siren7_CloseDecoder (sdec->decoder);
- G_OBJECT_CLASS (parent_class)->finalize (object);
+ return TRUE;
}
static gboolean
-gst_siren_dec_sink_setcaps (GstPad * pad, GstCaps * caps)
+gst_siren_dec_negotiate (GstSirenDec * dec)
{
- GstSirenDec *dec;
gboolean res;
GstCaps *outcaps;
- dec = GST_SIREN_DEC (GST_PAD_PARENT (pad));
-
outcaps = gst_static_pad_template_get_caps (&srctemplate);
- res = gst_pad_set_caps (dec->srcpad, outcaps);
+ res = gst_pad_set_caps (GST_AUDIO_DECODER_SRC_PAD (dec), outcaps);
gst_caps_unref (outcaps);
return res;
}
static gboolean
-gst_siren_dec_sink_event (GstPad * pad, GstEvent * event)
+gst_siren_dec_set_format (GstAudioDecoder * bdec, GstCaps * caps)
{
GstSirenDec *dec;
- gboolean res;
- dec = GST_SIREN_DEC (GST_PAD_PARENT (pad));
-
- switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_EOS:
- gst_adapter_clear (dec->adapter);
- res = gst_pad_push_event (dec->srcpad, event);
- break;
- case GST_EVENT_FLUSH_STOP:
- gst_adapter_clear (dec->adapter);
- res = gst_pad_push_event (dec->srcpad, event);
- break;
- default:
- res = gst_pad_push_event (dec->srcpad, event);
- break;
+ dec = GST_SIREN_DEC (bdec);
+
+ return gst_siren_dec_negotiate (dec);
+}
+
+static GstFlowReturn
+gst_siren_dec_parse (GstAudioDecoder * dec, GstAdapter * adapter,
+ gint * offset, gint * length)
+{
+ gint size;
+ GstFlowReturn ret;
+
+ size = gst_adapter_available (adapter);
+ g_return_val_if_fail (size > 0, GST_FLOW_ERROR);
+
+ /* accept any multiple of frames */
+ if (size > 40) {
+ ret = GST_FLOW_OK;
+ *offset = 0;
+ *length = size - (size % 40);
+ } else {
+ ret = GST_FLOW_UNEXPECTED;
}
- return res;
+
+ return ret;
}
static GstFlowReturn
-gst_siren_dec_chain (GstPad * pad, GstBuffer * buf)
+gst_siren_dec_handle_frame (GstAudioDecoder * bdec, GstBuffer * buf)
{
GstSirenDec *dec;
GstFlowReturn ret = GST_FLOW_OK;
GstBuffer *out_buf;
guint8 *in_data, *out_data;
- guint8 *to_free = NULL;
guint i, size, num_frames;
gint out_size, in_size;
gint decode_ret;
- gboolean discont;
- GstClockTime timestamp;
- guint64 distance;
- GstCaps *outcaps;
-
- dec = GST_SIREN_DEC (GST_PAD_PARENT (pad));
- discont = GST_BUFFER_IS_DISCONT (buf);
- if (discont) {
- GST_DEBUG_OBJECT (dec, "received DISCONT, flush adapter");
- gst_adapter_clear (dec->adapter);
- dec->discont = TRUE;
- }
+ dec = GST_SIREN_DEC (bdec);
- gst_adapter_push (dec->adapter, buf);
+ size = GST_BUFFER_SIZE (buf);
- size = gst_adapter_available (dec->adapter);
+ GST_LOG_OBJECT (dec, "Received buffer of size %u", size);
- GST_LOG_OBJECT (dec, "Received buffer of size %u with adapter of size : %u",
- GST_BUFFER_SIZE (buf), size);
+ g_return_val_if_fail (size % 40 == 0, GST_FLOW_ERROR);
+ g_return_val_if_fail (size > 0, GST_FLOW_ERROR);
/* process 40 input bytes into 640 output bytes */
num_frames = size / 40;
- if (num_frames == 0)
- goto done;
-
/* this is the input/output size */
in_size = num_frames * 40;
out_size = num_frames * 640;
@@ -244,32 +226,19 @@ gst_siren_dec_chain (GstPad * pad, GstBuffer * buf)
GST_LOG_OBJECT (dec, "we have %u frames, %u in, %u out", num_frames, in_size,
out_size);
- /* set output caps when needed */
- if ((outcaps = GST_PAD_CAPS (dec->srcpad)) == NULL) {
- outcaps = gst_static_pad_template_get_caps (&srctemplate);
- gst_pad_set_caps (dec->srcpad, outcaps);
- gst_caps_unref (outcaps);
+ /* allow and handle un-negotiated input */
+ if (G_UNLIKELY (GST_PAD_CAPS (GST_AUDIO_DECODER_SRC_PAD (dec)) == NULL)) {
+ gst_siren_dec_negotiate (dec);
}
/* get a buffer */
- ret = gst_pad_alloc_buffer_and_set_caps (dec->srcpad, -1,
- out_size, outcaps, &out_buf);
+ ret = gst_pad_alloc_buffer_and_set_caps (GST_AUDIO_DECODER_SRC_PAD (dec), -1,
+ out_size, GST_PAD_CAPS (GST_AUDIO_DECODER_SRC_PAD (dec)), &out_buf);
if (ret != GST_FLOW_OK)
goto alloc_failed;
- /* get the timestamp for the output buffer */
- timestamp = gst_adapter_prev_timestamp (dec->adapter, &distance);
-
- /* add the amount of time taken by the distance, each frame is 20ms */
- if (timestamp != -1)
- timestamp += (distance / 40) * FRAME_DURATION;
-
- GST_LOG_OBJECT (dec,
- "timestamp %" GST_TIME_FORMAT ", distance %" G_GUINT64_FORMAT,
- GST_TIME_ARGS (timestamp), distance);
-
/* get the input data for all the frames */
- to_free = in_data = gst_adapter_take (dec->adapter, in_size);
+ in_data = GST_BUFFER_DATA (buf);
out_data = GST_BUFFER_DATA (out_buf);
for (i = 0; i < num_frames; i++) {
@@ -287,21 +256,11 @@ gst_siren_dec_chain (GstPad * pad, GstBuffer * buf)
GST_LOG_OBJECT (dec, "Finished decoding");
- /* mark discont */
- if (dec->discont) {
- GST_BUFFER_FLAG_SET (out_buf, GST_BUFFER_FLAG_DISCONT);
- dec->discont = FALSE;
- }
-
- GST_BUFFER_TIMESTAMP (out_buf) = timestamp;
- GST_BUFFER_DURATION (out_buf) = num_frames * FRAME_DURATION;
-
- ret = gst_pad_push (dec->srcpad, out_buf);
+ /* might really be multiple frames,
+ * but was treated as one for all purposes here */
+ ret = gst_audio_decoder_finish_frame (bdec, out_buf, 1);
done:
- if (to_free)
- g_free (to_free);
-
return ret;
/* ERRORS */
@@ -313,41 +272,15 @@ alloc_failed:
}
decode_error:
{
- GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL),
- ("Error decoding frame: %d", decode_ret));
- ret = GST_FLOW_ERROR;
+ GST_AUDIO_DECODER_ERROR (bdec, 1, STREAM, DECODE, (NULL),
+ ("Error decoding frame: %d", decode_ret), ret);
+ if (ret == GST_FLOW_OK)
+ gst_audio_decoder_finish_frame (bdec, NULL, 1);
gst_buffer_unref (out_buf);
goto done;
}
}
-static GstStateChangeReturn
-gst_siren_change_state (GstElement * element, GstStateChange transition)
-{
- GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
- GstSirenDec *dec = GST_SIREN_DEC (element);
-
- switch (transition) {
- case GST_STATE_CHANGE_READY_TO_PAUSED:
- dec->discont = FALSE;
- break;
- default:
- break;
- }
-
- ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
-
- switch (transition) {
- case GST_STATE_CHANGE_PAUSED_TO_READY:
- gst_adapter_clear (dec->adapter);
- break;
- default:
- break;
- }
-
- return ret;
-}
-
gboolean
gst_siren_dec_plugin_init (GstPlugin * plugin)
{
diff --git a/gst/siren/gstsirendec.h b/gst/siren/gstsirendec.h
index 7c020896f..4c42c4de7 100644
--- a/gst/siren/gstsirendec.h
+++ b/gst/siren/gstsirendec.h
@@ -24,7 +24,7 @@
#define __GST_SIREN_DEC_H__
#include <gst/gst.h>
-#include <gst/base/gstadapter.h>
+#include <gst/audio/gstaudiodecoder.h>
#include "siren7.h"
@@ -48,21 +48,15 @@ typedef struct _GstSirenDecPrivate GstSirenDecPrivate;
struct _GstSirenDec
{
- GstElement parent;
+ GstAudioDecoder parent;
/* Protected by stream lock */
SirenDecoder decoder;
-
- GstAdapter *adapter;
- gboolean discont;
-
- GstPad *sinkpad;
- GstPad *srcpad;
};
struct _GstSirenDecClass
{
- GstElementClass parent_class;
+ GstAudioDecoderClass parent_class;
};
GType gst_siren_dec_get_type (void);
diff --git a/gst/siren/gstsirenenc.c b/gst/siren/gstsirenenc.c
index a78cdb8bc..6bcf20568 100644
--- a/gst/siren/gstsirenenc.c
+++ b/gst/siren/gstsirenenc.c
@@ -69,17 +69,12 @@ enum
ARG_0,
};
-
-
-static void gst_siren_enc_finalize (GObject * object);
-
-static gboolean gst_siren_enc_sink_setcaps (GstPad * pad, GstCaps * caps);
-static gboolean gst_siren_enc_sink_event (GstPad * pad, GstEvent * event);
-
-static GstFlowReturn gst_siren_enc_chain (GstPad * pad, GstBuffer * buf);
-static GstStateChangeReturn
-gst_siren_change_state (GstElement * element, GstStateChange transition);
-
+static gboolean gst_siren_enc_start (GstAudioEncoder * enc);
+static gboolean gst_siren_enc_stop (GstAudioEncoder * enc);
+static gboolean gst_siren_enc_set_format (GstAudioEncoder * enc,
+ GstAudioInfo * info);
+static GstFlowReturn gst_siren_enc_handle_frame (GstAudioEncoder * enc,
+ GstBuffer * in_buf);
static void
_do_init (GType type)
@@ -87,8 +82,8 @@ _do_init (GType type)
GST_DEBUG_CATEGORY_INIT (sirenenc_debug, "sirenenc", 0, "sirenenc");
}
-GST_BOILERPLATE_FULL (GstSirenEnc, gst_siren_enc, GstElement,
- GST_TYPE_ELEMENT, _do_init);
+GST_BOILERPLATE_FULL (GstSirenEnc, gst_siren_enc, GstAudioEncoder,
+ GST_TYPE_AUDIO_ENCODER, _do_init);
static void
gst_siren_enc_base_init (gpointer klass)
@@ -109,17 +104,14 @@ gst_siren_enc_base_init (gpointer klass)
static void
gst_siren_enc_class_init (GstSirenEncClass * klass)
{
- GObjectClass *gobject_class;
- GstElementClass *gstelement_class;
-
- gobject_class = (GObjectClass *) klass;
- gstelement_class = (GstElementClass *) klass;
+ GstAudioEncoderClass *base_class = GST_AUDIO_ENCODER_CLASS (klass);
GST_DEBUG ("Initializing Class");
- gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_siren_enc_finalize);
-
- gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_siren_change_state);
+ base_class->start = GST_DEBUG_FUNCPTR (gst_siren_enc_start);
+ base_class->stop = GST_DEBUG_FUNCPTR (gst_siren_enc_stop);
+ base_class->set_format = GST_DEBUG_FUNCPTR (gst_siren_enc_set_format);
+ base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_siren_enc_handle_frame);
GST_DEBUG ("Class Init done");
}
@@ -127,120 +119,81 @@ gst_siren_enc_class_init (GstSirenEncClass * klass)
static void
gst_siren_enc_init (GstSirenEnc * enc, GstSirenEncClass * klass)
{
+}
- GST_DEBUG_OBJECT (enc, "Initializing");
- enc->encoder = Siren7_NewEncoder (16000);
- enc->adapter = gst_adapter_new ();
-
- enc->sinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink");
- enc->srcpad = gst_pad_new_from_static_template (&srctemplate, "src");
+static gboolean
+gst_siren_enc_start (GstAudioEncoder * enc)
+{
+ GstSirenEnc *senc = GST_SIREN_ENC (enc);
- gst_pad_set_setcaps_function (enc->sinkpad,
- GST_DEBUG_FUNCPTR (gst_siren_enc_sink_setcaps));
- gst_pad_set_event_function (enc->sinkpad,
- GST_DEBUG_FUNCPTR (gst_siren_enc_sink_event));
- gst_pad_set_chain_function (enc->sinkpad,
- GST_DEBUG_FUNCPTR (gst_siren_enc_chain));
+ GST_DEBUG_OBJECT (enc, "start");
- gst_element_add_pad (GST_ELEMENT (enc), enc->sinkpad);
- gst_element_add_pad (GST_ELEMENT (enc), enc->srcpad);
+ senc->encoder = Siren7_NewEncoder (16000);
- GST_DEBUG_OBJECT (enc, "Init done");
+ return TRUE;
}
-static void
-gst_siren_enc_finalize (GObject * object)
+static gboolean
+gst_siren_enc_stop (GstAudioEncoder * enc)
{
- GstSirenEnc *enc = GST_SIREN_ENC (object);
+ GstSirenEnc *senc = GST_SIREN_ENC (enc);
- GST_DEBUG_OBJECT (object, "Disposing");
+ GST_DEBUG_OBJECT (senc, "stop");
- Siren7_CloseEncoder (enc->encoder);
- g_object_unref (enc->adapter);
+ Siren7_CloseEncoder (senc->encoder);
- G_OBJECT_CLASS (parent_class)->finalize (object);
+ return TRUE;
}
static gboolean
-gst_siren_enc_sink_setcaps (GstPad * pad, GstCaps * caps)
+gst_siren_enc_set_format (GstAudioEncoder * benc, GstAudioInfo * info)
{
GstSirenEnc *enc;
gboolean res;
GstCaps *outcaps;
- enc = GST_SIREN_ENC (GST_PAD_PARENT (pad));
+ enc = GST_SIREN_ENC (benc);
outcaps = gst_static_pad_template_get_caps (&srctemplate);
- res = gst_pad_set_caps (enc->srcpad, outcaps);
+ res = gst_pad_set_caps (GST_AUDIO_ENCODER_SRC_PAD (enc), outcaps);
gst_caps_unref (outcaps);
- return res;
-}
-
-static gboolean
-gst_siren_enc_sink_event (GstPad * pad, GstEvent * event)
-{
- GstSirenEnc *enc;
- gboolean res;
+ /* report needs to base class */
+ gst_audio_encoder_set_frame_samples_min (benc, 320);
+ gst_audio_encoder_set_frame_samples_max (benc, 320);
+ /* no remainder or flushing please */
+ gst_audio_encoder_set_hard_min (benc, TRUE);
+ gst_audio_encoder_set_drainable (benc, FALSE);
- enc = GST_SIREN_ENC (GST_PAD_PARENT (pad));
-
- switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_EOS:
- gst_adapter_clear (enc->adapter);
- res = gst_pad_push_event (enc->srcpad, event);
- break;
- case GST_EVENT_FLUSH_STOP:
- gst_adapter_clear (enc->adapter);
- res = gst_pad_push_event (enc->srcpad, event);
- break;
- default:
- res = gst_pad_push_event (enc->srcpad, event);
- break;
- }
return res;
}
static GstFlowReturn
-gst_siren_enc_chain (GstPad * pad, GstBuffer * buf)
+gst_siren_enc_handle_frame (GstAudioEncoder * benc, GstBuffer * buf)
{
GstSirenEnc *enc;
GstFlowReturn ret = GST_FLOW_OK;
GstBuffer *out_buf;
guint8 *in_data, *out_data;
- guint8 *to_free = NULL;
guint i, size, num_frames;
gint out_size, in_size;
gint encode_ret;
- gboolean discont;
- GstClockTime timestamp;
- guint64 distance;
- GstCaps *outcaps;
- enc = GST_SIREN_ENC (GST_PAD_PARENT (pad));
+ g_return_val_if_fail (buf != NULL, GST_FLOW_ERROR);
- discont = GST_BUFFER_IS_DISCONT (buf);
- if (discont) {
- GST_DEBUG_OBJECT (enc, "received DISCONT, flush adapter");
- gst_adapter_clear (enc->adapter);
- enc->discont = TRUE;
- }
+ enc = GST_SIREN_ENC (benc);
- gst_adapter_push (enc->adapter, buf);
+ size = GST_BUFFER_SIZE (buf);
- size = gst_adapter_available (enc->adapter);
+ GST_LOG_OBJECT (enc, "Received buffer of size %d", GST_BUFFER_SIZE (buf));
- GST_LOG_OBJECT (enc, "Received buffer of size %d with adapter of size : %d",
- GST_BUFFER_SIZE (buf), size);
+ g_return_val_if_fail (size > 0, GST_FLOW_ERROR);
+ g_return_val_if_fail (size % 640 == 0, GST_FLOW_ERROR);
/* we need to process 640 input bytes to produce 40 output bytes */
/* calculate the amount of frames we will handle */
num_frames = size / 640;
- /* no frames, wait some more */
- if (num_frames == 0)
- goto done;
-
/* this is the input/output size */
in_size = num_frames * 640;
out_size = num_frames * 40;
@@ -248,32 +201,14 @@ gst_siren_enc_chain (GstPad * pad, GstBuffer * buf)
GST_LOG_OBJECT (enc, "we have %u frames, %u in, %u out", num_frames, in_size,
out_size);
- /* set output caps when needed */
- if ((outcaps = GST_PAD_CAPS (enc->srcpad)) == NULL) {
- outcaps = gst_static_pad_template_get_caps (&srctemplate);
- gst_pad_set_caps (enc->srcpad, outcaps);
- gst_caps_unref (outcaps);
- }
-
/* get a buffer */
- ret = gst_pad_alloc_buffer_and_set_caps (enc->srcpad, -1,
- out_size, outcaps, &out_buf);
+ ret = gst_pad_alloc_buffer_and_set_caps (GST_AUDIO_ENCODER_SRC_PAD (benc),
+ -1, out_size, GST_PAD_CAPS (GST_AUDIO_ENCODER_SRC_PAD (benc)), &out_buf);
if (ret != GST_FLOW_OK)
goto alloc_failed;
- /* get the timestamp for the output buffer */
- timestamp = gst_adapter_prev_timestamp (enc->adapter, &distance);
-
- /* add the amount of time taken by the distance */
- if (timestamp != -1)
- timestamp += gst_util_uint64_scale_int (distance / 2, GST_SECOND, 16000);
-
- GST_LOG_OBJECT (enc,
- "timestamp %" GST_TIME_FORMAT ", distance %" G_GUINT64_FORMAT,
- GST_TIME_ARGS (timestamp), distance);
-
/* get the input data for all the frames */
- to_free = in_data = gst_adapter_take (enc->adapter, in_size);
+ in_data = GST_BUFFER_DATA (buf);
out_data = GST_BUFFER_DATA (out_buf);
for (i = 0; i < num_frames; i++) {
@@ -291,20 +226,10 @@ gst_siren_enc_chain (GstPad * pad, GstBuffer * buf)
GST_LOG_OBJECT (enc, "Finished encoding");
- /* mark discont */
- if (enc->discont) {
- GST_BUFFER_FLAG_SET (out_buf, GST_BUFFER_FLAG_DISCONT);
- enc->discont = FALSE;
- }
- GST_BUFFER_TIMESTAMP (out_buf) = timestamp;
- GST_BUFFER_DURATION (out_buf) = num_frames * FRAME_DURATION;
-
- ret = gst_pad_push (enc->srcpad, out_buf);
+ /* we encode all we get, pass it along */
+ ret = gst_audio_encoder_finish_frame (benc, out_buf, -1);
done:
- if (to_free)
- g_free (to_free);
-
return ret;
/* ERRORS */
@@ -324,33 +249,6 @@ encode_error:
}
}
-static GstStateChangeReturn
-gst_siren_change_state (GstElement * element, GstStateChange transition)
-{
- GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
- GstSirenEnc *enc = GST_SIREN_ENC (element);
-
- switch (transition) {
- case GST_STATE_CHANGE_READY_TO_PAUSED:
- enc->discont = FALSE;
- break;
- default:
- break;
- }
-
- ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
-
- switch (transition) {
- case GST_STATE_CHANGE_PAUSED_TO_READY:
- gst_adapter_clear (enc->adapter);
- break;
- default:
- break;
- }
-
- return ret;
-}
-
gboolean
gst_siren_enc_plugin_init (GstPlugin * plugin)
{
diff --git a/gst/siren/gstsirenenc.h b/gst/siren/gstsirenenc.h
index 1d63628dc..3477db1a7 100644
--- a/gst/siren/gstsirenenc.h
+++ b/gst/siren/gstsirenenc.h
@@ -24,7 +24,7 @@
#define __GST_SIREN_ENC_H__
#include <gst/gst.h>
-#include <gst/base/gstadapter.h>
+#include <gst/audio/gstaudioencoder.h>
#include "siren7.h"
@@ -48,21 +48,15 @@ typedef struct _GstSirenEncPrivate GstSirenEncPrivate;
struct _GstSirenEnc
{
- GstElement parent;
+ GstAudioEncoder parent;
/* protected by the stream lock */
SirenEncoder encoder;
- GstAdapter *adapter;
-
- gboolean discont;
-
- GstPad *srcpad;
- GstPad *sinkpad;
};
struct _GstSirenEncClass
{
- GstElementClass parent_class;
+ GstAudioEncoderClass parent_class;
};
GType gst_siren_enc_get_type (void);
diff --git a/gst/videoparsers/gsth263parse.c b/gst/videoparsers/gsth263parse.c
index a3c5ea4f4..9ff1af66c 100644
--- a/gst/videoparsers/gsth263parse.c
+++ b/gst/videoparsers/gsth263parse.c
@@ -158,7 +158,8 @@ find_psc (GstBuffer * buffer, guint skip)
if (!gst_byte_reader_set_pos (&br, skip))
goto out;
- gst_byte_reader_peek_uint24_be (&br, &psc);
+ if (gst_byte_reader_peek_uint24_be (&br, &psc) == FALSE)
+ goto out;
/* Scan for the picture start code (22 bits - 0x0020) */
while ((gst_byte_reader_get_remaining (&br) >= 3)) {
@@ -166,8 +167,8 @@ find_psc (GstBuffer * buffer, guint skip)
((psc & 0xffffc0) == 0x000080)) {
psc_pos = gst_byte_reader_get_pos (&br);
break;
- } else
- gst_byte_reader_skip (&br, 1);
+ } else if (gst_byte_reader_skip (&br, 1) == FALSE)
+ break;
}
out:
diff --git a/gst/videoparsers/gsth264parse.c b/gst/videoparsers/gsth264parse.c
index 420394f69..4e1f5b000 100644
--- a/gst/videoparsers/gsth264parse.c
+++ b/gst/videoparsers/gsth264parse.c
@@ -920,6 +920,7 @@ gst_h264_parse_make_codec_data (GstH264Parse * h264parse)
gboolean found = FALSE;
GstMapInfo map;
guint8 *data;
+ gint nl;
/* only nal payload in stored nals */
@@ -956,12 +957,13 @@ gst_h264_parse_make_codec_data (GstH264Parse * h264parse)
buf = gst_buffer_new_allocate (NULL, 5 + 1 + sps_size + 1 + pps_size, NULL);
gst_buffer_map (buf, &map, GST_MAP_WRITE);
data = map.data;
+ nl = h264parse->nal_length_size;
data[0] = 1; /* AVC Decoder Configuration Record ver. 1 */
data[1] = profile_idc; /* profile_idc */
data[2] = profile_comp; /* profile_compability */
data[3] = level_idc; /* level_idc */
- data[4] = 0xfc | (4 - 1); /* nal_length_size_minus1 */
+ data[4] = 0xfc | (nl - 1); /* nal_length_size_minus1 */
data[5] = 0xe0 | num_sps; /* number of SPSs */
data += 6;
@@ -1578,14 +1580,16 @@ gst_h264_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
gst_byte_writer_init_with_size (&bw, gst_buffer_get_size (buffer),
FALSE);
- gst_byte_writer_put_buffer (&bw, buffer, 0, h264parse->idr_pos);
+ gst_byte_writer_put_buffer_unchecked (&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");
- gst_byte_writer_put_uint32_be (&bw, bs ? 1 : nal_size);
- gst_byte_writer_put_buffer (&bw, codec_nal, 0, nal_size);
+ gst_byte_writer_put_uint32_be_unchecked (&bw, bs ? 1 : nal_size);
+ gst_byte_writer_put_buffer_unchecked (&bw, codec_nal, 0,
+ nal_size);
h264parse->last_report = new_ts;
}
}
@@ -1593,12 +1597,14 @@ gst_h264_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
if ((codec_nal = h264parse->pps_nals[i])) {
gsize nal_size = gst_buffer_get_size (codec_nal);
GST_DEBUG_OBJECT (h264parse, "inserting PPS nal");
- gst_byte_writer_put_uint32_be (&bw, bs ? 1 : nal_size);
- gst_byte_writer_put_buffer (&bw, codec_nal, 0, nal_size);
+ gst_byte_writer_put_uint32_be_unchecked (&bw, bs ? 1 : nal_size);
+ gst_byte_writer_put_buffer_unchecked (&bw, codec_nal, 0,
+ nal_size);
h264parse->last_report = new_ts;
}
}
- gst_byte_writer_put_buffer (&bw, buffer, h264parse->idr_pos, -1);
+ gst_byte_writer_put_buffer_unchecked (&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,
diff --git a/gst/videoparsers/gstmpegvideoparse.c b/gst/videoparsers/gstmpegvideoparse.c
index f0726b960..fd72aa678 100644
--- a/gst/videoparsers/gstmpegvideoparse.c
+++ b/gst/videoparsers/gstmpegvideoparse.c
@@ -655,7 +655,7 @@ gst_mpegv_parse_update_src_caps (GstMpegvParse * mpvparse)
profile = profiles[profile_c - 1];
if ((level_c > 3) && (level_c < 11) && (level_c % 2 == 0))
- level = levels[(level_c >> 1) - 1];
+ level = levels[(level_c >> 1) - 2];
if (profile_c == 8) {
/* Non-hierarchical profile */
@@ -683,6 +683,8 @@ gst_mpegv_parse_update_src_caps (GstMpegvParse * mpvparse)
/* FIXME does it make sense to expose profile/level in the caps ? */
+ GST_DEBUG_OBJECT (mpvparse, "profile:'%s' level:'%s'", profile, level);
+
if (profile)
gst_caps_set_simple (caps, "profile", G_TYPE_STRING, profile, NULL);
else
diff --git a/sys/Makefile.am b/sys/Makefile.am
index d15f8282c..b0ddf9e06 100644
--- a/sys/Makefile.am
+++ b/sys/Makefile.am
@@ -1,19 +1,19 @@
-# if USE_DXR3
-# DXR3_DIR=dxr3
-# else
-# DXR3_DIR=
-# endif
+if USE_ACM
+ACM_DIR=acmenc acmmp3dec
+else
+ACM_DIR=
+endif
-# if USE_QCAM
-# QCAM_DIR=qcam
-# else
-# QCAM_DIR=
-# endif
+if USE_APPLE_MEDIA
+APPLE_MEDIA_DIR=applemedia
+else
+APPLE_MEDIA_DIR=
+endif
-if USE_VCD
-VCD_DIR=vcd
+if USE_AVC
+AVC_DIR=avc
else
-VCD_DIR=
+AVC_DIR=
endif
# if USE_CDROM
@@ -58,25 +58,42 @@ else
DVB_DIR=
endif
+# if USE_DXR3
+# DXR3_DIR=dxr3
+# else
+# DXR3_DIR=
+# endif
+
if USE_LINSYS
LINSYS_DIR=linsys
else
LINSYS_DIR=
endif
+if USE_OSX_VIDEO
+OSX_VIDEO_DIR=osxvideo
+else
+OSX_VIDEO_DIR=
+endif
-if USE_APPLE_MEDIA
-APPLE_MEDIA_DIR=applemedia
+if USE_PVR
+PVR_DIR=pvr2d
else
-APPLE_MEDIA_DIR=
+PVR_DIR=
endif
-if USE_OSX_VIDEO
-OSX_VIDEO_DIR=osxvideo
+if USE_SHM
+SHM_DIR=shm
else
-OSX_VIDEO_DIR=
+SHM_DIR=
endif
+# if USE_QCAM
+# QCAM_DIR=qcam
+# else
+# QCAM_DIR=
+# endif
+
if USE_QUICKTIME
QT_DIR=qtwrapper
else
@@ -89,10 +106,10 @@ else
WININET_DIR=
endif
-if USE_ACM
-ACM_DIR=acmenc acmmp3dec
+if USE_VCD
+VCD_DIR=vcd
else
-ACM_DIR=
+VCD_DIR=
endif
#if USE_VDPAU
@@ -101,28 +118,15 @@ endif
#VDPAU_DIR=
#endif
-
-if USE_SHM
-SHM_DIR=shm
+if USE_DIRECT3D9
+WINSCREENCAP_DIR=winscreencap
else
-SHM_DIR=
-endif
-
-if USE_AVC
-AVC_DIR=avc
-else
-AVC_DIR=
-endif
-
-if USE_PVR
-PVR_DIR=pvr2d
-else
-PVR_DIR=
+WINSCREENCAP_DIR=
endif
-SUBDIRS = $(ACM_DIR) $(APPLE_MEDIA_DIR) $(AVC_DIR) $(D3DVIDEOSINK_DIR) $(DECKLINK_DIR) $(DIRECTDRAW_DIR) $(DIRECTSOUND_DIR) $(DVB_DIR) $(FBDEV_DIR) $(LINSYS_DIR) $(OSX_VIDEO_DIR) $(QT_DIR) $(SHM_DIR) $(VCD_DIR) $(VDPAU_DIR) $(WININET_DIR) $(PVR_DIR)
+SUBDIRS = $(ACM_DIR) $(APPLE_MEDIA_DIR) $(AVC_DIR) $(D3DVIDEOSINK_DIR) $(DECKLINK_DIR) $(DIRECTDRAW_DIR) $(DIRECTSOUND_DIR) $(DVB_DIR) $(FBDEV_DIR) $(LINSYS_DIR) $(OSX_VIDEO_DIR) $(PVR_DIR) $(QT_DIR) $(SHM_DIR) $(VCD_DIR) $(VDPAU_DIR) $(WININET_DIR) $(WINSCREENCAP_DIR)
DIST_SUBDIRS = acmenc acmmp3dec applemedia avc d3dvideosink decklink directdraw directsound dvb linsys fbdev dshowdecwrapper dshowsrcwrapper dshowvideosink \
- osxvideo qtwrapper shm vcd vdpau wasapi wininet winks winscreencap pvr2d
+ osxvideo pvr2d qtwrapper shm vcd vdpau wasapi wininet winks winscreencap
include $(top_srcdir)/common/parallel-subdirs.mak
diff --git a/sys/d3dvideosink/Makefile.am b/sys/d3dvideosink/Makefile.am
index 183e460cf..76b79209d 100644
--- a/sys/d3dvideosink/Makefile.am
+++ b/sys/d3dvideosink/Makefile.am
@@ -4,11 +4,11 @@ libgstd3dvideosink_la_SOURCES = d3dvideosink.c directx/d3d.c directx/dx.c \
directx/directx9/dx9.c directx/directx9/dx9_d3d.c \
directx/directx10/dx10.c directx/directx10/dx10_d3d.c \
directx/directx11/dx11.c directx/directx11/dx11_d3d.c
-libgstd3dvideosink_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) $(GST_CFLAGS)
+libgstd3dvideosink_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) $(GST_CFLAGS) $(DIRECTX_CFLAGS)
libgstd3dvideosink_la_LIBADD = $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) \
-lgstvideo-$(GST_MAJORMINOR) -lgstinterfaces-$(GST_MAJORMINOR) \
$(DIRECT3D_LIBS)
-libgstd3dvideosink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstd3dvideosink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(DIRECTX_LDFAGS)
libgstd3dvideosink_la_LIBTOOLFLAGS = --tag=disable-static
noinst_HEADERS = d3dvideosink.h directx/d3d.h directx/dx.h directx/directx.h \
diff --git a/sys/d3dvideosink/d3dvideosink.c b/sys/d3dvideosink/d3dvideosink.c
index bafb90731..bbcf3ad32 100644
--- a/sys/d3dvideosink/d3dvideosink.c
+++ b/sys/d3dvideosink/d3dvideosink.c
@@ -63,7 +63,6 @@ struct _GstD3DVideoSinkHookData
static GstD3DVideoSinkShared shared;
/* Define a shared lock to synchronize the creation/destruction of the d3d device */
static GStaticMutex shared_d3d_lock = G_STATIC_MUTEX_INIT;
-static GStaticMutex shared_d3d_dev_lock = G_STATIC_MUTEX_INIT;
static GStaticMutex shared_d3d_hook_lock = G_STATIC_MUTEX_INIT;
/* Hold a reference to our dll's HINSTANCE */
static HINSTANCE g_hinstDll = NULL;
@@ -155,12 +154,11 @@ static void gst_d3dvideosink_remove_window_for_renderer (GstD3DVideoSink *
sink);
static gboolean gst_d3dvideosink_initialize_direct3d (GstD3DVideoSink * sink);
static gboolean gst_d3dvideosink_initialize_d3d_device (GstD3DVideoSink * sink);
-static gboolean gst_d3dvideosink_resize_swap_chain (GstD3DVideoSink * sink,
- gint width, gint height);
+
static gboolean gst_d3dvideosink_notify_device_init (GstD3DVideoSink * sink);
static gboolean gst_d3dvideosink_notify_device_lost (GstD3DVideoSink * sink);
static gboolean gst_d3dvideosink_notify_device_reset (GstD3DVideoSink * sink);
-static gboolean gst_d3dvideosink_notify_device_resize (GstD3DVideoSink * sink);
+static gboolean gst_d3dvideosink_notify_device_reinit (GstD3DVideoSink * sink);
static gboolean gst_d3dvideosink_device_lost (GstD3DVideoSink * sink);
static gboolean gst_d3dvideosink_release_d3d_device (GstD3DVideoSink * sink);
static gboolean gst_d3dvideosink_release_direct3d (GstD3DVideoSink * sink);
@@ -470,11 +468,13 @@ gst_d3dvideosink_get_caps (GstBaseSink * basesink)
GstStructure *stru = gst_caps_get_structure (c, i);
if (!gst_structure_has_name (stru, "video/x-raw-rgb")) {
gst_structure_get_fourcc (stru, "format", (guint32 *) & d3dfourcc);
- switch (d3dfourcc) {
+ switch ((guint32) d3dfourcc) {
case GST_MAKE_FOURCC ('Y', 'V', '1', '2'):
case GST_MAKE_FOURCC ('I', '4', '2', '0'):
d3dfourcc = (D3DFORMAT) MAKEFOURCC ('Y', 'V', '1', '2');
break;
+ default:
+ break;
}
if (d3dfourcc && SUCCEEDED (IDirect3D9_CheckDeviceFormat (shared.d3d,
D3DADAPTER_DEFAULT,
@@ -531,9 +531,6 @@ gst_d3dvideosink_create_shared_hidden_window (GstD3DVideoSink * sink)
CloseHandle (shared.hidden_window_created_signal);
- if (!shared.d3ddev)
- goto failed;
-
GST_DEBUG ("Successfully created Direct3D hidden window, handle: %p",
shared.hidden_window_handle);
@@ -638,7 +635,9 @@ SharedHiddenWndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
shared.device_lost_sink = NULL;
GST_DEBUG ("Initializing Direct3D");
+ GST_D3DVIDEOSINK_SWAP_CHAIN_LOCK (sink);
gst_d3dvideosink_initialize_d3d_device (sink);
+ GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink);
GST_DEBUG ("Direct3D initialization complete");
break;
@@ -663,9 +662,11 @@ SharedHiddenWndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
/* Did we receive a message to check if the device is available again? */
if (wParam == IDT_DEVICELOST) {
+ GST_D3DVIDEOSINK_SWAP_CHAIN_LOCK (sink);
/* This will synchronously call SharedHiddenWndProc() because this thread is the one that created the window. */
SendMessage (hWnd, WM_DIRECTX_D3D_DEVICELOST, 0,
(LPARAM) shared.device_lost_sink);
+ GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink);
return 0;
}
break;
@@ -735,6 +736,9 @@ WndProcHook (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
GstD3DVideoSink *sink =
(GstD3DVideoSink *) GetProp (hWnd, TEXT ("GstD3DVideoSink"));
+ if (!sink)
+ return FALSE;
+
switch (message) {
case WM_ERASEBKGND:
return TRUE;
@@ -801,6 +805,8 @@ static void
gst_d3dvideosink_wnd_proc (GstD3DVideoSink * sink, HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
+ if (!sink)
+ return;
switch (message) {
case WM_COPYDATA:
{
@@ -1068,12 +1074,18 @@ gst_d3dvideosink_set_window_handle (GstXOverlay * overlay, guintptr window_id)
/* If we're already playing/paused, then we need to lock the swap chain, and recreate it with the new window. */
if (sink->d3ddev != NULL) {
+ GST_D3DVIDEOSINK_SWAP_CHAIN_LOCK (sink);
/* Close our existing window if there is one */
gst_d3dvideosink_close_window (sink);
/* Save our window id */
sink->window_handle = hWnd;
gst_d3dvideosink_set_window_for_renderer (sink);
- gst_d3dvideosink_notify_device_resize (sink);
+ sink->window_closed = FALSE;
+
+ gst_d3dvideosink_notify_device_reinit (sink);
+ GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink);
+ //gst_d3dvideosink_notify_device_init(sink);
+
} else {
sink->window_handle = hWnd;
}
@@ -1313,8 +1325,6 @@ GST_D3DVIDEOSINK_SHARED_D3D_HOOK_UNLOCK GST_D3DVIDEOSINK_SHARED_D3D_UNLOCK}
static void
gst_d3dvideosink_remove_window_for_renderer (GstD3DVideoSink * sink)
{
- //GST_D3DVIDEOSINK_SHARED_D3D_LOCK
- //GST_D3DVIDEOSINK_SWAP_CHAIN_LOCK(sink);
{
GST_DEBUG ("Removing custom rendering window procedure");
if (!sink->is_new_window && sink->window_handle) {
@@ -1341,8 +1351,6 @@ gst_d3dvideosink_remove_window_for_renderer (GstD3DVideoSink * sink)
/* Remove the property associating our sink with the window */
RemoveProp (sink->window_handle, TEXT ("GstD3DVideoSink"));
}
- //GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK(sink);
- //GST_D3DVIDEOSINK_SHARED_D3D_UNLOCK
}
static void
@@ -1568,7 +1576,7 @@ gst_d3dvideosink_flush_gpu (GstD3DVideoSink * sink)
}
}
-static void
+static G_GNUC_UNUSED void
gst_d3dvideosink_wait_for_vsync (GstD3DVideoSink * sink)
{
if (sink->d3dpp.PresentationInterval == D3DPRESENT_INTERVAL_IMMEDIATE) {
@@ -2033,9 +2041,6 @@ gst_d3dvideosink_initialize_d3d_device (GstD3DVideoSink * sink)
/* Get the current size of the window */
gst_d3dvideosink_window_size (sink, &width, &height);
-
- GST_D3DVIDEOSINK_SWAP_CHAIN_LOCK (sink);
-
if (!shared.d3d) {
GST_WARNING ("Direct3D object has not been initialized");
goto error;
@@ -2194,41 +2199,10 @@ gst_d3dvideosink_initialize_d3d_device (GstD3DVideoSink * sink)
//}
/*success:*/
- GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink);
+ //GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink);
return TRUE;
error:
- GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink);
- return FALSE;
-}
-
-
-static gboolean
-gst_d3dvideosink_resize_swap_chain (GstD3DVideoSink * sink, gint width,
- gint height)
-{
- if (width <= 0 || height <= 0 || width > GetSystemMetrics (SM_CXFULLSCREEN)
- || height > GetSystemMetrics (SM_CYFULLSCREEN)) {
- GST_DEBUG ("Invalid size");
- return FALSE;
- }
- if (!shared.d3d || !sink->d3ddev) {
- GST_DEBUG_OBJECT (sink, "Direct3D device not initialized.");
- return TRUE;
- }
-
- GST_LOG_OBJECT (sink, "Resizing Direct3D swap chain for sink %p to %dx%d",
- sink, width, height);
- /* actually recreates the device + associated surfaces
- must be called from thread that created the device */
- if (!gst_d3dvideosink_notify_device_resize (sink))
- goto error;
-
-
-/* success:*/
- GST_LOG_OBJECT (sink, "Direct3D swap chain successfully resized");
- return TRUE;
-error:
- GST_ERROR_OBJECT (sink, "Error attempting to resize the Direct3D swap chain");
+ //GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink);
return FALSE;
}
@@ -2243,10 +2217,10 @@ gst_d3dvideosink_notify_device_init (GstD3DVideoSink * sink)
}
static gboolean
-gst_d3dvideosink_notify_device_resize (GstD3DVideoSink * sink)
+gst_d3dvideosink_notify_device_reinit (GstD3DVideoSink * sink)
{
if (sink->window_handle) {
- SendMessage (shared.hidden_window_handle, WM_DIRECTX_D3D_RESIZE, 0,
+ SendMessage (shared.hidden_window_handle, WM_DIRECTX_D3D_DEVICELOST, 0,
(LPARAM) sink);
}
return TRUE;
@@ -2294,7 +2268,6 @@ gst_d3dvideosink_device_lost (GstD3DVideoSink * sink)
{
/* Must be called from hidden window's message loop! */
- GST_D3DVIDEOSINK_SWAP_CHAIN_LOCK (sink);
{
if (shared.device_lost)
GST_DEBUG ("Direct3D device lost");
@@ -2342,18 +2315,15 @@ gst_d3dvideosink_device_lost (GstD3DVideoSink * sink)
/*success:*/
GST_DEBUG ("Direct3D device has successfully been reset.");
- GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink);
return TRUE;
error:
GST_DEBUG ("Unable to successfully reset the Direct3D device.");
- GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink);
return FALSE;
}
static gboolean
gst_d3dvideosink_release_d3d_device (GstD3DVideoSink * sink)
{
- GST_D3DVIDEOSINK_SWAP_CHAIN_LOCK (sink);
if (sink->d3ddev) {
int ref_count;
ref_count = IDirect3DDevice9_Release (sink->d3ddev);
@@ -2368,7 +2338,7 @@ gst_d3dvideosink_release_d3d_device (GstD3DVideoSink * sink)
GST_DEBUG_OBJECT (sink,
"Direct3D offscreen surface released. Reference count: %d", ref_count);
}
- GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink);
+ //GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink);
return TRUE;
}
@@ -2390,7 +2360,9 @@ gst_d3dvideosink_release_direct3d (GstD3DVideoSink * sink)
if (shared.element_count > 0)
goto success;
+ GST_D3DVIDEOSINK_SWAP_CHAIN_LOCK (sink);
gst_d3dvideosink_release_d3d_device (sink);
+ GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink);
if (shared.d3d) {
int ref_count;
ref_count = IDirect3D9_Release (shared.d3d);
diff --git a/sys/d3dvideosink/directx/d3d.h b/sys/d3dvideosink/directx/d3d.h
index c58310fd9..238349c27 100644
--- a/sys/d3dvideosink/directx/d3d.h
+++ b/sys/d3dvideosink/directx/d3d.h
@@ -33,8 +33,8 @@ G_BEGIN_DECLS
#define WM_DIRECTX_D3D_RESIZE WM_DIRECTX + 5
#define DIRECTX_D3D_API(version, dispatch_table, init_function, create_function, resize_function, device_lost_function, notify_device_reset_function, release_function) \
- static gpointer DIRECTX_API_COMPONENT_D3D_ ## version ## _DISPATCH_TABLE = &dispatch_table; \
- static DirectXAPIComponentD3D DIRECTX_API_COMPONENT_D3D_ ## version ## _INIT = { \
+ static gpointer G_GNUC_UNUSED DIRECTX_API_COMPONENT_D3D_ ## version ## _DISPATCH_TABLE = &dispatch_table; \
+ static DirectXAPIComponentD3D G_GNUC_UNUSED DIRECTX_API_COMPONENT_D3D_ ## version ## _INIT = { \
create_function /*create_function*/ \
, resize_function /*resize_function*/ \
, device_lost_function /*device_lost_function*/ \
@@ -42,7 +42,7 @@ G_BEGIN_DECLS
, release_function /*release_function*/ \
, NULL /*private_data*/ \
}; \
- static void init_directx_api_component_d3d_ ## version ## _(const DirectXAPI* api) { \
+ static void G_GNUC_UNUSED init_directx_api_component_d3d_ ## version ## _(const DirectXAPI* api) { \
gpointer private_data = &DIRECTX_API_COMPONENT_D3D_ ## version ## _INIT; \
gpointer vtable = DIRECTX_API_COMPONENT_D3D_ ## version ## _DISPATCH_TABLE; \
DIRECTX_SET_COMPONENT_INIT(DIRECTX_D3D(api), init_function); \
diff --git a/sys/d3dvideosink/directx/dx.h b/sys/d3dvideosink/directx/dx.h
index 60dd6d869..dcf7c05db 100644
--- a/sys/d3dvideosink/directx/dx.h
+++ b/sys/d3dvideosink/directx/dx.h
@@ -111,7 +111,7 @@ typedef enum
, &DIRECTX_ ## version ## _DIRECTCOMPUTE_COMPONENT \
, {NULL, NULL, NULL} /*reserved*/ \
}; \
- static void init_directx_ ## version ## _supported_api(void) { \
+ static void G_GNUC_UNUSED init_directx_ ## version ## _supported_api(void) { \
DirectXAPI* api; \
api = &DIRECTX_ ## version ## _API; \
api->d3d->api = api; \
diff --git a/sys/decklink/Makefile.am b/sys/decklink/Makefile.am
index a35658f6f..9d1260170 100644
--- a/sys/decklink/Makefile.am
+++ b/sys/decklink/Makefile.am
@@ -11,17 +11,32 @@ libgstdecklink_la_LIBADD = \
$(GST_BASE_LIBS) \
$(GST_LIBS) \
-lgstvideo-@GST_MAJORMINOR@ \
+ -lgstinterfaces-@GST_MAJORMINOR@ \
$(DECKLINK_LIBS) \
$(LIBM)
-libgstdecklink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstdecklink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+
+if DECKLINK_OSX
+libgstdecklink_la_LDFLAGS += \
+ -Wl,-framework,CoreFoundation
+endif
+
libgstdecklink_la_LIBTOOLFLAGS = --tag=disable-static
libgstdecklink_la_SOURCES = \
gstdecklinksrc.cpp \
gstdecklinksink.cpp \
gstdecklink.cpp \
- capture.cpp \
+ capture.cpp
+
+if DECKLINK_OSX
+libgstdecklink_la_SOURCES += \
+ osx/DeckLinkAPIDispatch-osx.cpp
+else
+libgstdecklink_la_SOURCES += \
linux/DeckLinkAPIDispatch.cpp
+endif
+
noinst_HEADERS = \
gstdecklink.h \
@@ -29,10 +44,19 @@ noinst_HEADERS = \
gstdecklinksink.h \
capture.h \
linux/DeckLinkAPI.h \
- linux/LinuxCOM.h
+ linux/LinuxCOM.h \
+ osx/DeckLinkAPI.h \
+ osx/DeckLinkAPIConfiguration.h \
+ osx/DeckLinkAPIDeckControl.h \
+ osx/DeckLinkAPIDiscovery.h \
+ osx/DeckLinkAPIModes.h \
+ osx/DeckLinkAPIStreaming.h \
+ osx/DeckLinkAPITypes.h \
+ osx/DeckLinkAPIVersion.h
EXTRA_DIST = \
win/DeckLinkAPI.h \
win/DeckLinkAPIDispatch.cpp \
win/DeckLinkAPI_i.c
+
diff --git a/sys/decklink/capture.cpp b/sys/decklink/capture.cpp
index 39ee6c449..8804eebaf 100644
--- a/sys/decklink/capture.cpp
+++ b/sys/decklink/capture.cpp
@@ -43,11 +43,11 @@ IDeckLink *deckLink;
IDeckLinkInput *deckLinkInput;
IDeckLinkDisplayModeIterator *displayModeIterator;
-static BMDTimecodeFormat g_timecodeFormat = (BMDTimecodeFormat)0;
+static BMDTimecodeFormat g_timecodeFormat = (BMDTimecodeFormat) 0;
DeckLinkCaptureDelegate::DeckLinkCaptureDelegate ():m_refCount (0)
{
- m_mutex = g_mutex_new();
+ m_mutex = g_mutex_new ();
}
DeckLinkCaptureDelegate::~DeckLinkCaptureDelegate ()
@@ -55,8 +55,7 @@ DeckLinkCaptureDelegate::~DeckLinkCaptureDelegate ()
g_mutex_free (m_mutex);
}
-ULONG
-DeckLinkCaptureDelegate::AddRef (void)
+ULONG DeckLinkCaptureDelegate::AddRef (void)
{
g_mutex_lock (m_mutex);
m_refCount++;
@@ -65,15 +64,15 @@ DeckLinkCaptureDelegate::AddRef (void)
return (ULONG) m_refCount;
}
-ULONG
-DeckLinkCaptureDelegate::Release (void)
+ULONG DeckLinkCaptureDelegate::Release (void)
{
g_mutex_lock (m_mutex);
m_refCount--;
g_mutex_unlock (m_mutex);
if (m_refCount == 0) {
- delete this;
+ delete
+ this;
return 0;
}
diff --git a/sys/decklink/gstdecklink.cpp b/sys/decklink/gstdecklink.cpp
index 0920cca2f..d747fcf9d 100644
--- a/sys/decklink/gstdecklink.cpp
+++ b/sys/decklink/gstdecklink.cpp
@@ -94,7 +94,8 @@ gst_decklink_audio_connection_get_type (void)
if (!type) {
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_EMBEDDED, "embedded",
+ "SDI/HDMI embedded audio"},
{GST_DECKLINK_AUDIO_CONNECTION_AES_EBU, "aes", "AES/EBU input"},
{GST_DECKLINK_AUDIO_CONNECTION_ANALOG, "analog", "Analog input"},
{0, NULL, NULL}
@@ -110,29 +111,29 @@ gst_decklink_audio_connection_get_type (void)
#define HD 1, 1, false, true
static const GstDecklinkMode modes[] = {
- {bmdModeNTSC, 720, 486, 30000, 1001, true, NTSC },
- {bmdModeNTSC2398, 720, 486, 24000, 1001, true, NTSC },
- {bmdModePAL, 720, 576, 25, 1, true, PAL },
- {bmdModeNTSCp, 720, 486, 30000, 1001, false, NTSC },
- {bmdModePALp, 720, 576, 25, 1, false, PAL },
-
- {bmdModeHD1080p2398, 1920, 1080, 24000, 1001, false, HD },
- {bmdModeHD1080p24, 1920, 1080, 24, 1, false, HD },
- {bmdModeHD1080p25, 1920, 1080, 25, 1, false, HD },
- {bmdModeHD1080p2997, 1920, 1080, 30000, 1001, false, HD },
- {bmdModeHD1080p30, 1920, 1080, 30, 1, false, HD },
-
- {bmdModeHD1080i50, 1920, 1080, 25, 1, true, HD },
- {bmdModeHD1080i5994, 1920, 1080, 30000, 1001, true, HD },
- {bmdModeHD1080i6000, 1920, 1080, 30, 1, true, HD },
-
- {bmdModeHD1080p50, 1920, 1080, 50, 1, false, HD },
- {bmdModeHD1080p5994, 1920, 1080, 30000, 1001, false, HD },
- {bmdModeHD1080p6000, 1920, 1080, 60, 1, false, HD },
-
- {bmdModeHD720p50, 1280, 720, 50, 1, false, HD },
- {bmdModeHD720p5994, 1280, 720, 60000, 1001, false, HD },
- {bmdModeHD720p60, 1280, 720, 60, 1, false, HD }
+ {bmdModeNTSC, 720, 486, 30000, 1001, true, NTSC},
+ {bmdModeNTSC2398, 720, 486, 24000, 1001, true, NTSC},
+ {bmdModePAL, 720, 576, 25, 1, true, PAL},
+ {bmdModeNTSCp, 720, 486, 30000, 1001, false, NTSC},
+ {bmdModePALp, 720, 576, 25, 1, false, PAL},
+
+ {bmdModeHD1080p2398, 1920, 1080, 24000, 1001, false, HD},
+ {bmdModeHD1080p24, 1920, 1080, 24, 1, false, HD},
+ {bmdModeHD1080p25, 1920, 1080, 25, 1, false, HD},
+ {bmdModeHD1080p2997, 1920, 1080, 30000, 1001, false, HD},
+ {bmdModeHD1080p30, 1920, 1080, 30, 1, false, HD},
+
+ {bmdModeHD1080i50, 1920, 1080, 25, 1, true, HD},
+ {bmdModeHD1080i5994, 1920, 1080, 30000, 1001, true, HD},
+ {bmdModeHD1080i6000, 1920, 1080, 30, 1, true, HD},
+
+ {bmdModeHD1080p50, 1920, 1080, 50, 1, false, HD},
+ {bmdModeHD1080p5994, 1920, 1080, 30000, 1001, false, HD},
+ {bmdModeHD1080p6000, 1920, 1080, 60, 1, false, HD},
+
+ {bmdModeHD720p50, 1280, 720, 50, 1, false, HD},
+ {bmdModeHD720p5994, 1280, 720, 60000, 1001, false, HD},
+ {bmdModeHD720p60, 1280, 720, 60, 1, false, HD}
};
@@ -155,8 +156,7 @@ gst_decklink_mode_get_structure (GstDecklinkModeEnum e)
"interlaced", G_TYPE_BOOLEAN, mode->interlaced,
"pixel-aspect-ratio", GST_TYPE_FRACTION, mode->par_n, mode->par_d,
"color-matrix", G_TYPE_STRING, mode->is_hdtv ? "hdtv" : "sdtv",
- "chroma-site", G_TYPE_STRING, "mpeg2",
- NULL);
+ "chroma-site", G_TYPE_STRING, "mpeg2", NULL);
}
GstCaps *
@@ -178,14 +178,44 @@ gst_decklink_mode_get_template_caps (void)
GstStructure *s;
caps = gst_caps_new_empty ();
- for(i=0;i<(int)G_N_ELEMENTS(modes);i++) {
- s = gst_decklink_mode_get_structure ((GstDecklinkModeEnum)i);
+ for (i = 0; i < (int) G_N_ELEMENTS (modes); i++) {
+ s = gst_decklink_mode_get_structure ((GstDecklinkModeEnum) i);
gst_caps_append_structure (caps, s);
}
return caps;
}
+IDeckLink *
+gst_decklink_get_nth_device (int n)
+{
+ IDeckLinkIterator *iterator;
+ IDeckLink *decklink = NULL;
+ HRESULT ret;
+ int i;
+
+ iterator = CreateDeckLinkIteratorInstance ();
+ if (iterator == NULL) {
+ GST_ERROR ("no driver");
+ return NULL;
+ }
+
+ ret = iterator->Next (&decklink);
+ if (ret != S_OK) {
+ GST_ERROR ("no card");
+ return NULL;
+ }
+ for (i = 0; i < n; i++) {
+ ret = iterator->Next (&decklink);
+ if (ret != S_OK) {
+ GST_ERROR ("no card");
+ return NULL;
+ }
+ }
+
+ return decklink;
+}
+
static gboolean
plugin_init (GstPlugin * plugin)
{
diff --git a/sys/decklink/gstdecklink.h b/sys/decklink/gstdecklink.h
index bd1d1d30b..77c5cc43a 100644
--- a/sys/decklink/gstdecklink.h
+++ b/sys/decklink/gstdecklink.h
@@ -107,34 +107,7 @@ const GstDecklinkMode * gst_decklink_get_mode (GstDecklinkModeEnum e);
GstCaps * gst_decklink_mode_get_caps (GstDecklinkModeEnum e);
GstCaps * gst_decklink_mode_get_template_caps (void);
-#define GST_DECKLINK_MODE_CAPS(w,h,n,d,i) \
- "video/x-raw-yuv,format=(fourcc){ UYVY, v210 },width=" #w ",height=" #h \
- ",framerate=" #n "/" #d ",interlaced=" #i
-
-#define GST_DECKLINK_CAPS \
- GST_DECKLINK_MODE_CAPS(720,486,30000,1001,true) ";" \
- GST_DECKLINK_MODE_CAPS(720,486,24000,1001,true) ";" \
- GST_DECKLINK_MODE_CAPS(720,576,25,1,true) ";" \
- GST_DECKLINK_MODE_CAPS(720,486,30000,1001,false) ";" \
- GST_DECKLINK_MODE_CAPS(720,576,25,1,false) ";" \
- \
- GST_DECKLINK_MODE_CAPS(1920,1080,24000,1001,false) ";" \
- GST_DECKLINK_MODE_CAPS(1920,1080,24,1,false) ";" \
- GST_DECKLINK_MODE_CAPS(1920,1080,25,1,false) ";" \
- GST_DECKLINK_MODE_CAPS(1920,1080,30000,1001,false) ";" \
- GST_DECKLINK_MODE_CAPS(1920,1080,30,1,false) ";" \
- \
- GST_DECKLINK_MODE_CAPS(1920,1080,25,1,true) ";" \
- GST_DECKLINK_MODE_CAPS(1920,1080,30000,1001,true) ";" \
- GST_DECKLINK_MODE_CAPS(1920,1080,30,1,true) ";" \
- \
- GST_DECKLINK_MODE_CAPS(1920,1080,50,1,false) ";" \
- GST_DECKLINK_MODE_CAPS(1920,1080,60000,1001,false) ";" \
- GST_DECKLINK_MODE_CAPS(1920,1080,60,1,false) ";" \
- \
- GST_DECKLINK_MODE_CAPS(1280,720,50,1,false) ";" \
- GST_DECKLINK_MODE_CAPS(1280,720,60000,1001,false) ";" \
- GST_DECKLINK_MODE_CAPS(1280,720,60,1,false)
+IDeckLink * gst_decklink_get_nth_device (int n);
#endif
diff --git a/sys/decklink/gstdecklinksink.cpp b/sys/decklink/gstdecklinksink.cpp
index 1f4ccc8d0..6a105d46d 100644
--- a/sys/decklink/gstdecklinksink.cpp
+++ b/sys/decklink/gstdecklinksink.cpp
@@ -35,8 +35,8 @@
#endif
#include <gst/gst.h>
-#include <gst/glib-compat-private.h>
#include <gst/video/video.h>
+#include <gst/interfaces/propertyprobe.h>
#include "gstdecklink.h"
#include "gstdecklinksink.h"
#include <string.h>
@@ -118,24 +118,25 @@ static GstFlowReturn gst_decklink_sink_audiosink_bufferalloc (GstPad * pad,
guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf);
static GstIterator *gst_decklink_sink_audiosink_iterintlink (GstPad * pad);
+static void
+gst_decklink_sink_property_probe_interface_init (GstPropertyProbeInterface *
+ iface);
+
#ifdef _MSC_VER
/* COM initialization/uninitialization thread */
-static void gst_decklink_sink_com_thread (GstDecklinkSink * src);
+static void gst_decklink_sink_com_thread (GstDecklinkSink * sink);
#endif /* _MSC_VER */
enum
{
PROP_0,
- PROP_MODE
+ PROP_MODE,
+ PROP_DEVICE
};
/* pad templates */
-static GstStaticPadTemplate gst_decklink_sink_videosink_template =
-GST_STATIC_PAD_TEMPLATE ("videosink",
- GST_PAD_SINK,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS (GST_DECKLINK_CAPS));
+/* the video sink pad template is created on the fly */
static GstStaticPadTemplate gst_decklink_sink_audiosink_template =
GST_STATIC_PAD_TEMPLATE ("audiosink",
@@ -151,16 +152,37 @@ GST_STATIC_PAD_TEMPLATE ("audiosink",
GST_DEBUG_CATEGORY_INIT (gst_decklink_sink_debug_category, "decklinksink", 0, \
"debug category for decklinksink element");
+static void
+gst_decklink_sink_init_interfaces (GType type)
+{
+ static const GInterfaceInfo decklink_sink_propertyprobe_info = {
+ (GInterfaceInitFunc) gst_decklink_sink_property_probe_interface_init,
+ NULL,
+ NULL,
+ };
+
+ GST_DEBUG_CATEGORY_INIT (gst_decklink_sink_debug_category, "decklinksink", 0,
+ "debug category for decklinksink element");
+
+ g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE,
+ &decklink_sink_propertyprobe_info);
+}
+
+
GST_BOILERPLATE_FULL (GstDecklinkSink, gst_decklink_sink, GstElement,
- GST_TYPE_ELEMENT, DEBUG_INIT);
+ GST_TYPE_ELEMENT, gst_decklink_sink_init_interfaces);
static void
gst_decklink_sink_base_init (gpointer g_class)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
+ GstPadTemplate *pad_template;
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&gst_decklink_sink_videosink_template));
+ pad_template =
+ gst_pad_template_new ("videosink", GST_PAD_SINK, GST_PAD_ALWAYS,
+ gst_decklink_mode_get_template_caps ());
+ gst_element_class_add_pad_template (element_class, pad_template);
+ gst_object_unref (pad_template);
gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&gst_decklink_sink_audiosink_template));
@@ -189,11 +211,18 @@ gst_decklink_sink_class_init (GstDecklinkSinkClass * klass)
element_class->query = GST_DEBUG_FUNCPTR (gst_decklink_sink_query);
g_object_class_install_property (gobject_class, PROP_MODE,
- g_param_spec_enum ("mode", "Mode", "Mode",
+ g_param_spec_enum ("mode", "Playback Mode",
+ "Video Mode to use for playback",
GST_TYPE_DECKLINK_MODE, GST_DECKLINK_MODE_NTSC,
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT)));
+ g_object_class_install_property (gobject_class, PROP_DEVICE,
+ g_param_spec_int ("device", "Device", "Capture device instance to use",
+ 0, G_MAXINT, 0,
+ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+ G_PARAM_CONSTRUCT)));
+
}
static void
@@ -202,8 +231,8 @@ gst_decklink_sink_init (GstDecklinkSink * decklinksink,
{
decklinksink->videosinkpad =
- gst_pad_new_from_static_template (&gst_decklink_sink_videosink_template,
- "sink");
+ gst_pad_new_from_template (gst_element_class_get_pad_template
+ (GST_ELEMENT_CLASS (decklinksink_class), "videosink"), "videosink");
gst_pad_set_getcaps_function (decklinksink->videosinkpad,
GST_DEBUG_FUNCPTR (gst_decklink_sink_videosink_getcaps));
gst_pad_set_setcaps_function (decklinksink->videosinkpad,
@@ -271,22 +300,23 @@ gst_decklink_sink_init (GstDecklinkSink * decklinksink,
decklinksink->audio_mutex = g_mutex_new ();
decklinksink->mode = GST_DECKLINK_MODE_NTSC;
+ decklinksink->device = 0;
decklinksink->callback = new Output;
decklinksink->callback->decklinksink = decklinksink;
#ifdef _MSC_VER
- decklinksink->com_init_lock = g_mutex_new();
- decklinksink->com_deinit_lock = g_mutex_new();
- decklinksink->com_initialized = g_cond_new();
- decklinksink->com_uninitialize = g_cond_new();
- decklinksink->com_uninitialized = g_cond_new();
+ decklinksink->com_init_lock = g_mutex_new ();
+ decklinksink->com_deinit_lock = g_mutex_new ();
+ decklinksink->com_initialized = g_cond_new ();
+ decklinksink->com_uninitialize = g_cond_new ();
+ decklinksink->com_uninitialized = g_cond_new ();
g_mutex_lock (decklinksink->com_init_lock);
/* create the COM initialization thread */
- g_thread_create ((GThreadFunc)gst_decklink_sink_com_thread,
- decklinksink, FALSE, NULL);
+ g_thread_create ((GThreadFunc) gst_decklink_sink_com_thread,
+ decklinksink, FALSE, NULL);
/* wait until the COM thread signals that COM has been initialized */
g_cond_wait (decklinksink->com_initialized, decklinksink->com_init_lock);
@@ -307,6 +337,9 @@ gst_decklink_sink_set_property (GObject * object, guint property_id,
case PROP_MODE:
decklinksink->mode = (GstDecklinkModeEnum) g_value_get_enum (value);
break;
+ case PROP_DEVICE:
+ decklinksink->device = g_value_get_int (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -326,6 +359,9 @@ gst_decklink_sink_get_property (GObject * object, guint property_id,
case PROP_MODE:
g_value_set_enum (value, decklinksink->mode);
break;
+ case PROP_DEVICE:
+ g_value_set_int (value, decklinksink->device);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -334,11 +370,11 @@ gst_decklink_sink_get_property (GObject * object, guint property_id,
#ifdef _MSC_VER
static void
-gst_decklink_sink_com_thread (GstDecklinkSink * src)
+gst_decklink_sink_com_thread (GstDecklinkSink * sink)
{
HRESULT res;
- g_mutex_lock (src->com_init_lock);
+ g_mutex_lock (sink->com_init_lock);
/* Initialize COM with a MTA for this process. This thread will
* be the first one to enter the apartement and the last one to leave
@@ -346,28 +382,29 @@ gst_decklink_sink_com_thread (GstDecklinkSink * src)
res = CoInitializeEx (0, COINIT_MULTITHREADED);
if (res == S_FALSE)
- GST_WARNING_OBJECT (src, "COM has been already initialized in the same process");
+ GST_WARNING_OBJECT (sink,
+ "COM has been already initialized in the same process");
else if (res == RPC_E_CHANGED_MODE)
- GST_WARNING_OBJECT (src, "The concurrency model of COM has changed.");
+ GST_WARNING_OBJECT (sink, "The concurrency model of COM has changed.");
else
- GST_INFO_OBJECT (src, "COM intialized succesfully");
+ GST_INFO_OBJECT (sink, "COM intialized succesfully");
- src->comInitialized = TRUE;
+ sink->comInitialized = TRUE;
/* Signal other threads waiting on this condition that COM was initialized */
- g_cond_signal (src->com_initialized);
+ g_cond_signal (sink->com_initialized);
- g_mutex_unlock (src->com_init_lock);
+ g_mutex_unlock (sink->com_init_lock);
/* Wait until the unitialize condition is met to leave the COM apartement */
- g_mutex_lock (src->com_deinit_lock);
- g_cond_wait (src->com_uninitialize, src->com_deinit_lock);
+ g_mutex_lock (sink->com_deinit_lock);
+ g_cond_wait (sink->com_uninitialize, sink->com_deinit_lock);
CoUninitialize ();
- GST_INFO_OBJECT (src, "COM unintialized succesfully");
- src->comInitialized = FALSE;
- g_cond_signal (src->com_uninitialized);
- g_mutex_unlock (src->com_deinit_lock);
+ GST_INFO_OBJECT (sink, "COM unintialized succesfully");
+ sink->comInitialized = FALSE;
+ g_cond_signal (sink->com_uninitialized);
+ g_mutex_unlock (sink->com_deinit_lock);
}
#endif /* _MSC_VER */
@@ -401,7 +438,8 @@ gst_decklink_sink_finalize (GObject * object)
if (decklinksink->comInitialized) {
g_mutex_lock (decklinksink->com_deinit_lock);
g_cond_signal (decklinksink->com_uninitialize);
- g_cond_wait (decklinksink->com_uninitialized, decklinksink->com_deinit_lock);
+ g_cond_wait (decklinksink->com_uninitialized,
+ decklinksink->com_deinit_lock);
g_mutex_unlock (decklinksink->com_deinit_lock);
}
@@ -418,27 +456,19 @@ gst_decklink_sink_finalize (GObject * object)
static gboolean
gst_decklink_sink_start (GstDecklinkSink * decklinksink)
{
- IDeckLinkIterator *iterator;
HRESULT ret;
const GstDecklinkMode *mode;
BMDAudioSampleType sample_depth;
- iterator = CreateDeckLinkIteratorInstance ();
- if (iterator == NULL) {
- GST_ERROR ("no driver");
- return FALSE;
- }
-
- ret = iterator->Next (&decklinksink->decklink);
- if (ret != S_OK) {
- GST_ERROR ("no card");
+ decklinksink->decklink = gst_decklink_get_nth_device (decklinksink->device);
+ if (decklinksink->decklink) {
return FALSE;
}
ret = decklinksink->decklink->QueryInterface (IID_IDeckLinkOutput,
(void **) &decklinksink->output);
if (ret != S_OK) {
- GST_ERROR ("no output");
+ GST_ERROR ("selected device does not have output interface");
return FALSE;
}
@@ -454,8 +484,8 @@ gst_decklink_sink_start (GstDecklinkSink * decklinksink)
}
//decklinksink->video_enabled = TRUE;
- decklinksink->output->
- SetScheduledFrameCompletionCallback (decklinksink->callback);
+ decklinksink->output->SetScheduledFrameCompletionCallback (decklinksink->
+ callback);
sample_depth = bmdAudioSampleType16bitInteger;
ret = decklinksink->output->EnableAudioOutput (bmdAudioSampleRate48kHz,
@@ -1088,16 +1118,18 @@ HRESULT
return S_OK;
}
-HRESULT Output::ScheduledPlaybackHasStopped ()
+HRESULT
+Output::ScheduledPlaybackHasStopped ()
{
GST_ERROR ("ScheduledPlaybackHasStopped");
return S_OK;
}
-HRESULT Output::RenderAudioSamples (bool preroll)
+HRESULT
+Output::RenderAudioSamples (bool preroll)
{
uint32_t samplesWritten;
- GstBuffer * buffer;
+ GstBuffer *buffer;
// guint64 samplesToWrite;
@@ -1107,9 +1139,7 @@ HRESULT Output::RenderAudioSamples (bool preroll)
// running = true;
} else {
g_mutex_lock (decklinksink->audio_mutex);
- decklinksink->output->ScheduleAudioSamples (
- GST_BUFFER_DATA (decklinksink->audio_buffer),
- GST_BUFFER_SIZE (decklinksink->audio_buffer) / 4, // 2 bytes per sample, stereo
+ decklinksink->output->ScheduleAudioSamples (GST_BUFFER_DATA (decklinksink->audio_buffer), GST_BUFFER_SIZE (decklinksink->audio_buffer) / 4, // 2 bytes per sample, stereo
0, 0, &samplesWritten);
buffer =
@@ -1132,3 +1162,125 @@ HRESULT Output::RenderAudioSamples (bool preroll)
return S_OK;
}
+
+
+static const GList *
+gst_decklink_sink_probe_get_properties (GstPropertyProbe * probe)
+{
+ GObjectClass *klass = G_OBJECT_GET_CLASS (probe);
+ static GList *list = NULL;
+ static gsize init = 0;
+
+ if (g_once_init_enter (&init)) {
+ list = g_list_append (NULL, g_object_class_find_property (klass, "device"));
+
+ g_once_init_leave (&init, 1);
+ }
+
+ return list;
+}
+
+
+static gboolean probed = FALSE;
+static int n_devices;
+
+static void
+gst_decklink_sink_class_probe_devices (GstElementClass * klass)
+{
+ IDeckLinkIterator *iterator;
+ IDeckLink *decklink;
+
+ n_devices = 0;
+ iterator = CreateDeckLinkIteratorInstance ();
+ if (iterator) {
+ while (iterator->Next (&decklink) == S_OK) {
+ n_devices++;
+ }
+ }
+
+ probed = TRUE;
+}
+
+static void
+gst_decklink_sink_probe_probe_property (GstPropertyProbe * probe,
+ guint prop_id, const GParamSpec * pspec)
+{
+ GstElementClass *klass = GST_ELEMENT_GET_CLASS (probe);
+
+ switch (prop_id) {
+ case PROP_DEVICE:
+ gst_decklink_sink_class_probe_devices (klass);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec);
+ break;
+ }
+}
+
+static gboolean
+gst_decklink_sink_probe_needs_probe (GstPropertyProbe * probe,
+ guint prop_id, const GParamSpec * pspec)
+{
+ gboolean ret = FALSE;
+
+ switch (prop_id) {
+ case PROP_DEVICE:
+ ret = !probed;
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec);
+ break;
+ }
+ return ret;
+}
+
+static GValueArray *
+gst_decklink_sink_class_list_devices (GstElementClass * klass)
+{
+ GValueArray *array;
+ GValue value = {
+ 0};
+ GList *item;
+ int i;
+
+ array = g_value_array_new (n_devices);
+ g_value_init (&value, G_TYPE_INT);
+ for (i = 0; i < n_devices; i++) {
+ g_value_set_int (&value, i);
+ g_value_array_append (array, &value);
+
+ item = item->next;
+ }
+ g_value_unset (&value);
+
+ return array;
+}
+
+static GValueArray *
+gst_decklink_sink_probe_get_values (GstPropertyProbe * probe,
+ guint prop_id, const GParamSpec * pspec)
+{
+ GstElementClass *klass = GST_ELEMENT_GET_CLASS (probe);
+ GValueArray *array = NULL;
+
+ switch (prop_id) {
+ case PROP_DEVICE:
+ array = gst_decklink_sink_class_list_devices (klass);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec);
+ break;
+ }
+
+ return array;
+}
+
+static void
+gst_decklink_sink_property_probe_interface_init (GstPropertyProbeInterface *
+ iface)
+{
+ iface->get_properties = gst_decklink_sink_probe_get_properties;
+ iface->probe_property = gst_decklink_sink_probe_probe_property;
+ iface->needs_probe = gst_decklink_sink_probe_needs_probe;
+ iface->get_values = gst_decklink_sink_probe_get_values;
+}
diff --git a/sys/decklink/gstdecklinksink.h b/sys/decklink/gstdecklinksink.h
index 31d70cd78..20c47edc2 100644
--- a/sys/decklink/gstdecklinksink.h
+++ b/sys/decklink/gstdecklinksink.h
@@ -75,6 +75,7 @@ struct _GstDecklinkSink
/* properties */
GstDecklinkModeEnum mode;
+ int device;
#ifdef _MSC_VER
gboolean comInitialized;
diff --git a/sys/decklink/gstdecklinksrc.cpp b/sys/decklink/gstdecklinksrc.cpp
index 755cb3dfc..d1a776dce 100644
--- a/sys/decklink/gstdecklinksrc.cpp
+++ b/sys/decklink/gstdecklinksrc.cpp
@@ -45,6 +45,8 @@
#include "gstdecklinksrc.h"
#include "capture.h"
#include <string.h>
+#include <gst/interfaces/propertyprobe.h>
+
GST_DEBUG_CATEGORY (gst_decklink_src_debug_category);
#define GST_CAT_DEFAULT gst_decklink_src_debug_category
@@ -118,6 +120,10 @@ static gboolean gst_decklink_src_video_src_query (GstPad * pad,
GstQuery * query);
static GstIterator *gst_decklink_src_video_src_iterintlink (GstPad * pad);
+static void
+gst_decklinksrc_property_probe_interface_init (GstPropertyProbeInterface *
+ iface);
+
static void gst_decklink_src_task (void *priv);
#ifdef _MSC_VER
@@ -131,7 +137,7 @@ enum
PROP_MODE,
PROP_CONNECTION,
PROP_AUDIO_INPUT,
- PROP_SUBDEVICE
+ PROP_DEVICE
};
/* pad templates */
@@ -147,12 +153,24 @@ GST_STATIC_PAD_TEMPLATE ("audiosrc",
/* class initialization */
-#define DEBUG_INIT(bla) \
- GST_DEBUG_CATEGORY_INIT (gst_decklink_src_debug_category, "decklinksrc", 0, \
+static void
+gst_decklinksrc_init_interfaces (GType type)
+{
+ static const GInterfaceInfo decklinksrc_propertyprobe_info = {
+ (GInterfaceInitFunc) gst_decklinksrc_property_probe_interface_init,
+ NULL,
+ NULL,
+ };
+
+ GST_DEBUG_CATEGORY_INIT (gst_decklink_src_debug_category, "decklinksrc", 0,
"debug category for decklinksrc element");
+ g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE,
+ &decklinksrc_propertyprobe_info);
+}
+
GST_BOILERPLATE_FULL (GstDecklinkSrc, gst_decklink_src, GstElement,
- GST_TYPE_ELEMENT, DEBUG_INIT);
+ GST_TYPE_ELEMENT, gst_decklinksrc_init_interfaces);
static void
gst_decklink_src_base_init (gpointer g_class)
@@ -193,27 +211,29 @@ gst_decklink_src_class_init (GstDecklinkSrcClass * klass)
element_class->query = GST_DEBUG_FUNCPTR (gst_decklink_src_query);
g_object_class_install_property (gobject_class, PROP_MODE,
- g_param_spec_enum ("mode", "Mode", "Mode",
+ g_param_spec_enum ("mode", "Mode", "Video Mode to use for capture",
GST_TYPE_DECKLINK_MODE, GST_DECKLINK_MODE_NTSC,
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT)));
g_object_class_install_property (gobject_class, PROP_CONNECTION,
- g_param_spec_enum ("connection", "Connection", "Connection",
+ g_param_spec_enum ("connection", "Connection",
+ "Video Input Connection to use",
GST_TYPE_DECKLINK_CONNECTION, GST_DECKLINK_CONNECTION_SDI,
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT)));
g_object_class_install_property (gobject_class, PROP_AUDIO_INPUT,
- g_param_spec_enum ("audio-input", "Audio Input", "Audio Input Connection",
+ g_param_spec_enum ("audio-input", "Audio Input",
+ "Audio Input Connection",
GST_TYPE_DECKLINK_AUDIO_CONNECTION,
GST_DECKLINK_AUDIO_CONNECTION_AUTO,
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT)));
- g_object_class_install_property (gobject_class, PROP_SUBDEVICE,
- g_param_spec_int ("subdevice", "Subdevice", "Subdevice",
- 0, 3, 0,
+ g_object_class_install_property (gobject_class, PROP_DEVICE,
+ g_param_spec_int ("device", "Device", "Capture device instance to use",
+ 0, G_MAXINT, 0,
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT)));
}
@@ -294,25 +314,25 @@ gst_decklink_src_init (GstDecklinkSrc * decklinksrc,
decklinksrc->mode = GST_DECKLINK_MODE_NTSC;
decklinksrc->connection = GST_DECKLINK_CONNECTION_SDI;
decklinksrc->audio_connection = GST_DECKLINK_AUDIO_CONNECTION_AUTO;
- decklinksrc->subdevice = 0;
+ decklinksrc->device = 0;
decklinksrc->stop = FALSE;
decklinksrc->dropped_frames = 0;
decklinksrc->dropped_frames_old = 0;
- decklinksrc->frame_num = -1; /* -1 so will be 0 after incrementing */
+ decklinksrc->frame_num = -1; /* -1 so will be 0 after incrementing */
#ifdef _MSC_VER
- decklinksrc->com_init_lock = g_mutex_new();
- decklinksrc->com_deinit_lock = g_mutex_new();
- decklinksrc->com_initialized = g_cond_new();
- decklinksrc->com_uninitialize = g_cond_new();
- decklinksrc->com_uninitialized = g_cond_new();
+ decklinksrc->com_init_lock = g_mutex_new ();
+ decklinksrc->com_deinit_lock = g_mutex_new ();
+ decklinksrc->com_initialized = g_cond_new ();
+ decklinksrc->com_uninitialize = g_cond_new ();
+ decklinksrc->com_uninitialized = g_cond_new ();
g_mutex_lock (decklinksrc->com_init_lock);
/* create the COM initialization thread */
- g_thread_create ((GThreadFunc)gst_decklink_src_com_thread,
- decklinksrc, FALSE, NULL);
+ g_thread_create ((GThreadFunc) gst_decklink_src_com_thread,
+ decklinksrc, FALSE, NULL);
/* wait until the COM thread signals that COM has been initialized */
g_cond_wait (decklinksrc->com_initialized, decklinksrc->com_init_lock);
@@ -341,8 +361,8 @@ gst_decklink_src_set_property (GObject * object, guint property_id,
decklinksrc->audio_connection =
(GstDecklinkAudioConnectionEnum) g_value_get_enum (value);
break;
- case PROP_SUBDEVICE:
- decklinksrc->subdevice = g_value_get_int (value);
+ case PROP_DEVICE:
+ decklinksrc->device = g_value_get_int (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -369,8 +389,8 @@ gst_decklink_src_get_property (GObject * object, guint property_id,
case PROP_AUDIO_INPUT:
g_value_set_enum (value, decklinksrc->audio_connection);
break;
- case PROP_SUBDEVICE:
- g_value_set_int (value, decklinksrc->subdevice);
+ case PROP_DEVICE:
+ g_value_set_int (value, decklinksrc->device);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -392,7 +412,8 @@ gst_decklink_src_com_thread (GstDecklinkSrc * src)
res = CoInitializeEx (0, COINIT_MULTITHREADED);
if (res == S_FALSE)
- GST_WARNING_OBJECT (src, "COM has been already initialized in the same process");
+ GST_WARNING_OBJECT (src,
+ "COM has been already initialized in the same process");
else if (res == RPC_E_CHANGED_MODE)
GST_WARNING_OBJECT (src, "The concurrency model of COM has changed.");
else
@@ -447,7 +468,6 @@ gst_decklink_src_finalize (GObject * object)
if (decklinksrc->video_caps) {
gst_caps_unref (decklinksrc->video_caps);
}
-
#ifdef _MSC_VER
/* signal the COM thread that it should uninitialize COM */
if (decklinksrc->comInitialized) {
@@ -487,7 +507,6 @@ static gboolean
gst_decklink_src_start (GstElement * element)
{
GstDecklinkSrc *decklinksrc = GST_DECKLINK_SRC (element);
- IDeckLinkIterator *iterator;
DeckLinkCaptureDelegate *delegate;
//IDeckLinkDisplayModeIterator *mode_iterator;
//IDeckLinkDisplayMode *mode;
@@ -498,33 +517,18 @@ gst_decklink_src_start (GstElement * element)
IDeckLinkConfiguration *config;
BMDVideoConnection conn;
BMDAudioConnection aconn;
- int i;
GST_DEBUG_OBJECT (decklinksrc, "start");
- iterator = CreateDeckLinkIteratorInstance ();
- if (iterator == NULL) {
- GST_ERROR ("no driver");
+ decklinksrc->decklink = gst_decklink_get_nth_device (decklinksrc->device);
+ if (decklinksrc->decklink == NULL) {
return FALSE;
}
- ret = iterator->Next (&decklinksrc->decklink);
- if (ret != S_OK) {
- GST_ERROR ("no card");
- return FALSE;
- }
- for (i = 0; i < decklinksrc->subdevice; i++) {
- ret = iterator->Next (&decklinksrc->decklink);
- if (ret != S_OK) {
- GST_ERROR ("no card");
- return FALSE;
- }
- }
-
ret = decklinksrc->decklink->QueryInterface (IID_IDeckLinkInput,
(void **) &decklinksrc->input);
if (ret != S_OK) {
- GST_ERROR ("query interface failed");
+ GST_ERROR ("selected device does not have input interface");
return FALSE;
}
@@ -672,6 +676,9 @@ gst_decklink_src_stop (GstElement * element)
decklinksrc->input->Release ();
decklinksrc->input = NULL;
+ decklinksrc->decklink->Release ();
+ decklinksrc->decklink = NULL;
+
return TRUE;
}
@@ -759,8 +766,18 @@ gst_decklink_src_send_event (GstElement * element, GstEvent * event)
static gboolean
gst_decklink_src_query (GstElement * element, GstQuery * query)
{
+ GstDecklinkSrc *decklinksrc = GST_DECKLINK_SRC (element);
+ gboolean ret;
- return FALSE;
+ GST_DEBUG_OBJECT (decklinksrc, "query");
+
+ switch (GST_QUERY_TYPE (query)) {
+ default:
+ ret = GST_ELEMENT_CLASS (parent_class)->query (element, query);
+ break;
+ }
+
+ return ret;
}
static GstCaps *
@@ -783,28 +800,39 @@ static gboolean
gst_decklink_src_audio_src_setcaps (GstPad * pad, GstCaps * caps)
{
GstDecklinkSrc *decklinksrc;
+ GstCaps *pad_caps;
+ gboolean can_intersect;
decklinksrc = GST_DECKLINK_SRC (gst_pad_get_parent (pad));
+ pad_caps = gst_pad_get_caps_reffed (pad);
+ can_intersect = gst_caps_can_intersect (pad_caps, caps);
+ gst_caps_unref (pad_caps);
+
GST_DEBUG_OBJECT (decklinksrc, "setcaps");
gst_object_unref (decklinksrc);
- return TRUE;
+ return can_intersect;
}
static gboolean
gst_decklink_src_audio_src_acceptcaps (GstPad * pad, GstCaps * caps)
{
GstDecklinkSrc *decklinksrc;
+ GstCaps *pad_caps;
+ gboolean can_intersect;
decklinksrc = GST_DECKLINK_SRC (gst_pad_get_parent (pad));
- GST_DEBUG_OBJECT (decklinksrc, "acceptcaps");
+ pad_caps = gst_pad_get_caps_reffed (pad);
+ can_intersect = gst_caps_can_intersect (pad_caps, caps);
+ gst_caps_unref (pad_caps);
+ GST_DEBUG_OBJECT (decklinksrc, "acceptcaps");
gst_object_unref (decklinksrc);
- return TRUE;
+ return can_intersect;
}
static void
@@ -865,9 +893,8 @@ gst_decklink_src_audio_src_activatepull (GstPad * pad, gboolean active)
GST_DEBUG_OBJECT (decklinksrc, "activatepull");
-
gst_object_unref (decklinksrc);
- return TRUE;
+ return FALSE;
}
static GstPadLinkReturn
@@ -976,28 +1003,39 @@ static gboolean
gst_decklink_src_video_src_setcaps (GstPad * pad, GstCaps * caps)
{
GstDecklinkSrc *decklinksrc;
+ GstCaps *mode_caps;
+ gboolean can_intersect;
decklinksrc = GST_DECKLINK_SRC (gst_pad_get_parent (pad));
GST_DEBUG_OBJECT (decklinksrc, "setcaps");
+ mode_caps = gst_decklink_mode_get_caps (decklinksrc->mode);
+ can_intersect = gst_caps_can_intersect (mode_caps, caps);
+ gst_caps_unref (mode_caps);
gst_object_unref (decklinksrc);
- return TRUE;
+ return can_intersect;
}
static gboolean
gst_decklink_src_video_src_acceptcaps (GstPad * pad, GstCaps * caps)
{
GstDecklinkSrc *decklinksrc;
+ GstCaps *mode_caps;
+ gboolean can_intersect;
+
decklinksrc = GST_DECKLINK_SRC (gst_pad_get_parent (pad));
GST_DEBUG_OBJECT (decklinksrc, "acceptcaps");
+ mode_caps = gst_decklink_mode_get_caps (decklinksrc->mode);
+ can_intersect = gst_caps_can_intersect (mode_caps, caps);
+ gst_caps_unref (mode_caps);
gst_object_unref (decklinksrc);
- return TRUE;
+ return can_intersect;
}
static void
@@ -1060,7 +1098,7 @@ gst_decklink_src_video_src_activatepull (GstPad * pad, gboolean active)
gst_object_unref (decklinksrc);
- return TRUE;
+ return FALSE;
}
static GstPadLinkReturn
@@ -1115,7 +1153,7 @@ gst_decklink_src_video_src_event (GstPad * pad, GstEvent * event)
static gboolean
gst_decklink_src_video_src_query (GstPad * pad, GstQuery * query)
{
- gboolean res;
+ gboolean ret;
GstDecklinkSrc *decklinksrc;
decklinksrc = GST_DECKLINK_SRC (gst_pad_get_parent (pad));
@@ -1123,13 +1161,45 @@ gst_decklink_src_video_src_query (GstPad * pad, GstQuery * query)
GST_DEBUG_OBJECT (decklinksrc, "query");
switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_LATENCY:{
+ GstClockTime min_latency, max_latency;
+ const GstDecklinkMode *mode;
+
+ /* device must be open */
+ if (decklinksrc->decklink == NULL) {
+ GST_WARNING_OBJECT (decklinksrc,
+ "Can't give latency since device isn't open !");
+ goto done;
+ }
+
+ mode = gst_decklink_get_mode (decklinksrc->mode);
+
+ /* min latency is the time to capture one frame */
+ min_latency =
+ gst_util_uint64_scale_int (GST_SECOND, mode->fps_d, mode->fps_n);
+
+ /* max latency is total duration of the frame buffer */
+ max_latency = 2 * min_latency;
+
+ GST_DEBUG_OBJECT (decklinksrc,
+ "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);
+
+ ret = TRUE;
+ break;
+ }
default:
- res = gst_pad_query_default (pad, query);
+ ret = gst_pad_query_default (pad, query);
break;
}
+done:
gst_object_unref (decklinksrc);
- return res;
+ return ret;
}
static GstIterator *
@@ -1190,10 +1260,9 @@ gst_decklink_src_task (void *priv)
/* warning on dropped frames */
if (decklinksrc->dropped_frames - decklinksrc->dropped_frames_old > 0) {
GST_ELEMENT_WARNING (decklinksrc, RESOURCE, READ,
- ("Dropped %d frame(s), for a total of %d frame(s)",
- decklinksrc->dropped_frames - decklinksrc->dropped_frames_old,
- decklinksrc->dropped_frames),
- (NULL));
+ ("Dropped %d frame(s), for a total of %d frame(s)",
+ decklinksrc->dropped_frames - decklinksrc->dropped_frames_old,
+ decklinksrc->dropped_frames), (NULL));
decklinksrc->dropped_frames_old = decklinksrc->dropped_frames;
}
@@ -1233,11 +1302,28 @@ gst_decklink_src_task (void *priv)
event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0,
GST_CLOCK_TIME_NONE, 0);
- ret = gst_pad_push_event (decklinksrc->videosrcpad, event);
- if (!ret) {
- GST_ERROR_OBJECT (decklinksrc, "new segment event ret=%d", ret);
- return;
+ if (gst_pad_is_linked (decklinksrc->videosrcpad)) {
+ gst_event_ref (event);
+ ret = gst_pad_push_event (decklinksrc->videosrcpad, event);
+ if (!ret) {
+ GST_ERROR_OBJECT (decklinksrc, "new segment event ret=%d", ret);
+ gst_event_unref (event);
+ return;
+ }
+ } else {
+ gst_event_unref (event);
+ }
+
+ if (gst_pad_is_linked (decklinksrc->audiosrcpad)) {
+ ret = gst_pad_push_event (decklinksrc->audiosrcpad, event);
+ if (!ret) {
+ GST_ERROR_OBJECT (decklinksrc, "new segment event ret=%d", ret);
+ gst_event_unref (event);
+ }
+ } else {
+ gst_event_unref (event);
}
+
}
if (decklinksrc->video_caps == NULL) {
@@ -1246,8 +1332,11 @@ gst_decklink_src_task (void *priv)
gst_buffer_set_caps (buffer, decklinksrc->video_caps);
ret = gst_pad_push (decklinksrc->videosrcpad, buffer);
- if (ret != GST_FLOW_OK) {
- GST_ELEMENT_ERROR (decklinksrc, CORE, NEGOTIATION, (NULL), (NULL));
+ if (!(ret == GST_FLOW_OK || ret == GST_FLOW_NOT_LINKED ||
+ ret == GST_FLOW_WRONG_STATE)) {
+ GST_ELEMENT_ERROR (decklinksrc, STREAM, FAILED,
+ ("Internal data stream error."),
+ ("stream stopped, reason %s", gst_flow_get_name (ret)));
}
if (gst_pad_is_linked (decklinksrc->audiosrcpad)) {
@@ -1260,9 +1349,7 @@ gst_decklink_src_task (void *priv)
gst_util_uint64_scale_int (decklinksrc->num_audio_samples * GST_SECOND,
1, 48000);
GST_BUFFER_DURATION (audio_buffer) =
- gst_util_uint64_scale_int ((decklinksrc->num_audio_samples +
- n_samples) * GST_SECOND, 1,
- 48000) - GST_BUFFER_TIMESTAMP (audio_buffer);
+ gst_util_uint64_scale_int (n_samples * GST_SECOND, 1, 48000);
decklinksrc->num_audio_samples += n_samples;
if (decklinksrc->audio_caps == NULL) {
@@ -1276,9 +1363,132 @@ gst_decklink_src_task (void *priv)
gst_buffer_set_caps (audio_buffer, decklinksrc->audio_caps);
ret = gst_pad_push (decklinksrc->audiosrcpad, audio_buffer);
- if (ret != GST_FLOW_OK) {
- GST_ELEMENT_ERROR (decklinksrc, CORE, NEGOTIATION, (NULL), (NULL));
+ if (!(ret == GST_FLOW_OK || ret == GST_FLOW_NOT_LINKED ||
+ ret == GST_FLOW_WRONG_STATE)) {
+ GST_ELEMENT_ERROR (decklinksrc, STREAM, FAILED,
+ ("Internal data stream error."),
+ ("stream stopped, reason %s", gst_flow_get_name (ret)));
}
}
audio_frame->Release ();
}
+
+
+static const GList *
+gst_decklinksrc_probe_get_properties (GstPropertyProbe * probe)
+{
+ GObjectClass *klass = G_OBJECT_GET_CLASS (probe);
+ static GList *list = NULL;
+ static gsize init = 0;
+
+ if (g_once_init_enter (&init)) {
+ list = g_list_append (NULL, g_object_class_find_property (klass, "device"));
+
+ g_once_init_leave (&init, 1);
+ }
+
+ return list;
+}
+
+static gboolean probed = FALSE;
+static int n_devices;
+
+static void
+gst_decklinksrc_class_probe_devices (GstElementClass * klass)
+{
+ IDeckLinkIterator *iterator;
+ IDeckLink *decklink;
+
+ n_devices = 0;
+ iterator = CreateDeckLinkIteratorInstance ();
+ if (iterator) {
+ while (iterator->Next (&decklink) == S_OK) {
+ n_devices++;
+ }
+ }
+
+ probed = TRUE;
+}
+
+static void
+gst_decklinksrc_probe_probe_property (GstPropertyProbe * probe,
+ guint prop_id, const GParamSpec * pspec)
+{
+ GstElementClass *klass = GST_ELEMENT_GET_CLASS (probe);
+
+ switch (prop_id) {
+ case PROP_DEVICE:
+ gst_decklinksrc_class_probe_devices (klass);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec);
+ break;
+ }
+}
+
+static gboolean
+gst_decklinksrc_probe_needs_probe (GstPropertyProbe * probe,
+ guint prop_id, const GParamSpec * pspec)
+{
+ gboolean ret = FALSE;
+
+ switch (prop_id) {
+ case PROP_DEVICE:
+ ret = !probed;
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec);
+ break;
+ }
+ return ret;
+}
+
+static GValueArray *
+gst_decklinksrc_class_list_devices (GstElementClass * klass)
+{
+ GValueArray *array;
+ GValue value = { 0 };
+ GList *item;
+ int i;
+
+ array = g_value_array_new (n_devices);
+ g_value_init (&value, G_TYPE_INT);
+ for (i = 0; i < n_devices; i++) {
+ g_value_set_int (&value, i);
+ g_value_array_append (array, &value);
+
+ item = item->next;
+ }
+ g_value_unset (&value);
+
+ return array;
+}
+
+static GValueArray *
+gst_decklinksrc_probe_get_values (GstPropertyProbe * probe,
+ guint prop_id, const GParamSpec * pspec)
+{
+ GstElementClass *klass = GST_ELEMENT_GET_CLASS (probe);
+ GValueArray *array = NULL;
+
+ switch (prop_id) {
+ case PROP_DEVICE:
+ array = gst_decklinksrc_class_list_devices (klass);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec);
+ break;
+ }
+
+ return array;
+}
+
+static void
+gst_decklinksrc_property_probe_interface_init (GstPropertyProbeInterface *
+ iface)
+{
+ iface->get_properties = gst_decklinksrc_probe_get_properties;
+ iface->probe_property = gst_decklinksrc_probe_probe_property;
+ iface->needs_probe = gst_decklinksrc_probe_needs_probe;
+ iface->get_values = gst_decklinksrc_probe_get_values;
+}
diff --git a/sys/decklink/gstdecklinksrc.h b/sys/decklink/gstdecklinksrc.h
index 69dea49f1..c47279a88 100644
--- a/sys/decklink/gstdecklinksrc.h
+++ b/sys/decklink/gstdecklinksrc.h
@@ -73,7 +73,7 @@ struct _GstDecklinkSrc
GstDecklinkModeEnum mode;
GstDecklinkConnectionEnum connection;
GstDecklinkAudioConnectionEnum audio_connection;
- int subdevice;
+ int device;
#ifdef _MSC_VER
gboolean comInitialized;
diff --git a/sys/decklink/osx/DeckLinkAPI.h b/sys/decklink/osx/DeckLinkAPI.h
new file mode 100644
index 000000000..b629369a7
--- /dev/null
+++ b/sys/decklink/osx/DeckLinkAPI.h
@@ -0,0 +1,695 @@
+/* -LICENSE-START-
+** Copyright (c) 2011 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
+** this license (the "Software") to use, reproduce, display, distribute,
+** execute, and transmit the Software, and to prepare derivative works of the
+** Software, and to permit third-parties to whom the Software is furnished to
+** do so, all subject to the following:
+**
+** The copyright notices in the Software and this entire statement, including
+** the above license grant, this restriction and the following disclaimer,
+** must be included in all copies of the Software, in whole or in part, and
+** all derivative works of the Software, unless such copies or derivative
+** works are solely in the form of machine-executable object code generated by
+** a source language processor.
+**
+** 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+** DEALINGS IN THE SOFTWARE.
+** -LICENSE-END-
+*/
+
+#ifndef BMD_DECKLINKAPI_H
+#define BMD_DECKLINKAPI_H
+
+/* DeckLink API */
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <CoreFoundation/CFPlugInCOM.h>
+#include <stdint.h>
+
+#include "DeckLinkAPITypes.h"
+#include "DeckLinkAPIModes.h"
+#include "DeckLinkAPIDiscovery.h"
+#include "DeckLinkAPIConfiguration.h"
+#include "DeckLinkAPIDeckControl.h"
+
+#include "DeckLinkAPIStreaming.h"
+
+#define BLACKMAGIC_DECKLINK_API_MAGIC 1
+
+// Type Declarations
+
+
+// Interface ID Declarations
+
+#define IID_IDeckLinkVideoOutputCallback /* 20AA5225-1958-47CB-820B-80A8D521A6EE */ (REFIID){0x20,0xAA,0x52,0x25,0x19,0x58,0x47,0xCB,0x82,0x0B,0x80,0xA8,0xD5,0x21,0xA6,0xEE}
+#define IID_IDeckLinkInputCallback /* DD04E5EC-7415-42AB-AE4A-E80C4DFC044A */ (REFIID){0xDD,0x04,0xE5,0xEC,0x74,0x15,0x42,0xAB,0xAE,0x4A,0xE8,0x0C,0x4D,0xFC,0x04,0x4A}
+#define IID_IDeckLinkMemoryAllocator /* B36EB6E7-9D29-4AA8-92EF-843B87A289E8 */ (REFIID){0xB3,0x6E,0xB6,0xE7,0x9D,0x29,0x4A,0xA8,0x92,0xEF,0x84,0x3B,0x87,0xA2,0x89,0xE8}
+#define IID_IDeckLinkAudioOutputCallback /* 403C681B-7F46-4A12-B993-2BB127084EE6 */ (REFIID){0x40,0x3C,0x68,0x1B,0x7F,0x46,0x4A,0x12,0xB9,0x93,0x2B,0xB1,0x27,0x08,0x4E,0xE6}
+#define IID_IDeckLinkIterator /* 50FB36CD-3063-4B73-BDBB-958087F2D8BA */ (REFIID){0x50,0xFB,0x36,0xCD,0x30,0x63,0x4B,0x73,0xBD,0xBB,0x95,0x80,0x87,0xF2,0xD8,0xBA}
+#define IID_IDeckLinkAPIInformation /* 7BEA3C68-730D-4322-AF34-8A7152B532A4 */ (REFIID){0x7B,0xEA,0x3C,0x68,0x73,0x0D,0x43,0x22,0xAF,0x34,0x8A,0x71,0x52,0xB5,0x32,0xA4}
+#define IID_IDeckLinkOutput /* A3EF0963-0862-44ED-92A9-EE89ABF431C7 */ (REFIID){0xA3,0xEF,0x09,0x63,0x08,0x62,0x44,0xED,0x92,0xA9,0xEE,0x89,0xAB,0xF4,0x31,0xC7}
+#define IID_IDeckLinkInput /* 6D40EF78-28B9-4E21-990D-95BB7750A04F */ (REFIID){0x6D,0x40,0xEF,0x78,0x28,0xB9,0x4E,0x21,0x99,0x0D,0x95,0xBB,0x77,0x50,0xA0,0x4F}
+#define IID_IDeckLinkVideoFrame /* 3F716FE0-F023-4111-BE5D-EF4414C05B17 */ (REFIID){0x3F,0x71,0x6F,0xE0,0xF0,0x23,0x41,0x11,0xBE,0x5D,0xEF,0x44,0x14,0xC0,0x5B,0x17}
+#define IID_IDeckLinkMutableVideoFrame /* 69E2639F-40DA-4E19-B6F2-20ACE815C390 */ (REFIID){0x69,0xE2,0x63,0x9F,0x40,0xDA,0x4E,0x19,0xB6,0xF2,0x20,0xAC,0xE8,0x15,0xC3,0x90}
+#define IID_IDeckLinkVideoFrame3DExtensions /* DA0F7E4A-EDC7-48A8-9CDD-2DB51C729CD7 */ (REFIID){0xDA,0x0F,0x7E,0x4A,0xED,0xC7,0x48,0xA8,0x9C,0xDD,0x2D,0xB5,0x1C,0x72,0x9C,0xD7}
+#define IID_IDeckLinkVideoInputFrame /* 05CFE374-537C-4094-9A57-680525118F44 */ (REFIID){0x05,0xCF,0xE3,0x74,0x53,0x7C,0x40,0x94,0x9A,0x57,0x68,0x05,0x25,0x11,0x8F,0x44}
+#define IID_IDeckLinkVideoFrameAncillary /* 732E723C-D1A4-4E29-9E8E-4A88797A0004 */ (REFIID){0x73,0x2E,0x72,0x3C,0xD1,0xA4,0x4E,0x29,0x9E,0x8E,0x4A,0x88,0x79,0x7A,0x00,0x04}
+#define IID_IDeckLinkAudioInputPacket /* E43D5870-2894-11DE-8C30-0800200C9A66 */ (REFIID){0xE4,0x3D,0x58,0x70,0x28,0x94,0x11,0xDE,0x8C,0x30,0x08,0x00,0x20,0x0C,0x9A,0x66}
+#define IID_IDeckLinkScreenPreviewCallback /* B1D3F49A-85FE-4C5D-95C8-0B5D5DCCD438 */ (REFIID){0xB1,0xD3,0xF4,0x9A,0x85,0xFE,0x4C,0x5D,0x95,0xC8,0x0B,0x5D,0x5D,0xCC,0xD4,0x38}
+#define IID_IDeckLinkCocoaScreenPreviewCallback /* D174152F-8F96-4C07-83A5-DD5F5AF0A2AA */ (REFIID){0xD1,0x74,0x15,0x2F,0x8F,0x96,0x4C,0x07,0x83,0xA5,0xDD,0x5F,0x5A,0xF0,0xA2,0xAA}
+#define IID_IDeckLinkGLScreenPreviewHelper /* 504E2209-CAC7-4C1A-9FB4-C5BB6274D22F */ (REFIID){0x50,0x4E,0x22,0x09,0xCA,0xC7,0x4C,0x1A,0x9F,0xB4,0xC5,0xBB,0x62,0x74,0xD2,0x2F}
+#define IID_IDeckLinkAttributes /* ABC11843-D966-44CB-96E2-A1CB5D3135C4 */ (REFIID){0xAB,0xC1,0x18,0x43,0xD9,0x66,0x44,0xCB,0x96,0xE2,0xA1,0xCB,0x5D,0x31,0x35,0xC4}
+#define IID_IDeckLinkKeyer /* 89AFCAF5-65F8-421E-98F7-96FE5F5BFBA3 */ (REFIID){0x89,0xAF,0xCA,0xF5,0x65,0xF8,0x42,0x1E,0x98,0xF7,0x96,0xFE,0x5F,0x5B,0xFB,0xA3}
+#define IID_IDeckLinkVideoConversion /* 3BBCB8A2-DA2C-42D9-B5D8-88083644E99A */ (REFIID){0x3B,0xBC,0xB8,0xA2,0xDA,0x2C,0x42,0xD9,0xB5,0xD8,0x88,0x08,0x36,0x44,0xE9,0x9A}
+
+/* Enum BMDVideoOutputFlags - Flags to control the output of ancillary data along with video. */
+
+typedef uint32_t BMDVideoOutputFlags;
+enum _BMDVideoOutputFlags {
+ bmdVideoOutputFlagDefault = 0,
+ bmdVideoOutputVANC = 1 << 0,
+ bmdVideoOutputVITC = 1 << 1,
+ bmdVideoOutputRP188 = 1 << 2,
+ bmdVideoOutputDualStream3D = 1 << 4
+};
+
+/* Enum BMDFrameFlags - Frame flags */
+
+typedef uint32_t BMDFrameFlags;
+enum _BMDFrameFlags {
+ bmdFrameFlagDefault = 0,
+ bmdFrameFlagFlipVertical = 1 << 0,
+
+ /* Flags that are applicable only to instances of IDeckLinkVideoInputFrame */
+
+ bmdFrameHasNoInputSource = 1 << 31
+};
+
+/* Enum BMDVideoInputFlags - Flags applicable to video input */
+
+typedef uint32_t BMDVideoInputFlags;
+enum _BMDVideoInputFlags {
+ bmdVideoInputFlagDefault = 0,
+ bmdVideoInputEnableFormatDetection = 1 << 0,
+ bmdVideoInputDualStream3D = 1 << 1
+};
+
+/* Enum BMDVideoInputFormatChangedEvents - Bitmask passed to the VideoInputFormatChanged notification to identify the properties of the input signal that have changed */
+
+typedef uint32_t BMDVideoInputFormatChangedEvents;
+enum _BMDVideoInputFormatChangedEvents {
+ bmdVideoInputDisplayModeChanged = 1 << 0,
+ bmdVideoInputFieldDominanceChanged = 1 << 1,
+ bmdVideoInputColorspaceChanged = 1 << 2
+};
+
+/* Enum BMDDetectedVideoInputFormatFlags - Flags passed to the VideoInputFormatChanged notification to describe the detected video input signal */
+
+typedef uint32_t BMDDetectedVideoInputFormatFlags;
+enum _BMDDetectedVideoInputFormatFlags {
+ bmdDetectedVideoInputYCbCr422 = 1 << 0,
+ bmdDetectedVideoInputRGB444 = 1 << 1
+};
+
+/* Enum BMDOutputFrameCompletionResult - Frame Completion Callback */
+
+typedef uint32_t BMDOutputFrameCompletionResult;
+enum _BMDOutputFrameCompletionResult {
+ bmdOutputFrameCompleted,
+ bmdOutputFrameDisplayedLate,
+ bmdOutputFrameDropped,
+ bmdOutputFrameFlushed
+};
+
+/* Enum BMDReferenceStatus - GenLock input status */
+
+typedef uint32_t BMDReferenceStatus;
+enum _BMDReferenceStatus {
+ bmdReferenceNotSupportedByHardware = 1 << 0,
+ bmdReferenceLocked = 1 << 1
+};
+
+/* Enum BMDAudioSampleRate - Audio sample rates supported for output/input */
+
+typedef uint32_t BMDAudioSampleRate;
+enum _BMDAudioSampleRate {
+ bmdAudioSampleRate48kHz = 48000
+};
+
+/* Enum BMDAudioSampleType - Audio sample sizes supported for output/input */
+
+typedef uint32_t BMDAudioSampleType;
+enum _BMDAudioSampleType {
+ bmdAudioSampleType16bitInteger = 16,
+ bmdAudioSampleType32bitInteger = 32
+};
+
+/* Enum BMDAudioOutputStreamType - Audio output stream type */
+
+typedef uint32_t BMDAudioOutputStreamType;
+enum _BMDAudioOutputStreamType {
+ bmdAudioOutputStreamContinuous,
+ bmdAudioOutputStreamContinuousDontResample,
+ bmdAudioOutputStreamTimestamped
+};
+
+/* Enum BMDDisplayModeSupport - Output mode supported flags */
+
+typedef uint32_t BMDDisplayModeSupport;
+enum _BMDDisplayModeSupport {
+ bmdDisplayModeNotSupported = 0,
+ bmdDisplayModeSupported,
+ bmdDisplayModeSupportedWithConversion
+};
+
+/* Enum BMDTimecodeFormat - Timecode formats for frame metadata */
+
+typedef uint32_t BMDTimecodeFormat;
+enum _BMDTimecodeFormat {
+ bmdTimecodeRP188VITC1 = 'rpv1', // RP188 timecode where DBB1 equals VITC1 (line 9)
+ bmdTimecodeRP188VITC2 = 'rp12', // RP188 timecode where DBB1 equals VITC2 (line 571)
+ bmdTimecodeRP188LTC = 'rplt', // RP188 timecode where DBB1 equals LTC (line 10)
+ bmdTimecodeRP188Any = 'rp18', // For capture: return the first valid timecode in {VITC1, LTC ,VITC2} - For playback: set the timecode as VITC1
+ bmdTimecodeVITC = 'vitc',
+ bmdTimecodeVITCField2 = 'vit2',
+ bmdTimecodeSerial = 'seri'
+};
+
+/* Enum BMDAnalogVideoFlags - Analog video display flags */
+
+typedef uint32_t BMDAnalogVideoFlags;
+enum _BMDAnalogVideoFlags {
+ bmdAnalogVideoFlagCompositeSetup75 = 1 << 0,
+ bmdAnalogVideoFlagComponentBetacamLevels = 1 << 1
+};
+
+/* Enum BMDAudioConnection - Audio connection types */
+
+typedef uint32_t BMDAudioConnection;
+enum _BMDAudioConnection {
+ bmdAudioConnectionEmbedded = 'embd',
+ bmdAudioConnectionAESEBU = 'aes ',
+ bmdAudioConnectionAnalog = 'anlg'
+};
+
+/* Enum BMDAudioOutputAnalogAESSwitch - Audio output Analog/AESEBU switch */
+
+typedef uint32_t BMDAudioOutputAnalogAESSwitch;
+enum _BMDAudioOutputAnalogAESSwitch {
+ bmdAudioOutputSwitchAESEBU = 'aes ',
+ bmdAudioOutputSwitchAnalog = 'anlg'
+};
+
+/* Enum BMDVideoOutputConversionMode - Video/audio conversion mode */
+
+typedef uint32_t BMDVideoOutputConversionMode;
+enum _BMDVideoOutputConversionMode {
+ bmdNoVideoOutputConversion = 'none',
+ bmdVideoOutputLetterboxDownconversion = 'ltbx',
+ bmdVideoOutputAnamorphicDownconversion = 'amph',
+ bmdVideoOutputHD720toHD1080Conversion = '720c',
+ bmdVideoOutputHardwareLetterboxDownconversion = 'HWlb',
+ bmdVideoOutputHardwareAnamorphicDownconversion = 'HWam',
+ bmdVideoOutputHardwareCenterCutDownconversion = 'HWcc',
+ bmdVideoOutputHardware720p1080pCrossconversion = 'xcap',
+ bmdVideoOutputHardwareAnamorphic720pUpconversion = 'ua7p',
+ bmdVideoOutputHardwareAnamorphic1080iUpconversion = 'ua1i',
+ bmdVideoOutputHardwareAnamorphic149To720pUpconversion = 'u47p',
+ bmdVideoOutputHardwareAnamorphic149To1080iUpconversion = 'u41i',
+ bmdVideoOutputHardwarePillarbox720pUpconversion = 'up7p',
+ bmdVideoOutputHardwarePillarbox1080iUpconversion = 'up1i'
+};
+
+/* Enum BMDVideoInputConversionMode - Video input conversion mode */
+
+typedef uint32_t BMDVideoInputConversionMode;
+enum _BMDVideoInputConversionMode {
+ bmdNoVideoInputConversion = 'none',
+ bmdVideoInputLetterboxDownconversionFromHD1080 = '10lb',
+ bmdVideoInputAnamorphicDownconversionFromHD1080 = '10am',
+ bmdVideoInputLetterboxDownconversionFromHD720 = '72lb',
+ bmdVideoInputAnamorphicDownconversionFromHD720 = '72am',
+ bmdVideoInputLetterboxUpconversion = 'lbup',
+ bmdVideoInputAnamorphicUpconversion = 'amup'
+};
+
+/* Enum BMDVideo3DPackingFormat - Video 3D packing format */
+
+typedef uint32_t BMDVideo3DPackingFormat;
+enum _BMDVideo3DPackingFormat {
+ bmdVideo3DPackingSidebySideHalf = 'sbsh',
+ bmdVideo3DPackingLinebyLine = 'lbyl',
+ bmdVideo3DPackingTopAndBottom = 'tabo',
+ bmdVideo3DPackingFramePacking = 'frpk',
+ bmdVideo3DPackingLeftOnly = 'left',
+ bmdVideo3DPackingRightOnly = 'righ'
+};
+
+/* Enum BMDIdleVideoOutputOperation - Video output operation when not playing video */
+
+typedef uint32_t BMDIdleVideoOutputOperation;
+enum _BMDIdleVideoOutputOperation {
+ bmdIdleVideoOutputBlack = 'blac',
+ bmdIdleVideoOutputLastFrame = 'lafa',
+ bmdIdleVideoOutputDesktop = 'desk'
+};
+
+/* Enum BMDDeckLinkAttributeID - DeckLink Attribute ID */
+
+typedef uint32_t BMDDeckLinkAttributeID;
+enum _BMDDeckLinkAttributeID {
+
+ /* Flags */
+
+ BMDDeckLinkSupportsInternalKeying = 'keyi',
+ BMDDeckLinkSupportsExternalKeying = 'keye',
+ BMDDeckLinkSupportsHDKeying = 'keyh',
+ BMDDeckLinkSupportsInputFormatDetection = 'infd',
+ BMDDeckLinkHasReferenceInput = 'hrin',
+ BMDDeckLinkHasSerialPort = 'hspt',
+ BMDDeckLinkHasAnalogVideoOutputGain = 'avog',
+ BMDDeckLinkCanOnlyAdjustOverallVideoOutputGain = 'ovog',
+ BMDDeckLinkHasVideoInputAntiAliasingFilter = 'aafl',
+ BMDDeckLinkHasBypass = 'byps',
+ BMDDeckLinkSupportsDesktopDisplay = 'extd',
+
+ /* Integers */
+
+ BMDDeckLinkMaximumAudioChannels = 'mach',
+ BMDDeckLinkNumberOfSubDevices = 'nsbd',
+ BMDDeckLinkSubDeviceIndex = 'subi',
+ BMDDeckLinkVideoOutputConnections = 'vocn',
+ BMDDeckLinkVideoInputConnections = 'vicn',
+ BMDDeckLinkDeviceBusyState = 'dbst',
+
+ /* Floats */
+
+ BMDDeckLinkVideoInputGainMinimum = 'vigm',
+ BMDDeckLinkVideoInputGainMaximum = 'vigx',
+ BMDDeckLinkVideoOutputGainMinimum = 'vogm',
+ BMDDeckLinkVideoOutputGainMaximum = 'vogx',
+
+ /* Strings */
+
+ BMDDeckLinkSerialPortDeviceName = 'slpn'
+};
+
+/* Enum BMDDeckLinkAPIInformationID - DeckLinkAPI information ID */
+
+typedef uint32_t BMDDeckLinkAPIInformationID;
+enum _BMDDeckLinkAPIInformationID {
+ BMDDeckLinkAPIVersion = 'vers'
+};
+
+/* Enum BMDDeviceBusyState - Current device busy state */
+
+typedef uint32_t BMDDeviceBusyState;
+enum _BMDDeviceBusyState {
+ bmdDeviceCaptureBusy = 1 << 0,
+ bmdDevicePlaybackBusy = 1 << 1,
+ bmdDeviceSerialPortBusy = 1 << 2
+};
+
+/* Enum BMD3DPreviewFormat - Linked Frame preview format */
+
+typedef uint32_t BMD3DPreviewFormat;
+enum _BMD3DPreviewFormat {
+ bmd3DPreviewFormatDefault = 'defa',
+ bmd3DPreviewFormatLeftOnly = 'left',
+ bmd3DPreviewFormatRightOnly = 'righ',
+ bmd3DPreviewFormatSideBySide = 'side',
+ bmd3DPreviewFormatTopBottom = 'topb'
+};
+
+#if defined(__cplusplus)
+
+// Forward Declarations
+
+class IDeckLinkVideoOutputCallback;
+class IDeckLinkInputCallback;
+class IDeckLinkMemoryAllocator;
+class IDeckLinkAudioOutputCallback;
+class IDeckLinkIterator;
+class IDeckLinkAPIInformation;
+class IDeckLinkOutput;
+class IDeckLinkInput;
+class IDeckLinkVideoFrame;
+class IDeckLinkMutableVideoFrame;
+class IDeckLinkVideoFrame3DExtensions;
+class IDeckLinkVideoInputFrame;
+class IDeckLinkVideoFrameAncillary;
+class IDeckLinkAudioInputPacket;
+class IDeckLinkScreenPreviewCallback;
+class IDeckLinkCocoaScreenPreviewCallback;
+class IDeckLinkGLScreenPreviewHelper;
+class IDeckLinkAttributes;
+class IDeckLinkKeyer;
+class IDeckLinkVideoConversion;
+
+/* Interface IDeckLinkVideoOutputCallback - Frame completion callback. */
+
+class IDeckLinkVideoOutputCallback : public IUnknown
+{
+public:
+ virtual HRESULT ScheduledFrameCompleted (/* in */ IDeckLinkVideoFrame *completedFrame, /* in */ BMDOutputFrameCompletionResult result) = 0;
+ virtual HRESULT ScheduledPlaybackHasStopped (void) = 0;
+
+protected:
+ virtual ~IDeckLinkVideoOutputCallback () {}; // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkInputCallback - Frame arrival callback. */
+
+class IDeckLinkInputCallback : public IUnknown
+{
+public:
+ virtual HRESULT VideoInputFormatChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0;
+ virtual HRESULT VideoInputFrameArrived (/* in */ IDeckLinkVideoInputFrame* videoFrame, /* in */ IDeckLinkAudioInputPacket* audioPacket) = 0;
+
+protected:
+ virtual ~IDeckLinkInputCallback () {}; // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkMemoryAllocator - Memory allocator for video frames. */
+
+class IDeckLinkMemoryAllocator : public IUnknown
+{
+public:
+ virtual HRESULT AllocateBuffer (/* in */ uint32_t bufferSize, /* out */ void **allocatedBuffer) = 0;
+ virtual HRESULT ReleaseBuffer (/* in */ void *buffer) = 0;
+
+ virtual HRESULT Commit (void) = 0;
+ virtual HRESULT Decommit (void) = 0;
+};
+
+/* Interface IDeckLinkAudioOutputCallback - Optional callback to allow audio samples to be pulled as required. */
+
+class IDeckLinkAudioOutputCallback : public IUnknown
+{
+public:
+ virtual HRESULT RenderAudioSamples (/* in */ bool preroll) = 0;
+};
+
+/* Interface IDeckLinkIterator - enumerates installed DeckLink hardware */
+
+class IDeckLinkIterator : public IUnknown
+{
+public:
+ virtual HRESULT Next (/* out */ IDeckLink **deckLinkInstance) = 0;
+};
+
+/* Interface IDeckLinkAPIInformation - DeckLinkAPI attribute interface */
+
+class IDeckLinkAPIInformation : public IUnknown
+{
+public:
+ virtual HRESULT GetFlag (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ bool *value) = 0;
+ virtual HRESULT GetInt (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ int64_t *value) = 0;
+ virtual HRESULT GetFloat (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ double *value) = 0;
+ virtual HRESULT GetString (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ CFStringRef *value) = 0;
+
+protected:
+ virtual ~IDeckLinkAPIInformation () {}; // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */
+
+class IDeckLinkOutput : public IUnknown
+{
+public:
+ virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoOutputFlags flags, /* out */ BMDDisplayModeSupport *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0;
+ virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator **iterator) = 0;
+
+ virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0;
+
+ /* Video Output */
+
+ virtual HRESULT EnableVideoOutput (/* in */ BMDDisplayMode displayMode, /* in */ BMDVideoOutputFlags flags) = 0;
+ virtual HRESULT DisableVideoOutput (void) = 0;
+
+ virtual HRESULT SetVideoOutputFrameMemoryAllocator (/* in */ IDeckLinkMemoryAllocator *theAllocator) = 0;
+ virtual HRESULT CreateVideoFrame (/* in */ int32_t width, /* in */ int32_t height, /* in */ int32_t rowBytes, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame **outFrame) = 0;
+ virtual HRESULT CreateAncillaryData (/* in */ BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer) = 0;
+
+ virtual HRESULT DisplayVideoFrameSync (/* in */ IDeckLinkVideoFrame *theFrame) = 0;
+ virtual HRESULT ScheduleVideoFrame (/* in */ IDeckLinkVideoFrame *theFrame, /* in */ BMDTimeValue displayTime, /* in */ BMDTimeValue displayDuration, /* in */ BMDTimeScale timeScale) = 0;
+ virtual HRESULT SetScheduledFrameCompletionCallback (/* in */ IDeckLinkVideoOutputCallback *theCallback) = 0;
+ virtual HRESULT GetBufferedVideoFrameCount (/* out */ uint32_t *bufferedFrameCount) = 0;
+
+ /* Audio Output */
+
+ virtual HRESULT EnableAudioOutput (/* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount, /* in */ BMDAudioOutputStreamType streamType) = 0;
+ virtual HRESULT DisableAudioOutput (void) = 0;
+
+ virtual HRESULT WriteAudioSamplesSync (/* in */ void *buffer, /* in */ uint32_t sampleFrameCount, /* out */ uint32_t *sampleFramesWritten) = 0;
+
+ virtual HRESULT BeginAudioPreroll (void) = 0;
+ virtual HRESULT EndAudioPreroll (void) = 0;
+ virtual HRESULT ScheduleAudioSamples (/* in */ void *buffer, /* in */ uint32_t sampleFrameCount, /* in */ BMDTimeValue streamTime, /* in */ BMDTimeScale timeScale, /* out */ uint32_t *sampleFramesWritten) = 0;
+
+ virtual HRESULT GetBufferedAudioSampleFrameCount (/* out */ uint32_t *bufferedSampleFrameCount) = 0;
+ virtual HRESULT FlushBufferedAudioSamples (void) = 0;
+
+ virtual HRESULT SetAudioCallback (/* in */ IDeckLinkAudioOutputCallback *theCallback) = 0;
+
+ /* Output Control */
+
+ virtual HRESULT StartScheduledPlayback (/* in */ BMDTimeValue playbackStartTime, /* in */ BMDTimeScale timeScale, /* in */ double playbackSpeed) = 0;
+ virtual HRESULT StopScheduledPlayback (/* in */ BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue *actualStopTime, /* in */ BMDTimeScale timeScale) = 0;
+ virtual HRESULT IsScheduledPlaybackRunning (/* out */ bool *active) = 0;
+ virtual HRESULT GetScheduledStreamTime (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *streamTime, /* out */ double *playbackSpeed) = 0;
+ virtual HRESULT GetReferenceStatus (/* out */ BMDReferenceStatus *referenceStatus) = 0;
+
+ /* Hardware Timing */
+
+ virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0;
+
+protected:
+ virtual ~IDeckLinkOutput () {}; // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkInput - Created by QueryInterface from IDeckLink. */
+
+class IDeckLinkInput : 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;
+
+ virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0;
+
+ /* Video Input */
+
+ virtual HRESULT EnableVideoInput (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags) = 0;
+ virtual HRESULT DisableVideoInput (void) = 0;
+ virtual HRESULT GetAvailableVideoFrameCount (/* out */ uint32_t *availableFrameCount) = 0;
+
+ /* Audio Input */
+
+ virtual HRESULT EnableAudioInput (/* 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 */ IDeckLinkInputCallback *theCallback) = 0;
+
+ /* Hardware Timing */
+
+ virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0;
+
+protected:
+ virtual ~IDeckLinkInput () {}; // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkVideoFrame - Interface to encapsulate a video frame; can be caller-implemented. */
+
+class IDeckLinkVideoFrame : public IUnknown
+{
+public:
+ virtual long GetWidth (void) = 0;
+ virtual long GetHeight (void) = 0;
+ virtual long GetRowBytes (void) = 0;
+ virtual BMDPixelFormat GetPixelFormat (void) = 0;
+ virtual BMDFrameFlags GetFlags (void) = 0;
+ virtual HRESULT GetBytes (/* out */ void **buffer) = 0;
+
+ virtual HRESULT GetTimecode (/* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode **timecode) = 0;
+ virtual HRESULT GetAncillaryData (/* out */ IDeckLinkVideoFrameAncillary **ancillary) = 0;
+
+protected:
+ virtual ~IDeckLinkVideoFrame () {}; // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkMutableVideoFrame - Created by IDeckLinkOutput::CreateVideoFrame. */
+
+class IDeckLinkMutableVideoFrame : public IDeckLinkVideoFrame
+{
+public:
+ virtual HRESULT SetFlags (/* in */ BMDFrameFlags newFlags) = 0;
+
+ virtual HRESULT SetTimecode (/* in */ BMDTimecodeFormat format, /* in */ IDeckLinkTimecode *timecode) = 0;
+ virtual HRESULT SetTimecodeFromComponents (/* in */ BMDTimecodeFormat format, /* in */ uint8_t hours, /* in */ uint8_t minutes, /* in */ uint8_t seconds, /* in */ uint8_t frames, /* in */ BMDTimecodeFlags flags) = 0;
+ virtual HRESULT SetAncillaryData (/* in */ IDeckLinkVideoFrameAncillary *ancillary) = 0;
+ virtual HRESULT SetTimecodeUserBits (/* in */ BMDTimecodeFormat format, /* in */ BMDTimecodeUserBits userBits) = 0;
+
+protected:
+ virtual ~IDeckLinkMutableVideoFrame () {}; // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkVideoFrame3DExtensions - Optional interface implemented on IDeckLinkVideoFrame to support 3D frames */
+
+class IDeckLinkVideoFrame3DExtensions : public IUnknown
+{
+public:
+ virtual BMDVideo3DPackingFormat Get3DPackingFormat (void) = 0;
+ virtual HRESULT GetFrameForRightEye (/* out */ IDeckLinkVideoFrame* *rightEyeFrame) = 0;
+
+protected:
+ virtual ~IDeckLinkVideoFrame3DExtensions () {}; // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */
+
+class IDeckLinkVideoInputFrame : public IDeckLinkVideoFrame
+{
+public:
+ virtual HRESULT GetStreamTime (/* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration, /* in */ BMDTimeScale timeScale) = 0;
+ virtual HRESULT GetHardwareReferenceTimestamp (/* in */ BMDTimeScale timeScale, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration) = 0;
+
+protected:
+ virtual ~IDeckLinkVideoInputFrame () {}; // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkVideoFrameAncillary - Obtained through QueryInterface() on an IDeckLinkVideoFrame object. */
+
+class IDeckLinkVideoFrameAncillary : public IUnknown
+{
+public:
+
+ virtual HRESULT GetBufferForVerticalBlankingLine (/* in */ uint32_t lineNumber, /* out */ void **buffer) = 0;
+ virtual BMDPixelFormat GetPixelFormat (void) = 0;
+ virtual BMDDisplayMode GetDisplayMode (void) = 0;
+
+protected:
+ virtual ~IDeckLinkVideoFrameAncillary () {}; // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkAudioInputPacket - Provided by the IDeckLinkInput callback. */
+
+class IDeckLinkAudioInputPacket : public IUnknown
+{
+public:
+ virtual long GetSampleFrameCount (void) = 0;
+ virtual HRESULT GetBytes (/* out */ void **buffer) = 0;
+ virtual HRESULT GetPacketTime (/* out */ BMDTimeValue *packetTime, /* in */ BMDTimeScale timeScale) = 0;
+
+protected:
+ virtual ~IDeckLinkAudioInputPacket () {}; // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkScreenPreviewCallback - Screen preview callback */
+
+class IDeckLinkScreenPreviewCallback : public IUnknown
+{
+public:
+ virtual HRESULT DrawFrame (/* in */ IDeckLinkVideoFrame *theFrame) = 0;
+
+protected:
+ virtual ~IDeckLinkScreenPreviewCallback () {}; // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkCocoaScreenPreviewCallback - Screen preview callback for Cocoa-based applications */
+
+class IDeckLinkCocoaScreenPreviewCallback : public IDeckLinkScreenPreviewCallback
+{
+public:
+
+protected:
+ virtual ~IDeckLinkCocoaScreenPreviewCallback () {}; // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkGLScreenPreviewHelper - Created with CoCreateInstance(). */
+
+class IDeckLinkGLScreenPreviewHelper : public IUnknown
+{
+public:
+
+ /* Methods must be called with OpenGL context set */
+
+ virtual HRESULT InitializeGL (void) = 0;
+ virtual HRESULT PaintGL (void) = 0;
+ virtual HRESULT SetFrame (/* in */ IDeckLinkVideoFrame *theFrame) = 0;
+ virtual HRESULT Set3DPreviewFormat (/* in */ BMD3DPreviewFormat previewFormat) = 0;
+
+protected:
+ virtual ~IDeckLinkGLScreenPreviewHelper () {}; // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkAttributes - DeckLink Attribute interface */
+
+class IDeckLinkAttributes : public IUnknown
+{
+public:
+ virtual HRESULT GetFlag (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ bool *value) = 0;
+ virtual HRESULT GetInt (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ int64_t *value) = 0;
+ virtual HRESULT GetFloat (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ double *value) = 0;
+ virtual HRESULT GetString (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ CFStringRef *value) = 0;
+
+protected:
+ virtual ~IDeckLinkAttributes () {}; // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkKeyer - DeckLink Keyer interface */
+
+class IDeckLinkKeyer : public IUnknown
+{
+public:
+ virtual HRESULT Enable (/* in */ bool isExternal) = 0;
+ virtual HRESULT SetLevel (/* in */ uint8_t level) = 0;
+ virtual HRESULT RampUp (/* in */ uint32_t numberOfFrames) = 0;
+ virtual HRESULT RampDown (/* in */ uint32_t numberOfFrames) = 0;
+ virtual HRESULT Disable (void) = 0;
+
+protected:
+ virtual ~IDeckLinkKeyer () {}; // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkVideoConversion - Created with CoCreateInstance(). */
+
+class IDeckLinkVideoConversion : public IUnknown
+{
+public:
+ virtual HRESULT ConvertFrame (/* in */ IDeckLinkVideoFrame* srcFrame, /* in */ IDeckLinkVideoFrame* dstFrame) = 0;
+
+protected:
+ virtual ~IDeckLinkVideoConversion () {}; // call Release method to drop reference count
+};
+
+/* Functions */
+
+extern "C" {
+
+ IDeckLinkIterator* CreateDeckLinkIteratorInstance (void);
+ IDeckLinkAPIInformation* CreateDeckLinkAPIInformationInstance (void);
+ IDeckLinkGLScreenPreviewHelper* CreateOpenGLScreenPreviewHelper (void);
+ IDeckLinkCocoaScreenPreviewCallback* CreateCocoaScreenPreview (void* /* (NSView*) */ parentView);
+ IDeckLinkVideoConversion* CreateVideoConversionInstance (void);
+
+};
+
+
+#endif // defined(__cplusplus)
+#endif /* defined(BMD_DECKLINKAPI_H) */
diff --git a/sys/decklink/osx/DeckLinkAPIConfiguration.h b/sys/decklink/osx/DeckLinkAPIConfiguration.h
new file mode 100644
index 000000000..f026e7334
--- /dev/null
+++ b/sys/decklink/osx/DeckLinkAPIConfiguration.h
@@ -0,0 +1,167 @@
+/* -LICENSE-START-
+** Copyright (c) 2011 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
+** this license (the "Software") to use, reproduce, display, distribute,
+** execute, and transmit the Software, and to prepare derivative works of the
+** Software, and to permit third-parties to whom the Software is furnished to
+** do so, all subject to the following:
+**
+** The copyright notices in the Software and this entire statement, including
+** the above license grant, this restriction and the following disclaimer,
+** must be included in all copies of the Software, in whole or in part, and
+** all derivative works of the Software, unless such copies or derivative
+** works are solely in the form of machine-executable object code generated by
+** a source language processor.
+**
+** 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+** DEALINGS IN THE SOFTWARE.
+** -LICENSE-END-
+*/
+
+#ifndef BMD_DECKLINKAPICONFIGURATION_H
+#define BMD_DECKLINKAPICONFIGURATION_H
+
+// Type Declarations
+
+
+// Interface ID Declarations
+
+#define IID_IDeckLinkConfiguration /* C679A35B-610C-4D09-B748-1D0478100FC0 */ (REFIID){0xC6,0x79,0xA3,0x5B,0x61,0x0C,0x4D,0x09,0xB7,0x48,0x1D,0x04,0x78,0x10,0x0F,0xC0}
+
+/* Enum BMDDeckLinkConfigurationID - DeckLink Configuration ID */
+
+typedef uint32_t BMDDeckLinkConfigurationID;
+enum _BMDDeckLinkConfigurationID {
+
+ /* Serial port Flags */
+
+ bmdDeckLinkConfigSwapSerialRxTx = 'ssrt',
+
+ /* Video Input/Output Flags */
+
+ bmdDeckLinkConfigUse1080pNotPsF = 'fpro',
+
+ /* Video Input/Output Integers */
+
+ bmdDeckLinkConfigHDMI3DPackingFormat = '3dpf',
+ bmdDeckLinkConfigBypass = 'byps',
+
+ /* Audio Input/Output Flags */
+
+ bmdDeckLinkConfigAnalogAudioConsumerLevels = 'aacl',
+
+ /* Video output flags */
+
+ bmdDeckLinkConfigFieldFlickerRemoval = 'fdfr',
+ bmdDeckLinkConfigHD1080p24ToHD1080i5994Conversion = 'to59',
+ bmdDeckLinkConfig444SDIVideoOutput = '444o',
+ bmdDeckLinkConfig3GBpsVideoOutput = '3gbs',
+ bmdDeckLinkConfigBlackVideoOutputDuringCapture = 'bvoc',
+ bmdDeckLinkConfigLowLatencyVideoOutput = 'llvo',
+
+ /* Video Output Integers */
+
+ bmdDeckLinkConfigVideoOutputConnection = 'vocn',
+ bmdDeckLinkConfigVideoOutputConversionMode = 'vocm',
+ bmdDeckLinkConfigAnalogVideoOutputFlags = 'avof',
+ bmdDeckLinkConfigReferenceInputTimingOffset = 'glot',
+ bmdDeckLinkConfigVideoOutputIdleOperation = 'voio',
+
+ /* Video Output Floats */
+
+ bmdDeckLinkConfigVideoOutputComponentLumaGain = 'oclg',
+ bmdDeckLinkConfigVideoOutputComponentChromaBlueGain = 'occb',
+ bmdDeckLinkConfigVideoOutputComponentChromaRedGain = 'occr',
+ bmdDeckLinkConfigVideoOutputCompositeLumaGain = 'oilg',
+ bmdDeckLinkConfigVideoOutputCompositeChromaGain = 'oicg',
+ bmdDeckLinkConfigVideoOutputSVideoLumaGain = 'oslg',
+ bmdDeckLinkConfigVideoOutputSVideoChromaGain = 'oscg',
+
+ /* Video Input Flags */
+
+ bmdDeckLinkConfigVideoInputScanning = 'visc', // Applicable to H264 Pro Recorder only
+
+ /* Video Input Integers */
+
+ bmdDeckLinkConfigVideoInputConnection = 'vicn',
+ bmdDeckLinkConfigAnalogVideoInputFlags = 'avif',
+ bmdDeckLinkConfigVideoInputConversionMode = 'vicm',
+ bmdDeckLinkConfig32PulldownSequenceInitialTimecodeFrame = 'pdif',
+ bmdDeckLinkConfigVANCSourceLine1Mapping = 'vsl1',
+ bmdDeckLinkConfigVANCSourceLine2Mapping = 'vsl2',
+ bmdDeckLinkConfigVANCSourceLine3Mapping = 'vsl3',
+
+ /* Video Input Floats */
+
+ bmdDeckLinkConfigVideoInputComponentLumaGain = 'iclg',
+ bmdDeckLinkConfigVideoInputComponentChromaBlueGain = 'iccb',
+ bmdDeckLinkConfigVideoInputComponentChromaRedGain = 'iccr',
+ bmdDeckLinkConfigVideoInputCompositeLumaGain = 'iilg',
+ bmdDeckLinkConfigVideoInputCompositeChromaGain = 'iicg',
+ bmdDeckLinkConfigVideoInputSVideoLumaGain = 'islg',
+ bmdDeckLinkConfigVideoInputSVideoChromaGain = 'iscg',
+
+ /* Audio Input Integers */
+
+ bmdDeckLinkConfigAudioInputConnection = 'aicn',
+
+ /* Audio Input Floats */
+
+ bmdDeckLinkConfigAnalogAudioInputScaleChannel1 = 'ais1',
+ bmdDeckLinkConfigAnalogAudioInputScaleChannel2 = 'ais2',
+ bmdDeckLinkConfigAnalogAudioInputScaleChannel3 = 'ais3',
+ bmdDeckLinkConfigAnalogAudioInputScaleChannel4 = 'ais4',
+ bmdDeckLinkConfigDigitalAudioInputScale = 'dais',
+
+ /* Audio Output Integers */
+
+ bmdDeckLinkConfigAudioOutputAESAnalogSwitch = 'aoaa',
+
+ /* Audio Output Floats */
+
+ bmdDeckLinkConfigAnalogAudioOutputScaleChannel1 = 'aos1',
+ bmdDeckLinkConfigAnalogAudioOutputScaleChannel2 = 'aos2',
+ bmdDeckLinkConfigAnalogAudioOutputScaleChannel3 = 'aos3',
+ bmdDeckLinkConfigAnalogAudioOutputScaleChannel4 = 'aos4',
+ bmdDeckLinkConfigDigitalAudioOutputScale = 'daos'
+};
+
+// Forward Declarations
+
+class IDeckLinkConfiguration;
+
+/* Interface IDeckLinkConfiguration - DeckLink Configuration interface */
+
+class IDeckLinkConfiguration : public IUnknown
+{
+public:
+ virtual HRESULT SetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ bool value) = 0;
+ virtual HRESULT GetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ bool *value) = 0;
+ virtual HRESULT SetInt (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ int64_t value) = 0;
+ virtual HRESULT GetInt (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ int64_t *value) = 0;
+ virtual HRESULT SetFloat (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ double value) = 0;
+ virtual HRESULT GetFloat (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ double *value) = 0;
+ virtual HRESULT SetString (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ CFStringRef value) = 0;
+ virtual HRESULT GetString (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ CFStringRef *value) = 0;
+ virtual HRESULT WriteConfigurationToPreferences (void) = 0;
+
+protected:
+ virtual ~IDeckLinkConfiguration () {}; // call Release method to drop reference count
+};
+
+/* Functions */
+
+extern "C" {
+
+
+};
+
+
+#endif /* defined(BMD_DECKLINKAPICONFIGURATION_H) */
diff --git a/sys/decklink/osx/DeckLinkAPIDeckControl.h b/sys/decklink/osx/DeckLinkAPIDeckControl.h
new file mode 100644
index 000000000..ea32657d8
--- /dev/null
+++ b/sys/decklink/osx/DeckLinkAPIDeckControl.h
@@ -0,0 +1,206 @@
+/* -LICENSE-START-
+** Copyright (c) 2011 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
+** this license (the "Software") to use, reproduce, display, distribute,
+** execute, and transmit the Software, and to prepare derivative works of the
+** Software, and to permit third-parties to whom the Software is furnished to
+** do so, all subject to the following:
+**
+** The copyright notices in the Software and this entire statement, including
+** the above license grant, this restriction and the following disclaimer,
+** must be included in all copies of the Software, in whole or in part, and
+** all derivative works of the Software, unless such copies or derivative
+** works are solely in the form of machine-executable object code generated by
+** a source language processor.
+**
+** 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+** DEALINGS IN THE SOFTWARE.
+** -LICENSE-END-
+*/
+
+#ifndef BMD_DECKLINKAPIDECKCONTROL_H
+#define BMD_DECKLINKAPIDECKCONTROL_H
+
+// Type Declarations
+
+
+// Interface ID Declarations
+
+#define IID_IDeckLinkDeckControlStatusCallback /* 53436FFB-B434-4906-BADC-AE3060FFE8EF */ (REFIID){0x53,0x43,0x6F,0xFB,0xB4,0x34,0x49,0x06,0xBA,0xDC,0xAE,0x30,0x60,0xFF,0xE8,0xEF}
+#define IID_IDeckLinkDeckControl /* 8E1C3ACE-19C7-4E00-8B92-D80431D958BE */ (REFIID){0x8E,0x1C,0x3A,0xCE,0x19,0xC7,0x4E,0x00,0x8B,0x92,0xD8,0x04,0x31,0xD9,0x58,0xBE}
+
+/* Enum BMDDeckControlMode - DeckControl mode */
+
+typedef uint32_t BMDDeckControlMode;
+enum _BMDDeckControlMode {
+ bmdDeckControlNotOpened = 'ntop',
+ bmdDeckControlVTRControlMode = 'vtrc',
+ bmdDeckControlExportMode = 'expm',
+ bmdDeckControlCaptureMode = 'capm'
+};
+
+/* Enum BMDDeckControlEvent - DeckControl event */
+
+typedef uint32_t BMDDeckControlEvent;
+enum _BMDDeckControlEvent {
+ bmdDeckControlAbortedEvent = 'abte', // This event is triggered when a capture or edit-to-tape operation is aborted.
+
+ /* Export-To-Tape events */
+
+ bmdDeckControlPrepareForExportEvent = 'pfee', // This event is triggered a few frames before reaching the in-point. IDeckLinkInput::StartScheduledPlayback() should be called at this point.
+ bmdDeckControlExportCompleteEvent = 'exce', // This event is triggered a few frames after reaching the out-point. At this point, it is safe to stop playback.
+
+ /* Capture events */
+
+ bmdDeckControlPrepareForCaptureEvent = 'pfce', // This event is triggered a few frames before reaching the in-point. The serial timecode attached to IDeckLinkVideoInputFrames is now valid.
+ bmdDeckControlCaptureCompleteEvent = 'ccev' // This event is triggered a few frames after reaching the out-point.
+};
+
+/* Enum BMDDeckControlVTRControlState - VTR Control state */
+
+typedef uint32_t BMDDeckControlVTRControlState;
+enum _BMDDeckControlVTRControlState {
+ bmdDeckControlNotInVTRControlMode = 'nvcm',
+ bmdDeckControlVTRControlPlaying = 'vtrp',
+ bmdDeckControlVTRControlRecording = 'vtrr',
+ bmdDeckControlVTRControlStill = 'vtra',
+ bmdDeckControlVTRControlShuttleForward = 'vtsf',
+ bmdDeckControlVTRControlShuttleReverse = 'vtsr',
+ bmdDeckControlVTRControlJogForward = 'vtjf',
+ bmdDeckControlVTRControlJogReverse = 'vtjr',
+ bmdDeckControlVTRControlStopped = 'vtro'
+};
+
+/* Enum BMDDeckControlStatusFlags - Deck Control status flags */
+
+typedef uint32_t BMDDeckControlStatusFlags;
+enum _BMDDeckControlStatusFlags {
+ bmdDeckControlStatusDeckConnected = 1 << 0,
+ bmdDeckControlStatusRemoteMode = 1 << 1,
+ bmdDeckControlStatusRecordInhibited = 1 << 2,
+ bmdDeckControlStatusCassetteOut = 1 << 3
+};
+
+/* Enum BMDDeckControlExportModeOpsFlags - Export mode flags */
+
+typedef uint32_t BMDDeckControlExportModeOpsFlags;
+enum _BMDDeckControlExportModeOpsFlags {
+ bmdDeckControlExportModeInsertVideo = 1 << 0,
+ bmdDeckControlExportModeInsertAudio1 = 1 << 1,
+ bmdDeckControlExportModeInsertAudio2 = 1 << 2,
+ bmdDeckControlExportModeInsertAudio3 = 1 << 3,
+ bmdDeckControlExportModeInsertAudio4 = 1 << 4,
+ bmdDeckControlExportModeInsertAudio5 = 1 << 5,
+ bmdDeckControlExportModeInsertAudio6 = 1 << 6,
+ bmdDeckControlExportModeInsertAudio7 = 1 << 7,
+ bmdDeckControlExportModeInsertAudio8 = 1 << 8,
+ bmdDeckControlExportModeInsertAudio9 = 1 << 9,
+ bmdDeckControlExportModeInsertAudio10 = 1 << 10,
+ bmdDeckControlExportModeInsertAudio11 = 1 << 11,
+ bmdDeckControlExportModeInsertAudio12 = 1 << 12,
+ bmdDeckControlExportModeInsertTimeCode = 1 << 13,
+ bmdDeckControlExportModeInsertAssemble = 1 << 14,
+ bmdDeckControlExportModeInsertPreview = 1 << 15,
+ bmdDeckControlUseManualExport = 1 << 16
+};
+
+/* Enum BMDDeckControlError - Deck Control error */
+
+typedef uint32_t BMDDeckControlError;
+enum _BMDDeckControlError {
+ bmdDeckControlNoError = 'noer',
+ bmdDeckControlModeError = 'moer',
+ bmdDeckControlMissedInPointError = 'mier',
+ bmdDeckControlDeckTimeoutError = 'dter',
+ bmdDeckControlCommandFailedError = 'cfer',
+ bmdDeckControlDeviceAlreadyOpenedError = 'dalo',
+ bmdDeckControlFailedToOpenDeviceError = 'fder',
+ bmdDeckControlInLocalModeError = 'lmer',
+ bmdDeckControlEndOfTapeError = 'eter',
+ bmdDeckControlUserAbortError = 'uaer',
+ bmdDeckControlNoTapeInDeckError = 'nter',
+ bmdDeckControlNoVideoFromCardError = 'nvfc',
+ bmdDeckControlNoCommunicationError = 'ncom',
+ bmdDeckControlBufferTooSmallError = 'btsm',
+ bmdDeckControlBadChecksumError = 'chks',
+ bmdDeckControlUnknownError = 'uner'
+};
+
+// Forward Declarations
+
+class IDeckLinkDeckControlStatusCallback;
+class IDeckLinkDeckControl;
+
+/* Interface IDeckLinkDeckControlStatusCallback - Deck control state change callback. */
+
+class IDeckLinkDeckControlStatusCallback : public IUnknown
+{
+public:
+ virtual HRESULT TimecodeUpdate (/* in */ BMDTimecodeBCD currentTimecode) = 0;
+ virtual HRESULT VTRControlStateChanged (/* in */ BMDDeckControlVTRControlState newState, /* in */ BMDDeckControlError error) = 0;
+ virtual HRESULT DeckControlEventReceived (/* in */ BMDDeckControlEvent event, /* in */ BMDDeckControlError error) = 0;
+ virtual HRESULT DeckControlStatusChanged (/* in */ BMDDeckControlStatusFlags flags, /* in */ uint32_t mask) = 0;
+
+protected:
+ virtual ~IDeckLinkDeckControlStatusCallback () {}; // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkDeckControl - Deck Control main interface */
+
+class IDeckLinkDeckControl : public IUnknown
+{
+public:
+ virtual HRESULT Open (/* in */ BMDTimeScale timeScale, /* in */ BMDTimeValue timeValue, /* in */ bool timecodeIsDropFrame, /* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT Close (/* in */ bool standbyOn) = 0;
+ virtual HRESULT GetCurrentState (/* out */ BMDDeckControlMode *mode, /* out */ BMDDeckControlVTRControlState *vtrControlState, /* out */ BMDDeckControlStatusFlags *flags) = 0;
+ virtual HRESULT SetStandby (/* in */ bool standbyOn) = 0;
+ virtual HRESULT SendCommand (/* in */ uint8_t *inBuffer, /* in */ uint32_t inBufferSize, /* out */ uint8_t *outBuffer, /* out */ uint32_t *outDataSize, /* in */ uint32_t outBufferSize, /* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT Play (/* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT Stop (/* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT TogglePlayStop (/* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT Eject (/* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT GoToTimecode (/* in */ BMDTimecodeBCD timecode, /* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT FastForward (/* in */ bool viewTape, /* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT Rewind (/* in */ bool viewTape, /* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT StepForward (/* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT StepBack (/* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT Jog (/* in */ double rate, /* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT Shuttle (/* in */ double rate, /* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT GetTimecodeString (/* out */ CFStringRef *currentTimeCode, /* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT GetTimecode (/* out */ IDeckLinkTimecode **currentTimecode, /* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT GetTimecodeBCD (/* out */ BMDTimecodeBCD *currentTimecode, /* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT SetPreroll (/* in */ uint32_t prerollSeconds) = 0;
+ virtual HRESULT GetPreroll (/* out */ uint32_t *prerollSeconds) = 0;
+ virtual HRESULT SetExportOffset (/* in */ int32_t exportOffsetFields) = 0;
+ virtual HRESULT GetExportOffset (/* out */ int32_t *exportOffsetFields) = 0;
+ virtual HRESULT GetManualExportOffset (/* out */ int32_t *deckManualExportOffsetFields) = 0;
+ virtual HRESULT SetCaptureOffset (/* in */ int32_t captureOffsetFields) = 0;
+ virtual HRESULT GetCaptureOffset (/* out */ int32_t *captureOffsetFields) = 0;
+ virtual HRESULT StartExport (/* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* in */ BMDDeckControlExportModeOpsFlags exportModeOps, /* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT StartCapture (/* in */ bool useVITC, /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT GetDeviceID (/* out */ uint16_t *deviceId, /* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT Abort (void) = 0;
+ virtual HRESULT CrashRecordStart (/* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT CrashRecordStop (/* out */ BMDDeckControlError *error) = 0;
+ virtual HRESULT SetCallback (/* in */ IDeckLinkDeckControlStatusCallback *callback) = 0;
+
+protected:
+ virtual ~IDeckLinkDeckControl () {}; // call Release method to drop reference count
+};
+
+/* Functions */
+
+extern "C" {
+
+
+};
+
+
+#endif /* defined(BMD_DECKLINKAPIDECKCONTROL_H) */
diff --git a/sys/decklink/osx/DeckLinkAPIDiscovery.h b/sys/decklink/osx/DeckLinkAPIDiscovery.h
new file mode 100644
index 000000000..99fc0feb9
--- /dev/null
+++ b/sys/decklink/osx/DeckLinkAPIDiscovery.h
@@ -0,0 +1,62 @@
+/* -LICENSE-START-
+** Copyright (c) 2011 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
+** this license (the "Software") to use, reproduce, display, distribute,
+** execute, and transmit the Software, and to prepare derivative works of the
+** Software, and to permit third-parties to whom the Software is furnished to
+** do so, all subject to the following:
+**
+** The copyright notices in the Software and this entire statement, including
+** the above license grant, this restriction and the following disclaimer,
+** must be included in all copies of the Software, in whole or in part, and
+** all derivative works of the Software, unless such copies or derivative
+** works are solely in the form of machine-executable object code generated by
+** a source language processor.
+**
+** 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+** DEALINGS IN THE SOFTWARE.
+** -LICENSE-END-
+*/
+
+#ifndef BMD_DECKLINKAPIDISCOVERY_H
+#define BMD_DECKLINKAPIDISCOVERY_H
+
+// Type Declarations
+
+
+// Interface ID Declarations
+
+#define IID_IDeckLink /* C418FBDD-0587-48ED-8FE5-640F0A14AF91 */ (REFIID){0xC4,0x18,0xFB,0xDD,0x05,0x87,0x48,0xED,0x8F,0xE5,0x64,0x0F,0x0A,0x14,0xAF,0x91}
+
+// Forward Declarations
+
+class IDeckLink;
+
+/* Interface IDeckLink - represents a DeckLink device */
+
+class IDeckLink : public IUnknown
+{
+public:
+ virtual HRESULT GetModelName (/* out */ CFStringRef *modelName) = 0;
+ virtual HRESULT GetDisplayName (/* out */ CFStringRef *displayName) = 0;
+
+protected:
+ virtual ~IDeckLink () {}; // call Release method to drop reference count
+};
+
+/* Functions */
+
+extern "C" {
+
+
+};
+
+
+#endif /* defined(BMD_DECKLINKAPIDISCOVERY_H) */
diff --git a/sys/decklink/osx/DeckLinkAPIDispatch-osx.cpp b/sys/decklink/osx/DeckLinkAPIDispatch-osx.cpp
new file mode 100644
index 000000000..18b0122fa
--- /dev/null
+++ b/sys/decklink/osx/DeckLinkAPIDispatch-osx.cpp
@@ -0,0 +1,178 @@
+/* -LICENSE-START-
+** Copyright (c) 2009 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
+** this license (the "Software") to use, reproduce, display, distribute,
+** execute, and transmit the Software, and to prepare derivative works of the
+** Software, and to permit third-parties to whom the Software is furnished to
+** do so, all subject to the following:
+**
+** The copyright notices in the Software and this entire statement, including
+** the above license grant, this restriction and the following disclaimer,
+** must be included in all copies of the Software, in whole or in part, and
+** all derivative works of the Software, unless such copies or derivative
+** works are solely in the form of machine-executable object code generated by
+** a source language processor.
+**
+** 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+** DEALINGS IN THE SOFTWARE.
+** -LICENSE-END-
+*/
+/* DeckLinkAPIDispatch.cpp */
+
+#include "DeckLinkAPI.h"
+#include <pthread.h>
+
+#if BLACKMAGIC_DECKLINK_API_MAGIC != 1
+ #error The DeckLink API version of DeckLinkAPIDispatch.cpp is not the same version as DeckLinkAPI.h
+#endif
+
+#define kDeckLinkAPI_BundlePath "/Library/Application Support/Blackmagic Design/Blackmagic DeckLink/DeckLinkAPI.bundle"
+
+typedef IDeckLinkIterator* (*CreateIteratorFunc)(void);
+typedef IDeckLinkAPIInformation* (*CreateAPIInformationFunc)(void);
+typedef IDeckLinkGLScreenPreviewHelper* (*CreateOpenGLScreenPreviewHelperFunc)(void);
+typedef IDeckLinkCocoaScreenPreviewCallback* (*CreateCocoaScreenPreviewFunc)(void*);
+typedef IDeckLinkVideoConversion* (*CreateVideoConversionInstanceFunc)(void);
+
+static pthread_once_t gDeckLinkOnceControl = PTHREAD_ONCE_INIT;
+static CFBundleRef gDeckLinkAPIBundleRef = NULL;
+static CreateIteratorFunc gCreateIteratorFunc = NULL;
+static CreateAPIInformationFunc gCreateAPIInformationFunc = NULL;
+static CreateOpenGLScreenPreviewHelperFunc gCreateOpenGLPreviewFunc = NULL;
+static CreateCocoaScreenPreviewFunc gCreateCocoaPreviewFunc = NULL;
+static CreateVideoConversionInstanceFunc gCreateVideoConversionFunc = NULL;
+
+
+void InitDeckLinkAPI (void)
+{
+ CFURLRef bundleURL;
+
+ bundleURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR(kDeckLinkAPI_BundlePath), kCFURLPOSIXPathStyle, true);
+ if (bundleURL != NULL)
+ {
+ gDeckLinkAPIBundleRef = CFBundleCreate(kCFAllocatorDefault, bundleURL);
+ if (gDeckLinkAPIBundleRef != NULL)
+ {
+ gCreateIteratorFunc = (CreateIteratorFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateDeckLinkIteratorInstance_0002"));
+ gCreateAPIInformationFunc = (CreateAPIInformationFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateDeckLinkAPIInformationInstance_0001"));
+ gCreateOpenGLPreviewFunc = (CreateOpenGLScreenPreviewHelperFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateOpenGLScreenPreviewHelper_0001"));
+ gCreateCocoaPreviewFunc = (CreateCocoaScreenPreviewFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateCocoaScreenPreview_0001"));
+ gCreateVideoConversionFunc = (CreateVideoConversionInstanceFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateVideoConversionInstance_0001"));
+ }
+ CFRelease(bundleURL);
+ }
+}
+
+bool IsDeckLinkAPIPresent (void)
+{
+ // If the DeckLink API bundle was successfully loaded, return this knowledge to the caller
+ if (gDeckLinkAPIBundleRef != NULL)
+ return true;
+
+ return false;
+}
+
+IDeckLinkIterator* CreateDeckLinkIteratorInstance (void)
+{
+ pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
+
+ if (gCreateIteratorFunc == NULL)
+ return NULL;
+
+ return gCreateIteratorFunc();
+}
+
+IDeckLinkAPIInformation* CreateDeckLinkAPIInformationInstance (void)
+{
+ pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
+
+ if (gCreateAPIInformationFunc == NULL)
+ return NULL;
+
+ return gCreateAPIInformationFunc();
+}
+
+IDeckLinkGLScreenPreviewHelper* CreateOpenGLScreenPreviewHelper (void)
+{
+ pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
+
+ if (gCreateOpenGLPreviewFunc == NULL)
+ return NULL;
+
+ return gCreateOpenGLPreviewFunc();
+}
+
+IDeckLinkCocoaScreenPreviewCallback* CreateCocoaScreenPreview (void* parentView)
+{
+ pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
+
+ if (gCreateCocoaPreviewFunc == NULL)
+ return NULL;
+
+ return gCreateCocoaPreviewFunc(parentView);
+}
+
+IDeckLinkVideoConversion* CreateVideoConversionInstance (void)
+{
+ pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
+
+ if (gCreateVideoConversionFunc == NULL)
+ return NULL;
+
+ return gCreateVideoConversionFunc();
+}
+
+#define kBMDStreamingAPI_BundlePath "/Library/Application Support/Blackmagic Design/Streaming/BMDStreamingAPI.bundle"
+
+typedef IBMDStreamingDiscovery* (*CreateDiscoveryFunc)(void);
+typedef IBMDStreamingH264NALParser* (*CreateNALParserFunc)(void);
+
+static pthread_once_t gBMDStreamingOnceControl = PTHREAD_ONCE_INIT;
+static CFBundleRef gBMDStreamingAPIBundleRef = NULL;
+static CreateDiscoveryFunc gCreateDiscoveryFunc = NULL;
+static CreateNALParserFunc gCreateNALParserFunc = NULL;
+
+void InitBMDStreamingAPI(void)
+{
+ CFURLRef bundleURL;
+
+ bundleURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR(kBMDStreamingAPI_BundlePath), kCFURLPOSIXPathStyle, true);
+ if (bundleURL != NULL)
+ {
+ gBMDStreamingAPIBundleRef = CFBundleCreate(kCFAllocatorDefault, bundleURL);
+ if (gBMDStreamingAPIBundleRef != NULL)
+ {
+ gCreateDiscoveryFunc = (CreateDiscoveryFunc)CFBundleGetFunctionPointerForName(gBMDStreamingAPIBundleRef, CFSTR("CreateBMDStreamingDiscoveryInstance_0001"));
+ gCreateNALParserFunc = (CreateNALParserFunc)CFBundleGetFunctionPointerForName(gBMDStreamingAPIBundleRef, CFSTR("CreateBMDStreamingH264NALParser_0001"));
+ }
+
+ CFRelease(bundleURL);
+ }
+}
+
+IBMDStreamingDiscovery* CreateBMDStreamingDiscoveryInstance()
+{
+ pthread_once(&gBMDStreamingOnceControl, InitBMDStreamingAPI);
+
+ if (gCreateDiscoveryFunc == NULL)
+ return NULL;
+
+ return gCreateDiscoveryFunc();
+}
+
+IBMDStreamingH264NALParser* CreateBMDStreamingH264NALParser()
+{
+ pthread_once(&gBMDStreamingOnceControl, InitBMDStreamingAPI);
+
+ if (gCreateNALParserFunc == NULL)
+ return NULL;
+
+ return gCreateNALParserFunc();
+}
diff --git a/sys/decklink/osx/DeckLinkAPIModes.h b/sys/decklink/osx/DeckLinkAPIModes.h
new file mode 100644
index 000000000..8b0759236
--- /dev/null
+++ b/sys/decklink/osx/DeckLinkAPIModes.h
@@ -0,0 +1,155 @@
+/* -LICENSE-START-
+** Copyright (c) 2011 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
+** this license (the "Software") to use, reproduce, display, distribute,
+** execute, and transmit the Software, and to prepare derivative works of the
+** Software, and to permit third-parties to whom the Software is furnished to
+** do so, all subject to the following:
+**
+** The copyright notices in the Software and this entire statement, including
+** the above license grant, this restriction and the following disclaimer,
+** must be included in all copies of the Software, in whole or in part, and
+** all derivative works of the Software, unless such copies or derivative
+** works are solely in the form of machine-executable object code generated by
+** a source language processor.
+**
+** 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+** DEALINGS IN THE SOFTWARE.
+** -LICENSE-END-
+*/
+
+#ifndef BMD_DECKLINKAPIMODES_H
+#define BMD_DECKLINKAPIMODES_H
+
+// Type Declarations
+
+
+// Interface ID Declarations
+
+#define IID_IDeckLinkDisplayModeIterator /* 9C88499F-F601-4021-B80B-032E4EB41C35 */ (REFIID){0x9C,0x88,0x49,0x9F,0xF6,0x01,0x40,0x21,0xB8,0x0B,0x03,0x2E,0x4E,0xB4,0x1C,0x35}
+#define IID_IDeckLinkDisplayMode /* 3EB2C1AB-0A3D-4523-A3AD-F40D7FB14E78 */ (REFIID){0x3E,0xB2,0xC1,0xAB,0x0A,0x3D,0x45,0x23,0xA3,0xAD,0xF4,0x0D,0x7F,0xB1,0x4E,0x78}
+
+/* Enum BMDDisplayMode - Video display modes */
+
+typedef uint32_t BMDDisplayMode;
+enum _BMDDisplayMode {
+
+ /* SD Modes */
+
+ bmdModeNTSC = 'ntsc',
+ bmdModeNTSC2398 = 'nt23', // 3:2 pulldown
+ bmdModePAL = 'pal ',
+ bmdModeNTSCp = 'ntsp',
+ bmdModePALp = 'palp',
+
+ /* HD 1080 Modes */
+
+ bmdModeHD1080p2398 = '23ps',
+ bmdModeHD1080p24 = '24ps',
+ bmdModeHD1080p25 = 'Hp25',
+ bmdModeHD1080p2997 = 'Hp29',
+ bmdModeHD1080p30 = 'Hp30',
+ bmdModeHD1080i50 = 'Hi50',
+ bmdModeHD1080i5994 = 'Hi59',
+ bmdModeHD1080i6000 = 'Hi60', // N.B. This _really_ is 60.00 Hz.
+ bmdModeHD1080p50 = 'Hp50',
+ bmdModeHD1080p5994 = 'Hp59',
+ bmdModeHD1080p6000 = 'Hp60', // N.B. This _really_ is 60.00 Hz.
+
+ /* HD 720 Modes */
+
+ bmdModeHD720p50 = 'hp50',
+ bmdModeHD720p5994 = 'hp59',
+ bmdModeHD720p60 = 'hp60',
+
+ /* 2k Modes */
+
+ bmdMode2k2398 = '2k23',
+ bmdMode2k24 = '2k24',
+ bmdMode2k25 = '2k25',
+
+ /* Special Modes */
+
+ bmdModeUnknown = 'iunk'
+};
+
+/* Enum BMDFieldDominance - Video field dominance */
+
+typedef uint32_t BMDFieldDominance;
+enum _BMDFieldDominance {
+ bmdUnknownFieldDominance = 0,
+ bmdLowerFieldFirst = 'lowr',
+ bmdUpperFieldFirst = 'uppr',
+ bmdProgressiveFrame = 'prog',
+ bmdProgressiveSegmentedFrame = 'psf '
+};
+
+/* Enum BMDPixelFormat - Video pixel formats supported for output/input */
+
+typedef uint32_t BMDPixelFormat;
+enum _BMDPixelFormat {
+ bmdFormat8BitYUV = '2vuy',
+ bmdFormat10BitYUV = 'v210',
+ bmdFormat8BitARGB = 32,
+ bmdFormat8BitBGRA = 'BGRA',
+ bmdFormat10BitRGB = 'r210' // Big-endian RGB 10-bit per component with SMPTE video levels (64-960). Packed as 2:10:10:10
+};
+
+/* Enum BMDDisplayModeFlags - Flags to describe the characteristics of an IDeckLinkDisplayMode. */
+
+typedef uint32_t BMDDisplayModeFlags;
+enum _BMDDisplayModeFlags {
+ bmdDisplayModeSupports3D = 1 << 0,
+ bmdDisplayModeColorspaceRec601 = 1 << 1,
+ bmdDisplayModeColorspaceRec709 = 1 << 2
+};
+
+// Forward Declarations
+
+class IDeckLinkDisplayModeIterator;
+class IDeckLinkDisplayMode;
+
+/* Interface IDeckLinkDisplayModeIterator - enumerates over supported input/output display modes. */
+
+class IDeckLinkDisplayModeIterator : public IUnknown
+{
+public:
+ virtual HRESULT Next (/* out */ IDeckLinkDisplayMode **deckLinkDisplayMode) = 0;
+
+protected:
+ virtual ~IDeckLinkDisplayModeIterator () {}; // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkDisplayMode - represents a display mode */
+
+class IDeckLinkDisplayMode : public IUnknown
+{
+public:
+ virtual HRESULT GetName (/* out */ CFStringRef *name) = 0;
+ virtual BMDDisplayMode GetDisplayMode (void) = 0;
+ virtual long GetWidth (void) = 0;
+ virtual long GetHeight (void) = 0;
+ virtual HRESULT GetFrameRate (/* out */ BMDTimeValue *frameDuration, /* out */ BMDTimeScale *timeScale) = 0;
+ virtual BMDFieldDominance GetFieldDominance (void) = 0;
+ virtual BMDDisplayModeFlags GetFlags (void) = 0;
+
+protected:
+ virtual ~IDeckLinkDisplayMode () {}; // call Release method to drop reference count
+};
+
+/* Functions */
+
+extern "C" {
+
+
+};
+
+
+#endif /* defined(BMD_DECKLINKAPIMODES_H) */
diff --git a/sys/decklink/osx/DeckLinkAPIStreaming.h b/sys/decklink/osx/DeckLinkAPIStreaming.h
new file mode 100644
index 000000000..ecffb8def
--- /dev/null
+++ b/sys/decklink/osx/DeckLinkAPIStreaming.h
@@ -0,0 +1,366 @@
+/* -LICENSE-START-
+** Copyright (c) 2011 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
+** this license (the "Software") to use, reproduce, display, distribute,
+** execute, and transmit the Software, and to prepare derivative works of the
+** Software, and to permit third-parties to whom the Software is furnished to
+** do so, all subject to the following:
+**
+** The copyright notices in the Software and this entire statement, including
+** the above license grant, this restriction and the following disclaimer,
+** must be included in all copies of the Software, in whole or in part, and
+** all derivative works of the Software, unless such copies or derivative
+** works are solely in the form of machine-executable object code generated by
+** a source language processor.
+**
+** 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+** DEALINGS IN THE SOFTWARE.
+** -LICENSE-END-
+*/
+
+#ifndef BMD_DECKLINKAPISTREAMING_H
+#define BMD_DECKLINKAPISTREAMING_H
+
+// Type Declarations
+
+
+// Interface ID Declarations
+
+#define IID_IBMDStreamingDeviceNotificationCallback /* F9531D64-3305-4B29-A387-7F74BB0D0E84 */ (REFIID){0xF9,0x53,0x1D,0x64,0x33,0x05,0x4B,0x29,0xA3,0x87,0x7F,0x74,0xBB,0x0D,0x0E,0x84}
+#define IID_IBMDStreamingH264InputCallback /* 823C475F-55AE-46F9-890C-537CC5CEDCCA */ (REFIID){0x82,0x3C,0x47,0x5F,0x55,0xAE,0x46,0xF9,0x89,0x0C,0x53,0x7C,0xC5,0xCE,0xDC,0xCA}
+#define IID_IBMDStreamingDiscovery /* 2C837444-F989-4D87-901A-47C8A36D096D */ (REFIID){0x2C,0x83,0x74,0x44,0xF9,0x89,0x4D,0x87,0x90,0x1A,0x47,0xC8,0xA3,0x6D,0x09,0x6D}
+#define IID_IBMDStreamingVideoEncodingMode /* 1AB8035B-CD13-458D-B6DF-5E8F7C2141D9 */ (REFIID){0x1A,0xB8,0x03,0x5B,0xCD,0x13,0x45,0x8D,0xB6,0xDF,0x5E,0x8F,0x7C,0x21,0x41,0xD9}
+#define IID_IBMDStreamingMutableVideoEncodingMode /* 19BF7D90-1E0A-400D-B2C6-FFC4E78AD49D */ (REFIID){0x19,0xBF,0x7D,0x90,0x1E,0x0A,0x40,0x0D,0xB2,0xC6,0xFF,0xC4,0xE7,0x8A,0xD4,0x9D}
+#define IID_IBMDStreamingVideoEncodingModePresetIterator /* 7AC731A3-C950-4AD0-804A-8377AA51C6C4 */ (REFIID){0x7A,0xC7,0x31,0xA3,0xC9,0x50,0x4A,0xD0,0x80,0x4A,0x83,0x77,0xAA,0x51,0xC6,0xC4}
+#define IID_IBMDStreamingDeviceInput /* 24B6B6EC-1727-44BB-9818-34FF086ACF98 */ (REFIID){0x24,0xB6,0xB6,0xEC,0x17,0x27,0x44,0xBB,0x98,0x18,0x34,0xFF,0x08,0x6A,0xCF,0x98}
+#define IID_IBMDStreamingH264NALPacket /* E260E955-14BE-4395-9775-9F02CC0A9D89 */ (REFIID){0xE2,0x60,0xE9,0x55,0x14,0xBE,0x43,0x95,0x97,0x75,0x9F,0x02,0xCC,0x0A,0x9D,0x89}
+#define IID_IBMDStreamingAudioPacket /* D9EB5902-1AD2-43F4-9E2C-3CFA50B5EE19 */ (REFIID){0xD9,0xEB,0x59,0x02,0x1A,0xD2,0x43,0xF4,0x9E,0x2C,0x3C,0xFA,0x50,0xB5,0xEE,0x19}
+#define IID_IBMDStreamingMPEG2TSPacket /* 91810D1C-4FB3-4AAA-AE56-FA301D3DFA4C */ (REFIID){0x91,0x81,0x0D,0x1C,0x4F,0xB3,0x4A,0xAA,0xAE,0x56,0xFA,0x30,0x1D,0x3D,0xFA,0x4C}
+#define IID_IBMDStreamingH264NALParser /* 5867F18C-5BFA-4CCC-B2A7-9DFD140417D2 */ (REFIID){0x58,0x67,0xF1,0x8C,0x5B,0xFA,0x4C,0xCC,0xB2,0xA7,0x9D,0xFD,0x14,0x04,0x17,0xD2}
+
+/* Enum BMDStreamingDeviceMode - Device modes */
+
+typedef uint32_t BMDStreamingDeviceMode;
+enum _BMDStreamingDeviceMode {
+ bmdStreamingDeviceIdle = 'idle',
+ bmdStreamingDeviceEncoding = 'enco',
+ bmdStreamingDeviceStopping = 'stop',
+ bmdStreamingDeviceUnknown = 'munk'
+};
+
+/* Enum BMDStreamingEncodingFrameRate - Encoded frame rates */
+
+typedef uint32_t BMDStreamingEncodingFrameRate;
+enum _BMDStreamingEncodingFrameRate {
+
+ /* Interlaced rates */
+
+ bmdStreamingEncodedFrameRate50i = 'e50i',
+ bmdStreamingEncodedFrameRate5994i = 'e59i',
+ bmdStreamingEncodedFrameRate60i = 'e60i',
+
+ /* Progressive rates */
+
+ bmdStreamingEncodedFrameRate2398p = 'e23p',
+ bmdStreamingEncodedFrameRate24p = 'e24p',
+ bmdStreamingEncodedFrameRate25p = 'e25p',
+ bmdStreamingEncodedFrameRate2997p = 'e29p',
+ bmdStreamingEncodedFrameRate30p = 'e30p',
+ bmdStreamingEncodedFrameRate50p = 'e50p',
+ bmdStreamingEncodedFrameRate5994p = 'e59p',
+ bmdStreamingEncodedFrameRate60p = 'e60p'
+};
+
+/* Enum BMDStreamingEncodingSupport - Output encoding mode supported flag */
+
+typedef uint32_t BMDStreamingEncodingSupport;
+enum _BMDStreamingEncodingSupport {
+ bmdStreamingEncodingModeNotSupported = 0,
+ bmdStreamingEncodingModeSupported,
+ bmdStreamingEncodingModeSupportedWithChanges
+};
+
+/* Enum BMDStreamingVideoCodec - Video codecs */
+
+typedef uint32_t BMDStreamingVideoCodec;
+enum _BMDStreamingVideoCodec {
+ bmdStreamingVideoCodecH264 = 'H264'
+};
+
+/* Enum BMDStreamingH264Profile - H264 encoding profile */
+
+typedef uint32_t BMDStreamingH264Profile;
+enum _BMDStreamingH264Profile {
+ bmdStreamingH264ProfileHigh = 'high',
+ bmdStreamingH264ProfileMain = 'main',
+ bmdStreamingH264ProfileBaseline = 'base'
+};
+
+/* Enum BMDStreamingH264Level - H264 encoding level */
+
+typedef uint32_t BMDStreamingH264Level;
+enum _BMDStreamingH264Level {
+ bmdStreamingH264Level12 = 'lv12',
+ bmdStreamingH264Level13 = 'lv13',
+ bmdStreamingH264Level2 = 'lv2 ',
+ bmdStreamingH264Level21 = 'lv21',
+ bmdStreamingH264Level22 = 'lv22',
+ bmdStreamingH264Level3 = 'lv3 ',
+ bmdStreamingH264Level31 = 'lv31',
+ bmdStreamingH264Level32 = 'lv32',
+ bmdStreamingH264Level4 = 'lv4 ',
+ bmdStreamingH264Level41 = 'lv41',
+ bmdStreamingH264Level42 = 'lv42'
+};
+
+/* Enum BMDStreamingH264EntropyCoding - H264 entropy coding */
+
+typedef uint32_t BMDStreamingH264EntropyCoding;
+enum _BMDStreamingH264EntropyCoding {
+ bmdStreamingH264EntropyCodingCAVLC = 'EVLC',
+ bmdStreamingH264EntropyCodingCABAC = 'EBAC'
+};
+
+/* Enum BMDStreamingAudioCodec - Audio codecs */
+
+typedef uint32_t BMDStreamingAudioCodec;
+enum _BMDStreamingAudioCodec {
+ bmdStreamingAudioCodecAAC = 'AAC '
+};
+
+/* Enum BMDStreamingEncodingModePropertyID - Encoding mode properties */
+
+typedef uint32_t BMDStreamingEncodingModePropertyID;
+enum _BMDStreamingEncodingModePropertyID {
+
+ /* Integers, Video Properties */
+
+ bmdStreamingEncodingPropertyVideoFrameRate = 'vfrt', // Uses values of type BMDStreamingEncodingFrameRate
+ bmdStreamingEncodingPropertyVideoBitRateKbps = 'vbrt',
+
+ /* Integers, H264 Properties */
+
+ bmdStreamingEncodingPropertyH264Profile = 'hprf',
+ bmdStreamingEncodingPropertyH264Level = 'hlvl',
+ bmdStreamingEncodingPropertyH264EntropyCoding = 'hent',
+
+ /* Flags, H264 Properties */
+
+ bmdStreamingEncodingPropertyH264HasBFrames = 'hBfr',
+
+ /* Integers, Audio Properties */
+
+ bmdStreamingEncodingPropertyAudioCodec = 'acdc',
+ bmdStreamingEncodingPropertyAudioSampleRate = 'asrt',
+ bmdStreamingEncodingPropertyAudioChannelCount = 'achc',
+ bmdStreamingEncodingPropertyAudioBitRateKbps = 'abrt'
+};
+
+// Forward Declarations
+
+class IBMDStreamingDeviceNotificationCallback;
+class IBMDStreamingH264InputCallback;
+class IBMDStreamingDiscovery;
+class IBMDStreamingVideoEncodingMode;
+class IBMDStreamingMutableVideoEncodingMode;
+class IBMDStreamingVideoEncodingModePresetIterator;
+class IBMDStreamingDeviceInput;
+class IBMDStreamingH264NALPacket;
+class IBMDStreamingAudioPacket;
+class IBMDStreamingMPEG2TSPacket;
+class IBMDStreamingH264NALParser;
+
+/* Interface IBMDStreamingDeviceNotificationCallback - Device notification callbacks. */
+
+class IBMDStreamingDeviceNotificationCallback : public IUnknown
+{
+public:
+ virtual HRESULT StreamingDeviceArrived (/* in */ IDeckLink* device) = 0;
+ virtual HRESULT StreamingDeviceRemoved (/* in */ IDeckLink* device) = 0;
+ virtual HRESULT StreamingDeviceModeChanged (/* in */ IDeckLink* device, /* in */ BMDStreamingDeviceMode mode) = 0;
+
+protected:
+ virtual ~IBMDStreamingDeviceNotificationCallback () {}; // call Release method to drop reference count
+};
+
+/* Interface IBMDStreamingH264InputCallback - H264 input callbacks. */
+
+class IBMDStreamingH264InputCallback : public IUnknown
+{
+public:
+ virtual HRESULT H264NALPacketArrived (/* in */ IBMDStreamingH264NALPacket* nalPacket) = 0;
+ virtual HRESULT H264AudioPacketArrived (/* in */ IBMDStreamingAudioPacket* audioPacket) = 0;
+ virtual HRESULT MPEG2TSPacketArrived (/* in */ IBMDStreamingMPEG2TSPacket* tsPacket) = 0;
+ virtual HRESULT H264VideoInputConnectorScanningChanged (void) = 0;
+ virtual HRESULT H264VideoInputConnectorChanged (void) = 0;
+ virtual HRESULT H264VideoInputModeChanged (void) = 0;
+
+protected:
+ virtual ~IBMDStreamingH264InputCallback () {}; // call Release method to drop reference count
+};
+
+/* Interface IBMDStreamingDiscovery - Installs device notifications */
+
+class IBMDStreamingDiscovery : public IUnknown
+{
+public:
+ virtual HRESULT InstallDeviceNotifications (/* in */ IBMDStreamingDeviceNotificationCallback* theCallback) = 0;
+ virtual HRESULT UninstallDeviceNotifications (void) = 0;
+
+protected:
+ virtual ~IBMDStreamingDiscovery () {}; // call Release method to drop reference count
+};
+
+/* Interface IBMDStreamingVideoEncodingMode - Represents an encoded video mode. */
+
+class IBMDStreamingVideoEncodingMode : public IUnknown
+{
+public:
+ virtual HRESULT GetName (/* out */ CFStringRef *name) = 0;
+ virtual unsigned int GetPresetID (void) = 0;
+ virtual unsigned int GetSourcePositionX (void) = 0;
+ virtual unsigned int GetSourcePositionY (void) = 0;
+ virtual unsigned int GetSourceWidth (void) = 0;
+ virtual unsigned int GetSourceHeight (void) = 0;
+ virtual unsigned int GetDestWidth (void) = 0;
+ virtual unsigned int GetDestHeight (void) = 0;
+ virtual HRESULT GetFlag (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ bool* value) = 0;
+ virtual HRESULT GetInt (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ int64_t* value) = 0;
+ virtual HRESULT GetFloat (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ double* value) = 0;
+ virtual HRESULT GetString (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ CFStringRef *value) = 0;
+ virtual HRESULT CreateMutableVideoEncodingMode (/* out */ IBMDStreamingMutableVideoEncodingMode** newEncodingMode) = 0; // Creates a mutable copy of the encoding mode
+
+protected:
+ virtual ~IBMDStreamingVideoEncodingMode () {}; // call Release method to drop reference count
+};
+
+/* Interface IBMDStreamingMutableVideoEncodingMode - Represents a mutable encoded video mode. */
+
+class IBMDStreamingMutableVideoEncodingMode : public IBMDStreamingVideoEncodingMode
+{
+public:
+ virtual HRESULT SetSourceRect (/* in */ uint32_t posX, /* in */ uint32_t posY, /* in */ uint32_t width, /* in */ uint32_t height) = 0;
+ virtual HRESULT SetDestSize (/* in */ uint32_t width, /* in */ uint32_t height) = 0;
+ virtual HRESULT SetFlag (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* in */ bool value) = 0;
+ virtual HRESULT SetInt (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* in */ int64_t value) = 0;
+ virtual HRESULT SetFloat (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* in */ double value) = 0;
+ virtual HRESULT SetString (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* in */ CFStringRef value) = 0;
+
+protected:
+ virtual ~IBMDStreamingMutableVideoEncodingMode () {}; // call Release method to drop reference count
+};
+
+/* Interface IBMDStreamingVideoEncodingModePresetIterator - Enumerates encoding mode presets */
+
+class IBMDStreamingVideoEncodingModePresetIterator : public IUnknown
+{
+public:
+ virtual HRESULT Next (/* out */ IBMDStreamingVideoEncodingMode** videoEncodingMode) = 0;
+
+protected:
+ virtual ~IBMDStreamingVideoEncodingModePresetIterator () {}; // call Release method to drop reference count
+};
+
+/* Interface IBMDStreamingDeviceInput - Created by QueryInterface from IDeckLink */
+
+class IBMDStreamingDeviceInput : public IUnknown
+{
+public:
+
+ /* Input modes */
+
+ virtual HRESULT DoesSupportVideoInputMode (/* in */ BMDDisplayMode inputMode, /* out */ bool* result) = 0;
+ virtual HRESULT GetVideoInputModeIterator (/* out */ IDeckLinkDisplayModeIterator** iterator) = 0;
+ virtual HRESULT SetVideoInputMode (/* in */ BMDDisplayMode inputMode) = 0;
+ virtual HRESULT GetCurrentDetectedVideoInputMode (/* out */ BMDDisplayMode* detectedMode) = 0;
+
+ /* Capture modes */
+
+ virtual HRESULT GetVideoEncodingMode (/* out */ IBMDStreamingVideoEncodingMode** encodingMode) = 0;
+ virtual HRESULT GetVideoEncodingModePresetIterator (/* in */ BMDDisplayMode inputMode, /* out */ IBMDStreamingVideoEncodingModePresetIterator** iterator) = 0;
+ virtual HRESULT DoesSupportVideoEncodingMode (/* in */ BMDDisplayMode inputMode, /* in */ IBMDStreamingVideoEncodingMode* encodingMode, /* out */ BMDStreamingEncodingSupport* result, /* out */ IBMDStreamingVideoEncodingMode** changedEncodingMode) = 0;
+ virtual HRESULT SetVideoEncodingMode (/* in */ IBMDStreamingVideoEncodingMode* encodingMode) = 0;
+
+ /* Input control */
+
+ virtual HRESULT StartCapture (void) = 0;
+ virtual HRESULT StopCapture (void) = 0;
+ virtual HRESULT SetCallback (/* in */ IUnknown* theCallback) = 0;
+
+protected:
+ virtual ~IBMDStreamingDeviceInput () {}; // call Release method to drop reference count
+};
+
+/* Interface IBMDStreamingH264NALPacket - Represent an H.264 NAL packet */
+
+class IBMDStreamingH264NALPacket : public IUnknown
+{
+public:
+ virtual long GetPayloadSize (void) = 0;
+ virtual HRESULT GetBytes (/* out */ void** buffer) = 0;
+ virtual HRESULT GetBytesWithSizePrefix (/* out */ void** buffer) = 0; // Contains a 32-bit unsigned big endian size prefix
+ virtual HRESULT GetDisplayTime (/* in */ uint64_t requestedTimeScale, /* out */ uint64_t* displayTime) = 0;
+ virtual HRESULT GetPacketIndex (/* out */ uint32_t* packetIndex) = 0;
+
+protected:
+ virtual ~IBMDStreamingH264NALPacket () {}; // call Release method to drop reference count
+};
+
+/* Interface IBMDStreamingAudioPacket - Represents a chunk of audio data */
+
+class IBMDStreamingAudioPacket : public IUnknown
+{
+public:
+ virtual BMDStreamingAudioCodec GetCodec (void) = 0;
+ virtual long GetPayloadSize (void) = 0;
+ virtual HRESULT GetBytes (/* out */ void** buffer) = 0;
+ virtual HRESULT GetPlayTime (/* in */ uint64_t requestedTimeScale, /* out */ uint64_t* playTime) = 0;
+ virtual HRESULT GetPacketIndex (/* out */ uint32_t* packetIndex) = 0;
+
+protected:
+ virtual ~IBMDStreamingAudioPacket () {}; // call Release method to drop reference count
+};
+
+/* Interface IBMDStreamingMPEG2TSPacket - Represent an MPEG2 Transport Stream packet */
+
+class IBMDStreamingMPEG2TSPacket : public IUnknown
+{
+public:
+ virtual long GetPayloadSize (void) = 0;
+ virtual HRESULT GetBytes (/* out */ void** buffer) = 0;
+
+protected:
+ virtual ~IBMDStreamingMPEG2TSPacket () {}; // call Release method to drop reference count
+};
+
+/* Interface IBMDStreamingH264NALParser - For basic NAL parsing */
+
+class IBMDStreamingH264NALParser : public IUnknown
+{
+public:
+ virtual HRESULT IsNALSequenceParameterSet (/* in */ IBMDStreamingH264NALPacket* nal) = 0;
+ virtual HRESULT IsNALPictureParameterSet (/* in */ IBMDStreamingH264NALPacket* nal) = 0;
+ virtual HRESULT GetProfileAndLevelFromSPS (/* in */ IBMDStreamingH264NALPacket* nal, /* out */ uint32_t* profileIdc, /* out */ uint32_t* profileCompatability, /* out */ uint32_t* levelIdc) = 0;
+
+protected:
+ virtual ~IBMDStreamingH264NALParser () {}; // call Release method to drop reference count
+};
+
+/* Functions */
+
+extern "C" {
+
+ IBMDStreamingDiscovery* CreateBMDStreamingDiscoveryInstance (void);
+ IBMDStreamingH264NALParser* CreateBMDStreamingH264NALParser (void);
+
+};
+
+
+#endif /* defined(BMD_DECKLINKAPISTREAMING_H) */
diff --git a/sys/decklink/osx/DeckLinkAPITypes.h b/sys/decklink/osx/DeckLinkAPITypes.h
new file mode 100644
index 000000000..ed54d8e81
--- /dev/null
+++ b/sys/decklink/osx/DeckLinkAPITypes.h
@@ -0,0 +1,89 @@
+/* -LICENSE-START-
+** Copyright (c) 2011 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
+** this license (the "Software") to use, reproduce, display, distribute,
+** execute, and transmit the Software, and to prepare derivative works of the
+** Software, and to permit third-parties to whom the Software is furnished to
+** do so, all subject to the following:
+**
+** The copyright notices in the Software and this entire statement, including
+** the above license grant, this restriction and the following disclaimer,
+** must be included in all copies of the Software, in whole or in part, and
+** all derivative works of the Software, unless such copies or derivative
+** works are solely in the form of machine-executable object code generated by
+** a source language processor.
+**
+** 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+** DEALINGS IN THE SOFTWARE.
+** -LICENSE-END-
+*/
+
+#ifndef BMD_DECKLINKAPITYPES_H
+#define BMD_DECKLINKAPITYPES_H
+
+// Type Declarations
+
+typedef int64_t BMDTimeValue;
+typedef int64_t BMDTimeScale;
+typedef uint32_t BMDTimecodeBCD;
+typedef uint32_t BMDTimecodeUserBits;
+
+// Interface ID Declarations
+
+#define IID_IDeckLinkTimecode /* BC6CFBD3-8317-4325-AC1C-1216391E9340 */ (REFIID){0xBC,0x6C,0xFB,0xD3,0x83,0x17,0x43,0x25,0xAC,0x1C,0x12,0x16,0x39,0x1E,0x93,0x40}
+
+/* Enum BMDTimecodeFlags - Timecode flags */
+
+typedef uint32_t BMDTimecodeFlags;
+enum _BMDTimecodeFlags {
+ bmdTimecodeFlagDefault = 0,
+ bmdTimecodeIsDropFrame = 1 << 0
+};
+
+/* Enum BMDVideoConnection - Video connection types */
+
+typedef uint32_t BMDVideoConnection;
+enum _BMDVideoConnection {
+ bmdVideoConnectionSDI = 1 << 0,
+ bmdVideoConnectionHDMI = 1 << 1,
+ bmdVideoConnectionOpticalSDI = 1 << 2,
+ bmdVideoConnectionComponent = 1 << 3,
+ bmdVideoConnectionComposite = 1 << 4,
+ bmdVideoConnectionSVideo = 1 << 5
+};
+
+// Forward Declarations
+
+class IDeckLinkTimecode;
+
+/* Interface IDeckLinkTimecode - Used for video frame timecode representation. */
+
+class IDeckLinkTimecode : public IUnknown
+{
+public:
+ virtual BMDTimecodeBCD GetBCD (void) = 0;
+ virtual HRESULT GetComponents (/* out */ uint8_t *hours, /* out */ uint8_t *minutes, /* out */ uint8_t *seconds, /* out */ uint8_t *frames) = 0;
+ virtual HRESULT GetString (/* out */ CFStringRef *timecode) = 0;
+ virtual BMDTimecodeFlags GetFlags (void) = 0;
+ virtual HRESULT GetTimecodeUserBits (/* out */ BMDTimecodeUserBits *userBits) = 0;
+
+protected:
+ virtual ~IDeckLinkTimecode () {}; // call Release method to drop reference count
+};
+
+/* Functions */
+
+extern "C" {
+
+
+};
+
+
+#endif /* defined(BMD_DECKLINKAPITYPES_H) */
diff --git a/sys/decklink/osx/DeckLinkAPIVersion.h b/sys/decklink/osx/DeckLinkAPIVersion.h
new file mode 100644
index 000000000..2681ed0a0
--- /dev/null
+++ b/sys/decklink/osx/DeckLinkAPIVersion.h
@@ -0,0 +1,37 @@
+/* -LICENSE-START-
+ * ** Copyright (c) 2011 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
+ * ** this license (the "Software") to use, reproduce, display, distribute,
+ * ** execute, and transmit the Software, and to prepare derivative works of the
+ * ** Software, and to permit third-parties to whom the Software is furnished to
+ * ** do so, all subject to the following:
+ * **
+ * ** The copyright notices in the Software and this entire statement, including
+ * ** the above license grant, this restriction and the following disclaimer,
+ * ** must be included in all copies of the Software, in whole or in part, and
+ * ** all derivative works of the Software, unless such copies or derivative
+ * ** works are solely in the form of machine-executable object code generated by
+ * ** a source language processor.
+ * **
+ * ** 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+ * ** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+ * ** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ * ** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * ** DEALINGS IN THE SOFTWARE.
+ * ** -LICENSE-END-
+ * */
+
+/* DeckLinkAPIVersion.h */
+
+#ifndef __DeckLink_API_Verison_h__
+#define __DeckLink_API_Version_h__
+
+#define BLACKMAGIC_DECKLINK_API_VERSION 0x09000000
+#define BLACKMAGIC_DECKLINK_API_VERSION_STRING "9.0"
+
+#endif // __DeckLink_API_Version_h__
+
diff --git a/sys/dvb/camutils.c b/sys/dvb/camutils.c
index b3062b597..721b5cd96 100644
--- a/sys/dvb/camutils.c
+++ b/sys/dvb/camutils.c
@@ -21,6 +21,10 @@
* Boston, MA 02111-1307, USA.
*/
+/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex
+ * with newer GLib versions (>= 2.31.0) */
+#define GLIB_DISABLE_DEPRECATION_WARNINGS
+
#include <gst/gst.h>
#include <string.h>
diff --git a/sys/dvb/gstdvbsrc.c b/sys/dvb/gstdvbsrc.c
index 5f2ddd996..c13f33639 100644
--- a/sys/dvb/gstdvbsrc.c
+++ b/sys/dvb/gstdvbsrc.c
@@ -462,6 +462,8 @@ gst_dvbsrc_init (GstDvbSrc * object)
/* We are a live source */
gst_base_src_set_live (GST_BASE_SRC (object), TRUE);
+ /* And we wanted timestamped output */
+ gst_base_src_set_do_timestamp (GST_BASE_SRC (object), TRUE);
object->fd_frontend = -1;
object->fd_dvr = -1;
@@ -940,7 +942,7 @@ gst_dvbsrc_read_device (GstDvbSrc * object, int size)
}
gst_buffer_unmap (buf, &map);
gst_buffer_resize (buf, 0, count);
- GST_BUFFER_TIMESTAMP (buf) = GST_CLOCK_TIME_NONE;
+
return buf;
stopped:
diff --git a/sys/shm/gstshmsink.c b/sys/shm/gstshmsink.c
index d37c28d85..605e79871 100644
--- a/sys/shm/gstshmsink.c
+++ b/sys/shm/gstshmsink.c
@@ -18,8 +18,18 @@
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
-
-
+/**
+ * SECTION:element-shmsink
+ *
+ * Send data over shared memory to the matching source.
+ *
+ * <refsect2>
+ * <title>Example launch lines</title>
+ * |[
+ * gst-launch -v videotestsrc ! shmsink socket-path=/tmp/blah shm-size=1000000
+ * ]| Send video to shm buffers.
+ * </refsect2>
+ */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
diff --git a/sys/shm/gstshmsrc.c b/sys/shm/gstshmsrc.c
index b7537f436..672f4f3a4 100644
--- a/sys/shm/gstshmsrc.c
+++ b/sys/shm/gstshmsrc.c
@@ -18,6 +18,20 @@
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
+/**
+ * SECTION:element-shmsrc
+ *
+ * Receive data from the shared memory sink.
+ *
+ * <refsect2>
+ * <title>Example launch lines</title>
+ * |[
+ * gst-launch shmsrc socket-path=/tmp/blah ! \
+ * "video/x-raw-yuv, format=(fourcc)YUY2, color-matrix=(string)sdtv, \
+ * chroma-site=(string)mpeg2, width=(int)320, height=(int)240, framerate=(fraction)30/1" ! autovideosink
+ * ]| Render video from shm buffers.
+ * </refsect2>
+ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -120,10 +134,10 @@ gst_shm_src_class_init (GstShmSrcClass * klass)
gst_element_class_add_pad_template (gstelement_class,
gst_static_pad_template_get (&srctemplate));
- gst_element_class_set_details_simple (gstelement_class,
+ gst_element_class_set_details_simple (element_class,
"Shared Memory Source",
"Source",
- "Receive data from the sharem memory sink",
+ "Receive data from the shared memory sink",
"Olivier Crete <olivier.crete@collabora.co.uk>");
GST_DEBUG_CATEGORY_INIT (shmsrc_debug, "shmsrc", 0, "Shared Memory Source");
diff --git a/sys/vdpau/gstvdp/gstvdpbufferpool.c b/sys/vdpau/gstvdp/gstvdpbufferpool.c
index fea8aea4f..61c706b23 100644
--- a/sys/vdpau/gstvdp/gstvdpbufferpool.c
+++ b/sys/vdpau/gstvdp/gstvdpbufferpool.c
@@ -18,6 +18,9 @@
* Boston, MA 02111-1307, USA.
*/
+/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex
+ * with newer GLib versions (>= 2.31.0) */
+#define GLIB_DISABLE_DEPRECATION_WARNINGS
#include "gstvdpbufferpool.h"
diff --git a/sys/vdpau/gstvdp/gstvdpdevice.c b/sys/vdpau/gstvdp/gstvdpdevice.c
index 359874b16..eb5451800 100644
--- a/sys/vdpau/gstvdp/gstvdpdevice.c
+++ b/sys/vdpau/gstvdp/gstvdpdevice.c
@@ -18,6 +18,10 @@
* Boston, MA 02111-1307, USA.
*/
+/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex
+ * with newer GLib versions (>= 2.31.0) */
+#define GLIB_DISABLE_DEPRECATION_WARNINGS
+
#include "gstvdpdevice.h"
GST_DEBUG_CATEGORY_STATIC (gst_vdp_device_debug);
diff --git a/sys/vdpau/gstvdp/gstvdpoutputbufferpool.c b/sys/vdpau/gstvdp/gstvdpoutputbufferpool.c
index 826ef218b..27f668988 100644
--- a/sys/vdpau/gstvdp/gstvdpoutputbufferpool.c
+++ b/sys/vdpau/gstvdp/gstvdpoutputbufferpool.c
@@ -3,18 +3,20 @@
* gst-plugins-bad
* Copyright (C) Carl-Anton Ingmarsson 2010 <ca.ingmarsson@gmail.com>
*
- * gst-plugins-bad is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * gst-plugins-bad is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
+ * 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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
*/
#include "gstvdpdevice.h"
diff --git a/sys/vdpau/gstvdp/gstvdpoutputbufferpool.h b/sys/vdpau/gstvdp/gstvdpoutputbufferpool.h
index 354461c0e..7c40684b4 100644
--- a/sys/vdpau/gstvdp/gstvdpoutputbufferpool.h
+++ b/sys/vdpau/gstvdp/gstvdpoutputbufferpool.h
@@ -3,18 +3,20 @@
* gst-plugins-bad
* Copyright (C) Carl-Anton Ingmarsson 2010 <ca.ingmarsson@gmail.com>
*
- * gst-plugins-bad is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * gst-plugins-bad is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
+ * 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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
*/
#ifndef _GST_VDP_OUTPUT_BUFFER_POOL_H_
diff --git a/sys/vdpau/gstvdp/gstvdpvideobufferpool.c b/sys/vdpau/gstvdp/gstvdpvideobufferpool.c
index 889367d98..fdecb0d48 100644
--- a/sys/vdpau/gstvdp/gstvdpvideobufferpool.c
+++ b/sys/vdpau/gstvdp/gstvdpvideobufferpool.c
@@ -3,18 +3,20 @@
* gst-plugins-bad
* Copyright (C) Carl-Anton Ingmarsson 2010 <ca.ingmarsson@gmail.com>
*
- * gst-plugins-bad is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * gst-plugins-bad is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
+ * 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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
*/
#include "gstvdpdevice.h"
diff --git a/sys/vdpau/gstvdp/gstvdpvideobufferpool.h b/sys/vdpau/gstvdp/gstvdpvideobufferpool.h
index e22e9b939..8676102f1 100644
--- a/sys/vdpau/gstvdp/gstvdpvideobufferpool.h
+++ b/sys/vdpau/gstvdp/gstvdpvideobufferpool.h
@@ -3,18 +3,20 @@
* gst-plugins-bad
* Copyright (C) Carl-Anton Ingmarsson 2010 <ca.ingmarsson@gmail.com>
*
- * gst-plugins-bad is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * gst-plugins-bad is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
+ * 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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
*/
#ifndef _GST_VDP_VIDEO_BUFFERPOOL_H_
diff --git a/sys/vdpau/gstvdpsink.c b/sys/vdpau/gstvdpsink.c
index c3d097fdd..5a5677eb4 100644
--- a/sys/vdpau/gstvdpsink.c
+++ b/sys/vdpau/gstvdpsink.c
@@ -18,6 +18,10 @@
* Boston, MA 02111-1307, 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
diff --git a/sys/vdpau/h264/gstvdph264dec.c b/sys/vdpau/h264/gstvdph264dec.c
index 6c181aff0..ab5479794 100644
--- a/sys/vdpau/h264/gstvdph264dec.c
+++ b/sys/vdpau/h264/gstvdph264dec.c
@@ -687,23 +687,25 @@ gst_vdp_h264_dec_parse_data (GstBaseVideoDecoder * base_video_decoder,
gst_bit_reader_init_from_buffer (&reader, buf);
+ if (gst_bit_reader_get_remaining (&reader) <
+ h264_dec->nal_length_size * 8 + 7)
+ goto invalid_packet;
+
/* skip nal_length or sync code */
- gst_bit_reader_skip (&reader, h264_dec->nal_length_size * 8);
+ gst_bit_reader_skip_unchecked (&reader, h264_dec->nal_length_size * 8);
+
+ forbidden_zero_bit = gst_bit_reader_get_bits_uint8_unchecked (&reader, 1);
- if (!gst_bit_reader_get_bits_uint8 (&reader, &forbidden_zero_bit, 1))
- goto invalid_packet;
if (forbidden_zero_bit != 0) {
GST_WARNING ("forbidden_zero_bit != 0");
return GST_FLOW_ERROR;
}
- if (!gst_bit_reader_get_bits_uint16 (&reader, &nal_unit.ref_idc, 2))
- goto invalid_packet;
+ nal_unit.ref_idc = gst_bit_reader_get_bits_uint16_unchecked (&reader, 2);
GST_DEBUG ("nal_ref_idc: %u", nal_unit.ref_idc);
/* read nal_unit_type */
- if (!gst_bit_reader_get_bits_uint16 (&reader, &nal_unit.type, 5))
- goto invalid_packet;
+ nal_unit.type = gst_bit_reader_get_bits_uint16_unchecked (&reader, 5);
GST_DEBUG ("nal_unit_type: %u", nal_unit.type);
if (nal_unit.type == 14 || nal_unit.type == 20) {
@@ -716,7 +718,7 @@ gst_vdp_h264_dec_parse_data (GstBaseVideoDecoder * base_video_decoder,
size = gst_bit_reader_get_remaining (&reader) / 8;
i = size - 1;
- while (size >= 0 && data[i] == 0x00) {
+ while ((gint) size > 0 && data[i] == 0x00) {
size--;
i--;
}
diff --git a/sys/vdpau/mpeg/gstvdpmpegdec.c b/sys/vdpau/mpeg/gstvdpmpegdec.c
index 3de0eec65..96c04c8ce 100644
--- a/sys/vdpau/mpeg/gstvdpmpegdec.c
+++ b/sys/vdpau/mpeg/gstvdpmpegdec.c
@@ -415,12 +415,14 @@ gst_vdp_mpeg_dec_parse_data (GstBaseVideoDecoder * base_video_decoder,
GstBitReader b_reader = GST_BIT_READER_INIT_FROM_BUFFER (buf);
guint8 start_code;
+ if (gst_bit_reader_get_remaining (&b_reader) < 8 * 3 + 8)
+ return GST_FLOW_ERROR;
+
/* skip sync_code */
- gst_bit_reader_skip (&b_reader, 8 * 3);
+ gst_bit_reader_skip_unchecked (&b_reader, 8 * 3);
/* start_code */
- if (!gst_bit_reader_get_bits_uint8 (&b_reader, &start_code, 8))
- return GST_FLOW_ERROR;
+ start_code = gst_bit_reader_get_bits_uint8_unchecked (&b_reader, 8);
mpeg_frame = GST_VDP_MPEG_FRAME_CAST (frame);
diff --git a/sys/winscreencap/Makefile.am b/sys/winscreencap/Makefile.am
index d14273b38..09d80d2c0 100644
--- a/sys/winscreencap/Makefile.am
+++ b/sys/winscreencap/Makefile.am
@@ -1,8 +1,11 @@
-# This plugin isn't buildable with autotools at this point in time, so just
-# ensure everything's listed in EXTRA_DIST
+plugin_LTLIBRARIES = libgstwinscreencap.la
-EXTRA_DIST = \
- gstdx9screencapsrc.c gstdx9screencapsrc.h \
- gstgdiscreencapsrc.c gstgdiscreencapsrc.h \
- gstwinscreencap.c gstwinscreencap.h
+libgstwinscreencap_la_SOURCES = gstdx9screencapsrc.c gstgdiscreencapsrc.c gstwinscreencap.c
+libgstwinscreencap_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \
+ $(GST_PLUGINS_BASE_CFLAGS)
+libgstwinscreencap_la_LIBADD = $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) \
+ $(DIRECT3D9_LIBS)
+libgstwinscreencap_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstwinscreencap_la_LIBTOOLFLAGS = --tag=disable-static
+noinst_HEADERS= gstwinscreencap.h
diff --git a/sys/winscreencap/gstdx9screencapsrc.c b/sys/winscreencap/gstdx9screencapsrc.c
index 83bcea277..5283376a1 100644
--- a/sys/winscreencap/gstdx9screencapsrc.c
+++ b/sys/winscreencap/gstdx9screencapsrc.c
@@ -297,14 +297,15 @@ gst_dx9screencapsrc_set_caps (GstBaseSrc * bsrc, GstCaps * caps)
src->src_rect.bottom = src->src_rect.top + src->capture_h;
}
- if (framerate = gst_structure_get_value (structure, "framerate")) {
+ framerate = gst_structure_get_value (structure, "framerate");
+ if (framerate) {
src->rate_numerator = gst_value_get_fraction_numerator (framerate);
src->rate_denominator = gst_value_get_fraction_denominator (framerate);
}
GST_DEBUG_OBJECT (src, "size %dx%d, %d/%d fps",
- src->src_rect.right - src->src_rect.left,
- src->src_rect.bottom - src->src_rect.top,
+ (gint) (src->src_rect.right - src->src_rect.left),
+ (gint) (src->src_rect.bottom - src->src_rect.top),
src->rate_numerator, src->rate_denominator);
return TRUE;
@@ -391,26 +392,26 @@ gst_dx9screencapsrc_create_caps_from_format (D3DFORMAT fmt,
depth = 15;
endianness = G_BYTE_ORDER;
alpha = GST_VIDEO_ALPHA_MASK_15_INT;
- red = GST_VIDEO_RED_MASK_15_INT;
- green = GST_VIDEO_GREEN_MASK_15_INT;
- blue = GST_VIDEO_BLUE_MASK_15_INT;
+ red = GST_VIDEO_COMP1_MASK_15_INT;
+ green = GST_VIDEO_COMP2_MASK_15_INT;
+ blue = GST_VIDEO_COMP3_MASK_15_INT;
break;
case D3DFMT_X1R5G5B5:
bpp = 16;
depth = 15;
endianness = G_BYTE_ORDER;
alpha = 0;
- red = GST_VIDEO_RED_MASK_15_INT;
- green = GST_VIDEO_GREEN_MASK_15_INT;
- blue = GST_VIDEO_BLUE_MASK_15_INT;
+ red = GST_VIDEO_COMP1_MASK_15_INT;
+ green = GST_VIDEO_COMP2_MASK_15_INT;
+ blue = GST_VIDEO_COMP3_MASK_15_INT;
break;
case D3DFMT_R5G6B5:
bpp = depth = 16;
endianness = G_BYTE_ORDER;
alpha = 0;
- red = GST_VIDEO_RED_MASK_16_INT;
- green = GST_VIDEO_GREEN_MASK_16_INT;
- blue = GST_VIDEO_BLUE_MASK_16_INT;
+ red = GST_VIDEO_COMP1_MASK_15_INT;
+ green = GST_VIDEO_COMP2_MASK_15_INT;
+ blue = GST_VIDEO_COMP3_MASK_15_INT;
break;
default:
return NULL;
@@ -479,7 +480,6 @@ static void
gst_dx9screencapsrc_get_times (GstBaseSrc * basesrc,
GstBuffer * buffer, GstClockTime * start, GstClockTime * end)
{
- GstDX9ScreenCapSrc *src = GST_DX9SCREENCAPSRC (basesrc);
GstClockTime timestamp;
timestamp = GST_BUFFER_TIMESTAMP (buffer);
@@ -502,7 +502,8 @@ gst_dx9screencapsrc_create (GstPushSrc * push_src, GstBuffer ** buf)
gint new_buf_size, i;
gint width, height, stride;
GstClock *clock;
- GstClockTime time, buf_time;
+ GstClockTime time = GST_CLOCK_TIME_NONE;
+ GstClockTime buf_time;
D3DLOCKED_RECT locked_rect;
LPBYTE p_dst, p_src;
HRESULT hres;
@@ -537,7 +538,7 @@ gst_dx9screencapsrc_create (GstPushSrc * push_src, GstBuffer ** buf)
}
GST_LOG_OBJECT (src,
- "creating buffer of %lu bytes with %dx%d image for frame %d",
+ "creating buffer of %d bytes with %dx%d image for frame %d",
new_buf_size, width, height, (gint) src->frames);
res = gst_pad_alloc_buffer_and_set_caps (GST_BASE_SRC_PAD (src),
diff --git a/sys/winscreencap/gstgdiscreencapsrc.c b/sys/winscreencap/gstgdiscreencapsrc.c
index ff9ea7b72..7658b2ea2 100644
--- a/sys/winscreencap/gstgdiscreencapsrc.c
+++ b/sys/winscreencap/gstgdiscreencapsrc.c
@@ -316,7 +316,8 @@ gst_gdiscreencapsrc_set_caps (GstBaseSrc * bsrc, GstCaps * caps)
src->src_rect.bottom = src->src_rect.top + src->capture_h;
}
- if (framerate = gst_structure_get_value (structure, "framerate")) {
+ framerate = gst_structure_get_value (structure, "framerate");
+ if (framerate) {
src->rate_numerator = gst_value_get_fraction_numerator (framerate);
src->rate_denominator = gst_value_get_fraction_denominator (framerate);
}
@@ -350,8 +351,8 @@ gst_gdiscreencapsrc_set_caps (GstBaseSrc * bsrc, GstCaps * caps)
ReleaseDC (capture, device);
GST_DEBUG_OBJECT (src, "size %dx%d, %d/%d fps",
- src->info.bmiHeader.biWidth,
- -src->info.bmiHeader.biHeight,
+ (gint) src->info.bmiHeader.biWidth,
+ (gint) (-src->info.bmiHeader.biHeight),
src->rate_numerator, src->rate_denominator);
return TRUE;
@@ -379,7 +380,8 @@ gst_gdiscreencapsrc_get_caps (GstBaseSrc * bsrc)
}
GST_DEBUG ("width = %d, height=%d",
- rect_dst.right - rect_dst.left, rect_dst.bottom - rect_dst.top);
+ (gint) (rect_dst.right - rect_dst.left),
+ (gint) (rect_dst.bottom - rect_dst.top));
return gst_caps_new_simple ("video/x-raw-rgb",
"bpp", G_TYPE_INT, 24,
@@ -417,7 +419,6 @@ static void
gst_gdiscreencapsrc_get_times (GstBaseSrc * basesrc, GstBuffer * buffer,
GstClockTime * start, GstClockTime * end)
{
- GstGDIScreenCapSrc *src = GST_GDISCREENCAPSRC (basesrc);
GstClockTime timestamp;
timestamp = GST_BUFFER_TIMESTAMP (buffer);
@@ -439,7 +440,7 @@ gst_gdiscreencapsrc_create (GstPushSrc * push_src, GstBuffer ** buf)
GstFlowReturn res;
gint new_buf_size;
GstClock *clock;
- GstClockTime time;
+ GstClockTime time = GST_CLOCK_TIME_NONE;
GstClockTime base_time;
if (G_UNLIKELY (!src->info.bmiHeader.biWidth ||
@@ -456,9 +457,9 @@ gst_gdiscreencapsrc_create (GstPushSrc * push_src, GstBuffer ** buf)
(-src->info.bmiHeader.biHeight);
GST_LOG_OBJECT (src,
- "creating buffer of %lu bytes with %dx%d image for frame %d",
- new_buf_size, src->info.bmiHeader.biWidth,
- -src->info.bmiHeader.biHeight, (gint) src->frames);
+ "creating buffer of %d bytes with %dx%d image for frame %d",
+ new_buf_size, (gint) src->info.bmiHeader.biWidth,
+ (gint) (-src->info.bmiHeader.biHeight), (gint) src->frames);
res =
gst_pad_alloc_buffer_and_set_caps (GST_BASE_SRC_PAD (src),
diff --git a/tests/check/elements/.gitignore b/tests/check/elements/.gitignore
index 08043fb77..c7a3d2a4f 100644
--- a/tests/check/elements/.gitignore
+++ b/tests/check/elements/.gitignore
@@ -43,6 +43,7 @@ y4menc
videorecordingbin
viewfinderbin
voaacenc
+voamrwbenc
vp8dec
vp8enc
zbar
diff --git a/tests/check/libs/.gitignore b/tests/check/libs/.gitignore
index 33bb8b6d6..238cb3d11 100644
--- a/tests/check/libs/.gitignore
+++ b/tests/check/libs/.gitignore
@@ -1,3 +1,4 @@
+.dirstamp
h264parser
mpegvideoparser
vc1parser
diff --git a/tests/examples/scaletempo/demo-gui.c b/tests/examples/scaletempo/demo-gui.c
index 9af311308..0339108e7 100644
--- a/tests/examples/scaletempo/demo-gui.c
+++ b/tests/examples/scaletempo/demo-gui.c
@@ -19,6 +19,10 @@
#include "config.h"
#endif
+/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex
+ * with newer GLib versions (>= 2.31.0) */
+#define GLIB_DISABLE_DEPRECATION_WARNINGS
+
#include <gst/glib-compat-private.h>
#include <gtk/gtk.h>
#include <glib/gprintf.h>
diff --git a/tools/element-templates/basesrc b/tools/element-templates/basesrc
index 0b7e56fc1..1be325a22 100644
--- a/tools/element-templates/basesrc
+++ b/tools/element-templates/basesrc
@@ -161,10 +161,16 @@ static gboolean
gst_replace_event (GstBaseSrc * src, GstEvent * event)
{
GstReplace *replace = GST_REPLACE (src);
+ gboolean ret;
GST_DEBUG_OBJECT (replace, "event");
- return TRUE;
+ switch (GST_EVENT_TYPE (event)) {
+ default:
+ ret = GST_BASE_SRC_CLASS (parent_class)->event (src, event);
+ }
+
+ return ret;
}
static GstFlowReturn
@@ -192,10 +198,16 @@ static gboolean
gst_replace_query (GstBaseSrc * src, GstQuery * query)
{
GstReplace *replace = GST_REPLACE (src);
+ gboolean ret;
GST_DEBUG_OBJECT (replace, "query");
- return TRUE;
+ switch (GST_QUERY_TYPE (query)) {
+ default:
+ ret = GST_BASE_SRC_CLASS (parent_class)->query (src, query);
+ }
+
+ return ret;
}
static gboolean
diff --git a/tools/element-templates/element b/tools/element-templates/element
index 001f48762..38ab6e4da 100644
--- a/tools/element-templates/element
+++ b/tools/element-templates/element
@@ -123,7 +123,17 @@ gst_replace_send_event (GstElement * element, GstEvent * event)
static gboolean
gst_replace_query (GstElement * element, GstQuery * query)
{
+ GstReplace *replace = GST_REPLACE (element);
+ gboolean ret;
- return FALSE;
+ GST_DEBUG_OBJECT (replace, "query");
+
+ switch (GST_QUERY_TYPE (query)) {
+ default:
+ ret = GST_ELEMENT_CLASS (parent_class)->query (element, query);
+ break;
+ }
+
+ return ret;
}
% end
diff --git a/tools/element-templates/sinkpad-template b/tools/element-templates/sinkpad-template
new file mode 100644
index 000000000..b06b346b1
--- /dev/null
+++ b/tools/element-templates/sinkpad-template
@@ -0,0 +1,19 @@
+/* vim: set filetype=c: */
+
+% instance-members
+% prototypes
+% pad-template
+static GstStaticPadTemplate gst_replace_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("application/unknown")
+ );
+
+% base-init
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_replace_sink_template);
+% instance-init
+% methods
+% end
+
diff --git a/tools/element-templates/sinkpad-template-video b/tools/element-templates/sinkpad-template-video
new file mode 100644
index 000000000..b317c6fd7
--- /dev/null
+++ b/tools/element-templates/sinkpad-template-video
@@ -0,0 +1,33 @@
+/* vim: set filetype=c: */
+
+% instance-members
+% prototypes
+% pad-template
+/* FIXME: add/remove formats you can handle */
+#define VIDEO_SINK_CAPS \
+ GST_VIDEO_CAPS_RGBA "; " \
+ GST_VIDEO_CAPS_ARGB "; " \
+ GST_VIDEO_CAPS_BGRA "; " \
+ GST_VIDEO_CAPS_ABGR "; " \
+ GST_VIDEO_CAPS_RGBx "; " \
+ GST_VIDEO_CAPS_xRGB "; " \
+ GST_VIDEO_CAPS_BGRx "; " \
+ GST_VIDEO_CAPS_xBGR "; " \
+ GST_VIDEO_CAPS_RGB "; " \
+ GST_VIDEO_CAPS_BGR "; " \
+ GST_VIDEO_CAPS_YUV("{ AYUV }")
+
+static GstStaticPadTemplate gst_replace_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (VIDEO_SINK_CAPS)
+ );
+
+% base-init
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_replace_sink_template);
+% instance-init
+% methods
+% end
+
diff --git a/tools/element-templates/srcpad-template b/tools/element-templates/srcpad-template
new file mode 100644
index 000000000..dd0842bbd
--- /dev/null
+++ b/tools/element-templates/srcpad-template
@@ -0,0 +1,19 @@
+/* vim: set filetype=c: */
+
+% instance-members
+% prototypes
+% pad-template
+static GstStaticPadTemplate gst_replace_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("application/unknown")
+ );
+
+% base-init
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_replace_src_template);
+% instance-init
+% methods
+% end
+
diff --git a/tools/element-templates/srcpad-template-video b/tools/element-templates/srcpad-template-video
new file mode 100644
index 000000000..4f3932086
--- /dev/null
+++ b/tools/element-templates/srcpad-template-video
@@ -0,0 +1,33 @@
+/* vim: set filetype=c: */
+
+% instance-members
+% prototypes
+% pad-template
+/* FIXME: add/remove formats you can handle */
+#define VIDEO_SRC_CAPS \
+ GST_VIDEO_CAPS_RGBA "; " \
+ GST_VIDEO_CAPS_ARGB "; " \
+ GST_VIDEO_CAPS_BGRA "; " \
+ GST_VIDEO_CAPS_ABGR "; " \
+ GST_VIDEO_CAPS_RGBx "; " \
+ GST_VIDEO_CAPS_xRGB "; " \
+ GST_VIDEO_CAPS_BGRx "; " \
+ GST_VIDEO_CAPS_xBGR "; " \
+ GST_VIDEO_CAPS_RGB "; " \
+ GST_VIDEO_CAPS_BGR "; " \
+ GST_VIDEO_CAPS_YUV("{ AYUV }")
+
+static GstStaticPadTemplate gst_replace_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (VIDEO_SRC_CAPS)
+ );
+
+% base-init
+ gst_element_class_add_static_pad_template (element_class,
+ &gst_replace_src_template);
+% instance-init
+% methods
+% end
+
diff --git a/tools/element-templates/videofilter b/tools/element-templates/videofilter
new file mode 100644
index 000000000..3a94b0838
--- /dev/null
+++ b/tools/element-templates/videofilter
@@ -0,0 +1,78 @@
+/* vim: set filetype=c: */
+% ClassName
+GstVideoFilter
+% TYPE_CLASS_NAME
+GST_TYPE_VIDEO_FILTER
+% pads
+sinkpad-template-video srcpad-template-video
+% pkg-config
+gstreamer-video-0.10
+% includes
+#include <gst/video/video.h>
+#include <gst/video/gstvideofilter.h>
+% prototypes
+static gboolean
+gst_replace_start (GstBaseTransform * trans);
+static gboolean
+gst_replace_stop (GstBaseTransform * trans);
+static GstFlowReturn
+gst_replace_transform_ip (GstBaseTransform * trans, GstBuffer * buf);
+static gboolean
+gst_replace_set_caps (GstBaseTransform * trans, GstCaps * incaps,
+ GstCaps * outcaps);
+% declare-class
+ GstBaseTransformClass *base_transform_class = GST_BASE_TRANSFORM_CLASS (klass);
+% set-methods
+ base_transform_class->start = GST_DEBUG_FUNCPTR (gst_replace_start);
+ base_transform_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop);
+ base_transform_class->set_caps = GST_DEBUG_FUNCPTR (gst_replace_set_caps);
+ base_transform_class->transform_ip = GST_DEBUG_FUNCPTR (gst_replace_transform_ip);
+% methods
+
+static gboolean
+gst_replace_start (GstBaseTransform * trans)
+{
+ /* GstReplace *replace = GST_REPLACE (trans); */
+
+ /* initialize processing */
+ return TRUE;
+}
+
+static gboolean
+gst_replace_stop (GstBaseTransform * trans)
+{
+ /* GstReplace *replace = GST_REPLACE (trans); */
+
+ /* finalize processing */
+ return TRUE;
+}
+
+static gboolean
+gst_replace_set_caps (GstBaseTransform * trans, GstCaps * incaps,
+ GstCaps * outcaps)
+{
+ /* GstReplace *replace = GST_REPLACE (trans); */
+ GstVideoFormat video_format;
+ int w, h;
+
+ /* parse input caps, output caps are the same so we ignore them */
+ if (!gst_video_format_parse_caps (incaps, &video_format, &w, &h))
+ return FALSE;
+
+ /* You'll need to add those fields to the instance struct first */
+ /* replace->video_format = video_format; */
+ /* replace->width = w; */
+ /* replace->height = h; */
+ return TRUE;
+}
+
+static GstFlowReturn
+gst_replace_transform_ip (GstBaseTransform * trans, GstBuffer * buf)
+{
+ /* GstReplace *replace = GST_REPLACE (trans); */
+
+ /* process the video data in the buffer in-place */
+ return GST_FLOW_OK;
+}
+
+% end