summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--LICENSE_readme3
-rw-r--r--REQUIREMENTS6
m---------common0
-rw-r--r--configure.ac27
-rw-r--r--docs/plugins/Makefile.am7
-rw-r--r--docs/plugins/gst-plugins-bad-plugins-docs.sgml11
-rw-r--r--docs/plugins/gst-plugins-bad-plugins-sections.txt93
-rw-r--r--docs/plugins/gst-plugins-bad-plugins.args3095
-rw-r--r--docs/plugins/gst-plugins-bad-plugins.hierarchy576
-rw-r--r--docs/plugins/gst-plugins-bad-plugins.interfaces38
-rw-r--r--docs/plugins/gst-plugins-bad-plugins.prerequisites12
-rw-r--r--docs/plugins/inspect/plugin-aacparse.xml6
-rw-r--r--docs/plugins/inspect/plugin-adpcmdec.xml6
-rw-r--r--docs/plugins/inspect/plugin-aiffparse.xml6
-rw-r--r--docs/plugins/inspect/plugin-alsaspdif.xml6
-rw-r--r--docs/plugins/inspect/plugin-amrparse.xml6
-rw-r--r--docs/plugins/inspect/plugin-amrwb.xml4
-rw-r--r--docs/plugins/inspect/plugin-apex.xml6
-rw-r--r--docs/plugins/inspect/plugin-autoconvert.xml6
-rw-r--r--docs/plugins/inspect/plugin-bayer.xml6
-rw-r--r--docs/plugins/inspect/plugin-bz2.xml6
-rw-r--r--docs/plugins/inspect/plugin-camerabin.xml6
-rw-r--r--docs/plugins/inspect/plugin-cdaudio.xml6
-rw-r--r--docs/plugins/inspect/plugin-cdxaparse.xml6
-rw-r--r--docs/plugins/inspect/plugin-celt.xml6
-rw-r--r--docs/plugins/inspect/plugin-dc1394.xml6
-rw-r--r--docs/plugins/inspect/plugin-dccp.xml2
-rw-r--r--docs/plugins/inspect/plugin-debugutilsbad.xml6
-rw-r--r--docs/plugins/inspect/plugin-dfbvideosink.xml6
-rw-r--r--docs/plugins/inspect/plugin-dtmf.xml6
-rw-r--r--docs/plugins/inspect/plugin-dtsdec.xml6
-rw-r--r--docs/plugins/inspect/plugin-dvb.xml6
-rw-r--r--docs/plugins/inspect/plugin-dvdspu.xml6
-rw-r--r--docs/plugins/inspect/plugin-faac.xml6
-rw-r--r--docs/plugins/inspect/plugin-faad.xml6
-rw-r--r--docs/plugins/inspect/plugin-fbdevsink.xml6
-rw-r--r--docs/plugins/inspect/plugin-festival.xml6
-rw-r--r--docs/plugins/inspect/plugin-freeze.xml6
-rw-r--r--docs/plugins/inspect/plugin-frei0r.xml14
-rw-r--r--docs/plugins/inspect/plugin-gsm.xml6
-rw-r--r--docs/plugins/inspect/plugin-gstrtpmanager.xml33
-rw-r--r--docs/plugins/inspect/plugin-gstsiren.xml6
-rw-r--r--docs/plugins/inspect/plugin-h264parse.xml6
-rw-r--r--docs/plugins/inspect/plugin-hdvparse.xml2
-rw-r--r--docs/plugins/inspect/plugin-id3tag.xml6
-rw-r--r--docs/plugins/inspect/plugin-jack.xml6
-rw-r--r--docs/plugins/inspect/plugin-kate.xml124
-rw-r--r--docs/plugins/inspect/plugin-ladspa.xml8474
-rw-r--r--docs/plugins/inspect/plugin-legacyresample.xml6
-rw-r--r--docs/plugins/inspect/plugin-liveadder.xml6
-rw-r--r--docs/plugins/inspect/plugin-lv2.xml352
-rw-r--r--docs/plugins/inspect/plugin-metadata.xml6
-rw-r--r--docs/plugins/inspect/plugin-mms.xml6
-rw-r--r--docs/plugins/inspect/plugin-modplug.xml8
-rw-r--r--docs/plugins/inspect/plugin-mpeg2enc.xml6
-rw-r--r--docs/plugins/inspect/plugin-mpeg4videoparse.xml6
-rw-r--r--docs/plugins/inspect/plugin-mpegdemux2.xml6
-rw-r--r--docs/plugins/inspect/plugin-mpegtsmux.xml6
-rw-r--r--docs/plugins/inspect/plugin-mpegvideoparse.xml6
-rw-r--r--docs/plugins/inspect/plugin-mplex.xml6
-rw-r--r--docs/plugins/inspect/plugin-musepack.xml6
-rw-r--r--docs/plugins/inspect/plugin-musicbrainz.xml6
-rw-r--r--docs/plugins/inspect/plugin-mve.xml6
-rw-r--r--docs/plugins/inspect/plugin-mxf.xml6
-rw-r--r--docs/plugins/inspect/plugin-mythtv.xml6
-rw-r--r--docs/plugins/inspect/plugin-nas.xml6
-rw-r--r--docs/plugins/inspect/plugin-neon.xml6
-rw-r--r--docs/plugins/inspect/plugin-nsfdec.xml6
-rw-r--r--docs/plugins/inspect/plugin-nuvdemux.xml6
-rw-r--r--docs/plugins/inspect/plugin-oss4.xml6
-rw-r--r--docs/plugins/inspect/plugin-pcapparse.xml2
-rw-r--r--docs/plugins/inspect/plugin-qtmux.xml2
-rw-r--r--docs/plugins/inspect/plugin-rawparse.xml6
-rw-r--r--docs/plugins/inspect/plugin-real.xml6
-rw-r--r--docs/plugins/inspect/plugin-resindvd.xml2
-rw-r--r--docs/plugins/inspect/plugin-rfbsrc.xml6
-rw-r--r--docs/plugins/inspect/plugin-rtpmux.xml6
-rw-r--r--docs/plugins/inspect/plugin-scaletempo.xml2
-rw-r--r--docs/plugins/inspect/plugin-sdl.xml6
-rw-r--r--docs/plugins/inspect/plugin-sdp.xml6
-rw-r--r--docs/plugins/inspect/plugin-selector.xml6
-rw-r--r--docs/plugins/inspect/plugin-shapewipe.xml10
-rw-r--r--docs/plugins/inspect/plugin-sndfile.xml6
-rw-r--r--docs/plugins/inspect/plugin-soundtouch.xml6
-rw-r--r--docs/plugins/inspect/plugin-spcdec.xml6
-rw-r--r--docs/plugins/inspect/plugin-speed.xml6
-rw-r--r--docs/plugins/inspect/plugin-stereo.xml6
-rw-r--r--docs/plugins/inspect/plugin-subenc.xml6
-rw-r--r--docs/plugins/inspect/plugin-timidity.xml4
-rw-r--r--docs/plugins/inspect/plugin-tta.xml6
-rw-r--r--docs/plugins/inspect/plugin-valve.xml6
-rw-r--r--docs/plugins/inspect/plugin-vcdsrc.xml6
-rw-r--r--docs/plugins/inspect/plugin-videosignal.xml6
-rw-r--r--docs/plugins/inspect/plugin-vmnc.xml6
-rw-r--r--docs/plugins/inspect/plugin-wildmidi.xml6
-rw-r--r--docs/plugins/inspect/plugin-xdgmime.xml6
-rw-r--r--docs/plugins/inspect/plugin-xvid.xml8
-rw-r--r--ext/Makefile.am8
-rw-r--r--ext/kate/Makefile.am20
-rw-r--r--ext/kate/README20
-rw-r--r--ext/kate/gstkate.c117
-rw-r--r--ext/kate/gstkate.h55
-rw-r--r--ext/kate/gstkatedec.c360
-rw-r--r--ext/kate/gstkatedec.h88
-rw-r--r--ext/kate/gstkateenc.c1338
-rw-r--r--ext/kate/gstkateenc.h123
-rw-r--r--ext/kate/gstkateparse.c633
-rw-r--r--ext/kate/gstkateparse.h78
-rw-r--r--ext/kate/gstkatespu.c865
-rw-r--r--ext/kate/gstkatespu.h65
-rw-r--r--ext/kate/gstkatetag.c352
-rw-r--r--ext/kate/gstkatetag.h65
-rw-r--r--ext/kate/gstkatetiger.c802
-rw-r--r--ext/kate/gstkatetiger.h108
-rw-r--r--ext/kate/gstkateutil.c405
-rw-r--r--ext/kate/gstkateutil.h77
-rw-r--r--ext/ladspa/gstladspa.c11
-rw-r--r--ext/lv2/Makefile.am2
-rw-r--r--ext/metadata/gstbasemetadata.c6
-rw-r--r--ext/metadata/gstmetadatamux.c9
-rw-r--r--ext/metadata/metadataexif.c22
-rw-r--r--ext/metadata/metadatatags.c2
-rw-r--r--ext/mimic/gstmimdec.c117
-rw-r--r--ext/mimic/gstmimdec.h2
-rw-r--r--ext/mimic/gstmimenc.c18
-rw-r--r--ext/resindvd/resindvdsrc.c8
-rw-r--r--ext/schroedinger/gstschroenc.c38
-rw-r--r--gst-libs/gst/Makefile.am2
-rw-r--r--gst-libs/gst/dshow/Makefile.am11
-rw-r--r--gst-libs/gst/dshow/gstdshowfakesrc.cpp205
-rw-r--r--gst-libs/gst/dshow/gstdshowfakesrc.h72
-rw-r--r--gst-libs/gst/dshow/gstdshowinterface.cpp35
-rw-r--r--gst-plugins-bad.spec.in1
-rw-r--r--gst/aacparse/gstbaseparse.c89
-rw-r--r--gst/aacparse/gstbaseparse.h3
-rw-r--r--gst/amrparse/gstbaseparse.c89
-rw-r--r--gst/amrparse/gstbaseparse.h3
-rw-r--r--gst/camerabin/TODO31
-rw-r--r--gst/camerabin/camerabinimage.c8
-rw-r--r--gst/camerabin/camerabinpreview.c5
-rw-r--r--gst/camerabin/camerabinvideo.c9
-rw-r--r--gst/camerabin/gstcamerabin.c20
-rw-r--r--gst/debugutils/fpsdisplaysink.c5
-rw-r--r--gst/mpegdemux/gstmpegdemux.c73
-rw-r--r--gst/mpegdemux/gstmpegtsdemux.c48
-rw-r--r--gst/mpegdemux/gstpesfilter.c49
-rw-r--r--gst/mpegdemux/mpegtspacketizer.c10
-rw-r--r--gst/mpegdemux/mpegtsparse.c55
-rw-r--r--gst/mxf/mxfdemux.c55
-rw-r--r--gst/pcapparse/gstpcapparse.h7
-rw-r--r--gst/real/gstrealaudiodec.c14
-rw-r--r--gst/real/gstrealvideodec.c20
-rw-r--r--gst/rtpmanager/rtpsession.c3
-rw-r--r--gst/rtpmux/gstrtpmux.c68
-rwxr-xr-x[-rw-r--r--]sys/dshowsrcwrapper/Makefile.am22
-rwxr-xr-x[-rw-r--r--]sys/dshowsrcwrapper/gstdshow.cpp (renamed from gst-libs/gst/dshow/gstdshow.cpp)21
-rwxr-xr-x[-rw-r--r--]sys/dshowsrcwrapper/gstdshow.h (renamed from gst-libs/gst/dshow/gstdshow.h)29
-rwxr-xr-x[-rw-r--r--]sys/dshowsrcwrapper/gstdshowaudiosrc.cpp (renamed from sys/dshowsrcwrapper/gstdshowaudiosrc.c)176
-rwxr-xr-x[-rw-r--r--]sys/dshowsrcwrapper/gstdshowaudiosrc.h3
-rwxr-xr-x[-rw-r--r--]sys/dshowsrcwrapper/gstdshowfakesink.cpp (renamed from gst-libs/gst/dshow/gstdshowfakesink.cpp)1
-rwxr-xr-x[-rw-r--r--]sys/dshowsrcwrapper/gstdshowfakesink.h (renamed from gst-libs/gst/dshow/gstdshowfakesink.h)0
-rwxr-xr-x[-rw-r--r--]sys/dshowsrcwrapper/gstdshowinterface.h (renamed from gst-libs/gst/dshow/gstdshowinterface.h)22
-rwxr-xr-x[-rw-r--r--]sys/dshowsrcwrapper/gstdshowsrcwrapper.cpp (renamed from sys/dshowsrcwrapper/gstdshowsrcwrapper.c)11
-rw-r--r--sys/dshowsrcwrapper/gstdshowsrcwrapper.h34
-rwxr-xr-x[-rw-r--r--]sys/dshowsrcwrapper/gstdshowvideosrc.cpp (renamed from sys/dshowsrcwrapper/gstdshowvideosrc.c)185
-rwxr-xr-x[-rw-r--r--]sys/dshowsrcwrapper/gstdshowvideosrc.h4
-rwxr-xr-xsys/dshowsrcwrapper/libgstdshow.def8
-rw-r--r--sys/dvb/gstdvbsrc.c4
-rw-r--r--sys/oss4/oss4-audio.c45
-rw-r--r--sys/oss4/oss4-mixer-slider.c17
-rw-r--r--sys/oss4/oss4-mixer-switch.c68
-rw-r--r--sys/oss4/oss4-mixer.c376
-rw-r--r--sys/vdpau/gstvdpmpegdec.c5
-rw-r--r--tests/check/Makefile.am11
-rw-r--r--tests/check/elements/.gitignore2
-rw-r--r--tests/check/elements/kate.c852
-rw-r--r--tests/examples/camerabin/gst-camera-perf.c407
-rw-r--r--win32/common/libgstdshow.def15
-rwxr-xr-x[-rw-r--r--]win32/vs6/gst_plugins_bad.dsw12
-rw-r--r--win32/vs6/libdshowsrcwrapper.dsp137
-rwxr-xr-x[-rw-r--r--]win32/vs8/gst-plugins-bad.sln50
-rwxr-xr-xwin32/vs8/libdshowsrcwrapper.vcproj280
182 files changed, 20857 insertions, 2075 deletions
diff --git a/LICENSE_readme b/LICENSE_readme
index 67fd312c..718d6d23 100644
--- a/LICENSE_readme
+++ b/LICENSE_readme
@@ -85,6 +85,8 @@ textoverlay pango (http://www.pango.org/)
dirac (http://www.bbc.co.uk/rd/projects/dirac/)
effectv (Our ports was relicensed)(http://effectv.sourceforge.net/)
musepack (http://www.musepack.net/)
+kate libtiger (http://libtiger.googlecode.com/)
+ Optional, only for the tiger element
Plugins which use a BSD covered library are as follows:
@@ -93,6 +95,7 @@ vorbis libogg/libvorbis (http://www.xiph.org/ogg/vorbis/)
gsttheora libtheora (http://www.theora.org/)
speex (http://www.speex.org/)
flac libFLAC (http://flac.sourceforge.net/)
+kate libkate (http://libkate.googlecode.com/)
Plugins based on libraries with other free licenses:
diff --git a/REQUIREMENTS b/REQUIREMENTS
index 121f73c2..773996f7 100644
--- a/REQUIREMENTS
+++ b/REQUIREMENTS
@@ -118,9 +118,11 @@ libtheora (for Ogg Theora video support)
libmms (for MMS protocol support)
(http://www.sf.net/projects/libmms)
libamrnb (for AMR-NB support)
- (http://http://www.penguin.cz/~utx/amr)
+ (http://www.penguin.cz/~utx/amr)
libamrwb (for AMR-WB support)
- (http://http://www.penguin.cz/~utx/amr)
+ (http://www.penguin.cz/~utx/amr)
+libkate (for Kate support)
+ (http://libkate.googlecode.com/)
Optional (debian) packages:
diff --git a/common b/common
-Subproject 5845b632c99d8f0ab863bd955a9568d7937108f
+Subproject fedaaee6fa5c0006f5b7264732cb4e29584ef10
diff --git a/configure.ac b/configure.ac
index fa032f96..0f40739c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -944,6 +944,30 @@ AG_GST_CHECK_FEATURE(JP2K, [jp2k], jp2kdec jp2kenc, [
AC_SUBST(JP2K_LIBS)
])
+dnl *** kate ***
+translit(dnm, m, l) AM_CONDITIONAL(USE_KATE, true)
+AG_GST_CHECK_FEATURE(KATE, [Kate], kate, [
+ PKG_CHECK_MODULES(KATE, kate >= 0.1.7, HAVE_KATE="yes", [
+ HAVE_KATE="no"
+ AC_MSG_RESULT(no)
+ ])
+ AC_SUBST(KATE_CFLAGS)
+ AC_SUBST(KATE_LIBS)
+ PKG_CHECK_MODULES(TIGER, tiger >= 0.3.2,
+ [
+ HAVE_TIGER="yes"
+ AC_DEFINE(HAVE_TIGER, 1, [Define if libtiger is available])
+ ],
+ [
+ HAVE_TIGER="no"
+ AC_MSG_RESULT(no)
+ ]
+ )
+ AM_CONDITIONAL(USE_TIGER, test "x$HAVE_TIGER" = "xyes")
+ AC_SUBST(TIGER_CFLAGS)
+ AC_SUBST(TIGER_LIBS)
+])
+
dnl *** ladspa ***
translit(dnm, m, l) AM_CONDITIONAL(USE_LADSPA, true)
AG_GST_CHECK_FEATURE(LADSPA, [ladspa], ladspa, [
@@ -1526,6 +1550,7 @@ AM_CONDITIONAL(USE_THEORADEC, false)
AM_CONDITIONAL(USE_TIMIDITY, false)
AM_CONDITIONAL(USE_XVID, false)
AM_CONDITIONAL(USE_WILDMIDI, false)
+AM_CONDITIONAL(USE_KATE, false)
AM_CONDITIONAL(USE_WININET, false)
AM_CONDITIONAL(USE_ACM, false)
AM_CONDITIONAL(USE_VDPAU, false)
@@ -1648,7 +1673,6 @@ gst/vmnc/Makefile
gst/xdgmime/Makefile
gst-libs/Makefile
gst-libs/gst/Makefile
-gst-libs/gst/dshow/Makefile
gst-libs/gst/interfaces/Makefile
gst-libs/gst/signalprocessor/Makefile
gst-libs/gst/video/Makefile
@@ -1698,6 +1722,7 @@ ext/gsm/Makefile
ext/ivorbis/Makefile
ext/jack/Makefile
ext/jp2k/Makefile
+ext/kate/Makefile
ext/ladspa/Makefile
ext/lv2/Makefile
ext/libmms/Makefile
diff --git a/docs/plugins/Makefile.am b/docs/plugins/Makefile.am
index 2bda68f2..0a43f4ca 100644
--- a/docs/plugins/Makefile.am
+++ b/docs/plugins/Makefile.am
@@ -100,6 +100,12 @@ EXTRA_HFILES = \
$(top_srcdir)/ext/ivorbis/vorbisdec.h \
$(top_srcdir)/ext/jack/gstjackaudiosrc.h \
$(top_srcdir)/ext/jack/gstjackaudiosink.h \
+ $(top_srcdir)/ext/kate/gstkateenc.h \
+ $(top_srcdir)/ext/kate/gstkatedec.h \
+ $(top_srcdir)/ext/kate/gstkateparse.h \
+ $(top_srcdir)/ext/kate/gstkatetag.h \
+ $(top_srcdir)/ext/kate/gstkatetiger.h \
+ $(top_srcdir)/ext/ladspa/gstladspa.h \
$(top_srcdir)/ext/musicbrainz/gsttrm.h \
$(top_srcdir)/ext/metadata/gstbasemetadata.h \
$(top_srcdir)/ext/metadata/gstmetadatademux.h \
@@ -135,6 +141,7 @@ EXTRA_HFILES = \
$(top_srcdir)/gst/mxf/mxfdemux.h \
$(top_srcdir)/gst/mxf/mxfmux.h \
$(top_srcdir)/gst/nuvdemux/gstnuvdemux.h \
+ $(top_srcdir)/gst/pcapparse/gstpcapparse.h \
$(top_srcdir)/gst/rawparse/gstaudioparse.h \
$(top_srcdir)/gst/rawparse/gstvideoparse.h \
$(top_srcdir)/gst/rtpmanager/gstrtpbin.h \
diff --git a/docs/plugins/gst-plugins-bad-plugins-docs.sgml b/docs/plugins/gst-plugins-bad-plugins-docs.sgml
index 21ac6101..f1a36d70 100644
--- a/docs/plugins/gst-plugins-bad-plugins-docs.sgml
+++ b/docs/plugins/gst-plugins-bad-plugins-docs.sgml
@@ -50,6 +50,11 @@
<xi:include href="xml/element-ivorbisdec.xml" />
<xi:include href="xml/element-jackaudiosrc.xml" />
<xi:include href="xml/element-jackaudiosink.xml" />
+ <xi:include href="xml/element-kateenc.xml" />
+ <xi:include href="xml/element-katedec.xml" />
+ <xi:include href="xml/element-kateparse.xml" />
+ <xi:include href="xml/element-katetag.xml" />
+ <xi:include href="xml/element-ladspa.xml" />
<xi:include href="xml/element-legacyresample.xml" />
<xi:include href="xml/element-liveadder.xml" />
<xi:include href="xml/element-metadatademux.xml" />
@@ -64,6 +69,7 @@
<xi:include href="xml/element-mxfmux.xml" />
<xi:include href="xml/element-nuvdemux.xml" />
<xi:include href="xml/element-output-selector.xml" />
+ <xi:include href="xml/element-pcapparse.xml" />
<xi:include href="xml/element-rtpdtmfdepay.xml" />
<xi:include href="xml/element-rtpdtmfsrc.xml" />
<xi:include href="xml/element-rtpdtmfmux.xml" />
@@ -76,6 +82,7 @@
<xi:include href="xml/element-speed.xml" />
<xi:include href="xml/element-stereo.xml" />
<!--xi:include href="xml/element-theoradecexp.xml" /-->
+ <xi:include href="xml/element-tiger.xml" />
<xi:include href="xml/element-timidity.xml" />
<xi:include href="xml/element-trm.xml" />
<xi:include href="xml/element-valve.xml" />
@@ -116,12 +123,15 @@
<xi:include href="xml/plugin-festival.xml" />
<xi:include href="xml/plugin-filter.xml" />
<xi:include href="xml/plugin-freeze.xml" />
+ <xi:include href="xml/plugin-frei0r.xml" />
<xi:include href="xml/plugin-gsm.xml" />
<xi:include href="xml/plugin-gstrtpmanager.xml" />
<xi:include href="xml/plugin-h264parse.xml" />
<xi:include href="xml/plugin-jack.xml" />
+ <xi:include href="xml/plugin-kate.xml" />
<xi:include href="xml/plugin-ladspa.xml" />
<xi:include href="xml/plugin-liveadder.xml" />
+ <xi:include href="xml/plugin-lv2.xml" />
<xi:include href="xml/plugin-metadata.xml" />
<xi:include href="xml/plugin-mimic.xml" />
<xi:include href="xml/plugin-mms.xml" />
@@ -139,6 +149,7 @@
<xi:include href="xml/plugin-neon.xml" />
<xi:include href="xml/plugin-nsfdec.xml" />
<xi:include href="xml/plugin-nuvdemux.xml" />
+ <xi:include href="xml/plugin-pcapparse.xml" />
<xi:include href="xml/plugin-rawparse.xml" />
<xi:include href="xml/plugin-real.xml" />
<xi:include href="xml/plugin-rfbsrc.xml" />
diff --git a/docs/plugins/gst-plugins-bad-plugins-sections.txt b/docs/plugins/gst-plugins-bad-plugins-sections.txt
index e5742a85..09e0e3fc 100644
--- a/docs/plugins/gst-plugins-bad-plugins-sections.txt
+++ b/docs/plugins/gst-plugins-bad-plugins-sections.txt
@@ -472,6 +472,84 @@ gst_live_adder_get_type
</SECTION>
<SECTION>
+<FILE>element-katedec</FILE>
+<TITLE>katedec</TITLE>
+GstKateDec
+<SUBSECTION Standard>
+GstKateDecClass
+GST_KATE_DEC
+GST_KATE_DEC_CLASS
+GST_IS_KATE_DEC
+GST_IS_KATE_DEC_CLASS
+GST_TYPE_KATE_DEC
+gst_kate_dec_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-kateenc</FILE>
+<TITLE>kateenc</TITLE>
+GstKateEnc
+<SUBSECTION Standard>
+GstKateEncClass
+GST_KATE_ENC
+GST_KATE_ENC_CLASS
+GST_IS_KATE_ENC
+GST_IS_KATE_ENC_CLASS
+GST_TYPE_KATE_ENC
+gst_kate_enc_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-kateparse</FILE>
+<TITLE>kateparse</TITLE>
+GstKateParse
+<SUBSECTION Standard>
+GstKateParseClass
+GST_KATE_PARSE
+GST_KATE_PARSE_CLASS
+GST_IS_KATE_PARSE
+GST_IS_KATE_PARSE_CLASS
+GST_TYPE_KATE_PARSE
+gst_kate_parse_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-katetag</FILE>
+<TITLE>katetag</TITLE>
+GstKateTag
+<SUBSECTION Standard>
+GstKateTagClass
+GST_KATE_TAG
+GST_KATE_TAG_CLASS
+GST_IS_KATE_TAG
+GST_IS_KATE_TAG_CLASS
+GST_TYPE_KATE_TAG
+gst_kate_tag_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-tiger</FILE>
+<TITLE>tiger</TITLE>
+GstKateTiger
+<SUBSECTION Standard>
+GstKateTigerClass
+GST_KATE_TIGER
+GST_KATE_TIGER_CLASS
+GST_IS_KATE_TIGER
+GST_IS_KATE_TIGER_CLASS
+GST_TYPE_KATE_TIGER
+gst_kate_tiger_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-ladspa</FILE>
+<TITLE>ladspa</TITLE>
+GstLADSPA
+<SUBSECTION Standard>
+GstLADSPAClass
+</SECTION>
+
+<SECTION>
<FILE>gstbasemetadata</FILE>
<TITLE>GstBaseMetadata</TITLE>
GstBaseMetadata
@@ -650,6 +728,21 @@ gst_output_selector_get_type
</SECTION>
<SECTION>
+<FILE>element-pcapparse</FILE>
+<TITLE>pcapparse</TITLE>
+GstPcapParse
+<SUBSECTION Standard>
+GstPcapParseClass
+GST_PCAP_PARSE
+GST_PCAP_PARSE_CLASS
+GST_IS_PCAP_PARSE
+GST_IS_PCAP_PARSE_CLASS
+GST_TYPE_PCAP_PARSE
+GstPcapParseState
+gst_pcap_parse_get_type
+</SECTION>
+
+<SECTION>
<FILE>element-rtpdtmfdepay</FILE>
<TITLE>rtpdtmfdepay</TITLE>
GstRtpDTMFDepay
diff --git a/docs/plugins/gst-plugins-bad-plugins.args b/docs/plugins/gst-plugins-bad-plugins.args
index 82bcfd30..f25241fe 100644
--- a/docs/plugins/gst-plugins-bad-plugins.args
+++ b/docs/plugins/gst-plugins-bad-plugins.args
@@ -11,7 +11,7 @@
<ARG>
<NAME>GstPitch::pitch</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.1,10]</RANGE>
+<RANGE>[0,1,10]</RANGE>
<FLAGS>rw</FLAGS>
<NICK>Pitch</NICK>
<BLURB>Audio stream pitch.</BLURB>
@@ -21,7 +21,7 @@
<ARG>
<NAME>GstPitch::rate</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.1,10]</RANGE>
+<RANGE>[0,1,10]</RANGE>
<FLAGS>rw</FLAGS>
<NICK>Rate</NICK>
<BLURB>Audio stream rate.</BLURB>
@@ -31,7 +31,7 @@
<ARG>
<NAME>GstPitch::tempo</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.1,10]</RANGE>
+<RANGE>[0,1,10]</RANGE>
<FLAGS>rw</FLAGS>
<NICK>Tempo</NICK>
<BLURB>Audio stream tempo.</BLURB>
@@ -1341,7 +1341,7 @@
<ARG>
<NAME>GstSpeed::speed</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.1,40]</RANGE>
+<RANGE>[0,1,40]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>speed</NICK>
<BLURB>speed.</BLURB>
@@ -7585,7 +7585,7 @@
<FLAGS>rwx</FLAGS>
<NICK>B</NICK>
<BLURB>B.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -7615,7 +7615,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Threshold</NICK>
<BLURB>Threshold.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -7645,7 +7645,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Base</NICK>
<BLURB>Base.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -7655,7 +7655,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Exponent</NICK>
<BLURB>Exponent.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -7665,7 +7665,7 @@
<FLAGS>r</FLAGS>
<NICK>Result</NICK>
<BLURB>Result.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -7675,7 +7675,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Off</NICK>
<BLURB>Off.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -7685,7 +7685,7 @@
<FLAGS>rwx</FLAGS>
<NICK>On</NICK>
<BLURB>On.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -7695,7 +7695,7 @@
<FLAGS>r</FLAGS>
<NICK>Output</NICK>
<BLURB>Output.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -7721,11 +7721,11 @@
<ARG>
<NAME>ladspa-wg-mesh-cr::Tension</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[1e-04,0.22]</RANGE>
+<RANGE>[0,0001,0,22]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Tension</NICK>
<BLURB>Tension.</BLURB>
-<DEFAULT>0.11005</DEFAULT>
+<DEFAULT>0,11005</DEFAULT>
</ARG>
<ARG>
@@ -8215,7 +8215,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Fall-time</NICK>
<BLURB>Fall-time.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -8225,7 +8225,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Rise-time</NICK>
<BLURB>Rise-time.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -8245,7 +8245,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Fall-rate</NICK>
<BLURB>Fall-rate.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -8255,7 +8255,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Rise-rate</NICK>
<BLURB>Rise-rate.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -8505,7 +8505,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Input</NICK>
<BLURB>Input.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -8515,7 +8515,7 @@
<FLAGS>r</FLAGS>
<NICK>Output</NICK>
<BLURB>Output.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -8571,11 +8571,11 @@
<ARG>
<NAME>ladspa-tap-tubewarmth::Drive</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.1,10]</RANGE>
+<RANGE>[0,1,10]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Drive</NICK>
<BLURB>Drive.</BLURB>
-<DEFAULT>2.575</DEFAULT>
+<DEFAULT>2,575</DEFAULT>
</ARG>
<ARG>
@@ -8675,7 +8675,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Rotor-Horn-Mix</NICK>
<BLURB>Rotor-Horn-Mix.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -8855,7 +8855,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Fractal-Dimension</NICK>
<BLURB>Fractal-Dimension.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -8901,17 +8901,17 @@
<ARG>
<NAME>ladspa-tap-limiter::latency</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0,2500.1]</RANGE>
+<RANGE>[0,2500,1]</RANGE>
<FLAGS>r</FLAGS>
<NICK>latency</NICK>
<BLURB>latency.</BLURB>
-<DEFAULT>2500.1</DEFAULT>
+<DEFAULT>2500,1</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-tap-equalizer-bw::Band-1-Bandwidth--octaves-</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.1,5]</RANGE>
+<RANGE>[0,1,5]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Band-1-Bandwidth--octaves-</NICK>
<BLURB>Band-1-Bandwidth--octaves-.</BLURB>
@@ -8941,7 +8941,7 @@
<ARG>
<NAME>ladspa-tap-equalizer-bw::Band-2-Bandwidth--octaves-</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.1,5]</RANGE>
+<RANGE>[0,1,5]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Band-2-Bandwidth--octaves-</NICK>
<BLURB>Band-2-Bandwidth--octaves-.</BLURB>
@@ -8971,7 +8971,7 @@
<ARG>
<NAME>ladspa-tap-equalizer-bw::Band-3-Bandwidth--octaves-</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.1,5]</RANGE>
+<RANGE>[0,1,5]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Band-3-Bandwidth--octaves-</NICK>
<BLURB>Band-3-Bandwidth--octaves-.</BLURB>
@@ -9001,7 +9001,7 @@
<ARG>
<NAME>ladspa-tap-equalizer-bw::Band-4-Bandwidth--octaves-</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.1,5]</RANGE>
+<RANGE>[0,1,5]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Band-4-Bandwidth--octaves-</NICK>
<BLURB>Band-4-Bandwidth--octaves-.</BLURB>
@@ -9031,7 +9031,7 @@
<ARG>
<NAME>ladspa-tap-equalizer-bw::Band-5-Bandwidth--octaves-</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.1,5]</RANGE>
+<RANGE>[0,1,5]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Band-5-Bandwidth--octaves-</NICK>
<BLURB>Band-5-Bandwidth--octaves-.</BLURB>
@@ -9061,7 +9061,7 @@
<ARG>
<NAME>ladspa-tap-equalizer-bw::Band-6-Bandwidth--octaves-</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.1,5]</RANGE>
+<RANGE>[0,1,5]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Band-6-Bandwidth--octaves-</NICK>
<BLURB>Band-6-Bandwidth--octaves-.</BLURB>
@@ -9091,7 +9091,7 @@
<ARG>
<NAME>ladspa-tap-equalizer-bw::Band-7-Bandwidth--octaves-</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.1,5]</RANGE>
+<RANGE>[0,1,5]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Band-7-Bandwidth--octaves-</NICK>
<BLURB>Band-7-Bandwidth--octaves-.</BLURB>
@@ -9121,7 +9121,7 @@
<ARG>
<NAME>ladspa-tap-equalizer-bw::Band-8-Bandwidth--octaves-</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.1,5]</RANGE>
+<RANGE>[0,1,5]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Band-8-Bandwidth--octaves-</NICK>
<BLURB>Band-8-Bandwidth--octaves-.</BLURB>
@@ -9555,7 +9555,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Pitch-Tracking</NICK>
<BLURB>Pitch-Tracking.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -9565,7 +9565,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Time-Tracking</NICK>
<BLURB>Time-Tracking.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -9785,13 +9785,13 @@
<FLAGS>r</FLAGS>
<NICK>latency</NICK>
<BLURB>latency.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-pitchScaleHQ::Pitch-co-efficient</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.5,2]</RANGE>
+<RANGE>[0,5,2]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Pitch-co-efficient</NICK>
<BLURB>Pitch-co-efficient.</BLURB>
@@ -9805,7 +9805,7 @@
<FLAGS>r</FLAGS>
<NICK>latency</NICK>
<BLURB>latency.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -9855,7 +9855,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Frequency--Hz-</NICK>
<BLURB>Frequency--Hz-.</BLURB>
-<DEFAULT>1.25</DEFAULT>
+<DEFAULT>1,25</DEFAULT>
</ARG>
<ARG>
@@ -9885,7 +9885,7 @@
<FLAGS>r</FLAGS>
<NICK>latency</NICK>
<BLURB>latency.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -10051,11 +10051,11 @@
<ARG>
<NAME>ladspa-sc4m::Attack-time</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[1.5,400]</RANGE>
+<RANGE>[1,5,400]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Attack-time</NICK>
<BLURB>Attack-time.</BLURB>
-<DEFAULT>101.125</DEFAULT>
+<DEFAULT>101,125</DEFAULT>
</ARG>
<ARG>
@@ -10075,7 +10075,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Knee-radius</NICK>
<BLURB>Knee-radius.</BLURB>
-<DEFAULT>3.25</DEFAULT>
+<DEFAULT>3,25</DEFAULT>
</ARG>
<ARG>
@@ -10165,13 +10165,13 @@
<FLAGS>r</FLAGS>
<NICK>latency</NICK>
<BLURB>latency.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-pitchScale::Pitch-co-efficient</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.5,2]</RANGE>
+<RANGE>[0,5,2]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Pitch-co-efficient</NICK>
<BLURB>Pitch-co-efficient.</BLURB>
@@ -10185,7 +10185,7 @@
<FLAGS>r</FLAGS>
<NICK>latency</NICK>
<BLURB>latency.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -10201,17 +10201,17 @@
<ARG>
<NAME>ladspa-pointerCastDistortion::Effect-cutoff-freq</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[4.41,13230]</RANGE>
+<RANGE>[4,41,13230]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Effect-cutoff-freq</NICK>
<BLURB>Effect-cutoff-freq.</BLURB>
-<DEFAULT>32.6376</DEFAULT>
+<DEFAULT>32,6377</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-const::Signal-amplitude</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[-1,1.1]</RANGE>
+<RANGE>[-1,1,1]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Signal-amplitude</NICK>
<BLURB>Signal-amplitude.</BLURB>
@@ -10221,11 +10221,11 @@
<ARG>
<NAME>ladspa-lsFilter::Cutoff-frequency</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[88.2,22050]</RANGE>
+<RANGE>[88,2,22050]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Cutoff-frequency</NICK>
<BLURB>Cutoff-frequency.</BLURB>
-<DEFAULT>1394.56</DEFAULT>
+<DEFAULT>1394,56</DEFAULT>
</ARG>
<ARG>
@@ -10611,61 +10611,61 @@
<ARG>
<NAME>ladspa-butthigh-iir::Cutoff-Frequency</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[4.41,19845]</RANGE>
+<RANGE>[4,41,19845]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Cutoff-Frequency</NICK>
<BLURB>Cutoff-Frequency.</BLURB>
-<DEFAULT>36.1195</DEFAULT>
+<DEFAULT>36,1195</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-butthigh-iir::Resonance</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.1,1.41]</RANGE>
+<RANGE>[0,1,1,41]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Resonance</NICK>
<BLURB>Resonance.</BLURB>
-<DEFAULT>0.755</DEFAULT>
+<DEFAULT>0,755</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-buttlow-iir::Cutoff-Frequency</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[4.41,19845]</RANGE>
+<RANGE>[4,41,19845]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Cutoff-Frequency</NICK>
<BLURB>Cutoff-Frequency.</BLURB>
-<DEFAULT>36.1195</DEFAULT>
+<DEFAULT>36,1195</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-buttlow-iir::Resonance</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.1,1.41]</RANGE>
+<RANGE>[0,1,1,41]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Resonance</NICK>
<BLURB>Resonance.</BLURB>
-<DEFAULT>0.755</DEFAULT>
+<DEFAULT>0,755</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-bwxover-iir::Cutoff-Frequency</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[4.41,19845]</RANGE>
+<RANGE>[4,41,19845]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Cutoff-Frequency</NICK>
<BLURB>Cutoff-Frequency.</BLURB>
-<DEFAULT>36.1195</DEFAULT>
+<DEFAULT>36,1195</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-bwxover-iir::Resonance</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.1,1.41]</RANGE>
+<RANGE>[0,1,1,41]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Resonance</NICK>
<BLURB>Resonance.</BLURB>
-<DEFAULT>0.755</DEFAULT>
+<DEFAULT>0,755</DEFAULT>
</ARG>
<ARG>
@@ -10705,7 +10705,7 @@
<FLAGS>r</FLAGS>
<NICK>latency</NICK>
<BLURB>latency.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -10745,27 +10745,27 @@
<FLAGS>r</FLAGS>
<NICK>latency</NICK>
<BLURB>latency.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-notch-iir::Bandwidth</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[4.41,19845]</RANGE>
+<RANGE>[4,41,19845]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Bandwidth</NICK>
<BLURB>Bandwidth.</BLURB>
-<DEFAULT>295.832</DEFAULT>
+<DEFAULT>295,832</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-notch-iir::Center-Frequency</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[4.41,19845]</RANGE>
+<RANGE>[4,41,19845]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Center-Frequency</NICK>
<BLURB>Center-Frequency.</BLURB>
-<DEFAULT>295.832</DEFAULT>
+<DEFAULT>295,832</DEFAULT>
</ARG>
<ARG>
@@ -10781,11 +10781,11 @@
<ARG>
<NAME>ladspa-lowpass-iir::Cutoff-Frequency</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[4.41,19845]</RANGE>
+<RANGE>[4,41,19845]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Cutoff-Frequency</NICK>
<BLURB>Cutoff-Frequency.</BLURB>
-<DEFAULT>2422.97</DEFAULT>
+<DEFAULT>2422,97</DEFAULT>
</ARG>
<ARG>
@@ -10801,11 +10801,11 @@
<ARG>
<NAME>ladspa-highpass-iir::Cutoff-Frequency</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[4.41,19845]</RANGE>
+<RANGE>[4,41,19845]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Cutoff-Frequency</NICK>
<BLURB>Cutoff-Frequency.</BLURB>
-<DEFAULT>36.1195</DEFAULT>
+<DEFAULT>36,1195</DEFAULT>
</ARG>
<ARG>
@@ -10821,21 +10821,21 @@
<ARG>
<NAME>ladspa-bandpass-iir::Bandwidth</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[4.41,19845]</RANGE>
+<RANGE>[4,41,19845]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Bandwidth</NICK>
<BLURB>Bandwidth.</BLURB>
-<DEFAULT>295.832</DEFAULT>
+<DEFAULT>295,832</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-bandpass-iir::Center-Frequency</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[4.41,19845]</RANGE>
+<RANGE>[4,41,19845]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Center-Frequency</NICK>
<BLURB>Center-Frequency.</BLURB>
-<DEFAULT>295.832</DEFAULT>
+<DEFAULT>295,832</DEFAULT>
</ARG>
<ARG>
@@ -10851,21 +10851,21 @@
<ARG>
<NAME>ladspa-bandpass-a-iir::Bandwidth</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[4.41,19845]</RANGE>
+<RANGE>[4,41,19845]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Bandwidth</NICK>
<BLURB>Bandwidth.</BLURB>
-<DEFAULT>295.832</DEFAULT>
+<DEFAULT>295,832</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-bandpass-a-iir::Center-Frequency</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[4.41,19845]</RANGE>
+<RANGE>[4,41,19845]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Center-Frequency</NICK>
<BLURB>Center-Frequency.</BLURB>
-<DEFAULT>36.1195</DEFAULT>
+<DEFAULT>36,1195</DEFAULT>
</ARG>
<ARG>
@@ -10881,11 +10881,11 @@
<ARG>
<NAME>ladspa-se4::Attack-time</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[1.5,400]</RANGE>
+<RANGE>[1,5,400]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Attack-time</NICK>
<BLURB>Attack-time.</BLURB>
-<DEFAULT>101.125</DEFAULT>
+<DEFAULT>101,125</DEFAULT>
</ARG>
<ARG>
@@ -10915,7 +10915,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Knee-radius</NICK>
<BLURB>Knee-radius.</BLURB>
-<DEFAULT>3.25</DEFAULT>
+<DEFAULT>3,25</DEFAULT>
</ARG>
<ARG>
@@ -10961,7 +10961,7 @@
<ARG>
<NAME>ladspa-sinCos::Base-frequency</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.0441,22050]</RANGE>
+<RANGE>[0,0441,22050]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Base-frequency</NICK>
<BLURB>Base-frequency.</BLURB>
@@ -10985,7 +10985,7 @@
<FLAGS>r</FLAGS>
<NICK>latency</NICK>
<BLURB>latency.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -11001,11 +11001,11 @@
<ARG>
<NAME>ladspa-gongBeater::Strike-duration</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.001,0.2]</RANGE>
+<RANGE>[0,001,0,2]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Strike-duration</NICK>
<BLURB>Strike-duration.</BLURB>
-<DEFAULT>0.1005</DEFAULT>
+<DEFAULT>0,1005</DEFAULT>
</ARG>
<ARG>
@@ -11041,7 +11041,7 @@
<ARG>
<NAME>ladspa-djFlanger::LFO-period</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.1,32]</RANGE>
+<RANGE>[0,1,32]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>LFO-period</NICK>
<BLURB>LFO-period.</BLURB>
@@ -11055,23 +11055,23 @@
<FLAGS>rwx</FLAGS>
<NICK>LFO-sync</NICK>
<BLURB>LFO-sync.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-giantFlange::Delay-1-range</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0,10.5]</RANGE>
+<RANGE>[0,10,5]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Delay-1-range</NICK>
<BLURB>Delay-1-range.</BLURB>
-<DEFAULT>2.625</DEFAULT>
+<DEFAULT>2,625</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-giantFlange::Delay-2-range</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0,10.5]</RANGE>
+<RANGE>[0,10,5]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Delay-2-range</NICK>
<BLURB>Delay-2-range.</BLURB>
@@ -11085,7 +11085,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Double-delay</NICK>
<BLURB>Double-delay.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -11251,11 +11251,11 @@
<ARG>
<NAME>ladspa-sc4::Attack-time</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[1.5,400]</RANGE>
+<RANGE>[1,5,400]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Attack-time</NICK>
<BLURB>Attack-time.</BLURB>
-<DEFAULT>101.125</DEFAULT>
+<DEFAULT>101,125</DEFAULT>
</ARG>
<ARG>
@@ -11275,7 +11275,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Knee-radius</NICK>
<BLURB>Knee-radius.</BLURB>
-<DEFAULT>3.25</DEFAULT>
+<DEFAULT>3,25</DEFAULT>
</ARG>
<ARG>
@@ -11341,7 +11341,7 @@
<ARG>
<NAME>ladspa-amPitchshift::Pitch-shift</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.25,4]</RANGE>
+<RANGE>[0,25,4]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Pitch-shift</NICK>
<BLURB>Pitch-shift.</BLURB>
@@ -11355,7 +11355,7 @@
<FLAGS>r</FLAGS>
<NICK>latency</NICK>
<BLURB>latency.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -11395,7 +11395,7 @@
<FLAGS>r</FLAGS>
<NICK>latency</NICK>
<BLURB>latency.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -11415,7 +11415,7 @@
<FLAGS>r</FLAGS>
<NICK>latency</NICK>
<BLURB>latency.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -11435,7 +11435,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Attack-time</NICK>
<BLURB>Attack-time.</BLURB>
-<DEFAULT>101.5</DEFAULT>
+<DEFAULT>101,5</DEFAULT>
</ARG>
<ARG>
@@ -11455,7 +11455,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Knee-radius</NICK>
<BLURB>Knee-radius.</BLURB>
-<DEFAULT>3.25</DEFAULT>
+<DEFAULT>3,25</DEFAULT>
</ARG>
<ARG>
@@ -11505,7 +11505,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Attack-time</NICK>
<BLURB>Attack-time.</BLURB>
-<DEFAULT>101.5</DEFAULT>
+<DEFAULT>101,5</DEFAULT>
</ARG>
<ARG>
@@ -11515,7 +11515,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Knee-radius</NICK>
<BLURB>Knee-radius.</BLURB>
-<DEFAULT>3.25</DEFAULT>
+<DEFAULT>3,25</DEFAULT>
</ARG>
<ARG>
@@ -11565,7 +11565,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Attack-time</NICK>
<BLURB>Attack-time.</BLURB>
-<DEFAULT>101.5</DEFAULT>
+<DEFAULT>101,5</DEFAULT>
</ARG>
<ARG>
@@ -11575,7 +11575,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Knee-radius</NICK>
<BLURB>Knee-radius.</BLURB>
-<DEFAULT>3.25</DEFAULT>
+<DEFAULT>3,25</DEFAULT>
</ARG>
<ARG>
@@ -11625,7 +11625,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Inner-damping</NICK>
<BLURB>Inner-damping.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11635,7 +11635,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Inner-size-1</NICK>
<BLURB>Inner-size-1.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11645,7 +11645,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Inner-size-2</NICK>
<BLURB>Inner-size-2.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11655,7 +11655,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Inner-size-3</NICK>
<BLURB>Inner-size-3.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11665,7 +11665,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Inner-size-4</NICK>
<BLURB>Inner-size-4.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11675,7 +11675,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Inner-stiffness-1--</NICK>
<BLURB>Inner-stiffness-1--.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11685,7 +11685,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Inner-stiffness-1---1</NICK>
<BLURB>Inner-stiffness-1---1.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11695,7 +11695,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Inner-stiffness-2--</NICK>
<BLURB>Inner-stiffness-2--.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11705,7 +11705,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Inner-stiffness-2---1</NICK>
<BLURB>Inner-stiffness-2---1.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11715,7 +11715,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Inner-stiffness-3--</NICK>
<BLURB>Inner-stiffness-3--.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11725,7 +11725,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Inner-stiffness-3---1</NICK>
<BLURB>Inner-stiffness-3---1.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11735,7 +11735,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Inner-stiffness-4--</NICK>
<BLURB>Inner-stiffness-4--.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11745,7 +11745,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Inner-stiffness-4---1</NICK>
<BLURB>Inner-stiffness-4---1.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11755,7 +11755,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Mic-position</NICK>
<BLURB>Mic-position.</BLURB>
-<DEFAULT>0.25</DEFAULT>
+<DEFAULT>0,25</DEFAULT>
</ARG>
<ARG>
@@ -11765,7 +11765,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Outer-damping</NICK>
<BLURB>Outer-damping.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11775,7 +11775,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Outer-size-1</NICK>
<BLURB>Outer-size-1.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11785,7 +11785,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Outer-size-2</NICK>
<BLURB>Outer-size-2.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11795,7 +11795,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Outer-size-3</NICK>
<BLURB>Outer-size-3.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11805,7 +11805,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Outer-size-4</NICK>
<BLURB>Outer-size-4.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11815,7 +11815,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Outer-stiffness-1--</NICK>
<BLURB>Outer-stiffness-1--.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11825,7 +11825,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Outer-stiffness-1---1</NICK>
<BLURB>Outer-stiffness-1---1.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11835,7 +11835,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Outer-stiffness-2--</NICK>
<BLURB>Outer-stiffness-2--.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11845,7 +11845,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Outer-stiffness-2---1</NICK>
<BLURB>Outer-stiffness-2---1.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11855,7 +11855,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Outer-stiffness-3--</NICK>
<BLURB>Outer-stiffness-3--.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11865,7 +11865,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Outer-stiffness-3---1</NICK>
<BLURB>Outer-stiffness-3---1.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11875,7 +11875,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Outer-stiffness-4--</NICK>
<BLURB>Outer-stiffness-4--.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11885,7 +11885,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Outer-stiffness-4---1</NICK>
<BLURB>Outer-stiffness-4---1.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11895,7 +11895,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Damping</NICK>
<BLURB>Damping.</BLURB>
-<DEFAULT>0.25</DEFAULT>
+<DEFAULT>0,25</DEFAULT>
</ARG>
<ARG>
@@ -11905,17 +11905,17 @@
<FLAGS>rwx</FLAGS>
<NICK>Dry-wet-mix</NICK>
<BLURB>Dry-wet-mix.</BLURB>
-<DEFAULT>0.25</DEFAULT>
+<DEFAULT>0,25</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-plate::Reverb-time</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.01,8.5]</RANGE>
+<RANGE>[0,01,8,5]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Reverb-time</NICK>
<BLURB>Reverb-time.</BLURB>
-<DEFAULT>4.255</DEFAULT>
+<DEFAULT>4,255</DEFAULT>
</ARG>
<ARG>
@@ -11955,7 +11955,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Tracking-speed</NICK>
<BLURB>Tracking-speed.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -11971,7 +11971,7 @@
<ARG>
<NAME>ladspa-analogueOsc::Frequency</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.0441,22005.9]</RANGE>
+<RANGE>[0,0441,22005,9]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Frequency</NICK>
<BLURB>Frequency.</BLURB>
@@ -12081,11 +12081,11 @@
<ARG>
<NAME>ladspa-gate::Attack</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.01,1000]</RANGE>
+<RANGE>[0,01,1000]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Attack</NICK>
<BLURB>Attack.</BLURB>
-<DEFAULT>250.008</DEFAULT>
+<DEFAULT>250,008</DEFAULT>
</ARG>
<ARG>
@@ -12101,7 +12101,7 @@
<ARG>
<NAME>ladspa-gate::HF-key-filter</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[220.5,21609]</RANGE>
+<RANGE>[220,5,21609]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>HF-key-filter</NICK>
<BLURB>HF-key-filter.</BLURB>
@@ -12115,23 +12115,23 @@
<FLAGS>rwx</FLAGS>
<NICK>Hold</NICK>
<BLURB>Hold.</BLURB>
-<DEFAULT>1500.5</DEFAULT>
+<DEFAULT>1500,5</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-gate::LF-key-filter</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[30.87,4410]</RANGE>
+<RANGE>[30,87,4410]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>LF-key-filter</NICK>
<BLURB>LF-key-filter.</BLURB>
-<DEFAULT>30.87</DEFAULT>
+<DEFAULT>30,87</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-gate::Output-select</NAME>
<TYPE>gint</TYPE>
-<RANGE>[G_MAXULONG,1]</RANGE>
+<RANGE>[-1,1]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Output-select</NICK>
<BLURB>Output-select.</BLURB>
@@ -12221,7 +12221,7 @@
<ARG>
<NAME>ladspa-crossoverDist::Crossover-amplitude</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0,0.1]</RANGE>
+<RANGE>[0,0,1]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Crossover-amplitude</NICK>
<BLURB>Crossover-amplitude.</BLURB>
@@ -12245,7 +12245,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Compression-ratio</NICK>
<BLURB>Compression-ratio.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -12255,7 +12255,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Fast-compression-ratio</NICK>
<BLURB>Fast-compression-ratio.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -12275,13 +12275,13 @@
<FLAGS>rwx</FLAGS>
<NICK>Release-time</NICK>
<BLURB>Release-time.</BLURB>
-<DEFAULT>0.25</DEFAULT>
+<DEFAULT>0,25</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-delayorama::Amplitude-change</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.2,5]</RANGE>
+<RANGE>[0,2,5]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Amplitude-change</NICK>
<BLURB>Amplitude-change.</BLURB>
@@ -12301,7 +12301,7 @@
<ARG>
<NAME>ladspa-delayorama::Delay-change</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.2,5]</RANGE>
+<RANGE>[0,2,5]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Delay-change</NICK>
<BLURB>Delay-change.</BLURB>
@@ -12321,7 +12321,7 @@
<ARG>
<NAME>ladspa-delayorama::Delay-range</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.0001,6]</RANGE>
+<RANGE>[0,0001,6]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Delay-range</NICK>
<BLURB>Delay-range.</BLURB>
@@ -12495,7 +12495,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Attack-time</NICK>
<BLURB>Attack-time.</BLURB>
-<DEFAULT>0.25</DEFAULT>
+<DEFAULT>0,25</DEFAULT>
</ARG>
<ARG>
@@ -12505,7 +12505,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Decay-time</NICK>
<BLURB>Decay-time.</BLURB>
-<DEFAULT>0.25</DEFAULT>
+<DEFAULT>0,25</DEFAULT>
</ARG>
<ARG>
@@ -12525,7 +12525,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Modulation-depth</NICK>
<BLURB>Modulation-depth.</BLURB>
-<DEFAULT>0.25</DEFAULT>
+<DEFAULT>0,25</DEFAULT>
</ARG>
<ARG>
@@ -12585,7 +12585,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Frequency-1</NICK>
<BLURB>Frequency-1.</BLURB>
-<DEFAULT>5000.75</DEFAULT>
+<DEFAULT>5000,75</DEFAULT>
</ARG>
<ARG>
@@ -12595,7 +12595,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Frequency-2</NICK>
<BLURB>Frequency-2.</BLURB>
-<DEFAULT>10000.5</DEFAULT>
+<DEFAULT>10000,5</DEFAULT>
</ARG>
<ARG>
@@ -12605,7 +12605,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Frequency-3</NICK>
<BLURB>Frequency-3.</BLURB>
-<DEFAULT>15000.2</DEFAULT>
+<DEFAULT>15000,2</DEFAULT>
</ARG>
<ARG>
@@ -12635,7 +12635,7 @@
<FLAGS>rwx</FLAGS>
<NICK>LFO-depth</NICK>
<BLURB>LFO-depth.</BLURB>
-<DEFAULT>0.25</DEFAULT>
+<DEFAULT>0,25</DEFAULT>
</ARG>
<ARG>
@@ -12665,7 +12665,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Damping</NICK>
<BLURB>Damping.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -12695,17 +12695,17 @@
<FLAGS>rwx</FLAGS>
<NICK>Input-bandwidth</NICK>
<BLURB>Input-bandwidth.</BLURB>
-<DEFAULT>0.75</DEFAULT>
+<DEFAULT>0,75</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-gverb::Reverb-time</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.1,30]</RANGE>
+<RANGE>[0,1,30]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Reverb-time</NICK>
<BLURB>Reverb-time.</BLURB>
-<DEFAULT>7.575</DEFAULT>
+<DEFAULT>7,575</DEFAULT>
</ARG>
<ARG>
@@ -12715,7 +12715,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Roomsize</NICK>
<BLURB>Roomsize.</BLURB>
-<DEFAULT>75.75</DEFAULT>
+<DEFAULT>75,75</DEFAULT>
</ARG>
<ARG>
@@ -12725,7 +12725,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Tail-level</NICK>
<BLURB>Tail-level.</BLURB>
-<DEFAULT>-17.5</DEFAULT>
+<DEFAULT>-17,5</DEFAULT>
</ARG>
<ARG>
@@ -12765,7 +12765,7 @@
<FLAGS>r</FLAGS>
<NICK>latency</NICK>
<BLURB>latency.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -12775,7 +12775,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Filter-Q</NICK>
<BLURB>Filter-Q.</BLURB>
-<DEFAULT>0.25</DEFAULT>
+<DEFAULT>0,25</DEFAULT>
</ARG>
<ARG>
@@ -12975,13 +12975,13 @@
<FLAGS>rwx</FLAGS>
<NICK>Average-stall</NICK>
<BLURB>Average-stall.</BLURB>
-<DEFAULT>2.5</DEFAULT>
+<DEFAULT>2,5</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-retroFlange::Flange-frequency</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.5,8]</RANGE>
+<RANGE>[0,5,8]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Flange-frequency</NICK>
<BLURB>Flange-frequency.</BLURB>
@@ -12991,7 +12991,7 @@
<ARG>
<NAME>ladspa-fadDelay::Delay</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.1,10]</RANGE>
+<RANGE>[0,1,10]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Delay</NICK>
<BLURB>Delay.</BLURB>
@@ -13041,11 +13041,11 @@
<ARG>
<NAME>ladspa-triplePara::Band-1-frequency</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[4.41,21609]</RANGE>
+<RANGE>[4,41,21609]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Band-1-frequency</NICK>
<BLURB>Band-1-frequency.</BLURB>
-<DEFAULT>36.8967</DEFAULT>
+<DEFAULT>36,8967</DEFAULT>
</ARG>
<ARG>
@@ -13071,11 +13071,11 @@
<ARG>
<NAME>ladspa-triplePara::Band-2-frequency</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[4.41,21609]</RANGE>
+<RANGE>[4,41,21609]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Band-2-frequency</NICK>
<BLURB>Band-2-frequency.</BLURB>
-<DEFAULT>308.7</DEFAULT>
+<DEFAULT>308,7</DEFAULT>
</ARG>
<ARG>
@@ -13101,11 +13101,11 @@
<ARG>
<NAME>ladspa-triplePara::Band-3-frequency</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[4.41,21609]</RANGE>
+<RANGE>[4,41,21609]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Band-3-frequency</NICK>
<BLURB>Band-3-frequency.</BLURB>
-<DEFAULT>2582.77</DEFAULT>
+<DEFAULT>2582,77</DEFAULT>
</ARG>
<ARG>
@@ -13121,7 +13121,7 @@
<ARG>
<NAME>ladspa-triplePara::High-shelving-frequency</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[4.41,21609]</RANGE>
+<RANGE>[4,41,21609]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>High-shelving-frequency</NICK>
<BLURB>High-shelving-frequency.</BLURB>
@@ -13145,17 +13145,17 @@
<FLAGS>rwx</FLAGS>
<NICK>High-shelving-slope</NICK>
<BLURB>High-shelving-slope.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-triplePara::Low-shelving-frequency</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[4.41,21609]</RANGE>
+<RANGE>[4,41,21609]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Low-shelving-frequency</NICK>
<BLURB>Low-shelving-frequency.</BLURB>
-<DEFAULT>4.41</DEFAULT>
+<DEFAULT>4,41</DEFAULT>
</ARG>
<ARG>
@@ -13175,7 +13175,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Low-shelving-slope</NICK>
<BLURB>Low-shelving-slope.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -13221,7 +13221,7 @@
<ARG>
<NAME>ladspa-decimator::Sample-rate</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[44.1,44100]</RANGE>
+<RANGE>[44,1,44100]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Sample-rate</NICK>
<BLURB>Sample-rate.</BLURB>
@@ -13231,11 +13231,11 @@
<ARG>
<NAME>ladspa-flanger::Delay-base</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.1,25]</RANGE>
+<RANGE>[0,1,25]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Delay-base</NICK>
<BLURB>Delay-base.</BLURB>
-<DEFAULT>6.325</DEFAULT>
+<DEFAULT>6,325</DEFAULT>
</ARG>
<ARG>
@@ -13251,11 +13251,11 @@
<ARG>
<NAME>ladspa-flanger::LFO-frequency</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.05,100]</RANGE>
+<RANGE>[0,05,100]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>LFO-frequency</NICK>
<BLURB>LFO-frequency.</BLURB>
-<DEFAULT>0.33437</DEFAULT>
+<DEFAULT>0,33437</DEFAULT>
</ARG>
<ARG>
@@ -13265,7 +13265,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Max-slowdown</NICK>
<BLURB>Max-slowdown.</BLURB>
-<DEFAULT>2.5</DEFAULT>
+<DEFAULT>2,5</DEFAULT>
</ARG>
<ARG>
@@ -13325,7 +13325,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Voice-separation</NICK>
<BLURB>Voice-separation.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -13835,7 +13835,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Xover-lower-freq</NICK>
<BLURB>Xover-lower-freq.</BLURB>
-<DEFAULT>1537.5</DEFAULT>
+<DEFAULT>1537,5</DEFAULT>
</ARG>
<ARG>
@@ -13891,11 +13891,11 @@
<ARG>
<NAME>ladspa-fastLookaheadLimiter::Release-time</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.01,2]</RANGE>
+<RANGE>[0,01,2]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Release-time</NICK>
<BLURB>Release-time.</BLURB>
-<DEFAULT>0.5075</DEFAULT>
+<DEFAULT>0,5075</DEFAULT>
</ARG>
<ARG>
@@ -13905,7 +13905,7 @@
<FLAGS>r</FLAGS>
<NICK>latency</NICK>
<BLURB>latency.</BLURB>
-<DEFAULT>-3.40282e+38</DEFAULT>
+<DEFAULT>-3,40282e+38</DEFAULT>
</ARG>
<ARG>
@@ -13921,7 +13921,7 @@
<ARG>
<NAME>ladspa-comb::Feedback</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[-0.99,0.99]</RANGE>
+<RANGE>[-0,99,0,99]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Feedback</NICK>
<BLURB>Feedback.</BLURB>
@@ -14361,11 +14361,11 @@
<ARG>
<NAME>ladspa-Phaser1+LFO::LFO-frequency</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.01,30]</RANGE>
+<RANGE>[0,01,30]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>LFO-frequency</NICK>
<BLURB>LFO-frequency.</BLURB>
-<DEFAULT>0.01</DEFAULT>
+<DEFAULT>0,01</DEFAULT>
</ARG>
<ARG>
@@ -14491,7 +14491,7 @@
<ARG>
<NAME>ladspa-Parametric1::Bandwidth-1</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.125,8]</RANGE>
+<RANGE>[0,125,8]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Bandwidth-1</NICK>
<BLURB>Bandwidth-1.</BLURB>
@@ -14501,7 +14501,7 @@
<ARG>
<NAME>ladspa-Parametric1::Bandwidth-2</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.125,8]</RANGE>
+<RANGE>[0,125,8]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Bandwidth-2</NICK>
<BLURB>Bandwidth-2.</BLURB>
@@ -14511,7 +14511,7 @@
<ARG>
<NAME>ladspa-Parametric1::Bandwidth-3</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.125,8]</RANGE>
+<RANGE>[0,125,8]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Bandwidth-3</NICK>
<BLURB>Bandwidth-3.</BLURB>
@@ -14521,7 +14521,7 @@
<ARG>
<NAME>ladspa-Parametric1::Bandwidth-4</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.125,8]</RANGE>
+<RANGE>[0,125,8]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Bandwidth-4</NICK>
<BLURB>Bandwidth-4.</BLURB>
@@ -16761,21 +16761,21 @@
<ARG>
<NAME>ladspa-Chorus2::Mod-Frequency-1</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.003,10]</RANGE>
+<RANGE>[0,003,10]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Mod-Frequency-1</NICK>
<BLURB>Mod-Frequency-1.</BLURB>
-<DEFAULT>0.003</DEFAULT>
+<DEFAULT>0,003</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-Chorus2::Mod-Frequency-2</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.01,30]</RANGE>
+<RANGE>[0,01,30]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Mod-Frequency-2</NICK>
<BLURB>Mod-Frequency-2.</BLURB>
-<DEFAULT>0.01</DEFAULT>
+<DEFAULT>0,01</DEFAULT>
</ARG>
<ARG>
@@ -16811,21 +16811,21 @@
<ARG>
<NAME>ladspa-Chorus1::Mod-Frequency-1</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.003,10]</RANGE>
+<RANGE>[0,003,10]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Mod-Frequency-1</NICK>
<BLURB>Mod-Frequency-1.</BLURB>
-<DEFAULT>0.003</DEFAULT>
+<DEFAULT>0,003</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-Chorus1::Mod-Frequency-2</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0.01,30]</RANGE>
+<RANGE>[0,01,30]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Mod-Frequency-2</NICK>
<BLURB>Mod-Frequency-2.</BLURB>
-<DEFAULT>0.01</DEFAULT>
+<DEFAULT>0,01</DEFAULT>
</ARG>
<ARG>
@@ -16865,7 +16865,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Dry-Wet-Balance</NICK>
<BLURB>Dry-Wet-Balance.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -17845,7 +17845,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Pattern sensitivity</NICK>
<BLURB>The sensitivity around the center for detecting the markers (0.0 = lowest, 1.0 highest).</BLURB>
-<DEFAULT>0.3</DEFAULT>
+<DEFAULT>0,3</DEFAULT>
</ARG>
<ARG>
@@ -17885,7 +17885,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Pattern center</NICK>
<BLURB>The center of the black/white separation (0.0 = lowest, 1.0 highest).</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -18035,7 +18035,7 @@
<FLAGS>rw</FLAGS>
<NICK>stereo</NICK>
<BLURB>stereo.</BLURB>
-<DEFAULT>0.1</DEFAULT>
+<DEFAULT>0,1</DEFAULT>
</ARG>
<ARG>
@@ -18239,6 +18239,16 @@
</ARG>
<ARG>
+<NAME>GstRtpSession::sdes</NAME>
+<TYPE>GstStructure*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>SDES</NICK>
+<BLURB>The SDES items of this session.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
<NAME>GstRtpJitterBuffer::drop-on-latency</NAME>
<TYPE>gboolean</TYPE>
<RANGE></RANGE>
@@ -18369,6 +18379,16 @@
</ARG>
<ARG>
+<NAME>GstRtpBin::sdes</NAME>
+<TYPE>GstStructure*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>SDES</NICK>
+<BLURB>The SDES items of this session.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
<NAME>GstGioSrc::location</NAME>
<TYPE>gchar*</TYPE>
<RANGE></RANGE>
@@ -20690,7 +20710,7 @@
<FLAGS>rwx</FLAGS>
<NICK>LP-filter</NICK>
<BLURB>LP-filter.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -20740,7 +20760,7 @@
<FLAGS>rwx</FLAGS>
<NICK>LP-filter</NICK>
<BLURB>LP-filter.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -20810,7 +20830,7 @@
<FLAGS>rwx</FLAGS>
<NICK>LP-filter</NICK>
<BLURB>LP-filter.</BLURB>
-<DEFAULT>0.5</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -21290,7 +21310,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Frequency</NICK>
<BLURB>Frequency.</BLURB>
-<DEFAULT>10</DEFAULT>
+<DEFAULT>2990,7</DEFAULT>
</ARG>
<ARG>
@@ -21300,13 +21320,13 @@
<FLAGS>rwx</FLAGS>
<NICK>Inertia</NICK>
<BLURB>Inertia.</BLURB>
-<DEFAULT>5</DEFAULT>
+<DEFAULT>22,3607</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-Filter::Mode</NAME>
<TYPE>gint</TYPE>
-<RANGE>[0,5]</RANGE>
+<RANGE>[0,11]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Mode</NICK>
<BLURB>Mode.</BLURB>
@@ -21316,7 +21336,7 @@
<ARG>
<NAME>ladspa-Filter::Resonance</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0,707,20]</RANGE>
+<RANGE>[0,707,32]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Resonance</NICK>
<BLURB>Resonance.</BLURB>
@@ -21326,11 +21346,11 @@
<ARG>
<NAME>ladspa-Flanger::Amount</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0,2]</RANGE>
+<RANGE>[0,4]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Amount</NICK>
<BLURB>Amount.</BLURB>
-<DEFAULT>0</DEFAULT>
+<DEFAULT>1</DEFAULT>
</ARG>
<ARG>
@@ -21340,7 +21360,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Feedback</NICK>
<BLURB>Feedback.</BLURB>
-<DEFAULT>-0,99</DEFAULT>
+<DEFAULT>0,99</DEFAULT>
</ARG>
<ARG>
@@ -21360,7 +21380,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Modulation-depth</NICK>
<BLURB>Modulation-depth.</BLURB>
-<DEFAULT>0,1</DEFAULT>
+<DEFAULT>0,316228</DEFAULT>
</ARG>
<ARG>
@@ -21370,7 +21390,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Modulation-rate</NICK>
<BLURB>Modulation-rate.</BLURB>
-<DEFAULT>0,01</DEFAULT>
+<DEFAULT>0,447214</DEFAULT>
</ARG>
<ARG>
@@ -21394,6 +21414,16 @@
</ARG>
<ARG>
+<NAME>ladspa-Flanger::Dry-Amount</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,4]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Dry-Amount</NICK>
+<BLURB>Dry-Amount.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
<NAME>ladspa-Reverb::Amount</NAME>
<TYPE>gfloat</TYPE>
<RANGE>[0,2]</RANGE>
@@ -21406,11 +21436,11 @@
<ARG>
<NAME>ladspa-Reverb::Decay-time</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0,5,15]</RANGE>
+<RANGE>[0,4,15]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Decay-time</NICK>
<BLURB>Decay-time.</BLURB>
-<DEFAULT>0,5</DEFAULT>
+<DEFAULT>0,989846</DEFAULT>
</ARG>
<ARG>
@@ -21420,7 +21450,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Diffusion</NICK>
<BLURB>Diffusion.</BLURB>
-<DEFAULT>0</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -21430,13 +21460,13 @@
<FLAGS>rwx</FLAGS>
<NICK>High-Frq-Damp</NICK>
<BLURB>High-Frq-Damp.</BLURB>
-<DEFAULT>2000</DEFAULT>
+<DEFAULT>6324,56</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-Reverb::Room-size</NAME>
<TYPE>gint</TYPE>
-<RANGE>[0,3]</RANGE>
+<RANGE>[0,5]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Room-size</NICK>
<BLURB>Room-size.</BLURB>
@@ -21444,10 +21474,60 @@
</ARG>
<ARG>
-<NAME>ladspa-VintageDelay::Amount</NAME>
+<NAME>ladspa-Reverb::Bass-Cut</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[20,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Bass-Cut</NICK>
+<BLURB>Bass-Cut.</BLURB>
+<DEFAULT>632,456</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Reverb::Dry-Amount</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,2]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Dry-Amount</NICK>
+<BLURB>Dry-Amount.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Reverb::Pre-Delay</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,50]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Pre-Delay</NICK>
+<BLURB>Pre-Delay.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Reverb::Treble-Cut</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[20,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Treble-Cut</NICK>
+<BLURB>Treble-Cut.</BLURB>
+<DEFAULT>3556,56</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Reverb::Wet-Amount</NAME>
<TYPE>gfloat</TYPE>
<RANGE>[0,2]</RANGE>
<FLAGS>rwx</FLAGS>
+<NICK>Wet-Amount</NICK>
+<BLURB>Wet-Amount.</BLURB>
+<DEFAULT>0,5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-VintageDelay::Amount</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,4]</RANGE>
+<FLAGS>rwx</FLAGS>
<NICK>Amount</NICK>
<BLURB>Amount.</BLURB>
<DEFAULT>0</DEFAULT>
@@ -21460,7 +21540,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Feedback</NICK>
<BLURB>Feedback.</BLURB>
-<DEFAULT>0</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -21470,7 +21550,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Medium</NICK>
<BLURB>Medium.</BLURB>
-<DEFAULT>0</DEFAULT>
+<DEFAULT>1</DEFAULT>
</ARG>
<ARG>
@@ -21480,7 +21560,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Mix-mode</NICK>
<BLURB>Mix-mode.</BLURB>
-<DEFAULT>0</DEFAULT>
+<DEFAULT>1</DEFAULT>
</ARG>
<ARG>
@@ -21500,7 +21580,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Tempo</NICK>
<BLURB>Tempo.</BLURB>
-<DEFAULT>30</DEFAULT>
+<DEFAULT>97,5</DEFAULT>
</ARG>
<ARG>
@@ -21524,6 +21604,16 @@
</ARG>
<ARG>
+<NAME>ladspa-VintageDelay::Dry-Amount</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,4]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Dry-Amount</NICK>
+<BLURB>Dry-Amount.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
<NAME>ladspa-RotarySpeaker::Mod-Depth</NAME>
<TYPE>gfloat</TYPE>
<RANGE>[0,1]</RANGE>
@@ -21536,7 +21626,7 @@
<ARG>
<NAME>ladspa-RotarySpeaker::Speed-Mode</NAME>
<TYPE>gint</TYPE>
-<RANGE>[0,4]</RANGE>
+<RANGE>[0,5]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Speed-Mode</NICK>
<BLURB>Speed-Mode.</BLURB>
@@ -21550,7 +21640,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Tap-Offset</NICK>
<BLURB>Tap-Offset.</BLURB>
-<DEFAULT>0</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
</ARG>
<ARG>
@@ -21560,17 +21650,57 @@
<FLAGS>rwx</FLAGS>
<NICK>Tap-Spacing</NICK>
<BLURB>Tap-Spacing.</BLURB>
-<DEFAULT>0</DEFAULT>
+<DEFAULT>0,5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-RotarySpeaker::Bass-Motor</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[10,600]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Bass-Motor</NICK>
+<BLURB>Bass-Motor.</BLURB>
+<DEFAULT>600</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-RotarySpeaker::Mic-Distance</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Mic-Distance</NICK>
+<BLURB>Mic-Distance.</BLURB>
+<DEFAULT>0,75</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-RotarySpeaker::Reflection</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Reflection</NICK>
+<BLURB>Reflection.</BLURB>
+<DEFAULT>0,25</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-RotarySpeaker::Treble-Motor</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[10,600]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Treble-Motor</NICK>
+<BLURB>Treble-Motor.</BLURB>
+<DEFAULT>600</DEFAULT>
</ARG>
<ARG>
<NAME>ladspa-Phaser::Amount</NAME>
<TYPE>gfloat</TYPE>
-<RANGE>[0,2]</RANGE>
+<RANGE>[0,4]</RANGE>
<FLAGS>rwx</FLAGS>
<NICK>Amount</NICK>
<BLURB>Amount.</BLURB>
-<DEFAULT>0</DEFAULT>
+<DEFAULT>1</DEFAULT>
</ARG>
<ARG>
@@ -21580,7 +21710,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Center-Freq</NICK>
<BLURB>Center-Freq.</BLURB>
-<DEFAULT>20</DEFAULT>
+<DEFAULT>632,456</DEFAULT>
</ARG>
<ARG>
@@ -21590,7 +21720,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Feedback</NICK>
<BLURB>Feedback.</BLURB>
-<DEFAULT>-0,99</DEFAULT>
+<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
@@ -21600,7 +21730,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Modulation-depth</NICK>
<BLURB>Modulation-depth.</BLURB>
-<DEFAULT>0</DEFAULT>
+<DEFAULT>5400</DEFAULT>
</ARG>
<ARG>
@@ -21610,7 +21740,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Modulation-rate</NICK>
<BLURB>Modulation-rate.</BLURB>
-<DEFAULT>0,01</DEFAULT>
+<DEFAULT>0,447214</DEFAULT>
</ARG>
<ARG>
@@ -21630,7 +21760,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Stereo-phase</NICK>
<BLURB>Stereo-phase.</BLURB>
-<DEFAULT>0</DEFAULT>
+<DEFAULT>180</DEFAULT>
</ARG>
<ARG>
@@ -21644,6 +21774,16 @@
</ARG>
<ARG>
+<NAME>ladspa-Phaser::Dry-Amount</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,4]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Dry-Amount</NICK>
+<BLURB>Dry-Amount.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
<NAME>ladspa-Eq2x2::param-1-kHz</NAME>
<TYPE>gfloat</TYPE>
<RANGE>[-48,24]</RANGE>
@@ -22630,13 +22770,13 @@
<FLAGS>rw</FLAGS>
<NICK>Overlap Length</NICK>
<BLURB>Percentage of stride to overlap.</BLURB>
-<DEFAULT>0.2</DEFAULT>
+<DEFAULT>0,2</DEFAULT>
</ARG>
<ARG>
<NAME>GstScaletempo::rate</NAME>
<TYPE>gdouble</TYPE>
-<RANGE>[-2.14748e+09,2.14748e+09]</RANGE>
+<RANGE>[-2,14748e+09,2,14748e+09]</RANGE>
<FLAGS>r</FLAGS>
<NICK>Playback Rate</NICK>
<BLURB>Current playback rate.</BLURB>
@@ -22800,7 +22940,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Movie timescale</NICK>
<BLURB>Timescale to use in the movie (units per second).</BLURB>
-<DEFAULT>600</DEFAULT>
+<DEFAULT>1000</DEFAULT>
</ARG>
<ARG>
@@ -22850,7 +22990,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Movie timescale</NICK>
<BLURB>Timescale to use in the movie (units per second).</BLURB>
-<DEFAULT>600</DEFAULT>
+<DEFAULT>1000</DEFAULT>
</ARG>
<ARG>
@@ -22900,7 +23040,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Movie timescale</NICK>
<BLURB>Timescale to use in the movie (units per second).</BLURB>
-<DEFAULT>600</DEFAULT>
+<DEFAULT>1000</DEFAULT>
</ARG>
<ARG>
@@ -22950,7 +23090,7 @@
<FLAGS>rwx</FLAGS>
<NICK>Movie timescale</NICK>
<BLURB>Timescale to use in the movie (units per second).</BLURB>
-<DEFAULT>600</DEFAULT>
+<DEFAULT>1000</DEFAULT>
</ARG>
<ARG>
@@ -23532,3 +23672,2454 @@
<BLURB>Drop fields of incoming caps.</BLURB>
<DEFAULT>FALSE</DEFAULT>
</ARG>
+
+<ARG>
+<NAME>ladspa-Filterclavier::Detune</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[-100,100]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Detune</NICK>
+<BLURB>Detune.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Filterclavier::Max--Resonance</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,707,32]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Max--Resonance</NICK>
+<BLURB>Max--Resonance.</BLURB>
+<DEFAULT>32</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Filterclavier::Mode</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,11]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Mode</NICK>
+<BLURB>Mode.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Filterclavier::Portamento-time</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[1,2000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Portamento-time</NICK>
+<BLURB>Portamento-time.</BLURB>
+<DEFAULT>44,7214</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Filterclavier::Transpose</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[-48,48]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Transpose</NICK>
+<BLURB>Transpose.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-MultiChorus::Amount</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,4]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Amount</NICK>
+<BLURB>Amount.</BLURB>
+<DEFAULT>2</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-MultiChorus::Center-Frq-1</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[10,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Center-Frq-1</NICK>
+<BLURB>Center-Frq-1.</BLURB>
+<DEFAULT>100</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-MultiChorus::Center-Frq-2</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[10,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Center-Frq-2</NICK>
+<BLURB>Center-Frq-2.</BLURB>
+<DEFAULT>2990,7</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-MultiChorus::Dry-Amount</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,4]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Dry-Amount</NICK>
+<BLURB>Dry-Amount.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-MultiChorus::Inter-voice-phase</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,360]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Inter-voice-phase</NICK>
+<BLURB>Inter-voice-phase.</BLURB>
+<DEFAULT>90</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-MultiChorus::Minimum-delay</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1,10]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Minimum-delay</NICK>
+<BLURB>Minimum-delay.</BLURB>
+<DEFAULT>3,16228</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-MultiChorus::Modulation-depth</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1,10]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Modulation-depth</NICK>
+<BLURB>Modulation-depth.</BLURB>
+<DEFAULT>10</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-MultiChorus::Modulation-rate</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,01,20]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Modulation-rate</NICK>
+<BLURB>Modulation-rate.</BLURB>
+<DEFAULT>0,447214</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-MultiChorus::Q</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,125,8]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Q</NICK>
+<BLURB>Q.</BLURB>
+<DEFAULT>0,125</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-MultiChorus::Stereo-phase</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,360]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Stereo-phase</NICK>
+<BLURB>Stereo-phase.</BLURB>
+<DEFAULT>180</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-MultiChorus::Voices</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,8]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Voices</NICK>
+<BLURB>Voices.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Compressor::A-weighting</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>A-weighting</NICK>
+<BLURB>A-weighting.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Compressor::Attack</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,01,2000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Attack</NICK>
+<BLURB>Attack.</BLURB>
+<DEFAULT>4,47214</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Compressor::Bypass</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Bypass</NICK>
+<BLURB>Bypass.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Compressor::Compression</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,03125,1]</RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Compression</NICK>
+<BLURB>Compression.</BLURB>
+<DEFAULT>0,03125</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Compressor::Detection</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Detection</NICK>
+<BLURB>Detection.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Compressor::Knee</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[1,8]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Knee</NICK>
+<BLURB>Knee.</BLURB>
+<DEFAULT>2,75</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Compressor::Makeup-Gain</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[1,64]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Makeup-Gain</NICK>
+<BLURB>Makeup-Gain.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Compressor::Peak-Output</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Peak-Output</NICK>
+<BLURB>Peak-Output.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Compressor::Ratio</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[1,20]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Ratio</NICK>
+<BLURB>Ratio.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Compressor::Release</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,01,2000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Release</NICK>
+<BLURB>Release.</BLURB>
+<DEFAULT>94,5742</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Compressor::Stereo-Link</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Stereo-Link</NICK>
+<BLURB>Stereo-Link.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Compressor::Threshold</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,000976563,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Threshold</NICK>
+<BLURB>Threshold.</BLURB>
+<DEFAULT>0,250732</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>ladspa-Compressor::param-0dB</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>param-0dB</NICK>
+<BLURB>param-0dB.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Compressor::attack</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,01,2000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>attack</NICK>
+<BLURB>attack.</BLURB>
+<DEFAULT>20</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Compressor::aweighting</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>aweighting</NICK>
+<BLURB>aweighting.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Compressor::bypass</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>bypass</NICK>
+<BLURB>bypass.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Compressor::clip</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>clip</NICK>
+<BLURB>clip.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Compressor::compression</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>r</FLAGS>
+<NICK>compression</NICK>
+<BLURB>compression.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Compressor::detection</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>detection</NICK>
+<BLURB>detection.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Compressor::knee</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[1,8]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>knee</NICK>
+<BLURB>knee.</BLURB>
+<DEFAULT>2,82843</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Compressor::makeup</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[1,64]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>makeup</NICK>
+<BLURB>makeup.</BLURB>
+<DEFAULT>2</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Compressor::peak</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>r</FLAGS>
+<NICK>peak</NICK>
+<BLURB>peak.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Compressor::ratio</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[1,20]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>ratio</NICK>
+<BLURB>ratio.</BLURB>
+<DEFAULT>2</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Compressor::release</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,01,2000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>release</NICK>
+<BLURB>release.</BLURB>
+<DEFAULT>250</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Compressor::stereo-link</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>stereo_link</NICK>
+<BLURB>stereo_link.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Compressor::threshold</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,000976563,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>threshold</NICK>
+<BLURB>threshold.</BLURB>
+<DEFAULT>0,125</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Filter::freq</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[10,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>freq</NICK>
+<BLURB>freq.</BLURB>
+<DEFAULT>2000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Filter::inertia</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[5,100]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>inertia</NICK>
+<BLURB>inertia.</BLURB>
+<DEFAULT>20</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Filter::mode</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,11]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>mode</NICK>
+<BLURB>mode.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Filter::res</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,707,32]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>res</NICK>
+<BLURB>res.</BLURB>
+<DEFAULT>0,707</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Filterclavier::detune</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[-100,100]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>detune</NICK>
+<BLURB>detune.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Filterclavier::inertia</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[1,2000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>inertia</NICK>
+<BLURB>inertia.</BLURB>
+<DEFAULT>20</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Filterclavier::maxres</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,707,32]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>maxres</NICK>
+<BLURB>maxres.</BLURB>
+<DEFAULT>32</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Filterclavier::mode</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,11]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>mode</NICK>
+<BLURB>mode.</BLURB>
+<DEFAULT>6</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Filterclavier::transpose</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[-48,48]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>transpose</NICK>
+<BLURB>transpose.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Flanger::amount</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,4]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>amount</NICK>
+<BLURB>amount.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Flanger::dry</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,4]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>dry</NICK>
+<BLURB>dry.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Flanger::feedback</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-0,99,0,99]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>feedback</NICK>
+<BLURB>feedback.</BLURB>
+<DEFAULT>0,9</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Flanger::min-delay</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1,10]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>min_delay</NICK>
+<BLURB>min_delay.</BLURB>
+<DEFAULT>0,1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Flanger::mod-depth</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1,10]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>mod_depth</NICK>
+<BLURB>mod_depth.</BLURB>
+<DEFAULT>0,5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Flanger::mod-rate</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,01,20]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>mod_rate</NICK>
+<BLURB>mod_rate.</BLURB>
+<DEFAULT>0,25</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Flanger::reset</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>reset</NICK>
+<BLURB>reset.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Flanger::stereo</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,360]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>stereo</NICK>
+<BLURB>stereo.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::adsr-a</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[1,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>adsr_a</NICK>
+<BLURB>adsr_a.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::adsr-d</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[10,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>adsr_d</NICK>
+<BLURB>adsr_d.</BLURB>
+<DEFAULT>350</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::adsr-r</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[10,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>adsr_r</NICK>
+<BLURB>adsr_r.</BLURB>
+<DEFAULT>50</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::adsr-s</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>adsr_s</NICK>
+<BLURB>adsr_s.</BLURB>
+<DEFAULT>0,5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::cutoff</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[10,16000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>cutoff</NICK>
+<BLURB>cutoff.</BLURB>
+<DEFAULT>33</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::env2amp</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>env2amp</NICK>
+<BLURB>env2amp.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::env2cutoff</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-10800,10800]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>env2cutoff</NICK>
+<BLURB>env2cutoff.</BLURB>
+<DEFAULT>8000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::env2res</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>env2res</NICK>
+<BLURB>env2res.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::filter</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,7]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>filter</NICK>
+<BLURB>filter.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::filter-sep</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-2400,2400]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>filter_sep</NICK>
+<BLURB>filter_sep.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::key-follow</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,2]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>key_follow</NICK>
+<BLURB>key_follow.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::legato</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,3]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>legato</NICK>
+<BLURB>legato.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::master</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>master</NICK>
+<BLURB>master.</BLURB>
+<DEFAULT>0,5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::o1-wave</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,15]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>o1_wave</NICK>
+<BLURB>o1_wave.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::o12-detune</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,100]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>o12_detune</NICK>
+<BLURB>o12_detune.</BLURB>
+<DEFAULT>10</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::o12-mix</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>o12_mix</NICK>
+<BLURB>o12_mix.</BLURB>
+<DEFAULT>0,5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::o2-wave</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,15]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>o2_wave</NICK>
+<BLURB>o2_wave.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::o2-xpose</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[-24,24]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>o2_xpose</NICK>
+<BLURB>o2_xpose.</BLURB>
+<DEFAULT>12</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::phase-mode</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,5]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>phase_mode</NICK>
+<BLURB>phase_mode.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::portamento</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[1,2000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>portamento</NICK>
+<BLURB>portamento.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::res</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,7,8]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>res</NICK>
+<BLURB>res.</BLURB>
+<DEFAULT>2</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::vel2amp</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>vel2amp</NICK>
+<BLURB>vel2amp.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Monosynth::vel2filter</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>vel2filter</NICK>
+<BLURB>vel2filter.</BLURB>
+<DEFAULT>0,5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-MultiChorus::amount</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,4]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>amount</NICK>
+<BLURB>amount.</BLURB>
+<DEFAULT>2</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-MultiChorus::dry</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,4]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>dry</NICK>
+<BLURB>dry.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-MultiChorus::freq</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[10,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>freq</NICK>
+<BLURB>freq.</BLURB>
+<DEFAULT>100</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-MultiChorus::freq2</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[10,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>freq2</NICK>
+<BLURB>freq2.</BLURB>
+<DEFAULT>5000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-MultiChorus::min-delay</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1,10]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>min_delay</NICK>
+<BLURB>min_delay.</BLURB>
+<DEFAULT>5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-MultiChorus::mod-depth</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1,10]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>mod_depth</NICK>
+<BLURB>mod_depth.</BLURB>
+<DEFAULT>6</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-MultiChorus::mod-rate</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,01,20]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>mod_rate</NICK>
+<BLURB>mod_rate.</BLURB>
+<DEFAULT>0,5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-MultiChorus::q</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,125,8]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>q</NICK>
+<BLURB>q.</BLURB>
+<DEFAULT>0,125</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-MultiChorus::stereo</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,360]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>stereo</NICK>
+<BLURB>stereo.</BLURB>
+<DEFAULT>180</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-MultiChorus::voices</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,8]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>voices</NICK>
+<BLURB>voices.</BLURB>
+<DEFAULT>4</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-MultiChorus::vphase</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,360]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>vphase</NICK>
+<BLURB>vphase.</BLURB>
+<DEFAULT>64</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::adsr-a</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[1,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>adsr_a</NICK>
+<BLURB>adsr_a.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::adsr-d</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[10,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>adsr_d</NICK>
+<BLURB>adsr_d.</BLURB>
+<DEFAULT>350</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::adsr-r</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[10,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>adsr_r</NICK>
+<BLURB>adsr_r.</BLURB>
+<DEFAULT>50</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::adsr-s</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>adsr_s</NICK>
+<BLURB>adsr_s.</BLURB>
+<DEFAULT>0,5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::adsr-v</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>adsr_v</NICK>
+<BLURB>adsr_v.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::adsr2-a</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[1,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>adsr2_a</NICK>
+<BLURB>adsr2_a.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::adsr2-d</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[10,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>adsr2_d</NICK>
+<BLURB>adsr2_d.</BLURB>
+<DEFAULT>350</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::adsr2-r</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[10,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>adsr2_r</NICK>
+<BLURB>adsr2_r.</BLURB>
+<DEFAULT>50</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::adsr2-s</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>adsr2_s</NICK>
+<BLURB>adsr2_s.</BLURB>
+<DEFAULT>0,5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::adsr2-v</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>adsr2_v</NICK>
+<BLURB>adsr2_v.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::adsr3-a</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[1,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>adsr3_a</NICK>
+<BLURB>adsr3_a.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::adsr3-d</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[10,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>adsr3_d</NICK>
+<BLURB>adsr3_d.</BLURB>
+<DEFAULT>350</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::adsr3-r</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[10,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>adsr3_r</NICK>
+<BLURB>adsr3_r.</BLURB>
+<DEFAULT>50</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::adsr3-s</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>adsr3_s</NICK>
+<BLURB>adsr3_s.</BLURB>
+<DEFAULT>0,5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::adsr3-v</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>adsr3_v</NICK>
+<BLURB>adsr3_v.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::detune</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-100,100]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>detune</NICK>
+<BLURB>detune.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::detune1</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-100,100]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>detune1</NICK>
+<BLURB>detune1.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::detune2</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-100,100]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>detune2</NICK>
+<BLURB>detune2.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::detune3</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-100,100]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>detune3</NICK>
+<BLURB>detune3.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::detune4</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-100,100]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>detune4</NICK>
+<BLURB>detune4.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::detune5</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-100,100]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>detune5</NICK>
+<BLURB>detune5.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::detune6</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-100,100]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>detune6</NICK>
+<BLURB>detune6.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::detune7</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-100,100]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>detune7</NICK>
+<BLURB>detune7.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::detune8</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-100,100]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>detune8</NICK>
+<BLURB>detune8.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::detune9</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-100,100]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>detune9</NICK>
+<BLURB>detune9.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::eg1-amp-ctl</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,4]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>eg1_amp_ctl</NICK>
+<BLURB>eg1_amp_ctl.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::eg2-amp-ctl</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,4]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>eg2_amp_ctl</NICK>
+<BLURB>eg2_amp_ctl.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::eg3-amp-ctl</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,4]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>eg3_amp_ctl</NICK>
+<BLURB>eg3_amp_ctl.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f1</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,32]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f1</NICK>
+<BLURB>f1.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f1-cutoff</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[20,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f1_cutoff</NICK>
+<BLURB>f1_cutoff.</BLURB>
+<DEFAULT>2000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f1-env1</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-10800,10800]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f1_env1</NICK>
+<BLURB>f1_env1.</BLURB>
+<DEFAULT>8000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f1-env2</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-10800,10800]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f1_env2</NICK>
+<BLURB>f1_env2.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f1-env3</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-10800,10800]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f1_env3</NICK>
+<BLURB>f1_env3.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f1-keyf</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,2]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f1_keyf</NICK>
+<BLURB>f1_keyf.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f1-res</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,7,8]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f1_res</NICK>
+<BLURB>f1_res.</BLURB>
+<DEFAULT>2</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f2</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,32]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f2</NICK>
+<BLURB>f2.</BLURB>
+<DEFAULT>3</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f2-cutoff</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[20,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f2_cutoff</NICK>
+<BLURB>f2_cutoff.</BLURB>
+<DEFAULT>2000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f2-env1</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-10800,10800]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f2_env1</NICK>
+<BLURB>f2_env1.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f2-env2</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-10800,10800]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f2_env2</NICK>
+<BLURB>f2_env2.</BLURB>
+<DEFAULT>8000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f2-env3</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-10800,10800]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f2_env3</NICK>
+<BLURB>f2_env3.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f2-keyf</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,2]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f2_keyf</NICK>
+<BLURB>f2_keyf.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f2-res</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,7,8]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f2_res</NICK>
+<BLURB>f2_res.</BLURB>
+<DEFAULT>2</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f3</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,32]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f3</NICK>
+<BLURB>f3.</BLURB>
+<DEFAULT>2</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f4</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,32]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f4</NICK>
+<BLURB>f4.</BLURB>
+<DEFAULT>4</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f5</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,32]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f5</NICK>
+<BLURB>f5.</BLURB>
+<DEFAULT>6</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f6</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,32]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f6</NICK>
+<BLURB>f6.</BLURB>
+<DEFAULT>8</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f7</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,32]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f7</NICK>
+<BLURB>f7.</BLURB>
+<DEFAULT>10</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f8</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,32]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f8</NICK>
+<BLURB>f8.</BLURB>
+<DEFAULT>12</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::f9</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,32]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>f9</NICK>
+<BLURB>f9.</BLURB>
+<DEFAULT>16</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::filter-chain</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>filter_chain</NICK>
+<BLURB>filter_chain.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::foldnote</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,127]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>foldnote</NICK>
+<BLURB>foldnote.</BLURB>
+<DEFAULT>96</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::l1</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,8]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>l1</NICK>
+<BLURB>l1.</BLURB>
+<DEFAULT>8</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::l2</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,8]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>l2</NICK>
+<BLURB>l2.</BLURB>
+<DEFAULT>8</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::l3</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,8]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>l3</NICK>
+<BLURB>l3.</BLURB>
+<DEFAULT>8</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::l4</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,8]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>l4</NICK>
+<BLURB>l4.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::l5</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,8]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>l5</NICK>
+<BLURB>l5.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::l6</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,8]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>l6</NICK>
+<BLURB>l6.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::l7</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,8]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>l7</NICK>
+<BLURB>l7.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::l8</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,8]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>l8</NICK>
+<BLURB>l8.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::l9</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,8]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>l9</NICK>
+<BLURB>l9.</BLURB>
+<DEFAULT>8</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::master</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>master</NICK>
+<BLURB>master.</BLURB>
+<DEFAULT>0,1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::pan1</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-1,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>pan1</NICK>
+<BLURB>pan1.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::pan2</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-1,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>pan2</NICK>
+<BLURB>pan2.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::pan3</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-1,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>pan3</NICK>
+<BLURB>pan3.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::pan4</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-1,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>pan4</NICK>
+<BLURB>pan4.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::pan5</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-1,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>pan5</NICK>
+<BLURB>pan5.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::pan6</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-1,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>pan6</NICK>
+<BLURB>pan6.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::pan7</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-1,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>pan7</NICK>
+<BLURB>pan7.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::pan8</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-1,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>pan8</NICK>
+<BLURB>pan8.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::pan9</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-1,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>pan9</NICK>
+<BLURB>pan9.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::perc-decay</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[10,3000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>perc_decay</NICK>
+<BLURB>perc_decay.</BLURB>
+<DEFAULT>200</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::perc-fm-decay</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[10,3000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>perc_fm_decay</NICK>
+<BLURB>perc_fm_decay.</BLURB>
+<DEFAULT>200</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::perc-fm-depth</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,4]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>perc_fm_depth</NICK>
+<BLURB>perc_fm_depth.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::perc-fm-harmonic</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,32]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>perc_fm_harmonic</NICK>
+<BLURB>perc_fm_harmonic.</BLURB>
+<DEFAULT>6</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::perc-fm-waveform</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,27]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>perc_fm_waveform</NICK>
+<BLURB>perc_fm_waveform.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::perc-harmonic</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,32]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>perc_harmonic</NICK>
+<BLURB>perc_harmonic.</BLURB>
+<DEFAULT>6</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::perc-level</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>perc_level</NICK>
+<BLURB>perc_level.</BLURB>
+<DEFAULT>0,25</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::perc-stereo</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,360]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>perc_stereo</NICK>
+<BLURB>perc_stereo.</BLURB>
+<DEFAULT>90</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::perc-trigger</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,3]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>perc_trigger</NICK>
+<BLURB>perc_trigger.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::perc-vel2amp</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>perc_vel2amp</NICK>
+<BLURB>perc_vel2amp.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::perc-vel2fm</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>perc_vel2fm</NICK>
+<BLURB>perc_vel2fm.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::perc-waveform</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,27]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>perc_waveform</NICK>
+<BLURB>perc_waveform.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::phase1</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,360]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>phase1</NICK>
+<BLURB>phase1.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::phase2</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,360]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>phase2</NICK>
+<BLURB>phase2.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::phase3</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,360]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>phase3</NICK>
+<BLURB>phase3.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::phase4</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,360]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>phase4</NICK>
+<BLURB>phase4.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::phase5</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,360]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>phase5</NICK>
+<BLURB>phase5.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::phase6</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,360]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>phase6</NICK>
+<BLURB>phase6.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::phase7</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,360]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>phase7</NICK>
+<BLURB>phase7.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::phase8</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,360]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>phase8</NICK>
+<BLURB>phase8.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::phase9</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,360]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>phase9</NICK>
+<BLURB>phase9.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::polyphony</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,32]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>polyphony</NICK>
+<BLURB>polyphony.</BLURB>
+<DEFAULT>16</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::quad-env</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>quad_env</NICK>
+<BLURB>quad_env.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::routing1</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,2]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>routing1</NICK>
+<BLURB>routing1.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::routing2</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,2]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>routing2</NICK>
+<BLURB>routing2.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::routing3</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,2]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>routing3</NICK>
+<BLURB>routing3.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::routing4</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,2]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>routing4</NICK>
+<BLURB>routing4.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::routing5</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,2]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>routing5</NICK>
+<BLURB>routing5.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::routing6</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,2]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>routing6</NICK>
+<BLURB>routing6.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::routing7</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,2]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>routing7</NICK>
+<BLURB>routing7.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::routing8</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,2]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>routing8</NICK>
+<BLURB>routing8.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::routing9</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,2]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>routing9</NICK>
+<BLURB>routing9.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::transpose</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[-24,24]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>transpose</NICK>
+<BLURB>transpose.</BLURB>
+<DEFAULT>-12</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::vib-amt</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>vib_amt</NICK>
+<BLURB>vib_amt.</BLURB>
+<DEFAULT>0,5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::vib-mode</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,5]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>vib_mode</NICK>
+<BLURB>vib_mode.</BLURB>
+<DEFAULT>5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::vib-phase</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,360]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>vib_phase</NICK>
+<BLURB>vib_phase.</BLURB>
+<DEFAULT>180</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::vib-rate</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,01,80]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>vib_rate</NICK>
+<BLURB>vib_rate.</BLURB>
+<DEFAULT>6,6</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::vib-wet</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>vib_wet</NICK>
+<BLURB>vib_wet.</BLURB>
+<DEFAULT>0,5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::w1</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,35]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>w1</NICK>
+<BLURB>w1.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::w2</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,35]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>w2</NICK>
+<BLURB>w2.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::w3</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,35]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>w3</NICK>
+<BLURB>w3.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::w4</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,35]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>w4</NICK>
+<BLURB>w4.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::w5</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,35]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>w5</NICK>
+<BLURB>w5.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::w6</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,35]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>w6</NICK>
+<BLURB>w6.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::w7</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,35]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>w7</NICK>
+<BLURB>w7.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::w8</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,35]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>w8</NICK>
+<BLURB>w8.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Organ::w9</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,35]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>w9</NICK>
+<BLURB>w9.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Phaser::amount</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,4]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>amount</NICK>
+<BLURB>amount.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Phaser::base-freq</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[20,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>base_freq</NICK>
+<BLURB>base_freq.</BLURB>
+<DEFAULT>1000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Phaser::dry</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,4]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>dry</NICK>
+<BLURB>dry.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Phaser::feedback</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-0,99,0,99]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>feedback</NICK>
+<BLURB>feedback.</BLURB>
+<DEFAULT>0,25</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Phaser::mod-depth</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,10800]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>mod_depth</NICK>
+<BLURB>mod_depth.</BLURB>
+<DEFAULT>4000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Phaser::mod-rate</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,01,20]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>mod_rate</NICK>
+<BLURB>mod_rate.</BLURB>
+<DEFAULT>0,25</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Phaser::reset</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>reset</NICK>
+<BLURB>reset.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Phaser::stages</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,12]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>stages</NICK>
+<BLURB>stages.</BLURB>
+<DEFAULT>6</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Phaser::stereo</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,360]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>stereo</NICK>
+<BLURB>stereo.</BLURB>
+<DEFAULT>180</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Reverb::amount</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,2]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>amount</NICK>
+<BLURB>amount.</BLURB>
+<DEFAULT>0,25</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Reverb::bass-cut</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[20,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>bass_cut</NICK>
+<BLURB>bass_cut.</BLURB>
+<DEFAULT>300</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Reverb::decay-time</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,4,15]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>decay_time</NICK>
+<BLURB>decay_time.</BLURB>
+<DEFAULT>1,5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Reverb::diffusion</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>diffusion</NICK>
+<BLURB>diffusion.</BLURB>
+<DEFAULT>0,5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Reverb::dry</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,2]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>dry</NICK>
+<BLURB>dry.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Reverb::hf-damp</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[2000,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>hf_damp</NICK>
+<BLURB>hf_damp.</BLURB>
+<DEFAULT>5000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Reverb::predelay</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,50]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>predelay</NICK>
+<BLURB>predelay.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Reverb::room-size</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,5]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>room_size</NICK>
+<BLURB>room_size.</BLURB>
+<DEFAULT>2</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-Reverb::treble-cut</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[20,20000]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>treble_cut</NICK>
+<BLURB>treble_cut.</BLURB>
+<DEFAULT>5000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-RotarySpeaker::bass-speed</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[10,600]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>bass_speed</NICK>
+<BLURB>bass_speed.</BLURB>
+<DEFAULT>410</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-RotarySpeaker::mic-distance</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>mic_distance</NICK>
+<BLURB>mic_distance.</BLURB>
+<DEFAULT>0,7</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-RotarySpeaker::mod-depth</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>mod_depth</NICK>
+<BLURB>mod_depth.</BLURB>
+<DEFAULT>0,1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-RotarySpeaker::reflection</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>reflection</NICK>
+<BLURB>reflection.</BLURB>
+<DEFAULT>0,3</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-RotarySpeaker::shift</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>shift</NICK>
+<BLURB>shift.</BLURB>
+<DEFAULT>0,5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-RotarySpeaker::spacing</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>spacing</NICK>
+<BLURB>spacing.</BLURB>
+<DEFAULT>0,5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-RotarySpeaker::treble-speed</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[10,600]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>treble_speed</NICK>
+<BLURB>treble_speed.</BLURB>
+<DEFAULT>390</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-RotarySpeaker::vib-speed</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,5]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>vib_speed</NICK>
+<BLURB>vib_speed.</BLURB>
+<DEFAULT>2</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-VintageDelay::amount</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,4]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>amount</NICK>
+<BLURB>amount.</BLURB>
+<DEFAULT>0,25</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-VintageDelay::bpm</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[30,300]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>bpm</NICK>
+<BLURB>bpm.</BLURB>
+<DEFAULT>120</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-VintageDelay::dry</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,4]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>dry</NICK>
+<BLURB>dry.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-VintageDelay::feedback</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>feedback</NICK>
+<BLURB>feedback.</BLURB>
+<DEFAULT>0,5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-VintageDelay::medium</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,2]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>medium</NICK>
+<BLURB>medium.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-VintageDelay::mix-mode</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>mix_mode</NICK>
+<BLURB>mix_mode.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-VintageDelay::subdiv</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,16]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>subdiv</NICK>
+<BLURB>subdiv.</BLURB>
+<DEFAULT>4</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-VintageDelay::time-l</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,16]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>time_l</NICK>
+<BLURB>time_l.</BLURB>
+<DEFAULT>3</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>http---calf-sourceforge-net-plugins-VintageDelay::time-r</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,16]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>time_r</NICK>
+<BLURB>time_r.</BLURB>
+<DEFAULT>5</DEFAULT>
+</ARG>
+
diff --git a/docs/plugins/gst-plugins-bad-plugins.hierarchy b/docs/plugins/gst-plugins-bad-plugins.hierarchy
index daf967df..2c755d23 100644
--- a/docs/plugins/gst-plugins-bad-plugins.hierarchy
+++ b/docs/plugins/gst-plugins-bad-plugins.hierarchy
@@ -13,185 +13,527 @@ GObject
GstCameraBin
RsnDvdBin
DvbBaseBin
+ GstFPSDisplaySink
GstAutoConvert
- GstRtpBin
- GstRtpClient
GstSDPDemux
- GstFPSDisplaySink
- GstBz2enc
- GstBz2dec
- GstMplex
+ GstRtpBin
+ GstSignalProcessor
+ http---calf-sourceforge-net-plugins-Compressor
+ http---calf-sourceforge-net-plugins-Filter
+ http---calf-sourceforge-net-plugins-Filterclavier
+ http---calf-sourceforge-net-plugins-Flanger
+ http---calf-sourceforge-net-plugins-Monosynth
+ http---calf-sourceforge-net-plugins-MultiChorus
+ http---calf-sourceforge-net-plugins-Organ
+ http---calf-sourceforge-net-plugins-Phaser
+ http---calf-sourceforge-net-plugins-Reverb
+ http---calf-sourceforge-net-plugins-RotarySpeaker
+ http---calf-sourceforge-net-plugins-VintageDelay
+ ladspa-delay-5s
+ ladspa-amp-mono
+ ladspa-amp-stereo
+ ladspa-adsr
+ ladspa-lpf
+ ladspa-hpf
+ ladspa-noise-white
+ ladspa-sine-faaa
+ ladspa-sine-faac
+ ladspa-sine-fcaa
+ ladspa-sine-fcac
+ ladspa-difference-iama-oa
+ ladspa-difference-iamc-oa
+ ladspa-difference-icma-oa
+ ladspa-difference-icmc-oc
+ ladspa-adsr-g+t
+ ladspa-amp-gaia-oa
+ ladspa-amp-gcia-oa
+ ladspa-branch-ia-oaoa
+ ladspa-branch-ic-ococ
+ ladspa-dahdsr-g+t-audio
+ ladspa-dahdsr-g+t-control
+ ladspa-dahdsr-cg+t-control
+ ladspa-interpolator
+ ladspa-fmod-fama-oa
+ ladspa-fmod-famc-oa
+ ladspa-fmod-fcma-oa
+ ladspa-fmod-fcmc-oc
+ ladspa-quantiser20
+ ladspa-lp4pole-faraia-oa
+ ladspa-lp4pole-fcrcia-oa
+ ladspa-product-iaia-oa
+ ladspa-product-iaic-oa
+ ladspa-product-icic-oc
+ ladspa-pulse-fapa-oa
+ ladspa-pulse-fapc-oa
+ ladspa-pulse-fcpa-oa
+ ladspa-pulse-fcpc-oa
+ ladspa-quantiser100
+ ladspa-quantiser50
+ ladspa-sawtooth-fa-oa
+ ladspa-sawtooth-fc-oa
+ ladspa-random-fasa-oa
+ ladspa-random-fasc-oa
+ ladspa-random-fcsa-oa
+ ladspa-random-fcsc-oa
+ ladspa-ratio-nada-oa
+ ladspa-ratio-nadc-oa
+ ladspa-ratio-ncda-oa
+ ladspa-ratio-ncdc-oc
+ ladspa-sinusWavewrapper
+ ladspa-sequencer64
+ ladspa-sequencer32
+ ladspa-sequencer16
+ ladspa-square-fa-oa
+ ladspa-square-fc-oa
+ ladspa-sum-iaia-oa
+ ladspa-sum-iaic-oa
+ ladspa-sum-icic-oc
+ ladspa-syncpulse-fapaga-oa
+ ladspa-syncpulse-fcpcga-oa
+ ladspa-syncsquare-faga-oa
+ ladspa-syncsquare-fcga-oa
+ ladspa-tracker-gaaadaia-oa
+ ladspa-tracker-gaacdcia-oa
+ ladspa-triangle-fasa-oa
+ ladspa-triangle-fasc-oa
+ ladspa-triangle-fcsa-oa
+ ladspa-triangle-fcsc-oa
+ ladspa-bf2cube
+ ladspa-bf2quad
+ ladspa-bf2stereo
+ ladspa-fmh2oct
+ ladspa-encode-bformat
+ ladspa-encode-fmh
+ ladspa-bf-rotate-z
+ ladspa-fmh-rotate-z
+ ladspa-am
+ ladspa-analogue
+ ladspa-canyon-delay
+ ladspa-disintegrator
+ ladspa-sledgehammer
+ ladspa-delay-0-01s
+ ladspa-delay-0-1s
+ ladspa-delay-1s
+ ladspa-delay-60s
+ ladspa-track-max-peak
+ ladspa-track-max-rms
+ ladspa-track-peak
+ ladspa-track-rms
+ ladspa-fmh2bf
+ ladspa-fbdelay-0-01s
+ ladspa-fbdelay-0-1s
+ ladspa-fbdelay-1s
+ ladspa-fbdelay-5s
+ ladspa-fbdelay-60s
+ ladspa-freeverb3
+ ladspa-grain-scatter
+ ladspa-hard-gate
+ ladspa-identity-audio
+ ladspa-identity-control
+ ladspa-lofi
+ ladspa-logistic
+ ladspa-mixer
+ ladspa-noise-source-white
+ ladspa-null-ai
+ ladspa-null-ao
+ ladspa-null-ci
+ ladspa-null-co
+ ladspa-organ
+ ladspa-peak
+ ladspa-phasemod
+ ladspa-pink-interpolated-audio
+ ladspa-pink-full-frequency
+ ladspa-pink-sh
+ ladspa-compress-peak
+ ladspa-compress-rms
+ ladspa-expand-peak
+ ladspa-expand-rms
+ ladspa-limit-peak
+ ladspa-limit-rms
+ ladspa-syndrum
+ ladspa-vcf303
+ ladspa-wshape-sine
+ ladspa-amp
+ ladspa-diode
+ ladspa-divider
+ ladspa-shaper
+ ladspa-ringmod-2i1o
+ ladspa-ringmod-1i1o1l
+ ladspa-comb
+ ladspa-declip
+ ladspa-foverdrive
+ ladspa-multivoiceChorus
+ ladspa-hermesFilter
+ ladspa-decimator
+ ladspa-flanger
+ ladspa-retroFlange
+ ladspa-singlePara
+ ladspa-triplePara
+ ladspa-transient
+ ladspa-fadDelay
+ ladspa-dcRemove
+ ladspa-tapeDelay
+ ladspa-valve
+ ladspa-sifter
+ ladspa-harmonicGen
+ ladspa-stepMuxer
+ ladspa-foldover
+ ladspa-svf
+ ladspa-gsm
+ ladspa-gverb
+ ladspa-lfoPhaser
+ ladspa-fourByFourPole
+ ladspa-autoPhaser
+ ladspa-fastLookaheadLimiter
+ ladspa-surroundEncoder
+ ladspa-delayorama
+ ladspa-dysonCompress
+ ladspa-crossoverDist
+ ladspa-valveRect
+ ladspa-split
+ ladspa-alias
+ ladspa-satanMaximiser
+ ladspa-karaoke
+ ladspa-gate
+ ladspa-combSplitter
+ ladspa-waveTerrain
+ ladspa-hardLimiter
+ ladspa-smoothDecimate
+ ladspa-fmOsc
+ ladspa-analogueOsc
+ ladspa-rateShifter
+ ladspa-freqTracker
+ ladspa-modDelay
+ ladspa-matrixStMS
+ ladspa-matrixMSSt
+ ladspa-matrixSpatialiser
+ ladspa-plate
+ ladspa-gong
+ ladspa-sc1
+ ladspa-sc2
+ ladspa-sc3
+ ladspa-zm1
+ ladspa-inv
+ ladspa-chebstortion
+ ladspa-bodeShifter
+ ladspa-bodeShifterCV
+ ladspa-amPitchshift
+ ladspa-sc4
+ ladspa-lcrDelay
+ ladspa-giantFlange
+ ladspa-djFlanger
+ ladspa-gongBeater
+ ladspa-hilbert
+ ladspa-sinCos
+ ladspa-se4
+ ladspa-bandpass-a-iir
+ ladspa-bandpass-iir
+ ladspa-highpass-iir
+ ladspa-lowpass-iir
+ ladspa-notch-iir
+ ladspa-dj-eq-mono
+ ladspa-dj-eq
+ ladspa-bwxover-iir
+ ladspa-buttlow-iir
+ ladspa-butthigh-iir
+ ladspa-allpass-n
+ ladspa-allpass-l
+ ladspa-allpass-c
+ ladspa-comb-n
+ ladspa-comb-l
+ ladspa-comb-c
+ ladspa-decay
+ ladspa-delay-n
+ ladspa-delay-l
+ ladspa-delay-c
+ ladspa-impulse-fc
+ ladspa-vynil
+ ladspa-revdelay
+ ladspa-lsFilter
+ ladspa-const
+ ladspa-pointerCastDistortion
+ ladspa-pitchScale
+ ladspa-artificialLatency
+ ladspa-xfade
+ ladspa-xfade4
+ ladspa-sc4m
+ ladspa-mbeq
+ ladspa-formant-vc
+ ladspa-pitchScaleHQ
+ ladspa-imp
+ ladspa-Parametric1
+ ladspa-jaminController
+ ladspa-Chorus1
+ ladspa-Chorus2
+ ladspa-Phaser1
+ ladspa-Phaser1+LFO
+ ladspa-Mvchpf-1
+ ladspa-Mvclpf-1
+ ladspa-Mvclpf-2
+ ladspa-Mvclpf-3
+ ladspa-Mvclpf-4
+ ladspa-G2reverb
+ ladspa-Pulse-VCO
+ ladspa-Saw-VCO
+ ladspa-Rec-VCO
+ ladspa-Sync-Saw-VCO
+ ladspa-Sync-Rect-VCO
+ ladspa-Sync-Tri-VCO
+ ladspa-hz-voct-cr
+ ladspa-hz-voct-ar
+ ladspa-range-trans-cr
+ ladspa-range-trans-ar
+ ladspa-adenv-lvl
+ ladspa-adenv
+ ladspa-prob-switch-cr
+ ladspa-prob-switch-ar
+ ladspa-dahdsr-fexp
+ ladspa-dahdsr-hexp
+ ladspa-slew-limiter-ra
+ ladspa-slew-limiter-rc
+ ladspa-signal-abs-cr
+ ladspa-signal-abs-ar
+ ladspa-slide-ta
+ ladspa-slide-tc
+ ladspa-Eq
+ ladspa-Eq2x2
+ ladspa-Compress
+ ladspa-Pan
+ ladspa-PreampIII
+ ladspa-PreampIV
+ ladspa-ToneStack
+ ladspa-ToneStackLT
+ ladspa-AmpIII
+ ladspa-AmpIV
+ ladspa-AmpV
+ ladspa-AmpVTS
+ ladspa-CabinetI
+ ladspa-CabinetII
+ ladspa-Clip
+ ladspa-ChorusI
+ ladspa-StereoChorusI
+ ladspa-ChorusII
+ ladspa-StereoChorusII
+ ladspa-PhaserI
+ ladspa-PhaserII
+ ladspa-SweepVFI
+ ladspa-SweepVFII
+ ladspa-AutoWah
+ ladspa-Scape
+ ladspa-VCOs
+ ladspa-VCOd
+ ladspa-CEO
+ ladspa-Sin
+ ladspa-White
+ ladspa-Lorenz
+ ladspa-Roessler
+ ladspa-JVRev
+ ladspa-Plate
+ ladspa-Plate2x2
+ ladspa-Click
+ ladspa-Dirac
+ ladspa-HRTF
+ ladspa-wg-mesh-cr
+ ladspa-fast-xfade
+ ladspa-mux-cr
+ ladspa-mux-ar
+ ladspa-power-cr
+ ladspa-power
+ ladspa-ssm-masher
+ ladspa-sh-cr
+ ladspa-sh-ar
+ ladspa-tap-stereo-echo
+ ladspa-comp-ac
+ ladspa-comp-aa
+ ladspa-tap-autopan
+ ladspa-tap-chorusflanger
+ ladspa-tap-deesser
+ ladspa-tap-doubler
+ ladspa-tap-dynamics-m
+ ladspa-tap-dynamics-st
+ ladspa-tap-equalizer
+ ladspa-tap-equalizer-bw
+ ladspa-tap-limiter
+ ladspa-tap-pinknoise
+ ladspa-tap-pitch
+ ladspa-tap-reflector
+ ladspa-tap-reverb
+ ladspa-tap-rotspeak
+ ladspa-tap-sigmoid
+ ladspa-tap-tremolo
+ ladspa-tap-tubewarmth
+ ladspa-tap-vibrato
+ ladspa-Filter
+ ladspa-Filterclavier
+ ladspa-Flanger
+ ladspa-Reverb
+ ladspa-VintageDelay
+ ladspa-RotarySpeaker
+ ladspa-Phaser
+ ladspa-MultiChorus
+ ladspa-Compressor
+ GstModPlug
+ GstXvidEnc
+ GstXvidDec
+ GstWildmidi
+ GstTimidity
+ GstSpcDec
+ GstPitch
+ GstBaseTransform
+ GstAudioFilter
+ GstBPMDetect
+ GstStereo
+ GstHDVParse
+ GstCapsSetter
+ GstLegacyresample
+ GstVideoFilter
+ GstVideoAnalyse
+ GstVideoDetect
+ GstVideoMark
+ GstScaletempo
+ GstBayer2RGB
+ GstBaseSink
+ GstSFSink
+ GstVideoSink
+ GstSDLVideoSink
+ GstDfbVideoSink
+ GstBaseAudioSink
+ GstAudioSink
+ GstSDLAudioSink
+ GstNasSink
+ GstApExSink
+ GstOss4Sink
+ GstJackAudioSink
+ AlsaSPDIFSink
+ GstFBDEVSink
+ GstDCCPServerSink
+ GstDCCPClientSink
GstBaseSrc
+ GstSFSrc
GstPushSrc
GstNeonhttpSrc
GstMythtvSrc
- GstDc1394
GstMMS
GstBaseAudioSrc
GstJackAudioSrc
GstAudioSrc
GstOss4Source
+ GstDc1394
GstVCDSrc
GstDvbSrc
+ GstRfbSrc
GstDCCPClientSrc
GstDCCPServerSrc
- GstRfbSrc
- GstSFSrc
GstDTMFSrc
GstRTPDTMFSrc
- GstCDAudio
- GstBaseSink
- GstVideoSink
- GstDfbVideoSink
- GstSDLVideoSink
- GstBaseAudioSink
- GstAudioSink
- GstSDLAudioSink
- GstApExSink
- GstNasSink
- GstOss4Sink
- GstJackAudioSink
- GstSFSink
- AlsaSPDIFSink
- GstFBDEVSink
- GstDCCPServerSink
- GstDCCPClientSink
- GstFaad
- GstCeltEnc
- GstCeltDec
- GstSpcDec
- GstWildmidi
- GstBaseTransform
- GstAudioFilter
- GstOFA
- GstBPMDetect
- GstStereo
- GstBayer2RGB
- GstScaletempo
- GstHDVParse
- GstDeinterlace
- GstVideoFilter
- GstVideoAnalyse
- GstVideoDetect
- GstVideoMark
- GstIIR
- GstLegacyresample
- GstCapsSetter
- GstSignalProcessor
- ladspa-noise-white
- ladspa-delay-5s
- ladspa-amp-mono
- ladspa-amp-stereo
- ladspa-sine-faaa
- ladspa-sine-faac
- ladspa-sine-fcaa
- ladspa-sine-fcac
- ladspa-lpf
- ladspa-hpf
- GstXvidEnc
- GstXvidDec
- GstPitch
+ GstTRM
GstMusepackDec
+ GstMplex
GstMpeg2enc
+ GstBaseMetadata
+ GstMetadataDemux
+ GstMetadataMux
GstGSMEnc
GstGSMDec
+ GstFaad
GstFaac
GstDtsDec
- Gstassrender
- GstDiracEnc
- GstTRM
- GstBaseMetadata
- GstMetadataDemux
- GstMetadataMux
+ GstCeltEnc
+ GstCeltDec
+ GstCDAudio
+ GstBz2enc
+ GstBz2dec
+ GstAmrwbDec
+ GstAmrwbParse
+ GstAmrwbEnc
GstOss4Mixer
- GstAmrBaseParse
- GstAmrParse
- GstFestival
- GstModPlug
- ADPCMDec
- GstMveDemux
- GstMveMux
- GstSrtEnc
- GstMpeg4VParse
- GstCDXAParse
- GstVcdParse
- GstNsfDec
+ GstShapeWipe
+ GstValve
GstSirenDec
GstSirenEnc
- MpegTsMux
- GstRealVideoDec
- GstRealAudioDec
GstRTPMux
GstRTPDTMFMux
- GstRawParse
- GstVideoParse
- GstAudioParse
+ GstLiveAdder
+ GstBaseRTPDepayload
+ GstRtpDTMFDepay
+ GstId3BaseMux
+ GstId3Mux
+ GstVMncDec
+ GstTtaParse
+ GstTtaDec
+ GstSrtEnc
+ ADPCMDec
+ GstSpeed
+ GstInputSelector
+ GstOutputSelector
GstRtpJitterBuffer
GstRtpPtDemux
GstRtpSession
GstRtpSsrcDemux
- GstPcapParse
- GstInputSelector
- GstOutputSelector
- GstAacBaseParse
- GstAacParse
- GstVMncDec
+ GstRealVideoDec
+ GstRealAudioDec
+ GstRawParse
+ GstVideoParse
+ GstAudioParse
GstQTMux
GstMP4Mux
GstGPPMux
GstMJ2Mux
- MpegVideoParse
- GstH264Parse
+ GstPcapParse
+ GstNuvDemux
+ GstNsfDec
GstMXFDemux
GstMXFMux
- GstSpeed
- GstFreeze
- GstId3BaseMux
- GstId3Mux
- GstDVDSpu
- AIFFParse
- GstTtaParse
- GstTtaDec
- GstLiveAdder
- GstValve
- GstBaseRTPDepayload
- GstRtpDTMFDepay
- GstNuvDemux
- GstShapeWipe
- GstFLVDemux
- GstFlvMux
+ GstMveDemux
+ GstMveMux
+ MpegVideoParse
+ MpegTsMux
GstMpegPSDemux
GstMpegTSDemux
MpegTSParse
- GstDeinterlace2
+ GstMpeg4VParse
+ GstH264Parse
+ GstFreeze
+ GstFestival
+ GstDVDSpu
+ GstCDXAParse
+ GstVcdParse
+ GstAmrBaseParse
+ GstAmrParse
+ AIFFParse
+ GstAacBaseParse
+ GstAacParse
GstBus
GstTask
+ GstTaskPool
GstClock
GstSystemClock
GstAudioClock
GstPlugin
GstRegistry
GstRingBuffer
+ GstAudioSinkRingBuffer
+ GstAudioSrcRingBuffer
GstJackAudioSrcRingBuffer
GstJackAudioSinkRingBuffer
GstSignalObject
+ MpegTsPatInfo
+ MpegTsPmtInfo
+ RTPSession
GstColorBalanceChannel
GstMixerTrack
GstMixerOptions
- RTPSession
- MpegTsPatInfo
- MpegTsPmtInfo
GInterface
GTypePlugin
GstChildProxy
GstURIHandler
+ GstPreset
GstImplementsInterface
- GstNavigation
- GstColorBalance
GstXOverlay
+ GstNavigation
GstTagSetter
- GstPreset
+ GstColorBalance
GstMixer
GstPropertyProbe
- MXFDescriptiveMetadataFrameworkInterface
GstPhotography
+ MXFDescriptiveMetadataFrameworkInterface
diff --git a/docs/plugins/gst-plugins-bad-plugins.interfaces b/docs/plugins/gst-plugins-bad-plugins.interfaces
index 53172c4b..fbec62e0 100644
--- a/docs/plugins/gst-plugins-bad-plugins.interfaces
+++ b/docs/plugins/gst-plugins-bad-plugins.interfaces
@@ -1,35 +1,31 @@
GstBin GstChildProxy
GstPipeline GstChildProxy
-GstCameraBin GstChildProxy GstImplementsInterface GstColorBalance GstTagSetter GstPhotography
-RsnDvdBin GstChildProxy GstURIHandler
-DvbBaseBin GstChildProxy GstURIHandler
+GstCameraBin GstChildProxy GstImplementsInterface GstTagSetter GstColorBalance GstPhotography
+RsnDvdBin GstURIHandler GstChildProxy
+DvbBaseBin GstURIHandler GstChildProxy
+GstFPSDisplaySink GstChildProxy
GstAutoConvert GstChildProxy
-GstRtpBin GstChildProxy
-GstRtpClient GstChildProxy
GstSDPDemux GstChildProxy
-GstFPSDisplaySink GstChildProxy
+GstRtpBin GstChildProxy
+GstXvidEnc GstPreset
+GstSDLVideoSink GstImplementsInterface GstXOverlay GstNavigation
+GstDfbVideoSink GstImplementsInterface GstNavigation GstColorBalance
+GstApExSink GstImplementsInterface GstMixer
+GstOss4Sink GstPropertyProbe
GstNeonhttpSrc GstURIHandler
GstMythtvSrc GstURIHandler
GstMMS GstURIHandler
-GstOss4Source GstImplementsInterface GstMixer GstPropertyProbe
+GstOss4Source GstImplementsInterface GstPropertyProbe GstMixer
GstVCDSrc GstURIHandler
-GstCDAudio GstURIHandler
-GstDfbVideoSink GstImplementsInterface GstNavigation GstColorBalance
-GstSDLVideoSink GstImplementsInterface GstNavigation GstXOverlay
-GstApExSink GstImplementsInterface GstMixer
-GstOss4Sink GstPropertyProbe
-GstCeltEnc GstTagSetter GstPreset
-GstXvidEnc GstPreset
GstMpeg2enc GstPreset
-GstFaac GstPreset
-GstDiracEnc GstPreset
GstMetadataMux GstTagSetter
-GstOss4Mixer GstImplementsInterface GstMixer GstPropertyProbe
+GstFaac GstPreset
+GstCeltEnc GstPreset GstTagSetter
+GstCDAudio GstURIHandler
+GstOss4Mixer GstImplementsInterface GstPropertyProbe GstMixer
+GstId3BaseMux GstTagSetter
+GstId3Mux GstTagSetter
GstQTMux GstTagSetter
GstMP4Mux GstTagSetter
GstGPPMux GstTagSetter
GstMJ2Mux GstTagSetter
-GstId3BaseMux GstTagSetter
-GstId3Mux GstTagSetter
-GstFlvMux GstTagSetter
-GstDeinterlace2 GstChildProxy
diff --git a/docs/plugins/gst-plugins-bad-plugins.prerequisites b/docs/plugins/gst-plugins-bad-plugins.prerequisites
index fa02d4b9..c676c6b6 100644
--- a/docs/plugins/gst-plugins-bad-plugins.prerequisites
+++ b/docs/plugins/gst-plugins-bad-plugins.prerequisites
@@ -1,8 +1,8 @@
GstChildProxy GstObject
-GstImplementsInterface GstElement
-GstColorBalance GstImplementsInterface GstElement
-GstXOverlay GstImplementsInterface GstElement
-GstTagSetter GstElement
-GstMixer GstImplementsInterface GstElement
+GstImplementsInterface GstObject GstElement
+GstXOverlay GstObject GstImplementsInterface GstElement
+GstTagSetter GstObject GstElement
+GstColorBalance GstObject GstImplementsInterface GstElement
+GstMixer GstObject GstImplementsInterface GstElement
+GstPhotography GstObject GstImplementsInterface GstElement
MXFDescriptiveMetadataFrameworkInterface MXFDescriptiveMetadata
-GstPhotography GstImplementsInterface GstElement
diff --git a/docs/plugins/inspect/plugin-aacparse.xml b/docs/plugins/inspect/plugin-aacparse.xml
index 364edec5..7678591f 100644
--- a/docs/plugins/inspect/plugin-aacparse.xml
+++ b/docs/plugins/inspect/plugin-aacparse.xml
@@ -3,11 +3,11 @@
<description>Advanced Audio Coding Parser</description>
<filename>../../gst/aacparse/.libs/libgstaacparse.so</filename>
<basename>libgstaacparse.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>aacparse</name>
diff --git a/docs/plugins/inspect/plugin-adpcmdec.xml b/docs/plugins/inspect/plugin-adpcmdec.xml
index 08f2a20b..2526e798 100644
--- a/docs/plugins/inspect/plugin-adpcmdec.xml
+++ b/docs/plugins/inspect/plugin-adpcmdec.xml
@@ -3,11 +3,11 @@
<description>ADPCM decoder</description>
<filename>../../gst/adpcmdec/.libs/libgstadpcmdec.so</filename>
<basename>libgstadpcmdec.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>msadpcmdec</name>
diff --git a/docs/plugins/inspect/plugin-aiffparse.xml b/docs/plugins/inspect/plugin-aiffparse.xml
index 9f627a4d..d161d133 100644
--- a/docs/plugins/inspect/plugin-aiffparse.xml
+++ b/docs/plugins/inspect/plugin-aiffparse.xml
@@ -3,11 +3,11 @@
<description>Parse an .aiff file into raw audio</description>
<filename>../../gst/aiffparse/.libs/libgstaiffparse.so</filename>
<basename>libgstaiffparse.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>aiffparse</name>
diff --git a/docs/plugins/inspect/plugin-alsaspdif.xml b/docs/plugins/inspect/plugin-alsaspdif.xml
index 48b87e16..42ce1b73 100644
--- a/docs/plugins/inspect/plugin-alsaspdif.xml
+++ b/docs/plugins/inspect/plugin-alsaspdif.xml
@@ -3,11 +3,11 @@
<description>Alsa plugin for S/PDIF output</description>
<filename>../../ext/alsaspdif/.libs/libgstalsaspdif.so</filename>
<basename>libgstalsaspdif.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>alsaspdifsink</name>
diff --git a/docs/plugins/inspect/plugin-amrparse.xml b/docs/plugins/inspect/plugin-amrparse.xml
index 0404fcaa..31dcdb82 100644
--- a/docs/plugins/inspect/plugin-amrparse.xml
+++ b/docs/plugins/inspect/plugin-amrparse.xml
@@ -3,11 +3,11 @@
<description>Adaptive Multi-Rate Parser</description>
<filename>../../gst/amrparse/.libs/libgstamrparse.so</filename>
<basename>libgstamrparse.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>amrparse</name>
diff --git a/docs/plugins/inspect/plugin-amrwb.xml b/docs/plugins/inspect/plugin-amrwb.xml
index 4862a31c..bd617351 100644
--- a/docs/plugins/inspect/plugin-amrwb.xml
+++ b/docs/plugins/inspect/plugin-amrwb.xml
@@ -3,11 +3,11 @@
<description>Adaptive Multi-Rate Wide-Band</description>
<filename>../../ext/amrwb/.libs/libgstamrwb.so</filename>
<basename>libgstamrwb.so</basename>
- <version>0.10.12.1</version>
+ <version>0.10.13.1</version>
<license>unknown</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins git/prerelease</package>
- <origin>Unknown package origin</origin>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>amrwbdec</name>
diff --git a/docs/plugins/inspect/plugin-apex.xml b/docs/plugins/inspect/plugin-apex.xml
index 66e91255..f216e275 100644
--- a/docs/plugins/inspect/plugin-apex.xml
+++ b/docs/plugins/inspect/plugin-apex.xml
@@ -3,11 +3,11 @@
<description>Apple AirPort Express Plugin</description>
<filename>../../ext/apexsink/.libs/libgstapexsink.so</filename>
<basename>libgstapexsink.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>apexsink</name>
diff --git a/docs/plugins/inspect/plugin-autoconvert.xml b/docs/plugins/inspect/plugin-autoconvert.xml
index b5f3e951..5c4f274b 100644
--- a/docs/plugins/inspect/plugin-autoconvert.xml
+++ b/docs/plugins/inspect/plugin-autoconvert.xml
@@ -3,11 +3,11 @@
<description>Selects convertor element based on caps</description>
<filename>../../gst/autoconvert/.libs/libgstautoconvert.so</filename>
<basename>libgstautoconvert.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>autoconvert</name>
diff --git a/docs/plugins/inspect/plugin-bayer.xml b/docs/plugins/inspect/plugin-bayer.xml
index 9f955014..3f2c0930 100644
--- a/docs/plugins/inspect/plugin-bayer.xml
+++ b/docs/plugins/inspect/plugin-bayer.xml
@@ -3,11 +3,11 @@
<description>Elements to convert Bayer images</description>
<filename>../../gst/bayer/.libs/libgstbayer.so</filename>
<basename>libgstbayer.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>bayer2rgb</name>
diff --git a/docs/plugins/inspect/plugin-bz2.xml b/docs/plugins/inspect/plugin-bz2.xml
index 35d9dd57..d1755542 100644
--- a/docs/plugins/inspect/plugin-bz2.xml
+++ b/docs/plugins/inspect/plugin-bz2.xml
@@ -3,11 +3,11 @@
<description>Compress or decompress streams</description>
<filename>../../ext/bz2/.libs/libgstbz2.so</filename>
<basename>libgstbz2.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>bz2dec</name>
diff --git a/docs/plugins/inspect/plugin-camerabin.xml b/docs/plugins/inspect/plugin-camerabin.xml
index e977df97..b724d4b5 100644
--- a/docs/plugins/inspect/plugin-camerabin.xml
+++ b/docs/plugins/inspect/plugin-camerabin.xml
@@ -3,11 +3,11 @@
<description>High level api for DC (Digital Camera) application</description>
<filename>../../gst/camerabin/.libs/libgstcamerabin.so</filename>
<basename>libgstcamerabin.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>camerabin</name>
diff --git a/docs/plugins/inspect/plugin-cdaudio.xml b/docs/plugins/inspect/plugin-cdaudio.xml
index 349de576..39fe66ee 100644
--- a/docs/plugins/inspect/plugin-cdaudio.xml
+++ b/docs/plugins/inspect/plugin-cdaudio.xml
@@ -3,11 +3,11 @@
<description>Play CD audio through the CD Drive</description>
<filename>../../ext/cdaudio/.libs/libgstcdaudio.so</filename>
<basename>libgstcdaudio.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>cdaudio</name>
diff --git a/docs/plugins/inspect/plugin-cdxaparse.xml b/docs/plugins/inspect/plugin-cdxaparse.xml
index d81ff8b1..f096ff54 100644
--- a/docs/plugins/inspect/plugin-cdxaparse.xml
+++ b/docs/plugins/inspect/plugin-cdxaparse.xml
@@ -3,11 +3,11 @@
<description>Parse a .dat file (VCD) into raw mpeg1</description>
<filename>../../gst/cdxaparse/.libs/libgstcdxaparse.so</filename>
<basename>libgstcdxaparse.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>cdxaparse</name>
diff --git a/docs/plugins/inspect/plugin-celt.xml b/docs/plugins/inspect/plugin-celt.xml
index 074b128d..8b90ea1e 100644
--- a/docs/plugins/inspect/plugin-celt.xml
+++ b/docs/plugins/inspect/plugin-celt.xml
@@ -3,11 +3,11 @@
<description>CELT plugin library</description>
<filename>../../ext/celt/.libs/libgstcelt.so</filename>
<basename>libgstcelt.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>celtdec</name>
diff --git a/docs/plugins/inspect/plugin-dc1394.xml b/docs/plugins/inspect/plugin-dc1394.xml
index 73555d9b..955fba97 100644
--- a/docs/plugins/inspect/plugin-dc1394.xml
+++ b/docs/plugins/inspect/plugin-dc1394.xml
@@ -3,11 +3,11 @@
<description>1394 IIDC Video Source</description>
<filename>../../ext/dc1394/.libs/libgstdc1394.so</filename>
<basename>libgstdc1394.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>dc1394src</name>
diff --git a/docs/plugins/inspect/plugin-dccp.xml b/docs/plugins/inspect/plugin-dccp.xml
index becc5623..7c896559 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.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>DCCP</package>
diff --git a/docs/plugins/inspect/plugin-debugutilsbad.xml b/docs/plugins/inspect/plugin-debugutilsbad.xml
index ff6d4b92..f315f3d1 100644
--- a/docs/plugins/inspect/plugin-debugutilsbad.xml
+++ b/docs/plugins/inspect/plugin-debugutilsbad.xml
@@ -3,11 +3,11 @@
<description>Collection of elements that may or may not be useful for debugging</description>
<filename>../../gst/debugutils/.libs/libgstdebugutilsbad.so</filename>
<basename>libgstdebugutilsbad.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>capssetter</name>
diff --git a/docs/plugins/inspect/plugin-dfbvideosink.xml b/docs/plugins/inspect/plugin-dfbvideosink.xml
index f0b3848b..9f5f9415 100644
--- a/docs/plugins/inspect/plugin-dfbvideosink.xml
+++ b/docs/plugins/inspect/plugin-dfbvideosink.xml
@@ -3,11 +3,11 @@
<description>DirectFB video output plugin</description>
<filename>../../ext/directfb/.libs/libgstdfbvideosink.so</filename>
<basename>libgstdfbvideosink.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>dfbvideosink</name>
diff --git a/docs/plugins/inspect/plugin-dtmf.xml b/docs/plugins/inspect/plugin-dtmf.xml
index ee1c3ac5..1ed26490 100644
--- a/docs/plugins/inspect/plugin-dtmf.xml
+++ b/docs/plugins/inspect/plugin-dtmf.xml
@@ -3,11 +3,11 @@
<description>DTMF plugins</description>
<filename>../../gst/dtmf/.libs/libgstdtmf.so</filename>
<basename>libgstdtmf.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>dtmfsrc</name>
diff --git a/docs/plugins/inspect/plugin-dtsdec.xml b/docs/plugins/inspect/plugin-dtsdec.xml
index fb6462b2..a55cb362 100644
--- a/docs/plugins/inspect/plugin-dtsdec.xml
+++ b/docs/plugins/inspect/plugin-dtsdec.xml
@@ -3,11 +3,11 @@
<description>Decodes DTS audio streams</description>
<filename>../../ext/dts/.libs/libgstdtsdec.so</filename>
<basename>libgstdtsdec.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>GPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>dtsdec</name>
diff --git a/docs/plugins/inspect/plugin-dvb.xml b/docs/plugins/inspect/plugin-dvb.xml
index cb63c4e7..c80022ae 100644
--- a/docs/plugins/inspect/plugin-dvb.xml
+++ b/docs/plugins/inspect/plugin-dvb.xml
@@ -3,11 +3,11 @@
<description>DVB elements</description>
<filename>../../sys/dvb/.libs/libgstdvb.so</filename>
<basename>libgstdvb.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>dvbbasebin</name>
diff --git a/docs/plugins/inspect/plugin-dvdspu.xml b/docs/plugins/inspect/plugin-dvdspu.xml
index 1bec7c6b..b1410201 100644
--- a/docs/plugins/inspect/plugin-dvdspu.xml
+++ b/docs/plugins/inspect/plugin-dvdspu.xml
@@ -3,11 +3,11 @@
<description>DVD Sub-picture Overlay element</description>
<filename>../../gst/dvdspu/.libs/libgstdvdspu.so</filename>
<basename>libgstdvdspu.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>dvdspu</name>
diff --git a/docs/plugins/inspect/plugin-faac.xml b/docs/plugins/inspect/plugin-faac.xml
index 504cc910..5cb36811 100644
--- a/docs/plugins/inspect/plugin-faac.xml
+++ b/docs/plugins/inspect/plugin-faac.xml
@@ -3,11 +3,11 @@
<description>Free AAC Encoder (FAAC)</description>
<filename>../../ext/faac/.libs/libgstfaac.so</filename>
<basename>libgstfaac.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>faac</name>
diff --git a/docs/plugins/inspect/plugin-faad.xml b/docs/plugins/inspect/plugin-faad.xml
index 7ff0ca70..ad0e3c0a 100644
--- a/docs/plugins/inspect/plugin-faad.xml
+++ b/docs/plugins/inspect/plugin-faad.xml
@@ -3,11 +3,11 @@
<description>Free AAC Decoder (FAAD)</description>
<filename>../../ext/faad/.libs/libgstfaad.so</filename>
<basename>libgstfaad.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>GPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>faad</name>
diff --git a/docs/plugins/inspect/plugin-fbdevsink.xml b/docs/plugins/inspect/plugin-fbdevsink.xml
index 6f1aea55..041959cf 100644
--- a/docs/plugins/inspect/plugin-fbdevsink.xml
+++ b/docs/plugins/inspect/plugin-fbdevsink.xml
@@ -3,11 +3,11 @@
<description>linux framebuffer video sink</description>
<filename>../../sys/fbdev/.libs/libgstfbdevsink.so</filename>
<basename>libgstfbdevsink.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>fbdevsink</name>
diff --git a/docs/plugins/inspect/plugin-festival.xml b/docs/plugins/inspect/plugin-festival.xml
index 272869ad..2ff7f846 100644
--- a/docs/plugins/inspect/plugin-festival.xml
+++ b/docs/plugins/inspect/plugin-festival.xml
@@ -3,11 +3,11 @@
<description>Synthesizes plain text into audio</description>
<filename>../../gst/festival/.libs/libgstfestival.so</filename>
<basename>libgstfestival.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>festival</name>
diff --git a/docs/plugins/inspect/plugin-freeze.xml b/docs/plugins/inspect/plugin-freeze.xml
index 636b0eee..a32a827a 100644
--- a/docs/plugins/inspect/plugin-freeze.xml
+++ b/docs/plugins/inspect/plugin-freeze.xml
@@ -3,11 +3,11 @@
<description>Stream freezer</description>
<filename>../../gst/freeze/.libs/libgstfreeze.so</filename>
<basename>libgstfreeze.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>freeze</name>
diff --git a/docs/plugins/inspect/plugin-frei0r.xml b/docs/plugins/inspect/plugin-frei0r.xml
new file mode 100644
index 00000000..2167f79b
--- /dev/null
+++ b/docs/plugins/inspect/plugin-frei0r.xml
@@ -0,0 +1,14 @@
+<plugin>
+ <name>frei0r</name>
+ <description>frei0r plugin library</description>
+ <filename>../../gst/frei0r/.libs/libgstfrei0r.so</filename>
+ <basename>libgstfrei0r.so</basename>
+ <version>0.10.13.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-bad</source>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
+ <elements>
+
+ </elements>
+</plugin> \ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-gsm.xml b/docs/plugins/inspect/plugin-gsm.xml
index b2b0f727..62b2e275 100644
--- a/docs/plugins/inspect/plugin-gsm.xml
+++ b/docs/plugins/inspect/plugin-gsm.xml
@@ -3,11 +3,11 @@
<description>GSM encoder/decoder</description>
<filename>../../ext/gsm/.libs/libgstgsm.so</filename>
<basename>libgstgsm.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>gsmdec</name>
diff --git a/docs/plugins/inspect/plugin-gstrtpmanager.xml b/docs/plugins/inspect/plugin-gstrtpmanager.xml
index 3aa25c22..82e96115 100644
--- a/docs/plugins/inspect/plugin-gstrtpmanager.xml
+++ b/docs/plugins/inspect/plugin-gstrtpmanager.xml
@@ -3,11 +3,11 @@
<description>RTP session management plugin library</description>
<filename>../../gst/rtpmanager/.libs/libgstrtpmanager.so</filename>
<basename>libgstrtpmanager.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>gstrtpbin</name>
@@ -55,33 +55,6 @@
</pads>
</element>
<element>
- <name>gstrtpclient</name>
- <longname>RTP Client</longname>
- <class>Filter/Network/RTP</class>
- <description>Implement an RTP client</description>
- <author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
- <pads>
- <caps>
- <name>rtp_src_%d_%d</name>
- <direction>source</direction>
- <presence>sometimes</presence>
- <details>application/x-rtp</details>
- </caps>
- <caps>
- <name>sync_sink_%d</name>
- <direction>sink</direction>
- <presence>request</presence>
- <details>application/x-rtcp</details>
- </caps>
- <caps>
- <name>rtp_sink_%d</name>
- <direction>sink</direction>
- <presence>request</presence>
- <details>application/x-rtp</details>
- </caps>
- </pads>
- </element>
- <element>
<name>gstrtpjitterbuffer</name>
<longname>RTP packet jitter-buffer</longname>
<class>Filter/Network/RTP</class>
diff --git a/docs/plugins/inspect/plugin-gstsiren.xml b/docs/plugins/inspect/plugin-gstsiren.xml
index 3659161a..2545d7c2 100644
--- a/docs/plugins/inspect/plugin-gstsiren.xml
+++ b/docs/plugins/inspect/plugin-gstsiren.xml
@@ -3,11 +3,11 @@
<description>Siren encoder/decoder/payloader/depayloader plugins</description>
<filename>../../gst/siren/.libs/libgstsiren.so</filename>
<basename>libgstsiren.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>sirendec</name>
diff --git a/docs/plugins/inspect/plugin-h264parse.xml b/docs/plugins/inspect/plugin-h264parse.xml
index 065b9d3d..8007043b 100644
--- a/docs/plugins/inspect/plugin-h264parse.xml
+++ b/docs/plugins/inspect/plugin-h264parse.xml
@@ -3,11 +3,11 @@
<description>Element parsing raw h264 streams</description>
<filename>../../gst/h264parse/.libs/libgsth264parse.so</filename>
<basename>libgsth264parse.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>h264parse</name>
diff --git a/docs/plugins/inspect/plugin-hdvparse.xml b/docs/plugins/inspect/plugin-hdvparse.xml
index 12ec2108..cd057d2a 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.13</version>
+ <version>0.10.13.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 0884e332..0710b594 100644
--- a/docs/plugins/inspect/plugin-id3tag.xml
+++ b/docs/plugins/inspect/plugin-id3tag.xml
@@ -3,11 +3,11 @@
<description>ID3 v1 and v2 muxing plugin</description>
<filename>../../gst/id3tag/.libs/libgstid3tag.so</filename>
<basename>libgstid3tag.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>id3mux</name>
diff --git a/docs/plugins/inspect/plugin-jack.xml b/docs/plugins/inspect/plugin-jack.xml
index e1fd47b3..359dff70 100644
--- a/docs/plugins/inspect/plugin-jack.xml
+++ b/docs/plugins/inspect/plugin-jack.xml
@@ -3,11 +3,11 @@
<description>Jack elements</description>
<filename>../../ext/jack/.libs/libgstjack.so</filename>
<basename>libgstjack.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>jackaudiosink</name>
diff --git a/docs/plugins/inspect/plugin-kate.xml b/docs/plugins/inspect/plugin-kate.xml
new file mode 100644
index 00000000..ee3dccbc
--- /dev/null
+++ b/docs/plugins/inspect/plugin-kate.xml
@@ -0,0 +1,124 @@
+<plugin>
+ <name>kate</name>
+ <description>Kate plugin</description>
+ <filename>../../ext/kate/.libs/libgstkate.so</filename>
+ <basename>libgstkate.so</basename>
+ <version>0.10.13.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-bad</source>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>katedec</name>
+ <longname>Kate stream text decoder</longname>
+ <class>Codec/Decoder/Subtitle</class>
+ <description>Decodes Kate text streams</description>
+ <author>Vincent Penquerc'h &lt;ogg.k.ogg.k@googlemail.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>subtitle/x-kate</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>text/plain; text/x-pango-markup</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>kateenc</name>
+ <longname>Kate stream encoder</longname>
+ <class>Codec/Encoder/Subtitle</class>
+ <description>Encodes Kate streams from text or subpictures</description>
+ <author>Vincent Penquerc'h &lt;ogg.k.ogg.k@googlemail.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>text/plain; text/x-pango-markup; video/x-dvd-subpicture</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>subtitle/x-kate; application/x-kate</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>kateparse</name>
+ <longname>Kate stream parser</longname>
+ <class>Codec/Parser/Subtitle</class>
+ <description>parse raw kate streams</description>
+ <author>Vincent Penquerc'h &lt;ogg.k.ogg.k at googlemail dot com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>subtitle/x-kate; application/x-kate</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>subtitle/x-kate; application/x-kate</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>katetag</name>
+ <longname>Kate stream tagger</longname>
+ <class>Formatter/Metadata</class>
+ <description>Retags kate streams</description>
+ <author>Vincent Penquerc'h &lt;ogg.k.ogg.k@googlemail.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>subtitle/x-kate; application/x-kate</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>subtitle/x-kate; application/x-kate</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>tiger</name>
+ <longname>Kate stream renderer</longname>
+ <class>Codec/Decoder/Video/Overlay</class>
+ <description>Decodes and renders Kate streams on top of a video</description>
+ <author>Vincent Penquerc'h &lt;ogg.k.ogg.k@googlemail.com&gt;</author>
+ <pads>
+ <caps>
+ <name>video_sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)24</details>
+ </caps>
+ <caps>
+ <name>kate_sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>subtitle/x-kate; application/x-kate</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)24</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 8a89a980..c3b5cbbf 100644
--- a/docs/plugins/inspect/plugin-ladspa.xml
+++ b/docs/plugins/inspect/plugin-ladspa.xml
@@ -3,13 +3,2038 @@
<description>All LADSPA plugins</description>
<filename>../../ext/ladspa/.libs/libgstladspa.so</filename>
<basename>libgstladspa.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
+ <name>ladspa-AmpIII</name>
+ <longname>C* AmpIII - Tube amp</longname>
+ <class>Filter/Effect/Audio/LADSPA/Simulators</class>
+ <description>C* AmpIII - Tube amp</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-AmpIV</name>
+ <longname>C* AmpIV - Tube amp + tone controls</longname>
+ <class>Filter/Effect/Audio/LADSPA/Simulators</class>
+ <description>C* AmpIV - Tube amp + tone controls</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-AmpV</name>
+ <longname>C* AmpV - Tube amp</longname>
+ <class>Filter/Effect/Audio/LADSPA/Simulators</class>
+ <description>C* AmpV - Tube amp</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-AmpVTS</name>
+ <longname>C* AmpVTS - Tube amp + Tone stack</longname>
+ <class>Filter/Effect/Audio/LADSPA/Simulators</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>out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-AutoWah</name>
+ <longname>C* AutoWah - Resonant envelope-following filter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Filters</class>
+ <description>C* AutoWah - Resonant envelope-following filter</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-CEO</name>
+ <longname>C* CEO - Chief Executive Oscillator</longname>
+ <class>Source/Audio/LADSPA/Generators/Oscillators</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-CabinetI</name>
+ <longname>C* CabinetI - Loudspeaker cabinet emulation</longname>
+ <class>Filter/Effect/Audio/LADSPA/Simulators</class>
+ <description>C* CabinetI - Loudspeaker cabinet emulation</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-CabinetII</name>
+ <longname>C* CabinetII - Refined loudspeaker cabinet emulation</longname>
+ <class>Filter/Effect/Audio/LADSPA/Simulators</class>
+ <description>C* CabinetII - Refined loudspeaker cabinet emulation</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Chorus1</name>
+ <longname>Chorus1 - Based on CSound orchestra by Sean Costello</longname>
+ <class>Filter/Effect/Audio/LADSPA/Chorus/Time</class>
+ <description>Chorus1 - Based on CSound orchestra by Sean Costello</description>
+ <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Chorus2</name>
+ <longname>Chorus2 - Based on CSound orchestra by Sean Costello</longname>
+ <class>Filter/Effect/Audio/LADSPA/Chorus/Time</class>
+ <description>Chorus2 - Based on CSound orchestra by Sean Costello</description>
+ <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-ChorusI</name>
+ <longname>C* ChorusI - Mono chorus/flanger</longname>
+ <class>Filter/Effect/Audio/LADSPA/Chorus/Time</class>
+ <description>C* ChorusI - Mono chorus/flanger</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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/Chorus/Time</class>
+ <description>C* ChorusII - Mono chorus/flanger modulated by a fractal</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Click</name>
+ <longname>C* Click - Metronome</longname>
+ <class>Source/Audio/LADSPA/Time</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Clip</name>
+ <longname>C* Clip - Hard clipper, 8x oversampled</longname>
+ <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
+ <description>C* Clip - Hard clipper, 8x oversampled</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Compress</name>
+ <longname>C* Compress - Mono compressor</longname>
+ <class>Filter/Effect/Audio/LADSPA/Compressors/Amplitude/Dynamics</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>out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Compressor</name>
+ <longname>Calf Compressor LADSPA</longname>
+ <class>Filter/Effect/Audio/LADSPA/Compressors/Amplitude/Dynamics</class>
+ <description>Calf Compressor LADSPA</description>
+ <author>Thor Harald Johansen</author>
+ <pads>
+ <caps>
+ <name>Out_R</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Out_L</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_R</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_L</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Dirac</name>
+ <longname>C* Dirac - One-sample impulse generator</longname>
+ <class>Source/Audio/LADSPA/Generators</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Eq</name>
+ <longname>C* Eq - 10-band equalizer</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/EQs</class>
+ <description>C* Eq - 10-band equalizer</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Eq2x2</name>
+ <longname>C* Eq2x2 - stereo 10-band equalizer</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/EQs</class>
+ <description>C* Eq2x2 - stereo 10-band equalizer</description>
+ <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
+ <pads>
+ <caps>
+ <name>out-r</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>out-l</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in-r</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in-l</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Filter</name>
+ <longname>Calf Filter LADSPA</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Filters</class>
+ <description>Calf Filter LADSPA</description>
+ <author>Krzysztof Foltman</author>
+ <pads>
+ <caps>
+ <name>Out_R</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Out_L</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_R</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_L</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Out_R</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Out_L</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_R</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_L</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Flanger</name>
+ <longname>Calf Flanger LADSPA</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Flangers</class>
+ <description>Calf Flanger LADSPA</description>
+ <author>Krzysztof Foltman</author>
+ <pads>
+ <caps>
+ <name>Out_R</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Out_L</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_R</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_L</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-G2reverb</name>
+ <longname>Stereo reverb</longname>
+ <class>Filter/Effect/Audio/LADSPA/Reverbs/Time/Simulators</class>
+ <description>Stereo reverb</description>
+ <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
+ <pads>
+ <caps>
+ <name>Out_R</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Out_L</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_R</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_L</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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/Simulators</class>
+ <description>C* HRTF - Head-related transfer function at elevation 0</description>
+ <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
+ <pads>
+ <caps>
+ <name>out-r</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>out-l</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-JVRev</name>
+ <longname>C* JVRev - Stanford-style reverb from STK</longname>
+ <class>Filter/Effect/Audio/LADSPA/Reverbs/Time/Simulators</class>
+ <description>C* JVRev - Stanford-style reverb from STK</description>
+ <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
+ <pads>
+ <caps>
+ <name>out-r</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>out-l</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Lorenz</name>
+ <longname>C* Lorenz - The sound of a Lorenz attractor</longname>
+ <class>Source/Audio/LADSPA/Generators</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-MultiChorus</name>
+ <longname>Calf MultiChorus LADSPA</longname>
+ <class>Filter/Effect/Audio/LADSPA/Chorus/Time</class>
+ <description>Calf MultiChorus LADSPA</description>
+ <author>Krzysztof Foltman</author>
+ <pads>
+ <caps>
+ <name>Out_R</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Out_L</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_R</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_L</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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/Frequency/Filters</class>
+ <description>Mvchpf-1 Digital implementation of the VC HP filter invented by R.A. Moog</description>
+ <author>Fons Adriaensen &lt;fons.adriaensen@skynet.be&gt;</author>
+ <pads>
+ <caps>
+ <name>Exp_FM</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequency</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Mvclpf-1</name>
+ <longname>Mvclpf-1 Digital implementation of the VC filter invented by R.A.Moog</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Filters</class>
+ <description>Mvclpf-1 Digital implementation of the VC filter invented by R.A.Moog</description>
+ <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
+ <pads>
+ <caps>
+ <name>Resonance</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Exp_FM</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequency</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Mvclpf-2</name>
+ <longname>Mvclpf-2 Digital implementation of the VC filter invented by R.A.Moog</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Filters</class>
+ <description>Mvclpf-2 Digital implementation of the VC filter invented by R.A.Moog</description>
+ <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
+ <pads>
+ <caps>
+ <name>Resonance</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Exp_FM</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequency</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Mvclpf-3</name>
+ <longname>Mvclpf-3 Digital implementation of the VC filter invented by R.A.Moog</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Filters</class>
+ <description>Mvclpf-3 Digital implementation of the VC filter invented by R.A.Moog</description>
+ <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
+ <pads>
+ <caps>
+ <name>Resonance</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Exp_FM</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequency</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Mvclpf-4</name>
+ <longname>Mvclpf-4 Digital implementation of the VC filter invented by R.A.Moog</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Filters</class>
+ <description>Mvclpf-4 Digital implementation of the VC filter invented by R.A.Moog</description>
+ <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
+ <pads>
+ <caps>
+ <name>Resonance</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Exp_FM</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequency</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Pan</name>
+ <longname>C* Pan - Pan and width</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
+ <description>C* Pan - Pan and width</description>
+ <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
+ <pads>
+ <caps>
+ <name>out-r</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>out-l</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Parametric1</name>
+ <longname>4-band parametric filter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/EQs/Parametric</class>
+ <description>4-band parametric filter</description>
+ <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Phaser</name>
+ <longname>Calf Phaser LADSPA</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Phasers</class>
+ <description>Calf Phaser LADSPA</description>
+ <author>Krzysztof Foltman</author>
+ <pads>
+ <caps>
+ <name>Out_R</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Out_L</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_R</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_L</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Phaser1</name>
+ <longname>Phaser1 - Similar to CSound's phaser1 by Sean Costello</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Phasers</class>
+ <description>Phaser1 - Similar to CSound's phaser1 by Sean Costello</description>
+ <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
+ <pads>
+ <caps>
+ <name>Lin_FM</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Exp_FM</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequency</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Phaser1+LFO</name>
+ <longname>Phaser1 with LFO</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Phasers</class>
+ <description>Phaser1 with LFO</description>
+ <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-PhaserI</name>
+ <longname>C* PhaserI - Mono phaser</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Phasers</class>
+ <description>C* PhaserI - Mono phaser</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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/Time/Phasers</class>
+ <description>C* PhaserII - Mono phaser modulated by a Lorenz fractal</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Plate</name>
+ <longname>C* Plate - Versatile plate reverb</longname>
+ <class>Filter/Effect/Audio/LADSPA/Reverbs/Time/Simulators</class>
+ <description>C* Plate - Versatile plate reverb</description>
+ <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
+ <pads>
+ <caps>
+ <name>out-r</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>out-l</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Plate2x2</name>
+ <longname>C* Plate2x2 - Versatile plate reverb, stereo inputs</longname>
+ <class>Filter/Effect/Audio/LADSPA/Reverbs/Time/Simulators</class>
+ <description>C* Plate2x2 - Versatile plate reverb, stereo inputs</description>
+ <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
+ <pads>
+ <caps>
+ <name>out-r</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>out-l</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in-r</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in-l</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-PreampIII</name>
+ <longname>C* PreampIII - Tube preamp emulation</longname>
+ <class>Filter/Effect/Audio/LADSPA/Simulators</class>
+ <description>C* PreampIII - Tube preamp emulation</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-PreampIV</name>
+ <longname>C* PreampIV - Tube preamp emulation + tone controls</longname>
+ <class>Filter/Effect/Audio/LADSPA/Simulators</class>
+ <description>C* PreampIV - Tube preamp emulation + tone controls</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Pulse-VCO</name>
+ <longname>Pulse-VCO -- Anti-aliased oscillator</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators/Oscillators</class>
+ <description>Pulse-VCO -- Anti-aliased oscillator</description>
+ <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
+ <pads>
+ <caps>
+ <name>Lin_FM</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Exp_FM</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequency</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Rec-VCO</name>
+ <longname>Rec-VCO -- Anti-aliased oscillator</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators/Oscillators</class>
+ <description>Rec-VCO -- Anti-aliased oscillator</description>
+ <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
+ <pads>
+ <caps>
+ <name>Sync</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Mod</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Lin_FM</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Exp_FM</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequency</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Reverb</name>
+ <longname>Calf Reverb LADSPA</longname>
+ <class>Filter/Effect/Audio/LADSPA/Reverbs/Time/Simulators</class>
+ <description>Calf Reverb LADSPA</description>
+ <author>Krzysztof Foltman</author>
+ <pads>
+ <caps>
+ <name>Out_R</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Out_L</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_R</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_L</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Roessler</name>
+ <longname>C* Roessler - The sound of a Roessler attractor</longname>
+ <class>Source/Audio/LADSPA/Generators</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Out_R</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Out_L</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_R</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_L</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Saw-VCO</name>
+ <longname>Saw-VCO -- Anti-aliased oscillator</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators/Oscillators</class>
+ <description>Saw-VCO -- Anti-aliased oscillator</description>
+ <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
+ <pads>
+ <caps>
+ <name>Sync</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Lin_FM</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Exp_FM</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequency</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Scape</name>
+ <longname>C* Scape - Stereo delay + Filters</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
+ <description>C* Scape - Stereo delay + Filters</description>
+ <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
+ <pads>
+ <caps>
+ <name>out-r</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>out-l</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-Sin</name>
+ <longname>C* Sin - Sine wave generator</longname>
+ <class>Source/Audio/LADSPA/Generators/Oscillators</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-StereoChorusI</name>
+ <longname>C* StereoChorusI - Stereo chorus/flanger</longname>
+ <class>Filter/Effect/Audio/LADSPA/Chorus/Time</class>
+ <description>C* StereoChorusI - Stereo chorus/flanger</description>
+ <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
+ <pads>
+ <caps>
+ <name>out-r</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>out-l</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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/Chorus/Time</class>
+ <description>C* StereoChorusII - Stereo chorus/flanger modulated by a fractal</description>
+ <author>Tim Goetze &lt;tim@quitte.de&gt;</author>
+ <pads>
+ <caps>
+ <name>out-r</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>out-l</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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/Frequency/Filters</class>
+ <description>C* SweepVFI - Resonant filter swept by a Lorenz fractal</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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/Frequency/Filters</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>out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Sync_In</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Wave_Mod</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Lin_FM</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Exp_FM</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequency</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Sync_Out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Sync_In</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Lin_FM</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Exp_FM</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequency</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Sync_Out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Sync_In</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Wave_Mod</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Lin_FM</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Exp_FM</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequency</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Sync_Out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-ToneStack</name>
+ <longname>C* ToneStack - Tone stack emulation</longname>
+ <class>Filter/Effect/Audio/LADSPA/Simulators</class>
+ <description>C* ToneStack - Tone stack emulation</description>
+ <author>David Yeh &lt;dtyeh@ccrma.stanford.edu&gt;</author>
+ <pads>
+ <caps>
+ <name>out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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/Simulators</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>out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-VCOd</name>
+ <longname>C* VCOd - Double VCO with detune and hard sync options</longname>
+ <class>Source/Audio/LADSPA/Generators/Oscillators</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-VCOs</name>
+ <longname>C* VCOs - Virtual 'analogue' oscillator</longname>
+ <class>Source/Audio/LADSPA/Generators/Oscillators</class>
+ <description>C* VCOs - Virtual 'analogue' 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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-VintageDelay</name>
+ <longname>Calf Vintage Delay LADSPA</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
+ <description>Calf Vintage Delay LADSPA</description>
+ <author>Krzysztof Foltman</author>
+ <pads>
+ <caps>
+ <name>Out_R</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Out_L</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_R</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_L</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-White</name>
+ <longname>C* White - White noise generator</longname>
+ <class>Source/Audio/LADSPA/Generators</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Envelope_Out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Trigger</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Gate</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Reset_Level</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Envelope_Out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Trigger</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Gate</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-adsr</name>
+ <longname>ADSR Hüllkurve</longname>
+ <class>Filter/Effect/Audio/LADSPA/Amplitude/Dynamics</class>
+ <description>ADSR Hüllkurve</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Driving_Signal</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-adsr-g+t</name>
+ <longname>ADSR Hüllkurve mit Gatter und Auslöseimpuls</longname>
+ <class>Filter/Effect/Audio/LADSPA/Amplitude/Dynamics</class>
+ <description>ADSR Hüllkurve mit Gatter und Auslöseimpuls</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Ausl--ser</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Gatter</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-alias</name>
+ <longname>Aliasing</longname>
+ <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
+ <description>Aliasing</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-allpass-c</name>
+ <longname>Allpass delay line, cubic spline interpolation</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
+ <description>Allpass delay line, cubic spline interpolation</description>
+ <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-allpass-l</name>
+ <longname>Allpass delay line, linear interpolation</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
+ <description>Allpass delay line, linear interpolation</description>
+ <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-allpass-n</name>
+ <longname>Allpass delay line, noninterpolating</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
+ <description>Allpass delay line, noninterpolating</description>
+ <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_2</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-amPitchshift</name>
+ <longname>AM pitchshifter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Pitch shifters</class>
+ <description>AM pitchshifter</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-amp</name>
+ <longname>Simple amplifier</longname>
+ <class>Filter/Effect/Audio/LADSPA/Amplitude/Amplifiers</class>
+ <description>Simple amplifier</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-amp-gaia-oa</name>
+ <longname>Amplifier (GAIA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Amplitude/Amplifiers</class>
+ <description>Amplifier (GAIA)</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Verst--rkung_-dB-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-amp-gcia-oa</name>
+ <longname>Amplifier (GCIA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Amplitude/Amplifiers</class>
+ <description>Amplifier (GCIA)</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
<name>ladspa-amp-mono</name>
<longname>Mono Amplifier</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -64,6 +2089,1171 @@
</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-analogueOsc</name>
+ <longname>Analogue Oscillator</longname>
+ <class>Source/Audio/LADSPA/Generators/Oscillators</class>
+ <description>Analogue Oscillator</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-artificialLatency</name>
+ <longname>Artificial latency</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Artificial latency</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-autoPhaser</name>
+ <longname>Auto phaser</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Phasers</class>
+ <description>Auto phaser</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-bandpass-a-iir</name>
+ <longname>Glame Bandpass Analog Filter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Bandpass/Filters</class>
+ <description>Glame Bandpass Analog Filter</description>
+ <author>Alexander Ehlert &lt;mag@glame.de&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-bandpass-iir</name>
+ <longname>Glame Bandpass Filter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Bandpass/Filters</class>
+ <description>Glame Bandpass Filter</description>
+ <author>Alexander Ehlert &lt;mag@glame.de&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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>Output_-Z-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Y-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-X-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-W-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-Z-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-Y-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-X-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-W-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output_-Top_Back_Right-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Top_Back_Left-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Top_Front_Right-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Top_Front_Left-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Base_Back_Right-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Base_Back_Left-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Base_Front_Right-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Base_Front_Left-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-Z-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-Y-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-X-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-W-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output_-Back_Right-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Back_Left-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Front_Right-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Front_Left-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-Z-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-Y-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-X-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-W-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output_-Right-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Left-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-Z-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-Y-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-X-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-W-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-bodeShifter</name>
+ <longname>Bode frequency shifter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Spectral</class>
+ <description>Bode frequency shifter</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Up_out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Down_out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-bodeShifterCV</name>
+ <longname>Bode frequency shifter (CV)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Spectral</class>
+ <description>Bode frequency shifter (CV)</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Mix_out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Up_out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Down_out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Shift_CV</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-branch-ia-oaoa</name>
+ <longname>Signal Branch (IA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Signal Branch (IA)</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Second_Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>First_Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-branch-ic-ococ</name>
+ <longname>Signal Branch (IC)</longname>
+ <class>Source/Audio/LADSPA/Utilities</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/Frequency/Highpass/Filters</class>
+ <description>GLAME Butterworth Highpass</description>
+ <author>Alexander Ehlert &lt;mag@glame.de&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-buttlow-iir</name>
+ <longname>GLAME Butterworth Lowpass</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Lowpass/Filters</class>
+ <description>GLAME Butterworth Lowpass</description>
+ <author>Alexander Ehlert &lt;mag@glame.de&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-bwxover-iir</name>
+ <longname>Glame Butterworth X-over Filter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Bandpass/Filters</class>
+ <description>Glame Butterworth X-over Filter</description>
+ <author>Alexander Ehlert &lt;mag@glame.de&gt;</author>
+ <pads>
+ <caps>
+ <name>HP-Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>LP-Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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>Out_-Right-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Out_-Left-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_-Right-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_-Left-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-chebstortion</name>
+ <longname>Chebyshev distortion</longname>
+ <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
+ <description>Chebyshev distortion</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-comb</name>
+ <longname>Comb Filter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Combs/Filters</class>
+ <description>Comb Filter</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-comb-c</name>
+ <longname>Comb delay line, cubic spline interpolation</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
+ <description>Comb delay line, cubic spline interpolation</description>
+ <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-comb-l</name>
+ <longname>Comb delay line, linear interpolation</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
+ <description>Comb delay line, linear interpolation</description>
+ <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-comb-n</name>
+ <longname>Comb delay line, noninterpolating</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
+ <description>Comb delay line, noninterpolating</description>
+ <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-combSplitter</name>
+ <longname>Comb Splitter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Combs/Filters</class>
+ <description>Comb Splitter</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output_2</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_1</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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_=_B</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>A_&gt;_B</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Smaller</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Larger</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>B</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>A</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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_=_B</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>A_&gt;_B</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Smaller</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Larger</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>A</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-const</name>
+ <longname>Constant Signal Generator</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Constant Signal Generator</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-crossoverDist</name>
+ <longname>Crossover distortion</longname>
+ <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
+ <description>Crossover distortion</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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/Amplitude/Dynamics</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Envelope_Out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Trigger</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Gate</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-dahdsr-g+t-audio</name>
+ <longname>DAHDSR Hullkurve mit Gatter und Auslöseimpuls (Audio Eingänge)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Amplitude/Dynamics</class>
+ <description>DAHDSR Hullkurve mit Gatter und Auslöseimpuls (Audio Eingänge)</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Ausklingzeit_-s-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Haltewert</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Abklingzeit_-s-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Haltezeit_-s-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Einschwingzeit_-s-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Verz--gerungszeit_-s-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Ausl--ser</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Gatter</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-dahdsr-g+t-control</name>
+ <longname>DAHDSR Hüllkurve mit Gatter und Auslöseimpuls (Kontroll Eingänge)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Amplitude/Dynamics</class>
+ <description>DAHDSR Hüllkurve mit Gatter und Auslöseimpuls (Kontroll Eingänge)</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Ausl--ser</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Gatter</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Envelope_Out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Trigger</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Gate</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-dcRemove</name>
+ <longname>DC Offset Remover</longname>
+ <class>Filter/Effect/Audio/LADSPA</class>
+ <description>DC Offset Remover</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-decay</name>
+ <longname>Exponential signal decay</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Exponential signal decay</description>
+ <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-decimator</name>
+ <longname>Decimator</longname>
+ <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
+ <description>Decimator</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-declip</name>
+ <longname>Declipper</longname>
+ <class>Filter/Effect/Audio/LADSPA/Amplitude/Waveshapers</class>
+ <description>Declipper</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
<name>ladspa-delay-5s</name>
<longname>Simple Delay Line</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -85,6 +3275,1550 @@
</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-delay-c</name>
+ <longname>Simple delay line, cubic spline interpolation</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
+ <description>Simple delay line, cubic spline interpolation</description>
+ <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-delay-l</name>
+ <longname>Simple delay line, linear interpolation</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
+ <description>Simple delay line, linear interpolation</description>
+ <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-delay-n</name>
+ <longname>Simple delay line, noninterpolating</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
+ <description>Simple delay line, noninterpolating</description>
+ <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-delayorama</name>
+ <longname>Delayorama</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
+ <description>Delayorama</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-difference-iama-oa</name>
+ <longname>Signal Difference (IAMA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Signal Difference (IAMA)</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Difference_Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_to_Subtract</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-difference-iamc-oa</name>
+ <longname>Signal Difference (IAMC)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Signal Difference (IAMC)</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Difference_Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-difference-icma-oa</name>
+ <longname>Signal Difference (ICMA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Signal Difference (ICMA)</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Difference_Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_to_Subtract</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-difference-icmc-oc</name>
+ <longname>Signal Difference (ICMC)</longname>
+ <class>Source/Audio/LADSPA/Utilities</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/Distortions/Amplitude</class>
+ <description>Diode Processor</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-divider</name>
+ <longname>Audio Divider (Suboctave Generator)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators</class>
+ <description>Audio Divider (Suboctave Generator)</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-dj-eq</name>
+ <longname>DJ EQ</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/EQs</class>
+ <description>DJ EQ</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output_R</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_L</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_R</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_L</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-dj-eq-mono</name>
+ <longname>DJ EQ (mono)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/EQs</class>
+ <description>DJ EQ (mono)</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-djFlanger</name>
+ <longname>DJ flanger</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Flangers</class>
+ <description>DJ flanger</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-dysonCompress</name>
+ <longname>Dyson compressor</longname>
+ <class>Filter/Effect/Audio/LADSPA/Compressors/Amplitude/Dynamics</class>
+ <description>Dyson compressor</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output_-Z-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Y-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-X-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-W-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output_-V-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-U-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-T-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-S-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-R-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Z-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Y-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-X-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-W-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-fadDelay</name>
+ <longname>Fractionally Addressed Delay Line</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
+ <description>Fractionally Addressed Delay Line</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>B</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>A</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Level</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-fastLookaheadLimiter</name>
+ <longname>Fast Lookahead limiter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Limiters/Amplitude/Dynamics</class>
+ <description>Fast Lookahead limiter</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output_2</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_1</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_2</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-flanger</name>
+ <longname>Flanger</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Flangers</class>
+ <description>Flanger</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-fmOsc</name>
+ <longname>FM Oscillator</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators/Oscillators</class>
+ <description>FM Oscillator</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequency_-Hz-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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>Output_-V-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-U-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-T-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-S-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-R-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Z-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Y-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-X-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-W-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-V-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-U-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-T-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-S-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-R-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-Z-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-Y-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-X-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-W-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output_-Z-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Y-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-X-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-W-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-V-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-U-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-T-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-S-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-R-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-Z-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-Y-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-X-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-W-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output_-Front_Left_Left-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Back_Left_Left-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Back_Back_Left-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Back_Back_Right-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Back_Right_Right-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Front_Right_Right-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Front_Front_Right-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Front_Front_Left-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-V-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-U-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-T-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-S-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-R-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-Z-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-Y-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-X-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-W-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-fmod-fama-oa</name>
+ <longname>Frequenz Modulator (FAMA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency</class>
+ <description>Frequenz Modulator (FAMA)</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Modulierte_Frequenz_-Hz-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Modulation_-Octaves-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequenz_-Hz-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-fmod-famc-oa</name>
+ <longname>Frequenz Modulator (FAMC)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency</class>
+ <description>Frequenz Modulator (FAMC)</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Modulierte_Frequenz_-Hz-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequenz_-Hz-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-fmod-fcma-oa</name>
+ <longname>Frequenz Modulator (FCMA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency</class>
+ <description>Frequenz Modulator (FCMA)</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Modulierte_Frequenz_-Hz-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Modulation_-Octaves-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-fmod-fcmc-oc</name>
+ <longname>Frequenz Modulator (FCMC)</longname>
+ <class>Source/Audio/LADSPA/Frequency</class>
+ <description>Frequenz 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/Distortions/Amplitude</class>
+ <description>Foldover distortion</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-fourByFourPole</name>
+ <longname>4 x 4 pole allpass</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Filters/Allpass</class>
+ <description>4 x 4 pole allpass</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-foverdrive</name>
+ <longname>Fast overdrive</longname>
+ <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
+ <description>Fast overdrive</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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>Output_-Right-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_-Left-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-Right-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_-Left-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-freqTracker</name>
+ <longname>Frequency tracker</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Measurement</class>
+ <description>Frequency tracker</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Frequency_-Hz-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-gate</name>
+ <longname>Gate</longname>
+ <class>Filter/Effect/Audio/LADSPA/Gates/Amplitude/Dynamics</class>
+ <description>Gate</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-giantFlange</name>
+ <longname>Giant flange</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Flangers</class>
+ <description>Giant flange</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-gong</name>
+ <longname>Gong model</longname>
+ <class>Filter/Effect/Audio/LADSPA</class>
+ <description>Gong model</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-gongBeater</name>
+ <longname>Gong beater</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators</class>
+ <description>Gong beater</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-gsm</name>
+ <longname>GSM simulator</longname>
+ <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
+ <description>GSM simulator</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-gverb</name>
+ <longname>GVerb</longname>
+ <class>Filter/Effect/Audio/LADSPA/Reverbs/Time/Simulators</class>
+ <description>GVerb</description>
+ <author>Juhana Sadeharju &lt;kouhia at nic.funet.fi&gt;, LADSPAification by Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Right_output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Left_output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-hardLimiter</name>
+ <longname>Hard Limiter</longname>
+ <class>Filter/Effect/Audio/LADSPA</class>
+ <description>Hard Limiter</description>
+ <author>Marcus Andersson</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-harmonicGen</name>
+ <longname>Harmonic generator</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators</class>
+ <description>Harmonic generator</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-hermesFilter</name>
+ <longname>Hermes Filter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Filters</class>
+ <description>Hermes Filter</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-highpass-iir</name>
+ <longname>Glame Highpass Filter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Highpass/Filters</class>
+ <description>Glame Highpass Filter</description>
+ <author>Alexander Ehlert &lt;mag@glame.de&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-hilbert</name>
+ <longname>Hilbert transformer</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Hilbert transformer</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>90deg_output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>0deg_output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
<name>ladspa-hpf</name>
<longname>Simple High Pass Filter</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -106,6 +4840,413 @@
</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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/Spectral</class>
+ <description>Impulse convolver</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-impulse-fc</name>
+ <longname>Nonbandlimited single-sample impulses (Frequency: Control)</longname>
+ <class>Source/Audio/LADSPA/Utilities</class>
+ <description>Nonbandlimited single-sample impulses (Frequency: Control)</description>
+ <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-interpolator</name>
+ <longname>Control to Audio Interpolator</longname>
+ <class>Source/Audio/LADSPA/Utilities</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-inv</name>
+ <longname>Inverter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Inverter</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-jaminController</name>
+ <longname>JAMin Controller</longname>
+ <class>Filter/Effect/Audio/LADSPA</class>
+ <description>JAMin Controller</description>
+ <author>xxx &lt;yyy@zzz.com&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-karaoke</name>
+ <longname>Karaoke</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Karaoke</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Right_out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Left_out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Right_in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Left_in</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-lcrDelay</name>
+ <longname>L/C/R Delay</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
+ <description>L/C/R Delay</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>R_output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>L_output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>R_input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>L_input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-lfoPhaser</name>
+ <longname>LFO Phaser</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Phasers</class>
+ <description>LFO Phaser</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Out_-Right-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Out_-Left-</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_-Right-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In_-Left-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-lowpass-iir</name>
+ <longname>Glame Lowpass Filter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Lowpass/Filters</class>
+ <description>Glame Lowpass Filter</description>
+ <author>Alexander Ehlert &lt;mag@glame.de&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-lp4pole-faraia-oa</name>
+ <longname>4 Pole Low-Pass Filter with Resonance (FARAIA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Lowpass/Filters</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Resonanz</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Cutoff_Frequency</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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/Frequency/Lowpass/Filters</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
<name>ladspa-lpf</name>
<longname>Simple Low Pass Filter</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -127,6 +5268,285 @@
</pads>
</element>
<element>
+ <name>ladspa-lsFilter</name>
+ <longname>LS Filter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Filters</class>
+ <description>LS Filter</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-matrixMSSt</name>
+ <longname>Matrix: MS to Stereo</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Matrix: MS to Stereo</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Right</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Left</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Side</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Mid</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-matrixSpatialiser</name>
+ <longname>Matrix Spatialiser</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Matrix Spatialiser</description>
+ <author>Joern Nettingsmeier &lt;nettings@folkwang-hochschule.de&gt;</author>
+ <pads>
+ <caps>
+ <name>Output_R</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_L</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_R</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_L</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-matrixStMS</name>
+ <longname>Matrix: Stereo to MS</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Matrix: Stereo to MS</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Side</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Mid</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Right</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Left</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-mbeq</name>
+ <longname>Multiband EQ</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Multiband/EQs</class>
+ <description>Multiband EQ</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_2</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-modDelay</name>
+ <longname>Modulatable delay</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
+ <description>Modulatable delay</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Delay_-s-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-multivoiceChorus</name>
+ <longname>Multivoice Chorus</longname>
+ <class>Filter/Effect/Audio/LADSPA/Chorus/Time</class>
+ <description>Multivoice Chorus</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>On</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Off</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Gate</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
<name>ladspa-noise-white</name>
<longname>White Noise Source</longname>
<class>Source/Audio/LADSPA</class>
@@ -142,6 +5562,1400 @@
</pads>
</element>
<element>
+ <name>ladspa-notch-iir</name>
+ <longname>Mag's Notch Filter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Notch/Filters</class>
+ <description>Mag's Notch Filter</description>
+ <author>Alexander Ehlert &lt;mag@glame.de&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-pitchScale</name>
+ <longname>Pitch Scaler</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Pitch shifters</class>
+ <description>Pitch Scaler</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-pitchScaleHQ</name>
+ <longname>Higher Quality Pitch Scaler</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Pitch shifters</class>
+ <description>Higher Quality Pitch Scaler</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-plate</name>
+ <longname>Plate reverb</longname>
+ <class>Filter/Effect/Audio/LADSPA/Reverbs/Time/Simulators</class>
+ <description>Plate reverb</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Right_output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Left_output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-pointerCastDistortion</name>
+ <longname>Pointer cast distortion</longname>
+ <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
+ <description>Pointer cast distortion</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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>Result</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Exponent</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Base</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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-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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Probability</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_2</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_2</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-product-iaia-oa</name>
+ <longname>Signal Product (IAIA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Signal Product (IAIA)</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Product_Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Second_Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>First_Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-product-iaic-oa</name>
+ <longname>Signal Product (IAIC)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Signal Product (IAIC)</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Product_Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>First_Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-product-icic-oc</name>
+ <longname>Signal Product (ICIC)</longname>
+ <class>Source/Audio/LADSPA/Utilities</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/Generators/Oscillators</class>
+ <description>Bandlimited Variable Width Pulse Oscillator (FAPA)</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Pulse_Width</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequenz</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-pulse-fapc-oa</name>
+ <longname>Bandlimited Variable Width Pulse Oscillator (FAPC)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators/Oscillators</class>
+ <description>Bandlimited Variable Width Pulse Oscillator (FAPC)</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequenz</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-pulse-fcpa-oa</name>
+ <longname>Bandlimited Variable Width Pulse Oscillator (FCPA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators/Oscillators</class>
+ <description>Bandlimited Variable Width Pulse Oscillator (FCPA)</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Pulse_Width</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-pulse-fcpc-oa</name>
+ <longname>Bandlimited Variable Width Pulse Oscillator (FCPC)</longname>
+ <class>Source/Audio/LADSPA/Generators/Oscillators</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-quantiser100</name>
+ <longname>Quantiser (100 Steps)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Quantiser (100 Steps)</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output_Changed</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Quantised_Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-quantiser20</name>
+ <longname>Quantiser (20 Steps)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Quantiser (20 Steps)</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output_Changed</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Quantised_Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-quantiser50</name>
+ <longname>Quantiser (50 Steps)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Quantiser (50 Steps)</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output_Changed</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Quantised_Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-random-fasa-oa</name>
+ <longname>Random Wave Generator (FASA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators</class>
+ <description>Random Wave Generator (FASA)</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Wave_Smoothness</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequenz_-Hz-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-random-fasc-oa</name>
+ <longname>Random Wave Generator (FASC)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators</class>
+ <description>Random Wave Generator (FASC)</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequenz_-Hz-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-random-fcsa-oa</name>
+ <longname>Random Wave Generator (FCSA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators</class>
+ <description>Random Wave Generator (FCSA)</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Wave_Smoothness</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-random-fcsc-oa</name>
+ <longname>Random Wave Generator (FCSC)</longname>
+ <class>Source/Audio/LADSPA/Generators</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_Max</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_Min</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_Max</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_Min</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-rateShifter</name>
+ <longname>Rate shifter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Pitch shifters</class>
+ <description>Rate shifter</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-ratio-nada-oa</name>
+ <longname>Signal Ratio (NADA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Signal Ratio (NADA)</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Ratio_Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Denominator</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Numerator</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-ratio-nadc-oa</name>
+ <longname>Signal Ratio (NADC)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Signal Ratio (NADC)</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Ratio_Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Numerator</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-ratio-ncda-oa</name>
+ <longname>Signal Ratio (NCDA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Signal Ratio (NCDA)</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Ratio_Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Denominator</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-ratio-ncdc-oc</name>
+ <longname>Signal Ratio (NCDC)</longname>
+ <class>Source/Audio/LADSPA/Utilities</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/Time/Flangers</class>
+ <description>Retro Flanger</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-revdelay</name>
+ <longname>Reverse Delay (5s max)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
+ <description>Reverse Delay (5s max)</description>
+ <author>Jesse Chappell &lt;jesse at essej dot net&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-ringmod-1i1o1l</name>
+ <longname>Ringmod with LFO</longname>
+ <class>Filter/Effect/Audio/LADSPA/Amplitude/Modulators</class>
+ <description>Ringmod with LFO</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-ringmod-2i1o</name>
+ <longname>Ringmod with two inputs</longname>
+ <class>Filter/Effect/Audio/LADSPA/Amplitude/Modulators</class>
+ <description>Ringmod with two inputs</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Modulator</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-satanMaximiser</name>
+ <longname>Barry's Satan Maximiser</longname>
+ <class>Filter/Effect/Audio/LADSPA</class>
+ <description>Barry's Satan Maximiser</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-sawtooth-fa-oa</name>
+ <longname>Bandlimited Sawtooth Oscillator (FA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators/Oscillators</class>
+ <description>Bandlimited Sawtooth Oscillator (FA)</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequenz</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-sawtooth-fc-oa</name>
+ <longname>Bandlimited Sawtooth Oscillator (FC)</longname>
+ <class>Source/Audio/LADSPA/Generators/Oscillators</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-sc1</name>
+ <longname>SC1</longname>
+ <class>Filter/Effect/Audio/LADSPA/Compressors/Amplitude/Dynamics</class>
+ <description>SC1</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-sc2</name>
+ <longname>SC2</longname>
+ <class>Filter/Effect/Audio/LADSPA/Compressors/Amplitude/Dynamics</class>
+ <description>SC2</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Sidechain</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-sc3</name>
+ <longname>SC3</longname>
+ <class>Filter/Effect/Audio/LADSPA/Compressors/Amplitude/Dynamics</class>
+ <description>SC3</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Right_output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Left_output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Right_input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Left_input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Sidechain</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-sc4</name>
+ <longname>SC4</longname>
+ <class>Filter/Effect/Audio/LADSPA/Compressors/Amplitude/Dynamics</class>
+ <description>SC4</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Right_output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Left_output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Right_input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Left_input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-sc4m</name>
+ <longname>SC4 mono</longname>
+ <class>Filter/Effect/Audio/LADSPA/Compressors/Amplitude/Dynamics</class>
+ <description>SC4 mono</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-se4</name>
+ <longname>SE4</longname>
+ <class>Filter/Effect/Audio/LADSPA/Compressors/Amplitude/Dynamics</class>
+ <description>SE4</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Right_output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Left_output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Right_input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Left_input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-sequencer16</name>
+ <longname>Analogue Style 16 Step Sequencer</longname>
+ <class>Filter/Effect/Audio/LADSPA/Simulators</class>
+ <description>Analogue Style 16 Step Sequencer</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Value_Out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Step_Trigger</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Gate_-Open_&gt;_0-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-sequencer32</name>
+ <longname>Analogue Style 32 Step Sequencer</longname>
+ <class>Filter/Effect/Audio/LADSPA/Simulators</class>
+ <description>Analogue Style 32 Step Sequencer</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Value_Out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Step_Trigger</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Gate_-Open_&gt;_0-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-sequencer64</name>
+ <longname>Analogue Style 64 Step Sequencer</longname>
+ <class>Filter/Effect/Audio/LADSPA/Simulators</class>
+ <description>Analogue Style 64 Step Sequencer</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Value_Out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Step_Trigger</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Gate_-Open_&gt;_0-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Threshold</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Trigger</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Trigger</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-shaper</name>
+ <longname>Wave shaper</longname>
+ <class>Filter/Effect/Audio/LADSPA/Amplitude/Waveshapers</class>
+ <description>Wave shaper</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-sifter</name>
+ <longname>Signal sifter</longname>
+ <class>Filter/Effect/Audio/LADSPA</class>
+ <description>Signal sifter</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Sign</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-sinCos</name>
+ <longname>Sine + cosine oscillator</longname>
+ <class>Source/Audio/LADSPA/Generators/Oscillators</class>
+ <description>Sine + cosine oscillator</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Cosine_output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Sine_output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
<name>ladspa-sine-faaa</name>
<longname>Sine Oscillator (Freq:audio, Amp:audio)</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -225,5 +7039,1659 @@
</caps>
</pads>
</element>
+ <element>
+ <name>ladspa-singlePara</name>
+ <longname>Single band parametric</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/EQs/Parametric</class>
+ <description>Single band parametric</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-sinusWavewrapper</name>
+ <longname>Sinus wavewrapper</longname>
+ <class>Filter/Effect/Audio/LADSPA/Amplitude/Waveshapers</class>
+ <description>Sinus wavewrapper</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Carrier</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Modulator</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Fall_rate_-1-s-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Rise_rate_-1-s-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Fall_time_-s-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Rise_time_-s-</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-smoothDecimate</name>
+ <longname>Smooth Decimator</longname>
+ <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
+ <description>Smooth Decimator</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-split</name>
+ <longname>Mono to Stereo splitter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Mono to Stereo splitter</description>
+ <author>Frank Neumann &lt;franky@users.sourceforge.net&gt;</author>
+ <pads>
+ <caps>
+ <name>Output_2</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_1</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-square-fa-oa</name>
+ <longname>Bandlimited Square Oscillator (FA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators/Oscillators</class>
+ <description>Bandlimited Square Oscillator (FA)</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequenz</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-square-fc-oa</name>
+ <longname>Bandlimited Square Oscillator (FC)</longname>
+ <class>Source/Audio/LADSPA/Generators/Oscillators</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-stepMuxer</name>
+ <longname>Step Demuxer</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Step Demuxer</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_8</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_7</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_6</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_5</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_4</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_3</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_2</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_1</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Clock</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-sum-iaia-oa</name>
+ <longname>Signal Sum (IAIA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Signal Sum (IAIA)</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Summed_Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Second_Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>First_Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-sum-iaic-oa</name>
+ <longname>Signal Sum (IAIC)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Signal Sum (IAIC)</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Summed_Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>First_Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-sum-icic-oc</name>
+ <longname>Signal Sum (ICIC)</longname>
+ <class>Source/Audio/LADSPA/Utilities</class>
+ <description>Signal Sum (ICIC)</description>
+ <author>Mike Rawes &lt;mike_rawes[at]yahoo.co.uk&gt;</author>
+ <pads>
+
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-surroundEncoder</name>
+ <longname>Surround matrix encoder</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>Surround matrix encoder</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Rt</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Lt</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>S</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>C</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>R</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>L</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-svf</name>
+ <longname>State Variable Filter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Filters</class>
+ <description>State Variable Filter</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-syncpulse-fapaga-oa</name>
+ <longname>Clock Pulse Oscillator with Gate (FAPAGA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators/Oscillators</class>
+ <description>Clock Pulse Oscillator with Gate (FAPAGA)</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Gatter</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Pulse_Width</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequenz</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-syncpulse-fcpcga-oa</name>
+ <longname>Clock Pulse Oscillator with Gate (FCPCGA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators/Oscillators</class>
+ <description>Clock Pulse Oscillator with Gate (FCPCGA)</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Gatter</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-syncsquare-faga-oa</name>
+ <longname>Clock Oscillator with Gate (FAGA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators/Oscillators</class>
+ <description>Clock Oscillator with Gate (FAGA)</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Gate</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequency</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-syncsquare-fcga-oa</name>
+ <longname>Clock Oscillator with Gate (FCGA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators/Oscillators</class>
+ <description>Clock Oscillator with Gate (FCGA)</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Gate</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tap-autopan</name>
+ <longname>TAP AutoPanner</longname>
+ <class>Filter/Effect/Audio/LADSPA/Amplitude/Modulators</class>
+ <description>TAP AutoPanner</description>
+ <author>Tom Szilagyi</author>
+ <pads>
+ <caps>
+ <name>Output_R</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_L</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_R</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_L</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tap-chorusflanger</name>
+ <longname>TAP Chorus/Flanger</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Flangers</class>
+ <description>TAP Chorus/Flanger</description>
+ <author>Tom Szilagyi</author>
+ <pads>
+ <caps>
+ <name>Output_R</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_L</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_R</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_L</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tap-deesser</name>
+ <longname>TAP DeEsser</longname>
+ <class>Filter/Effect/Audio/LADSPA/Amplitude/Dynamics</class>
+ <description>TAP DeEsser</description>
+ <author>Tom Szilagyi</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tap-doubler</name>
+ <longname>TAP Fractal Doubler</longname>
+ <class>Filter/Effect/Audio/LADSPA/Simulators</class>
+ <description>TAP Fractal Doubler</description>
+ <author>Tom Szilagyi</author>
+ <pads>
+ <caps>
+ <name>Output_R</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_L</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_R</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_L</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tap-dynamics-m</name>
+ <longname>TAP Dynamics (M)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Amplitude/Dynamics</class>
+ <description>TAP Dynamics (M)</description>
+ <author>Tom Szilagyi</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tap-dynamics-st</name>
+ <longname>TAP Dynamics (St)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Amplitude/Dynamics</class>
+ <description>TAP Dynamics (St)</description>
+ <author>Tom Szilagyi</author>
+ <pads>
+ <caps>
+ <name>Output_Right</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_Left</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_Right</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_Left</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tap-equalizer</name>
+ <longname>TAP Equalizer</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/EQs</class>
+ <description>TAP Equalizer</description>
+ <author>Tom Szilagyi</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tap-equalizer-bw</name>
+ <longname>TAP Equalizer/BW</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/EQs</class>
+ <description>TAP Equalizer/BW</description>
+ <author>Tom Szilagyi</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tap-limiter</name>
+ <longname>TAP Scaling Limiter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Limiters/Amplitude/Dynamics</class>
+ <description>TAP Scaling Limiter</description>
+ <author>Tom Szilagyi</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tap-pinknoise</name>
+ <longname>TAP Pink/Fractal Noise</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>TAP Pink/Fractal Noise</description>
+ <author>Tom Szilagyi</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tap-pitch</name>
+ <longname>TAP Pitch Shifter</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/Pitch shifters</class>
+ <description>TAP Pitch Shifter</description>
+ <author>Tom Szilagyi</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tap-reflector</name>
+ <longname>TAP Reflector</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time</class>
+ <description>TAP Reflector</description>
+ <author>Tom Szilagyi</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tap-reverb</name>
+ <longname>TAP Reverberator</longname>
+ <class>Filter/Effect/Audio/LADSPA/Reverbs/Time/Simulators</class>
+ <description>TAP Reverberator</description>
+ <author>Tom Szilagyi</author>
+ <pads>
+ <caps>
+ <name>Output_Right</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_Right</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_Left</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_Left</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tap-rotspeak</name>
+ <longname>TAP Rotary Speaker</longname>
+ <class>Filter/Effect/Audio/LADSPA/Simulators</class>
+ <description>TAP Rotary Speaker</description>
+ <author>Tom Szilagyi</author>
+ <pads>
+ <caps>
+ <name>Output_R</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_L</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_R</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_L</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tap-sigmoid</name>
+ <longname>TAP Sigmoid Booster</longname>
+ <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
+ <description>TAP Sigmoid Booster</description>
+ <author>Tom Szilagyi</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tap-stereo-echo</name>
+ <longname>TAP Stereo Echo</longname>
+ <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
+ <description>TAP Stereo Echo</description>
+ <author>Tom Szilagyi</author>
+ <pads>
+ <caps>
+ <name>Output_Right</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_Right</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_Left</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_Left</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tap-tremolo</name>
+ <longname>TAP Tremolo</longname>
+ <class>Filter/Effect/Audio/LADSPA/Amplitude/Modulators</class>
+ <description>TAP Tremolo</description>
+ <author>Tom Szilagyi</author>
+ <pads>
+ <caps>
+ <name>Output_0</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_0</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tap-tubewarmth</name>
+ <longname>TAP TubeWarmth</longname>
+ <class>Filter/Effect/Audio/LADSPA/Simulators</class>
+ <description>TAP TubeWarmth</description>
+ <author>Tom Szilagyi</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tap-vibrato</name>
+ <longname>TAP Vibrato</longname>
+ <class>Filter/Effect/Audio/LADSPA/Amplitude/Modulators</class>
+ <description>TAP Vibrato</description>
+ <author>Tom Szilagyi</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tapeDelay</name>
+ <longname>Tape Delay Simulation</longname>
+ <class>Filter/Effect/Audio/LADSPA</class>
+ <description>Tape Delay Simulation</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Decay_Rate_-Hz-_when_Gate_Low</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Attack_Rate_-Hz-_when_Gate_Low</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Decay_Rate_-Hz-_when_Gate_High</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Attack_Rate_-Hz-_when_Gate_High</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Gatter</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-tracker-gaacdcia-oa</name>
+ <longname>Signal Tracker (Control Rates)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Amplitude/Waveshapers</class>
+ <description>Signal Tracker (Control Rates)</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Gatter</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-transient</name>
+ <longname>Transient mangler</longname>
+ <class>Filter/Effect/Audio/LADSPA/Amplitude/Dynamics</class>
+ <description>Transient mangler</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-triangle-fasa-oa</name>
+ <longname>Bandlimited Variable Slope Triangle Oscillator (FASA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators/Oscillators</class>
+ <description>Bandlimited Variable Slope Triangle Oscillator (FASA)</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Slope</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequenz</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-triangle-fasc-oa</name>
+ <longname>Bandlimited Variable Slope Triangle Oscillator (FASC)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators/Oscillators</class>
+ <description>Bandlimited Variable Slope Triangle Oscillator (FASC)</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Frequenz</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-triangle-fcsa-oa</name>
+ <longname>Bandlimited Variable Slope Triangle Oscillator (FCSA)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators/Oscillators</class>
+ <description>Bandlimited Variable Slope Triangle Oscillator (FCSA)</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Slope</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-triangle-fcsc-oa</name>
+ <longname>Bandlimited Variable Slope Triangle Oscillator (FCSC)</longname>
+ <class>Source/Audio/LADSPA/Generators/Oscillators</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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-triplePara</name>
+ <longname>Triple band parametric with shelves</longname>
+ <class>Filter/Effect/Audio/LADSPA/Frequency/EQs/Parametric</class>
+ <description>Triple band parametric with shelves</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-valve</name>
+ <longname>Valve saturation</longname>
+ <class>Filter/Effect/Audio/LADSPA</class>
+ <description>Valve saturation</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-valveRect</name>
+ <longname>Valve rectifier</longname>
+ <class>Filter/Effect/Audio/LADSPA</class>
+ <description>Valve rectifier</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Out</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>In</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-vynil</name>
+ <longname>VyNil (Vinyl Effect)</longname>
+ <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
+ <description>VyNil (Vinyl Effect)</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output_R</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_L</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_R</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_L</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-waveTerrain</name>
+ <longname>Wave Terrain Oscillator</longname>
+ <class>Filter/Effect/Audio/LADSPA/Generators/Oscillators</class>
+ <description>Wave Terrain Oscillator</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>z</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>y</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>x</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </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, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Trigger</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</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>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-xfade</name>
+ <longname>Crossfade</longname>
+ <class>Filter/Effect/Audio/LADSPA</class>
+ <description>Crossfade</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output_right</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_left</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_B_right</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_B_left</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_A_right</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_A_left</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-xfade4</name>
+ <longname>Crossfade (4 outs)</longname>
+ <class>Filter/Effect/Audio/LADSPA</class>
+ <description>Crossfade (4 outs)</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output_B_right</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_B_left</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_A_right</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Output_A_left</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_B_right</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_B_left</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_A_right</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input_A_left</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ladspa-zm1</name>
+ <longname>z-1</longname>
+ <class>Filter/Effect/Audio/LADSPA/Utilities</class>
+ <description>z-1</description>
+ <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>Output</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>Input</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
</elements>
</plugin> \ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-legacyresample.xml b/docs/plugins/inspect/plugin-legacyresample.xml
index 647a4748..85ae2230 100644
--- a/docs/plugins/inspect/plugin-legacyresample.xml
+++ b/docs/plugins/inspect/plugin-legacyresample.xml
@@ -3,11 +3,11 @@
<description>Resamples audio</description>
<filename>../../gst/legacyresample/.libs/libgstlegacyresample.so</filename>
<basename>libgstlegacyresample.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>legacyresample</name>
diff --git a/docs/plugins/inspect/plugin-liveadder.xml b/docs/plugins/inspect/plugin-liveadder.xml
index 18967bf0..7264aada 100644
--- a/docs/plugins/inspect/plugin-liveadder.xml
+++ b/docs/plugins/inspect/plugin-liveadder.xml
@@ -3,11 +3,11 @@
<description>Adds multiple live discontinuous streams</description>
<filename>../../gst/liveadder/.libs/libgstliveadder.so</filename>
<basename>libgstliveadder.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>liveadder</name>
diff --git a/docs/plugins/inspect/plugin-lv2.xml b/docs/plugins/inspect/plugin-lv2.xml
new file mode 100644
index 00000000..56815650
--- /dev/null
+++ b/docs/plugins/inspect/plugin-lv2.xml
@@ -0,0 +1,352 @@
+<plugin>
+ <name>lv2</name>
+ <description>All LV2 plugins</description>
+ <filename>../../ext/lv2/.libs/libgstlv2.so</filename>
+ <basename>libgstlv2.so</basename>
+ <version>0.10.13.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-bad</source>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
+ <elements>
+ <element>
+ <name>http---calf-sourceforge-net-plugins-Compressor</name>
+ <longname>Calf Compressor</longname>
+ <class>Filter/Effect/Audio/LV2</class>
+ <description>Calf Compressor</description>
+ <author>Thor Harald Johansen</author>
+ <pads>
+ <caps>
+ <name>out_r</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>out_l</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in_r</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in_l</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>http---calf-sourceforge-net-plugins-Filter</name>
+ <longname>Calf Filter</longname>
+ <class>Filter/Effect/Audio/LV2</class>
+ <description>Calf Filter</description>
+ <author>Krzysztof Foltman</author>
+ <pads>
+ <caps>
+ <name>out_r</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>out_l</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in_r</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in_l</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>http---calf-sourceforge-net-plugins-Filterclavier</name>
+ <longname>Calf Filterclavier</longname>
+ <class>Filter/Effect/Audio/LV2</class>
+ <description>Calf Filterclavier</description>
+ <author>Krzysztof Foltman / Hans Baier</author>
+ <pads>
+ <caps>
+ <name>out_r</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>out_l</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in_r</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in_l</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>http---calf-sourceforge-net-plugins-Flanger</name>
+ <longname>Calf Flanger</longname>
+ <class>Filter/Effect/Audio/LV2</class>
+ <description>Calf Flanger</description>
+ <author>Krzysztof Foltman</author>
+ <pads>
+ <caps>
+ <name>out_r</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>out_l</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in_r</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in_l</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>http---calf-sourceforge-net-plugins-Monosynth</name>
+ <longname>Calf Monosynth</longname>
+ <class>Source/Audio/LV2</class>
+ <description>Calf Monosynth</description>
+ <author>Krzysztof Foltman</author>
+ <pads>
+ <caps>
+ <name>out_r</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>out_l</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>http---calf-sourceforge-net-plugins-MultiChorus</name>
+ <longname>Calf MultiChorus</longname>
+ <class>Filter/Effect/Audio/LV2</class>
+ <description>Calf MultiChorus</description>
+ <author>Krzysztof Foltman</author>
+ <pads>
+ <caps>
+ <name>out_r</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>out_l</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in_r</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in_l</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>http---calf-sourceforge-net-plugins-Organ</name>
+ <longname>Calf Organ</longname>
+ <class>Source/Audio/LV2</class>
+ <description>Calf Organ</description>
+ <author>Krzysztof Foltman</author>
+ <pads>
+ <caps>
+ <name>out_r</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>out_l</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>http---calf-sourceforge-net-plugins-Phaser</name>
+ <longname>Calf Phaser</longname>
+ <class>Filter/Effect/Audio/LV2</class>
+ <description>Calf Phaser</description>
+ <author>Krzysztof Foltman</author>
+ <pads>
+ <caps>
+ <name>out_r</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>out_l</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in_r</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in_l</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>http---calf-sourceforge-net-plugins-Reverb</name>
+ <longname>Calf Reverb</longname>
+ <class>Filter/Effect/Audio/LV2</class>
+ <description>Calf Reverb</description>
+ <author>Krzysztof Foltman</author>
+ <pads>
+ <caps>
+ <name>out_r</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>out_l</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in_r</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in_l</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>http---calf-sourceforge-net-plugins-RotarySpeaker</name>
+ <longname>Calf Rotary Speaker</longname>
+ <class>Filter/Effect/Audio/LV2</class>
+ <description>Calf Rotary Speaker</description>
+ <author>Krzysztof Foltman</author>
+ <pads>
+ <caps>
+ <name>out_r</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>out_l</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in_r</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in_l</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>http---calf-sourceforge-net-plugins-VintageDelay</name>
+ <longname>Calf Vintage Delay</longname>
+ <class>Filter/Effect/Audio/LV2</class>
+ <description>Calf Vintage Delay</description>
+ <author>Krzysztof Foltman</author>
+ <pads>
+ <caps>
+ <name>out_r</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>out_l</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in_r</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ <caps>
+ <name>in_l</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin> \ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-metadata.xml b/docs/plugins/inspect/plugin-metadata.xml
index a68fa129..3bed3e4b 100644
--- a/docs/plugins/inspect/plugin-metadata.xml
+++ b/docs/plugins/inspect/plugin-metadata.xml
@@ -3,11 +3,11 @@
<description>Metadata (EXIF, IPTC and XMP) image (JPEG, TIFF) demuxer and muxer</description>
<filename>../../ext/metadata/.libs/libgstmetadata.so</filename>
<basename>libgstmetadata.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>metadatademux</name>
diff --git a/docs/plugins/inspect/plugin-mms.xml b/docs/plugins/inspect/plugin-mms.xml
index 6c292cab..f02f2097 100644
--- a/docs/plugins/inspect/plugin-mms.xml
+++ b/docs/plugins/inspect/plugin-mms.xml
@@ -3,11 +3,11 @@
<description>Microsoft Multi Media Server streaming protocol support</description>
<filename>../../ext/libmms/.libs/libgstmms.so</filename>
<basename>libgstmms.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>mmssrc</name>
diff --git a/docs/plugins/inspect/plugin-modplug.xml b/docs/plugins/inspect/plugin-modplug.xml
index 65a955e6..f9faa2a3 100644
--- a/docs/plugins/inspect/plugin-modplug.xml
+++ b/docs/plugins/inspect/plugin-modplug.xml
@@ -1,13 +1,13 @@
<plugin>
<name>modplug</name>
<description>.MOD audio decoding</description>
- <filename>../../gst/modplug/.libs/libgstmodplug.so</filename>
+ <filename>../../ext/modplug/.libs/libgstmodplug.so</filename>
<basename>libgstmodplug.so</basename>
- <version>0.10.10</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>modplug</name>
diff --git a/docs/plugins/inspect/plugin-mpeg2enc.xml b/docs/plugins/inspect/plugin-mpeg2enc.xml
index 1b632e90..1f319aeb 100644
--- a/docs/plugins/inspect/plugin-mpeg2enc.xml
+++ b/docs/plugins/inspect/plugin-mpeg2enc.xml
@@ -3,11 +3,11 @@
<description>High-quality MPEG-1/2 video encoder</description>
<filename>../../ext/mpeg2enc/.libs/libgstmpeg2enc.so</filename>
<basename>libgstmpeg2enc.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>GPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>mpeg2enc</name>
diff --git a/docs/plugins/inspect/plugin-mpeg4videoparse.xml b/docs/plugins/inspect/plugin-mpeg4videoparse.xml
index e9c5cbc7..ad5c342d 100644
--- a/docs/plugins/inspect/plugin-mpeg4videoparse.xml
+++ b/docs/plugins/inspect/plugin-mpeg4videoparse.xml
@@ -3,11 +3,11 @@
<description>MPEG-4 video parser</description>
<filename>../../gst/mpeg4videoparse/.libs/libgstmpeg4videoparse.so</filename>
<basename>libgstmpeg4videoparse.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>mpeg4videoparse</name>
diff --git a/docs/plugins/inspect/plugin-mpegdemux2.xml b/docs/plugins/inspect/plugin-mpegdemux2.xml
index ff3bec69..17a45680 100644
--- a/docs/plugins/inspect/plugin-mpegdemux2.xml
+++ b/docs/plugins/inspect/plugin-mpegdemux2.xml
@@ -3,11 +3,11 @@
<description>MPEG demuxers</description>
<filename>../../gst/mpegdemux/.libs/libgstmpegdemux.so</filename>
<basename>libgstmpegdemux.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>unknown</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>mpegpsdemux</name>
diff --git a/docs/plugins/inspect/plugin-mpegtsmux.xml b/docs/plugins/inspect/plugin-mpegtsmux.xml
index 0e327254..4dd56f3d 100644
--- a/docs/plugins/inspect/plugin-mpegtsmux.xml
+++ b/docs/plugins/inspect/plugin-mpegtsmux.xml
@@ -3,11 +3,11 @@
<description>MPEG-TS muxer</description>
<filename>../../gst/mpegtsmux/.libs/libgstmpegtsmux.so</filename>
<basename>libgstmpegtsmux.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>mpegtsmux</name>
diff --git a/docs/plugins/inspect/plugin-mpegvideoparse.xml b/docs/plugins/inspect/plugin-mpegvideoparse.xml
index 5c098b36..3e49504a 100644
--- a/docs/plugins/inspect/plugin-mpegvideoparse.xml
+++ b/docs/plugins/inspect/plugin-mpegvideoparse.xml
@@ -3,11 +3,11 @@
<description>MPEG-1 and MPEG-2 video parser</description>
<filename>../../gst/mpegvideoparse/.libs/libgstmpegvideoparse.so</filename>
<basename>libgstmpegvideoparse.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>mpegvideoparse</name>
diff --git a/docs/plugins/inspect/plugin-mplex.xml b/docs/plugins/inspect/plugin-mplex.xml
index 66338cef..61ac705d 100644
--- a/docs/plugins/inspect/plugin-mplex.xml
+++ b/docs/plugins/inspect/plugin-mplex.xml
@@ -3,11 +3,11 @@
<description>High-quality MPEG/DVD/SVCD/VCD video/audio multiplexer</description>
<filename>../../ext/mplex/.libs/libgstmplex.so</filename>
<basename>libgstmplex.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>GPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>mplex</name>
diff --git a/docs/plugins/inspect/plugin-musepack.xml b/docs/plugins/inspect/plugin-musepack.xml
index b753852d..24f6d5b3 100644
--- a/docs/plugins/inspect/plugin-musepack.xml
+++ b/docs/plugins/inspect/plugin-musepack.xml
@@ -3,11 +3,11 @@
<description>Musepack decoder</description>
<filename>../../ext/musepack/.libs/libgstmusepack.so</filename>
<basename>libgstmusepack.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>musepackdec</name>
diff --git a/docs/plugins/inspect/plugin-musicbrainz.xml b/docs/plugins/inspect/plugin-musicbrainz.xml
index 9f598020..bdfa45ef 100644
--- a/docs/plugins/inspect/plugin-musicbrainz.xml
+++ b/docs/plugins/inspect/plugin-musicbrainz.xml
@@ -3,11 +3,11 @@
<description>A TRM signature producer based on libmusicbrainz</description>
<filename>../../ext/musicbrainz/.libs/libgsttrm.so</filename>
<basename>libgsttrm.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>trm</name>
diff --git a/docs/plugins/inspect/plugin-mve.xml b/docs/plugins/inspect/plugin-mve.xml
index 87184899..a1877cf1 100644
--- a/docs/plugins/inspect/plugin-mve.xml
+++ b/docs/plugins/inspect/plugin-mve.xml
@@ -3,11 +3,11 @@
<description>Interplay MVE movie format manipulation</description>
<filename>../../gst/mve/.libs/libgstmve.so</filename>
<basename>libgstmve.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>mvedemux</name>
diff --git a/docs/plugins/inspect/plugin-mxf.xml b/docs/plugins/inspect/plugin-mxf.xml
index 8fd7206f..37d52c1f 100644
--- a/docs/plugins/inspect/plugin-mxf.xml
+++ b/docs/plugins/inspect/plugin-mxf.xml
@@ -3,11 +3,11 @@
<description>MXF plugin library</description>
<filename>../../gst/mxf/.libs/libgstmxf.so</filename>
<basename>libgstmxf.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>mxfdemux</name>
diff --git a/docs/plugins/inspect/plugin-mythtv.xml b/docs/plugins/inspect/plugin-mythtv.xml
index 66ea45d5..a3d79651 100644
--- a/docs/plugins/inspect/plugin-mythtv.xml
+++ b/docs/plugins/inspect/plugin-mythtv.xml
@@ -3,11 +3,11 @@
<description>lib MythTV src</description>
<filename>../../ext/mythtv/.libs/libgstmythtvsrc.so</filename>
<basename>libgstmythtvsrc.so</basename>
- <version>0.10.13</version>
+ <version>0.10.10.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins CVS/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>mythtvsrc</name>
diff --git a/docs/plugins/inspect/plugin-nas.xml b/docs/plugins/inspect/plugin-nas.xml
index a2d5351b..aa39e10a 100644
--- a/docs/plugins/inspect/plugin-nas.xml
+++ b/docs/plugins/inspect/plugin-nas.xml
@@ -3,11 +3,11 @@
<description>NAS (Network Audio System) support for GStreamer</description>
<filename>../../ext/nas/.libs/libgstnassink.so</filename>
<basename>libgstnassink.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>nassink</name>
diff --git a/docs/plugins/inspect/plugin-neon.xml b/docs/plugins/inspect/plugin-neon.xml
index 186500c3..42edd463 100644
--- a/docs/plugins/inspect/plugin-neon.xml
+++ b/docs/plugins/inspect/plugin-neon.xml
@@ -3,11 +3,11 @@
<description>lib neon http client src</description>
<filename>../../ext/neon/.libs/libgstneonhttpsrc.so</filename>
<basename>libgstneonhttpsrc.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>neonhttpsrc</name>
diff --git a/docs/plugins/inspect/plugin-nsfdec.xml b/docs/plugins/inspect/plugin-nsfdec.xml
index 3e4a7021..e5e50df2 100644
--- a/docs/plugins/inspect/plugin-nsfdec.xml
+++ b/docs/plugins/inspect/plugin-nsfdec.xml
@@ -3,11 +3,11 @@
<description>Uses nosefart to decode .nsf files</description>
<filename>../../gst/nsf/.libs/libgstnsf.so</filename>
<basename>libgstnsf.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>GPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>nsfdec</name>
diff --git a/docs/plugins/inspect/plugin-nuvdemux.xml b/docs/plugins/inspect/plugin-nuvdemux.xml
index 7be0b05b..9af7bb1c 100644
--- a/docs/plugins/inspect/plugin-nuvdemux.xml
+++ b/docs/plugins/inspect/plugin-nuvdemux.xml
@@ -3,11 +3,11 @@
<description>Demuxes and muxes audio and video</description>
<filename>../../gst/nuvdemux/.libs/libgstnuvdemux.so</filename>
<basename>libgstnuvdemux.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>nuvdemux</name>
diff --git a/docs/plugins/inspect/plugin-oss4.xml b/docs/plugins/inspect/plugin-oss4.xml
index c11a8a89..d786c64b 100644
--- a/docs/plugins/inspect/plugin-oss4.xml
+++ b/docs/plugins/inspect/plugin-oss4.xml
@@ -3,11 +3,11 @@
<description>Open Sound System (OSS) version 4 support for GStreamer</description>
<filename>../../sys/oss4/.libs/libgstoss4audio.so</filename>
<basename>libgstoss4audio.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>oss4mixer</name>
diff --git a/docs/plugins/inspect/plugin-pcapparse.xml b/docs/plugins/inspect/plugin-pcapparse.xml
index df93ffab..0d6a59ec 100644
--- a/docs/plugins/inspect/plugin-pcapparse.xml
+++ b/docs/plugins/inspect/plugin-pcapparse.xml
@@ -3,7 +3,7 @@
<description>Element parsing raw pcap streams</description>
<filename>../../gst/pcapparse/.libs/libgstpcapparse.so</filename>
<basename>libgstpcapparse.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer</package>
diff --git a/docs/plugins/inspect/plugin-qtmux.xml b/docs/plugins/inspect/plugin-qtmux.xml
index 77afa85e..2310d3aa 100644
--- a/docs/plugins/inspect/plugin-qtmux.xml
+++ b/docs/plugins/inspect/plugin-qtmux.xml
@@ -3,7 +3,7 @@
<description>Quicktime Muxer plugin</description>
<filename>../../gst/qtmux/.libs/libgstqtmux.so</filename>
<basename>libgstqtmux.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>gsoc2008 package</package>
diff --git a/docs/plugins/inspect/plugin-rawparse.xml b/docs/plugins/inspect/plugin-rawparse.xml
index bcc466d1..d3676f6e 100644
--- a/docs/plugins/inspect/plugin-rawparse.xml
+++ b/docs/plugins/inspect/plugin-rawparse.xml
@@ -3,11 +3,11 @@
<description>Parses byte streams into raw frames</description>
<filename>../../gst/rawparse/.libs/libgstrawparse.so</filename>
<basename>libgstrawparse.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>audioparse</name>
diff --git a/docs/plugins/inspect/plugin-real.xml b/docs/plugins/inspect/plugin-real.xml
index 8120e64d..3fa748d1 100644
--- a/docs/plugins/inspect/plugin-real.xml
+++ b/docs/plugins/inspect/plugin-real.xml
@@ -3,11 +3,11 @@
<description>Decode REAL streams</description>
<filename>../../gst/real/.libs/libgstreal.so</filename>
<basename>libgstreal.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>realaudiodec</name>
diff --git a/docs/plugins/inspect/plugin-resindvd.xml b/docs/plugins/inspect/plugin-resindvd.xml
index d50f9a73..2bc97c79 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.13</version>
+ <version>0.10.13.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 703d50fd..cdf09044 100644
--- a/docs/plugins/inspect/plugin-rfbsrc.xml
+++ b/docs/plugins/inspect/plugin-rfbsrc.xml
@@ -3,11 +3,11 @@
<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.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>rfbsrc</name>
diff --git a/docs/plugins/inspect/plugin-rtpmux.xml b/docs/plugins/inspect/plugin-rtpmux.xml
index 108067fe..5388c80e 100644
--- a/docs/plugins/inspect/plugin-rtpmux.xml
+++ b/docs/plugins/inspect/plugin-rtpmux.xml
@@ -3,11 +3,11 @@
<description>RTP Muxer plugins</description>
<filename>../../gst/rtpmux/.libs/libgstrtpmux.so</filename>
<basename>libgstrtpmux.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>rtpdtmfmux</name>
diff --git a/docs/plugins/inspect/plugin-scaletempo.xml b/docs/plugins/inspect/plugin-scaletempo.xml
index 6097ad01..3f3a241d 100644
--- a/docs/plugins/inspect/plugin-scaletempo.xml
+++ b/docs/plugins/inspect/plugin-scaletempo.xml
@@ -3,7 +3,7 @@
<description>Scale audio tempo in sync with playback rate</description>
<filename>../../gst/scaletempo/.libs/libgstscaletempoplugin.so</filename>
<basename>libgstscaletempoplugin.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer</package>
diff --git a/docs/plugins/inspect/plugin-sdl.xml b/docs/plugins/inspect/plugin-sdl.xml
index ad5ae7e3..3276bec4 100644
--- a/docs/plugins/inspect/plugin-sdl.xml
+++ b/docs/plugins/inspect/plugin-sdl.xml
@@ -3,11 +3,11 @@
<description>SDL (Simple DirectMedia Layer) support for GStreamer</description>
<filename>../../ext/sdl/.libs/libgstsdl.so</filename>
<basename>libgstsdl.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>sdlaudiosink</name>
diff --git a/docs/plugins/inspect/plugin-sdp.xml b/docs/plugins/inspect/plugin-sdp.xml
index 410fb435..8de1ad41 100644
--- a/docs/plugins/inspect/plugin-sdp.xml
+++ b/docs/plugins/inspect/plugin-sdp.xml
@@ -3,11 +3,11 @@
<description>configure streaming sessions using SDP</description>
<filename>../../gst/sdp/.libs/libgstsdpelem.so</filename>
<basename>libgstsdpelem.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>sdpdemux</name>
diff --git a/docs/plugins/inspect/plugin-selector.xml b/docs/plugins/inspect/plugin-selector.xml
index 83637ed7..bdf9454a 100644
--- a/docs/plugins/inspect/plugin-selector.xml
+++ b/docs/plugins/inspect/plugin-selector.xml
@@ -3,11 +3,11 @@
<description>input/output stream selector elements</description>
<filename>../../gst/selector/.libs/libgstselector.so</filename>
<basename>libgstselector.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>input-selector</name>
diff --git a/docs/plugins/inspect/plugin-shapewipe.xml b/docs/plugins/inspect/plugin-shapewipe.xml
index 02b74125..d8ee5419 100644
--- a/docs/plugins/inspect/plugin-shapewipe.xml
+++ b/docs/plugins/inspect/plugin-shapewipe.xml
@@ -3,11 +3,11 @@
<description>Shape Wipe transition filter</description>
<filename>../../gst/shapewipe/.libs/libgstshapewipe.so</filename>
<basename>libgstshapewipe.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>shapewipe</name>
@@ -20,7 +20,7 @@
<name>src</name>
<direction>source</direction>
<presence>always</presence>
- <details>video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ <details>video/x-raw-yuv, format=(fourcc)AYUV, 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)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>mask_sink</name>
@@ -32,7 +32,7 @@
<name>video_sink</name>
<direction>sink</direction>
<presence>always</presence>
- <details>video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ <details>video/x-raw-yuv, format=(fourcc)AYUV, 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)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>
diff --git a/docs/plugins/inspect/plugin-sndfile.xml b/docs/plugins/inspect/plugin-sndfile.xml
index e461b79c..5dcdbdda 100644
--- a/docs/plugins/inspect/plugin-sndfile.xml
+++ b/docs/plugins/inspect/plugin-sndfile.xml
@@ -3,11 +3,11 @@
<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.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>sfsink</name>
diff --git a/docs/plugins/inspect/plugin-soundtouch.xml b/docs/plugins/inspect/plugin-soundtouch.xml
index bd4b5ba5..604b7557 100644
--- a/docs/plugins/inspect/plugin-soundtouch.xml
+++ b/docs/plugins/inspect/plugin-soundtouch.xml
@@ -3,11 +3,11 @@
<description>Audio Pitch Controller &amp; BPM Detection</description>
<filename>../../ext/soundtouch/.libs/libgstsoundtouch.so</filename>
<basename>libgstsoundtouch.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>bpmdetect</name>
diff --git a/docs/plugins/inspect/plugin-spcdec.xml b/docs/plugins/inspect/plugin-spcdec.xml
index 815e920e..54af91f5 100644
--- a/docs/plugins/inspect/plugin-spcdec.xml
+++ b/docs/plugins/inspect/plugin-spcdec.xml
@@ -3,11 +3,11 @@
<description>OpenSPC Audio Decoder</description>
<filename>../../ext/spc/.libs/libgstspc.so</filename>
<basename>libgstspc.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>spcdec</name>
diff --git a/docs/plugins/inspect/plugin-speed.xml b/docs/plugins/inspect/plugin-speed.xml
index 264d8f2b..1f46d6c9 100644
--- a/docs/plugins/inspect/plugin-speed.xml
+++ b/docs/plugins/inspect/plugin-speed.xml
@@ -3,11 +3,11 @@
<description>Set speed/pitch on audio/raw streams (resampler)</description>
<filename>../../gst/speed/.libs/libgstspeed.so</filename>
<basename>libgstspeed.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>speed</name>
diff --git a/docs/plugins/inspect/plugin-stereo.xml b/docs/plugins/inspect/plugin-stereo.xml
index 7a3eadf9..36aa1066 100644
--- a/docs/plugins/inspect/plugin-stereo.xml
+++ b/docs/plugins/inspect/plugin-stereo.xml
@@ -3,11 +3,11 @@
<description>Muck with the stereo signal, enhance it's 'stereo-ness'</description>
<filename>../../gst/stereo/.libs/libgststereo.so</filename>
<basename>libgststereo.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>stereo</name>
diff --git a/docs/plugins/inspect/plugin-subenc.xml b/docs/plugins/inspect/plugin-subenc.xml
index 68724664..a4121261 100644
--- a/docs/plugins/inspect/plugin-subenc.xml
+++ b/docs/plugins/inspect/plugin-subenc.xml
@@ -3,11 +3,11 @@
<description>subtitle encoders</description>
<filename>../../gst/subenc/.libs/libgstsubenc.so</filename>
<basename>libgstsubenc.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>srtenc</name>
diff --git a/docs/plugins/inspect/plugin-timidity.xml b/docs/plugins/inspect/plugin-timidity.xml
index 20000ea8..b13217b9 100644
--- a/docs/plugins/inspect/plugin-timidity.xml
+++ b/docs/plugins/inspect/plugin-timidity.xml
@@ -3,10 +3,10 @@
<description>Timidity Plugin</description>
<filename>../../ext/timidity/.libs/libgsttimidity.so</filename>
<basename>libgsttimidity.so</basename>
- <version>0.10.10.1</version>
+ <version>0.10.13.1</version>
<license>GPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins CVS/prerelease</package>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
<origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
diff --git a/docs/plugins/inspect/plugin-tta.xml b/docs/plugins/inspect/plugin-tta.xml
index 34415a36..c5e64173 100644
--- a/docs/plugins/inspect/plugin-tta.xml
+++ b/docs/plugins/inspect/plugin-tta.xml
@@ -3,11 +3,11 @@
<description>TTA lossless audio format handling</description>
<filename>../../gst/tta/.libs/libgsttta.so</filename>
<basename>libgsttta.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>ttadec</name>
diff --git a/docs/plugins/inspect/plugin-valve.xml b/docs/plugins/inspect/plugin-valve.xml
index 4bfe29f3..4a895d1a 100644
--- a/docs/plugins/inspect/plugin-valve.xml
+++ b/docs/plugins/inspect/plugin-valve.xml
@@ -3,11 +3,11 @@
<description>Valve</description>
<filename>../../gst/valve/.libs/libgstvalve.so</filename>
<basename>libgstvalve.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>valve</name>
diff --git a/docs/plugins/inspect/plugin-vcdsrc.xml b/docs/plugins/inspect/plugin-vcdsrc.xml
index 804a6984..d9d07948 100644
--- a/docs/plugins/inspect/plugin-vcdsrc.xml
+++ b/docs/plugins/inspect/plugin-vcdsrc.xml
@@ -3,11 +3,11 @@
<description>Asynchronous read from VCD disk</description>
<filename>../../sys/vcd/.libs/libgstvcdsrc.so</filename>
<basename>libgstvcdsrc.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>vcdsrc</name>
diff --git a/docs/plugins/inspect/plugin-videosignal.xml b/docs/plugins/inspect/plugin-videosignal.xml
index 73209eff..d99e8de6 100644
--- a/docs/plugins/inspect/plugin-videosignal.xml
+++ b/docs/plugins/inspect/plugin-videosignal.xml
@@ -3,11 +3,11 @@
<description>Various video signal analysers</description>
<filename>../../gst/videosignal/.libs/libgstvideosignal.so</filename>
<basename>libgstvideosignal.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>videoanalyse</name>
diff --git a/docs/plugins/inspect/plugin-vmnc.xml b/docs/plugins/inspect/plugin-vmnc.xml
index ea56e443..a3c2812e 100644
--- a/docs/plugins/inspect/plugin-vmnc.xml
+++ b/docs/plugins/inspect/plugin-vmnc.xml
@@ -3,11 +3,11 @@
<description>VMnc video plugin library</description>
<filename>../../gst/vmnc/.libs/libgstvmnc.so</filename>
<basename>libgstvmnc.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>vmncdec</name>
diff --git a/docs/plugins/inspect/plugin-wildmidi.xml b/docs/plugins/inspect/plugin-wildmidi.xml
index 0b0e3c57..41650db7 100644
--- a/docs/plugins/inspect/plugin-wildmidi.xml
+++ b/docs/plugins/inspect/plugin-wildmidi.xml
@@ -3,11 +3,11 @@
<description>Wildmidi Plugin</description>
<filename>../../ext/timidity/.libs/libgstwildmidi.so</filename>
<basename>libgstwildmidi.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>GPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>wildmidi</name>
diff --git a/docs/plugins/inspect/plugin-xdgmime.xml b/docs/plugins/inspect/plugin-xdgmime.xml
index 79ee46d8..42d28990 100644
--- a/docs/plugins/inspect/plugin-xdgmime.xml
+++ b/docs/plugins/inspect/plugin-xdgmime.xml
@@ -3,11 +3,11 @@
<description>XDG-MIME</description>
<filename>../../gst/xdgmime/.libs/libgstxdgmime.so</filename>
<basename>libgstxdgmime.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
</elements>
diff --git a/docs/plugins/inspect/plugin-xvid.xml b/docs/plugins/inspect/plugin-xvid.xml
index 4d9cbe22..ee542f2d 100644
--- a/docs/plugins/inspect/plugin-xvid.xml
+++ b/docs/plugins/inspect/plugin-xvid.xml
@@ -3,11 +3,11 @@
<description>XviD plugin library</description>
<filename>../../ext/xvid/.libs/libgstxvid.so</filename>
<basename>libgstxvid.so</basename>
- <version>0.10.13</version>
+ <version>0.10.13.1</version>
<license>GPL</license>
<source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins source release</package>
- <origin>Unknown package origin</origin>
+ <package>GStreamer Bad Plug-ins git/prerelease</package>
+ <origin>http://gstreamer.freedesktop.org</origin>
<elements>
<element>
<name>xviddec</name>
@@ -41,7 +41,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 ]</details>
+ <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>
</caps>
<caps>
<name>sink</name>
diff --git a/ext/Makefile.am b/ext/Makefile.am
index a2ecd18d..fafa1146 100644
--- a/ext/Makefile.am
+++ b/ext/Makefile.am
@@ -148,6 +148,12 @@ else
JP2K_DIR =
endif
+if USE_KATE
+KATE_DIR=kate
+else
+KATE_DIR=
+endif
+
if USE_LADSPA
LADSPA_DIR = ladspa
else
@@ -362,6 +368,7 @@ SUBDIRS=\
$(IVORBIS_DIR) \
$(JACK_DIR) \
$(JP2K_DIR) \
+ $(KATE_DIR) \
$(LADSPA_DIR) \
$(LV2_DIR) \
$(LCS_DIR) \
@@ -411,6 +418,7 @@ DIST_SUBDIRS = \
ladspa \
jack \
jp2k \
+ kate \
libmms \
lv2 \
dts \
diff --git a/ext/kate/Makefile.am b/ext/kate/Makefile.am
new file mode 100644
index 00000000..fd7a8408
--- /dev/null
+++ b/ext/kate/Makefile.am
@@ -0,0 +1,20 @@
+# plugindir is set in configure
+
+plugin_LTLIBRARIES = libgstkate.la
+
+# sources used to compile this plug-in
+libgstkate_la_SOURCES = gstkate.c gstkatedec.c gstkateenc.c gstkateparse.c gstkatetag.c gstkateutil.c gstkatespu.c
+if USE_TIGER
+libgstkate_la_SOURCES += gstkatetiger.c
+endif
+
+# flags used to compile this plugin
+libgstkate_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(TIGER_CFLAGS) $(KATE_CFLAGS)
+libgstkate_la_LIBADD = $(GST_PLUGIN_BASE_LIBS) -lgsttag-$(GST_MAJORMINOR) $(GST_LIBS) $(TIGER_LIBS) $(KATE_LIBS)
+libgstkate_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstkate_la_LIBTOOLFLAGS = --tag=disable-static
+
+# headers we need but don't want installed
+noinst_HEADERS = gstkate.h gstkatedec.h gstkateenc.h gstkateparse.h gstkatetag.h gstkateutil.h gstkatespu.h gstkatetiger.h
+
+EXTRA_DIST=README
diff --git a/ext/kate/README b/ext/kate/README
new file mode 100644
index 00000000..498a79e2
--- /dev/null
+++ b/ext/kate/README
@@ -0,0 +1,20 @@
+Kate is a free codec for text based data, which can also carry images.
+It is typically used to create overlays on a video.
+
+libkate, a codec for Kate streams, is required to build this plugin:
+http://libkate.googlecode.com/
+
+libtiger, a rendering library for Kate streams, is optional:
+http://libtiger.googlecode.com/
+
+The Kate plugin contains various elements to manipulate Kate streams:
+
+ - katedec: decodes Kate streams to text and SPU images
+ - kateenc: encodes Kate streams from text and SPU images
+ - kateparse: parses Kate streams
+ - katetag: allows changing metadata in Kate streams
+ - tiger: decodes and renders Kate streams using libtiger (needs libtiger)
+
+More information about Kate can be found at:
+http://wiki.xiph.org/index.php/OggKate
+
diff --git a/ext/kate/gstkate.c b/ext/kate/gstkate.c
new file mode 100644
index 00000000..7fecec30
--- /dev/null
+++ b/ext/kate/gstkate.c
@@ -0,0 +1,117 @@
+/*
+ * GStreamer
+ * Copyright 2005 Thomas Vander Stichele <thomas@apestaart.org>
+ * Copyright 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright 2008 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Alternatively, the contents of this file may be used under the
+ * GNU Lesser General Public License Version 2.1 (the "LGPL"), in
+ * which case the following provisions apply instead of the ones
+ * mentioned above:
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include <gst/gst.h>
+
+#include "gstkate.h"
+#include "gstkatedec.h"
+#include "gstkateenc.h"
+#include "gstkateparse.h"
+#include "gstkatetag.h"
+#ifdef HAVE_TIGER
+#include "gstkatetiger.h"
+#endif
+
+GST_DEBUG_CATEGORY (gst_katedec_debug);
+GST_DEBUG_CATEGORY (gst_kateenc_debug);
+GST_DEBUG_CATEGORY (gst_kateparse_debug);
+GST_DEBUG_CATEGORY (gst_katetag_debug);
+#ifdef HAVE_TIGER
+GST_DEBUG_CATEGORY (gst_katetiger_debug);
+#endif
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ GST_DEBUG_CATEGORY_INIT (gst_katedec_debug, "katedec", 0, "Kate decoder");
+ GST_DEBUG_CATEGORY_INIT (gst_kateenc_debug, "kateenc", 0, "Kate encoder");
+ GST_DEBUG_CATEGORY_INIT (gst_kateparse_debug, "kateparse", 0, "Kate parser");
+ GST_DEBUG_CATEGORY_INIT (gst_katetag_debug, "katetag", 0, "Kate tagger");
+#ifdef HAVE_TIGER
+ GST_DEBUG_CATEGORY_INIT (gst_katetiger_debug, "tiger", 0,
+ "Kate Tiger renderer");
+#endif
+
+ /* if we don't build tiger, we'll want to autoplug and convert to text,
+ but if we do build tiger, we'll want to use it preferentially as it
+ can play non text streams too */
+ if (!gst_element_register (plugin, "katedec", GST_RANK_NONE,
+ GST_TYPE_KATE_DEC))
+ return FALSE;
+
+ if (!gst_element_register (plugin, "kateenc", GST_RANK_NONE,
+ GST_TYPE_KATE_ENC))
+ return FALSE;
+
+ if (!gst_element_register (plugin, "kateparse", GST_RANK_NONE,
+ GST_TYPE_KATE_PARSE))
+ return FALSE;
+
+ if (!gst_element_register (plugin, "katetag", GST_RANK_NONE,
+ GST_TYPE_KATE_TAG))
+ return FALSE;
+
+#ifdef HAVE_TIGER
+ if (!gst_element_register (plugin, "tiger", GST_RANK_NONE,
+ GST_TYPE_KATE_TIGER))
+ return FALSE;
+#endif
+
+ return TRUE;
+}
+
+/* this is the structure that gstreamer looks for to register plugins
+ */
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "kate",
+ "Kate plugin",
+ plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/ext/kate/gstkate.h b/ext/kate/gstkate.h
new file mode 100644
index 00000000..f1968813
--- /dev/null
+++ b/ext/kate/gstkate.h
@@ -0,0 +1,55 @@
+/*
+ * GStreamer
+ * Copyright (C) 2008 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Alternatively, the contents of this file may be used under the
+ * GNU Lesser General Public License Version 2.1 (the "LGPL"), in
+ * which case the following provisions apply instead of the ones
+ * mentioned above:
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_KATE_H__
+#define __GST_KATE_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+/* nothing here any more */
+
+G_END_DECLS
+
+#endif /* __GST_KATE_H__ */
diff --git a/ext/kate/gstkatedec.c b/ext/kate/gstkatedec.c
new file mode 100644
index 00000000..fe5ac51c
--- /dev/null
+++ b/ext/kate/gstkatedec.c
@@ -0,0 +1,360 @@
+/*
+ * GStreamer
+ * Copyright 2005 Thomas Vander Stichele <thomas@apestaart.org>
+ * Copyright 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright 2008, 2009 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Alternatively, the contents of this file may be used under the
+ * GNU Lesser General Public License Version 2.1 (the "LGPL"), in
+ * which case the following provisions apply instead of the ones
+ * mentioned above:
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-katedec
+ * @see_also: oggdemux
+ *
+ * <refsect2>
+ * <para>
+ * This element decodes Kate streams
+ * <ulink url="http://libkate.googlecode.com/">Kate</ulink> is a free codec
+ * for text based data, such as subtitles. Any number of kate streams can be
+ * embedded in an Ogg stream.
+ * </para>
+ * <para>
+ * libkate (see above url) is needed to build this plugin.
+ * </para>
+ * <title>Example pipeline</title>
+ * <para>
+ * This explicitely decodes a Kate stream:
+ * <programlisting>
+ * gst-launch filesrc location=test.ogg ! oggdemux ! katedec ! fakesink silent=TRUE
+ * </programlisting>
+ * </para>
+ * <para>
+ * This will automatically detect and use any Kate streams multiplexed
+ * in an Ogg stream:
+ * <programlisting>
+ * gst-launch playbin uri=file:///tmp/test.ogg
+ * </programlisting>
+ * </para>
+ * </refsect2>
+ */
+
+/* FIXME: post appropriate GST_ELEMENT_ERROR when returning FLOW_ERROR */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include <gst/gst.h>
+
+#include "gstkate.h"
+#include "gstkatespu.h"
+#include "gstkatedec.h"
+
+GST_DEBUG_CATEGORY_EXTERN (gst_katedec_debug);
+#define GST_CAT_DEFAULT gst_katedec_debug
+
+/* Filter signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+enum
+{
+ ARG_REMOVE_MARKUP = DECODER_BASE_ARG_COUNT
+};
+
+/* We don't accept application/x-kate here on purpose for now, since we're
+ * only really interested in subtitle-like things for playback purposes, not
+ * cracktastic complex overlays or presentation images etc. - those should be
+ * fed into a tiger overlay plugin directly */
+static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("subtitle/x-kate")
+ );
+
+static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("text/plain; text/x-pango-markup; " GST_KATE_SPU_MIME_TYPE)
+ );
+
+GST_BOILERPLATE (GstKateDec, gst_kate_dec, GstElement, GST_TYPE_ELEMENT);
+
+static void gst_kate_dec_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_kate_dec_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static GstFlowReturn gst_kate_dec_chain (GstPad * pad, GstBuffer * buf);
+static GstStateChangeReturn gst_kate_dec_change_state (GstElement * element,
+ GstStateChange transition);
+static gboolean gst_kate_dec_sink_query (GstPad * pad, GstQuery * query);
+
+static void
+gst_kate_dec_base_init (gpointer gclass)
+{
+ static GstElementDetails element_details =
+ GST_ELEMENT_DETAILS ("Kate stream text decoder",
+ "Codec/Decoder/Subtitle",
+ "Decodes Kate text streams",
+ "Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>");
+ GstElementClass *element_class = GST_ELEMENT_CLASS (gclass);
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&src_factory));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&sink_factory));
+ gst_element_class_set_details (element_class, &element_details);
+}
+
+/* initialize the plugin's class */
+static void
+gst_kate_dec_class_init (GstKateDecClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+
+ gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_kate_dec_set_property);
+ gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_kate_dec_get_property);
+
+ gst_kate_util_install_decoder_base_properties (gobject_class);
+
+ g_object_class_install_property (gobject_class, ARG_REMOVE_MARKUP,
+ g_param_spec_boolean ("remove-markup", "Remove markup",
+ "Remove markup from decoded text ?", FALSE, G_PARAM_READWRITE));
+
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_kate_dec_change_state);
+}
+
+/* initialize the new element
+ * instantiate pads and add them to element
+ * set functions
+ * initialize structure
+ */
+static void
+gst_kate_dec_init (GstKateDec * dec, GstKateDecClass * gclass)
+{
+ GST_DEBUG_OBJECT (dec, "gst_kate_dec_init");
+
+ dec->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink");
+ gst_pad_set_chain_function (dec->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_kate_dec_chain));
+ gst_pad_set_query_function (dec->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_kate_dec_sink_query));
+ gst_pad_use_fixed_caps (dec->sinkpad);
+ gst_pad_set_caps (dec->sinkpad,
+ gst_static_pad_template_get_caps (&sink_factory));
+ gst_element_add_pad (GST_ELEMENT (dec), dec->sinkpad);
+
+ dec->srcpad = gst_pad_new_from_static_template (&src_factory, "src");
+ gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad);
+
+ gst_kate_util_decode_base_init (&dec->decoder);
+
+ dec->remove_markup = FALSE;
+}
+
+static void
+gst_kate_dec_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ switch (prop_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_kate_dec_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstKateDec *kd = GST_KATE_DEC (object);
+
+ switch (prop_id) {
+ case ARG_REMOVE_MARKUP:
+ g_value_set_boolean (value, kd->remove_markup);
+ break;
+ default:
+ if (!gst_kate_util_decoder_base_get_property (&kd->decoder, object,
+ prop_id, value, pspec)) {
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+ break;
+ }
+}
+
+/* GstElement vmethod implementations */
+
+/* chain function
+ * this function does the actual processing
+ */
+
+static GstFlowReturn
+gst_kate_dec_chain (GstPad * pad, GstBuffer * buf)
+{
+ GstKateDec *kd = GST_KATE_DEC (gst_pad_get_parent (pad));
+ const kate_event *ev = NULL;
+ GstFlowReturn rflow = GST_FLOW_OK;
+
+ rflow =
+ gst_kate_util_decoder_base_chain_kate_packet (&kd->decoder,
+ GST_ELEMENT_CAST (kd), pad, buf, kd->srcpad, &ev);
+ if (G_UNLIKELY (rflow != GST_FLOW_OK)) {
+ gst_object_unref (kd);
+ gst_buffer_unref (buf);
+ return rflow;
+ }
+
+ if (ev) {
+ gchar *escaped;
+ GstBuffer *buffer;
+ size_t len;
+ gboolean plain = TRUE;
+
+ if (kd->remove_markup && ev->text_markup_type != kate_markup_none) {
+ size_t len0 = ev->len + 1;
+ escaped = g_strdup (ev->text);
+ if (escaped) {
+ kate_text_remove_markup (ev->text_encoding, escaped, &len0);
+ }
+ plain = TRUE;
+ } else if (ev->text_markup_type == kate_markup_none) {
+ /* no pango markup yet, escape text */
+ /* TODO: actually do the pango thing */
+ escaped = g_markup_printf_escaped ("%s", ev->text);
+ plain = TRUE;
+ } else {
+ escaped = g_strdup (ev->text);
+ plain = FALSE;
+ }
+
+ if (G_LIKELY (escaped)) {
+ len = strlen (escaped);
+ if (len > 0) {
+ GST_DEBUG_OBJECT (kd, "kate event: %s, escaped %s", ev->text, escaped);
+ buffer = gst_buffer_new_and_alloc (len + 1);
+ if (G_LIKELY (buffer)) {
+ const char *mime = plain ? "text/plain" : "text/x-pango-markup";
+ GstCaps *caps = gst_caps_new_simple (mime, NULL);
+ gst_buffer_set_caps (buffer, caps);
+ gst_caps_unref (caps);
+ /* allocate and copy the NULs, but don't include them in passed size */
+ memcpy (GST_BUFFER_DATA (buffer), escaped, len + 1);
+ GST_BUFFER_SIZE (buffer) = len;
+ GST_BUFFER_TIMESTAMP (buffer) = ev->start_time * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) =
+ (ev->end_time - ev->start_time) * GST_SECOND;
+ rflow = gst_pad_push (kd->srcpad, buffer);
+ if (rflow == GST_FLOW_NOT_LINKED) {
+ GST_DEBUG_OBJECT (kd, "source pad not linked, ignored");
+ } else if (rflow != GST_FLOW_OK) {
+ GST_WARNING_OBJECT (kd, "failed to push buffer: %s",
+ gst_flow_get_name (rflow));
+ }
+ } else {
+ GST_WARNING_OBJECT (kd, "failed to create buffer");
+ rflow = GST_FLOW_ERROR;
+ }
+ } else {
+ GST_WARNING_OBJECT (kd, "Empty string, nothing to do");
+ rflow = GST_FLOW_OK;
+ }
+ g_free (escaped);
+ } else {
+ GST_WARNING_OBJECT (kd, "failed to allocate string");
+ rflow = GST_FLOW_ERROR;
+ }
+
+ // if there's a background paletted bitmap, construct a DVD SPU for it
+ if (ev->bitmap && ev->palette) {
+ GstBuffer *buffer = gst_kate_spu_encode_spu (kd, ev);
+ if (buffer) {
+ GstCaps *caps = gst_caps_new_simple (GST_KATE_SPU_MIME_TYPE, NULL);
+ gst_buffer_set_caps (buffer, caps);
+ gst_caps_unref (caps);
+ GST_BUFFER_TIMESTAMP (buffer) = ev->start_time * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) =
+ (ev->end_time - ev->start_time) * GST_SECOND;
+ rflow = gst_pad_push (kd->srcpad, buffer);
+ if (rflow == GST_FLOW_NOT_LINKED) {
+ GST_DEBUG_OBJECT (kd, "source pad not linked, ignored");
+ } else if (rflow != GST_FLOW_OK) {
+ GST_WARNING_OBJECT (kd, "failed to push buffer: %s",
+ gst_flow_get_name (rflow));
+ }
+ } else {
+ GST_WARNING_OBJECT (kd, "failed to create SPU from paletted bitmap");
+ rflow = GST_FLOW_ERROR;
+ }
+ }
+ }
+
+ gst_object_unref (kd);
+ gst_buffer_unref (buf);
+ return rflow;
+}
+
+static GstStateChangeReturn
+gst_kate_dec_change_state (GstElement * element, GstStateChange transition)
+{
+ GstKateDec *kd = GST_KATE_DEC (element);
+ return gst_kate_decoder_base_change_state (&kd->decoder, element,
+ parent_class, transition);
+}
+
+gboolean
+gst_kate_dec_sink_query (GstPad * pad, GstQuery * query)
+{
+ GstKateDec *kd = GST_KATE_DEC (gst_pad_get_parent (pad));
+ gboolean res =
+ gst_kate_decoder_base_sink_query (&kd->decoder, GST_ELEMENT_CAST (kd),
+ pad, query);
+ gst_object_unref (kd);
+ return res;
+}
diff --git a/ext/kate/gstkatedec.h b/ext/kate/gstkatedec.h
new file mode 100644
index 00000000..a7011ecb
--- /dev/null
+++ b/ext/kate/gstkatedec.h
@@ -0,0 +1,88 @@
+/*
+ * GStreamer
+ * Copyright 2005 Thomas Vander Stichele <thomas@apestaart.org>
+ * Copyright 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright 2008 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Alternatively, the contents of this file may be used under the
+ * GNU Lesser General Public License Version 2.1 (the "LGPL"), in
+ * which case the following provisions apply instead of the ones
+ * mentioned above:
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_KATE_DEC_H__
+#define __GST_KATE_DEC_H__
+
+#include <kate/kate.h>
+#include <gst/gst.h>
+#include "gstkateutil.h"
+
+G_BEGIN_DECLS
+/* #defines don't like whitespacey bits */
+#define GST_TYPE_KATE_DEC \
+ (gst_kate_dec_get_type())
+#define GST_KATE_DEC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_KATE_DEC,GstKateDec))
+#define GST_KATE_DEC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_KATE,GstKateDecClass))
+#define GST_IS_KATE_DEC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_KATE_DEC))
+#define GST_IS_KATE_DEC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_KATE_DEC))
+typedef struct _GstKateDec GstKateDec;
+typedef struct _GstKateDecClass GstKateDecClass;
+
+struct _GstKateDec
+{
+ GstElement element;
+
+ GstPad *sinkpad;
+ GstPad *srcpad;
+
+ GstKateDecoderBase decoder;
+
+ gboolean remove_markup;
+};
+
+struct _GstKateDecClass
+{
+ GstElementClass parent_class;
+};
+
+GType gst_kate_dec_get_type (void);
+
+G_END_DECLS
+#endif /* __GST_KATE_DEC_H__ */
diff --git a/ext/kate/gstkateenc.c b/ext/kate/gstkateenc.c
new file mode 100644
index 00000000..80709eb3
--- /dev/null
+++ b/ext/kate/gstkateenc.c
@@ -0,0 +1,1338 @@
+/*
+ * GStreamer
+ * Copyright 2005 Thomas Vander Stichele <thomas@apestaart.org>
+ * Copyright 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright (C) 2007 Fluendo S.A. <info@fluendo.com>
+ * Copyright 2008, 2009 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Alternatively, the contents of this file may be used under the
+ * GNU Lesser General Public License Version 2.1 (the "LGPL"), in
+ * which case the following provisions apply instead of the ones
+ * mentioned above:
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-kateenc
+ * @see_also: oggmux
+ *
+ * <refsect2>
+ * <para>
+ * This element encodes Kate streams
+ * <ulink url="http://libkate.googlecode.com/">Kate</ulink> is a free codec
+ * for text based data, such as subtitles. Any number of kate streams can be
+ * embedded in an Ogg stream.
+ * </para>
+ * <para>
+ * libkate (see above url) is needed to build this plugin.
+ * </para>
+ * <title>Example pipeline</title>
+ * <para>
+ * This encodes a DVD SPU track to a Kate stream:
+ * <programlisting>
+ * gst-launch dvdreadsrc ! dvddemux ! dvdsubparse ! kateenc ! oggmux ! filesink location=test.ogg
+ * </programlisting>
+ * </para>
+ * </refsect2>
+ */
+
+/* FIXME: post appropriate GST_ELEMENT_ERROR when returning FLOW_ERROR */
+/* FIXME: should we automatically pick up the language code from the
+ * upstream event tags if none was set via the property? */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include <gst/gst.h>
+#include <gst/gsttagsetter.h>
+#include <gst/tag/tag.h>
+
+#include "gstkate.h"
+#include "gstkateutil.h"
+#include "gstkatespu.h"
+#include "gstkateenc.h"
+
+GST_DEBUG_CATEGORY_EXTERN (gst_kateenc_debug);
+#define GST_CAT_DEFAULT gst_kateenc_debug
+
+/* Filter signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+enum
+{
+ ARG_0,
+ ARG_LANGUAGE,
+ ARG_CATEGORY,
+ ARG_GRANULE_RATE_NUM,
+ ARG_GRANULE_RATE_DEN,
+ ARG_GRANULE_SHIFT,
+ ARG_KEEPALIVE_MIN_TIME,
+ ARG_ORIGINAL_CANVAS_WIDTH,
+ ARG_ORIGINAL_CANVAS_HEIGHT,
+ ARG_DEFAULT_SPU_DURATION,
+};
+
+#define DEFAULT_KEEPALIVE_MIN_TIME 2.5f
+#define DEFAULT_DEFAULT_SPU_DURATION 1.5f
+
+static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("text/plain; text/x-pango-markup; " GST_KATE_SPU_MIME_TYPE)
+ );
+
+static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("subtitle/x-kate; application/x-kate")
+ );
+
+static void gst_kate_enc_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_kate_enc_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void gst_kate_enc_dispose (GObject * object);
+
+static GstFlowReturn gst_kate_enc_chain (GstPad * pad, GstBuffer * buf);
+static GstStateChangeReturn gst_kate_enc_change_state (GstElement * element,
+ GstStateChange transition);
+static gboolean gst_kate_enc_sink_event (GstPad * pad, GstEvent * event);
+static const GstQueryType *gst_kate_enc_source_query_type (GstPad * pad);
+static gboolean gst_kate_enc_source_query (GstPad * pad, GstQuery * query);
+static void gst_kate_enc_add_interfaces (GType kateenc_type);
+
+GST_BOILERPLATE_FULL (GstKateEnc, gst_kate_enc, GstElement,
+ GST_TYPE_ELEMENT, gst_kate_enc_add_interfaces);
+
+static void
+gst_kate_enc_base_init (gpointer gclass)
+{
+ static const GstElementDetails element_details =
+ GST_ELEMENT_DETAILS ("Kate stream encoder",
+ "Codec/Encoder/Subtitle",
+ "Encodes Kate streams from text or subpictures",
+ "Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>");
+ GstElementClass *element_class = GST_ELEMENT_CLASS (gclass);
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&src_factory));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&sink_factory));
+ gst_element_class_set_details (element_class, &element_details);
+}
+
+/* initialize the plugin's class */
+static void
+gst_kate_enc_class_init (GstKateEncClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_kate_enc_set_property);
+ gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_kate_enc_get_property);
+ gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_kate_enc_dispose);
+
+ g_object_class_install_property (gobject_class, ARG_LANGUAGE,
+ g_param_spec_string ("language", "Language",
+ "The language of the stream (e.g. \"fr\" or \"fr_FR\" for French)",
+ "", G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_CATEGORY,
+ g_param_spec_string ("category", "Category",
+ "The category of the stream", "", G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_GRANULE_RATE_NUM,
+ g_param_spec_int ("granule-rate-numerator", "Granule rate numerator",
+ "The numerator of the granule rate",
+ 1, G_MAXINT, 1, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_GRANULE_RATE_DEN,
+ g_param_spec_int ("granule-rate-denominator", "Granule rate denominator",
+ "The denominator of the granule rate",
+ 1, G_MAXINT, 1000, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_GRANULE_SHIFT,
+ g_param_spec_int ("granule-shift", "Granule shift",
+ "The granule shift", 0, 64, 32, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_ORIGINAL_CANVAS_WIDTH,
+ g_param_spec_int ("original-canvas-width", "Original canvas width",
+ "The width of the canvas this stream was authored for (0 is unspecified)",
+ 0, G_MAXINT, 0, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_ORIGINAL_CANVAS_HEIGHT,
+ g_param_spec_int ("original-canvas-height", "Original canvas height",
+ "The height of the canvas this stream was authored for (0 is unspecified)",
+ 0, G_MAXINT, 0, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_KEEPALIVE_MIN_TIME,
+ g_param_spec_float ("keepalive-min-time", "Keepalive mimimum time",
+ "Minimum time to emit keepalive packets (0 disables keepalive packets)",
+ 0.0f, FLT_MAX, DEFAULT_KEEPALIVE_MIN_TIME, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_DEFAULT_SPU_DURATION,
+ g_param_spec_float ("default-spu-duration", "Default SPU duration",
+ "The assumed max duration (in seconds) of SPUs with no duration specified",
+ 0.0f, FLT_MAX, DEFAULT_DEFAULT_SPU_DURATION, G_PARAM_READWRITE));
+
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_kate_enc_change_state);
+}
+
+static void
+gst_kate_enc_add_interfaces (GType kateenc_type)
+{
+ static const GInterfaceInfo tag_setter_info = { NULL, NULL, NULL };
+
+ g_type_add_interface_static (kateenc_type, GST_TYPE_TAG_SETTER,
+ &tag_setter_info);
+}
+
+/* initialize the new element
+ * instantiate pads and add them to element
+ * set functions
+ * initialize structure
+ */
+static void
+gst_kate_enc_init (GstKateEnc * ke, GstKateEncClass * gclass)
+{
+ GST_DEBUG_OBJECT (ke, "gst_kate_enc_init");
+
+ ke->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink");
+ gst_pad_set_chain_function (ke->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_kate_enc_chain));
+ gst_pad_set_event_function (ke->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_kate_enc_sink_event));
+ gst_element_add_pad (GST_ELEMENT (ke), ke->sinkpad);
+
+ ke->srcpad = gst_pad_new_from_static_template (&src_factory, "src");
+ gst_pad_set_query_type_function (ke->srcpad,
+ GST_DEBUG_FUNCPTR (gst_kate_enc_source_query_type));
+ gst_pad_set_query_function (ke->srcpad,
+ GST_DEBUG_FUNCPTR (gst_kate_enc_source_query));
+ gst_element_add_pad (GST_ELEMENT (ke), ke->srcpad);
+
+ ke->initialized = FALSE;
+ ke->headers_sent = FALSE;
+ ke->last_timestamp = 0;
+ ke->latest_end_time = 0;
+ ke->language = NULL;
+ ke->category = NULL;
+ ke->granule_rate_numerator = 1000;
+ ke->granule_rate_denominator = 1;
+ ke->granule_shift = 32;
+ ke->original_canvas_width = 0;
+ ke->original_canvas_height = 0;
+ ke->keepalive_min_time = DEFAULT_KEEPALIVE_MIN_TIME;
+ ke->default_spu_duration = DEFAULT_DEFAULT_SPU_DURATION;
+ memcpy (ke->spu_clut, gst_kate_spu_default_clut,
+ sizeof (gst_kate_spu_default_clut));
+ ke->delayed_spu = FALSE;
+ ke->delayed_bitmap = NULL;
+ ke->delayed_palette = NULL;
+ ke->delayed_region = NULL;
+}
+
+static void
+gst_kate_enc_dispose (GObject * object)
+{
+ GstKateEnc *ke = GST_KATE_ENC (object);
+
+ GST_LOG_OBJECT (ke, "disposing");
+
+ if (ke->language) {
+ g_free (ke->language);
+ ke->language = NULL;
+ }
+ if (ke->category) {
+ g_free (ke->category);
+ ke->category = NULL;
+ }
+
+ GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
+}
+
+static void
+gst_kate_enc_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstKateEnc *ke = GST_KATE_ENC (object);
+ const char *str;
+
+ switch (prop_id) {
+ case ARG_LANGUAGE:
+ if (ke->language) {
+ g_free (ke->language);
+ ke->language = NULL;
+ }
+ str = g_value_get_string (value);
+ if (str)
+ ke->language = g_strdup (str);
+ break;
+ case ARG_CATEGORY:
+ if (ke->category) {
+ g_free (ke->category);
+ ke->category = NULL;
+ }
+ str = g_value_get_string (value);
+ if (str)
+ ke->category = g_strdup (str);
+ break;
+ case ARG_GRANULE_RATE_NUM:
+ ke->granule_rate_numerator = g_value_get_int (value);
+ break;
+ case ARG_GRANULE_RATE_DEN:
+ ke->granule_rate_denominator = g_value_get_int (value);
+ break;
+ case ARG_GRANULE_SHIFT:
+ ke->granule_rate_denominator = g_value_get_int (value);
+ break;
+ case ARG_KEEPALIVE_MIN_TIME:
+ ke->keepalive_min_time = g_value_get_float (value);
+ break;
+ case ARG_ORIGINAL_CANVAS_WIDTH:
+ ke->original_canvas_width = g_value_get_int (value);
+ break;
+ case ARG_ORIGINAL_CANVAS_HEIGHT:
+ ke->original_canvas_height = g_value_get_int (value);
+ break;
+ case ARG_DEFAULT_SPU_DURATION:
+ ke->default_spu_duration = g_value_get_float (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_kate_enc_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstKateEnc *ke = GST_KATE_ENC (object);
+
+ switch (prop_id) {
+ case ARG_LANGUAGE:
+ g_value_set_string (value, ke->language ? ke->language : "");
+ break;
+ case ARG_CATEGORY:
+ g_value_set_string (value, ke->category ? ke->category : "");
+ break;
+ case ARG_GRANULE_RATE_NUM:
+ g_value_set_int (value, ke->granule_rate_numerator);
+ break;
+ case ARG_GRANULE_RATE_DEN:
+ g_value_set_int (value, ke->granule_rate_denominator);
+ break;
+ case ARG_GRANULE_SHIFT:
+ g_value_set_int (value, ke->granule_shift);
+ break;
+ case ARG_KEEPALIVE_MIN_TIME:
+ g_value_set_float (value, ke->keepalive_min_time);
+ break;
+ case ARG_ORIGINAL_CANVAS_WIDTH:
+ g_value_set_int (value, ke->original_canvas_width);
+ break;
+ case ARG_ORIGINAL_CANVAS_HEIGHT:
+ g_value_set_int (value, ke->original_canvas_height);
+ break;
+ case ARG_DEFAULT_SPU_DURATION:
+ g_value_set_float (value, ke->default_spu_duration);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+/* GstElement vmethod implementations */
+
+static GstBuffer *
+gst_kate_enc_create_buffer (GstKateEnc * ke, kate_packet * kp,
+ kate_int64_t granpos, GstClockTime timestamp, GstClockTime duration,
+ gboolean header)
+{
+ GstBuffer *buffer;
+
+ buffer = gst_buffer_new_and_alloc (kp->nbytes);
+ if (G_UNLIKELY (!buffer)) {
+ GST_WARNING_OBJECT (ke, "Failed to allocate buffer for %u bytes",
+ kp->nbytes);
+ return NULL;
+ }
+
+ memcpy (GST_BUFFER_DATA (buffer), kp->data, kp->nbytes);
+
+ /* same system as other Ogg codecs, as per ext/ogg/README:
+ OFFSET_END is the granulepos
+ OFFSET is its time representation
+ */
+ GST_BUFFER_OFFSET_END (buffer) = granpos;
+ GST_BUFFER_OFFSET (buffer) = timestamp;
+ GST_BUFFER_TIMESTAMP (buffer) = timestamp;
+ GST_BUFFER_DURATION (buffer) = duration;
+
+ /* data packets are each on their own page */
+// if (!header)
+// GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT);
+
+ return buffer;
+}
+
+static GstFlowReturn
+gst_kate_enc_push_buffer (GstKateEnc * ke, GstBuffer * buffer)
+{
+ GstFlowReturn rflow;
+
+ ke->last_timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ if (GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer) >
+ ke->latest_end_time) {
+ ke->latest_end_time =
+ GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer);
+ }
+
+ /* Hack to flush each packet on its own page - taken off the CMML encoder element */
+ GST_BUFFER_DURATION (buffer) = G_MAXINT64;
+
+ rflow = gst_pad_push (ke->srcpad, buffer);
+ if (G_UNLIKELY (rflow != GST_FLOW_OK)) {
+ GST_ERROR_OBJECT (ke, "Failed to push buffer: %d", rflow);
+ }
+
+ return rflow;
+}
+
+static GstFlowReturn
+gst_kate_enc_push_and_free_kate_packet (GstKateEnc * ke, kate_packet * kp,
+ kate_int64_t granpos, GstClockTime timestamp, GstClockTime duration,
+ gboolean header)
+{
+ GstBuffer *buffer;
+
+ GST_LOG_OBJECT (ke, "Creating buffer, %u bytes", kp->nbytes);
+ buffer =
+ gst_kate_enc_create_buffer (ke, kp, granpos, timestamp, duration, header);
+ if (G_UNLIKELY (!buffer)) {
+ GST_WARNING_OBJECT (ke, "Failed to create buffer, %u bytes", kp->nbytes);
+ kate_packet_clear (kp);
+ return GST_FLOW_ERROR;
+ }
+
+ kate_packet_clear (kp);
+
+ return gst_kate_enc_push_buffer (ke, buffer);
+}
+
+static void
+gst_kate_enc_metadata_set1 (const GstTagList * list, const gchar * tag,
+ gpointer kateenc)
+{
+ GstKateEnc *ke = GST_KATE_ENC (kateenc);
+ GList *vc_list, *l;
+
+ vc_list = gst_tag_to_vorbis_comments (list, tag);
+
+ for (l = vc_list; l != NULL; l = l->next) {
+ const gchar *vc_string = (const gchar *) l->data;
+ gchar *key = NULL, *val = NULL;
+
+ GST_LOG_OBJECT (ke, "Kate comment: %s", vc_string);
+ if (gst_tag_parse_extended_comment (vc_string, &key, NULL, &val, TRUE)) {
+ kate_comment_add_tag (&ke->kc, key, val);
+ g_free (key);
+ g_free (val);
+ }
+ }
+
+ g_list_foreach (vc_list, (GFunc) g_free, NULL);
+ g_list_free (vc_list);
+}
+
+static void
+gst_kate_enc_set_metadata (GstKateEnc * ke)
+{
+ GstTagList *merged_tags;
+ const GstTagList *user_tags;
+
+ user_tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (ke));
+
+ GST_DEBUG_OBJECT (ke, "upstream tags = %" GST_PTR_FORMAT, ke->tags);
+ GST_DEBUG_OBJECT (ke, "user-set tags = %" GST_PTR_FORMAT, user_tags);
+
+ /* gst_tag_list_merge() will handle NULL for either or both lists fine */
+ merged_tags = gst_tag_list_merge (user_tags, ke->tags,
+ gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (ke)));
+
+ if (merged_tags) {
+ GST_DEBUG_OBJECT (ke, "merged tags = %" GST_PTR_FORMAT, merged_tags);
+ gst_tag_list_foreach (merged_tags, gst_kate_enc_metadata_set1, ke);
+ gst_tag_list_free (merged_tags);
+ }
+}
+
+static gboolean
+gst_kate_enc_is_simple_subtitle_category (GstKateEnc * ke, const char *category)
+{
+ static const char *const simple[] = {
+ "subtitles",
+ "SUB",
+ "spu-subtitles",
+ "K-SPU",
+ };
+ int n;
+
+ if (!category)
+ return FALSE;
+ for (n = 0; n < G_N_ELEMENTS (simple); ++n) {
+ if (!strcmp (category, simple[n]))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static GstFlowReturn
+gst_kate_enc_send_headers (GstKateEnc * ke)
+{
+ GstFlowReturn rflow = GST_FLOW_OK;
+ GstCaps *caps;
+ GList *headers = NULL, *item;
+
+ gst_kate_enc_set_metadata (ke);
+
+ /* encode headers and store them in a list */
+ while (1) {
+ kate_packet kp;
+ int ret = kate_encode_headers (&ke->k, &ke->kc, &kp);
+ if (ret == 0) {
+ GstBuffer *buffer =
+ gst_kate_enc_create_buffer (ke, &kp, 0ll, 0ll, 0ll, TRUE);
+ if (!buffer) {
+ rflow = GST_FLOW_ERROR;
+ break;
+ }
+ kate_packet_clear (&kp);
+
+ headers = g_list_append (headers, buffer);
+ } else if (ret > 0) {
+ GST_LOG_OBJECT (ke, "Last header encoded");
+ break;
+ } else {
+ GST_LOG_OBJECT (ke, "Error encoding header: %d", ret);
+ rflow = GST_FLOW_ERROR;
+ break;
+ }
+ }
+
+ if (rflow == GST_FLOW_OK) {
+ if (gst_kate_enc_is_simple_subtitle_category (ke, ke->category)) {
+ caps = gst_kate_util_set_header_on_caps (&ke->element,
+ gst_caps_from_string ("subtitle/x-kate"), headers);
+ } else {
+ caps = gst_kate_util_set_header_on_caps (&ke->element,
+ gst_caps_from_string ("application/x-kate"), headers);
+ }
+ if (caps) {
+ GST_DEBUG_OBJECT (ke, "here are the caps: %" GST_PTR_FORMAT, caps);
+ gst_pad_set_caps (ke->srcpad, caps);
+
+ GST_LOG_OBJECT (ke, "setting caps on headers");
+ item = headers;
+ while (item) {
+ GstBuffer *buffer = item->data;
+ GST_LOG_OBJECT (ke, "settings caps on header %p", buffer);
+ gst_buffer_set_caps (buffer, caps);
+ item = item->next;
+ }
+
+ gst_caps_unref (caps);
+
+ GST_LOG_OBJECT (ke, "pushing headers");
+ item = headers;
+ while (item) {
+ GstBuffer *buffer = item->data;
+ GST_LOG_OBJECT (ke, "pushing header %p", buffer);
+ gst_kate_enc_push_buffer (ke, buffer);
+ item = item->next;
+ }
+ } else {
+ GST_ERROR_OBJECT (ke, "Failed to set headers on caps");
+ }
+ }
+
+ g_list_free (headers);
+
+ return rflow;
+}
+
+static GstFlowReturn
+gst_kate_enc_flush_headers (GstKateEnc * ke)
+{
+ GstFlowReturn rflow = GST_FLOW_OK;
+ if (!ke->headers_sent) {
+ GST_INFO_OBJECT (ke, "headers not yet sent, flushing");
+ rflow = gst_kate_enc_send_headers (ke);
+ if (rflow == GST_FLOW_OK) {
+ ke->headers_sent = TRUE;
+ GST_INFO_OBJECT (ke, "headers flushed");
+ } else {
+ GST_WARNING_OBJECT (ke, "Failed to flush headers: %d", rflow);
+ }
+ }
+ return rflow;
+}
+
+static GstFlowReturn
+gst_kate_enc_chain_push_packet (GstKateEnc * ke, kate_packet * kp,
+ GstClockTime start, GstClockTime duration)
+{
+ kate_int64_t granpos;
+ GstFlowReturn rflow;
+
+ granpos = kate_encode_get_granule (&ke->k);
+ if (G_UNLIKELY (granpos < 0)) {
+ GST_WARNING_OBJECT (ke, "Negative granpos for packet");
+ kate_packet_clear (kp);
+ return GST_FLOW_ERROR;
+ }
+ rflow =
+ gst_kate_enc_push_and_free_kate_packet (ke, kp, granpos, start, duration,
+ FALSE);
+ if (G_UNLIKELY (rflow != GST_FLOW_OK)) {
+ GST_WARNING_OBJECT (ke, "Failed to push Kate packet");
+ }
+ return rflow;
+}
+
+static void
+gst_kate_enc_generate_keepalive (GstKateEnc * ke, GstClockTime timestamp)
+{
+ kate_packet kp;
+ int ret;
+ kate_float t = timestamp / (double) GST_SECOND;
+ GST_DEBUG_OBJECT (ke, "keepalive at %f", t);
+ ret = kate_encode_keepalive (&ke->k, t, &kp);
+ if (ret < 0) {
+ GST_WARNING_OBJECT (ke, "Failed to encode keepalive packet: %d", ret);
+ } else {
+ kate_int64_t granpos = kate_encode_get_granule (&ke->k);
+ GST_LOG_OBJECT (ke, "Keepalive packet encoded");
+ if (gst_kate_enc_push_and_free_kate_packet (ke, &kp, granpos, timestamp, 0,
+ FALSE)) {
+ GST_WARNING_OBJECT (ke, "Failed to push keepalive packet");
+ }
+ }
+}
+
+static GstFlowReturn
+gst_kate_enc_flush_waiting (GstKateEnc * ke, GstClockTime now)
+{
+ GstFlowReturn rflow = GST_FLOW_OK;
+ if (ke->delayed_spu) {
+ int ret;
+ kate_packet kp;
+ GstClockTime keepalive_time;
+
+ kate_float t0 = ke->delayed_start / (double) GST_SECOND;
+ kate_float t1 = now / (double) GST_SECOND;
+
+ GST_INFO_OBJECT (ke,
+ "We had a delayed SPU packet starting at %f, flushing at %f (assumed duration %f)",
+ t0, t1, t1 - t0);
+
+ ret = kate_encode_text (&ke->k, t0, t1, "", 0, &kp);
+ if (G_UNLIKELY (ret < 0)) {
+ rflow = GST_FLOW_ERROR;
+ } else {
+ rflow =
+ gst_kate_enc_chain_push_packet (ke, &kp, ke->delayed_start,
+ now - ke->delayed_start + 1);
+ }
+
+ if (rflow == GST_FLOW_OK) {
+ GST_DEBUG_OBJECT (ke, "delayed SPU packet flushed");
+ } else {
+ GST_WARNING_OBJECT (ke, "Failed to flush delayed SPU packet: %d", rflow);
+ }
+
+ /* forget it even if we couldn't flush it */
+ ke->delayed_spu = FALSE;
+
+ /* free the delayed data */
+ g_free (ke->delayed_bitmap->pixels);
+ g_free (ke->delayed_bitmap);
+ ke->delayed_bitmap = NULL;
+ g_free (ke->delayed_palette->colors);
+ g_free (ke->delayed_palette);
+ ke->delayed_palette = NULL;
+ g_free (ke->delayed_region);
+ ke->delayed_region = NULL;
+
+ /* now that we've flushed the packet, we want to insert keepalives as requested */
+ if (ke->keepalive_min_time > 0.0f && t1 > t0) {
+ GST_INFO_OBJECT (ke, "generating keepalives at %f from %f to %f",
+ ke->keepalive_min_time, t0, t1);
+ for (keepalive_time = ke->delayed_start;
+ (keepalive_time += ke->keepalive_min_time * GST_SECOND) < now;) {
+ GST_INFO_OBJECT (ke, "generating keepalive at %f",
+ keepalive_time / (double) GST_SECOND);
+ gst_kate_enc_generate_keepalive (ke, keepalive_time);
+ }
+ }
+ }
+ return rflow;
+}
+
+static GstFlowReturn
+gst_kate_enc_chain_spu (GstKateEnc * ke, GstBuffer * buf)
+{
+ kate_packet kp;
+ kate_region *kregion;
+ kate_bitmap *kbitmap;
+ kate_palette *kpalette;
+ GstFlowReturn rflow;
+ int ret = 0;
+
+ /* allocate region, bitmap, and palette, in case we have to delay encoding them */
+ kregion = (kate_region *) g_malloc (sizeof (kate_region));
+ kbitmap = (kate_bitmap *) g_malloc (sizeof (kate_bitmap));
+ kpalette = (kate_palette *) g_malloc (sizeof (kate_palette));
+ if (!kregion || !kpalette || !kbitmap) {
+ if (kregion)
+ g_free (kregion);
+ if (kbitmap)
+ g_free (kbitmap);
+ if (kpalette)
+ g_free (kpalette);
+ GST_ERROR_OBJECT (ke, "Out of memory");
+ return GST_FLOW_ERROR;
+ }
+
+ rflow = gst_kate_spu_decode_spu (ke, buf, kregion, kbitmap, kpalette);
+ if (G_UNLIKELY (rflow != GST_FLOW_OK)) {
+ GST_ERROR_OBJECT (ke, "Failed to decode incoming SPU");
+#if 0
+ {
+ static int spu_count = 0;
+ FILE *f;
+ char name[32];
+ snprintf (name, sizeof (name), "/tmp/bad_spu_%04d", spu_count++);
+ name[sizeof (name) - 1] = 0;
+ f = fopen (name, "w");
+ if (f) {
+ fwrite (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), 1, f);
+ fclose (f);
+ }
+ }
+#endif
+ } else if (G_UNLIKELY (kbitmap->width == 0 || kbitmap->height == 0)) {
+ /* there are some DVDs (well, at least one) where some dimwits put in a wholly transparent full screen 720x576 SPU !!!!?! */
+ GST_WARNING_OBJECT (ke, "SPU is totally invisible - dimwits");
+ rflow = GST_FLOW_OK;
+ } else {
+ /* timestamp offsets are hidden in the SPU packets */
+ GstClockTime start =
+ GST_BUFFER_TIMESTAMP (buf) + GST_KATE_STM_TO_GST (ke->show_time);
+ GstClockTime stop =
+ GST_BUFFER_TIMESTAMP (buf) + GST_KATE_STM_TO_GST (ke->hide_time);
+ kate_float t0 = start / (double) GST_SECOND;
+ kate_float t1 = stop / (double) GST_SECOND;
+ GST_DEBUG_OBJECT (ke, "buf ts %f, start/show %hu/%hu",
+ GST_BUFFER_TIMESTAMP (buf) / (double) GST_SECOND, ke->show_time,
+ ke->hide_time);
+
+#if 0
+ {
+ static int spu_count = 0;
+ FILE *f;
+ char name[32];
+ snprintf (name, sizeof (name), "/tmp/spu_%04d", spu_count++);
+ name[sizeof (name) - 1] = 0;
+ f = fopen (name, "w");
+ if (f) {
+ fwrite (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), 1, f);
+ fclose (f);
+ }
+ }
+#endif
+ GST_DEBUG_OBJECT (ke, "Encoding %dx%d SPU: (%u bytes) from %f to %f",
+ kbitmap->width, kbitmap->height, GST_BUFFER_SIZE (buf), t0, t1);
+ ret = kate_encode_set_region (&ke->k, kregion);
+ if (G_UNLIKELY (ret < 0)) {
+ GST_WARNING_OBJECT (ke, "Failed to set event region (%d)", ret);
+ rflow = GST_FLOW_ERROR;
+ } else {
+ ret = kate_encode_set_palette (&ke->k, kpalette);
+ if (G_UNLIKELY (ret < 0)) {
+ GST_WARNING_OBJECT (ke, "Failed to set event palette (%d)", ret);
+ rflow = GST_FLOW_ERROR;
+ } else {
+ ret = kate_encode_set_bitmap (&ke->k, kbitmap);
+ if (G_UNLIKELY (ret < 0)) {
+ GST_WARNING_OBJECT (ke, "Failed to set event bitmap (%d)", ret);
+ rflow = GST_FLOW_ERROR;
+ } else {
+ /* Some SPUs have no hide time - so I'm going to delay the encoding of the packet
+ till either a suitable event happens, and the time of this event will be used
+ as the end time of this SPU, which will then be encoded and sent off. Suitable
+ events are the arrival of a subsequent SPU (eg, this SPU will replace the one
+ with no end), EOS, a new segment event, or a time threshold being reached */
+ if (ke->hide_time <= ke->show_time) {
+ GST_INFO_OBJECT (ke,
+ "Cannot encode SPU packet now, hide time is now known (starting at %f) - delaying",
+ t0);
+ ke->delayed_spu = TRUE;
+ ke->delayed_start = start;
+ ke->delayed_bitmap = kbitmap;
+ ke->delayed_palette = kpalette;
+ ke->delayed_region = kregion;
+ rflow = GST_FLOW_OK;
+ } else {
+ ret = kate_encode_text (&ke->k, t0, t1, "", 0, &kp);
+ if (G_UNLIKELY (ret < 0)) {
+ GST_WARNING_OBJECT (ke,
+ "Failed to encode empty text for SPU buffer (%d)", ret);
+ rflow = GST_FLOW_ERROR;
+ } else {
+ rflow =
+ gst_kate_enc_chain_push_packet (ke, &kp, start,
+ stop - start + 1);
+ }
+ }
+ }
+ }
+ }
+
+ if (!ke->delayed_spu) {
+ g_free (kpalette->colors);
+ g_free (kpalette);
+ g_free (kbitmap->pixels);
+ g_free (kbitmap);
+ g_free (kregion);
+ }
+ }
+
+ return rflow;
+}
+
+static GstFlowReturn
+gst_kate_enc_chain_text (GstKateEnc * ke, GstBuffer * buf,
+ const char *mime_type)
+{
+ kate_packet kp;
+ int ret = 0;
+ GstFlowReturn rflow;
+ GstClockTime start = GST_BUFFER_TIMESTAMP (buf);
+ GstClockTime stop = GST_BUFFER_TIMESTAMP (buf) + GST_BUFFER_DURATION (buf);
+
+ if (!strcmp (mime_type, "text/x-pango-markup")) {
+ ret = kate_encode_set_markup_type (&ke->k, kate_markup_simple);
+ } else {
+ ret = kate_encode_set_markup_type (&ke->k, kate_markup_none);
+ }
+
+ if (G_UNLIKELY (ret < 0)) {
+ GST_WARNING_OBJECT (ke, "Failed to set markup type (%d)", ret);
+ rflow = GST_FLOW_ERROR;
+ } else {
+ const char *text = (const char *) GST_BUFFER_DATA (buf);
+ if (text) {
+ size_t text_len = GST_BUFFER_SIZE (buf);
+ kate_float t0 = start / (double) GST_SECOND;
+ kate_float t1 = stop / (double) GST_SECOND;
+ GST_LOG_OBJECT (ke, "Encoding text: %*.*s (%u bytes) from %f to %f",
+ (int) text_len, (int) text_len, GST_BUFFER_DATA (buf),
+ GST_BUFFER_SIZE (buf), t0, t1);
+ ret = kate_encode_text (&ke->k, t0, t1, text, text_len, &kp);
+ if (G_UNLIKELY (ret < 0)) {
+ rflow = GST_FLOW_ERROR;
+ } else {
+ rflow =
+ gst_kate_enc_chain_push_packet (ke, &kp, start, stop - start + 1);
+ }
+ } else {
+ GST_WARNING_OBJECT (ke, "No text in text packet");
+ rflow = GST_FLOW_ERROR;
+ }
+ }
+
+ return rflow;
+}
+
+/* chain function
+ * this function does the actual processing
+ */
+static GstFlowReturn
+gst_kate_enc_chain (GstPad * pad, GstBuffer * buf)
+{
+ GstKateEnc *ke = GST_KATE_ENC (gst_pad_get_parent (pad));
+ GstFlowReturn rflow = GST_FLOW_OK;
+ GstCaps *caps;
+ const gchar *mime_type = NULL;
+
+ GST_DEBUG_OBJECT (ke, "got packet, %u bytes", GST_BUFFER_SIZE (buf));
+
+ /* get the type of the data we're being sent */
+ caps = GST_PAD_CAPS (pad);
+ if (G_UNLIKELY (caps == NULL)) {
+ GST_ERROR_OBJECT (ke, ": Could not get caps of pad");
+ rflow = GST_FLOW_ERROR;
+ } else {
+ const GstStructure *structure = gst_caps_get_structure (caps, 0);
+ if (structure)
+ mime_type = gst_structure_get_name (structure);
+
+ if (mime_type) {
+ GST_LOG_OBJECT (ke, "Packet has MIME type %s", mime_type);
+
+ /* first push headers if we haven't done that yet */
+ rflow = gst_kate_enc_flush_headers (ke);
+
+ if (G_LIKELY (rflow == GST_FLOW_OK)) {
+ /* flush any packet we had waiting */
+ rflow = gst_kate_enc_flush_waiting (ke, GST_BUFFER_TIMESTAMP (buf));
+
+ if (G_LIKELY (rflow == GST_FLOW_OK)) {
+ if (!strcmp (mime_type, GST_KATE_SPU_MIME_TYPE)) {
+ /* encode a kate_bitmap */
+ rflow = gst_kate_enc_chain_spu (ke, buf);
+ } else {
+ /* encode text */
+ rflow = gst_kate_enc_chain_text (ke, buf, mime_type);
+ }
+ }
+ }
+ } else {
+ GST_WARNING_OBJECT (ke, "Packet has no MIME type, ignored");
+ }
+ }
+
+ gst_buffer_unref (buf);
+
+ gst_object_unref (ke);
+
+ GST_LOG_OBJECT (ke, "Leaving chain function");
+
+ return rflow;
+}
+
+static GstStateChangeReturn
+gst_kate_enc_change_state (GstElement * element, GstStateChange transition)
+{
+ GstKateEnc *ke = GST_KATE_ENC (element);
+ GstStateChangeReturn res;
+ int ret;
+
+ GST_INFO_OBJECT (ke, "gst_kate_enc_change_state");
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ ke->tags = gst_tag_list_new ();
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ GST_DEBUG_OBJECT (ke, "READY -> PAUSED, initializing kate state");
+ ret = kate_info_init (&ke->ki);
+ if (ret < 0) {
+ GST_WARNING_OBJECT (ke, "failed to initialize kate info structure: %d",
+ ret);
+ break;
+ }
+ if (ke->language) {
+ ret = kate_info_set_language (&ke->ki, ke->language);
+ if (ret < 0) {
+ GST_WARNING_OBJECT (ke, "failed to set stream language: %d", ret);
+ break;
+ }
+ }
+ if (ke->category) {
+ ret = kate_info_set_category (&ke->ki, ke->category);
+ if (ret < 0) {
+ GST_WARNING_OBJECT (ke, "failed to set stream category: %d", ret);
+ break;
+ }
+ }
+ ret =
+ kate_info_set_original_canvas_size (&ke->ki,
+ ke->original_canvas_width, ke->original_canvas_height);
+ if (ret < 0) {
+ GST_WARNING_OBJECT (ke, "failed to set original canvas size: %d", ret);
+ break;
+ }
+ ret = kate_comment_init (&ke->kc);
+ if (ret < 0) {
+ GST_WARNING_OBJECT (ke,
+ "failed to initialize kate comment structure: %d", ret);
+ break;
+ }
+ ret = kate_encode_init (&ke->k, &ke->ki);
+ if (ret < 0) {
+ GST_WARNING_OBJECT (ke, "failed to initialize kate state: %d", ret);
+ break;
+ }
+ ke->headers_sent = FALSE;
+ ke->initialized = TRUE;
+ ke->last_timestamp = 0;
+ ke->latest_end_time = 0;
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ gst_tag_list_free (ke->tags);
+ ke->tags = NULL;
+ break;
+ default:
+ break;
+ }
+
+ res = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+ if (res == GST_STATE_CHANGE_FAILURE) {
+ GST_WARNING_OBJECT (ke, "Parent failed to change state");
+ return res;
+ }
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ GST_DEBUG_OBJECT (ke, "PAUSED -> READY, clearing kate state");
+ if (ke->initialized) {
+ kate_clear (&ke->k);
+ kate_info_clear (&ke->ki);
+ kate_comment_clear (&ke->kc);
+ ke->initialized = FALSE;
+ ke->last_timestamp = 0;
+ ke->latest_end_time = 0;
+ }
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ break;
+ default:
+ break;
+ }
+
+ GST_DEBUG_OBJECT (ke, "State change done");
+
+ return res;
+}
+
+static GstClockTime
+gst_kate_enc_granule_time (kate_state * k, gint64 granulepos)
+{
+ float t;
+
+ if (granulepos == -1)
+ return -1;
+
+ t = kate_granule_time (k->ki, granulepos);
+ return t * GST_SECOND;
+}
+
+/*
+conversions on the sink:
+ - nothing
+conversions on the source:
+ - default is granules at num/den rate
+ - default -> time is possible
+ - bytes do not mean anything, packets can be any number of bytes, and we
+ have no way to know the number of bytes emitted without decoding
+*/
+
+static gboolean
+gst_kate_enc_convert (GstPad * pad, GstFormat src_fmt, gint64 src_val,
+ GstFormat * dest_fmt, gint64 * dest_val)
+{
+ GstKateEnc *ke;
+ gboolean res = FALSE;
+
+ if (src_fmt == *dest_fmt) {
+ *dest_val = src_val;
+ return TRUE;
+ }
+
+ ke = GST_KATE_ENC (gst_pad_get_parent (pad));
+
+ if (!ke->initialized) {
+ GST_WARNING_OBJECT (ke, "not initialized yet");
+ gst_object_unref (ke);
+ return FALSE;
+ }
+
+ if (src_fmt == GST_FORMAT_BYTES || *dest_fmt == GST_FORMAT_BYTES) {
+ GST_WARNING_OBJECT (ke, "unsupported format");
+ gst_object_unref (ke);
+ return FALSE;
+ }
+
+ switch (src_fmt) {
+ case GST_FORMAT_DEFAULT:
+ switch (*dest_fmt) {
+ case GST_FORMAT_TIME:
+ *dest_val = gst_kate_enc_granule_time (&ke->k, src_val);
+ res = TRUE;
+ break;
+ default:
+ res = FALSE;
+ break;
+ }
+ break;
+ default:
+ res = FALSE;
+ break;
+ }
+
+ if (!res) {
+ GST_WARNING_OBJECT (ke, "unsupported format");
+ }
+
+ gst_object_unref (ke);
+ return res;
+}
+
+#if 1
+static const GstQueryType *
+gst_kate_enc_source_query_type (GstPad * pad)
+{
+ static const GstQueryType types[] = {
+ GST_QUERY_CONVERT,
+ 0
+ };
+
+ return types;
+}
+#endif
+
+static gboolean
+gst_kate_enc_source_query (GstPad * pad, GstQuery * query)
+{
+ GstKateEnc *ke;
+ gboolean res = FALSE;
+
+ ke = GST_KATE_ENC (gst_pad_get_parent (pad));
+
+ GST_DEBUG ("source query %d", GST_QUERY_TYPE (query));
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_CONVERT:
+ {
+ GstFormat src_fmt, dest_fmt;
+ gint64 src_val, dest_val;
+
+ gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val);
+ if (!gst_kate_enc_convert (pad, src_fmt, src_val, &dest_fmt, &dest_val)) {
+ return gst_pad_query_default (pad, query);
+ }
+ gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
+ res = TRUE;
+ }
+ break;
+ default:
+ res = gst_pad_query_default (pad, query);
+ break;
+ }
+
+ gst_object_unref (ke);
+
+ return res;
+}
+
+static gboolean
+gst_kate_enc_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstKateEnc *ke = GST_KATE_ENC (gst_pad_get_parent (pad));
+ GstStructure *structure;
+ gboolean ret;
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_NEWSEGMENT:
+ GST_LOG_OBJECT (ke, "Got newsegment event");
+ if (ke->initialized) {
+ GST_LOG_OBJECT (ke, "ensuring all headers are in");
+ if (gst_kate_enc_flush_headers (ke) != GST_FLOW_OK) {
+ GST_WARNING_OBJECT (ke, "Failed to flush headers");
+ } else {
+ GstFormat format;
+ gint64 timestamp;
+
+ gst_event_parse_new_segment (event, NULL, NULL, &format, &timestamp,
+ NULL, NULL);
+ if (format != GST_FORMAT_TIME || !GST_CLOCK_TIME_IS_VALID (timestamp)) {
+ GST_WARNING_OBJECT (ke,
+ "No time in newsegment event %p, format %d, timestamp %lld",
+ event, (int) format, (long long) timestamp);
+ /* to be safe, we'd need to generate a keepalive anyway, but we'd have to guess at the timestamp to use; a
+ good guess would be the last known timestamp plus the keepalive time, but if we then get a packet with a
+ timestamp less than this, it would fail to encode, which would be Bad. If we don't encode a keepalive, we
+ run the risk of stalling the pipeline and hanging, which is Very Bad. Oh dear. We can't exit(-1), can we ? */
+ } else {
+ float t = timestamp / (double) GST_SECOND;
+
+ if (ke->delayed_spu
+ && t - ke->delayed_start / (double) GST_SECOND >=
+ ke->default_spu_duration) {
+ if (G_UNLIKELY (gst_kate_enc_flush_waiting (ke,
+ timestamp) != GST_FLOW_OK)) {
+ GST_WARNING_OBJECT (ke, "Failed to encode delayed packet");
+ /* continue with new segment handling anyway */
+ }
+ }
+
+ GST_LOG_OBJECT (ke, "ts %f, last %f (min %f)", t,
+ ke->last_timestamp / (double) GST_SECOND,
+ ke->keepalive_min_time);
+ if (ke->keepalive_min_time > 0.0f
+ && t - ke->last_timestamp / (double) GST_SECOND >=
+ ke->keepalive_min_time) {
+ /* we only generate a keepalive if there is no SPU waiting, as it would
+ mean out of sequence start times - and granulepos */
+ if (!ke->delayed_spu) {
+ gst_kate_enc_generate_keepalive (ke, timestamp);
+ }
+ }
+ }
+ }
+ }
+ ret = gst_pad_push_event (ke->srcpad, event);
+ break;
+
+ case GST_EVENT_CUSTOM_DOWNSTREAM:
+ GST_LOG_OBJECT (ke, "Got custom downstream event");
+ /* adapted from the dvdsubdec element */
+ structure = event->structure;
+ if (structure != NULL
+ && gst_structure_has_name (structure, "application/x-gst-dvd")) {
+ if (ke->initialized) {
+ GST_LOG_OBJECT (ke, "ensuring all headers are in");
+ if (gst_kate_enc_flush_headers (ke) != GST_FLOW_OK) {
+ GST_WARNING_OBJECT (ke, "Failed to flush headers");
+ } else {
+ const gchar *event_name =
+ gst_structure_get_string (structure, "event");
+ if (event_name) {
+ if (!strcmp (event_name, "dvd-spu-clut-change")) {
+ gchar name[16];
+ int idx;
+ gboolean found;
+ gint value;
+ GST_INFO_OBJECT (ke, "New CLUT received");
+ for (idx = 0; idx < 16; ++idx) {
+ g_snprintf (name, sizeof (name), "clut%02d", idx);
+ found = gst_structure_get_int (structure, name, &value);
+ if (found) {
+ ke->spu_clut[idx] = value;
+ } else {
+ GST_WARNING_OBJECT (ke,
+ "DVD CLUT event did not contain %s field", name);
+ }
+ }
+ } else if (!strcmp (event_name, "dvd-lang-codes")) {
+ /* we can't know which stream corresponds to us */
+ }
+ } else {
+ GST_WARNING_OBJECT (ke, "custom downstream event with no name");
+ }
+ }
+ }
+ }
+ ret = gst_pad_push_event (ke->srcpad, event);
+ break;
+
+ case GST_EVENT_TAG:
+ GST_LOG_OBJECT (ke, "Got tag event");
+ if (ke->tags) {
+ GstTagList *list;
+
+ gst_event_parse_tag (event, &list);
+ gst_tag_list_insert (ke->tags, list,
+ gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (ke)));
+ } else {
+ g_assert_not_reached ();
+ }
+ ret = gst_pad_event_default (pad, event);
+ break;
+
+ case GST_EVENT_EOS:
+ GST_INFO_OBJECT (ke, "Got EOS event");
+ if (ke->initialized) {
+ GST_LOG_OBJECT (ke, "ensuring all headers are in");
+ if (gst_kate_enc_flush_headers (ke) != GST_FLOW_OK) {
+ GST_WARNING_OBJECT (ke, "Failed to flush headers");
+ } else {
+ kate_packet kp;
+ int ret;
+ GstClockTime delayed_end =
+ ke->delayed_start + ke->default_spu_duration * GST_SECOND;
+
+ if (G_UNLIKELY (gst_kate_enc_flush_waiting (ke,
+ delayed_end) != GST_FLOW_OK)) {
+ GST_WARNING_OBJECT (ke, "Failed to encode delayed packet");
+ /* continue with EOS handling anyway */
+ }
+
+ ret = kate_encode_finish (&ke->k, -1, &kp);
+ if (ret < 0) {
+ GST_WARNING_OBJECT (ke, "Failed to encode EOS packet: %d", ret);
+ } else {
+ kate_int64_t granpos = kate_encode_get_granule (&ke->k);
+ GST_LOG_OBJECT (ke, "EOS packet encoded");
+ if (gst_kate_enc_push_and_free_kate_packet (ke, &kp, granpos,
+ ke->latest_end_time, 0, FALSE)) {
+ GST_WARNING_OBJECT (ke, "Failed to push EOS packet");
+ }
+ }
+ }
+ }
+ ret = gst_pad_event_default (pad, event);
+ break;
+
+ default:
+ GST_LOG_OBJECT (ke, "Got unhandled event");
+ ret = gst_pad_event_default (pad, event);
+ break;
+ }
+
+ gst_object_unref (ke);
+ return ret;
+}
diff --git a/ext/kate/gstkateenc.h b/ext/kate/gstkateenc.h
new file mode 100644
index 00000000..74310339
--- /dev/null
+++ b/ext/kate/gstkateenc.h
@@ -0,0 +1,123 @@
+/*
+ * GStreamer
+ * Copyright 2005 Thomas Vander Stichele <thomas@apestaart.org>
+ * Copyright 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright 2008 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Alternatively, the contents of this file may be used under the
+ * GNU Lesser General Public License Version 2.1 (the "LGPL"), in
+ * which case the following provisions apply instead of the ones
+ * mentioned above:
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_KATE_ENC_H__
+#define __GST_KATE_ENC_H__
+
+#include <gst/gst.h>
+#include <kate/kate.h>
+
+G_BEGIN_DECLS
+/* #defines don't like whitespacey bits */
+#define GST_TYPE_KATE_ENC \
+ (gst_kate_enc_get_type())
+#define GST_KATE_ENC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_KATE_ENC,GstKateEnc))
+#define GST_KATE_ENC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_KATE,GstKateEncClass))
+#define GST_IS_KATE_ENC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_KATE_ENC))
+#define GST_IS_KATE_ENC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_KATE_ENC))
+typedef struct _GstKateEnc GstKateEnc;
+typedef struct _GstKateEncClass GstKateEncClass;
+
+struct _GstKateEnc
+{
+ GstElement element;
+
+ GstPad *sinkpad, *srcpad;
+
+ kate_info ki;
+ kate_comment kc;
+ kate_state k;
+
+ GstTagList *tags;
+
+ GstClockTime last_timestamp;
+ GstClockTime latest_end_time;
+
+ gboolean headers_sent;
+ gboolean initialized;
+ gboolean delayed_spu;
+ GstClockTime delayed_start;
+ kate_bitmap *delayed_bitmap;
+ kate_palette *delayed_palette;
+ kate_region *delayed_region;
+ gchar *language;
+ gchar *category;
+
+ int granule_rate_numerator;
+ int granule_rate_denominator;
+ int granule_shift;
+
+ float keepalive_min_time;
+ float default_spu_duration;
+
+ size_t original_canvas_width;
+ size_t original_canvas_height;
+
+ /* SPU decoding */
+ guint8 spu_colormap[4];
+ guint32 spu_clut[16];
+ guint8 spu_alpha[4];
+ guint16 spu_top;
+ guint16 spu_left;
+ guint16 spu_right;
+ guint16 spu_bottom;
+ guint16 spu_pix_data[2];
+ guint16 show_time;
+ guint16 hide_time;
+};
+
+struct _GstKateEncClass
+{
+ GstElementClass parent_class;
+};
+
+GType gst_kate_enc_get_type (void);
+
+G_END_DECLS
+#endif /* __GST_KATE_ENC_H__ */
diff --git a/ext/kate/gstkateparse.c b/ext/kate/gstkateparse.c
new file mode 100644
index 00000000..89d17514
--- /dev/null
+++ b/ext/kate/gstkateparse.c
@@ -0,0 +1,633 @@
+/* GStreamer
+ * Copyright (C) <2004> Thomas Vander Stichele <thomas at apestaart dot org>
+ * Copyright (C) 2006 Andy Wingo <wingo@pobox.com>
+ * Copyright (C) 2008 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-kateparse
+ * @short_description: parses kate streams
+ * @see_also: katedec, vorbisparse, oggdemux, theoraparse
+ *
+ * <refsect2>
+ * <para>
+ * The kateparse element will parse the header packets of the Kate
+ * stream and put them as the streamheader in the caps. This is used in the
+ * multifdsink case where you want to stream live kate streams to multiple
+ * clients, each client has to receive the streamheaders first before they can
+ * consume the kate packets.
+ * </para>
+ * <para>
+ * This element also makes sure that the buffers that it pushes out are properly
+ * timestamped and that their offset and offset_end are set. The buffers that
+ * kateparse outputs have all of the metadata that oggmux expects to receive,
+ * which allows you to (for example) remux an ogg/kate file.
+ * </para>
+ * <title>Example pipelines</title>
+ * <para>
+ * <programlisting>
+ * gst-launch -v filesrc location=kate.ogg ! oggdemux ! kateparse ! fakesink
+ * </programlisting>
+ * This pipeline shows that the streamheader is set in the caps, and that each
+ * buffer has the timestamp, duration, offset, and offset_end set.
+ * </para>
+ * <para>
+ * <programlisting>
+ * gst-launch filesrc location=kate.ogg ! oggdemux ! kateparse \
+ * ! oggmux ! filesink location=kate-remuxed.ogg
+ * </programlisting>
+ * This pipeline shows remuxing. kate-remuxed.ogg might not be exactly the same
+ * as kate.ogg, but they should produce exactly the same decoded data.
+ * </para>
+ * </refsect2>
+ *
+ */
+
+/* FIXME: post appropriate GST_ELEMENT_ERROR when returning FLOW_ERROR */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "gstkate.h"
+#include "gstkateutil.h"
+#include "gstkateparse.h"
+
+GST_DEBUG_CATEGORY_EXTERN (gst_kateparse_debug);
+#define GST_CAT_DEFAULT gst_kateparse_debug
+
+static const GstElementDetails gst_kate_parse_details =
+GST_ELEMENT_DETAILS ("Kate stream parser",
+ "Codec/Parser/Subtitle",
+ "parse raw kate streams",
+ "Vincent Penquerc'h <ogg.k.ogg.k at googlemail dot com>");
+
+static GstStaticPadTemplate gst_kate_parse_sink_factory =
+ GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("subtitle/x-kate; application/x-kate")
+ );
+
+static GstStaticPadTemplate gst_kate_parse_src_factory =
+ GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("subtitle/x-kate; application/x-kate")
+ );
+
+GST_BOILERPLATE (GstKateParse, gst_kate_parse, GstElement, GST_TYPE_ELEMENT);
+
+static GstFlowReturn gst_kate_parse_chain (GstPad * pad, GstBuffer * buffer);
+static GstStateChangeReturn gst_kate_parse_change_state (GstElement * element,
+ GstStateChange transition);
+static gboolean gst_kate_parse_sink_event (GstPad * pad, GstEvent * event);
+static gboolean gst_kate_parse_src_query (GstPad * pad, GstQuery * query);
+#if 0
+static gboolean gst_kate_parse_convert (GstPad * pad,
+ GstFormat src_format, gint64 src_value,
+ GstFormat * dest_format, gint64 * dest_value);
+#endif
+static GstFlowReturn gst_kate_parse_parse_packet (GstKateParse * parse,
+ GstBuffer * buf);
+
+static void
+gst_kate_parse_base_init (gpointer g_class)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_kate_parse_src_factory));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_kate_parse_sink_factory));
+ gst_element_class_set_details (element_class, &gst_kate_parse_details);
+}
+
+static void
+gst_kate_parse_class_init (GstKateParseClass * klass)
+{
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ gstelement_class->change_state = gst_kate_parse_change_state;
+
+ klass->parse_packet = GST_DEBUG_FUNCPTR (gst_kate_parse_parse_packet);
+}
+
+static void
+gst_kate_parse_init (GstKateParse * parse, GstKateParseClass * g_class)
+{
+ parse->sinkpad =
+ gst_pad_new_from_static_template (&gst_kate_parse_sink_factory, "sink");
+ gst_pad_set_chain_function (parse->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_kate_parse_chain));
+ gst_pad_set_event_function (parse->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_kate_parse_sink_event));
+ gst_element_add_pad (GST_ELEMENT (parse), parse->sinkpad);
+
+ parse->srcpad =
+ gst_pad_new_from_static_template (&gst_kate_parse_src_factory, "src");
+ gst_pad_set_query_function (parse->srcpad,
+ GST_DEBUG_FUNCPTR (gst_kate_parse_src_query));
+ gst_element_add_pad (GST_ELEMENT (parse), parse->srcpad);
+}
+
+static void
+gst_kate_parse_drain_event_queue (GstKateParse * parse)
+{
+ while (parse->event_queue->length) {
+ GstEvent *event;
+
+ event = GST_EVENT_CAST (g_queue_pop_head (parse->event_queue));
+ gst_pad_event_default (parse->sinkpad, event);
+ }
+}
+
+static GstFlowReturn
+gst_kate_parse_push_headers (GstKateParse * parse)
+{
+ /* mark and put on caps */
+ GstCaps *caps;
+ GstBuffer *outbuf;
+ kate_packet packet;
+ GList *headers, *outbuf_list = NULL;
+ int ret;
+ gboolean res;
+
+ /* get the headers into the caps, passing them to kate as we go */
+ caps =
+ gst_kate_util_set_header_on_caps (&parse->element,
+ gst_pad_get_negotiated_caps (parse->sinkpad), parse->streamheader);
+
+ if (G_UNLIKELY (!caps)) {
+ GST_ERROR_OBJECT (parse, "Failed to set headers on caps");
+ return GST_FLOW_ERROR;
+ }
+
+ GST_DEBUG_OBJECT (parse, "here are the caps: %" GST_PTR_FORMAT, caps);
+ res = gst_pad_set_caps (parse->srcpad, caps);
+ gst_caps_unref (caps);
+ if (G_UNLIKELY (!res)) {
+ GST_WARNING_OBJECT (parse, "Failed to set pad caps");
+ return GST_FLOW_ERROR;
+ }
+
+ headers = parse->streamheader;
+ while (headers) {
+ outbuf = GST_BUFFER_CAST (headers->data);
+ kate_packet_wrap (&packet, GST_BUFFER_SIZE (outbuf),
+ GST_BUFFER_DATA (outbuf));
+ ret = kate_decode_headerin (&parse->ki, &parse->kc, &packet);
+ if (G_UNLIKELY (ret < 0)) {
+ GST_WARNING_OBJECT (parse, "kate_decode_headerin returned %d", ret);
+ }
+ /* takes ownership of outbuf, which was previously in parse->streamheader */
+ outbuf_list = g_list_append (outbuf_list, outbuf);
+ headers = headers->next;
+ }
+
+ /* first process queued events */
+ gst_kate_parse_drain_event_queue (parse);
+
+ /* push out buffers, ignoring return value... */
+ headers = outbuf_list;
+ while (headers) {
+ outbuf = GST_BUFFER_CAST (headers->data);
+ gst_buffer_set_caps (outbuf, GST_PAD_CAPS (parse->srcpad));
+ gst_pad_push (parse->srcpad, outbuf);
+ headers = headers->next;
+ }
+
+ g_list_free (outbuf_list);
+ g_list_free (parse->streamheader);
+ parse->streamheader = NULL;
+
+ parse->streamheader_sent = TRUE;
+
+ return GST_FLOW_OK;
+}
+
+static void
+gst_kate_parse_clear_queue (GstKateParse * parse)
+{
+ GST_DEBUG_OBJECT (parse, "Clearing queue");
+ while (parse->buffer_queue->length) {
+ GstBuffer *buf;
+
+ buf = GST_BUFFER_CAST (g_queue_pop_head (parse->buffer_queue));
+ gst_buffer_unref (buf);
+ }
+ while (parse->event_queue->length) {
+ GstEvent *event;
+
+ event = GST_EVENT_CAST (g_queue_pop_head (parse->event_queue));
+ gst_event_unref (event);
+ }
+}
+
+static GstFlowReturn
+gst_kate_parse_push_buffer (GstKateParse * parse, GstBuffer * buf,
+ gint64 granulepos)
+{
+ GST_LOG_OBJECT (parse, "granulepos %16llx", granulepos);
+ if (granulepos < 0) {
+ /* packets coming not from Ogg won't have a granpos in the offset end,
+ so we have to synthesize one here - only problem is we don't know
+ the backlink - pretend there's none for now */
+ GST_INFO_OBJECT (parse, "No granulepos on buffer, synthesizing one");
+ granulepos =
+ kate_duration_granule (&parse->ki,
+ GST_BUFFER_TIMESTAMP (buf) /
+ (double) GST_SECOND) << kate_granule_shift (&parse->ki);
+ }
+ GST_BUFFER_OFFSET (buf) =
+ kate_granule_time (&parse->ki, granulepos) * GST_SECOND;
+ GST_BUFFER_OFFSET_END (buf) = granulepos;
+ GST_BUFFER_TIMESTAMP (buf) = GST_BUFFER_OFFSET (buf);
+
+ /* Hack to flush each packet on its own page - taken off the CMML encoder element */
+ /* TODO: this is shite and needs to go once I find a way to tell Ogg to flush
+ as it messes up Matroska's track duration */
+ GST_BUFFER_DURATION (buf) = G_MAXINT64;
+
+ gst_buffer_set_caps (buf, GST_PAD_CAPS (parse->srcpad));
+
+ return gst_pad_push (parse->srcpad, buf);
+}
+
+static GstFlowReturn
+gst_kate_parse_drain_queue_prematurely (GstKateParse * parse)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ /* got an EOS event, make sure to push out any buffers that were in the queue
+ * -- won't normally be the case, but this catches the
+ * didn't-get-a-granulepos-on-the-last-packet case. Assuming a continuous
+ * stream. */
+
+ /* if we got EOS before any buffers came, go ahead and push the other events
+ * first */
+ gst_kate_parse_drain_event_queue (parse);
+
+ while (!g_queue_is_empty (parse->buffer_queue)) {
+ GstBuffer *buf;
+ gint64 granpos;
+
+ buf = GST_BUFFER_CAST (g_queue_pop_head (parse->buffer_queue));
+
+ granpos = GST_BUFFER_OFFSET_END (buf);
+ ret = gst_kate_parse_push_buffer (parse, buf, granpos);
+
+ if (ret != GST_FLOW_OK)
+ goto done;
+ }
+
+ g_assert (g_queue_is_empty (parse->buffer_queue));
+
+done:
+ return ret;
+}
+
+static GstFlowReturn
+gst_kate_parse_drain_queue (GstKateParse * parse, gint64 granulepos)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ if (!g_queue_is_empty (parse->buffer_queue)) {
+ GstBuffer *buf;
+ buf = GST_BUFFER_CAST (g_queue_pop_head (parse->buffer_queue));
+ ret = gst_kate_parse_push_buffer (parse, buf, granulepos);
+
+ if (ret != GST_FLOW_OK)
+ goto done;
+ }
+ g_assert (g_queue_is_empty (parse->buffer_queue));
+
+done:
+ return ret;
+}
+
+static GstFlowReturn
+gst_kate_parse_queue_buffer (GstKateParse * parse, GstBuffer * buf)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ gint64 granpos;
+
+ buf = gst_buffer_make_metadata_writable (buf);
+
+ /* oggdemux stores the granule pos in the offset end */
+ granpos = GST_BUFFER_OFFSET_END (buf);
+ GST_LOG_OBJECT (parse, "granpos %16llx", granpos);
+ g_queue_push_tail (parse->buffer_queue, buf);
+
+#if 1
+ /* if getting buffers from matroska, we won't have a granpos here... */
+ //if (GST_BUFFER_OFFSET_END_IS_VALID (buf)) {
+ ret = gst_kate_parse_drain_queue (parse, granpos);
+ //}
+#else
+ if (granpos >= 0) {
+ ret = gst_kate_parse_drain_queue (parse, granpos);
+ } else {
+ GST_WARNING_OBJECT (parse, "granulepos < 0 (%lld)", granpos);
+ ret = GST_FLOW_ERROR;
+ }
+#endif
+
+ return ret;
+}
+
+static GstFlowReturn
+gst_kate_parse_parse_packet (GstKateParse * parse, GstBuffer * buf)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ g_assert (parse);
+
+ parse->packetno++;
+
+ GST_LOG_OBJECT (parse, "Got packet %02x, %u bytes",
+ GST_BUFFER_SIZE (buf) ? GST_BUFFER_DATA (buf)[0] : -1,
+ GST_BUFFER_SIZE (buf));
+
+ if (GST_BUFFER_SIZE (buf) > 0 && GST_BUFFER_DATA (buf)[0] & 0x80) {
+ GST_DEBUG_OBJECT (parse, "Found header %02x", GST_BUFFER_DATA (buf)[0]);
+ /* if 0x80 is set, it's streamheader,
+ * so put it on the streamheader list and return */
+ parse->streamheader = g_list_append (parse->streamheader, buf);
+ ret = GST_FLOW_OK;
+ } else {
+ if (!parse->streamheader_sent) {
+ GST_DEBUG_OBJECT (parse, "Found non header, pushing headers seen so far");
+ ret = gst_kate_parse_push_headers (parse);
+ }
+
+ if (ret == GST_FLOW_OK) {
+ ret = gst_kate_parse_queue_buffer (parse, buf);
+ }
+ }
+
+ return ret;
+}
+
+static GstFlowReturn
+gst_kate_parse_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstKateParseClass *klass;
+ GstKateParse *parse;
+
+ parse = GST_KATE_PARSE (GST_PAD_PARENT (pad));
+ klass = GST_KATE_PARSE_CLASS (G_OBJECT_GET_CLASS (parse));
+
+ g_assert (klass->parse_packet != NULL);
+
+ if (G_UNLIKELY (GST_PAD_CAPS (pad) == NULL))
+ return GST_FLOW_NOT_NEGOTIATED;
+
+ return klass->parse_packet (parse, buffer);
+}
+
+static gboolean
+gst_kate_parse_queue_event (GstKateParse * parse, GstEvent * event)
+{
+ GstFlowReturn ret = TRUE;
+
+ g_queue_push_tail (parse->event_queue, event);
+
+ return ret;
+}
+
+static gboolean
+gst_kate_parse_sink_event (GstPad * pad, GstEvent * event)
+{
+ gboolean ret;
+ GstKateParse *parse;
+
+ parse = GST_KATE_PARSE (gst_pad_get_parent (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ gst_kate_parse_clear_queue (parse);
+ ret = gst_pad_event_default (pad, event);
+ break;
+ case GST_EVENT_EOS:
+ if (!parse->streamheader_sent) {
+ GST_DEBUG_OBJECT (parse, "Got EOS, pushing headers seen so far");
+ ret = gst_kate_parse_push_headers (parse);
+ if (ret != GST_FLOW_OK)
+ goto done;
+ }
+ gst_kate_parse_drain_queue_prematurely (parse);
+ ret = gst_pad_event_default (pad, event);
+ break;
+ default:
+ if (!parse->streamheader_sent && GST_EVENT_IS_SERIALIZED (event))
+ ret = gst_kate_parse_queue_event (parse, event);
+ else
+ ret = gst_pad_event_default (pad, event);
+ break;
+ }
+
+done:
+ gst_object_unref (parse);
+
+ return ret;
+}
+
+#if 0
+static gboolean
+gst_kate_parse_convert (GstPad * pad,
+ GstFormat src_format, gint64 src_value,
+ GstFormat * dest_format, gint64 * dest_value)
+{
+ gboolean res = TRUE;
+ GstKateParse *parse;
+
+ parse = GST_KATE_PARSE (GST_PAD_PARENT (pad));
+
+ /* fixme: assumes atomic access to lots of instance variables modified from
+ * the streaming thread, including 64-bit variables */
+
+ if (!parse->streamheader_sent)
+ return FALSE;
+
+ if (src_format == *dest_format) {
+ *dest_value = src_value;
+ return TRUE;
+ }
+
+ if (parse->sinkpad == pad &&
+ (src_format == GST_FORMAT_BYTES || *dest_format == GST_FORMAT_BYTES))
+ return FALSE;
+
+ switch (src_format) {
+ case GST_FORMAT_TIME:
+ switch (*dest_format) {
+ default:
+ res = FALSE;
+ }
+ break;
+ case GST_FORMAT_DEFAULT:
+ switch (*dest_format) {
+ case GST_FORMAT_TIME:
+ *dest_value = kate_granule_time (&parse->ki, src_value) * GST_SECOND;
+ break;
+ default:
+ res = FALSE;
+ }
+ break;
+ default:
+ res = FALSE;
+ }
+
+ return res;
+}
+#endif
+
+static gboolean
+gst_kate_parse_src_query (GstPad * pad, GstQuery * query)
+{
+#if 1
+ // TODO
+ GST_WARNING ("gst_kate_parse_src_query");
+ return FALSE;
+#else
+ gint64 granulepos;
+ GstKateParse *parse;
+ gboolean res = FALSE;
+
+ parse = GST_KATE_PARSE (GST_PAD_PARENT (pad));
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_POSITION:
+ {
+ GstFormat format;
+ gint64 value;
+
+ granulepos = parse->prev_granulepos;
+
+ gst_query_parse_position (query, &format, NULL);
+
+ /* and convert to the final format */
+ if (!(res =
+ gst_kate_parse_convert (pad, GST_FORMAT_DEFAULT, granulepos,
+ &format, &value)))
+ goto error;
+
+ /* fixme: support segments
+ value = (value - parse->segment_start) + parse->segment_time;
+ */
+
+ gst_query_set_position (query, format, value);
+
+ GST_LOG_OBJECT (parse, "query %p: peer returned granulepos: %"
+ G_GUINT64_FORMAT " - we return %" G_GUINT64_FORMAT " (format %u)",
+ query, granulepos, value, format);
+
+ break;
+ }
+ case GST_QUERY_DURATION:
+ {
+ /* fixme: not threadsafe */
+ /* query peer for total length */
+ if (!gst_pad_is_linked (parse->sinkpad)) {
+ GST_WARNING_OBJECT (parse, "sink pad %" GST_PTR_FORMAT " is not linked",
+ parse->sinkpad);
+ goto error;
+ }
+ if (!(res = gst_pad_query (GST_PAD_PEER (parse->sinkpad), query)))
+ goto error;
+ break;
+ }
+ case GST_QUERY_CONVERT:
+ {
+ GstFormat src_fmt, dest_fmt;
+ gint64 src_val, dest_val;
+
+ gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val);
+ if (!(res =
+ gst_kate_parse_convert (pad, src_fmt, src_val, &dest_fmt,
+ &dest_val)))
+ goto error;
+ gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
+ break;
+ }
+ default:
+ res = gst_pad_query_default (pad, query);
+ break;
+ }
+ return res;
+
+error:
+ {
+ GST_WARNING_OBJECT (parse, "error handling query");
+ return res;
+ }
+#endif
+}
+
+static void
+gst_kate_parse_free_stream_headers (GstKateParse * parse)
+{
+ while (parse->streamheader != NULL) {
+ gst_buffer_unref (GST_BUFFER (parse->streamheader->data));
+ parse->streamheader = g_list_delete_link (parse->streamheader,
+ parse->streamheader);
+ }
+}
+
+static GstStateChangeReturn
+gst_kate_parse_change_state (GstElement * element, GstStateChange transition)
+{
+ GstKateParse *parse = GST_KATE_PARSE (element);
+ GstStateChangeReturn ret;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ kate_info_init (&parse->ki);
+ kate_comment_init (&parse->kc);
+ parse->packetno = 0;
+ parse->streamheader_sent = FALSE;
+ parse->streamheader = NULL;
+ parse->buffer_queue = g_queue_new ();
+ parse->event_queue = g_queue_new ();
+ break;
+ default:
+ break;
+ }
+
+ ret = parent_class->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ kate_info_clear (&parse->ki);
+ kate_comment_clear (&parse->kc);
+
+ gst_kate_parse_clear_queue (parse);
+ g_queue_free (parse->buffer_queue);
+ parse->buffer_queue = NULL;
+ g_queue_free (parse->event_queue);
+ parse->event_queue = NULL;
+ gst_kate_parse_free_stream_headers (parse);
+ break;
+
+ default:
+ break;
+ }
+
+ return ret;
+}
diff --git a/ext/kate/gstkateparse.h b/ext/kate/gstkateparse.h
new file mode 100644
index 00000000..509f6c49
--- /dev/null
+++ b/ext/kate/gstkateparse.h
@@ -0,0 +1,78 @@
+/* -*- c-basic-offset: 2 -*-
+ * GStreamer
+ * Copyright (C) <2004> Thomas Vander Stichele <thomas at apestaart dot org>
+ * Copyright (C) <2008> Vincent Penquerc'h <ogg.k.ogg.k at googlemail dot 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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_KATE_PARSE_H__
+#define __GST_KATE_PARSE_H__
+
+
+#include <gst/gst.h>
+#include <kate/kate.h>
+
+G_BEGIN_DECLS
+#define GST_TYPE_KATE_PARSE \
+ (gst_kate_parse_get_type())
+#define GST_KATE_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_KATE_PARSE,GstKateParse))
+#define GST_KATE_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_KATE_PARSE,GstKateParseClass))
+#define GST_IS_KATE_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_KATE_PARSE))
+#define GST_IS_KATKATEE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_KATE_PARSE))
+typedef struct _GstKateParse GstKateParse;
+typedef struct _GstKateParseClass GstKateParseClass;
+
+/**
+ * GstKateParse:
+ *
+ * Opaque data structure.
+ */
+struct _GstKateParse
+{
+ GstElement element;
+
+ GstPad *sinkpad;
+ GstPad *srcpad;
+
+ guint packetno;
+ gboolean streamheader_sent;
+ GList *streamheader;
+
+ GQueue *event_queue;
+ GQueue *buffer_queue;
+
+ kate_info ki;
+ kate_comment kc;
+};
+
+struct _GstKateParseClass
+{
+ GstElementClass parent_class;
+
+ /* virtual functions */
+ GstFlowReturn (*parse_packet) (GstKateParse * parse, GstBuffer * buf);
+};
+
+GType gst_kate_parse_get_type (void);
+
+G_END_DECLS
+#endif /* __GST_KATE_PARSE_H__ */
diff --git a/ext/kate/gstkatespu.c b/ext/kate/gstkatespu.c
new file mode 100644
index 00000000..f05ae421
--- /dev/null
+++ b/ext/kate/gstkatespu.c
@@ -0,0 +1,865 @@
+/* GStreamer
+ * Copyright (C) 2009 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#include <string.h>
+#include <kate/kate.h>
+#include <gst/gst.h>
+#include <gst/gstpad.h>
+#include "gstkatespu.h"
+
+#define MAX_SPU_SIZE 53220
+
+GST_DEBUG_CATEGORY_EXTERN (gst_kateenc_debug);
+GST_DEBUG_CATEGORY_EXTERN (gst_katedec_debug);
+
+/* taken off the dvdsubdec element */
+const guint32 gst_kate_spu_default_clut[16] = {
+ 0xb48080, 0x248080, 0x628080, 0xd78080,
+ 0x808080, 0x808080, 0x808080, 0x808080,
+ 0x808080, 0x808080, 0x808080, 0x808080,
+ 0x808080, 0x808080, 0x808080, 0x808080
+};
+
+#define GST_CAT_DEFAULT gst_kateenc_debug
+
+static void
+gst_kate_spu_decode_colormap (GstKateEnc * ke, const guint8 * ptr)
+{
+ ke->spu_colormap[3] = ptr[0] >> 4;
+ ke->spu_colormap[2] = ptr[0] & 0x0f;
+ ke->spu_colormap[1] = ptr[1] >> 4;
+ ke->spu_colormap[0] = ptr[1] & 0x0f;
+}
+
+static void
+gst_kate_spu_decode_alpha (GstKateEnc * ke, const guint8 * ptr)
+{
+ ke->spu_alpha[3] = ptr[0] >> 4;
+ ke->spu_alpha[2] = ptr[0] & 0x0f;
+ ke->spu_alpha[1] = ptr[1] >> 4;
+ ke->spu_alpha[0] = ptr[1] & 0x0f;
+}
+
+static void
+gst_kate_spu_decode_area (GstKateEnc * ke, const guint8 * ptr)
+{
+ ke->spu_left = ((((guint16) ptr[0]) & 0x3f) << 4) | (ptr[1] >> 4);
+ ke->spu_top = ((((guint16) ptr[3]) & 0x3f) << 4) | (ptr[4] >> 4);
+ ke->spu_right = ((((guint16) ptr[1]) & 0x03) << 8) | ptr[2];
+ ke->spu_bottom = ((((guint16) ptr[4]) & 0x03) << 8) | ptr[5];
+ GST_DEBUG_OBJECT (ke, "SPU area %u %u -> %u %d", ke->spu_left, ke->spu_top,
+ ke->spu_right, ke->spu_bottom);
+}
+
+static void
+gst_kate_spu_decode_pixaddr (GstKateEnc * ke, const guint8 * ptr)
+{
+ ke->spu_pix_data[0] = GST_KATE_UINT16_BE (ptr + 0);
+ ke->spu_pix_data[1] = GST_KATE_UINT16_BE (ptr + 2);
+}
+
+/* heavily inspired from dvdspudec */
+static guint16
+gst_kate_spu_decode_colcon (GstKateEnc * ke, const guint8 * ptr)
+{
+ guint16 nbytes = GST_KATE_UINT16_BE (ptr + 0);
+ guint16 nbytes_left = nbytes;
+
+ GST_LOG_OBJECT (ke, "Number of bytes in color/contrast change command is %u",
+ nbytes);
+ if (G_UNLIKELY (nbytes < 2)) {
+ GST_WARNING_OBJECT (ke,
+ "Number of bytes in color/contrast change command is %u, should be at least 2",
+ nbytes);
+ return 0;
+ }
+
+ ptr += 2;
+ nbytes_left -= 2;
+
+ /* we will just skip that data for now */
+ while (nbytes_left > 0) {
+ guint32 entry, nchanges, sz;
+ GST_LOG_OBJECT (ke, "Reading a color/contrast change entry, %u bytes left",
+ nbytes_left);
+ if (G_UNLIKELY (nbytes_left < 4)) {
+ GST_WARNING_OBJECT (ke,
+ "Not enough bytes to read a full color/contrast entry header");
+ break;
+ }
+ entry = GST_READ_UINT32_BE (ptr);
+ GST_LOG_OBJECT (ke, "Color/contrast change entry header is %08x", entry);
+ nchanges = CLAMP ((ptr[2] >> 4), 1, 8);
+ ptr += 4;
+ nbytes_left -= 4;
+ if (entry == 0x0fffffff) {
+ GST_LOG_OBJECT (ke,
+ "Encountered color/contrast change termination code, breaking, %u bytes left",
+ nbytes_left);
+ break;
+ }
+ GST_LOG_OBJECT (ke, "Color/contrast change entry has %u changes", nchanges);
+ sz = 6 * nchanges;
+ if (G_UNLIKELY (sz > nbytes_left)) {
+ GST_WARNING_OBJECT (ke,
+ "Not enough bytes to read a full color/contrast entry");
+ break;
+ }
+ ptr += sz;
+ nbytes_left -= sz;
+ }
+ return nbytes - nbytes_left;
+}
+
+static inline guint8
+gst_kate_spu_get_nybble (const guint8 * nybbles, size_t * nybble_offset)
+{
+ guint8 ret;
+
+ ret = nybbles[(*nybble_offset) / 2];
+
+ /* If the offset is even, we shift the answer down 4 bits, otherwise not */
+ if ((*nybble_offset) & 0x01)
+ ret &= 0x0f;
+ else
+ ret = ret >> 4;
+
+ (*nybble_offset)++;
+
+ return ret;
+}
+
+static guint16
+gst_kate_spu_get_rle_code (const guint8 * nybbles, size_t * nybble_offset)
+{
+ guint16 code;
+
+ code = gst_kate_spu_get_nybble (nybbles, nybble_offset);
+ if (code < 0x4) { /* 4 .. f */
+ code = (code << 4) | gst_kate_spu_get_nybble (nybbles, nybble_offset);
+ if (code < 0x10) { /* 1x .. 3x */
+ code = (code << 4) | gst_kate_spu_get_nybble (nybbles, nybble_offset);
+ if (code < 0x40) { /* 04x .. 0fx */
+ code = (code << 4) | gst_kate_spu_get_nybble (nybbles, nybble_offset);
+ }
+ }
+ }
+ return code;
+}
+
+static void
+gst_kate_spu_crop_bitmap (GstKateEnc * ke, kate_bitmap * kb, guint16 * dx,
+ guint16 * dy)
+{
+ int top, bottom, left, right;
+ guint8 zero = 0;
+ size_t n, x, y, w, h;
+
+#if 0
+ /* find the zero */
+ zero = kb->pixels[0];
+ for (x = 0; x < kb->width; ++x) {
+ if (kb->pixels[x] != zero) {
+ GST_LOG_OBJECT (ke, "top line at %u is not zero: %u", x, kb->pixels[x]);
+ return;
+ }
+ }
+#endif
+
+ /* top */
+ for (top = 0; top < kb->height; ++top) {
+ int empty = 1;
+ for (x = 0; x < kb->width; ++x) {
+ if (G_UNLIKELY (kb->pixels[x + top * kb->width] != zero)) {
+ empty = 0;
+ break;
+ }
+ }
+ if (!empty)
+ break;
+ }
+
+ /* bottom */
+ for (bottom = kb->height - 1; bottom >= top; --bottom) {
+ int empty = 1;
+ for (x = 0; x < kb->width; ++x) {
+ if (G_UNLIKELY (kb->pixels[x + bottom * kb->width] != zero)) {
+ empty = 0;
+ break;
+ }
+ }
+ if (!empty)
+ break;
+ }
+
+ /* left */
+ for (left = 0; left < kb->width; ++left) {
+ int empty = 1;
+ for (y = top; y <= bottom; ++y) {
+ if (G_UNLIKELY (kb->pixels[left + y * kb->width] != zero)) {
+ empty = 0;
+ break;
+ }
+ }
+ if (!empty)
+ break;
+ }
+
+ /* right */
+ for (right = kb->width - 1; right >= left; --right) {
+ int empty = 1;
+ for (y = top; y <= bottom; ++y) {
+ if (G_UNLIKELY (kb->pixels[right + y * kb->width] != zero)) {
+ empty = 0;
+ break;
+ }
+ }
+ if (!empty)
+ break;
+ }
+
+
+ w = right - left + 1;
+ h = bottom - top + 1;
+ GST_LOG_OBJECT (ke, "cropped from %zu %zu to %zu %zu", kb->width, kb->height,
+ w, h);
+ *dx += left;
+ *dy += top;
+ n = 0;
+ for (y = 0; y < h; ++y) {
+ memmove (kb->pixels + n, kb->pixels + kb->width * (y + top) + left, w);
+ n += w;
+ }
+ kb->width = w;
+ kb->height = h;
+}
+
+#define CHECK(x) do { guint16 _ = (x); if (G_UNLIKELY((_) > sz)) { GST_WARNING_OBJECT (ke, "SPU overflow"); return GST_FLOW_ERROR; } } while (0)
+#define ADVANCE(x) do { guint16 _ = (x); ptr += (_); sz -= (_); } while (0)
+#define IGNORE(x) do { guint16 __ = (x); CHECK (__); ADVANCE (__); } while (0)
+
+static GstFlowReturn
+gst_kate_spu_decode_command_sequence (GstKateEnc * ke, GstBuffer * buf,
+ guint16 command_sequence_offset)
+{
+ guint16 date;
+ guint16 next_command_sequence;
+ const guint8 *ptr;
+ guint16 sz;
+
+ if (command_sequence_offset >= GST_BUFFER_SIZE (buf)) {
+ GST_WARNING_OBJECT (ke, "Command sequence offset %u is out of range %u",
+ command_sequence_offset, GST_BUFFER_SIZE (buf));
+ return GST_FLOW_ERROR;
+ }
+
+ ptr = GST_BUFFER_DATA (buf) + command_sequence_offset;
+ sz = GST_BUFFER_SIZE (buf) - command_sequence_offset;
+
+ GST_DEBUG_OBJECT (ke, "Decoding command sequence at %u (%u bytes)",
+ command_sequence_offset, sz);
+
+ CHECK (2);
+ date = GST_KATE_UINT16_BE (ptr);
+ ADVANCE (2);
+ GST_DEBUG_OBJECT (ke, "date %u", date);
+
+ CHECK (2);
+ next_command_sequence = GST_KATE_UINT16_BE (ptr);
+ ADVANCE (2);
+ GST_DEBUG_OBJECT (ke, "next command sequence at %u", next_command_sequence);
+
+ while (sz) {
+ guint8 cmd = *ptr++;
+ switch (cmd) {
+ case SPU_CMD_FSTA_DSP: /* 0x00 */
+ GST_DEBUG_OBJECT (ke, "[0] DISPLAY");
+ break;
+ case SPU_CMD_DSP: /* 0x01 */
+ GST_DEBUG_OBJECT (ke, "[1] SHOW");
+ ke->show_time = date;
+ break;
+ case SPU_CMD_STP_DSP: /* 0x02 */
+ GST_DEBUG_OBJECT (ke, "[2] HIDE");
+ ke->hide_time = date;
+ break;
+ case SPU_CMD_SET_COLOR: /* 0x03 */
+ GST_DEBUG_OBJECT (ke, "[3] SET COLOR");
+ CHECK (2);
+ gst_kate_spu_decode_colormap (ke, ptr);
+ ADVANCE (2);
+ break;
+ case SPU_CMD_SET_ALPHA: /* 0x04 */
+ GST_DEBUG_OBJECT (ke, "[4] SET ALPHA");
+ CHECK (2);
+ gst_kate_spu_decode_alpha (ke, ptr);
+ ADVANCE (2);
+ break;
+ case SPU_CMD_SET_DAREA: /* 0x05 */
+ GST_DEBUG_OBJECT (ke, "[5] SET DISPLAY AREA");
+ CHECK (6);
+ gst_kate_spu_decode_area (ke, ptr);
+ ADVANCE (6);
+ break;
+ case SPU_CMD_DSPXA: /* 0x06 */
+ GST_DEBUG_OBJECT (ke, "[6] SET PIXEL ADDRESSES");
+ CHECK (4);
+ gst_kate_spu_decode_pixaddr (ke, ptr);
+ GST_DEBUG_OBJECT (ke, " -> first pixel address %u",
+ ke->spu_pix_data[0]);
+ GST_DEBUG_OBJECT (ke, " -> second pixel address %u",
+ ke->spu_pix_data[1]);
+ ADVANCE (4);
+ break;
+ case SPU_CMD_CHG_COLCON: /* 0x07 */
+ GST_DEBUG_OBJECT (ke, "[7] CHANGE COLOR/CONTRAST");
+ CHECK (2);
+ ADVANCE (gst_kate_spu_decode_colcon (ke, ptr));
+ break;
+ case SPU_CMD_END: /* 0xff */
+ GST_DEBUG_OBJECT (ke, "[0xff] END");
+ if (next_command_sequence != command_sequence_offset) {
+ GST_DEBUG_OBJECT (ke, "Jumping to next sequence at offset %u",
+ next_command_sequence);
+ return gst_kate_spu_decode_command_sequence (ke, buf,
+ next_command_sequence);
+ } else {
+ GST_DEBUG_OBJECT (ke, "No more sequences to decode");
+ return GST_FLOW_OK;
+ }
+ break;
+ default:
+ GST_WARNING_OBJECT (ke, "invalid SPU command: %u", cmd);
+ return GST_FLOW_ERROR;
+ }
+ }
+ return GST_FLOW_ERROR;
+}
+
+static inline int
+gst_kate_spu_clamp (int value)
+{
+ if (value < 0)
+ return 0;
+ if (value > 255)
+ return 255;
+ return value;
+}
+
+static void
+gst_kate_spu_yuv2rgb (int y, int u, int v, int *r, int *g, int *b)
+{
+#if 0
+ *r = gst_kate_spu_clamp (y + 1.371 * v);
+ *g = gst_kate_spu_clamp (y - 0.698 * v - 0.336 * u);
+ *b = gst_kate_spu_clamp (y + 1.732 * u);
+#elif 0
+ *r = gst_kate_spu_clamp (y + u);
+ *g = gst_kate_spu_clamp (y - (76 * u - 26 * v) / 256);
+ *b = gst_kate_spu_clamp (y + v);
+#else
+ y = (y - 16) * 255 / 219;
+ u = (u - 128) * 255 / 224;
+ v = (v - 128) * 255 / 224;
+
+ *r = gst_kate_spu_clamp (y + 1.402 * v);
+ *g = gst_kate_spu_clamp (y - 0.34414 * u - 0.71414 * v);
+ *b = gst_kate_spu_clamp (y + 1.772 * u);
+#endif
+}
+
+static GstFlowReturn
+gst_kate_spu_create_spu_palette (GstKateEnc * ke, kate_palette * kp)
+{
+ size_t n;
+
+ kate_palette_init (kp);
+ kp->ncolors = 4;
+ kp->colors = (kate_color *) g_malloc (kp->ncolors * sizeof (kate_color));
+ if (G_UNLIKELY (!kp->colors))
+ return GST_FLOW_ERROR;
+
+#if 1
+ for (n = 0; n < kp->ncolors; ++n) {
+ int idx = ke->spu_colormap[n];
+ guint32 color = ke->spu_clut[idx];
+ int y = (color >> 16) & 0xff;
+ int v = (color >> 8) & 0xff;
+ int u = color & 0xff;
+ int r, g, b;
+ gst_kate_spu_yuv2rgb (y, u, v, &r, &g, &b);
+ kp->colors[n].r = r;
+ kp->colors[n].g = g;
+ kp->colors[n].b = b;
+ kp->colors[n].a = ke->spu_alpha[n] * 17;
+ }
+#else
+ /* just make a ramp from 0 to 255 for those non transparent colors */
+ for (n = 0; n < kp->ncolors; ++n)
+ if (ke->spu_alpha[n] == 0)
+ ++ntrans;
+
+ for (n = 0; n < kp->ncolors; ++n) {
+ kp->colors[n].r = luma;
+ kp->colors[n].g = luma;
+ kp->colors[n].b = luma;
+ kp->colors[n].a = ke->spu_alpha[n] * 17;
+ if (ke->spu_alpha[n])
+ luma /= 2;
+ }
+#endif
+
+ return GST_FLOW_OK;
+}
+
+GstFlowReturn
+gst_kate_spu_decode_spu (GstKateEnc * ke, GstBuffer * buf, kate_region * kr,
+ kate_bitmap * kb, kate_palette * kp)
+{
+ const guint8 *ptr = GST_BUFFER_DATA (buf);
+ size_t sz = GST_BUFFER_SIZE (buf);
+ guint16 packet_size;
+ guint16 x, y;
+ size_t n;
+ guint8 *pixptr[2];
+ size_t nybble_offset[2];
+ size_t max_nybbles[2];
+ GstFlowReturn rflow;
+ guint16 next_command_sequence;
+ guint16 code;
+
+ /* before decoding anything, initialize to sensible defaults */
+ memset (ke->spu_colormap, 0, sizeof (ke->spu_colormap));
+ memset (ke->spu_alpha, 0, sizeof (ke->spu_alpha));
+ ke->spu_top = ke->spu_left = 1;
+ ke->spu_bottom = ke->spu_right = 0;
+ ke->spu_pix_data[0] = ke->spu_pix_data[1] = 0;
+ ke->show_time = ke->hide_time = 0;
+
+ /* read sizes and get to the start of the data */
+ CHECK (2);
+ packet_size = GST_KATE_UINT16_BE (ptr);
+ ADVANCE (2);
+ GST_DEBUG_OBJECT (ke, "packet size %u (GstBuffer size %u)", packet_size,
+ GST_BUFFER_SIZE (buf));
+
+ CHECK (2);
+ next_command_sequence = GST_KATE_UINT16_BE (ptr);
+ ADVANCE (2);
+ ptr = GST_BUFFER_DATA (buf) + next_command_sequence;
+ sz = GST_BUFFER_SIZE (buf) - next_command_sequence;
+ GST_DEBUG_OBJECT (ke, "next command sequence at %u for %u",
+ next_command_sequence, sz);
+
+ rflow = gst_kate_spu_decode_command_sequence (ke, buf, next_command_sequence);
+ if (G_UNLIKELY (rflow != GST_FLOW_OK))
+ return rflow;
+
+ /* if no addresses or sizes were given, or if they define an empty SPU, nothing more to do */
+ if (G_UNLIKELY (ke->spu_right - ke->spu_left < 0
+ || ke->spu_bottom - ke->spu_top < 0 || ke->spu_pix_data[0] == 0
+ || ke->spu_pix_data[1] == 0)) {
+ GST_WARNING_OBJECT (ke, "SPU area is empty, nothing to encode");
+ return GST_FLOW_ERROR;
+ }
+
+ /* create the palette */
+ rflow = gst_kate_spu_create_spu_palette (ke, kp);
+ if (G_UNLIKELY (rflow != GST_FLOW_OK))
+ return rflow;
+
+ /* create the bitmap */
+ kate_bitmap_init (kb);
+ kb->width = ke->spu_right - ke->spu_left + 1;
+ kb->height = ke->spu_bottom - ke->spu_top + 1;
+ kb->bpp = 2;
+ kb->type = kate_bitmap_type_paletted;
+ kb->pixels = (unsigned char *) g_malloc (kb->width * kb->height);
+ if (G_UNLIKELY (!kb->pixels)) {
+ GST_WARNING_OBJECT (ke, "Failed to allocate memory for pixel data");
+ return GST_FLOW_ERROR;
+ }
+
+ n = 0;
+ pixptr[0] = GST_BUFFER_DATA (buf) + ke->spu_pix_data[0];
+ pixptr[1] = GST_BUFFER_DATA (buf) + ke->spu_pix_data[1];
+ nybble_offset[0] = 0;
+ nybble_offset[1] = 0;
+ max_nybbles[0] = 2 * (packet_size - ke->spu_pix_data[0]);
+ max_nybbles[1] = 2 * (packet_size - ke->spu_pix_data[1]);
+ for (y = 0; y < kb->height; ++y) {
+ nybble_offset[y & 1] = GST_ROUND_UP_2 (nybble_offset[y & 1]);
+ for (x = 0; x < kb->width;) {
+ if (G_UNLIKELY (nybble_offset[y & 1] >= max_nybbles[y & 1])) {
+ GST_DEBUG_OBJECT (ke, "RLE overflow, clearing the remainder");
+ memset (kb->pixels + n, 0, kb->width - x);
+ n += kb->width - x;
+ break;
+ }
+ code = gst_kate_spu_get_rle_code (pixptr[y & 1], &nybble_offset[y & 1]);
+ if (code == 0) {
+ memset (kb->pixels + n, 0, kb->width - x);
+ n += kb->width - x;
+ break;
+ } else {
+ guint16 npixels = code >> 2;
+ guint16 pixel = code & 3;
+ if (npixels > kb->width - x) {
+ npixels = kb->width - x;
+ }
+ memset (kb->pixels + n, pixel, npixels);
+ n += npixels;
+ x += npixels;
+ }
+ }
+ }
+
+ GST_LOG_OBJECT (ke, "%u/%u bytes left in the data packet",
+ max_nybbles[0] - nybble_offset[0], max_nybbles[1] - nybble_offset[1]);
+
+ /* some streams seem to have huge uncropped SPUs, fix those up */
+ x = ke->spu_left;
+ y = ke->spu_top;
+ gst_kate_spu_crop_bitmap (ke, kb, &x, &y);
+
+ /* create the region */
+ kate_region_init (kr);
+ if (ke->original_canvas_width > 0 && ke->original_canvas_height > 0) {
+ /* prefer relative sizes in case we're encoding for a different resolution
+ that what the SPU was created for */
+ kr->metric = kate_millionths;
+ kr->x = 1000000 * x / ke->original_canvas_width;
+ kr->y = 1000000 * y / ke->original_canvas_height;
+ kr->w = 1000000 * kb->width / ke->original_canvas_width;
+ kr->h = 1000000 * kb->height / ke->original_canvas_height;
+ } else {
+ kr->metric = kate_pixel;
+ kr->x = x;
+ kr->y = y;
+ kr->w = kb->width;
+ kr->h = kb->height;
+ }
+
+ /* some SPUs have no hide time */
+ if (ke->hide_time == 0) {
+ GST_INFO_OBJECT (ke, "SPU has no hide time");
+ /* now, we don't know when the next SPU is scheduled to go, since we probably
+ haven't received it yet, so we'll just make it a 1 second delay, which is
+ probably going to end before the next one while being readable */
+ //ke->hide_time = ke->show_time + (1000 * 90 / 1024);
+ }
+
+ return GST_FLOW_OK;
+}
+
+#undef IGNORE
+#undef ADVANCE
+#undef CHECK
+
+#undef GST_CAT_DEFAULT
+#define GST_CAT_DEFAULT gst_katedec_debug
+
+static void
+gst_kate_spu_add_nybble (unsigned char *bytes, size_t nbytes, int nybble_offset,
+ unsigned char nybble)
+{
+ unsigned char *ptr = bytes + nbytes + nybble_offset / 2;
+ if (!(nybble_offset & 1)) {
+ *ptr = nybble << 4;
+ } else {
+ *ptr |= nybble;
+ }
+}
+
+static void
+gst_kate_spu_rgb2yuv (int r, int g, int b, int *y, int *u, int *v)
+{
+ *y = gst_kate_spu_clamp (r * 0.299 * 219 / 255 + g * 0.587 * 219 / 255 +
+ b * 0.114 * 219 / 255 + 16);
+ *u = gst_kate_spu_clamp (-r * 0.16874 * 224 / 255 - g * 0.33126 * 224 / 255 +
+ b * 0.5 * 224 / 255 + 128);
+ *v = gst_kate_spu_clamp (r * 0.5 * 224 / 255 - g * 0.41869 * 224 / 255 -
+ b * 0.08131 * 224 / 255 + 128);
+}
+
+static void
+gst_kate_spu_make_palette (GstKateDec * kd, int palette[4],
+ const kate_palette * kp)
+{
+ int n;
+ GstStructure *structure;
+ GstEvent *event;
+ char name[16];
+ int y, u, v;
+
+ palette[0] = 0;
+ palette[1] = 1;
+ palette[2] = 2;
+ palette[3] = 3;
+
+ structure = gst_structure_new ("application/x-gst-dvd",
+ "event", G_TYPE_STRING, "dvd-spu-clut-change", NULL);
+
+ /* Create a separate field for each value in the table. */
+ for (n = 0; n < 16; n++) {
+ guint32 color = 0;
+ if (n < 4) {
+ gst_kate_spu_rgb2yuv (kp->colors[n].r, kp->colors[n].g, kp->colors[n].b,
+ &y, &u, &v);
+ color = (y << 16) | (v << 8) | u;
+ }
+ g_snprintf (name, sizeof (name), "clut%02d", n);
+ gst_structure_set (structure, name, G_TYPE_INT, (int) color, NULL);
+ }
+
+ /* Create the DVD event and put the structure into it. */
+ event = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM, structure);
+
+ GST_LOG_OBJECT (kd, "preparing clut change event %" GST_PTR_FORMAT, event);
+ gst_pad_push_event (kd->srcpad, event);
+}
+
+GstBuffer *
+gst_kate_spu_encode_spu (GstKateDec * kd, const kate_event * ev)
+{
+ kate_tracker kin;
+ unsigned char *bytes = NULL;
+ size_t nbytes = 0;
+ GstBuffer *buffer = NULL;
+ int ret;
+ int ocw, och;
+ int top, left, right, bottom;
+ int pass, line, row;
+ int lines_offset[2];
+ int first_commands_offset, second_commands_offset;
+ int nybble_count;
+ const kate_bitmap *kb;
+ const kate_palette *kp;
+ int palette[4];
+ int delay;
+
+ /* we need a region, a bitmap, and a palette */
+ if (!ev || !ev->region || !ev->bitmap || !ev->palette)
+ return NULL;
+
+ kb = ev->bitmap;
+ kp = ev->palette;
+
+ /* these need particular properties */
+ if (kb->type != kate_bitmap_type_paletted || kb->bpp != 2)
+ return NULL;
+ if (kp->ncolors != 4)
+ return NULL;
+
+ ret = kate_tracker_init (&kin, ev->ki, ev);
+ if (ret < 0) {
+ GST_WARNING_OBJECT (kd, "Failed to initialize kate tracker");
+ return NULL;
+ }
+
+ ocw = ev->ki->original_canvas_width;
+ och = ev->ki->original_canvas_height;
+ ret = kate_tracker_update (&kin, (kate_float) 0, ocw, och, 0, 0, ocw, och);
+ if (ret < 0)
+ goto error;
+
+ if (kin.has.region) {
+ top = (int) (kin.region_y + (kate_float) 0.5);
+ left = (int) (kin.region_x + (kate_float) 0.5);
+ } else {
+ GST_WARNING_OBJECT (kd,
+ "No region information to place SPU, placing at 0 0");
+ top = left = 0;
+ }
+ right = left + kb->width - 1;
+ bottom = top + kb->height - 1;
+
+ /* Allocate space to build the SPU */
+ bytes = g_malloc (MAX_SPU_SIZE);
+ if (G_UNLIKELY (!bytes)) {
+ GST_WARNING_OBJECT (kd, "Failed to allocate %zu byte buffer", nbytes);
+ goto error;
+ }
+ nbytes = 4;
+ nybble_count = 0;
+
+#define CHKBUFSPC(nybbles) \
+ do { \
+ if ((nbytes + (nybbles + nybble_count + 1) / 2) > MAX_SPU_SIZE) { \
+ GST_WARNING_OBJECT (kd, "Not enough space in SPU buffer"); \
+ goto error; \
+ } \
+ } while(0)
+
+ /* encode lines */
+ for (pass = 0; pass <= 1; ++pass) {
+ lines_offset[pass] = nbytes;
+ for (line = pass; line < bottom - top + 1; line += 2) {
+ const unsigned char *ptr = kb->pixels + line * kb->width;
+ for (row = 0; row < kb->width;) {
+ int run = 1;
+ while (row + run < kb->width && run < 255 && ptr[row + run] == ptr[row])
+ ++run;
+ if (run >= 63 && row + run == kb->width) {
+ /* special end of line marker */
+ CHKBUFSPC (4);
+ gst_kate_spu_add_nybble (bytes, nbytes, nybble_count++, 0);
+ gst_kate_spu_add_nybble (bytes, nbytes, nybble_count++, 0);
+ gst_kate_spu_add_nybble (bytes, nbytes, nybble_count++, 0);
+ gst_kate_spu_add_nybble (bytes, nbytes, nybble_count++, ptr[row]);
+ } else if (run >= 1 && run <= 3) {
+ CHKBUFSPC (1);
+ gst_kate_spu_add_nybble (bytes, nbytes, nybble_count++,
+ (run << 2) | ptr[row]);
+ } else if (run <= 15) {
+ CHKBUFSPC (2);
+ gst_kate_spu_add_nybble (bytes, nbytes, nybble_count++, run >> 2);
+ gst_kate_spu_add_nybble (bytes, nbytes, nybble_count++,
+ ((run & 3) << 2) | ptr[row]);
+ } else if (run <= 63) {
+ CHKBUFSPC (3);
+ gst_kate_spu_add_nybble (bytes, nbytes, nybble_count++, 0);
+ gst_kate_spu_add_nybble (bytes, nbytes, nybble_count++, run >> 2);
+ gst_kate_spu_add_nybble (bytes, nbytes, nybble_count++,
+ ((run & 3) << 2) | ptr[row]);
+ } else {
+ CHKBUFSPC (4);
+ gst_kate_spu_add_nybble (bytes, nbytes, nybble_count++, 0);
+ gst_kate_spu_add_nybble (bytes, nbytes, nybble_count++, (run >> 6));
+ gst_kate_spu_add_nybble (bytes, nbytes, nybble_count++,
+ (run >> 2) & 0xf);
+ gst_kate_spu_add_nybble (bytes, nbytes, nybble_count++,
+ ((run & 3) << 2) | ptr[row]);
+ }
+ row += run;
+ }
+ if (nybble_count & 1) {
+ CHKBUFSPC (1);
+ gst_kate_spu_add_nybble (bytes, nbytes, nybble_count++, 0);
+ }
+ nbytes += nybble_count / 2;
+ nybble_count = 0;
+ }
+ }
+ first_commands_offset = nbytes;
+
+ gst_kate_spu_make_palette (kd, palette, kp);
+
+ /* Commands header */
+ CHKBUFSPC (4 * 2);
+ bytes[nbytes++] = 0;
+ bytes[nbytes++] = 0;
+ /* link to next command chunk will be filled later, when we know where it is */
+ bytes[nbytes++] = 0;
+ bytes[nbytes++] = 0;
+
+ CHKBUFSPC (3 * 2);
+ bytes[nbytes++] = SPU_CMD_SET_COLOR;
+ bytes[nbytes++] = (palette[3] << 4) | palette[2];
+ bytes[nbytes++] = (palette[1] << 4) | palette[0];
+
+ CHKBUFSPC (3 * 2);
+ bytes[nbytes++] = SPU_CMD_SET_ALPHA;
+ bytes[nbytes++] =
+ ((kp->colors[palette[3]].a / 17) << 4) | (kp->colors[palette[2]].a / 17);
+ bytes[nbytes++] =
+ ((kp->colors[palette[1]].a / 17) << 4) | (kp->colors[palette[0]].a / 17);
+
+#if 0
+ // move to top left - avoids a crash in dvdspu when overlaying on a small video :/
+ right -= left;
+ bottom -= top;
+ left = 0;
+ top = 0;
+#endif
+
+ CHKBUFSPC (7 * 2);
+ bytes[nbytes++] = SPU_CMD_SET_DAREA;
+ bytes[nbytes++] = left >> 4;
+ bytes[nbytes++] = ((left & 0xf) << 4) | (right >> 8);
+ bytes[nbytes++] = right & 0xff;
+ bytes[nbytes++] = top >> 4;
+ bytes[nbytes++] = ((top & 0xf) << 4) | (bottom >> 8);
+ bytes[nbytes++] = bottom & 0xff;
+
+ CHKBUFSPC (5 * 2);
+ bytes[nbytes++] = SPU_CMD_DSPXA;
+ bytes[nbytes++] = (lines_offset[0] >> 8) & 0xff;
+ bytes[nbytes++] = lines_offset[0] & 0xff;
+ bytes[nbytes++] = (lines_offset[1] >> 8) & 0xff;
+ bytes[nbytes++] = lines_offset[1] & 0xff;
+
+ CHKBUFSPC (1 * 2);
+ bytes[nbytes++] = SPU_CMD_DSP;
+
+ CHKBUFSPC (1 * 2);
+ bytes[nbytes++] = SPU_CMD_END;
+
+ /* stop display chunk */
+ CHKBUFSPC (4 * 2);
+ second_commands_offset = nbytes;
+ bytes[first_commands_offset + 2] = (second_commands_offset >> 8) & 0xff;
+ bytes[first_commands_offset + 3] = second_commands_offset & 0xff;
+ delay = GST_KATE_GST_TO_STM (ev->end_time - ev->start_time);
+ bytes[nbytes++] = (delay >> 8) & 0xff;
+ bytes[nbytes++] = delay & 0xff;
+ /* close the loop by linking back to self */
+ bytes[nbytes++] = (second_commands_offset >> 8) & 0xff;
+ bytes[nbytes++] = second_commands_offset & 0xff;
+
+ CHKBUFSPC (1 * 2);
+ bytes[nbytes++] = SPU_CMD_STP_DSP;
+
+ CHKBUFSPC (1 * 2);
+ bytes[nbytes++] = SPU_CMD_END;
+
+ /* Now that we know the size of the SPU, update the size and pointers */
+ bytes[0] = (nbytes >> 8) & 0xff;
+ bytes[1] = nbytes & 0xff;
+ bytes[2] = (first_commands_offset >> 8) & 0xff;
+ bytes[3] = first_commands_offset & 0xff;
+
+ /* Create a buffer with those values */
+ buffer = gst_buffer_new ();
+ if (G_UNLIKELY (!buffer)) {
+ GST_WARNING_OBJECT (kd, "Failed to allocate %zu byte buffer", nbytes);
+ goto error;
+ }
+ GST_BUFFER_DATA (buffer) = bytes;
+ GST_BUFFER_MALLOCDATA (buffer) = bytes;
+ GST_BUFFER_SIZE (buffer) = nbytes;
+ GST_BUFFER_OFFSET_END (buffer) = GST_SECOND * (ev->end_time);
+ GST_BUFFER_OFFSET (buffer) = GST_SECOND * (ev->start_time);
+ GST_BUFFER_TIMESTAMP (buffer) = GST_SECOND * (ev->start_time);
+ GST_BUFFER_DURATION (buffer) = GST_SECOND * (ev->end_time - ev->start_time);
+
+ GST_DEBUG_OBJECT (kd, "SPU uses %zu bytes", nbytes);
+
+ kate_tracker_clear (&kin);
+ return buffer;
+
+error:
+ kate_tracker_clear (&kin);
+ if (bytes)
+ g_free (bytes);
+ return NULL;
+}
diff --git a/ext/kate/gstkatespu.h b/ext/kate/gstkatespu.h
new file mode 100644
index 00000000..b89e7934
--- /dev/null
+++ b/ext/kate/gstkatespu.h
@@ -0,0 +1,65 @@
+/* -*- c-basic-offset: 2 -*-
+ * GStreamer
+ * Copyright (C) <2009> ogg.k.ogg.k <ogg.k.ogg.k at googlemail dot 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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_KATE_SPU_H__
+#define __GST_KATE_SPU_H__
+
+#include <gst/gst.h>
+#include <kate/kate.h>
+#include "gstkateenc.h"
+#include "gstkatedec.h"
+
+#define GST_KATE_UINT16_BE(ptr) ( ( ((guint16)((ptr)[0])) <<8) | ((ptr)[1]) )
+
+/* taken off the DVD SPU decoder - now is time for today's WTF ???? */
+#define GST_KATE_STM_TO_GST(stm) ((GST_MSECOND * 1024 * (stm)) / 90)
+#define GST_KATE_GST_TO_STM(gst) ((int)(((gst) * 90000 ) / 1024))
+
+#define GST_KATE_SPU_MIME_TYPE "video/x-dvd-subpicture"
+
+G_BEGIN_DECLS
+
+enum GstKateSpuCmd
+{
+ SPU_CMD_FSTA_DSP = 0x00, /* Forced Display */
+ SPU_CMD_DSP = 0x01, /* Display Start */
+ SPU_CMD_STP_DSP = 0x02, /* Display Off */
+ SPU_CMD_SET_COLOR = 0x03, /* Set the color indexes for the palette */
+ SPU_CMD_SET_ALPHA = 0x04, /* Set the alpha indexes for the palette */
+ SPU_CMD_SET_DAREA = 0x05, /* Set the display area for the SPU */
+ SPU_CMD_DSPXA = 0x06, /* Pixel data addresses */
+ SPU_CMD_CHG_COLCON = 0x07, /* Change Color & Contrast */
+ SPU_CMD_END = 0xff
+};
+
+
+extern const guint32 gst_kate_spu_default_clut[16];
+
+extern GstFlowReturn
+gst_kate_spu_decode_spu (GstKateEnc * ke, GstBuffer * buf, kate_region * kr,
+ kate_bitmap * kb, kate_palette * kp);
+
+extern GstBuffer*
+gst_kate_spu_encode_spu (GstKateDec * kd, const kate_event * ev);
+
+G_END_DECLS
+
+#endif /* __GST_KATE_SPU_H__ */
diff --git a/ext/kate/gstkatetag.c b/ext/kate/gstkatetag.c
new file mode 100644
index 00000000..f5734c12
--- /dev/null
+++ b/ext/kate/gstkatetag.c
@@ -0,0 +1,352 @@
+/*
+ * GStreamer
+ * Copyright (C) 2006 James Livingston <doclivingston@gmail.com>
+ * Copyright (C) 2008 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-katetag
+ * @see_also: #oggdemux, #oggmux, #kateparse, #GstTagSetter
+ * @short_description: retags kate streams
+ *
+ * <refsect2>
+ * <para>
+ * The katetag element can change the tag contained within a raw
+ * kate stream. Specifically, it modifies the comments header packet
+ * of the kate stream, as well as the language and category of the
+ * kate stream.
+ * </para>
+ * <para>
+ * The element will also process the stream as the #kateparse element does
+ * so it can be used when remuxing an Ogg Kate stream, without additional
+ * elements.
+ * </para>
+ * <para>
+ * Applications can set the tags to write using the #GstTagSetter interface.
+ * Tags contained within the kate stream will be picked up
+ * automatically (and merged according to the merge mode set via the tag
+ * setter interface).
+ * </para>
+ * <title>Example pipelines</title>
+ * <para>
+ * This element is only useful with gst-launch for modifying the language
+ * and/or category (which are properties of the stream located in the kate
+ * beginning of stream header), because it does not support setting the tags
+ * on a #GstTagSetter interface. Conceptually, the element will usually be
+ * used like:
+ * <programlisting>
+ * gst-launch -v filesrc location=foo.ogg ! oggdemux ! katetag ! oggmux ! filesink location=bar.ogg
+ * </programlisting>
+ * </para>
+ * <para>
+ * This pipeline will set the language and category of the stream to the
+ * given values:
+ * <programlisting>
+ * gst-launch -v filesrc location=foo.ogg ! oggdemux ! katetag language=pt_BR category=subtitles ! oggmux ! filesink location=bar.ogg
+ * </programlisting>
+ * </para>
+ * </refsect2>
+ */
+
+/* FIXME: post appropriate GST_ELEMENT_ERROR when returning FLOW_ERROR */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <string.h>
+#include <glib.h>
+#include <gst/tag/tag.h>
+#include <gst/gsttagsetter.h>
+
+#include <kate/kate.h>
+
+#include "gstkatetag.h"
+
+
+GST_DEBUG_CATEGORY_EXTERN (gst_katetag_debug);
+#define GST_CAT_DEFAULT gst_katetag_debug
+
+enum
+{
+ ARG_0,
+ ARG_LANGUAGE,
+ ARG_CATEGORY,
+ ARG_ORIGINAL_CANVAS_WIDTH,
+ ARG_ORIGINAL_CANVAS_HEIGHT,
+};
+
+static void gst_kate_tag_base_init (gpointer g_class);
+static void gst_kate_tag_class_init (GstKateTagClass * klass);
+static void gst_kate_tag_init (GstKateTag * kt, GstKateTagClass * g_class);
+static GstFlowReturn gst_kate_tag_parse_packet (GstKateParse * parse,
+ GstBuffer * buffer);
+static void gst_kate_tag_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_kate_tag_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void gst_kate_tag_dispose (GObject * object);
+
+
+#define _do_init(type) \
+ G_STMT_START{ \
+ static const GInterfaceInfo tag_setter_info = { \
+ NULL, \
+ NULL, \
+ NULL \
+ }; \
+ g_type_add_interface_static (type, GST_TYPE_TAG_SETTER, \
+ &tag_setter_info); \
+ }G_STMT_END
+
+GST_BOILERPLATE_FULL (GstKateTag, gst_kate_tag, GstKateParse,
+ GST_TYPE_KATE_PARSE, _do_init);
+
+static GstElementDetails kate_tag_details =
+GST_ELEMENT_DETAILS ("Kate stream tagger",
+ "Formatter/Metadata",
+ "Retags kate streams",
+ "Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>");
+
+
+static void
+gst_kate_tag_base_init (gpointer g_class)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
+
+ gst_element_class_set_details (element_class, &kate_tag_details);
+}
+
+static void
+gst_kate_tag_class_init (GstKateTagClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstKateParseClass *gstkateparse_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstkateparse_class = GST_KATE_PARSE_CLASS (klass);
+
+ gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_kate_tag_set_property);
+ gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_kate_tag_get_property);
+ gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_kate_tag_dispose);
+
+ g_object_class_install_property (gobject_class, ARG_LANGUAGE,
+ g_param_spec_string ("language", "Language",
+ "Set the language of the stream", "", G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_CATEGORY,
+ g_param_spec_string ("category", "Category",
+ "Set the category of the stream", "", G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_ORIGINAL_CANVAS_WIDTH,
+ g_param_spec_int ("original-canvas-width", "Original canvas width",
+ "Set the width of the canvas this stream was authored for (0 is unspecified)",
+ 0, G_MAXINT, 0, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_ORIGINAL_CANVAS_HEIGHT,
+ g_param_spec_int ("original-canvas-height", "Original canvas height",
+ "Set the height of the canvas this stream was authored for (0 is unspecified)",
+ 0, G_MAXINT, 0, G_PARAM_READWRITE));
+
+ gstkateparse_class->parse_packet =
+ GST_DEBUG_FUNCPTR (gst_kate_tag_parse_packet);
+}
+
+static void
+gst_kate_tag_init (GstKateTag * kt, GstKateTagClass * g_class)
+{
+ kt->language = NULL;
+ kt->category = NULL;
+ kt->original_canvas_width = -1;
+ kt->original_canvas_height = -1;
+}
+
+static void
+gst_kate_tag_dispose (GObject * object)
+{
+ GstKateTag *kt = GST_KATE_TAG (object);
+
+ GST_LOG_OBJECT (kt, "disposing");
+
+ if (kt->language) {
+ g_free (kt->language);
+ kt->language = NULL;
+ }
+ if (kt->category) {
+ g_free (kt->category);
+ kt->category = NULL;
+ }
+
+ GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
+}
+
+static void
+gst_kate_tag_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstKateTag *kt = GST_KATE_TAG (object);
+ const char *str;
+
+ switch (prop_id) {
+ case ARG_LANGUAGE:
+ if (kt->language) {
+ g_free (kt->language);
+ kt->language = NULL;
+ }
+ str = g_value_get_string (value);
+ if (str)
+ kt->language = g_strdup (str);
+ break;
+ case ARG_CATEGORY:
+ if (kt->category) {
+ g_free (kt->category);
+ kt->category = NULL;
+ }
+ str = g_value_get_string (value);
+ if (str)
+ kt->category = g_strdup (str);
+ break;
+ case ARG_ORIGINAL_CANVAS_WIDTH:
+ kt->original_canvas_width = g_value_get_int (value);
+ break;
+ case ARG_ORIGINAL_CANVAS_HEIGHT:
+ kt->original_canvas_height = g_value_get_int (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_kate_tag_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstKateTag *kt = GST_KATE_TAG (object);
+
+ switch (prop_id) {
+ case ARG_LANGUAGE:
+ g_value_set_string (value, kt->language ? kt->language : "");
+ break;
+ case ARG_CATEGORY:
+ g_value_set_string (value, kt->category ? kt->category : "");
+ break;
+ case ARG_ORIGINAL_CANVAS_WIDTH:
+ g_value_set_int (value, kt->original_canvas_width);
+ break;
+ case ARG_ORIGINAL_CANVAS_HEIGHT:
+ g_value_set_int (value, kt->original_canvas_height);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static guint16
+encode_canvas_size (size_t size)
+{
+ size_t base = size;
+ size_t shift = 0;
+ int value;
+
+ while (base & ~((1 << 12) - 1)) {
+ /* we have a high bit we can't fit, increase shift if we wouldn't lose low bits */
+ if ((size >> shift) & 1)
+ return 0;
+ ++shift;
+ base >>= 1;
+ }
+ if (G_UNLIKELY (shift >= 16))
+ return 0;
+
+ /* the size can be represented in our encoding */
+ value = (base << 4) | shift;
+
+ return (guint16) value;
+}
+
+static GstFlowReturn
+gst_kate_tag_parse_packet (GstKateParse * parse, GstBuffer * buffer)
+{
+ GstTagList *old_tags, *new_tags;
+ const GstTagList *user_tags;
+ GstKateTag *kt;
+ gchar *encoder = NULL;
+ GstBuffer *new_buf;
+
+ kt = GST_KATE_TAG (parse);
+
+ /* rewrite the language and category */
+ if (GST_BUFFER_SIZE (buffer) >= 64 && GST_BUFFER_DATA (buffer)[0] == 0x80) {
+ GstBuffer *new_buffer = gst_buffer_copy (buffer);
+
+ gst_buffer_unref (buffer);
+ buffer = new_buffer;
+
+ /* language is at offset 32, 16 bytes, zero terminated */
+ if (kt->language) {
+ strncpy ((char *) GST_BUFFER_DATA (buffer) + 32, kt->language, 15);
+ GST_BUFFER_DATA (buffer)[47] = 0;
+ }
+ /* category is at offset 48, 16 bytes, zero terminated */
+ if (kt->category) {
+ strncpy ((char *) GST_BUFFER_DATA (buffer) + 48, kt->category, 15);
+ GST_BUFFER_DATA (buffer)[63] = 0;
+ }
+ if (kt->original_canvas_width >= 0) {
+ guint16 v = encode_canvas_size (kt->original_canvas_width);
+ GST_BUFFER_DATA (buffer)[16] = v & 0xff;
+ GST_BUFFER_DATA (buffer)[17] = (v >> 8) & 0xff;
+ }
+ if (kt->original_canvas_height >= 0) {
+ guint16 v = encode_canvas_size (kt->original_canvas_height);
+ GST_BUFFER_DATA (buffer)[18] = v & 0xff;
+ GST_BUFFER_DATA (buffer)[19] = (v >> 8) & 0xff;
+ }
+ }
+
+ /* rewrite the comments packet */
+ if (GST_BUFFER_SIZE (buffer) >= 9 && GST_BUFFER_DATA (buffer)[0] == 0x81) {
+ old_tags =
+ gst_tag_list_from_vorbiscomment_buffer (buffer,
+ (const guint8 *) "\201kate\0\0\0\0", 9, &encoder);
+ user_tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (kt));
+
+ /* build new tag list */
+ new_tags = gst_tag_list_merge (user_tags, old_tags,
+ gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (kt)));
+ gst_tag_list_free (old_tags);
+
+ new_buf =
+ gst_tag_list_to_vorbiscomment_buffer (new_tags,
+ (const guint8 *) "\201kate\0\0\0\0", 9, encoder);
+ gst_buffer_copy_metadata (new_buf, buffer, GST_BUFFER_COPY_TIMESTAMPS);
+
+ gst_tag_list_free (new_tags);
+ g_free (encoder);
+ gst_buffer_unref (buffer);
+
+ /* the buffer will have the framing bit used by Vorbis, but we don't use it */
+ --GST_BUFFER_SIZE (new_buf);
+
+ buffer = new_buf;
+ }
+
+ return GST_KATE_PARSE_CLASS (parent_class)->parse_packet (parse, buffer);
+}
diff --git a/ext/kate/gstkatetag.h b/ext/kate/gstkatetag.h
new file mode 100644
index 00000000..2f27df38
--- /dev/null
+++ b/ext/kate/gstkatetag.h
@@ -0,0 +1,65 @@
+/* -*- c-basic-offset: 2 -*-
+ * GStreamer
+ * Copyright (C) <2006> James Livingston <doclivingston@gmail.com>
+ * Copyright (C) <2008> Vincent Penquerc'h <ogg.k.ogg.k@googlemail.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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_KATE_TAG_H__
+#define __GST_KATE_TAG_H__
+
+#include "gstkateparse.h"
+
+G_BEGIN_DECLS
+#define GST_TYPE_KATE_TAG \
+ (gst_kate_tag_get_type())
+#define GST_KATE_TAG(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_KATE_TAG,GstKateTag))
+#define GST_KATE_TAG_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_KATE_TAG,GstKateTagClass))
+#define GST_IS_KATE_TAG(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_KATE_TAG))
+#define GST_IS_KATE_TAG_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_KATE_TAG))
+typedef struct _GstKateTag GstKateTag;
+typedef struct _GstKateTagClass GstKateTagClass;
+
+/**
+ * GstKateTag:
+ *
+ * Opaque data structure.
+ */
+struct _GstKateTag
+{
+ GstKateParse parse;
+
+ gchar *language;
+ gchar *category;
+ gint original_canvas_width;
+ gint original_canvas_height;
+};
+
+struct _GstKateTagClass
+{
+ GstKateParseClass parent_class;
+};
+
+GType gst_kate_tag_get_type (void);
+
+G_END_DECLS
+#endif /* __GST_KATE_TAG_H__ */
diff --git a/ext/kate/gstkatetiger.c b/ext/kate/gstkatetiger.c
new file mode 100644
index 00000000..3e72285a
--- /dev/null
+++ b/ext/kate/gstkatetiger.c
@@ -0,0 +1,802 @@
+/*
+ * GStreamer
+ * Copyright 2005 Thomas Vander Stichele <thomas@apestaart.org>
+ * Copyright 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright 2008 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Alternatively, the contents of this file may be used under the
+ * GNU Lesser General Public License Version 2.1 (the "LGPL"), in
+ * which case the following provisions apply instead of the ones
+ * mentioned above:
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-tiger
+ * @see_also: katedec
+ *
+ * <refsect2>
+ * <para>
+ * This element decodes and renders Kate streams
+ * <ulink url="http://libkate.googlecode.com/">Kate</ulink> is a free codec
+ * for text based data, such as subtitles. Any number of kate streams can be
+ * embedded in an Ogg stream.
+ * </para>
+ * <para>
+ * libkate (see above url) and <ulink url="http://libtiger.googlecode.com/">libtiger</ulink>
+ * are needed to build this element.
+ * </para>
+ * <title>Example pipeline</title>
+ * <para>
+ * This pipeline renders a Kate stream on top of a Theora video multiplexed
+ * in the same stream:
+ * <programlisting>
+ * gst-launch \
+ * filesrc location=video.ogg ! oggdemux name=demux \
+ * demux. ! queue ! theoradec ! ffmpegcolorspace ! tiger name=tiger \
+ * demux. ! queue ! kateparse ! tiger. \
+ * tiger. ! ffmpegcolorspace ! autovideosink
+ * </programlisting>
+ * </para>
+ * </refsect2>
+ */
+
+/* FIXME: post appropriate GST_ELEMENT_ERROR when returning FLOW_ERROR */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include <gst/gst.h>
+#include <gst/video/video.h>
+
+#include "gstkate.h"
+#include "gstkatetiger.h"
+
+GST_DEBUG_CATEGORY_EXTERN (gst_katetiger_debug);
+#define GST_CAT_DEFAULT gst_katetiger_debug
+
+/* Filter signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+enum
+{
+ ARG_DEFAULT_FONT_DESC = DECODER_BASE_ARG_COUNT,
+ ARG_QUALITY,
+ ARG_DEFAULT_FONT_EFFECT,
+ ARG_DEFAULT_FONT_EFFECT_STRENGTH,
+ ARG_DEFAULT_FONT_RED,
+ ARG_DEFAULT_FONT_GREEN,
+ ARG_DEFAULT_FONT_BLUE,
+ ARG_DEFAULT_FONT_ALPHA,
+ ARG_DEFAULT_BACKGROUND_RED,
+ ARG_DEFAULT_BACKGROUND_GREEN,
+ ARG_DEFAULT_BACKGROUND_BLUE,
+ ARG_DEFAULT_BACKGROUND_ALPHA
+};
+
+static GstStaticPadTemplate kate_sink_factory =
+ GST_STATIC_PAD_TEMPLATE ("kate_sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("subtitle/x-kate; application/x-kate")
+ );
+
+static GstStaticPadTemplate video_sink_factory =
+GST_STATIC_PAD_TEMPLATE ("video_sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("video/x-raw-rgb, bpp=(int)32, depth=(int)24")
+ );
+
+static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("video/x-raw-rgb, bpp=(int)32, depth=(int)24")
+ );
+
+GST_BOILERPLATE (GstKateTiger, gst_kate_tiger, GstElement, GST_TYPE_ELEMENT);
+
+static GType
+gst_kate_tiger_font_effect_get_type ()
+{
+ static GType font_effect_type = 0;
+
+ if (!font_effect_type) {
+ static const GEnumValue font_effects[] = {
+ {tiger_font_plain, "none", "none"},
+ {tiger_font_shadow, "shadow", "shadow"},
+ {tiger_font_outline, "outline", "outline"},
+ {0, NULL, NULL}
+ };
+ font_effect_type = g_enum_register_static ("GstFontEffect", font_effects);
+ }
+
+ return font_effect_type;
+}
+
+static void gst_kate_tiger_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_kate_tiger_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void gst_kate_tiger_dispose (GObject * object);
+
+static GstFlowReturn gst_kate_tiger_kate_chain (GstPad * pad, GstBuffer * buf);
+static GstFlowReturn gst_kate_tiger_video_chain (GstPad * pad, GstBuffer * buf);
+static GstStateChangeReturn gst_kate_tiger_change_state (GstElement * element,
+ GstStateChange transition);
+static gboolean gst_kate_tiger_kate_sink_query (GstPad * pad, GstQuery * query);
+static gboolean gst_kate_tiger_kate_event (GstPad * pad, GstEvent * event);
+static gboolean gst_kate_tiger_video_set_caps (GstPad * pad, GstCaps * caps);
+static gboolean gst_kate_tiger_source_event (GstPad * pad, GstEvent * event);
+
+static void
+gst_kate_tiger_base_init (gpointer gclass)
+{
+ static GstElementDetails element_details =
+ GST_ELEMENT_DETAILS ("Kate stream renderer",
+ "Codec/Decoder/Video/Overlay",
+ "Decodes and renders Kate streams on top of a video",
+ "Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>");
+ GstElementClass *element_class = GST_ELEMENT_CLASS (gclass);
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&src_factory));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&kate_sink_factory));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&video_sink_factory));
+ gst_element_class_set_details (element_class, &element_details);
+}
+
+/* initialize the plugin's class */
+static void
+gst_kate_tiger_class_init (GstKateTigerClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+
+ gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_kate_tiger_get_property);
+ gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_kate_tiger_set_property);
+ gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_kate_tiger_dispose);
+
+ gst_kate_util_install_decoder_base_properties (gobject_class);
+
+ g_object_class_install_property (gobject_class, ARG_QUALITY,
+ g_param_spec_double ("quality", "Rendering quality",
+ "Rendering quality (0 is faster, 1 is best and slower)",
+ 0.0, 1.0, 1.0, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_DEFAULT_FONT_DESC,
+ g_param_spec_string ("default-font-desc", "Default font description",
+ "Default font description (Pango style) to render text with",
+ "", G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_DEFAULT_FONT_EFFECT,
+ g_param_spec_enum ("default-font-effect", "Default font effect",
+ "Whether to apply an effect to text by default, for increased readability",
+ gst_kate_tiger_font_effect_get_type (),
+ tiger_font_plain, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
+ g_object_class_install_property (gobject_class,
+ ARG_DEFAULT_FONT_EFFECT_STRENGTH,
+ g_param_spec_double ("default-font-effect-strength",
+ "Default font effect strength",
+ "How pronounced should the font effect be (effect dependent)", 0.0,
+ 1.0, 0.5, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_DEFAULT_FONT_RED,
+ g_param_spec_int ("default-font-red",
+ "Default font color (red component)",
+ "Default font color (red component, between 0 and 255) to render text with",
+ 0, 255, 255, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_DEFAULT_FONT_GREEN,
+ g_param_spec_int ("default-font-green",
+ "Default font color (green component)",
+ "Default font color (green component, between 0 and 255) to render text with",
+ 0, 255, 255, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_DEFAULT_FONT_BLUE,
+ g_param_spec_int ("default-font-blue",
+ "Default font color (blue component)",
+ "Default font color (blue component, between 0 and 255) to render text with",
+ 0, 255, 255, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_DEFAULT_FONT_ALPHA,
+ g_param_spec_int ("default-font-alpha",
+ "Default font color (alpha component)",
+ "Default font color (alpha component, between 0 and 255) to render text with",
+ 0, 255, 255, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_DEFAULT_BACKGROUND_RED,
+ g_param_spec_int ("default-background-red",
+ "Default background color (red component)",
+ "Default background color (red component, between 0 and 255) to render text with",
+ 0, 255, 255, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_DEFAULT_BACKGROUND_GREEN,
+ g_param_spec_int ("default-background-green",
+ "Default background color (green component)",
+ "Default background color (green component, between 0 and 255) to render text with",
+ 0, 255, 255, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_DEFAULT_BACKGROUND_BLUE,
+ g_param_spec_int ("default-background-blue",
+ "Default background color (blue component)",
+ "Default background color (blue component, between 0 and 255) to render text with",
+ 0, 255, 255, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_DEFAULT_BACKGROUND_ALPHA,
+ g_param_spec_int ("default-background-alpha",
+ "Default background color (alpha component)",
+ "Default background color (alpha component, between 0 and 255) to render text with",
+ 0, 255, 255, G_PARAM_READWRITE));
+
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_kate_tiger_change_state);
+}
+
+/* initialize the new element
+ * instantiate pads and add them to element
+ * set functions
+ * initialize structure
+ */
+static void
+gst_kate_tiger_init (GstKateTiger * tiger, GstKateTigerClass * gclass)
+{
+ GST_DEBUG_OBJECT (tiger, "gst_kate_tiger_init");
+
+ tiger->mutex = g_mutex_new ();
+
+ tiger->katesinkpad =
+ gst_pad_new_from_static_template (&kate_sink_factory, "kate_sink");
+ gst_pad_set_chain_function (tiger->katesinkpad,
+ GST_DEBUG_FUNCPTR (gst_kate_tiger_kate_chain));
+ gst_pad_set_query_function (tiger->katesinkpad,
+ GST_DEBUG_FUNCPTR (gst_kate_tiger_kate_sink_query));
+ gst_pad_set_event_function (tiger->katesinkpad,
+ GST_DEBUG_FUNCPTR (gst_kate_tiger_kate_event));
+ gst_element_add_pad (GST_ELEMENT (tiger), tiger->katesinkpad);
+
+ tiger->videosinkpad =
+ gst_pad_new_from_static_template (&video_sink_factory, "video_sink");
+ gst_pad_set_chain_function (tiger->videosinkpad,
+ GST_DEBUG_FUNCPTR (gst_kate_tiger_video_chain));
+ //gst_pad_set_query_function (tiger->videosinkpad, GST_DEBUG_FUNCPTR (gst_kate_tiger_video_sink_query));
+ gst_pad_use_fixed_caps (tiger->videosinkpad);
+ gst_pad_set_caps (tiger->videosinkpad,
+ gst_static_pad_template_get_caps (&video_sink_factory));
+ gst_pad_set_setcaps_function (tiger->videosinkpad,
+ GST_DEBUG_FUNCPTR (gst_kate_tiger_video_set_caps));
+ gst_element_add_pad (GST_ELEMENT (tiger), tiger->videosinkpad);
+
+ tiger->srcpad = gst_pad_new_from_static_template (&src_factory, "src");
+ gst_pad_set_event_function (tiger->srcpad, gst_kate_tiger_source_event);
+ gst_element_add_pad (GST_ELEMENT (tiger), tiger->srcpad);
+
+ gst_kate_util_decode_base_init (&tiger->decoder);
+
+ tiger->tr = NULL;
+
+ tiger->default_font_desc = NULL;
+ tiger->quality = -1.0;
+ tiger->default_font_effect = tiger_font_plain;
+ tiger->default_font_effect_strength = 0.5;
+ tiger->default_font_r = 255;
+ tiger->default_font_g = 255;
+ tiger->default_font_b = 255;
+ tiger->default_font_a = 255;
+ tiger->default_background_r = 0;
+ tiger->default_background_g = 0;
+ tiger->default_background_b = 0;
+ tiger->default_background_a = 0;
+
+ tiger->video_width = 0;
+ tiger->video_height = 0;
+}
+
+static void
+gst_kate_tiger_dispose (GObject * object)
+{
+ GstKateTiger *tiger = GST_KATE_TIGER (object);
+
+ GST_LOG_OBJECT (tiger, "disposing");
+
+ if (tiger->default_font_desc) {
+ g_free (tiger->default_font_desc);
+ tiger->default_font_desc = NULL;
+ }
+
+ g_mutex_free (tiger->mutex);
+ tiger->mutex = NULL;
+
+ GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
+}
+
+static void
+gst_kate_tiger_update_quality (GstKateTiger * tiger)
+{
+ if (tiger->tr && tiger->quality >= 0.0) {
+ tiger_renderer_set_quality (tiger->tr, tiger->quality);
+ }
+}
+
+static void
+gst_kate_tiger_update_default_font_effect (GstKateTiger * tiger)
+{
+ if (tiger->tr) {
+ tiger_renderer_set_default_font_effect (tiger->tr,
+ tiger->default_font_effect, tiger->default_font_effect_strength);
+ }
+}
+
+static void
+gst_kate_tiger_update_default_font_color (GstKateTiger * tiger)
+{
+ if (tiger->tr) {
+ tiger_renderer_set_default_font_color (tiger->tr,
+ tiger->default_font_r / 255.0,
+ tiger->default_font_g / 255.0,
+ tiger->default_font_b / 255.0, tiger->default_font_a / 255.0);
+ }
+}
+
+static void
+gst_kate_tiger_update_default_background_color (GstKateTiger * tiger)
+{
+ if (tiger->tr) {
+ tiger_renderer_set_default_background_fill_color (tiger->tr,
+ tiger->default_background_r / 255.0,
+ tiger->default_background_g / 255.0,
+ tiger->default_background_b / 255.0,
+ tiger->default_background_a / 255.0);
+ }
+}
+
+static void
+gst_kate_tiger_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstKateTiger *tiger = GST_KATE_TIGER (object);
+ const char *str;
+
+ g_mutex_lock (tiger->mutex);
+
+ switch (prop_id) {
+ case ARG_DEFAULT_FONT_DESC:
+ if (tiger->default_font_desc) {
+ g_free (tiger->default_font_desc);
+ tiger->default_font_desc = NULL;
+ }
+ str = g_value_get_string (value);
+ if (str) {
+ tiger->default_font_desc = g_strdup (str);
+ if (tiger->tr)
+ tiger_renderer_set_default_font_description (tiger->tr,
+ tiger->default_font_desc);
+ }
+ break;
+ case ARG_QUALITY:
+ tiger->quality = g_value_get_double (value);
+ gst_kate_tiger_update_quality (tiger);
+ break;
+ case ARG_DEFAULT_FONT_EFFECT:
+ tiger->default_font_effect = g_value_get_enum (value);
+ gst_kate_tiger_update_default_font_effect (tiger);
+ break;
+ case ARG_DEFAULT_FONT_EFFECT_STRENGTH:
+ tiger->default_font_effect_strength = g_value_get_double (value);
+ gst_kate_tiger_update_default_font_effect (tiger);
+ break;
+ case ARG_DEFAULT_FONT_RED:
+ tiger->default_font_r = g_value_get_int (value);
+ gst_kate_tiger_update_default_font_color (tiger);
+ break;
+ case ARG_DEFAULT_FONT_GREEN:
+ tiger->default_font_g = g_value_get_int (value);
+ gst_kate_tiger_update_default_font_color (tiger);
+ break;
+ case ARG_DEFAULT_FONT_BLUE:
+ tiger->default_font_b = g_value_get_int (value);
+ gst_kate_tiger_update_default_font_color (tiger);
+ break;
+ case ARG_DEFAULT_FONT_ALPHA:
+ tiger->default_font_a = g_value_get_int (value);
+ gst_kate_tiger_update_default_font_color (tiger);
+ break;
+ case ARG_DEFAULT_BACKGROUND_RED:
+ tiger->default_background_r = g_value_get_int (value);
+ gst_kate_tiger_update_default_background_color (tiger);
+ break;
+ case ARG_DEFAULT_BACKGROUND_GREEN:
+ tiger->default_background_g = g_value_get_int (value);
+ gst_kate_tiger_update_default_background_color (tiger);
+ break;
+ case ARG_DEFAULT_BACKGROUND_BLUE:
+ tiger->default_background_b = g_value_get_int (value);
+ gst_kate_tiger_update_default_background_color (tiger);
+ break;
+ case ARG_DEFAULT_BACKGROUND_ALPHA:
+ tiger->default_background_a = g_value_get_int (value);
+ gst_kate_tiger_update_default_background_color (tiger);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+
+ g_mutex_unlock (tiger->mutex);
+}
+
+static void
+gst_kate_tiger_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstKateTiger *tiger = GST_KATE_TIGER (object);
+
+ g_mutex_lock (tiger->mutex);
+
+ switch (prop_id) {
+ case ARG_DEFAULT_FONT_DESC:
+ g_value_set_string (value,
+ tiger->default_font_desc ? tiger->default_font_desc : "");
+ break;
+ case ARG_QUALITY:
+ g_value_set_double (value, tiger->quality);
+ break;
+ case ARG_DEFAULT_FONT_EFFECT:
+ g_value_set_enum (value, tiger->default_font_effect);
+ break;
+ case ARG_DEFAULT_FONT_EFFECT_STRENGTH:
+ g_value_set_double (value, tiger->default_font_effect_strength);
+ break;
+ case ARG_DEFAULT_FONT_RED:
+ g_value_set_int (value, tiger->default_font_r);
+ break;
+ case ARG_DEFAULT_FONT_GREEN:
+ g_value_set_int (value, tiger->default_font_g);
+ break;
+ case ARG_DEFAULT_FONT_BLUE:
+ g_value_set_int (value, tiger->default_font_b);
+ break;
+ case ARG_DEFAULT_FONT_ALPHA:
+ g_value_set_int (value, tiger->default_font_a);
+ break;
+ case ARG_DEFAULT_BACKGROUND_RED:
+ g_value_set_int (value, tiger->default_background_r);
+ break;
+ case ARG_DEFAULT_BACKGROUND_GREEN:
+ g_value_set_int (value, tiger->default_background_g);
+ break;
+ case ARG_DEFAULT_BACKGROUND_BLUE:
+ g_value_set_int (value, tiger->default_background_b);
+ break;
+ case ARG_DEFAULT_BACKGROUND_ALPHA:
+ g_value_set_int (value, tiger->default_background_a);
+ break;
+ default:
+ if (!gst_kate_util_decoder_base_get_property (&tiger->decoder, object,
+ prop_id, value, pspec)) {
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+ break;
+ }
+
+ g_mutex_unlock (tiger->mutex);
+}
+
+/* GstElement vmethod implementations */
+
+/* chain function
+ * this function does the actual processing
+ */
+
+static GstFlowReturn
+gst_kate_tiger_kate_chain (GstPad * pad, GstBuffer * buf)
+{
+ GstKateTiger *tiger = GST_KATE_TIGER (gst_pad_get_parent (pad));
+ const kate_event *ev = NULL;
+ GstFlowReturn rflow = GST_FLOW_OK;
+
+ g_mutex_lock (tiger->mutex);
+
+ GST_LOG_OBJECT (tiger, "Got kate buffer");
+
+ rflow =
+ gst_kate_util_decoder_base_chain_kate_packet (&tiger->decoder,
+ GST_ELEMENT_CAST (tiger), pad, buf, tiger->srcpad, &ev);
+ if (G_LIKELY (rflow == GST_FLOW_OK)) {
+ if (ev) {
+ int ret = tiger_renderer_add_event (tiger->tr, ev->ki, ev);
+ GST_INFO_OBJECT (tiger, "adding event for %p from %f to %f: %p, \"%s\"",
+ ev->ki, ev->start_time, ev->end_time, ev->bitmap, ev->text);
+ if (G_UNLIKELY (ret < 0)) {
+ GST_WARNING_OBJECT (tiger,
+ "failed to add Kate event to Tiger renderer: %d", ret);
+ }
+ }
+ }
+
+ gst_object_unref (tiger);
+ gst_buffer_unref (buf);
+
+ g_mutex_unlock (tiger->mutex);
+
+ return rflow;
+}
+
+static gboolean
+gst_kate_tiger_video_set_caps (GstPad * pad, GstCaps * caps)
+{
+ GstKateTiger *tiger = GST_KATE_TIGER (gst_pad_get_parent (pad));
+ GstStructure *s;
+ gint w, h;
+ gboolean res = FALSE;
+
+ g_mutex_lock (tiger->mutex);
+
+ s = gst_caps_get_structure (caps, 0);
+
+ if (G_LIKELY (gst_structure_get_int (s, "width", &w))
+ && G_LIKELY (gst_structure_get_int (s, "height", &h))) {
+ GST_INFO_OBJECT (tiger, "video sink: %d %d", w, h);
+ tiger->video_width = w;
+ tiger->video_height = h;
+ res = TRUE;
+ }
+
+ g_mutex_unlock (tiger->mutex);
+
+ gst_object_unref (tiger);
+ return TRUE;
+}
+
+static GstFlowReturn
+gst_kate_tiger_video_chain (GstPad * pad, GstBuffer * buf)
+{
+ GstKateTiger *tiger = GST_KATE_TIGER (gst_pad_get_parent (pad));
+ GstFlowReturn rflow = GST_FLOW_OK;
+ unsigned char *ptr;
+ int ret;
+
+ g_mutex_lock (tiger->mutex);
+
+ GST_LOG_OBJECT (tiger, "got video frame, %u bytes", GST_BUFFER_SIZE (buf));
+
+ /* draw on it */
+ buf = gst_buffer_make_writable (buf);
+ if (G_UNLIKELY (!buf)) {
+ GST_WARNING_OBJECT (tiger, "Failed to make video buffer writable");
+ } else {
+ ptr = GST_BUFFER_DATA (buf);
+ if (!ptr) {
+ GST_WARNING_OBJECT (tiger,
+ "Failed to get a pointer to video buffer data");
+ } else {
+ ret = tiger_renderer_set_buffer (tiger->tr, ptr, tiger->video_width, tiger->video_height, tiger->video_width * 4, 0); // TODO: stride ?
+ if (G_UNLIKELY (ret < 0)) {
+ GST_WARNING_OBJECT (tiger,
+ "Tiger renderer failed to set buffer to video frame: %d", ret);
+ } else {
+ kate_float t = GST_BUFFER_TIMESTAMP (buf) / (gdouble) GST_SECOND;
+ ret = tiger_renderer_update (tiger->tr, t, 1);
+ if (G_UNLIKELY (ret < 0)) {
+ GST_WARNING_OBJECT (tiger, "Tiger renderer failed to update: %d",
+ ret);
+ } else {
+ ret = tiger_renderer_render (tiger->tr);
+ if (G_UNLIKELY (ret < 0)) {
+ GST_WARNING_OBJECT (tiger,
+ "Tiger renderer failed to render to video frame: %d", ret);
+ } else {
+ GST_LOG_OBJECT (tiger,
+ "Tiger renderer rendered on video frame at %f", t);
+ }
+ }
+ }
+ }
+ }
+ rflow = gst_pad_push (tiger->srcpad, buf);
+
+ gst_object_unref (tiger);
+
+ g_mutex_unlock (tiger->mutex);
+
+ return rflow;
+}
+
+static GstStateChangeReturn
+gst_kate_tiger_change_state (GstElement * element, GstStateChange transition)
+{
+ GstKateTiger *tiger = GST_KATE_TIGER (element);
+ GstStateChangeReturn res;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ GST_DEBUG_OBJECT (tiger, "PAUSED -> READY, clearing kate state");
+ g_mutex_lock (tiger->mutex);
+ if (tiger->tr) {
+ tiger_renderer_destroy (tiger->tr);
+ tiger->tr = NULL;
+ }
+ g_mutex_unlock (tiger->mutex);
+ break;
+ default:
+ break;
+ }
+
+ res =
+ gst_kate_decoder_base_change_state (&tiger->decoder, element,
+ parent_class, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ GST_DEBUG_OBJECT (tiger, "READY -> PAUSED, initializing kate state");
+ g_mutex_lock (tiger->mutex);
+ if (tiger->decoder.initialized) {
+ int ret = tiger_renderer_create (&tiger->tr);
+ if (ret < 0) {
+ GST_WARNING_OBJECT (tiger, "failed to create tiger renderer: %d",
+ ret);
+ } else {
+ ret =
+ tiger_renderer_set_default_font_description (tiger->tr,
+ tiger->default_font_desc);
+ if (ret < 0) {
+ GST_WARNING_OBJECT (tiger,
+ "failed to set tiger default font description: %d", ret);
+ }
+ gst_kate_tiger_update_default_font_color (tiger);
+ gst_kate_tiger_update_default_background_color (tiger);
+ gst_kate_tiger_update_default_font_effect (tiger);
+ gst_kate_tiger_update_quality (tiger);
+ }
+ }
+ g_mutex_unlock (tiger->mutex);
+ break;
+ default:
+ break;
+ }
+
+ return res;
+}
+
+static gboolean
+gst_kate_tiger_seek (GstKateTiger * tiger, GstPad * pad, GstEvent * event)
+{
+ GstFormat format;
+ gdouble rate;
+ GstSeekFlags flags;
+ GstSeekType cur_type, stop_type;
+ gint64 cur, stop;
+
+ gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur,
+ &stop_type, &stop);
+
+ /* forward to both sinks */
+ gst_event_ref (event);
+ if (gst_pad_push_event (tiger->videosinkpad, event)) {
+ if (gst_pad_push_event (tiger->katesinkpad, event)) {
+ if (format == GST_FORMAT_TIME) {
+ /* if seeking in time, we can update tiger to remove any appropriate events */
+ kate_float target = cur / (gdouble) GST_SECOND;
+ GST_INFO_OBJECT (tiger, "Seeking in time to %f", target);
+ g_mutex_lock (tiger->mutex);
+ tiger_renderer_seek (tiger->tr, target);
+ g_mutex_unlock (tiger->mutex);
+ }
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+ } else {
+ gst_event_unref (event);
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_kate_tiger_source_event (GstPad * pad, GstEvent * event)
+{
+ GstKateTiger *tiger =
+ (GstKateTiger *) (gst_object_get_parent (GST_OBJECT (pad)));
+ gboolean res = TRUE;
+
+ g_return_val_if_fail (tiger != NULL, FALSE);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEEK:
+ GST_INFO_OBJECT (tiger, "Seek on source pad");
+ res = gst_kate_tiger_seek (tiger, pad, event);
+ break;
+ default:
+ res = gst_pad_event_default (pad, event);
+ break;
+ }
+
+ gst_object_unref (tiger);
+
+ return res;
+}
+
+static gboolean
+gst_kate_tiger_kate_event (GstPad * pad, GstEvent * event)
+{
+ GstKateTiger *tiger =
+ (GstKateTiger *) (gst_object_get_parent (GST_OBJECT (pad)));
+ gboolean res = TRUE;
+
+ g_return_val_if_fail (tiger != NULL, FALSE);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_NEWSEGMENT:
+ GST_INFO_OBJECT (tiger, "New segment on Kate pad");
+ gst_event_unref (event);
+ break;
+ case GST_EVENT_EOS:
+ /* we ignore this, it just means we don't have anymore Kate packets, but
+ the Tiger renderer will still draw (if appropriate) on incoming video */
+ GST_INFO_OBJECT (tiger, "EOS on Kate pad");
+ gst_event_unref (event);
+ break;
+ default:
+ res = gst_pad_event_default (pad, event);
+ break;
+ }
+
+ gst_object_unref (tiger);
+
+ return res;
+}
+
+gboolean
+gst_kate_tiger_kate_sink_query (GstPad * pad, GstQuery * query)
+{
+ GstKateTiger *tiger = GST_KATE_TIGER (gst_pad_get_parent (pad));
+ gboolean res = gst_kate_decoder_base_sink_query (&tiger->decoder,
+ GST_ELEMENT_CAST (tiger), pad, query);
+ gst_object_unref (tiger);
+ return res;
+}
diff --git a/ext/kate/gstkatetiger.h b/ext/kate/gstkatetiger.h
new file mode 100644
index 00000000..0ab7dc13
--- /dev/null
+++ b/ext/kate/gstkatetiger.h
@@ -0,0 +1,108 @@
+/*
+ * GStreamer
+ * Copyright 2005 Thomas Vander Stichele <thomas@apestaart.org>
+ * Copyright 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright 2008 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Alternatively, the contents of this file may be used under the
+ * GNU Lesser General Public License Version 2.1 (the "LGPL"), in
+ * which case the following provisions apply instead of the ones
+ * mentioned above:
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_KATE_TIGER_H__
+#define __GST_KATE_TIGER_H__
+
+#include <kate/kate.h>
+#include <tiger/tiger.h>
+#include <gst/gst.h>
+#include "gstkateutil.h"
+
+G_BEGIN_DECLS
+/* #defines don't like whitespacey bits */
+#define GST_TYPE_KATE_TIGER \
+ (gst_kate_tiger_get_type())
+#define GST_KATE_TIGER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_KATE_TIGER,GstKateTiger))
+#define GST_KATE_TIGER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_KATE,GstKateTigerClass))
+#define GST_IS_KATE_TIGER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_KATE_TIGER))
+#define GST_IS_KATE_TIGER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_KATE_TIGER))
+typedef struct _GstKateTiger GstKateTiger;
+typedef struct _GstKateTigerClass GstKateTigerClass;
+
+struct _GstKateTiger
+{
+ GstElement element;
+
+ GstPad *katesinkpad;
+ GstPad *videosinkpad;
+ GstPad *srcpad;
+
+ GstKateDecoderBase decoder;
+
+ tiger_renderer *tr;
+
+ gdouble quality;
+ gchar *default_font_desc;
+ gboolean default_font_effect;
+ gdouble default_font_effect_strength;
+ guchar default_font_r;
+ guchar default_font_g;
+ guchar default_font_b;
+ guchar default_font_a;
+ guchar default_background_r;
+ guchar default_background_g;
+ guchar default_background_b;
+ guchar default_background_a;
+
+ gint video_width;
+ gint video_height;
+
+ GMutex *mutex;
+};
+
+struct _GstKateTigerClass
+{
+ GstElementClass parent_class;
+};
+
+GType gst_kate_tiger_get_type (void);
+
+G_END_DECLS
+#endif /* __GST_KATE_TIGER_H__ */
diff --git a/ext/kate/gstkateutil.c b/ext/kate/gstkateutil.c
new file mode 100644
index 00000000..ca245f99
--- /dev/null
+++ b/ext/kate/gstkateutil.c
@@ -0,0 +1,405 @@
+/* GStreamer
+ * Copyright (C) 2008 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/* FIXME: post appropriate GST_ELEMENT_ERROR when returning FLOW_ERROR */
+/* FIXME: shouldn't all this GstKateDecoderBase stuff really be a base class? */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gst/tag/tag.h>
+#include "gstkate.h"
+#include "gstkateutil.h"
+
+GstCaps *
+gst_kate_util_set_header_on_caps (GstElement * element, GstCaps * caps,
+ GList * headers)
+{
+ GstStructure *structure;
+ GValue array = { 0 };
+
+ GST_LOG_OBJECT (element, "caps: %" GST_PTR_FORMAT, caps);
+
+ if (G_UNLIKELY (!caps))
+ return NULL;
+ if (G_UNLIKELY (!headers))
+ return NULL;
+
+ caps = gst_caps_make_writable (caps);
+ structure = gst_caps_get_structure (caps, 0);
+
+ g_value_init (&array, GST_TYPE_ARRAY);
+
+ while (headers) {
+ GValue value = { 0 };
+ GstBuffer *buffer = headers->data;
+ g_assert (buffer);
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_IN_CAPS);
+ g_value_init (&value, GST_TYPE_BUFFER);
+ /* as in theoraenc, we need to copy to avoid circular references */
+ buffer = gst_buffer_copy (buffer);
+ gst_value_set_buffer (&value, buffer);
+ gst_buffer_unref (buffer);
+ gst_value_array_append_value (&array, &value);
+ g_value_unset (&value);
+ headers = headers->next;
+ }
+
+ gst_structure_set_value (structure, "streamheader", &array);
+ g_value_unset (&array);
+ GST_LOG_OBJECT (element, "here are the newly set caps: %" GST_PTR_FORMAT,
+ caps);
+
+ return caps;
+}
+
+void
+gst_kate_util_install_decoder_base_properties (GObjectClass * gobject_class)
+{
+ g_object_class_install_property (gobject_class, ARG_DEC_BASE_LANGUAGE,
+ g_param_spec_string ("language", "Language", "The language of the stream",
+ "", G_PARAM_READABLE));
+
+ g_object_class_install_property (gobject_class, ARG_DEC_BASE_CATEGORY,
+ g_param_spec_string ("category", "Category", "The category of the stream",
+ "", G_PARAM_READABLE));
+
+ g_object_class_install_property (gobject_class,
+ ARG_DEC_BASE_ORIGINAL_CANVAS_WIDTH,
+ g_param_spec_int ("original-canvas-width",
+ "Original canvas width (0 is unspecified)",
+ "The canvas width this stream was authored for", 0, G_MAXINT, 0,
+ G_PARAM_READABLE));
+
+ g_object_class_install_property (gobject_class,
+ ARG_DEC_BASE_ORIGINAL_CANVAS_HEIGHT,
+ g_param_spec_int ("original-canvas-height", "Original canvas height",
+ "The canvas height this stream was authored for (0 is unspecified)",
+ 0, G_MAXINT, 0, G_PARAM_READABLE));
+}
+
+void
+gst_kate_util_decode_base_init (GstKateDecoderBase * decoder)
+{
+ if (G_UNLIKELY (!decoder))
+ return;
+
+ decoder->language = NULL;
+ decoder->category = NULL;
+ decoder->original_canvas_width = 0;
+ decoder->original_canvas_height = 0;
+ decoder->tags = NULL;
+ decoder->initialized = FALSE;
+}
+
+static void
+gst_kate_util_decode_base_reset (GstKateDecoderBase * decoder)
+{
+ g_free (decoder->language);
+ decoder->language = NULL;
+ g_free (decoder->category);
+ decoder->category = NULL;
+ if (decoder->tags) {
+ gst_tag_list_free (decoder->tags);
+ decoder->tags = NULL;
+ }
+ decoder->original_canvas_width = 0;
+ decoder->original_canvas_height = 0;
+ decoder->initialized = FALSE;
+}
+
+gboolean
+gst_kate_util_decoder_base_get_property (GstKateDecoderBase * decoder,
+ GObject * object, guint prop_id, GValue * value, GParamSpec * pspec)
+{
+ gboolean res = TRUE;
+ switch (prop_id) {
+ case ARG_DEC_BASE_LANGUAGE:
+ g_value_set_string (value, decoder->language);
+ break;
+ case ARG_DEC_BASE_CATEGORY:
+ g_value_set_string (value, decoder->category);
+ break;
+ case ARG_DEC_BASE_ORIGINAL_CANVAS_WIDTH:
+ g_value_set_int (value, decoder->original_canvas_width);
+ break;
+ case ARG_DEC_BASE_ORIGINAL_CANVAS_HEIGHT:
+ g_value_set_int (value, decoder->original_canvas_height);
+ break;
+ default:
+ res = FALSE;
+ break;
+ }
+ return res;
+}
+
+GstFlowReturn
+gst_kate_util_decoder_base_chain_kate_packet (GstKateDecoderBase * decoder,
+ GstElement * element, GstPad * pad, GstBuffer * buf, GstPad * srcpad,
+ const kate_event ** ev)
+{
+ kate_packet kp;
+ int ret;
+ GstFlowReturn rflow = GST_FLOW_OK;
+
+ GST_DEBUG_OBJECT (element, "got kate packet, %u bytes, type %02x",
+ GST_BUFFER_SIZE (buf),
+ GST_BUFFER_SIZE (buf) == 0 ? -1 : GST_BUFFER_DATA (buf)[0]);
+ kate_packet_wrap (&kp, GST_BUFFER_SIZE (buf), GST_BUFFER_DATA (buf));
+ ret = kate_high_decode_packetin (&decoder->k, &kp, ev);
+ if (G_UNLIKELY (ret < 0)) {
+ GST_WARNING_OBJECT (element, "kate_high_decode_packetin failed (%d)", ret);
+ return GST_FLOW_ERROR;
+ } else if (G_UNLIKELY (ret > 0)) {
+ GST_DEBUG_OBJECT (element,
+ "kate_high_decode_packetin has received EOS packet");
+ return GST_FLOW_OK;
+ }
+
+ /* headers may be interesting to retrieve information from */
+ if (G_LIKELY (GST_BUFFER_SIZE (buf) > 0))
+ switch (GST_BUFFER_DATA (buf)[0]) {
+ GstCaps *caps;
+
+ case 0x80: /* ID header */
+ GST_INFO_OBJECT (element, "Parsed ID header: language %s, category %s",
+ decoder->k.ki->language, decoder->k.ki->category);
+ caps = gst_caps_new_simple ("text/x-pango-markup", NULL);
+ gst_pad_set_caps (srcpad, caps);
+ gst_caps_unref (caps);
+ if (decoder->k.ki->language && *decoder->k.ki->language) {
+ GstTagList *old = decoder->tags, *tags = gst_tag_list_new ();
+ if (tags) {
+ gchar *lang_code;
+
+ /* en_GB -> en */
+ lang_code = g_ascii_strdown (decoder->k.ki->language, -1);
+ g_strdelimit (lang_code, NULL, '\0');
+ gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, GST_TAG_LANGUAGE_CODE,
+ lang_code, NULL);
+ g_free (lang_code);
+ /* TODO: category - where should it go ? */
+ decoder->tags =
+ gst_tag_list_merge (decoder->tags, tags, GST_TAG_MERGE_REPLACE);
+ gst_tag_list_free (tags);
+ if (old)
+ gst_tag_list_free (old);
+ }
+ }
+
+ /* update properties */
+ if (decoder->language)
+ g_free (decoder->language);
+ decoder->language = g_strdup (decoder->k.ki->language);
+ if (decoder->category)
+ g_free (decoder->category);
+ decoder->category = g_strdup (decoder->k.ki->category);
+ decoder->original_canvas_width = decoder->k.ki->original_canvas_width;
+ decoder->original_canvas_height = decoder->k.ki->original_canvas_height;
+
+ break;
+
+ case 0x81: /* Vorbis comments header */
+ GST_INFO_OBJECT (element, "Parsed comments header");
+ {
+ gchar *encoder = NULL;
+ GstTagList *old = decoder->tags, *list =
+ gst_tag_list_from_vorbiscomment_buffer (buf,
+ (const guint8 *) "\201kate\0\0\0\0", 9, &encoder);
+ if (list) {
+ decoder->tags =
+ gst_tag_list_merge (decoder->tags, list, GST_TAG_MERGE_REPLACE);
+ gst_tag_list_free (list);
+ }
+
+ if (!decoder->tags) {
+ GST_ERROR_OBJECT (element, "failed to decode comment header");
+ decoder->tags = gst_tag_list_new ();
+ }
+ if (encoder) {
+ gst_tag_list_add (decoder->tags, GST_TAG_MERGE_REPLACE,
+ GST_TAG_ENCODER, encoder, NULL);
+ g_free (encoder);
+ }
+ gst_tag_list_add (decoder->tags, GST_TAG_MERGE_REPLACE,
+ GST_TAG_SUBTITLE_CODEC, "Kate", NULL);
+ gst_tag_list_add (decoder->tags, GST_TAG_MERGE_REPLACE,
+ GST_TAG_ENCODER_VERSION, decoder->k.ki->bitstream_version_major,
+ NULL);
+
+ if (old)
+ gst_tag_list_free (old);
+
+ if (decoder->initialized) {
+ gst_element_found_tags_for_pad (element, srcpad, decoder->tags);
+ decoder->tags = NULL;
+ } else {
+ /* Only push them as messages for the time being. *
+ * They will be pushed on the pad once the decoder is initialized */
+ gst_element_post_message (element,
+ gst_message_new_tag (GST_OBJECT (element),
+ gst_tag_list_copy (decoder->tags)));
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return rflow;
+}
+
+GstStateChangeReturn
+gst_kate_decoder_base_change_state (GstKateDecoderBase * decoder,
+ GstElement * element, GstElementClass * parent_class,
+ GstStateChange transition)
+{
+ GstStateChangeReturn res;
+ int ret;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ GST_DEBUG_OBJECT (element, "READY -> PAUSED, initializing kate state");
+ ret = kate_high_decode_init (&decoder->k);
+ if (ret < 0) {
+ GST_WARNING_OBJECT (element, "failed to initialize kate state: %d",
+ ret);
+ }
+ decoder->initialized = TRUE;
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ break;
+ default:
+ break;
+ }
+
+ res = parent_class->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ GST_DEBUG_OBJECT (element, "PAUSED -> READY, clearing kate state");
+ if (decoder->initialized) {
+ kate_high_decode_clear (&decoder->k);
+ decoder->initialized = FALSE;
+ }
+ gst_kate_util_decode_base_reset (decoder);
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ gst_kate_util_decode_base_reset (decoder);
+ break;
+ default:
+ break;
+ }
+
+ return res;
+}
+
+static GstClockTime
+gst_kate_util_granule_time (kate_state * k, gint64 granulepos)
+{
+ if (G_UNLIKELY (granulepos == -1))
+ return -1;
+
+ return kate_granule_time (k->ki, granulepos) * GST_SECOND;
+}
+
+/*
+conversions on the sink:
+ - default is granules at num/den rate (subject to the granule shift)
+ - default -> time is possible
+ - bytes do not mean anything, packets can be any number of bytes, and we
+ have no way to know the number of bytes emitted without decoding
+conversions on the source:
+ - nothing
+*/
+
+gboolean
+gst_kate_decoder_base_convert (GstKateDecoderBase * decoder,
+ GstElement * element, GstPad * pad, GstFormat src_fmt, gint64 src_val,
+ GstFormat * dest_fmt, gint64 * dest_val)
+{
+ gboolean res = FALSE;
+
+ if (src_fmt == *dest_fmt) {
+ *dest_val = src_val;
+ return TRUE;
+ }
+
+ if (!decoder->initialized) {
+ GST_WARNING_OBJECT (element, "not initialized yet");
+ return FALSE;
+ }
+
+ if (src_fmt == GST_FORMAT_BYTES || *dest_fmt == GST_FORMAT_BYTES) {
+ GST_WARNING_OBJECT (element, "unsupported format");
+ return FALSE;
+ }
+
+ switch (src_fmt) {
+ case GST_FORMAT_DEFAULT:
+ switch (*dest_fmt) {
+ case GST_FORMAT_TIME:
+ *dest_val = gst_kate_util_granule_time (&decoder->k, src_val);
+ res = TRUE;
+ break;
+ default:
+ res = FALSE;
+ break;
+ }
+ break;
+ default:
+ res = FALSE;
+ break;
+ }
+
+ if (!res) {
+ GST_WARNING_OBJECT (element, "unsupported format");
+ }
+
+ return res;
+}
+
+gboolean
+gst_kate_decoder_base_sink_query (GstKateDecoderBase * decoder,
+ GstElement * element, GstPad * pad, GstQuery * query)
+{
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_CONVERT:
+ {
+ GstFormat src_fmt, dest_fmt;
+ gint64 src_val, dest_val;
+
+ gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val);
+ if (!gst_kate_decoder_base_convert (decoder, element, pad, src_fmt,
+ src_val, &dest_fmt, &dest_val)) {
+ return gst_pad_query_default (pad, query);
+ }
+ gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
+ return TRUE;
+ }
+ default:
+ return gst_pad_query_default (pad, query);
+ }
+}
diff --git a/ext/kate/gstkateutil.h b/ext/kate/gstkateutil.h
new file mode 100644
index 00000000..6e8ea2e0
--- /dev/null
+++ b/ext/kate/gstkateutil.h
@@ -0,0 +1,77 @@
+/* -*- c-basic-offset: 2 -*-
+ * GStreamer
+ * Copyright (C) <2008> Vincent Penquerc'h <ogg.k.ogg.k at googlemail dot 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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_KATE_UTIL_H__
+#define __GST_KATE_UTIL_H__
+
+#include <kate/kate.h>
+#include <gst/gst.h>
+
+G_BEGIN_DECLS enum
+{
+ ARG_DEC_BASE_0,
+ ARG_DEC_BASE_LANGUAGE,
+ ARG_DEC_BASE_CATEGORY,
+ ARG_DEC_BASE_ORIGINAL_CANVAS_WIDTH,
+ ARG_DEC_BASE_ORIGINAL_CANVAS_HEIGHT,
+ DECODER_BASE_ARG_COUNT
+};
+
+typedef struct
+{
+ kate_state k;
+
+ gboolean initialized;
+
+ GstTagList *tags;
+
+ gchar *language;
+ gchar *category;
+
+ gint original_canvas_width;
+ gint original_canvas_height;
+
+} GstKateDecoderBase;
+
+extern GstCaps *gst_kate_util_set_header_on_caps (GstElement * element,
+ GstCaps * caps, GList * headers);
+extern void gst_kate_util_decode_base_init (GstKateDecoderBase * decoder);
+extern void gst_kate_util_install_decoder_base_properties (GObjectClass *
+ gobject_class);
+extern gboolean gst_kate_util_decoder_base_get_property (GstKateDecoderBase *
+ decoder, GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec);
+extern GstFlowReturn
+gst_kate_util_decoder_base_chain_kate_packet (GstKateDecoderBase * decoder,
+ GstElement * element, GstPad * pad, GstBuffer * buffer, GstPad * srcpad,
+ const kate_event ** ev);
+extern GstStateChangeReturn
+gst_kate_decoder_base_change_state (GstKateDecoderBase * decoder,
+ GstElement * element, GstElementClass * parent_class,
+ GstStateChange transition);
+extern gboolean gst_kate_decoder_base_convert (GstKateDecoderBase * decoder,
+ GstElement * element, GstPad * pad, GstFormat src_fmt, gint64 src_val,
+ GstFormat * dest_fmt, gint64 * dest_val);
+extern gboolean gst_kate_decoder_base_sink_query (GstKateDecoderBase * decoder,
+ GstElement * element, GstPad * pad, GstQuery * query);
+
+G_END_DECLS
+#endif /* __GST_KATE_UTIL_H__ */
diff --git a/ext/ladspa/gstladspa.c b/ext/ladspa/gstladspa.c
index fe3c6770..e3fc64cb 100644
--- a/ext/ladspa/gstladspa.c
+++ b/ext/ladspa/gstladspa.c
@@ -18,7 +18,16 @@
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
-
+/**
+ * SECTION:element-ladspa
+ * @short_description: bridge for ladspa (Linux Audio Developer's Simple Plugin API)
+ *
+ * The ladspa (Linux Audio Developer's Simple Plugin API) element is a bridge
+ * for plugins using the <ulink url="http://www.ladspa.org/">ladspa</ulink> API.
+ * It scans all installed ladspa plugins and registeres them as gstreamer
+ * elements. If available it can also parse lrdf files and use the metadata for
+ * element classification.
+ */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
diff --git a/ext/lv2/Makefile.am b/ext/lv2/Makefile.am
index 18fe6481..28a8f1fe 100644
--- a/ext/lv2/Makefile.am
+++ b/ext/lv2/Makefile.am
@@ -3,7 +3,7 @@ plugin_LTLIBRARIES = libgstlv2.la
libgstlv2_la_SOURCES = gstlv2.c
libgstlv2_la_CFLAGS = \
-I$(top_builddir)/gst-libs \
- $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_PLUGINS_BASE_CFLAGS) \
$(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) $(SLV2_CFLAGS)
libgstlv2_la_LIBADD = \
$(top_builddir)/gst-libs/gst/signalprocessor/libgstsignalprocessor.la \
diff --git a/ext/metadata/gstbasemetadata.c b/ext/metadata/gstbasemetadata.c
index 4609013b..dd91b2aa 100644
--- a/ext/metadata/gstbasemetadata.c
+++ b/ext/metadata/gstbasemetadata.c
@@ -1151,8 +1151,8 @@ gst_base_metadata_calculate_offsets (GstBaseMetadata * base)
goto done;
}
- metadata_chunk_array_remove_zero_size (&META_DATA_INJECT_CHUNKS (base->
- metadata));
+ metadata_chunk_array_remove_zero_size (&META_DATA_INJECT_CHUNKS
+ (base->metadata));
metadata_lazy_update (base->metadata);
@@ -1420,7 +1420,7 @@ gst_base_metadata_change_state (GstElement * element, GstStateChange transition)
switch (transition) {
case GST_STATE_CHANGE_PAUSED_TO_READY:
gst_base_metadata_reset_streaming (filter);
- if (filter->state != MT_STATE_PARSED)
+ if (filter->state == MT_STATE_PARSED)
gst_base_metadata_reset_parsing (filter);
break;
default:
diff --git a/ext/metadata/gstmetadatamux.c b/ext/metadata/gstmetadatamux.c
index e6a66fa3..9ddf6ccf 100644
--- a/ext/metadata/gstmetadatamux.c
+++ b/ext/metadata/gstmetadatamux.c
@@ -418,9 +418,12 @@ gst_metadata_mux_create_chunks_from_tags (GstBaseMetadata * base)
guint8 *buf = NULL;
guint32 size = 0;
+ GST_DEBUG_OBJECT (base, "Creating chunks from tags..");
+
if (taglist) {
if (gst_base_metadata_get_option_flag (base) & META_OPT_EXIF) {
+ GST_DEBUG_OBJECT (base, "Using EXIF");
metadatamux_exif_create_chunk_from_tag_list (&buf, &size, taglist,
&filter->exif_options);
gst_base_metadata_update_inject_segment_with_new_data (base, &buf, &size,
@@ -428,12 +431,14 @@ gst_metadata_mux_create_chunks_from_tags (GstBaseMetadata * base)
}
if (gst_base_metadata_get_option_flag (base) & META_OPT_IPTC) {
+ GST_DEBUG_OBJECT (base, "Using IPTC");
metadatamux_iptc_create_chunk_from_tag_list (&buf, &size, taglist);
gst_base_metadata_update_inject_segment_with_new_data (base, &buf, &size,
MD_CHUNK_IPTC);
}
if (gst_base_metadata_get_option_flag (base) & META_OPT_XMP) {
+ GST_DEBUG_OBJECT (base, "Using XMP");
metadatamux_xmp_create_chunk_from_tag_list (&buf, &size, taglist);
gst_base_metadata_update_inject_segment_with_new_data (base, &buf, &size,
MD_CHUNK_XMP);
@@ -441,6 +446,10 @@ gst_metadata_mux_create_chunks_from_tags (GstBaseMetadata * base)
}
+ else {
+ GST_DEBUG_OBJECT (base, "Empty taglist");
+ }
+
if (buf) {
g_free (buf);
}
diff --git a/ext/metadata/metadataexif.c b/ext/metadata/metadataexif.c
index 0769dab4..1fb97d58 100644
--- a/ext/metadata/metadataexif.c
+++ b/ext/metadata/metadataexif.c
@@ -556,11 +556,13 @@ metadataparse_exif_content_foreach_entry_func (ExifEntry * entry,
MEUserData *meudata = (MEUserData *) user_data;
GType type = G_TYPE_NONE;
ExifByteOrder byte_order;
- const gchar *tag = metadataparse_exif_get_tag_from_exif (entry->tag, &type);
+ const gchar *tag;
/* We need the byte order */
if (!entry || !entry->parent || !entry->parent->parent)
return;
+
+ tag = metadataparse_exif_get_tag_from_exif (entry->tag, &type);
byte_order = exif_data_get_byte_order (entry->parent->parent);
if (metadataparse_handle_unit_tags (entry, meudata, byte_order))
@@ -694,14 +696,17 @@ metadataparse_exif_content_foreach_entry_func (ExifEntry * entry,
/* DDD - degrees */
value = (gdouble) rt->numerator / (gdouble) rt->denominator;
- GST_DEBUG ("deg: %lu / %lu", rt->numerator, rt->denominator);
+ GST_DEBUG ("deg: %lu / %lu", (gulong) rt->numerator,
+ (gulong) rt->denominator);
rt++;
/* MM - minutes and SS - seconds */
- GST_DEBUG ("min: %lu / %lu", rt->numerator, rt->denominator);
+ GST_DEBUG ("min: %lu / %lu", (gulong) rt->numerator,
+ (gulong) rt->denominator);
value += (gdouble) rt->numerator / ((gdouble) rt->denominator * 60.0);
rt++;
- GST_DEBUG ("sec: %lu / %lu", rt->numerator, rt->denominator);
+ GST_DEBUG ("sec: %lu / %lu", (gulong) rt->numerator,
+ (gulong) rt->denominator);
value +=
(gdouble) rt->numerator / ((gdouble) rt->denominator * 3600.0);
@@ -1052,21 +1057,24 @@ metadatamux_exif_for_each_tag_in_list (const GstTagList * list,
/* DDD - degrees */
rt->numerator = (gulong) v;
rt->denominator = 1;
- GST_DEBUG ("deg: %lf : %lu / %lu", v, rt->numerator, rt->denominator);
+ GST_DEBUG ("deg: %lf : %lu / %lu", v, (gulong) rt->numerator,
+ (gulong) rt->denominator);
v -= rt->numerator;
rt++;
/* MM - minutes */
rt->numerator = (gulong) (v * 60.0);
rt->denominator = 1;
- GST_DEBUG ("min: %lf : %lu / %lu", v, rt->numerator, rt->denominator);
+ GST_DEBUG ("min: %lf : %lu / %lu", v, (gulong) rt->numerator,
+ (gulong) rt->denominator);
v -= ((gdouble) rt->numerator / 60.0);
rt++;
/* SS - seconds */
rt->numerator = (gulong) (0.5 + v * 3600.0);
rt->denominator = 1;
- GST_DEBUG ("sec: %lf : %lu / %lu", v, rt->numerator, rt->denominator);
+ GST_DEBUG ("sec: %lf : %lu / %lu", v, (gulong) rt->numerator,
+ (gulong) rt->denominator);
if (entry->tag == EXIF_TAG_GPS_LONGITUDE) {
GST_DEBUG ("longitude : %lf", value);
diff --git a/ext/metadata/metadatatags.c b/ext/metadata/metadatatags.c
index 4beee172..9d25ef8f 100644
--- a/ext/metadata/metadatatags.c
+++ b/ext/metadata/metadatatags.c
@@ -316,7 +316,7 @@ metadata_tags_exif_register (void)
gst_tag_register (GST_TAG_CAPTURE_ORIENTATION, GST_TAG_FLAG_META,
G_TYPE_UINT, GST_TAG_CAPTURE_ORIENTATION,
- "The kind of light source.", NULL);
+ "The orientation of the camera.", NULL);
/*
from -100 to 100
diff --git a/ext/mimic/gstmimdec.c b/ext/mimic/gstmimdec.c
index 1579bd41..6a0abce5 100644
--- a/ext/mimic/gstmimdec.c
+++ b/ext/mimic/gstmimdec.c
@@ -68,8 +68,6 @@ static GstFlowReturn gst_mimdec_chain (GstPad * pad, GstBuffer * in);
static GstStateChangeReturn
gst_mimdec_change_state (GstElement * element, GstStateChange transition);
-static gboolean gst_mimdec_sink_event (GstPad * pad, GstEvent * event);
-
GST_BOILERPLATE (GstMimDec, gst_mimdec, GstElement, GST_TYPE_ELEMENT);
@@ -118,7 +116,6 @@ gst_mimdec_init (GstMimDec * mimdec, GstMimDecClass * klass)
"sink");
gst_element_add_pad (GST_ELEMENT (mimdec), mimdec->sinkpad);
gst_pad_set_chain_function (mimdec->sinkpad, gst_mimdec_chain);
- gst_pad_set_event_function (mimdec->sinkpad, gst_mimdec_sink_event);
mimdec->srcpad =
gst_pad_new_from_template (gst_static_pad_template_get (&src_factory),
@@ -154,6 +151,7 @@ gst_mimdec_chain (GstPad * pad, GstBuffer * in)
gint width, height;
GstCaps *caps;
GstFlowReturn res = GST_FLOW_OK;
+ GstClockTime in_time = GST_BUFFER_TIMESTAMP (in);
GST_DEBUG ("in gst_mimdec_chain");
@@ -181,10 +179,16 @@ gst_mimdec_chain (GstPad * pad, GstBuffer * in)
goto out;
}
- fourcc = GST_MAKE_FOURCC ('M', 'L', '2', '0');
- if (GUINT32_FROM_LE (*((guint32 *) (header + 12))) != fourcc) {
- GST_WARNING_OBJECT (mimdec, "invalid frame: unknown FOURCC code %d",
- fourcc);
+ if (header[1] == 1) {
+ /* This is a a paused frame, skip it */
+ gst_adapter_flush (mimdec->adapter, 24);
+ continue;
+ }
+
+ fourcc = GUINT32_FROM_LE (*((guint32 *) (header + 12)));
+ if (GST_MAKE_FOURCC ('M', 'L', '2', '0') != fourcc) {
+ GST_WARNING_OBJECT (mimdec, "invalid frame: unknown FOURCC code"
+ " %X (%" GST_FOURCC_FORMAT ")", fourcc, GST_FOURCC_ARGS (fourcc));
gst_adapter_flush (mimdec->adapter, 24);
res = GST_FLOW_ERROR;
goto out;
@@ -201,12 +205,6 @@ gst_mimdec_chain (GstPad * pad, GstBuffer * in)
mimdec->have_header = TRUE;
}
- /* Check if its paused frame, drop it */
- if (mimdec->payload_size == 0) {
- mimdec->have_header = FALSE;
- continue;
- }
-
if (gst_adapter_available (mimdec->adapter) < mimdec->payload_size) {
goto out;
}
@@ -215,9 +213,6 @@ gst_mimdec_chain (GstPad * pad, GstBuffer * in)
(guchar *) gst_adapter_peek (mimdec->adapter, mimdec->payload_size);
if (mimdec->dec == NULL) {
- GstEvent *event = NULL;
- gboolean result = TRUE;
-
/* Check if its a keyframe, otherwise skip it */
if (GUINT32_FROM_LE (*((guint32 *) (frame_body + 12))) != 0) {
gst_adapter_flush (mimdec->adapter, mimdec->payload_size);
@@ -259,20 +254,6 @@ gst_mimdec_chain (GstPad * pad, GstBuffer * in)
res = GST_FLOW_ERROR;
goto out;
}
-
- if (mimdec->need_newsegment)
- event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME,
- mimdec->current_ts * GST_MSECOND, -1, 0);
- mimdec->need_newsegment = FALSE;
- GST_OBJECT_UNLOCK (mimdec);
- if (event)
- result = gst_pad_push_event (mimdec->srcpad, event);
- GST_OBJECT_LOCK (mimdec);
- if (!result) {
- GST_WARNING_OBJECT (mimdec, "gst_pad_push_event failed");
- res = GST_FLOW_ERROR;
- goto out;
- }
}
out_buf = gst_buffer_new_and_alloc (mimdec->buffer_size);
@@ -289,7 +270,7 @@ gst_mimdec_chain (GstPad * pad, GstBuffer * in)
goto out;
}
- GST_BUFFER_TIMESTAMP (out_buf) = mimdec->current_ts * GST_MSECOND;
+ GST_BUFFER_TIMESTAMP (out_buf) = in_time;
mimic_get_property (mimdec->dec, "width", &width);
mimic_get_property (mimdec->dec, "height", &height);
@@ -341,83 +322,9 @@ gst_mimdec_change_state (GstElement * element, GstStateChange transition)
GST_OBJECT_UNLOCK (element);
}
break;
- case GST_STATE_CHANGE_READY_TO_PAUSED:
- GST_OBJECT_LOCK (element);
- mimdec->need_newsegment = TRUE;
- GST_OBJECT_UNLOCK (element);
- break;
default:
break;
}
return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
}
-
-static gboolean
-gst_mimdec_sink_event (GstPad * pad, GstEvent * event)
-{
- gboolean res = TRUE;
- GstMimDec *mimdec = GST_MIMDEC (gst_pad_get_parent (pad));
-
- /*
- * Ignore upstream newsegment event, its EVIL, we should implement
- * proper seeking instead
- */
- switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_NEWSEGMENT:
- {
- gboolean update;
- GstFormat format;
- gdouble rate, arate;
- gint64 start, stop, time;
-
- gst_event_parse_new_segment_full (event, &update, &rate, &arate,
- &format, &start, &stop, &time);
-
- /* we need TIME and a positive rate */
- if (format != GST_FORMAT_TIME)
- goto newseg_wrong_format;
-
- if (rate <= 0.0)
- goto newseg_wrong_rate;
-
- GST_OBJECT_LOCK (mimdec);
- mimdec->need_newsegment = FALSE;
- GST_OBJECT_UNLOCK (mimdec);
-
- res = gst_pad_push_event (mimdec->srcpad, event);
- }
- break;
- case GST_EVENT_FLUSH_STOP:
- GST_OBJECT_LOCK (mimdec);
- mimdec->need_newsegment = TRUE;
- GST_OBJECT_UNLOCK (mimdec);
-
- res = gst_pad_push_event (mimdec->srcpad, event);
- break;
- default:
- res = gst_pad_push_event (mimdec->srcpad, event);
- break;
- }
-
-done:
-
- gst_object_unref (mimdec);
-
- return res;
-
-newseg_wrong_format:
- {
- GST_DEBUG_OBJECT (mimdec, "received non TIME newsegment");
- gst_event_unref (event);
- goto done;
- }
-newseg_wrong_rate:
- {
- GST_DEBUG_OBJECT (mimdec, "negative rates not supported yet");
- gst_event_unref (event);
- goto done;
- }
-
-
-}
diff --git a/ext/mimic/gstmimdec.h b/ext/mimic/gstmimdec.h
index e1db38d1..7db6b1b8 100644
--- a/ext/mimic/gstmimdec.h
+++ b/ext/mimic/gstmimdec.h
@@ -57,8 +57,6 @@ struct _GstMimDec
gboolean have_header;
guint32 payload_size;
guint32 current_ts;
-
- gboolean need_newsegment;
};
struct _GstMimDecClass
diff --git a/ext/mimic/gstmimenc.c b/ext/mimic/gstmimenc.c
index 84f34012..2418e7c8 100644
--- a/ext/mimic/gstmimenc.c
+++ b/ext/mimic/gstmimenc.c
@@ -346,13 +346,8 @@ gst_mimenc_chain (GstPad * pad, GstBuffer * in)
GST_OBJECT_UNLOCK (mimenc);
if (event) {
- if (!gst_pad_push_event (mimenc->srcpad, event)) {
- res = GST_FLOW_ERROR;
- GST_ERROR_OBJECT (mimenc, "Failed to push NEWSEGMENT event");
- gst_buffer_unref (header);
- gst_buffer_unref (out_buf);
- goto out;
- }
+ if (!gst_pad_push_event (mimenc->srcpad, event))
+ GST_WARNING_OBJECT (mimenc, "Failed to push NEWSEGMENT event");
}
res = gst_pad_push (mimenc->srcpad, header);
@@ -392,7 +387,7 @@ gst_mimenc_create_tcp_header (GstMimEnc * mimenc, guint32 payload_size,
*((guint16 *) (p + 4)) = GUINT16_TO_LE (mimenc->height);
*((guint16 *) (p + 6)) = keyframe ? 1 : 0;
*((guint32 *) (p + 8)) = GUINT32_TO_LE (payload_size);
- *((guint32 *) (p + 12)) =
+ *((guint32 *) (p + 12)) = paused ? 0 :
GUINT32_TO_LE (GST_MAKE_FOURCC ('M', 'L', '2', '0'));
*((guint32 *) (p + 16)) = 0;
*((guint32 *) (p + 20)) = timestamp / GST_MSECOND;
@@ -513,11 +508,8 @@ paused_mode_task (gpointer data)
" sending out a pause frame");
if (event) {
- if (!gst_pad_push_event (mimenc->srcpad, event)) {
- GST_ERROR_OBJECT (mimenc, "Failed to push NEWSEGMENT event");
- gst_buffer_unref (buffer);
- goto stop_task;
- }
+ if (!gst_pad_push_event (mimenc->srcpad, event))
+ GST_WARNING_OBJECT (mimenc, "Failed to push NEWSEGMENT event");
}
ret = gst_pad_push (mimenc->srcpad, buffer);
if (ret < 0) {
diff --git a/ext/resindvd/resindvdsrc.c b/ext/resindvd/resindvdsrc.c
index 7b44bf9c..38be6394 100644
--- a/ext/resindvd/resindvdsrc.c
+++ b/ext/resindvd/resindvdsrc.c
@@ -1904,7 +1904,9 @@ rsn_dvdsrc_prepare_streamsinfo_event (resinDvdSrc * src)
gst_structure_set (s, t, G_TYPE_INT, (int) a->audio_format, NULL);
g_free (t);
- if (a->lang_type) {
+ /* Check that the language code is flagged and at least somewhat valid
+ * before putting it in the output structure */
+ if (a->lang_type && a->lang_code > 0x100) {
t = g_strdup_printf ("audio-%d-language", i);
lang_code[0] = (a->lang_code >> 8) & 0xff;
lang_code[1] = a->lang_code & 0xff;
@@ -1913,7 +1915,7 @@ rsn_dvdsrc_prepare_streamsinfo_event (resinDvdSrc * src)
GST_DEBUG_OBJECT (src, "Audio stream %d is language %s", i, lang_code);
} else
- GST_DEBUG_OBJECT (src, "Audio stream %d - no language %s", i, lang_code);
+ GST_DEBUG_OBJECT (src, "Audio stream %d - no language", i);
}
if (have_audio == FALSE) {
@@ -1947,7 +1949,7 @@ rsn_dvdsrc_prepare_streamsinfo_event (resinDvdSrc * src)
g_free (t);
t = g_strdup_printf ("subpicture-%d-language", i);
- if (u->type) {
+ if (u->type && u->lang_code > 0x100) {
lang_code[0] = (u->lang_code >> 8) & 0xff;
lang_code[1] = u->lang_code & 0xff;
gst_structure_set (s, t, G_TYPE_STRING, lang_code, NULL);
diff --git a/ext/schroedinger/gstschroenc.c b/ext/schroedinger/gstschroenc.c
index 2d0fb39b..24c55e7a 100644
--- a/ext/schroedinger/gstschroenc.c
+++ b/ext/schroedinger/gstschroenc.c
@@ -149,6 +149,31 @@ gst_schro_enc_base_init (gpointer g_class)
gst_element_class_set_details (element_class, &schro_enc_details);
}
+static GType
+register_enum_list (const SchroEncoderSetting * setting)
+{
+ GType type;
+ static GEnumValue *enumtypes;
+ int n;
+ char *typename;
+ int i;
+
+ n = setting->max + 1;
+
+ enumtypes = g_malloc0 ((n + 1) * sizeof (GEnumValue));
+ for (i = 0; i < n; i++) {
+ enumtypes[i].value = i;
+ enumtypes[i].value_name = setting->enum_list[i];
+ enumtypes[i].value_nick = setting->enum_list[i];
+ }
+
+ typename = g_strdup_printf ("SchroEncoderSettingEnum_%s", setting->name);
+ type = g_enum_register_static (typename, enumtypes);
+ g_free (typename);
+
+ return type;
+}
+
static void
gst_schro_enc_class_init (GstSchroEncClass * klass)
{
@@ -183,8 +208,8 @@ gst_schro_enc_class_init (GstSchroEncClass * klass)
break;
case SCHRO_ENCODER_SETTING_TYPE_ENUM:
g_object_class_install_property (gobject_class, i + 1,
- g_param_spec_int (setting->name, setting->name, setting->name,
- setting->min, setting->max, setting->default_value,
+ g_param_spec_enum (setting->name, setting->name, setting->name,
+ register_enum_list (setting), setting->default_value,
G_PARAM_READWRITE));
break;
case SCHRO_ENCODER_SETTING_TYPE_DOUBLE:
@@ -308,6 +333,10 @@ gst_schro_enc_set_property (GObject * object, guint prop_id,
schro_encoder_setting_set_double (src->encoder, setting->name,
g_value_get_boolean (value));
break;
+ default:
+ schro_encoder_setting_set_double (src->encoder, setting->name,
+ g_value_get_enum (value));
+ break;
}
}
}
@@ -337,6 +366,11 @@ gst_schro_enc_get_property (GObject * object, guint prop_id, GValue * value,
g_value_set_boolean (value,
schro_encoder_setting_get_double (src->encoder, setting->name));
break;
+ default:
+ /* it's an enum */
+ g_value_set_enum (value,
+ schro_encoder_setting_get_double (src->encoder, setting->name));
+ break;
}
}
}
diff --git a/gst-libs/gst/Makefile.am b/gst-libs/gst/Makefile.am
index b123a4c6..e48cdd80 100644
--- a/gst-libs/gst/Makefile.am
+++ b/gst-libs/gst/Makefile.am
@@ -2,4 +2,4 @@
SUBDIRS = interfaces signalprocessor video
noinst_HEADERS = gst-i18n-plugin.h gettext.h
-DIST_SUBDIRS = dshow interfaces signalprocessor video
+DIST_SUBDIRS = interfaces signalprocessor video
diff --git a/gst-libs/gst/dshow/Makefile.am b/gst-libs/gst/dshow/Makefile.am
deleted file mode 100644
index 04d84c31..00000000
--- a/gst-libs/gst/dshow/Makefile.am
+++ /dev/null
@@ -1,11 +0,0 @@
-lib_LTLIBRARIES = libgstdshow-@GST_MAJORMINOR@.la
-
-libgstdshow_@GST_MAJORMINOR@_la_SOURCES = gstdshow.cpp gstdshowfakesink.cpp gstdshowfakesrc.cpp gstdshowinterface.cpp
-libgstdshow_@GST_MAJORMINOR@_la_CXXFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \
- $(GST_PLUGINS_BASE_CFLAGS) -DLIBDSHOW_EXPORTS
-libgstdshow_@GST_MAJORMINOR@_la_LIBADD = $(GST_BASE_LIBS)
-libgstdshow_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_ALL_LDFLAGS)
-libgstdshow_@GST_MAJORMINOR@_la_LIBTOOLFLAGS = --tag=disable-static
-
-libgstdshow_@GST_MAJORMINOR@includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/dshow
-libgstdshow_@GST_MAJORMINOR@include_HEADERS = gstdshow.h gstdshowfakesink.h gstdshowfakesrc.h gstdshowinterface.h
diff --git a/gst-libs/gst/dshow/gstdshowfakesrc.cpp b/gst-libs/gst/dshow/gstdshowfakesrc.cpp
deleted file mode 100644
index 2c6bcc88..00000000
--- a/gst-libs/gst/dshow/gstdshowfakesrc.cpp
+++ /dev/null
@@ -1,205 +0,0 @@
-/* GStreamer
- * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net>
- *
- * gstdshowfakesrc.cpp:
- *
- * 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 "gstdshowfakesrc.h"
-
-static CCritSec g_pCriticSec;
-
-/* output pin*/
-CDshowFakeOutputPin::CDshowFakeOutputPin (CBaseFilter *pFilter, CCritSec *sec):
- CBaseOutputPin("FakeOutputPin", pFilter, sec, &m_hres, L"output")
-{
-}
-
-CDshowFakeOutputPin::~CDshowFakeOutputPin()
-{
-
-}
-
-HRESULT CDshowFakeOutputPin::GetMediaType(int iPosition, CMediaType *pMediaType)
-{
- if(iPosition == 0) {
- *pMediaType = m_MediaType;
- return S_OK;
- }
-
- return VFW_S_NO_MORE_ITEMS;
-}
-
-HRESULT CDshowFakeOutputPin::CheckMediaType(const CMediaType *pmt)
-{
- if (m_MediaType == *pmt) {
- return S_OK;
- }
-
- return S_FALSE;
-}
-
-HRESULT CDshowFakeOutputPin::DecideBufferSize (IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest)
-{
- ALLOCATOR_PROPERTIES properties;
- ppropInputRequest->cbBuffer = m_SampleSize;
- ppropInputRequest->cBuffers = 1;
- HRESULT hres = pAlloc->SetProperties(ppropInputRequest, &properties);
- pAlloc->Commit();
-
- return S_OK;
-}
-
-STDMETHODIMP CDshowFakeOutputPin::SetMediaType (AM_MEDIA_TYPE *pmt)
-{
- m_MediaType.Set (*pmt);
- m_SampleSize = m_MediaType.GetSampleSize();
- return S_OK;
-}
-
-STDMETHODIMP CDshowFakeOutputPin::PushBuffer(byte *buffer, __int64 start, __int64 stop, unsigned int size, bool discount)
-{
- IMediaSample *pSample = NULL;
-
- if (start != -1) {
- start /= 100;
- stop /= 100;
- }
-
- HRESULT hres = GetDeliveryBuffer(&pSample, NULL, NULL, 0);
- if (hres == S_OK && pSample)
- {
- BYTE *sample_buffer;
- pSample->GetPointer(&sample_buffer);
- if(sample_buffer)
- {
- memcpy (sample_buffer, buffer, size);
- pSample->SetActualDataLength(size);
- }
- if (discount)
- pSample->SetDiscontinuity(TRUE);
- else
- pSample->SetDiscontinuity(FALSE);
-
- pSample->SetSyncPoint(TRUE);
- pSample->SetPreroll(FALSE);
-
- if (start != -1)
- pSample->SetTime(&start, &stop);
-
- hres = Deliver(pSample);
- pSample->Release();
- }
-
- return S_OK;
-}
-
-STDMETHODIMP CDshowFakeOutputPin::Flush ()
-{
- DeliverBeginFlush();
- DeliverEndFlush();
- return S_OK;
-}
-
-STDMETHODIMP CDshowFakeOutputPin::SetSampleSize (unsigned int size)
-{
- m_SampleSize = size;
- return S_OK;
-}
-
-/* filter */
-CDshowFakeSrc::CDshowFakeSrc():CBaseFilter("DshowFakeSink", NULL, &g_pCriticSec, CLSID_DshowFakeSrc)
-{
- m_pOutputPin = new CDshowFakeOutputPin((CSource *)this, m_pLock);
-}
-
-CDshowFakeSrc::~CDshowFakeSrc()
-{
- if (m_pOutputPin)
- delete m_pOutputPin;
-}
-
-//Object creation.
-CUnknown* WINAPI CDshowFakeSrc::CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr)
-{
- CDshowFakeSrc *pNewObject = new CDshowFakeSrc();
- if (pNewObject == NULL) {
- *pHr = E_OUTOFMEMORY;
- }
- return pNewObject;
-}
-
-int CDshowFakeSrc::GetPinCount()
-{
- return 1;
-}
-
-CBasePin *CDshowFakeSrc::GetPin(int n)
-{
- return (CBasePin *)m_pOutputPin;
-}
-
-
-STDMETHODIMP CDshowFakeSrc::QueryInterface(REFIID riid, void **ppvObject)
-{
- if (riid == IID_IGstDshowInterface) {
- *ppvObject = (IGstDshowInterface*) this;
- AddRef();
- return S_OK;
- }
- else
- return CBaseFilter::QueryInterface (riid, ppvObject);
-}
-
-ULONG STDMETHODCALLTYPE CDshowFakeSrc::AddRef()
-{
- return CBaseFilter::AddRef();
-}
-
-ULONG STDMETHODCALLTYPE CDshowFakeSrc::Release()
-{
- return CBaseFilter::Release();
-}
-
-STDMETHODIMP CDshowFakeSrc::gst_set_media_type (AM_MEDIA_TYPE *pmt)
-{
- m_pOutputPin->SetMediaType(pmt);
- return S_OK;
-}
-
-STDMETHODIMP CDshowFakeSrc::gst_set_buffer_callback (push_buffer_func push, byte *data)
-{
- return E_NOTIMPL;
-}
-
-STDMETHODIMP CDshowFakeSrc::gst_push_buffer (byte *buffer, __int64 start, __int64 stop, unsigned int size, bool discount)
-{
- m_pOutputPin->PushBuffer(buffer, start, stop, size, discount);
- return S_OK;
-}
-
-STDMETHODIMP CDshowFakeSrc::gst_flush ()
-{
- m_pOutputPin->Flush();
- return S_OK;
-}
-
-STDMETHODIMP CDshowFakeSrc::gst_set_sample_size(unsigned int size)
-{
- m_pOutputPin->SetSampleSize(size);
- return S_OK;
-} \ No newline at end of file
diff --git a/gst-libs/gst/dshow/gstdshowfakesrc.h b/gst-libs/gst/dshow/gstdshowfakesrc.h
deleted file mode 100644
index 06884313..00000000
--- a/gst-libs/gst/dshow/gstdshowfakesrc.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* GStreamer
- * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net>
- *
- * gstdshowfakesrc.h:
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include "gstdshowinterface.h"
-#include <gst/gst.h>
-
-class CDshowFakeOutputPin : public CBaseOutputPin
-{
-protected:
-/* members */
- HRESULT m_hres;
- CMediaType m_MediaType;
- unsigned int m_SampleSize;
-
-public:
-/* methods */
- CDshowFakeOutputPin (CBaseFilter *pFilter, CCritSec *sec);
- ~CDshowFakeOutputPin ();
-
- virtual HRESULT CheckMediaType(const CMediaType *pmt);
- HRESULT GetMediaType(int iPosition, CMediaType *pMediaType);
- virtual HRESULT DecideBufferSize (IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest);
- STDMETHOD (SetMediaType) (AM_MEDIA_TYPE *pmt);
- STDMETHOD (PushBuffer) (byte *buffer, __int64 start, __int64 stop, unsigned int size, bool discount);
- STDMETHOD (Flush) ();
- STDMETHOD (SetSampleSize) (unsigned int size);
-};
-
-class CDshowFakeSrc : public CBaseFilter,
- public IGstDshowInterface
-{
-public:
-/* members */
- CDshowFakeOutputPin *m_pOutputPin;
-
-/* methods */
- CDshowFakeSrc ();
- virtual ~CDshowFakeSrc ();
-
- static CUnknown * WINAPI CreateInstance (LPUNKNOWN pUnk, HRESULT *pHr);
-
- virtual int GetPinCount();
- virtual CBasePin *GetPin(int n);
-
- STDMETHOD (QueryInterface)(REFIID riid, void **ppvObject);
- ULONG STDMETHODCALLTYPE AddRef();
- ULONG STDMETHODCALLTYPE Release();
-
- STDMETHOD (gst_set_media_type) (AM_MEDIA_TYPE *pmt);
- STDMETHOD (gst_set_buffer_callback) (push_buffer_func push, byte *data);
- STDMETHOD (gst_push_buffer) (byte *buffer, __int64 start, __int64 stop, unsigned int size, bool discount);
- STDMETHOD (gst_flush) ();
- STDMETHOD (gst_set_sample_size) (unsigned int size);
-}; \ No newline at end of file
diff --git a/gst-libs/gst/dshow/gstdshowinterface.cpp b/gst-libs/gst/dshow/gstdshowinterface.cpp
deleted file mode 100644
index 3dba7c25..00000000
--- a/gst-libs/gst/dshow/gstdshowinterface.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-/* GStreamer
- * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net>
- *
- * gstdshowinterface.cpp:
- *
- * 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 "gstdshowinterface.h"
-
-
-//{6A780808-9725-4d0b-8695-A4DD8D210773}
-const GUID CLSID_DshowFakeSink
- = { 0x6a780808, 0x9725, 0x4d0b, { 0x86, 0x95, 0xa4, 0xdd, 0x8d, 0x21, 0x7, 0x73 } };
-
-// {1E38DAED-8A6E-4DEA-A482-A878761D11CB}
-const GUID CLSID_DshowFakeSrc =
-{ 0x1e38daed, 0x8a6e, 0x4dea, { 0xa4, 0x82, 0xa8, 0x78, 0x76, 0x1d, 0x11, 0xcb } };
-
-// {FC36764C-6CD4-4C73-900F-3F40BF3F191A}
-static const GUID IID_IGstDshowInterface =
-{ 0xfc36764c, 0x6cd4, 0x4c73, { 0x90, 0xf, 0x3f, 0x40, 0xbf, 0x3f, 0x19, 0x1a } };
diff --git a/gst-plugins-bad.spec.in b/gst-plugins-bad.spec.in
index ab02bcaa..ea4a5d82 100644
--- a/gst-plugins-bad.spec.in
+++ b/gst-plugins-bad.spec.in
@@ -158,6 +158,7 @@ rm -rf $RPM_BUILD_ROOT
@USE_CELT_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstcelt.so
@USE_MPEG2ENC_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstmpeg2enc.so
@USE_MPLEX_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstmplex.so
+@USE_KATE_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstkate.so
%changelog
* Thu Mar 12 2009 Christian Schaller <chrisian.schaller at collabora dot co uk>
diff --git a/gst/aacparse/gstbaseparse.c b/gst/aacparse/gstbaseparse.c
index 026b1341..b59319a5 100644
--- a/gst/aacparse/gstbaseparse.c
+++ b/gst/aacparse/gstbaseparse.c
@@ -735,7 +735,6 @@ gst_base_parse_handle_and_push_buffer (GstBaseParse * parse,
GstBaseParseClass * klass, GstBuffer * buffer)
{
GstFlowReturn ret;
- GstClockTime last_stop = GST_CLOCK_TIME_NONE;
if (parse->priv->discont) {
GST_DEBUG_OBJECT (parse, "marking DISCONT");
@@ -749,6 +748,46 @@ gst_base_parse_handle_and_push_buffer (GstBaseParse * parse,
* keep track of timestamp and calculate everything possible
* if not set already */
+ /* First buffers are dropped, this means that the subclass needs more
+ * frames to decide on the format and queues them internally */
+ if (ret == GST_BASE_PARSE_FLOW_DROPPED && !GST_PAD_CAPS (parse->srcpad)) {
+ gst_buffer_unref (buffer);
+ return GST_FLOW_OK;
+ }
+
+ /* convert internal flow to OK and mark discont for the next buffer. */
+ if (ret == GST_BASE_PARSE_FLOW_DROPPED) {
+ parse->priv->discont = TRUE;
+ ret = GST_FLOW_OK;
+
+ gst_buffer_unref (buffer);
+
+ return ret;
+ } else if (ret != GST_FLOW_OK) {
+ return ret;
+ }
+
+ return gst_base_parse_push_buffer (parse, buffer);
+}
+
+/**
+ * gst_base_parse_push_buffer:
+ * @parse: #GstBaseParse.
+ * @buffer: #GstBuffer.
+ *
+ * Pushes the buffer downstream, sends any pending events and
+ * does some timestamp and segment handling.
+ *
+ * This must be called with srcpad STREAM_LOCK held.
+ *
+ * Returns: #GstFlowReturn
+ */
+GstFlowReturn
+gst_base_parse_push_buffer (GstBaseParse * parse, GstBuffer * buffer)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstClockTime last_stop = GST_CLOCK_TIME_NONE;
+
if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer))
last_stop = GST_BUFFER_TIMESTAMP (buffer);
if (last_stop != GST_CLOCK_TIME_NONE && GST_BUFFER_DURATION_IS_VALID (buffer))
@@ -792,39 +831,30 @@ gst_base_parse_handle_and_push_buffer (GstBaseParse * parse,
/* TODO: Add to seek table */
- if (ret == GST_FLOW_OK) {
- if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) &&
- GST_CLOCK_TIME_IS_VALID (parse->segment.stop) &&
- GST_BUFFER_TIMESTAMP (buffer) > parse->segment.stop) {
- GST_LOG_OBJECT (parse, "Dropped frame, after segment");
- gst_buffer_unref (buffer);
- } else if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) &&
- GST_BUFFER_DURATION_IS_VALID (buffer) &&
- GST_CLOCK_TIME_IS_VALID (parse->segment.start) &&
- GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer)
- < parse->segment.start) {
- /* FIXME: subclass needs way to override the start as downstream might
- * need frames before for proper decoding */
- GST_LOG_OBJECT (parse, "Dropped frame, before segment");
- gst_buffer_unref (buffer);
- } else {
- ret = gst_pad_push (parse->srcpad, buffer);
- GST_LOG_OBJECT (parse, "frame (%d bytes) pushed: %d",
- GST_BUFFER_SIZE (buffer), ret);
- }
- } else {
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) &&
+ GST_CLOCK_TIME_IS_VALID (parse->segment.stop) &&
+ GST_BUFFER_TIMESTAMP (buffer) > parse->segment.stop) {
+ GST_LOG_OBJECT (parse, "Dropped frame, after segment");
gst_buffer_unref (buffer);
+ } else if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) &&
+ GST_BUFFER_DURATION_IS_VALID (buffer) &&
+ GST_CLOCK_TIME_IS_VALID (parse->segment.start) &&
+ GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer)
+ < parse->segment.start) {
+ /* FIXME: subclass needs way to override the start as downstream might
+ * need frames before for proper decoding */
+ GST_LOG_OBJECT (parse, "Dropped frame, before segment");
+ gst_buffer_unref (buffer);
+ } else {
+ ret = gst_pad_push (parse->srcpad, buffer);
+ GST_LOG_OBJECT (parse, "frame (%d bytes) pushed: %d",
+ GST_BUFFER_SIZE (buffer), ret);
}
/* Update current running segment position */
if (ret == GST_FLOW_OK && last_stop != GST_CLOCK_TIME_NONE)
gst_segment_set_last_stop (&parse->segment, GST_FORMAT_TIME, last_stop);
- /* convert internal flow to OK and mark discont for the next buffer. */
- if (ret == GST_BASE_PARSE_FLOW_DROPPED) {
- parse->priv->discont = TRUE;
- ret = GST_FLOW_OK;
- }
return ret;
}
@@ -1575,12 +1605,13 @@ gst_base_parse_handle_seek (GstBaseParse * parse, GstEvent * event)
* it directly or fail. For TIME, try upstream, but do it ourselves if
* it fails upstream */
if (format != GST_FORMAT_TIME) {
- gst_event_ref (event);
return gst_pad_push_event (parse->sinkpad, event);
} else {
gst_event_ref (event);
- if (gst_pad_push_event (parse->sinkpad, event))
+ if (gst_pad_push_event (parse->sinkpad, event)) {
+ gst_event_unref (event);
return TRUE;
+ }
}
/* get flush flag */
diff --git a/gst/aacparse/gstbaseparse.h b/gst/aacparse/gstbaseparse.h
index a2856cc7..9d53f07b 100644
--- a/gst/aacparse/gstbaseparse.h
+++ b/gst/aacparse/gstbaseparse.h
@@ -225,6 +225,9 @@ struct _GstBaseParseClass {
GType gst_base_parse_get_type (void);
+GstFlowReturn gst_base_parse_push_buffer (GstBaseParse *parse,
+ GstBuffer *buffer);
+
void gst_base_parse_set_duration (GstBaseParse *parse,
GstFormat fmt,
gint64 duration);
diff --git a/gst/amrparse/gstbaseparse.c b/gst/amrparse/gstbaseparse.c
index ad963785..870492a8 100644
--- a/gst/amrparse/gstbaseparse.c
+++ b/gst/amrparse/gstbaseparse.c
@@ -735,7 +735,6 @@ gst_base_parse_handle_and_push_buffer (GstBaseParse * parse,
GstBaseParseClass * klass, GstBuffer * buffer)
{
GstFlowReturn ret;
- GstClockTime last_stop = GST_CLOCK_TIME_NONE;
if (parse->priv->discont) {
GST_DEBUG_OBJECT (parse, "marking DISCONT");
@@ -749,6 +748,46 @@ gst_base_parse_handle_and_push_buffer (GstBaseParse * parse,
* keep track of timestamp and calculate everything possible
* if not set already */
+ /* First buffers are dropped, this means that the subclass needs more
+ * frames to decide on the format and queues them internally */
+ if (ret == GST_BASE_PARSE_FLOW_DROPPED && !GST_PAD_CAPS (parse->srcpad)) {
+ gst_buffer_unref (buffer);
+ return GST_FLOW_OK;
+ }
+
+ /* convert internal flow to OK and mark discont for the next buffer. */
+ if (ret == GST_BASE_PARSE_FLOW_DROPPED) {
+ parse->priv->discont = TRUE;
+ ret = GST_FLOW_OK;
+
+ gst_buffer_unref (buffer);
+
+ return ret;
+ } else if (ret != GST_FLOW_OK) {
+ return ret;
+ }
+
+ return gst_base_parse_push_buffer (parse, buffer);
+}
+
+/**
+ * gst_base_parse_push_buffer:
+ * @parse: #GstBaseParse.
+ * @buffer: #GstBuffer.
+ *
+ * Pushes the buffer downstream, sends any pending events and
+ * does some timestamp and segment handling.
+ *
+ * This must be called with srcpad STREAM_LOCK held.
+ *
+ * Returns: #GstFlowReturn
+ */
+GstFlowReturn
+gst_base_parse_push_buffer (GstBaseParse * parse, GstBuffer * buffer)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstClockTime last_stop = GST_CLOCK_TIME_NONE;
+
if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer))
last_stop = GST_BUFFER_TIMESTAMP (buffer);
if (last_stop != GST_CLOCK_TIME_NONE && GST_BUFFER_DURATION_IS_VALID (buffer))
@@ -792,39 +831,30 @@ gst_base_parse_handle_and_push_buffer (GstBaseParse * parse,
/* TODO: Add to seek table */
- if (ret == GST_FLOW_OK) {
- if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) &&
- GST_CLOCK_TIME_IS_VALID (parse->segment.stop) &&
- GST_BUFFER_TIMESTAMP (buffer) > parse->segment.stop) {
- GST_LOG_OBJECT (parse, "Dropped frame, after segment");
- gst_buffer_unref (buffer);
- } else if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) &&
- GST_BUFFER_DURATION_IS_VALID (buffer) &&
- GST_CLOCK_TIME_IS_VALID (parse->segment.start) &&
- GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer)
- < parse->segment.start) {
- /* FIXME: subclass needs way to override the start as downstream might
- * need frames before for proper decoding */
- GST_LOG_OBJECT (parse, "Dropped frame, before segment");
- gst_buffer_unref (buffer);
- } else {
- ret = gst_pad_push (parse->srcpad, buffer);
- GST_LOG_OBJECT (parse, "frame (%d bytes) pushed: %d",
- GST_BUFFER_SIZE (buffer), ret);
- }
- } else {
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) &&
+ GST_CLOCK_TIME_IS_VALID (parse->segment.stop) &&
+ GST_BUFFER_TIMESTAMP (buffer) > parse->segment.stop) {
+ GST_LOG_OBJECT (parse, "Dropped frame, after segment");
gst_buffer_unref (buffer);
+ } else if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) &&
+ GST_BUFFER_DURATION_IS_VALID (buffer) &&
+ GST_CLOCK_TIME_IS_VALID (parse->segment.start) &&
+ GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer)
+ < parse->segment.start) {
+ /* FIXME: subclass needs way to override the start as downstream might
+ * need frames before for proper decoding */
+ GST_LOG_OBJECT (parse, "Dropped frame, before segment");
+ gst_buffer_unref (buffer);
+ } else {
+ ret = gst_pad_push (parse->srcpad, buffer);
+ GST_LOG_OBJECT (parse, "frame (%d bytes) pushed: %d",
+ GST_BUFFER_SIZE (buffer), ret);
}
/* Update current running segment position */
if (ret == GST_FLOW_OK && last_stop != GST_CLOCK_TIME_NONE)
gst_segment_set_last_stop (&parse->segment, GST_FORMAT_TIME, last_stop);
- /* convert internal flow to OK and mark discont for the next buffer. */
- if (ret == GST_BASE_PARSE_FLOW_DROPPED) {
- parse->priv->discont = TRUE;
- ret = GST_FLOW_OK;
- }
return ret;
}
@@ -1575,12 +1605,13 @@ gst_base_parse_handle_seek (GstBaseParse * parse, GstEvent * event)
* it directly or fail. For TIME, try upstream, but do it ourselves if
* it fails upstream */
if (format != GST_FORMAT_TIME) {
- gst_event_ref (event);
return gst_pad_push_event (parse->sinkpad, event);
} else {
gst_event_ref (event);
- if (gst_pad_push_event (parse->sinkpad, event))
+ if (gst_pad_push_event (parse->sinkpad, event)) {
+ gst_event_unref (event);
return TRUE;
+ }
}
/* get flush flag */
diff --git a/gst/amrparse/gstbaseparse.h b/gst/amrparse/gstbaseparse.h
index a2856cc7..9d53f07b 100644
--- a/gst/amrparse/gstbaseparse.h
+++ b/gst/amrparse/gstbaseparse.h
@@ -225,6 +225,9 @@ struct _GstBaseParseClass {
GType gst_base_parse_get_type (void);
+GstFlowReturn gst_base_parse_push_buffer (GstBaseParse *parse,
+ GstBuffer *buffer);
+
void gst_base_parse_set_duration (GstBaseParse *parse,
GstFormat fmt,
gint64 duration);
diff --git a/gst/camerabin/TODO b/gst/camerabin/TODO
new file mode 100644
index 00000000..423c0628
--- /dev/null
+++ b/gst/camerabin/TODO
@@ -0,0 +1,31 @@
+= Cleanups =
+* often two g_object_set for same object one after the other
+* use GST_*_OBJECT () more often
+* there are two gst_element_set_state() one after each other
+
+= Renaming =
+* internal use of img->image, vid->video
+
+= Refactorisation =
+* gstcamerabin:gst_camerabin_rewrite_tags
+ - sounds fishy, should use normal tagsetter method
+ - gst_camerabin_rewrite_tags_to_bin(9 why don't we just send a tag-event?
+
+* file-name property
+ - supplying an already opened filedeskriptor would be more safe
+ - need to check what filesink does if the file exists and cannot be overwritten
+
+* imagbin
+ - we want async operation here (especialy for burst mode capture)
+ - right now, its a bit fragile as we muck with locked_state
+ - main problem is that the location for filesink can only be set in NULL/READY
+ and we need to do that sync'ed with the dataflow. we can't use multifilesink
+ as it does a file per pad_push
+ - one problem of the current approach is that we can't have an image in e.g,
+ postprocessing while anotherone is beeing saved
+ - we could use a pool of imagebins:
+ - configure one (set filename)
+ - push_buffer
+ - on eos, put it back to the pool
+ - for this we need to check that we can have multiple instances of e.g.
+ dsp jpeg encoders
diff --git a/gst/camerabin/camerabinimage.c b/gst/camerabin/camerabinimage.c
index 8eea8d91..25730ccd 100644
--- a/gst/camerabin/camerabinimage.c
+++ b/gst/camerabin/camerabinimage.c
@@ -463,15 +463,13 @@ gst_camerabin_image_create_elements (GstCameraBinImage * img)
g_object_set (G_OBJECT (img->meta_mux), "exif-byte-order", 1, NULL);
}
- /* Create file sink element */
+ /* Add sink element for storing the image */
if (!(img->sink =
gst_camerabin_create_and_add_element (imgbin, DEFAULT_SINK))) {
goto done;
}
-
- /* Set properties */
- g_object_set (G_OBJECT (img->sink), "location", img->filename->str, NULL);
- g_object_set (G_OBJECT (img->sink), "async", FALSE, NULL);
+ g_object_set (G_OBJECT (img->sink), "location", img->filename->str, "async", FALSE, "buffer-mode", 2, /* non buffered io */
+ NULL);
ret = TRUE;
diff --git a/gst/camerabin/camerabinpreview.c b/gst/camerabin/camerabinpreview.c
index 9b12bbac..b8e53389 100644
--- a/gst/camerabin/camerabinpreview.c
+++ b/gst/camerabin/camerabinpreview.c
@@ -95,6 +95,8 @@ gst_camerabin_preview_create_pipeline (GstCameraBin * camera)
gst_bin_add_many (GST_BIN (camera->preview_pipeline),
src, csp, filter, vscale, sink, NULL);
+ GST_DEBUG ("preview format is: %" GST_PTR_FORMAT, camera->preview_caps);
+
g_object_set (filter, "caps", camera->preview_caps, NULL);
g_object_set (sink, "preroll-queue-len", 1, "signal-handoffs", TRUE, NULL);
g_object_set (vscale, "method", 0, NULL);
@@ -195,7 +197,8 @@ gst_camerabin_preview_convert (GstCameraBin * camera, GstBuffer * buf)
bflags = GST_BUFFER_FLAGS (buf);
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_READONLY);
- GST_DEBUG ("running conversion pipeline");
+ GST_DEBUG ("running conversion pipeline, source is: %" GST_PTR_FORMAT,
+ GST_BUFFER_CAPS (buf));
gst_element_set_state (camera->preview_pipeline, GST_STATE_PLAYING);
g_signal_emit_by_name (src, "push-buffer", buf, &fret);
diff --git a/gst/camerabin/camerabinvideo.c b/gst/camerabin/camerabinvideo.c
index 4bbc5057..bc915243 100644
--- a/gst/camerabin/camerabinvideo.c
+++ b/gst/camerabin/camerabinvideo.c
@@ -553,7 +553,6 @@ gst_camerabin_video_create_elements (GstCameraBinVideo * vid)
gst_ghost_pad_set_target (GST_GHOST_PAD (vid->sinkpad), vid_sinkpad);
gst_object_unref (vid_sinkpad);
-
/* Add queue element for video */
vid->tee_video_srcpad = gst_element_get_request_pad (vid->tee, "src%d");
if (!(vid->video_queue =
@@ -565,7 +564,6 @@ gst_camerabin_video_create_elements (GstCameraBinVideo * vid)
gst_pad_add_buffer_probe (vid->tee_video_srcpad,
G_CALLBACK (camerabin_video_pad_tee_src0_have_buffer), vid);
-
#ifdef USE_TIMEOVERLAY
/* Add timeoverlay element to visualize elapsed time for debugging */
if (!(gst_camerabin_create_and_add_element (vidbin, "timeoverlay"))) {
@@ -600,8 +598,8 @@ gst_camerabin_video_create_elements (GstCameraBinVideo * vid)
gst_camerabin_create_and_add_element (vidbin, DEFAULT_SINK))) {
goto error;
}
- g_object_set (G_OBJECT (vid->sink), "location", vid->filename->str, NULL);
-
+ g_object_set (G_OBJECT (vid->sink), "location", vid->filename->str, "buffer-mode", 2, /* non buffered io */
+ NULL);
/* Add user set or default audio source element */
if (vid->user_aud_src) {
@@ -615,10 +613,9 @@ gst_camerabin_video_create_elements (GstCameraBinVideo * vid)
}
/* Add queue element for audio */
- if (!(queue = gst_camerabin_create_and_add_element (vidbin, "queue"))) {
+ if (!(gst_camerabin_create_and_add_element (vidbin, "queue"))) {
goto error;
}
- queue = NULL;
/* Add optional audio conversion and volume elements and
raise no errors if adding them fails */
diff --git a/gst/camerabin/gstcamerabin.c b/gst/camerabin/gstcamerabin.c
index 9d8a14cc..22a33477 100644
--- a/gst/camerabin/gstcamerabin.c
+++ b/gst/camerabin/gstcamerabin.c
@@ -954,7 +954,7 @@ gst_camerabin_change_mode (GstCameraBin * camera, gint mode)
camera->mode = mode;
if (camera->active_bin) {
GST_DEBUG_OBJECT (camera, "stopping active bin");
- gst_element_set_state (camera->active_bin, GST_STATE_NULL);
+ gst_element_set_state (camera->active_bin, GST_STATE_READY);
}
if (camera->mode == MODE_IMAGE) {
GstStateChangeReturn state_ret;
@@ -1031,6 +1031,10 @@ gst_camerabin_set_element_zoom (GstCameraBin * camera, gint zoom)
if (zoom != ZOOM_1X) {
w2_crop = (camera->width - (camera->width * ZOOM_1X / zoom)) / 2;
h2_crop = (camera->height - (camera->height * ZOOM_1X / zoom)) / 2;
+
+ /* force number of pixels cropped from left to be even, to avoid slow code
+ * path on videoscale */
+ w2_crop &= 0xFFFE;
}
pad_zoom_sink = gst_element_get_static_pad (camera->src_zoom_crop, "sink");
@@ -2862,12 +2866,8 @@ gst_camerabin_set_property (GObject * object, guint prop_id,
break;
case ARG_FILTER_CAPS:
GST_OBJECT_LOCK (camera);
- if (camera->view_finder_caps) {
- gst_caps_unref (camera->view_finder_caps);
- }
- /* just ref, we don't modify it inplace */
- camera->view_finder_caps =
- gst_caps_ref ((GstCaps *) gst_value_get_caps (value));
+ gst_caps_replace (&camera->view_finder_caps,
+ (GstCaps *) gst_value_get_caps (value));
GST_OBJECT_UNLOCK (camera);
if (GST_STATE (camera) != GST_STATE_NULL) {
gst_camerabin_set_capsfilter_caps (camera, camera->view_finder_caps);
@@ -2875,10 +2875,8 @@ gst_camerabin_set_property (GObject * object, guint prop_id,
break;
case ARG_PREVIEW_CAPS:
GST_OBJECT_LOCK (camera);
- if (camera->preview_caps) {
- gst_caps_unref (camera->preview_caps);
- }
- camera->preview_caps = gst_caps_copy (gst_value_get_caps (value));
+ gst_caps_replace (&camera->preview_caps,
+ (GstCaps *) gst_value_get_caps (value));
GST_OBJECT_UNLOCK (camera);
gst_camerabin_preview_create_pipeline (camera);
break;
diff --git a/gst/debugutils/fpsdisplaysink.c b/gst/debugutils/fpsdisplaysink.c
index 54f5cc54..ff3e0dfd 100644
--- a/gst/debugutils/fpsdisplaysink.c
+++ b/gst/debugutils/fpsdisplaysink.c
@@ -206,7 +206,10 @@ display_current_fps (gpointer data)
GstFPSDisplaySink *self = GST_FPS_DISPLAY_SINK (data);
gint64 current_ts;
- gst_element_query (self->video_sink, self->query);
+ /* if query failed try again on next timer tick */
+ if (!gst_element_query (self->video_sink, self->query))
+ return TRUE;
+
gst_query_parse_position (self->query, NULL, &current_ts);
if (GST_CLOCK_TIME_IS_VALID (self->last_ts)) {
diff --git a/gst/mpegdemux/gstmpegdemux.c b/gst/mpegdemux/gstmpegdemux.c
index ce1d0978..75d5960f 100644
--- a/gst/mpegdemux/gstmpegdemux.c
+++ b/gst/mpegdemux/gstmpegdemux.c
@@ -845,6 +845,7 @@ gst_flups_demux_close_segment (GstFluPSDemux * demux)
{
gint id;
GstEvent *event = NULL;
+ guint64 base_time;
#if POST_10_10
GST_INFO_OBJECT (demux, "closing running segment %" GST_SEGMENT_FORMAT,
@@ -855,14 +856,17 @@ gst_flups_demux_close_segment (GstFluPSDemux * demux)
* last_seg_start != clock_time_none, as that indicates a sparse-stream
* event was sent there */
+ if ((base_time = demux->base_time) == (guint64) - 1)
+ base_time = 0;
+
+
/* Close the current segment for a linear playback */
if (demux->src_segment.rate >= 0) {
/* for forward playback, we played from start to last_stop */
event = gst_event_new_new_segment (TRUE,
demux->src_segment.rate, demux->src_segment.format,
- demux->src_segment.start + demux->base_time,
- demux->src_segment.last_stop + demux->base_time,
- demux->src_segment.time);
+ demux->src_segment.start + base_time,
+ demux->src_segment.last_stop + base_time, demux->src_segment.time);
} else {
gint64 stop;
@@ -872,8 +876,8 @@ gst_flups_demux_close_segment (GstFluPSDemux * demux)
/* for reverse playback, we played from stop to last_stop. */
event = gst_event_new_new_segment (TRUE,
demux->src_segment.rate, demux->src_segment.format,
- demux->src_segment.last_stop + demux->base_time,
- stop + demux->base_time, demux->src_segment.last_stop);
+ demux->src_segment.last_stop + base_time,
+ stop + base_time, demux->src_segment.last_stop);
}
if (event) {
@@ -1383,11 +1387,66 @@ gst_flups_demux_src_query (GstPad * pad, GstQuery * query)
res = TRUE;
break;
}
+ case GST_QUERY_SEEKING:{
+ GstFormat fmt;
+
+ gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL);
+
+ res = TRUE;
+ if (demux->random_access) {
+ /* In pull mode we can seek in TIME format if we have the SCR */
+ if (fmt != GST_FORMAT_TIME || demux->scr_rate_n == G_MAXUINT64
+ || demux->scr_rate_d == G_MAXUINT64)
+ gst_query_set_seeking (query, fmt, FALSE, -1, -1);
+ else
+ gst_query_set_seeking (query, fmt, TRUE, 0, -1);
+ } else {
+ if (fmt == GST_FORMAT_BYTES) {
+ /* Seeking in BYTES format not supported at all */
+ gst_query_set_seeking (query, fmt, FALSE, -1, -1);
+ } else {
+ GstQuery *peerquery;
+ gboolean seekable;
+
+ /* Then ask upstream */
+ res = gst_pad_peer_query (demux->sinkpad, query);
+ if (res) {
+ /* If upstream can handle seeks we're done, if it
+ * can't we still have our TIME->BYTES conversion seek
+ */
+ gst_query_parse_seeking (query, NULL, &seekable, NULL, NULL);
+ if (seekable || fmt != GST_FORMAT_TIME)
+ goto beach;
+ }
+
+ /* We can seek if upstream supports BYTES seeks and we
+ * have the SCR
+ */
+ peerquery = gst_query_new_seeking (GST_FORMAT_BYTES);
+ res = gst_pad_peer_query (demux->sinkpad, query);
+ if (!res || demux->scr_rate_n == G_MAXUINT64
+ || demux->scr_rate_d == G_MAXUINT64) {
+ gst_query_set_seeking (query, fmt, FALSE, -1, -1);
+ } else {
+ gst_query_parse_seeking (peerquery, NULL, &seekable, NULL, NULL);
+ if (seekable)
+ gst_query_set_seeking (query, GST_FORMAT_TIME, TRUE, 0, -1);
+ else
+ gst_query_set_seeking (query, fmt, FALSE, -1, -1);
+ }
+
+ gst_query_unref (peerquery);
+ res = TRUE;
+ }
+ }
+ break;
+ }
default:
res = gst_pad_query_default (pad, query);
break;
}
+beach:
gst_object_unref (demux);
return res;
@@ -2540,7 +2599,7 @@ gst_flups_demux_loop (GstPad * pad)
{
GstFluPSDemux *demux;
GstFlowReturn ret = GST_FLOW_OK;
- guint offset = 0;
+ guint64 offset = 0;
demux = GST_FLUPS_DEMUX (gst_pad_get_parent (pad));
@@ -2579,7 +2638,7 @@ gst_flups_demux_loop (GstPad * pad)
goto pause;
}
} else { /* Reverse playback */
- guint size = MIN (offset, BLOCK_SZ);
+ guint64 size = MIN (offset, BLOCK_SZ);
/* pull in data */
ret = gst_flups_demux_pull_block (pad, demux, offset - size, size);
diff --git a/gst/mpegdemux/gstmpegtsdemux.c b/gst/mpegdemux/gstmpegtsdemux.c
index cb082a2b..8de7cc75 100644
--- a/gst/mpegdemux/gstmpegtsdemux.c
+++ b/gst/mpegdemux/gstmpegtsdemux.c
@@ -1697,7 +1697,8 @@ gst_mpegts_demux_parse_adaptation_field (GstMpegTSStream * stream,
memset (pmts_checked, 0, sizeof (gboolean) * (MPEGTS_MAX_PID + 1));
for (j = 0; j < MPEGTS_MAX_PID + 1; j++) {
- if (demux->streams[j] && demux->streams[j]->PMT_pid) {
+ if (demux->streams[j]
+ && demux->streams[j]->PMT_pid <= MPEGTS_MAX_PID) {
if (!pmts_checked[demux->streams[j]->PMT_pid]) {
/* check if this is correct pcr for pmt */
if (demux->streams[demux->streams[j]->PMT_pid] &&
@@ -2777,9 +2778,54 @@ gst_mpegts_demux_src_pad_query (GstPad * pad, GstQuery * query)
}
break;
}
+ case GST_QUERY_SEEKING:{
+ GstFormat fmt;
+
+ gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL);
+ if (fmt == GST_FORMAT_BYTES) {
+ /* Seeking in BYTES format not supported at all */
+ gst_query_set_seeking (query, fmt, FALSE, -1, -1);
+ } else {
+ GstQuery *peerquery;
+ gboolean seekable;
+
+ /* Then ask upstream */
+ res = gst_pad_peer_query (demux->sinkpad, query);
+ if (res) {
+ /* If upstream can handle seeks we're done, if it
+ * can't we still have our TIME->BYTES conversion seek
+ */
+ gst_query_parse_seeking (query, NULL, &seekable, NULL, NULL);
+ if (seekable || fmt != GST_FORMAT_TIME)
+ goto beach;
+ }
+
+ /* We can seek if upstream supports BYTES seeks and we
+ * have a bitrate
+ */
+ peerquery = gst_query_new_seeking (GST_FORMAT_BYTES);
+ res = gst_pad_peer_query (demux->sinkpad, query);
+ if (!res || demux->bitrate == -1) {
+ gst_query_set_seeking (query, fmt, FALSE, -1, -1);
+ } else {
+ gst_query_parse_seeking (peerquery, NULL, &seekable, NULL, NULL);
+ if (seekable)
+ gst_query_set_seeking (query, GST_FORMAT_TIME, TRUE, 0, -1);
+ else
+ gst_query_set_seeking (query, fmt, FALSE, -1, -1);
+ }
+
+ gst_query_unref (peerquery);
+ res = TRUE;
+ }
+ break;
+ }
default:
res = gst_pad_query_default (pad, query);
+ break;
}
+
+beach:
gst_object_unref (demux);
return res;
diff --git a/gst/mpegdemux/gstpesfilter.c b/gst/mpegdemux/gstpesfilter.c
index b520c766..736d4960 100644
--- a/gst/mpegdemux/gstpesfilter.c
+++ b/gst/mpegdemux/gstpesfilter.c
@@ -151,6 +151,7 @@ gst_pes_filter_parse (GstPESFilter * filter)
* to set the allow_unbounded flag if they want */
if (filter->length == 0 &&
((filter->start_code & 0xFFFFFFF0) == PACKET_VIDEO_START_CODE ||
+ filter->start_code == ID_EXTENDED_STREAM_ID ||
filter->allow_unbounded)) {
GST_DEBUG ("id 0x%02x, unbounded length", filter->id);
filter->unbounded_packet = TRUE;
@@ -389,9 +390,53 @@ gst_pes_filter_parse (GstPESFilter * filter)
}
/* PES_extension_flag */
if ((flags & 0x01)) {
- GST_DEBUG ("%x PES_extension", filter->id);
+ flags = *data++;
+ header_data_length -= 1;
+ datalen -= 1;
+ GST_DEBUG ("%x PES_extension, flags 0x%02x", filter->id, flags);
+ /* PES_private_data_flag */
+ if ((flags & 0x80)) {
+ GST_DEBUG ("%x PES_private_data_flag", filter->id);
+ data += 16;
+ header_data_length -= 16;
+ datalen -= 16;
+ }
+ /* pack_header_field_flag */
+ if ((flags & 0x40)) {
+ guint8 pack_field_length = *data;
+ GST_DEBUG ("%x pack_header_field_flag, pack_field_length %d",
+ filter->id, pack_field_length);
+ data += pack_field_length + 1;
+ header_data_length -= pack_field_length + 1;
+ datalen -= pack_field_length + 1;
+ }
+ /* program_packet_sequence_counter_flag */
+ if ((flags & 0x20)) {
+ GST_DEBUG ("%x program_packet_sequence_counter_flag", filter->id);
+ data += 2;
+ header_data_length -= 2;
+ datalen -= 2;
+ }
+ /* P-STD_buffer_flag */
+ if ((flags & 0x10)) {
+ GST_DEBUG ("%x P-STD_buffer_flag", filter->id);
+ data += 2;
+ header_data_length -= 2;
+ datalen -= 2;
+ }
+ /* PES_extension_flag_2 */
+ if ((flags & 0x01)) {
+ guint8 PES_extension_field_length = *data++;
+ GST_DEBUG ("%x PES_extension_flag_2, len %d",
+ filter->id, PES_extension_field_length & 0x7f);
+ if (PES_extension_field_length == 0x81) {
+ GST_DEBUG ("%x substream id 0x%02x", filter->id, *data);
+ }
+ data += PES_extension_field_length & 0x7f;
+ header_data_length -= (PES_extension_field_length & 0x7f) + 1;
+ datalen -= (PES_extension_field_length & 0x7f) + 1;
+ }
}
-
/* calculate the amount of real data in this PES packet */
data += header_data_length;
datalen -= header_data_length;
diff --git a/gst/mpegdemux/mpegtspacketizer.c b/gst/mpegdemux/mpegtspacketizer.c
index 5ed71f0c..da53a926 100644
--- a/gst/mpegdemux/mpegtspacketizer.c
+++ b/gst/mpegdemux/mpegtspacketizer.c
@@ -1749,7 +1749,9 @@ mpegts_packetizer_parse_eit (MpegTSPacketizer * packetizer,
break;
}
component = gst_structure_new ("video", "high-definition",
- G_TYPE_BOOLEAN, TRUE, "frequency", G_TYPE_INT, freq, NULL);
+ G_TYPE_BOOLEAN, TRUE, "frequency", G_TYPE_INT, freq,
+ "tag", G_TYPE_INT, DESC_DVB_COMPONENT_tag (comp_descriptor),
+ NULL);
if (widescreen == 0) {
gst_structure_set (component, "aspect-ratio",
G_TYPE_STRING, "4:3", NULL);
@@ -1787,7 +1789,8 @@ mpegts_packetizer_parse_eit (MpegTSPacketizer * packetizer,
break;
}
component = gst_structure_new ("audio", "type", G_TYPE_STRING,
- comptype, NULL);
+ comptype, "tag", G_TYPE_INT,
+ DESC_DVB_COMPONENT_tag (comp_descriptor), NULL);
break;
case 0x03: /* subtitles/teletext/vbi */
comptype = "reserved";
@@ -1827,7 +1830,8 @@ mpegts_packetizer_parse_eit (MpegTSPacketizer * packetizer,
break;
}
component = gst_structure_new ("teletext", "type", G_TYPE_STRING,
- comptype, NULL);
+ comptype, "tag", G_TYPE_INT,
+ DESC_DVB_COMPONENT_tag (comp_descriptor), NULL);
break;
}
if (component) {
diff --git a/gst/mpegdemux/mpegtsparse.c b/gst/mpegdemux/mpegtsparse.c
index 976935f2..90a8ea3b 100644
--- a/gst/mpegdemux/mpegtsparse.c
+++ b/gst/mpegdemux/mpegtsparse.c
@@ -553,6 +553,35 @@ mpegts_parse_program_remove_stream (MpegTSParse * parse,
g_hash_table_remove (program->streams, GINT_TO_POINTER ((gint) pid));
}
+static void
+mpegts_parse_deactivate_pmt (MpegTSParse * parse, MpegTSParseProgram * program)
+{
+ gint i;
+ guint pid;
+ guint stream_type;
+ GstStructure *stream;
+ const GValue *streams;
+ const GValue *value;
+
+ if (program->pmt_info) {
+ streams = gst_structure_get_value (program->pmt_info, "streams");
+
+ for (i = 0; i < gst_value_list_get_size (streams); ++i) {
+ value = gst_value_list_get_value (streams, i);
+ stream = g_value_get_boxed (value);
+ gst_structure_get_uint (stream, "pid", &pid);
+ gst_structure_get_uint (stream, "stream-type", &stream_type);
+ mpegts_parse_program_remove_stream (parse, program, (guint16) pid);
+ g_hash_table_remove (parse->pes_pids, GINT_TO_POINTER ((gint) pid));
+ }
+
+ /* remove pcr stream */
+ mpegts_parse_program_remove_stream (parse, program, program->pcr_pid);
+ g_hash_table_remove (parse->pes_pids,
+ GINT_TO_POINTER ((gint) program->pcr_pid));
+ }
+}
+
static MpegTSParsePad *
mpegts_parse_create_tspad (MpegTSParse * parse, const gchar * pad_name)
{
@@ -940,6 +969,7 @@ mpegts_parse_apply_pat (MpegTSParse * parse, GstStructure * pat_info)
parse->pads_to_remove = g_list_append (parse->pads_to_remove,
mpegts_parse_deactivate_program (parse, program));
+ mpegts_parse_deactivate_pmt (parse, program);
mpegts_parse_remove_program (parse, program_number);
g_hash_table_remove (parse->psi_pids, GINT_TO_POINTER ((gint) pid));
mpegts_packetizer_remove_stream (parse->packetizer, pid);
@@ -964,7 +994,6 @@ mpegts_parse_apply_pmt (MpegTSParse * parse,
guint stream_type;
GstStructure *stream;
gint i;
- const GValue *old_streams;
const GValue *new_streams;
const GValue *value;
@@ -975,27 +1004,11 @@ mpegts_parse_apply_pmt (MpegTSParse * parse,
GST_OBJECT_LOCK (parse);
program = mpegts_parse_get_program (parse, program_number);
if (program) {
- if (program->pmt_info) {
- /* deactivate old pmt */
- old_streams = gst_structure_get_value (program->pmt_info, "streams");
-
- for (i = 0; i < gst_value_list_get_size (old_streams); ++i) {
- value = gst_value_list_get_value (old_streams, i);
- stream = g_value_get_boxed (value);
- gst_structure_get_uint (stream, "pid", &pid);
- gst_structure_get_uint (stream, "stream-type", &stream_type);
- mpegts_parse_program_remove_stream (parse, program, (guint16) pid);
- g_hash_table_remove (parse->pes_pids, GINT_TO_POINTER ((gint) pid));
- }
-
- /* remove pcr stream */
- mpegts_parse_program_remove_stream (parse, program, program->pcr_pid);
- g_hash_table_remove (parse->pes_pids,
- GINT_TO_POINTER ((gint) program->pcr_pid));
-
+ /* deactivate old pmt */
+ mpegts_parse_deactivate_pmt (parse, program);
+ if (program->pmt_info)
gst_structure_free (program->pmt_info);
- program->pmt_info = NULL;
- }
+ program->pmt_info = NULL;
} else {
/* no PAT?? */
g_hash_table_insert (parse->psi_pids,
diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c
index 5abd37ff..e646be8c 100644
--- a/gst/mxf/mxfdemux.c
+++ b/gst/mxf/mxfdemux.c
@@ -3453,6 +3453,7 @@ gst_mxf_demux_src_query_type (GstPad * pad)
static const GstQueryType types[] = {
GST_QUERY_POSITION,
GST_QUERY_DURATION,
+ GST_QUERY_SEEKING,
0
};
@@ -3545,6 +3546,33 @@ gst_mxf_demux_src_query (GstPad * pad, GstQuery * query)
ret = TRUE;
break;
}
+ case GST_QUERY_SEEKING:{
+ GstFormat fmt;
+
+ ret = TRUE;
+ gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL);
+ if (fmt != GST_FORMAT_TIME) {
+ gst_query_set_seeking (query, fmt, FALSE, -1, -1);
+ goto done;
+ }
+
+ if (demux->random_access) {
+ gst_query_set_seeking (query, GST_FORMAT_TIME, TRUE, 0, -1);
+ } else {
+ GstQuery *peerquery = gst_query_new_seeking (GST_FORMAT_BYTES);
+ gboolean seekable;
+
+ seekable = gst_pad_peer_query (demux->sinkpad, peerquery);
+ if (seekable)
+ gst_query_parse_seeking (peerquery, NULL, &seekable, NULL, NULL);
+ if (seekable)
+ gst_query_set_seeking (query, GST_FORMAT_TIME, TRUE, 0, -1);
+ else
+ gst_query_set_seeking (query, GST_FORMAT_TIME, FALSE, -1, -1);
+ }
+
+ break;
+ }
default:
/* else forward upstream */
ret = gst_pad_peer_query (demux->sinkpad, query);
@@ -3806,6 +3834,33 @@ gst_mxf_demux_query (GstElement * element, GstQuery * query)
ret = TRUE;
break;
}
+ case GST_QUERY_SEEKING:{
+ GstFormat fmt;
+
+ ret = TRUE;
+ gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL);
+ if (fmt != GST_FORMAT_TIME) {
+ gst_query_set_seeking (query, fmt, FALSE, -1, -1);
+ goto done;
+ }
+
+ if (demux->random_access) {
+ gst_query_set_seeking (query, GST_FORMAT_TIME, TRUE, 0, -1);
+ } else {
+ GstQuery *peerquery = gst_query_new_seeking (GST_FORMAT_BYTES);
+ gboolean seekable;
+
+ seekable = gst_pad_peer_query (demux->sinkpad, peerquery);
+ if (seekable)
+ gst_query_parse_seeking (peerquery, NULL, &seekable, NULL, NULL);
+ if (seekable)
+ gst_query_set_seeking (query, GST_FORMAT_TIME, TRUE, 0, -1);
+ else
+ gst_query_set_seeking (query, GST_FORMAT_TIME, FALSE, -1, -1);
+ }
+
+ break;
+ }
default:
/* else forward upstream */
ret = gst_pad_peer_query (demux->sinkpad, query);
diff --git a/gst/pcapparse/gstpcapparse.h b/gst/pcapparse/gstpcapparse.h
index 8e45f8b2..cc1b55f6 100644
--- a/gst/pcapparse/gstpcapparse.h
+++ b/gst/pcapparse/gstpcapparse.h
@@ -45,10 +45,17 @@ typedef enum
PCAP_PARSE_STATE_PARSING,
} GstPcapParseState;
+/**
+ * GstPcapParse:
+ *
+ * GstPcapParse element.
+ */
+
struct _GstPcapParse
{
GstElement element;
+ /*< private >*/
GstPad * sink_pad;
GstPad * src_pad;
diff --git a/gst/real/gstrealaudiodec.c b/gst/real/gstrealaudiodec.c
index 1a94a77b..5f5b900d 100644
--- a/gst/real/gstrealaudiodec.c
+++ b/gst/real/gstrealaudiodec.c
@@ -262,12 +262,20 @@ open_library (GstRealAudioDec * dec, gint version, GstRADecLibrary * lib)
GST_LOG_OBJECT (dec, "opening module %s", codec);
- lib->module = g_module_open (codec, G_MODULE_BIND_LAZY);
+ /* This is racy, but it doesn't matter here; would be nice if GModule
+ * gave us a GError instead of an error string, but it doesn't, so.. */
+ if (g_file_test (codec, G_FILE_TEST_EXISTS)) {
+ lib->module = g_module_open (codec, G_MODULE_BIND_LAZY);
+ if (lib->module == NULL) {
+ GST_ERROR_OBJECT (dec, "Could not open codec library '%s': %s",
+ codec, g_module_error ());
+ }
+ } else {
+ GST_DEBUG_OBJECT (dec, "%s does not exist", codec);
+ }
g_free (codec);
if (lib->module)
goto codec_search_done;
-
- GST_LOG_OBJECT (dec, "failure, try next one...");
}
}
diff --git a/gst/real/gstrealvideodec.c b/gst/real/gstrealvideodec.c
index 74cb6f5a..313a99f2 100644
--- a/gst/real/gstrealvideodec.c
+++ b/gst/real/gstrealvideodec.c
@@ -480,7 +480,17 @@ open_library (GstRealVideoDec * dec, GstRealVideoDecVersion version,
gchar *codec = g_strconcat (split_path[i], "/", split_names[j], NULL);
GST_DEBUG_OBJECT (dec, "trying %s", codec);
- module = g_module_open (codec, G_MODULE_BIND_LAZY);
+ /* This is racy, but it doesn't matter here; would be nice if GModule
+ * gave us a GError instead of an error string, but it doesn't, so.. */
+ if (g_file_test (codec, G_FILE_TEST_EXISTS)) {
+ module = g_module_open (codec, G_MODULE_BIND_LAZY);
+ if (module == NULL) {
+ GST_ERROR_OBJECT (dec, "Could not open codec library '%s': %s",
+ codec, g_module_error ());
+ }
+ } else {
+ GST_LOG_OBJECT (dec, "%s does not exist", codec);
+ }
g_free (codec);
if (module)
goto codec_search_done;
@@ -492,7 +502,7 @@ codec_search_done:
g_strfreev (split_names);
if (module == NULL)
- goto could_not_open;
+ return FALSE;
GST_DEBUG_OBJECT (dec, "module opened, finding symbols");
@@ -527,12 +537,6 @@ unknown_version:
GST_ERROR_OBJECT (dec, "Cannot handle version %i.", version);
return FALSE;
}
-could_not_open:
- {
- GST_ERROR_OBJECT (dec, "Could not open library '%s' in '%s': %s", names,
- path, g_module_error ());
- return FALSE;
- }
could_not_load:
{
close_library (dec, lib);
diff --git a/gst/rtpmanager/rtpsession.c b/gst/rtpmanager/rtpsession.c
index fa46f501..d63d9d0e 100644
--- a/gst/rtpmanager/rtpsession.c
+++ b/gst/rtpmanager/rtpsession.c
@@ -369,6 +369,9 @@ rtp_session_finalize (GObject * object)
for (i = 0; i < 32; i++)
g_hash_table_destroy (sess->ssrcs[i]);
+ g_list_foreach (sess->conflicting_addresses, (GFunc) g_free, NULL);
+ g_list_free (sess->conflicting_addresses);
+
g_free (sess->bye_reason);
g_hash_table_destroy (sess->cnames);
diff --git a/gst/rtpmux/gstrtpmux.c b/gst/rtpmux/gstrtpmux.c
index 82d4b003..4c2bea09 100644
--- a/gst/rtpmux/gstrtpmux.c
+++ b/gst/rtpmux/gstrtpmux.c
@@ -87,6 +87,7 @@ static void gst_rtp_mux_finalize (GObject * object);
static GstPad *gst_rtp_mux_request_new_pad (GstElement * element,
GstPadTemplate * templ, const gchar * name);
+static void gst_rtp_mux_release_pad (GstElement * element, GstPad * pad);
static GstFlowReturn gst_rtp_mux_chain (GstPad * pad, GstBuffer * buffer);
static gboolean gst_rtp_mux_setcaps (GstPad * pad, GstCaps * caps);
static GstCaps *gst_rtp_mux_getcaps (GstPad * pad);
@@ -148,6 +149,7 @@ gst_rtp_mux_class_init (GstRTPMuxClass * klass)
gstelement_class->request_new_pad =
GST_DEBUG_FUNCPTR (gst_rtp_mux_request_new_pad);
+ gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_rtp_mux_release_pad);
gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_rtp_mux_change_state);
klass->chain_func = gst_rtp_mux_chain;
@@ -246,15 +248,6 @@ gst_rtp_mux_create_sinkpad (GstRTPMux * rtp_mux, GstPadTemplate * templ)
}
static void
-free_pad_private (gpointer data, GObject * where_the_object_was)
-{
- GstRTPMuxPadPrivate *padpriv = data;
-
- gst_caps_replace (&padpriv->out_caps, NULL);
- g_slice_free (GstRTPMuxPadPrivate, padpriv);
-}
-
-static void
gst_rtp_mux_setup_sinkpad (GstRTPMux * rtp_mux, GstPad * sinkpad)
{
GstRTPMuxClass *klass;
@@ -274,7 +267,6 @@ gst_rtp_mux_setup_sinkpad (GstRTPMux * rtp_mux, GstPad * sinkpad)
gst_pad_set_active (sinkpad, TRUE);
gst_pad_set_element_private (sinkpad, padpriv);
- g_object_weak_ref (G_OBJECT (sinkpad), free_pad_private, padpriv);
/* dd the pad to the element */
gst_element_add_pad (GST_ELEMENT (rtp_mux), sinkpad);
@@ -306,6 +298,24 @@ gst_rtp_mux_request_new_pad (GstElement * element,
return newpad;
}
+static void
+gst_rtp_mux_release_pad (GstElement * element, GstPad * pad)
+{
+ GstRTPMuxPadPrivate *padpriv;
+
+ GST_OBJECT_LOCK (element);
+ padpriv = gst_pad_get_element_private (pad);
+ gst_pad_set_element_private (pad, NULL);
+ GST_OBJECT_UNLOCK (element);
+
+ gst_element_remove_pad (element, pad);
+
+ if (padpriv) {
+ gst_caps_replace (&padpriv->out_caps, NULL);
+ g_slice_free (GstRTPMuxPadPrivate, padpriv);
+ }
+}
+
/* Put our own clock-base on the buffer */
static void
gst_rtp_mux_readjust_rtp_timestamp (GstRTPMux * rtp_mux, GstPad * pad,
@@ -313,10 +323,14 @@ gst_rtp_mux_readjust_rtp_timestamp (GstRTPMux * rtp_mux, GstPad * pad,
{
guint32 ts;
guint32 sink_ts_base = 0;
- GstRTPMuxPadPrivate *padpriv = gst_pad_get_element_private (pad);
+ GstRTPMuxPadPrivate *padpriv;
+
- if (padpriv->have_clock_base)
+ GST_OBJECT_LOCK (rtp_mux);
+ padpriv = gst_pad_get_element_private (pad);
+ if (padpriv && padpriv->have_clock_base)
sink_ts_base = padpriv->clock_base;
+ GST_OBJECT_UNLOCK (rtp_mux);
ts = gst_rtp_buffer_get_timestamp (buffer) - sink_ts_base + rtp_mux->ts_base;
GST_LOG_OBJECT (rtp_mux, "Re-adjusting RTP ts %u to %u",
@@ -329,7 +343,7 @@ gst_rtp_mux_chain (GstPad * pad, GstBuffer * buffer)
{
GstRTPMux *rtp_mux;
GstFlowReturn ret;
- GstRTPMuxPadPrivate *padpriv = gst_pad_get_element_private (pad);
+ GstRTPMuxPadPrivate *padpriv;
rtp_mux = GST_RTP_MUX (gst_pad_get_parent (pad));
@@ -344,6 +358,9 @@ gst_rtp_mux_chain (GstPad * pad, GstBuffer * buffer)
GST_OBJECT_LOCK (rtp_mux);
rtp_mux->seqnum++;
gst_rtp_buffer_set_seq (buffer, rtp_mux->seqnum);
+ padpriv = gst_pad_get_element_private (pad);
+ if (padpriv)
+ gst_buffer_set_caps (buffer, padpriv->out_caps);
GST_OBJECT_UNLOCK (rtp_mux);
gst_rtp_buffer_set_ssrc (buffer, rtp_mux->current_ssrc);
gst_rtp_mux_readjust_rtp_timestamp (rtp_mux, pad, buffer);
@@ -351,10 +368,16 @@ gst_rtp_mux_chain (GstPad * pad, GstBuffer * buffer)
GST_BUFFER_SIZE (buffer), rtp_mux->seqnum,
gst_rtp_buffer_get_timestamp (buffer));
- gst_buffer_set_caps (buffer, padpriv->out_caps);
+ if (!padpriv) {
+ ret = GST_FLOW_NOT_LINKED;
+ gst_buffer_unref (buffer);
+ goto out;
+ }
ret = gst_pad_push (rtp_mux->srcpad, buffer);
+out:
+
gst_object_unref (rtp_mux);
return ret;
}
@@ -365,7 +388,7 @@ gst_rtp_mux_setcaps (GstPad * pad, GstCaps * caps)
GstRTPMux *rtp_mux;
GstStructure *structure;
gboolean ret = FALSE;
- GstRTPMuxPadPrivate *padpriv = gst_pad_get_element_private (pad);
+ GstRTPMuxPadPrivate *padpriv;
rtp_mux = GST_RTP_MUX (gst_pad_get_parent (pad));
@@ -374,9 +397,13 @@ gst_rtp_mux_setcaps (GstPad * pad, GstCaps * caps)
if (!structure)
goto out;
- if (gst_structure_get_uint (structure, "clock-base", &padpriv->clock_base)) {
+ GST_OBJECT_LOCK (rtp_mux);
+ padpriv = gst_pad_get_element_private (pad);
+ if (padpriv &&
+ gst_structure_get_uint (structure, "clock-base", &padpriv->clock_base)) {
padpriv->have_clock_base = TRUE;
}
+ GST_OBJECT_UNLOCK (rtp_mux);
caps = gst_caps_copy (caps);
@@ -388,8 +415,13 @@ gst_rtp_mux_setcaps (GstPad * pad, GstCaps * caps)
"setting caps %" GST_PTR_FORMAT " on src pad..", caps);
ret = gst_pad_set_caps (rtp_mux->srcpad, caps);
- if (ret)
- gst_caps_replace (&padpriv->out_caps, caps);
+ if (ret) {
+ GST_OBJECT_LOCK (rtp_mux);
+ padpriv = gst_pad_get_element_private (pad);
+ if (padpriv)
+ gst_caps_replace (&padpriv->out_caps, caps);
+ GST_OBJECT_UNLOCK (rtp_mux);
+ }
gst_caps_unref (caps);
out:
diff --git a/sys/dshowsrcwrapper/Makefile.am b/sys/dshowsrcwrapper/Makefile.am
index 38895a1e..74bf83ed 100644..100755
--- a/sys/dshowsrcwrapper/Makefile.am
+++ b/sys/dshowsrcwrapper/Makefile.am
@@ -1,10 +1,14 @@
-plugin_LTLIBRARIES = libgstdshowsrcwrapper.la
+# This plugin isn't buildable with autotools at this point in time, so just
+# ensure everything's listed in EXTRA_DIST
-libgstdshowsrcwrapper_la_SOURCES = gstdshowaudiosrc.c gstdshowsrcwrapper.c gstdshowvideosrc.c
-
-libgstdshowsrcwrapper_la_CFLAGS = $(GST_CFLAGS)
-libgstdshowsrcwrapper_la_LIBADD = $(GST_LIBS)
-libgstdshowsrcwrapper_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libgstdshowsrcwrapper_la_LIBTOOLFLAGS = --tag=disable-static
-
-noinst_HEADERS = gstdshowaudiosrc.h gstdshowsrcwrapper.h gstdshowvideosrc.h
+EXTRA_DIST = \
+ gstdshowaudiosrc.cpp \
+ gstdshowaudiosrc.h \
+ gstdshow.cpp \
+ gstdshowfakesink.cpp \
+ gstdshowfakesink.h \
+ gstdshow.h \
+ gstdshowinterface.h \
+ gstdshowsrcwrapper.cpp \
+ gstdshowvideosrc.cpp \
+ gstdshowvideosrc.h
diff --git a/gst-libs/gst/dshow/gstdshow.cpp b/sys/dshowsrcwrapper/gstdshow.cpp
index 4d419d16..ed27d631 100644..100755
--- a/gst-libs/gst/dshow/gstdshow.cpp
+++ b/sys/dshowsrcwrapper/gstdshow.cpp
@@ -21,7 +21,6 @@
#include "gstdshow.h"
#include "gstdshowfakesink.h"
-#include "gstdshowfakesrc.h"
CFactoryTemplate g_Templates[]=
{
@@ -31,15 +30,7 @@ CFactoryTemplate g_Templates[]=
, CDshowFakeSink::CreateInstance
, NULL
, NULL
- },
- {
- L"DSHOW fake src filter"
- , &CLSID_DshowFakeSrc
- , CDshowFakeSrc::CreateInstance
- , NULL
- , NULL
- },
-
+ }
};
int g_cTemplates = sizeof(g_Templates)/sizeof(g_Templates[0]);
@@ -64,9 +55,9 @@ STDAPI DllUnregisterServer()
return AMovieDllRegisterServer2 (FALSE);
}
-BOOL gst_dshow_register_fakefilters ()
+HRESULT gst_dshow_register_fakefilters ()
{
- return (DllRegisterServer() == S_OK) ? TRUE : FALSE;
+ return DllRegisterServer();
}
void
@@ -169,7 +160,7 @@ gboolean gst_dshow_find_filter(CLSID input_majortype, CLSID input_subtype,
/* create a private copy of prefered filter substring in upper case */
if (prefered_filter_name) {
prefered_filter_upper = g_strdup (prefered_filter_name);
- strupr (prefered_filter_upper);
+ _strupr (prefered_filter_upper);
}
hres = CoCreateInstance(CLSID_FilterMapper2, NULL, CLSCTX_INPROC,
@@ -206,7 +197,7 @@ gboolean gst_dshow_find_filter(CLSID input_majortype, CLSID input_subtype,
friendly_name = g_utf16_to_utf8((const gunichar2*)varFriendlyName.bstrVal,
wcslen(varFriendlyName.bstrVal), NULL, NULL, NULL);
if (friendly_name)
- strupr (friendly_name);
+ _strupr (friendly_name);
SysFreeString (varFriendlyName.bstrVal);
}
property_bag->Release ();
@@ -254,7 +245,7 @@ clean:
gchar *
-gst_dshow_getdevice_from_devicename (GUID *device_category, gchar **device_name)
+gst_dshow_getdevice_from_devicename (const GUID *device_category, gchar **device_name)
{
gchar *ret = NULL;
ICreateDevEnum *devices_enum = NULL;
diff --git a/gst-libs/gst/dshow/gstdshow.h b/sys/dshowsrcwrapper/gstdshow.h
index 3d1520d5..ec360b32 100644..100755
--- a/gst-libs/gst/dshow/gstdshow.h
+++ b/sys/dshowsrcwrapper/gstdshow.h
@@ -22,30 +22,28 @@
#ifndef _GSTDSHOW_
#define _GSTDSHOW_
+#ifdef __cplusplus
+#include <streams.h>
+#endif
#include <windows.h>
+#include <objbase.h>
+#include <dshow.h>
+#include <Rpc.h>
#include <glib.h>
-#ifdef LIBDSHOW_EXPORTS
-#include <streams.h>
-#include <atlbase.h>
-#define DSHOW_API __declspec(dllexport)
-#else
-#define DSHOW_API __declspec(dllimport)
-#endif
-
typedef struct _GstCapturePinMediaType
{
AM_MEDIA_TYPE *mediatype;
IPin *capture_pin;
} GstCapturePinMediaType;
-#ifdef __cplusplus
-extern "C" {
+#ifdef __cplusplus
+extern "C" {
#endif
/* register fake filters as COM object and as Direct Show filters in the registry */
-BOOL gst_dshow_register_fakefilters ();
+HRESULT gst_dshow_register_fakefilters ();
/* free memory of the input pin mediatype */
void gst_dshow_free_pin_mediatype (gpointer pt);
@@ -66,14 +64,13 @@ gboolean gst_dshow_find_filter(CLSID input_majortype, CLSID input_subtype,
/* get the dshow device path from device friendly name.
If friendly name is not set, it will return the first available device */
-gchar *gst_dshow_getdevice_from_devicename (GUID *device_category, gchar **device_name);
+gchar *gst_dshow_getdevice_from_devicename (const GUID *device_category, gchar **device_name);
/* show the capture filter property page (generally used to setup the device). the page is modal*/
gboolean gst_dshow_show_propertypage (IBaseFilter *base_filter);
-
-
-#ifdef __cplusplus
-}
+
+#ifdef __cplusplus
+}
#endif
#endif /* _GSTDSHOW_ */ \ No newline at end of file
diff --git a/sys/dshowsrcwrapper/gstdshowaudiosrc.c b/sys/dshowsrcwrapper/gstdshowaudiosrc.cpp
index d6edf47d..c213aae5 100644..100755
--- a/sys/dshowsrcwrapper/gstdshowaudiosrc.c
+++ b/sys/dshowsrcwrapper/gstdshowaudiosrc.cpp
@@ -19,12 +19,12 @@
* Boston, MA 02111-1307, USA.
*/
-#include "gstdshowaudiosrc.h"
-
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
+#include "gstdshowaudiosrc.h"
+
static const GstElementDetails gst_dshowaudiosrc_details =
GST_ELEMENT_DETAILS ("Directshow audio capture source",
"Source/Audio",
@@ -166,13 +166,14 @@ gst_dshowaudiosrc_class_init (GstDshowAudioSrcClass * klass)
g_object_class_install_property
(gobject_class, PROP_DEVICE,
g_param_spec_string ("device", "Device",
- "Directshow device reference (classID/name)",
- NULL, G_PARAM_READWRITE));
+ "Directshow device reference (classID/name)", NULL,
+ static_cast<GParamFlags>(G_PARAM_READWRITE)));
g_object_class_install_property
(gobject_class, PROP_DEVICE_NAME,
g_param_spec_string ("device-name", "Device name",
- "Human-readable name of the sound device", NULL, G_PARAM_READWRITE));
+ "Human-readable name of the sound device", NULL,
+ static_cast<GParamFlags>(G_PARAM_READWRITE)));
GST_DEBUG_CATEGORY_INIT (dshowaudiosrc_debug, "dshowaudiosrc", 0,
"Directshow audio source");
@@ -234,9 +235,8 @@ gst_dshowaudiosrc_dispose (GObject * gobject)
}
/* clean dshow */
- if (src->audio_cap_filter) {
- IBaseFilter_Release (src->audio_cap_filter);
- }
+ if (src->audio_cap_filter)
+ src->audio_cap_filter->Release();
CoUninitialize ();
@@ -273,8 +273,8 @@ gst_dshowaudiosrc_get_device_name_values (GstDshowAudioSrc * src)
g_value_init (&value, G_TYPE_STRING);
- hres = CoCreateInstance (&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
- &IID_ICreateDevEnum, (void **) &devices_enum);
+ hres = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
+ IID_ICreateDevEnum, (LPVOID *) &devices_enum);
if (hres != S_OK) {
GST_CAT_ERROR (dshowaudiosrc_debug,
"Can't create an instance of the system device enumerator (error=%d)",
@@ -283,9 +283,8 @@ gst_dshowaudiosrc_get_device_name_values (GstDshowAudioSrc * src)
goto clean;
}
- hres =
- ICreateDevEnum_CreateClassEnumerator (devices_enum,
- &CLSID_AudioInputDeviceCategory, &moniker_enum, 0);
+ hres = devices_enum->CreateClassEnumerator(CLSID_AudioInputDeviceCategory,
+ &moniker_enum, 0);
if (hres != S_OK || !moniker_enum) {
GST_CAT_ERROR (dshowaudiosrc_debug,
"Can't get enumeration of audio devices (error=%d)", hres);
@@ -293,22 +292,19 @@ gst_dshowaudiosrc_get_device_name_values (GstDshowAudioSrc * src)
goto clean;
}
- IEnumMoniker_Reset (moniker_enum);
+ moniker_enum->Reset();
- while (hres = IEnumMoniker_Next (moniker_enum, 1, &moniker, &fetched),
+ while (hres = moniker_enum->Next(1, &moniker, &fetched),
hres == S_OK) {
IPropertyBag *property_bag = NULL;
- hres =
- IMoniker_BindToStorage (moniker, NULL, NULL, &IID_IPropertyBag,
- (void **) &property_bag);
+ hres = moniker->BindToStorage(NULL, NULL, IID_IPropertyBag,
+ (LPVOID *) &property_bag);
if (SUCCEEDED (hres) && property_bag) {
VARIANT varFriendlyName;
VariantInit (&varFriendlyName);
- hres =
- IPropertyBag_Read (property_bag, L"FriendlyName", &varFriendlyName,
- NULL);
+ hres = property_bag->Read(L"FriendlyName", &varFriendlyName, NULL);
if (hres == S_OK && varFriendlyName.bstrVal) {
gchar *friendly_name =
g_utf16_to_utf8 ((const gunichar2 *) varFriendlyName.bstrVal,
@@ -320,19 +316,17 @@ gst_dshowaudiosrc_get_device_name_values (GstDshowAudioSrc * src)
g_free (friendly_name);
SysFreeString (varFriendlyName.bstrVal);
}
- IPropertyBag_Release (property_bag);
+ property_bag->Release();
}
- IMoniker_Release (moniker);
+ moniker->Release();
}
clean:
- if (moniker_enum) {
- IEnumMoniker_Release (moniker_enum);
- }
+ if (moniker_enum)
+ moniker_enum->Release();
- if (devices_enum) {
- ICreateDevEnum_Release (devices_enum);
- }
+ if (devices_enum)
+ devices_enum->Release();
return array;
}
@@ -415,14 +409,13 @@ gst_dshowaudiosrc_get_caps (GstBaseSrc * basesrc)
if (!src->audio_cap_filter) {
hres = CreateBindCtx (0, &lpbc);
if (SUCCEEDED (hres)) {
- hres = MkParseDisplayName (lpbc, unidevice, &dwEaten, &audiom);
+ hres = MkParseDisplayName (lpbc, (LPCOLESTR) unidevice, &dwEaten, &audiom);
if (SUCCEEDED (hres)) {
- hres =
- IMoniker_BindToObject (audiom, lpbc, NULL, &IID_IBaseFilter,
- &src->audio_cap_filter);
- IMoniker_Release (audiom);
+ hres = audiom->BindToObject(lpbc, NULL, IID_IBaseFilter,
+ (LPVOID *) &src->audio_cap_filter);
+ audiom->Release();
}
- IBindCtx_Release (lpbc);
+ lpbc->Release();
}
}
@@ -432,42 +425,39 @@ gst_dshowaudiosrc_get_caps (GstBaseSrc * basesrc)
IEnumPins *enumpins = NULL;
HRESULT hres;
- hres = IBaseFilter_EnumPins (src->audio_cap_filter, &enumpins);
+ hres = src->audio_cap_filter->EnumPins(&enumpins);
if (SUCCEEDED (hres)) {
- while (IEnumPins_Next (enumpins, 1, &capture_pin, NULL) == S_OK) {
+ while (enumpins->Next(1, &capture_pin, NULL) == S_OK) {
IKsPropertySet *pKs = NULL;
- hres =
- IPin_QueryInterface (capture_pin, &IID_IKsPropertySet,
- (void **) &pKs);
+ hres = capture_pin->QueryInterface(IID_IKsPropertySet, (LPVOID *) &pKs);
if (SUCCEEDED (hres) && pKs) {
DWORD cbReturned;
GUID pin_category;
RPC_STATUS rpcstatus;
hres =
- IKsPropertySet_Get (pKs, &AMPROPSETID_Pin,
+ pKs->Get(AMPROPSETID_Pin,
AMPROPERTY_PIN_CATEGORY, NULL, 0, &pin_category, sizeof (GUID),
&cbReturned);
/* we only want capture pins */
- if (UuidCompare (&pin_category, &PIN_CATEGORY_CAPTURE,
+ if (UuidCompare (&pin_category, (UUID *) &PIN_CATEGORY_CAPTURE,
&rpcstatus) == 0) {
IAMStreamConfig *streamcaps = NULL;
- if (SUCCEEDED (IPin_QueryInterface (capture_pin,
- &IID_IAMStreamConfig, (void **) &streamcaps))) {
+ if (SUCCEEDED (capture_pin->QueryInterface(IID_IAMStreamConfig, (LPVOID *) &streamcaps))) {
src->caps =
gst_dshowaudiosrc_getcaps_from_streamcaps (src, capture_pin,
streamcaps);
- IAMStreamConfig_Release (streamcaps);
+ streamcaps->Release();
}
}
- IKsPropertySet_Release (pKs);
+ pKs->Release();
}
- IPin_Release (capture_pin);
+ capture_pin->Release();
}
- IEnumPins_Release (enumpins);
+ enumpins->Release();
}
}
@@ -495,7 +485,7 @@ gst_dshowaudiosrc_change_state (GstElement * element, GstStateChange transition)
break;
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
if (src->media_filter)
- hres = IMediaFilter_Run (src->media_filter, 0);
+ hres = src->media_filter->Run(0);
if (hres != S_OK) {
GST_CAT_ERROR (dshowaudiosrc_debug,
"Can't RUN the directshow capture graph (error=%d)", hres);
@@ -507,7 +497,7 @@ gst_dshowaudiosrc_change_state (GstElement * element, GstStateChange transition)
break;
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
if (src->media_filter)
- hres = IMediaFilter_Stop (src->media_filter);
+ hres = src->media_filter->Stop();
if (hres != S_OK) {
GST_CAT_ERROR (dshowaudiosrc_debug,
"Can't STOP the directshow capture graph (error=%d)", hres);
@@ -533,8 +523,8 @@ gst_dshowaudiosrc_open (GstAudioSrc * asrc)
HRESULT hres = S_FALSE;
GstDshowAudioSrc *src = GST_DSHOWAUDIOSRC (asrc);
- hres = CoCreateInstance (&CLSID_FilterGraph, NULL, CLSCTX_INPROC,
- &IID_IFilterGraph, (LPVOID *) & src->filter_graph);
+ hres = CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC,
+ IID_IFilterGraph, (LPVOID *) & src->filter_graph);
if (hres != S_OK || !src->filter_graph) {
GST_CAT_ERROR (dshowaudiosrc_debug,
"Can't create an instance of the directshow graph manager (error=%d)",
@@ -542,8 +532,7 @@ gst_dshowaudiosrc_open (GstAudioSrc * asrc)
goto error;
}
- hres = IFilterGraph_QueryInterface (src->filter_graph, &IID_IMediaFilter,
- (void **) &src->media_filter);
+ hres = src->filter_graph->QueryInterface(IID_IMediaFilter, (LPVOID *) &src->media_filter);
if (hres != S_OK || !src->media_filter) {
GST_CAT_ERROR (dshowaudiosrc_debug,
"Can't get IMediacontrol interface from the graph manager (error=%d)",
@@ -551,17 +540,15 @@ gst_dshowaudiosrc_open (GstAudioSrc * asrc)
goto error;
}
- hres = CoCreateInstance (&CLSID_DshowFakeSink, NULL, CLSCTX_INPROC,
- &IID_IBaseFilter, (LPVOID *) & src->dshow_fakesink);
+ hres = CoCreateInstance (CLSID_DshowFakeSink, NULL, CLSCTX_INPROC,
+ IID_IBaseFilter, (LPVOID *) & src->dshow_fakesink);
if (hres != S_OK || !src->dshow_fakesink) {
GST_CAT_ERROR (dshowaudiosrc_debug,
"Can't create an instance of the directshow fakesink (error=%d)", hres);
goto error;
}
- hres =
- IFilterGraph_AddFilter (src->filter_graph, src->audio_cap_filter,
- L"capture");
+ hres = src->filter_graph->AddFilter(src->audio_cap_filter, L"capture");
if (hres != S_OK) {
GST_CAT_ERROR (dshowaudiosrc_debug,
"Can't add the directshow capture filter to the graph (error=%d)",
@@ -569,9 +556,7 @@ gst_dshowaudiosrc_open (GstAudioSrc * asrc)
goto error;
}
- hres =
- IFilterGraph_AddFilter (src->filter_graph, src->dshow_fakesink,
- L"fakesink");
+ hres = src->filter_graph->AddFilter(src->dshow_fakesink, L"fakesink");
if (hres != S_OK) {
GST_CAT_ERROR (dshowaudiosrc_debug,
"Can't add our fakesink filter to the graph (error=%d)", hres);
@@ -582,16 +567,16 @@ gst_dshowaudiosrc_open (GstAudioSrc * asrc)
error:
if (src->dshow_fakesink) {
- IBaseFilter_Release (src->dshow_fakesink);
+ src->dshow_fakesink->Release();
src->dshow_fakesink = NULL;
}
if (src->media_filter) {
- IMediaFilter_Release (src->media_filter);
+ src->media_filter->Release();
src->media_filter = NULL;
}
if (src->filter_graph) {
- IFilterGraph_Release (src->filter_graph);
+ src->filter_graph->Release();
src->filter_graph = NULL;
}
@@ -628,9 +613,7 @@ gst_dshowaudiosrc_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec)
if (type) {
pin_mediatype = (GstCapturePinMediaType *) type->data;
- hres =
- IBaseFilter_QueryInterface (src->dshow_fakesink,
- &IID_IGstDshowInterface, (void **) &srcinterface);
+ hres = src->dshow_fakesink->QueryInterface(IID_IGstDshowInterface, (LPVOID *) &srcinterface);
if (hres != S_OK || !srcinterface) {
GST_CAT_ERROR (dshowaudiosrc_debug,
"Can't get IGstDshowInterface interface from our dshow fakesink filter (error=%d)",
@@ -638,14 +621,12 @@ gst_dshowaudiosrc_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec)
goto error;
}
- IGstDshowInterface_gst_set_media_type (srcinterface,
- pin_mediatype->mediatype);
- IGstDshowInterface_gst_set_buffer_callback (srcinterface,
- (byte *) gst_dshowaudiosrc_push_buffer, (byte *) src);
+ srcinterface->gst_set_media_type(pin_mediatype->mediatype);
+ srcinterface->gst_set_buffer_callback(
+ (push_buffer_func) gst_dshowaudiosrc_push_buffer, (byte *) src);
- if (srcinterface) {
- IGstDshowInterface_Release (srcinterface);
- }
+ if (srcinterface)
+ srcinterface->Release();
gst_dshow_get_pin_from_filter (src->dshow_fakesink, PINDIR_INPUT,
&input_pin);
@@ -655,10 +636,9 @@ gst_dshowaudiosrc_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec)
goto error;
}
- hres =
- IFilterGraph_ConnectDirect (src->filter_graph,
- pin_mediatype->capture_pin, input_pin, NULL);
- IPin_Release (input_pin);
+ hres = src->filter_graph->ConnectDirect(pin_mediatype->capture_pin,
+ input_pin, NULL);
+ input_pin->Release();
if (hres != S_OK) {
GST_CAT_ERROR (dshowaudiosrc_debug,
@@ -676,9 +656,8 @@ gst_dshowaudiosrc_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec)
return TRUE;
error:
- if (srcinterface) {
- IGstDshowInterface_Release (srcinterface);
- }
+ if (srcinterface)
+ srcinterface->Release();
return FALSE;
}
@@ -694,14 +673,14 @@ gst_dshowaudiosrc_unprepare (GstAudioSrc * asrc)
gst_dshow_get_pin_from_filter (src->audio_cap_filter, PINDIR_OUTPUT,
&output_pin);
if (output_pin) {
- hres = IFilterGraph_Disconnect (src->filter_graph, output_pin);
- IPin_Release (output_pin);
+ hres = src->filter_graph->Disconnect(output_pin);
+ output_pin->Release();
}
gst_dshow_get_pin_from_filter (src->dshow_fakesink, PINDIR_INPUT, &input_pin);
if (input_pin) {
- hres = IFilterGraph_Disconnect (src->filter_graph, input_pin);
- IPin_Release (input_pin);
+ hres = src->filter_graph->Disconnect(input_pin);
+ input_pin->Release();
}
return TRUE;
@@ -716,19 +695,19 @@ gst_dshowaudiosrc_close (GstAudioSrc * asrc)
return TRUE;
/*remove filters from the graph */
- IFilterGraph_RemoveFilter (src->filter_graph, src->audio_cap_filter);
- IFilterGraph_RemoveFilter (src->filter_graph, src->dshow_fakesink);
+ src->filter_graph->RemoveFilter(src->audio_cap_filter);
+ src->filter_graph->RemoveFilter(src->dshow_fakesink);
/*release our gstreamer dshow sink */
- IBaseFilter_Release (src->dshow_fakesink);
+ src->dshow_fakesink->Release();
src->dshow_fakesink = NULL;
/*release media filter interface */
- IMediaFilter_Release (src->media_filter);
+ src->media_filter->Release();
src->media_filter = NULL;
/*release the filter graph manager */
- IFilterGraph_Release (src->filter_graph);
+ src->filter_graph->Release();
src->filter_graph = NULL;
return TRUE;
@@ -786,7 +765,9 @@ gst_dshowaudiosrc_reset (GstAudioSrc * asrc)
GstDshowAudioSrc *src = GST_DSHOWAUDIOSRC (asrc);
g_mutex_lock (src->gbarray_lock);
- g_byte_array_remove_range (src->gbarray, 0, src->gbarray->len);
+ GST_DEBUG ("byte array size= %d", src->gbarray->len);
+ if (src->gbarray->len > 0)
+ g_byte_array_remove_range (src->gbarray, 0, src->gbarray->len);
g_mutex_unlock (src->gbarray_lock);
}
@@ -805,7 +786,7 @@ gst_dshowaudiosrc_getcaps_from_streamcaps (GstDshowAudioSrc * src, IPin * pin,
if (!streamcaps)
return NULL;
- IAMStreamConfig_GetNumberOfCapabilities (streamcaps, &icount, &isize);
+ streamcaps->GetNumberOfCapabilities(&icount, &isize);
if (isize != sizeof (ascc))
return NULL;
@@ -813,11 +794,10 @@ gst_dshowaudiosrc_getcaps_from_streamcaps (GstDshowAudioSrc * src, IPin * pin,
for (; i < icount; i++) {
GstCapturePinMediaType *pin_mediatype = g_new0 (GstCapturePinMediaType, 1);
- IPin_AddRef (pin);
+ pin->AddRef();
pin_mediatype->capture_pin = pin;
- hres =
- IAMStreamConfig_GetStreamCaps (streamcaps, i, &pin_mediatype->mediatype,
+ hres = streamcaps->GetStreamCaps(i, &pin_mediatype->mediatype,
(BYTE *) & ascc);
if (hres == S_OK && pin_mediatype->mediatype) {
GstCaps *mediacaps = NULL;
@@ -825,10 +805,10 @@ gst_dshowaudiosrc_getcaps_from_streamcaps (GstDshowAudioSrc * src, IPin * pin,
if (!caps)
caps = gst_caps_new_empty ();
- if ((UuidCompare (&pin_mediatype->mediatype->subtype, &MEDIASUBTYPE_PCM,
+ if ((UuidCompare (&pin_mediatype->mediatype->subtype, (UUID *) &MEDIASUBTYPE_PCM,
&rpcstatus) == 0 && rpcstatus == RPC_S_OK)
&& (UuidCompare (&pin_mediatype->mediatype->formattype,
- &FORMAT_WaveFormatEx, &rpcstatus) == 0
+ (UUID *) &FORMAT_WaveFormatEx, &rpcstatus) == 0
&& rpcstatus == RPC_S_OK)) {
WAVEFORMATEX *wavformat =
(WAVEFORMATEX *) pin_mediatype->mediatype->pbFormat;
diff --git a/sys/dshowsrcwrapper/gstdshowaudiosrc.h b/sys/dshowsrcwrapper/gstdshowaudiosrc.h
index fb571015..b8147011 100644..100755
--- a/sys/dshowsrcwrapper/gstdshowaudiosrc.h
+++ b/sys/dshowsrcwrapper/gstdshowaudiosrc.h
@@ -27,7 +27,8 @@
#include <gst/audio/gstaudiosrc.h>
#include <gst/interfaces/propertyprobe.h>
-#include "gstdshowsrcwrapper.h"
+#include "gstdshow.h"
+#include "gstdshowinterface.h"
G_BEGIN_DECLS
#define GST_TYPE_DSHOWAUDIOSRC (gst_dshowaudiosrc_get_type())
diff --git a/gst-libs/gst/dshow/gstdshowfakesink.cpp b/sys/dshowsrcwrapper/gstdshowfakesink.cpp
index e3a5f0b9..afc0a5ef 100644..100755
--- a/gst-libs/gst/dshow/gstdshowfakesink.cpp
+++ b/sys/dshowsrcwrapper/gstdshowfakesink.cpp
@@ -37,6 +37,7 @@ CDshowFakeSink::~CDshowFakeSink()
CUnknown* WINAPI CDshowFakeSink::CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr)
{
CDshowFakeSink *pNewObject = new CDshowFakeSink();
+ g_print ("CDshowFakeSink::CreateInstance\n");
if (pNewObject == NULL) {
*pHr = E_OUTOFMEMORY;
}
diff --git a/gst-libs/gst/dshow/gstdshowfakesink.h b/sys/dshowsrcwrapper/gstdshowfakesink.h
index 7f419b27..7f419b27 100644..100755
--- a/gst-libs/gst/dshow/gstdshowfakesink.h
+++ b/sys/dshowsrcwrapper/gstdshowfakesink.h
diff --git a/gst-libs/gst/dshow/gstdshowinterface.h b/sys/dshowsrcwrapper/gstdshowinterface.h
index 1a19a611..68328b95 100644..100755
--- a/gst-libs/gst/dshow/gstdshowinterface.h
+++ b/sys/dshowsrcwrapper/gstdshowinterface.h
@@ -24,9 +24,9 @@
#include "gstdshow.h"
-#ifdef LIBDSHOW_EXPORTS
+#ifdef __cplusplus
typedef bool (*push_buffer_func) (byte *buffer, long size, byte *src_object, UINT64 start, UINT64 stop);
-#endif /* LIBDSHOW_EXPORTS */
+#endif
/* verify that the <rpcndr.h> version is high enough to compile this file*/
#ifndef __REQUIRED_RPCNDR_H_VERSION__
@@ -45,17 +45,15 @@ typedef bool (*push_buffer_func) (byte *buffer, long size, byte *src_object, UIN
#include "ole2.h"
#endif /*COM_NO_WINDOWS_H*/
-#ifdef __cplusplus
-extern "C"{
-#endif
-
+//{6A780808-9725-4d0b-8695-A4DD8D210773}
+static const GUID CLSID_DshowFakeSink
+ = { 0x6a780808, 0x9725, 0x4d0b, { 0x86, 0x95, 0xa4, 0xdd, 0x8d, 0x21, 0x7, 0x73 } };
-extern DSHOW_API const GUID CLSID_DshowFakeSink;
-extern DSHOW_API const GUID CLSID_DshowFakeSrc;
-extern DSHOW_API const GUID IID_IGstDshowInterface;
+// {FC36764C-6CD4-4C73-900F-3F40BF3F191A}
+static const GUID IID_IGstDshowInterface =
+ { 0xfc36764c, 0x6cd4, 0x4c73, { 0x90, 0xf, 0x3f, 0x40, 0xbf, 0x3f, 0x19, 0x1a } };
#define CLSID_DSHOWFAKESINK_STRING "{6A780808-9725-4d0b-8695-A4DD8D210773}"
-#define CLSID_DSHOWFAKESRC_STRING "{1E38DAED-8A6E-4DEA-A482-A878761D11CB}"
typedef interface IGstDshowInterface IGstDshowInterface;
@@ -162,8 +160,4 @@ void __RPC_USER MIDL_user_free( void __RPC_FAR * );
#endif /* __IGstDshowInterface_INTERFACE_DEFINED__ */
-#ifdef __cplusplus
-}
-#endif
-
#endif /* __GST_DSHOW_INTERFACE_H__ */ \ No newline at end of file
diff --git a/sys/dshowsrcwrapper/gstdshowsrcwrapper.c b/sys/dshowsrcwrapper/gstdshowsrcwrapper.cpp
index 803fd807..1e9a8aa2 100644..100755
--- a/sys/dshowsrcwrapper/gstdshowsrcwrapper.c
+++ b/sys/dshowsrcwrapper/gstdshowsrcwrapper.cpp
@@ -35,12 +35,15 @@ const GUID IID_IGstSrcInterface =
{ 0x542c0a24, 0x8bd1, 0x46cb, {0xaa, 0x57, 0x3e, 0x46, 0xd0, 0x6, 0xd2,
0xf3} };
-
static gboolean
plugin_init (GstPlugin * plugin)
{
/* register fake filters */
- gst_dshow_register_fakefilters ();
+ HRESULT hr = gst_dshow_register_fakefilters ();
+ if (FAILED (hr)) {
+ g_warning ("failed to register directshow fakesink filter: 0x%x\n", hr);
+ return FALSE;
+ }
if (!gst_element_register (plugin, "dshowaudiosrc",
GST_RANK_NONE,
@@ -52,8 +55,12 @@ plugin_init (GstPlugin * plugin)
return TRUE;
}
+extern "C" {
+
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
GST_VERSION_MINOR,
"dshowsrcwrapper",
"DirectShow sources wrapper plugin",
plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
+
+}
diff --git a/sys/dshowsrcwrapper/gstdshowsrcwrapper.h b/sys/dshowsrcwrapper/gstdshowsrcwrapper.h
deleted file mode 100644
index d94d49f7..00000000
--- a/sys/dshowsrcwrapper/gstdshowsrcwrapper.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* GStreamer
- * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net>
- *
- * gstdshowsrcwrapper.h:
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef __GST_DSHOW_H__
-#define __GST_DSHOW_H__
-
-#include <windows.h>
-#include <objbase.h>
-#include <dshow.h>
-#include <Rpc.h>
-
-#include <gst/dshow/gstdshowinterface.h>
-
-#pragma warning( disable : 4090 4024)
-
-#endif /* __GST_DSHOW_H__ */
diff --git a/sys/dshowsrcwrapper/gstdshowvideosrc.c b/sys/dshowsrcwrapper/gstdshowvideosrc.cpp
index 4a37778c..67e70d96 100644..100755
--- a/sys/dshowsrcwrapper/gstdshowvideosrc.c
+++ b/sys/dshowsrcwrapper/gstdshowvideosrc.cpp
@@ -19,12 +19,12 @@
* Boston, MA 02111-1307, USA.
*/
-#include "gstdshowvideosrc.h"
-
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
+#include "gstdshowvideosrc.h"
+
static const GstElementDetails gst_dshowvideosrc_details =
GST_ELEMENT_DETAILS ("DirectShow video capture source",
"Source/Video",
@@ -181,12 +181,14 @@ gst_dshowvideosrc_class_init (GstDshowVideoSrcClass * klass)
g_object_class_install_property
(gobject_class, PROP_DEVICE,
g_param_spec_string ("device", "Device",
- "Directshow device path (@..classID/name)", NULL, G_PARAM_READWRITE));
+ "Directshow device path (@..classID/name)", NULL,
+ static_cast<GParamFlags>(G_PARAM_READWRITE)));
g_object_class_install_property
(gobject_class, PROP_DEVICE_NAME,
g_param_spec_string ("device-name", "Device name",
- "Human-readable name of the sound device", NULL, G_PARAM_READWRITE));
+ "Human-readable name of the sound device", NULL,
+ static_cast<GParamFlags>(G_PARAM_READWRITE)));
GST_DEBUG_CATEGORY_INIT (dshowvideosrc_debug, "dshowvideosrc", 0,
"Directshow video source");
@@ -243,7 +245,7 @@ gst_dshowvideosrc_dispose (GObject * gobject)
/* clean dshow */
if (src->video_cap_filter) {
- IBaseFilter_Release (src->video_cap_filter);
+ src->video_cap_filter->Release();
src->video_cap_filter = NULL;
}
@@ -327,8 +329,8 @@ gst_dshowvideosrc_get_device_name_values (GstDshowVideoSrc * src)
g_value_init (&value, G_TYPE_STRING);
- hres = CoCreateInstance (&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
- &IID_ICreateDevEnum, (void **) &devices_enum);
+ hres = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
+ IID_ICreateDevEnum, (LPVOID *) &devices_enum);
if (hres != S_OK) {
GST_CAT_ERROR (dshowvideosrc_debug,
"Can't create an instance of the system device enumerator (error=%d)",
@@ -337,9 +339,8 @@ gst_dshowvideosrc_get_device_name_values (GstDshowVideoSrc * src)
goto clean;
}
- hres =
- ICreateDevEnum_CreateClassEnumerator (devices_enum,
- &CLSID_VideoInputDeviceCategory, &moniker_enum, 0);
+ hres = devices_enum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
+ &moniker_enum, 0);
if (hres != S_OK || !moniker_enum) {
GST_CAT_ERROR (dshowvideosrc_debug,
"Can't get enumeration of video devices (error=%d)", hres);
@@ -347,22 +348,20 @@ gst_dshowvideosrc_get_device_name_values (GstDshowVideoSrc * src)
goto clean;
}
- IEnumMoniker_Reset (moniker_enum);
+ moniker_enum->Reset();
- while (hres = IEnumMoniker_Next (moniker_enum, 1, &moniker, &fetched),
+ while (hres = moniker_enum->Next(1, &moniker, &fetched),
hres == S_OK) {
IPropertyBag *property_bag = NULL;
hres =
- IMoniker_BindToStorage (moniker, NULL, NULL, &IID_IPropertyBag,
- (void **) &property_bag);
+ moniker->BindToStorage(NULL, NULL, IID_IPropertyBag,
+ (LPVOID *) &property_bag);
if (SUCCEEDED (hres) && property_bag) {
VARIANT varFriendlyName;
VariantInit (&varFriendlyName);
- hres =
- IPropertyBag_Read (property_bag, L"FriendlyName", &varFriendlyName,
- NULL);
+ hres = property_bag->Read(L"FriendlyName", &varFriendlyName, NULL);
if (hres == S_OK && varFriendlyName.bstrVal) {
gchar *friendly_name =
g_utf16_to_utf8 ((const gunichar2 *) varFriendlyName.bstrVal,
@@ -374,19 +373,17 @@ gst_dshowvideosrc_get_device_name_values (GstDshowVideoSrc * src)
g_free (friendly_name);
SysFreeString (varFriendlyName.bstrVal);
}
- IPropertyBag_Release (property_bag);
+ property_bag->Release();
}
- IMoniker_Release (moniker);
+ moniker->Release();
}
clean:
- if (moniker_enum) {
- IEnumMoniker_Release (moniker_enum);
- }
+ if (moniker_enum)
+ moniker_enum->Release();
- if (devices_enum) {
- ICreateDevEnum_Release (devices_enum);
- }
+ if (devices_enum)
+ devices_enum->Release();
return array;
}
@@ -480,14 +477,13 @@ gst_dshowvideosrc_get_caps (GstBaseSrc * basesrc)
if (!src->video_cap_filter) {
hres = CreateBindCtx (0, &lpbc);
if (SUCCEEDED (hres)) {
- hres = MkParseDisplayName (lpbc, unidevice, &dwEaten, &videom);
+ hres = MkParseDisplayName (lpbc, (LPCOLESTR) unidevice, &dwEaten, &videom);
if (SUCCEEDED (hres)) {
- hres =
- IMoniker_BindToObject (videom, lpbc, NULL, &IID_IBaseFilter,
- &src->video_cap_filter);
- IMoniker_Release (videom);
+ hres = videom->BindToObject(lpbc, NULL, IID_IBaseFilter,
+ (LPVOID *) &src->video_cap_filter);
+ videom->Release();
}
- IBindCtx_Release (lpbc);
+ lpbc->Release();
}
}
@@ -501,31 +497,28 @@ gst_dshowvideosrc_get_caps (GstBaseSrc * basesrc)
IEnumPins *enumpins = NULL;
HRESULT hres;
- hres = IBaseFilter_EnumPins (src->video_cap_filter, &enumpins);
+ hres = src->video_cap_filter->EnumPins(&enumpins);
if (SUCCEEDED (hres)) {
- while (IEnumPins_Next (enumpins, 1, &capture_pin, NULL) == S_OK) {
+ while (enumpins->Next(1, &capture_pin, NULL) == S_OK) {
IKsPropertySet *pKs = NULL;
-
- hres =
- IPin_QueryInterface (capture_pin, &IID_IKsPropertySet,
- (void **) &pKs);
+ hres = capture_pin->QueryInterface(IID_IKsPropertySet, (LPVOID *) &pKs);
if (SUCCEEDED (hres) && pKs) {
DWORD cbReturned;
GUID pin_category;
RPC_STATUS rpcstatus;
hres =
- IKsPropertySet_Get (pKs, &AMPROPSETID_Pin,
+ pKs->Get(AMPROPSETID_Pin,
AMPROPERTY_PIN_CATEGORY, NULL, 0, &pin_category, sizeof (GUID),
&cbReturned);
/* we only want capture pins */
- if (UuidCompare (&pin_category, &PIN_CATEGORY_CAPTURE,
+ if (UuidCompare (&pin_category, (UUID *) &PIN_CATEGORY_CAPTURE,
&rpcstatus) == 0) {
IAMStreamConfig *streamcaps = NULL;
- if (SUCCEEDED (IPin_QueryInterface (capture_pin,
- &IID_IAMStreamConfig, (void **) &streamcaps))) {
+ if (SUCCEEDED (capture_pin->QueryInterface(
+ IID_IAMStreamConfig, (LPVOID *) &streamcaps))) {
GstCaps *caps =
gst_dshowvideosrc_getcaps_from_streamcaps (src, capture_pin,
streamcaps);
@@ -533,16 +526,16 @@ gst_dshowvideosrc_get_caps (GstBaseSrc * basesrc)
if (caps) {
gst_caps_append (src->caps, caps);
}
- IAMStreamConfig_Release (streamcaps);
+ streamcaps->Release();
}
}
- IKsPropertySet_Release (pKs);
+ pKs->Release();
}
- IPin_Release (capture_pin);
+ capture_pin->Release();
}
- IEnumPins_Release (enumpins);
+ enumpins->Release();
}
}
@@ -573,7 +566,7 @@ gst_dshowvideosrc_change_state (GstElement * element, GstStateChange transition)
break;
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
if (src->media_filter)
- hres = IMediaFilter_Run (src->media_filter, 0);
+ hres = src->media_filter->Run(0);
if (hres != S_OK) {
GST_CAT_ERROR (dshowvideosrc_debug,
"Can't RUN the directshow capture graph (error=%d)", hres);
@@ -582,7 +575,7 @@ gst_dshowvideosrc_change_state (GstElement * element, GstStateChange transition)
break;
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
if (src->media_filter)
- hres = IMediaFilter_Stop (src->media_filter);
+ hres = src->media_filter->Stop();
if (hres != S_OK) {
GST_CAT_ERROR (dshowvideosrc_debug,
"Can't STOP the directshow capture graph (error=%d)", hres);
@@ -604,16 +597,16 @@ gst_dshowvideosrc_start (GstBaseSrc * bsrc)
HRESULT hres = S_FALSE;
GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (bsrc);
- hres = CoCreateInstance (&CLSID_FilterGraph, NULL, CLSCTX_INPROC,
- &IID_IFilterGraph, (LPVOID *) & src->filter_graph);
+ hres = CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC,
+ IID_IFilterGraph, (LPVOID *) & src->filter_graph);
if (hres != S_OK || !src->filter_graph) {
GST_CAT_ERROR (dshowvideosrc_debug,
"Can't create an instance of the dshow graph manager (error=%d)", hres);
goto error;
}
- hres = IFilterGraph_QueryInterface (src->filter_graph, &IID_IMediaFilter,
- (void **) &src->media_filter);
+ hres = src->filter_graph->QueryInterface(IID_IMediaFilter,
+ (LPVOID *) &src->media_filter);
if (hres != S_OK || !src->media_filter) {
GST_CAT_ERROR (dshowvideosrc_debug,
"Can't get IMediacontrol interface from the graph manager (error=%d)",
@@ -621,26 +614,23 @@ gst_dshowvideosrc_start (GstBaseSrc * bsrc)
goto error;
}
- hres = CoCreateInstance (&CLSID_DshowFakeSink, NULL, CLSCTX_INPROC,
- &IID_IBaseFilter, (LPVOID *) & src->dshow_fakesink);
+ hres = CoCreateInstance (CLSID_DshowFakeSink, NULL, CLSCTX_INPROC,
+ IID_IBaseFilter, (LPVOID *) & src->dshow_fakesink);
if (hres != S_OK || !src->dshow_fakesink) {
GST_CAT_ERROR (dshowvideosrc_debug,
- "Can't create an instance of our dshow fakesink filter (error=%d)",
+ "Can't create an instance of our dshow fakesink filter (error=0x%x)",
hres);
goto error;
}
- hres =
- IFilterGraph_AddFilter (src->filter_graph, src->video_cap_filter,
- L"capture");
+ hres = src->filter_graph->AddFilter(src->video_cap_filter, L"capture");
if (hres != S_OK) {
GST_CAT_ERROR (dshowvideosrc_debug,
"Can't add video capture filter to the graph (error=%d)", hres);
goto error;
}
- hres =
- IFilterGraph_AddFilter (src->filter_graph, src->dshow_fakesink, L"sink");
+ hres = src->filter_graph->AddFilter(src->dshow_fakesink, L"sink");
if (hres != S_OK) {
GST_CAT_ERROR (dshowvideosrc_debug,
"Can't add our fakesink filter to the graph (error=%d)", hres);
@@ -651,16 +641,16 @@ gst_dshowvideosrc_start (GstBaseSrc * bsrc)
error:
if (src->dshow_fakesink) {
- IBaseFilter_Release (src->dshow_fakesink);
+ src->dshow_fakesink->Release();
src->dshow_fakesink = NULL;
}
if (src->media_filter) {
- IMediaFilter_Release (src->media_filter);
+ src->media_filter->Release();
src->media_filter = NULL;
}
if (src->filter_graph) {
- IFilterGraph_Release (src->filter_graph);
+ src->filter_graph->Release();
src->filter_graph = NULL;
}
@@ -699,9 +689,8 @@ gst_dshowvideosrc_set_caps (GstBaseSrc * bsrc, GstCaps * caps)
if (type) {
pin_mediatype = (GstCapturePinMediaType *) type->data;
- hres =
- IBaseFilter_QueryInterface (src->dshow_fakesink,
- &IID_IGstDshowInterface, (void **) &srcinterface);
+ hres = src->dshow_fakesink->QueryInterface(
+ IID_IGstDshowInterface, (LPVOID *) &srcinterface);
if (hres != S_OK || !srcinterface) {
GST_CAT_ERROR (dshowvideosrc_debug,
@@ -710,14 +699,12 @@ gst_dshowvideosrc_set_caps (GstBaseSrc * bsrc, GstCaps * caps)
goto error;
}
- IGstDshowInterface_gst_set_media_type (srcinterface,
- pin_mediatype->mediatype);
- IGstDshowInterface_gst_set_buffer_callback (srcinterface,
- (byte *) gst_dshowvideosrc_push_buffer, (byte *) src);
+ srcinterface->gst_set_media_type(pin_mediatype->mediatype);
+ srcinterface->gst_set_buffer_callback(
+ (push_buffer_func) gst_dshowvideosrc_push_buffer, (byte *) src);
- if (srcinterface) {
- IGstDshowInterface_Release (srcinterface);
- }
+ if (srcinterface)
+ srcinterface->Release();
gst_dshow_get_pin_from_filter (src->dshow_fakesink, PINDIR_INPUT,
&input_pin);
@@ -727,10 +714,9 @@ gst_dshowvideosrc_set_caps (GstBaseSrc * bsrc, GstCaps * caps)
goto error;
}
- hres =
- IFilterGraph_ConnectDirect (src->filter_graph,
- pin_mediatype->capture_pin, input_pin, NULL);
- IPin_Release (input_pin);
+ hres = src->filter_graph->ConnectDirect(pin_mediatype->capture_pin,
+ input_pin, NULL);
+ input_pin->Release();
if (hres != S_OK) {
GST_CAT_ERROR (dshowvideosrc_debug,
@@ -760,9 +746,8 @@ gst_dshowvideosrc_set_caps (GstBaseSrc * bsrc, GstCaps * caps)
return TRUE;
error:
- if (srcinterface) {
- IGstDshowInterface_Release (srcinterface);
- }
+ if (srcinterface)
+ srcinterface->Release();
return FALSE;
}
@@ -781,30 +766,30 @@ gst_dshowvideosrc_stop (GstBaseSrc * bsrc)
gst_dshow_get_pin_from_filter (src->video_cap_filter, PINDIR_OUTPUT,
&output_pin);
if (output_pin) {
- hres = IFilterGraph_Disconnect (src->filter_graph, output_pin);
- IPin_Release (output_pin);
+ hres = src->filter_graph->Disconnect(output_pin);
+ output_pin->Release();
}
gst_dshow_get_pin_from_filter (src->dshow_fakesink, PINDIR_INPUT, &input_pin);
if (input_pin) {
- hres = IFilterGraph_Disconnect (src->filter_graph, input_pin);
- IPin_Release (input_pin);
+ hres = src->filter_graph->Disconnect(input_pin);
+ input_pin->Release();
}
/*remove filters from the graph */
- IFilterGraph_RemoveFilter (src->filter_graph, src->video_cap_filter);
- IFilterGraph_RemoveFilter (src->filter_graph, src->dshow_fakesink);
+ src->filter_graph->RemoveFilter(src->video_cap_filter);
+ src->filter_graph->RemoveFilter(src->dshow_fakesink);
/*release our gstreamer dshow sink */
- IBaseFilter_Release (src->dshow_fakesink);
+ src->dshow_fakesink->Release();
src->dshow_fakesink = NULL;
/*release media filter interface */
- IMediaFilter_Release (src->media_filter);
+ src->media_filter->Release();
src->media_filter = NULL;
/*release the filter graph manager */
- IFilterGraph_Release (src->filter_graph);
+ src->filter_graph->Release();
src->filter_graph = NULL;
return TRUE;
@@ -876,7 +861,7 @@ gst_dshowvideosrc_getcaps_from_streamcaps (GstDshowVideoSrc * src, IPin * pin,
if (!streamcaps)
return NULL;
- IAMStreamConfig_GetNumberOfCapabilities (streamcaps, &icount, &isize);
+ streamcaps->GetNumberOfCapabilities(&icount, &isize);
if (isize != sizeof (vscc))
return NULL;
@@ -884,12 +869,10 @@ gst_dshowvideosrc_getcaps_from_streamcaps (GstDshowVideoSrc * src, IPin * pin,
for (; i < icount; i++) {
GstCapturePinMediaType *pin_mediatype = g_new0 (GstCapturePinMediaType, 1);
- IPin_AddRef (pin);
+ pin->AddRef();
pin_mediatype->capture_pin = pin;
- hres =
- IAMStreamConfig_GetStreamCaps (streamcaps, i, &pin_mediatype->mediatype,
- (BYTE *) & vscc);
+ hres = streamcaps->GetStreamCaps(i, &pin_mediatype->mediatype, (BYTE *) & vscc);
if (hres == S_OK && pin_mediatype->mediatype) {
VIDEOINFOHEADER *video_info;
GstCaps *mediacaps = NULL;
@@ -898,10 +881,10 @@ gst_dshowvideosrc_getcaps_from_streamcaps (GstDshowVideoSrc * src, IPin * pin,
caps = gst_caps_new_empty ();
/* I420 */
- if ((UuidCompare (&pin_mediatype->mediatype->subtype, &MEDIASUBTYPE_I420,
+ if ((UuidCompare (&pin_mediatype->mediatype->subtype, (UUID *) &MEDIASUBTYPE_I420,
&rpcstatus) == 0 && rpcstatus == RPC_S_OK)
&& (UuidCompare (&pin_mediatype->mediatype->formattype,
- &FORMAT_VideoInfo, &rpcstatus) == 0
+ (UUID *) &FORMAT_VideoInfo, &rpcstatus) == 0
&& rpcstatus == RPC_S_OK)) {
video_info = (VIDEOINFOHEADER *) pin_mediatype->mediatype->pbFormat;
@@ -923,10 +906,10 @@ gst_dshowvideosrc_getcaps_from_streamcaps (GstDshowVideoSrc * src, IPin * pin,
}
/* RGB24 */
- if ((UuidCompare (&pin_mediatype->mediatype->subtype, &MEDIASUBTYPE_RGB24,
+ if ((UuidCompare (&pin_mediatype->mediatype->subtype, (UUID *) &MEDIASUBTYPE_RGB24,
&rpcstatus) == 0 && rpcstatus == RPC_S_OK)
&& (UuidCompare (&pin_mediatype->mediatype->formattype,
- &FORMAT_VideoInfo, &rpcstatus) == 0
+ (UUID *) &FORMAT_VideoInfo, &rpcstatus) == 0
&& rpcstatus == RPC_S_OK)) {
video_info = (VIDEOINFOHEADER *) pin_mediatype->mediatype->pbFormat;
@@ -952,10 +935,10 @@ gst_dshowvideosrc_getcaps_from_streamcaps (GstDshowVideoSrc * src, IPin * pin,
}
/* DVSD */
- if ((UuidCompare (&pin_mediatype->mediatype->subtype, &MEDIASUBTYPE_dvsd,
+ if ((UuidCompare (&pin_mediatype->mediatype->subtype, (UUID *) &MEDIASUBTYPE_dvsd,
&rpcstatus) == 0 && rpcstatus == RPC_S_OK)
&& (UuidCompare (&pin_mediatype->mediatype->formattype,
- &FORMAT_VideoInfo, &rpcstatus) == 0
+ (UUID *) &FORMAT_VideoInfo, &rpcstatus) == 0
&& rpcstatus == RPC_S_OK)) {
video_info = (VIDEOINFOHEADER *) pin_mediatype->mediatype->pbFormat;
@@ -978,10 +961,10 @@ gst_dshowvideosrc_getcaps_from_streamcaps (GstDshowVideoSrc * src, IPin * pin,
}
/* DV stream */
- if ((UuidCompare (&pin_mediatype->mediatype->subtype, &MEDIASUBTYPE_dvsd,
+ if ((UuidCompare (&pin_mediatype->mediatype->subtype, (UUID *) &MEDIASUBTYPE_dvsd,
&rpcstatus) == 0 && rpcstatus == RPC_S_OK)
&& (UuidCompare (&pin_mediatype->mediatype->formattype,
- &FORMAT_DvInfo, &rpcstatus) == 0 && rpcstatus == RPC_S_OK)) {
+ (UUID *) &FORMAT_DvInfo, &rpcstatus) == 0 && rpcstatus == RPC_S_OK)) {
mediacaps = gst_caps_new_simple ("video/x-dv",
"systemstream", G_TYPE_BOOLEAN, TRUE, NULL);
diff --git a/sys/dshowsrcwrapper/gstdshowvideosrc.h b/sys/dshowsrcwrapper/gstdshowvideosrc.h
index 8bc52fa9..b7bfbb19 100644..100755
--- a/sys/dshowsrcwrapper/gstdshowvideosrc.h
+++ b/sys/dshowsrcwrapper/gstdshowvideosrc.h
@@ -22,11 +22,13 @@
#ifndef __GST_DSHOWVIDEOSRC_H__
#define __GST_DSHOWVIDEOSRC_H__
+#include <glib.h>
#include <gst/gst.h>
#include <gst/base/gstpushsrc.h>
#include <gst/interfaces/propertyprobe.h>
-#include "gstdshowsrcwrapper.h"
+#include "gstdshow.h"
+#include "gstdshowinterface.h"
// 30323449-0000-0010-8000-00AA00389B71 MEDIASUBTYPE_I420
DEFINE_GUID(MEDIASUBTYPE_I420, 0x30323449, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71);
diff --git a/sys/dshowsrcwrapper/libgstdshow.def b/sys/dshowsrcwrapper/libgstdshow.def
new file mode 100755
index 00000000..ee8586c9
--- /dev/null
+++ b/sys/dshowsrcwrapper/libgstdshow.def
@@ -0,0 +1,8 @@
+EXPORTS
+ DllMain PRIVATE
+ DllGetClassObject PRIVATE
+ DllCanUnloadNow PRIVATE
+ DllRegisterServer PRIVATE
+ DllUnregisterServer PRIVATE
+
+
diff --git a/sys/dvb/gstdvbsrc.c b/sys/dvb/gstdvbsrc.c
index 37b46f42..fd76a4ea 100644
--- a/sys/dvb/gstdvbsrc.c
+++ b/sys/dvb/gstdvbsrc.c
@@ -1326,13 +1326,15 @@ gst_dvbsrc_tune (GstDvbSrc * object)
#endif
g_warning ("Error tuning channel: %s", strerror (errno));
}
- for (i = 0; i < 5; i++) {
+ for (i = 0; i < 50; i++) {
usleep (100000);
if (ioctl (object->fd_frontend, FE_READ_STATUS, &status) == -1) {
perror ("FE_READ_STATUS");
break;
}
GST_LOG_OBJECT (object, "status == 0x%02x", status);
+ if (status & FE_HAS_LOCK)
+ break;
}
if (status & FE_HAS_LOCK)
break;
diff --git a/sys/oss4/oss4-audio.c b/sys/oss4/oss4-audio.c
index 0a3c0af1..297ea7ff 100644
--- a/sys/oss4/oss4-audio.c
+++ b/sys/oss4/oss4-audio.c
@@ -494,29 +494,12 @@ gst_oss4_audio_get_template_caps (void)
return caps;
}
-static gint
-gst_oss4_audio_ilog2 (gint x)
-{
- /* well... hacker's delight explains... */
- x = x | (x >> 1);
- x = x | (x >> 2);
- x = x | (x >> 4);
- x = x | (x >> 8);
- x = x | (x >> 16);
- x = x - ((x >> 1) & 0x55555555);
- x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
- x = (x + (x >> 4)) & 0x0f0f0f0f;
- x = x + (x >> 8);
- x = x + (x >> 16);
- return (x & 0x0000003f) - 1;
-}
-
/* called by gst_oss4_sink_prepare() and gst_oss4_source_prepare() */
gboolean
gst_oss4_audio_set_format (GstObject * obj, int fd, GstRingBufferSpec * spec)
{
struct audio_buf_info info = { 0, };
- int fmt, chans, rate, fragsize;
+ int fmt, chans, rate;
fmt = gst_oss4_audio_get_oss_format (spec->format);
if (fmt == 0)
@@ -555,17 +538,6 @@ gst_oss4_audio_set_format (GstObject * obj, int fd, GstRingBufferSpec * spec)
goto format_not_what_was_requested;
}
- /* CHECKME: maybe we should just leave the fragsize alone? (tpm) */
- fragsize = gst_oss4_audio_ilog2 (spec->segsize);
- fragsize = ((spec->segtotal & 0x7fff) << 16) | fragsize;
- GST_DEBUG_OBJECT (obj, "setting segsize: %d, segtotal: %d, value: %08x",
- spec->segsize, spec->segtotal, fragsize);
-
- /* we could also use the new SNDCTL_DSP_POLICY if there's something in
- * particular we're trying to achieve here */
- if (ioctl (fd, SNDCTL_DSP_SETFRAGMENT, &fragsize) == -1)
- goto set_fragsize_failed;
-
if (GST_IS_OSS4_SOURCE (obj)) {
if (ioctl (fd, SNDCTL_DSP_GETISPACE, &info) == -1)
goto get_ispace_failed;
@@ -575,12 +547,17 @@ gst_oss4_audio_set_format (GstObject * obj, int fd, GstRingBufferSpec * spec)
}
spec->segsize = info.fragsize;
- spec->segtotal = info.fragstotal;
+
+ /* we add some extra fragments -- this helps us account for delays due to
+ * conversion buffer, streams queueing, etc. It is important that these
+ * be taken into account because otherwise the delay counter can wind up
+ * being too large, and the buffer will wrap. */
+ spec->segtotal = info.fragstotal + 4;
spec->bytes_per_sample = (spec->width / 8) * spec->channels;
GST_DEBUG_OBJECT (obj, "got segsize: %d, segtotal: %d, value: %08x",
- spec->segsize, spec->segtotal, fragsize);
+ spec->segsize, spec->segtotal, info.fragsize);
return TRUE;
@@ -615,12 +592,6 @@ set_rate_failed:
("DSP_SPEED(%d) failed: %s", rate, g_strerror (errno)));
return FALSE;
}
-set_fragsize_failed:
- {
- GST_ELEMENT_ERROR (obj, RESOURCE, SETTINGS, (NULL),
- ("DSP_SETFRAGMENT(%d) failed: %s", fragsize, g_strerror (errno)));
- return FALSE;
- }
get_ospace_failed:
{
GST_ELEMENT_ERROR (obj, RESOURCE, SETTINGS, (NULL),
diff --git a/sys/oss4/oss4-mixer-slider.c b/sys/oss4/oss4-mixer-slider.c
index f8e7f661..cdc91049 100644
--- a/sys/oss4/oss4-mixer-slider.c
+++ b/sys/oss4/oss4-mixer-slider.c
@@ -159,8 +159,10 @@ gst_oss4_mixer_slider_set_volume (GstOss4MixerSlider * s, const gint * volumes)
/* if we're supposed to be muted, and are 'simulating' the mute because
* we don't have a mute control, don't actually change the volume, just
* save it as the new desired volume for later when we get unmuted again */
- if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MUTE) && !s->mc->mute)
- goto done;
+ if (!GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_NO_MUTE)) {
+ if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MUTE) && !s->mc->mute)
+ goto done;
+ }
val = gst_oss4_mixer_slider_pack_volume (s, volumes);
@@ -196,14 +198,21 @@ gst_oss4_mixer_slider_set_mute (GstOss4MixerSlider * s, gboolean mute)
GstMixerTrack *track = GST_MIXER_TRACK (s);
gboolean ret;
- /* if we don't have a mute control, simulate mute (which is a bit broken,
- * since we can't differentiate between capture/playback volume etc., so
+ /* if the control does not support muting, then do not do anything */
+ if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_NO_MUTE)) {
+ return TRUE;
+ }
+
+ /* If we do not have a mute control, simulate mute (which is a bit broken,
+ * since we can not differentiate between capture/playback volume etc., so
* we just assume that setting the volume to 0 would be the same as muting
* this control) */
if (s->mc->mute == NULL) {
int volume;
if (mute) {
+ /* make sure the current volume values get saved. */
+ gst_oss4_mixer_slider_get_volume (s, s->volumes);
volume = 0;
} else {
volume = gst_oss4_mixer_slider_pack_volume (s, s->volumes);
diff --git a/sys/oss4/oss4-mixer-switch.c b/sys/oss4/oss4-mixer-switch.c
index 403abbc5..11d74b46 100644
--- a/sys/oss4/oss4-mixer-switch.c
+++ b/sys/oss4/oss4-mixer-switch.c
@@ -49,45 +49,30 @@ gst_oss4_mixer_switch_init (GstOss4MixerSwitch * s)
/* nothing to do here */
}
-static GstMixerTrackFlags
-gst_oss4_mixer_switch_get_switch_flag (GstMixerTrack * track)
-{
- if ((track->flags & GST_MIXER_TRACK_INPUT)) {
- return GST_MIXER_TRACK_RECORD;
- } else if ((track->flags & GST_MIXER_TRACK_OUTPUT)) {
- return GST_MIXER_TRACK_MUTE;
- } else {
- GST_ERROR_OBJECT (track, "switch neither input nor output track!?");
- }
- return 0;
-}
-
gboolean
-gst_oss4_mixer_switch_set (GstOss4MixerSwitch * s, gboolean enabled)
+gst_oss4_mixer_switch_set (GstOss4MixerSwitch * s, gboolean disabled)
{
- GstMixerTrackFlags switch_flag;
GstMixerTrack *track;
int newval;
track = GST_MIXER_TRACK (s);
- switch_flag = gst_oss4_mixer_switch_get_switch_flag (track);
- newval = (enabled) ? 1 : 0;
+ newval = disabled ? GST_MIXER_TRACK_MUTE : 0;
- if (!!newval == !!(track->flags & switch_flag)) {
+ if (newval == (track->flags & GST_MIXER_TRACK_MUTE)) {
GST_LOG_OBJECT (s, "switch is already %d, doing nothing", newval);
return TRUE;
}
- if (!gst_oss4_mixer_set_control_val (s->mixer, s->mc, newval)) {
- GST_WARNING_OBJECT (s, "could not set switch to %d", newval);
+ if (!gst_oss4_mixer_set_control_val (s->mixer, s->mc, !disabled)) {
+ GST_WARNING_OBJECT (s, "could not set switch to %d", !disabled);
return FALSE;
}
- if (newval) {
- track->flags |= switch_flag;
+ if (disabled) {
+ track->flags |= GST_MIXER_TRACK_MUTE;
} else {
- track->flags &= ~switch_flag;
+ track->flags &= ~GST_MIXER_TRACK_MUTE;
}
GST_LOG_OBJECT (s, "set switch to %d", newval);
@@ -96,31 +81,28 @@ gst_oss4_mixer_switch_set (GstOss4MixerSwitch * s, gboolean enabled)
}
gboolean
-gst_oss4_mixer_switch_get (GstOss4MixerSwitch * s, gboolean * enabled)
+gst_oss4_mixer_switch_get (GstOss4MixerSwitch * s, gboolean * disabled)
{
- GstMixerTrackFlags switch_flag;
GstMixerTrack *track;
- int val = -1;
+ int flag;
+ int enabled = -1;
track = GST_MIXER_TRACK (s);
- switch_flag = gst_oss4_mixer_switch_get_switch_flag (track);
- if (!gst_oss4_mixer_get_control_val (s->mixer, s->mc, &val) || val < 0) {
+ if (!gst_oss4_mixer_get_control_val (s->mixer, s->mc, &enabled)
+ || (enabled < 0)) {
GST_WARNING_OBJECT (s, "could not get switch state");
return FALSE;
}
- *enabled = (val != 0);
+ flag = (enabled == 0) ? GST_MIXER_TRACK_MUTE : 0;
- if (!!val != !!(track->flags & switch_flag)) {
- GST_INFO_OBJECT (s, "updating inconsistent switch state to %d", !!val);
- if (*enabled) {
- track->flags |= switch_flag;
- } else {
- track->flags &= ~switch_flag;
- }
+ if (enabled) {
+ track->flags &= ~GST_MIXER_TRACK_MUTE;
+ } else {
+ track->flags |= GST_MIXER_TRACK_MUTE;
}
-
+ *disabled = (enabled == 0);
return TRUE;
}
@@ -149,6 +131,12 @@ gst_oss4_mixer_switch_new (GstOss4Mixer * mixer, GstOss4MixerControl * mc)
if (!gst_oss4_mixer_get_control_val (s->mixer, s->mc, &cur) || cur < 0)
return NULL;
+ if (cur) {
+ track->flags &= ~GST_MIXER_TRACK_MUTE;
+ } else {
+ track->flags |= GST_MIXER_TRACK_MUTE;
+ }
+
return track;
}
@@ -161,9 +149,5 @@ gst_oss4_mixer_switch_process_change_unlocked (GstMixerTrack * track)
if (!s->mc->changed)
return;
- if ((track->flags & GST_MIXER_TRACK_INPUT)) {
- gst_mixer_record_toggled (GST_MIXER (s->mixer), track, !!s->mc->last_val);
- } else {
- gst_mixer_mute_toggled (GST_MIXER (s->mixer), track, !!s->mc->last_val);
- }
+ gst_mixer_mute_toggled (GST_MIXER (s->mixer), track, !s->mc->last_val);
}
diff --git a/sys/oss4/oss4-mixer.c b/sys/oss4/oss4-mixer.c
index 031549b3..a67bb102 100644
--- a/sys/oss4/oss4-mixer.c
+++ b/sys/oss4/oss4-mixer.c
@@ -673,12 +673,12 @@ gst_oss4_mixer_set_control_val (GstOss4Mixer * mixer, GstOss4MixerControl * mc,
return TRUE;
}
+#if 0
static gchar *
gst_oss4_mixer_control_get_pretty_name (GstOss4MixerControl * mc)
{
gchar *name;
-#if 0
const gchar *name, *u;
/* "The id field is the original name given by the driver when it called
@@ -694,7 +694,6 @@ gst_oss4_mixer_control_get_pretty_name (GstOss4MixerControl * mc)
/* maybe capitalize the first letter? */
return g_ascii_strdown (name, -1);
-#endif
/* the .id thing doesn't really seem to work right, ie. for some sliders
* it's just '-' so you have to use the name of the parent control etc.
* let's not use it for now, much too painful. */
@@ -708,102 +707,119 @@ gst_oss4_mixer_control_get_pretty_name (GstOss4MixerControl * mc)
g_strdelimit (name, ".", ' ');
return name;
}
+#endif
-#if 0
-/* FIXME: translations for common option strings */
+/* these translations are a bit ad-hoc and horribly incomplete; it is not
+ * really going to work this way with all the different chipsets and drivers.
+ * We also use these for translating option values. */
static struct
{
const gchar oss_name[32];
const gchar *label;
-} option_labels[] = {
+} labels[] = {
{
- "Fast", N_("Fast")}, {
- "Low", N_("Low")}, {
- "Medium", N_("Medium")}, {
- "High", N_("High")}, {
- "High+", N_("Very high")}, {
- "Production", N_("Production")}, {
- "OFF", N_("Off")}, {
- "ON", N_("On")}, {
- "Stereo", N_("Stereo")}, {
- "Multich", N_("Surround sound")}, {
- "input-mix", N_("Input mix")}, {
+ "volume", N_("Volume")}, {
+ "master", N_("Master")}, {
"front", N_("Front")}, {
"rear", N_("Rear")}, {
+ "headphones", N_("Headphones")}, {
+ "center", N_("Center")}, {
+ "lfe", N_("LFE")}, {
+ "surround", N_("Surround")}, {
"side", N_("Side")}, {
- "center/LFE", N_("Center / LFE")}, {
+ "speaker", N_("Built-in Speaker")}, {
+ "aux1-out", N_("AUX 1 Out")}, {
+ "aux2-out", N_("AUX 2 Out")}, {
+ "aux-out", N_("AUX Out")}, {
+ "bass", N_("Bass")}, {
+ "treble", N_("Treble")}, {
+ "3d-depth", N_("3D Depth")}, {
+ "3d-center", N_("3D Center")}, {
+ "3d-enhance", N_("3D Enhance")}, {
+ "phone", N_("Telephone")}, {
"mic", N_("Microphone")}, {
- "fp-mic", N_("Front panel microphone")}, {
+ "line-out", N_("Line Out")}, {
+ "line-in", N_("Line In")}, {
+ "linein", N_("Line In")}, {
+ "cd", N_("Internal CD")}, {
+ "video", N_("Video In")}, {
+ "aux1-in", N_("AUX 1 In")}, {
+ "aux2-in", N_("AUX 2 In")}, {
+ "aux-in", N_("AUX In")}, {
+ "pcm", N_("PCM")}, {
+ "record-gain", N_("Record Gain")}, {
+ "igain", N_("Record Gain")}, {
+ "ogain", N_("Output Gain")}, {
+ "micboost", N_("Microphone Boost")}, {
+ "loopback", N_("Loopback")}, {
+ "diag", N_("Diagnostic")}, {
+ "loudness", N_("Bass Boost")}, {
+ "outputs", N_("Playback Ports")}, {
"input", N_("Input")}, {
- "linein", N_("Line-in")}, {
- "pcm1", N_("PCM 1")}, {
- "pcm2", N_("PCM 2")}, {
- "pcm3", N_("PCM 3")}, {
-"pcm4", N_("PCM 4")},};
-#endif
-
-/* these translations are a bit ad-hoc and horribly incomplete; it's not
- * really going to work this way with all the different chipsets and drivers */
-static struct
-{
- const gchar oss_name[32];
- const gchar *label;
-} labels[] = {
- /* connectors (e.g. hdaudio) */
- {
- "jack.green", N_("Green connector")}, {
- "jack.fp-green", N_("Green front panel connector")}, {
- "jack.pink", N_("Pink connector")}, {
- "jack.fp-pink", N_("Pink front panel connector")}, {
- "jack.blue", N_("Blue connector")}, {
- "jack.fp-blue", N_("Blue front panel connector")}, {
- "jack.orange", N_("Orange connector")}, {
- "jack.fp-orange", N_("Orange front panel connector")}, {
- "jack.black", N_("Black connector")}, {
- "jack.fp-black", N_("Black front panel connector")}, {
- "jack.gray", N_("Gray connector")}, {
- "jack.fp-gray", N_("Gray front panel connector")}, {
- "jack.white", N_("White connector")}, {
- "jack.fp-white", N_("White front panel connector")}, {
- "jack.red", N_("Red connector")}, {
- "jack.fp-red", N_("Red front panel connector")}, {
- "jack.yellow", N_("Yellow connector")}, {
- "jack.fp-yellow", N_("Yellow front panel connector")},
- /* connector functions (e.g. hdaudio) */
- {
- "jack.green.mode", N_("Green connector function")}, {
- "jack.fp-green.mode", N_("Green front panel connector function")}, {
- "jack.pink.mode", N_("Pink connector function")}, {
- "jack.fp-pink.mode", N_("Pink front panel connector function")}, {
- "jack.blue.mode", N_("Blue connector function")}, {
- "jack.fp-blue.mode", N_("Blue front panel connector function")}, {
- "jack.orange.mode", N_("Orange connector function")}, {
- "jack.fp-orange.mode", N_("Orange front panel connector function")}, {
- "jack.black.mode", N_("Black connector function")}, {
- "jack.fp-black.mode", N_("Black front panel connector function")}, {
- "jack.gray.mode", N_("Gray connector function")}, {
- "jack.fp-gray.mode", N_("Gray front panel connector function")}, {
- "jack.white.mode", N_("White connector function")}, {
- "jack.fp-white.mode", N_("White front panel connector function")}, {
- "jack.red.mode", N_("Red connector function")}, {
- "jack.fp-red.mode", N_("Red front panel connector function")}, {
- "jack.yellow.mode", N_("Yellow connector function")}, {
- "jack.fp-yellow.mode", N_("Yellow front panel connector function")},
- /* other */
- {
- "misc.mic", N_("Microphone")}, {
- "misc.fp-mic", N_("Front panel microphone")}, {
- "misc.linein", N_("Line-in")}, {
- "misc.fp-linein", N_("Front panel line-in")}, {
- "misc.headphone", N_("Headphones")}, {
- "misc.fp-headphone", N_("Front panel headphones")}, {
- "misc.front", N_("Front")}, {
- "misc.rear", N_("Rear")}, {
- "misc.side", N_("Side")}, {
- "misc.center/lfe", N_("Center / LFE")}, {
- "misc.pcm", N_("PCM")}, {
- "misc.input-mix", N_("Input mix")}
- /* FIXME translate Audigy NX USB labels) */
+ "inputs", N_("Record Source")}, {
+ "record-source", N_("Record Source")}, {
+ "monitor-source", N_("Monitor Source")}, {
+ "beep", N_("Keyboard Beep")}, {
+ "monitor-gain", N_("Monitor")}, {
+ "stereo-simulate", N_("Simulate Stereo")}, {
+ "stereo", N_("Stereo")}, {
+ "multich", N_("Surround Sound")}, {
+ "mic-gain", N_("Microphone Gain")}, {
+ "speaker-source", N_("Speaker Source")}, {
+ "mic-source", N_("Microphone Source")}, {
+ "jack", N_("Jack")}, {
+ "center/lfe", N_("Center / LFE")}, {
+ "stereo-mix", N_("Stereo Mix")}, {
+ "mono-mix", N_("Mono Mix")}, {
+ "input-mix", N_("Input Mix")}, {
+ "spdif-in", N_("SPDIF In")}, {
+ "spdif-out", N_("SPDIF Out")}, {
+ "mic1", N_("Microphone 1")}, {
+ "mic2", N_("Microphone 2")}, {
+ "digital-out", N_("Digital Out")}, {
+ "digital-in", N_("Digital In")}, {
+ "hdmi", N_("HDMI")}, {
+ "modem", N_("Modem")}, {
+ "handset", N_("Handset")}, {
+ "other", N_("Other")}, {
+ "stereo", N_("Stereo")}, {
+ "none", N_("None")}, {
+ "on", N_("On")}, {
+ "off", N_("Off")}, {
+ "mute", N_("Mute")}, {
+ "fast", N_("Fast")}, {
+ "very-low", N_("Very Low")}, {
+ "low", N_("Low")}, {
+ "medium", N_("Medium")}, {
+ "high", N_("High")}, {
+ "very-high", N_("Very High")}, {
+ "high+", N_("Very High")}, {
+ "production", N_("Production")}, {
+ "fp-mic", N_("Front Panel Microphone")}, {
+ "fp-linein", N_("Front Panel Line In")}, {
+ "fp-headphones", N_("Front Panel Headphones")}, {
+ "fp-lineout", N_("Front Panel Line Out")}, {
+ "green", N_("Green Connector")}, {
+ "pink", N_("Pink Connector")}, {
+ "blue", N_("Blue Connector")}, {
+ "white", N_("White Connector")}, {
+ "black", N_("Black Connector")}, {
+ "gray", N_("Gray Connector")}, {
+ "orange", N_("Orange Connector")}, {
+ "red", N_("Red Connector")}, {
+ "yellow", N_("Yellow Connector")}, {
+ "fp-green", N_("Green Front Panel Connector")}, {
+ "fp-pink", N_("Pink Front Panel Connector")}, {
+ "fp-blue", N_("Blue Front Panel Connector")}, {
+ "fp-white", N_("White Front Panel Connector")}, {
+ "fp-black", N_("Black Front Panel Connector")}, {
+ "fp-gray", N_("Gray Front Panel Connector")}, {
+ "fp-orange", N_("Orange Front Panel Connector")}, {
+ "fp-red", N_("Red Front Panel Connector")}, {
+ "fp-yellow", N_("Yellow Front Panel Connector")}, {
+ "spread", N_("Spread Output")}, {
+ "downmix", N_("Downmix")},
+ /* FIXME translate Audigy NX USB labels) */
/*
{ "rec.src", N_("Record Source") },
{ "output.mute", N_("Mute output") }
@@ -836,42 +852,88 @@ static struct
const gchar *
gst_oss4_mixer_control_get_translated_name (GstOss4MixerControl * mc)
{
- gchar name[33] = { 0, };
- char vmix_str[32] = { '\0', };
+ gchar name[128] = { 0, };
+ gchar scratch[128] = { 0, };
+ gchar fmtbuf[128] = { 0, };
+ gchar vmix_str[32] = { '\0', };
+ gchar *ptr;
int dummy, i;
+ int num = -1;
+
+ g_strlcpy (fmtbuf, "%s", sizeof (fmtbuf));
/* main virtual mixer controls (we hide the stream volumes) */
if (sscanf (mc->mixext.extname, "vmix%d-%32c", &dummy, vmix_str) == 2) {
if (strcmp (vmix_str, "src") == 0)
- return _("Virtual mixer input");
+ return _("Virtual Mixer Input");
else if (strcmp (vmix_str, "vol") == 0)
- return _("Virtual mixer output");
+ return _("Virtual Mixer Output");
else if (strcmp (vmix_str, "channels") == 0)
- return _("Virtual mixer channel configuration");
+ return _("Virtual Mixer Channels");
}
- /* munge connector.foo => jack.foo (change from 4.0 -> 4.1) */
- if (g_str_has_prefix (mc->mixext.extname, "connector.")) {
- g_snprintf (name, sizeof (name), "jack.%s", mc->mixext.extname + 10);
- } else {
- g_strlcpy (name, mc->mixext.extname, sizeof (name));
+ g_strlcpy (name, mc->mixext.extname, sizeof (name));
+
+ /* we deal with either "connector." or "jack." */
+ if ((g_str_has_prefix (name, "connector.")) ||
+ (g_str_has_prefix (name, "jack."))) {
+ ptr = strchr (mc->mixext.extname, '.');
+ ptr++;
+ g_strlcpy (scratch, ptr, sizeof (scratch));
+ g_strlcpy (name, scratch, sizeof (name));
}
- /* munge foo.function => foo.mode (change from 4.0 -> 4.1) */
- if (g_str_has_suffix (name, ".function"))
- memcpy (name + strlen (name) - strlen (".function"), ".mode", 5 + 1);
+ /* special handling for jack retasking suffixes */
+ if (g_str_has_suffix (name, ".function") || g_str_has_suffix (name, ".mode")) {
+ g_strlcpy (fmtbuf, _("%s Function"), sizeof (fmtbuf));
+ ptr = strrchr (name, '.');
+ *ptr = 0;
+ }
- /* chop off trailing numbers */
- while (strlen (name) > 0 && g_ascii_isdigit (name[strlen (name) - 1]))
- name[strlen (name) - 1] = '\0';
+ /* parse off trailing numbers */
+ i = strlen (name);
+ while ((i > 0) && (g_ascii_isdigit (name[i - 1]))) {
+ i--;
+ }
+ /* the check catches the case where the control name is just a number */
+ if ((i > 0) && (name[i] != '\0')) {
+ num = atoi (name + i);
+ name[i] = '\0';
+ /* format appends a number to the base, but preserves any surrounding
+ format */
+ g_snprintf (scratch, sizeof (scratch), fmtbuf, _("%s %d"));
+ g_strlcpy (fmtbuf, scratch, sizeof (fmtbuf));
+ }
+ /* look for a match, progressively skipping '.' delimited prefixes as we go */
+ ptr = name;
+ do {
+ if (*ptr == '.')
+ ptr++;
+ for (i = 0; i < G_N_ELEMENTS (labels); ++i) {
+ if (g_strcasecmp (ptr, labels[i].oss_name) == 0) {
+ g_snprintf (name, sizeof (name), fmtbuf, _(labels[i].label), num);
+ return g_quark_to_string (g_quark_from_string (name));
+ }
+ }
+ } while ((ptr = strchr (ptr, '.')) != NULL);
+
+ /* failing that, just replace periods with spaces */
+ g_strdelimit (name, ".", ' ');
+ g_snprintf (scratch, sizeof (scratch), fmtbuf, name);
+ return g_quark_to_string (g_quark_from_string (scratch)); /* eek */
+}
+
+static const gchar *
+gst_oss4_mixer_control_get_translated_option (const gchar * name)
+{
+ int i;
for (i = 0; i < G_N_ELEMENTS (labels); ++i) {
- if (strcmp (name, labels[i].oss_name) == 0)
+ if (g_strcasecmp (name, labels[i].oss_name) == 0) {
return _(labels[i].label);
+ }
}
-
- g_strdelimit (name, ".", ' ');
- return g_quark_to_string (g_quark_from_string (name)); /* eek */
+ return (name);
}
#ifndef GST_DISABLE_GST_DEBUG
@@ -1063,21 +1125,6 @@ gst_oss4_mixer_get_controls (GstOss4Mixer * mixer)
mixer_ext_flags_get_string (mix_ext.flags), mix_ext.flags);
GST_INFO (" parent : %d", mix_ext.parent);
- /* get tooltip (just for informational purposes for now) */
- if (MIXEXT_HAS_DESCRIPTION (mix_ext)) {
- oss_mixer_enuminfo desc = { 0, };
-
- desc.dev = mix_ext.dev;
- desc.ctrl = mix_ext.ctrl;
- if (ioctl (mixer->fd, SNDCTL_MIX_DESCRIPTION, &desc) >= 0) {
- /* "The string may contain multiple lines. The first line is the
- * 'tooltip'. Optional subsequent lines may contain more detailed
- * help text. Lines are separated by a linefeed character." */
- g_strdelimit (&desc.strings[desc.strindex[0]], "\n\r", '\0');
- GST_INFO (" tooltip: %s", &desc.strings[desc.strindex[0]]);
- }
- }
-
if (!MIXEXT_IS_ROOT (mix_ext)) {
/* find parent (we assume it comes in the list before the child) */
for (l = controls; l != NULL; l = l->next) {
@@ -1122,30 +1169,24 @@ static void
gst_oss4_mixer_controls_guess_master (GstOss4Mixer * mixer,
const GList * controls)
{
- GstOss4MixerControl *firstpcm_mc = NULL;
GstOss4MixerControl *master_mc = NULL;
const GList *l;
for (l = controls; l != NULL; l = l->next) {
GstOss4MixerControl *mc = (GstOss4MixerControl *) l->data;
- if (((mc->mixext.flags & MIXF_MAINVOL)) && master_mc == NULL) {
- GST_INFO_OBJECT (mixer, "Master control: %s", mc->mixext.extname);
- master_mc = mc;
- break;
- }
/* do we need to check if it's a slider type here? */
- if (((mc->mixext.flags & MIXF_PCMVOL)) && firstpcm_mc == NULL) {
+ if ((mc->mixext.flags & MIXF_PCMVOL)) {
GST_INFO_OBJECT (mixer, "First PCM control: %s", mc->mixext.extname);
- firstpcm_mc = mc;
+ master_mc = mc;
+ break;
}
- }
- /* if no control with MIXF_MAINVOL found, use first one with PCMVOL */
- if (master_mc == NULL && firstpcm_mc != NULL) {
- GST_INFO_OBJECT (mixer, "Marking first PCM control as master: %s",
- firstpcm_mc->mixext.extname);
- master_mc = firstpcm_mc;
+ if (((mc->mixext.flags & MIXF_MAINVOL)) && master_mc == NULL) {
+ GST_INFO_OBJECT (mixer, "First main volume control: %s",
+ mc->mixext.extname);
+ master_mc = mc;
+ }
}
if (master_mc != NULL)
@@ -1308,7 +1349,9 @@ gst_oss4_mixer_enum_control_update_enum_list (GstOss4Mixer * mixer,
mc->enum_vals = g_new0 (GQuark, mc->mixext.maxvalue + 1);
for (i = 0; i < mc->mixext.maxvalue; ++i) {
GST_LOG (" %s", ei.strings + ei.strindex[i]);
- mc->enum_vals[i] = g_quark_from_string (ei.strings + ei.strindex[i]);
+ mc->enum_vals[i] =
+ g_quark_from_string (gst_oss4_mixer_control_get_translated_option
+ (ei.strings + ei.strindex[i]));
}
}
@@ -1461,7 +1504,8 @@ gst_oss4_mixer_create_tracks (GstOss4Mixer * mixer, const GList * controls)
if (track == NULL)
continue;
- track->label = gst_oss4_mixer_control_get_pretty_name (mc);
+ /* The mixer API requires this to be g_strdup'd */
+ track->label = g_strdup (gst_oss4_mixer_control_get_translated_name (mc));
track->flags = 0;
GST_LOG ("translated label: %s [%s] = %s", track->label, mc->mixext.id,
@@ -1471,20 +1515,41 @@ gst_oss4_mixer_create_tracks (GstOss4Mixer * mixer, const GList * controls)
* esp. if a slider's role can be changed on the fly, like when you change
* function of a connector. What should we do in that case? Change the flag
* and make the app rebuild the interface? Ignore it? */
- if (g_str_has_prefix (mc->mixext.extname, "record.")) {
- mc->is_output = FALSE;
- mc->is_input = TRUE;
+ if (mc->mixext.flags & (MIXF_MAINVOL | MIXF_PCMVOL)) {
+ track->flags = GST_MIXER_TRACK_OUTPUT | GST_MIXER_TRACK_WHITELIST;
+
+ } else if (mc->mixext.flags & MIXF_RECVOL) {
+ /* record gain whitelisted by default */
+ track->flags = GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_NO_RECORD |
+ GST_MIXER_TRACK_WHITELIST;
+
+ } else if (mc->mixext.flags & MIXF_MONVOL) {
+ /* monitor sources not whitelisted by default */
+ track->flags = GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_NO_RECORD;
}
- /* FIXME: determine is_input and is_output */
- /* must be either INPUT or OUTPUT (but not both and not neither) for now,
- * or gnome-volume-control aborts */
- if (mc->is_input)
- track->flags |= GST_MIXER_TRACK_INPUT;
- else if (mc->is_output)
- track->flags |= GST_MIXER_TRACK_OUTPUT;
- else
+ /*
+ * The kernel may give us better clues about the scope of a control.
+ * If so, try to honor it.
+ */
+ switch (mc->mixext.desc & MIXEXT_SCOPE_MASK) {
+ case MIXEXT_SCOPE_INPUT:
+ case MIXEXT_SCOPE_RECSWITCH:
+ track->flags |= GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_NO_RECORD |
+ GST_MIXER_TRACK_WHITELIST;
+ break;
+ case MIXEXT_SCOPE_MONITOR:
+ /* don't whitelist monitor tracks by default */
+ track->flags |= GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_NO_RECORD;
+ break;
+ case MIXEXT_SCOPE_OUTPUT:
+ track->flags = GST_MIXER_TRACK_OUTPUT | GST_MIXER_TRACK_WHITELIST;
+ break;
+ }
+
+ if (mc->is_master) {
track->flags |= GST_MIXER_TRACK_OUTPUT;
+ }
if (mc->is_master)
track->flags |= GST_MIXER_TRACK_MASTER;
@@ -1597,6 +1662,10 @@ gst_oss4_mixer_get_volume (GstMixer * mixer, GstMixerTrack * track,
memset (volumes, 0, track->num_channels * sizeof (gint));
+ if (GST_IS_OSS4_MIXER_SWITCH (track)) {
+ gboolean enabled = FALSE;
+ gst_oss4_mixer_switch_get (GST_OSS4_MIXER_SWITCH (track), &enabled);
+ }
if (GST_IS_OSS4_MIXER_SLIDER (track)) {
gst_oss4_mixer_slider_get_volume (GST_OSS4_MIXER_SLIDER (track), volumes);
}
@@ -1649,11 +1718,7 @@ gst_oss4_mixer_set_mute (GstMixer * mixer, GstMixerTrack * track, gboolean mute)
if (GST_IS_OSS4_MIXER_SLIDER (track)) {
gst_oss4_mixer_slider_set_mute (GST_OSS4_MIXER_SLIDER (track), mute);
} else if (GST_IS_OSS4_MIXER_SWITCH (track)) {
- if ((track->flags & GST_MIXER_TRACK_OUTPUT)) {
- gst_oss4_mixer_switch_set (GST_OSS4_MIXER_SWITCH (track), mute);
- } else {
- GST_WARNING_OBJECT (track, "set_mute called on non-OUTPUT track");
- }
+ gst_oss4_mixer_switch_set (GST_OSS4_MIXER_SWITCH (track), mute);
}
GST_OBJECT_UNLOCK (oss);
@@ -1717,7 +1782,8 @@ gst_oss4_mixer_get_option (GstMixer * mixer, GstMixerOptions * options)
static GstMixerFlags
gst_oss4_mixer_get_mixer_flags (GstMixer * mixer)
{
- return GST_MIXER_FLAG_AUTO_NOTIFICATIONS;
+ return GST_MIXER_FLAG_AUTO_NOTIFICATIONS | GST_MIXER_FLAG_HAS_WHITELIST |
+ GST_MIXER_FLAG_GROUPING;
}
static void
diff --git a/sys/vdpau/gstvdpmpegdec.c b/sys/vdpau/gstvdpmpegdec.c
index 674146c4..c3fb324e 100644
--- a/sys/vdpau/gstvdpmpegdec.c
+++ b/sys/vdpau/gstvdpmpegdec.c
@@ -172,7 +172,8 @@ gst_vdp_mpeg_dec_set_caps (GstPad * pad, GstCaps * caps)
gboolean res;
const GValue *value;
- VdpDecoderProfile profile;
+ /* Default to MPEG1 until we find otherwise */
+ VdpDecoderProfile profile = VDP_DECODER_PROFILE_MPEG1;
GstVdpDevice *device;
VdpStatus status;
@@ -210,8 +211,6 @@ gst_vdp_mpeg_dec_set_caps (GstPad * pad, GstCaps * caps)
/* parse caps to setup decoder */
gst_structure_get_int (structure, "mpegversion", &mpeg_dec->version);
- if (mpeg_dec->version == 1)
- profile = VDP_DECODER_PROFILE_MPEG1;
value = gst_structure_get_value (structure, "codec_data");
if (value) {
diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am
index bf4f07ce..1aa99d1a 100644
--- a/tests/check/Makefile.am
+++ b/tests/check/Makefile.am
@@ -63,6 +63,13 @@ else
check_timidity=
endif
+if USE_KATE
+check_kate=elements/kate
+else
+check_kate=
+endif
+
+
VALGRIND_TO_FIX = \
elements/mpeg2enc \
elements/mplex
@@ -78,6 +85,7 @@ check_PROGRAMS = \
$(check_neon) \
$(check_ofa) \
$(check_timidity) \
+ $(check_kate) \
elements/aacparse \
elements/amrparse \
elements/camerabin \
@@ -119,4 +127,7 @@ elements_rtpbin_buffer_list_SOURCES = elements/rtpbin_buffer_list.c
elements_timidity_CFLAGS = $(GST_BASE_CFLAGS) $(AM_CFLAGS)
elements_timidity_LDADD = $(GST_BASE_LIBS) $(LDADD)
+elements_kate_CFLAGS = $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+elements_kate_LDADD = $(GST_BASE_LIBS) $(LDADD)
+
EXTRA_DIST = gst-plugins-bad.supp
diff --git a/tests/check/elements/.gitignore b/tests/check/elements/.gitignore
index 5f268d3b..df2bb15d 100644
--- a/tests/check/elements/.gitignore
+++ b/tests/check/elements/.gitignore
@@ -6,6 +6,7 @@ deinterleave
gdpdepay
gdppay
interleave
+kate
legacyresample
mpeg2enc
mplex
@@ -19,6 +20,7 @@ rganalysis
rglimiter
rgvolume
rtpbin
+rtpbin_buffer_list
selector
shapewipe
spectrum
diff --git a/tests/check/elements/kate.c b/tests/check/elements/kate.c
new file mode 100644
index 00000000..c848cc5c
--- /dev/null
+++ b/tests/check/elements/kate.c
@@ -0,0 +1,852 @@
+/* GStreamer
+ *
+ * unit test for kate
+ *
+ * Copyright (C) <2007> Stefan Kost <ensonic@users.sf.net>
+ * Copyright (C) <2008> ogg.k.ogg.k <ogg.k.ogg.k@googlemail.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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <unistd.h>
+
+#include <gst/check/gstcheck.h>
+#include <gst/base/gsttypefindhelper.h>
+
+
+static const guint8 kate_header_0x80[64] = {
+ 0x80, 0x6b, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x09, 0x00, 0x00, 0x00, 0x20, /* .kate...... ... */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, /* ................ */
+ 0x65, 0x6e, 0x5f, 0x47, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* en_GB........... */
+ 0x6e, 0x6f, 0x6e, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* none............ */
+};
+
+static const guint8 kate_header_0x81[53] = {
+ 0x81, 0x6b, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x6c, 0x69, 0x62, /* .kate........lib */
+ 0x6b, 0x61, 0x74, 0x65, 0x20, 0x30, 0x2e, 0x31, 0x2e, 0x30, 0x20, 0x28, 0x54, 0x69, 0x67, 0x65, /* kate 0.1.0 (Tige */
+ 0x72, 0x29, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x54, 0x49, 0x54, 0x4c, 0x45, 0x3d, /* r)........TITLE= */
+ 0x54, 0x69, 0x67, 0x65, 0x72, /* Tiger */
+};
+
+static const guint8 kate_header_0x8x[10] = {
+ 0x80, 0x6b, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x00
+};
+
+static const guint8 kate_header_0x88[11] = {
+ 0x88, 0x6b, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const guint8 kate_header_0x00[45] = {
+ 0x00, 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, /* ................ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x70, 0x6c, 0x61, /* .............pla */
+ 0x69, 0x6e, 0x20, 0x6f, 0x6c, 0x64, 0x20, 0x74, 0x65, 0x78, 0x74, 0x08, 0x00 /* in old text.. */
+};
+
+static const guint8 kate_header_0x01[1] = {
+ 0x01
+};
+
+static const guint8 kate_header_0x7f[1] = {
+ 0x7f
+};
+
+static const unsigned char kate_spu[] = {
+ 0x00, 0x1b, /* size */
+ 0x00, 0x06, /* commands at offset 6 */
+ 0x45, /* first line data - 2 pixels of colors 0 and 1 */
+ 0x76, /* first line data - 2 pixels of colors 3 and 2 */
+ 0x00, 0x00, /* timestamp */
+ 0x00, 0x06, /* link to next command sequence - points back to the current one to mark no more */
+ 0x06, 0x00, 0x04, 0x00, 0x05, /* pointers to data */
+ 0x05, 0x00, 0x30, 0x04, 0x00, 0x10, 0x02, /* area: 3x1 -> 4x2 */
+ 0x04, 0x0f, 0xff, /* alpha: color 0 transparent, all others opaque */
+ 0x01, /* show */
+ 0xff /* end */
+};
+
+/* A lot of these taken from the vorbisdec test */
+
+/* For ease of programming we use globals to keep refs for our floating
+ * src and sink pads we create; otherwise we always have to do get_pad,
+ * get_peer, and then remove references in every test function */
+static GstPad *mydecsrcpad, *mydecsinkpad;
+static GstPad *myencsrcpad, *myencsinkpad;
+static GstPad *myparsesrcpad, *myparsesinkpad;
+static GstPad *mytagsrcpad, *mytagsinkpad;
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static GstElement *
+setup_katedec (void)
+{
+ GstElement *katedec;
+
+ GST_DEBUG ("setup_katedec");
+ katedec = gst_check_setup_element ("katedec");
+ mydecsrcpad = gst_check_setup_src_pad (katedec, &srctemplate, NULL);
+ mydecsinkpad = gst_check_setup_sink_pad (katedec, &sinktemplate, NULL);
+ gst_pad_set_active (mydecsrcpad, TRUE);
+ gst_pad_set_active (mydecsinkpad, TRUE);
+
+ return katedec;
+}
+
+static void
+cleanup_katedec (GstElement * katedec)
+{
+ GST_DEBUG ("cleanup_katedec");
+ gst_element_set_state (katedec, GST_STATE_NULL);
+
+ gst_pad_set_active (mydecsrcpad, FALSE);
+ gst_pad_set_active (mydecsinkpad, FALSE);
+ gst_check_teardown_src_pad (katedec);
+ gst_check_teardown_sink_pad (katedec);
+ gst_check_teardown_element (katedec);
+}
+
+static GstElement *
+setup_kateenc (void)
+{
+ GstElement *kateenc;
+
+ GST_DEBUG ("setup_kateenc");
+ kateenc = gst_check_setup_element ("kateenc");
+ myencsrcpad = gst_check_setup_src_pad (kateenc, &srctemplate, NULL);
+ myencsinkpad = gst_check_setup_sink_pad (kateenc, &sinktemplate, NULL);
+ gst_pad_set_active (myencsrcpad, TRUE);
+ gst_pad_set_active (myencsinkpad, TRUE);
+
+ return kateenc;
+}
+
+static void
+cleanup_kateenc (GstElement * kateenc)
+{
+ GST_DEBUG ("cleanup_kateenc");
+ gst_element_set_state (kateenc, GST_STATE_NULL);
+
+ gst_pad_set_active (myencsrcpad, FALSE);
+ gst_pad_set_active (myencsinkpad, FALSE);
+ gst_check_teardown_src_pad (kateenc);
+ gst_check_teardown_sink_pad (kateenc);
+ gst_check_teardown_element (kateenc);
+}
+
+static GstElement *
+setup_kateparse (void)
+{
+ GstElement *kateparse;
+
+ GST_DEBUG ("setup_kateparse");
+ kateparse = gst_check_setup_element ("kateparse");
+ myparsesrcpad = gst_check_setup_src_pad (kateparse, &srctemplate, NULL);
+ myparsesinkpad = gst_check_setup_sink_pad (kateparse, &sinktemplate, NULL);
+ gst_pad_set_active (myparsesrcpad, TRUE);
+ gst_pad_set_active (myparsesinkpad, TRUE);
+
+ return kateparse;
+}
+
+static void
+cleanup_kateparse (GstElement * kateparse)
+{
+ GST_DEBUG ("cleanup_kateparse");
+ gst_element_set_state (kateparse, GST_STATE_NULL);
+
+ gst_pad_set_active (myparsesrcpad, FALSE);
+ gst_pad_set_active (myparsesinkpad, FALSE);
+ gst_check_teardown_src_pad (kateparse);
+ gst_check_teardown_sink_pad (kateparse);
+ gst_check_teardown_element (kateparse);
+}
+
+static GstElement *
+setup_katetag (void)
+{
+ GstElement *katetag;
+
+ GST_DEBUG ("setup_katetag");
+ katetag = gst_check_setup_element ("katetag");
+ mytagsrcpad = gst_check_setup_src_pad (katetag, &srctemplate, NULL);
+ mytagsinkpad = gst_check_setup_sink_pad (katetag, &sinktemplate, NULL);
+ gst_pad_set_active (mytagsrcpad, TRUE);
+ gst_pad_set_active (mytagsinkpad, TRUE);
+
+ return katetag;
+}
+
+static void
+cleanup_katetag (GstElement * katetag)
+{
+ GST_DEBUG ("cleanup_katetag");
+ gst_element_set_state (katetag, GST_STATE_NULL);
+
+ gst_pad_set_active (mytagsrcpad, FALSE);
+ gst_pad_set_active (mytagsinkpad, FALSE);
+ gst_check_teardown_src_pad (katetag);
+ gst_check_teardown_sink_pad (katetag);
+ gst_check_teardown_element (katetag);
+}
+
+static void
+check_buffers (guint expected, gboolean headers_in_caps)
+{
+ GstBuffer *outbuffer;
+ guint i, num_buffers;
+ const int num_headers = 9;
+ unsigned char packet_type;
+
+ /* check buffers are the type we expect */
+ num_buffers = g_list_length (buffers);
+ fail_unless (num_buffers >= num_headers + expected); /* at least 9 headers, plus a variable number of data packets */
+ for (i = 0; i < num_buffers; ++i) {
+ outbuffer = GST_BUFFER (buffers->data);
+ fail_if (outbuffer == NULL);
+ fail_if (GST_BUFFER_SIZE (outbuffer) == 0);
+
+ if (i < num_headers) {
+ /* different headers packets */
+ packet_type = (0x80 | i);
+ fail_unless (GST_BUFFER_DATA (outbuffer)[0] == packet_type);
+ /* headers could be in caps, so would have an extra ref */
+ } else if (i == num_buffers - 1) {
+ /* eos data packet */
+ packet_type = 0x7f;
+ fail_unless (GST_BUFFER_DATA (outbuffer)[0] == packet_type);
+ } else {
+ /* data packet */
+ packet_type = 0;
+ fail_unless (GST_BUFFER_DATA (outbuffer)[0] >= 0
+ && GST_BUFFER_DATA (outbuffer)[0] < 0x7f);
+ }
+
+ buffers = g_list_remove (buffers, outbuffer);
+
+ ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1);
+ gst_buffer_unref (outbuffer);
+ outbuffer = NULL;
+ }
+}
+
+GST_START_TEST (test_kate_typefind)
+{
+ GstTypeFindProbability prob;
+ const gchar *type;
+ GstBuffer *buf;
+ GstCaps *caps = NULL;
+
+ buf = gst_buffer_new ();
+ GST_BUFFER_DATA (buf) = (guint8 *) kate_header_0x80;
+ GST_BUFFER_SIZE (buf) = sizeof (kate_header_0x80);
+ GST_BUFFER_OFFSET (buf) = 0;
+
+ caps = gst_type_find_helper_for_buffer (NULL, buf, &prob);
+ fail_unless (caps != NULL);
+ GST_LOG ("Found type: %" GST_PTR_FORMAT, caps);
+
+ type = gst_structure_get_name (gst_caps_get_structure (caps, 0));
+ fail_unless_equals_string (type, "application/x-kate");
+ fail_unless (prob > GST_TYPE_FIND_MINIMUM && prob <= GST_TYPE_FIND_MAXIMUM);
+
+ gst_buffer_unref (buf);
+ gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_kate_empty_identification_header)
+{
+ GstElement *katedec;
+ GstBuffer *inbuffer;
+ GstBus *bus;
+
+ katedec = setup_katedec ();
+ bus = gst_bus_new ();
+
+ fail_unless (gst_element_set_state (katedec,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+
+ inbuffer = gst_buffer_new_and_alloc (0);
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+
+ /* set a bus here so we avoid getting state change messages */
+ gst_element_set_bus (katedec, bus);
+
+ fail_unless_equals_int (gst_pad_push (mydecsrcpad, inbuffer), GST_FLOW_ERROR);
+ /* ... but it ends up being collected on the global buffer list */
+ fail_unless_equals_int (g_list_length (buffers), 0);
+
+ gst_element_set_bus (katedec, NULL);
+
+ /* cleanup */
+ gst_object_unref (GST_OBJECT (bus));
+ cleanup_katedec (katedec);
+}
+
+GST_END_TEST;
+
+/* FIXME: also tests comment header */
+GST_START_TEST (test_kate_identification_header)
+{
+ GstElement *katedec;
+ GstBuffer *inbuffer;
+ GstBus *bus;
+ GstMessage *message;
+ GstTagList *tag_list;
+ gchar *language;
+ gchar *title;
+
+ katedec = setup_katedec ();
+ fail_unless (gst_element_set_state (katedec,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+ bus = gst_bus_new ();
+
+ inbuffer = gst_buffer_new_and_alloc (sizeof (kate_header_0x80));
+ memcpy (GST_BUFFER_DATA (inbuffer), kate_header_0x80,
+ sizeof (kate_header_0x80));
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+ gst_buffer_ref (inbuffer);
+
+ gst_element_set_bus (katedec, bus);
+ /* pushing gives away my reference ... */
+ fail_unless (gst_pad_push (mydecsrcpad, inbuffer) == GST_FLOW_OK);
+ /* ... and nothing ends up on the global buffer list */
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+ gst_buffer_unref (inbuffer);
+ fail_unless (g_list_length (buffers) == 0);
+
+ inbuffer = gst_buffer_new_and_alloc (sizeof (kate_header_0x81));
+ memcpy (GST_BUFFER_DATA (inbuffer), kate_header_0x81,
+ sizeof (kate_header_0x81));
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+ gst_buffer_ref (inbuffer);
+
+ /* pushing gives away my reference ... */
+ fail_unless (gst_pad_push (mydecsrcpad, inbuffer) == GST_FLOW_OK);
+ /* ... and nothing ends up on the global buffer list */
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+ gst_buffer_unref (inbuffer);
+ fail_unless (g_list_length (buffers) == 0);
+ /* there's a tag message waiting */
+ fail_if ((message = gst_bus_pop (bus)) == NULL);
+ gst_message_parse_tag (message, &tag_list);
+ fail_unless_equals_int (gst_tag_list_get_tag_size (tag_list,
+ GST_TAG_LANGUAGE_CODE), 1);
+ fail_unless (gst_tag_list_get_string (tag_list, GST_TAG_LANGUAGE_CODE,
+ &language));
+ fail_unless_equals_string (language, "en");
+ g_free (language);
+ fail_unless_equals_int (gst_tag_list_get_tag_size (tag_list, "title"), 1);
+ fail_unless (gst_tag_list_get_string (tag_list, GST_TAG_TITLE, &title));
+ fail_unless_equals_string (title, "Tiger");
+ g_free (title);
+ gst_tag_list_free (tag_list);
+ gst_message_unref (message);
+
+ /* cleanup */
+ gst_bus_set_flushing (bus, TRUE);
+ gst_element_set_bus (katedec, NULL);
+ gst_object_unref (GST_OBJECT (bus));
+ cleanup_katedec (katedec);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_kate_encode_nothing)
+{
+ GstElement *kateenc;
+
+ kateenc = setup_kateenc ();
+ fail_unless (gst_element_set_state (kateenc,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+
+ fail_unless (gst_pad_push_event (myencsrcpad, gst_event_new_eos ()) == TRUE);
+
+ fail_unless (gst_element_set_state (kateenc,
+ GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to ready");
+
+ /* cleanup */
+ cleanup_kateenc (kateenc);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_kate_encode_empty)
+{
+ GstElement *kateenc;
+ GstBuffer *inbuffer;
+ GstBus *bus;
+ GstCaps *caps;
+
+ kateenc = setup_kateenc ();
+ fail_unless (gst_element_set_state (kateenc,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+ bus = gst_bus_new ();
+
+ inbuffer = gst_buffer_new_and_alloc (0);
+ GST_BUFFER_TIMESTAMP (inbuffer) = GST_BUFFER_OFFSET (inbuffer) =
+ 1 * GST_SECOND;
+ GST_BUFFER_DURATION (inbuffer) = 5 * GST_SECOND;
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+
+ caps = gst_caps_from_string ("text/plain");
+ fail_unless (caps != NULL);
+ gst_buffer_set_caps (inbuffer, caps);
+ gst_caps_unref (caps);
+
+ gst_element_set_bus (kateenc, bus);
+ /* pushing gives away my reference ... */
+ fail_unless (gst_pad_push (myencsrcpad, inbuffer) == GST_FLOW_ERROR);
+
+ fail_unless (gst_pad_push_event (myencsrcpad, gst_event_new_eos ()) == TRUE);
+
+ fail_unless (gst_element_set_state (kateenc,
+ GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to ready");
+
+ gst_element_set_bus (kateenc, NULL);
+
+ /* cleanup */
+ gst_object_unref (GST_OBJECT (bus));
+ cleanup_kateenc (kateenc);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_kate_encode_simple)
+{
+ GstElement *kateenc;
+ GstBuffer *inbuffer;
+ GstBus *bus;
+ const gchar *test_string = "";
+ GstCaps *caps;
+
+ kateenc = setup_kateenc ();
+ fail_unless (gst_element_set_state (kateenc,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+ bus = gst_bus_new ();
+
+ inbuffer = gst_buffer_new_and_alloc (strlen (test_string) + 1);
+ memcpy (GST_BUFFER_DATA (inbuffer), test_string, strlen (test_string) + 1);
+ GST_BUFFER_TIMESTAMP (inbuffer) = GST_BUFFER_OFFSET (inbuffer) =
+ 1 * GST_SECOND;
+ GST_BUFFER_DURATION (inbuffer) = 5 * GST_SECOND;
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+ gst_buffer_ref (inbuffer);
+
+ caps = gst_caps_from_string ("text/plain");
+ fail_unless (caps != NULL);
+ gst_buffer_set_caps (inbuffer, caps);
+ gst_caps_unref (caps);
+
+ gst_element_set_bus (kateenc, bus);
+ /* pushing gives away my reference ... */
+ fail_unless (gst_pad_push (myencsrcpad, inbuffer) == GST_FLOW_OK);
+ /* ... and nothing ends up on the global buffer list */
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+ gst_buffer_unref (inbuffer);
+ fail_unless (gst_pad_push_event (myencsrcpad, gst_event_new_eos ()) == TRUE);
+
+ fail_unless (gst_element_set_state (kateenc,
+ GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to ready");
+
+ /* at least one data packet and one EOS packet should have been emitted */
+ check_buffers (1 + 1, FALSE);
+
+ /* cleanup */
+ gst_bus_set_flushing (bus, TRUE);
+ gst_element_set_bus (kateenc, NULL);
+ gst_object_unref (GST_OBJECT (bus));
+ cleanup_kateenc (kateenc);
+ g_list_free (buffers);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_kate_encode_spu)
+{
+ GstElement *kateenc;
+ GstBuffer *inbuffer;
+ GstBus *bus;
+ GstCaps *caps;
+
+ kateenc = setup_kateenc ();
+ fail_unless (gst_element_set_state (kateenc,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+ bus = gst_bus_new ();
+
+ inbuffer = gst_buffer_new_and_alloc (sizeof (kate_spu));
+ memcpy (GST_BUFFER_DATA (inbuffer), kate_spu, sizeof (kate_spu));
+ GST_BUFFER_TIMESTAMP (inbuffer) = GST_BUFFER_OFFSET (inbuffer) =
+ 1 * GST_SECOND;
+ GST_BUFFER_DURATION (inbuffer) = 5 * GST_SECOND;
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+ gst_buffer_ref (inbuffer);
+
+ caps = gst_caps_from_string ("video/x-dvd-subpicture");
+ fail_unless (caps != NULL);
+ gst_buffer_set_caps (inbuffer, caps);
+ gst_caps_unref (caps);
+
+ gst_element_set_bus (kateenc, bus);
+ /* pushing gives away my reference ... */
+ fail_unless_equals_int (gst_pad_push (myencsrcpad, inbuffer), GST_FLOW_OK);
+ /* ... and nothing ends up on the global buffer list */
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+ gst_buffer_unref (inbuffer);
+ fail_unless (gst_pad_push_event (myencsrcpad, gst_event_new_eos ()) == TRUE);
+
+ fail_unless (gst_element_set_state (kateenc,
+ GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to ready");
+
+ /* at least one data packet and one EOS packet should have been emitted */
+ check_buffers (2, FALSE);
+
+ /* cleanup */
+ gst_bus_set_flushing (bus, TRUE);
+ gst_element_set_bus (kateenc, NULL);
+ gst_object_unref (GST_OBJECT (bus));
+ cleanup_kateenc (kateenc);
+ g_list_free (buffers);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_kate_encode_keepalives)
+{
+ GstElement *kateenc;
+ GstBus *bus;
+ guint i, round;
+ enum
+ { n_keepalives = 1000 };
+ static const struct
+ {
+ gdouble keepalive_min_time;
+ gint packets;
+ } cfg[3] = {
+ {
+ 0.5, n_keepalives}, {
+ 2.0, n_keepalives / 2}, {
+ 5.0, n_keepalives / 5},};
+
+ for (round = 0; round < 3; ++round) {
+ kateenc = setup_kateenc ();
+ fail_unless (gst_element_set_state (kateenc,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+ bus = gst_bus_new ();
+
+ gst_element_set_bus (kateenc, bus);
+
+ g_object_set (kateenc, "keepalive-min-time", cfg[round].keepalive_min_time,
+ NULL);
+
+ /* the second one here should not emit a keepalive since the time since last packet
+ is less than the keepalive delay */
+ for (i = 1; i <= n_keepalives; ++i) {
+ gint64 t = i * GST_SECOND;
+ fail_unless (gst_pad_push_event (myencsrcpad,
+ gst_event_new_new_segment (TRUE, 1.0, GST_FORMAT_TIME, t, -1,
+ 0)) == TRUE);
+ }
+
+ fail_unless (gst_pad_push_event (myencsrcpad,
+ gst_event_new_eos ()) == TRUE);
+
+ fail_unless (gst_element_set_state (kateenc,
+ GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to ready");
+
+ /* at least a number data packet and an EOS packet should have been emitted */
+ check_buffers (cfg[round].packets + 1, FALSE);
+
+ /* cleanup */
+ gst_bus_set_flushing (bus, TRUE);
+ gst_element_set_bus (kateenc, NULL);
+ gst_object_unref (GST_OBJECT (bus));
+ cleanup_kateenc (kateenc);
+ g_list_free (buffers);
+ }
+}
+
+GST_END_TEST;
+
+static void
+test_kate_send_headers (GstPad * pad)
+{
+ GstBuffer *inbuffer;
+ GstCaps *caps;
+ int i;
+
+ caps = gst_caps_new_simple ("subtitle/x-kate", NULL);
+
+ /* push headers */
+ inbuffer = gst_buffer_new ();
+ gst_buffer_set_caps (inbuffer, caps);
+ GST_BUFFER_DATA (inbuffer) = (guint8 *) kate_header_0x80;
+ GST_BUFFER_SIZE (inbuffer) = sizeof (kate_header_0x80);
+ GST_BUFFER_OFFSET (inbuffer) = GST_BUFFER_OFFSET_END (inbuffer) = 0;
+ fail_unless_equals_int (gst_pad_push (pad, inbuffer), GST_FLOW_OK);
+
+ inbuffer = gst_buffer_new ();
+ gst_buffer_set_caps (inbuffer, caps);
+ GST_BUFFER_DATA (inbuffer) = (guint8 *) kate_header_0x81;
+ GST_BUFFER_SIZE (inbuffer) = sizeof (kate_header_0x81);
+ GST_BUFFER_OFFSET (inbuffer) = GST_BUFFER_OFFSET_END (inbuffer) = 0;
+ fail_unless_equals_int (gst_pad_push (pad, inbuffer), GST_FLOW_OK);
+
+ for (i = 2; i < 8; ++i) {
+ inbuffer = gst_buffer_new_and_alloc (sizeof (kate_header_0x8x));
+ gst_buffer_set_caps (inbuffer, caps);
+ memcpy (GST_BUFFER_DATA (inbuffer), (guint8 *) kate_header_0x8x,
+ sizeof (kate_header_0x8x));
+ GST_BUFFER_DATA (inbuffer)[0] = 0x80 | i;
+ GST_BUFFER_OFFSET (inbuffer) = GST_BUFFER_OFFSET_END (inbuffer) = 0;
+ fail_unless_equals_int (gst_pad_push (pad, inbuffer), GST_FLOW_OK);
+ }
+
+ inbuffer = gst_buffer_new ();
+ gst_buffer_set_caps (inbuffer, caps);
+ GST_BUFFER_DATA (inbuffer) = (guint8 *) kate_header_0x88;
+ GST_BUFFER_SIZE (inbuffer) = sizeof (kate_header_0x88);
+ GST_BUFFER_OFFSET (inbuffer) = GST_BUFFER_OFFSET_END (inbuffer) = 0;
+ fail_unless_equals_int (gst_pad_push (pad, inbuffer), GST_FLOW_OK);
+
+ gst_caps_unref (caps);
+}
+
+GST_START_TEST (test_kate_parse)
+{
+ GstElement *kateparse;
+ GstBuffer *inbuffer;
+ GstBus *bus;
+
+ kateparse = setup_kateparse ();
+ fail_unless (gst_element_set_state (kateparse,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+ bus = gst_bus_new ();
+
+ gst_element_set_bus (kateparse, bus);
+
+ test_kate_send_headers (myparsesrcpad);
+
+ /* push a text packet */
+ inbuffer = gst_buffer_new ();
+ GST_BUFFER_DATA (inbuffer) = (guint8 *) kate_header_0x00;
+ GST_BUFFER_SIZE (inbuffer) = sizeof (kate_header_0x00);
+ GST_BUFFER_TIMESTAMP (inbuffer) = GST_BUFFER_OFFSET (inbuffer) =
+ 1 * GST_SECOND;
+ GST_BUFFER_DURATION (inbuffer) = 5 * GST_SECOND;
+ GST_BUFFER_OFFSET_END (inbuffer) = (GST_BUFFER_TIMESTAMP (inbuffer) << 32); /* granpos */
+ fail_unless_equals_int (gst_pad_push (myparsesrcpad, inbuffer), GST_FLOW_OK);
+
+ /* push a eos packet */
+ inbuffer = gst_buffer_new ();
+ GST_BUFFER_DATA (inbuffer) = (guint8 *) kate_header_0x7f;
+ GST_BUFFER_SIZE (inbuffer) = sizeof (kate_header_0x7f);
+ GST_BUFFER_TIMESTAMP (inbuffer) = GST_BUFFER_OFFSET (inbuffer) =
+ 6 * GST_SECOND;
+ GST_BUFFER_DURATION (inbuffer) = 0;
+ GST_BUFFER_OFFSET_END (inbuffer) = (GST_BUFFER_TIMESTAMP (inbuffer) << 32); /* granpos */
+ fail_unless_equals_int (gst_pad_push (myparsesrcpad, inbuffer), GST_FLOW_OK);
+
+ /* signal eos */
+ fail_unless (gst_pad_push_event (myparsesrcpad,
+ gst_event_new_eos ()) == TRUE);
+
+ fail_unless (gst_element_set_state (kateparse,
+ GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to ready");
+
+ /* at least one data packet and one EOS packet should have been emitted */
+ check_buffers (2, TRUE);
+
+ /* cleanup */
+ gst_bus_set_flushing (bus, TRUE);
+ gst_element_set_bus (kateparse, NULL);
+ gst_object_unref (GST_OBJECT (bus));
+ cleanup_kateparse (kateparse);
+ g_list_free (buffers);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_kate_tag_passthrough)
+{
+ GstElement *katetag;
+ GstBus *bus;
+ GstBuffer *outbuffer;
+ GList *list;
+
+ katetag = setup_katetag ();
+ fail_unless (gst_element_set_state (katetag,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+ bus = gst_bus_new ();
+
+ gst_element_set_bus (katetag, bus);
+
+ test_kate_send_headers (mytagsrcpad);
+
+ /* signal eos */
+ fail_unless (gst_pad_push_event (mytagsrcpad, gst_event_new_eos ()) == TRUE);
+
+ fail_unless (gst_element_set_state (katetag,
+ GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to ready");
+
+ /* get the first buffer and check language/category */
+ fail_unless (g_list_length (buffers) >= 2); /* ID header, Vorbis comments header */
+ outbuffer = GST_BUFFER (buffers->data);
+ fail_if (outbuffer == NULL);
+
+ /* check identification header is unchanged */
+ list = g_list_nth (buffers, 0);
+ fail_unless (list != NULL);
+ outbuffer = list->data;
+ fail_unless_equals_int (GST_BUFFER_SIZE (outbuffer),
+ sizeof (kate_header_0x80));
+ fail_unless_equals_int (memcmp (GST_BUFFER_DATA (outbuffer), kate_header_0x80,
+ sizeof (kate_header_0x80)), 0);
+
+ /* check comment header is unchanged */
+ list = g_list_nth (buffers, 1);
+ fail_unless (list != NULL);
+ outbuffer = list->data;
+ fail_unless_equals_int (GST_BUFFER_SIZE (outbuffer),
+ sizeof (kate_header_0x81));
+ fail_unless_equals_int (memcmp (GST_BUFFER_DATA (outbuffer), kate_header_0x81,
+ sizeof (kate_header_0x81)), 0);
+
+ /* all headers should have been emitted, but no particular packets */
+ check_buffers (0, TRUE);
+
+ /* cleanup */
+ gst_bus_set_flushing (bus, TRUE);
+ gst_element_set_bus (katetag, NULL);
+ gst_object_unref (GST_OBJECT (bus));
+ cleanup_katetag (katetag);
+ g_list_free (buffers);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_kate_tag)
+{
+ GstElement *katetag;
+ GstBus *bus;
+ GstBuffer *outbuffer;
+
+ katetag = setup_katetag ();
+ fail_unless (gst_element_set_state (katetag,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+ bus = gst_bus_new ();
+
+ gst_element_set_bus (katetag, bus);
+
+ g_object_set (katetag, "language", "cy", NULL);
+ g_object_set (katetag, "category", "subtitles", NULL);
+
+ test_kate_send_headers (mytagsrcpad);
+
+ /* signal eos */
+ fail_unless (gst_pad_push_event (mytagsrcpad, gst_event_new_eos ()) == TRUE);
+
+ fail_unless (gst_element_set_state (katetag,
+ GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to ready");
+
+ /* get the first buffer and check language/category */
+ fail_unless (g_list_length (buffers) >= 1);
+ outbuffer = GST_BUFFER (buffers->data);
+ fail_if (outbuffer == NULL);
+ fail_if (GST_BUFFER_SIZE (outbuffer) != 64);
+ fail_if (strcmp ((const char *) GST_BUFFER_DATA (outbuffer) + 32, "cy"));
+ fail_if (strcmp ((const char *) GST_BUFFER_DATA (outbuffer) + 48,
+ "subtitles"));
+
+ /* all headers should have been emitted, but no particular packets */
+ check_buffers (0, TRUE);
+
+ /* cleanup */
+ gst_bus_set_flushing (bus, TRUE);
+ gst_element_set_bus (katetag, NULL);
+ gst_object_unref (GST_OBJECT (bus));
+ cleanup_katetag (katetag);
+ g_list_free (buffers);
+}
+
+GST_END_TEST;
+
+Suite *
+kate_suite (void)
+{
+ Suite *s = suite_create ("kate");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+
+#define X if (0)
+ tcase_add_test (tc_chain, test_kate_typefind);
+ tcase_add_test (tc_chain, test_kate_empty_identification_header);
+ tcase_add_test (tc_chain, test_kate_identification_header);
+ tcase_add_test (tc_chain, test_kate_encode_nothing);
+ tcase_add_test (tc_chain, test_kate_encode_empty);
+ tcase_add_test (tc_chain, test_kate_encode_simple);
+ tcase_add_test (tc_chain, test_kate_encode_spu);
+ tcase_add_test (tc_chain, test_kate_encode_keepalives);
+ tcase_add_test (tc_chain, test_kate_parse);
+ tcase_add_test (tc_chain, test_kate_tag_passthrough);
+ tcase_add_test (tc_chain, test_kate_tag);
+#undef X
+
+ return s;
+}
+
+int
+main (int argc, char **argv)
+{
+ int nf;
+
+ Suite *s = kate_suite ();
+ SRunner *sr = srunner_create (s);
+
+ gst_check_init (&argc, &argv);
+
+ srunner_run_all (sr, CK_NORMAL);
+ nf = srunner_ntests_failed (sr);
+ srunner_free (sr);
+
+ return nf;
+}
diff --git a/tests/examples/camerabin/gst-camera-perf.c b/tests/examples/camerabin/gst-camera-perf.c
index 858e60cd..8aa62e9c 100644
--- a/tests/examples/camerabin/gst-camera-perf.c
+++ b/tests/examples/camerabin/gst-camera-perf.c
@@ -32,14 +32,12 @@
* gcc `pkg-config --cflags --libs gstreamer-0.10` gst-camera-perf.c -ogst-camera-perf
*
* plain linux:
- * ./gst-camera-perf --src-colorspace=YUY2 --image-width=320 --image-height=240 --view-framerate-num=15 --view-framerate-den=1
+ * ./gst-camera-perf --src-colorspace=YUY2 --image-width=640 --image-height=480 --video-width=640 --video-height=480 --view-framerate-num=15 --view-framerate-den=1
*
* maemo:
- * ./gst-camera-perf --src-colorspace=UYVY --image-width=640 --image-height=480 --view-framerate-num=1491 --view-framerate-den=100 --video-src=v4l2camsrc --audio-enc=nokiaaacenc --video-enc=omx_mpeg4enc --video-mux=hantromp4mux
- * ./gst-camera-perf --src-colorspace=UYVY --image-width=640 --image-height=480 --view-framerate-num=2999 --view-framerate-den=100 --video-src=v4l2camsrc --audio-enc=nokiaaacenc --video-enc=omx_mpeg4enc --video-mux=hantromp4mux
- * ./gst-camera-perf --src-colorspace=UYVY --image-width=2592 --image-height=1968 --view-framerate-num=399 --view-framerate-den=100 --video-src=v4l2camsrc --audio-enc=nokiaaacenc --video-enc=omx_mpeg4enc --video-mux=hantromp4mux
- * ./gst-camera-perf --src-colorspace=UYVY --image-width=2592 --image-height=1968 --view-framerate-num=325 --view-framerate-den=25 --video-src=v4l2camsrc --audio-enc=nokiaaacenc --video-enc=omx_mpeg4enc --video-mux=hantromp4mux --image-enc=dspjpegenc
- * ./gst-camera-perf --src-colorspace=UYVY --image-width=640 --image-height=480 --view-framerate-num=1491 --view-framerate-den=100 --video-src=v4l2camsrc --audio-enc=nokiaaacenc --video-enc=omx_mpeg4enc --video-mux=hantromp4mux --target-times=1000,0,1500,0,0,0,0,1000,0
+ * ./gst-camera-perf --src-colorspace=UYVY --image-width=640 --image-height=480 --video-width=640 --video-height=480 --view-framerate-num=1491 --view-framerate-den=100 --video-src=v4l2camsrc --audio-enc=nokiaaacenc --video-enc=dspmpeg4enc --video-mux=hantromp4mux --image-enc=dspjpegenc --target-times=1000,1500,1500,2000,500,2000,3500,1000,1000
+ * ./gst-camera-perf --src-colorspace=UYVY --image-width=2576 --image-height=1936 --video-width=640 --video-height=480 --view-framerate-num=2999 --view-framerate-den=100 --video-src=v4l2camsrc --audio-enc=nokiaaacenc --video-enc=dspmpeg4enc --video-mux=hantromp4mux
+ * ./gst-camera-perf --src-colorspace=UYVY --image-width=2576 --image-height=1936 --video-width=640 --video-height=480 --view-framerate-num=126 --view-framerate-den=5 --video-src=v4l2camsrc --audio-enc=nokiaaacenc --video-enc=dspmpeg4enc --video-mux=hantromp4mux --image-enc=dspjpegenc
*/
/*
@@ -49,10 +47,24 @@
# include "config.h"
#endif
+/* save the snapshot images
+ * gcc `pkg-config --cflags --libs gstreamer-0.10 gdk-pixbuf-2.0` gst-camera-perf.c -ogst-camera-perf
+ *
+#define SAVE_SNAPSHOT 1
+ **/
#include <gst/gst.h>
+#ifdef SAVE_SNAPSHOT
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#endif
#include <string.h>
#include <sys/time.h>
#include <time.h>
+/*
+ * debug logging
+ */
+GST_DEBUG_CATEGORY_STATIC (camera_perf);
+#define GST_CAT_DEFAULT camera_perf
+
/*
* enums, typedefs and defines
@@ -61,7 +73,7 @@
#define GET_TIME(t) \
do { \
t = gst_util_get_timestamp (); \
- GST_INFO("%2d ----------------------------------------", test_ix); \
+ GST_DEBUG("%2d ----------------------------------------", test_ix); \
} while(0)
#define DIFF_TIME(e,s,d) d=GST_CLOCK_DIFF(s,e)
@@ -93,6 +105,8 @@ static gchar *videomux_name = NULL;
static gchar *src_csp = NULL;
static gint image_width = 0;
static gint image_height = 0;
+static gint video_width = 0;
+static gint video_height = 0;
static gint view_framerate_num = 0;
static gint view_framerate_den = 0;
@@ -102,10 +116,16 @@ static guint32 num_pics = 0;
static guint32 num_pics_cont = 0;
//static guint32 num_vids = 0;
static guint test_ix = 0;
-static gboolean signal_sink = FALSE;
+static gboolean signal_vf_sink = FALSE;
+static gboolean signal_vid_sink = FALSE;
+static gboolean signal_img_enc = FALSE;
static gboolean signal_shot = FALSE;
static gboolean signal_cont = FALSE;
+static gboolean need_pad_probe = FALSE;
+static gboolean need_ienc_pad_probe = FALSE;
+static gboolean need_vmux_pad_probe = FALSE;
+
static gboolean have_img_captured = FALSE;
static gboolean have_img_done = FALSE;
@@ -113,6 +133,7 @@ static gboolean have_img_done = FALSE;
static GstClockTime t_initial = G_GUINT64_CONSTANT (0);
static GstClockTime t_final[CONT_SHOTS] = { G_GUINT64_CONSTANT (0), };
+static GstClockTime test_06_taget, test_09_taget;
static GstClockTimeDiff diff;
static ResultType result;
@@ -135,10 +156,10 @@ static const gchar *test_names[TEST_CASES] = {
"Shot to snapshot",
"Shot to shot",
"Serial shooting",
- "(Shutter lag)",
+ "Shutter lag",
"Image saved",
"Mode change",
- "(Video recording)" /* time to get videobin to PLAYING? or first buffer reaching filesink? */
+ "Video recording"
};
/*
@@ -147,28 +168,91 @@ static const gchar *test_names[TEST_CASES] = {
static void print_result (void);
static gboolean run_test (gpointer user_data);
+static gboolean setup_add_pad_probe (GstElement * elem, const gchar * pad_name,
+ GCallback handler, gpointer data);
+
/*
* Callbacks
*/
static gboolean
-img_sink_has_buffer (GstPad * pad, GstBuffer * buf, gpointer user_data)
+pad_has_buffer (GstPad * pad, GstBuffer * buf, gpointer user_data)
{
- if (signal_sink) {
- signal_sink = FALSE;
+ gboolean *signal_sink = (gboolean *) user_data;
+ gboolean print_and_restart = FALSE;
+
+ if (*signal_sink) {
+ *signal_sink = FALSE;
GET_TIME (t_final[0]);
+ GST_DEBUG_OBJECT (pad, "%2d pad has buffer", test_ix);
+ switch (test_ix) {
+ case 5: // shutter lag
+ DIFF_TIME (t_final[num_pics_cont], t_initial, diff);
+ result.avg = result.min = result.max = diff;
+ print_and_restart = TRUE;
+ break;
+ case 8: // video recording start
+ DIFF_TIME (t_final[num_pics_cont], t_initial, diff);
+ result.avg = result.min = result.max = diff;
+ //g_signal_emit_by_name (camera_bin, "user-stop", 0);
+ print_and_restart = TRUE;
+ break;
+ default:
+ GST_WARNING_OBJECT (pad, "%2d pad has buffer, not handled", test_ix);
+ break;
+ }
+ }
+ if (print_and_restart) {
+ print_result ();
+ g_idle_add ((GSourceFunc) run_test, NULL);
}
return TRUE;
}
+static void
+element_added (GstBin * bin, GstElement * element, gpointer user_data)
+{
+ GstElement *elem;
+
+ if (GST_IS_BIN (element)) {
+ g_signal_connect (element, "element-added", (GCallback) element_added,
+ NULL);
+ }
+
+ if (need_vmux_pad_probe) {
+ g_object_get (camera_bin, "videomux", &elem, NULL);
+ if (elem) {
+ need_vmux_pad_probe = FALSE;
+ GST_INFO_OBJECT (elem, "got default video muxer");
+ if (setup_add_pad_probe (elem, "src", (GCallback) pad_has_buffer,
+ &signal_vid_sink)) {
+ /* enable test */
+ target[8] = test_09_taget;
+ }
+ }
+ }
+ if (need_ienc_pad_probe) {
+ g_object_get (camera_bin, "imageenc", &elem, NULL);
+ if (elem) {
+ need_ienc_pad_probe = FALSE;
+ GST_INFO_OBJECT (elem, "got default image encoder");
+ if (setup_add_pad_probe (elem, "src", (GCallback) pad_has_buffer,
+ &signal_img_enc)) {
+ /* enable test */
+ target[5] = test_06_taget;
+ }
+ }
+ }
+}
+
static gboolean
img_capture_done (GstElement * camera, GString * fname, gpointer user_data)
{
gboolean ret = FALSE;
gboolean print_and_restart = FALSE;
- GST_INFO ("shot %d, cont %d, num %d", signal_shot, signal_cont,
+ GST_DEBUG ("shot %d, cont %d, num %d", signal_shot, signal_cont,
num_pics_cont);
if (signal_shot) {
@@ -181,7 +265,7 @@ img_capture_done (GstElement * camera, GString * fname, gpointer user_data)
print_and_restart = TRUE;
break;
}
- GST_INFO ("%2d shot done", test_ix);
+ GST_DEBUG ("%2d shot done", test_ix);
}
if (signal_cont) {
@@ -198,7 +282,7 @@ img_capture_done (GstElement * camera, GString * fname, gpointer user_data)
}
snprintf (tmp, 6, "_%04d", num_pics_cont);
memcpy (filename->str + i, tmp, 5);
- GST_INFO ("%2d cont new filename '%s'", test_ix, filename->str);
+ GST_DEBUG ("%2d cont new filename '%s'", test_ix, filename->str);
g_object_set (camera_bin, "filename", filename->str, NULL);
// FIXME: is burst capture broken? new filename and return TRUE should be enough
// as a workaround we will kick next image from here
@@ -244,7 +328,7 @@ img_capture_done (GstElement * camera, GString * fname, gpointer user_data)
result.min = min;
result.max = max;
print_and_restart = TRUE;
- GST_INFO ("%2d cont done", test_ix);
+ GST_DEBUG ("%2d cont done", test_ix);
}
}
@@ -286,33 +370,40 @@ bus_callback (GstBus * bus, GstMessage * message, gpointer data)
break;
}
case GST_MESSAGE_STATE_CHANGED:
- if (GST_MESSAGE_SRC (message) == GST_OBJECT (camera_bin)) {
+ if (GST_IS_BIN (GST_MESSAGE_SRC (message))) {
GstState oldstate, newstate;
gst_message_parse_state_changed (message, &oldstate, &newstate, NULL);
- GST_INFO ("state-changed: %s -> %s",
+ GST_DEBUG_OBJECT (GST_MESSAGE_SRC (message), "state-changed: %s -> %s",
gst_element_state_get_name (oldstate),
gst_element_state_get_name (newstate));
- if (GST_STATE_TRANSITION (oldstate,
- newstate) == GST_STATE_CHANGE_PAUSED_TO_PLAYING) {
- GET_TIME (t_final[0]);
- DIFF_TIME (t_final[0], t_initial, diff);
-
- result.avg = result.min = result.max = diff;
- print_result ();
- g_idle_add ((GSourceFunc) run_test, NULL);
+ if (GST_MESSAGE_SRC (message) == GST_OBJECT (camera_bin)) {
+ if (GST_STATE_TRANSITION (oldstate,
+ newstate) == GST_STATE_CHANGE_PAUSED_TO_PLAYING) {
+ switch (test_ix) {
+ case 0: // camera on
+ GET_TIME (t_final[0]);
+ DIFF_TIME (t_final[0], t_initial, diff);
+
+ result.avg = result.min = result.max = diff;
+ print_result ();
+ g_idle_add ((GSourceFunc) run_test, NULL);
+ break;
+ }
+ }
}
}
break;
case GST_MESSAGE_EOS:
/* end-of-stream */
+ GST_INFO ("got eos() - should not happen");
g_main_loop_quit (loop);
break;
default:
st = gst_message_get_structure (message);
if (st) {
if (gst_structure_has_name (st, "image-captured")) {
- GST_INFO ("%2d image-captured", test_ix);
+ GST_DEBUG ("%2d image-captured", test_ix);
switch (test_ix) {
case 3:
GET_TIME (t_final[num_pics_cont]);
@@ -330,14 +421,41 @@ bus_callback (GstBus * bus, GstMessage * message, gpointer data)
break;
}
} else if (gst_structure_has_name (st, "preview-image")) {
- GST_INFO ("%2d preview-image", test_ix);
+ GST_DEBUG ("%2d preview-image", test_ix);
switch (test_ix) {
case 2:
GET_TIME (t_final[num_pics_cont]);
DIFF_TIME (t_final[num_pics_cont], t_initial, diff);
result.avg = result.min = result.max = diff;
+ /* turn off preview image generation again */
+ g_object_set (camera_bin, "preview-caps", NULL, NULL);
break;
}
+#ifdef SAVE_SNAPSHOT
+ {
+ const GValue *value = gst_structure_get_value (st, "buffer");
+ GstBuffer *buf = gst_value_get_buffer (value);
+ GstCaps *caps = GST_BUFFER_CAPS (buf);
+ GstStructure *buf_st = gst_caps_get_structure (caps, 0);
+ gint width, height, rowstride;
+ GdkPixbuf *pixbuf;
+ guchar *data;
+
+ GST_INFO ("preview : buf=%p, size=%d, format=%" GST_PTR_FORMAT,
+ buf, GST_BUFFER_SIZE (buf), caps);
+
+ data = GST_BUFFER_DATA (buff);
+ gst_structure_get_int (buf_st, "width", &width);
+ gst_structure_get_int (buf_st, "height", &height);
+ rowstride = GST_ROUND_UP_4 (width * 3);
+
+ pixbuf = gdk_pixbuf_new_from_data (data, GDK_COLORSPACE_RGB, FALSE,
+ 8, width, height, rowstride, NULL, NULL);
+ gdk_pixbuf_save (pixbuf, "/tmp/gst-camerabin-preview.png", "png",
+ NULL, NULL);
+ gdk_pixbuf_unref (pixbuf);
+ }
+#endif
}
}
/* unhandled message */
@@ -363,52 +481,43 @@ cleanup_pipeline (void)
}
static gboolean
-setup_pipeline_video_sink (void)
+setup_add_pad_probe (GstElement * elem, const gchar * pad_name,
+ GCallback handler, gpointer data)
{
- GstElement *sink = NULL;
GstPad *pad = NULL;
- sink = gst_element_factory_make ("fakesink", NULL);
- if (NULL == sink) {
- g_warning ("failed to create sink\n");
- goto error;
- }
-
- pad = gst_element_get_static_pad (sink, "sink");
- if (NULL == pad) {
- g_warning ("sink has no pad named 'sink'\n");
- goto error;
+ if (!(pad = gst_element_get_static_pad (elem, pad_name))) {
+ GST_WARNING ("sink has no pad named '%s'", pad_name);
+ return FALSE;
}
- g_object_set (sink, "sync", TRUE, NULL);
- gst_pad_add_buffer_probe (pad, (GCallback) img_sink_has_buffer, NULL);
+ gst_pad_add_buffer_probe (pad, (GCallback) handler, data);
gst_object_unref (pad);
- g_object_set (camera_bin, "vfsink", sink, NULL);
-
return TRUE;
-error:
- if (sink)
- gst_object_unref (sink);
- return FALSE;
}
static gboolean
-setup_pipeline_element (const gchar * property_name, const gchar * element_name)
+setup_pipeline_element (const gchar * property_name, const gchar * element_name,
+ GstElement ** res_elem)
{
gboolean res = TRUE;
+ GstElement *elem = NULL;
- GstElement *elem;
if (element_name) {
elem = gst_element_factory_make (element_name, NULL);
if (elem) {
g_object_set (camera_bin, property_name, elem, NULL);
} else {
- g_warning ("can't create element '%s' for property '%s'", element_name,
+ GST_WARNING ("can't create element '%s' for property '%s'", element_name,
property_name);
res = FALSE;
}
+ } else {
+ GST_DEBUG ("no element for property '%s' given", property_name);
}
+ if (res_elem)
+ *res_elem = elem;
return res;
}
@@ -417,6 +526,7 @@ setup_pipeline (void)
{
GstBus *bus;
gboolean res = TRUE;
+ GstElement *vmux, *ienc, *sink;
g_string_printf (filename, "test_%04u.jpg", num_pics);
@@ -432,11 +542,24 @@ setup_pipeline (void)
gst_bus_add_watch (bus, bus_callback, NULL);
gst_object_unref (bus);
- if (!setup_pipeline_video_sink ()) {
+ GST_INFO_OBJECT (camera_bin, "camerabin created");
+
+ /* configure used elements */
+ res &= setup_pipeline_element ("vfsink", "fakesink", &sink);
+ res &= setup_pipeline_element ("audiosrc", audiosrc_name, NULL);
+ res &= setup_pipeline_element ("videosrc", videosrc_name, NULL);
+ res &= setup_pipeline_element ("audioenc", audioenc_name, NULL);
+ res &= setup_pipeline_element ("videoenc", videoenc_name, NULL);
+ res &= setup_pipeline_element ("imageenc", imageenc_name, &ienc);
+ res &= setup_pipeline_element ("videomux", videomux_name, &vmux);
+ if (!res) {
goto error;
}
+ GST_INFO_OBJECT (camera_bin, "elements created");
+
/* set properties */
+ g_object_set (camera_bin, "filename", filename->str, NULL);
if (src_csp && strlen (src_csp) == 4) {
GstCaps *filter_caps;
@@ -446,8 +569,7 @@ setup_pipeline (void)
"format", GST_TYPE_FOURCC,
GST_MAKE_FOURCC (src_csp[0], src_csp[1], src_csp[2], src_csp[3]), NULL);
if (filter_caps) {
- g_object_set (camera_bin, "filename", filename->str,
- "filter-caps", filter_caps, NULL);
+ g_object_set (camera_bin, "filter-caps", filter_caps, NULL);
gst_caps_unref (filter_caps);
} else {
g_warning ("can't make filter-caps with format=%s\n", src_csp);
@@ -455,21 +577,61 @@ setup_pipeline (void)
}
}
- /* configure used elements */
- res &= setup_pipeline_element ("audiosrc", audiosrc_name);
- res &= setup_pipeline_element ("videosrc", videosrc_name);
- res &= setup_pipeline_element ("audioenc", audioenc_name);
- res &= setup_pipeline_element ("videoenc", videoenc_name);
- res &= setup_pipeline_element ("imageenc", imageenc_name);
- res &= setup_pipeline_element ("videomux", videomux_name);
- if (!res) {
+ g_object_set (sink, "sync", TRUE, NULL);
+
+ GST_INFO_OBJECT (camera_bin, "elements configured");
+
+ /* connect signal handlers */
+ g_assert (sink);
+ if (!setup_add_pad_probe (sink, "sink", (GCallback) pad_has_buffer,
+ &signal_vf_sink)) {
goto error;
}
+ if (!vmux) {
+ g_object_get (camera_bin, "videomux", &vmux, NULL);
+ if (!vmux) {
+ need_pad_probe = need_vmux_pad_probe = TRUE;
+ /* only run the test if we later get the element */
+ test_09_taget = target[8];
+ target[8] = G_GUINT64_CONSTANT (0);
+ }
+ }
+ if (vmux) {
+ if (!setup_add_pad_probe (vmux, "src", (GCallback) pad_has_buffer,
+ &signal_vid_sink)) {
+ goto error;
+ }
+ }
+ if (!ienc) {
+ g_object_get (camera_bin, "imageenc", &ienc, NULL);
+ if (!ienc) {
+ need_pad_probe = need_ienc_pad_probe = TRUE;
+ /* only run the test if we later get the element */
+ test_06_taget = target[5];
+ target[5] = G_GUINT64_CONSTANT (0);
+ }
+ }
+ if (ienc) {
+ if (!setup_add_pad_probe (ienc, "src", (GCallback) pad_has_buffer,
+ &signal_img_enc)) {
+ goto error;
+ }
+ }
+ if (need_pad_probe) {
+ g_signal_connect (camera_bin, "element-added", (GCallback) element_added,
+ NULL);
+ }
+ GST_INFO_OBJECT (camera_bin, "probe signals connected");
- /* configure a resolution and framerate */
- if (image_width && image_height && view_framerate_num && view_framerate_den) {
- g_signal_emit_by_name (camera_bin, "user-res-fps", image_width,
- image_height, view_framerate_num, view_framerate_den, NULL);
+ /* configure a resolution and framerate for video and viewfinder */
+ if (image_width && image_height) {
+ g_signal_emit_by_name (camera_bin, "user-image-res", image_width,
+ image_height, NULL);
+ }
+ /* configure a resolution and framerate for video and viewfinder */
+ if (video_width && video_height && view_framerate_num && view_framerate_den) {
+ g_signal_emit_by_name (camera_bin, "user-res-fps", video_width,
+ video_height, view_framerate_num, view_framerate_den, NULL);
}
if (GST_STATE_CHANGE_FAILURE ==
@@ -477,13 +639,14 @@ setup_pipeline (void)
g_warning ("can't set camerabin to ready\n");
goto error;
}
+ GST_INFO_OBJECT (camera_bin, "camera ready");
if (GST_STATE_CHANGE_FAILURE ==
gst_element_set_state (camera_bin, GST_STATE_PLAYING)) {
g_warning ("can't set camerabin to playing\n");
goto error;
}
- GST_INFO_OBJECT (camera_bin, "created and started");
+ GST_INFO_OBJECT (camera_bin, "camera started");
return TRUE;
error:
cleanup_pipeline ();
@@ -508,10 +671,6 @@ test_01 (void)
GET_TIME (t_initial);
if (setup_pipeline ()) {
- /* MAKE SURE THE PIPELINE IS IN PLAYING STATE BEFORE START TAKING PICTURES
- AND SO ON (otherwise it will deadlock) */
-
- //gst_element_get_state (camera_bin, NULL, NULL, GST_CLOCK_TIME_NONE);
/* the actual results are fetched in bus_callback::state-changed */
res = FALSE;
} else {
@@ -541,6 +700,9 @@ test_03 (void)
g_object_set (camera_bin, "preview-caps", snap_caps, NULL);
gst_caps_unref (snap_caps);
+ /* switch to image mode */
+ g_object_set (camera_bin, "mode", 0, NULL);
+ g_object_set (camera_bin, "filename", filename->str, NULL);
GET_TIME (t_initial);
g_signal_emit_by_name (camera_bin, "user-start", 0);
@@ -556,6 +718,8 @@ test_03 (void)
static gboolean
test_04 (void)
{
+ /* switch to image mode */
+ g_object_set (camera_bin, "mode", 0, NULL);
GET_TIME (t_initial);
g_signal_emit_by_name (camera_bin, "user-start", 0);
@@ -564,6 +728,7 @@ test_04 (void)
return FALSE;
}
+
/* 05) Serial shooting
*
* It tests the time between shots in continuous mode.
@@ -573,6 +738,8 @@ test_05 (void)
{
signal_cont = TRUE;
have_img_captured = have_img_done = FALSE;
+ /* switch to image mode */
+ g_object_set (camera_bin, "mode", 0, NULL);
GET_TIME (t_initial);
g_signal_emit_by_name (camera_bin, "user-start", 0);
@@ -582,6 +749,27 @@ test_05 (void)
}
+/* 06) Shutter lag
+ *
+ * It tests the time from user-start signal to buffer reaching img-enc
+ */
+static gboolean
+test_06 (void)
+{
+ signal_img_enc = TRUE;
+
+ /* switch to image mode */
+ g_object_set (camera_bin, "mode", 0, NULL);
+ g_object_set (camera_bin, "filename", filename->str, NULL);
+ GET_TIME (t_initial);
+ g_signal_emit_by_name (camera_bin, "user-start", 0);
+
+ /* the actual results are fetched in pad_has_buffer */
+ result.times = 1;
+ return FALSE;
+}
+
+
/* 07) Image saved
*
* It tests the time between pressing the Shot and the final image is saved to
@@ -592,10 +780,11 @@ test_07 (void)
{
signal_shot = TRUE;
+ /* switch to image mode */
+ g_object_set (camera_bin, "mode", 0, NULL);
+ g_object_set (camera_bin, "filename", filename->str, NULL);
GET_TIME (t_initial);
g_signal_emit_by_name (camera_bin, "user-start", 0);
- /* call "user-stop" just to go back to initial state (view-finder) again */
- g_signal_emit_by_name (camera_bin, "user-stop", 0);
/* the actual results are fetched in img_capture_done */
result.times = 1;
return FALSE;
@@ -616,6 +805,10 @@ test_08 (void)
const gint count = 6;
gint i;
+ /* switch to image mode */
+ g_object_set (camera_bin, "mode", 0, NULL);
+ g_object_set (camera_bin, "filename", filename->str, NULL);
+
for (i = 0; i < count; ++i) {
GET_TIME (t_final[i]);
g_object_set (camera_bin, "mode", (i + 1) & 1, NULL);
@@ -641,6 +834,29 @@ test_08 (void)
return TRUE;
}
+
+/* 09) Video recording
+ *
+ * It tests the time it takes to start video recording.
+ * FIXME: shouldn't we wait for the buffer arriving on the venc instead of sink?
+ */
+static gboolean
+test_09 (void)
+{
+ signal_vid_sink = TRUE;
+
+ /* switch to video mode */
+ g_object_set (camera_bin, "mode", 1, NULL);
+ g_object_set (camera_bin, "filename", filename->str, NULL);
+ GET_TIME (t_initial);
+ g_signal_emit_by_name (camera_bin, "user-start", 0);
+
+ /* the actual results are fetched in pad_has_buffer */
+ result.times = 1;
+ return FALSE;
+}
+
+
typedef gboolean (*test_case) (void);
static test_case test_cases[TEST_CASES] = {
test_01,
@@ -648,16 +864,20 @@ static test_case test_cases[TEST_CASES] = {
test_03,
test_04,
test_05,
- NULL,
+ test_06,
test_07,
test_08,
- NULL
+ test_09
};
static void
print_result (void)
{
- printf ("| %6.02f%% ", 100.0f * (float) result.max / (float) target[test_ix]);
+ if (test_ix >= TEST_CASES) {
+ GST_WARNING ("text case index overrun");
+ return;
+ }
+ printf ("| %6.02f%% ", 100.0f * (float) result.avg / (float) target[test_ix]);
printf ("|%5u ms ", (guint) GST_TIME_AS_MSECONDS (target[test_ix]));
printf ("|%5u ms ", (guint) GST_TIME_AS_MSECONDS (result.avg));
printf ("|%5u ms ", (guint) GST_TIME_AS_MSECONDS (result.min));
@@ -671,8 +891,16 @@ static gboolean
run_test (gpointer user_data)
{
gboolean ret = TRUE;
+ guint old_test_ix = test_ix;
+
+ if (test_ix >= TEST_CASES) {
+ GST_INFO ("done");
+ g_main_loop_quit (loop);
+ return FALSE;
+ }
printf ("| %02d ", test_ix + 1);
+ fflush (stdout);
if (test_cases[test_ix]) {
if (target[test_ix]) {
memset (&result, 0, sizeof (ResultType));
@@ -692,15 +920,25 @@ run_test (gpointer user_data)
printf ("| %-19s |\n", test_names[test_ix]);
test_ix++;
}
+ fflush (stdout);
- if (!camera_bin || test_ix == TEST_CASES) {
+ if (old_test_ix == 0 && ret == TRUE && !camera_bin) {
+ GST_INFO ("done (camerabin creation failed)");
+ g_main_loop_quit (loop);
+ return FALSE;
+ }
+ if (old_test_ix > 0 && !camera_bin) {
+ GST_INFO ("done (camerabin was destroyed)");
+ g_main_loop_quit (loop);
+ return FALSE;
+ }
+ if (test_ix >= TEST_CASES) {
GST_INFO ("done");
g_main_loop_quit (loop);
return FALSE;
- } else {
- GST_INFO ("%2d result: %d", test_ix, ret);
- return ret;
}
+ GST_INFO ("%2d result: %d", test_ix, ret);
+ return ret;
}
int
@@ -724,6 +962,10 @@ main (int argc, char *argv[])
"width for image capture", NULL},
{"image-height", '\0', 0, G_OPTION_ARG_INT, &image_height,
"height for image capture", NULL},
+ {"video-width", '\0', 0, G_OPTION_ARG_INT, &video_width,
+ "width for image capture", NULL},
+ {"video-height", '\0', 0, G_OPTION_ARG_INT, &video_height,
+ "height for image capture", NULL},
{"view-framerate-num", '\0', 0, G_OPTION_ARG_INT, &view_framerate_num,
"framerate numerator for viewfinder", NULL},
{"view-framerate-den", '\0', 0, G_OPTION_ARG_INT, &view_framerate_den,
@@ -750,6 +992,9 @@ main (int argc, char *argv[])
}
g_option_context_free (ctx);
+ GST_DEBUG_CATEGORY_INIT (camera_perf, "camera-perf", 0,
+ "camera performcance test");
+
/* init */
filename = g_string_new_len ("", 16);
loop = g_main_loop_new (NULL, FALSE);
diff --git a/win32/common/libgstdshow.def b/win32/common/libgstdshow.def
deleted file mode 100644
index d5e6d57a..00000000
--- a/win32/common/libgstdshow.def
+++ /dev/null
@@ -1,15 +0,0 @@
-EXPORTS
- DllMain PRIVATE
- DllGetClassObject PRIVATE
- DllCanUnloadNow PRIVATE
- DllRegisterServer PRIVATE
- DllUnregisterServer PRIVATE
-
- gst_dshow_find_filter
- gst_dshow_free_mediatype
- gst_dshow_free_pin_mediatype
- gst_dshow_free_pins_mediatypes
- gst_dshow_get_pin_from_filter
- gst_dshow_getdevice_from_devicename
- gst_dshow_register_fakefilters
-
diff --git a/win32/vs6/gst_plugins_bad.dsw b/win32/vs6/gst_plugins_bad.dsw
index ba3fd2f8..388fd822 100644..100755
--- a/win32/vs6/gst_plugins_bad.dsw
+++ b/win32/vs6/gst_plugins_bad.dsw
@@ -39,18 +39,6 @@ Package=<4>
###############################################################################
-Project: "libgstdshowsrcwrapper"=".\libdshowsrcwrapper.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
Project: "libgstflv"=".\libgstflv.dsp" - Package Owner=<4>
Package=<5>
diff --git a/win32/vs6/libdshowsrcwrapper.dsp b/win32/vs6/libdshowsrcwrapper.dsp
deleted file mode 100644
index 6486f95f..00000000
--- a/win32/vs6/libdshowsrcwrapper.dsp
+++ /dev/null
@@ -1,137 +0,0 @@
-# Microsoft Developer Studio Project File - Name="libgstdshowsrcwrapper" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=libgstdshowsrcwrapper - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "libdshowsrcwrapper.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "libdshowsrcwrapper.mak" CFG="libgstdshowsrcwrapper - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "libgstdshowsrcwrapper - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "libgstdshowsrcwrapper - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "libgstdshowsrcwrapper - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTDSHOWSRCWRAPPER_EXPORTS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /O2 /I "../../gst-libs" /I "../../../gst-plugins-base/gst-libs" /I "../../../gstreamer/libs" /I "../common" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "DSHOWSRCWRAPPER_EXPORTS" /D "HAVE_CONFIG_H" /D "COBJMACROS" /D "_WIN32_DCOM" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD BASE RSC /l 0x40c /d "NDEBUG"
-# ADD RSC /l 0x40c /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
-# ADD LINK32 libgstdshow-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstaudio-0.10.lib libgstinterfaces-0.10.lib glib-2.0.lib gobject-2.0.lib ole32.lib oleaut32.lib Rpcrt4.lib Strmiids.lib user32.lib /nologo /dll /machine:I386 /out:"Release/libgstdshowsrcwrapper.dll" /libpath:"../../../dshowfakefilters/release" /libpath:"../gstreamer/win32/vs6/release" /libpath:"../gst-plugins-base/win32/vs6/release" /libpath:"./release"
-# Begin Special Build Tool
-TargetPath=.\Release\libgstdshowsrcwrapper.dll
-SOURCE="$(InputPath)"
-PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
-# End Special Build Tool
-
-!ELSEIF "$(CFG)" == "libgstdshowsrcwrapper - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTDSHOWSRCWRAPPER_EXPORTS" /YX /FD /GZ /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "../../gst-libs" /I "../../../gst-plugins-base/gst-libs" /I "../../../gstreamer/libs" /I "../common" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "DSHOWSRCWRAPPER_EXPORTS" /D "HAVE_CONFIG_H" /D "COBJMACROS" /D "_WIN32_DCOM" /YX /FD /GZ /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-# ADD BASE RSC /l 0x40c /d "_DEBUG"
-# ADD RSC /l 0x40c /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 libgstdshow-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstaudio-0.10.lib libgstinterfaces-0.10.lib glib-2.0D.lib gobject-2.0D.lib ole32.lib oleaut32.lib Rpcrt4.lib user32.lib strmiids.lib /nologo /dll /debug /machine:I386 /out:"Debug/libgstdshowsrcwrapper.dll" /pdbtype:sept /libpath:"../gstreamer/win32/vs6/debug" /libpath:"../gst-plugins-base/win32/vs6/debug" /libpath:"./debug"
-# Begin Special Build Tool
-TargetPath=.\Debug\libgstdshowsrcwrapper.dll
-SOURCE="$(InputPath)"
-PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
-# End Special Build Tool
-
-!ENDIF
-
-# Begin Target
-
-# Name "libgstdshowsrcwrapper - Win32 Release"
-# Name "libgstdshowsrcwrapper - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=..\..\sys\dshowsrcwrapper\gstdshowaudiosrc.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\sys\dshowsrcwrapper\gstdshowsrcwrapper.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\sys\dshowsrcwrapper\gstdshowvideosrc.c
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE=..\..\sys\dshowsrcwrapper\gstdshowaudiosrc.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\sys\dshowsrcwrapper\gstdshowsrcwrapper.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\sys\dshowsrcwrapper\gstdshowvideosrc.h
-# End Source File
-# End Group
-# Begin Group "Resource Files"
-
-# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
-# End Group
-# End Target
-# End Project
diff --git a/win32/vs8/gst-plugins-bad.sln b/win32/vs8/gst-plugins-bad.sln
index 13386d27..109210c9 100644..100755
--- a/win32/vs8/gst-plugins-bad.sln
+++ b/win32/vs8/gst-plugins-bad.sln
@@ -1,25 +1,25 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstdirectsound", "libgstdirectsound.vcproj", "{566A2EB9-984C-4027-86DD-EDC7B390C679}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstdirectdraw", "libgstdirectdraw.vcproj", "{1594A623-5529-4B86-BD4A-694CF0BDB5C4}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Release|Win32 = Release|Win32
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {566A2EB9-984C-4027-86DD-EDC7B390C679}.Debug|Win32.ActiveCfg = Debug|Win32
- {566A2EB9-984C-4027-86DD-EDC7B390C679}.Debug|Win32.Build.0 = Debug|Win32
- {566A2EB9-984C-4027-86DD-EDC7B390C679}.Release|Win32.ActiveCfg = Release|Win32
- {566A2EB9-984C-4027-86DD-EDC7B390C679}.Release|Win32.Build.0 = Release|Win32
- {1594A623-5529-4B86-BD4A-694CF0BDB5C4}.Debug|Win32.ActiveCfg = Debug|Win32
- {1594A623-5529-4B86-BD4A-694CF0BDB5C4}.Debug|Win32.Build.0 = Debug|Win32
- {1594A623-5529-4B86-BD4A-694CF0BDB5C4}.Release|Win32.ActiveCfg = Release|Win32
- {1594A623-5529-4B86-BD4A-694CF0BDB5C4}.Release|Win32.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstdirectdraw", "libgstdirectdraw.vcproj", "{1594A623-5529-4B86-BD4A-694CF0BDB5C4}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstdshowsrcwrapper", "libdshowsrcwrapper.vcproj", "{42EC1484-5031-4962-9E45-C990BB77EB37}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {1594A623-5529-4B86-BD4A-694CF0BDB5C4}.Debug|Win32.ActiveCfg = Debug|Win32
+ {1594A623-5529-4B86-BD4A-694CF0BDB5C4}.Debug|Win32.Build.0 = Debug|Win32
+ {1594A623-5529-4B86-BD4A-694CF0BDB5C4}.Release|Win32.ActiveCfg = Release|Win32
+ {1594A623-5529-4B86-BD4A-694CF0BDB5C4}.Release|Win32.Build.0 = Release|Win32
+ {42EC1484-5031-4962-9E45-C990BB77EB37}.Debug|Win32.ActiveCfg = Debug|Win32
+ {42EC1484-5031-4962-9E45-C990BB77EB37}.Debug|Win32.Build.0 = Debug|Win32
+ {42EC1484-5031-4962-9E45-C990BB77EB37}.Release|Win32.ActiveCfg = Release|Win32
+ {42EC1484-5031-4962-9E45-C990BB77EB37}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/win32/vs8/libdshowsrcwrapper.vcproj b/win32/vs8/libdshowsrcwrapper.vcproj
new file mode 100755
index 00000000..d18e66f8
--- /dev/null
+++ b/win32/vs8/libdshowsrcwrapper.vcproj
@@ -0,0 +1,280 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="libgstdshowsrcwrapper"
+ ProjectGUID="{42EC1484-5031-4962-9E45-C990BB77EB37}"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory=".\Release"
+ IntermediateDirectory=".\Release"
+ ConfigurationType="2"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Release/libdshowsrcwrapper.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="C:\msys\1.0\local\include;C:\msys\1.0\local\include\libxml2;&quot;C:\msys\1.0\local\include\glib-2.0&quot;;&quot;C:\msys\1.0\local\lib\glib-2.0\include&quot;;&quot;C:\msys\1.0\local\include\gstreamer-0.10&quot;;..\common;&quot;C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Samples\Multimedia\DirectShow\BaseClasses&quot;"
+ PreprocessorDefinitions="NDEBUG;WIN32;_WINDOWS;_USRDLL;DSHOWSRCWRAPPER_EXPORTS;HAVE_CONFIG_H;COBJMACROS;_WIN32_DCOM;_CRT_SECURE_NO_DEPRECATE"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ PrecompiledHeaderFile=".\Release/libdshowsrcwrapper.pch"
+ AssemblerListingLocation=".\Release/"
+ ObjectFile=".\Release/"
+ ProgramDataBaseFileName=".\Release/"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1036"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib libgstbase-0.10.lib libgstinterfaces-0.10.lib libgstaudio-0.10.lib glib-2.0.lib gmodule-2.0.lib gobject-2.0.lib gthread-2.0.lib quartz.lib winmm.lib msacm32.lib olepro32.lib Rpcrt4.lib Strmiids.lib strmbase.lib"
+ OutputFile="Release/libgstdshowsrcwrapper.dll"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="C:\msys\1.0\local\lib;&quot;C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Lib&quot;;&quot;C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Samples\Multimedia\DirectShow\BaseClasses\XP32_RETAIL&quot;"
+ ModuleDefinitionFile="..\..\sys\dshowsrcwrapper\libgstdshow.def"
+ ProgramDatabaseFile=".\Release/libgstdshowsrcwrapper.pdb"
+ ImportLibrary=".\Release/libgstdshowsrcwrapper.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\Release/libdshowsrcwrapper.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /Y Release\libgstdshowsrcwrapper.dll c:\msys\1.0\local\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory=".\Debug"
+ IntermediateDirectory=".\Debug"
+ ConfigurationType="2"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Debug/libdshowsrcwrapper.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="C:\msys\1.0\local\include;C:\msys\1.0\local\include\libxml2;&quot;C:\msys\1.0\local\include\glib-2.0&quot;;&quot;C:\msys\1.0\local\lib\glib-2.0\include&quot;;&quot;C:\msys\1.0\local\include\gstreamer-0.10&quot;;..\common;&quot;C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Samples\Multimedia\DirectShow\BaseClasses&quot;"
+ PreprocessorDefinitions="_DEBUG;WIN32;_WINDOWS;_USRDLL;DSHOWSRCWRAPPER_EXPORTS;HAVE_CONFIG_H;COBJMACROS;_WIN32_DCOM;_CRT_SECURE_NO_DEPRECATE"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableEnhancedInstructionSet="2"
+ PrecompiledHeaderFile=".\Debug/libdshowsrcwrapper.pch"
+ AssemblerListingLocation=".\Debug/"
+ ObjectFile=".\Debug/"
+ ProgramDataBaseFileName=".\Debug/"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1036"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib libgstbase-0.10.lib libgstinterfaces-0.10.lib libgstaudio-0.10.lib glib-2.0.lib gmodule-2.0.lib gobject-2.0.lib gthread-2.0.lib strmbasd.lib quartz.lib winmm.lib msacm32.lib olepro32.lib Rpcrt4.lib Strmiids.lib"
+ OutputFile="Debug/libgstdshowsrcwrapper.dll"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="C:\msys\1.0\local\lib;&quot;C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Lib&quot;;&quot;C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Samples\Multimedia\DirectShow\BaseClasses\XP32_DEBUG&quot;"
+ ModuleDefinitionFile="..\..\sys\dshowsrcwrapper\libgstdshow.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile=".\Debug/libgstdshowsrcwrapper.pdb"
+ ImportLibrary=".\Debug/libgstdshowsrcwrapper.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\Debug/libdshowsrcwrapper.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /Y Debug\libgstdshowsrcwrapper.dll c:\msys\1.0\local\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+ >
+ <File
+ RelativePath="..\..\sys\dshowsrcwrapper\gstdshow.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\sys\dshowsrcwrapper\gstdshowaudiosrc.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\sys\dshowsrcwrapper\gstdshowfakesink.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\sys\dshowsrcwrapper\gstdshowsrcwrapper.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\sys\dshowsrcwrapper\gstdshowvideosrc.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\sys\dshowsrcwrapper\libgstdshow.def"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl"
+ >
+ <File
+ RelativePath="..\..\sys\dshowsrcwrapper\gstdshow.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\sys\dshowsrcwrapper\gstdshowaudiosrc.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\sys\dshowsrcwrapper\gstdshowfakesink.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\sys\dshowsrcwrapper\gstdshowinterface.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\sys\dshowsrcwrapper\gstdshowvideosrc.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>