diff options
215 files changed, 8831 insertions, 7323 deletions
@@ -1,9 +1,1359 @@ +=== release 0.10.13 === + +2009-06-18 Jan Schmidt <jan.schmidt@sun.com> + + * configure.ac: + releasing 0.10.13, "Supersonic Rocket" + +2009-06-17 21:56:56 +0100 Jan Schmidt <thaytan@noraisin.net> + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/en_GB.po: + * po/es.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/ky.po: + * po/lt.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2009-06-16 17:09:26 +0300 Stefan Kost <ensonic@users.sf.net> + + * gst/camerabin/camerabinimage.c: + camerabin: reset filename after capture to avoid racy when capturing again + If we don't reset the filename we cannot check if we still expect the filename + for a subsequent capture pass. The imagebin would good to paused and we set the + filename in that state. This trigers an error-message and would capture to the + old filename. + +2009-06-12 10:29:20 +0300 Stefan Kost <ensonic@users.sf.net> + + * tests/check/Makefile.am: + * tests/check/elements/camerabin.c: + camerabin: cleanups in the tests + Sprinkle more logging to make it easier to follow. Specify a low framerate and + capture resolution to avoid tests timing out. Make the sinks sync to test closer + to reality. Fix Makefile to use uninstalled interface. + +2009-06-12 10:26:30 +0300 Stefan Kost <ensonic@users.sf.net> + + * gst/camerabin/camerabinimage.c: + * gst/camerabin/gstcamerabin.c: + camerabin: set imagebin to PAUSED on capture and delayed filename setting + We need to set imagebin to PAUSED to not fail the bufferalloc. We also need to + keep the filesinks state locked until we have the filename for the run. + +2009-06-12 10:14:27 +0300 Stefan Kost <ensonic@users.sf.net> + + * gst/selector/gstoutputselector.c: + outputselector: do the pad_alloc for the pad that is pending and have a fallback + We should do the pad_alloc for the pending pad if any, as we will switch to that + pad on next _chain() call. Also do a fallback alloc, if there is no output yet to + not fail state transitions in dynamic pipelines. + +2009-06-11 16:00:36 +0100 Jan Schmidt <thaytan@noraisin.net> + + * win32/common/config.h: + win32: Bump win32 config.h version number too + +2009-06-05 22:43:50 +0100 Jan Schmidt <thaytan@noraisin.net> + + * configure.ac: + * po/LINGUAS: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/en_GB.po: + * po/es.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/ky.po: + * po/lt.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + * win32/common/config.h: + 0.10.12.3 pre-release + +2009-06-06 21:28:27 +0400 LRN <lrn1986@gmail.com> + + * gst/debugutils/Makefile.am: + Added base libs to debug utils makefile + Fixes #585015 + +2009-06-07 10:55:59 +0200 Edward Hervey <bilboed@bilboed.com> + + * tests/check/pipelines/metadata.c: + tests/metadata: Don't try tags we can't handle. Fixes #584945 + +2009-06-06 19:28:07 +0200 Edward Hervey <bilboed@bilboed.com> + + * gst/hdvparse/Makefile.am: + hdvparse: Link against libm because we use pow(). + +2009-06-06 13:53:04 +0100 Jan Schmidt <jan.schmidt@sun.com> + + * tests/examples/Makefile.am: + examples: Don't build the mxf example if GTK isn't present. + +2009-06-06 13:17:49 +0100 Jan Schmidt <jan.schmidt@sun.com> + + * ext/apexsink/gstapexraop.c: + * ext/apexsink/gstapexsink.c: + apexsink: Fix compiler warnings + Fix compile warnings on solaris from bzero not being declared (use + memset instead), and strict-aliasing warnings (use a temporary + variable). + +2009-06-06 02:35:35 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * gst/id3tag/id3tag.c: + id3mux: init genre field in ID3v1 tag to an invalid number + So that it is not interpreted as 'Blues' if no genre is to be written. + +2009-06-06 01:05:49 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * gst/id3tag/gstid3mux.c: + id3mux: don't write ID3v1 tag until specifically instructed to do so + ID3v1 tags are one of the most broken and ill-designed things that + exist on this planet. Let's not write them by default. + +2009-06-06 00:58:46 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * gst/id3tag/id3tag.c: + id3mux: don't write empty ID3v1 tag + +2009-06-06 00:39:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * docs/plugins/inspect/plugin-id3tag.xml: + * gst/id3tag/Makefile.am: + * gst/id3tag/gstid3mux.c: + * gst/id3tag/gstid3mux.h: + * gst/id3tag/gstid3tag.c: + * gst/id3tag/gstid3tag.h: + * gst/id3tag/gsttagmux.c: + * gst/id3tag/id3tag.c: + * gst/id3tag/id3tag.h: + id3tag: rename new id3tag element to id3mux replacing the one removed from -ugly + +2009-06-05 23:52:05 +0100 Jan Schmidt <thaytan@noraisin.net> + + * gst/nsf/nes6502.c: + nsf: Fix compiler warning on Solaris. + A SEC() macro already exists on Solaris, causing warnings about + redefining it. + +2009-06-05 22:20:46 +0200 Edward Hervey <bilboed@bilboed.com> + + * gst/hdvparse/gsthdvparse.c: + hdvparse: Fix the build on Commander Thaytan's S10SP + +2009-06-05 19:53:09 +0100 Jan Schmidt <thaytan@noraisin.net> + + * tests/check/elements/.gitignore: + gitignore: Ignore shapewipe unit test binary + +2009-06-05 19:32:26 +0100 Jan Schmidt <thaytan@noraisin.net> + + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-bad-plugins-docs.sgml: + * docs/plugins/gst-plugins-bad-plugins-sections.txt: + * docs/plugins/inspect/plugin-x264.xml: + * ext/Makefile.am: + * ext/x264/GstX264Enc.prs: + * ext/x264/Makefile.am: + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + * gst-plugins-bad.spec.in: + * tests/check/Makefile.am: + * tests/check/elements/.gitignore: + Moved 'x264enc' from -bad to -ugly + +2009-06-05 21:17:55 +0300 Stefan Kost <ensonic@users.sf.net> + + * gst/camerabin/Makefile.am: + * tests/check/Makefile.am: + camerabin: fix link order + Move local version up in the link order. + +2009-06-05 20:22:17 +0200 Edward Hervey <bilboed@bilboed.com> + + * gst/hdvparse/gsthdvparse.c: + hdvparse: Emit a GST_MESSAGE_ELEMENT with some goodness in it. + +2009-06-05 10:49:41 +0200 Edward Hervey <bilboed@bilboed.com> + + * gst/mpegvideoparse/mpegvideoparse.c: + mpegvideoparse: Add methods to get names of various values. + +2009-06-05 10:48:52 +0200 Edward Hervey <bilboed@bilboed.com> + + * gst/mpegdemux/gstmpegdefs.h: + * gst/mpegdemux/gstmpegtsdemux.c: + mpegtsdemux: Fix HDV private stream definition/caps. + +2009-06-05 10:47:41 +0200 Edward Hervey <bilboed@bilboed.com> + + * gst/hdvparse/gsthdvparse.c: + hdvparse: Rewrite from scratch. Handle both hdv-a and hdv-v + This time we analyze a lot more information. + Still need to re-add the message emission. + +2009-06-05 16:48:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + + * ext/celt/gstceltenc.c: + celtenc: correct framesize range + A CELT framesize can be between 64 and 512 samples. + Fix a typo in the bitrate property description. + +2009-05-27 11:33:01 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> + + * gst/camerabin/Makefile.am: + * gst/camerabin/camerabinimage.c: + * gst/camerabin/camerabinimage.h: + * gst/camerabin/camerabinpreview.c: + * gst/camerabin/camerabinpreview.h: + * gst/camerabin/gstcamerabin.c: + * gst/camerabin/gstcamerabin.h: + * tests/check/elements/camerabin.c: + camerabin: preview image sending optimization + * decouple image capturing from image post-processing and encoding + * post image-captured message after image is captured + * post preview-image message with snapshot of captured image + +2009-05-19 16:58:36 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> + + * gst/camerabin/camerabinimage.c: + camerabin: don't lose post processing element in first reset + +2009-05-12 12:49:33 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> + + * gst/camerabin/camerabingeneral.c: + * gst/camerabin/camerabinimage.c: + * gst/camerabin/camerabinvideo.c: + camerabin: add debug including dot graph writing + +2009-05-05 14:19:46 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> + + * gst/camerabin/gstcamerabin.c: + camerabin: unblock if error occurs during capture + +2009-05-04 10:33:18 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> + + * gst/camerabin/gstcamerabinphotography.c: + camerabin: ignore night mode handling if already in night mode + +2009-05-04 10:32:10 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> + + * gst/camerabin/gstcamerabin.c: + camerabin: stop ongoing capture if changing resolution + +2009-04-23 18:15:43 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> + + * gst/camerabin/camerabinvideo.c: + camerabin: limit the size of video bin queue leading to view finder + We don't want to show old buffers in view finder. + +2009-04-22 12:29:14 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> + + * gst/camerabin/Makefile.am: + * gst/camerabin/gstcamerabin.c: + * gst/camerabin/gstcamerabinxoverlay.c: + * gst/camerabin/gstcamerabinxoverlay.h: + camerabin: don't proxy gst xoverlay interface + Default view finder sink in camerabin is autovideosink which doesn't + support xoverlay iface. If application decides to use another sink + that supports xoverlay, then it can use the interface directly. + +2009-04-20 17:06:14 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> + + * gst/camerabin/gstcamerabin.c: + * gst/camerabin/gstcamerabin.h: + * gst/camerabin/gstcamerabinphotography.c: + camerabin: allow configuring photography settings when in NULL state + Cache the photography settings if set in NULL state and apply them later + +2009-04-20 17:05:49 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> + + * gst-libs/gst/interfaces/photography.c: + * gst-libs/gst/interfaces/photography.h: + photography: add functions to set/get all settings with one call + +2009-03-09 18:00:45 +0200 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> + + * gst/camerabin/gstcamerabin.c: + camerabin: crop still image capture frame if necessary + If incoming still image capture frame aspect ratio differs from aspect + ratio that application requested, then apply crop to the frame. + +2009-06-05 10:25:26 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * docs/plugins/inspect/plugin-adpcmdec.xml: + * docs/plugins/inspect/plugin-hdvparse.xml: + * docs/plugins/inspect/plugin-id3tag.xml: + docs: add inspect files for new plugins + +2009-06-05 10:16:23 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * docs/plugins/inspect/plugin-debugutilsbad.xml: + * docs/plugins/inspect/plugin-dirac.xml: + * docs/plugins/inspect/plugin-legacyresample.xml: + * docs/plugins/inspect/plugin-mpeg2enc.xml: + * docs/plugins/inspect/plugin-mplex.xml: + * docs/plugins/inspect/plugin-musepack.xml: + * docs/plugins/inspect/plugin-rawparse.xml: + docs: fix build of plugin docs by updating inspect templates + The xml inspect data of the debugutilsbad plugin didn't contain the + data for the fpsdisplaysink element (someone probably ran 'make udpate' + in docs/plugins with the old libgstfpsdisplaysink.so from before the + rename still around). + +2009-06-05 10:34:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * docs/plugins/xml/element-fpsdisplaysink-details.xml: + Revert "docs: add doc file fro new plugin" + This reverts commit 039ef3eb072555b7ca38fc351ca386bb680ccccc. + We don't track the stuff in xml/ in git. + +2009-06-05 11:18:31 +0300 Stefan Kost <ensonic@users.sf.net> + + * docs/plugins/xml/element-fpsdisplaysink-details.xml: + docs: add doc file fro new plugin + +2009-06-01 16:31:42 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> + + * gst/selector/gstoutputselector.c: + output-selector: serialize setting and actual changing of new active pad + +2009-05-04 12:29:54 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> + + * gst/selector/gstoutputselector.c: + output-selector: unref latest buffer also when resending has been disabled + +2009-04-16 17:32:03 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> + + * gst/selector/gstoutputselector.c: + output-selector: keep ref to buffer for resending only if explicitly requested + +2009-06-04 19:08:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + + * gst/selector/gstinputselector.c: + inputselector: don't leak pads in iterator + +2009-06-04 16:29:31 +0100 Jan Schmidt <thaytan@noraisin.net> + + * gst/mpegdemux/gstmpegdesc.c: + mpegdemux: Add a GST_MEMDUMP line in the descriptor parsing + Make it possible to see descriptor contents in the debug output + (GST_DEBUG=mpegtsdesc:9), and remove a stray semi-colon. + +2009-06-04 16:11:16 +0100 Jan Schmidt <thaytan@noraisin.net> + + * gst/mpegdemux/gstmpegtsdemux.c: + mpegtsdemux: Avoid passing the custom GST_FLOW_NEED_MORE_DATA upstream + Don't return GST_FLOW_NEED_MORE_DATA from the chain function at the end + of files. + +2009-06-04 08:56:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + + * gst/selector/gstinputselector.c: + inputselector: Notify when the tags property of the selector sinkpads changes + First part of bug #584686. + +2009-06-04 08:56:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + + * tests/check/elements/shapewipe.c: + shapewipe: Increase timeout of the unit test + +2009-06-03 23:35:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * configure.ac: + Bump core/base requirements to released versions + +2009-06-02 11:36:01 +0100 Christian Schaller <christian.schaller@collabora.co.uk> + + * gst-plugins-bad.spec.in: + add two new plugins to spec file + +2009-06-02 11:23:37 +0100 Christian Schaller <christian.schaller@collabora.co.uk> + + * gst/dvdspu/Makefile.am: + dvdspu: add missing header to Makefile.am: gstspu-common.h + +2009-06-02 01:09:32 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * ext/dirac/Makefile.am: + dirac: use GST_CXXFLAGS instead of GST_CFLAGS for c++ compilers + Fixes compiler message about passing -Wdeclaration-after-statement + to the C++ compiler. + +2009-06-01 15:53:27 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * gst/aacparse/gstaacparse.c: + aacparse: fix sample rate extraction from codec data + In one case we extracted the sample rate index from the codec data + and saved it as sample rate rather than getting the real sample + rate from the table. Fix that, and also make sure we don't access + non-existant table entries by adding a small helper function that + guards against out-of-bounds access in case of invalid input data. + +2009-06-01 14:02:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * gst/aacparse/gstaacparse.c: + * gst/amrparse/gstamrparse.c: + aacparse, amrparse: remove bogus gst_pad_fixate_caps() calls + +2009-06-01 13:56:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * gst/aacparse/gstbaseparse.c: + * gst/amrparse/gstbaseparse.c: + * gst/flacparse/gstbaseparse.c: + baseparse: propagate return value of GstBaseParse::set_sink_caps() + gst_base_parse_sink_setcaps() presumably should fail if the subclass + returns FALSE from its ::set_sink_caps() function. + +2009-06-01 13:47:01 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * gst/aacparse/gstbaseparse.c: + * gst/amrparse/gstbaseparse.c: + * gst/flacparse/gstbaseparse.c: + baseparse: don't try to GST_LOG an already-freed caps string + The proper way to log caps is via GST_PTR_FORMAT anyway. + +2009-06-01 13:05:35 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * gst/aacparse/gstaacparse.c: + * tests/check/elements/aacparse.c: + aacparse: set channels and rate on output caps, and keep codec_data + Create output caps from input caps, so we maintain any fields we + might get on the input caps, such as codec_data or rate and channels. + Set channels and rate on the output caps if we don't have input caps + or they don't contain such fields. We do this partly because we can, + but also because some muxers need this information. Tagreadbin will + also be happy about this. + +2009-06-01 22:42:08 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> + + * gst/qtmux/atoms.c: + * gst/qtmux/atoms.h: + * gst/qtmux/ftypcc.h: + * gst/qtmux/gstqtmuxmap.c: + gppmux: enhance ftyp brand heuristic. Fixes #584360. + +2009-06-01 21:24:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + + * gst/shapewipe/gstshapewipe.c: + shapewipe: Fix some issues that were exposed by the new unit test + +2009-06-01 21:24:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + + * tests/check/Makefile.am: + * tests/check/elements/shapewipe.c: + shapewipe: Add unit test for shapewipe + +2009-05-31 21:33:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-bad-plugins-docs.sgml: + * docs/plugins/gst-plugins-bad-plugins-sections.txt: + * docs/plugins/gst-plugins-bad-plugins.args: + * docs/plugins/gst-plugins-bad-plugins.hierarchy: + * docs/plugins/gst-plugins-bad-plugins.interfaces: + * docs/plugins/gst-plugins-bad-plugins.prerequisites: + * docs/plugins/gst-plugins-bad-plugins.signals: + * docs/plugins/inspect/plugin-aacparse.xml: + * docs/plugins/inspect/plugin-aiffparse.xml: + * docs/plugins/inspect/plugin-alsaspdif.xml: + * docs/plugins/inspect/plugin-amrparse.xml: + * docs/plugins/inspect/plugin-amrwb.xml: + * docs/plugins/inspect/plugin-apex.xml: + * docs/plugins/inspect/plugin-assrender.xml: + * docs/plugins/inspect/plugin-autoconvert.xml: + * docs/plugins/inspect/plugin-bayer.xml: + * docs/plugins/inspect/plugin-bz2.xml: + * docs/plugins/inspect/plugin-camerabin.xml: + * docs/plugins/inspect/plugin-cdaudio.xml: + * docs/plugins/inspect/plugin-cdxaparse.xml: + * docs/plugins/inspect/plugin-celt.xml: + * docs/plugins/inspect/plugin-dc1394.xml: + * docs/plugins/inspect/plugin-dccp.xml: + * docs/plugins/inspect/plugin-debugutilsbad.xml: + * docs/plugins/inspect/plugin-dfbvideosink.xml: + * docs/plugins/inspect/plugin-dtmf.xml: + * docs/plugins/inspect/plugin-dtsdec.xml: + * docs/plugins/inspect/plugin-dvb.xml: + * docs/plugins/inspect/plugin-dvdspu.xml: + * docs/plugins/inspect/plugin-faac.xml: + * docs/plugins/inspect/plugin-faad.xml: + * docs/plugins/inspect/plugin-fbdevsink.xml: + * docs/plugins/inspect/plugin-festival.xml: + * docs/plugins/inspect/plugin-freeze.xml: + * docs/plugins/inspect/plugin-gsm.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-gstsiren.xml: + * docs/plugins/inspect/plugin-h264parse.xml: + * docs/plugins/inspect/plugin-jack.xml: + * docs/plugins/inspect/plugin-ladspa.xml: + * docs/plugins/inspect/plugin-legacyresample.xml: + * docs/plugins/inspect/plugin-liveadder.xml: + * docs/plugins/inspect/plugin-metadata.xml: + * docs/plugins/inspect/plugin-mms.xml: + * docs/plugins/inspect/plugin-modplug.xml: + * docs/plugins/inspect/plugin-mpeg4videoparse.xml: + * docs/plugins/inspect/plugin-mpegdemux2.xml: + * docs/plugins/inspect/plugin-mpegtsmux.xml: + * docs/plugins/inspect/plugin-mpegvideoparse.xml: + * docs/plugins/inspect/plugin-musepack.xml: + * docs/plugins/inspect/plugin-musicbrainz.xml: + * docs/plugins/inspect/plugin-mve.xml: + * docs/plugins/inspect/plugin-mxf.xml: + * docs/plugins/inspect/plugin-mythtv.xml: + * docs/plugins/inspect/plugin-nas.xml: + * docs/plugins/inspect/plugin-neon.xml: + * docs/plugins/inspect/plugin-nsfdec.xml: + * docs/plugins/inspect/plugin-nuvdemux.xml: + * docs/plugins/inspect/plugin-ofa.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-pcapparse.xml: + * docs/plugins/inspect/plugin-qtmux.xml: + * docs/plugins/inspect/plugin-rawparse.xml: + * docs/plugins/inspect/plugin-real.xml: + * docs/plugins/inspect/plugin-resindvd.xml: + * docs/plugins/inspect/plugin-rfbsrc.xml: + * docs/plugins/inspect/plugin-rtpmux.xml: + * docs/plugins/inspect/plugin-scaletempo.xml: + * docs/plugins/inspect/plugin-sdl.xml: + * docs/plugins/inspect/plugin-sdp.xml: + * docs/plugins/inspect/plugin-selector.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-sndfile.xml: + * docs/plugins/inspect/plugin-soundtouch.xml: + * docs/plugins/inspect/plugin-speed.xml: + * docs/plugins/inspect/plugin-stereo.xml: + * docs/plugins/inspect/plugin-subenc.xml: + * docs/plugins/inspect/plugin-tta.xml: + * docs/plugins/inspect/plugin-valve.xml: + * docs/plugins/inspect/plugin-vcdsrc.xml: + * docs/plugins/inspect/plugin-videosignal.xml: + * docs/plugins/inspect/plugin-vmnc.xml: + * docs/plugins/inspect/plugin-wildmidi.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xdgmime.xml: + * docs/plugins/inspect/plugin-xvid.xml: + * gst/shapewipe/gstshapewipe.c: + shapewipe: Add documentation and integrate into the build system + +2009-05-31 20:24:44 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * gst/sdp/gstsdpdemux.c: + sdpdemux: include glib.h before checking if G_OS_WIN32 is defined + +2009-05-31 20:23:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * .gitignore: + .gitignore: ignore new shapewipe example binary + +2009-05-31 18:23:50 +0200 Edward Hervey <bilboed@bilboed.com> + + * gst/hdvparse/gsthdvparse.c: + hdvparse: Setting rank to NONE so it doesn't get picked up by playbin2. + +2009-05-31 18:23:08 +0200 Edward Hervey <bilboed@bilboed.com> + + * gst/hdvparse/gsthdvparse.c: + hdvparse: Emit application message with the parsed information. + +2009-05-31 14:15:11 +0200 Edward Hervey <bilboed@bilboed.com> + + * configure.ac: + * gst/hdvparse/Makefile.am: + * gst/hdvparse/gsthdvparse.c: + * gst/hdvparse/gsthdvparse.h: + hdvparse: New element for parsing private/hdv-a1 streams. + +2009-05-29 21:07:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + + * gst/shapewipe/gstshapewipe.c: + shapewipe: Adjust border to still have everything transparent at 1.0 and the other way around + +2009-05-29 16:55:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + + * gst/shapewipe/gstshapewipe.c: + * tests/examples/shapewipe/shapewipe-example.c: + shapewipe: Divide the border value by two, otherwise we use a twice a wide border + +2009-05-29 16:51:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + + * gst/shapewipe/gstshapewipe.c: + * gst/shapewipe/gstshapewipe.h: + * tests/examples/shapewipe/shapewipe-example.c: + shapewipe: Add border property to allow smooth borders + ...and use a border of 0.01 in the example application. + +2009-05-29 15:44:51 +0100 Jan Schmidt <thaytan@noraisin.net> + + * gst/mpegdemux/gstmpegtsdemux.c: + mpegtsdemux: Fix bogus uninitialised variable access + Typo in the previous commit + +2009-05-29 15:01:42 +0100 Jan Schmidt <thaytan@noraisin.net> + + * gst/mpegdemux/gstmpegtsdemux.c: + mpegtsdemux: Use the ISO 639 language code descriptor to send tags. + If there is an ISO 639 language descriptor for a stream, send a language + code tag so that players can show a meaningful language for the audio and + subtitle streams. + +2009-05-29 16:00:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + + * tests/examples/shapewipe/Makefile.am: + shapewipe: Fix Makefile of the example application + +2009-05-29 15:32:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + + * configure.ac: + * gst/shapewipe/Makefile.am: + * gst/shapewipe/gstshapewipe.c: + * gst/shapewipe/gstshapewipe.h: + * tests/examples/Makefile.am: + * tests/examples/shapewipe/Makefile.am: + * tests/examples/shapewipe/shapewipe-example.c: + shapewipe: Add a simple shapewipe transition filter & example application + +2009-05-28 17:37:44 -0400 Olivier Crête <olivier.crete@collabora.co.uk> + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Transform the right session sdes message + Fixes #584165 + +2009-05-28 17:33:10 -0400 Olivier Crête <olivier.crete@collabora.co.uk> + + * gst/rtpmanager/rtpsource.c: + Add ssrc to application/x-rtp-source-sdes structure + +2009-05-28 23:12:13 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * gst/rawparse/gstaudioparse.c: + audioparse: add support for A-Law and µ-Law + +2009-05-28 23:08:17 +0100 Tristan Matthews <le.businessman@gmail.com> + + * gst/dvdspu/gstspu-pgs.c: + gstspu: Fix compiler warnings on OS/X + Fix some warnings for format string args and uninitialized vars on OS/X + Fixes: #584164 + Signed-off-by: Jan Schmidt <thaytan@noraisin.net> + +2009-05-28 13:56:10 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> + + * gst/qtmux/fourcc.h: + * gst/qtmux/gstqtmux.c: + qtmux: use different stsd atom type for H263 for ISO and QT variants + Fixes #584114. + +2009-05-28 13:07:37 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> + + * configure.ac: + soundtouch: fix detection of libsoundtouch >= 1.4 + +2009-05-28 13:09:24 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> + + * gst/amrparse/gstamrparse.c: + * gst/amrparse/gstamrparse.h: + amrparse: consider header size in byte <-> time conversions + +2009-05-26 19:43:53 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> + + * gst/aacparse/gstbaseparse.c: + * gst/amrparse/gstbaseparse.c: + baseparse: fix debug category + +2009-05-28 10:38:50 +0300 Stefan Kost <ensonic@users.sf.net> + + * gst/selector/gstoutputselector.h: + selector: remove not needed instance var (previous commit). + +2009-05-11 16:12:54 +0300 Stefan Kost <ensonic@users.sf.net> + + * ext/jack/gstjackaudioclient.c: + * ext/jack/gstjackaudiosink.c: + jack: when stopping playback, do one more cycle to flush the port. Fixes #582167 + The gst_jack_audio_client_set_active() flags the port as deactivating and uses + a GCond to wait until the jack_process_cb() has run once more and cleared the + flag. This way the client zero's the buffer. This happens if one manyally go + to PAUSED and then to READY, while leting the mainloop run inbetween. + +2009-05-28 10:12:58 +0300 Stefan Kost <ensonic@users.sf.net> + + * gst/selector/gstoutputselector.c: + * gst/selector/gstoutputselector.h: + outputselector: implement pad_alloc on active pad. + +2009-05-27 22:54:51 +0100 Jan Schmidt <thaytan@noraisin.net> + + * ext/resindvd/gstmpegdemux.c: + * ext/resindvd/gstmpegdemux.h: + * ext/resindvd/resindvdsrc.c: + * ext/resindvd/rsnaudiomunge.c: + resindvd: Create all the audio streams of all formats + Enable creation of the demuxer pads for all audio streams, even types we + don't yet support. This means that unsupported types (LPCM, DTS) are output, + but not linked to anything yet. If only unsupported streams are available, + the user hears silence instead of having the pipeline not pre-roll correctly. + This is a prerequisite for hooking up the automatic decoder switching. + +2009-05-27 11:03:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + + * gst/rtpmanager/rtpsource.c: + rtpsouce: the network address is in network order + Bring the network address in netowkr byte order to the host order. + +2009-05-27 00:51:45 +0100 Jan Schmidt <thaytan@noraisin.net> + + * gst/dvdspu/gstspu-pgs.c: + gstspu: Convert g_warnings to GST_ERROR, and fix format specifiers + Use G_GSSIZE_FORMAT for printing pointer differences, which should work on + both 32-bit and 64-bit systems. + Use GST_ERROR instead of g_warning for printing messages about unknown + packet contents. + +2009-05-27 00:47:05 +0100 Jan Schmidt <thaytan@noraisin.net> + + * gst/dvdspu/gstspu-vobsub-render.c: + gstspu: Fix a nasty regression, with DVDs randomly crashing + Use the local wrapper function when clearing the compositing buffers to + ensure the correct portion is being cleared. + +2009-05-26 19:38:54 +0100 Jan Schmidt <thaytan@noraisin.net> + + * ext/resindvd/gstmpegdemux.c: + resindvd: LPCM streams are only from 0xa0 to 0xaf. + Fix the same bug as the previous commit, but in resindvd's copy of + mpegdemux. + +2009-05-26 18:47:32 +0100 Jan Schmidt <thaytan@noraisin.net> + + * gst/mpegdemux/gstmpegdemux.c: + mpegdemux: Only treat streams from 0xa0 to 0xaf as LPCM, not 0xa0..0xbf + Don't treat some streams (Private Stream 2) as LPCM when they're not. Fixes + playback of files that have private streams in them now that the PES filter + emits such packets. + +2009-05-26 18:43:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * gst/dvdspu/gstspu-pgs.c: + dvdspu: fix printf formats to avoid compiler warnings + +2009-05-26 17:19:35 +0100 Jan Schmidt <thaytan@noraisin.net> + + * common: + Automatic update of common submodule + From 6ab11d1 to c572721 + +2009-05-23 23:19:05 +0100 Jan Schmidt <thaytan@noraisin.net> + + * gst/dvdspu/Makefile.am: + * gst/dvdspu/gstdvdspu-render.c: + * gst/dvdspu/gstdvdspu.c: + * gst/dvdspu/gstdvdspu.h: + * gst/dvdspu/gstspu-common.h: + * gst/dvdspu/gstspu-pgs.c: + * gst/dvdspu/gstspu-pgs.h: + * gst/dvdspu/gstspu-vobsub-render.c: + * gst/dvdspu/gstspu-vobsub.c: + * gst/dvdspu/gstspu-vobsub.h: + gstspu: Implement PGS rendering and alpha blending + Refactor the DVD subpicture compositing, switching it to 8-bit alpha + calculations. Reuse some of the resulting code to implement PGS + subpicture blending. + Implement parsing and collecting of composition objects properly, but + assuming a single active window and colour palette for now. I need more + PGS samples. + +2009-05-22 11:13:59 +0100 Jan Schmidt <thaytan@noraisin.net> + + * gst/dvdspu/Makefile.am: + * gst/dvdspu/gstdvdspu.c: + * gst/dvdspu/gstspu-vobsub.c: + * gst/dvdspu/gstspu-vobsub.h: + dvdspu: Move a bunch of vobsub specific logic to a separate file. + Start separating out the vobsub logic in preparation for creating + separate renderer objects for each subpicture format. + +2009-05-22 11:12:52 +0100 Jan Schmidt <thaytan@noraisin.net> + + * gst/dvdspu/gstspu-pgs.c: + dvdspu: Add copyright header and includes to the PGS handler + +2009-05-22 10:15:44 +0100 Jan Schmidt <thaytan@noraisin.net> + + * gst/dvdspu/gstspu-pgs.c: + dvdspu: Make the PGS dumping less verbose + +2009-05-21 23:45:43 +0100 Jan Schmidt <thaytan@noraisin.net> + + * gst/dvdspu/gstdvdspu.c: + dvdspu: Collect entire PGS packets and queue as events + Collect fragmented PGS packets and submit as complete events for + processing at the correct moment. + +2009-05-20 08:55:40 +0100 Jan Schmidt <thaytan@noraisin.net> + + * gst/dvdspu/Makefile.am: + * gst/dvdspu/gstdvdspu.c: + * gst/dvdspu/gstdvdspu.h: + * gst/dvdspu/gstspu-pgs.c: + * gst/dvdspu/gstspu-pgs.h: + dvdspu: Add simple PGS handler that dumps the packet info + Add setcaps logic on the subpicture sink pad for configuring + which subpicture format is arriving. + Add the first piece of PGS subpicture handling by dumping the stream + contents out to the terminal as the packets arrive. + Add some more debug. + Don't calculate the running time for our subpicture packets twice, + once is enough. + +2009-05-21 15:22:58 +0100 Jan Schmidt <thaytan@noraisin.net> + + * gst/dvdspu/gstdvdspu.c: + dvdspu: Add a simple default colour table. + When we're not provided with a palette in advance, draw with a grey + colour or two, instead of YUV green. + +2009-05-21 11:13:54 +0100 Jan Schmidt <thaytan@noraisin.net> + + * gst/mpegdemux/gstmpegdemux.c: + * gst/mpegdemux/gstmpegdemux.h: + mpegdemux: Add sparse stream filling. + First stab at sending new-segment events to effect sparse stream + updates. + +2009-05-21 00:41:47 +0100 Jan Schmidt <thaytan@noraisin.net> + + * gst/mpegdemux/gstmpegdemux.c: + * gst/mpegdemux/gstmpegdemux.h: + mpegdemux: Add support for outputting sub-picture streams found in files. + Output subpicture streams when they are found on the private stream ID. + Don't strip off the first byte of such packets when pushing. + +2009-05-20 08:50:37 +0100 Jan Schmidt <thaytan@noraisin.net> + + * gst/mpegdemux/gstmpegdefs.h: + * gst/mpegdemux/gstmpegtsdemux.c: + * gst/mpegdemux/gstmpegtsdemux.h: + * gst/mpegdemux/gstpesfilter.h: + mpegtsdemux: Add mapping for DVD and Bluray subpicture streams. + Add output subpicture pads for DVD (video/x-dvd-subpicture) and Bluray PGS + (subpicture/x-pgs) streams. Remove an unused variable from + the PES filter. + +2009-05-25 00:25:07 +0100 Jan Schmidt <thaytan@noraisin.net> + + * ext/resindvd/gstmpegdemux.c: + resindvd: Fix subpicture timing in some cases + Make sure we send events to all pads. Unmark the notlinked flag on + freshly selected pads to ensure they get data. + +2009-05-22 14:02:38 +0100 Jan Schmidt <thaytan@noraisin.net> + + * ext/resindvd/gstmpegdemux.c: + resindvd: Try a different approach to segment filling. + Restore the old segment update behaviour, and instead extend the + close segment stop time if the SCR (last_stop) overruns the calculated + stop position. + +2009-05-21 11:10:13 +0100 Jan Schmidt <thaytan@noraisin.net> + + * ext/resindvd/gstmpegdemux.c: + resindvd: Minor change to inline a function in the demuxer + +2009-05-20 19:31:24 +0100 Jan Schmidt <thaytan@noraisin.net> + + * tests/check/Makefile.am: + states: Ignore the camerabin for the states test + It accesses the video device, which isn't generally desirable for the + state test. + +2009-05-22 13:07:38 +0100 Jan Schmidt <thaytan@noraisin.net> + + * gst/dvdspu/gstdvdspu.c: + dvdspu: Don't accidentally lose the colour palette when flushing the SPU + Fixes racy startup on DVDs where it sometimes gets entirely the wrong set + of colours in the menus and subtitles. + +2009-05-26 15:40:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + + * gst/rtpmanager/rtpsource.c: + rtpsource: byteswap the port from GstNetAddress + Since the port in GstNetAddress is in network order we might need to byteswap it + before adding it to the source statistics. + +2009-05-11 19:30:34 +0200 Edward Hervey <bilboed@bilboed.com> + + * gst/mpegdemux/gstpesfilter.c: + gstpesfilter: Directly use gst_adapter_take_buffer(). + +2009-05-25 16:27:34 +0200 Edward Hervey <bilboed@bilboed.com> + + * gst/mpegdemux/gstpesfilter.c: + gstpesfilter: Don't peek the adapter if we don't have enough data. + +2009-05-25 16:25:42 +0200 Edward Hervey <bilboed@bilboed.com> + + * gst/mpegdemux/gstpesfilter.c: + gstpesfilter: Don't skip private streams PES but push them out. + The one thing we *DO* need to do for those streams is to skip all + the PTS/DTS/Scrambling/DSM/extension/... handling. + +2009-05-25 15:21:52 +0200 Edward Hervey <bilboed@bilboed.com> + + * gst/mpegdemux/gstmpegtsdemux.c: + mpegtsdemux: Ignore NULL packets as early as possible. + This avoids: + * creating a MpegTSStream structure for nothing + * processing packet data for nothing + +2009-05-25 15:21:12 +0200 Edward Hervey <bilboed@bilboed.com> + + * gst/mpegdemux/gstmpegdefs.h: + * gst/mpegdemux/gstmpegtsdemux.c: + mpegtsdemux: Add mapping for HDV private streams + +2009-05-25 17:24:32 +0200 Mathias Hasselmann <mathias.hasselmann at gmx.de> + + * ext/neon/gstneonhttpsrc.c: + * ext/neon/gstneonhttpsrc.h: + neonhttp: add property to support SS cerificates + Add a property to support self-signed certificates in neonhttpsrc. This property + is FALSE by default. + Fixes #511097 + +2009-05-25 13:46:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: remove ptdemux ghostpads + +2009-05-25 13:33:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + + * tests/check/elements/rtpbin.c: + tests: add receive rtpbin unit test + +2009-05-25 11:18:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: add multipass-cache-file property + Fixes #583627 + +2009-05-23 13:11:28 +0100 Christian Schaller <christian.schaller@collabora.co.uk> + + * gst-plugins-bad.spec.in: + Update spec file + +2009-05-22 16:56:52 -0700 Michael Smith <msmith@songbirdnest.com> + + * common: + * configure.ac: + * gst/adpcmdec/Makefile.am: + * gst/adpcmdec/adpcmdec.c: + adpcmdec: Add new plugin for ms-adpcm decoding. + +2009-05-20 16:46:49 +0200 Edward Hervey <bilboed@bilboed.com> + + * gst/mpegvideoparse/mpegpacketiser.c: + * gst/mpegvideoparse/mpegpacketiser.h: + * gst/mpegvideoparse/mpegvideoparse.c: + mpegvideoparse: Detect interlaced content and set it on outgoing caps. + I also added the parsing of all the other bits in the sequence extension + header in case we need it later. + +2009-05-22 16:41:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: add to new signal to remove SSRC pads + +2009-05-22 16:35:20 +0200 Ali Sabil <ali.sabil at gmail.com> + + * gst/rtpmanager/gstrtpbin-marshal.list: + * gst/rtpmanager/gstrtpssrcdemux.c: + * gst/rtpmanager/gstrtpssrcdemux.h: + ssrcdemux: emit signal when pads are removed + Add action signal to clear an SSRC in the ssrc demuxer. + Add signal to notify of removed ssrc. + See #554839 + +2009-05-22 15:45:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: use our ghostpads instead of its target + Since we keep a reference to our ghostpads, we can use them to track sessions. + This avoid us having to mess with the target of the ghostpad. + +2009-05-22 15:37:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + + * tests/check/elements/rtpbin.c: + tests: more rtpbin checks + +2009-05-22 15:36:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: don't warn when getting request pads twice + Allow getting the request pads multiple times, just return the previously + created pads. + +2009-05-22 13:47:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + + * gst/rtpmanager/rtpsource.c: + rtpsource: add RTP and RTCP source address + Add the RTP and RTCP sender addresses in the stats structure. + +2009-05-22 13:45:15 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + + * gst/rtpmanager/gstrtpsession.c: + rtpsession: reuse source code for SDES + Reuse the RTPSource object property instead of duplicating code. + +2009-05-22 13:44:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + + * tests/check/elements/rtpbin.c: + tests: add more rtpbin tests + +2009-05-22 12:23:27 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + + * tests/check/Makefile.am: + * tests/check/elements/.gitignore: + * tests/check/elements/rtpbin.c: + tests: add rtpbin unit test + Add the beginnings of an rtpbin unit test + Add some more stuff to .gitignore + +2009-05-22 12:20:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: set target state on new elements + Set the state on newly added elements to the state of the parent. + Add some debug info and do some cleanups + +2009-05-22 11:59:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: unref requests pads after releasing + +2009-05-21 16:00:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + + * gst/mpegdemux/gstmpegtsdemux.c: + mpegtsdemux: fix memleaks and refcounts + Use correct constants for PID_type so that we clear the right filter. + provide_clock must return a ref to a clock. + +2009-05-22 09:55:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * autogen.sh: + * configure.ac: + autotools: move -Wno-portability for automake to configure.ac + +2009-05-22 09:54:57 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * gst/id3tag/gstid3tag.c: + * gst/id3tag/gstid3tag.h: + * gst/id3tag/id3tag.c: + id3tag: canonicalise function names + +2009-05-22 09:51:29 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * gst/id3tag/gstid3tag.c: + * gst/id3tag/gstid3tag.h: + * gst/id3tag/gsttagmux.c: + id3tag: change GType to GstId3Tag so it doesn't conflict with the id3tag plugin in -ugly + +2009-05-22 01:29:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * win32/common/config.h: + win32: update config.h + +2009-05-22 01:27:09 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * gst/id3tag/gsttagmux.c: + id3tag: register GType of the base class with a less generic name + .. so we can easily move the base class into -base later without + causing GType name conflicts. + +2009-05-22 01:04:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + + * common: + * m4/gst-fionread.m4: + m4: fix 'suspicious cache value id' warnings in gst-fionread.m4 + And update common to pull in a related fix from there. + +2009-05-22 01:43:50 +0200 Olivier Crête <olivier.crete@collabora.co.uk> + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Implement releasing the streams + See #561752 + +2009-05-22 01:16:11 +0200 Olivier Crête <olivier.crete@collabora.co.uk> + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Keep jb signals handler + Keep the signal handlers so they can be disconnected at release time + See #561752 + +2009-05-22 01:12:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: use the right lock for the sessions + Use the right lock when iterating the sessions. + +2009-05-22 01:03:55 +0200 Olivier Crête <olivier.crete@collabora.co.uk> + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Free session if request pads are released + Free the session when all the request pads are released. + Don't mess with the session list in free_session as it is called from a foreach + on that list. + Set the state of the upstream element to NULL first. + See #561752 + +2009-05-22 00:51:53 +0200 Olivier Crête <olivier.crete@collabora.co.uk> + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Implement relasing of the rtp recv pad + +2009-05-22 00:44:51 +0200 Olivier Crête <olivier.crete@collabora.co.uk> + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Implement releasing of rtp send pads + +2009-05-22 00:34:36 +0200 Olivier Crête <olivier.crete@collabora.co.uk> + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Implement release of the recv rtcp pad + See #561752 + +2009-05-22 00:16:19 +0200 Olivier Crête <olivier.crete@collabora.co.uk> + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Implement releasing of rtcp src pad + See #561752 + +2009-05-18 23:38:59 +0100 Jan Schmidt <thaytan@noraisin.net> + + * ext/dts/gstdtsdec.c: + * ext/dts/gstdtsdec.h: + dtsdec: Reconcile element code with a52dec changes + Re-work the dtsdec element code to unify it with changes made it a52dec, + including support for reverse playback and dynamic channel negotiation + on the source pad. + +2009-05-21 21:35:32 +0100 Jan Schmidt <thaytan@noraisin.net> + + * win32/common/config.h: + win32: Update the win32 config.h + +2009-05-18 23:21:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + + * gst/sdp/gstsdpdemux.c: + * gst/sdp/gstsdpdemux.h: + sdpdemux: rework RTCP sending and RTP receiving + When we are dealing with multiast, create the udp src and sink elements pointing + to the multicast addresses. When we are doing unicast, receive data on the local + ports and don't send RTCP because we don't know where we have to send it. + Fixes #583188 + +2009-05-21 13:15:46 -0700 Michael Smith <msmith@songbirdnest.com> + + * configure.ac: + * gst/id3tag/Makefile.am: + * gst/id3tag/gstid3tag.c: + * gst/id3tag/gstid3tag.h: + * gst/id3tag/gsttagmux.c: + * gst/id3tag/gsttagmux.h: + * gst/id3tag/id3tag.c: + * gst/id3tag/id3tag.h: + id3tag: Add new id3 tagging plugin, supports v1, v2.3, and v2.4. + By default, does v1 and v2.3, but there are properties to select. + Will hopefully replace id3mux, id3v2mux, in the not-too-distant future. + +2009-05-21 21:02:55 +0100 Jan Schmidt <thaytan@noraisin.net> + + * configure.ac: + Back to hacking -> 0.10.12.1 + === release 0.10.12 === -2009-05-20 Jan Schmidt <jan.schmidt@sun.com> +2009-05-20 22:31:54 +0100 Jan Schmidt <thaytan@noraisin.net> + * ChangeLog: + * NEWS: + * RELEASE: * configure.ac: - releasing 0.10.12, "More than I can handle" + * docs/plugins/gst-plugins-bad-plugins.args: + * docs/plugins/gst-plugins-bad-plugins.hierarchy: + * docs/plugins/gst-plugins-bad-plugins.interfaces: + * docs/plugins/gst-plugins-bad-plugins.prerequisites: + * docs/plugins/inspect/plugin-aacparse.xml: + * docs/plugins/inspect/plugin-aiffparse.xml: + * docs/plugins/inspect/plugin-alsaspdif.xml: + * docs/plugins/inspect/plugin-amrparse.xml: + * docs/plugins/inspect/plugin-apex.xml: + * docs/plugins/inspect/plugin-autoconvert.xml: + * docs/plugins/inspect/plugin-bayer.xml: + * docs/plugins/inspect/plugin-bz2.xml: + * docs/plugins/inspect/plugin-camerabin.xml: + * docs/plugins/inspect/plugin-cdaudio.xml: + * docs/plugins/inspect/plugin-cdxaparse.xml: + * docs/plugins/inspect/plugin-celt.xml: + * docs/plugins/inspect/plugin-dc1394.xml: + * docs/plugins/inspect/plugin-dccp.xml: + * docs/plugins/inspect/plugin-debugutilsbad.xml: + * docs/plugins/inspect/plugin-dfbvideosink.xml: + * docs/plugins/inspect/plugin-dirac.xml: + * docs/plugins/inspect/plugin-dtmf.xml: + * docs/plugins/inspect/plugin-dtsdec.xml: + * docs/plugins/inspect/plugin-dvb.xml: + * docs/plugins/inspect/plugin-dvdspu.xml: + * docs/plugins/inspect/plugin-faac.xml: + * docs/plugins/inspect/plugin-faad.xml: + * docs/plugins/inspect/plugin-fbdevsink.xml: + * docs/plugins/inspect/plugin-festival.xml: + * docs/plugins/inspect/plugin-freeze.xml: + * docs/plugins/inspect/plugin-gsm.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-gstsiren.xml: + * docs/plugins/inspect/plugin-h264parse.xml: + * docs/plugins/inspect/plugin-jack.xml: + * docs/plugins/inspect/plugin-ladspa.xml: + * docs/plugins/inspect/plugin-legacyresample.xml: + * docs/plugins/inspect/plugin-liveadder.xml: + * docs/plugins/inspect/plugin-metadata.xml: + * docs/plugins/inspect/plugin-mms.xml: + * docs/plugins/inspect/plugin-modplug.xml: + * docs/plugins/inspect/plugin-mpeg2enc.xml: + * docs/plugins/inspect/plugin-mpeg4videoparse.xml: + * docs/plugins/inspect/plugin-mpegdemux2.xml: + * docs/plugins/inspect/plugin-mpegtsmux.xml: + * docs/plugins/inspect/plugin-mpegvideoparse.xml: + * docs/plugins/inspect/plugin-mplex.xml: + * docs/plugins/inspect/plugin-musepack.xml: + * docs/plugins/inspect/plugin-musicbrainz.xml: + * docs/plugins/inspect/plugin-mve.xml: + * docs/plugins/inspect/plugin-mxf.xml: + * docs/plugins/inspect/plugin-mythtv.xml: + * docs/plugins/inspect/plugin-nas.xml: + * docs/plugins/inspect/plugin-neon.xml: + * docs/plugins/inspect/plugin-nsfdec.xml: + * docs/plugins/inspect/plugin-nuvdemux.xml: + * docs/plugins/inspect/plugin-ofa.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-pcapparse.xml: + * docs/plugins/inspect/plugin-qtmux.xml: + * docs/plugins/inspect/plugin-rawparse.xml: + * docs/plugins/inspect/plugin-real.xml: + * docs/plugins/inspect/plugin-resindvd.xml: + * docs/plugins/inspect/plugin-rfbsrc.xml: + * docs/plugins/inspect/plugin-rtpmux.xml: + * docs/plugins/inspect/plugin-scaletempo.xml: + * docs/plugins/inspect/plugin-sdl.xml: + * docs/plugins/inspect/plugin-sdp.xml: + * docs/plugins/inspect/plugin-selector.xml: + * docs/plugins/inspect/plugin-sndfile.xml: + * docs/plugins/inspect/plugin-soundtouch.xml: + * docs/plugins/inspect/plugin-spcdec.xml: + * docs/plugins/inspect/plugin-speed.xml: + * docs/plugins/inspect/plugin-stereo.xml: + * docs/plugins/inspect/plugin-subenc.xml: + * docs/plugins/inspect/plugin-tta.xml: + * docs/plugins/inspect/plugin-valve.xml: + * docs/plugins/inspect/plugin-vcdsrc.xml: + * docs/plugins/inspect/plugin-videosignal.xml: + * docs/plugins/inspect/plugin-vmnc.xml: + * docs/plugins/inspect/plugin-wildmidi.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xdgmime.xml: + * docs/plugins/inspect/plugin-xvid.xml: + * gst-plugins-bad.doap: + * win32/common/config.h: + Release 0.10.12 + +2009-05-20 20:44:12 +0100 Jan Schmidt <thaytan@noraisin.net> + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/en_GB.po: + * po/es.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ky.po: + * po/lt.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files 2009-05-20 17:10:40 +0200 Edward Hervey <bilboed@bilboed.com> @@ -1,4 +1,32 @@ -This is GStreamer Bad Plug-ins 0.10.11, "More than I can handle" +This is GStreamer Bad Plug-ins 0.10.13, "Supersonic Rocket" + +Changes since 0.10.12: + + * New shapewipe video transition plugin + * qtmux improvements + * camerabin improvements + * HDV MPEG-TS private streams support + * Output interlacing information in mpegvideoparse + * MS-ADPCM decoder + * RTP fixes and enhancements + * DTS decoder improvements + * New ID3 tagging plugin that supports v1, v2.3 and v2.4 + * Support for PGS (BluRay) subtitles + * Many other bug fixes and enhancements + +Bugs fixed since 0.10.12: + + * 584945 : camerabin unit tests failing + * 511097 : Support self-signed certificates in neonhttpsrc + * 561752 : GstRtpBin implement Release pad functions + * 584164 : gstspu-pgs.c warnings for format string args and uninitia... + * 584165 : rtpbin sdes message broken + * 584360 : gppmux ftyp + * 585015 : debugutils can't find libgstinterfaces + * 585660 : segfault in scaletempo plugin + * 584114 : gppmux and h263 + * 583188 : Problem with sdp: bind failed or video disappear after fe... + * 583627 : statistic file name needs to be standardized Changes since 0.10.11: @@ -1,5 +1,5 @@ -Release notes for GStreamer Bad Plug-ins 0.10.12 "More than I can handle" +Release notes for GStreamer Bad Plug-ins 0.10.13 "Supersonic Rocket" @@ -60,62 +60,31 @@ contains a set of well-supported plug-ins, but might pose problems for Features of this release - * Presets support in several elements - * Support ITV MPEG-TS streams - * New element: flvmux - * New element: osxvideosrc - * Fixes in RTP elements - * camerabin fixes - * Improved QT/mp4 muxing - * xdgmime based content type guessing - * deinterlace2 moved to the Good plugins (replacing deinterlace) - * Support for MXF muxing, and improved MXF demuxing - * Greatly improved DVD playback - * DirectDraw element moved back from Good plugins - * Many other bug fixes and improvements + * New shapewipe video transition plugin + * qtmux improvements + * camerabin improvements + * HDV MPEG-TS private streams support + * Output interlacing information in mpegvideoparse + * MS-ADPCM decoder + * RTP fixes and enhancements + * DTS decoder improvements + * New ID3 tagging plugin that supports v1, v2.3 and v2.4 + * Support for PGS (BluRay) subtitles + * Many other bug fixes and enhancements Bugs fixed in this release - * 573852 : Update celt to 0.5.x - * 574401 : metadatamux fails^WIS failure - * 580091 : soundtouch plugin fails to load - * 153684 : [osxvideosrc] Mac users needs an osxvideosrc - * 537700 : [scaletempo] Scale audio tempo in sync with playback rate - * 569437 : mpegtsparse: flow error or crashes while dynamicly changi... - * 569673 : [Mpegtsparse] PAT changes not always signaled - * 569781 : [Mpegtsparse] drop of valid TS packets - * 573595 : plugins-bad mingw ports - * 573846 : Check for soundtouch-1.4 too - * 573847 : Use SDL static-libs for conftest and libs for gstsdl* - * 573848 : Use native CPU number detection in mpeg2enc - * 573849 : modplug's sndfile.h conflicts with libsndfile's sndfile.h - * 575388 : [aacparse] deadlocks in busy loop when seeking - * 575736 : mpeg2enc's bitrate parameter does not work properly - * 576408 : [playbin2] Deadlock when using resindvd as source - * 577690 : rtpdtmfmux: missing pad unref - * 577864 : [residvd] dvdnav version requirements should be higher - * 578112 : x264enc: I-frame request - * 578562 : dshowdecwrapper missing check for GST_DISABLE_GST_DEBUG - * 578563 : win32 export files are not disted - * 580133 : Regression in baseparse since last release - * 580144 : emit notify::internal-ssrc when there is a ssrc collision - * 580786 : [flvmux] " uninitialized variable " compiler warning - * 580901 : Uninitialized variable may be used in fpsdisplaysink.c - * 581375 : rtpssrcdemux crashes on SR-less rtcp packets - * 582013 : uninitialized var in mxfmux.c prevents gst-plugins-bad bu... - * 582074 : [faad] Fails to build with faad 2.6 (misdetected as 2.7) - * 582208 : [PATCH] fix for soundtouch-1.4 - * 582483 : y4menc doesn't pass timestamps on - * 582656 : [mxfdemux] Fix deadlock when querying from the pad-added ... - * 582702 : qtmux: crash in atom_moov_add_blob_tag - * 583337 : [mxfmux] Wrong layout for non-interlaced formats - * 580585 : rtpmux memleak - * 577843 : input-selector causes problems with DVD menus in playbin2 - * 581593 : gppmux doesn't support MPEG4 part 2 in sink caps - * 575284 : add auto-connect-forced mode to jackaudiosrc and jackaudi... - * 576021 : On Windows qtmux can't write files longer than 2-4 GiB, u... - * 576712 : Output-selector keeps reference to latest buffer when cha... - * 581427 : [mpeg4videoparse] config buffer is leaked + * 584945 : camerabin unit tests failing + * 511097 : Support self-signed certificates in neonhttpsrc + * 561752 : GstRtpBin implement Release pad functions + * 584164 : gstspu-pgs.c warnings for format string args and uninitia... + * 584165 : rtpbin sdes message broken + * 584360 : gppmux ftyp + * 585015 : debugutils can't find libgstinterfaces + * 585660 : segfault in scaletempo plugin + * 584114 : gppmux and h263 + * 583188 : Problem with sdp: bind failed or video disappear after fe... + * 583627 : statistic file name needs to be standardized Download @@ -144,38 +113,18 @@ Applications Contributors to this release - * Alan Falloon - * Alessandro Decina - * Andy Wingo - * Arnout Vandecappelle + * Ali Sabil * Christian Schaller - * David Schleef * Edward Hervey - * Felipe Contreras - * Haakon Sporsheim * Jan Schmidt - * Janin Kolenc - * Julien Moutte * Lasse Laukkanen - * Laurent Glayal - * Marc-Andre Lureau * Mark Nauwelaerts + * Mathias Hasselmann * Michael Smith - * Ole André Vadla Ravnås * Olivier Crête - * René Stadler - * Rov Juvano * Sebastian Dröge - * Sergey Scobich * Stefan Kost - * Sébastien Moutte - * Thiago Santos - * Thomas Vander Stichele * Tim-Philipp Müller * Tristan Matthews - * Vincent Genieux - * Vincent Torri * Wim Taymans - * Zaheer Abbas Merali - * Руслан Ижбулатов
\ No newline at end of file diff --git a/common b/common -Subproject c57272152d5c40617fab305d839db1b1fefe0ea +Subproject f3bb51b867ff403f70d36fc772861d8e57c703e diff --git a/configure.ac b/configure.ac index 294348d7..7cc268ad 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ(2.52) dnl initialize autoconf dnl when going to/from release please set the nano (fourth number) right ! dnl releases only do Wall, cvs and prerelease does Werror too -AC_INIT(GStreamer Bad Plug-ins, 0.10.12.1, +AC_INIT(GStreamer Bad Plug-ins, 0.10.13.1, http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer, gst-plugins-bad) @@ -45,8 +45,8 @@ AC_LIBTOOL_WIN32_DLL AM_PROG_LIBTOOL dnl *** required versions of GStreamer stuff *** -GST_REQ=0.10.22.1 -GSTPB_REQ=0.10.22.1 +GST_REQ=0.10.23.1 +GSTPB_REQ=0.10.23.1 dnl *** autotools stuff **** @@ -265,6 +265,7 @@ AG_GST_CHECK_PLUGIN(dtmf) AG_GST_CHECK_PLUGIN(dvdspu) AG_GST_CHECK_PLUGIN(festival) AG_GST_CHECK_PLUGIN(freeze) +AG_GST_CHECK_PLUGIN(frei0r) AG_GST_CHECK_PLUGIN(h264parse) AG_GST_CHECK_PLUGIN(hdvparse) AG_GST_CHECK_PLUGIN(id3tag) @@ -1367,29 +1368,6 @@ AG_GST_CHECK_FEATURE(THEORADEC, [ogg theora codec], theoraexpdec, [ AC_SUBST(THEORADEC_CFLAGS) ]) -dnl *** x264 (MPEG-4 part 10/h.264/AVC encoder) *** -translit(dnm, m, l) AM_CONDITIONAL(USE_X264, true) -AG_GST_CHECK_FEATURE(X264, [x264 plug-in], x264, [ - AG_GST_CHECK_LIBHEADER(X264, x264, x264_nal_encode, -lm, x264.h, - AC_MSG_CHECKING([for uptodate x264 API version]) - dnl _stdint not yet generated, so no compiling - AC_TRY_CPP([ - #include <x264.h> - #if X264_BUILD < 55 - #error "x264 build too old" - #endif - ], [ - AC_MSG_RESULT(yes) - X264_LIBS="$LDFLAGS -lx264 -lm" - X264_CFLAGS="$CFLAGS" - AC_SUBST(X264_LIBS) - AC_SUBST(X264_CFLAGS) - ], [ - AC_MSG_RESULT(no) - HAVE_X264=no - ])) -]) - dnl *** XVID *** translit(dnm, m, l) AM_CONDITIONAL(USE_XVID, true) AG_GST_CHECK_FEATURE(XVID, [xvid plugins], xvid, [ @@ -1502,7 +1480,6 @@ AM_CONDITIONAL(USE_SPC, false) AM_CONDITIONAL(USE_SWFDEC, false) AM_CONDITIONAL(USE_THEORADEC, false) AM_CONDITIONAL(USE_TIMIDITY, false) -AM_CONDITIONAL(USE_X264, false) AM_CONDITIONAL(USE_XVID, false) AM_CONDITIONAL(USE_WILDMIDI, false) AM_CONDITIONAL(USE_WININET, false) @@ -1589,6 +1566,7 @@ gst/dtmf/Makefile gst/dvdspu/Makefile gst/festival/Makefile gst/freeze/Makefile +gst/frei0r/Makefile gst/h264parse/Makefile gst/hdvparse/Makefile gst/id3tag/Makefile @@ -1690,7 +1668,6 @@ ext/spc/Makefile ext/swfdec/Makefile ext/theora/Makefile ext/timidity/Makefile -ext/x264/Makefile ext/xvid/Makefile po/Makefile.in docs/Makefile diff --git a/docs/plugins/Makefile.am b/docs/plugins/Makefile.am index 2da695b4..03b2e71c 100644 --- a/docs/plugins/Makefile.am +++ b/docs/plugins/Makefile.am @@ -7,7 +7,7 @@ GST_DOC_SCANOBJ = $(top_srcdir)/common/gstdoc-scangobj MODULE=gst-plugins-bad DOC_MODULE=$(MODULE)-plugins -# for upload.mak +# for upload-doc.mak DOC=$(MODULE)-plugins FORMATS=html html: html-build.stamp @@ -115,7 +115,6 @@ EXTRA_HFILES = \ $(top_srcdir)/ext/theora/theoradec.h \ $(top_srcdir)/ext/timidity/gsttimidity.h \ $(top_srcdir)/ext/timidity/gstwildmidi.h \ - $(top_srcdir)/ext/x264/gstx264enc.h \ $(top_srcdir)/gst/aacparse/gstaacparse.h \ $(top_srcdir)/gst/amrparse/gstamrparse.h \ $(top_srcdir)/gst/autoconvert/gstautoconvert.h \ diff --git a/docs/plugins/gst-plugins-bad-plugins-docs.sgml b/docs/plugins/gst-plugins-bad-plugins-docs.sgml index 212bcb11..959c9cb1 100644 --- a/docs/plugins/gst-plugins-bad-plugins-docs.sgml +++ b/docs/plugins/gst-plugins-bad-plugins-docs.sgml @@ -84,7 +84,6 @@ <xi:include href="xml/element-videomark.xml" /> <xi:include href="xml/element-videoparse.xml" /> <xi:include href="xml/element-wildmidi.xml" /> - <xi:include href="xml/element-x264enc.xml" /> </chapter> <chapter> @@ -163,7 +162,6 @@ <xi:include href="xml/plugin-videosignal.xml" /> <xi:include href="xml/plugin-vmnc.xml" /> <xi:include href="xml/plugin-wildmidi.xml" /> - <xi:include href="xml/plugin-x264.xml" /> <xi:include href="xml/plugin-xvid.xml" /> </chapter> diff --git a/docs/plugins/gst-plugins-bad-plugins-sections.txt b/docs/plugins/gst-plugins-bad-plugins-sections.txt index 7cc8df91..70afb729 100644 --- a/docs/plugins/gst-plugins-bad-plugins-sections.txt +++ b/docs/plugins/gst-plugins-bad-plugins-sections.txt @@ -1027,19 +1027,6 @@ GST_TYPE_WILDMIDI </SECTION> <SECTION> -<FILE>element-x264enc</FILE> -<TITLE>x264enc</TITLE> -GstX264Enc -<SUBSECTION Standard> -GstX264EncClass -GST_X264_ENC -GST_X264_ENC_CLASS -GST_IS_X264_ENC -GST_IS_X264_ENC_CLASS -GST_TYPE_X264_ENC -</SECTION> - -<SECTION> <FILE>element-mimdec</FILE> <TITLE>mimdec</TITLE> GstMimDec diff --git a/docs/plugins/gst-plugins-bad-plugins.args b/docs/plugins/gst-plugins-bad-plugins.args index d8c6df1b..b13244f2 100644 --- a/docs/plugins/gst-plugins-bad-plugins.args +++ b/docs/plugins/gst-plugins-bad-plugins.args @@ -41,7 +41,7 @@ <ARG> <NAME>GstXvidEnc::averaging-period</NAME> <TYPE>gint</TYPE> -<RANGE>[G_MAXULONG,100]</RANGE> +<RANGE>[-1,100]</RANGE> <FLAGS>rw</FLAGS> <NICK>Averaging Period</NICK> <BLURB>[CBR] Number of frames for which XviD averages bitrate.</BLURB> @@ -91,7 +91,7 @@ <ARG> <NAME>GstXvidEnc::buffer</NAME> <TYPE>gint</TYPE> -<RANGE>>= G_MAXULONG</RANGE> +<RANGE>>= -1</RANGE> <FLAGS>rw</FLAGS> <NICK>Buffer Size</NICK> <BLURB>[CBR] Size of the video buffers.</BLURB> @@ -121,7 +121,7 @@ <ARG> <NAME>GstXvidEnc::container-frame-overhead</NAME> <TYPE>gint</TYPE> -<RANGE>[G_MAXULONG,100]</RANGE> +<RANGE>[-1,100]</RANGE> <FLAGS>rw</FLAGS> <NICK>Container Frame Overhead</NICK> <BLURB>[PASS2] Average container overhead per frame.</BLURB> @@ -151,7 +151,7 @@ <ARG> <NAME>GstXvidEnc::flow-control-strength</NAME> <TYPE>gint</TYPE> -<RANGE>[G_MAXULONG,100]</RANGE> +<RANGE>[-1,100]</RANGE> <FLAGS>rw</FLAGS> <NICK>Flow Control Strength</NICK> <BLURB>[PASS2] Overflow control strength per frame.</BLURB> @@ -211,7 +211,7 @@ <ARG> <NAME>GstXvidEnc::keyframe-reduction</NAME> <TYPE>gint</TYPE> -<RANGE>[G_MAXULONG,100]</RANGE> +<RANGE>[-1,100]</RANGE> <FLAGS>rw</FLAGS> <NICK>Keyframe Reduction</NICK> <BLURB>[PASS2] Keyframe size reduction in % of those within threshold.</BLURB> @@ -221,7 +221,7 @@ <ARG> <NAME>GstXvidEnc::keyframe-threshold</NAME> <TYPE>gint</TYPE> -<RANGE>[G_MAXULONG,100]</RANGE> +<RANGE>[-1,100]</RANGE> <FLAGS>rw</FLAGS> <NICK>Keyframe Threshold</NICK> <BLURB>[PASS2] Distance between keyframes not to be subject to reduction.</BLURB> @@ -281,7 +281,7 @@ <ARG> <NAME>GstXvidEnc::max-overflow-degradation</NAME> <TYPE>gint</TYPE> -<RANGE>[G_MAXULONG,100]</RANGE> +<RANGE>[-1,100]</RANGE> <FLAGS>rw</FLAGS> <NICK>Max Overflow Degradation</NICK> <BLURB>[PASS2] Amount in % that flow control can decrease frame size compared to ideal curve.</BLURB> @@ -291,7 +291,7 @@ <ARG> <NAME>GstXvidEnc::max-overflow-improvement</NAME> <TYPE>gint</TYPE> -<RANGE>[G_MAXULONG,100]</RANGE> +<RANGE>[-1,100]</RANGE> <FLAGS>rw</FLAGS> <NICK>Max Overflow Improvement</NICK> <BLURB>[PASS2] Amount in % that flow control can increase frame size compared to ideal curve.</BLURB> @@ -421,7 +421,7 @@ <ARG> <NAME>GstXvidEnc::reaction-delay-factor</NAME> <TYPE>gint</TYPE> -<RANGE>[G_MAXULONG,100]</RANGE> +<RANGE>[-1,100]</RANGE> <FLAGS>rw</FLAGS> <NICK>Reaction Delay Factor</NICK> <BLURB>[CBR] Reaction delay factor.</BLURB> @@ -1691,7 +1691,7 @@ <ARG> <NAME>GstDvbSrc::diseqc-source</NAME> <TYPE>gint</TYPE> -<RANGE>[G_MAXULONG,7]</RANGE> +<RANGE>[-1,7]</RANGE> <FLAGS>rw</FLAGS> <NICK>diseqc source</NICK> <BLURB>DISEqC selected source (-1 disabled) (DVB-S).</BLURB> @@ -17475,7 +17475,7 @@ <FLAGS>rw</FLAGS> <NICK>Path where to search for RealPlayer codecs</NICK> <BLURB>Path where to search for RealPlayer codecs.</BLURB> -<DEFAULT>"/usr/lib64/win32:/usr/lib64/codecs:/usr/local/lib64/win32:/usr/local/lib64/codecs"</DEFAULT> +<DEFAULT>"/usr/lib/win32:/usr/lib/codecs:/usr/local/RealPlayer/codecs:/usr/local/lib/win32:/usr/local/lib/codecs"</DEFAULT> </ARG> <ARG> @@ -17515,7 +17515,7 @@ <FLAGS>rw</FLAGS> <NICK>Path where to search for RealPlayer codecs</NICK> <BLURB>Path where to search for RealPlayer codecs.</BLURB> -<DEFAULT>"/usr/lib64/win32:/usr/lib64/codecs:/usr/local/lib64/win32:/usr/local/lib64/codecs"</DEFAULT> +<DEFAULT>"/usr/lib/win32:/usr/lib/codecs:/usr/local/RealPlayer/codecs:/usr/local/lib/win32:/usr/local/lib/codecs"</DEFAULT> </ARG> <ARG> @@ -18451,7 +18451,7 @@ <ARG> <NAME>DvbBaseBin::diseqc-source</NAME> <TYPE>gint</TYPE> -<RANGE>[G_MAXULONG,7]</RANGE> +<RANGE>[-1,7]</RANGE> <FLAGS>rw</FLAGS> <NICK>diseqc source</NICK> <BLURB>DISEqC selected source (-1 disabled) (DVB-S).</BLURB> @@ -22309,14 +22309,14 @@ <RANGE>[0,150]</RANGE> <FLAGS>rw</FLAGS> <NICK>Encoding Bit-rate</NICK> -<BLURB>Specify an encoding bit-rate (in bps). (0 = automatic).</BLURB> -<DEFAULT>128</DEFAULT> +<BLURB>Specify an encoding bit-rate (in Kbps). (0 = automatic).</BLURB> +<DEFAULT>64</DEFAULT> </ARG> <ARG> <NAME>GstCeltEnc::framesize</NAME> <TYPE>gint</TYPE> -<RANGE>[64,256]</RANGE> +<RANGE>[64,512]</RANGE> <FLAGS>rw</FLAGS> <NICK>Frame Size</NICK> <BLURB>The number of samples per frame.</BLURB> @@ -22396,7 +22396,7 @@ <ARG> <NAME>GstDCCPClientSrc::sockfd</NAME> <TYPE>gint</TYPE> -<RANGE>>= G_MAXULONG</RANGE> +<RANGE>>= -1</RANGE> <FLAGS>rw</FLAGS> <NICK>Socket fd</NICK> <BLURB>The socket file descriptor.</BLURB> @@ -22436,7 +22436,7 @@ <ARG> <NAME>GstDCCPServerSink::sockfd</NAME> <TYPE>gint</TYPE> -<RANGE>>= G_MAXULONG</RANGE> +<RANGE>>= -1</RANGE> <FLAGS>rw</FLAGS> <NICK>Socket fd</NICK> <BLURB>The client socket file descriptor.</BLURB> @@ -22496,7 +22496,7 @@ <ARG> <NAME>GstDCCPClientSink::sockfd</NAME> <TYPE>gint</TYPE> -<RANGE>>= G_MAXULONG</RANGE> +<RANGE>>= -1</RANGE> <FLAGS>rw</FLAGS> <NICK>Socket fd</NICK> <BLURB>The socket file descriptor.</BLURB> @@ -22556,7 +22556,7 @@ <ARG> <NAME>GstDCCPServerSrc::sockfd</NAME> <TYPE>gint</TYPE> -<RANGE>>= G_MAXULONG</RANGE> +<RANGE>>= -1</RANGE> <FLAGS>rw</FLAGS> <NICK>Socket fd</NICK> <BLURB>The client socket file descriptor.</BLURB> @@ -22616,7 +22616,7 @@ <ARG> <NAME>GstMpegTSDemux::program-number</NAME> <TYPE>gint</TYPE> -<RANGE>>= G_MAXULONG</RANGE> +<RANGE>>= -1</RANGE> <FLAGS>rw</FLAGS> <NICK>Program Number</NICK> <BLURB>Program number to demux for (-1 to ignore).</BLURB> @@ -22676,7 +22676,7 @@ <ARG> <NAME>GstPcapParse::dst-port</NAME> <TYPE>gint</TYPE> -<RANGE>[G_MAXULONG,65535]</RANGE> +<RANGE>[-1,65535]</RANGE> <FLAGS>rw</FLAGS> <NICK>Destination port</NICK> <BLURB>Destination port to restrict to.</BLURB> @@ -22696,7 +22696,7 @@ <ARG> <NAME>GstPcapParse::src-port</NAME> <TYPE>gint</TYPE> -<RANGE>[G_MAXULONG,65535]</RANGE> +<RANGE>[-1,65535]</RANGE> <FLAGS>rw</FLAGS> <NICK>Source port</NICK> <BLURB>Source port to restrict to.</BLURB> @@ -23049,7 +23049,7 @@ <RANGE></RANGE> <FLAGS>rw</FLAGS> <NICK>Filter caps</NICK> -<BLURB>Capsfilter caps used to control video source operation.</BLURB> +<BLURB>Filter video data coming from videosrc element.</BLURB> <DEFAULT></DEFAULT> </ARG> @@ -23164,6 +23164,16 @@ </ARG> <ARG> +<NAME>GstCameraBin::preview-caps</NAME> +<TYPE>GstCaps*</TYPE> +<RANGE></RANGE> +<FLAGS>rw</FLAGS> +<NICK>Preview caps</NICK> +<BLURB>Caps defining the preview image format.</BLURB> +<DEFAULT></DEFAULT> +</ARG> + +<ARG> <NAME>GstDTMFSrc::interval</NAME> <TYPE>guint</TYPE> <RANGE>[10,50]</RANGE> @@ -23226,7 +23236,7 @@ <ARG> <NAME>GstRTPDTMFSrc::seqnum-offset</NAME> <TYPE>gint</TYPE> -<RANGE>>= G_MAXULONG</RANGE> +<RANGE>>= -1</RANGE> <FLAGS>rw</FLAGS> <NICK>Sequence number Offset</NICK> <BLURB>Offset to add to all outgoing seqnum (-1 = random).</BLURB> @@ -23256,7 +23266,7 @@ <ARG> <NAME>GstRTPDTMFSrc::timestamp-offset</NAME> <TYPE>gint</TYPE> -<RANGE>>= G_MAXULONG</RANGE> +<RANGE>>= -1</RANGE> <FLAGS>rw</FLAGS> <NICK>Timestamp Offset</NICK> <BLURB>Offset to add to all outgoing timestamps (-1 = random).</BLURB> @@ -23306,7 +23316,7 @@ <ARG> <NAME>GstRTPMux::seqnum-offset</NAME> <TYPE>gint</TYPE> -<RANGE>>= G_MAXULONG</RANGE> +<RANGE>>= -1</RANGE> <FLAGS>rw</FLAGS> <NICK>Sequence number Offset</NICK> <BLURB>Offset to add to all outgoing seqnum (-1 = random).</BLURB> @@ -23326,7 +23336,7 @@ <ARG> <NAME>GstRTPMux::timestamp-offset</NAME> <TYPE>gint</TYPE> -<RANGE>>= G_MAXULONG</RANGE> +<RANGE>>= -1</RANGE> <FLAGS>rw</FLAGS> <NICK>Timestamp Offset</NICK> <BLURB>Offset to add to all outgoing timestamps (-1 = random).</BLURB> @@ -23463,3 +23473,33 @@ <DEFAULT>0</DEFAULT> </ARG> +<ARG> +<NAME>GstId3Mux::v2-version</NAME> +<TYPE>gint</TYPE> +<RANGE>[3,4]</RANGE> +<FLAGS>rwx</FLAGS> +<NICK>Version (3 or 4) of id3v2 tag</NICK> +<BLURB>Set version (3 for id3v2.3, 4 for id3v2.4) of id3v2 tags.</BLURB> +<DEFAULT>3</DEFAULT> +</ARG> + +<ARG> +<NAME>GstId3Mux::write-v1</NAME> +<TYPE>gboolean</TYPE> +<RANGE></RANGE> +<FLAGS>rwx</FLAGS> +<NICK>Write id3v1 tag</NICK> +<BLURB>Write an id3v1 tag at the end of the file.</BLURB> +<DEFAULT>FALSE</DEFAULT> +</ARG> + +<ARG> +<NAME>GstId3Mux::write-v2</NAME> +<TYPE>gboolean</TYPE> +<RANGE></RANGE> +<FLAGS>rwx</FLAGS> +<NICK>Write id3v2 tag</NICK> +<BLURB>Write an id3v2 tag at the start of the file.</BLURB> +<DEFAULT>TRUE</DEFAULT> +</ARG> + diff --git a/docs/plugins/gst-plugins-bad-plugins.hierarchy b/docs/plugins/gst-plugins-bad-plugins.hierarchy index 112862ca..a1204ca6 100644 --- a/docs/plugins/gst-plugins-bad-plugins.hierarchy +++ b/docs/plugins/gst-plugins-bad-plugins.hierarchy @@ -13,58 +13,54 @@ GObject GstCameraBin RsnDvdBin DvbBaseBin + GstAutoConvert GstRtpBin GstRtpClient - FPSDisplaySink - GstAutoConvert GstSDPDemux - GstAmrwbDec - GstAmrwbParse - GstAmrwbEnc - GstBaseMetadata - GstMetadataDemux - GstMetadataMux - GstXvidEnc - GstXvidDec - GstFaad + GstFPSDisplaySink GstBz2enc GstBz2dec - GstCDAudio - GstX264Enc - GstBaseSink - GstVideoSink - GstDfbVideoSink - GstSDLVideoSink - GstBaseAudioSink - GstAudioSink - GstNasSink - GstSDLAudioSink - GstApExSink - GstOss4Sink - GstJackAudioSink - AlsaSPDIFSink - GstSFSink - GstFBDEVSink - GstDCCPServerSink - GstDCCPClientSink + GstMplex GstBaseSrc GstPushSrc + GstNeonhttpSrc GstMythtvSrc - GstMMS GstDc1394 + GstMMS GstBaseAudioSrc GstJackAudioSrc GstAudioSrc GstOss4Source - GstNeonhttpSrc 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 @@ -72,245 +68,103 @@ GObject GstStereo GstBayer2RGB GstScaletempo + GstHDVParse + GstDeinterlace GstVideoFilter GstVideoAnalyse GstVideoDetect GstVideoMark - GstAudioresample - GstDtsDec - GstFaac - GstMusepackDec - GstGSMEnc - GstGSMDec - GstModPlug - GstWildmidi + GstIIR + GstLegacyresample GstSignalProcessor - ladspa-flanger - ladspa-tap-rotspeak - ladspa-retroFlange - ladspa-triplePara - ladspa-tap-vibrato - ladspa-pitchScaleHQ - ladspa-matrixStMS - ladspa-imp - ladspa-analogueOsc - ladspa-hilbert - ladspa-notch-iir - ladspa-bodeShifter - ladspa-valveRect - ladspa-tap-sigmoid - ladspa-diode - ladspa-se4 - ladspa-pitchScale - ladspa-foldover - ladspa-freqTracker - ladspa-rateShifter - ladspa-inv - ladspa-sc1 - ladspa-ringmod-2i1o - ladspa-ringmod-1i1o1l - ladspa-impulse-fc - ladspa-tap-reverb + ladspa-noise-white + ladspa-delay-5s ladspa-amp-mono ladspa-amp-stereo - ladspa-stepMuxer - ladspa-tap-equalizer - ladspa-fastLookaheadLimiter - ladspa-artificialLatency - ladspa-gate - ladspa-delay-n - ladspa-delay-l - ladspa-delay-c - ladspa-bwxover-iir - ladspa-buttlow-iir - ladspa-butthigh-iir - ladspa-mbeq - ladspa-lsFilter - ladspa-const - ladspa-Pulse-VCO - ladspa-Saw-VCO - ladspa-Rec-VCO - ladspa-smoothDecimate - ladspa-giantFlange - ladspa-lfoPhaser - ladspa-fourByFourPole - ladspa-autoPhaser - ladspa-lpf - ladspa-hpf - ladspa-tap-autopan - ladspa-highpass-iir - ladspa-comb - ladspa-matrixSpatialiser - ladspa-comb-n - ladspa-comb-l - ladspa-comb-c - ladspa-lcrDelay - ladspa-combSplitter - ladspa-dcRemove - ladspa-tap-doubler - ladspa-sinusWavewrapper - ladspa-modDelay - ladspa-shaper - ladspa-zm1 - ladspa-sc4 - ladspa-delay-5s - ladspa-dysonCompress - ladspa-tap-stereo-echo - ladspa-lowpass-iir - ladspa-fadDelay - ladspa-plate - ladspa-bandpass-iir - ladspa-singlePara - ladspa-gongBeater - ladspa-tapeDelay - ladspa-sifter - ladspa-tap-dynamics-st - ladspa-hardLimiter - ladspa-sc3 - ladspa-amp - ladspa-xfade - ladspa-xfade4 - ladspa-tap-pitch - ladspa-multivoiceChorus - ladspa-G2reverb - ladspa-surroundEncoder - ladspa-sc2 - ladspa-gverb - ladspa-matrixMSSt - ladspa-amPitchshift - ladspa-tap-deesser - ladspa-tap-tubewarmth - ladspa-hermesFilter - ladspa-bandpass-a-iir - ladspa-gsm - ladspa-Chorus1 - ladspa-Chorus2 - ladspa-crossoverDist - ladspa-allpass-n - ladspa-allpass-l - ladspa-allpass-c - ladspa-decay - ladspa-valve - ladspa-bodeShifterCV - ladspa-harmonicGen - ladspa-waveTerrain - ladspa-transient - ladspa-sinCos - ladspa-split - ladspa-divider - ladspa-declip - ladspa-tap-dynamics-m - ladspa-tap-reflector - ladspa-Ambisonics-11-mono-panner - ladspa-Ambisonics-11-stereo-panner - ladspa-Ambisonics-11-rotator - ladspa-Ambisonics-11-square-decoder - ladspa-Ambisonics-11-hexagon-decoder - ladspa-Ambisonics-11-cube-decoder - ladspa-tap-equalizer-bw - ladspa-tap-tremolo ladspa-sine-faaa ladspa-sine-faac ladspa-sine-fcaa ladspa-sine-fcac - ladspa-chebstortion - ladspa-alias - ladspa-Parametric1 - ladspa-tap-limiter - ladspa-noise-white - ladspa-tap-pinknoise - ladspa-delayorama - ladspa-pointerCastDistortion - ladspa-svf - ladspa-Phaser1 - ladspa-Phaser1+LFO - ladspa-revdelay - ladspa-tap-chorusflanger - ladspa-vynil - ladspa-Mvchpf-1 - ladspa-djFlanger - ladspa-fmOsc - ladspa-decimator - ladspa-Ambisonics-21-panner - ladspa-Ambisonics-21-rotator - ladspa-dj-eq-mono - ladspa-dj-eq - ladspa-Mvclpf-1 - ladspa-Mvclpf-2 - ladspa-Mvclpf-3 - ladspa-Mvclpf-4 - ladspa-satanMaximiser - ladspa-foverdrive - ladspa-karaoke - ladspa-gong - ladspa-sc4m - Gstassrender - GstTwoLame + ladspa-lpf + ladspa-hpf + GstXvidEnc + GstXvidDec GstPitch - GstCeltEnc - GstCeltDec + GstMusepackDec + GstMpeg2enc + GstGSMEnc + GstGSMDec + GstFaac + GstDtsDec + Gstassrender + GstDiracEnc GstTRM + GstBaseMetadata + GstMetadataDemux + GstMetadataMux GstOss4Mixer + GstAmrBaseParse + GstAmrParse + GstFestival + GstModPlug + ADPCMDec GstMveDemux GstMveMux - GstBaseRTPDepayload - GstRtpDTMFDepay - GstRtpJitterBuffer - GstRtpPtDemux - GstRtpSession - GstRtpSsrcDemux - GstMpegPSDemux - GstMpegTSDemux - MpegTSParse - GstH264Parse - GstLiveAdder - ADPCMDec + GstSrtEnc GstMpeg4VParse - GstValve - MpegVideoParse - GstShapeWipe - GstNuvDemux + GstCDXAParse + GstVcdParse + GstNsfDec + GstSirenDec + GstSirenEnc + MpegTsMux + GstRealVideoDec + GstRealAudioDec + GstRTPMux + GstRTPDTMFMux GstRawParse GstVideoParse GstAudioParse - GstSpeed + GstRtpJitterBuffer + GstRtpPtDemux + GstRtpSession + GstRtpSsrcDemux + GstPcapParse GstInputSelector GstOutputSelector + GstAacBaseParse + GstAacParse + GstVMncDec GstQTMux GstMP4Mux GstGPPMux GstMJ2Mux - GstAacBaseParse - GstAacParse - GstCDXAParse - GstVcdParse - GstNsfDec - GstTtaParse - GstTtaDec - GstY4mEncode - GstRTPMux - GstRTPDTMFMux - GstFreeze - GstVMncDec - AIFFParse - GstSrtEnc - GstFestival - MpegTsMux - GstDVDSpu + MpegVideoParse + GstH264Parse GstMXFDemux GstMXFMux - GstRealVideoDec - GstRealAudioDec - GstAmrBaseParse - GstAmrParse - GstId3TagMux - GstId3Tag - GstSirenDec - GstSirenEnc - GstPcapParse + GstSpeed + GstFreeze + GstId3BaseMux + GstId3Mux + GstDVDSpu + AIFFParse + GstTtaParse + GstTtaDec + GstLiveAdder + GstValve + GstBaseRTPDepayload + GstRtpDTMFDepay + GstNuvDemux + GstShapeWipe + GstFLVDemux + GstFlvMux + GstMpegPSDemux + GstMpegTSDemux + MpegTSParse + GstDeinterlace2 GstBus GstTask - GstTaskPool GstClock GstSystemClock GstAudioClock @@ -321,6 +175,8 @@ GObject GstJackAudioSinkRingBuffer GstSignalObject GstColorBalanceChannel + GstMixerTrack + GstMixerOptions RTPSession MpegTsPatInfo MpegTsPmtInfo @@ -328,13 +184,13 @@ GInterface GTypePlugin GstChildProxy GstURIHandler - GstTagSetter - GstPreset GstImplementsInterface GstNavigation GstColorBalance GstXOverlay + GstTagSetter + GstPreset GstMixer GstPropertyProbe - GstPhotography MXFDescriptiveMetadataFrameworkInterface + GstPhotography diff --git a/docs/plugins/gst-plugins-bad-plugins.interfaces b/docs/plugins/gst-plugins-bad-plugins.interfaces index 60c00142..53172c4b 100644 --- a/docs/plugins/gst-plugins-bad-plugins.interfaces +++ b/docs/plugins/gst-plugins-bad-plugins.interfaces @@ -1,32 +1,35 @@ GstBin GstChildProxy GstPipeline GstChildProxy -GstCameraBin GstChildProxy GstTagSetter GstImplementsInterface GstColorBalance GstPhotography GstXOverlay +GstCameraBin GstChildProxy GstImplementsInterface GstColorBalance GstTagSetter GstPhotography RsnDvdBin GstChildProxy GstURIHandler DvbBaseBin GstChildProxy GstURIHandler +GstAutoConvert GstChildProxy GstRtpBin GstChildProxy GstRtpClient GstChildProxy -FPSDisplaySink GstChildProxy GstImplementsInterface GstXOverlay -GstAutoConvert GstChildProxy GstSDPDemux GstChildProxy -GstMetadataMux GstTagSetter -GstXvidEnc GstPreset +GstFPSDisplaySink GstChildProxy +GstNeonhttpSrc GstURIHandler +GstMythtvSrc GstURIHandler +GstMMS GstURIHandler +GstOss4Source GstImplementsInterface GstMixer GstPropertyProbe +GstVCDSrc GstURIHandler GstCDAudio GstURIHandler -GstX264Enc GstPreset GstDfbVideoSink GstImplementsInterface GstNavigation GstColorBalance GstSDLVideoSink GstImplementsInterface GstNavigation GstXOverlay GstApExSink GstImplementsInterface GstMixer GstOss4Sink GstPropertyProbe -GstMythtvSrc GstURIHandler -GstMMS GstURIHandler -GstOss4Source GstImplementsInterface GstMixer GstPropertyProbe -GstNeonhttpSrc GstURIHandler -GstVCDSrc GstURIHandler -GstFaac GstPreset GstCeltEnc GstTagSetter GstPreset +GstXvidEnc GstPreset +GstMpeg2enc GstPreset +GstFaac GstPreset +GstDiracEnc GstPreset +GstMetadataMux GstTagSetter GstOss4Mixer GstImplementsInterface GstMixer GstPropertyProbe GstQTMux GstTagSetter GstMP4Mux GstTagSetter GstGPPMux GstTagSetter GstMJ2Mux GstTagSetter -GstId3TagMux GstTagSetter -GstId3Tag 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 cfb75898..fa02d4b9 100644 --- a/docs/plugins/gst-plugins-bad-plugins.prerequisites +++ b/docs/plugins/gst-plugins-bad-plugins.prerequisites @@ -1,8 +1,8 @@ GstChildProxy GstObject -GstTagSetter GstObject GstElement -GstImplementsInterface GstObject GstElement -GstColorBalance GstObject GstImplementsInterface GstElement -GstXOverlay GstObject GstImplementsInterface GstElement -GstMixer GstObject GstImplementsInterface GstElement -GstPhotography GstObject GstImplementsInterface GstElement -MXFDescriptiveMetadataFrameworkInterface MXFMetadataBase MXFDescriptiveMetadata +GstImplementsInterface GstElement +GstColorBalance GstImplementsInterface GstElement +GstXOverlay GstImplementsInterface GstElement +GstTagSetter GstElement +GstMixer GstImplementsInterface GstElement +MXFDescriptiveMetadataFrameworkInterface MXFDescriptiveMetadata +GstPhotography GstImplementsInterface GstElement diff --git a/docs/plugins/inspect/plugin-aacparse.xml b/docs/plugins/inspect/plugin-aacparse.xml index 6ee0d7e0..364edec5 100644 --- a/docs/plugins/inspect/plugin-aacparse.xml +++ b/docs/plugins/inspect/plugin-aacparse.xml @@ -3,10 +3,10 @@ <description>Advanced Audio Coding Parser</description> <filename>../../gst/aacparse/.libs/libgstaacparse.so</filename> <basename>libgstaacparse.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-adpcmdec.xml b/docs/plugins/inspect/plugin-adpcmdec.xml new file mode 100644 index 00000000..08f2a20b --- /dev/null +++ b/docs/plugins/inspect/plugin-adpcmdec.xml @@ -0,0 +1,34 @@ +<plugin> + <name>adpcmdec</name> + <description>ADPCM decoder</description> + <filename>../../gst/adpcmdec/.libs/libgstadpcmdec.so</filename> + <basename>libgstadpcmdec.so</basename> + <version>0.10.13</version> + <license>LGPL</license> + <source>gst-plugins-bad</source> + <package>GStreamer Bad Plug-ins source release</package> + <origin>Unknown package origin</origin> + <elements> + <element> + <name>msadpcmdec</name> + <longname>MS-ADPCM decoder</longname> + <class>Codec/Decoder/Audio</class> + <description>Decode MS AD-PCM audio</description> + <author>Pioneers of the Inevitable <songbird@songbirdnest.com</author> + <pads> + <caps> + <name>src</name> + <direction>source</direction> + <presence>always</presence> + <details>audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]</details> + </caps> + <caps> + <name>sink</name> + <direction>sink</direction> + <presence>always</presence> + <details>audio/x-adpcm, layout=(string)microsoft, block_align=(int)[ 64, 8096 ], rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]</details> + </caps> + </pads> + </element> + </elements> +</plugin>
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-aiffparse.xml b/docs/plugins/inspect/plugin-aiffparse.xml index 6f39a0c0..9f627a4d 100644 --- a/docs/plugins/inspect/plugin-aiffparse.xml +++ b/docs/plugins/inspect/plugin-aiffparse.xml @@ -3,10 +3,10 @@ <description>Parse an .aiff file into raw audio</description> <filename>../../gst/aiffparse/.libs/libgstaiffparse.so</filename> <basename>libgstaiffparse.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-alsaspdif.xml b/docs/plugins/inspect/plugin-alsaspdif.xml index 7b247805..48b87e16 100644 --- a/docs/plugins/inspect/plugin-alsaspdif.xml +++ b/docs/plugins/inspect/plugin-alsaspdif.xml @@ -3,10 +3,10 @@ <description>Alsa plugin for S/PDIF output</description> <filename>../../ext/alsaspdif/.libs/libgstalsaspdif.so</filename> <basename>libgstalsaspdif.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-amrparse.xml b/docs/plugins/inspect/plugin-amrparse.xml index 649b6ae7..0404fcaa 100644 --- a/docs/plugins/inspect/plugin-amrparse.xml +++ b/docs/plugins/inspect/plugin-amrparse.xml @@ -3,10 +3,10 @@ <description>Adaptive Multi-Rate Parser</description> <filename>../../gst/amrparse/.libs/libgstamrparse.so</filename> <basename>libgstamrparse.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-apex.xml b/docs/plugins/inspect/plugin-apex.xml index 9da07d2d..66e91255 100644 --- a/docs/plugins/inspect/plugin-apex.xml +++ b/docs/plugins/inspect/plugin-apex.xml @@ -3,10 +3,10 @@ <description>Apple AirPort Express Plugin</description> <filename>../../ext/apexsink/.libs/libgstapexsink.so</filename> <basename>libgstapexsink.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-assrender.xml b/docs/plugins/inspect/plugin-assrender.xml index 12088e5e..3245c6b4 100644 --- a/docs/plugins/inspect/plugin-assrender.xml +++ b/docs/plugins/inspect/plugin-assrender.xml @@ -3,10 +3,10 @@ <description>ASS/SSA subtitle renderer</description> <filename>../../ext/assrender/.libs/libgstassrender.so</filename> <basename>libgstassrender.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-autoconvert.xml b/docs/plugins/inspect/plugin-autoconvert.xml index 843cee40..b5f3e951 100644 --- a/docs/plugins/inspect/plugin-autoconvert.xml +++ b/docs/plugins/inspect/plugin-autoconvert.xml @@ -3,10 +3,10 @@ <description>Selects convertor element based on caps</description> <filename>../../gst/autoconvert/.libs/libgstautoconvert.so</filename> <basename>libgstautoconvert.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-bayer.xml b/docs/plugins/inspect/plugin-bayer.xml index ef353c70..9f955014 100644 --- a/docs/plugins/inspect/plugin-bayer.xml +++ b/docs/plugins/inspect/plugin-bayer.xml @@ -3,10 +3,10 @@ <description>Elements to convert Bayer images</description> <filename>../../gst/bayer/.libs/libgstbayer.so</filename> <basename>libgstbayer.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-bz2.xml b/docs/plugins/inspect/plugin-bz2.xml index 00926766..35d9dd57 100644 --- a/docs/plugins/inspect/plugin-bz2.xml +++ b/docs/plugins/inspect/plugin-bz2.xml @@ -3,10 +3,10 @@ <description>Compress or decompress streams</description> <filename>../../ext/bz2/.libs/libgstbz2.so</filename> <basename>libgstbz2.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-camerabin.xml b/docs/plugins/inspect/plugin-camerabin.xml index 6280497e..e977df97 100644 --- a/docs/plugins/inspect/plugin-camerabin.xml +++ b/docs/plugins/inspect/plugin-camerabin.xml @@ -3,10 +3,10 @@ <description>High level api for DC (Digital Camera) application</description> <filename>../../gst/camerabin/.libs/libgstcamerabin.so</filename> <basename>libgstcamerabin.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-cdaudio.xml b/docs/plugins/inspect/plugin-cdaudio.xml index 8e2173fe..349de576 100644 --- a/docs/plugins/inspect/plugin-cdaudio.xml +++ b/docs/plugins/inspect/plugin-cdaudio.xml @@ -3,10 +3,10 @@ <description>Play CD audio through the CD Drive</description> <filename>../../ext/cdaudio/.libs/libgstcdaudio.so</filename> <basename>libgstcdaudio.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-cdxaparse.xml b/docs/plugins/inspect/plugin-cdxaparse.xml index 611087f1..d81ff8b1 100644 --- a/docs/plugins/inspect/plugin-cdxaparse.xml +++ b/docs/plugins/inspect/plugin-cdxaparse.xml @@ -3,10 +3,10 @@ <description>Parse a .dat file (VCD) into raw mpeg1</description> <filename>../../gst/cdxaparse/.libs/libgstcdxaparse.so</filename> <basename>libgstcdxaparse.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-celt.xml b/docs/plugins/inspect/plugin-celt.xml index 8fd527f2..074b128d 100644 --- a/docs/plugins/inspect/plugin-celt.xml +++ b/docs/plugins/inspect/plugin-celt.xml @@ -3,10 +3,10 @@ <description>CELT plugin library</description> <filename>../../ext/celt/.libs/libgstcelt.so</filename> <basename>libgstcelt.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-dc1394.xml b/docs/plugins/inspect/plugin-dc1394.xml index 5a840994..73555d9b 100644 --- a/docs/plugins/inspect/plugin-dc1394.xml +++ b/docs/plugins/inspect/plugin-dc1394.xml @@ -3,10 +3,10 @@ <description>1394 IIDC Video Source</description> <filename>../../ext/dc1394/.libs/libgstdc1394.so</filename> <basename>libgstdc1394.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-dccp.xml b/docs/plugins/inspect/plugin-dccp.xml index de7d656f..becc5623 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.12.1</version> + <version>0.10.13</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 2f8dc925..0aabef1a 100644 --- a/docs/plugins/inspect/plugin-debugutilsbad.xml +++ b/docs/plugins/inspect/plugin-debugutilsbad.xml @@ -3,12 +3,26 @@ <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.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> - + <element> + <name>fpsdisplaysink</name> + <longname>Measure and show framerate on videosink</longname> + <class>Sink/Video</class> + <description>Shows the current frame-rate and drop-rate of the videosink as overlay or text on stdout</description> + <author>Zeeshan Ali <zeeshan.ali@nokia.com>, Stefan Kost <stefan.kost@nokia.com></author> + <pads> + <caps> + <name>sink</name> + <direction>sink</direction> + <presence>always</presence> + <details>ANY</details> + </caps> + </pads> + </element> </elements> </plugin>
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-dfbvideosink.xml b/docs/plugins/inspect/plugin-dfbvideosink.xml index d4562214..f0b3848b 100644 --- a/docs/plugins/inspect/plugin-dfbvideosink.xml +++ b/docs/plugins/inspect/plugin-dfbvideosink.xml @@ -3,10 +3,10 @@ <description>DirectFB video output plugin</description> <filename>../../ext/directfb/.libs/libgstdfbvideosink.so</filename> <basename>libgstdfbvideosink.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-dirac.xml b/docs/plugins/inspect/plugin-dirac.xml index 3aed5544..e8102fee 100644 --- a/docs/plugins/inspect/plugin-dirac.xml +++ b/docs/plugins/inspect/plugin-dirac.xml @@ -3,7 +3,7 @@ <description>Dirac plugin</description> <filename>../../ext/dirac/.libs/libgstdirac.so</filename> <basename>libgstdirac.so</basename> - <version>0.10.12</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> <package>GStreamer Bad Plug-ins source release</package> diff --git a/docs/plugins/inspect/plugin-dtmf.xml b/docs/plugins/inspect/plugin-dtmf.xml index 0bae6467..ee1c3ac5 100644 --- a/docs/plugins/inspect/plugin-dtmf.xml +++ b/docs/plugins/inspect/plugin-dtmf.xml @@ -3,10 +3,10 @@ <description>DTMF plugins</description> <filename>../../gst/dtmf/.libs/libgstdtmf.so</filename> <basename>libgstdtmf.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-dtsdec.xml b/docs/plugins/inspect/plugin-dtsdec.xml index cb4f93e7..fb6462b2 100644 --- a/docs/plugins/inspect/plugin-dtsdec.xml +++ b/docs/plugins/inspect/plugin-dtsdec.xml @@ -3,10 +3,10 @@ <description>Decodes DTS audio streams</description> <filename>../../ext/dts/.libs/libgstdtsdec.so</filename> <basename>libgstdtsdec.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>GPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-dvb.xml b/docs/plugins/inspect/plugin-dvb.xml index ea09a615..cb63c4e7 100644 --- a/docs/plugins/inspect/plugin-dvb.xml +++ b/docs/plugins/inspect/plugin-dvb.xml @@ -3,10 +3,10 @@ <description>DVB elements</description> <filename>../../sys/dvb/.libs/libgstdvb.so</filename> <basename>libgstdvb.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-dvdspu.xml b/docs/plugins/inspect/plugin-dvdspu.xml index 6dcb12d8..1bec7c6b 100644 --- a/docs/plugins/inspect/plugin-dvdspu.xml +++ b/docs/plugins/inspect/plugin-dvdspu.xml @@ -3,10 +3,10 @@ <description>DVD Sub-picture Overlay element</description> <filename>../../gst/dvdspu/.libs/libgstdvdspu.so</filename> <basename>libgstdvdspu.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-faac.xml b/docs/plugins/inspect/plugin-faac.xml index 677affee..504cc910 100644 --- a/docs/plugins/inspect/plugin-faac.xml +++ b/docs/plugins/inspect/plugin-faac.xml @@ -3,10 +3,10 @@ <description>Free AAC Encoder (FAAC)</description> <filename>../../ext/faac/.libs/libgstfaac.so</filename> <basename>libgstfaac.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-faad.xml b/docs/plugins/inspect/plugin-faad.xml index 174cbefe..7ff0ca70 100644 --- a/docs/plugins/inspect/plugin-faad.xml +++ b/docs/plugins/inspect/plugin-faad.xml @@ -3,10 +3,10 @@ <description>Free AAC Decoder (FAAD)</description> <filename>../../ext/faad/.libs/libgstfaad.so</filename> <basename>libgstfaad.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>GPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-fbdevsink.xml b/docs/plugins/inspect/plugin-fbdevsink.xml index 30ab807d..6f1aea55 100644 --- a/docs/plugins/inspect/plugin-fbdevsink.xml +++ b/docs/plugins/inspect/plugin-fbdevsink.xml @@ -3,10 +3,10 @@ <description>linux framebuffer video sink</description> <filename>../../sys/fbdev/.libs/libgstfbdevsink.so</filename> <basename>libgstfbdevsink.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-festival.xml b/docs/plugins/inspect/plugin-festival.xml index 27f0031c..272869ad 100644 --- a/docs/plugins/inspect/plugin-festival.xml +++ b/docs/plugins/inspect/plugin-festival.xml @@ -3,10 +3,10 @@ <description>Synthesizes plain text into audio</description> <filename>../../gst/festival/.libs/libgstfestival.so</filename> <basename>libgstfestival.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-freeze.xml b/docs/plugins/inspect/plugin-freeze.xml index ebc41686..636b0eee 100644 --- a/docs/plugins/inspect/plugin-freeze.xml +++ b/docs/plugins/inspect/plugin-freeze.xml @@ -3,10 +3,10 @@ <description>Stream freezer</description> <filename>../../gst/freeze/.libs/libgstfreeze.so</filename> <basename>libgstfreeze.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-gsm.xml b/docs/plugins/inspect/plugin-gsm.xml index 7014a2e2..b2b0f727 100644 --- a/docs/plugins/inspect/plugin-gsm.xml +++ b/docs/plugins/inspect/plugin-gsm.xml @@ -3,10 +3,10 @@ <description>GSM encoder/decoder</description> <filename>../../ext/gsm/.libs/libgstgsm.so</filename> <basename>libgstgsm.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-gstrtpmanager.xml b/docs/plugins/inspect/plugin-gstrtpmanager.xml index 65887a7c..3aa25c22 100644 --- a/docs/plugins/inspect/plugin-gstrtpmanager.xml +++ b/docs/plugins/inspect/plugin-gstrtpmanager.xml @@ -3,10 +3,10 @@ <description>RTP session management plugin library</description> <filename>../../gst/rtpmanager/.libs/libgstrtpmanager.so</filename> <basename>libgstrtpmanager.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-gstsiren.xml b/docs/plugins/inspect/plugin-gstsiren.xml index 5aa99497..3659161a 100644 --- a/docs/plugins/inspect/plugin-gstsiren.xml +++ b/docs/plugins/inspect/plugin-gstsiren.xml @@ -3,10 +3,10 @@ <description>Siren encoder/decoder/payloader/depayloader plugins</description> <filename>../../gst/siren/.libs/libgstsiren.so</filename> <basename>libgstsiren.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-h264parse.xml b/docs/plugins/inspect/plugin-h264parse.xml index 2fd1e6c0..065b9d3d 100644 --- a/docs/plugins/inspect/plugin-h264parse.xml +++ b/docs/plugins/inspect/plugin-h264parse.xml @@ -3,10 +3,10 @@ <description>Element parsing raw h264 streams</description> <filename>../../gst/h264parse/.libs/libgsth264parse.so</filename> <basename>libgsth264parse.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-hdvparse.xml b/docs/plugins/inspect/plugin-hdvparse.xml new file mode 100644 index 00000000..12ec2108 --- /dev/null +++ b/docs/plugins/inspect/plugin-hdvparse.xml @@ -0,0 +1,34 @@ +<plugin> + <name>hdvparse</name> + <description>HDV private stream parser</description> + <filename>../../gst/hdvparse/.libs/libgsthdvparse.so</filename> + <basename>libgsthdvparse.so</basename> + <version>0.10.13</version> + <license>LGPL</license> + <source>gst-plugins-bad</source> + <package>GStreamer</package> + <origin>http://gstreamer.net/</origin> + <elements> + <element> + <name>hdvparse</name> + <longname>HDVParser</longname> + <class>Data/Parser</class> + <description>HDV private stream Parser</description> + <author>Edward Hervey <bilboed@bilboed.com></author> + <pads> + <caps> + <name>sink</name> + <direction>sink</direction> + <presence>always</presence> + <details>hdv/aux-v; hdv/aux-a</details> + </caps> + <caps> + <name>src</name> + <direction>source</direction> + <presence>always</presence> + <details>hdv/aux-v, parsed=(boolean)true; hdv/aux-a, parsed=(boolean)true</details> + </caps> + </pads> + </element> + </elements> +</plugin>
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-id3tag.xml b/docs/plugins/inspect/plugin-id3tag.xml new file mode 100644 index 00000000..0884e332 --- /dev/null +++ b/docs/plugins/inspect/plugin-id3tag.xml @@ -0,0 +1,34 @@ +<plugin> + <name>id3tag</name> + <description>ID3 v1 and v2 muxing plugin</description> + <filename>../../gst/id3tag/.libs/libgstid3tag.so</filename> + <basename>libgstid3tag.so</basename> + <version>0.10.13</version> + <license>LGPL</license> + <source>gst-plugins-bad</source> + <package>GStreamer Bad Plug-ins source release</package> + <origin>Unknown package origin</origin> + <elements> + <element> + <name>id3mux</name> + <longname>ID3 v1 and v2 Muxer</longname> + <class>Formatter/Metadata</class> + <description>Adds an ID3v2 header and ID3v1 footer to a file</description> + <author>Michael Smith <msmith@songbirdnest.com>, Tim-Philipp Müller <tim centricular net></author> + <pads> + <caps> + <name>src</name> + <direction>source</direction> + <presence>always</presence> + <details>application/x-id3</details> + </caps> + <caps> + <name>sink</name> + <direction>sink</direction> + <presence>always</presence> + <details>ANY</details> + </caps> + </pads> + </element> + </elements> +</plugin>
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-jack.xml b/docs/plugins/inspect/plugin-jack.xml index 8dcf0931..e1fd47b3 100644 --- a/docs/plugins/inspect/plugin-jack.xml +++ b/docs/plugins/inspect/plugin-jack.xml @@ -3,10 +3,10 @@ <description>Jack elements</description> <filename>../../ext/jack/.libs/libgstjack.so</filename> <basename>libgstjack.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-ladspa.xml b/docs/plugins/inspect/plugin-ladspa.xml index 0a7abcdd..8a89a980 100644 --- a/docs/plugins/inspect/plugin-ladspa.xml +++ b/docs/plugins/inspect/plugin-ladspa.xml @@ -3,1081 +3,13 @@ <description>All LADSPA plugins</description> <filename>../../ext/ladspa/.libs/libgstladspa.so</filename> <basename>libgstladspa.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> - <name>ladspa-Ambisonics-11-cube-decoder</name> - <longname>AMB order 1,1 cube decoder</longname> - <class>Filter/Effect/Audio/LADSPA</class> - <description>AMB order 1,1 cube decoder</description> - <author>Fons Adriaensen <fons@kokkinizita.net></author> - <pads> - <caps> - <name>Out-ULB</name> - <direction>source</direction> - <presence>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-URB</name> - <direction>source</direction> - <presence>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-URF</name> - <direction>source</direction> - <presence>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-ULF</name> - <direction>source</direction> - <presence>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-DLB</name> - <direction>source</direction> - <presence>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-DRB</name> - <direction>source</direction> - <presence>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-DRF</name> - <direction>source</direction> - <presence>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-DLF</name> - <direction>source</direction> - <presence>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-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>In-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>In-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>In-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-Ambisonics-11-hexagon-decoder</name> - <longname>AMB order 1,1 hexagon decoder</longname> - <class>Filter/Effect/Audio/LADSPA</class> - <description>AMB order 1,1 hexagon decoder</description> - <author>Fons Adriaensen <fons@kokkinizita.net></author> - <pads> - <caps> - <name>Out-L-LF</name> - <direction>source</direction> - <presence>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-LB-LB</name> - <direction>source</direction> - <presence>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-RB-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>Out-R-RB</name> - <direction>source</direction> - <presence>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-RF-RF</name> - <direction>source</direction> - <presence>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-LF-F</name> - <direction>source</direction> - <presence>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-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>In-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>In-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>In-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-Ambisonics-11-mono-panner</name> - <longname>AMB order 1,1 mono panner</longname> - <class>Filter/Effect/Audio/LADSPA</class> - <description>AMB order 1,1 mono panner</description> - <author>Fons Adriaensen <fons@kokkinizita.net></author> - <pads> - <caps> - <name>Out-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>Out-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>Out-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>Out-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>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-Ambisonics-11-rotator</name> - <longname>AMB order 1,1 rotator</longname> - <class>Filter/Effect/Audio/LADSPA</class> - <description>AMB order 1,1 rotator</description> - <author>Fons Adriaensen <fons@kokkinizita.net></author> - <pads> - <caps> - <name>Out-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>Out-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>Out-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>Out-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>In-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>In-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>In-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>In-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-Ambisonics-11-square-decoder</name> - <longname>AMB order 1,1 square decoder</longname> - <class>Filter/Effect/Audio/LADSPA</class> - <description>AMB order 1,1 square decoder</description> - <author>Fons Adriaensen <fons@kokkinizita.net></author> - <pads> - <caps> - <name>Out-LB-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>Out-RB-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>Out-RF-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-LF-F</name> - <direction>source</direction> - <presence>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-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>In-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>In-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>In-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-Ambisonics-11-stereo-panner</name> - <longname>AMB order 1,1 stereo panner</longname> - <class>Filter/Effect/Audio/LADSPA</class> - <description>AMB order 1,1 stereo panner</description> - <author>Fons Adriaensen <fons@kokkinizita.net></author> - <pads> - <caps> - <name>Out-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>Out-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>Out-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>Out-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>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-Ambisonics-21-panner</name> - <longname>AMB order 2,1 panner</longname> - <class>Filter/Effect/Audio/LADSPA</class> - <description>AMB order 2,1 panner</description> - <author>Fons Adriaensen <fons@kokkinizita.net></author> - <pads> - <caps> - <name>Out-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>Out-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>Out-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>Out-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>Out-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>Out-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>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-Ambisonics-21-rotator</name> - <longname>AMB order 2,1 rotator</longname> - <class>Filter/Effect/Audio/LADSPA</class> - <description>AMB order 2,1 rotator</description> - <author>Fons Adriaensen <fons@kokkinizita.net></author> - <pads> - <caps> - <name>Out-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>Out-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>Out-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>Out-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>Out-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>Out-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>In-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>In-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>In-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>In-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>In-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>In-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-Chorus1</name> - <longname>Chorus1 - Based on CSound orchestra by Sean Costello</longname> - <class>Filter/Effect/Audio/LADSPA</class> - <description>Chorus1 - Based on CSound orchestra by Sean Costello</description> - <author>Fons Adriaensen <fons.adriaensen@alcatel.be></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</class> - <description>Chorus2 - Based on CSound orchestra by Sean Costello</description> - <author>Fons Adriaensen <fons.adriaensen@alcatel.be></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-G2reverb</name> - <longname>Stereo reverb</longname> - <class>Filter/Effect/Audio/LADSPA</class> - <description>Stereo reverb</description> - <author>Fons Adriaensen <fons.adriaensen@alcatel.be></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</class> - <description>Mvchpf-1 Digital implementation of the VC HP filter invented by R.A. Moog</description> - <author>Fons Adriaensen <fons.adriaensen@skynet.be></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</class> - <description>Mvclpf-1 Digital implementation of the VC filter invented by R.A.Moog</description> - <author>Fons Adriaensen <fons.adriaensen@alcatel.be></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</class> - <description>Mvclpf-2 Digital implementation of the VC filter invented by R.A.Moog</description> - <author>Fons Adriaensen <fons.adriaensen@alcatel.be></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</class> - <description>Mvclpf-3 Digital implementation of the VC filter invented by R.A.Moog</description> - <author>Fons Adriaensen <fons.adriaensen@alcatel.be></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</class> - <description>Mvclpf-4 Digital implementation of the VC filter invented by R.A.Moog</description> - <author>Fons Adriaensen <fons.adriaensen@alcatel.be></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-Parametric1</name> - <longname>4-band parametric filter</longname> - <class>Filter/Effect/Audio/LADSPA</class> - <description>4-band parametric filter</description> - <author>Fons Adriaensen <fons.adriaensen@alcatel.be></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-Phaser1</name> - <longname>Phaser1 - Similar to CSound's phaser1 by Sean Costello</longname> - <class>Filter/Effect/Audio/LADSPA</class> - <description>Phaser1 - Similar to CSound's phaser1 by Sean Costello</description> - <author>Fons Adriaensen <fons.adriaensen@alcatel.be></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</class> - <description>Phaser1 with LFO</description> - <author>Fons Adriaensen <fons.adriaensen@alcatel.be></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-Pulse-VCO</name> - <longname>Pulse-VCO -- Anti-aliased oscillator</longname> - <class>Filter/Effect/Audio/LADSPA</class> - <description>Pulse-VCO -- Anti-aliased oscillator</description> - <author>Fons Adriaensen <fons.adriaensen@alcatel.be></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</class> - <description>Rec-VCO -- Anti-aliased oscillator</description> - <author>Fons Adriaensen <fons.adriaensen@alcatel.be></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-Saw-VCO</name> - <longname>Saw-VCO -- Anti-aliased oscillator</longname> - <class>Filter/Effect/Audio/LADSPA</class> - <description>Saw-VCO -- Anti-aliased oscillator</description> - <author>Fons Adriaensen <fons.adriaensen@alcatel.be></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-alias</name> - <longname>Aliasing</longname> - <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class> - <description>Aliasing</description> - <author>Steve Harris <steve@plugin.org.uk></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 <wingo at pobox dot com></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 <wingo at pobox dot com></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 <wingo at pobox dot com></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-amPitchshift</name> - <longname>AM pitchshifter</longname> - <class>Filter/Effect/Audio/LADSPA/Frequency/Pitch shifters</class> - <description>AM pitchshifter</description> - <author>Steve Harris <steve@plugin.org.uk></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 <steve@plugin.org.uk></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> @@ -1132,498 +64,6 @@ </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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <mag@glame.de></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 <mag@glame.de></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-bodeShifter</name> - <longname>Bode frequency shifter</longname> - <class>Filter/Effect/Audio/LADSPA/Spectral</class> - <description>Bode frequency shifter</description> - <author>Steve Harris <steve@plugin.org.uk></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 <steve@plugin.org.uk></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-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 <mag@glame.de></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 <mag@glame.de></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 <mag@glame.de></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-chebstortion</name> - <longname>Chebyshev distortion</longname> - <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class> - <description>Chebyshev distortion</description> - <author>Steve Harris <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <wingo at pobox dot com></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 <wingo at pobox dot com></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 <wingo at pobox dot com></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 <steve@plugin.org.uk></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-const</name> - <longname>Constant Signal Generator</longname> - <class>Filter/Effect/Audio/LADSPA/Utilities</class> - <description>Constant Signal Generator</description> - <author>Steve Harris <steve@plugin.org.uk></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 <steve@plugin.org.uk></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-dcRemove</name> - <longname>DC Offset Remover</longname> - <class>Filter/Effect/Audio/LADSPA</class> - <description>DC Offset Remover</description> - <author>Steve Harris <steve@plugin.org.uk></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 <wingo at pobox dot com></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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> @@ -1645,651 +85,6 @@ </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 <wingo at pobox dot com></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 <wingo at pobox dot com></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 <wingo at pobox dot com></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 <steve@plugin.org.uk></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-diode</name> - <longname>Diode Processor</longname> - <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class> - <description>Diode Processor</description> - <author>Steve Harris <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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-fastLookaheadLimiter</name> - <longname>Fast Lookahead limiter</longname> - <class>Filter/Effect/Audio/LADSPA/Limiters/Amplitude/Dynamics</class> - <description>Fast Lookahead limiter</description> - <author>Steve Harris <steve@plugin.org.uk></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-flanger</name> - <longname>Flanger</longname> - <class>Filter/Effect/Audio/LADSPA/Time/Flangers</class> - <description>Flanger</description> - <author>Steve Harris <steve@plugin.org.uk></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 <steve@plugin.org.uk></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-foldover</name> - <longname>Foldover distortion</longname> - <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class> - <description>Foldover distortion</description> - <author>Steve Harris <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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-freqTracker</name> - <longname>Frequency tracker</longname> - <class>Filter/Effect/Audio/LADSPA/Frequency/Measurement</class> - <description>Frequency tracker</description> - <author>Steve Harris <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <kouhia at nic.funet.fi>, LADSPAification by Steve Harris <steve@plugin.org.uk></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-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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <mag@glame.de></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 <steve@plugin.org.uk></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> @@ -2311,171 +106,6 @@ </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 <steve@plugin.org.uk></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 <wingo at pobox dot com></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-inv</name> - <longname>Inverter</longname> - <class>Filter/Effect/Audio/LADSPA/Utilities</class> - <description>Inverter</description> - <author>Steve Harris <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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-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 <mag@glame.de></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> @@ -2497,195 +127,6 @@ </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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <nettings@folkwang-hochschule.de></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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-modDelay</name> - <longname>Modulatable delay</longname> - <class>Filter/Effect/Audio/LADSPA/Time/Delays</class> - <description>Modulatable delay</description> - <author>Steve Harris <steve@plugin.org.uk></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 <steve@plugin.org.uk></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-noise-white</name> <longname>White Noise Source</longname> <class>Source/Audio/LADSPA</class> @@ -2701,486 +142,6 @@ </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 <mag@glame.de></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-pitchScale</name> - <longname>Pitch Scaler</longname> - <class>Filter/Effect/Audio/LADSPA/Frequency/Pitch shifters</class> - <description>Pitch Scaler</description> - <author>Steve Harris <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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-retroFlange</name> - <longname>Retro Flanger</longname> - <class>Filter/Effect/Audio/LADSPA/Time/Flangers</class> - <description>Retro Flanger</description> - <author>Steve Harris <steve@plugin.org.uk></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 <jesse at essej dot net></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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-sc1</name> - <longname>SC1</longname> - <class>Filter/Effect/Audio/LADSPA/Compressors/Amplitude/Dynamics</class> - <description>SC1</description> - <author>Steve Harris <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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-shaper</name> - <longname>Wave shaper</longname> - <class>Filter/Effect/Audio/LADSPA/Amplitude/Waveshapers</class> - <description>Wave shaper</description> - <author>Steve Harris <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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> @@ -3264,1001 +225,5 @@ </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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <franky@users.sourceforge.net></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-stepMuxer</name> - <longname>Step Demuxer</longname> - <class>Filter/Effect/Audio/LADSPA/Utilities</class> - <description>Step Demuxer</description> - <author>Steve Harris <steve@plugin.org.uk></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-surroundEncoder</name> - <longname>Surround matrix encoder</longname> - <class>Filter/Effect/Audio/LADSPA/Utilities</class> - <description>Surround matrix encoder</description> - <author>Steve Harris <steve@plugin.org.uk></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 <steve@plugin.org.uk></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-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 <steve@plugin.org.uk></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-transient</name> - <longname>Transient mangler</longname> - <class>Filter/Effect/Audio/LADSPA/Amplitude/Dynamics</class> - <description>Transient mangler</description> - <author>Steve Harris <steve@plugin.org.uk></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-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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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-vynil</name> - <longname>VyNil (Vinyl Effect)</longname> - <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class> - <description>VyNil (Vinyl Effect)</description> - <author>Steve Harris <steve@plugin.org.uk></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 <steve@plugin.org.uk></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-xfade</name> - <longname>Crossfade</longname> - <class>Filter/Effect/Audio/LADSPA</class> - <description>Crossfade</description> - <author>Steve Harris <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 <steve@plugin.org.uk></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 401c8705..647a4748 100644 --- a/docs/plugins/inspect/plugin-legacyresample.xml +++ b/docs/plugins/inspect/plugin-legacyresample.xml @@ -1,12 +1,12 @@ <plugin> <name>legacyresample</name> <description>Resamples audio</description> - <filename>../../gst/audioresample/.libs/libgstlegacyresample.so</filename> + <filename>../../gst/legacyresample/.libs/libgstlegacyresample.so</filename> <basename>libgstlegacyresample.so</basename> - <version>0.10.10.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins CVS/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-liveadder.xml b/docs/plugins/inspect/plugin-liveadder.xml index ee087228..18967bf0 100644 --- a/docs/plugins/inspect/plugin-liveadder.xml +++ b/docs/plugins/inspect/plugin-liveadder.xml @@ -3,10 +3,10 @@ <description>Adds multiple live discontinuous streams</description> <filename>../../gst/liveadder/.libs/libgstliveadder.so</filename> <basename>libgstliveadder.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-metadata.xml b/docs/plugins/inspect/plugin-metadata.xml index 22dd1642..a68fa129 100644 --- a/docs/plugins/inspect/plugin-metadata.xml +++ b/docs/plugins/inspect/plugin-metadata.xml @@ -3,10 +3,10 @@ <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.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-mms.xml b/docs/plugins/inspect/plugin-mms.xml index addef402..6c292cab 100644 --- a/docs/plugins/inspect/plugin-mms.xml +++ b/docs/plugins/inspect/plugin-mms.xml @@ -3,10 +3,10 @@ <description>Microsoft Multi Media Server streaming protocol support</description> <filename>../../ext/libmms/.libs/libgstmms.so</filename> <basename>libgstmms.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-modplug.xml b/docs/plugins/inspect/plugin-modplug.xml index d2c2c13d..65a955e6 100644 --- a/docs/plugins/inspect/plugin-modplug.xml +++ b/docs/plugins/inspect/plugin-modplug.xml @@ -1,12 +1,12 @@ <plugin> <name>modplug</name> <description>.MOD audio decoding</description> - <filename>../../ext/modplug/.libs/libgstmodplug.so</filename> + <filename>../../gst/modplug/.libs/libgstmodplug.so</filename> <basename>libgstmodplug.so</basename> - <version>0.10.12.1</version> + <version>0.10.10</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-mpeg2enc.xml b/docs/plugins/inspect/plugin-mpeg2enc.xml index aeed34c6..1b632e90 100644 --- a/docs/plugins/inspect/plugin-mpeg2enc.xml +++ b/docs/plugins/inspect/plugin-mpeg2enc.xml @@ -3,7 +3,7 @@ <description>High-quality MPEG-1/2 video encoder</description> <filename>../../ext/mpeg2enc/.libs/libgstmpeg2enc.so</filename> <basename>libgstmpeg2enc.so</basename> - <version>0.10.12</version> + <version>0.10.13</version> <license>GPL</license> <source>gst-plugins-bad</source> <package>GStreamer Bad Plug-ins source release</package> diff --git a/docs/plugins/inspect/plugin-mpeg4videoparse.xml b/docs/plugins/inspect/plugin-mpeg4videoparse.xml index 78b09bba..e9c5cbc7 100644 --- a/docs/plugins/inspect/plugin-mpeg4videoparse.xml +++ b/docs/plugins/inspect/plugin-mpeg4videoparse.xml @@ -3,10 +3,10 @@ <description>MPEG-4 video parser</description> <filename>../../gst/mpeg4videoparse/.libs/libgstmpeg4videoparse.so</filename> <basename>libgstmpeg4videoparse.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-mpegdemux2.xml b/docs/plugins/inspect/plugin-mpegdemux2.xml index 09bdef7d..ff3bec69 100644 --- a/docs/plugins/inspect/plugin-mpegdemux2.xml +++ b/docs/plugins/inspect/plugin-mpegdemux2.xml @@ -3,10 +3,10 @@ <description>MPEG demuxers</description> <filename>../../gst/mpegdemux/.libs/libgstmpegdemux.so</filename> <basename>libgstmpegdemux.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>unknown</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-mpegtsmux.xml b/docs/plugins/inspect/plugin-mpegtsmux.xml index e23f1d2b..0e327254 100644 --- a/docs/plugins/inspect/plugin-mpegtsmux.xml +++ b/docs/plugins/inspect/plugin-mpegtsmux.xml @@ -3,10 +3,10 @@ <description>MPEG-TS muxer</description> <filename>../../gst/mpegtsmux/.libs/libgstmpegtsmux.so</filename> <basename>libgstmpegtsmux.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-mpegvideoparse.xml b/docs/plugins/inspect/plugin-mpegvideoparse.xml index b2ea41f1..5c098b36 100644 --- a/docs/plugins/inspect/plugin-mpegvideoparse.xml +++ b/docs/plugins/inspect/plugin-mpegvideoparse.xml @@ -3,10 +3,10 @@ <description>MPEG-1 and MPEG-2 video parser</description> <filename>../../gst/mpegvideoparse/.libs/libgstmpegvideoparse.so</filename> <basename>libgstmpegvideoparse.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-mplex.xml b/docs/plugins/inspect/plugin-mplex.xml index cdd16c37..66338cef 100644 --- a/docs/plugins/inspect/plugin-mplex.xml +++ b/docs/plugins/inspect/plugin-mplex.xml @@ -3,7 +3,7 @@ <description>High-quality MPEG/DVD/SVCD/VCD video/audio multiplexer</description> <filename>../../ext/mplex/.libs/libgstmplex.so</filename> <basename>libgstmplex.so</basename> - <version>0.10.12</version> + <version>0.10.13</version> <license>GPL</license> <source>gst-plugins-bad</source> <package>GStreamer Bad Plug-ins source release</package> diff --git a/docs/plugins/inspect/plugin-musepack.xml b/docs/plugins/inspect/plugin-musepack.xml index 277e5ce6..b753852d 100644 --- a/docs/plugins/inspect/plugin-musepack.xml +++ b/docs/plugins/inspect/plugin-musepack.xml @@ -3,10 +3,10 @@ <description>Musepack decoder</description> <filename>../../ext/musepack/.libs/libgstmusepack.so</filename> <basename>libgstmusepack.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> @@ -20,7 +20,7 @@ <name>sink</name> <direction>sink</direction> <presence>always</presence> - <details>audio/x-musepack, streamversion=(int){ 7, 8 }</details> + <details>audio/x-musepack, streamversion=(int)7</details> </caps> <caps> <name>src</name> diff --git a/docs/plugins/inspect/plugin-musicbrainz.xml b/docs/plugins/inspect/plugin-musicbrainz.xml index cf3b7397..9f598020 100644 --- a/docs/plugins/inspect/plugin-musicbrainz.xml +++ b/docs/plugins/inspect/plugin-musicbrainz.xml @@ -3,10 +3,10 @@ <description>A TRM signature producer based on libmusicbrainz</description> <filename>../../ext/musicbrainz/.libs/libgsttrm.so</filename> <basename>libgsttrm.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-mve.xml b/docs/plugins/inspect/plugin-mve.xml index ce0cb88c..87184899 100644 --- a/docs/plugins/inspect/plugin-mve.xml +++ b/docs/plugins/inspect/plugin-mve.xml @@ -3,10 +3,10 @@ <description>Interplay MVE movie format manipulation</description> <filename>../../gst/mve/.libs/libgstmve.so</filename> <basename>libgstmve.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-mxf.xml b/docs/plugins/inspect/plugin-mxf.xml index 47a6a11c..8fd7206f 100644 --- a/docs/plugins/inspect/plugin-mxf.xml +++ b/docs/plugins/inspect/plugin-mxf.xml @@ -3,10 +3,10 @@ <description>MXF plugin library</description> <filename>../../gst/mxf/.libs/libgstmxf.so</filename> <basename>libgstmxf.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-mythtv.xml b/docs/plugins/inspect/plugin-mythtv.xml index 0c869b77..66ea45d5 100644 --- a/docs/plugins/inspect/plugin-mythtv.xml +++ b/docs/plugins/inspect/plugin-mythtv.xml @@ -3,10 +3,10 @@ <description>lib MythTV src</description> <filename>../../ext/mythtv/.libs/libgstmythtvsrc.so</filename> <basename>libgstmythtvsrc.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-nas.xml b/docs/plugins/inspect/plugin-nas.xml index df3b2645..a2d5351b 100644 --- a/docs/plugins/inspect/plugin-nas.xml +++ b/docs/plugins/inspect/plugin-nas.xml @@ -3,10 +3,10 @@ <description>NAS (Network Audio System) support for GStreamer</description> <filename>../../ext/nas/.libs/libgstnassink.so</filename> <basename>libgstnassink.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-neon.xml b/docs/plugins/inspect/plugin-neon.xml index 7ec02f99..186500c3 100644 --- a/docs/plugins/inspect/plugin-neon.xml +++ b/docs/plugins/inspect/plugin-neon.xml @@ -3,10 +3,10 @@ <description>lib neon http client src</description> <filename>../../ext/neon/.libs/libgstneonhttpsrc.so</filename> <basename>libgstneonhttpsrc.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-nsfdec.xml b/docs/plugins/inspect/plugin-nsfdec.xml index 8ab379cd..3e4a7021 100644 --- a/docs/plugins/inspect/plugin-nsfdec.xml +++ b/docs/plugins/inspect/plugin-nsfdec.xml @@ -3,10 +3,10 @@ <description>Uses nosefart to decode .nsf files</description> <filename>../../gst/nsf/.libs/libgstnsf.so</filename> <basename>libgstnsf.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>GPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-nuvdemux.xml b/docs/plugins/inspect/plugin-nuvdemux.xml index 042df02b..7be0b05b 100644 --- a/docs/plugins/inspect/plugin-nuvdemux.xml +++ b/docs/plugins/inspect/plugin-nuvdemux.xml @@ -3,10 +3,10 @@ <description>Demuxes and muxes audio and video</description> <filename>../../gst/nuvdemux/.libs/libgstnuvdemux.so</filename> <basename>libgstnuvdemux.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-ofa.xml b/docs/plugins/inspect/plugin-ofa.xml index 171dd911..8fed08aa 100644 --- a/docs/plugins/inspect/plugin-ofa.xml +++ b/docs/plugins/inspect/plugin-ofa.xml @@ -3,10 +3,10 @@ <description>Calculate MusicIP fingerprint from audio files</description> <filename>../../ext/ofa/.libs/libgstofa.so</filename> <basename>libgstofa.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>GPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-oss4.xml b/docs/plugins/inspect/plugin-oss4.xml index 87dbb21f..c11a8a89 100644 --- a/docs/plugins/inspect/plugin-oss4.xml +++ b/docs/plugins/inspect/plugin-oss4.xml @@ -3,10 +3,10 @@ <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.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-pcapparse.xml b/docs/plugins/inspect/plugin-pcapparse.xml index 2518ea25..df93ffab 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.12.1</version> + <version>0.10.13</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 dc367eb1..77afa85e 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.12.1</version> + <version>0.10.13</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 2f5f6cfd..bcc466d1 100644 --- a/docs/plugins/inspect/plugin-rawparse.xml +++ b/docs/plugins/inspect/plugin-rawparse.xml @@ -3,10 +3,10 @@ <description>Parses byte streams into raw frames</description> <filename>../../gst/rawparse/.libs/libgstrawparse.so</filename> <basename>libgstrawparse.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> @@ -20,7 +20,7 @@ <name>src</name> <direction>source</direction> <presence>always</presence> - <details>audio/x-raw-int, depth=(int)[ 1, 32 ], width=(int){ 8, 16, 24, 32 }, endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int){ 1234, 4321 }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</details> + <details>audio/x-raw-int, depth=(int)[ 1, 32 ], width=(int){ 8, 16, 24, 32 }, endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int){ 1234, 4321 }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</details> </caps> <caps> <name>sink</name> diff --git a/docs/plugins/inspect/plugin-real.xml b/docs/plugins/inspect/plugin-real.xml index 49eca28c..8120e64d 100644 --- a/docs/plugins/inspect/plugin-real.xml +++ b/docs/plugins/inspect/plugin-real.xml @@ -3,10 +3,10 @@ <description>Decode REAL streams</description> <filename>../../gst/real/.libs/libgstreal.so</filename> <basename>libgstreal.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-resindvd.xml b/docs/plugins/inspect/plugin-resindvd.xml index 4e6d1bb2..d50f9a73 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.12.1</version> + <version>0.10.13</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 1366ecf3..703d50fd 100644 --- a/docs/plugins/inspect/plugin-rfbsrc.xml +++ b/docs/plugins/inspect/plugin-rfbsrc.xml @@ -3,10 +3,10 @@ <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.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-rtpmux.xml b/docs/plugins/inspect/plugin-rtpmux.xml index 585b9ad2..108067fe 100644 --- a/docs/plugins/inspect/plugin-rtpmux.xml +++ b/docs/plugins/inspect/plugin-rtpmux.xml @@ -3,10 +3,10 @@ <description>RTP Muxer plugins</description> <filename>../../gst/rtpmux/.libs/libgstrtpmux.so</filename> <basename>libgstrtpmux.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-scaletempo.xml b/docs/plugins/inspect/plugin-scaletempo.xml index c5acca48..6097ad01 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.12.1</version> + <version>0.10.13</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 23cb3db5..ad5ae7e3 100644 --- a/docs/plugins/inspect/plugin-sdl.xml +++ b/docs/plugins/inspect/plugin-sdl.xml @@ -3,10 +3,10 @@ <description>SDL (Simple DirectMedia Layer) support for GStreamer</description> <filename>../../ext/sdl/.libs/libgstsdl.so</filename> <basename>libgstsdl.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-sdp.xml b/docs/plugins/inspect/plugin-sdp.xml index 605c3b6b..410fb435 100644 --- a/docs/plugins/inspect/plugin-sdp.xml +++ b/docs/plugins/inspect/plugin-sdp.xml @@ -3,10 +3,10 @@ <description>configure streaming sessions using SDP</description> <filename>../../gst/sdp/.libs/libgstsdpelem.so</filename> <basename>libgstsdpelem.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-selector.xml b/docs/plugins/inspect/plugin-selector.xml index 99a07c41..83637ed7 100644 --- a/docs/plugins/inspect/plugin-selector.xml +++ b/docs/plugins/inspect/plugin-selector.xml @@ -3,10 +3,10 @@ <description>input/output stream selector elements</description> <filename>../../gst/selector/.libs/libgstselector.so</filename> <basename>libgstselector.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-shapewipe.xml b/docs/plugins/inspect/plugin-shapewipe.xml index 17559273..02b74125 100644 --- a/docs/plugins/inspect/plugin-shapewipe.xml +++ b/docs/plugins/inspect/plugin-shapewipe.xml @@ -3,10 +3,10 @@ <description>Shape Wipe transition filter</description> <filename>../../gst/shapewipe/.libs/libgstshapewipe.so</filename> <basename>libgstshapewipe.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-sndfile.xml b/docs/plugins/inspect/plugin-sndfile.xml index 2d3e6f2f..e461b79c 100644 --- a/docs/plugins/inspect/plugin-sndfile.xml +++ b/docs/plugins/inspect/plugin-sndfile.xml @@ -3,10 +3,10 @@ <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.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-soundtouch.xml b/docs/plugins/inspect/plugin-soundtouch.xml index 7e5094e2..bd4b5ba5 100644 --- a/docs/plugins/inspect/plugin-soundtouch.xml +++ b/docs/plugins/inspect/plugin-soundtouch.xml @@ -3,10 +3,10 @@ <description>Audio Pitch Controller & BPM Detection</description> <filename>../../ext/soundtouch/.libs/libgstsoundtouch.so</filename> <basename>libgstsoundtouch.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-spcdec.xml b/docs/plugins/inspect/plugin-spcdec.xml index 8c852b08..815e920e 100644 --- a/docs/plugins/inspect/plugin-spcdec.xml +++ b/docs/plugins/inspect/plugin-spcdec.xml @@ -3,7 +3,7 @@ <description>OpenSPC Audio Decoder</description> <filename>../../ext/spc/.libs/libgstspc.so</filename> <basename>libgstspc.so</basename> - <version>0.10.12</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> <package>GStreamer Bad Plug-ins source release</package> diff --git a/docs/plugins/inspect/plugin-speed.xml b/docs/plugins/inspect/plugin-speed.xml index 026750d3..264d8f2b 100644 --- a/docs/plugins/inspect/plugin-speed.xml +++ b/docs/plugins/inspect/plugin-speed.xml @@ -3,10 +3,10 @@ <description>Set speed/pitch on audio/raw streams (resampler)</description> <filename>../../gst/speed/.libs/libgstspeed.so</filename> <basename>libgstspeed.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-stereo.xml b/docs/plugins/inspect/plugin-stereo.xml index 16b7962d..7a3eadf9 100644 --- a/docs/plugins/inspect/plugin-stereo.xml +++ b/docs/plugins/inspect/plugin-stereo.xml @@ -3,10 +3,10 @@ <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.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-subenc.xml b/docs/plugins/inspect/plugin-subenc.xml index f7b48722..68724664 100644 --- a/docs/plugins/inspect/plugin-subenc.xml +++ b/docs/plugins/inspect/plugin-subenc.xml @@ -3,10 +3,10 @@ <description>subtitle encoders</description> <filename>../../gst/subenc/.libs/libgstsubenc.so</filename> <basename>libgstsubenc.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-tta.xml b/docs/plugins/inspect/plugin-tta.xml index e990e08d..34415a36 100644 --- a/docs/plugins/inspect/plugin-tta.xml +++ b/docs/plugins/inspect/plugin-tta.xml @@ -3,10 +3,10 @@ <description>TTA lossless audio format handling</description> <filename>../../gst/tta/.libs/libgsttta.so</filename> <basename>libgsttta.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-valve.xml b/docs/plugins/inspect/plugin-valve.xml index d80aa975..4bfe29f3 100644 --- a/docs/plugins/inspect/plugin-valve.xml +++ b/docs/plugins/inspect/plugin-valve.xml @@ -3,10 +3,10 @@ <description>Valve</description> <filename>../../gst/valve/.libs/libgstvalve.so</filename> <basename>libgstvalve.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-vcdsrc.xml b/docs/plugins/inspect/plugin-vcdsrc.xml index 0903f12b..804a6984 100644 --- a/docs/plugins/inspect/plugin-vcdsrc.xml +++ b/docs/plugins/inspect/plugin-vcdsrc.xml @@ -3,10 +3,10 @@ <description>Asynchronous read from VCD disk</description> <filename>../../sys/vcd/.libs/libgstvcdsrc.so</filename> <basename>libgstvcdsrc.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-videosignal.xml b/docs/plugins/inspect/plugin-videosignal.xml index 5691d9c2..73209eff 100644 --- a/docs/plugins/inspect/plugin-videosignal.xml +++ b/docs/plugins/inspect/plugin-videosignal.xml @@ -3,10 +3,10 @@ <description>Various video signal analysers</description> <filename>../../gst/videosignal/.libs/libgstvideosignal.so</filename> <basename>libgstvideosignal.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-vmnc.xml b/docs/plugins/inspect/plugin-vmnc.xml index 4d33119c..ea56e443 100644 --- a/docs/plugins/inspect/plugin-vmnc.xml +++ b/docs/plugins/inspect/plugin-vmnc.xml @@ -3,10 +3,10 @@ <description>VMnc video plugin library</description> <filename>../../gst/vmnc/.libs/libgstvmnc.so</filename> <basename>libgstvmnc.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-wildmidi.xml b/docs/plugins/inspect/plugin-wildmidi.xml index 8a815b62..0b0e3c57 100644 --- a/docs/plugins/inspect/plugin-wildmidi.xml +++ b/docs/plugins/inspect/plugin-wildmidi.xml @@ -3,10 +3,10 @@ <description>Wildmidi Plugin</description> <filename>../../ext/timidity/.libs/libgstwildmidi.so</filename> <basename>libgstwildmidi.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>GPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/docs/plugins/inspect/plugin-x264.xml b/docs/plugins/inspect/plugin-x264.xml deleted file mode 100644 index 93b33747..00000000 --- a/docs/plugins/inspect/plugin-x264.xml +++ /dev/null @@ -1,34 +0,0 @@ -<plugin> - <name>x264</name> - <description>libx264-based H264 plugins</description> - <filename>../../ext/x264/.libs/libgstx264.so</filename> - <basename>libgstx264.so</basename> - <version>0.10.12.1</version> - <license>GPL</license> - <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> - <origin>Unknown package origin</origin> - <elements> - <element> - <name>x264enc</name> - <longname>x264enc</longname> - <class>Codec/Encoder/Video</class> - <description>H264 Encoder</description> - <author>Josef Zlomek <josef.zlomek@itonis.tv>, Mark Nauwelaerts <mnauw@users.sf.net></author> - <pads> - <caps> - <name>sink</name> - <direction>sink</direction> - <presence>always</presence> - <details>video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 16, 2147483647 ], height=(int)[ 16, 2147483647 ]</details> - </caps> - <caps> - <name>src</name> - <direction>source</direction> - <presence>always</presence> - <details>video/x-h264, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]</details> - </caps> - </pads> - </element> - </elements> -</plugin>
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-xdgmime.xml b/docs/plugins/inspect/plugin-xdgmime.xml index 14ebf5b6..79ee46d8 100644 --- a/docs/plugins/inspect/plugin-xdgmime.xml +++ b/docs/plugins/inspect/plugin-xdgmime.xml @@ -3,10 +3,10 @@ <description>XDG-MIME</description> <filename>../../gst/xdgmime/.libs/libgstxdgmime.so</filename> <basename>libgstxdgmime.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>LGPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> diff --git a/docs/plugins/inspect/plugin-xvid.xml b/docs/plugins/inspect/plugin-xvid.xml index 232afefa..4d9cbe22 100644 --- a/docs/plugins/inspect/plugin-xvid.xml +++ b/docs/plugins/inspect/plugin-xvid.xml @@ -3,10 +3,10 @@ <description>XviD plugin library</description> <filename>../../ext/xvid/.libs/libgstxvid.so</filename> <basename>libgstxvid.so</basename> - <version>0.10.12.1</version> + <version>0.10.13</version> <license>GPL</license> <source>gst-plugins-bad</source> - <package>GStreamer Bad Plug-ins git/prerelease</package> + <package>GStreamer Bad Plug-ins source release</package> <origin>Unknown package origin</origin> <elements> <element> diff --git a/ext/Makefile.am b/ext/Makefile.am index 4576ec7b..8d395057 100644 --- a/ext/Makefile.am +++ b/ext/Makefile.am @@ -318,12 +318,6 @@ endif TARKIN_DIR= # endif -if USE_X264 -X264_DIR=x264 -else -X264_DIR= -endif - # if USE_XINE # XINE_DIR=xine # else @@ -389,7 +383,6 @@ SUBDIRS=\ $(TARKIN_DIR) \ $(THEORA_DIR) \ $(TIMIDITY_DIR) \ - $(X264_DIR) \ $(XINE_DIR) \ $(XVID_DIR) @@ -433,5 +426,4 @@ DIST_SUBDIRS = \ swfdec \ theora \ timidity \ - x264 \ xvid diff --git a/ext/apexsink/gstapexraop.c b/ext/apexsink/gstapexraop.c index 98b7d863..4d07674b 100644 --- a/ext/apexsink/gstapexraop.c +++ b/ext/apexsink/gstapexraop.c @@ -28,6 +28,8 @@ #include "config.h" #endif +#include <string.h> + #include "gstapexraop.h" /* private constants */ @@ -100,7 +102,7 @@ gst_apexraop_send (int desc, void *data, size_t len) static int gst_apexraop_recv (int desc, void *data, size_t len) { - bzero (data, len); + memset (data, 0, len); return recv (desc, data, len, 0); } @@ -345,7 +347,11 @@ gst_apexraop_connect (GstApExRAOP * con) GST_APEX_RAOP_HDR_DEFAULT_LENGTH) <= 0) return GST_RTSP_STS_GONE; - sscanf (hreq, "%*s %d", (int *) &res); + { + int tmp; + sscanf (hreq, "%*s %d", &tmp); + res = (GstRTSPStatusCode) tmp; + } if (res != GST_RTSP_STS_OK) return res; @@ -393,7 +399,11 @@ gst_apexraop_connect (GstApExRAOP * con) GST_APEX_RAOP_HDR_DEFAULT_LENGTH) <= 0) return GST_RTSP_STS_GONE; - sscanf (hreq, "%*s %d", (int *) &res); + { + int tmp; + sscanf (hreq, "%*s %d", &tmp); + res = (GstRTSPStatusCode) tmp; + } if (res != GST_RTSP_STS_OK) return res; @@ -432,7 +442,11 @@ gst_apexraop_connect (GstApExRAOP * con) GST_APEX_RAOP_HDR_DEFAULT_LENGTH) <= 0) return GST_RTSP_STS_GONE; - sscanf (hreq, "%*s %d", (int *) &res); + { + int tmp; + sscanf (hreq, "%*s %d", &tmp); + res = (GstRTSPStatusCode) tmp; + } if (res != GST_RTSP_STS_OK) return res; @@ -553,7 +567,11 @@ gst_apexraop_set_volume (GstApExRAOP * con, const guint volume) GST_APEX_RAOP_HDR_DEFAULT_LENGTH) <= 0) return GST_RTSP_STS_GONE; - sscanf (hreq, "%*s %d", (int *) &res); + { + int tmp; + sscanf (hreq, "%*s %d", &tmp); + res = (GstRTSPStatusCode) tmp; + } return res; } @@ -695,7 +713,11 @@ gst_apexraop_flush (GstApExRAOP * con) GST_APEX_RAOP_HDR_DEFAULT_LENGTH) <= 0) return GST_RTSP_STS_GONE; - sscanf (hreq, "%*s %d", (int *) &res); + { + int tmp; + sscanf (hreq, "%*s %d", &tmp); + res = (GstRTSPStatusCode) tmp; + } return res; } diff --git a/ext/apexsink/gstapexsink.c b/ext/apexsink/gstapexsink.c index 8f98eb00..69f34bcb 100644 --- a/ext/apexsink/gstapexsink.c +++ b/ext/apexsink/gstapexsink.c @@ -30,6 +30,8 @@ #include "config.h" #endif +#include <string.h> + #include "gstapexsink.h" GST_DEBUG_CATEGORY_STATIC (apexsink_debug); @@ -488,7 +490,7 @@ gst_apexsink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec) GST_APEX_RAOP_SAMPLES_PER_FRAME * GST_APEX_RAOP_BYTES_PER_SAMPLE; spec->segtotal = 1; - bzero (spec->silence_sample, sizeof (spec->silence_sample)); + memset (spec->silence_sample, 0, sizeof (spec->silence_sample)); GST_INFO_OBJECT (apexsink, "PREPARE : ApEx sink ready to stream at %dHz, %d bytes per sample, %d channels, %d bytes segments (%dkB/s)", @@ -521,9 +523,7 @@ gst_apexsink_write (GstAudioSink * asink, gpointer data, guint length) static gboolean gst_apexsink_unprepare (GstAudioSink * asink) { - GstApExSink *apexsink = (GstApExSink *) asink; - - GST_INFO_OBJECT (apexsink, "UNPREPARE"); + GST_INFO_OBJECT (asink, "UNPREPARE"); return TRUE; } @@ -532,9 +532,7 @@ gst_apexsink_unprepare (GstAudioSink * asink) static guint gst_apexsink_delay (GstAudioSink * asink) { - GstApExSink *apexsink = (GstApExSink *) asink; - - GST_INFO_OBJECT (apexsink, "DELAY"); + GST_LOG_OBJECT (asink, "DELAY"); return 0; } diff --git a/ext/celt/gstceltenc.c b/ext/celt/gstceltenc.c index 58ed7571..e11091c1 100644 --- a/ext/celt/gstceltenc.c +++ b/ext/celt/gstceltenc.c @@ -77,7 +77,7 @@ GST_ELEMENT_DETAILS ("Celt audio encoder", "Encodes audio in Celt format", "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); -#define DEFAULT_BITRATE 128 +#define DEFAULT_BITRATE 64 #define DEFAULT_FRAMESIZE 256 enum @@ -152,11 +152,11 @@ gst_celt_enc_class_init (GstCeltEncClass * klass) g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BITRATE, g_param_spec_int ("bitrate", "Encoding Bit-rate", - "Specify an encoding bit-rate (in bps). (0 = automatic)", + "Specify an encoding bit-rate (in Kbps). (0 = automatic)", 0, 150, DEFAULT_BITRATE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_FRAMESIZE, g_param_spec_int ("framesize", "Frame Size", - "The number of samples per frame", 64, 256, DEFAULT_FRAMESIZE, + "The number of samples per frame", 64, 512, DEFAULT_FRAMESIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_celt_enc_finalize); diff --git a/ext/directfb/dfbvideosink.c b/ext/directfb/dfbvideosink.c index a6450a06..f48864d6 100644 --- a/ext/directfb/dfbvideosink.c +++ b/ext/directfb/dfbvideosink.c @@ -144,6 +144,7 @@ static void gst_dfbvideosink_surface_destroy (GstDfbVideoSink * dfbvideosink, static GstVideoSinkClass *parent_class = NULL; static GstBufferClass *surface_parent_class = NULL; +#ifndef GST_DISABLE_GST_DEBUG static const char * gst_dfbvideosink_get_format_name (DFBSurfacePixelFormat format) { @@ -192,6 +193,7 @@ gst_dfbvideosink_get_format_name (DFBSurfacePixelFormat format) return "UNKNOWN"; } } +#endif /* GST_DISABLE_GST_DEBUG */ /* Creates miniobject and our internal surface */ static GstDfbSurface * @@ -1945,7 +1947,7 @@ gst_dfbvideosink_navigation_send_event (GstNavigation * navigation, GstDfbVideoSink *dfbvideosink = GST_DFBVIDEOSINK (navigation); GstEvent *event; GstVideoRectangle src, dst, result; - double x, y; + double x, y, old_x, old_y; GstPad *pad = NULL; src.w = GST_VIDEO_SINK_WIDTH (dfbvideosink); @@ -1959,8 +1961,8 @@ gst_dfbvideosink_navigation_send_event (GstNavigation * navigation, /* Our coordinates can be wrong here if we centered the video */ /* Converting pointer coordinates to the non scaled geometry */ - if (gst_structure_get_double (structure, "pointer_x", &x)) { - double old_x = x; + if (gst_structure_get_double (structure, "pointer_x", &old_x)) { + x = old_x; if (x >= result.x && x <= (result.x + result.w)) { x -= result.x; @@ -1973,8 +1975,8 @@ gst_dfbvideosink_navigation_send_event (GstNavigation * navigation, "coordinate from %f to %f", old_x, x); gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, x, NULL); } - if (gst_structure_get_double (structure, "pointer_y", &y)) { - double old_y = y; + if (gst_structure_get_double (structure, "pointer_y", &old_y)) { + y = old_y; if (y >= result.y && y <= (result.y + result.h)) { y -= result.y; diff --git a/ext/libmms/gstmms.c b/ext/libmms/gstmms.c index 33a1a7d2..5ccbb732 100644 --- a/ext/libmms/gstmms.c +++ b/ext/libmms/gstmms.c @@ -240,23 +240,22 @@ gst_mms_prepare_seek_segment (GstBaseSrc * src, GstEvent * event, GstSeekFlags flags; GstFormat seek_format; gdouble rate; - GstMMS *mmssrc = GST_MMS (src); gst_event_parse_seek (event, &rate, &seek_format, &flags, &cur_type, &cur, &stop_type, &stop); if (seek_format != GST_FORMAT_BYTES && seek_format != GST_FORMAT_TIME) { - GST_LOG_OBJECT (mmssrc, "Only byte or time seeking is supported"); + GST_LOG_OBJECT (src, "Only byte or time seeking is supported"); return FALSE; } if (stop_type != GST_SEEK_TYPE_NONE) { - GST_LOG_OBJECT (mmssrc, "Stop seeking not supported"); + GST_LOG_OBJECT (src, "Stop seeking not supported"); return FALSE; } if (cur_type != GST_SEEK_TYPE_NONE && cur_type != GST_SEEK_TYPE_SET) { - GST_LOG_OBJECT (mmssrc, "Only absolute seeking is supported"); + GST_LOG_OBJECT (src, "Only absolute seeking is supported"); return FALSE; } diff --git a/ext/metadata/metadataexif.c b/ext/metadata/metadataexif.c index 73cb275b..58d83e2d 100644 --- a/ext/metadata/metadataexif.c +++ b/ext/metadata/metadataexif.c @@ -739,6 +739,7 @@ metadataparse_exif_content_foreach_entry_func (ExifEntry * entry, done: { +#ifndef GST_DISABLE_GST_DEBUG char buf[2048]; GST_LOG ("\n Entry %p: %s (%s)\n" " Size, Comps: %d, %d\n" @@ -752,6 +753,7 @@ done: (int) (entry->components), exif_entry_get_value (entry, buf, sizeof (buf)), exif_tag_get_title (entry->tag), exif_tag_get_description (entry->tag)); +#endif } return; diff --git a/ext/mythtv/gstmythtvsrc.c b/ext/mythtv/gstmythtvsrc.c index 4d1ddb53..c3121669 100644 --- a/ext/mythtv/gstmythtvsrc.c +++ b/ext/mythtv/gstmythtvsrc.c @@ -1017,9 +1017,8 @@ gst_mythtv_src_uri_handler_init (gpointer g_iface, gpointer iface_data) } void -size_header_handler (void *userdata, const char *value) +size_header_handler (void *src, const char *value) { - GstMythtvSrc *src = GST_MYTHTV_SRC (userdata); - - GST_DEBUG_OBJECT (src, "content size = %lld bytes", src->content_size); + GST_DEBUG_OBJECT (src, "content size = %" G_GUINT64_FORMAT " bytes", + GST_MYTHTV_SRC (src)->content_size); } diff --git a/ext/resindvd/resindvdsrc.c b/ext/resindvd/resindvdsrc.c index 122f2b67..7b44bf9c 100644 --- a/ext/resindvd/resindvdsrc.c +++ b/ext/resindvd/resindvdsrc.c @@ -1069,9 +1069,8 @@ rsn_dvdsrc_step (resinDvdSrc * src, gboolean have_dvd_lock) break; } case DVDNAV_HIGHLIGHT:{ - dvdnav_highlight_event_t *event = (dvdnav_highlight_event_t *) data; GST_DEBUG_OBJECT (src, "highlight change event, button %d", - event->buttonN); + ((dvdnav_highlight_event_t *) data)->buttonN); rsn_dvdsrc_update_highlight (src); break; } diff --git a/ext/sdl/sdlvideosink.c b/ext/sdl/sdlvideosink.c index ef8147ea..85f26534 100644 --- a/ext/sdl/sdlvideosink.c +++ b/ext/sdl/sdlvideosink.c @@ -948,7 +948,7 @@ gst_sdlvideosink_navigation_send_event (GstNavigation * navigation, GstSDLVideoSink *sdlvideosink = GST_SDLVIDEOSINK (navigation); GstEvent *event; GstVideoRectangle src, dst, result; - double x, y; + double x, y, old_x, old_y; GstPad *pad = NULL; src.w = GST_VIDEO_SINK_WIDTH (sdlvideosink); @@ -962,8 +962,8 @@ gst_sdlvideosink_navigation_send_event (GstNavigation * navigation, /* Our coordinates can be wrong here if we centered the video */ /* Converting pointer coordinates to the non scaled geometry */ - if (gst_structure_get_double (structure, "pointer_x", &x)) { - double old_x = x; + if (gst_structure_get_double (structure, "pointer_x", &old_x)) { + x = old_x; if (x >= result.x && x <= (result.x + result.w)) { x -= result.x; @@ -976,8 +976,8 @@ gst_sdlvideosink_navigation_send_event (GstNavigation * navigation, "coordinate from %f to %f", old_x, x); gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, x, NULL); } - if (gst_structure_get_double (structure, "pointer_y", &y)) { - double old_y = y; + if (gst_structure_get_double (structure, "pointer_y", &old_y)) { + y = old_y; if (y >= result.y && y <= (result.y + result.h)) { y -= result.y; diff --git a/ext/x264/GstX264Enc.prs b/ext/x264/GstX264Enc.prs deleted file mode 100644 index 84c76a94..00000000 --- a/ext/x264/GstX264Enc.prs +++ /dev/null @@ -1,44 +0,0 @@ -[_presets_] -version=0.10 -element-name=GstX264Enc - -[Profile Baseline] -_meta/comment=Baseline Profile -bframes=0 -cabac=false -dct8x8=false - -[Profile Main] -_meta/comment=Main Profile -cabac=true -dct8x8=false - -[Profile High] -_meta/comment=High Profile -cabac=true -dct8x8=true - -[Quality Low] -_meta/comment=Low quality -pass=qual -quantizer=27 -subme=4 -threads=0 - -[Quality Normal] -_meta/comment=Normal quality -pass=qual -quantizer=21 -me=umh -subme=6 -ref=3 -threads=0 - -[Quality High] -_meta/comment=High quality -pass=qual -quantizer=18 -me=umh -subme=6 -ref=3 -threads=0 diff --git a/ext/x264/Makefile.am b/ext/x264/Makefile.am deleted file mode 100644 index 6c4d4cf6..00000000 --- a/ext/x264/Makefile.am +++ /dev/null @@ -1,21 +0,0 @@ -plugin_LTLIBRARIES = libgstx264.la - -libgstx264_la_SOURCES = gstx264enc.c -libgstx264_la_CFLAGS = \ - $(GST_PLUGINS_BASE_CFLAGS) \ - $(GST_CFLAGS) \ - $(X264_CFLAGS) -libgstx264_la_LIBADD = \ - $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ - $(GST_LIBS) \ - $(X264_LIBS) -libgstx264_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -libgstx264_la_LIBTOOLFLAGS = --tag=disable-static - -noinst_HEADERS = gstx264enc.h - -presetdir = $(datadir)/gstreamer-$(GST_MAJORMINOR)/presets -preset_DATA = GstX264Enc.prs - -EXTRA_DIST = $(preset_DATA) - diff --git a/ext/x264/gstx264enc.c b/ext/x264/gstx264enc.c deleted file mode 100644 index 0bcd4434..00000000 --- a/ext/x264/gstx264enc.c +++ /dev/null @@ -1,1321 +0,0 @@ -/* GStreamer H264 encoder plugin - * Copyright (C) 2005 Michal Benes <michal.benes@itonis.tv> - * Copyright (C) 2005 Josef Zlomek <josef.zlomek@itonis.tv> - * Copyright (C) 2008 Mark Nauwelaerts <mnauw@users.sf.net> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/** - * SECTION:element-x264enc - * @see_also: faac - * - * This element encodes raw video into H264 compressed data, - * also otherwise known as MPEG-4 AVC (Advanced Video Codec). - * - * The #GstX264Enc:pass property controls the type of encoding. In case of Constant - * Bitrate Encoding (actually ABR), the #GstX264Enc:bitrate will determine the quality - * of the encoding. This will similarly be the case if this target bitrate - * is to obtained in multiple (2 or 3) pass encoding. - * Alternatively, one may choose to perform Constant Quantizer or Quality encoding, - * in which case the #GstX264Enc:quantizer property controls much of the outcome. - * - * The H264 profile that is eventually used depends on a few settings. - * If #GstX264Enc:dct8x8 is enabled, then High profile is used. - * Otherwise, if #GstX264Enc:cabac entropy coding is enabled or #GstX264Enc:bframes - * are allowed, then Main Profile is in effect, and otherwise Baseline profile - * applies. As such, Main is presently the default profile, which is fine for - * most players and settings, but in some cases (e.g. hardware platforms) - * a more restricted profile/level may be necessary. - * - * <refsect2> - * <title>Example pipeline</title> - * |[ - * gst-launch -v videotestsrc num-buffers=1000 ! x264enc qp-min=18 ! \ - * avimux ! filesink location=videotestsrc.avi - * ]| This example pipeline will encode a test video source to H264 muxed in an - * AVI container, while ensuring a sane minimum quantization factor to avoid - * some (excessive) waste. - * |[ - * gst-launch -v videotestsrc num-buffers=1000 ! x264enc pass=quant ! \ - * matroskamux ! filesink location=videotestsrc.avi - * ]| This example pipeline will encode a test video source to H264 using fixed - * quantization, and muxes it in a Matroska container. - * </refsect2> - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include "gstx264enc.h" - -#include <string.h> -#include <stdlib.h> - -GST_DEBUG_CATEGORY_STATIC (x264_enc_debug); -#define GST_CAT_DEFAULT x264_enc_debug - -enum -{ - ARG_0, - ARG_THREADS, - ARG_PASS, - ARG_QUANTIZER, - ARG_STATS_FILE, - ARG_MULTIPASS_CACHE_FILE, - ARG_BYTE_STREAM, - ARG_BITRATE, - ARG_VBV_BUF_CAPACITY, - ARG_ME, - ARG_SUBME, - ARG_ANALYSE, - ARG_DCT8x8, - ARG_REF, - ARG_BFRAMES, - ARG_B_ADAPT, - ARG_B_PYRAMID, - ARG_WEIGHTB, - ARG_SPS_ID, - ARG_TRELLIS, - ARG_KEYINT_MAX, - ARG_CABAC, - ARG_QP_MIN, - ARG_QP_MAX, - ARG_QP_STEP, - ARG_IP_FACTOR, - ARG_PB_FACTOR, - ARG_NR, - ARG_INTERLACED -}; - -#define ARG_THREADS_DEFAULT 1 -#define ARG_PASS_DEFAULT 0 -#define ARG_QUANTIZER_DEFAULT 21 -#define ARG_MULTIPASS_CACHE_FILE_DEFAULT "x264.log" -#define ARG_STATS_FILE_DEFAULT ARG_MULTIPASS_CACHE_FILE_DEFAULT -#define ARG_BYTE_STREAM_DEFAULT FALSE -#define ARG_BITRATE_DEFAULT (2 * 1024) -#define ARG_VBV_BUF_CAPACITY_DEFAULT 600 -#define ARG_ME_DEFAULT X264_ME_HEX -#define ARG_SUBME_DEFAULT 1 -#define ARG_ANALYSE_DEFAULT 0 -#define ARG_DCT8x8_DEFAULT FALSE -#define ARG_REF_DEFAULT 1 -#define ARG_BFRAMES_DEFAULT 0 -#define ARG_B_ADAPT_DEFAULT TRUE -#define ARG_B_PYRAMID_DEFAULT FALSE -#define ARG_WEIGHTB_DEFAULT FALSE -#define ARG_SPS_ID_DEFAULT 0 -#define ARG_TRELLIS_DEFAULT TRUE -#define ARG_KEYINT_MAX_DEFAULT 0 -#define ARG_CABAC_DEFAULT TRUE -#define ARG_QP_MIN_DEFAULT 10 -#define ARG_QP_MAX_DEFAULT 51 -#define ARG_QP_STEP_DEFAULT 4 -#define ARG_IP_FACTOR_DEFAULT 1.4 -#define ARG_PB_FACTOR_DEFAULT 1.3 -#define ARG_NR_DEFAULT 0 -#define ARG_INTERLACED_DEFAULT FALSE - -enum -{ - GST_X264_ENC_PASS_CBR = 0, - GST_X264_ENC_PASS_QUANT = 0x04, - GST_X264_ENC_PASS_QUAL, - GST_X264_ENC_PASS_PASS1 = 0x11, - GST_X264_ENC_PASS_PASS2, - GST_X264_ENC_PASS_PASS3 -}; - -#define GST_X264_ENC_PASS_TYPE (gst_x264_enc_pass_get_type()) -static GType -gst_x264_enc_pass_get_type (void) -{ - static GType pass_type = 0; - - static const GEnumValue pass_types[] = { - {GST_X264_ENC_PASS_CBR, "Constant Bitrate Encoding", "cbr"}, - {GST_X264_ENC_PASS_QUANT, "Constant Quantizer", "quant"}, - {GST_X264_ENC_PASS_QUAL, "Constant Quality", "qual"}, - {GST_X264_ENC_PASS_PASS1, "VBR Encoding - Pass 1", "pass1"}, - {GST_X264_ENC_PASS_PASS2, "VBR Encoding - Pass 2", "pass2"}, - {GST_X264_ENC_PASS_PASS3, "VBR Encoding - Pass 3", "pass3"}, - {0, NULL, NULL} - }; - - if (!pass_type) { - pass_type = g_enum_register_static ("GstX264EncPass", pass_types); - } - return pass_type; -} - -#define GST_X264_ENC_ME_TYPE (gst_x264_enc_me_get_type()) -static GType -gst_x264_enc_me_get_type (void) -{ - static GType me_type = 0; - static const GEnumValue me_types[] = { - {X264_ME_DIA, "diamond search, radius 1 (fast)", "dia"}, - {X264_ME_HEX, "hexagonal search, radius 2", "hex"}, - {X264_ME_UMH, "uneven multi-hexagon search", "umh"}, - {X264_ME_ESA, "exhaustive search (slow)", "esa"}, - {0, NULL, NULL} - }; - - if (!me_type) { - me_type = g_enum_register_static ("GstX264EncMe", me_types); - } - return me_type; -} - -#define GST_X264_ENC_ANALYSE_TYPE (gst_x264_enc_analyse_get_type()) -static GType -gst_x264_enc_analyse_get_type (void) -{ - static GType analyse_type = 0; - static const GFlagsValue analyse_types[] = { - {X264_ANALYSE_I4x4, "i4x4", "i4x4"}, - {X264_ANALYSE_I8x8, "i8x8", "i8x8"}, - {X264_ANALYSE_PSUB16x16, "p8x8", "p8x8"}, - {X264_ANALYSE_PSUB8x8, "p4x4", "p4x4"}, - {X264_ANALYSE_BSUB16x16, "b8x8", "b8x8"}, - {0, NULL, NULL}, - }; - - if (!analyse_type) { - analyse_type = g_flags_register_static ("GstX264EncAnalyse", analyse_types); - } - return analyse_type; -} - -static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-raw-yuv, " - "format = (fourcc) I420, " - "framerate = (fraction) [0, MAX], " - "width = (int) [ 16, MAX ], " "height = (int) [ 16, MAX ]") - ); - -static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-h264, " - "framerate = (fraction) [0/1, MAX], " - "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ]") - ); - -static void gst_x264_enc_finalize (GObject * object); -static void gst_x264_enc_reset (GstX264Enc * encoder); - -static gboolean gst_x264_enc_init_encoder (GstX264Enc * encoder); -static void gst_x264_enc_close_encoder (GstX264Enc * encoder); - -static gboolean gst_x264_enc_sink_set_caps (GstPad * pad, GstCaps * caps); -static gboolean gst_x264_enc_sink_event (GstPad * pad, GstEvent * event); -static gboolean gst_x264_enc_src_event (GstPad * pad, GstEvent * event); -static GstFlowReturn gst_x264_enc_chain (GstPad * pad, GstBuffer * buf); -static void gst_x264_enc_flush_frames (GstX264Enc * encoder, gboolean send); -static GstFlowReturn gst_x264_enc_encode_frame (GstX264Enc * encoder, - x264_picture_t * pic_in, int *i_nal, gboolean send); -static GstStateChangeReturn gst_x264_enc_change_state (GstElement * element, - GstStateChange transition); - -static void gst_x264_enc_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static void gst_x264_enc_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); - -static void -_do_init (GType object_type) -{ - const GInterfaceInfo preset_interface_info = { - NULL, /* interface_init */ - NULL, /* interface_finalize */ - NULL /* interface_data */ - }; - - g_type_add_interface_static (object_type, GST_TYPE_PRESET, - &preset_interface_info); -} - -GST_BOILERPLATE_FULL (GstX264Enc, gst_x264_enc, GstElement, GST_TYPE_ELEMENT, - _do_init); - -static void -gst_x264_enc_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_set_details_simple (element_class, - "x264enc", "Codec/Encoder/Video", "H264 Encoder", - "Josef Zlomek <josef.zlomek@itonis.tv>, " - "Mark Nauwelaerts <mnauw@users.sf.net>"); - - 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)); -} - -static void -gst_x264_enc_class_init (GstX264EncClass * klass) -{ - GObjectClass *gobject_class; - GstElementClass *gstelement_class; - - gobject_class = (GObjectClass *) klass; - gstelement_class = (GstElementClass *) klass; - - gobject_class->set_property = gst_x264_enc_set_property; - gobject_class->get_property = gst_x264_enc_get_property; - gobject_class->finalize = gst_x264_enc_finalize; - - gstelement_class->change_state = - GST_DEBUG_FUNCPTR (gst_x264_enc_change_state); - - g_object_class_install_property (gobject_class, ARG_THREADS, - g_param_spec_uint ("threads", "Threads", - "Number of threads used by the codec (0 for automatic)", - 0, 4, ARG_THREADS_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_PASS, - g_param_spec_enum ("pass", "Encoding pass/type", - "Encoding pass/type", GST_X264_ENC_PASS_TYPE, - ARG_PASS_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_QUANTIZER, - g_param_spec_uint ("quantizer", "Constant Quantizer", - "Constant quantizer or quality to apply", - 1, 50, ARG_QUANTIZER_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_STATS_FILE, - g_param_spec_string ("stats-file", "Stats File", - "Filename for multipass statistics (deprecated, use multipass-stats-file)", - ARG_STATS_FILE_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_MULTIPASS_CACHE_FILE, - g_param_spec_string ("multipass-cache-file", "Multipass Cache File", - "Filename for multipass cache file", - ARG_MULTIPASS_CACHE_FILE_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_BYTE_STREAM, - g_param_spec_boolean ("byte-stream", "Byte Stream", - "Generate byte stream format of NALU", - ARG_BYTE_STREAM_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_BITRATE, - g_param_spec_uint ("bitrate", "Bitrate", "Bitrate in kbit/sec", 1, - 100 * 1024, ARG_BITRATE_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_VBV_BUF_CAPACITY, - g_param_spec_uint ("vbv-buf-capacity", "VBV buffer capacity", - "Size of the VBV buffer in milliseconds", - 300, 10000, ARG_VBV_BUF_CAPACITY_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_ME, - g_param_spec_enum ("me", "Motion Estimation", - "Integer pixel motion estimation method", GST_X264_ENC_ME_TYPE, - ARG_ME_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_SUBME, - g_param_spec_uint ("subme", "Subpixel Motion Estimation", - "Subpixel motion estimation and partition decision quality: 1=fast, 6=best", - 1, 6, ARG_SUBME_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_ANALYSE, - g_param_spec_flags ("analyse", "Analyse", "Partitions to consider", - GST_X264_ENC_ANALYSE_TYPE, ARG_ANALYSE_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_DCT8x8, - g_param_spec_boolean ("dct8x8", "DCT8x8", - "Adaptive spatial transform size", - ARG_DCT8x8_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_REF, - g_param_spec_uint ("ref", "Reference Frames", - "Number of reference frames", - 1, 12, ARG_REF_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_BFRAMES, - g_param_spec_uint ("bframes", "B-Frames", - "Number of B-frames between I and P", - 0, 4, ARG_BFRAMES_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_B_ADAPT, - g_param_spec_boolean ("b-adapt", "B-Adapt", - "Automatically decide how many B-frames to use", - ARG_B_ADAPT_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_B_PYRAMID, - g_param_spec_boolean ("b-pyramid", "B-Pyramid", - "Keep some B-frames as references", ARG_B_PYRAMID_DEFAULT, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_WEIGHTB, - g_param_spec_boolean ("weightb", "Weighted B-Frames", - "Weighted prediction for B-frames", ARG_WEIGHTB_DEFAULT, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_SPS_ID, - g_param_spec_uint ("sps-id", "SPS ID", - "SPS and PPS ID number", - 0, 31, ARG_SPS_ID_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_TRELLIS, - g_param_spec_boolean ("trellis", "Trellis quantization", - "Enable trellis searched quantization", ARG_TRELLIS_DEFAULT, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_KEYINT_MAX, - g_param_spec_uint ("key-int-max", "Key-frame maximal interval", - "Maximal distance between two key-frames (0 for automatic)", - 0, G_MAXINT, ARG_KEYINT_MAX_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_CABAC, - g_param_spec_boolean ("cabac", "Use CABAC", - "Enable CABAC entropy coding", ARG_CABAC_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_QP_MIN, - g_param_spec_uint ("qp-min", "Minimum Quantizer", - "Minimum quantizer", 1, 51, ARG_QP_MIN_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_QP_MAX, - g_param_spec_uint ("qp-max", "Maximum Quantizer", - "Maximum quantizer", 1, 51, ARG_QP_MAX_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_QP_STEP, - g_param_spec_uint ("qp-step", "Maximum Quantizer Difference", - "Maximum quantizer difference between frames", - 1, 50, ARG_QP_STEP_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_IP_FACTOR, - g_param_spec_float ("ip-factor", "IP-Factor", - "Quantizer factor between I- and P-frames", - 0, 2, ARG_IP_FACTOR_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_PB_FACTOR, - g_param_spec_float ("pb-factor", "PB-Factor", - "Quantizer factor between P- and B-frames", - 0, 2, ARG_PB_FACTOR_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_NR, - g_param_spec_uint ("noise-reduction", "Noise Reducation", - "Noise reduction strength", - 0, 100000, ARG_NR_DEFAULT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_INTERLACED, - g_param_spec_boolean ("interlaced", "Interlaced", - "Interlaced material", ARG_INTERLACED_DEFAULT, G_PARAM_READWRITE)); -} - -void -gst_x264_enc_log_callback (gpointer private, gint level, const char *format, - va_list args) -{ - GstDebugLevel gst_level; - GObject *object = (GObject *) private; - - switch (level) { - case X264_LOG_NONE: - gst_level = GST_LEVEL_NONE; - break; - case X264_LOG_ERROR: - gst_level = GST_LEVEL_ERROR; - break; - case X264_LOG_WARNING: - gst_level = GST_LEVEL_WARNING; - break; - case X264_LOG_INFO: - gst_level = GST_LEVEL_INFO; - break; - default: - /* push x264enc debug down to our lower levels to avoid some clutter */ - gst_level = GST_LEVEL_LOG; - break; - } - - gst_debug_log_valist (x264_enc_debug, gst_level, "", "", 0, object, format, - args); -} - -/* initialize the new element - * instantiate pads and add them to element - * set functions - * initialize structure - */ -static void -gst_x264_enc_init (GstX264Enc * encoder, GstX264EncClass * klass) -{ - encoder->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink"); - gst_pad_set_setcaps_function (encoder->sinkpad, - GST_DEBUG_FUNCPTR (gst_x264_enc_sink_set_caps)); - gst_pad_set_event_function (encoder->sinkpad, - GST_DEBUG_FUNCPTR (gst_x264_enc_sink_event)); - gst_pad_set_chain_function (encoder->sinkpad, - GST_DEBUG_FUNCPTR (gst_x264_enc_chain)); - gst_element_add_pad (GST_ELEMENT (encoder), encoder->sinkpad); - - encoder->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); - gst_pad_use_fixed_caps (encoder->srcpad); - gst_element_add_pad (GST_ELEMENT (encoder), encoder->srcpad); - - gst_pad_set_event_function (encoder->srcpad, - GST_DEBUG_FUNCPTR (gst_x264_enc_src_event)); - - /* properties */ - encoder->threads = ARG_THREADS_DEFAULT; - encoder->pass = ARG_PASS_DEFAULT; - encoder->quantizer = ARG_QUANTIZER_DEFAULT; - encoder->mp_cache_file = g_strdup (ARG_MULTIPASS_CACHE_FILE_DEFAULT); - encoder->byte_stream = ARG_BYTE_STREAM_DEFAULT; - encoder->bitrate = ARG_BITRATE_DEFAULT; - encoder->vbv_buf_capacity = ARG_VBV_BUF_CAPACITY_DEFAULT; - encoder->me = ARG_ME_DEFAULT; - encoder->subme = ARG_SUBME_DEFAULT; - encoder->analyse = ARG_ANALYSE_DEFAULT; - encoder->dct8x8 = ARG_DCT8x8_DEFAULT; - encoder->ref = ARG_REF_DEFAULT; - encoder->bframes = ARG_BFRAMES_DEFAULT; - encoder->b_adapt = ARG_B_ADAPT_DEFAULT; - encoder->b_pyramid = ARG_B_PYRAMID_DEFAULT; - encoder->weightb = ARG_WEIGHTB_DEFAULT; - encoder->sps_id = ARG_SPS_ID_DEFAULT; - encoder->trellis = ARG_TRELLIS_DEFAULT; - encoder->keyint_max = ARG_KEYINT_MAX_DEFAULT; - encoder->cabac = ARG_CABAC_DEFAULT; - encoder->qp_min = ARG_QP_MIN_DEFAULT; - encoder->qp_max = ARG_QP_MAX_DEFAULT; - encoder->qp_step = ARG_QP_STEP_DEFAULT; - encoder->ip_factor = ARG_IP_FACTOR_DEFAULT; - encoder->pb_factor = ARG_PB_FACTOR_DEFAULT; - encoder->noise_reduction = ARG_NR_DEFAULT; - encoder->interlaced = ARG_INTERLACED_DEFAULT; - - /* resources */ - encoder->delay = g_queue_new (); - encoder->buffer_size = 100000; - encoder->buffer = g_malloc (encoder->buffer_size); - - encoder->i_type = X264_TYPE_AUTO; - x264_param_default (&encoder->x264param); - - /* log callback setup; part of parameters */ - encoder->x264param.pf_log = GST_DEBUG_FUNCPTR (gst_x264_enc_log_callback); - encoder->x264param.p_log_private = encoder; - encoder->x264param.i_log_level = X264_LOG_DEBUG; - - gst_x264_enc_reset (encoder); -} - -static void -gst_x264_enc_reset (GstX264Enc * encoder) -{ - encoder->x264enc = NULL; - encoder->width = 0; - encoder->height = 0; -} - -static void -gst_x264_enc_finalize (GObject * object) -{ - GstX264Enc *encoder = GST_X264_ENC (object); - - g_free (encoder->mp_cache_file); - encoder->mp_cache_file = NULL; - g_free (encoder->buffer); - encoder->buffer = NULL; - g_queue_free (encoder->delay); - encoder->delay = NULL; - - gst_x264_enc_close_encoder (encoder); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -/* - * gst_x264_enc_init_encoder - * @encoder: Encoder which should be initialized. - * - * Initialize x264 encoder. - * - */ -static gboolean -gst_x264_enc_init_encoder (GstX264Enc * encoder) -{ - guint pass = 0; - - /* make sure that the encoder is closed */ - gst_x264_enc_close_encoder (encoder); - - GST_OBJECT_LOCK (encoder); - - /* set up encoder parameters */ - encoder->x264param.i_threads = encoder->threads; - encoder->x264param.i_fps_num = encoder->fps_num; - encoder->x264param.i_fps_den = encoder->fps_den; - encoder->x264param.i_width = encoder->width; - encoder->x264param.i_height = encoder->height; - if (encoder->par_den > 0) { - encoder->x264param.vui.i_sar_width = encoder->par_num; - encoder->x264param.vui.i_sar_height = encoder->par_den; - } - encoder->x264param.i_keyint_max = encoder->keyint_max ? encoder->keyint_max : - (2 * encoder->fps_num / encoder->fps_den); - encoder->x264param.b_cabac = encoder->cabac; - // TODO - encoder->x264param.b_aud = 1; - encoder->x264param.i_sps_id = encoder->sps_id; - if ((((encoder->height == 576) && ((encoder->width == 720) - || (encoder->width == 704) || (encoder->width == 352))) - || ((encoder->height == 288) && (encoder->width == 352))) - && (encoder->fps_den == 1) && (encoder->fps_num == 25)) { - encoder->x264param.vui.i_vidformat = 1; /* PAL */ - } else if ((((encoder->height == 480) && ((encoder->width == 720) - || (encoder->width == 704) || (encoder->width == 352))) - || ((encoder->height == 240) && (encoder->width == 352))) - && (encoder->fps_den == 1001) && ((encoder->fps_num == 30000) - || (encoder->fps_num == 24000))) { - encoder->x264param.vui.i_vidformat = 2; /* NTSC */ - } else - encoder->x264param.vui.i_vidformat = 5; /* unspecified */ - encoder->x264param.analyse.i_trellis = encoder->trellis ? 1 : 0; - encoder->x264param.analyse.b_psnr = 0; - encoder->x264param.analyse.i_me_method = encoder->me; - encoder->x264param.analyse.i_subpel_refine = encoder->subme; - encoder->x264param.analyse.inter = encoder->analyse; - encoder->x264param.analyse.b_transform_8x8 = encoder->dct8x8; - encoder->x264param.analyse.b_weighted_bipred = encoder->weightb; - encoder->x264param.analyse.i_noise_reduction = encoder->noise_reduction; - encoder->x264param.i_frame_reference = encoder->ref; - encoder->x264param.i_bframe = encoder->bframes; - encoder->x264param.b_bframe_pyramid = encoder->b_pyramid; -#if X264_BUILD < 63 - encoder->x264param.b_bframe_adaptive = encoder->b_adapt; -#else - encoder->x264param.i_bframe_adaptive = - encoder->b_adapt ? X264_B_ADAPT_FAST : X264_B_ADAPT_NONE; -#endif - encoder->x264param.b_interlaced = encoder->interlaced; - encoder->x264param.b_deblocking_filter = 1; - encoder->x264param.i_deblocking_filter_alphac0 = 0; - encoder->x264param.i_deblocking_filter_beta = 0; - encoder->x264param.rc.f_ip_factor = encoder->ip_factor; - encoder->x264param.rc.f_pb_factor = encoder->pb_factor; - - switch (encoder->pass) { - case GST_X264_ENC_PASS_QUANT: - encoder->x264param.rc.i_rc_method = X264_RC_CQP; - encoder->x264param.rc.i_qp_constant = encoder->quantizer; - break; - case GST_X264_ENC_PASS_QUAL: - encoder->x264param.rc.i_rc_method = X264_RC_CRF; - encoder->x264param.rc.f_rf_constant = encoder->quantizer; - break; - case GST_X264_ENC_PASS_CBR: - case GST_X264_ENC_PASS_PASS1: - case GST_X264_ENC_PASS_PASS2: - case GST_X264_ENC_PASS_PASS3: - default: - encoder->x264param.rc.i_rc_method = X264_RC_ABR; - encoder->x264param.rc.i_bitrate = encoder->bitrate; - encoder->x264param.rc.i_vbv_max_bitrate = encoder->bitrate; - encoder->x264param.rc.i_vbv_buffer_size - = encoder->x264param.rc.i_vbv_max_bitrate - * encoder->vbv_buf_capacity / 1000; - encoder->x264param.rc.i_qp_min = encoder->qp_min; - encoder->x264param.rc.i_qp_max = encoder->qp_max; - encoder->x264param.rc.i_qp_step = encoder->qp_step; - pass = encoder->pass & 0xF; - break; - } - - switch (pass) { - case 0: - encoder->x264param.rc.b_stat_read = 0; - encoder->x264param.rc.b_stat_write = 0; - break; - case 1: - /* Turbo mode parameters. */ - encoder->x264param.i_frame_reference = (encoder->ref + 1) >> 1; - encoder->x264param.analyse.i_subpel_refine = - CLAMP (encoder->subme - 1, 1, 3); - encoder->x264param.analyse.inter &= ~X264_ANALYSE_PSUB8x8; - encoder->x264param.analyse.inter &= ~X264_ANALYSE_BSUB16x16; - encoder->x264param.analyse.i_trellis = 0; - - encoder->x264param.rc.b_stat_read = 0; - encoder->x264param.rc.b_stat_write = 1; - break; - case 2: - encoder->x264param.rc.b_stat_read = 1; - encoder->x264param.rc.b_stat_write = 0; - break; - case 3: - encoder->x264param.rc.b_stat_read = 1; - encoder->x264param.rc.b_stat_write = 1; - break; - } - encoder->x264param.rc.psz_stat_in = encoder->mp_cache_file; - encoder->x264param.rc.psz_stat_out = encoder->mp_cache_file; - - GST_OBJECT_UNLOCK (encoder); - - encoder->x264enc = x264_encoder_open (&encoder->x264param); - if (!encoder->x264enc) { - GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, - ("Can not initialize x264 encoder."), (NULL)); - return FALSE; - } - - return TRUE; -} - -/* gst_x264_enc_close_encoder - * @encoder: Encoder which should close. - * - * Close x264 encoder. - */ -static void -gst_x264_enc_close_encoder (GstX264Enc * encoder) -{ - if (encoder->x264enc != NULL) { - x264_encoder_close (encoder->x264enc); - encoder->x264enc = NULL; - } -} - -/* - * Returns: Buffer with the stream headers. - */ -static GstBuffer * -gst_x264_enc_header_buf (GstX264Enc * encoder) -{ - GstBuffer *buf; - x264_nal_t *nal; - int i_nal; - int header_return; - int i_size; - int nal_size, i_data; - guint8 *buffer, *sps; - gulong buffer_size; - - if (G_UNLIKELY (encoder->x264enc == NULL)) - return NULL; - - /* Create avcC header. */ - - header_return = x264_encoder_headers (encoder->x264enc, &nal, &i_nal); - if (header_return < 0) { - GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, ("Encode x264 header failed."), - ("x264_encoder_headers return code=%d", header_return)); - return NULL; - } - - /* x264 is expected to return an SEI (some identification info), - * followed by an SPS and PPS */ - if (i_nal != 3 || nal[1].i_type != 7 || nal[2].i_type != 8 || - nal[1].i_payload < 4 || nal[2].i_payload < 1) { - GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, (NULL), - ("Unexpected x264 header.")); - return NULL; - } - - /* nal payloads with emulation_prevention_three_byte, and some header data */ - buffer_size = (nal[1].i_payload + nal[2].i_payload) * 4 + 100; - buffer = g_malloc (buffer_size); - - sps = nal[1].p_payload; - - buffer[0] = 1; /* AVC Decoder Configuration Record ver. 1 */ - buffer[1] = sps[0]; /* profile_idc */ - buffer[2] = sps[1]; /* profile_compability */ - buffer[3] = sps[2]; /* level_idc */ - buffer[4] = 0xfc | (4 - 1); /* nal_length_size_minus1 */ - - i_size = 5; - - buffer[i_size++] = 0xe0 | 1; /* number of SPSs */ - - i_data = buffer_size - i_size - 2; - nal_size = x264_nal_encode (buffer + i_size + 2, &i_data, 0, &nal[1]); - GST_WRITE_UINT16_BE (buffer + i_size, nal_size); - i_size += nal_size + 2; - - buffer[i_size++] = 1; /* number of PPSs */ - - i_data = buffer_size - i_size - 2; - nal_size = x264_nal_encode (buffer + i_size + 2, &i_data, 0, &nal[2]); - GST_WRITE_UINT16_BE (buffer + i_size, nal_size); - i_size += nal_size + 2; - - buf = gst_buffer_new_and_alloc (i_size); - memcpy (GST_BUFFER_DATA (buf), buffer, i_size); - g_free (buffer); - - return buf; -} - -/* gst_x264_enc_set_src_caps - * Returns: TRUE on success. - */ -static gboolean -gst_x264_enc_set_src_caps (GstX264Enc * encoder, GstPad * pad, GstCaps * caps) -{ - GstBuffer *buf; - GstCaps *outcaps; - gboolean res; - - outcaps = gst_caps_new_simple ("video/x-h264", - "width", G_TYPE_INT, encoder->width, - "height", G_TYPE_INT, encoder->height, - "framerate", GST_TYPE_FRACTION, encoder->fps_num, encoder->fps_den, NULL); - - if (!encoder->byte_stream) { - buf = gst_x264_enc_header_buf (encoder); - if (buf != NULL) { - gst_caps_set_simple (outcaps, "codec_data", GST_TYPE_BUFFER, buf, NULL); - gst_buffer_unref (buf); - } - } - - res = gst_pad_set_caps (pad, outcaps); - gst_caps_unref (outcaps); - - return res; -} - -static gboolean -gst_x264_enc_sink_set_caps (GstPad * pad, GstCaps * caps) -{ - GstX264Enc *encoder = GST_X264_ENC (GST_OBJECT_PARENT (pad)); - gint width, height; - gint fps_num, fps_den; - gint par_num, par_den; - gint i; - - /* get info from caps */ - /* only I420 supported for now; so apparently claims x264enc ? */ - if (!gst_video_format_parse_caps (caps, &encoder->format, &width, &height) || - encoder->format != GST_VIDEO_FORMAT_I420) - return FALSE; - if (!gst_video_parse_caps_framerate (caps, &fps_num, &fps_den)) - return FALSE; - if (!gst_video_parse_caps_pixel_aspect_ratio (caps, &par_num, &par_den)) { - par_num = 1; - par_den = 1; - } - - /* If the encoder is initialized, do not - reinitialize it again if not necessary */ - if (encoder->x264enc) { - if (width == encoder->width && height == encoder->height - && fps_num == encoder->fps_num && fps_den == encoder->fps_den - && par_num == encoder->par_num && par_den == encoder->par_den) - return TRUE; - - /* clear out pending frames */ - gst_x264_enc_flush_frames (encoder, TRUE); - - encoder->sps_id++; - } - - /* store input description */ - encoder->width = width; - encoder->height = height; - encoder->fps_num = fps_num; - encoder->fps_den = fps_den; - encoder->par_num = par_num; - encoder->par_den = par_den; - - /* prepare a cached image description */ - encoder->image_size = gst_video_format_get_size (encoder->format, width, - height); - for (i = 0; i < 3; ++i) { - /* only offsets now, is shifted later */ - encoder->offset[i] = gst_video_format_get_component_offset (encoder->format, - i, width, height); - encoder->stride[i] = gst_video_format_get_row_stride (encoder->format, - i, width); - } - - if (!gst_x264_enc_init_encoder (encoder)) - return FALSE; - - if (!gst_x264_enc_set_src_caps (encoder, encoder->srcpad, caps)) { - gst_x264_enc_close_encoder (encoder); - return FALSE; - } - - return TRUE; -} - -static gboolean -gst_x264_enc_src_event (GstPad * pad, GstEvent * event) -{ - gboolean ret; - GstX264Enc *encoder; - - encoder = GST_X264_ENC (gst_pad_get_parent (pad)); - - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_CUSTOM_UPSTREAM:{ - const GstStructure *s; - s = gst_event_get_structure (event); - if (gst_structure_has_name (s, "GstForceKeyUnit")) { - /* Set I frame request */ - encoder->i_type = X264_TYPE_I; - } - break; - } - default: - break; - } - - ret = gst_pad_push_event (encoder->sinkpad, event); - - gst_object_unref (encoder); - return ret; -} - -static gboolean -gst_x264_enc_sink_event (GstPad * pad, GstEvent * event) -{ - gboolean ret; - GstX264Enc *encoder; - - encoder = GST_X264_ENC (gst_pad_get_parent (pad)); - - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_EOS: - gst_x264_enc_flush_frames (encoder, TRUE); - break; - /* no flushing if flush received, - * buffers in encoder are considered (in the) past */ - case GST_EVENT_CUSTOM_DOWNSTREAM:{ - const GstStructure *s; - s = gst_event_get_structure (event); - if (gst_structure_has_name (s, "GstForceKeyUnit")) { - encoder->i_type = X264_TYPE_I; - } - break; - } - default: - break; - } - - ret = gst_pad_push_event (encoder->srcpad, event); - - gst_object_unref (encoder); - return ret; -} - -/* chain function - * this function does the actual processing - */ -static GstFlowReturn -gst_x264_enc_chain (GstPad * pad, GstBuffer * buf) -{ - GstX264Enc *encoder = GST_X264_ENC (GST_OBJECT_PARENT (pad)); - GstFlowReturn ret; - x264_picture_t pic_in; - gint i_nal, i; - if (G_UNLIKELY (encoder->x264enc == NULL)) - goto not_inited; - - /* create x264_picture_t from the buffer */ - /* mostly taken from mplayer (file ve_x264.c) */ - if (G_UNLIKELY (GST_BUFFER_SIZE (buf) < encoder->image_size)) - goto wrong_buffer_size; - - /* remember the timestamp and duration */ - g_queue_push_tail (encoder->delay, buf); - - /* set up input picture */ - memset (&pic_in, 0, sizeof (pic_in)); - - pic_in.img.i_csp = X264_CSP_I420; - pic_in.img.i_plane = 3; - for (i = 0; i < 3; i++) { - pic_in.img.plane[i] = GST_BUFFER_DATA (buf) + encoder->offset[i]; - pic_in.img.i_stride[i] = encoder->stride[i]; - } - - pic_in.i_type = encoder->i_type; - - /* Reset encoder forced picture type */ - encoder->i_type = X264_TYPE_AUTO; - - pic_in.i_pts = GST_BUFFER_TIMESTAMP (buf); - - ret = gst_x264_enc_encode_frame (encoder, &pic_in, &i_nal, TRUE); - - /* input buffer is released later on */ - return ret; - -/* ERRORS */ -not_inited: - { - GST_WARNING_OBJECT (encoder, "Got buffer before set_caps was called"); - gst_buffer_unref (buf); - return GST_FLOW_NOT_NEGOTIATED; - } -wrong_buffer_size: - { - GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, - ("Encode x264 frame failed."), - ("Wrong buffer size %d (should be %d)", - GST_BUFFER_SIZE (buf), encoder->image_size)); - gst_buffer_unref (buf); - return GST_FLOW_ERROR; - } -} - -static GstFlowReturn -gst_x264_enc_encode_frame (GstX264Enc * encoder, x264_picture_t * pic_in, - int *i_nal, gboolean send) -{ - GstBuffer *out_buf = NULL, *in_buf = NULL; - x264_picture_t pic_out; - x264_nal_t *nal; - int i_size; - int nal_size; - int encoder_return; - gint i; - GstFlowReturn ret; - GstClockTime timestamp; - GstClockTime duration; - - if (G_UNLIKELY (encoder->x264enc == NULL)) - return GST_FLOW_NOT_NEGOTIATED; - - encoder_return = x264_encoder_encode (encoder->x264enc, - &nal, i_nal, pic_in, &pic_out); - - if (encoder_return < 0) { - GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, ("Encode x264 frame failed."), - ("x264_encoder_encode return code=%d", encoder_return)); - return GST_FLOW_ERROR; - } - - if (!*i_nal) { - return GST_FLOW_OK; - } - - i_size = 0; - for (i = 0; i < *i_nal; i++) { - gint i_data = encoder->buffer_size - i_size - 4; - - if (i_data < nal[i].i_payload * 2) { - encoder->buffer_size += 2 * nal[i].i_payload; - encoder->buffer = g_realloc (encoder->buffer, encoder->buffer_size); - i_data = encoder->buffer_size - i_size - 4; - } - - nal_size = - x264_nal_encode (encoder->buffer + i_size + 4, &i_data, 0, &nal[i]); - if (encoder->byte_stream) - GST_WRITE_UINT32_BE (encoder->buffer + i_size, 1); - else - GST_WRITE_UINT32_BE (encoder->buffer + i_size, nal_size); - - i_size += nal_size + 4; - } - - in_buf = g_queue_pop_head (encoder->delay); - if (in_buf) { - timestamp = GST_BUFFER_TIMESTAMP (in_buf); - duration = GST_BUFFER_DURATION (in_buf); - gst_buffer_unref (in_buf); - } else { - GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, (NULL), - ("Timestamp queue empty.")); - return GST_FLOW_ERROR; - } - - if (!send) - return GST_FLOW_OK; - - ret = gst_pad_alloc_buffer (encoder->srcpad, GST_BUFFER_OFFSET_NONE, - i_size, GST_PAD_CAPS (encoder->srcpad), &out_buf); - if (ret != GST_FLOW_OK) - return ret; - - memcpy (GST_BUFFER_DATA (out_buf), encoder->buffer, i_size); - GST_BUFFER_SIZE (out_buf) = i_size; - - /* PTS */ - /* FIXME ??: maybe use DTS here, since: - * - it is so practiced by other encoders, - * - downstream (e.g. muxers) might not enjoy non-monotone timestamps, - * whereas a decoder can also deal with DTS */ - GST_BUFFER_TIMESTAMP (out_buf) = pic_out.i_pts; - GST_BUFFER_DURATION (out_buf) = duration; - - if (pic_out.i_type == X264_TYPE_IDR) { - GST_BUFFER_FLAG_UNSET (out_buf, GST_BUFFER_FLAG_DELTA_UNIT); - } else { - GST_BUFFER_FLAG_SET (out_buf, GST_BUFFER_FLAG_DELTA_UNIT); - } - - return gst_pad_push (encoder->srcpad, out_buf); -} - -static void -gst_x264_enc_flush_frames (GstX264Enc * encoder, gboolean send) -{ - GstFlowReturn flow_ret; - gint i_nal; - - /* first send the remaining frames */ - if (encoder->x264enc) - do { - flow_ret = gst_x264_enc_encode_frame (encoder, NULL, &i_nal, send); - } while (flow_ret == GST_FLOW_OK && i_nal > 0); - - /* in any case, make sure the delay queue is emptied */ - while (!g_queue_is_empty (encoder->delay)) - gst_buffer_unref (g_queue_pop_head (encoder->delay)); -} - -static GstStateChangeReturn -gst_x264_enc_change_state (GstElement * element, GstStateChange transition) -{ - GstX264Enc *encoder = GST_X264_ENC (element); - GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; - - ret = parent_class->change_state (element, transition); - if (ret == GST_STATE_CHANGE_FAILURE) - goto out; - - switch (transition) { - case GST_STATE_CHANGE_PAUSED_TO_READY: - gst_x264_enc_flush_frames (encoder, FALSE); - gst_x264_enc_close_encoder (encoder); - gst_x264_enc_reset (encoder); - break; - default: - break; - } - -out: - return ret; -} - -static void -gst_x264_enc_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstX264Enc *encoder; - GstState state; - - encoder = GST_X264_ENC (object); - - GST_OBJECT_LOCK (encoder); - /* state at least matters for sps, bytestream, pass, - * and so by extension ... */ - state = GST_STATE (encoder); - if (state != GST_STATE_READY && state != GST_STATE_NULL) - goto wrong_state; - - switch (prop_id) { - case ARG_THREADS: - encoder->threads = g_value_get_uint (value); - break; - case ARG_PASS: - encoder->pass = g_value_get_enum (value); - break; - case ARG_QUANTIZER: - encoder->quantizer = g_value_get_uint (value); - break; - case ARG_STATS_FILE: - case ARG_MULTIPASS_CACHE_FILE: - if (encoder->mp_cache_file) - g_free (encoder->mp_cache_file); - encoder->mp_cache_file = g_value_dup_string (value); - break; - case ARG_BYTE_STREAM: - encoder->byte_stream = g_value_get_boolean (value); - break; - case ARG_BITRATE: - encoder->bitrate = g_value_get_uint (value); - break; - case ARG_VBV_BUF_CAPACITY: - encoder->vbv_buf_capacity = g_value_get_uint (value); - break; - case ARG_ME: - encoder->me = g_value_get_enum (value); - break; - case ARG_SUBME: - encoder->subme = g_value_get_uint (value); - break; - case ARG_ANALYSE: - encoder->analyse = g_value_get_flags (value); - break; - case ARG_DCT8x8: - encoder->dct8x8 = g_value_get_boolean (value); - break; - case ARG_REF: - encoder->ref = g_value_get_uint (value); - break; - case ARG_BFRAMES: - encoder->bframes = g_value_get_uint (value); - break; - case ARG_B_ADAPT: - encoder->b_adapt = g_value_get_boolean (value); - break; - case ARG_B_PYRAMID: - encoder->b_pyramid = g_value_get_boolean (value); - break; - case ARG_WEIGHTB: - encoder->weightb = g_value_get_boolean (value); - break; - case ARG_SPS_ID: - encoder->sps_id = g_value_get_uint (value); - break; - case ARG_TRELLIS: - encoder->trellis = g_value_get_boolean (value); - break; - case ARG_KEYINT_MAX: - encoder->keyint_max = g_value_get_uint (value); - break; - case ARG_CABAC: - encoder->cabac = g_value_get_boolean (value); - break; - case ARG_QP_MIN: - encoder->qp_min = g_value_get_uint (value); - break; - case ARG_QP_MAX: - encoder->qp_max = g_value_get_uint (value); - break; - case ARG_QP_STEP: - encoder->qp_step = g_value_get_uint (value); - break; - case ARG_IP_FACTOR: - encoder->ip_factor = g_value_get_float (value); - break; - case ARG_PB_FACTOR: - encoder->pb_factor = g_value_get_float (value); - break; - case ARG_NR: - encoder->noise_reduction = g_value_get_uint (value); - break; - case ARG_INTERLACED: - encoder->interlaced = g_value_get_boolean (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } - GST_OBJECT_UNLOCK (encoder); - return; - - /* ERROR */ -wrong_state: - { - GST_DEBUG_OBJECT (encoder, "setting property in wrong state"); - GST_OBJECT_UNLOCK (encoder); - } -} - -static void -gst_x264_enc_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) -{ - GstX264Enc *encoder; - - encoder = GST_X264_ENC (object); - - GST_OBJECT_LOCK (encoder); - switch (prop_id) { - case ARG_THREADS: - g_value_set_uint (value, encoder->threads); - break; - case ARG_PASS: - g_value_set_enum (value, encoder->pass); - break; - case ARG_QUANTIZER: - g_value_set_uint (value, encoder->quantizer); - break; - case ARG_STATS_FILE: - case ARG_MULTIPASS_CACHE_FILE: - g_value_set_string (value, encoder->mp_cache_file); - break; - case ARG_BYTE_STREAM: - g_value_set_boolean (value, encoder->byte_stream); - break; - case ARG_BITRATE: - g_value_set_uint (value, encoder->bitrate); - break; - case ARG_VBV_BUF_CAPACITY: - g_value_set_uint (value, encoder->vbv_buf_capacity); - break; - case ARG_ME: - g_value_set_enum (value, encoder->me); - break; - case ARG_SUBME: - g_value_set_uint (value, encoder->subme); - break; - case ARG_ANALYSE: - g_value_set_flags (value, encoder->analyse); - break; - case ARG_DCT8x8: - g_value_set_boolean (value, encoder->dct8x8); - break; - case ARG_REF: - g_value_set_uint (value, encoder->ref); - break; - case ARG_BFRAMES: - g_value_set_uint (value, encoder->bframes); - break; - case ARG_B_ADAPT: - g_value_set_boolean (value, encoder->b_adapt); - break; - case ARG_B_PYRAMID: - g_value_set_boolean (value, encoder->b_pyramid); - break; - case ARG_WEIGHTB: - g_value_set_boolean (value, encoder->weightb); - break; - case ARG_SPS_ID: - g_value_set_uint (value, encoder->sps_id); - break; - case ARG_TRELLIS: - g_value_set_boolean (value, encoder->trellis); - break; - case ARG_KEYINT_MAX: - g_value_set_uint (value, encoder->keyint_max); - break; - case ARG_QP_MIN: - g_value_set_uint (value, encoder->qp_min); - break; - case ARG_QP_MAX: - g_value_set_uint (value, encoder->qp_max); - break; - case ARG_QP_STEP: - g_value_set_uint (value, encoder->qp_step); - break; - case ARG_CABAC: - g_value_set_boolean (value, encoder->cabac); - break; - case ARG_IP_FACTOR: - g_value_set_float (value, encoder->ip_factor); - break; - case ARG_PB_FACTOR: - g_value_set_float (value, encoder->pb_factor); - break; - case ARG_NR: - g_value_set_uint (value, encoder->noise_reduction); - break; - case ARG_INTERLACED: - g_value_set_boolean (value, encoder->interlaced); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } - GST_OBJECT_UNLOCK (encoder); -} - -static gboolean -plugin_init (GstPlugin * plugin) -{ - GST_DEBUG_CATEGORY_INIT (x264_enc_debug, "x264enc", 0, - "h264 encoding element"); - - return gst_element_register (plugin, "x264enc", - GST_RANK_PRIMARY, GST_TYPE_X264_ENC); -} - -GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "x264", - "libx264-based H264 plugins", - plugin_init, VERSION, "GPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/ext/x264/gstx264enc.h b/ext/x264/gstx264enc.h deleted file mode 100644 index 15ffe65e..00000000 --- a/ext/x264/gstx264enc.h +++ /dev/null @@ -1,110 +0,0 @@ -/* GStreamer H264 encoder plugin - * Copyright (C) 2005 Michal Benes <michal.benes@itonis.tv> - * Copyright (C) 2005 Josef Zlomek <josef.zlomek@itonis.tv> - * - * 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_X264_ENC_H__ -#define __GST_X264_ENC_H__ - -#include <gst/gst.h> -#include <gst/video/video.h> -#include "_stdint.h" -#include <x264.h> - -G_BEGIN_DECLS - -#define GST_TYPE_X264_ENC \ - (gst_x264_enc_get_type()) -#define GST_X264_ENC(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_X264_ENC,GstX264Enc)) -#define GST_X264_ENC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_X264_ENC,GstX264EncClass)) -#define GST_IS_X264_ENC(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_X264_ENC)) -#define GST_IS_X264_ENC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_X264_ENC)) - -typedef struct _GstX264Enc GstX264Enc; -typedef struct _GstX264EncClass GstX264EncClass; - -struct _GstX264Enc -{ - GstElement element; - - /*< private >*/ - GstPad *sinkpad; - GstPad *srcpad; - - x264_t *x264enc; - x264_param_t x264param; - - /* properties */ - guint threads; - gint pass; - guint quantizer; - gchar *mp_cache_file; - gboolean byte_stream; - guint bitrate; - gint me; - guint subme; - guint analyse; - gboolean dct8x8; - guint ref; - guint bframes; - gboolean b_adapt; - gboolean b_pyramid; - gboolean weightb; - guint sps_id; - gboolean trellis; - guint vbv_buf_capacity; - guint keyint_max; - gboolean cabac; - gfloat ip_factor; - gfloat pb_factor; - guint qp_min; - guint qp_max; - guint qp_step; - guint noise_reduction; - gboolean interlaced; - - /* input description */ - GstVideoFormat format; - gint width, height; - gint fps_num, fps_den; - gint par_num, par_den; - /* cache some format properties */ - gint stride[4], offset[4]; - gint image_size; - - /* for b-frame delay handling */ - GQueue *delay; - - guint8 *buffer; - gulong buffer_size; - - gint i_type; -}; - -struct _GstX264EncClass -{ - GstElementClass parent_class; -}; - -G_END_DECLS - -#endif /* __GST_X264_ENC_H__ */ diff --git a/gst-libs/gst/interfaces/photography.c b/gst-libs/gst/interfaces/photography.c index 4d62cf46..63f389ab 100644 --- a/gst-libs/gst/interfaces/photography.c +++ b/gst-libs/gst/interfaces/photography.c @@ -90,6 +90,8 @@ gst_photography_iface_init (GstPhotographyInterface * iface) iface->get_capabilities = NULL; iface->prepare_for_capture = NULL; iface->set_autofocus = NULL; + iface->set_config = NULL; + iface->get_config = NULL; } #define GST_PHOTOGRAPHY_FUNC_TEMPLATE(function_name, param_type) \ @@ -369,3 +371,53 @@ gst_photography_set_autofocus (GstPhotography * photo, gboolean on) iface->set_autofocus (photo, on); } } + +/** + * gst_photography_set_config: + * @photo: #GstPhotography interface of a #GstElement + * @config: #GstPhotoSettings containg the configuration + * + * Set all configuration settings at once. + * + * Returns: TRUE if configuration was set successfully, otherwise FALSE. + */ +gboolean +gst_photography_set_config (GstPhotography * photo, GstPhotoSettings *config) +{ + GstPhotographyInterface *iface; + gboolean ret = FALSE; + + g_return_val_if_fail (photo != NULL, FALSE); + + iface = GST_PHOTOGRAPHY_GET_IFACE (photo); + if (iface->set_config) { + ret = iface->set_config (photo, config); + } + + return ret; +} + +/** + * gst_photography_get_config: + * @photo: #GstPhotography interface of a #GstElement + * @config: #GstPhotoSettings containg the configuration + * + * Get all configuration settings at once. + * + * Returns: TRUE if configuration was got successfully, otherwise FALSE. + */ +gboolean +gst_photography_get_config (GstPhotography * photo, GstPhotoSettings * config) +{ + GstPhotographyInterface *iface; + gboolean ret = FALSE; + + g_return_val_if_fail (photo != NULL, FALSE); + + iface = GST_PHOTOGRAPHY_GET_IFACE (photo); + if (iface->get_config) { + ret = iface->get_config (photo, config); + } + + return ret; +} diff --git a/gst-libs/gst/interfaces/photography.h b/gst-libs/gst/interfaces/photography.h index b7f6b940..170151cb 100644 --- a/gst-libs/gst/interfaces/photography.h +++ b/gst-libs/gst/interfaces/photography.h @@ -181,6 +181,8 @@ typedef void (*GstPhotoCapturePrepared) (gpointer data, * @get_capabilities: vmethod to get supported capabilities of the interface * @prepare_for_capture: vmethod to tell the element to prepare for capturing * @set_autofocus: vmethod to set autofocus on/off + * @set_config: vmethod to set all configuration parameters at once + * @get_config: vmethod to get all configuration parameters at once * * #GstPhotographyInterface interface. */ @@ -221,6 +223,8 @@ typedef struct _GstPhotographyInterface gboolean (*prepare_for_capture) (GstPhotography * photo, GstPhotoCapturePrepared func, GstCaps *capture_caps, gpointer user_data); void (*set_autofocus) (GstPhotography * photo, gboolean on); + gboolean (*set_config) (GstPhotography * photo, GstPhotoSettings * config); + gboolean (*get_config) (GstPhotography * photo, GstPhotoSettings * config); /*< private > */ gpointer _gst_reserved[GST_PADDING]; @@ -270,6 +274,11 @@ gboolean gst_photography_prepare_for_capture (GstPhotography * photo, void gst_photography_set_autofocus (GstPhotography * photo, gboolean on); +gboolean gst_photography_set_config (GstPhotography * photo, + GstPhotoSettings * config); +gboolean gst_photography_get_config (GstPhotography * photo, + GstPhotoSettings * config); + G_END_DECLS #endif /* __GST_PHOTOGRAPHY_H__ */ diff --git a/gst-plugins-bad.doap b/gst-plugins-bad.doap index 4e8dbecc..f87c2eb6 100644 --- a/gst-plugins-bad.doap +++ b/gst-plugins-bad.doap @@ -36,6 +36,17 @@ real live maintainer, or some actual wide use. <release> <Version> + <revision>0.10.13</revision> + <branch>0.10</branch> + <name>Supersonic Rocket</name> + <created>2009-06-18</created> + <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-0.10.13.tar.bz2" /> + <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-0.10.13.tar.gz" /> + </Version> + </release> + + <release> + <Version> <revision>0.10.12</revision> <branch>0.10</branch> <name>More than I can handle</name> diff --git a/gst-plugins-bad.spec.in b/gst-plugins-bad.spec.in index d5445201..ab02bcaa 100644 --- a/gst-plugins-bad.spec.in +++ b/gst-plugins-bad.spec.in @@ -31,7 +31,6 @@ BuildRequires: gcc-c++ @USE_GSM_TRUE@Provides: gstreamer-gsm = %{version}-%{release} @USE_LIBMMS_TRUE@Requires: libmms >= 0.1 @USE_MYTHTV_TRUE@Requires: gmyth -@USE_X264_TRUE@Requires: x264 %description GStreamer is a streaming media framework, based on graphs of filters which @@ -133,7 +132,6 @@ rm -rf $RPM_BUILD_ROOT %{_libdir}/gstreamer-%{majorminor}/libgstcamerabin.so %{_libdir}/libgstphotography-%{majorminor}.so.0 %{_libdir}/libgstphotography-%{majorminor}.so.0.0.0 -%{_datadir}/gstreamer-%{majorminor}/presets/GstX264Enc.prs # %{_datadir}/gstreamer-%{majorminor}/presets/GstFAAC.prs # gstreamer-plugins with external dependencies but in the main package @USE_FAAD_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstfaad.so @@ -152,7 +150,6 @@ rm -rf $RPM_BUILD_ROOT @USE_DTS_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstdtsdec.so @USE_LADSPA_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstladspa.so @USE_MYTHTV_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstmythtvsrc.so -@USE_X264_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstx264.so @USE_DC1394_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstdc1394.so @USE_TIMIDITY_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgsttimidity.so @USE_WILDMIDI_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstwildmidi.so diff --git a/gst/aacparse/gstaacparse.c b/gst/aacparse/gstaacparse.c index 07906347..6db4b619 100644 --- a/gst/aacparse/gstaacparse.c +++ b/gst/aacparse/gstaacparse.c @@ -664,8 +664,12 @@ gst_aacparse_parse_frame (GstBaseParse * parse, GstBuffer * buffer) } } - GST_BUFFER_DURATION (buffer) = AAC_FRAME_DURATION (aacparse); - GST_BUFFER_TIMESTAMP (buffer) = aacparse->ts; + /* ADIF: only send an initial 0 timestamp downstream, + * then admit we have no idea and let downstream (decoder) handle it */ + if (aacparse->header_type != DSPAAC_HEADER_ADIF || !aacparse->ts) { + GST_BUFFER_DURATION (buffer) = AAC_FRAME_DURATION (aacparse); + GST_BUFFER_TIMESTAMP (buffer) = aacparse->ts; + } if (GST_CLOCK_TIME_IS_VALID (aacparse->ts)) aacparse->ts += GST_BUFFER_DURATION (buffer); diff --git a/gst/camerabin/Makefile.am b/gst/camerabin/Makefile.am index 3691af85..d5085da9 100644 --- a/gst/camerabin/Makefile.am +++ b/gst/camerabin/Makefile.am @@ -14,28 +14,28 @@ EXTRA_DIST = gstcamerabin-marshal.list plugin_LTLIBRARIES = libgstcamerabin.la libgstcamerabin_la_SOURCES = gstcamerabin.c \ - gstcamerabinxoverlay.c \ gstcamerabincolorbalance.c \ camerabinimage.c \ camerabinvideo.c \ camerabingeneral.c \ + camerabinpreview.c \ gstcamerabinphotography.c nodist_libgstcamerabin_la_SOURCES = $(built_sources) libgstcamerabin_la_CFLAGS = \ $(GST_CFLAGS) $(GST_BASE_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) -DGST_USE_UNSTABLE_API libgstcamerabin_la_LIBADD = \ + $(top_builddir)/gst-libs/gst/interfaces/libgstphotography-$(GST_MAJORMINOR).la \ $(GST_LIBS) $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) \ - -lgstinterfaces-$(GST_MAJORMINOR) \ - $(top_builddir)/gst-libs/gst/interfaces/libgstphotography-$(GST_MAJORMINOR).la + -lgstinterfaces-$(GST_MAJORMINOR) libgstcamerabin_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstcamerabin_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstcamerabin.h \ - gstcamerabinxoverlay.h \ gstcamerabincolorbalance.h \ camerabinimage.h \ camerabinvideo.h \ camerabingeneral.h \ + camerabinpreview.h \ gstcamerabinphotography.h diff --git a/gst/camerabin/camerabingeneral.c b/gst/camerabin/camerabingeneral.c index 627e0328..d9d9a202 100644 --- a/gst/camerabin/camerabingeneral.c +++ b/gst/camerabin/camerabingeneral.c @@ -150,9 +150,9 @@ gst_camerabin_try_add_element (GstBin * bin, GstElement * new_elem) } /* Get pads for linking */ - GST_DEBUG ("finding unconnected src pad"); bin_pad = gst_bin_find_unlinked_pad (bin, GST_PAD_SRC); - GST_DEBUG ("unconnected pad %s:%s", GST_DEBUG_PAD_NAME (bin_pad)); + GST_DEBUG ("adding %" GST_PTR_FORMAT " to %s:%s", new_elem, + GST_DEBUG_PAD_NAME (bin_pad)); /* Add to bin */ gst_bin_add (GST_BIN (bin), new_elem); /* Link, if unconnected pad was found, otherwise just add it to bin */ @@ -185,7 +185,6 @@ gst_camerabin_create_and_add_element (GstBin * bin, const gchar * elem_name) { GstElement *new_elem = NULL; - GST_DEBUG ("adding %s", elem_name); new_elem = gst_element_factory_make (elem_name, NULL); if (!new_elem) { GST_ELEMENT_ERROR (bin, CORE, MISSING_PLUGIN, (NULL), diff --git a/gst/camerabin/camerabinimage.c b/gst/camerabin/camerabinimage.c index e4ff6b86..da979f0f 100644 --- a/gst/camerabin/camerabinimage.c +++ b/gst/camerabin/camerabinimage.c @@ -30,17 +30,13 @@ * <informalexample> * <programlisting> *----------------------------------------------------------------------------- - * (src0) -> queue -> - * -> [post proc] -> tee < - * (src1) -> imageenc -> metadatamuxer -> filesink + * + * -> [post proc] -> csp -> imageenc -> metadatamuxer -> filesink + * *----------------------------------------------------------------------------- * </programlisting> * </informalexample> * - * The property of elements are: - * - * queue - "max-size-buffers", 1, "leaky", 2, - * * The image bin opens file for image writing in READY to PAUSED state change. * The image bin closes the file in PAUSED to READY state change. * @@ -150,24 +146,16 @@ gst_camerabin_image_init (GstCameraBinImage * img, { img->filename = g_string_new (""); - img->pad_tee_enc = NULL; - img->pad_tee_view = NULL; - img->post = NULL; - img->tee = NULL; img->enc = NULL; img->user_enc = NULL; img->meta_mux = NULL; img->sink = NULL; - img->queue = NULL; /* Create src and sink ghost pads */ img->sinkpad = gst_ghost_pad_new_no_target ("sink", GST_PAD_SINK); gst_element_add_pad (GST_ELEMENT (img), img->sinkpad); - img->srcpad = gst_ghost_pad_new_no_target ("src", GST_PAD_SRC); - gst_element_add_pad (GST_ELEMENT (img), img->srcpad); - img->elements_created = FALSE; } @@ -196,6 +184,7 @@ gst_camerabin_image_change_state (GstElement * element, { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstCameraBinImage *img = GST_CAMERABIN_IMAGE (element); + GstObject *camerabin = NULL; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: @@ -204,15 +193,25 @@ gst_camerabin_image_change_state (GstElement * element, } /* Allow setting filename when image bin in READY state */ gst_element_set_locked_state (img->sink, TRUE); + GST_INFO_OBJECT (img, "locking imagebin->sink state to %s", + gst_element_state_get_name (GST_STATE (img->sink))); break; case GST_STATE_CHANGE_READY_TO_PAUSED: - gst_element_set_locked_state (img->sink, FALSE); + if (!g_str_equal (img->filename->str, "")) { + GST_INFO_OBJECT (img, "preparing image with filename: %s", + img->filename->str); + gst_element_set_locked_state (img->sink, FALSE); + } else { + GST_INFO_OBJECT (img, "keep sink locked, we have no filename yet"); + } break; case GST_STATE_CHANGE_PAUSED_TO_READY: /* Set sink to NULL in order to write the file _now_ */ - GST_INFO ("write img file: %s", img->filename->str); + GST_INFO_OBJECT (img, "write image with filename: %s", + img->filename->str); gst_element_set_locked_state (img->sink, TRUE); gst_element_set_state (img->sink, GST_STATE_NULL); + g_string_assign (img->filename, ""); break; default: break; @@ -221,6 +220,14 @@ gst_camerabin_image_change_state (GstElement * element, ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + camerabin = gst_element_get_parent (img); + /* Write debug graph to file */ + GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (camerabin), + GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE | + GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS, "imagebin.playing"); + gst_object_unref (camerabin); + break; case GST_STATE_CHANGE_READY_TO_NULL: gst_camerabin_image_destroy_elements (img); break; @@ -261,11 +268,18 @@ gst_camerabin_image_set_property (GObject * object, guint prop_id, switch (prop_id) { case PROP_FILENAME: g_string_assign (bin->filename, g_value_get_string (value)); + GST_INFO_OBJECT (bin, "received filename: '%s'", bin->filename->str); if (bin->sink) { - g_object_set (G_OBJECT (bin->sink), "location", bin->filename->str, - NULL); + if (!g_str_equal (bin->filename->str, "")) { + g_object_set (G_OBJECT (bin->sink), "location", bin->filename->str, + NULL); + gst_element_set_locked_state (bin->sink, FALSE); + gst_element_sync_state_with_parent (bin->sink); + } else { + GST_INFO_OBJECT (bin, "empty filename"); + } } else { - GST_INFO ("no sink, not setting name yet"); + GST_INFO_OBJECT (bin, "no sink, not setting name yet"); } break; default: @@ -369,17 +383,17 @@ done: * Use gst_camerabin_image_destroy_elements to release these resources. * * Image bin: - * img->sinkpad ! [ post process !] tee name=t0 ! encoder ! metadata ! filesink - * t0. ! queue ! img->srcpad + * img->sinkpad ! [ post process !] csp ! encoder ! metadata ! filesink * * Returns: %TRUE if succeeded or FALSE if failed */ static gboolean gst_camerabin_image_create_elements (GstCameraBinImage * img) { - GstPad *sinkpad = NULL, *img_sinkpad = NULL, *img_srcpad = NULL; + GstPad *sinkpad = NULL, *img_sinkpad = NULL; gboolean ret = FALSE; GstBin *imgbin = NULL; + GstElement *csp = NULL; g_return_val_if_fail (img != NULL, FALSE); @@ -403,23 +417,18 @@ gst_camerabin_image_create_elements (GstCameraBinImage * img) img_sinkpad = gst_element_get_static_pad (img->post, "sink"); } - /* Create tee */ - if (!(img->tee = gst_camerabin_create_and_add_element (imgbin, "tee"))) { + /* Add colorspace converter */ + if (!(csp = + gst_camerabin_create_and_add_element (imgbin, "ffmpegcolorspace"))) { goto done; } /* Set up sink ghost pad for img bin */ if (!img_sinkpad) { - img_sinkpad = gst_element_get_static_pad (img->tee, "sink"); + img_sinkpad = gst_element_get_static_pad (csp, "sink"); } gst_ghost_pad_set_target (GST_GHOST_PAD (img->sinkpad), img_sinkpad); - /* Add colorspace converter */ - img->pad_tee_enc = gst_element_get_request_pad (img->tee, "src%d"); - if (!gst_camerabin_create_and_add_element (imgbin, "ffmpegcolorspace")) { - goto done; - } - /* Create image encoder */ if (img->user_enc) { img->enc = img->user_enc; @@ -452,33 +461,14 @@ gst_camerabin_image_create_elements (GstCameraBinImage * img) goto done; } - /* Create queue element leading to view finder, attaches it to the tee */ - img->pad_tee_view = gst_element_get_request_pad (img->tee, "src%d"); - if (!(img->queue = gst_camerabin_create_and_add_element (imgbin, "queue"))) { - 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->queue), "max-size-buffers", 1, "leaky", 2, NULL); - - /* Set up src ghost pad for img bin */ - img_srcpad = gst_element_get_static_pad (img->queue, "src"); - gst_ghost_pad_set_target (GST_GHOST_PAD (img->srcpad), img_srcpad); - - /* Never let image bin eos events reach view finder */ - gst_pad_add_event_probe (img->srcpad, - G_CALLBACK (gst_camerabin_drop_eos_probe), img); - ret = TRUE; done: - if (img_srcpad) { - gst_object_unref (img_srcpad); - } if (img_sinkpad) { gst_object_unref (img_sinkpad); } @@ -502,27 +492,14 @@ static void gst_camerabin_image_destroy_elements (GstCameraBinImage * img) { GST_LOG ("destroying img elements"); - if (img->pad_tee_enc) { - gst_element_release_request_pad (img->tee, img->pad_tee_enc); - img->pad_tee_enc = NULL; - } - - if (img->pad_tee_view) { - gst_element_release_request_pad (img->tee, img->pad_tee_view); - img->pad_tee_view = NULL; - } gst_ghost_pad_set_target (GST_GHOST_PAD (img->sinkpad), NULL); - gst_ghost_pad_set_target (GST_GHOST_PAD (img->srcpad), NULL); gst_camerabin_remove_elements_from_bin (GST_BIN (img)); - img->post = NULL; - img->tee = NULL; img->enc = NULL; img->meta_mux = NULL; img->sink = NULL; - img->queue = NULL; img->elements_created = FALSE; } @@ -530,6 +507,7 @@ gst_camerabin_image_destroy_elements (GstCameraBinImage * img) void gst_camerabin_image_set_encoder (GstCameraBinImage * img, GstElement * encoder) { + GST_DEBUG ("setting image encoder %" GST_PTR_FORMAT, encoder); if (img->user_enc) gst_object_unref (img->user_enc); if (encoder) @@ -542,6 +520,7 @@ void gst_camerabin_image_set_postproc (GstCameraBinImage * img, GstElement * postproc) { + GST_DEBUG ("setting image postprocessing element %" GST_PTR_FORMAT, postproc); if (img->post) gst_object_unref (img->post); if (postproc) diff --git a/gst/camerabin/camerabinimage.h b/gst/camerabin/camerabinimage.h index c05f5498..8214e9cb 100644 --- a/gst/camerabin/camerabinimage.h +++ b/gst/camerabin/camerabinimage.h @@ -24,20 +24,17 @@ #include <gst/gstbin.h> G_BEGIN_DECLS - #define GST_TYPE_CAMERABIN_IMAGE (gst_camerabin_image_get_type()) #define GST_CAMERABIN_IMAGE_CAST(obj) ((GstCameraBinImage*)(obj)) #define GST_CAMERABIN_IMAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CAMERABIN_IMAGE,GstCameraBinImage)) #define GST_CAMERABIN_IMAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CAMERABIN_IMAGE,GstCameraBinImageClass)) #define GST_IS_CAMERABIN_IMAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CAMERABIN_IMAGE)) #define GST_IS_CAMERABIN_IMAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CAMERABIN_IMAGE)) - /** * GstCameraBinImage: * * The opaque #GstCameraBinImage structure. */ - typedef struct _GstCameraBinImage GstCameraBinImage; typedef struct _GstCameraBinImageClass GstCameraBinImageClass; @@ -48,21 +45,12 @@ struct _GstCameraBinImage /* Ghost pads of image bin */ GstPad *sinkpad; - GstPad *srcpad; - - /* Tee src pad leading to image encoder */ - GstPad *pad_tee_enc; - /* Tee src pad leading to view finder */ - GstPad *pad_tee_view; GstElement *post; - - GstElement *tee; GstElement *enc; GstElement *user_enc; GstElement *meta_mux; GstElement *sink; - GstElement *queue; gboolean elements_created; }; @@ -86,5 +74,4 @@ GstElement *gst_camerabin_image_get_encoder (GstCameraBinImage * img); GstElement *gst_camerabin_image_get_postproc (GstCameraBinImage * img); G_END_DECLS - -#endif /* #ifndef __CAMERABIN_IMAGE_H__ */ +#endif /* #ifndef __CAMERABIN_IMAGE_H__ */ diff --git a/gst/camerabin/camerabinpreview.c b/gst/camerabin/camerabinpreview.c new file mode 100644 index 00000000..b64b2143 --- /dev/null +++ b/gst/camerabin/camerabinpreview.c @@ -0,0 +1,257 @@ +/* +* GStreamer +* Copyright (C) 2009 Nokia Corporation <multimedia@maemo.org> +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Library General Public +* License as published by the Free Software Foundation; either +* version 2 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Library General Public License for more details. +* +* You should have received a copy of the GNU Library General Public +* License along with this library; if not, write to the +* Free Software Foundation, Inc., 59 Temple Place - Suite 330, +* Boston, MA 02111-1307, USA. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/gst.h> +#include <string.h> + +#include "camerabingeneral.h" +#include "camerabinpreview.h" + +static void +save_result (GstElement * sink, GstBuffer * buf, GstPad * pad, gpointer data) +{ + GstBuffer **p_buf = (GstBuffer **) data; + + *p_buf = gst_buffer_ref (buf); + + GST_DEBUG ("received converted buffer %p with caps %" GST_PTR_FORMAT, + *p_buf, GST_BUFFER_CAPS (*p_buf)); +} + +static gboolean +create_element (const gchar * factory_name, const gchar * elem_name, + GstElement ** element, GError ** err) +{ + *element = gst_element_factory_make (factory_name, elem_name); + if (*element) + return TRUE; + + if (err && *err == NULL) { + *err = g_error_new (GST_CORE_ERROR, GST_CORE_ERROR_MISSING_PLUGIN, + "cannot create element '%s' - please check your GStreamer installation", + factory_name); + } + + return FALSE; +} + + +/** + * gst_camerabin_preview_create_pipeline: + * @camera: camerabin object + * + * Create a preview converter pipeline. + * + * Returns: TRUE if pipeline was constructed, otherwise FALSE. + */ +gboolean +gst_camerabin_preview_create_pipeline (GstCameraBin * camera) +{ + GstElement *src, *csp, *filter, *vscale, *sink; + GError *error = NULL; + + if (!camera->preview_caps) { + return FALSE; + } + + /* Destroy old pipeline, if any */ + gst_camerabin_preview_destroy_pipeline (camera); + + GST_DEBUG ("creating elements"); + + if (!create_element ("appsrc", "prev_src", &src, &error) || + !create_element ("videoscale", NULL, &vscale, &error) || + !create_element ("ffmpegcolorspace", NULL, &csp, &error) || + !create_element ("capsfilter", NULL, &filter, &error) || + !create_element ("fakesink", "prev_sink", &sink, &error)) + goto no_elements; + + camera->preview_pipeline = gst_pipeline_new ("preview-pipeline"); + if (camera->preview_pipeline == NULL) + goto no_pipeline; + + GST_DEBUG ("adding elements"); + gst_bin_add_many (GST_BIN (camera->preview_pipeline), + src, csp, filter, vscale, sink, NULL); + + 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); + + /* FIXME: linking is still way too expensive, profile this properly */ + GST_DEBUG ("linking src->vscale"); + if (!gst_element_link_pads (src, "src", vscale, "sink")) + return FALSE; + + GST_DEBUG ("linking vscale->csp"); + if (!gst_element_link_pads (vscale, "src", csp, "sink")) + return FALSE; + + GST_DEBUG ("linking csp->capsfilter"); + if (!gst_element_link_pads (csp, "src", filter, "sink")) + return FALSE; + + GST_DEBUG ("linking capsfilter->sink"); + if (!gst_element_link_pads (filter, "src", sink, "sink")) + return FALSE; + + return TRUE; + + /* ERRORS */ +no_elements: + { + g_warning ("Could not make preview pipeline: %s", error->message); + g_error_free (error); + return FALSE; + } +no_pipeline: + { + g_warning ("Could not make preview pipeline: %s", + "no pipeline (unknown error)"); + return FALSE; + } +} + + +/** + * gst_camerabin_preview_destroy_pipeline: + * @camera: camerabin object + * + * Destroy preview converter pipeline. + */ +void +gst_camerabin_preview_destroy_pipeline (GstCameraBin * camera) +{ + if (camera->preview_pipeline) { + gst_element_set_state (camera->preview_pipeline, GST_STATE_NULL); + gst_object_unref (camera->preview_pipeline); + camera->preview_pipeline = NULL; + } +} + + +/** + * gst_camerabin_preview_convert: + * @camera: camerabin object + * @buf: #GstBuffer that contains the frame to be converted + * + * Create a preview image of the given frame. + * + * Returns: converted preview image, or NULL if operation failed. + */ +GstBuffer * +gst_camerabin_preview_convert (GstCameraBin * camera, GstBuffer * buf) +{ + GstMessage *msg; + GstBuffer *result = NULL; + GError *error = NULL; + GstBus *bus; + GstElement *src, *sink; + GstBufferFlag bflags; + GstFlowReturn fret; + + g_return_val_if_fail (GST_BUFFER_CAPS (buf) != NULL, NULL); + + if (camera->preview_pipeline == NULL) { + GST_WARNING ("pipeline is NULL"); + goto no_pipeline; + } + + src = gst_bin_get_by_name (GST_BIN (camera->preview_pipeline), "prev_src"); + sink = gst_bin_get_by_name (GST_BIN (camera->preview_pipeline), "prev_sink"); + + if (!src || !sink) { + GST_WARNING ("pipeline doesn't have src / sink elements"); + goto no_pipeline; + } + + g_object_set (src, "size", (gint64) GST_BUFFER_SIZE (buf), + "blocksize", (guint32) GST_BUFFER_SIZE (buf), + "caps", GST_BUFFER_CAPS (buf), "num-buffers", 1, NULL); + + g_signal_connect (sink, "handoff", G_CALLBACK (save_result), &result); + + bflags = GST_BUFFER_FLAGS (buf); + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_READONLY); + + GST_DEBUG ("running conversion pipeline"); + gst_element_set_state (camera->preview_pipeline, GST_STATE_PLAYING); + + g_signal_emit_by_name (src, "push-buffer", buf, &fret); + + /* TODO: do we need to use a bus poll, can we just register a callback to the bus? */ + bus = gst_element_get_bus (camera->preview_pipeline); + msg = + gst_bus_poll (bus, GST_MESSAGE_ERROR | GST_MESSAGE_EOS, 25 * GST_SECOND); + + if (msg) { + switch (GST_MESSAGE_TYPE (msg)) { + case GST_MESSAGE_EOS:{ + if (result) { + GST_DEBUG ("preview image successful: result = %p", result); + } else { + GST_WARNING ("EOS but no result frame?!"); + } + break; + } + case GST_MESSAGE_ERROR:{ + gchar *dbg = NULL; + + gst_message_parse_error (msg, &error, &dbg); + if (error) { + g_warning ("Could not make preview image: %s", error->message); + GST_DEBUG ("%s [debug: %s]", error->message, GST_STR_NULL (dbg)); + g_error_free (error); + } else { + g_warning ("Could not make preview image (and NULL error!)"); + } + g_free (dbg); + result = NULL; + break; + } + default:{ + g_return_val_if_reached (NULL); + } + } + } else { + g_warning ("Could not make preview image: %s", "timeout during conversion"); + result = NULL; + } + + g_signal_handlers_disconnect_by_func (sink, G_CALLBACK (save_result), + &result); + gst_element_set_state (camera->preview_pipeline, GST_STATE_READY); + + GST_BUFFER_FLAGS (buf) = bflags; + + return result; + + /* ERRORS */ +no_pipeline: + { + g_warning ("Could not make preview image: %s", + "no pipeline (unknown error)"); + return NULL; + } +} diff --git a/gst/camerabin/camerabinpreview.h b/gst/camerabin/camerabinpreview.h new file mode 100644 index 00000000..cadefed6 --- /dev/null +++ b/gst/camerabin/camerabinpreview.h @@ -0,0 +1,37 @@ +/* +* GStreamer +* Copyright (C) 2009 Nokia Corporation <multimedia@maemo.org> +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Library General Public +* License as published by the Free Software Foundation; either +* version 2 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Library General Public License for more details. +* +* You should have received a copy of the GNU Library General Public +* License along with this library; if not, write to the +* Free Software Foundation, Inc., 59 Temple Place - Suite 330, +* Boston, MA 02111-1307, USA. +*/ + +#ifndef __CAMERABINPREVIEW_H__ +#define __CAMERABINPREVIEW_H__ + +#include <gst/gst.h> + +#include "gstcamerabin.h" + +G_BEGIN_DECLS + gboolean gst_camerabin_preview_create_pipeline (GstCameraBin * camera); + +void gst_camerabin_preview_destroy_pipeline (GstCameraBin * camera); + +GstBuffer *gst_camerabin_preview_convert (GstCameraBin * camera, + GstBuffer * buf); + +G_END_DECLS +#endif /* __CAMERABINPREVIEW_H__ */ diff --git a/gst/camerabin/camerabinvideo.c b/gst/camerabin/camerabinvideo.c index 14a95064..fef9ac26 100644 --- a/gst/camerabin/camerabinvideo.c +++ b/gst/camerabin/camerabinvideo.c @@ -290,6 +290,7 @@ gst_camerabin_video_change_state (GstElement * element, { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstCameraBinVideo *vid = GST_CAMERABIN_VIDEO (element); + GstObject *camerabin = NULL; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: @@ -325,6 +326,13 @@ gst_camerabin_video_change_state (GstElement * element, switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + camerabin = gst_element_get_parent (vid); + /* Write debug graph to file */ + GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (camerabin), + GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE | + GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS, "videobin.playing"); + gst_object_unref (camerabin); + if (vid->pending_eos) { /* Video bin is still paused, so push eos directly to video queue */ GST_DEBUG_OBJECT (vid, "pushing pending eos"); @@ -641,7 +649,7 @@ gst_camerabin_video_create_elements (GstCameraBinVideo * vid) } /* Set queue leaky, we don't want to block video encoder feed, but prefer leaking view finder buffers instead. */ - g_object_set (G_OBJECT (queue), "leaky", 2, NULL); + g_object_set (G_OBJECT (queue), "leaky", 2, "max-size-buffers", 1, NULL); /* Set up src ghost pad for video bin */ vid_srcpad = gst_element_get_static_pad (queue, "src"); diff --git a/gst/camerabin/gstcamerabin.c b/gst/camerabin/gstcamerabin.c index 2ddb34e0..f1cd897a 100644 --- a/gst/camerabin/gstcamerabin.c +++ b/gst/camerabin/gstcamerabin.c @@ -36,18 +36,19 @@ * <refsect2> * <title>Example launch line</title> * |[ - * gst-launch -v -m camerabin filename=test.jpeg + * gst-launch -v -m camerabin * ]| * </refsect2> * <refsect2> * <title>Image capture</title> * <para> * Taking still images is initiated with the #GstCameraBin::user-start action - * signal. Once the image has captured, #GstCameraBin::img-done signal is fired. - * It allows to decide wheter to take another picture (burst capture, bracketing - * shot) or stop capturing. The last captured image is shown - * until one switches back to view finder using #GstCameraBin::user-stop action - * signal. + * signal. Once the image has been captured, "image-captured" gst message is + * posted to the bus and capturing another image is possible. If application + * has set #GstCameraBin:preview-caps property, then a "preview-image" gst + * message is posted to bus containing preview image formatted according to + * specified caps. Eventually when image has been saved #GstCameraBin::img-done + * signal is emitted. * * Available resolutions can be taken from the #GstCameraBin:inputcaps property. * Image capture resolution can be set with #GstCameraBin::user-image-res @@ -74,7 +75,8 @@ * of these settings require low-level support the photography interface support * is dependent on video src element. In practice photography interface settings * cannot be used successfully until in PAUSED state when the video src has - * opened the video device. + * opened the video device. However it is possible to configure photography + * settings in NULL state and camerabin will try applying them later. * </para> * </refsect2> * <refsect2> @@ -105,16 +107,23 @@ /* * The pipeline in the camerabin is * - * "image bin" - * videosrc ! crop ! scale ! out-sel <------> in-sel ! scale ! ffmpegcsp ! vfsink - * "video bin" + * videosrc [ ! ffmpegcsp ] ! capsfilter ! crop ! scale ! capsfilter ! \ + * out-sel name=osel ! queue name=img_q * - * it is possible to have 'ffmpegcolorspace' and 'capsfilter' just after - * v4l2camsrc + * View finder: + * osel. ! in-sel name=isel ! scale ! capsfilter [ ! ffmpegcsp ] ! vfsink + * + * Image bin: + * img_q. [ ! ipp ] ! ffmpegcsp ! imageenc ! metadatamux ! filesink + * + * Video bin: + * osel. ! tee name=t ! queue ! videoenc ! videomux name=mux ! filesink + * t. ! queue ! isel. + * audiosrc ! queue ! audioconvert ! volume ! audioenc ! mux. * * The properties of elements are: * - * vfsink - "sync", FALSE, "qos", FALSE + * vfsink - "sync", FALSE, "qos", FALSE, "async", FALSE * output-selector - "resend-latest", FALSE * input-selector - "select-all", TRUE */ @@ -134,11 +143,11 @@ /* FIXME: include #include <gst/gst-i18n-plugin.h> and use _(" ") */ #include "gstcamerabin.h" -#include "gstcamerabinxoverlay.h" #include "gstcamerabincolorbalance.h" #include "gstcamerabinphotography.h" #include "camerabingeneral.h" +#include "camerabinpreview.h" #include "gstcamerabin-marshal.h" @@ -176,7 +185,8 @@ enum ARG_VIDEO_SRC, ARG_AUDIO_SRC, ARG_INPUT_CAPS, - ARG_FILTER_CAPS + ARG_FILTER_CAPS, + ARG_PREVIEW_CAPS }; /* @@ -216,6 +226,11 @@ static guint camerabin_signals[LAST_SIGNAL]; #define DEFAULT_VIEW_SINK "autovideosink" +#define CAMERABIN_MAX_VF_WIDTH 848 +#define CAMERABIN_MAX_VF_HEIGHT 848 +#define PREVIEW_MESSAGE_NAME "preview-image" +#define IMG_CAPTURED_MESSAGE_NAME "image-captured" + /* * static helper functions declaration */ @@ -258,6 +273,12 @@ gst_camerabin_have_img_buffer (GstPad * pad, GstBuffer * buffer, static gboolean gst_camerabin_have_vid_buffer (GstPad * pad, GstBuffer * buffer, gpointer u_data); +static gboolean +gst_camerabin_have_queue_data (GstPad * pad, GstMiniObject * mini_obj, + gpointer u_data); +static gboolean +gst_camerabin_have_src_buffer (GstPad * pad, GstBuffer * buffer, + gpointer u_data); static void gst_camerabin_reset_to_view_finder (GstCameraBin * camera); @@ -275,6 +296,8 @@ static const GValue *gst_camerabin_find_better_framerate (GstCameraBin * camera, static void gst_camerabin_update_aspect_filter (GstCameraBin * camera, GstCaps * new_caps); +static void gst_camerabin_finish_image_capture (GstCameraBin * camera); + /* * GObject callback functions declaration */ @@ -355,11 +378,7 @@ gst_camerabin_iface_supported (GstImplementsInterface * iface, GType iface_type) { GstCameraBin *camera = GST_CAMERABIN (iface); - if (iface_type == GST_TYPE_X_OVERLAY) { - if (camera->view_sink) { - return GST_IS_X_OVERLAY (camera->view_sink); - } - } else if (iface_type == GST_TYPE_COLOR_BALANCE) { + if (iface_type == GST_TYPE_COLOR_BALANCE) { if (camera->src_vid_src) { return GST_IS_COLOR_BALANCE (camera->src_vid_src); } @@ -375,9 +394,8 @@ gst_camerabin_iface_supported (GstImplementsInterface * iface, GType iface_type) return FALSE; } } else if (iface_type == GST_TYPE_PHOTOGRAPHY) { - if (camera->src_vid_src) { - return GST_IS_PHOTOGRAPHY (camera->src_vid_src); - } + /* Always support photography interface */ + return TRUE; } return FALSE; @@ -402,12 +420,6 @@ camerabin_init_interfaces (GType type) NULL, }; - static const GInterfaceInfo camerabin_xoverlay_info = { - (GInterfaceInitFunc) gst_camerabin_xoverlay_init, - NULL, - NULL, - }; - static const GInterfaceInfo camerabin_color_balance_info = { (GInterfaceInitFunc) gst_camerabin_color_balance_init, NULL, @@ -428,9 +440,6 @@ camerabin_init_interfaces (GType type) g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE, &camerabin_info); - g_type_add_interface_static (type, GST_TYPE_X_OVERLAY, - &camerabin_xoverlay_info); - g_type_add_interface_static (type, GST_TYPE_COLOR_BALANCE, &camerabin_color_balance_info); @@ -470,6 +479,14 @@ camerabin_setup_src_elements (GstCameraBin * camera) 0)); } + /* Update photography interface settings */ + if (GST_IS_ELEMENT (camera->src_vid_src) && + gst_element_implements_interface (camera->src_vid_src, + GST_TYPE_PHOTOGRAPHY)) { + gst_photography_set_config (GST_PHOTOGRAPHY (camera->src_vid_src), + &camera->photo_settings); + } + if (camera->width > 0 && camera->height > 0) { gst_structure_set (st, "width", G_TYPE_INT, camera->width, @@ -561,12 +578,6 @@ camerabin_create_src_elements (GstCameraBin * camera) gst_camerabin_create_and_add_element (cbin, "output-selector"))) goto done; - camera->srcpad_videosrc = - gst_element_get_static_pad (camera->src_vid_src, "src"); - - camera->srcpad_zoom_filter = - gst_element_get_static_pad (camera->src_zoom_filter, "src"); - /* Set default "driver-name" for v4l2camsrc if not set */ if (g_object_class_find_property (G_OBJECT_GET_CLASS (camera->src_vid_src), "driver-name")) { @@ -637,14 +648,16 @@ camerabin_create_view_elements (GstCameraBin * camera) && (GST_PAD_DIRECTION (GST_PAD (pads->data)) != GST_PAD_SINK)) { pads = g_list_next (pads); } - camera->pad_view_img = GST_PAD (pads->data); + camera->pad_view_src = GST_PAD (pads->data); + /* Add videoscale in case we need to downscale frame for view finder */ if (!(camera->view_scale = gst_camerabin_create_and_add_element (GST_BIN (camera), "videoscale"))) { goto error; } + /* Add capsfilter to maintain aspect ratio while scaling */ if (!(camera->aspect_filter = gst_camerabin_create_and_add_element (GST_BIN (camera), "capsfilter"))) { @@ -694,30 +707,44 @@ camerabin_create_elements (GstCameraBin * camera) goto done; } - /* Add image bin */ camera->pad_src_img = gst_element_get_request_pad (camera->src_out_sel, "src%d"); - if (!gst_camerabin_add_element (GST_BIN (camera), camera->imgbin)) { - goto done; - } + gst_pad_add_buffer_probe (camera->pad_src_img, G_CALLBACK (gst_camerabin_have_img_buffer), camera); - /* Create view finder elements, this also links it to image bin */ - if (!camerabin_create_view_elements (camera)) { - GST_WARNING_OBJECT (camera, "creating view failed"); + /* Add image queue */ + if (!(camera->img_queue = + gst_camerabin_create_and_add_element (GST_BIN (camera), "queue"))) { + goto done; + } + + /* To avoid deadlock, we won't restrict the image queue size */ + /* FIXME: actually we would like to have some kind of restriction here (size), + but deadlocks must be handled somehow... */ + g_object_set (G_OBJECT (camera->img_queue), "max-size-time", + G_GUINT64_CONSTANT (0), NULL); + g_object_set (G_OBJECT (camera->img_queue), "max-size-bytes", + G_GUINT64_CONSTANT (0), NULL); + g_object_set (G_OBJECT (camera->img_queue), "max-size-buffers", + G_GUINT64_CONSTANT (0), NULL); + + camera->pad_src_queue = gst_element_get_static_pad (camera->img_queue, "src"); + + gst_pad_add_data_probe (camera->pad_src_queue, + G_CALLBACK (gst_camerabin_have_queue_data), camera); + + /* Add image bin */ + if (!gst_camerabin_add_element (GST_BIN (camera), camera->imgbin)) { goto done; } - /* Link output selector ! view_finder */ camera->pad_src_view = gst_element_get_request_pad (camera->src_out_sel, "src%d"); - camera->pad_view_src = - gst_element_get_request_pad (camera->view_in_sel, "sink%d"); - link_ret = gst_pad_link (camera->pad_src_view, camera->pad_view_src); - if (GST_PAD_LINK_FAILED (link_ret)) { - GST_ELEMENT_ERROR (camera, CORE, NEGOTIATION, - ("linking view finder failed"), (NULL)); + + /* Create view finder elements */ + if (!camerabin_create_view_elements (camera)) { + GST_WARNING_OBJECT (camera, "creating view finder elements failed"); goto done; } @@ -776,10 +803,6 @@ camerabin_destroy_elements (GstCameraBin * camera) gst_element_release_request_pad (camera->src_out_sel, camera->pad_src_vid); camera->pad_src_vid = NULL; } - if (camera->pad_view_img) { - gst_element_release_request_pad (camera->view_in_sel, camera->pad_view_img); - camera->pad_view_img = NULL; - } if (camera->pad_src_img) { gst_element_release_request_pad (camera->src_out_sel, camera->pad_src_img); camera->pad_src_img = NULL; @@ -793,14 +816,9 @@ camerabin_destroy_elements (GstCameraBin * camera) camera->pad_src_view = NULL; } - if (camera->srcpad_zoom_filter) { - gst_object_unref (camera->srcpad_zoom_filter); - camera->srcpad_zoom_filter = NULL; - } - - if (camera->srcpad_videosrc) { - gst_object_unref (camera->srcpad_videosrc); - camera->srcpad_videosrc = NULL; + if (camera->pad_src_queue) { + gst_object_unref (camera->pad_src_queue); + camera->pad_src_queue = NULL; } camera->view_sink = NULL; @@ -865,13 +883,23 @@ camerabin_dispose_elements (GstCameraBin * camera) gst_caps_unref (camera->allowed_caps); camera->allowed_caps = NULL; } + + if (camera->preview_caps) { + gst_caps_unref (camera->preview_caps); + camera->preview_caps = NULL; + } + + if (camera->event_tags) { + gst_tag_list_free (camera->event_tags); + camera->event_tags = NULL; + } } /* * gst_camerabin_image_capture_continue: * @camera: camerabin object * - * Check if application wants to continue image capturing by using g_signal. + * Notify application that image has been saved with a signal. * * Returns TRUE if another image should be captured, FALSE otherwise. */ @@ -923,7 +951,16 @@ gst_camerabin_change_mode (GstCameraBin * camera, gint mode) gst_element_set_state (camera->active_bin, GST_STATE_NULL); } if (camera->mode == MODE_IMAGE) { + GstStateChangeReturn state_ret; + camera->active_bin = camera->imgbin; + state_ret = gst_element_set_state (camera->active_bin, GST_STATE_READY); + + if (state_ret == GST_STATE_CHANGE_FAILURE) { + GST_WARNING_OBJECT (camera, "state change failed"); + gst_element_set_state (camera->active_bin, GST_STATE_NULL); + camera->active_bin = NULL; + } } else if (camera->mode == MODE_VIDEO) { camera->active_bin = camera->vidbin; } @@ -1114,6 +1151,46 @@ failed: } /* + * gst_camerabin_send_img_queue_event: + * @camera: camerabin object + * @event: event to be sent + * + * Send the given event to image queue. + */ +static void +gst_camerabin_send_img_queue_event (GstCameraBin * camera, GstEvent * event) +{ + GstPad *queue_sink; + + g_return_if_fail (camera != NULL); + g_return_if_fail (event != NULL); + + queue_sink = gst_element_get_static_pad (camera->img_queue, "sink"); + gst_pad_send_event (queue_sink, event); + gst_object_unref (queue_sink); +} + +/* + * gst_camerabin_send_img_queue_custom_event: + * @camera: camerabin object + * @ev_struct: event structure to be sent + * + * Generate and send a custom event to image queue. + */ +static void +gst_camerabin_send_img_queue_custom_event (GstCameraBin * camera, + GstStructure * ev_struct) +{ + GstEvent *event; + + g_return_if_fail (camera != NULL); + g_return_if_fail (ev_struct != NULL); + + event = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM, ev_struct); + gst_camerabin_send_img_queue_event (camera, event); +} + +/* * gst_camerabin_rewrite_tags_to_bin: * @bin: bin holding tag setter elements * @list: tag list to be written @@ -1275,7 +1352,13 @@ gst_camerabin_rewrite_tags (GstCameraBin * camera) } /* Write tags */ - gst_camerabin_rewrite_tags_to_bin (GST_BIN (camera->active_bin), list); + if (camera->active_bin == camera->vidbin) { + gst_camerabin_rewrite_tags_to_bin (GST_BIN (camera->active_bin), list); + } else { + /* Image tags need to be sent as a serialized event into image queue */ + GstEvent *tagevent = gst_event_new_tag (gst_tag_list_copy (list)); + gst_camerabin_send_img_queue_event (camera, tagevent); + } gst_tag_list_free (list); } @@ -1313,18 +1396,36 @@ gst_camerabin_set_capsfilter_caps (GstCameraBin * camera, GstCaps * new_caps) gst_camerabin_update_aspect_filter (camera, new_caps); } +/* + * gst_camerabin_adapt_video_resolution: + * @camera: camerabin object + * @caps: caps describing the next incoming buffer format + * + * This function adjusts capsfilter and crop elements in order to modify + * the incoming buffer to the resolution that application requested. + * + */ static void gst_camerabin_adapt_video_resolution (GstCameraBin * camera, GstCaps * caps) { GstStructure *st; gint width = 0, height = 0; GstCaps *filter_caps = NULL; + gint top, bottom, left, right, crop; + gdouble ratio_w, ratio_h; + + g_return_if_fail (camera->width != 0 && camera->height != 0); /* Get width and height from caps */ st = gst_caps_get_structure (caps, 0); gst_structure_get_int (st, "width", &width); gst_structure_get_int (st, "height", &height); + if (width == camera->width && height == camera->height) { + GST_DEBUG_OBJECT (camera, "no adaptation with resolution needed"); + return; + } + GST_DEBUG_OBJECT (camera, "changing %dx%d -> %dx%d filter to %" GST_PTR_FORMAT, camera->width, camera->height, width, height, camera->src_filter); @@ -1336,7 +1437,31 @@ gst_camerabin_adapt_video_resolution (GstCameraBin * camera, GstCaps * caps) "height", G_TYPE_INT, height, NULL); g_object_set (G_OBJECT (camera->src_filter), "caps", filter_caps, NULL); gst_caps_unref (filter_caps); - /* FIXME: implement cropping according to requested aspect ratio */ + + /* Crop if requested aspect ratio differs from incoming frame aspect ratio */ + + /* Don't override original crop values in case we have zoom applied */ + g_object_get (G_OBJECT (camera->src_zoom_crop), "top", &top, "bottom", + &bottom, "left", &left, "right", &right, NULL); + + ratio_w = (gdouble) width / camera->width; + ratio_h = (gdouble) height / camera->height; + + if (ratio_w < ratio_h) { + crop = height - (camera->height * ratio_w); + top += crop / 2; + bottom += crop / 2; + } else { + crop = width - (camera->width * ratio_h); + left += crop / 2; + right += crop / 2; + } + + GST_INFO_OBJECT (camera, + "updating crop: left:%d, right:%d, top:%d, bottom:%d", left, right, top, + bottom); + g_object_set (G_OBJECT (camera->src_zoom_crop), "top", top, "bottom", bottom, + "left", left, "right", right, NULL); } /* @@ -1353,11 +1478,13 @@ img_capture_prepared (gpointer data, GstCaps * caps) GstStructure *st, *new_st; gint i; const gchar *field_name; + gboolean adapt = FALSE; GST_INFO_OBJECT (camera, "image capture prepared"); /* It is possible we are about to get something else that we requested */ if (!gst_caps_is_equal (camera->image_capture_caps, caps)) { + adapt = TRUE; /* If capture preparation has added new fields to requested caps, we need to copy them */ st = gst_caps_get_structure (camera->image_capture_caps, 0); @@ -1378,14 +1505,17 @@ img_capture_prepared (gpointer data, GstCaps * caps) /* Update capsfilters */ gst_camerabin_set_capsfilter_caps (camera, camera->image_capture_caps); - /* If incoming buffer resolution is different from what application - requested, then we need to fix this in camerabin */ - gst_camerabin_adapt_video_resolution (camera, caps); - + if (adapt) { + /* If incoming buffer resolution is different from what application + requested, then we can fix this in camerabin */ + gst_camerabin_adapt_video_resolution (camera, caps); + } g_object_set (G_OBJECT (camera->src_out_sel), "resend-latest", FALSE, "active-pad", camera->pad_src_img, NULL); - gst_camerabin_rewrite_tags (camera); - gst_element_set_state (GST_ELEMENT (camera->imgbin), GST_STATE_PLAYING); + + if (!GST_CAMERABIN_IMAGE (camera->imgbin)->elements_created) { + gst_element_set_state (camera->imgbin, GST_STATE_READY); + } } /* @@ -1431,8 +1561,11 @@ gst_camerabin_start_image_capture (GstCameraBin * camera) } if (!wait_for_prepare) { - gst_camerabin_rewrite_tags (camera); - state_ret = gst_element_set_state (camera->imgbin, GST_STATE_PLAYING); + /* Image queue's srcpad data probe will set imagebin to PLAYING */ + state_ret = gst_element_set_state (camera->imgbin, GST_STATE_PAUSED); + GST_DEBUG_OBJECT (camera, "setting imagebin to paused: %s", + gst_element_state_change_return_get_name (state_ret)); + if (state_ret != GST_STATE_CHANGE_FAILURE) { g_mutex_lock (camera->capture_mutex); g_object_set (G_OBJECT (camera->src_out_sel), "resend-latest", TRUE, @@ -1535,12 +1668,48 @@ image_pad_blocked (GstPad * pad, gboolean blocked, gpointer user_data) GST_DEBUG_OBJECT (camera, "%s %s:%s", blocked ? "blocking" : "unblocking", GST_DEBUG_PAD_NAME (pad)); +} + +/* + * gst_camerabin_send_preview: + * @camera: camerabin object + * @buffer: received buffer + * + * Convert given buffer to desired preview format and send is as a #GstMessage + * to application. + * + * Returns: TRUE always + */ +static gboolean +gst_camerabin_send_preview (GstCameraBin * camera, GstBuffer * buffer) +{ + GstBuffer *prev = NULL; + GstStructure *s; + GstMessage *msg; + gboolean ret = FALSE; + + GST_DEBUG_OBJECT (camera, "creating preview"); + + prev = gst_camerabin_preview_convert (camera, buffer); - if (blocked && (pad == camera->srcpad_videosrc)) { - /* Send eos and block until image bin reaches eos */ - GST_DEBUG_OBJECT (camera, "sending eos to image bin"); - gst_element_send_event (camera->imgbin, gst_event_new_eos ()); + GST_DEBUG_OBJECT (camera, "preview created: %p", prev); + + if (prev) { + s = gst_structure_new (PREVIEW_MESSAGE_NAME, + "buffer", GST_TYPE_BUFFER, prev, NULL); + + msg = gst_message_new_element (GST_OBJECT (camera), s); + + GST_DEBUG_OBJECT (camera, "sending message with preview image"); + + if (gst_element_post_message (GST_ELEMENT (camera), msg) == FALSE) { + GST_WARNING_OBJECT (camera, + "This element has no bus, therefore no message sent!"); + } + ret = TRUE; } + + return ret; } /* @@ -1549,27 +1718,19 @@ image_pad_blocked (GstPad * pad, gboolean blocked, gpointer user_data) * @buffer: still image frame * @u_data: camera bin object * - * Buffer probe called before sending each buffer to image bin. - * - * First buffer is always passed directly to image bin. Then pad - * is blocked in order to interleave buffers with eos events. - * Interleaving eos events and buffers is needed when we have - * decoupled elements in the image bin capture pipeline. - * After image bin posts eos message, then pad is unblocked. - * Next, image bin is changed to READY state in order to save the - * file and the application is allowed to decide whether to - * continue image capture. If yes, only then the next buffer is - * passed to image bin. + * Buffer probe called before sending each buffer to image queue. + * Generates and sends preview image as gst message if requested. */ static gboolean gst_camerabin_have_img_buffer (GstPad * pad, GstBuffer * buffer, gpointer u_data) { GstCameraBin *camera = (GstCameraBin *) u_data; + GstStructure *fn_ev_struct = NULL; gboolean ret = TRUE; + GstPad *os_sink = NULL; - GST_LOG ("got buffer #%d %p with size %d", camera->num_img_buffers, - buffer, GST_BUFFER_SIZE (buffer)); + GST_LOG ("got buffer %p with size %d", buffer, GST_BUFFER_SIZE (buffer)); /* Image filename should be set by now */ if (g_str_equal (camera->filename->str, "")) { @@ -1578,54 +1739,38 @@ gst_camerabin_have_img_buffer (GstPad * pad, GstBuffer * buffer, goto done; } - /* Check for first buffer after capture start, we want to - pass it forward directly. */ - if (!camera->num_img_buffers) { - goto done; + if (camera->preview_caps) { + gst_camerabin_send_preview (camera, buffer); } - /* Close the file of saved image */ - gst_element_set_state (camera->imgbin, GST_STATE_READY); - - /* Reset filename to force application set new filename */ - g_string_assign (camera->filename, ""); - - /* Check if the application wants to continue */ - ret = gst_camerabin_image_capture_continue (camera); + gst_camerabin_rewrite_tags (camera); - if (ret && !camera->stop_requested) { - GST_DEBUG_OBJECT (camera, "capturing image \"%s\"", camera->filename->str); - g_object_set (G_OBJECT (camera->imgbin), "filename", - camera->filename->str, NULL); - gst_element_set_state (camera->imgbin, GST_STATE_PLAYING); - } else { - GST_DEBUG_OBJECT (camera, "not continuing (cont:%d, stop_req:%d)", - ret, camera->stop_requested); + /* Send a custom event which tells the filename to image queue */ + /* NOTE: This needs to be THE FIRST event to be sent to queue for + every image. It triggers imgbin state change to PLAYING. */ + fn_ev_struct = gst_structure_new ("img-filename", + "filename", G_TYPE_STRING, camera->filename->str, NULL); + GST_DEBUG_OBJECT (camera, "sending filename event to image queue"); + gst_camerabin_send_img_queue_custom_event (camera, fn_ev_struct); + + /* Add buffer probe to outputselector's sink pad. It sends + EOS event to image queue. */ + os_sink = gst_element_get_static_pad (camera->src_out_sel, "sink"); + camera->image_captured_id = gst_pad_add_buffer_probe (os_sink, + G_CALLBACK (gst_camerabin_have_src_buffer), camera); + gst_object_unref (os_sink); - /* Block dataflow to the output-selector to show preview image in - view finder. Continue and unblock when capture is stopped */ - gst_pad_set_blocked_async (camera->srcpad_zoom_filter, TRUE, - (GstPadBlockCallback) image_pad_blocked, camera); - ret = FALSE; /* Drop the buffer */ +done: - g_mutex_lock (camera->capture_mutex); - camera->capturing = FALSE; - g_cond_signal (camera->cond); - g_mutex_unlock (camera->capture_mutex); - } + /* HACK: v4l2camsrc changes to view finder resolution automatically + after one captured still image */ + gst_camerabin_finish_image_capture (camera); -done: + gst_camerabin_reset_to_view_finder (camera); - if (ret) { - camera->num_img_buffers++; - /* Block when next buffer arrives, we want to push eos event - between frames and make sure that eos reaches the filesink - before processing the next buffer. */ - gst_pad_set_blocked_async (camera->srcpad_videosrc, TRUE, - (GstPadBlockCallback) image_pad_blocked, camera); - } + GST_DEBUG_OBJECT (camera, "switched back to viewfinder"); - return ret; + return TRUE; } /* @@ -1655,6 +1800,120 @@ gst_camerabin_have_vid_buffer (GstPad * pad, GstBuffer * buffer, } /* + * gst_camerabin_have_src_buffer: + * @pad: output-selector sink pad which receives frames from video source + * @buffer: buffer pushed to the pad + * @u_data: camerabin object + * + * Buffer probe for sink pad. It sends custom eos event to image queue and + * notifies application by sending a "image-captured" message to GstBus. + * This probe is installed after image has been captured and it disconnects + * itself after EOS has been sent. + */ +static gboolean +gst_camerabin_have_src_buffer (GstPad * pad, GstBuffer * buffer, + gpointer u_data) +{ + GstCameraBin *camera = (GstCameraBin *) u_data; + GstMessage *msg; + + GST_LOG_OBJECT (camera, "got image buffer %p with size %d", + buffer, GST_BUFFER_SIZE (buffer)); + + /* We can't send real EOS event, since it would switch the image queue + into "draining mode". Therefore we send our own custom eos and + catch & drop it later in queue's srcpad data probe */ + GST_DEBUG_OBJECT (camera, "sending eos to image queue"); + gst_camerabin_send_img_queue_custom_event (camera, + gst_structure_new ("img-eos", NULL)); + + /* our work is done, disconnect */ + gst_pad_remove_buffer_probe (pad, camera->image_captured_id); + + g_mutex_lock (camera->capture_mutex); + camera->capturing = FALSE; + g_cond_signal (camera->cond); + g_mutex_unlock (camera->capture_mutex); + + msg = gst_message_new_element (GST_OBJECT (camera), + gst_structure_new (IMG_CAPTURED_MESSAGE_NAME, NULL)); + + GST_DEBUG_OBJECT (camera, "sending 'image captured' message"); + + if (gst_element_post_message (GST_ELEMENT (camera), msg) == FALSE) { + GST_WARNING_OBJECT (camera, + "This element has no bus, therefore no message sent!"); + } + + return TRUE; +} + +/* + * gst_camerabin_have_queue_data: + * @pad: image queue src pad leading to image bin + * @mini_obj: buffer or event pushed to the pad + * @u_data: camerabin object + * + * Buffer probe for image queue src pad leading to image bin. It sets imgbin + * into PLAYING mode when image buffer is passed to it. This probe also + * monitors our internal custom events and handles them accordingly. + */ +static gboolean +gst_camerabin_have_queue_data (GstPad * pad, GstMiniObject * mini_obj, + gpointer u_data) +{ + GstCameraBin *camera = (GstCameraBin *) u_data; + gboolean ret = TRUE; + + if (GST_IS_BUFFER (mini_obj)) { + GstEvent *tagevent; + + GST_LOG_OBJECT (camera, "queue sending image buffer to imgbin"); + + tagevent = gst_event_new_tag (gst_tag_list_copy (camera->event_tags)); + gst_element_send_event (camera->imgbin, tagevent); + gst_tag_list_free (camera->event_tags); + camera->event_tags = gst_tag_list_new (); + } else if (GST_IS_EVENT (mini_obj)) { + const GstStructure *evs; + GstEvent *event; + + event = GST_EVENT_CAST (mini_obj); + evs = gst_event_get_structure (event); + + GST_LOG_OBJECT (camera, "got event %s", GST_EVENT_TYPE_NAME (event)); + + if (GST_EVENT_TYPE (event) == GST_EVENT_TAG) { + GstTagList *tlist; + + gst_event_parse_tag (event, &tlist); + gst_tag_list_insert (camera->event_tags, tlist, GST_TAG_MERGE_REPLACE); + ret = FALSE; + } else if (evs && gst_structure_has_name (evs, "img-filename")) { + const gchar *fname; + + GST_LOG_OBJECT (camera, "queue setting image filename to imagebin"); + fname = gst_structure_get_string (evs, "filename"); + g_object_set (G_OBJECT (camera->imgbin), "filename", fname, NULL); + + /* imgbin fails to start unless the filename is set */ + gst_element_set_state (camera->imgbin, GST_STATE_PLAYING); + GST_LOG_OBJECT (camera, "Set imgbin to PLAYING"); + + ret = FALSE; + } else if (evs && gst_structure_has_name (evs, "img-eos")) { + GST_LOG_OBJECT (camera, "queue sending EOS to image pipeline"); + gst_pad_set_blocked_async (camera->pad_src_queue, TRUE, + (GstPadBlockCallback) image_pad_blocked, camera); + gst_element_send_event (camera->imgbin, gst_event_new_eos ()); + ret = FALSE; + } + } + + return ret; +} + +/* * gst_camerabin_reset_to_view_finder: * @camera: camerabin object * @@ -1667,8 +1926,8 @@ gst_camerabin_reset_to_view_finder (GstCameraBin * camera) GstStateChangeReturn state_ret; GST_DEBUG_OBJECT (camera, "resetting"); - /* Set active bin to READY state */ - if (camera->active_bin) { + /* Set video bin to READY state */ + if (camera->active_bin == camera->vidbin) { state_ret = gst_element_set_state (camera->active_bin, GST_STATE_READY); if (state_ret == GST_STATE_CHANGE_FAILURE) { GST_WARNING_OBJECT (camera, "state change failed"); @@ -1678,7 +1937,6 @@ gst_camerabin_reset_to_view_finder (GstCameraBin * camera) } /* Reset counters and flags */ - camera->num_img_buffers = 0; camera->stop_requested = FALSE; camera->paused = FALSE; @@ -1688,18 +1946,6 @@ gst_camerabin_reset_to_view_finder (GstCameraBin * camera) "active-pad", camera->pad_src_view, NULL); } - /* Unblock, if dataflow to output-selector is blocked due to image preview */ - if (camera->srcpad_zoom_filter && - gst_pad_is_blocked (camera->srcpad_zoom_filter)) { - gst_pad_set_blocked_async (camera->srcpad_zoom_filter, FALSE, - (GstPadBlockCallback) image_pad_blocked, camera); - } - /* Unblock, if dataflow in videosrc is blocked due to waiting for eos */ - if (camera->srcpad_videosrc && gst_pad_is_blocked (camera->srcpad_videosrc)) { - gst_pad_set_blocked_async (camera->srcpad_videosrc, FALSE, - (GstPadBlockCallback) image_pad_blocked, camera); - } - /* Enable view finder mode in v4l2camsrc */ if (camera->src_vid_src && g_object_class_find_property (G_OBJECT_GET_CLASS (camera->src_vid_src), @@ -2023,6 +2269,26 @@ gst_camerabin_update_aspect_filter (GstCameraBin * camera, GstCaps * new_caps) } /* + * gst_camerabin_finish_image_capture: + * @camera: camerabin object + * + * Perform finishing operations after image capture is done and + * returning back to view finder mode. + */ +static void +gst_camerabin_finish_image_capture (GstCameraBin * camera) +{ + if (camera->image_capture_caps) { + /* If we used specific caps for image capture we need to + restore the caps and zoom/crop for view finder mode */ + GST_DEBUG_OBJECT (camera, "resetting crop in camerabin"); + g_object_set (camera->src_zoom_crop, "left", 0, "right", 0, + "top", 0, "bottom", 0, NULL); + gst_camerabin_set_capsfilter_caps (camera, camera->view_finder_caps); + } +} + +/* * GObject callback functions implementation */ @@ -2243,14 +2509,29 @@ gst_camerabin_class_init (GstCameraBinClass * klass) /** * GstCameraBin:filter-caps: * - * Filter video source element caps using this property. - * This is an alternative to #GstCamerabin::user-res-fps action - * signal that allows more fine grained control of video source. + * Caps applied to capsfilter element after videosrc [ ! ffmpegcsp ]. + * You can use this e.g. to make sure video color format matches with + * encoders and other elements configured to camerabin and/or change + * resolution and frame rate. */ g_object_class_install_property (gobject_class, ARG_FILTER_CAPS, g_param_spec_boxed ("filter-caps", "Filter caps", - "Capsfilter caps used to control video source operation", + "Filter video data coming from videosrc element", + GST_TYPE_CAPS, G_PARAM_READWRITE)); + + /** + * GstCameraBin:preview-caps: + * + * If application wants to receive a preview image, it needs to + * set this property to depict the desired image format caps. When + * this property is not set (NULL), message containing the preview + * image is not sent. + */ + + g_object_class_install_property (gobject_class, ARG_PREVIEW_CAPS, + g_param_spec_boxed ("preview-caps", "Preview caps", + "Caps defining the preview image format", GST_TYPE_CAPS, G_PARAM_READWRITE)); /** @@ -2347,9 +2628,7 @@ gst_camerabin_class_init (GstCameraBinClass * klass) * @camera: the camera bin element * @filename: the name of the file just saved * - * Signal emitted when the file has just been saved. To continue taking - * pictures set new filename using #GstCameraBin:filename property and return - * TRUE, otherwise return FALSE. + * Signal emitted when the file has just been saved. * * Don't call any #GstCameraBin method from this signal, if you do so there * will be a deadlock. @@ -2394,7 +2673,6 @@ gst_camerabin_init (GstCameraBin * camera, GstCameraBinClass * gclass) camera->filename = g_string_new (""); camera->mode = DEFAULT_MODE; - camera->num_img_buffers = 0; camera->stop_requested = FALSE; camera->paused = FALSE; camera->capturing = FALSE; @@ -2405,6 +2683,8 @@ gst_camerabin_init (GstCameraBin * camera, GstCameraBinClass * gclass) camera->fps_n = DEFAULT_FPS_N; camera->fps_d = DEFAULT_FPS_D; + camera->event_tags = gst_tag_list_new (); + camera->image_capture_caps = NULL; camera->view_finder_caps = NULL; camera->allowed_caps = NULL; @@ -2419,13 +2699,9 @@ gst_camerabin_init (GstCameraBin * camera, GstCameraBinClass * gclass) camera->pad_src_view = NULL; camera->pad_view_src = NULL; camera->pad_src_img = NULL; - camera->pad_view_img = NULL; camera->pad_src_vid = NULL; camera->pad_view_vid = NULL; - camera->srcpad_zoom_filter = NULL; - camera->srcpad_videosrc = NULL; - /* source elements */ camera->src_vid_src = NULL; camera->src_filter = NULL; @@ -2450,6 +2726,8 @@ gst_camerabin_init (GstCameraBin * camera, GstCameraBinClass * gclass) camera->view_in_sel = NULL; camera->view_scale = NULL; camera->view_sink = NULL; + + memset (&camera->photo_settings, 0, sizeof (GstPhotoSettings)); } static void @@ -2467,6 +2745,8 @@ gst_camerabin_dispose (GObject * object) gst_element_set_state (camera->vidbin, GST_STATE_NULL); gst_object_unref (camera->vidbin); + gst_camerabin_preview_destroy_pipeline (camera); + camerabin_destroy_elements (camera); camerabin_dispose_elements (camera); @@ -2527,7 +2807,7 @@ gst_camerabin_set_property (GObject * object, guint prop_id, break; case ARG_VIDEO_MUX: if (GST_STATE (camera->vidbin) != GST_STATE_NULL) { - GST_WARNING_OBJECT (camera->vidbin, + GST_WARNING_OBJECT (camera, "can't use set element until next video bin NULL to READY state change"); } gst_camerabin_video_set_muxer (GST_CAMERABIN_VIDEO (camera->vidbin), @@ -2588,7 +2868,18 @@ gst_camerabin_set_property (GObject * object, guint prop_id, } camera->view_finder_caps = gst_caps_copy (gst_value_get_caps (value)); GST_OBJECT_UNLOCK (camera); - gst_camerabin_set_capsfilter_caps (camera, camera->view_finder_caps); + if (GST_STATE (camera) != GST_STATE_NULL) { + gst_camerabin_set_capsfilter_caps (camera, camera->view_finder_caps); + } + 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_OBJECT_UNLOCK (camera); + gst_camerabin_preview_create_pipeline (camera); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -2661,6 +2952,9 @@ gst_camerabin_get_property (GObject * object, guint prop_id, case ARG_FILTER_CAPS: gst_value_set_caps (value, camera->view_finder_caps); break; + case ARG_PREVIEW_CAPS: + gst_value_set_caps (value, camera->preview_caps); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -2732,6 +3026,29 @@ done: return ret; } +static gboolean +gst_camerabin_imgbin_finished (gpointer u_data) +{ + GstCameraBin *camera = GST_CAMERABIN (u_data); + + GST_DEBUG_OBJECT (camera, "Image encoding finished"); + + /* Close the file of saved image */ + gst_element_set_state (camera->imgbin, GST_STATE_READY); + GST_DEBUG_OBJECT (camera, "Image pipeline set to READY"); + + /* Send img-done signal */ + gst_camerabin_image_capture_continue (camera); + + /* Unblock image queue pad to process next buffer */ + gst_pad_set_blocked_async (camera->pad_src_queue, FALSE, + (GstPadBlockCallback) image_pad_blocked, camera); + GST_DEBUG_OBJECT (camera, "Queue srcpad unblocked"); + + /* disconnect automatically */ + return FALSE; +} + /* * GstBin functions implementation */ @@ -2755,17 +3072,20 @@ gst_camerabin_handle_message_func (GstBin * bin, GstMessage * msg) } else if (GST_MESSAGE_SRC (msg) == GST_OBJECT (camera->imgbin)) { /* Image eos */ GST_DEBUG_OBJECT (camera, "got image eos message"); - - /* Still image capture buffer handled, restore filter caps */ - if (camera->image_capture_caps) { - gst_camerabin_set_capsfilter_caps (camera, camera->view_finder_caps); - } - - /* Unblock pad to process next buffer */ - gst_pad_set_blocked_async (camera->srcpad_videosrc, FALSE, - (GstPadBlockCallback) image_pad_blocked, camera); + g_idle_add (gst_camerabin_imgbin_finished, camera); } break; + case GST_MESSAGE_ERROR: + GST_DEBUG_OBJECT (camera, "error from child %" GST_PTR_FORMAT, + GST_MESSAGE_SRC (msg)); + g_mutex_lock (camera->capture_mutex); + if (camera->capturing) { + gst_camerabin_finish_image_capture (camera); + camera->capturing = FALSE; + g_cond_signal (camera->cond); + } + g_mutex_unlock (camera->capture_mutex); + break; default: break; } @@ -2807,12 +3127,11 @@ gst_camerabin_user_start (GstCameraBin * camera) g_mutex_unlock (camera->capture_mutex); if (camera->active_bin) { - g_object_set (G_OBJECT (camera->active_bin), "filename", - camera->filename->str, NULL); - if (camera->active_bin == camera->imgbin) { gst_camerabin_start_image_capture (camera); } else if (camera->active_bin == camera->vidbin) { + g_object_set (G_OBJECT (camera->active_bin), "filename", + camera->filename->str, NULL); gst_camerabin_start_video_recording (camera); } } @@ -2821,10 +3140,13 @@ gst_camerabin_user_start (GstCameraBin * camera) static void gst_camerabin_user_stop (GstCameraBin * camera) { - GST_INFO_OBJECT (camera, "stopping %s capture", - camera->mode ? "video" : "image"); - gst_camerabin_do_stop (camera); - gst_camerabin_reset_to_view_finder (camera); + if (camera->active_bin == camera->vidbin) { + GST_INFO_OBJECT (camera, "stopping video capture"); + gst_camerabin_do_stop (camera); + gst_camerabin_reset_to_view_finder (camera); + } else { + GST_INFO_OBJECT (camera, "stopping image capture isn't needed"); + } } static void @@ -2891,6 +3213,9 @@ gst_camerabin_user_res_fps (GstCameraBin * camera, gint width, gint height, GST_INFO_OBJECT (camera, "switching resolution to %dx%d and fps to %d/%d", width, height, fps_n, fps_d); + /* Interrupt ongoing capture */ + gst_camerabin_do_stop (camera); + gst_element_get_state (GST_ELEMENT (camera), &state, &pending, 0); if (state == GST_STATE_PAUSED || state == GST_STATE_PLAYING) { GST_INFO_OBJECT (camera, diff --git a/gst/camerabin/gstcamerabin.h b/gst/camerabin/gstcamerabin.h index 1bb3f489..cd88c7ca 100644 --- a/gst/camerabin/gstcamerabin.h +++ b/gst/camerabin/gstcamerabin.h @@ -59,7 +59,6 @@ struct _GstCameraBin /* private */ GString *filename; gint mode; /* MODE_IMAGE or MODE_VIDEO */ - guint num_img_buffers; /* no of image buffers captured */ gboolean stop_requested; /* TRUE if capturing stop needed */ gboolean paused; /* TRUE if capturing paused */ @@ -69,6 +68,9 @@ struct _GstCameraBin gint fps_n; gint fps_d; + /* Image tags are collected here first before sending to imgbin */ + GstTagList *event_tags; + /* Caps applied to capsfilters when taking still image */ GstCaps *image_capture_caps; @@ -78,6 +80,9 @@ struct _GstCameraBin /* Caps that videosrc supports */ GstCaps *allowed_caps; + /* Caps used to create preview image */ + GstCaps *preview_caps; + /* The digital zoom (from 100% to 1000%) */ gint zoom; @@ -90,16 +95,16 @@ struct _GstCameraBin GstPad *pad_src_view; GstPad *pad_view_src; GstPad *pad_src_img; - GstPad *pad_view_img; GstPad *pad_src_vid; GstPad *pad_view_vid; + GstPad *pad_src_queue; - GstPad *srcpad_zoom_filter; - GstPad *srcpad_videosrc; - + GstElement *img_queue; /* queue for decoupling capture from + image-postprocessing and saving */ GstElement *imgbin; /* bin that holds image capturing elements */ GstElement *vidbin; /* bin that holds video capturing elements */ GstElement *active_bin; /* image or video bin that is currently in use */ + GstElement *preview_pipeline; /* pipeline for creating preview images */ /* source elements */ GstElement *src_vid_src; @@ -123,6 +128,12 @@ struct _GstCameraBin gboolean night_mode; gint pre_night_fps_n; gint pre_night_fps_d; + + /* Cache the photography interface settings */ + GstPhotoSettings photo_settings; + + /* Buffer probe id for captured image handling */ + gulong image_captured_id; }; /** @@ -145,7 +156,7 @@ struct _GstCameraBinClass /* signals (callback) */ - gboolean (*img_done) (GstCameraBin * camera, const gchar * filename); + gboolean (*img_done) (GstCameraBin * camera, const gchar * filename); }; /** @@ -164,4 +175,4 @@ typedef enum GType gst_camerabin_get_type (void); G_END_DECLS -#endif /* #ifndef __GST_CAMERABIN_H__ */ +#endif /* #ifndef __GST_CAMERABIN_H__ */ diff --git a/gst/camerabin/gstcamerabinphotography.c b/gst/camerabin/gstcamerabinphotography.c index 8a95bcd7..cb17abca 100644 --- a/gst/camerabin/gstcamerabinphotography.c +++ b/gst/camerabin/gstcamerabinphotography.c @@ -24,6 +24,7 @@ #include <config.h> #endif +#include <string.h> #include "gstcamerabinphotography.h" #include "gstcamerabin.h" @@ -32,38 +33,206 @@ GST_DEBUG_CATEGORY_STATIC (camerabinphoto_debug); #define PHOTOGRAPHY_IS_OK(photo_elem) (GST_IS_ELEMENT (photo_elem) && \ gst_element_implements_interface (photo_elem, GST_TYPE_PHOTOGRAPHY)) +static void +gst_camerabin_handle_scene_mode (GstCameraBin * camera, + GstSceneMode scene_mode); + +static gboolean +gst_camerabin_set_ev_compensation (GstPhotography * photo, + gfloat ev_compensation) +{ + GstCameraBin *camera; + gboolean ret = FALSE; + + g_return_val_if_fail (photo != NULL, FALSE); + + camera = GST_CAMERABIN (photo); + + /* Cache the setting */ + camera->photo_settings.ev_compensation = ev_compensation; + + if (PHOTOGRAPHY_IS_OK (camera->src_vid_src)) { + ret = + gst_photography_set_ev_compensation (GST_PHOTOGRAPHY + (camera->src_vid_src), ev_compensation); + } + return ret; +} + +static gboolean +gst_camerabin_get_ev_compensation (GstPhotography * photo, + gfloat * ev_compensation) +{ + GstCameraBin *camera; + gboolean ret = FALSE; + + g_return_val_if_fail (photo != NULL, FALSE); + + camera = GST_CAMERABIN (photo); -#define GST_PHOTOGRAPHY_IMPL_TEMPLATE(function_name, param_type) \ -static gboolean \ -gst_camerabin_set_ ## function_name (GstPhotography *photo, param_type param) \ -{ \ - GstCameraBin *camera; \ - gboolean ret = FALSE; \ - g_return_val_if_fail (photo != NULL, FALSE); \ - camera = GST_CAMERABIN (photo); \ - if (PHOTOGRAPHY_IS_OK (camera->src_vid_src)) { \ - ret = gst_photography_set_ ## function_name (GST_PHOTOGRAPHY (camera->src_vid_src), param); \ - } \ - return ret; \ -} \ -static gboolean \ -gst_camerabin_get_ ## function_name (GstPhotography *photo, param_type * param) \ -{ \ - GstCameraBin *camera; \ - gboolean ret = FALSE; \ - g_return_val_if_fail (photo != NULL, FALSE); \ - camera = GST_CAMERABIN (photo); \ - if (PHOTOGRAPHY_IS_OK (camera->src_vid_src)) { \ - ret = gst_photography_get_ ## function_name (GST_PHOTOGRAPHY (camera->src_vid_src), param); \ - } \ - return ret; \ -} - -GST_PHOTOGRAPHY_IMPL_TEMPLATE (ev_compensation, gfloat); -GST_PHOTOGRAPHY_IMPL_TEMPLATE (iso_speed, guint); -GST_PHOTOGRAPHY_IMPL_TEMPLATE (white_balance_mode, GstWhiteBalanceMode); -GST_PHOTOGRAPHY_IMPL_TEMPLATE (colour_tone_mode, GstColourToneMode); -GST_PHOTOGRAPHY_IMPL_TEMPLATE (flash_mode, GstFlashMode); + if (PHOTOGRAPHY_IS_OK (camera->src_vid_src)) { + ret = + gst_photography_get_ev_compensation (GST_PHOTOGRAPHY + (camera->src_vid_src), ev_compensation); + } + return ret; +} + +static gboolean +gst_camerabin_set_iso_speed (GstPhotography * photo, guint iso_speed) +{ + GstCameraBin *camera; + gboolean ret = FALSE; + + g_return_val_if_fail (photo != NULL, FALSE); + + camera = GST_CAMERABIN (photo); + + /* Cache the setting */ + camera->photo_settings.iso_speed = iso_speed; + + if (PHOTOGRAPHY_IS_OK (camera->src_vid_src)) { + ret = gst_photography_set_iso_speed (GST_PHOTOGRAPHY (camera->src_vid_src), + iso_speed); + } + return ret; +} + +static gboolean +gst_camerabin_get_iso_speed (GstPhotography * photo, guint * iso_speed) +{ + GstCameraBin *camera; + gboolean ret = FALSE; + + g_return_val_if_fail (photo != NULL, FALSE); + + camera = GST_CAMERABIN (photo); + + if (PHOTOGRAPHY_IS_OK (camera->src_vid_src)) { + ret = gst_photography_get_iso_speed (GST_PHOTOGRAPHY (camera->src_vid_src), + iso_speed); + } + return ret; +} + +static gboolean +gst_camerabin_set_white_balance_mode (GstPhotography * photo, + GstWhiteBalanceMode white_balance_mode) +{ + GstCameraBin *camera; + gboolean ret = FALSE; + + g_return_val_if_fail (photo != NULL, FALSE); + + camera = GST_CAMERABIN (photo); + + /* Cache the setting */ + camera->photo_settings.wb_mode = white_balance_mode; + + if (PHOTOGRAPHY_IS_OK (camera->src_vid_src)) { + ret = + gst_photography_set_white_balance_mode (GST_PHOTOGRAPHY + (camera->src_vid_src), white_balance_mode); + } + return ret; +} + +static gboolean +gst_camerabin_get_white_balance_mode (GstPhotography * photo, + GstWhiteBalanceMode * white_balance_mode) +{ + GstCameraBin *camera; + gboolean ret = FALSE; + + g_return_val_if_fail (photo != NULL, FALSE); + + camera = GST_CAMERABIN (photo); + + if (PHOTOGRAPHY_IS_OK (camera->src_vid_src)) { + ret = + gst_photography_get_white_balance_mode (GST_PHOTOGRAPHY + (camera->src_vid_src), white_balance_mode); + } + return ret; +} + +static gboolean +gst_camerabin_set_colour_tone_mode (GstPhotography * photo, + GstColourToneMode colour_tone_mode) +{ + GstCameraBin *camera; + gboolean ret = FALSE; + + g_return_val_if_fail (photo != NULL, FALSE); + + camera = GST_CAMERABIN (photo); + + /* Cache the setting */ + camera->photo_settings.tone_mode = colour_tone_mode; + + if (PHOTOGRAPHY_IS_OK (camera->src_vid_src)) { + ret = + gst_photography_set_colour_tone_mode (GST_PHOTOGRAPHY + (camera->src_vid_src), colour_tone_mode); + } + return ret; +} + +static gboolean +gst_camerabin_get_colour_tone_mode (GstPhotography * photo, + GstColourToneMode * colour_tone_mode) +{ + GstCameraBin *camera; + gboolean ret = FALSE; + + g_return_val_if_fail (photo != NULL, FALSE); + + camera = GST_CAMERABIN (photo); + + if (PHOTOGRAPHY_IS_OK (camera->src_vid_src)) { + ret = + gst_photography_get_colour_tone_mode (GST_PHOTOGRAPHY + (camera->src_vid_src), colour_tone_mode); + } + return ret; +} + +static gboolean +gst_camerabin_set_flash_mode (GstPhotography * photo, GstFlashMode flash_mode) +{ + GstCameraBin *camera; + gboolean ret = FALSE; + + g_return_val_if_fail (photo != NULL, FALSE); + + camera = GST_CAMERABIN (photo); + + /* Cache the setting */ + camera->photo_settings.flash_mode = flash_mode; + + if (PHOTOGRAPHY_IS_OK (camera->src_vid_src)) { + ret = gst_photography_set_flash_mode (GST_PHOTOGRAPHY (camera->src_vid_src), + flash_mode); + } + return ret; +} + +static gboolean +gst_camerabin_get_flash_mode (GstPhotography * photo, GstFlashMode * flash_mode) +{ + GstCameraBin *camera; + gboolean ret = FALSE; + + g_return_val_if_fail (photo != NULL, FALSE); + + camera = GST_CAMERABIN (photo); + + if (PHOTOGRAPHY_IS_OK (camera->src_vid_src)) { + ret = gst_photography_get_flash_mode (GST_PHOTOGRAPHY (camera->src_vid_src), + flash_mode); + } + return ret; +} static gboolean gst_camerabin_set_zoom (GstPhotography * photo, gfloat zoom) @@ -106,24 +275,10 @@ gst_camerabin_set_scene_mode (GstPhotography * photo, GstSceneMode scene_mode) camera = GST_CAMERABIN (photo); - if (scene_mode == GST_PHOTOGRAPHY_SCENE_MODE_NIGHT) { - GST_DEBUG ("enabling night mode, lowering fps"); - /* Make camerabin select the lowest allowed frame rate */ - camera->night_mode = TRUE; - /* Remember frame rate before setting night mode */ - camera->pre_night_fps_n = camera->fps_n; - camera->pre_night_fps_d = camera->fps_d; - g_signal_emit_by_name (camera, "user-res-fps", camera->width, - camera->height, 0, 0, 0); - } else { - if (camera->night_mode) { - GST_DEBUG ("disabling night mode, restoring fps to %d/%d", - camera->pre_night_fps_n, camera->pre_night_fps_d); - camera->night_mode = FALSE; - g_signal_emit_by_name (camera, "user-res-fps", camera->width, - camera->height, camera->pre_night_fps_n, camera->pre_night_fps_d, 0); - } - } + /* Cache the setting */ + camera->photo_settings.scene_mode = scene_mode; + + gst_camerabin_handle_scene_mode (camera, scene_mode); if (PHOTOGRAPHY_IS_OK (camera->src_vid_src)) { ret = gst_photography_set_scene_mode (GST_PHOTOGRAPHY (camera->src_vid_src), @@ -186,6 +341,69 @@ gst_camerabin_set_autofocus (GstPhotography * photo, gboolean on) } } +static gboolean +gst_camerabin_set_config (GstPhotography * photo, GstPhotoSettings * config) +{ + GstCameraBin *camera; + gboolean ret = FALSE; + g_return_val_if_fail (photo != NULL, FALSE); + camera = GST_CAMERABIN (photo); + + /* Cache the settings */ + memcpy (&camera->photo_settings, config, sizeof (GstPhotoSettings)); + + /* Handle night mode */ + gst_camerabin_handle_scene_mode (camera, config->scene_mode); + + if (PHOTOGRAPHY_IS_OK (camera->src_vid_src)) { + ret = + gst_photography_set_config (GST_PHOTOGRAPHY (camera->src_vid_src), + config); + } + return ret; +} + +static gboolean +gst_camerabin_get_config (GstPhotography * photo, GstPhotoSettings * config) +{ + GstCameraBin *camera; + gboolean ret = FALSE; + g_return_val_if_fail (photo != NULL, FALSE); + camera = GST_CAMERABIN (photo); + if (PHOTOGRAPHY_IS_OK (camera->src_vid_src)) { + ret = + gst_photography_get_config (GST_PHOTOGRAPHY (camera->src_vid_src), + config); + } + return ret; +} + +static void +gst_camerabin_handle_scene_mode (GstCameraBin * camera, GstSceneMode scene_mode) +{ + if (scene_mode == GST_PHOTOGRAPHY_SCENE_MODE_NIGHT) { + if (!camera->night_mode) { + GST_DEBUG ("enabling night mode, lowering fps"); + /* Make camerabin select the lowest allowed frame rate */ + camera->night_mode = TRUE; + /* Remember frame rate before setting night mode */ + camera->pre_night_fps_n = camera->fps_n; + camera->pre_night_fps_d = camera->fps_d; + g_signal_emit_by_name (camera, "user-res-fps", camera->width, + camera->height, 0, 0, 0); + } else { + GST_DEBUG ("night mode already enabled"); + } + } else { + if (camera->night_mode) { + GST_DEBUG ("disabling night mode, restoring fps to %d/%d", + camera->pre_night_fps_n, camera->pre_night_fps_d); + camera->night_mode = FALSE; + g_signal_emit_by_name (camera, "user-res-fps", camera->width, + camera->height, camera->pre_night_fps_n, camera->pre_night_fps_d, 0); + } + } +} void gst_camerabin_photography_init (GstPhotographyInterface * iface) @@ -219,4 +437,7 @@ gst_camerabin_photography_init (GstPhotographyInterface * iface) iface->get_capabilities = gst_camerabin_get_capabilities; iface->set_autofocus = gst_camerabin_set_autofocus; + + iface->set_config = gst_camerabin_set_config; + iface->get_config = gst_camerabin_get_config; } diff --git a/gst/camerabin/gstcamerabinxoverlay.c b/gst/camerabin/gstcamerabinxoverlay.c deleted file mode 100644 index 7a84765a..00000000 --- a/gst/camerabin/gstcamerabinxoverlay.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - * GStreamer - * Copyright (C) 2008 Nokia Corporation <multimedia@maemo.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Includes - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "gstcamerabinxoverlay.h" -#include "gstcamerabin.h" - -/* - * static functions implementation - */ - -static void -gst_camerabin_expose (GstXOverlay * overlay) -{ - if (overlay && GST_CAMERABIN (overlay)->view_sink) { - GstXOverlay *xoverlay = GST_X_OVERLAY (GST_CAMERABIN (overlay)->view_sink); - gst_x_overlay_expose (xoverlay); - } -} - -static void -gst_camerabin_set_xwindow_id (GstXOverlay * overlay, gulong xwindow_id) -{ - if (overlay && GST_CAMERABIN (overlay)->view_sink) { - GstXOverlay *xoverlay = GST_X_OVERLAY (GST_CAMERABIN (overlay)->view_sink); - gst_x_overlay_set_xwindow_id (xoverlay, xwindow_id); - } -} - -static void -gst_camerabin_set_event_handling (GstXOverlay * overlay, gboolean handle_events) -{ - if (overlay && GST_CAMERABIN (overlay)->view_sink) { - GstXOverlay *xoverlay = GST_X_OVERLAY (GST_CAMERABIN (overlay)->view_sink); - gst_x_overlay_handle_events (xoverlay, handle_events); - } -} - -/* - * extern functions implementation - */ - -void -gst_camerabin_xoverlay_init (GstXOverlayClass * iface) -{ - iface->set_xwindow_id = gst_camerabin_set_xwindow_id; - iface->expose = gst_camerabin_expose; - iface->handle_events = gst_camerabin_set_event_handling; -} diff --git a/gst/camerabin/gstcamerabinxoverlay.h b/gst/camerabin/gstcamerabinxoverlay.h deleted file mode 100644 index b9e9d9b6..00000000 --- a/gst/camerabin/gstcamerabinxoverlay.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * GStreamer - * Copyright (C) 2008 Nokia Corporation <multimedia@maemo.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GST_CAMERAXOVERLAY_H__ -#define __GST_CAMERAXOVERLAY_H__ - -#include <gst/interfaces/xoverlay.h> - -extern void gst_camerabin_xoverlay_init (GstXOverlayClass * iface); - -#endif /* #ifndef __GST_CAMERAXOVERLAY_H__ */ diff --git a/gst/debugutils/Makefile.am b/gst/debugutils/Makefile.am index d1e1430e..3b93fa91 100644 --- a/gst/debugutils/Makefile.am +++ b/gst/debugutils/Makefile.am @@ -2,7 +2,7 @@ plugin_LTLIBRARIES = libgstdebugutilsbad.la libgstdebugutilsbad_la_SOURCES = fpsdisplaysink.c debugutilsbad.c libgstdebugutilsbad_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) -libgstdebugutilsbad_la_LIBADD = $(GST_BASE_LIBS) -lgstinterfaces-$(GST_MAJORMINOR) +libgstdebugutilsbad_la_LIBADD = $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-$(GST_MAJORMINOR) libgstdebugutilsbad_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstdebugutilsbad_la_LIBTOOLFLAGS = --tag=disable-static diff --git a/gst/dvdspu/gstdvdspu.c b/gst/dvdspu/gstdvdspu.c index f5fce4bc..af8bc99e 100644 --- a/gst/dvdspu/gstdvdspu.c +++ b/gst/dvdspu/gstdvdspu.c @@ -716,12 +716,11 @@ gst_dvd_spu_redraw_still (GstDVDSpu * dvdspu, gboolean force) static void gst_dvd_spu_handle_dvd_event (GstDVDSpu * dvdspu, GstEvent * event) { - const GstStructure *structure = gst_event_get_structure (event); - const gchar *event_type = gst_structure_get_string (structure, "event"); gboolean hl_change = FALSE; GST_INFO_OBJECT (dvdspu, "DVD event of type %s on subp pad OOB=%d", - event_type, (GST_EVENT_TYPE (event) == GST_EVENT_CUSTOM_DOWNSTREAM_OOB)); + gst_structure_get_string (event->structure, "event"), + (GST_EVENT_TYPE (event) == GST_EVENT_CUSTOM_DOWNSTREAM_OOB)); switch (dvdspu->spu_input_type) { case SPU_INPUT_TYPE_VOBSUB: diff --git a/gst/frei0r/Makefile.am b/gst/frei0r/Makefile.am new file mode 100644 index 00000000..400801d9 --- /dev/null +++ b/gst/frei0r/Makefile.am @@ -0,0 +1,15 @@ +plugin_LTLIBRARIES = libgstfrei0r.la + +libgstfrei0r_la_SOURCES = \ + gstfrei0r.c \ + gstfrei0rfilter.c \ + gstfrei0rsrc.c \ + gstfrei0rmixer.c + +libgstfrei0r_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) +libgstfrei0r_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) \ + -lgstvideo-@GST_MAJORMINOR@ +libgstfrei0r_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstfrei0r_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstfrei0r.h gstfrei0rfilter.h gstfrei0rsrc.h gstfrei0rmixer.h frei0r.h diff --git a/gst/frei0r/frei0r.h b/gst/frei0r/frei0r.h new file mode 100644 index 00000000..f6b81d2b --- /dev/null +++ b/gst/frei0r/frei0r.h @@ -0,0 +1,567 @@ +/** @mainpage frei0r - a minimalistic plugin API for video effects + * + * @section sec_intro Introduction + * + * This is frei0r - a minimalistic plugin API for video effects. + * + * The main emphasis is on simplicity - there are many different applications + * that use video effects, and they all have different requirements regarding + * their internal plugin API. And that's why frei0r does not try to be a + * one-in-all general video plugin API, but instead an API for the most + * common video effects: simple filters, sources and mixers that can be + * controlled by parameters. + * + * It's our hope that this way these simple effects can be shared between + * many applications, avoiding their reimplementation by different + * projects. + * + * On the other hand, this is not meant as a competing standard to + * more ambitious efforts that try to satisfy the needs of many different + * applications and more complex effects. + * + * + * @section sec_overview Overview + * + * If you are new to frei0r, the best thing is probably to have + * a look at the <a href="frei0r_8h-source.html">frei0r header</a>, + * which is quite simple. + * + * After that, you might want to look at the + * <a href="frei0r_8h.html">frei0r functions</a> in more detail. + * + * When developing a new frei0r effect, you have to choose + * - which effect type to use (\ref PLUGIN_TYPE), + * - which color model to use (\ref COLOR_MODEL), and + * - which parameter types (\ref PARAM_TYPE) your effect will support. + * + * To round things up, you should decide whether your effect should have + * an associated icon (\ref icons), and where it will be installed + * (\ref pluglocations). + * + * @section sec_changes Changes + * + * @subsection sec_changes_1_0_1_1 From frei0r 1.0 to frei0r 1.1 + * + * - added specifications for plugin locations + * - added specifications for frei0r icons + * - added RGBA8888 color model + * - added packed32 color model + * - added better specification of color models + * - added string type + * - added bounds to resolution (8 <= width, height <= 2048) + * - width and height must be an integer multiple of 8 + * - frame data must be 16 byte aligned + * - improved update specification (must not change parameters, + * must restore fpu state) + * - added note for applications to ignore effects with unknown fields + * - added new plugin types mixer2 and mixer3 + * - added section about \ref concurrency + */ + + +/** + * \addtogroup pluglocations Plugin Locations + * @section sec_pluglocations Plugin Locations + * + * For Unix platforms there are rules for the location of frei0r plugins. + * + * frei0r 1.x plugin files should be located in + * + * - (1) /usr/lib/frei0r-1/\<vendor\> + * - (2) /usr/local/lib/frei0r-1/\<vendor\> + * - (3) $HOME/.frei0r-1/lib/\<vendor\> + * + * Examples: + * + * - /usr/lib/frei0r-1/mob/flippo.so + * - /usr/lib/frei0r-1/drone/flippo.so + * - /usr/local/lib/frei0r-1/gephex/coma/invert0r.so + * - /home/martin/.frei0r-1/lib/martin/test.so + * + * Like in these examples plugins should be placed in "vendor" subdirs + * to reduce name clashes. + * + * @subsection sec_order Plugin Loading Order + * + * The application shall load plugins in the following order: 3, 2, 1. + * If a name clash occurs (two or more frei0r plugins with identical + * effect name), the plugins in directory 3 have precedence over plugins + * in directory 2, and those in directory 2 have precedence over plugins + * in directory 1. + * + * This makes it possible for users to "override" effects that are + * installed in system wide directories by placing plugins in their + * home directory. + * + * The order of loading plugins inside each of the directories + * 1, 2, and 3 is not defined. + */ + +/** + *\addtogroup icons Icons for frei0r effects + * @section sec_icons Icons for frei0r effects + * + * Each frei0r effect can have an associated icon. + * + * @subsection sec_icon_format Icon Format + * + * The format of frei0r icons must be png. + * Recommended resolution is 64x64. + * The icon filename of an effect with effect name "frei0r" + * must be "frei0r.png". + * + * @subsection sec_icon_location Icon location + * + * The exact location where the application should look for the + * plugin is platform dependant. + * + * For Windows platforms, the icon should be at the same place as + * the plugin containing the effect. + * + * For Unix platforms, the following mapping from plugin location + * to icon location must be used: + * + * Let \<plugin_path\>/\<plugin\> be a frei0r plugin with name \<effect_name\>. + * Then the corresponding icon (if any) shall be located in + * \<icon_path\>/\<effect_name\>.png. + * \<icon_path\> can be obtained in the following way: + * + * @verbatim + <plugin_path> | <icon_path> + ---------------------------------------------------------------------------- + $HOME/.frei0r-1/lib/<vendor> | $HOME/.frei0r-1/icons/<vendor> + /usr/local/lib/frei0r-1/<vendor> | /usr/local/share/frei0r-1/icons/<vendor> + /usr/lib/frei0r-1/<vendor> | /usr/share/frei0r-1/icons/<vendor> + * | <plugin_path> + @endverbatim + * + * (The wildcard '*' stands for any other plugin_path) + * + * For other platforms, no location is defined. We recommend to use the + * plugin path where possible. + */ + +/** + * \addtogroup concurrency Concurrency + * @section sec_concurrency Concurrency + * + * - \ref f0r_init + * - \ref f0r_deinit + * + * These methods must not be called more than once. It is obvious that no + * concurrent calls are allowed. + * + * + * - \ref f0r_get_plugin_info + * - \ref f0r_get_param_info + * - \ref f0r_construct + * - \ref f0r_destruct + * + * Concurrent calls of these functions are allowed. + * + * + * - \ref f0r_set_param_value + * - \ref f0r_get_param_value + * - \ref f0r_update + * - \ref f0r_update2 + * + * If a thread is in one of these methods its allowed for another thread to + * enter one of theses methods for a different effect instance. But for one + * effect instance only one thread is allowed to execute any of these methods. + */ + + + +/** \file + * \brief This file defines the frei0r api, version 1.1. + * + * A conforming plugin must implement and export all functions declared in + * this header. + * + * A conforming application must accept only those plugins which use + * allowed values for the described fields. + */ + +#ifndef INCLUDED_FREI0R_H +#define INCLUDED_FREI0R_H + +#include <inttypes.h> + +/** + * The frei0r API major version + */ +#define FREI0R_MAJOR_VERSION 1 + +/** + * The frei0r API minor version + */ +#define FREI0R_MINOR_VERSION 1 + +//--------------------------------------------------------------------------- + +/** + * f0r_init() is called once when the plugin is loaded by the application. + * \see f0r_deinit + */ +int f0r_init(); + +/** + * f0r_deinit is called once when the plugin is unloaded by the application. + * \see f0r_init + */ +void f0r_deinit(); + +//--------------------------------------------------------------------------- + +/** \addtogroup PLUGIN_TYPE Type of the Plugin + * These defines determine whether the plugin is a + * source, a filter or one of the two mixer types + * @{ + */ + +/** one input and one output */ +#define F0R_PLUGIN_TYPE_FILTER 0 +/** just one output */ +#define F0R_PLUGIN_TYPE_SOURCE 1 +/** two inputs and one output */ +#define F0R_PLUGIN_TYPE_MIXER2 2 +/** three inputs and one output */ +#define F0R_PLUGIN_TYPE_MIXER3 3 + +/** @} */ + +//--------------------------------------------------------------------------- + +/** \addtogroup COLOR_MODEL Color Models + * List of supported color models. + * + * Note: the color models are endian independent, because the + * color components are defined by their positon in memory, not + * by their significance in an uint32_t value. + * + * For effects that work on the color components, + * RGBA8888 is the recommended color model for frei0r-1.1 effects. + * For effects that only work on pixels, PACKED32 is the recommended + * color model since it helps the application to avoid unnecessary + * color conversions. + * + * Effects can choose an appropriate color model, applications must support + * all color models and do conversions if necessary. Source effects + * must not use the PACKED32 color model because the application must know + * in which color model the created framebuffers are represented. + * + * For each color model, a frame consists of width*height pixels which + * are stored row-wise and consecutively in memory. The size of a pixel is + * 4 bytes. There is no extra pitch parameter + * (i.e. the pitch is simply width*4). + * + * The following additional constraints must be honored: + * - The top-most line of a frame is stored first in memory. + * - A frame must be aligned to a 16 byte border in memory. + * - The width and height of a frame must be positive + * - The width and height of a frame must be integer multiples of 8 + * + * These constraints make sure that each line is stored at an address aligned + * to 16 byte. + */ +/*@{*/ +/** + * In BGRA8888, each pixel is represented by 4 consecutive + * unsigned bytes, where the first byte value represents + * the blue, the second the green, and the third the red color + * component of the pixel. The last value represents the + * alpha value. + */ +#define F0R_COLOR_MODEL_BGRA8888 0 + +/** + * In RGBA8888, each pixel is represented by 4 consecutive + * unsigned bytes, where the first byte value represents + * the red, the second the green, and the third the blue color + * component of the pixel. The last value represents the + * alpha value. + */ +#define F0R_COLOR_MODEL_RGBA8888 1 + +/** + * In PACKED32, each pixel is represented by 4 consecutive + * bytes, but it is not defined how the color componets are + * stored. The true color format could be RGBA8888, + * BGRA8888, a packed 32 bit YUV format, or any other + * color format that stores pixels in 32 bit. + * + * This is useful for effects that don't work on color but + * only on pixels (for example a mirror effect). + * + * Note that source effects must not use this color model. + */ +#define F0R_COLOR_MODEL_PACKED32 2 +/*@}*/ + +/** + * The f0r_plugin_info_t structure is filled in by the plugin + * to tell the application about its name, type, number of parameters, + * and version. + * + * An application should ignore (i.e. not use) frei0r effects that + * have unknown values in the plugin_type or color_model field. + * It should also ignore effects with a too high frei0r_version. + * + * This is necessary to be able to extend the frei0r spec (e.g. + * by adding new color models or plugin types) in a way that does not + * result in crashes when loading effects that make use of these + * extensions into an older application. + * + * All strings are unicode, 0-terminated, and the encoding is utf-8. + */ +typedef struct f0r_plugin_info +{ + const char* name; /**< The (short) name of the plugin */ + const char* author; /**< The plugin author */ + /** The plugin type + * \see PLUGIN_TYPE + */ + int plugin_type; + int color_model; /**< The color model used */ + int frei0r_version; /**< The frei0r major version this plugin is built for*/ + int major_version; /**< The major version of the plugin */ + int minor_version; /**< The minor version of the plugin */ + int num_params; /**< The number of parameters of the plugin */ + const char* explanation; /**< An optional explanation string */ +} f0r_plugin_info_t; + + +/** + * Is called once after init. The plugin has to fill in the values in info. + * + * \param info Pointer to an info struct allocated by the application. + */ +void f0r_get_plugin_info(f0r_plugin_info_t* info); + +//--------------------------------------------------------------------------- + +/** \addtogroup PARAM_TYPE Parameter Types + * + * @{ + */ + + +/** + * Parameter type for boolean values + * \see f0r_param_bool + */ +#define F0R_PARAM_BOOL 0 + +/** + * Parameter type for doubles + * \see f0r_param_double + */ +#define F0R_PARAM_DOUBLE 1 + +/** + * Parameter type for color + * \see f0r_param_color + */ +#define F0R_PARAM_COLOR 2 +/** + * Parameter type for position + * \see f0r_param_position + */ +#define F0R_PARAM_POSITION 3 + +/** + * Parameter type for string + * \see f0r_param_string + */ +#define F0R_PARAM_STRING 4 + +/** + * The boolean type. The allowed range of values is [0, 1]. + * [0, 0.5[ is mapped to false and [0.5, 1] is mapped to true. + */ +typedef double f0r_param_bool; + +/** + * The double type. The allowed range of values is [0, 1]. + */ +typedef double f0r_param_double; + +/** + * The color type. All three color components are in the range [0, 1]. + */ +typedef struct f0r_param_color +{ + float r; /**< red color component */ + float g; /**< green color component */ + float b; /**< blue color component */ +} f0r_param_color_t; + +/** + * The position type. Both position coordinates are in the range [0, 1]. + */ +typedef struct f0r_param_position +{ + double x; /**< x coordinate */ + double y; /**< y coordinate */ +} f0r_param_position_t; + + +/** + * The string type. + * Zero terminated array of 8-bit values in utf-8 encoding + */ +typedef char f0r_param_string; + +/** @} */ + + +/** + * Similar to f0r_plugin_info_t, this structure is filled by the plugin + * for every parameter. + * + * All strings are unicode, 0-terminated, and the encoding is utf-8. + */ +typedef struct f0r_param_info +{ + const char* name; /**<The (short) name of the param */ + int type; /**<The type (see the F0R_PARAM_* defines) */ + const char* explanation; /**<Optional explanation (can be 0) */ +} f0r_param_info_t; + +/** + * f0r_get_param_info is called by the application to query the type of + * each parameter. + * + * \param info is allocated by the application and filled by the plugin + * \param param_index the index of the parameter to be queried (from 0 to + * num_params-1) + */ +void f0r_get_param_info(f0r_param_info_t* info, int param_index); + +//--------------------------------------------------------------------------- + +/** + * Transparent instance pointer of the frei0r effect. + */ +typedef void* f0r_instance_t; + +/** + * Constructor for effect instances. The plugin returns a pointer to + * its internal instance structure. + * + * The resolution has to be an integer multiple of 8, + * must be greater than 0 and be at most 2048 in both dimensions. + * + * \param width The x-resolution of the processed video frames + * \param height The y-resolution of the processed video frames + * \returns 0 on failure or a pointer != 0 on success + * + * \see f0r_destruct + */ +f0r_instance_t f0r_construct(unsigned int width, unsigned int height); + +/** + * Destroys an effect instance. + * + * \param instance The pointer to the plugins internal instance structure. + * + * \see f0r_construct + */ +void f0r_destruct(f0r_instance_t instance); + +//--------------------------------------------------------------------------- + +/** + * Transparent parameter handle. + */ +typedef void* f0r_param_t; + +/** + * This function allows the application to set the parameter values of an + * effect instance. Validity of the parameter pointer is handled by the + * application thus the data must be copied by the effect. + * + * \param instance the effect instance + * \param param pointer to the parameter value + * \param param_index index of the parameter + * + * \see f0r_get_param_value + */ +void f0r_set_param_value(f0r_instance_t instance, + f0r_param_t param, int param_index); + +/** + * This function allows the application to query the parameter values of an + * effect instance. + * + * \param instance the effect instance + * \param param pointer to the parameter value + * \param param_index index of the parameter + * + * \see f0r_set_param_value + */ +void f0r_get_param_value(f0r_instance_t instance, + f0r_param_t param, int param_index); + +//--------------------------------------------------------------------------- + +/** + * This is where the core effect processing happens. The application calls it + * after it has set the necessary parameter values. + * inframe and outframe must be aligned to an integer multiple of 16 bytes + * in memory. + * + * This funcition should not alter the parameters of the effect in any + * way (\ref f0r_get_param_value should return the same values after a call + * to \ref f0r_update as before the call). + * + * The function is responsible to restore the fpu state (e.g. rounding mode) + * and mmx state if applicable before it returns to the caller. + * + * The host mustn't call \ref f0r_update for effects of type + * \ref F0R_PLUGIN_TYPE_MIXER2 and \ref F0R_PLUGIN_TYPE_MIXER3. + * + * \param instance the effect instance + * \param time the application time in seconds but with subsecond resolution + * (e.g. milli-second resolution). The resolution should be at least + * the inter-frame period of the application. + * \param inframe the incoming video frame (can be zero for sources) + * \param outframe the resulting video frame + * + * \see f0r_update2 + */ +void f0r_update(f0r_instance_t instance, + double time, const uint32_t* inframe, uint32_t* outframe); + +//--------------------------------------------------------------------------- + +/** + * For effects of type \ref F0R_PLUGIN_TYPE_SOURCE or + * \ref F0R_PLUGIN_TYPE_FILTER this method is optional. The \ref f0r_update + * method must still be exported for these two effect types. If both are + * provided the behavior of them must be the same. + * + * Effects of type \ref F0R_PLUGIN_TYPE_MIXER2 or \ref F0R_PLUGIN_TYPE_MIXER3 must provide the new \ref f0r_update2 method. + + * \param instance the effect instance + * \param time the application time in seconds but with subsecond resolution + * (e.g. milli-second resolution). The resolution should be at least + * the inter-frame period of the application. + * \param inframe1 the first incoming video frame (can be zero for sources) + * \param inframe2 the second incoming video frame + (can be zero for sources and filters) + * \param inframe3 the third incoming video frame + (can be zero for sources, filters and mixer3) + * \param outframe the resulting video frame + * + * \see f0r_update + */ +void f0r_update2(f0r_instance_t instance, + double time, + const uint32_t* inframe1, + const uint32_t* inframe2, + const uint32_t* inframe3, + uint32_t* outframe); +//--------------------------------------------------------------------------- + +#endif diff --git a/gst/frei0r/gstfrei0r.c b/gst/frei0r/gstfrei0r.c new file mode 100644 index 00000000..0f7ba5c5 --- /dev/null +++ b/gst/frei0r/gstfrei0r.c @@ -0,0 +1,598 @@ +/* GStreamer + * Copyright (C) 2009 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * 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 "gstfrei0r.h" +#include "gstfrei0rfilter.h" +#include "gstfrei0rsrc.h" +#include "gstfrei0rmixer.h" + +#include <string.h> + +GST_DEBUG_CATEGORY (frei0r_debug); +#define GST_CAT_DEFAULT frei0r_debug + +GstCaps * +gst_frei0r_caps_from_color_model (gint color_model) +{ + switch (color_model) { + case F0R_COLOR_MODEL_BGRA8888: + return gst_caps_from_string (GST_VIDEO_CAPS_BGRA); + case F0R_COLOR_MODEL_RGBA8888: + return gst_caps_from_string (GST_VIDEO_CAPS_RGBA); + case F0R_COLOR_MODEL_PACKED32: + return gst_caps_from_string (GST_VIDEO_CAPS_BGRA " ; " + GST_VIDEO_CAPS_RGBA " ; " + GST_VIDEO_CAPS_ABGR " ; " + GST_VIDEO_CAPS_ARGB " ; " + GST_VIDEO_CAPS_BGRx " ; " + GST_VIDEO_CAPS_RGBx " ; " + GST_VIDEO_CAPS_xBGR " ; " + GST_VIDEO_CAPS_xRGB " ; " GST_VIDEO_CAPS_YUV ("AYUV")); + default: + break; + } + + return NULL; +} + +void +gst_frei0r_klass_install_properties (GObjectClass * gobject_class, + GstFrei0rFuncTable * ftable, GstFrei0rProperty * properties, + gint n_properties) +{ + gint i, count = 1; + f0r_instance_t *instance = ftable->construct (640, 480); + + g_assert (instance); + + for (i = 0; i < n_properties; i++) { + f0r_param_info_t *param_info = &properties[i].info; + gchar *prop_name; + + ftable->get_param_info (param_info, i); + + prop_name = g_ascii_strdown (param_info->name, -1); + g_strcanon (prop_name, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-+", '-'); + + properties[i].prop_id = count; + properties[i].prop_idx = i; + + ftable->get_param_value (instance, &properties[i].default_value, i); + if (param_info->type == F0R_PARAM_STRING) + properties[i].default_value.data.s = + g_strdup (properties[i].default_value.data.s); + + switch (param_info->type) { + case F0R_PARAM_BOOL: + g_object_class_install_property (gobject_class, count++, + g_param_spec_boolean (prop_name, param_info->name, + param_info->explanation, FALSE, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE)); + properties[i].n_prop_ids = 1; + break; + case F0R_PARAM_DOUBLE: + g_object_class_install_property (gobject_class, count++, + g_param_spec_double (prop_name, param_info->name, + param_info->explanation, -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE)); + properties[i].n_prop_ids = 1; + break; + case F0R_PARAM_STRING: + g_object_class_install_property (gobject_class, count++, + g_param_spec_string (prop_name, param_info->name, + param_info->explanation, NULL, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE)); + properties[i].n_prop_ids = 1; + break; + case F0R_PARAM_COLOR:{ + gchar *prop_name_full; + gchar *prop_nick_full; + + prop_name_full = g_strconcat (prop_name, "-r", NULL); + prop_nick_full = g_strconcat (param_info->name, "-R", NULL); + g_object_class_install_property (gobject_class, count++, + g_param_spec_float (prop_name_full, prop_nick_full, + param_info->explanation, 0.0, 1.0, 0.0, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE)); + g_free (prop_name_full); + g_free (prop_nick_full); + + prop_name_full = g_strconcat (prop_name, "-g", NULL); + prop_nick_full = g_strconcat (param_info->name, "-G", NULL); + g_object_class_install_property (gobject_class, count++, + g_param_spec_float (prop_name_full, param_info->name, + param_info->explanation, 0.0, 1.0, 0.0, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE)); + g_free (prop_name_full); + g_free (prop_nick_full); + + prop_name_full = g_strconcat (prop_name, "-b", NULL); + prop_nick_full = g_strconcat (param_info->name, "-B", NULL); + g_object_class_install_property (gobject_class, count++, + g_param_spec_float (prop_name_full, param_info->name, + param_info->explanation, 0.0, 1.0, 0.0, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE)); + g_free (prop_name_full); + g_free (prop_nick_full); + + properties[i].n_prop_ids = 3; + break; + } + case F0R_PARAM_POSITION:{ + gchar *prop_name_full; + gchar *prop_nick_full; + + prop_name_full = g_strconcat (prop_name, "-x", NULL); + prop_nick_full = g_strconcat (param_info->name, "-X", NULL); + g_object_class_install_property (gobject_class, count++, + g_param_spec_double (prop_name_full, param_info->name, + param_info->explanation, 0.0, 1.0, 0.0, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE)); + g_free (prop_name_full); + g_free (prop_nick_full); + + prop_name_full = g_strconcat (prop_name, "-Y", NULL); + prop_nick_full = g_strconcat (param_info->name, "-X", NULL); + g_object_class_install_property (gobject_class, count++, + g_param_spec_double (prop_name_full, param_info->name, + param_info->explanation, 0.0, 1.0, 0.0, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE)); + g_free (prop_name_full); + g_free (prop_nick_full); + + properties[i].n_prop_ids = 2; + break; + } + default: + g_assert_not_reached (); + break; + } + + g_free (prop_name); + } + + ftable->destruct (instance); +} + +GstFrei0rPropertyValue * +gst_frei0r_property_cache_init (GstFrei0rProperty * properties, + gint n_properties) +{ + gint i; + GstFrei0rPropertyValue *ret = g_new0 (GstFrei0rPropertyValue, n_properties); + + for (i = 0; i < n_properties; i++) { + memcpy (&ret[i].data, &properties[i].default_value, + sizeof (GstFrei0rPropertyValue)); + + if (properties[i].info.type == F0R_PARAM_STRING) + ret[i].data.s = g_strdup (ret[i].data.s); + } + + return ret; +} + +void +gst_frei0r_property_cache_free (GstFrei0rProperty * properties, + GstFrei0rPropertyValue * property_cache, gint n_properties) +{ + gint i; + + for (i = 0; i < n_properties; i++) { + if (properties[i].info.type == F0R_PARAM_STRING) + g_free (property_cache[i].data.s); + } + g_free (property_cache); +} + +f0r_instance_t * +gst_frei0r_instance_construct (GstFrei0rFuncTable * ftable, + GstFrei0rProperty * properties, gint n_properties, + GstFrei0rPropertyValue * property_cache, gint width, gint height) +{ + f0r_instance_t *instance = ftable->construct (width, height); + gint i; + + for (i = 0; i < n_properties; i++) { + if (properties[i].info.type == F0R_PARAM_STRING) + ftable->set_param_value (instance, property_cache[i].data.s, i); + else + ftable->set_param_value (instance, &property_cache[i].data, i); + } + + return instance; +} + +gboolean +gst_frei0r_get_property (f0r_instance_t * instance, GstFrei0rFuncTable * ftable, + GstFrei0rProperty * properties, gint n_properties, + GstFrei0rPropertyValue * property_cache, guint prop_id, GValue * value) +{ + gint i; + GstFrei0rProperty *prop = NULL; + + for (i = 0; i < n_properties; i++) { + if (properties[i].prop_id <= prop_id && + properties[i].prop_id + properties[i].n_prop_ids > prop_id) { + prop = &properties[i]; + break; + } + } + + if (!prop) + return FALSE; + + switch (prop->info.type) { + case F0R_PARAM_BOOL:{ + gdouble d; + + if (instance) + ftable->get_param_value (instance, &d, prop->prop_idx); + else + d = property_cache[prop->prop_idx].data.b ? 1.0 : 0.0; + + g_value_set_boolean (value, (d < 0.5) ? FALSE : TRUE); + break; + } + case F0R_PARAM_DOUBLE:{ + gdouble d; + + if (instance) + ftable->get_param_value (instance, &d, prop->prop_idx); + else + d = property_cache[prop->prop_idx].data.d; + + g_value_set_double (value, d); + break; + } + case F0R_PARAM_STRING:{ + const gchar *s; + + if (instance) + ftable->get_param_value (instance, &s, prop->prop_idx); + else + s = property_cache[prop->prop_idx].data.s; + g_value_set_string (value, s); + break; + } + case F0R_PARAM_COLOR:{ + f0r_param_color_t color; + + if (instance) + ftable->get_param_value (instance, &color, prop->prop_idx); + else + color = property_cache[prop->prop_idx].data.color; + + switch (prop_id - prop->prop_id) { + case 0: + g_value_set_float (value, color.r); + break; + case 1: + g_value_set_float (value, color.g); + break; + case 2: + g_value_set_float (value, color.b); + break; + } + break; + } + case F0R_PARAM_POSITION:{ + f0r_param_position_t position; + + if (instance) + ftable->get_param_value (instance, &position, prop->prop_idx); + else + position = property_cache[prop->prop_idx].data.position; + + switch (prop_id - prop->prop_id) { + case 0: + g_value_set_double (value, position.x); + break; + case 1: + g_value_set_double (value, position.y); + break; + } + break; + } + default: + g_assert_not_reached (); + break; + } + + return TRUE; +} + +gboolean +gst_frei0r_set_property (f0r_instance_t * instance, GstFrei0rFuncTable * ftable, + GstFrei0rProperty * properties, gint n_properties, + GstFrei0rPropertyValue * property_cache, guint prop_id, + const GValue * value) +{ + GstFrei0rProperty *prop = NULL; + gint i; + + for (i = 0; i < n_properties; i++) { + if (properties[i].prop_id <= prop_id && + properties[i].prop_id + properties[i].n_prop_ids > prop_id) { + prop = &properties[i]; + break; + } + } + + if (!prop) + return FALSE; + + switch (prop->info.type) { + case F0R_PARAM_BOOL:{ + gboolean b = g_value_get_boolean (value); + gdouble d = b ? 1.0 : 0.0; + + if (instance) + ftable->set_param_value (instance, &d, prop->prop_idx); + property_cache[prop->prop_idx].data.b = b; + break; + } + case F0R_PARAM_DOUBLE:{ + gdouble d = g_value_get_double (value); + + if (instance) + ftable->set_param_value (instance, &d, prop->prop_idx); + property_cache[prop->prop_idx].data.d = d; + break; + } + case F0R_PARAM_STRING:{ + gchar *s = g_value_dup_string (value); + + /* Copies the string */ + if (instance) + ftable->set_param_value (instance, s, prop->prop_idx); + property_cache[prop->prop_idx].data.s = s; + break; + } + case F0R_PARAM_COLOR:{ + gfloat f = g_value_get_float (value); + f0r_param_color_t *color = &property_cache[prop->prop_idx].data.color; + + switch (prop_id - prop->prop_id) { + case 0: + color->r = f; + break; + case 1: + color->g = f; + break; + case 2: + color->b = f; + break; + default: + g_assert_not_reached (); + } + + if (instance) + ftable->set_param_value (instance, color, prop->prop_idx); + break; + } + case F0R_PARAM_POSITION:{ + gdouble d = g_value_get_double (value); + f0r_param_position_t *position = + &property_cache[prop->prop_idx].data.position; + + switch (prop_id - prop->prop_id) { + case 0: + position->x = d; + break; + case 1: + position->y = d; + break; + default: + g_assert_not_reached (); + } + if (instance) + ftable->set_param_value (instance, position, prop->prop_idx); + break; + } + default: + g_assert_not_reached (); + break; + } + + return TRUE; +} + +static gboolean +register_plugin (GstPlugin * plugin, const gchar * filename) +{ + GModule *module; + gboolean ret = FALSE; + GstFrei0rFuncTable ftable = { NULL, }; + gint i; + f0r_plugin_info_t info = { NULL, }; + f0r_instance_t *instance = NULL; + + GST_DEBUG ("Registering plugin '%s'", filename); + + module = g_module_open (filename, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL); + if (!module) { + GST_WARNING ("Failed to load plugin"); + return FALSE; + } + + if (!g_module_symbol (module, "f0r_init", (gpointer *) & ftable.init)) { + GST_INFO ("No frei0r plugin"); + g_module_close (module); + return FALSE; + } + + if (!g_module_symbol (module, "f0r_deinit", (gpointer *) & ftable.deinit) || + !g_module_symbol (module, "f0r_construct", + (gpointer *) & ftable.construct) + || !g_module_symbol (module, "f0r_destruct", + (gpointer *) & ftable.destruct) + || !g_module_symbol (module, "f0r_get_plugin_info", + (gpointer *) & ftable.get_plugin_info) + || !g_module_symbol (module, "f0r_get_param_info", + (gpointer *) & ftable.get_param_info) + || !g_module_symbol (module, "f0r_set_param_value", + (gpointer *) & ftable.set_param_value) + || !g_module_symbol (module, "f0r_get_param_value", + (gpointer *) & ftable.get_param_value)) + goto invalid_frei0r_plugin; + + /* One of these must exist */ + g_module_symbol (module, "f0r_update", (gpointer *) & ftable.update); + g_module_symbol (module, "f0r_update2", (gpointer *) & ftable.update2); + + if (!ftable.init ()) { + GST_WARNING ("Failed to initialize plugin"); + g_module_close (module); + return FALSE; + } + + if (!ftable.update && !ftable.update2) + goto invalid_frei0r_plugin; + + ftable.get_plugin_info (&info); + + if (info.frei0r_version > 1) { + GST_WARNING ("Unsupported frei0r version %d", info.frei0r_version); + ftable.deinit (); + g_module_close (module); + return FALSE; + } + + if (info.color_model > F0R_COLOR_MODEL_PACKED32) { + GST_WARNING ("Unsupported color model %d", info.color_model); + ftable.deinit (); + g_module_close (module); + return FALSE; + } + + for (i = 0; i < info.num_params; i++) { + f0r_param_info_t pinfo = { NULL, }; + + ftable.get_param_info (&pinfo, i); + if (pinfo.type > F0R_PARAM_STRING) { + GST_WARNING ("Unsupported parameter type %d", pinfo.type); + ftable.deinit (); + g_module_close (module); + return FALSE; + } + } + + instance = ftable.construct (640, 480); + if (!instance) { + GST_WARNING ("Failed to instanciate plugin '%s'", info.name); + ftable.deinit (); + g_module_close (module); + return FALSE; + } + ftable.destruct (instance); + + switch (info.plugin_type) { + case F0R_PLUGIN_TYPE_FILTER: + ret = gst_frei0r_filter_register (plugin, &info, &ftable); + break; + case F0R_PLUGIN_TYPE_SOURCE: + ret = gst_frei0r_src_register (plugin, &info, &ftable); + break; + case F0R_PLUGIN_TYPE_MIXER2: + case F0R_PLUGIN_TYPE_MIXER3: + ret = gst_frei0r_mixer_register (plugin, &info, &ftable); + break; + default: + break; + } + + if (!ret) + goto invalid_frei0r_plugin; + + return ret; + +invalid_frei0r_plugin: + GST_ERROR ("Invalid frei0r plugin"); + ftable.deinit (); + g_module_close (module); + + return FALSE; +} + +static gboolean +register_plugins (GstPlugin * plugin, const gchar * path) +{ + GDir *dir; + gchar *filename; + const gchar *entry_name; + gboolean ret = FALSE; + + GST_DEBUG ("Scanning director '%s' for frei0r plugins", path); + + dir = g_dir_open (path, 0, NULL); + if (!dir) + return FALSE; + + while ((entry_name = g_dir_read_name (dir))) { + filename = g_build_filename (path, entry_name, NULL); + if ((g_str_has_suffix (filename, G_MODULE_SUFFIX) +#ifdef GST_EXTRA_MODULE_SUFFIX + || g_str_has_suffix (filename, GST_EXTRA_MODULE_SUFFIX) +#endif + ) && g_file_test (filename, G_FILE_TEST_IS_REGULAR)) { + ret |= register_plugin (plugin, filename); + } else if (g_file_test (filename, G_FILE_TEST_IS_DIR)) { + ret |= register_plugins (plugin, filename); + } + g_free (filename); + } + g_dir_close (dir); + + return ret; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + const gchar *homedir; + gchar *path; + + GST_DEBUG_CATEGORY_INIT (frei0r_debug, "frei0r", 0, "frei0r"); + + gst_plugin_add_dependency_simple (plugin, + "HOME/.frei0r-1/lib", + "/usr/lib/frei0r-1:/usr/local/lib/frei0r-1", + NULL, GST_PLUGIN_DEPENDENCY_FLAG_RECURSE); + + register_plugins (plugin, "/usr/lib/frei0r-1"); + register_plugins (plugin, "/usr/local/lib/frei0r-1"); + + homedir = g_get_home_dir (); + path = g_build_filename (homedir, ".frei0r-1", NULL); + register_plugins (plugin, path); + g_free (path); + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "frei0r", + "frei0r plugin library", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/frei0r/gstfrei0r.h b/gst/frei0r/gstfrei0r.h new file mode 100644 index 00000000..91e5e097 --- /dev/null +++ b/gst/frei0r/gstfrei0r.h @@ -0,0 +1,91 @@ +/* GStreamer + * Copyright (C) 2009 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * 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_FREI0R_H__ +#define __GST_FREI0R_H__ + +#include <gst/gst.h> + +#include "frei0r.h" + +G_BEGIN_DECLS + +typedef struct _GstFrei0rFuncTable GstFrei0rFuncTable; +typedef struct _GstFrei0rProperty GstFrei0rProperty; +typedef struct _GstFrei0rPropertyValue GstFrei0rPropertyValue; + +struct _GstFrei0rPropertyValue { + union { + gboolean b; + gdouble d; + gchar *s; + f0r_param_position_t position; + f0r_param_color_t color; + } data; +}; + +struct _GstFrei0rProperty { + guint prop_id; + guint n_prop_ids; + + gint prop_idx; + f0r_param_info_t info; + + GstFrei0rPropertyValue default_value; +}; + +struct _GstFrei0rFuncTable { + int (*init) (void); + void (*deinit) (void); + + f0r_instance_t (*construct) (unsigned int width, unsigned int height); + void (*destruct) (f0r_instance_t instance); + + void (*get_plugin_info) (f0r_plugin_info_t* info); + void (*get_param_info) (f0r_param_info_t* info, int param_index); + + void (*set_param_value) (f0r_instance_t instance, + f0r_param_t param, int param_index); + void (*get_param_value) (f0r_instance_t instance, + f0r_param_t param, int param_index); + + void (*update) (f0r_instance_t instance, + double time, const uint32_t* inframe, uint32_t* outframe); + void (*update2) (f0r_instance_t instance, + double time, + const uint32_t* inframe1, + const uint32_t* inframe2, + const uint32_t* inframe3, + uint32_t* outframe); +}; + +void gst_frei0r_klass_install_properties (GObjectClass *gobject_class, GstFrei0rFuncTable *ftable, GstFrei0rProperty *properties, gint n_properties); + +f0r_instance_t * gst_frei0r_instance_construct (GstFrei0rFuncTable *ftable, GstFrei0rProperty *properties, gint n_properties, GstFrei0rPropertyValue *property_cache, gint width, gint height); + +GstFrei0rPropertyValue * gst_frei0r_property_cache_init (GstFrei0rProperty *properties, gint n_properties); +void gst_frei0r_property_cache_free (GstFrei0rProperty *properties, GstFrei0rPropertyValue *property_cache, gint n_properties); + +GstCaps * gst_frei0r_caps_from_color_model (gint color_model); +gboolean gst_frei0r_get_property (f0r_instance_t *instance, GstFrei0rFuncTable *ftable, GstFrei0rProperty *properties, gint n_properties, GstFrei0rPropertyValue *property_cache, guint prop_id, GValue *value); +gboolean gst_frei0r_set_property (f0r_instance_t *instance, GstFrei0rFuncTable *ftable, GstFrei0rProperty *properties, gint n_properties, GstFrei0rPropertyValue *property_cache, guint prop_id, const GValue *value); + +G_END_DECLS + +#endif /* __GST_FREI0R_H__ */ diff --git a/gst/frei0r/gstfrei0rfilter.c b/gst/frei0r/gstfrei0rfilter.c new file mode 100644 index 00000000..43d8fc67 --- /dev/null +++ b/gst/frei0r/gstfrei0rfilter.c @@ -0,0 +1,241 @@ +/* GStreamer + * Copyright (C) 2009 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * 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 "gstfrei0r.h" +#include "gstfrei0rfilter.h" + +GST_DEBUG_CATEGORY_EXTERN (frei0r_debug); +#define GST_CAT_DEFAULT frei0r_debug + +typedef struct +{ + f0r_plugin_info_t info; + GstFrei0rFuncTable ftable; +} GstFrei0rFilterClassData; + +static gboolean +gst_frei0r_filter_set_caps (GstBaseTransform * trans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstFrei0rFilter *self = GST_FREI0R_FILTER (trans); + GstFrei0rFilterClass *klass = GST_FREI0R_FILTER_GET_CLASS (trans); + GstVideoFormat fmt; + gint width, height; + + if (!gst_video_format_parse_caps (incaps, &fmt, &width, &height)) + return FALSE; + + if (self->f0r_instance) { + klass->ftable->destruct (self->f0r_instance); + self->f0r_instance = NULL; + } + + self->f0r_instance = + gst_frei0r_instance_construct (klass->ftable, klass->properties, + klass->n_properties, self->property_cache, width, height); + + return TRUE; +} + +static gboolean +gst_frei0r_filter_stop (GstBaseTransform * trans) +{ + GstFrei0rFilter *self = GST_FREI0R_FILTER (trans); + GstFrei0rFilterClass *klass = GST_FREI0R_FILTER_GET_CLASS (trans); + + if (self->f0r_instance) { + klass->ftable->destruct (self->f0r_instance); + self->f0r_instance = NULL; + } + + return TRUE; +} + +static GstFlowReturn +gst_frei0r_filter_transform (GstBaseTransform * trans, GstBuffer * inbuf, + GstBuffer * outbuf) +{ + GstFrei0rFilter *self = GST_FREI0R_FILTER (trans); + GstFrei0rFilterClass *klass = GST_FREI0R_FILTER_GET_CLASS (trans); + gdouble time; + + if (!self->f0r_instance) + return GST_FLOW_NOT_NEGOTIATED; + + time = ((gdouble) GST_BUFFER_TIMESTAMP (inbuf)) / GST_SECOND; + + if (klass->ftable->update2) + klass->ftable->update2 (self->f0r_instance, time, + (const guint32 *) GST_BUFFER_DATA (inbuf), NULL, NULL, + (guint32 *) GST_BUFFER_DATA (outbuf)); + else + klass->ftable->update (self->f0r_instance, time, + (const guint32 *) GST_BUFFER_DATA (inbuf), + (guint32 *) GST_BUFFER_DATA (outbuf)); + + return GST_FLOW_OK; +} + +static void +gst_frei0r_filter_finalize (GObject * object) +{ + GstFrei0rFilter *self = GST_FREI0R_FILTER (object); + GstFrei0rFilterClass *klass = GST_FREI0R_FILTER_GET_CLASS (object); + + if (self->f0r_instance) { + klass->ftable->destruct (self->f0r_instance); + self->f0r_instance = NULL; + } + + if (self->property_cache) + gst_frei0r_property_cache_free (klass->properties, self->property_cache, + klass->n_properties); + self->property_cache = NULL; + + G_OBJECT_CLASS (g_type_class_peek_parent (klass))->finalize (object); +} + +static void +gst_frei0r_filter_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstFrei0rFilter *self = GST_FREI0R_FILTER (object); + GstFrei0rFilterClass *klass = GST_FREI0R_FILTER_GET_CLASS (object); + + if (!gst_frei0r_get_property (self->f0r_instance, klass->ftable, + klass->properties, klass->n_properties, self->property_cache, prop_id, + value)) + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); +} + +static void +gst_frei0r_filter_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstFrei0rFilter *self = GST_FREI0R_FILTER (object); + GstFrei0rFilterClass *klass = GST_FREI0R_FILTER_GET_CLASS (object); + + if (!gst_frei0r_set_property (self->f0r_instance, klass->ftable, + klass->properties, klass->n_properties, self->property_cache, prop_id, + value)) + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); +} + +static void +gst_frei0r_filter_class_init (GstFrei0rFilterClass * klass, + GstFrei0rFilterClassData * class_data) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstElementClass *gstelement_class = (GstElementClass *) klass; + GstBaseTransformClass *gsttrans_class = (GstBaseTransformClass *) klass; + GstPadTemplate *templ; + GstCaps *caps; + gchar *author; + + klass->ftable = &class_data->ftable; + klass->info = &class_data->info; + + gobject_class->finalize = gst_frei0r_filter_finalize; + gobject_class->set_property = gst_frei0r_filter_set_property; + gobject_class->get_property = gst_frei0r_filter_get_property; + + klass->n_properties = klass->info->num_params; + klass->properties = g_new0 (GstFrei0rProperty, klass->n_properties); + + gst_frei0r_klass_install_properties (gobject_class, klass->ftable, + klass->properties, klass->n_properties); + + author = + g_strdup_printf + ("Sebastian Dröge <sebastian.droege@collabora.co.uk>, %s", + class_data->info.author); + gst_element_class_set_details_simple (gstelement_class, class_data->info.name, + "Filter/Effect/Video", class_data->info.explanation, author); + g_free (author); + + caps = gst_frei0r_caps_from_color_model (class_data->info.color_model); + + templ = + gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + gst_caps_ref (caps)); + gst_element_class_add_pad_template (gstelement_class, templ); + + templ = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, caps); + gst_element_class_add_pad_template (gstelement_class, templ); + + gsttrans_class->set_caps = GST_DEBUG_FUNCPTR (gst_frei0r_filter_set_caps); + gsttrans_class->stop = GST_DEBUG_FUNCPTR (gst_frei0r_filter_stop); + gsttrans_class->transform = GST_DEBUG_FUNCPTR (gst_frei0r_filter_transform); +} + +static void +gst_frei0r_filter_init (GstFrei0rFilter * self, GstFrei0rFilterClass * klass) +{ + self->property_cache = + gst_frei0r_property_cache_init (klass->properties, klass->n_properties); +} + +gboolean +gst_frei0r_filter_register (GstPlugin * plugin, const f0r_plugin_info_t * info, + const GstFrei0rFuncTable * ftable) +{ + GTypeInfo typeinfo = { + sizeof (GstFrei0rFilterClass), + NULL, + NULL, + (GClassInitFunc) gst_frei0r_filter_class_init, + NULL, + NULL, + sizeof (GstFrei0rFilter), + 0, + (GInstanceInitFunc) gst_frei0r_filter_init + }; + GType type; + gchar *type_name, *tmp; + GstFrei0rFilterClassData *class_data; + gboolean ret = FALSE; + + tmp = g_strdup_printf ("frei0r-filter-%s", info->name); + type_name = g_ascii_strdown (tmp, -1); + g_free (tmp); + g_strcanon (type_name, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-+", '-'); + + if (g_type_from_name (type_name)) { + GST_WARNING ("Type '%s' already exists", type_name); + return FALSE; + } + + class_data = g_new0 (GstFrei0rFilterClassData, 1); + memcpy (&class_data->info, info, sizeof (f0r_plugin_info_t)); + memcpy (&class_data->ftable, ftable, sizeof (GstFrei0rFuncTable)); + typeinfo.class_data = class_data; + + type = + g_type_register_static (GST_TYPE_VIDEO_FILTER, type_name, &typeinfo, 0); + ret = gst_element_register (plugin, type_name, GST_RANK_NONE, type); + + g_free (type_name); + return ret; +} diff --git a/gst/frei0r/gstfrei0rfilter.h b/gst/frei0r/gstfrei0rfilter.h new file mode 100644 index 00000000..ded2172b --- /dev/null +++ b/gst/frei0r/gstfrei0rfilter.h @@ -0,0 +1,63 @@ +/* GStreamer + * Copyright (C) 2009 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * 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_FREI0R_FILTER_H__ +#define __GST_FREI0R_FILTER_H__ + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <gst/video/gstvideofilter.h> + +#include "frei0r.h" +#include "gstfrei0r.h" + +G_BEGIN_DECLS + +#define GST_FREI0R_FILTER(obj) \ + ((GstFrei0rFilter *) obj) +#define GST_FREI0R_FILTER_CLASS(klass) \ + ((GstFrei0rFilterClass *) klass) +#define GST_FREI0R_FILTER_GET_CLASS(obj) \ + ((GstFrei0rFilterClass *) g_type_class_peek (G_TYPE_FROM_INSTANCE (obj))) + +typedef struct _GstFrei0rFilter GstFrei0rFilter; +typedef struct _GstFrei0rFilterClass GstFrei0rFilterClass; + +struct _GstFrei0rFilter { + GstVideoFilter parent; + + f0r_instance_t *f0r_instance; + GstFrei0rPropertyValue *property_cache; +}; + +struct _GstFrei0rFilterClass { + GstVideoFilterClass parent; + + f0r_plugin_info_t *info; + GstFrei0rFuncTable *ftable; + + GstFrei0rProperty *properties; + gint n_properties; +}; + +gboolean gst_frei0r_filter_register (GstPlugin *plugin, const f0r_plugin_info_t *info, const GstFrei0rFuncTable *ftable); + +G_END_DECLS + +#endif /* __GST_FREI0R_FILTER_H__ */ diff --git a/gst/frei0r/gstfrei0rmixer.c b/gst/frei0r/gstfrei0rmixer.c new file mode 100644 index 00000000..745c330e --- /dev/null +++ b/gst/frei0r/gstfrei0rmixer.c @@ -0,0 +1,782 @@ +/* GStreamer + * Copyright (C) 2009 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * 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 "gstfrei0r.h" +#include "gstfrei0rmixer.h" + +GST_DEBUG_CATEGORY_EXTERN (frei0r_debug); +#define GST_CAT_DEFAULT frei0r_debug + +typedef struct +{ + f0r_plugin_info_t info; + GstFrei0rFuncTable ftable; +} GstFrei0rMixerClassData; + +static void +gst_frei0r_mixer_reset (GstFrei0rMixer * self) +{ + GstFrei0rMixerClass *klass = GST_FREI0R_MIXER_GET_CLASS (self); + + if (self->f0r_instance) { + klass->ftable->destruct (self->f0r_instance); + self->f0r_instance = NULL; + } + + gst_caps_replace (&self->caps, NULL); + gst_event_replace (&self->newseg_event, NULL); +} + +static void +gst_frei0r_mixer_finalize (GObject * object) +{ + GstFrei0rMixer *self = GST_FREI0R_MIXER (object); + GstFrei0rMixerClass *klass = GST_FREI0R_MIXER_GET_CLASS (object); + + if (self->property_cache) + gst_frei0r_property_cache_free (klass->properties, self->property_cache, + klass->n_properties); + self->property_cache = NULL; + + if (self->collect) + gst_object_unref (self->collect); + self->collect = NULL; + + G_OBJECT_CLASS (g_type_class_peek_parent (klass))->finalize (object); +} + +static void +gst_frei0r_mixer_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstFrei0rMixer *self = GST_FREI0R_MIXER (object); + GstFrei0rMixerClass *klass = GST_FREI0R_MIXER_GET_CLASS (object); + + if (!gst_frei0r_get_property (self->f0r_instance, klass->ftable, + klass->properties, klass->n_properties, self->property_cache, prop_id, + value)) + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); +} + +static void +gst_frei0r_mixer_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstFrei0rMixer *self = GST_FREI0R_MIXER (object); + GstFrei0rMixerClass *klass = GST_FREI0R_MIXER_GET_CLASS (object); + + if (!gst_frei0r_set_property (self->f0r_instance, klass->ftable, + klass->properties, klass->n_properties, self->property_cache, prop_id, + value)) + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); +} + +static GstStateChangeReturn +gst_frei0r_mixer_change_state (GstElement * element, GstStateChange transition) +{ + GstFrei0rMixer *self = GST_FREI0R_MIXER (element); + GstFrei0rMixerClass *klass = GST_FREI0R_MIXER_GET_CLASS (self); + GstStateChangeReturn ret; + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_collect_pads_start (self->collect); + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + break; + default: + break; + } + + /* Stop before calling the parent's state change function as + * GstCollectPads might take locks and we would deadlock in that + * case + */ + if (transition == GST_STATE_CHANGE_PAUSED_TO_READY) + gst_collect_pads_stop (self->collect); + + ret = + GST_ELEMENT_CLASS (g_type_class_peek_parent (klass))->change_state + (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_frei0r_mixer_reset (self); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + + return ret; +} + +static GstCaps * +gst_frei0r_mixer_get_caps (GstPad * pad) +{ + GstFrei0rMixer *self = GST_FREI0R_MIXER (gst_pad_get_parent (pad)); + GstCaps *caps = NULL; + + if (self->caps) { + caps = gst_caps_ref (self->caps); + } else { + GstCaps *tmp, *tmp1; + + tmp = gst_caps_copy (gst_pad_get_pad_template_caps (self->src)); + tmp1 = gst_pad_peer_get_caps (pad); + if (tmp1) { + caps = gst_caps_intersect (tmp, tmp1); + gst_caps_unref (tmp1); + gst_caps_unref (tmp); + } else { + caps = tmp; + } + + tmp = caps; + tmp1 = gst_pad_peer_get_caps (self->sink0); + if (tmp1) { + caps = gst_caps_intersect (tmp, tmp1); + gst_caps_unref (tmp); + gst_caps_unref (tmp1); + } + + tmp = caps; + tmp1 = gst_pad_peer_get_caps (self->sink1); + if (tmp1) { + caps = gst_caps_intersect (tmp, tmp1); + gst_caps_unref (tmp); + gst_caps_unref (tmp1); + } + + if (self->sink2) { + tmp = caps; + tmp1 = gst_pad_peer_get_caps (self->sink2); + if (tmp1) { + caps = gst_caps_intersect (tmp, tmp1); + gst_caps_unref (tmp); + gst_caps_unref (tmp1); + } + } + } + + gst_object_unref (self); + + return caps; +} + +static gboolean +gst_frei0r_mixer_set_caps (GstPad * pad, GstCaps * caps) +{ + GstFrei0rMixer *self = GST_FREI0R_MIXER (gst_pad_get_parent (pad)); + GstFrei0rMixerClass *klass = GST_FREI0R_MIXER_GET_CLASS (self); + gboolean ret = TRUE; + + gst_caps_replace (&self->caps, caps); + + if (pad != self->src) + ret &= gst_pad_set_caps (self->src, caps); + if (pad != self->sink0) + ret &= gst_pad_set_caps (self->sink0, caps); + if (pad != self->sink1) + ret &= gst_pad_set_caps (self->sink1, caps); + if (pad != self->sink2 && self->sink2) + ret &= gst_pad_set_caps (self->sink2, caps); + + if (ret) { + if (!gst_video_format_parse_caps (caps, &self->fmt, &self->width, + &self->height)) { + ret = FALSE; + goto out; + } + + if (self->f0r_instance) { + klass->ftable->destruct (self->f0r_instance); + self->f0r_instance = NULL; + } + + self->f0r_instance = + gst_frei0r_instance_construct (klass->ftable, klass->properties, + klass->n_properties, self->property_cache, self->width, self->height); + + } +out: + + gst_object_unref (self); + + return ret; +} + +static gboolean +gst_frei0r_mixer_src_query_duration (GstFrei0rMixer * self, GstQuery * query) +{ + gint64 min; + gboolean res; + GstFormat format; + GstIterator *it; + gboolean done; + + /* parse format */ + gst_query_parse_duration (query, &format, NULL); + + min = -1; + res = TRUE; + done = FALSE; + + /* Take minimum of all durations */ + it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (self)); + while (!done) { + GstIteratorResult ires; + gpointer item; + + ires = gst_iterator_next (it, &item); + switch (ires) { + case GST_ITERATOR_DONE: + done = TRUE; + break; + case GST_ITERATOR_OK: + { + GstPad *pad = GST_PAD_CAST (item); + gint64 duration; + + /* ask sink peer for duration */ + res &= gst_pad_query_peer_duration (pad, &format, &duration); + /* take min from all valid return values */ + if (res) { + /* valid unknown length, stop searching */ + if (duration == -1) { + min = duration; + done = TRUE; + } + /* else see if smaller than current min */ + else if (duration < min) + min = duration; + } + gst_object_unref (pad); + break; + } + case GST_ITERATOR_RESYNC: + min = -1; + res = TRUE; + gst_iterator_resync (it); + break; + default: + res = FALSE; + done = TRUE; + break; + } + } + gst_iterator_free (it); + + if (res) { + /* and store the min */ + GST_DEBUG_OBJECT (self, "Total duration in format %s: %" + GST_TIME_FORMAT, gst_format_get_name (format), GST_TIME_ARGS (min)); + gst_query_set_duration (query, format, min); + } + + return res; +} + +static gboolean +gst_frei0r_mixer_src_query_latency (GstFrei0rMixer * self, GstQuery * query) +{ + GstClockTime min, max; + gboolean live; + gboolean res; + GstIterator *it; + gboolean done; + + res = TRUE; + done = FALSE; + + live = FALSE; + min = 0; + max = GST_CLOCK_TIME_NONE; + + /* Take maximum of all latency values */ + it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (self)); + while (!done) { + GstIteratorResult ires; + gpointer item; + + ires = gst_iterator_next (it, &item); + switch (ires) { + case GST_ITERATOR_DONE: + done = TRUE; + break; + case GST_ITERATOR_OK: + { + GstPad *pad = GST_PAD_CAST (item); + GstQuery *peerquery; + GstClockTime min_cur, max_cur; + gboolean live_cur; + + peerquery = gst_query_new_latency (); + + /* Ask peer for latency */ + res &= gst_pad_peer_query (pad, peerquery); + + /* take max from all valid return values */ + if (res) { + gst_query_parse_latency (peerquery, &live_cur, &min_cur, &max_cur); + + if (min_cur > min) + min = min_cur; + + if (max_cur != GST_CLOCK_TIME_NONE && + ((max != GST_CLOCK_TIME_NONE && max_cur > max) || + (max == GST_CLOCK_TIME_NONE))) + max = max_cur; + + live = live || live_cur; + } + + gst_query_unref (peerquery); + gst_object_unref (pad); + break; + } + case GST_ITERATOR_RESYNC: + live = FALSE; + min = 0; + max = GST_CLOCK_TIME_NONE; + res = TRUE; + gst_iterator_resync (it); + break; + default: + res = FALSE; + done = TRUE; + break; + } + } + gst_iterator_free (it); + + if (res) { + /* store the results */ + GST_DEBUG_OBJECT (self, "Calculated total latency: live %s, min %" + GST_TIME_FORMAT ", max %" GST_TIME_FORMAT, + (live ? "yes" : "no"), GST_TIME_ARGS (min), GST_TIME_ARGS (max)); + gst_query_set_latency (query, live, min, max); + } + + return res; +} + +static gboolean +gst_frei0r_mixer_src_query (GstPad * pad, GstQuery * query) +{ + GstFrei0rMixer *self = GST_FREI0R_MIXER (gst_pad_get_parent (pad)); + gboolean ret = FALSE; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION: + ret = gst_pad_query (self->sink0, query); + break; + case GST_QUERY_DURATION: + ret = gst_frei0r_mixer_src_query_duration (self, query); + break; + case GST_QUERY_LATENCY: + ret = gst_frei0r_mixer_src_query_latency (self, query); + break; + default: + ret = gst_pad_query_default (pad, query); + break; + } + + gst_object_unref (self); + + return ret; +} + +static gboolean +gst_frei0r_mixer_sink_query (GstPad * pad, GstQuery * query) +{ + GstFrei0rMixer *self = GST_FREI0R_MIXER (gst_pad_get_parent (pad)); + gboolean ret = gst_pad_query (self->src, query); + + gst_object_unref (self); + + return ret; +} + +static gboolean +forward_event_func (GstPad * pad, GValue * ret, GstEvent * event) +{ + gst_event_ref (event); + GST_LOG_OBJECT (pad, "About to send event %s", GST_EVENT_TYPE_NAME (event)); + if (!gst_pad_push_event (pad, event)) { + g_value_set_boolean (ret, FALSE); + GST_WARNING_OBJECT (pad, "Sending event %p (%s) failed.", + event, GST_EVENT_TYPE_NAME (event)); + } else { + GST_LOG_OBJECT (pad, "Sent event %p (%s).", + event, GST_EVENT_TYPE_NAME (event)); + } + gst_object_unref (pad); + return TRUE; +} + +static gboolean +forward_event (GstFrei0rMixer * self, GstEvent * event) +{ + GstIterator *it; + GValue vret = { 0 }; + + GST_LOG_OBJECT (self, "Forwarding event %p (%s)", event, + GST_EVENT_TYPE_NAME (event)); + + g_value_init (&vret, G_TYPE_BOOLEAN); + g_value_set_boolean (&vret, TRUE); + it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (self)); + gst_iterator_fold (it, (GstIteratorFoldFunction) forward_event_func, &vret, + event); + gst_iterator_free (it); + gst_event_unref (event); + + return g_value_get_boolean (&vret); +} + +static gboolean +gst_frei0r_mixer_src_event (GstPad * pad, GstEvent * event) +{ + GstFrei0rMixer *self = GST_FREI0R_MIXER (gst_pad_get_parent (pad)); + gboolean ret = FALSE; + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_QOS: + /* QoS might be tricky */ + ret = FALSE; + break; + case GST_EVENT_SEEK: + { + GstSeekFlags flags; + + /* parse the seek parameters */ + gst_event_parse_seek (event, NULL, NULL, &flags, NULL, NULL, NULL, NULL); + + /* check if we are flushing */ + if (flags & GST_SEEK_FLAG_FLUSH) { + /* make sure we accept nothing anymore and return WRONG_STATE */ + gst_collect_pads_set_flushing (self->collect, TRUE); + + /* flushing seek, start flush downstream, the flush will be done + * when all pads received a FLUSH_STOP. */ + gst_pad_push_event (self->src, gst_event_new_flush_start ()); + } + + ret = forward_event (self, event); + break; + } + case GST_EVENT_NAVIGATION: + /* navigation is rather pointless. */ + ret = FALSE; + break; + default: + /* just forward the rest for now */ + ret = forward_event (self, event); + break; + } + + gst_object_unref (self); + + return ret; +} + +static gboolean +gst_frei0r_mixer_sink0_event (GstPad * pad, GstEvent * event) +{ + GstFrei0rMixer *self = GST_FREI0R_MIXER (gst_pad_get_parent (pad)); + gboolean ret = FALSE; + + GST_DEBUG ("Got %s event on pad %s:%s", GST_EVENT_TYPE_NAME (event), + GST_DEBUG_PAD_NAME (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT: + gst_event_replace (&self->newseg_event, event); + break; + default: + break; + } + + /* now GstCollectPads can take care of the rest, e.g. EOS */ + ret = self->collect_event (pad, event); + + gst_object_unref (self); + + return ret; +} + +static GstFlowReturn +gst_frei0r_mixer_collected (GstCollectPads * pads, GstFrei0rMixer * self) +{ + GstBuffer *inbuf0 = NULL, *inbuf1 = NULL, *inbuf2 = NULL; + GstBuffer *outbuf = NULL; + GstFlowReturn ret = GST_FLOW_OK; + GSList *l; + GstFrei0rMixerClass *klass = GST_FREI0R_MIXER_GET_CLASS (self); + gdouble time; + + if (G_UNLIKELY (!self->f0r_instance)) + return GST_FLOW_NOT_NEGOTIATED; + + if (self->newseg_event) { + gst_pad_push_event (self->src, self->newseg_event); + self->newseg_event = NULL; + } + + if ((ret = + gst_pad_alloc_buffer_and_set_caps (self->src, GST_BUFFER_OFFSET_NONE, + gst_video_format_get_size (self->fmt, self->width, self->height), + GST_PAD_CAPS (self->src), &outbuf)) != GST_FLOW_OK) + return ret; + + for (l = pads->data; l; l = l->next) { + GstCollectData *cdata = l->data; + + if (cdata->pad == self->sink0) + inbuf0 = gst_collect_pads_pop (pads, cdata); + else if (cdata->pad == self->sink1) + inbuf1 = gst_collect_pads_pop (pads, cdata); + else if (cdata->pad == self->sink2) + inbuf2 = gst_collect_pads_pop (pads, cdata); + } + + if (!inbuf0 || !inbuf1 || (!inbuf2 && self->sink2)) + goto eos; + + gst_buffer_copy_metadata (outbuf, inbuf0, + GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS); + time = ((gdouble) GST_BUFFER_TIMESTAMP (outbuf)) / GST_SECOND; + + klass->ftable->update2 (self->f0r_instance, time, + (const guint32 *) GST_BUFFER_DATA (inbuf0), + (const guint32 *) GST_BUFFER_DATA (inbuf1), + (inbuf2) ? (const guint32 *) GST_BUFFER_DATA (inbuf2) : NULL, + (guint32 *) GST_BUFFER_DATA (outbuf)); + + gst_buffer_unref (inbuf0); + gst_buffer_unref (inbuf1); + if (inbuf2) + gst_buffer_unref (inbuf2); + + ret = gst_pad_push (self->src, outbuf); + + return ret; + +eos: + { + GST_DEBUG_OBJECT (self, "no data available, must be EOS"); + gst_buffer_unref (outbuf); + + if (inbuf0) + gst_buffer_unref (inbuf0); + if (inbuf1) + gst_buffer_unref (inbuf1); + if (inbuf2) + gst_buffer_unref (inbuf2); + + gst_pad_push_event (self->src, gst_event_new_eos ()); + return GST_FLOW_UNEXPECTED; + } +} + +static void +gst_frei0r_mixer_class_init (GstFrei0rMixerClass * klass, + GstFrei0rMixerClassData * class_data) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstElementClass *gstelement_class = (GstElementClass *) klass; + GstPadTemplate *templ; + GstCaps *caps; + gchar *author; + + klass->ftable = &class_data->ftable; + klass->info = &class_data->info; + + gobject_class->finalize = gst_frei0r_mixer_finalize; + gobject_class->set_property = gst_frei0r_mixer_set_property; + gobject_class->get_property = gst_frei0r_mixer_get_property; + + klass->n_properties = klass->info->num_params; + klass->properties = g_new0 (GstFrei0rProperty, klass->n_properties); + + gst_frei0r_klass_install_properties (gobject_class, klass->ftable, + klass->properties, klass->n_properties); + + author = + g_strdup_printf + ("Sebastian Dröge <sebastian.droege@collabora.co.uk>, %s", + class_data->info.author); + gst_element_class_set_details_simple (gstelement_class, class_data->info.name, + "Filter/Editor/Video", class_data->info.explanation, author); + g_free (author); + + caps = gst_frei0r_caps_from_color_model (class_data->info.color_model); + + templ = + gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + gst_caps_ref (caps)); + gst_element_class_add_pad_template (gstelement_class, templ); + + templ = + gst_pad_template_new ("sink_0", GST_PAD_SINK, GST_PAD_ALWAYS, + gst_caps_ref (caps)); + gst_element_class_add_pad_template (gstelement_class, templ); + + templ = + gst_pad_template_new ("sink_1", GST_PAD_SINK, GST_PAD_ALWAYS, + gst_caps_ref (caps)); + gst_element_class_add_pad_template (gstelement_class, templ); + + if (klass->info->plugin_type == F0R_PLUGIN_TYPE_MIXER3) { + templ = + gst_pad_template_new ("sink_2", GST_PAD_SINK, GST_PAD_ALWAYS, + gst_caps_ref (caps)); + gst_element_class_add_pad_template (gstelement_class, templ); + } + gst_caps_unref (caps); + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_frei0r_mixer_change_state); +} + +static void +gst_frei0r_mixer_init (GstFrei0rMixer * self, GstFrei0rMixerClass * klass) +{ + self->property_cache = + gst_frei0r_property_cache_init (klass->properties, klass->n_properties); + + self->collect = gst_collect_pads_new (); + gst_collect_pads_set_function (self->collect, + (GstCollectPadsFunction) gst_frei0r_mixer_collected, self); + + self->src = + gst_pad_new_from_template (gst_element_class_get_pad_template + (GST_ELEMENT_CLASS (klass), "src"), "src"); + gst_pad_set_getcaps_function (self->src, + GST_DEBUG_FUNCPTR (gst_frei0r_mixer_get_caps)); + gst_pad_set_setcaps_function (self->src, + GST_DEBUG_FUNCPTR (gst_frei0r_mixer_set_caps)); + gst_pad_set_query_function (self->src, + GST_DEBUG_FUNCPTR (gst_frei0r_mixer_src_query)); + gst_pad_set_event_function (self->src, + GST_DEBUG_FUNCPTR (gst_frei0r_mixer_src_event)); + gst_element_add_pad (GST_ELEMENT_CAST (self), self->src); + + self->sink0 = + gst_pad_new_from_template (gst_element_class_get_pad_template + (GST_ELEMENT_CLASS (klass), "sink_0"), "sink_0"); + gst_pad_set_getcaps_function (self->sink0, + GST_DEBUG_FUNCPTR (gst_frei0r_mixer_get_caps)); + gst_pad_set_setcaps_function (self->sink0, + GST_DEBUG_FUNCPTR (gst_frei0r_mixer_set_caps)); + gst_pad_set_query_function (self->sink0, + GST_DEBUG_FUNCPTR (gst_frei0r_mixer_sink_query)); + gst_collect_pads_add_pad (self->collect, self->sink0, + sizeof (GstCollectData)); + self->collect_event = (GstPadEventFunction) GST_PAD_EVENTFUNC (self->sink0); + gst_pad_set_event_function (self->sink0, + GST_DEBUG_FUNCPTR (gst_frei0r_mixer_sink0_event)); + gst_element_add_pad (GST_ELEMENT_CAST (self), self->sink0); + + self->sink1 = + gst_pad_new_from_template (gst_element_class_get_pad_template + (GST_ELEMENT_CLASS (klass), "sink_1"), "sink_1"); + gst_pad_set_getcaps_function (self->sink1, + GST_DEBUG_FUNCPTR (gst_frei0r_mixer_get_caps)); + gst_pad_set_setcaps_function (self->sink1, + GST_DEBUG_FUNCPTR (gst_frei0r_mixer_set_caps)); + gst_pad_set_query_function (self->sink0, + GST_DEBUG_FUNCPTR (gst_frei0r_mixer_sink_query)); + gst_collect_pads_add_pad (self->collect, self->sink1, + sizeof (GstCollectData)); + gst_element_add_pad (GST_ELEMENT_CAST (self), self->sink1); + + if (klass->info->plugin_type == F0R_PLUGIN_TYPE_MIXER3) { + self->sink2 = + gst_pad_new_from_template (gst_element_class_get_pad_template + (GST_ELEMENT_CLASS (klass), "sink_2"), "sink_2"); + gst_pad_set_getcaps_function (self->sink2, + GST_DEBUG_FUNCPTR (gst_frei0r_mixer_get_caps)); + gst_pad_set_setcaps_function (self->sink2, + GST_DEBUG_FUNCPTR (gst_frei0r_mixer_set_caps)); + gst_pad_set_query_function (self->sink0, + GST_DEBUG_FUNCPTR (gst_frei0r_mixer_sink_query)); + gst_collect_pads_add_pad (self->collect, self->sink2, + sizeof (GstCollectData)); + gst_element_add_pad (GST_ELEMENT_CAST (self), self->sink2); + } + +} + +gboolean +gst_frei0r_mixer_register (GstPlugin * plugin, const f0r_plugin_info_t * info, + const GstFrei0rFuncTable * ftable) +{ + GTypeInfo typeinfo = { + sizeof (GstFrei0rMixerClass), + NULL, + NULL, + (GClassInitFunc) gst_frei0r_mixer_class_init, + NULL, + NULL, + sizeof (GstFrei0rMixer), + 0, + (GInstanceInitFunc) gst_frei0r_mixer_init + }; + GType type; + gchar *type_name, *tmp; + GstFrei0rMixerClassData *class_data; + gboolean ret = FALSE; + + if (ftable->update2 == NULL) + return FALSE; + + tmp = g_strdup_printf ("frei0r-mixer-%s", info->name); + type_name = g_ascii_strdown (tmp, -1); + g_free (tmp); + g_strcanon (type_name, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-+", '-'); + + if (g_type_from_name (type_name)) { + GST_WARNING ("Type '%s' already exists", type_name); + return FALSE; + } + + class_data = g_new0 (GstFrei0rMixerClassData, 1); + memcpy (&class_data->info, info, sizeof (f0r_plugin_info_t)); + memcpy (&class_data->ftable, ftable, sizeof (GstFrei0rFuncTable)); + typeinfo.class_data = class_data; + + type = g_type_register_static (GST_TYPE_ELEMENT, type_name, &typeinfo, 0); + ret = gst_element_register (plugin, type_name, GST_RANK_NONE, type); + + g_free (type_name); + return ret; +} diff --git a/gst/frei0r/gstfrei0rmixer.h b/gst/frei0r/gstfrei0rmixer.h new file mode 100644 index 00000000..548b70ec --- /dev/null +++ b/gst/frei0r/gstfrei0rmixer.h @@ -0,0 +1,75 @@ +/* GStreamer + * Copyright (C) 2009 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * 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_FREI0R_MIXER_H__ +#define __GST_FREI0R_MIXER_H__ + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <gst/base/gstcollectpads.h> + +#include "frei0r.h" +#include "gstfrei0r.h" + +G_BEGIN_DECLS + +#define GST_FREI0R_MIXER(obj) \ + ((GstFrei0rMixer *) obj) +#define GST_FREI0R_MIXER_CLASS(klass) \ + ((GstFrei0rMixerClass *) klass) +#define GST_FREI0R_MIXER_GET_CLASS(obj) \ + ((GstFrei0rMixerClass *) g_type_class_peek (G_TYPE_FROM_INSTANCE (obj))) + +typedef struct _GstFrei0rMixer GstFrei0rMixer; +typedef struct _GstFrei0rMixerClass GstFrei0rMixerClass; + +struct _GstFrei0rMixer { + GstElement parent; + + GstCollectPads *collect; + GstPad *src; + GstPad *sink0, *sink1, *sink2; + + GstCaps *caps; + GstVideoFormat fmt; + gint width, height; + + GstEvent *newseg_event; + + GstPadEventFunction collect_event; + + f0r_instance_t *f0r_instance; + GstFrei0rPropertyValue *property_cache; +}; + +struct _GstFrei0rMixerClass { + GstElementClass parent; + + f0r_plugin_info_t *info; + GstFrei0rFuncTable *ftable; + + GstFrei0rProperty *properties; + gint n_properties; +}; + +gboolean gst_frei0r_mixer_register (GstPlugin *plugin, const f0r_plugin_info_t *info, const GstFrei0rFuncTable *ftable); + +G_END_DECLS + +#endif /* __GST_FREI0R_MIXER_H__ */ diff --git a/gst/frei0r/gstfrei0rsrc.c b/gst/frei0r/gstfrei0rsrc.c new file mode 100644 index 00000000..a713e1e9 --- /dev/null +++ b/gst/frei0r/gstfrei0rsrc.c @@ -0,0 +1,411 @@ +/* GStreamer + * Copyright (C) 2009 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * 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 "gstfrei0r.h" +#include "gstfrei0rsrc.h" + +GST_DEBUG_CATEGORY_EXTERN (frei0r_debug); +#define GST_CAT_DEFAULT frei0r_debug + +typedef struct +{ + f0r_plugin_info_t info; + GstFrei0rFuncTable ftable; +} GstFrei0rSrcClassData; + +static gboolean +gst_frei0r_src_set_caps (GstBaseSrc * src, GstCaps * caps) +{ + GstFrei0rSrc *self = GST_FREI0R_SRC (src); + GstFrei0rSrcClass *klass = GST_FREI0R_SRC_GET_CLASS (src); + + if (!gst_video_format_parse_caps (caps, &self->fmt, &self->width, + &self->height) + || !gst_video_parse_caps_framerate (caps, &self->fps_n, &self->fps_d)) + return FALSE; + + if (self->f0r_instance) { + klass->ftable->destruct (self->f0r_instance); + self->f0r_instance = NULL; + } + + self->f0r_instance = + gst_frei0r_instance_construct (klass->ftable, klass->properties, + klass->n_properties, self->property_cache, self->width, self->height); + + return TRUE; +} + +static GstCaps * +gst_frei0r_src_get_caps (GstBaseSrc * src) +{ + if (GST_PAD_CAPS (GST_BASE_SRC_PAD (src))) + return gst_caps_ref (GST_PAD_CAPS (GST_BASE_SRC_PAD (src))); + else + return + gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SRC_PAD (src))); +} + +static GstFlowReturn +gst_frei0r_src_create (GstPushSrc * src, GstBuffer ** buf) +{ + GstFrei0rSrc *self = GST_FREI0R_SRC (src); + GstFrei0rSrcClass *klass = GST_FREI0R_SRC_GET_CLASS (src); + guint size, newsize; + GstFlowReturn ret = GST_FLOW_OK; + GstBuffer *outbuf = NULL; + gdouble time; + + *buf = NULL; + + if (G_UNLIKELY (!self->f0r_instance)) + return GST_FLOW_NOT_NEGOTIATED; + + newsize = gst_video_format_get_size (self->fmt, self->width, self->height); + + ret = + gst_pad_alloc_buffer_and_set_caps (GST_BASE_SRC_PAD (src), + GST_BUFFER_OFFSET_NONE, newsize, GST_PAD_CAPS (GST_BASE_SRC_PAD (src)), + &outbuf); + if (ret != GST_FLOW_OK) + return ret; + + /* Format might have changed */ + size = GST_BUFFER_SIZE (outbuf); + newsize = gst_video_format_get_size (self->fmt, self->width, self->height); + + if (size != newsize) { + gst_buffer_unref (outbuf); + outbuf = gst_buffer_new_and_alloc (newsize); + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (GST_BASE_SRC_PAD (src))); + } + + GST_BUFFER_TIMESTAMP (outbuf) = + gst_util_uint64_scale (self->n_frames, GST_SECOND * self->fps_d, + self->fps_n); + GST_BUFFER_OFFSET (outbuf) = self->n_frames; + self->n_frames++; + GST_BUFFER_OFFSET_END (outbuf) = self->n_frames; + GST_BUFFER_DURATION (outbuf) = + gst_util_uint64_scale (self->n_frames, GST_SECOND * self->fps_d, + self->fps_n) - GST_BUFFER_TIMESTAMP (outbuf); + + time = ((gdouble) GST_BUFFER_TIMESTAMP (outbuf)) / GST_SECOND; + + if (klass->ftable->update2) + klass->ftable->update2 (self->f0r_instance, time, NULL, NULL, NULL, + (guint32 *) GST_BUFFER_DATA (outbuf)); + else + klass->ftable->update (self->f0r_instance, time, NULL, + (guint32 *) GST_BUFFER_DATA (outbuf)); + + *buf = outbuf; + + return GST_FLOW_OK; +} + +static gboolean +gst_frei0r_src_start (GstBaseSrc * basesrc) +{ + GstFrei0rSrc *self = GST_FREI0R_SRC (basesrc); + + self->n_frames = 0; + + return TRUE; +} + +static gboolean +gst_frei0r_src_stop (GstBaseSrc * basesrc) +{ + GstFrei0rSrc *self = GST_FREI0R_SRC (basesrc); + GstFrei0rSrcClass *klass = GST_FREI0R_SRC_GET_CLASS (basesrc); + + if (self->f0r_instance) { + klass->ftable->destruct (self->f0r_instance); + self->f0r_instance = NULL; + } + + return TRUE; +} + +static gboolean +gst_frei0r_src_is_seekable (GstBaseSrc * psrc) +{ + return TRUE; +} + +static gboolean +gst_frei0r_src_do_seek (GstBaseSrc * bsrc, GstSegment * segment) +{ + GstClockTime time; + GstFrei0rSrc *self = GST_FREI0R_SRC (bsrc); + + segment->time = segment->start; + time = segment->last_stop; + + /* now move to the time indicated */ + if (self->fps_n) { + self->n_frames = gst_util_uint64_scale (time, + self->fps_n, self->fps_d * GST_SECOND); + } else { + self->n_frames = 0; + } + + return TRUE; +} + +static gboolean +gst_frei0r_src_query (GstBaseSrc * bsrc, GstQuery * query) +{ + gboolean res; + GstFrei0rSrc *self = GST_FREI0R_SRC (bsrc); + GstFrei0rSrcClass *klass = GST_FREI0R_SRC_GET_CLASS (self); + + 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 (src_fmt == dest_fmt) { + dest_val = src_val; + goto done; + } + + switch (src_fmt) { + case GST_FORMAT_DEFAULT: + switch (dest_fmt) { + case GST_FORMAT_TIME: + /* frames to time */ + if (self->fps_n) { + dest_val = gst_util_uint64_scale (src_val, + self->fps_d * GST_SECOND, self->fps_n); + } else { + dest_val = 0; + } + break; + default: + goto error; + } + break; + case GST_FORMAT_TIME: + switch (dest_fmt) { + case GST_FORMAT_DEFAULT: + /* time to frames */ + if (self->fps_n) { + dest_val = gst_util_uint64_scale (src_val, + self->fps_n, self->fps_d * GST_SECOND); + } else { + dest_val = 0; + } + break; + default: + goto error; + } + break; + default: + goto error; + } + done: + gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); + res = TRUE; + break; + } + default: + res = + GST_BASE_SRC_CLASS (g_type_class_peek_parent (klass))->query (bsrc, + query); + } + return res; + + /* ERROR */ +error: + { + GST_DEBUG_OBJECT (self, "query failed"); + return FALSE; + } +} + +static void +gst_frei0r_src_src_fixate (GstPad * pad, GstCaps * caps) +{ + GstStructure *structure; + + structure = gst_caps_get_structure (caps, 0); + + gst_structure_fixate_field_nearest_int (structure, "width", 320); + gst_structure_fixate_field_nearest_int (structure, "height", 240); + gst_structure_fixate_field_nearest_fraction (structure, "framerate", 30, 1); +} + +static void +gst_frei0r_src_finalize (GObject * object) +{ + GstFrei0rSrc *self = GST_FREI0R_SRC (object); + GstFrei0rSrcClass *klass = GST_FREI0R_SRC_GET_CLASS (object); + + if (self->f0r_instance) { + klass->ftable->destruct (self->f0r_instance); + self->f0r_instance = NULL; + } + + if (self->property_cache) + gst_frei0r_property_cache_free (klass->properties, self->property_cache, + klass->n_properties); + self->property_cache = NULL; + + G_OBJECT_CLASS (g_type_class_peek_parent (klass))->finalize (object); +} + +static void +gst_frei0r_src_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstFrei0rSrc *self = GST_FREI0R_SRC (object); + GstFrei0rSrcClass *klass = GST_FREI0R_SRC_GET_CLASS (object); + + if (!gst_frei0r_get_property (self->f0r_instance, klass->ftable, + klass->properties, klass->n_properties, self->property_cache, prop_id, + value)) + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); +} + +static void +gst_frei0r_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstFrei0rSrc *self = GST_FREI0R_SRC (object); + GstFrei0rSrcClass *klass = GST_FREI0R_SRC_GET_CLASS (object); + + if (!gst_frei0r_set_property (self->f0r_instance, klass->ftable, + klass->properties, klass->n_properties, self->property_cache, prop_id, + value)) + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); +} + +static void +gst_frei0r_src_class_init (GstFrei0rSrcClass * klass, + GstFrei0rSrcClassData * class_data) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstElementClass *gstelement_class = (GstElementClass *) klass; + GstPushSrcClass *gstpushsrc_class = (GstPushSrcClass *) klass; + GstBaseSrcClass *gstbasesrc_class = (GstBaseSrcClass *) klass; + GstPadTemplate *templ; + GstCaps *caps; + gchar *author; + + klass->ftable = &class_data->ftable; + klass->info = &class_data->info; + + gobject_class->finalize = gst_frei0r_src_finalize; + gobject_class->set_property = gst_frei0r_src_set_property; + gobject_class->get_property = gst_frei0r_src_get_property; + + klass->n_properties = klass->info->num_params; + klass->properties = g_new0 (GstFrei0rProperty, klass->n_properties); + + gst_frei0r_klass_install_properties (gobject_class, klass->ftable, + klass->properties, klass->n_properties); + + author = + g_strdup_printf + ("Sebastian Dröge <sebastian.droege@collabora.co.uk>, %s", + class_data->info.author); + gst_element_class_set_details_simple (gstelement_class, class_data->info.name, + "Src/Video", class_data->info.explanation, author); + g_free (author); + + caps = gst_frei0r_caps_from_color_model (class_data->info.color_model); + + templ = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, caps); + gst_element_class_add_pad_template (gstelement_class, templ); + + gstbasesrc_class->set_caps = gst_frei0r_src_set_caps; + gstbasesrc_class->get_caps = gst_frei0r_src_get_caps; + gstbasesrc_class->is_seekable = gst_frei0r_src_is_seekable; + gstbasesrc_class->do_seek = gst_frei0r_src_do_seek; + gstbasesrc_class->query = gst_frei0r_src_query; + gstbasesrc_class->start = gst_frei0r_src_start; + gstbasesrc_class->stop = gst_frei0r_src_stop; + + gstpushsrc_class->create = GST_DEBUG_FUNCPTR (gst_frei0r_src_create); +} + +static void +gst_frei0r_src_init (GstFrei0rSrc * self, GstFrei0rSrcClass * klass) +{ + GstPad *pad = GST_BASE_SRC_PAD (self); + + self->property_cache = + gst_frei0r_property_cache_init (klass->properties, klass->n_properties); + + gst_pad_set_fixatecaps_function (pad, gst_frei0r_src_src_fixate); + + gst_base_src_set_format (GST_BASE_SRC_CAST (self), GST_FORMAT_TIME); +} + +gboolean +gst_frei0r_src_register (GstPlugin * plugin, const f0r_plugin_info_t * info, + const GstFrei0rFuncTable * ftable) +{ + GTypeInfo typeinfo = { + sizeof (GstFrei0rSrcClass), + NULL, + NULL, + (GClassInitFunc) gst_frei0r_src_class_init, + NULL, + NULL, + sizeof (GstFrei0rSrc), + 0, + (GInstanceInitFunc) gst_frei0r_src_init + }; + GType type; + gchar *type_name, *tmp; + GstFrei0rSrcClassData *class_data; + gboolean ret = FALSE; + + tmp = g_strdup_printf ("frei0r-src-%s", info->name); + type_name = g_ascii_strdown (tmp, -1); + g_free (tmp); + g_strcanon (type_name, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-+", '-'); + + if (g_type_from_name (type_name)) { + GST_WARNING ("Type '%s' already exists", type_name); + return FALSE; + } + + class_data = g_new0 (GstFrei0rSrcClassData, 1); + memcpy (&class_data->info, info, sizeof (f0r_plugin_info_t)); + memcpy (&class_data->ftable, ftable, sizeof (GstFrei0rFuncTable)); + typeinfo.class_data = class_data; + + type = g_type_register_static (GST_TYPE_PUSH_SRC, type_name, &typeinfo, 0); + ret = gst_element_register (plugin, type_name, GST_RANK_NONE, type); + + g_free (type_name); + return ret; +} diff --git a/gst/frei0r/gstfrei0rsrc.h b/gst/frei0r/gstfrei0rsrc.h new file mode 100644 index 00000000..291a644b --- /dev/null +++ b/gst/frei0r/gstfrei0rsrc.h @@ -0,0 +1,69 @@ +/* GStreamer + * Copyright (C) 2009 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * 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_FREI0R_SRC_H__ +#define __GST_FREI0R_SRC_H__ + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <gst/base/gstpushsrc.h> + +#include "frei0r.h" +#include "gstfrei0r.h" + +G_BEGIN_DECLS + +#define GST_FREI0R_SRC(obj) \ + ((GstFrei0rSrc *) obj) +#define GST_FREI0R_SRC_CLASS(klass) \ + ((GstFrei0rSrcClass *) klass) +#define GST_FREI0R_SRC_GET_CLASS(obj) \ + ((GstFrei0rSrcClass *) g_type_class_peek (G_TYPE_FROM_INSTANCE (obj))) + +typedef struct _GstFrei0rSrc GstFrei0rSrc; +typedef struct _GstFrei0rSrcClass GstFrei0rSrcClass; + +struct _GstFrei0rSrc { + GstPushSrc parent; + + f0r_instance_t *f0r_instance; + GstFrei0rPropertyValue *property_cache; + + GstVideoFormat fmt; + gint width, height; + gint fps_n, fps_d; + + guint64 n_frames; +}; + +struct _GstFrei0rSrcClass { + GstPushSrcClass parent; + + f0r_plugin_info_t *info; + GstFrei0rFuncTable *ftable; + + GstFrei0rProperty *properties; + gint n_properties; +}; + +gboolean gst_frei0r_src_register (GstPlugin *plugin, const f0r_plugin_info_t *info, const GstFrei0rFuncTable *ftable); + +G_END_DECLS + +#endif /* __GST_FREI0R_SRC_H__ */ diff --git a/gst/hdvparse/Makefile.am b/gst/hdvparse/Makefile.am index d7eb4d28..a77d5387 100644 --- a/gst/hdvparse/Makefile.am +++ b/gst/hdvparse/Makefile.am @@ -7,7 +7,7 @@ noinst_HEADERS = \ gsthdvparse.h libgsthdvparse_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) -libgsthdvparse_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) +libgsthdvparse_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) $(LIBM) libgsthdvparse_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgsthdvparse_la_LIBTOOLFLAGS = --tag=disable-static diff --git a/gst/hdvparse/gsthdvparse.c b/gst/hdvparse/gsthdvparse.c index 9914cfa2..8114f3b8 100644 --- a/gst/hdvparse/gsthdvparse.c +++ b/gst/hdvparse/gsthdvparse.c @@ -35,6 +35,8 @@ #include "config.h" #endif +#include <math.h> + #include <gst/gst.h> #include <gst/base/gstbasetransform.h> @@ -55,90 +57,25 @@ enum PROP_0, }; -static gchar *aperture_table[] = { - "???", - "cls", - "1.0", - "1.2", - "1.4", - "1.6", - "1.7", - "1.8", - "2.0", - "2.2", - "2.4", - "2.6", - "2.8", - "3.1", - "3.4", - "3.7", - "4.0", - "4.4", - "4.8", - "5.2", - "5.6", - "6.2", - "6.8", - "7.3", - "8.0", - "8.7", - "9.6", - "10", - "11", - "12", - "14", - "14", - "16", - "17", - "18", - "6.7" -}; -/* Observations from my HDV Camera (Canon HV20 Pal) - * FIXME : replace with with code once we've figured out the algorithm. - * Shutter speed 0x4f 0x50 - * ------------------------------------ - * 1/6 F3 95 - * 1/8 90 91 - * 1/12 FA 8A - * 1/15 C8 88 - * 1/24 7D 85 - * 1/30 64 84 - * 1/48 BE 82 - * 1/60 32 82 - * 1/100 51 81 - * 1/250 87 80 - * 1/500 43 80 - * 1/1000 22 80 - * 1/2000 11 80 - */ -typedef struct -{ - guint vala, valb, shutter; -} Shutter_t; - -static Shutter_t shutter_table[] = { - {0xf3, 0x95, 6}, - {0x90, 0x91, 8}, - {0xfa, 0x8a, 12}, - {0xc8, 0x88, 15}, - {0x7d, 0x85, 24}, - {0x64, 0x84, 30}, - {0xbe, 0x82, 48}, - {0x32, 0x82, 60}, - {0x51, 0x81, 100}, - {0x87, 0x80, 250}, - {0x43, 0x80, 500}, - {0x22, 0x80, 1000}, - {0x11, 0x80, 2000} -}; + +#define CLOCK_BASE 9LL +#define CLOCK_FREQ (CLOCK_BASE * 10000) + +#define MPEGTIME_TO_GSTTIME(time) (gst_util_uint64_scale ((time), \ + GST_MSECOND/10, CLOCK_BASE)) +#define GSTTIME_TO_MPEGTIME(time) (gst_util_uint64_scale ((time), \ + CLOCK_BASE, GST_MSECOND/10)) + +/* If set to 1, then extra validation will be applied to check + * for complete spec compliance wherever applicable. */ +#define VALIDATE 0 /* Binary-coded decimal reading macro */ #define BCD(c) ( ((((c) >> 4) & 0x0f) * 10) + ((c) & 0x0f) ) /* Same as before, but with a mask */ #define BCD_M(c, mask) (BCD ((c) & (mask))) - /* the capabilities of the inputs and outputs. * * describe the real formats here. @@ -146,13 +83,14 @@ static Shutter_t shutter_table[] = { static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("private/hdv-a1") + GST_STATIC_CAPS ("hdv/aux-v;hdv/aux-a") ); static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("private/hdv-a1,parsed=(boolean)True") + GST_STATIC_CAPS + ("hdv/aux-v,parsed=(boolean)True;hdv/aux-a,parsed=(boolean)True") ); /* debug category for fltering log messages @@ -167,6 +105,8 @@ GST_BOILERPLATE_FULL (GstHDVParse, gst_hdvparse, GstBaseTransform, static GstFlowReturn gst_hdvparse_transform_ip (GstBaseTransform * base, GstBuffer * outbuf); +static GstCaps *gst_hdvparse_transform_caps (GstBaseTransform * trans, + GstPadDirection dir, GstCaps * incaps); /* GObject vmethod implementations */ @@ -194,6 +134,8 @@ gst_hdvparse_class_init (GstHDVParseClass * klass) { GST_BASE_TRANSFORM_CLASS (klass)->transform_ip = GST_DEBUG_FUNCPTR (gst_hdvparse_transform_ip); + GST_BASE_TRANSFORM_CLASS (klass)->transform_caps = + GST_DEBUG_FUNCPTR (gst_hdvparse_transform_caps); } /* initialize the new element @@ -208,123 +150,714 @@ gst_hdvparse_init (GstHDVParse * filter, GstHDVParseClass * klass) gst_base_transform_set_passthrough (transform, TRUE); } -static guint -get_shutter_speed (guint8 vala, guint8 valb) +static GstCaps * +gst_hdvparse_transform_caps (GstBaseTransform * trans, GstPadDirection dir, + GstCaps * incaps) { - guint i; + GstCaps *res = NULL; + GstStructure *st = gst_caps_get_structure (incaps, 0); - for (i = 0; i < G_N_ELEMENTS (shutter_table); i++) - if (shutter_table[i].vala == vala && shutter_table[i].valb == valb) - return shutter_table[i].shutter; - GST_WARNING ("Unknown shutter speed ! vala:0x%02x, valb:0x%02x", vala, valb); - return 0; + GST_WARNING_OBJECT (trans, "dir:%d, incaps:%" GST_PTR_FORMAT, dir, incaps); + + if (dir == GST_PAD_SINK) { + res = gst_caps_new_simple (gst_structure_get_name (st), + "parsed", G_TYPE_BOOLEAN, TRUE, NULL); + } else { + res = gst_caps_new_simple (gst_structure_get_name (st), NULL); + } + + return res; } -static void -gst_hdvparse_parse (GstHDVParse * filter, GstBuffer * buf) + +static inline const gchar * +sfr_to_framerate (guint8 sfr) { - guint8 *data = GST_BUFFER_DATA (buf); - guint apertured, shutter; - gfloat gain; - gboolean dst = FALSE; - GstStructure *str; - GstMessage *msg; - - GST_MEMDUMP_OBJECT (filter, "BUFFER", data, GST_BUFFER_SIZE (buf)); - - str = gst_structure_empty_new ("HDV"); - - /* 0x1f - 0x23 : TimeCode */ - - if (data[0x1f] != 0xff) { - guint8 tframe, tsec, tmin, thour; - gchar *timecode = NULL; - tframe = BCD (data[0x1f] & 0x3f); - tsec = BCD (data[0x20] & 0x7f); - tmin = BCD (data[0x21] & 0x7f); - thour = BCD (data[0x22] & 0x3f); - - timecode = - g_strdup_printf ("%01d:%02d:%02d.%02d", thour, tmin, tsec, tframe); - gst_structure_set (str, "timecode", G_TYPE_STRING, timecode, NULL); - g_free (timecode); - GST_LOG_OBJECT (filter, timecode); + switch (sfr) { + case 4: + return "30000/1001"; + case 3: + return "25/1"; + case 1: + return "24000/1001"; + default: + return "RESERVED"; } +} - /* 0x23 : Timezone / Dailight Saving Time */ - /* 0x24 - 0x2a : Original time */ - if (data[0x23] != 0xff) { - GDate *date = NULL; - guint tzone = 0; - guint day, month, year, hour, min, sec; - gchar *datetime; - - tzone = data[0x23]; - dst = !(tzone & 0x80); - tzone = - BCD (tzone & 0x1f) > 12 ? BCD (tzone & 0x1f) - 12 : BCD (tzone & 0x1f); - GST_LOG_OBJECT (filter, "TimeZone : %d, DST : %d", tzone, dst); - - day = BCD_M (data[0x24], 0x3f); - month = BCD_M (data[0x25], 0x1f); - year = BCD (data[0x26]); - if (year > 90) - year += 1900; - else - year += 2000; - /* 0x27: ??? */ - sec = BCD_M (data[0x28], 0x7f); - min = BCD_M (data[0x29], 0x7f); - hour = BCD_M (data[0x2a], 0x3f); - - /* FIXME : we need a date/time object ! */ - date = g_date_new_dmy (day, month, year); - datetime = - g_strdup_printf ("%02d/%02d/%02d %02d:%02d:%02d", day, month, year, - hour, min, sec); - gst_structure_set (str, "date", GST_TYPE_DATE, date, "recording-time", - G_TYPE_STRING, datetime, NULL); - g_free (datetime); - GST_LOG_OBJECT (filter, datetime); +static GstFlowReturn +parse_dv_multi_pack (GstHDVParse * filter, guint8 * data, guint64 size, + GstStructure * st) +{ + guint64 offs = 1; + + while (size / 5) { + GST_LOG ("DV pack 0x%x", data[offs]); + switch (data[offs]) { + case 0x70:{ + guint8 irispos, ae, agc, wbmode, whitebal, focusmode, focuspos; + + irispos = data[offs + 1] & 0x3f; + ae = data[offs + 2] >> 4; + agc = data[offs + 2] & 0xf; + wbmode = data[offs + 3] >> 5; + whitebal = data[offs + 3] & 0x1f; + focusmode = data[offs + 4] >> 7; + focuspos = data[offs + 4] & 0x7f; + + GST_LOG (" Consumer Camera 1"); + + GST_LOG (" Iris position %d (0x%x)", irispos, irispos); + /* Iris position = 2 ^ (IP/8) (for 0 < IP < 0x3C) */ + if (irispos < 0x3c) { + GST_LOG (" IRIS F%0.2f", powf (2.0, (((float) irispos) / 8.0))); + gst_structure_set (st, "aperture-fnumber", G_TYPE_FLOAT, + powf (2.0, (((float) irispos) / 8.0)), NULL); + } else if (irispos == 0x3d) { + GST_LOG (" IRIS < 1.0"); + } else if (irispos == 0x3e) { + GST_LOG (" IRIS closed"); + } + + /* AE Mode: + * 0 : Full automatic + * 1 : Gain Priority mode + * 2 : Shutter Priority mode + * 3 : Iris priority mode + * 4 : Manual + * ..: Reserved + * F : No information */ + GST_LOG (" AE Mode: %d (0x%x)", ae, ae); + + GST_LOG (" AGC: %d (0x%x)", agc, agc); + if (agc < 0xd) { + /* This is what the spec says.. but I'm not seeing the same on my camera :( */ + GST_LOG (" Gain:%02.2fdB", (agc * 3.0) - 3.0); + gst_structure_set (st, "gain", G_TYPE_FLOAT, (agc * 3.0) - 3.0, NULL); + } + /* White balance mode + * 0 : Automatic + * 1 : hold + * 2 : one push + * 3 : pre-set + * 7 : no-information */ + if (wbmode != 7) + GST_LOG (" White balance mode : %d (0x%x)", wbmode, wbmode); + /* White balance + * 0 : Candle + * 1 : Incandescent lamp + * 2 : low color temperature fluorescent lamp + * 3 : high color temperature fluorescent lamp + * 4 : sunlight + * 5 : cloudy weather + * F : No information + */ + if (whitebal != 0xf) + GST_LOG (" White balance : %d (0x%x)", whitebal, whitebal); + if (focuspos != 0x7f) { + GST_LOG (" Focus mode : %s", focusmode ? "MANUAL" : "AUTOMATIC"); + GST_LOG (" Focus position: %d (0x%x)", focuspos, focuspos); + } + } + break; + case 0x71:{ + guint8 v_pan, h_pan, focal_length, e_zoom; + gboolean is, zen; + + v_pan = data[offs + 1] & 0x3f; + is = data[offs + 2] >> 7; + h_pan = data[offs + 2] & 0x7f; + focal_length = data[offs + 3]; + zen = data[offs + 4] >> 7; + e_zoom = data[offs + 4] & 0x7f; + + GST_LOG (" Consumer Camera 2"); + if (v_pan != 0x3f) + GST_LOG (" Vertical Panning : %d (0x%d)", v_pan, v_pan); + if (h_pan != 0x7f) + GST_LOG (" Horizontal Panning : %d (0x%d)", h_pan, h_pan); + GST_LOG (" Stabilizer : %s", is ? "OFF" : "ON"); + if (focal_length != 0xff) + GST_LOG (" Focal Length : %f mm", + (focal_length & 0x7f) * pow (10, focal_length & 0x80)); + if (zen == 0) + GST_LOG (" Electric Zoom %02dd.%03d", e_zoom >> 5, e_zoom & 0x1f); + } + break; + case 0x7f:{ + guint16 speed; + guint16 speedint; + + GST_LOG (" Shutter"); + if (data[offs + 1] != 0xff) + GST_LOG (" Shutter Speed (1) : %d, 0x%x", + data[offs + 1], data[offs + 1]); + if (data[offs + 2] != 0xff) + GST_LOG (" Shutter Speed (1) : %d, 0x%x", + data[offs + 2], data[offs + 2]); + + speed = data[offs + 3] | (data[offs + 4] & 0x7f) << 8; + + /* The shutter speed is 1/(CSS * horizontal scanning period) */ + /* FIXME : 34000 is a value interpolated by observations */ + speedint = (int) (34000.0 / (float) speed); + /* Only the highest two decimal digits are valid */ + if (speedint > 100) + speedint = speedint / 10 * 10; + + GST_LOG (" Shutter speed : 1/%d", speedint); + gst_structure_set (st, "shutter-speed", GST_TYPE_FRACTION, + 1, speedint, NULL); + } + break; + default: + GST_MEMDUMP ("Unknown pack", data + offs, 5); + break; + } + size -= 5; + offs += 5; } + return GST_FLOW_OK; +} - /* 0x2b : Various flags, including scene-change */ - if (!((data[0x2b] & 0x20) >> 5)) { - GST_LOG_OBJECT (filter, "Scene change !"); - gst_structure_set (str, "scene-change", G_TYPE_BOOLEAN, TRUE, NULL); +static GstFlowReturn +parse_video_frame (GstHDVParse * filter, guint8 * data, guint64 size, + GstStructure * st) +{ + guint32 etn, bitrate; + guint8 nbframes, data_h, hdr_size, sfr, sdm; + guint8 aspect, framerate, profile, level, format, chroma; + guint8 gop_n, gop_m, cgms, recst, abst; + guint16 vbv_delay, width, height, vbv_buffer; + guint64 dts; + gboolean pf, tf, rf; + + GST_LOG_OBJECT (filter, "Video Frame Pack"); + + /* Byte | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | + * --------------------------------- + * 0 | Size (0x39) | + * --------------------------------- + * 1 | | + * 2 | ETN | + * 3 | | + * --------------------------------- + */ + + if (data[0] != 0x39) { + GST_WARNING ("Invalid size for Video frame"); + return GST_FLOW_ERROR; + } + etn = data[3] << 16 | data[2] << 8 | data[1]; + + GST_LOG_OBJECT (filter, " ETN : %" G_GUINT32_FORMAT, etn); + + /* Pack-V Information + * --------------------------------- + * 4 | Number of Video Frames | + * --------------------------------- + * 5 | 0 | 0 | 0 | 0 | DATA-H | + * --------------------------------- + * 6 | VBV | + * 7 | DELAY | + * --------------------------------- + * 8 | HEADER SIZE | + * --------------------------------- + * 9 | | + * 10 | DTS | + * 11 | | + * 12 | | + * ----------------------------- | + * 13 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | + * --------------------------------- + * 14 |PF |TF |RF | 0 | SFR | + * --------------------------------- + */ + + nbframes = data[4]; + + if (VALIDATE && (data[5] >> 4)) + return GST_FLOW_ERROR; + data_h = data[5] & 0xf; + + vbv_delay = data[6] | data[7] << 8; + + hdr_size = data[8]; + + dts = data[9] | data[10] << 8 | data[11] << 16 | data[12] << 24; + dts |= (guint64) (data[13] & 0x1) << 32; + if (G_UNLIKELY (VALIDATE && (data[13] & 0xfe))) { + return GST_FLOW_ERROR; } - /* Check for partials */ - if (GST_BUFFER_SIZE (buf) < 0x50) { - goto beach; + pf = data[14] & 0x80; + tf = data[14] & 0x40; + rf = data[14] & 0x20; + if (G_UNLIKELY (VALIDATE && (data[14] & 0x10))) + return GST_FLOW_ERROR; + + sfr = data[14] & 0x07; + + GST_LOG_OBJECT (filter, " Pack-V Information"); + GST_LOG_OBJECT (filter, " Number of Video Frames : %d", nbframes); + GST_LOG_OBJECT (filter, " Leading PES-V picture type %s (0x%x)", + (data_h == 0x1) ? "I-picture" : "other", data_h); + GST_LOG_OBJECT (filter, " VBV Delay of first frame: %" G_GUINT32_FORMAT, + vbv_delay); + GST_LOG_OBJECT (filter, " Header Size:%d", hdr_size); + GST_LOG_OBJECT (filter, " DTS: %" GST_TIME_FORMAT " (%" G_GUINT64_FORMAT ")", + GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (dts)), dts); + GST_LOG_OBJECT (filter, " Video source : %s %s %s (0x%x 0x%x 0x%x)", + pf ? "Progressive" : "Interlaced", + tf ? "TFF" : "", rf ? "RFF" : "", pf, tf, rf); + GST_LOG_OBJECT (filter, " Source Frame Rate : %s (0x%x)", + sfr_to_framerate (sfr), sfr); + + gst_structure_set (st, "DTS", G_TYPE_UINT64, MPEGTIME_TO_GSTTIME (dts), + "interlaced", G_TYPE_BOOLEAN, !pf, NULL); + + /* Search Data Mode + * --------------------------------- + * 15 | Search Data Mode | + * --------------------------------- + */ + sdm = data[15]; + GST_LOG_OBJECT (filter, " Search Data Mode : 0x%x", sdm); + GST_LOG_OBJECT (filter, " %s %s %s", + sdm & 0x2 ? "8x-Base" : "", + sdm & 0x4 ? "8x-Helper" : "", sdm & 0x10 ? "24x" : ""); + + /* Video Mode + * --------------------------------- + * 16 | Horizontal size | + * ----------------- | + * 17 | 0 | 0 | 0 | 0 | | + * --------------------------------- + * 18 | Vertical size | + * ----------------- | + * 19 | 0 | 0 | 0 | 0 | | + * --------------------------------- + * 20 | Aspect ratio | Frame Rate | + * --------------------------------- + * 21 | | + * 22 | bitrate | + * ------------------------- | + * 23 | 0 | 0 | 0 | 0 | 0 | 0 | | + * --------------------------------- + * 24 | VBV Buffer size | + * ------------------------- | + * 25 | 0 | 0 | 0 | 0 | 0 | 0 | | + * --------------------------------- + * 26 | 0 | Profile | Level | + * --------------------------------- + * 27 | 0 | Format |Chroma | 0 | 0 | + * --------------------------------- + * 28 | GOP N | GOP M | + * --------------------------------- + */ + width = data[16] | (data[17] & 0xf) << 8; + height = data[18] | (data[19] & 0xf) << 8; + if (VALIDATE && ((data[17] & 0xf0) || data[19] & 0xf0)) + return GST_FLOW_ERROR; + aspect = data[20] >> 4; + framerate = data[20] & 0xf; + bitrate = data[21] | data[22] << 8 | (data[23] & 0x3) << 16; + if (VALIDATE && (data[23] & 0xfc)) + return GST_FLOW_ERROR; + vbv_buffer = data[24] | (data[25] & 0x3) << 8; + if (VALIDATE && (data[25] & 0xfc)) + return GST_FLOW_ERROR; + profile = (data[26] >> 4) & 0x7; + level = data[26] & 0xf; + format = (data[27] >> 4) & 0x7; + chroma = (data[27] >> 2) & 0x3; + gop_n = data[28] >> 3; + gop_m = data[28] & 0x7; + + GST_LOG_OBJECT (filter, " Video Mode"); + GST_LOG_OBJECT (filter, " width:%d, height:%d", width, height); + GST_LOG_OBJECT (filter, " Aspect Ratio : %s (0x%x)", + (aspect == 0x3) ? "16/9" : "RESERVED", aspect); + GST_LOG_OBJECT (filter, " Framerate: %s (0x%x)", + sfr_to_framerate (framerate), framerate); + GST_LOG_OBJECT (filter, " Bitrate: %d bit/s", bitrate * 400); + GST_LOG_OBJECT (filter, " VBV buffer Size : %d bits", + vbv_buffer * 16 * 1024); + GST_LOG_OBJECT (filter, " MPEG Profile : %s (0x%x)", + (profile == 0x4) ? "Main" : "RESERVED", profile); + GST_LOG_OBJECT (filter, " MPEG Level : %s (0x%x)", + (level == 0x6) ? "High-1440" : "RESERVED", level); + GST_LOG_OBJECT (filter, " Video format : %s (0x%x)", + (format == 0) ? "Component" : "Reserved", format); + GST_LOG_OBJECT (filter, " Chroma : %s (0x%x)", + (chroma == 0x1) ? "4:2:0" : "RESERVED", chroma); + GST_LOG_OBJECT (filter, " GOP N/M : %d / %d", gop_n, gop_m); + + /* data availability + * --------------------------------- + * 29 | 0 | 0 | 0 | 0 | 0 |PE2|PE1|PE0| + * --------------------------------- + * PE0 : HD2 TTC is valid + * PE1 : REC DATE is valid + * PE2 : REC TIME is valid + */ + if (data[29] & 0x1) { + guint8 fr, sec, min, hr; + gboolean bf, df; + gchar *ttcs; + + /* HD2 TTC + * --------------------------------- + * 30 |BF |DF |Tens Fr|Units of Frames| + * --------------------------------- + * 31 | 1 |Tens second|Units of Second| + * --------------------------------- + * 32 | 1 |Tens minute|Units of Minute| + * --------------------------------- + * 33 | 1 | 1 |Tens Hr|Units of Hours | + * --------------------------------- + */ + bf = data[30] >> 7; + df = (data[30] >> 6) & 0x1; + fr = BCD (data[30] & 0x3f); + sec = BCD (data[31] & 0x7f); + min = BCD (data[32] & 0x7f); + hr = BCD (data[33] & 0x3f); + GST_LOG_OBJECT (filter, " HD2 Title Time Code"); + GST_LOG_OBJECT (filter, " BF:%d, Drop Frame:%d", bf, df); + ttcs = g_strdup_printf ("%02d:%02d:%02d.%02d", hr, min, sec, fr); + GST_LOG_OBJECT (filter, " Timecode %s", ttcs); + /* FIXME : Use framerate information from above to convert to GstClockTime */ + gst_structure_set (st, "title-time-code", G_TYPE_STRING, ttcs, NULL); + g_free (ttcs); + } - /* 0x43 : Aperture */ - apertured = data[0x43] & 0x3f; - if (apertured < 35) { - GST_LOG_OBJECT (filter, "Aperture : F%s", aperture_table[apertured]); - gst_structure_set (str, "aperture", G_TYPE_STRING, - aperture_table[apertured], NULL); - } else { - GST_LOG_OBJECT (filter, "Aperture : %d", apertured); + if (data[29] & 0x2) { + gboolean ds, tm; + guint8 tz, day, dow, month, year; + GDate *date; + + /* REC DATE + * --------------------------------- + * 34 |DS |TM |Tens TZ|Units of TimeZn| + * --------------------------------- + * 35 | 1 | 1 |Tens dy| Units of Days | + * --------------------------------- + * 36 | Week |TMN|Units of Months| + * --------------------------------- + * 37 | Tens of Years |Units of Years | + * --------------------------------- + */ + ds = data[32] >> 7; + tm = (data[32] >> 6) & 0x1; + tz = BCD (data[32] & 0x3f); + day = BCD (data[35] & 0x3f); + dow = data[36] >> 5; + month = BCD (data[36] & 0x1f); + year = BCD (data[37]); + + GST_LOG_OBJECT (filter, " REC DATE"); + GST_LOG_OBJECT (filter, " ds:%d, tm:%d", ds, tm); + GST_LOG_OBJECT (filter, " Timezone: %d", tz); + GST_LOG_OBJECT (filter, " Date: %d %02d/%02d/%04d", dow, day, month, year); + date = g_date_new_dmy (day, month, year); + gst_structure_set (st, "date", GST_TYPE_DATE, date, + "timezone", G_TYPE_INT, tz, + "daylight-saving", G_TYPE_BOOLEAN, ds, NULL); + g_date_free (date); + } + + if (data[29] & 0x4) { + guint8 fr, sec, min, hr; + gchar *times; + + /* REC TIME + * --------------------------------- + * 38 | 1 | 1 |Tens Fr|Units of Frames| + * --------------------------------- + * 39 | 1 |Tens second|Units of Second| + * --------------------------------- + * 40 | 1 |Tens minute|Units of Minute| + * --------------------------------- + * 41 | 1 | 1 |Tens Hr|Units of Hours | + * --------------------------------- + */ + fr = BCD (data[38] & 0x3f); + sec = BCD (data[39] & 0x7f); + min = BCD (data[40] & 0x7f); + hr = BCD (data[41] & 0x3f); + times = g_strdup_printf ("%02d:%02d:%02d", hr, min, sec); + GST_LOG_OBJECT (filter, " REC TIME %02d:%02d:%02d.%02d", hr, min, sec, fr); + gst_structure_set (st, "time", G_TYPE_STRING, times, NULL); + g_free (times); + } + + /* MISC + * --------------------------------- + * 42 | CGMS |REC|ABS| 0 | 0 | 0 | 0 | + * --------------------------------- + */ + cgms = data[42] >> 6; + recst = (data[42] >> 5) & 0x1; + abst = (data[42] >> 4) & 0x1; + + GST_LOG_OBJECT (filter, " CGMS:0x%x", cgms); + GST_LOG_OBJECT (filter, " Recording Start Point : %s", + (recst == 0) ? "PRESENT" : "ABSENT"); + GST_LOG_OBJECT (filter, " ABST : %s", + (abst == 0) ? "DISCONTINUITY" : "NO DISCONTINUITY"); + + gst_structure_set (st, "recording-start-point", G_TYPE_BOOLEAN, !recst, NULL); + + /* Extended DV Pack #1 + * 43 - 47 + */ + GST_LOG_OBJECT (filter, " Extended DV Pack #1 : 0x%x", data[43]); + + /* Extended DV Pack #1 + * 48 - 52 + */ + GST_LOG_OBJECT (filter, " Extended DV Pack #2 : 0x%x", data[48]); + + /* Extended DV Pack #1 + * 53 - 57 + */ + GST_LOG_OBJECT (filter, " Extended DV Pack #3 : 0x%x", data[53]); + + return GST_FLOW_OK; + +} + +static GstFlowReturn +parse_audio_frame (GstHDVParse * filter, guint8 * data, guint64 size, + GstStructure * st) +{ + guint32 etn; + guint8 nbmute, nbaau; + guint64 pts; + guint16 audio_comp; + guint8 bitrate, fs, compress, channel; + guint8 option, cgms; + gboolean acly, recst; + + GST_LOG_OBJECT (filter, "Audio Frame Pack"); + + /* Byte | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | + * --------------------------------- + * 0 | Size (0x0f) | + * --------------------------------- + * 1 | | + * 2 | ETN | + * 3 | | + * --------------------------------- + * 4 |Nb Audio Mute | Number of AAU | + * --------------------------------- + */ + + if (data[0] != 0x0f) { + GST_WARNING ("Invalid size for audio frame"); + return GST_FLOW_ERROR; + } + etn = data[3] << 16 | data[2] << 8 | data[1]; + + GST_LOG_OBJECT (filter, " ETN : %" G_GUINT32_FORMAT, etn); + + /* Pack-A Information + * --------------------------------- + * 4 |Nb Audio Mute | Number of AAU | + * --------------------------------- + * 5 | | + * 6 | PTS | + * 7 | | + * 8 | | + * ----------------------------- | + * 9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | + * --------------------------------- + * 10 | Audio | + * 11 | Compensation | + * --------------------------------- + */ + + /* Number of Audio Mute Frames */ + nbmute = data[4] >> 4; + /* Number of AAU */ + nbaau = data[4] & 0x0f; + /* PTS of the first AAU immediatly following */ + pts = (data[5] | data[6] << 8 | data[7] << 16 | data[8] << 24); + pts |= (guint64) (data[9] & 0x1) << 32; + if (G_UNLIKELY (VALIDATE && (data[9] & 0xfe))) { + return GST_FLOW_ERROR; } - /* 0x44 : Gain */ - gain = ((data[0x44] & 0xf) - 1) * 1.5; - GST_LOG_OBJECT (filter, "Gain : %03f db", gain); - gst_structure_set (str, "gain", G_TYPE_FLOAT, gain, NULL); + /* Amount of compensation */ + audio_comp = data[10] | data[11] << 8; + + GST_LOG_OBJECT (filter, " Pack-A Information"); + GST_LOG_OBJECT (filter, " Nb Audio Mute Frames : %d", nbmute); + GST_LOG_OBJECT (filter, " Nb AAU : %d", nbaau); + GST_LOG_OBJECT (filter, + " PTS : %" GST_TIME_FORMAT " (%" G_GUINT64_FORMAT ")", + GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (pts)), pts); + GST_LOG_OBJECT (filter, " Audio Compensation : %" G_GUINT32_FORMAT, + audio_comp); + + /* Audio Mode + * --------------------------------- + * 12 | Bitrate Index | 0 |Samplerate | + * --------------------------------- + * 13 | Compression | Channels | + * --------------------------------- + * 14 | X | Anciliary Option | + * --------------------------------- + * + * X : Anciliary data present + */ + + bitrate = data[12] >> 4; + fs = data[12] & 0x7; + if (G_UNLIKELY (VALIDATE && (data[12] & 0x08))) + return GST_FLOW_ERROR; + + compress = data[13] >> 4; + channel = data[13] & 0xf; + acly = data[14] & 0x80; + option = data[14] & 0x7f; + + GST_LOG_OBJECT (filter, " Audio Mode"); + GST_LOG_OBJECT (filter, " Bitrate : %s (0x%x)", + (bitrate == 0xe) ? "384kbps" : "RESERVED", bitrate); + GST_LOG_OBJECT (filter, " Samplerate : %s (0x%x)", + (fs == 0x1) ? "48 kHz" : "RESERVED", fs); + GST_LOG_OBJECT (filter, " Compression : %s (0x%x)", + (compress == 0x2) ? "MPEG-1 Layer II" : "RESERVED", compress); + GST_LOG_OBJECT (filter, " Channels : %s (0x%x)", + (channel == 0) ? "Stereo" : "RESERVED", channel); + GST_LOG_OBJECT (filter, " Anciliary data %s %s (0x%x)", + acly ? "PRESENT" : "ABSENT", + (option == 0xc) ? "IEC 13818-3" : "ABSENT/RESERVED", option); + /* + * --------------------------------- + * 15 | CGMS | R | 0 | 0 | 0 | 0 | 0 | + * --------------------------------- + * + * R : Recording Start Point + */ + + cgms = data[15] & 0xc0; + recst = data[15] & 0x20; + + GST_LOG_OBJECT (filter, " Misc"); + GST_LOG_OBJECT (filter, " CGMS : 0x%x", cgms); + GST_LOG_OBJECT (filter, " Recording Start Point %s", + (recst) ? "ABSENT" : "PRESENT"); + + gst_structure_set (st, "PTS", G_TYPE_UINT64, MPEGTIME_TO_GSTTIME (pts), + "recording-start-point", G_TYPE_BOOLEAN, !recst, NULL); - /* 0x4f - 0x50 : Shutter */ - shutter = get_shutter_speed (data[0x4f], data[0x50]); - GST_LOG_OBJECT (filter, "Shutter speed : 1/%d", shutter); - if (shutter) - gst_structure_set (str, "shutter-speed", GST_TYPE_FRACTION, 1, shutter, - NULL); + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_hdvparse_parse (GstHDVParse * filter, GstBuffer * buf) +{ + GstFlowReturn res = GST_FLOW_OK; + guint8 *data = GST_BUFFER_DATA (buf); + guint64 offs = 0; + guint64 insize = GST_BUFFER_SIZE (buf); + GstStructure *st; + + /* Byte | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | + * --------------------------------- + * 0 | 0 | KEYWORD | + * (1) | LENGTH | + * .... + * + * KEYWORD : + * 0x00 - 0x3F : Constant length (5 bytes) + * 0x40 - 0x7F : Variable length (LENGTH + 1) + * + * LENGTH : if present, size of fields 1-N + * + * Known keyword values: + * 0x00-0x07 : AUX-V + * 0x08-0x3E : RESERVED + * 0x3F : AUX-N NO-INFO + * 0x40-0x43 : AUX-A + * 0x44-0x47 : AUX-V + * 0x48-0x4F : AUX-N + * 0x50-0x53 : AUX-SYS + * 0x54-0x7E : RESERVED + * 0x7F : AUX-N NULL PACK + */ + + st = gst_structure_empty_new ("hdv-aux"); + + while (res == GST_FLOW_OK && (offs < insize)) { + guint8 kw = data[offs] & 0x7f; + guint8 size; + + /* Variable size packs */ + if (kw >= 0x40) { + size = data[offs + 1]; + } else + size = 4; + + /* Size validation */ + GST_DEBUG ("kw:0x%x, insize:%" G_GUINT64_FORMAT ", offs:%" G_GUINT64_FORMAT + ", size:%d", kw, insize, offs, size); + if (insize < offs + size) { + res = GST_FLOW_ERROR; + goto beach; + } + + switch (kw) { + case 0x01: + GST_LOG ("BINARY GROUP"); + offs += size + 1; + break; + case 0x07: + GST_LOG ("ETN pack"); + break; + case 0x40: + GST_LOG ("Audio frame pack"); + res = parse_audio_frame (filter, data + offs + 1, size, st); + offs += size + 2; + break; + case 0x3f: + GST_LOG ("NO INFO pack"); + offs += size + 1; + break; + case 0x44: + GST_LOG ("Video frame pack"); + res = parse_video_frame (filter, data + offs + 1, size, st); + offs += size + 2; + break; + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + GST_LOG ("DV multi-pack"); + res = parse_dv_multi_pack (filter, data + offs + 1, size, st); + offs += size + 2; + break; + default: + GST_WARNING_OBJECT (filter, "Unknown AUX pack data of type 0x%x", kw); + res = GST_FLOW_ERROR; + } + } beach: - msg = gst_message_new_element (GST_OBJECT (filter), str); - gst_element_post_message (GST_ELEMENT (filter), msg); - return; + if (gst_structure_n_fields (st)) { + GstMessage *msg; + /* Emit the element message */ + msg = gst_message_new_element (GST_OBJECT (filter), st); + gst_element_post_message (GST_ELEMENT (filter), msg); + } else + gst_structure_free (st); + + return res; + } /* GstBaseTransform vmethod implementations */ @@ -334,9 +867,7 @@ gst_hdvparse_transform_ip (GstBaseTransform * base, GstBuffer * outbuf) { GstHDVParse *filter = GST_HDVPARSE (base); - gst_hdvparse_parse (filter, outbuf); - - return GST_FLOW_OK; + return gst_hdvparse_parse (filter, outbuf); } diff --git a/gst/id3tag/Makefile.am b/gst/id3tag/Makefile.am index 9595be0f..108a227b 100644 --- a/gst/id3tag/Makefile.am +++ b/gst/id3tag/Makefile.am @@ -1,9 +1,9 @@ plugin_LTLIBRARIES = libgstid3tag.la libgstid3tag_la_SOURCES = \ + gstid3mux.c \ gsttagmux.c \ - id3tag.c \ - gstid3tag.c + id3tag.c libgstid3tag_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ @@ -16,4 +16,4 @@ libgstid3tag_la_LIBADD = \ libgstid3tag_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstid3tag_la_LIBTOOLFLAGS = --tag=disable-static -noinst_HEADERS = gstid3tag.h id3tag.h gsttagmux.h +noinst_HEADERS = gstid3mux.h gsttagmux.h id3tag.h diff --git a/gst/id3tag/gstid3tag.c b/gst/id3tag/gstid3mux.c index 9c8072c0..b13bfb58 100644 --- a/gst/id3tag/gstid3tag.c +++ b/gst/id3tag/gstid3mux.c @@ -21,12 +21,12 @@ */ /** - * SECTION:element-id3tag + * SECTION:element-id3mux * @see_also: #GstID3Demux, #GstTagSetter * * This element adds ID3v2 tags to the beginning of a stream, and ID3v1 tags * to the end. - * + * * It defaults to writing ID3 version 2.3.0 tags (since those are the most * widely supported), but can optionally write version 2.4.0 tags. * @@ -37,7 +37,7 @@ * <refsect2> * <title>Example pipelines</title> * |[ - * gst-launch -v filesrc location=foo.ogg ! decodebin ! audioconvert ! lame ! id3tag ! filesink location=foo.mp3 + * gst-launch -v filesrc location=foo.ogg ! decodebin ! audioconvert ! lame ! id3mux ! filesink location=foo.mp3 * ]| A pipeline that transcodes a file from Ogg/Vorbis to mp3 format with * ID3 tags that contain the same metadata as the the Ogg/Vorbis file. * Make sure the Ogg/Vorbis file actually has comments to preserve. @@ -51,13 +51,13 @@ #include <config.h> #endif -#include "gstid3tag.h" +#include "gstid3mux.h" #include <gst/tag/tag.h> #include <string.h> -GST_DEBUG_CATEGORY (gst_id3_tag_debug); -#define GST_CAT_DEFAULT gst_id3_tag_debug +GST_DEBUG_CATEGORY (gst_id3_mux_debug); +#define GST_CAT_DEFAULT gst_id3_mux_debug enum { @@ -67,7 +67,7 @@ enum ARG_V2_MAJOR_VERSION }; -#define DEFAULT_WRITE_V1 TRUE +#define DEFAULT_WRITE_V1 FALSE #define DEFAULT_WRITE_V2 TRUE #define DEFAULT_V2_MAJOR_VERSION 3 @@ -76,20 +76,20 @@ static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-id3")); -GST_BOILERPLATE (GstId3Tag, gst_id3_tag, GstTagMux, GST_TYPE_TAG_MUX); +GST_BOILERPLATE (GstId3Mux, gst_id3_mux, GstTagMux, GST_TYPE_TAG_MUX); -static GstBuffer *gst_id3_tag_render_v2_tag (GstTagMux * mux, +static GstBuffer *gst_id3_mux_render_v2_tag (GstTagMux * mux, GstTagList * taglist); -static GstBuffer *gst_id3_tag_render_v1_tag (GstTagMux * mux, +static GstBuffer *gst_id3_mux_render_v1_tag (GstTagMux * mux, GstTagList * taglist); -static void gst_id3_tag_set_property (GObject * object, guint prop_id, +static void gst_id3_mux_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -static void gst_id3_tag_get_property (GObject * object, guint prop_id, +static void gst_id3_mux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void -gst_id3_tag_base_init (gpointer g_class) +gst_id3_mux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); @@ -101,18 +101,15 @@ gst_id3_tag_base_init (gpointer g_class) "Adds an ID3v2 header and ID3v1 footer to a file", "Michael Smith <msmith@songbirdnest.com>, " "Tim-Philipp Müller <tim centricular net>"); - - GST_DEBUG_CATEGORY_INIT (gst_id3_tag_debug, "id3tag", 0, - "ID3 v1 and v2 tag muxer"); } static void -gst_id3_tag_class_init (GstId3TagClass * klass) +gst_id3_mux_class_init (GstId3MuxClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; - gobject_class->set_property = gst_id3_tag_set_property; - gobject_class->get_property = gst_id3_tag_get_property; + gobject_class->set_property = gst_id3_mux_set_property; + gobject_class->get_property = gst_id3_mux_get_property; g_object_class_install_property (gobject_class, ARG_WRITE_V1, g_param_spec_boolean ("write-v1", "Write id3v1 tag", @@ -131,13 +128,13 @@ gst_id3_tag_class_init (GstId3TagClass * klass) G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); GST_TAG_MUX_CLASS (klass)->render_start_tag = - GST_DEBUG_FUNCPTR (gst_id3_tag_render_v2_tag); + GST_DEBUG_FUNCPTR (gst_id3_mux_render_v2_tag); - GST_TAG_MUX_CLASS (klass)->render_end_tag = gst_id3_tag_render_v1_tag; + GST_TAG_MUX_CLASS (klass)->render_end_tag = gst_id3_mux_render_v1_tag; } static void -gst_id3_tag_init (GstId3Tag * id3mux, GstId3TagClass * id3mux_class) +gst_id3_mux_init (GstId3Mux * id3mux, GstId3MuxClass * id3mux_class) { id3mux->write_v1 = DEFAULT_WRITE_V1; id3mux->write_v2 = DEFAULT_WRITE_V2; @@ -146,10 +143,10 @@ gst_id3_tag_init (GstId3Tag * id3mux, GstId3TagClass * id3mux_class) } static void -gst_id3_tag_set_property (GObject * object, guint prop_id, +gst_id3_mux_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { - GstId3Tag *mux = GST_ID3TAG (object); + GstId3Mux *mux = GST_ID3_MUX (object); switch (prop_id) { case ARG_WRITE_V1: @@ -168,10 +165,10 @@ gst_id3_tag_set_property (GObject * object, guint prop_id, } static void -gst_id3_tag_get_property (GObject * object, guint prop_id, +gst_id3_mux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { - GstId3Tag *mux = GST_ID3TAG (object); + GstId3Mux *mux = GST_ID3_MUX (object); switch (prop_id) { case ARG_WRITE_V1: @@ -190,23 +187,23 @@ gst_id3_tag_get_property (GObject * object, guint prop_id, } static GstBuffer * -gst_id3_tag_render_v2_tag (GstTagMux * mux, GstTagList * taglist) +gst_id3_mux_render_v2_tag (GstTagMux * mux, GstTagList * taglist) { - GstId3Tag *id3mux = GST_ID3TAG (mux); + GstId3Mux *id3mux = GST_ID3_MUX (mux); if (id3mux->write_v2) - return gst_id3mux_render_v2_tag (mux, taglist, id3mux->v2_major_version); + return id3_mux_render_v2_tag (mux, taglist, id3mux->v2_major_version); else return NULL; } static GstBuffer * -gst_id3_tag_render_v1_tag (GstTagMux * mux, GstTagList * taglist) +gst_id3_mux_render_v1_tag (GstTagMux * mux, GstTagList * taglist) { - GstId3Tag *id3mux = GST_ID3TAG (mux); + GstId3Mux *id3mux = GST_ID3_MUX (mux); if (id3mux->write_v1) - return gst_id3mux_render_v1_tag (mux, taglist); + return id3_mux_render_v1_tag (mux, taglist); else return NULL; } @@ -214,7 +211,10 @@ gst_id3_tag_render_v1_tag (GstTagMux * mux, GstTagList * taglist) static gboolean plugin_init (GstPlugin * plugin) { - if (!gst_element_register (plugin, "id3tag", GST_RANK_NONE, GST_TYPE_ID3TAG)) + GST_DEBUG_CATEGORY_INIT (gst_id3_mux_debug, "id3mux", 0, + "ID3 v1 and v2 tag muxer"); + + if (!gst_element_register (plugin, "id3mux", GST_RANK_NONE, GST_TYPE_ID3_MUX)) return FALSE; gst_tag_register_musicbrainz_tags (); diff --git a/gst/id3tag/gstid3tag.h b/gst/id3tag/gstid3mux.h index a9a1ad1c..eb5aa050 100644 --- a/gst/id3tag/gstid3tag.h +++ b/gst/id3tag/gstid3mux.h @@ -20,18 +20,18 @@ * Boston, MA 02111-1307, USA. */ -#ifndef GST_ID3TAG_H -#define GST_ID3TAG_H +#ifndef GST_ID3_MUX_H +#define GST_ID3_MUX_H #include "gsttagmux.h" #include "id3tag.h" G_BEGIN_DECLS -typedef struct _GstId3Tag GstId3Tag; -typedef struct _GstId3TagClass GstId3TagClass; +typedef struct _GstId3Mux GstId3Mux; +typedef struct _GstId3MuxClass GstId3MuxClass; -struct _GstId3Tag { +struct _GstId3Mux { GstTagMux tagmux; gboolean write_v1; @@ -40,24 +40,24 @@ struct _GstId3Tag { gint v2_major_version; }; -struct _GstId3TagClass { +struct _GstId3MuxClass { GstTagMuxClass tagmux_class; }; -#define GST_TYPE_ID3TAG \ - (gst_id3_tag_get_type()) -#define GST_ID3TAG(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ID3TAG,GstId3Tag)) -#define GST_ID3TAG_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ID3TAG,GstId3TagClass)) -#define GST_IS_ID3TAG(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ID3TAG)) -#define GST_IS_ID3TAG_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ID3TAG)) +#define GST_TYPE_ID3_MUX \ + (gst_id3_mux_get_type()) +#define GST_ID3_MUX(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ID3_MUX,GstId3Mux)) +#define GST_ID3_MUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ID3_MUX,GstId3MuxClass)) +#define GST_IS_ID3_MUX(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ID3_MUX)) +#define GST_IS_ID3_MUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ID3_MUX)) -GType gst_id3_tag_get_type (void); +GType gst_id3_mux_get_type (void); G_END_DECLS -#endif /* GST_ID3TAG_H */ +#endif /* GST_ID3_MUX_H */ diff --git a/gst/id3tag/gsttagmux.c b/gst/id3tag/gsttagmux.c index 3b7ff119..4aafb96d 100644 --- a/gst/id3tag/gsttagmux.c +++ b/gst/id3tag/gsttagmux.c @@ -57,10 +57,10 @@ gst_tag_mux_iface_init (GType tag_type) /* make sure to register a less generic type so we can easily move this * GstTagMux base class into -base without causing GType name conflicts */ -typedef GstTagMux GstId3TagMux; -typedef GstTagMuxClass GstId3TagMuxClass; +typedef GstTagMux GstId3BaseMux; +typedef GstTagMuxClass GstId3BaseMuxClass; -GST_BOILERPLATE_FULL (GstId3TagMux, gst_tag_mux, +GST_BOILERPLATE_FULL (GstId3BaseMux, gst_tag_mux, GstElement, GST_TYPE_ELEMENT, gst_tag_mux_iface_init); @@ -100,8 +100,8 @@ gst_tag_mux_base_init (gpointer g_class) gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_tag_mux_sink_template)); - GST_DEBUG_CATEGORY_INIT (gst_tag_mux_debug, "tagmux", 0, - "tag muxer base class"); + GST_DEBUG_CATEGORY_INIT (gst_tag_mux_debug, "id3basemux", 0, + "tag muxer base class for Id3Mux"); } static void diff --git a/gst/id3tag/id3tag.c b/gst/id3tag/id3tag.c index a39e2a8e..dd7bb04f 100644 --- a/gst/id3tag/id3tag.c +++ b/gst/id3tag/id3tag.c @@ -25,8 +25,8 @@ #include <gst/tag/tag.h> -GST_DEBUG_CATEGORY_EXTERN (gst_id3_tag_debug); -#define GST_CAT_DEFAULT gst_id3_tag_debug +GST_DEBUG_CATEGORY_EXTERN (gst_id3_mux_debug); +#define GST_CAT_DEFAULT gst_id3_mux_debug #define ID3V2_APIC_PICTURE_OTHER 0 #define ID3V2_APIC_PICTURE_FILE_ICON 1 @@ -1024,7 +1024,7 @@ foreach_add_tag (const GstTagList * list, const gchar * tag, gpointer userdata) } GstBuffer * -gst_id3mux_render_v2_tag (GstTagMux * mux, GstTagList * taglist, int version) +id3_mux_render_v2_tag (GstTagMux * mux, GstTagList * taglist, int version) { GstId3v2Tag tag; GstBuffer *buf; @@ -1062,17 +1062,17 @@ gst_id3mux_render_v2_tag (GstTagMux * mux, GstTagList * taglist, int version) #define ID3_V1_TAG_SIZE 128 typedef void (*GstId3v1WriteFunc) (const GstTagList * list, - const gchar * gst_tag, guint8 * dst, int len); + const gchar * gst_tag, guint8 * dst, int len, gboolean * wrote_tag); static void latin1_convert (const GstTagList * list, const gchar * tag, - guint8 * dst, int maxlen) + guint8 * dst, int maxlen, gboolean * wrote_tag) { gchar *str; gsize len; gchar *latin1; - if (!gst_tag_list_get_string (list, tag, &str)) + if (!gst_tag_list_get_string (list, tag, &str) || str == NULL) return; /* Convert to Latin-1 (ISO-8859-1), replacing unrepresentable characters @@ -1080,9 +1080,10 @@ latin1_convert (const GstTagList * list, const gchar * tag, latin1 = g_convert_with_fallback (str, -1, "ISO-8859-1", "UTF-8", "?", NULL, &len, NULL); - if (latin1) { + if (latin1 != NULL && *latin1 != '\0') { len = MIN (len, maxlen); memcpy (dst, latin1, len); + *wrote_tag = TRUE; g_free (latin1); } @@ -1091,7 +1092,7 @@ latin1_convert (const GstTagList * list, const gchar * tag, static void date_v1_convert (const GstTagList * list, const gchar * tag, - guint8 * dst, int maxlen) + guint8 * dst, int maxlen, gboolean * wrote_tag) { GDate *date; @@ -1102,6 +1103,7 @@ date_v1_convert (const GstTagList * list, const gchar * tag, if (year > 500 && year < 2100) { gchar str[5]; g_snprintf (str, 5, "%.4u", year); + *wrote_tag = TRUE; memcpy (dst, str, 4); } else { GST_WARNING ("invalid year %u, skipping", year); @@ -1113,14 +1115,14 @@ date_v1_convert (const GstTagList * list, const gchar * tag, static void genre_v1_convert (const GstTagList * list, const gchar * tag, - guint8 * dst, int maxlen) + guint8 * dst, int maxlen, gboolean * wrote_tag) { gchar *str; int genreidx = -1; guint i, max; /* We only support one genre */ - if (!gst_tag_list_get_string_index (list, tag, 0, &str)) + if (!gst_tag_list_get_string_index (list, tag, 0, &str) || str == NULL) return; max = gst_tag_id3_genre_count (); @@ -1133,15 +1135,17 @@ genre_v1_convert (const GstTagList * list, const gchar * tag, } } - if (genreidx >= 0 && genreidx <= 127) + if (genreidx >= 0 && genreidx <= 127) { *dst = (guint8) genreidx; + *wrote_tag = TRUE; + } g_free (str); } static void track_number_convert (const GstTagList * list, const gchar * tag, - guint8 * dst, int maxlen) + guint8 * dst, int maxlen, gboolean * wrote_tag) { guint tracknum; @@ -1149,8 +1153,10 @@ track_number_convert (const GstTagList * list, const gchar * tag, if (!gst_tag_list_get_uint_index (list, tag, 0, &tracknum)) return; - if (tracknum <= 127) + if (tracknum <= 127) { *dst = (guint8) tracknum; + *wrote_tag = TRUE; + } } static const struct @@ -1172,10 +1178,11 @@ static const struct }; GstBuffer * -gst_id3mux_render_v1_tag (GstTagMux * mux, GstTagList * taglist) +id3_mux_render_v1_tag (GstTagMux * mux, GstTagList * taglist) { GstBuffer *buf = gst_buffer_new_and_alloc (ID3_V1_TAG_SIZE); guint8 *data = GST_BUFFER_DATA (buf); + gboolean wrote_tag = FALSE; int i; memset (data, 0, ID3_V1_TAG_SIZE); @@ -1184,9 +1191,18 @@ gst_id3mux_render_v1_tag (GstTagMux * mux, GstTagList * taglist) data[1] = 'A'; data[2] = 'G'; + /* Genre #0 stands for 'Blues', so init genre field to an invalid number */ + data[127] = 255; + for (i = 0; i < G_N_ELEMENTS (v1_funcs); i++) { v1_funcs[i].func (taglist, v1_funcs[i].gst_tag, data + v1_funcs[i].offset, - v1_funcs[i].length); + v1_funcs[i].length, &wrote_tag); + } + + if (!wrote_tag) { + GST_WARNING_OBJECT (mux, "no ID3v1 tag written (no suitable tags found)"); + gst_buffer_unref (buf); + return NULL; } gst_buffer_set_caps (buf, GST_PAD_CAPS (mux->srcpad)); diff --git a/gst/id3tag/id3tag.h b/gst/id3tag/id3tag.h index 1fb59376..d5504969 100644 --- a/gst/id3tag/id3tag.h +++ b/gst/id3tag/id3tag.h @@ -24,9 +24,9 @@ G_BEGIN_DECLS #define ID3_VERSION_2_3 3 #define ID3_VERSION_2_4 4 -GstBuffer * gst_id3mux_render_v2_tag (GstTagMux * mux, GstTagList * taglist, +GstBuffer * id3_mux_render_v2_tag (GstTagMux * mux, GstTagList * taglist, int version); -GstBuffer * gst_id3mux_render_v1_tag (GstTagMux * mux, GstTagList * taglist); +GstBuffer * id3_mux_render_v1_tag (GstTagMux * mux, GstTagList * taglist); G_END_DECLS diff --git a/gst/liveadder/liveadder.c b/gst/liveadder/liveadder.c index d10f54f0..25fa4063 100644 --- a/gst/liveadder/liveadder.c +++ b/gst/liveadder/liveadder.c @@ -1349,9 +1349,8 @@ no_clock: pause: { - const gchar *reason = gst_flow_get_name (result); - - GST_DEBUG_OBJECT (adder, "pausing task, reason %s", reason); + GST_DEBUG_OBJECT (adder, "pausing task, reason %s", + gst_flow_get_name (result)); GST_OBJECT_LOCK (adder); diff --git a/gst/mpegdemux/gstmpegdefs.h b/gst/mpegdemux/gstmpegdefs.h index 7ad1e25c..375f1dc0 100644 --- a/gst/mpegdemux/gstmpegdefs.h +++ b/gst/mpegdemux/gstmpegdefs.h @@ -170,12 +170,17 @@ #define ST_PS_AUDIO_AC3 0x81 #define ST_PS_AUDIO_DTS 0x8a #define ST_PS_AUDIO_LPCM 0x8b -#define ST_HDV_PRIVATE_A0 0xa0 -#define ST_HDV_PRIVATE_A1 0xa1 #define ST_PS_DVD_SUBPICTURE 0xff /* Blu-ray PGS subpictures */ #define ST_BD_PGS_SUBPICTURE 0x90 +/* HDV AUX stream mapping + * 0xA0 ISO/IEC 61834-11 + * 0xA1 ISO/IEC 61834-11 + */ +#define ST_HDV_AUX_A 0xa0 +#define ST_HDV_AUX_V 0xa1 + /* Un-official time-code stream */ #define ST_PS_TIMECODE 0xd2 diff --git a/gst/mpegdemux/gstmpegdesc.c b/gst/mpegdemux/gstmpegdesc.c index 4c88e1fd..0a985897 100644 --- a/gst/mpegdemux/gstmpegdesc.c +++ b/gst/mpegdemux/gstmpegdesc.c @@ -65,7 +65,9 @@ gst_mpeg_descriptor_parse_1 (guint8 * data, guint size) if (length > size) return 0; - return length + 2;; + GST_MEMDUMP ("tag contents:", data, length); + + return length + 2; } GstMPEGDescriptor * diff --git a/gst/mpegdemux/gstmpegtsdemux.c b/gst/mpegdemux/gstmpegtsdemux.c index b75bfc6d..cb082a2b 100644 --- a/gst/mpegdemux/gstmpegtsdemux.c +++ b/gst/mpegdemux/gstmpegtsdemux.c @@ -634,15 +634,15 @@ gst_mpegts_demux_fill_stream (GstMpegTSStream * stream, guint8 id, caps = gst_caps_new_simple ("private/teletext", NULL); } break; - case ST_HDV_PRIVATE_A0: + case ST_HDV_AUX_V: template = klass->private_template; name = g_strdup_printf ("private_%04x", stream->PID); - caps = gst_caps_new_simple ("private/hdv-a0", NULL); + caps = gst_caps_new_simple ("hdv/aux-v", NULL); break; - case ST_HDV_PRIVATE_A1: + case ST_HDV_AUX_A: template = klass->private_template; name = g_strdup_printf ("private_%04x", stream->PID); - caps = gst_caps_new_simple ("private/hdv-a1", NULL); + caps = gst_caps_new_simple ("hdv/aux-a", NULL); break; case ST_PRIVATE_SECTIONS: case ST_MHEG: @@ -923,8 +923,8 @@ gst_mpegts_demux_data_cb (GstPESFilter * filter, gboolean first, * to drop. */ if (stream->PMT_pid <= MPEGTS_MAX_PID && demux->streams[stream->PMT_pid] && demux->streams[demux->streams[stream->PMT_pid]->PMT.PCR_PID] - && demux->streams[demux->streams[stream->PMT_pid]->PMT. - PCR_PID]->discont_PCR) { + && demux->streams[demux->streams[stream->PMT_pid]->PMT.PCR_PID]-> + discont_PCR) { GST_WARNING_OBJECT (demux, "middle of discont, dropping"); goto bad_timestamp; } @@ -946,8 +946,8 @@ gst_mpegts_demux_data_cb (GstPESFilter * filter, gboolean first, */ if (stream->PMT_pid <= MPEGTS_MAX_PID && demux->streams[stream->PMT_pid] && demux->streams[demux->streams[stream->PMT_pid]->PMT.PCR_PID] - && demux->streams[demux->streams[stream->PMT_pid]->PMT. - PCR_PID]->last_PCR > 0) { + && demux->streams[demux->streams[stream->PMT_pid]->PMT.PCR_PID]-> + last_PCR > 0) { GST_DEBUG_OBJECT (demux, "timestamps wrapped before noticed in PCR"); time = MPEGTIME_TO_GSTTIME (pts) + stream->base_time + MPEGTIME_TO_GSTTIME ((guint64) (1) << 33); @@ -2884,7 +2884,8 @@ gst_mpegts_demux_chain (GstPad * pad, GstBuffer * buffer) /* process all packets */ for (i = 0; i < sync_count; i++) { ret = gst_mpegts_demux_parse_transport_packet (demux, demux->sync_lut[i]); - if (G_UNLIKELY (ret == GST_FLOW_LOST_SYNC)) { + if (G_UNLIKELY (ret == GST_FLOW_LOST_SYNC + || ret == GST_FLOW_NEED_MORE_DATA)) { ret = GST_FLOW_OK; continue; } diff --git a/gst/mpegtsmux/mpegtsmux.c b/gst/mpegtsmux/mpegtsmux.c index f24c4a3e..edda2600 100644 --- a/gst/mpegtsmux/mpegtsmux.c +++ b/gst/mpegtsmux/mpegtsmux.c @@ -523,6 +523,8 @@ mpegtsmux_choose_best_stream (MpegTsMux * mux) return best; } +#define COLLECT_DATA_PAD(collect_data) (((GstCollectData *)(collect_data))->pad) + static GstFlowReturn mpegtsmux_collected (GstCollectPads * pads, MpegTsMux * mux) { @@ -540,10 +542,8 @@ mpegtsmux_collected (GstCollectPads * pads, MpegTsMux * mux) if (mux->pcr_stream == NULL) { if (best) { - GstCollectData *c_data = (GstCollectData *) best; /* Take the first data stream for the PCR */ - GST_DEBUG_OBJECT (mux, "Use stream from pad %" GST_PTR_FORMAT " as PCR", - c_data->pad); + GST_DEBUG_OBJECT (COLLECT_DATA_PAD (best), "Use stream as PCR"); mux->pcr_stream = best->stream; } } @@ -564,14 +564,12 @@ mpegtsmux_collected (GstCollectPads * pads, MpegTsMux * mux) if (best != NULL) { GstBuffer *buf = best->queued_buf; - GstCollectData *c_data = (GstCollectData *) best; gint64 pts = -1; g_return_val_if_fail (buf != NULL, GST_FLOW_ERROR); - GST_DEBUG_OBJECT (mux, - "Chose stream from pad %" GST_PTR_FORMAT " for output (PID: 0x%04x)", - c_data->pad, best->pid); + GST_DEBUG_OBJECT (COLLECT_DATA_PAD (best), + "Chose stream for output (PID: 0x%04x)", best->pid); if (GST_CLOCK_TIME_IS_VALID (best->cur_ts)) { pts = GSTTIME_TO_MPEGTIME (best->cur_ts); diff --git a/gst/mpegvideoparse/mpegvideoparse.c b/gst/mpegvideoparse/mpegvideoparse.c index 2a7f9153..d0badbfc 100644 --- a/gst/mpegvideoparse/mpegvideoparse.c +++ b/gst/mpegvideoparse/mpegvideoparse.c @@ -278,6 +278,64 @@ mpegvideoparse_handle_sequence (MpegVideoParse * mpegvideoparse, return TRUE; } +#ifndef GST_DISABLE_GST_DEBUG +static const gchar * +picture_start_code_name (guint8 psc) +{ + guint i; + const struct + { + guint8 psc; + const gchar *name; + } psc_names[] = { + { + 0x00, "Picture Start"}, { + 0xb0, "Reserved"}, { + 0xb1, "Reserved"}, { + 0xb2, "User Data Start"}, { + 0xb3, "Sequence Header Start"}, { + 0xb4, "Sequence Error"}, { + 0xb5, "Extnsion Start"}, { + 0xb6, "Reserved"}, { + 0xb7, "Sequence End"}, { + 0xb8, "Group Start"}, { + 0xb9, "Program End"} + }; + if (psc < 0xB0 && psc > 0) + return "Slice Start"; + + for (i = 0; i < G_N_ELEMENTS (psc_names); i++) + if (psc_names[i].psc == psc) + return psc_names[i].name; + + return "UNKNOWN"; +}; + +static const gchar * +picture_type_name (guint8 pct) +{ + guint i; + const struct + { + guint8 pct; + const gchar *name; + } pct_names[] = { + { + 0, "Forbidden"}, { + 1, "I Frame"}, { + 2, "P Frame"}, { + 3, "B Frame"}, { + 4, "DC Intra Coded (Shall Not Be Used!)"} + }; + + for (i = 0; i < G_N_ELEMENTS (pct_names); i++) + if (pct_names[i].pct == pct) + return pct_names[i].name; + + return "Reserved/Unknown"; +} +#endif /* GST_DISABLE_GST_DEBUG */ + static gboolean mpegvideoparse_handle_picture (MpegVideoParse * mpegvideoparse, GstBuffer * buf) { @@ -289,6 +347,9 @@ mpegvideoparse_handle_picture (MpegVideoParse * mpegvideoparse, GstBuffer * buf) cur = mpeg_util_find_start_code (&sync_word, cur, end); while (cur != NULL) { + if (cur[0] == 0 || cur[0] > 0xaf) + GST_LOG_OBJECT (mpegvideoparse, "Picture Start Code : %s", + picture_start_code_name (cur[0])); /* Cur points at the last byte of the start code */ if (cur[0] == MPEG_PACKET_PICTURE) { guint8 *pic_data = cur - 3; @@ -301,7 +362,8 @@ mpegvideoparse_handle_picture (MpegVideoParse * mpegvideoparse, GstBuffer * buf) if (hdr.pic_type != MPEG_PICTURE_TYPE_I) GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT); - GST_LOG_OBJECT (mpegvideoparse, "Picture type is %u", hdr.pic_type); + GST_LOG_OBJECT (mpegvideoparse, "Picture type is %s", + picture_type_name (hdr.pic_type)); /* FIXME: Can use the picture type and number of fields to track a * timestamp */ } @@ -359,8 +421,9 @@ mpegvideoparse_drain_avail (MpegVideoParse * mpegvideoparse) while ((cur != NULL) && (res == GST_FLOW_OK)) { /* Handle the block */ GST_LOG_OBJECT (mpegvideoparse, - "Have block of size %u with pack_type 0x%02x and flags 0x%02x", - cur->length, cur->first_pack_type, cur->flags); + "Have block of size %u with pack_type %s and flags 0x%02x", + cur->length, picture_start_code_name (cur->first_pack_type), + cur->flags); /* Don't start pushing out buffers until we've seen a sequence header */ if (mpegvideoparse->seq_hdr.mpeg_version == 0) { diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index c33650b5..5abd37ff 100644 --- a/gst/mxf/mxfdemux.c +++ b/gst/mxf/mxfdemux.c @@ -439,8 +439,8 @@ gst_mxf_demux_handle_partition_pack (GstMXFDemux * demux, const MXFUL * key, for (l = demux->partitions; l; l = l->next) { GstMXFDemuxPartition *a, *b; - if (l->next == NULL); - break; + if (l->next == NULL) + break; a = l->data; b = l->next->data; @@ -1921,8 +1921,8 @@ gst_mxf_demux_handle_random_index_pack (GstMXFDemux * demux, const MXFUL * key, for (l = demux->partitions; l; l = l->next) { GstMXFDemuxPartition *a, *b; - if (l->next == NULL); - break; + if (l->next == NULL) + break; a = l->data; b = l->next->data; diff --git a/gst/nsf/nes6502.c b/gst/nsf/nes6502.c index e2ed01f7..450350fc 100644 --- a/gst/nsf/nes6502.c +++ b/gst/nsf/nes6502.c @@ -944,7 +944,7 @@ ADD_CYCLES(cycles); \ } -#define SEC() \ +#define SEC_6502() \ { \ SET_FLAG(C_FLAG); \ ADD_CYCLES(2); \ @@ -1798,7 +1798,7 @@ nes6502_execute (int remaining_cycles) break; case 0x38: /* SEC */ - SEC (); + SEC_6502 (); break; case 0x39: /* AND $nnnn,Y */ diff --git a/gst/qtmux/atoms.c b/gst/qtmux/atoms.c index 47db40ce..29859d00 100644 --- a/gst/qtmux/atoms.c +++ b/gst/qtmux/atoms.c @@ -1036,7 +1036,8 @@ atom_meta_free (AtomMETA * meta) { atom_full_clear (&meta->header); atom_hdlr_clear (&meta->hdlr); - atom_ilst_free (meta->ilst); + if (meta->ilst) + atom_ilst_free (meta->ilst); meta->ilst = NULL; g_free (meta); } @@ -1061,8 +1062,11 @@ static void atom_udta_free (AtomUDTA * udta) { atom_clear (&udta->header); - atom_meta_free (udta->meta); + if (udta->meta) + atom_meta_free (udta->meta); udta->meta = NULL; + if (udta->entries) + atom_info_list_free (udta->entries); g_free (udta); } @@ -1149,6 +1153,7 @@ atom_moov_init (AtomMOOV * moov, AtomsContext * context) atom_mvhd_init (&(moov->mvhd)); moov->udta = NULL; moov->traks = NULL; + moov->context = *context; } AtomMOOV * @@ -1170,13 +1175,11 @@ atom_moov_free (AtomMOOV * moov) walker = moov->traks; while (walker) { - GList *aux = walker; - + atom_trak_free ((AtomTRAK *) walker->data); walker = g_list_next (walker); - moov->traks = g_list_remove_link (moov->traks, aux); - atom_trak_free ((AtomTRAK *) aux->data); - g_list_free (aux); } + g_list_free (moov->traks); + moov->traks = NULL; if (moov->udta) { atom_udta_free (moov->udta); @@ -1240,9 +1243,6 @@ atom_copy_data (Atom * atom, guint8 ** buffer, guint64 * size, guint64 * offset) * would be a problem for size (re)write code, not to mention memory */ g_return_val_if_fail (atom->type == FOURCC_mdat, 0); prop_copy_uint64 (atom->extended_size, buffer, size, offset); - } else { - /* just in case some trivially derived atom does not do so */ - atom_write_size (buffer, size, offset, original_offset); } return *offset - original_offset; @@ -2163,6 +2163,10 @@ atom_udta_copy_data (AtomUDTA * udta, guint8 ** buffer, guint64 * size, if (!atom_meta_copy_data (udta->meta, buffer, size, offset)) { return 0; } + } else if (udta->entries) { + /* extra atoms */ + if (!atom_info_list_copy_data (udta->entries, buffer, size, offset)) + return 0; } atom_write_size (buffer, size, offset, original_offset); @@ -2238,6 +2242,10 @@ stsc_entry_new (guint32 first_chunk, guint32 samples, guint32 desc_index) static void atom_stsc_add_new_entry (AtomSTSC * stsc, guint32 first_chunk, guint32 nsamples) { + if (stsc->entries && + ((STSCEntry *) stsc->entries->data)->samples_per_chunk == nsamples) + return; + stsc->entries = g_list_prepend (stsc->entries, stsc_entry_new (first_chunk, nsamples, 1)); stsc->n_entries++; @@ -2517,16 +2525,18 @@ atom_moov_chunks_add_offset (AtomMOOV * moov, guint32 offset) * Meta tags functions */ static void -atom_moov_init_metatags (AtomMOOV * moov) +atom_moov_init_metatags (AtomMOOV * moov, AtomsContext * context) { if (!moov->udta) { moov->udta = atom_udta_new (); } - if (!moov->udta->meta) { - moov->udta->meta = atom_meta_new (); - } - if (!moov->udta->meta->ilst) { - moov->udta->meta->ilst = atom_ilst_new (); + if (context->flavor != ATOMS_TREE_FLAVOR_3GP) { + if (!moov->udta->meta) { + moov->udta->meta = atom_meta_new (); + } + if (!moov->udta->meta->ilst) { + moov->udta->meta->ilst = atom_ilst_new (); + } } } @@ -2543,11 +2553,14 @@ atom_tag_data_alloc_data (AtomTagData * data, guint size) static void atom_moov_append_tag (AtomMOOV * moov, AtomInfo * tag) { - AtomILST *ilst; + GList **entries; - atom_moov_init_metatags (moov); - ilst = moov->udta->meta->ilst; - ilst->entries = g_list_append (ilst->entries, tag); + atom_moov_init_metatags (moov, &moov->context); + if (moov->udta->meta) + entries = &moov->udta->meta->ilst->entries; + else + entries = &moov->udta->entries; + *entries = g_list_append (*entries, tag); } void @@ -2621,6 +2634,87 @@ atom_moov_add_blob_tag (AtomMOOV * moov, guint8 * data, guint size) atom_data_free)); } +void +atom_moov_add_3gp_tag (AtomMOOV * moov, guint32 fourcc, guint8 * data, + guint size) +{ + AtomData *data_atom; + GstBuffer *buf; + guint8 *bdata; + + /* need full atom */ + buf = gst_buffer_new_and_alloc (size + 4); + bdata = GST_BUFFER_DATA (buf); + /* full atom: version and flags */ + GST_WRITE_UINT32_BE (bdata, 0); + memcpy (bdata + 4, data, size); + + data_atom = atom_data_new_from_gst_buffer (fourcc, buf); + gst_buffer_unref (buf); + + atom_moov_append_tag (moov, + build_atom_info_wrapper ((Atom *) data_atom, atom_data_copy_data, + atom_data_free)); +} + +guint16 +language_code (const char *lang) +{ + g_return_val_if_fail (lang != NULL, 0); + g_return_val_if_fail (strlen (lang) == 3, 0); + + return (((lang[0] - 0x60) & 0x1F) << 10) + (((lang[1] - 0x60) & 0x1F) << 5) + + ((lang[2] - 0x60) & 0x1F); +} + +void +atom_moov_add_3gp_str_int_tag (AtomMOOV * moov, guint32 fourcc, + const gchar * value, gint16 ivalue) +{ + gint len = 0, size = 0; + guint8 *data; + + if (value) { + len = strlen (value); + size = len + 3; + } + + if (ivalue >= 0) + size += 2; + + data = g_malloc (size + 3); + /* language tag and null-terminated UTF-8 string */ + if (value) { + GST_WRITE_UINT16_BE (data, language_code (GST_QT_MUX_DEFAULT_TAG_LANGUAGE)); + /* include 0 terminator */ + memcpy (data + 2, value, len + 1); + } + /* 16-bit unsigned int if standalone, otherwise 8-bit */ + if (ivalue >= 0) { + if (size == 2) + GST_WRITE_UINT16_BE (data + size - 2, ivalue); + else { + GST_WRITE_UINT8 (data + size - 2, ivalue & 0xFF); + size--; + } + } + + atom_moov_add_3gp_tag (moov, fourcc, data, size); + g_free (data); +} + +void +atom_moov_add_3gp_str_tag (AtomMOOV * moov, guint32 fourcc, const gchar * value) +{ + atom_moov_add_3gp_str_int_tag (moov, fourcc, value, -1); +} + +void +atom_moov_add_3gp_uint_tag (AtomMOOV * moov, guint32 fourcc, guint16 value) +{ + atom_moov_add_3gp_str_int_tag (moov, fourcc, NULL, value); +} + /* * Functions for specifying media types */ @@ -2804,14 +2898,56 @@ atom_trak_set_audio_type (AtomTRAK * trak, AtomsContext * context, atom_trak_set_constant_size_samples (trak, sample_size); } +AtomInfo * +build_pasp_extension (AtomTRAK * trak, gint par_width, gint par_height) +{ + AtomData *atom_data; + GstBuffer *buf; + guint8 *data; + + buf = gst_buffer_new_and_alloc (8); + data = GST_BUFFER_DATA (buf); + + /* ihdr = image header box */ + GST_WRITE_UINT32_BE (data, par_width); + GST_WRITE_UINT32_BE (data + 4, par_height); + + atom_data = atom_data_new_from_gst_buffer (FOURCC_pasp, buf); + gst_buffer_unref (buf); + + return build_atom_info_wrapper ((Atom *) atom_data, atom_data_copy_data, + atom_data_free); +} + void atom_trak_set_video_type (AtomTRAK * trak, AtomsContext * context, VisualSampleEntry * entry, guint32 scale, AtomInfo * ext) { SampleTableEntryMP4V *ste; + gint dwidth, dheight; + gint par_n = 0, par_d = 0; + + if ((entry->par_n != 1 || entry->par_d != 1) && + (entry->par_n != entry->par_d)) { + par_n = entry->par_n; + par_d = entry->par_d; + } + + dwidth = entry->width; + dheight = entry->height; + /* ISO file spec says track header w/h indicates track's visual presentation + * (so this together with pixels w/h implicitly defines PAR) */ + if (par_n && (context->flavor != ATOMS_TREE_FLAVOR_MOV)) { + if (par_n > par_d) { + dwidth = entry->width * par_n / par_d; + dheight = entry->height; + } else { + dwidth = entry->width * par_n / par_d; + dheight = entry->height; + } + } - atom_trak_set_video_commons (trak, context, scale, entry->width, - entry->height); + atom_trak_set_video_commons (trak, context, scale, dwidth, dheight); ste = atom_trak_add_video_entry (trak, context, entry->fourcc); trak->is_video = TRUE; @@ -2825,6 +2961,12 @@ atom_trak_set_video_type (AtomTRAK * trak, AtomsContext * context, if (ext) ste->extension_atoms = g_list_prepend (ste->extension_atoms, ext); + + /* QT spec has a pasp extension atom in stsd that can hold PAR */ + if (par_n && (context->flavor == ATOMS_TREE_FLAVOR_MOV)) { + ste->extension_atoms = g_list_append (ste->extension_atoms, + build_pasp_extension (trak, par_n, par_d)); + } } /* some sample description construction helpers */ diff --git a/gst/qtmux/atoms.h b/gst/qtmux/atoms.h index 23bc19bb..4c94141b 100644 --- a/gst/qtmux/atoms.h +++ b/gst/qtmux/atoms.h @@ -55,7 +55,8 @@ typedef enum _AtomsTreeFlavor { ATOMS_TREE_FLAVOR_MOV, - ATOMS_TREE_FLAVOR_ISOM + ATOMS_TREE_FLAVOR_ISOM, + ATOMS_TREE_FLAVOR_3GP } AtomsTreeFlavor; typedef struct _AtomsContext @@ -509,6 +510,9 @@ typedef struct _AtomUDTA { Atom header; + /* list of AtomInfo */ + GList* entries; + /* or list is further down */ AtomMETA *meta; } AtomUDTA; @@ -526,6 +530,9 @@ typedef struct _AtomTRAK typedef struct _AtomMOOV { + /* style */ + AtomsContext context; + Atom header; AtomMVHD mvhd; @@ -602,6 +609,8 @@ typedef struct guint depth; guint frame_count; gint color_table_id; + guint par_n; + guint par_d; GstBuffer *codec_data; } VisualSampleEntry; @@ -649,4 +658,14 @@ void atom_moov_add_tag (AtomMOOV *moov, guint32 fourcc, guint32 flags, const guint8 * data, guint size); void atom_moov_add_blob_tag (AtomMOOV *moov, guint8 *data, guint size); +void atom_moov_add_3gp_str_tag (AtomMOOV * moov, guint32 fourcc, const gchar * value); +void atom_moov_add_3gp_uint_tag (AtomMOOV * moov, guint32 fourcc, guint16 value); +void atom_moov_add_3gp_str_int_tag (AtomMOOV * moov, guint32 fourcc, const gchar * value, + gint16 ivalue); +void atom_moov_add_3gp_tag (AtomMOOV * moov, guint32 fourcc, guint8 * data, + guint size); + +#define GST_QT_MUX_DEFAULT_TAG_LANGUAGE "eng" +guint16 language_code (const char * lang); + #endif /* __ATOMS_H__ */ diff --git a/gst/qtmux/fourcc.h b/gst/qtmux/fourcc.h index 3db60036..9b1fe65a 100644 --- a/gst/qtmux/fourcc.h +++ b/gst/qtmux/fourcc.h @@ -104,6 +104,7 @@ G_BEGIN_DECLS #define FOURCC_wave GST_MAKE_FOURCC('w','a','v','e') #define FOURCC_appl GST_MAKE_FOURCC('a','p','p','l') #define FOURCC_esds GST_MAKE_FOURCC('e','s','d','s') +#define FOURCC_pasp GST_MAKE_FOURCC('p','a','s','p') #define FOURCC_hnti GST_MAKE_FOURCC('h','n','t','i') #define FOURCC_rtp_ GST_MAKE_FOURCC('r','t','p',' ') #define FOURCC_sdp_ GST_MAKE_FOURCC('s','d','p',' ') @@ -181,6 +182,15 @@ G_BEGIN_DECLS #define FOURCC_titl GST_MAKE_FOURCC('t','i','t','l') #define FOURCC__cmt GST_MAKE_FOURCC(0xa9, 'c','m','t') +/* 3gp tags */ +#define FOURCC_dscp GST_MAKE_FOURCC('d','s','c','p') +#define FOURCC_perf GST_MAKE_FOURCC('p','e','r','f') +#define FOURCC_auth GST_MAKE_FOURCC('a','u','t','h') +#define FOURCC_yrrc GST_MAKE_FOURCC('y','r','r','c') +#define FOURCC_albm GST_MAKE_FOURCC('a','l','b','m') +#define FOURCC_loci GST_MAKE_FOURCC('l','o','c','i') +#define FOURCC_kywd GST_MAKE_FOURCC('k','y','w','d') + G_END_DECLS #endif /* __FOURCC_H__ */ diff --git a/gst/qtmux/gstqtmux.c b/gst/qtmux/gstqtmux.c index 03b0a1a6..8d811f41 100644 --- a/gst/qtmux/gstqtmux.c +++ b/gst/qtmux/gstqtmux.c @@ -111,9 +111,11 @@ enum PROP_FAST_START_TEMP_FILE }; -#define MDAT_ATOM_HEADER_SIZE 16 +/* some spare for header size as well */ +#define MDAT_LARGE_FILE_LIMIT ((guint64) 1024 * 1024 * 1024 * 2) + #define DEFAULT_LARGE_FILE FALSE -#define DEFAULT_MOVIE_TIMESCALE 600 +#define DEFAULT_MOVIE_TIMESCALE 1000 #define DEFAULT_DO_CTTS FALSE #define DEFAULT_FAST_START FALSE #define DEFAULT_FAST_START_TEMP_FILE NULL @@ -349,8 +351,294 @@ gst_qt_mux_finalize (GObject * object) G_OBJECT_CLASS (parent_class)->finalize (object); } -/* FIXME approach below is pretty Apple/MOV/MP4/iTunes specific, - * and as such does not comply with e.g. 3GPP specs */ +static void +gst_qt_mux_add_mp4_tag (GstQTMux * qtmux, const GstTagList * list, + const char *tag, const char *tag2, guint32 fourcc) +{ + switch (gst_tag_get_type (tag)) { + /* strings */ + case G_TYPE_STRING: + { + gchar *str = NULL; + + if (!gst_tag_list_get_string (list, tag, &str) || !str) + break; + GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %s", + GST_FOURCC_ARGS (fourcc), str); + atom_moov_add_str_tag (qtmux->moov, fourcc, str); + g_free (str); + break; + } + /* double */ + case G_TYPE_DOUBLE: + { + gdouble value; + + if (!gst_tag_list_get_double (list, tag, &value)) + break; + GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %u", + GST_FOURCC_ARGS (fourcc), (gint) value); + atom_moov_add_uint_tag (qtmux->moov, fourcc, 21, (gint) value); + break; + } + /* paired unsigned integers */ + case G_TYPE_UINT: + { + guint value; + guint count; + + if (!gst_tag_list_get_uint (list, tag, &value) || + !gst_tag_list_get_uint (list, tag2, &count)) + break; + GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %u/%u", + GST_FOURCC_ARGS (fourcc), value, count); + atom_moov_add_uint_tag (qtmux->moov, fourcc, 0, + value << 16 | (count & 0xFFFF)); + break; + } + default: + g_assert_not_reached (); + break; + } +} + +static void +gst_qt_mux_add_mp4_date (GstQTMux * qtmux, const GstTagList * list, + const char *tag, const char *tag2, guint32 fourcc) +{ + GDate *date = NULL; + GDateYear year; + GDateMonth month; + GDateDay day; + gchar *str; + + g_return_if_fail (gst_tag_get_type (tag) == GST_TYPE_DATE); + + if (!gst_tag_list_get_date (list, tag, &date) || !date) + return; + + year = g_date_get_year (date); + month = g_date_get_month (date); + day = g_date_get_day (date); + + if (year == G_DATE_BAD_YEAR && month == G_DATE_BAD_MONTH && + day == G_DATE_BAD_DAY) { + GST_WARNING_OBJECT (qtmux, "invalid date in tag"); + return; + } + + str = g_strdup_printf ("%u-%u-%u", year, month, day); + GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %s", + GST_FOURCC_ARGS (fourcc), str); + atom_moov_add_str_tag (qtmux->moov, fourcc, str); +} + +static void +gst_qt_mux_add_mp4_cover (GstQTMux * qtmux, const GstTagList * list, + const char *tag, const char *tag2, guint32 fourcc) +{ + GValue value = { 0, }; + GstBuffer *buf; + GstCaps *caps; + GstStructure *structure; + gint flags = 0; + + g_return_if_fail (gst_tag_get_type (tag) == GST_TYPE_BUFFER); + + if (!gst_tag_list_copy_value (&value, list, tag)) + return; + + buf = gst_value_get_buffer (&value); + if (!buf) + goto done; + + caps = gst_buffer_get_caps (buf); + if (!caps) { + GST_WARNING_OBJECT (qtmux, "preview image without caps"); + goto done; + } + + GST_DEBUG_OBJECT (qtmux, "preview image caps %" GST_PTR_FORMAT, caps); + + structure = gst_caps_get_structure (caps, 0); + if (gst_structure_has_name (structure, "image/jpeg")) + flags = 13; + else if (gst_structure_has_name (structure, "image/png")) + flags = 14; + gst_caps_unref (caps); + + if (!flags) { + GST_WARNING_OBJECT (qtmux, "preview image format not supported"); + goto done; + } + + GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT + " -> image size %d", GST_FOURCC_ARGS (fourcc), GST_BUFFER_SIZE (buf)); + atom_moov_add_tag (qtmux->moov, fourcc, flags, GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf)); +done: + g_value_unset (&value); +} + +static void +gst_qt_mux_add_3gp_str (GstQTMux * qtmux, const GstTagList * list, + const char *tag, const char *tag2, guint32 fourcc) +{ + gchar *str = NULL; + guint number; + + g_return_if_fail (gst_tag_get_type (tag) == G_TYPE_STRING); + g_return_if_fail (!tag2 || gst_tag_get_type (tag2) == G_TYPE_UINT); + + if (!gst_tag_list_get_string (list, tag, &str) || !str) + return; + + if (tag2) + if (!gst_tag_list_get_uint (list, tag2, &number)) + tag2 = NULL; + + if (!tag2) { + GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %s", + GST_FOURCC_ARGS (fourcc), str); + atom_moov_add_3gp_str_tag (qtmux->moov, fourcc, str); + } else { + GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %s/%d", + GST_FOURCC_ARGS (fourcc), str, number); + atom_moov_add_3gp_str_int_tag (qtmux->moov, fourcc, str, number); + } + + g_free (str); +} + +static void +gst_qt_mux_add_3gp_date (GstQTMux * qtmux, const GstTagList * list, + const char *tag, const char *tag2, guint32 fourcc) +{ + GDate *date = NULL; + GDateYear year; + + g_return_if_fail (gst_tag_get_type (tag) == GST_TYPE_DATE); + + if (!gst_tag_list_get_date (list, tag, &date) || !date) + return; + + year = g_date_get_year (date); + + if (year == G_DATE_BAD_YEAR) { + GST_WARNING_OBJECT (qtmux, "invalid date in tag"); + return; + } + + GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %d", year); + atom_moov_add_3gp_uint_tag (qtmux->moov, fourcc, year); +} + +static void +gst_qt_mux_add_3gp_location (GstQTMux * qtmux, const GstTagList * list, + const char *tag, const char *tag2, guint32 fourcc) +{ + gdouble latitude = -360, longitude = -360, altitude = 0; + gchar *location = NULL; + guint8 *data, *ddata; + gint size = 0, len = 0; + gboolean ret = FALSE; + + g_return_if_fail (strcmp (tag, GST_TAG_GEO_LOCATION_NAME) == 0); + + ret = gst_tag_list_get_string (list, tag, &location); + ret |= gst_tag_list_get_double (list, GST_TAG_GEO_LOCATION_LONGITUDE, + &longitude); + ret |= gst_tag_list_get_double (list, GST_TAG_GEO_LOCATION_LATITUDE, + &latitude); + ret |= gst_tag_list_get_double (list, GST_TAG_GEO_LOCATION_ELEVATION, + &altitude); + + if (!ret) + return; + + if (location) + len = strlen (location); + size += len + 1 + 2; + + /* role + (long, lat, alt) + body + notes */ + size += 1 + 3 * 4 + 1 + 1; + + data = ddata = g_malloc (size); + + /* language tag */ + GST_WRITE_UINT16_BE (data, language_code (GST_QT_MUX_DEFAULT_TAG_LANGUAGE)); + /* location */ + if (location) + memcpy (data + 2, location, len); + GST_WRITE_UINT8 (data + 2 + len, 0); + data += len + 1 + 2; + /* role */ + GST_WRITE_UINT8 (data, 0); + /* long, lat, alt */ + GST_WRITE_UINT32_BE (data + 1, (guint32) (longitude * 65536.0)); + GST_WRITE_UINT32_BE (data + 5, (guint32) (latitude * 65536.0)); + GST_WRITE_UINT32_BE (data + 9, (guint32) (altitude * 65536.0)); + /* neither astronomical body nor notes */ + GST_WRITE_UINT16_BE (data + 13, 0); + + GST_DEBUG_OBJECT (qtmux, "Adding tag 'loci'"); + atom_moov_add_3gp_tag (qtmux->moov, fourcc, ddata, size); + g_free (ddata); +} + +static void +gst_qt_mux_add_3gp_keywords (GstQTMux * qtmux, const GstTagList * list, + const char *tag, const char *tag2, guint32 fourcc) +{ + gchar *keywords = NULL; + guint8 *data, *ddata; + gint size = 0, i; + gchar **kwds; + + g_return_if_fail (strcmp (tag, GST_TAG_KEYWORDS) == 0); + + if (!gst_tag_list_get_string (list, tag, &keywords) || !keywords) + return; + + kwds = g_strsplit (keywords, ",", 0); + + size = 0; + for (i = 0; kwds[i]; i++) { + /* size byte + null-terminator */ + size += strlen (kwds[i]) + 1 + 1; + } + + /* language tag + count + keywords */ + size += 2 + 1; + + data = ddata = g_malloc (size); + + /* language tag */ + GST_WRITE_UINT16_BE (data, language_code (GST_QT_MUX_DEFAULT_TAG_LANGUAGE)); + /* count */ + GST_WRITE_UINT8 (data + 2, i); + data += 3; + /* keywords */ + for (i = 0; kwds[i]; ++i) { + gint len = strlen (kwds[i]); + + GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %s", + GST_FOURCC_ARGS (fourcc), kwds[i]); + /* size */ + GST_WRITE_UINT8 (data, len + 1); + memcpy (data + 1, kwds[i], len + 1); + data += len + 2; + } + + g_strfreev (kwds); + + atom_moov_add_3gp_tag (qtmux->moov, fourcc, ddata, size); + g_free (ddata); +} + + +typedef void (*GstQTMuxAddTagFunc) (GstQTMux * mux, const GstTagList * list, + const char *tag, const char *tag2, guint32 fourcc); /* * Struct to record mappings from gstreamer tags to fourcc codes @@ -360,25 +648,42 @@ typedef struct _GstTagToFourcc guint32 fourcc; const gchar *gsttag; const gchar *gsttag2; + const GstQTMuxAddTagFunc func; } GstTagToFourcc; /* tag list tags to fourcc matching */ -static const GstTagToFourcc tag_matches[] = { - {FOURCC__alb, GST_TAG_ALBUM,}, - {FOURCC__ART, GST_TAG_ARTIST,}, - {FOURCC__cmt, GST_TAG_COMMENT,}, - {FOURCC__wrt, GST_TAG_COMPOSER,}, - {FOURCC__gen, GST_TAG_GENRE,}, - {FOURCC__nam, GST_TAG_TITLE,}, - {FOURCC__des, GST_TAG_DESCRIPTION,}, - {FOURCC__too, GST_TAG_ENCODER,}, - {FOURCC_cprt, GST_TAG_COPYRIGHT,}, - {FOURCC_keyw, GST_TAG_KEYWORDS,}, - {FOURCC__day, GST_TAG_DATE,}, - {FOURCC_tmpo, GST_TAG_BEATS_PER_MINUTE,}, - {FOURCC_trkn, GST_TAG_TRACK_NUMBER, GST_TAG_TRACK_COUNT}, - {FOURCC_disk, GST_TAG_ALBUM_VOLUME_NUMBER, GST_TAG_ALBUM_VOLUME_COUNT}, - {FOURCC_covr, GST_TAG_PREVIEW_IMAGE,}, +static const GstTagToFourcc tag_matches_mp4[] = { + {FOURCC__alb, GST_TAG_ALBUM, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC__ART, GST_TAG_ARTIST, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC__cmt, GST_TAG_COMMENT, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC__wrt, GST_TAG_COMPOSER, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC__gen, GST_TAG_GENRE, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC__nam, GST_TAG_TITLE, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC__des, GST_TAG_DESCRIPTION, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC__too, GST_TAG_ENCODER, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC_cprt, GST_TAG_COPYRIGHT, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC_keyw, GST_TAG_KEYWORDS, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC__day, GST_TAG_DATE, NULL, gst_qt_mux_add_mp4_date}, + {FOURCC_tmpo, GST_TAG_BEATS_PER_MINUTE, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC_trkn, GST_TAG_TRACK_NUMBER, GST_TAG_TRACK_COUNT, + gst_qt_mux_add_mp4_tag}, + {FOURCC_disk, GST_TAG_ALBUM_VOLUME_NUMBER, GST_TAG_ALBUM_VOLUME_COUNT, + gst_qt_mux_add_mp4_tag}, + {FOURCC_covr, GST_TAG_PREVIEW_IMAGE, NULL, gst_qt_mux_add_mp4_cover}, + {0, NULL,} +}; + +static const GstTagToFourcc tag_matches_3gp[] = { + {FOURCC_titl, GST_TAG_TITLE, NULL, gst_qt_mux_add_3gp_str}, + {FOURCC_dscp, GST_TAG_DESCRIPTION, NULL, gst_qt_mux_add_3gp_str}, + {FOURCC_cprt, GST_TAG_COPYRIGHT, NULL, gst_qt_mux_add_3gp_str}, + {FOURCC_perf, GST_TAG_ARTIST, NULL, gst_qt_mux_add_3gp_str}, + {FOURCC_auth, GST_TAG_COMPOSER, NULL, gst_qt_mux_add_3gp_str}, + {FOURCC_gnre, GST_TAG_GENRE, NULL, gst_qt_mux_add_3gp_str}, + {FOURCC_kywd, GST_TAG_KEYWORDS, NULL, gst_qt_mux_add_3gp_keywords}, + {FOURCC_yrrc, GST_TAG_DATE, NULL, gst_qt_mux_add_3gp_date}, + {FOURCC_albm, GST_TAG_ALBUM, GST_TAG_TRACK_NUMBER, gst_qt_mux_add_3gp_str}, + {FOURCC_loci, GST_TAG_GEO_LOCATION_NAME, NULL, gst_qt_mux_add_3gp_location}, {0, NULL,} }; @@ -388,127 +693,35 @@ static const GstTagToFourcc tag_matches[] = { static void gst_qt_mux_add_metadata_tags (GstQTMux * qtmux, const GstTagList * list) { + GstQTMuxClass *qtmux_klass = (GstQTMuxClass *) (G_OBJECT_GET_CLASS (qtmux)); guint32 fourcc; gint i; const gchar *tag, *tag2; + const GstTagToFourcc *tag_matches; + + switch (qtmux_klass->format) { + case GST_QT_MUX_FORMAT_3GP: + tag_matches = tag_matches_3gp; + break; + case GST_QT_MUX_FORMAT_MJ2: + tag_matches = NULL; + break; + default: + /* sort of iTunes style for mp4 and QT (?) */ + tag_matches = tag_matches_mp4; + break; + } + + if (!tag_matches) + return; for (i = 0; tag_matches[i].fourcc; i++) { fourcc = tag_matches[i].fourcc; tag = tag_matches[i].gsttag; tag2 = tag_matches[i].gsttag2; - switch (gst_tag_get_type (tag)) { - /* strings */ - case G_TYPE_STRING: - { - gchar *str = NULL; - - if (!gst_tag_list_get_string (list, tag, &str) || !str) - break; - GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %s", - GST_FOURCC_ARGS (fourcc), str); - atom_moov_add_str_tag (qtmux->moov, fourcc, str); - g_free (str); - break; - } - /* double */ - case G_TYPE_DOUBLE: - { - gdouble value; - - if (!gst_tag_list_get_double (list, tag, &value)) - break; - GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %u", - GST_FOURCC_ARGS (fourcc), (gint) value); - atom_moov_add_uint_tag (qtmux->moov, fourcc, 21, (gint) value); - break; - } - /* paired unsigned integers */ - case G_TYPE_UINT: - { - guint value; - guint count; - - if (!gst_tag_list_get_uint (list, tag, &value) || - !gst_tag_list_get_uint (list, tag2, &count)) - break; - GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %u/%u", - GST_FOURCC_ARGS (fourcc), value, count); - atom_moov_add_uint_tag (qtmux->moov, fourcc, 0, - value << 16 | (count & 0xFFFF)); - break; - } - default: - { - if (gst_tag_get_type (tag) == GST_TYPE_DATE) { - GDate *date = NULL; - GDateYear year; - GDateMonth month; - GDateDay day; - gchar *str; - - if (!gst_tag_list_get_date (list, tag, &date) || !date) - break; - year = g_date_get_year (date); - month = g_date_get_month (date); - day = g_date_get_day (date); - - if (year == G_DATE_BAD_YEAR && month == G_DATE_BAD_MONTH && - day == G_DATE_BAD_DAY) { - GST_WARNING_OBJECT (qtmux, "invalid date in tag"); - break; - } - - str = g_strdup_printf ("%u-%u-%u", year, month, day); - GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %s", - GST_FOURCC_ARGS (fourcc), str); - atom_moov_add_str_tag (qtmux->moov, fourcc, str); - } else if (gst_tag_get_type (tag) == GST_TYPE_BUFFER) { - GValue value = { 0, }; - GstBuffer *buf; - GstCaps *caps; - GstStructure *structure; - gint flags = 0; - - if (!gst_tag_list_copy_value (&value, list, tag)) - break; - - buf = gst_value_get_buffer (&value); - if (!buf) - goto done; - - caps = gst_buffer_get_caps (buf); - if (!caps) { - GST_WARNING_OBJECT (qtmux, "preview image without caps"); - goto done; - } - - GST_DEBUG_OBJECT (qtmux, "preview image caps %" GST_PTR_FORMAT, caps); - - structure = gst_caps_get_structure (caps, 0); - if (gst_structure_has_name (structure, "image/jpeg")) - flags = 13; - else if (gst_structure_has_name (structure, "image/png")) - flags = 14; - gst_caps_unref (caps); - - if (!flags) { - GST_WARNING_OBJECT (qtmux, "preview image format not supported"); - goto done; - } - - GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT - " -> image size %d", GST_FOURCC_ARGS (fourcc), - GST_BUFFER_SIZE (buf)); - atom_moov_add_tag (qtmux->moov, fourcc, flags, GST_BUFFER_DATA (buf), - GST_BUFFER_SIZE (buf)); - done: - g_value_unset (&value); - } else - g_assert_not_reached (); - break; - } - } + g_assert (tag_matches[i].func); + tag_matches[i].func (qtmux, list, tag, tag2, fourcc); } /* add unparsed blobs if present */ @@ -532,8 +745,12 @@ gst_qt_mux_add_metadata_tags (GstQTMux * qtmux, const GstTagList * list) GST_PTR_FORMAT, i, num_tags, GST_BUFFER_SIZE (buf), caps); s = gst_caps_get_structure (caps, 0); if (s && (style = gst_structure_get_string (s, "style"))) { - /* FIXME make into a parameter */ - if (strcmp (style, "itunes") == 0) { + /* try to prevent some style tag ending up into another variant + * (todo: make into a list if more cases) */ + if ((strcmp (style, "itunes") == 0 && + qtmux_klass->format == GST_QT_MUX_FORMAT_MP4) || + (strcmp (style, "iso") == 0 && + qtmux_klass->format == GST_QT_MUX_FORMAT_3GP)) { GST_DEBUG_OBJECT (qtmux, "Adding private tag"); atom_moov_add_blob_tag (qtmux->moov, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); @@ -600,7 +817,7 @@ gst_qt_mux_send_buffer (GstQTMux * qtmux, GstBuffer * buf, guint64 * offset, res = gst_pad_push (qtmux->srcpad, buf); } - if (offset) + if (G_LIKELY (offset)) *offset += size; return res; @@ -690,7 +907,8 @@ seek_failed: * seek back to it later and update when the streams have finished. */ static GstFlowReturn -gst_qt_mux_send_mdat_header (GstQTMux * qtmux, guint64 * off, guint64 size) +gst_qt_mux_send_mdat_header (GstQTMux * qtmux, guint64 * off, guint64 size, + gboolean extended) { Atom *node_header; GstBuffer *buf; @@ -702,11 +920,15 @@ gst_qt_mux_send_mdat_header (GstQTMux * qtmux, guint64 * off, guint64 size) node_header = g_malloc0 (sizeof (Atom)); node_header->type = FOURCC_mdat; - /* use extended size */ - node_header->size = 1; - node_header->extended_size = 0; - if (size) - node_header->extended_size = size; + if (extended) { + /* use extended size */ + node_header->size = 1; + node_header->extended_size = 0; + if (size) + node_header->extended_size = size + 16; + } else { + node_header->size = size + 8; + } size = offset = 0; if (atom_copy_data (node_header, &data, &size, &offset) == 0) @@ -740,14 +962,31 @@ gst_qt_mux_update_mdat_size (GstQTMux * qtmux, guint64 mdat_pos, { GstEvent *event; GstBuffer *buf; + gboolean large_file; + + large_file = (mdat_size > MDAT_LARGE_FILE_LIMIT); + + if (large_file) + mdat_pos += 8; /* seek and rewrite the header */ event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, mdat_pos, GST_CLOCK_TIME_NONE, 0); gst_pad_push_event (qtmux->srcpad, event); - buf = gst_buffer_new_and_alloc (sizeof (guint64)); - GST_WRITE_UINT64_BE (GST_BUFFER_DATA (buf), mdat_size); + if (large_file) { + buf = gst_buffer_new_and_alloc (sizeof (guint64)); + GST_WRITE_UINT64_BE (GST_BUFFER_DATA (buf), mdat_size + 16); + } else { + guint8 *data; + + buf = gst_buffer_new_and_alloc (16); + data = GST_BUFFER_DATA (buf); + GST_WRITE_UINT32_BE (data, 8); + GST_WRITE_UINT32_LE (data + 4, FOURCC_free); + GST_WRITE_UINT32_BE (data + 8, mdat_size + 8); + GST_WRITE_UINT32_LE (data + 12, FOURCC_mdat); + } return gst_qt_mux_send_buffer (qtmux, buf, offset, FALSE); } @@ -798,6 +1037,7 @@ gst_qt_mux_stop_file (GstQTMux * qtmux) /* tags into file metadata */ gst_qt_mux_setup_metadata (qtmux); + large_file = (qtmux->mdat_size > MDAT_LARGE_FILE_LIMIT); /* if faststart, update the offset of the atoms in the movie with the offset * that the movie headers before mdat will cause */ if (qtmux->fast_start_file) { @@ -807,7 +1047,7 @@ gst_qt_mux_stop_file (GstQTMux * qtmux) goto serialize_error; GST_DEBUG_OBJECT (qtmux, "calculated moov atom size %" G_GUINT64_FORMAT, size); - offset += qtmux->header_size + MDAT_ATOM_HEADER_SIZE; + offset += qtmux->header_size + (large_file ? 16 : 8); } else offset = qtmux->header_size; atom_moov_chunks_add_offset (qtmux->moov, offset); @@ -828,12 +1068,11 @@ gst_qt_mux_stop_file (GstQTMux * qtmux) GST_DEBUG_OBJECT (qtmux, "Pushing movie atoms"); gst_qt_mux_send_buffer (qtmux, buffer, NULL, FALSE); - /* total mdat size as of now also includes the atom header */ - qtmux->mdat_size += MDAT_ATOM_HEADER_SIZE; /* if needed, send mdat atom and move buffered data into it */ if (qtmux->fast_start_file) { /* mdat size = accumulated (buffered data) + mdat atom header */ - ret = gst_qt_mux_send_mdat_header (qtmux, NULL, qtmux->mdat_size); + ret = gst_qt_mux_send_mdat_header (qtmux, NULL, qtmux->mdat_size, + large_file); if (ret != GST_FLOW_OK) return ret; ret = gst_qt_mux_send_buffered_data (qtmux, NULL); @@ -927,9 +1166,9 @@ gst_qt_mux_start_file (GstQTMux * qtmux) if (!qtmux->fast_start_file) goto open_failed; } else { - ret = gst_qt_mux_send_mdat_header (qtmux, &qtmux->header_size, 0); - /* mdat size position = current header pos - extended header size */ - qtmux->mdat_pos = qtmux->header_size - sizeof (guint64); + /* extended to ensure some spare space */ + qtmux->mdat_pos = qtmux->header_size; + ret = gst_qt_mux_send_mdat_header (qtmux, &qtmux->header_size, 0, TRUE); } GST_OBJECT_UNLOCK (qtmux); @@ -1464,7 +1703,6 @@ gst_qt_mux_video_sink_set_caps (GstPad * pad, GstCaps * caps) par_den = 1; gst_structure_get_fraction (structure, "pixel-aspect-ratio", &par_num, &par_den); - /* FIXME: pixel-aspect-ratio */ qtpad->is_out_of_order = FALSE; @@ -1477,6 +1715,8 @@ gst_qt_mux_video_sink_set_caps (GstPad * pad, GstCaps * caps) /* set common properties */ entry.width = width; entry.height = height; + entry.par_n = par_num; + entry.par_d = par_den; /* should be OK according to qt and iso spec, override if really needed */ entry.color_table_id = -1; entry.frame_count = 1; diff --git a/gst/qtmux/gstqtmux.h b/gst/qtmux/gstqtmux.h index a4701cc1..567773a0 100644 --- a/gst/qtmux/gstqtmux.h +++ b/gst/qtmux/gstqtmux.h @@ -109,7 +109,7 @@ struct _GstQTMux guint64 header_size; /* accumulated size of raw media data (a priori not including mdat header) */ guint64 mdat_size; - /* position of mdat extended size field (for later updating) */ + /* position of mdat atom (for later updating) */ guint64 mdat_pos; /* atom helper objects */ diff --git a/gst/qtmux/gstqtmuxmap.c b/gst/qtmux/gstqtmuxmap.c index e0e4faed..808856a2 100644 --- a/gst/qtmux/gstqtmuxmap.c +++ b/gst/qtmux/gstqtmuxmap.c @@ -201,6 +201,8 @@ gst_qt_mux_map_format_to_flavor (GstQTMuxFormat format) { if (format == GST_QT_MUX_FORMAT_QT) return ATOMS_TREE_FLAVOR_MOV; + else if (format == GST_QT_MUX_FORMAT_3GP) + return ATOMS_TREE_FLAVOR_3GP; else return ATOMS_TREE_FLAVOR_ISOM; } diff --git a/gst/rtpmanager/gstrtpjitterbuffer.c b/gst/rtpmanager/gstrtpjitterbuffer.c index e023df10..55126054 100644 --- a/gst/rtpmanager/gstrtpjitterbuffer.c +++ b/gst/rtpmanager/gstrtpjitterbuffer.c @@ -1688,9 +1688,8 @@ flushing: } pause: { - const gchar *reason = gst_flow_get_name (result); - - GST_DEBUG_OBJECT (jitterbuffer, "pausing task, reason %s", reason); + GST_DEBUG_OBJECT (jitterbuffer, "pausing task, reason %s", + gst_flow_get_name (result)); JBUF_LOCK (priv); /* store result */ diff --git a/gst/rtpmanager/gstrtpsession.c b/gst/rtpmanager/gstrtpsession.c index c33fdfc6..9407ee52 100644 --- a/gst/rtpmanager/gstrtpsession.c +++ b/gst/rtpmanager/gstrtpsession.c @@ -259,7 +259,7 @@ struct _GstRtpSessionPrivate static GstFlowReturn gst_rtp_session_process_rtp (RTPSession * sess, RTPSource * src, GstBuffer * buffer, gpointer user_data); static GstFlowReturn gst_rtp_session_send_rtp (RTPSession * sess, - RTPSource * src, GstBuffer * buffer, gpointer user_data); + RTPSource * src, gpointer data, gpointer user_data); static GstFlowReturn gst_rtp_session_send_rtcp (RTPSession * sess, RTPSource * src, GstBuffer * buffer, gboolean eos, gpointer user_data); static GstFlowReturn gst_rtp_session_sync_rtcp (RTPSession * sess, @@ -1032,8 +1032,8 @@ gst_rtp_session_clear_pt_map (GstRtpSession * rtpsession) g_hash_table_foreach_remove (rtpsession->priv->ptmap, return_true, NULL); } -/* called when the session manager has an RTP packet ready for further - * processing */ +/* called when the session manager has an RTP packet or a list of packets + * ready for further processing */ static GstFlowReturn gst_rtp_session_process_rtp (RTPSession * sess, RTPSource * src, GstBuffer * buffer, gpointer user_data) @@ -1060,7 +1060,7 @@ gst_rtp_session_process_rtp (RTPSession * sess, RTPSource * src, * sending */ static GstFlowReturn gst_rtp_session_send_rtp (RTPSession * sess, RTPSource * src, - GstBuffer * buffer, gpointer user_data) + gpointer data, gpointer user_data) { GstFlowReturn result; GstRtpSession *rtpsession; @@ -1069,12 +1069,17 @@ gst_rtp_session_send_rtp (RTPSession * sess, RTPSource * src, rtpsession = GST_RTP_SESSION (user_data); priv = rtpsession->priv; - GST_LOG_OBJECT (rtpsession, "sending RTP packet"); - if (rtpsession->send_rtp_src) { - result = gst_pad_push (rtpsession->send_rtp_src, buffer); + if (GST_IS_BUFFER (data)) { + GST_LOG_OBJECT (rtpsession, "sending RTP packet"); + result = gst_pad_push (rtpsession->send_rtp_src, GST_BUFFER_CAST (data)); + } else { + GST_LOG_OBJECT (rtpsession, "sending RTP list"); + result = gst_pad_push_list (rtpsession->send_rtp_src, + GST_BUFFER_LIST_CAST (data)); + } } else { - gst_buffer_unref (buffer); + gst_mini_object_unref (GST_MINI_OBJECT_CAST (data)); result = GST_FLOW_OK; } return result; @@ -1642,11 +1647,12 @@ gst_rtp_session_setcaps_send_rtp (GstPad * pad, GstCaps * caps) return TRUE; } -/* Recieve an RTP packet to be send to the receivers, send to RTP session - * manager and forward to send_rtp_src. +/* Recieve an RTP packet or a list of packets to be send to the receivers, + * send to RTP session manager and forward to send_rtp_src. */ static GstFlowReturn -gst_rtp_session_chain_send_rtp (GstPad * pad, GstBuffer * buffer) +gst_rtp_session_chain_send_rtp_common (GstPad * pad, gpointer data, + gboolean is_list) { GstRtpSession *rtpsession; GstRtpSessionPrivate *priv; @@ -1658,10 +1664,22 @@ gst_rtp_session_chain_send_rtp (GstPad * pad, GstBuffer * buffer) rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); priv = rtpsession->priv; - GST_LOG_OBJECT (rtpsession, "received RTP packet"); + GST_LOG_OBJECT (rtpsession, "received RTP %s", is_list ? "list" : "packet"); /* get NTP time when this packet was captured, this depends on the timestamp. */ - timestamp = GST_BUFFER_TIMESTAMP (buffer); + if (is_list) { + GstBuffer *buffer = NULL; + + /* All groups in an list have the same timestamp. + * So, just take it from the first group. */ + buffer = gst_buffer_list_get (GST_BUFFER_LIST_CAST (data), 0, 0); + if (buffer) + timestamp = GST_BUFFER_TIMESTAMP (buffer); + else + timestamp = -1; + } else { + timestamp = GST_BUFFER_TIMESTAMP (GST_BUFFER_CAST (data)); + } if (GST_CLOCK_TIME_IS_VALID (timestamp)) { /* convert to running time using the segment start value. */ ntpnstime = @@ -1676,7 +1694,9 @@ gst_rtp_session_chain_send_rtp (GstPad * pad, GstBuffer * buffer) } current_time = gst_clock_get_time (priv->sysclock); - ret = rtp_session_send_rtp (priv->session, buffer, current_time, ntpnstime); + ret = + rtp_session_send_rtp (priv->session, data, is_list, current_time, + ntpnstime); if (ret != GST_FLOW_OK) goto push_error; @@ -1694,6 +1714,18 @@ push_error: } } +static GstFlowReturn +gst_rtp_session_chain_send_rtp (GstPad * pad, GstBuffer * buffer) +{ + return gst_rtp_session_chain_send_rtp_common (pad, buffer, FALSE); +} + +static GstFlowReturn +gst_rtp_session_chain_send_rtp_list (GstPad * pad, GstBufferList * list) +{ + return gst_rtp_session_chain_send_rtp_common (pad, list, TRUE); +} + /* Create sinkpad to receive RTP packets from senders. This will also create a * srcpad for the RTP packets. */ @@ -1817,6 +1849,8 @@ create_send_rtp_sink (GstRtpSession * rtpsession) "send_rtp_sink"); gst_pad_set_chain_function (rtpsession->send_rtp_sink, gst_rtp_session_chain_send_rtp); + gst_pad_set_chain_list_function (rtpsession->send_rtp_sink, + gst_rtp_session_chain_send_rtp_list); gst_pad_set_getcaps_function (rtpsession->send_rtp_sink, gst_rtp_session_getcaps_send_rtp); gst_pad_set_setcaps_function (rtpsession->send_rtp_sink, diff --git a/gst/rtpmanager/rtpsession.c b/gst/rtpmanager/rtpsession.c index 219aacf1..cda04182 100644 --- a/gst/rtpmanager/rtpsession.c +++ b/gst/rtpmanager/rtpsession.c @@ -958,7 +958,7 @@ rtp_session_get_sdes_string (RTPSession * sess, GstRTCPSDESType type) } static GstFlowReturn -source_push_rtp (RTPSource * source, GstBuffer * buffer, RTPSession * session) +source_push_rtp (RTPSource * source, gpointer data, RTPSession * session) { GstFlowReturn result = GST_FLOW_OK; @@ -969,21 +969,21 @@ source_push_rtp (RTPSource * source, GstBuffer * buffer, RTPSession * session) if (session->callbacks.send_rtp) result = - session->callbacks.send_rtp (session, source, buffer, + session->callbacks.send_rtp (session, source, data, session->send_rtp_user_data); - else - gst_buffer_unref (buffer); - + else { + gst_mini_object_unref (GST_MINI_OBJECT_CAST (data)); + } } else { GST_LOG ("source %08x pushed receiver RTP packet", source->ssrc); RTP_SESSION_UNLOCK (session); if (session->callbacks.process_rtp) result = - session->callbacks.process_rtp (session, source, buffer, - session->process_rtp_user_data); + session->callbacks.process_rtp (session, source, + GST_BUFFER_CAST (data), session->process_rtp_user_data); else - gst_buffer_unref (buffer); + gst_buffer_unref (GST_BUFFER_CAST (data)); } RTP_SESSION_LOCK (session); @@ -1962,7 +1962,7 @@ ignore: /** * rtp_session_send_rtp: * @sess: an #RTPSession - * @buffer: an RTP buffer + * @data: pointer to either an RTP buffer or a list of RTP buffers * @current_time: the current system time * @ntpnstime: the NTP time in nanoseconds of when this buffer was captured. * This is the buffer timestamp converted to NTP time. @@ -1973,20 +1973,27 @@ ignore: * Returns: a #GstFlowReturn. */ GstFlowReturn -rtp_session_send_rtp (RTPSession * sess, GstBuffer * buffer, +rtp_session_send_rtp (RTPSession * sess, gpointer data, gboolean is_list, GstClockTime current_time, guint64 ntpnstime) { GstFlowReturn result; RTPSource *source; gboolean prevsender; + gboolean valid_packet; g_return_val_if_fail (RTP_IS_SESSION (sess), GST_FLOW_ERROR); - g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR); + g_return_val_if_fail (is_list || GST_IS_BUFFER (data), GST_FLOW_ERROR); - if (!gst_rtp_buffer_validate (buffer)) + if (is_list) { + valid_packet = gst_rtp_buffer_list_validate (GST_BUFFER_LIST_CAST (data)); + } else { + valid_packet = gst_rtp_buffer_validate (GST_BUFFER_CAST (data)); + } + + if (!valid_packet) goto invalid_packet; - GST_LOG ("received RTP packet for sending"); + GST_LOG ("received RTP %s for sending", is_list ? "list" : "packet"); RTP_SESSION_LOCK (sess); source = sess->source; @@ -1997,7 +2004,7 @@ rtp_session_send_rtp (RTPSession * sess, GstBuffer * buffer, prevsender = RTP_SOURCE_IS_SENDER (source); /* we use our own source to send */ - result = rtp_source_send_rtp (source, buffer, ntpnstime); + result = rtp_source_send_rtp (source, data, is_list, ntpnstime); if (RTP_SOURCE_IS_SENDER (source) && !prevsender) sess->stats.sender_sources++; @@ -2008,7 +2015,7 @@ rtp_session_send_rtp (RTPSession * sess, GstBuffer * buffer, /* ERRORS */ invalid_packet: { - gst_buffer_unref (buffer); + gst_mini_object_unref (GST_MINI_OBJECT_CAST (data)); GST_DEBUG ("invalid RTP packet received"); return GST_FLOW_OK; } diff --git a/gst/rtpmanager/rtpsession.h b/gst/rtpmanager/rtpsession.h index 7e327a7d..6312f1c1 100644 --- a/gst/rtpmanager/rtpsession.h +++ b/gst/rtpmanager/rtpsession.h @@ -65,7 +65,7 @@ typedef GstFlowReturn (*RTPSessionProcessRTP) (RTPSession *sess, RTPSource *src, * * Returns: a #GstFlowReturn. */ -typedef GstFlowReturn (*RTPSessionSendRTP) (RTPSession *sess, RTPSource *src, GstBuffer *buffer, gpointer user_data); +typedef GstFlowReturn (*RTPSessionSendRTP) (RTPSession *sess, RTPSource *src, gpointer data, gpointer user_data); /** * RTPSessionSendRTCP: @@ -288,7 +288,7 @@ GstFlowReturn rtp_session_process_rtcp (RTPSession *sess, GstBuffer GstClockTime current_time); /* processing packets for sending */ -GstFlowReturn rtp_session_send_rtp (RTPSession *sess, GstBuffer *buffer, +GstFlowReturn rtp_session_send_rtp (RTPSession *sess, gpointer data, gboolean is_list, GstClockTime current_time, guint64 ntpnstime); /* stopping the session */ diff --git a/gst/rtpmanager/rtpsource.c b/gst/rtpmanager/rtpsource.c index ed080717..209c17b5 100644 --- a/gst/rtpmanager/rtpsource.c +++ b/gst/rtpmanager/rtpsource.c @@ -26,7 +26,7 @@ GST_DEBUG_CATEGORY_STATIC (rtp_source_debug); #define GST_CAT_DEFAULT rtp_source_debug -#define RTP_MAX_PROBATION_LEN 32 +#define RTP_MAX_PROBATION_LEN 32 /* signals and args */ enum @@ -1091,41 +1091,73 @@ rtp_source_process_bye (RTPSource * src, const gchar * reason) src->received_bye = TRUE; } +static GstBufferListItem +set_ssrc (GstBuffer ** buffer, guint group, guint idx, RTPSource * src) +{ + *buffer = gst_buffer_make_writable (*buffer); + gst_rtp_buffer_set_ssrc (*buffer, src->ssrc); + return GST_BUFFER_LIST_SKIP_GROUP; +} + /** * rtp_source_send_rtp: * @src: an #RTPSource - * @buffer: an RTP buffer + * @data: an RTP buffer or a list of RTP buffers + * @is_list: if @data is a buffer or list * @ntpnstime: the NTP time when this buffer was captured in nanoseconds. This * is the buffer timestamp converted to NTP time. * - * Send an RTP @buffer originating from @src. This will make @src a sender. - * This function takes ownership of @buffer and modifies the SSRC in the RTP - * packet to that of @src when needed. + * Send @data (an RTP buffer or list of buffers) originating from @src. + * This will make @src a sender. This function takes ownership of @data and + * modifies the SSRC in the RTP packet to that of @src when needed. * * Returns: a #GstFlowReturn. */ GstFlowReturn -rtp_source_send_rtp (RTPSource * src, GstBuffer * buffer, guint64 ntpnstime) +rtp_source_send_rtp (RTPSource * src, gpointer data, gboolean is_list, + guint64 ntpnstime) { - GstFlowReturn result = GST_FLOW_OK; + GstFlowReturn result; guint len; guint32 rtptime; guint64 ext_rtptime; guint64 ntp_diff, rtp_diff; guint64 elapsed; + GstBufferList *list = NULL; + GstBuffer *buffer = NULL; + guint packets; + guint32 ssrc; g_return_val_if_fail (RTP_IS_SOURCE (src), GST_FLOW_ERROR); - g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR); + g_return_val_if_fail (is_list || GST_IS_BUFFER (data), GST_FLOW_ERROR); - len = gst_rtp_buffer_get_payload_len (buffer); + if (is_list) { + list = GST_BUFFER_LIST_CAST (data); + /* We can grab the caps from the first group, since all + * groups of a buffer list have same caps. */ + buffer = gst_buffer_list_get (list, 0, 0); + if (!buffer) + goto no_buffer; + } else { + buffer = GST_BUFFER_CAST (data); + } rtp_source_update_caps (src, GST_BUFFER_CAPS (buffer)); /* we are a sender now */ src->is_sender = TRUE; + if (is_list) { + /* Each group makes up a network packet. */ + packets = gst_buffer_list_n_groups (list); + len = gst_rtp_buffer_list_get_payload_len (list); + } else { + packets = 1; + len = gst_rtp_buffer_get_payload_len (buffer); + } + /* update stats for the SR */ - src->stats.packets_sent++; + src->stats.packets_sent += packets; src->stats.octets_sent += len; src->bytes_sent += len; @@ -1156,7 +1188,11 @@ rtp_source_send_rtp (RTPSource * src, GstBuffer * buffer, guint64 ntpnstime) src->bitrate = 0; } - rtptime = gst_rtp_buffer_get_timestamp (buffer); + if (is_list) { + rtptime = gst_rtp_buffer_list_get_timestamp (list); + } else { + rtptime = gst_rtp_buffer_get_timestamp (buffer); + } ext_rtptime = src->last_rtptime; ext_rtptime = gst_rtp_buffer_ext_timestamp (&ext_rtptime, rtptime); @@ -1180,31 +1216,53 @@ rtp_source_send_rtp (RTPSource * src, GstBuffer * buffer, guint64 ntpnstime) src->last_ntpnstime = ntpnstime; /* push packet */ - if (src->callbacks.push_rtp) { - guint32 ssrc; + if (!src->callbacks.push_rtp) + goto no_callback; + if (is_list) { + ssrc = gst_rtp_buffer_list_get_ssrc (list); + } else { ssrc = gst_rtp_buffer_get_ssrc (buffer); - if (ssrc != src->ssrc) { - /* the SSRC of the packet is not correct, make a writable buffer and - * update the SSRC. This could involve a complete copy of the packet when - * it is not writable. Usually the payloader will use caps negotiation to - * get the correct SSRC from the session manager before pushing anything. */ - buffer = gst_buffer_make_writable (buffer); - - /* FIXME, we don't want to warn yet because we can't inform any payloader - * of the changes SSRC yet because we don't implement pad-alloc. */ - GST_LOG ("updating SSRC from %08x to %08x, fix the payloader", ssrc, - src->ssrc); - gst_rtp_buffer_set_ssrc (buffer, src->ssrc); + } + + if (ssrc != src->ssrc) { + /* the SSRC of the packet is not correct, make a writable buffer and + * update the SSRC. This could involve a complete copy of the packet when + * it is not writable. Usually the payloader will use caps negotiation to + * get the correct SSRC from the session manager before pushing anything. */ + + /* FIXME, we don't want to warn yet because we can't inform any payloader + * of the changes SSRC yet because we don't implement pad-alloc. */ + GST_LOG ("updating SSRC from %08x to %08x, fix the payloader", ssrc, + src->ssrc); + + if (is_list) { + list = gst_buffer_list_make_writable (list); + gst_buffer_list_foreach (list, (GstBufferListFunc) set_ssrc, src); + } else { + set_ssrc (&buffer, 0, 0, src); } - GST_LOG ("pushing RTP packet %" G_GUINT64_FORMAT, src->stats.packets_sent); - result = src->callbacks.push_rtp (src, buffer, src->user_data); - } else { - GST_WARNING ("no callback installed, dropping packet"); - gst_buffer_unref (buffer); } + GST_LOG ("pushing RTP %s %" G_GUINT64_FORMAT, is_list ? "list" : "packet", + src->stats.packets_sent); + + result = src->callbacks.push_rtp (src, data, src->user_data); return result; + + /* ERRORS */ +no_buffer: + { + GST_WARNING ("no buffers in buffer list"); + gst_mini_object_unref (GST_MINI_OBJECT_CAST (data)); + return GST_FLOW_OK; + } +no_callback: + { + GST_WARNING ("no callback installed, dropping packet"); + gst_mini_object_unref (GST_MINI_OBJECT_CAST (data)); + return GST_FLOW_OK; + } } /** diff --git a/gst/rtpmanager/rtpsource.h b/gst/rtpmanager/rtpsource.h index a44ac1cd..8286f2ec 100644 --- a/gst/rtpmanager/rtpsource.h +++ b/gst/rtpmanager/rtpsource.h @@ -194,7 +194,7 @@ void rtp_source_set_rtcp_from (RTPSource *src, GstNetAddress *a /* handling RTP */ GstFlowReturn rtp_source_process_rtp (RTPSource *src, GstBuffer *buffer, RTPArrivalStats *arrival); -GstFlowReturn rtp_source_send_rtp (RTPSource *src, GstBuffer *buffer, guint64 ntpnstime); +GstFlowReturn rtp_source_send_rtp (RTPSource *src, gpointer data, gboolean is_list, guint64 ntpnstime); /* RTCP messages */ void rtp_source_process_bye (RTPSource *src, const gchar *reason); diff --git a/gst/scaletempo/gstscaletempo.c b/gst/scaletempo/gstscaletempo.c index ad3b949a..ed25d132 100644 --- a/gst/scaletempo/gstscaletempo.c +++ b/gst/scaletempo/gstscaletempo.c @@ -230,7 +230,7 @@ best_overlap_offset_s16 (GstScaletempo * scaletempo) ppc = p->buf_pre_corr; ppc += p->samples_overlap - p->samples_per_frame; ps += p->samples_overlap - p->samples_per_frame; - i = -(p->samples_overlap - p->samples_per_frame); + i = -((glong) p->samples_overlap - (glong) p->samples_per_frame); do { corr += ppc[i + 0] * ps[i + 0]; corr += ppc[i + 1] * ps[i + 1]; diff --git a/gst/selector/gstinputselector.c b/gst/selector/gstinputselector.c index 08d3d497..832707d0 100644 --- a/gst/selector/gstinputselector.c +++ b/gst/selector/gstinputselector.c @@ -420,6 +420,8 @@ gst_selector_pad_event (GstPad * pad, GstEvent * event) gst_tag_list_free (oldtags); GST_DEBUG_OBJECT (pad, "received tags %" GST_PTR_FORMAT, newtags); GST_OBJECT_UNLOCK (selpad); + + g_object_notify (G_OBJECT (selpad), "tags"); break; } case GST_EVENT_EOS: @@ -1415,6 +1417,7 @@ gst_input_selector_check_eos (GstElement * selector) if (!pad->eos) { done = TRUE; } + gst_object_unref (pad); break; case GST_ITERATOR_RESYNC: gst_iterator_resync (it); diff --git a/gst/selector/gstoutputselector.c b/gst/selector/gstoutputselector.c index bf354a74..15c0a726 100644 --- a/gst/selector/gstoutputselector.c +++ b/gst/selector/gstoutputselector.c @@ -196,7 +196,7 @@ gst_output_selector_set_property (GObject * object, guint prop_id, next_pad = g_value_get_object (value); - GST_LOG_OBJECT (sel, "Activating pad %s:%s", + GST_INFO_OBJECT (sel, "Activating pad %s:%s", GST_DEBUG_PAD_NAME (next_pad)); GST_OBJECT_LOCK (object); @@ -262,11 +262,11 @@ gst_output_selector_buffer_alloc (GstPad * pad, guint64 offset, guint size, GstPad *allocpad; sel = GST_OUTPUT_SELECTOR (GST_PAD_PARENT (pad)); - res = GST_FLOW_NOT_LINKED; GST_OBJECT_LOCK (sel); - if ((allocpad = sel->active_srcpad)) { + allocpad = sel->pending_srcpad ? sel->pending_srcpad : sel->active_srcpad; + if (allocpad) { /* if we had a previous pad we used for allocating a buffer, continue using * it. */ GST_DEBUG_OBJECT (sel, "using pad %s:%s for alloc", @@ -278,9 +278,16 @@ gst_output_selector_buffer_alloc (GstPad * pad, guint64 offset, guint size, gst_object_unref (allocpad); GST_OBJECT_LOCK (sel); + } else { + /* fallback case, allocate a buffer of our own, add pad caps. */ + GST_DEBUG_OBJECT (pad, "fallback buffer alloc"); + *buf = NULL; + res = GST_FLOW_OK; } GST_OBJECT_UNLOCK (sel); + GST_DEBUG_OBJECT (sel, "buffer alloc finished: %s", gst_flow_get_name (res)); + return res; } @@ -330,14 +337,24 @@ gst_output_selector_release_pad (GstElement * element, GstPad * pad) static gboolean gst_output_selector_switch (GstOutputSelector * osel) { - gboolean res = TRUE; + gboolean res = FALSE; GstEvent *ev = NULL; GstSegment *seg = NULL; gint64 start = 0, position = 0; + /* Switch */ + GST_OBJECT_LOCK (GST_OBJECT (osel)); GST_INFO ("switching to pad %" GST_PTR_FORMAT, osel->pending_srcpad); - if (gst_pad_is_linked (osel->pending_srcpad)) { + osel->active_srcpad = osel->pending_srcpad; + res = TRUE; + } + gst_object_unref (osel->pending_srcpad); + osel->pending_srcpad = NULL; + GST_OBJECT_UNLOCK (GST_OBJECT (osel)); + + /* Send NEWSEGMENT event and latest buffer if switching succeeded */ + if (res) { /* Send NEWSEGMENT to the pad we are going to switch to */ seg = &osel->segment; /* If resending then mark newsegment start and position accordingly */ @@ -349,29 +366,22 @@ gst_output_selector_switch (GstOutputSelector * osel) } ev = gst_event_new_new_segment (TRUE, seg->rate, seg->format, start, seg->stop, position); - if (!gst_pad_push_event (osel->pending_srcpad, ev)) { + if (!gst_pad_push_event (osel->active_srcpad, ev)) { GST_WARNING_OBJECT (osel, "newsegment handling failed in %" GST_PTR_FORMAT, - osel->pending_srcpad); + osel->active_srcpad); } /* Resend latest buffer to newly switched pad */ if (osel->resend_latest && osel->latest_buffer) { GST_INFO ("resending latest buffer"); - gst_pad_push (osel->pending_srcpad, osel->latest_buffer); + gst_pad_push (osel->active_srcpad, osel->latest_buffer); osel->latest_buffer = NULL; } - - /* Switch */ - osel->active_srcpad = osel->pending_srcpad; } else { GST_WARNING_OBJECT (osel, "switch failed, pad not linked"); - res = FALSE; } - gst_object_unref (osel->pending_srcpad); - osel->pending_srcpad = NULL; - return res; } @@ -389,10 +399,15 @@ gst_output_selector_chain (GstPad * pad, GstBuffer * buf) gst_output_selector_switch (osel); } - /* Keep reference to latest buffer to resend it after switch */ - if (osel->latest_buffer) + if (osel->latest_buffer) { gst_buffer_unref (osel->latest_buffer); - osel->latest_buffer = gst_buffer_ref (buf); + osel->latest_buffer = NULL; + } + + if (osel->resend_latest) { + /* Keep reference to latest buffer to resend it after switch */ + osel->latest_buffer = gst_buffer_ref (buf); + } /* Keep track of last stop and use it in NEWSEGMENT start after switching to a new src pad */ diff --git a/gst/shapewipe/gstshapewipe.c b/gst/shapewipe/gstshapewipe.c index c2c4ce2b..95218801 100644 --- a/gst/shapewipe/gstshapewipe.c +++ b/gst/shapewipe/gstshapewipe.c @@ -56,6 +56,11 @@ static void gst_shape_wipe_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_shape_wipe_reset (GstShapeWipe * self); +static void gst_shape_wipe_update_qos (GstShapeWipe * self, gdouble proportion, + GstClockTimeDiff diff, GstClockTime time); +static void gst_shape_wipe_reset_qos (GstShapeWipe * self); +static void gst_shape_wipe_read_qos (GstShapeWipe * self, gdouble * proportion, + GstClockTime * time); static GstStateChangeReturn gst_shape_wipe_change_state (GstElement * element, GstStateChange transition); @@ -67,6 +72,10 @@ static gboolean gst_shape_wipe_video_sink_event (GstPad * pad, static gboolean gst_shape_wipe_video_sink_setcaps (GstPad * pad, GstCaps * caps); static GstCaps *gst_shape_wipe_video_sink_getcaps (GstPad * pad); +static GstFlowReturn gst_shape_wipe_video_sink_bufferalloc (GstPad * pad, + guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf); +static gboolean gst_shape_wipe_video_sink_query (GstPad * pad, + GstQuery * query); static GstFlowReturn gst_shape_wipe_mask_sink_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_shape_wipe_mask_sink_event (GstPad * pad, GstEvent * event); @@ -74,6 +83,7 @@ static gboolean gst_shape_wipe_mask_sink_setcaps (GstPad * pad, GstCaps * caps); static GstCaps *gst_shape_wipe_mask_sink_getcaps (GstPad * pad); static gboolean gst_shape_wipe_src_event (GstPad * pad, GstEvent * event); static GstCaps *gst_shape_wipe_src_getcaps (GstPad * pad); +static gboolean gst_shape_wipe_src_query (GstPad * pad, GstQuery * query); enum { @@ -165,6 +175,10 @@ gst_shape_wipe_init (GstShapeWipe * self, GstShapeWipeClass * g_class) GST_DEBUG_FUNCPTR (gst_shape_wipe_video_sink_setcaps)); gst_pad_set_getcaps_function (self->video_sinkpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_video_sink_getcaps)); + gst_pad_set_bufferalloc_function (self->video_sinkpad, + GST_DEBUG_FUNCPTR (gst_shape_wipe_video_sink_bufferalloc)); + gst_pad_set_query_function (self->video_sinkpad, + GST_DEBUG_FUNCPTR (gst_shape_wipe_video_sink_query)); gst_element_add_pad (GST_ELEMENT (self), self->video_sinkpad); self->mask_sinkpad = @@ -184,6 +198,8 @@ gst_shape_wipe_init (GstShapeWipe * self, GstShapeWipeClass * g_class) GST_DEBUG_FUNCPTR (gst_shape_wipe_src_event)); gst_pad_set_getcaps_function (self->srcpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_src_getcaps)); + gst_pad_set_query_function (self->srcpad, + GST_DEBUG_FUNCPTR (gst_shape_wipe_src_query)); gst_element_add_pad (GST_ELEMENT (self), self->srcpad); self->mask_mutex = g_mutex_new (); @@ -263,6 +279,28 @@ gst_shape_wipe_reset (GstShapeWipe * self) self->mask_bpp = 0; gst_segment_init (&self->segment, GST_FORMAT_TIME); + + gst_shape_wipe_reset_qos (self); + self->frame_duration = 0; +} + +static GstFlowReturn +gst_shape_wipe_video_sink_bufferalloc (GstPad * pad, guint64 offset, guint size, + GstCaps * caps, GstBuffer ** buf) +{ + GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); + GstFlowReturn ret = GST_FLOW_OK; + + GST_DEBUG_OBJECT (pad, "Allocating buffer with offset 0x%" G_GINT64_MODIFIER + "x and size %u with caps: %" GST_PTR_FORMAT, offset, size, caps); + + *buf = NULL; + + ret = gst_pad_alloc_buffer (self->srcpad, offset, size, caps, buf); + + gst_object_unref (self); + + return ret; } static gboolean @@ -272,13 +310,15 @@ gst_shape_wipe_video_sink_setcaps (GstPad * pad, GstCaps * caps) gboolean ret = TRUE; GstStructure *s; gint width, height; + gint fps_n, fps_d; GST_DEBUG_OBJECT (pad, "Setting caps: %" GST_PTR_FORMAT, caps); s = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (s, "width", &width) || - !gst_structure_get_int (s, "height", &height)) { + !gst_structure_get_int (s, "height", &height) || + !gst_structure_get_fraction (s, "framerate", &fps_n, &fps_d)) { ret = FALSE; goto done; } @@ -294,6 +334,8 @@ gst_shape_wipe_video_sink_setcaps (GstPad * pad, GstCaps * caps) g_mutex_unlock (self->mask_mutex); } + self->frame_duration = gst_util_uint64_scale (GST_SECOND, fps_d, fps_n); + ret = gst_pad_set_caps (self->srcpad, caps); done: @@ -567,6 +609,123 @@ gst_shape_wipe_src_getcaps (GstPad * pad) return ret; } +static gboolean +gst_shape_wipe_video_sink_query (GstPad * pad, GstQuery * query) +{ + GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); + gboolean ret; + GstPad *peer = gst_pad_get_peer (self->srcpad); + + GST_DEBUG_OBJECT (pad, "Handling query of type '%s'", + gst_query_type_get_name (GST_QUERY_TYPE (query))); + + if (!peer) { + GST_INFO_OBJECT (pad, "No peer yet"); + ret = FALSE; + } else { + ret = gst_pad_query (peer, query); + gst_object_unref (peer); + } + + gst_object_unref (self); + return ret; +} + +static gboolean +gst_shape_wipe_src_query (GstPad * pad, GstQuery * query) +{ + GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); + gboolean ret; + GstPad *peer = gst_pad_get_peer (self->video_sinkpad); + + GST_DEBUG_OBJECT (pad, "Handling query of type '%s'", + gst_query_type_get_name (GST_QUERY_TYPE (query))); + + if (!peer) { + GST_INFO_OBJECT (pad, "No peer yet"); + ret = FALSE; + } else { + ret = gst_pad_query (peer, query); + gst_object_unref (peer); + } + + gst_object_unref (self); + return ret; +} + +static void +gst_shape_wipe_update_qos (GstShapeWipe * self, gdouble proportion, + GstClockTimeDiff diff, GstClockTime timestamp) +{ + GST_OBJECT_LOCK (self); + self->proportion = proportion; + if (G_LIKELY (timestamp != GST_CLOCK_TIME_NONE)) { + if (G_UNLIKELY (diff > 0)) + self->earliest_time = timestamp + 2 * diff + self->frame_duration; + else + self->earliest_time = timestamp + diff; + } else { + self->earliest_time = GST_CLOCK_TIME_NONE; + } + GST_OBJECT_UNLOCK (self); +} + +static void +gst_shape_wipe_reset_qos (GstShapeWipe * self) +{ + gst_shape_wipe_update_qos (self, 0.5, 0, GST_CLOCK_TIME_NONE); +} + +static void +gst_shape_wipe_read_qos (GstShapeWipe * self, gdouble * proportion, + GstClockTime * time) +{ + GST_OBJECT_LOCK (self); + *proportion = self->proportion; + *time = self->earliest_time; + GST_OBJECT_UNLOCK (self); +} + +/* Perform qos calculations before processing the next frame. Returns TRUE if + * the frame should be processed, FALSE if the frame can be dropped entirely */ +static gboolean +gst_shape_wipe_do_qos (GstShapeWipe * self, GstClockTime timestamp) +{ + GstClockTime qostime, earliest_time; + gdouble proportion; + + /* no timestamp, can't do QoS => process frame */ + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (timestamp))) { + GST_LOG_OBJECT (self, "invalid timestamp, can't do QoS, process frame"); + return TRUE; + } + + /* get latest QoS observation values */ + gst_shape_wipe_read_qos (self, &proportion, &earliest_time); + + /* skip qos if we have no observation (yet) => process frame */ + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (earliest_time))) { + GST_LOG_OBJECT (self, "no observation yet, process frame"); + return TRUE; + } + + /* qos is done on running time */ + qostime = gst_segment_to_running_time (&self->segment, GST_FORMAT_TIME, + timestamp); + + /* see how our next timestamp relates to the latest qos timestamp */ + GST_LOG_OBJECT (self, "qostime %" GST_TIME_FORMAT ", earliest %" + GST_TIME_FORMAT, GST_TIME_ARGS (qostime), GST_TIME_ARGS (earliest_time)); + + if (qostime != GST_CLOCK_TIME_NONE && qostime <= earliest_time) { + GST_DEBUG_OBJECT (self, "we are late, drop frame"); + return FALSE; + } + + GST_LOG_OBJECT (self, "process frame"); + return TRUE; +} + static GstFlowReturn gst_shape_wipe_blend_16 (GstShapeWipe * self, GstBuffer * inbuf, GstBuffer * maskbuf, GstBuffer * outbuf) @@ -686,6 +845,7 @@ gst_shape_wipe_video_sink_chain (GstPad * pad, GstBuffer * buffer) GstFlowReturn ret = GST_FLOW_OK; GstBuffer *mask = NULL, *outbuf = NULL; GstClockTime timestamp; + gboolean new_outbuf = FALSE; timestamp = GST_BUFFER_TIMESTAMP (buffer); timestamp = @@ -711,13 +871,28 @@ gst_shape_wipe_video_sink_chain (GstPad * pad, GstBuffer * buffer) } g_mutex_unlock (self->mask_mutex); - ret = - gst_pad_alloc_buffer_and_set_caps (self->srcpad, GST_BUFFER_OFFSET_NONE, - GST_BUFFER_SIZE (buffer), GST_PAD_CAPS (self->srcpad), &outbuf); - if (G_UNLIKELY (ret != GST_FLOW_OK)) { + if (!gst_shape_wipe_do_qos (self, GST_BUFFER_TIMESTAMP (buffer))) { gst_buffer_unref (buffer); gst_buffer_unref (mask); - return ret; + return GST_FLOW_OK; + } + + /* Try to blend inplace, if it's not possible + * get a new buffer from downstream. + */ + if (!gst_buffer_is_writable (buffer)) { + ret = + gst_pad_alloc_buffer_and_set_caps (self->srcpad, GST_BUFFER_OFFSET_NONE, + GST_BUFFER_SIZE (buffer), GST_PAD_CAPS (self->srcpad), &outbuf); + if (G_UNLIKELY (ret != GST_FLOW_OK)) { + gst_buffer_unref (buffer); + gst_buffer_unref (mask); + return ret; + } + gst_buffer_copy_metadata (outbuf, buffer, GST_BUFFER_COPY_ALL); + new_outbuf = TRUE; + } else { + outbuf = buffer; } if (self->mask_bpp == 16) @@ -726,7 +901,9 @@ gst_shape_wipe_video_sink_chain (GstPad * pad, GstBuffer * buffer) ret = gst_shape_wipe_blend_8 (self, buffer, mask, outbuf); gst_buffer_unref (mask); - gst_buffer_unref (buffer); + if (new_outbuf) + gst_buffer_unref (buffer); + if (ret != GST_FLOW_OK) { gst_buffer_unref (outbuf); return ret; @@ -813,6 +990,9 @@ gst_shape_wipe_video_sink_event (GstPad * pad, GstEvent * event) } } /* fall through */ + case GST_EVENT_FLUSH_STOP: + gst_shape_wipe_reset_qos (self); + /* fall through */ default: ret = gst_pad_push_event (self->srcpad, event); break; @@ -839,6 +1019,16 @@ gst_shape_wipe_src_event (GstPad * pad, GstEvent * event) gboolean ret; switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_QOS:{ + GstClockTimeDiff diff; + GstClockTime timestamp; + gdouble proportion; + + gst_event_parse_qos (event, &proportion, &diff, ×tamp); + + gst_shape_wipe_update_qos (self, proportion, diff, timestamp); + } + /* fall through */ default: ret = gst_pad_push_event (self->video_sinkpad, event); break; diff --git a/gst/shapewipe/gstshapewipe.h b/gst/shapewipe/gstshapewipe.h index 00ed776e..2cc44831 100644 --- a/gst/shapewipe/gstshapewipe.h +++ b/gst/shapewipe/gstshapewipe.h @@ -60,6 +60,10 @@ struct _GstShapeWipe gint mask_bpp; gint width, height; + + gdouble proportion; + GstClockTime earliest_time; + GstClockTime frame_duration; }; struct _GstShapeWipeClass @@ -1 +1 @@ -af az bg ca cs da de en_GB es fi fr hu id it ky lt mt nb nl or pl pt_BR ru sk sq sr sv tr uk vi zh_CN +af az bg ca cs da de en_GB es fi fr hu id it ja ky lt mt nb nl or pl pt_BR ru sk sq sr sv tr uk vi zh_CN @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins 0.7.6\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2004-03-18 14:16+0200\n" "Last-Translator: Petri Jooste <rkwjpj@puk.ac.za>\n" "Language-Team: Afrikaans <i18n@af.org.za>\n" @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-0.8.0\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2004-03-19 18:29+0200\n" "Last-Translator: Metin Amiroff <metin@karegen.com>\n" "Language-Team: Azerbaijani <translation-team-az@lists.sourceforge.net>\n" @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: gst-plugins-bad 0.10.11.2\n" +"Project-Id-Version: gst-plugins-bad 0.10.12.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" -"PO-Revision-Date: 2009-05-15 08:31+0300\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" +"PO-Revision-Date: 2009-06-15 07:48+0300\n" "Last-Translator: Alexander Shopov <ash@contact.bg>\n" "Language-Team: Bulgarian <dict@fsa-bg.org>\n" "MIME-Version: 1.0\n" @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins 0.8.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2004-08-05 15:48+0200\n" "Last-Translator: Jordi Mallach <jordi@sindominio.net>\n" "Language-Team: Catalan <ca@dodds.net>\n" @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad 0.10.9.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2009-01-18 18:55+0100\n" "Last-Translator: Petr Kovar <pknbe@volny.cz>\n" "Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n" @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad-0.10.10.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2009-04-13 11:28+0200\n" "Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n" "Language-Team: Danish <dansk@dansk-gruppen.dk>\n" @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad 0.10.11.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2009-05-14 21:52+0200\n" "Last-Translator: Andre Klapper <ak-47@gmx.net>\n" "Language-Team: German <translation-team-de@lists.sourceforge.net>\n" diff --git a/po/en_GB.po b/po/en_GB.po index 714972a3..75378d9f 100644 --- a/po/en_GB.po +++ b/po/en_GB.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins 0.8.1\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2004-04-26 10:41-0400\n" "Last-Translator: Gareth Owen <gowen72@yahoo.com>\n" "Language-Team: English (British) <en_gb@li.org>\n" @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad 0.10.10.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2009-04-04 13:31+0200\n" "Last-Translator: Jorge González González <aloriel@gmail.com>\n" "Language-Team: Spanish <es@li.org>\n" @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad 0.10.10.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2009-03-11 08:23+0200\n" "Last-Translator: Tommi Vainikainen <Tommi.Vainikainen@iki.fi>\n" "Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\n" @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad 0.10.8.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2008-10-21 09:59+0200\n" "Last-Translator: Claude Paroz <claude@2xlibre.net>\n" "Language-Team: French <traduc@traduc.org>\n" @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad 0.10.10.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2009-04-20 02:16+0200\n" "Last-Translator: Gabor Kelemen <kelemeng@gnome.hu>\n" "Language-Team: Hungarian <translation-team-hu@lists.sourceforge.net>\n" @@ -4,10 +4,10 @@ # msgid "" msgstr "" -"Project-Id-Version: gst-plugins-bad 0.10.11.2\n" +"Project-Id-Version: gst-plugins-bad 0.10.12.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" -"PO-Revision-Date: 2009-05-14 21:41+0700\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" +"PO-Revision-Date: 2009-06-13 22:03+0700\n" "Last-Translator: Andhika Padmawan <andhika.padmawan@gmail.com>\n" "Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n" "MIME-Version: 1.0\n" @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad 0.10.11.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2009-05-13 09:14+0200\n" "Last-Translator: Luca Ferretti <elle.uca@infinito.it>\n" "Language-Team: Italian <tp@lists.linux.it>\n" diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 00000000..812e6b6e --- /dev/null +++ b/po/ja.po @@ -0,0 +1,317 @@ +# Japanese traslation for gst-plugins-bad +# This file is put in the public domain. +# +# Makoto Kato <makoto.kt@gmail.com>, 2009. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-bad 0.10.11.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" +"PO-Revision-Date: 2009-06-01 20:27+0900\n" +"Last-Translator: Makoto Kato <makoto.kt@gmail.com>\n" +"Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 0.3\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Could not read title information for DVD." +msgstr "DVD のタイトル情報を読み込むことができませんでした。" + +#, c-format +msgid "Failed to open DVD device '%s'." +msgstr "DVD デバイス '%s' のオープンに失敗しました" + +msgid "Failed to set PGC based seeking." +msgstr "" + +msgid "Internal clock error." +msgstr "内部クロックエラー" + +msgid "Internal data flow error." +msgstr "内部データフローエラー" + +msgid "No file name specified for writing." +msgstr "書き込み用にファイル名が指定されていません" + +#, c-format +msgid "Could not open file \"%s\" for writing." +msgstr "書き込み用にファイル \"%s\" を開くことができませんでした。" + +msgid "Internal data stream error." +msgstr "内部データフローエラー" + +#, c-format +msgid "Could not write to file \"%s\"." +msgstr "ファイル \"%s\" へ書き込むことができませんでした。" + +#, c-format +msgid "Device \"%s\" does not exist." +msgstr "デバイス \"%s\" は存在しません。" + +#, c-format +msgid "Could not open frontend device \"%s\"." +msgstr "フロントデバイス \"%s\" を開くことができません。" + +#, c-format +msgid "Could not get settings from frontend device \"%s\"." +msgstr "フロントエンドデバイス \"%s\" から設定を取得できませんでした。" + +#, c-format +msgid "Could not open file \"%s\" for reading." +msgstr "読み込み用にファイル \"%s\" を開くことができません。" + +msgid "Could not open audio device for mixer control handling." +msgstr "ミキサーがコントロールするオーディオデバイスを開くことができません。" + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" + +msgid "Fast" +msgstr "" + +msgid "Low" +msgstr "低音" + +msgid "Medium" +msgstr "中音" + +msgid "High" +msgstr "高音" + +msgid "Very high" +msgstr "" + +msgid "Production" +msgstr "プロダクション" + +msgid "Off" +msgstr "Off" + +msgid "On" +msgstr "On" + +msgid "Stereo" +msgstr "ステレオ" + +msgid "Surround sound" +msgstr "サラウンドサウンド" + +msgid "Input mix" +msgstr "入力ミックス" + +msgid "Front" +msgstr "フロント" + +msgid "Rear" +msgstr "リア" + +msgid "Side" +msgstr "サイド" + +msgid "Center / LFE" +msgstr "センター / LFE" + +msgid "Microphone" +msgstr "マイクロフォン" + +msgid "Front panel microphone" +msgstr "フロントパネルのマイクロフォン" + +msgid "Input" +msgstr "入力" + +msgid "Line-in" +msgstr "ライン入力" + +msgid "PCM 1" +msgstr "PCM 1" + +msgid "PCM 2" +msgstr "PCM 2" + +msgid "PCM 3" +msgstr "PCM 3" + +msgid "PCM 4" +msgstr "PCM 4" + +msgid "Green connector" +msgstr "緑色コネクタ" + +msgid "Green front panel connector" +msgstr "緑色のフロントパネルのコネクタ" + +msgid "Pink connector" +msgstr "ピンク色コネクタ" + +msgid "Pink front panel connector" +msgstr "ピンク色のフロントパネルコネクタ" + +msgid "Blue connector" +msgstr "青色コネクタ" + +msgid "Blue front panel connector" +msgstr "" + +msgid "Orange connector" +msgstr "オレンジ色コネクタ" + +msgid "Orange front panel connector" +msgstr "" + +msgid "Black connector" +msgstr "黒色コネクタ" + +msgid "Black front panel connector" +msgstr "" + +msgid "Gray connector" +msgstr "グレー色コネクタ" + +msgid "Gray front panel connector" +msgstr "" + +msgid "White connector" +msgstr "白色コネクタ" + +msgid "White front panel connector" +msgstr "" + +msgid "Red connector" +msgstr "赤色コネクタ" + +msgid "Red front panel connector" +msgstr "" + +msgid "Yellow connector" +msgstr "黄色コネクタ" + +msgid "Yellow front panel connector" +msgstr "" + +msgid "Green connector function" +msgstr "緑色コネクタ機能" + +msgid "Green front panel connector function" +msgstr "" + +msgid "Pink connector function" +msgstr "" + +msgid "Pink front panel connector function" +msgstr "" + +msgid "Blue connector function" +msgstr "" + +msgid "Blue front panel connector function" +msgstr "" + +msgid "Orange connector function" +msgstr "" + +msgid "Orange front panel connector function" +msgstr "" + +msgid "Black connector function" +msgstr "" + +msgid "Black front panel connector function" +msgstr "" + +msgid "Gray connector function" +msgstr "" + +msgid "Gray front panel connector function" +msgstr "" + +msgid "White connector function" +msgstr "" + +msgid "White front panel connector function" +msgstr "" + +msgid "Red connector function" +msgstr "" + +msgid "Red front panel connector function" +msgstr "" + +msgid "Yellow connector function" +msgstr "" + +msgid "Yellow front panel connector function" +msgstr "" + +msgid "Front panel line-in" +msgstr "プロントパネルのライン入力" + +msgid "Headphones" +msgstr "ヘッドフォン" + +msgid "Front panel headphones" +msgstr "フロントパネルのヘッドフォン" + +msgid "PCM" +msgstr "PCM" + +msgid "Virtual mixer input" +msgstr "仮想ミキサー入力" + +msgid "Virtual mixer output" +msgstr "仮想ミキサー出力" + +msgid "Virtual mixer channel configuration" +msgstr "仮想ミックスチャンネル設定" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"プレイバック用にオーディオデバイスを開くことができませんでした。デバイスは他" +"のアプリケーションによって使われています。" + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"プレイバック用にオーディオデバイスを開くことができませんでした。デバイスを開" +"くための権限を持っていません。" + +msgid "Could not open audio device for playback." +msgstr "プレイバック用にオーディオデバイスを開くことができませんでした。" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"プレイバック用にオーディオデバイスを開くことができませんでした。この Open " +"Sound System のバージョンはこのエレメントによってサポートされません。" + +msgid "Playback is not supported by this audio device." +msgstr "プレイバックはこのオーディオデバイスによってサポートされません。" + +msgid "Audio playback error." +msgstr "オーディオプレイバックエラー" + +msgid "Recording is not supported by this audio device." +msgstr "録音はこのオーディオデバイスによってサポートされません。" + +msgid "Error recording from audio device." +msgstr "オーディオデバイスからの録音時にエラーが発生しました。" + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "TwoLAME エンコーダーの構成に失敗しました。エンコーディングパラメータを" +#~ "チェックしてください。" + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "プロパティ '%2$s' へのビットレート %1$d kbit/s の要求は許可されません。" +#~ "ビットレートは %d kbit/s へ変更されました。" @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad 0.10.5\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2007-11-13 17:16+0600\n" "Last-Translator: Ilyas Bakirov <just_ilyas@yahoo.com>\n" "Language-Team: Kirghiz <i18n-team-ky-kyrgyz@lists.sourceforge.net>\n" @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad-0.10.6.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2008-05-14 02:13+0300\n" "Last-Translator: Gintautas Miliauskas <gintas@akl.lt>\n" "Language-Team: Lithuanian <komp_lt@konferencijos.lt>\n" @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad-0.10.8.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2008-10-26 20:27+0100\n" "Last-Translator: Michel Bugeja <michelbugeja@rabatmalta.com>\n" "Language-Team: Maltese <translation-team-mt@lists.sourceforge.net>\n" @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad 0.10.5\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2007-11-03 14:46+0100\n" "Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n" "Language-Team: Norwegian Bokmaal <i18n-nb@lister.ping.uio.no>\n" @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad 0.10.9.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2009-01-23 18:06+0100\n" "Last-Translator: Freek de Kruijf <f.de.kruijf@hetnet.nl>\n" "Language-Team: Dutch <vertaling@vrijschrift.org>\n" @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-0.8.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2004-09-27 13:32+0530\n" "Last-Translator: Gora Mohanty <gora_mohanty@yahoo.co.in>\n" "Language-Team: Oriya <gora_mohanty@yahoo.co.in>\n" @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad 0.10.9.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2009-01-12 20:15+0100\n" "Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n" "Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n" diff --git a/po/pt_BR.po b/po/pt_BR.po index c0303ce2..1e8ada4c 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad-0.10.10.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2009-03-11 02:31-0300\n" "Last-Translator: Fabrício Godoy <skarllot@gmail.com>\n" "Language-Team: Brazilian Portuguese <ldp-br@bazar.conectiva.com.br>\n" @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad 0.10.9.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2009-02-12 15:00+0200\n" "Last-Translator: Pavel Maryanov <acid_jack@ukr.net>\n" "Language-Team: Russian <gnu@mx.ru>\n" @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad 0.10.8.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2008-11-04 09:39+0100\n" "Last-Translator: Peter Tuhársky <tuharsky@misbb.sk>\n" "Language-Team: Slovak <sk-i18n@lists.linux.sk>\n" @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad 0.10.7.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2008-08-15 16:07+0200\n" "Last-Translator: Laurent Dhima <laurenti@alblinux.net>\n" "Language-Team: Albanian <translation-team-sq@lists.sourceforge.net>\n" @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins 0.7.6\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2004-03-13 00:18+0100\n" "Last-Translator: Danilo Segan <dsegan@gmx.net>\n" "Language-Team: Serbian <gnu@prevod.org>\n" @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad 0.10.9.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2009-01-23 00:44+0100\n" "Last-Translator: Daniel Nylander <po@danielnylander.se>\n" "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n" @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad-0.10.10.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2009-03-11 08:01+0200\n" "Last-Translator: Server Acim <sacim@kde.org.tr>\n" "Language-Team: Turkish <gnu-tr-u12a@lists.sourceforge.net>\n" @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad 0.10.5\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2007-07-04 12:19+0200\n" "Last-Translator: Maxim V. Dziumanenko <dziumanenko@gmail.com>\n" "Language-Team: Ukrainian <translation-team-uk@lists.sourceforge.net>\n" @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad 0.10.11.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2009-05-12 21:32+0930\n" "Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n" "Language-Team: Vietnamese <vi-VN@googlegroups.com>\n" diff --git a/po/zh_CN.po b/po/zh_CN.po index 5256dd7a..1837a8ba 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad 0.10.9.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2009-05-20 20:43+0100\n" +"POT-Creation-Date: 2009-06-17 21:54+0100\n" "PO-Revision-Date: 2009-01-14 12:04+0800\n" "Last-Translator: Ji ZhengYu <zhengyuji@gmail.com>\n" "Language-Team: Chinese (simplified) <translation-team-zh-cn@lists." diff --git a/sys/oss4/oss4-mixer.c b/sys/oss4/oss4-mixer.c index 91b14a2c..031549b3 100644 --- a/sys/oss4/oss4-mixer.c +++ b/sys/oss4/oss4-mixer.c @@ -103,7 +103,7 @@ static void gst_oss4_mixer_close (GstOss4Mixer * mixer); static gboolean gst_oss4_mixer_enum_control_update_enum_list (GstOss4Mixer * m, GstOss4MixerControl * mc); -#ifndef GST_DISABLE_DEBUG +#ifndef GST_DISABLE_GST_DEBUG static const gchar *mixer_ext_type_get_name (gint type); static const gchar *mixer_ext_flags_get_string (gint flags); #endif @@ -874,7 +874,7 @@ gst_oss4_mixer_control_get_translated_name (GstOss4MixerControl * mc) return g_quark_to_string (g_quark_from_string (name)); /* eek */ } -#ifndef GST_DISABLE_DEBUG +#ifndef GST_DISABLE_GST_DEBUG static const gchar * mixer_ext_type_get_name (gint type) { @@ -924,9 +924,9 @@ mixer_ext_type_get_name (gint type) } return "unknown"; } -#endif /* GST_DISABLE_DEBUG */ +#endif /* GST_DISABLE_GST_DEBUG */ -#ifndef GST_DISABLE_DEBUG +#ifndef GST_DISABLE_GST_DEBUG static const gchar * mixer_ext_flags_get_string (gint flags) { @@ -987,9 +987,9 @@ mixer_ext_flags_get_string (gint flags) return g_quark_to_string (q); } -#endif /* GST_DISABLE_DEBUG */ +#endif /* GST_DISABLE_GST_DEBUG */ -#ifndef GST_DISABLE_DEBUG +#ifndef GST_DISABLE_GST_DEBUG static void gst_oss4_mixer_control_dump_tree (GstOss4MixerControl * mc, gint depth) { @@ -1010,7 +1010,7 @@ gst_oss4_mixer_control_dump_tree (GstOss4MixerControl * mc, gint depth) gst_oss4_mixer_control_dump_tree (child_mc, depth + 2); } } -#endif /* GST_DISABLE_DEBUG */ +#endif /* GST_DISABLE_GST_DEBUG */ static GList * gst_oss4_mixer_get_controls (GstOss4Mixer * mixer) @@ -1103,7 +1103,7 @@ gst_oss4_mixer_get_controls (GstOss4Mixer * mixer) controls = g_list_prepend (controls, mc); } -#ifndef GST_DISABLE_DEBUG +#ifndef GST_DISABLE_GST_DEBUG gst_oss4_mixer_control_dump_tree (root_mc, 0); #endif diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am index cbc228e2..bf4f07ce 100644 --- a/tests/check/Makefile.am +++ b/tests/check/Makefile.am @@ -63,17 +63,9 @@ else check_timidity= endif -if USE_X264 -check_x264enc=elements/x264enc -else -check_x264enc= -endif - - VALGRIND_TO_FIX = \ elements/mpeg2enc \ - elements/mplex \ - elements/x264enc + elements/mplex # valgrind testing VALGRIND_TESTS_DISABLE = \ @@ -86,13 +78,13 @@ check_PROGRAMS = \ $(check_neon) \ $(check_ofa) \ $(check_timidity) \ - $(check_x264enc) \ elements/aacparse \ elements/amrparse \ elements/camerabin \ elements/legacyresample \ elements/qtmux \ elements/rtpbin \ + elements/rtpbin_buffer_list \ elements/selector \ elements/shapewipe \ elements/mxfdemux \ @@ -104,15 +96,26 @@ noinst_HEADERS = elements/mxfdemux.h elements/amrparse_data.h elements/aacparse_ TESTS = $(check_PROGRAMS) -AM_CFLAGS = $(GST_OBJ_CFLAGS) $(GST_CHECK_CFLAGS) $(CHECK_CFLAGS) $(GST_OPTION_CFLAGS) +AM_CFLAGS = $(GST_OBJ_CFLAGS) $(GST_CHECK_CFLAGS) $(CHECK_CFLAGS) $(GST_OPTION_CFLAGS) LDADD = $(GST_OBJ_LIBS) $(GST_CHECK_LIBS) $(CHECK_LIBS) -elements_camerabin_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CHECK_CFLAGS) -elements_camerabin_LDADD = $(GST_LIBS) $(GST_BASE_LIBS) $(GST_CHECK_LIBS) \ - -lgstinterfaces-@GST_MAJORMINOR@ \ - $(top_builddir)/gst-libs/gst/interfaces/libgstphotography-@GST_MAJORMINOR@.la +elements_camerabin_CFLAGS = \ + -I$(top_builddir)/gst-libs \ + $(GST_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CHECK_CFLAGS) \ + -DGST_USE_UNSTABLE_API +elements_camerabin_LDADD = \ + $(top_builddir)/gst-libs/gst/interfaces/libgstphotography-@GST_MAJORMINOR@.la \ + $(GST_LIBS) $(GST_BASE_LIBS) $(GST_CHECK_LIBS) \ + -lgstinterfaces-@GST_MAJORMINOR@ elements_camerabin_SOURCES = elements/camerabin.c +elements_rtpbin_buffer_list_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \ + $(ERROR_CFLAGS) $(GST_CHECK_CFLAGS) +elements_rtpbin_buffer_list_LDADD = $(GST_PLUGINS_BASE_LIBS) \ + -lgstnetbuffer-@GST_MAJORMINOR@ -lgstrtp-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) $(GST_LIBS_LIBS) $(GST_CHECK_LIBS) +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) diff --git a/tests/check/elements/.gitignore b/tests/check/elements/.gitignore index 091fb4e5..5f268d3b 100644 --- a/tests/check/elements/.gitignore +++ b/tests/check/elements/.gitignore @@ -20,11 +20,11 @@ rglimiter rgvolume rtpbin selector +shapewipe spectrum timidity videocrop wavpackdec wavpackenc wavpackparse -x264enc y4menc diff --git a/tests/check/elements/camerabin.c b/tests/check/elements/camerabin.c index 7c6187d2..795fb4f0 100644 --- a/tests/check/elements/camerabin.c +++ b/tests/check/elements/camerabin.c @@ -27,10 +27,7 @@ #include <unistd.h> #include <gst/gst.h> #include <gst/check/gstcheck.h> - -#ifdef HAVE_GST_PHOTO_IFACE_H #include <gst/interfaces/photography.h> -#endif #define SINGLE_IMAGE_FILENAME "image.cap" #define BURST_IMAGE_FILENAME "burst_image.cap" @@ -40,13 +37,11 @@ #define MAX_BURST_IMAGES 10 #define PHOTO_SETTING_DELAY_US 0 -static gboolean continuous = FALSE; -static guint captured_images = 0; - static GstElement *camera; static GCond *cam_cond; static GMutex *cam_mutex; - +static GMainLoop *main_loop; +static guint cycle_count = 0; /* helper function for filenames */ static const gchar * @@ -57,10 +52,12 @@ make_test_file_name (const gchar * base_name) g_snprintf (file_name, 999, "%s" G_DIR_SEPARATOR_S "%s", g_get_tmp_dir (), base_name); - GST_INFO ("capturing to: %s", file_name); + GST_INFO ("capturing to: %s (cycle_count=%d)", file_name, cycle_count); return file_name; } +/* burst capture is not supported in camerabin for the moment */ +#ifdef ENABLE_BURST_CAPTURE static const gchar * make_test_seq_file_name (const gchar * base_name) { @@ -72,30 +69,50 @@ make_test_seq_file_name (const gchar * base_name) GST_INFO ("capturing to: %s", file_name); return file_name; } - +#endif /* signal handlers */ static gboolean -capture_done (GstElement * elem, const gchar * filename, gpointer user_data) +handle_image_captured_cb (gpointer data) { - captured_images++; - - if (captured_images >= MAX_BURST_IMAGES) { - /* release the shutter button */ - GST_DEBUG ("signal for img-done"); - g_mutex_lock (cam_mutex); - g_cond_signal (cam_cond); - g_mutex_unlock (cam_mutex); - continuous = FALSE; - } + GMainLoop *loop = (GMainLoop *) data; + + GST_DEBUG ("handle_image_captured_cb, cycle: %d", cycle_count); + if (cycle_count == 0) { + g_main_loop_quit (loop); + } else { + /* Set video recording mode */ + g_object_set (camera, "mode", 1, + "filename", make_test_file_name (CYCLE_VIDEO_FILENAME), NULL); + /* Record video */ + g_signal_emit_by_name (camera, "user-start", NULL); + g_usleep (G_USEC_PER_SEC); + g_signal_emit_by_name (camera, "user-stop", NULL); + GST_DEBUG ("video captured"); - if (continuous) { - /* Must set filename for new picture */ - g_object_set (G_OBJECT (elem), "filename", - make_test_seq_file_name (BURST_IMAGE_FILENAME), NULL); + /* Set still image mode */ + g_object_set (camera, "mode", 0, + "filename", make_test_file_name (CYCLE_IMAGE_FILENAME), NULL); + /* Take a picture */ + g_signal_emit_by_name (camera, "user-start", NULL); + + cycle_count--; + GST_DEBUG ("next cycle"); } + GST_DEBUG ("handle_image_captured_cb done"); + return FALSE; +} - return continuous; +static gboolean +capture_done (GstElement * elem, const gchar * filename, gpointer user_data) +{ + GMainLoop *loop = (GMainLoop *) user_data; + + g_idle_add ((GSourceFunc) handle_image_captured_cb, loop); + + GST_DEBUG ("image saved"); + + return FALSE; } /* configuration */ @@ -103,17 +120,72 @@ capture_done (GstElement * elem, const gchar * filename, gpointer user_data) static void setup_camerabin_elements (GstElement * camera) { - GstElement *vfsink, *audiosrc, *videosrc; + GstElement *vfsink, *audiosrc, *videosrc, *audioenc, *videoenc, *imageenc, + *videomux; /* Use fakesink for view finder */ vfsink = gst_element_factory_make ("fakesink", NULL); + g_object_set (vfsink, "sync", TRUE, NULL); audiosrc = gst_element_factory_make ("audiotestsrc", NULL); g_object_set (audiosrc, "is-live", TRUE, NULL); videosrc = gst_element_factory_make ("videotestsrc", NULL); g_object_set (videosrc, "is-live", TRUE, NULL); + audioenc = gst_element_factory_make ("vorbisenc", NULL); + videoenc = gst_element_factory_make ("theoraenc", NULL); + videomux = gst_element_factory_make ("oggmux", NULL); + imageenc = gst_element_factory_make ("jpegenc", NULL); + + if (vfsink && audiosrc && videosrc && audioenc && videoenc && videomux + && imageenc) { + g_object_set (camera, "vfsink", vfsink, "audiosrc", audiosrc, "videosrc", + videosrc, "audioenc", audioenc, "videoenc", videoenc, "imageenc", + imageenc, "videomux", videomux, NULL); + } else { + GST_WARNING ("error setting up test plugins"); + } +} + +static gboolean +capture_bus_cb (GstBus * bus, GstMessage * message, gpointer data) +{ + GMainLoop *loop = (GMainLoop *) data; + const GstStructure *st; - g_object_set (camera, "vfsink", vfsink, "audiosrc", audiosrc, - "videosrc", videosrc, NULL); + switch (GST_MESSAGE_TYPE (message)) { + case GST_MESSAGE_ERROR:{ + GError *err = NULL; + gchar *debug = NULL; + + gst_message_parse_error (message, &err, &debug); + GST_WARNING ("ERROR: %s [%s]", err->message, debug); + g_error_free (err); + g_free (debug); + fail_if (TRUE, "error while capturing"); + g_main_loop_quit (loop); + break; + } + case GST_MESSAGE_WARNING:{ + GError *err = NULL; + gchar *debug = NULL; + + gst_message_parse_warning (message, &err, &debug); + GST_WARNING ("WARNING: %s [%s]", err->message, debug); + g_error_free (err); + g_free (debug); + break; + } + case GST_MESSAGE_EOS: + GST_DEBUG ("eos"); + g_main_loop_quit (loop); + break; + default: + st = gst_message_get_structure (message); + if (st && gst_structure_has_name (st, "image-captured")) { + GST_INFO ("image-captured"); + } + break; + } + return TRUE; } static void @@ -121,6 +193,12 @@ setup (void) { GstTagSetter *setter; gchar *desc_str; + GstCaps *filter_caps; + GstBus *bus; + + GST_INFO ("init"); + + main_loop = g_main_loop_new (NULL, TRUE); cam_cond = g_cond_new (); cam_mutex = g_mutex_new (); @@ -129,9 +207,19 @@ setup (void) setup_camerabin_elements (camera); - g_signal_connect (camera, "img-done", G_CALLBACK (capture_done), NULL); + g_signal_connect (camera, "img-done", G_CALLBACK (capture_done), main_loop); + + bus = gst_pipeline_get_bus (GST_PIPELINE (camera)); + gst_bus_add_watch (bus, (GstBusFunc) capture_bus_cb, main_loop); + gst_object_unref (bus); + + filter_caps = gst_caps_from_string ("video/x-raw-yuv,format=(fourcc)I420"); + g_object_set (G_OBJECT (camera), "filter-caps", filter_caps, NULL); + gst_caps_unref (filter_caps); - captured_images = 0; + /* force a low framerate here to not timeout the tests because of the + * encoders */ + g_signal_emit_by_name (camera, "user-res-fps", 320, 240, 5, 1, NULL); /* Set some default tags */ setter = GST_TAG_SETTER (camera); @@ -141,12 +229,14 @@ setup (void) GST_TAG_DESCRIPTION, desc_str, NULL); g_free (desc_str); - if (gst_element_set_state (GST_ELEMENT (camera), GST_STATE_PLAYING) != - GST_STATE_CHANGE_SUCCESS) { + if (gst_element_set_state (GST_ELEMENT (camera), GST_STATE_PLAYING) == + GST_STATE_CHANGE_FAILURE) { + GST_WARNING ("setting camerabin to PLAYING failed"); gst_element_set_state (GST_ELEMENT (camera), GST_STATE_NULL); gst_object_unref (camera); camera = NULL; } + GST_INFO ("init finished"); } static void @@ -156,6 +246,8 @@ teardown (void) g_cond_free (cam_cond); if (camera) gst_check_teardown_element (camera); + + GST_INFO ("done"); } static void @@ -280,13 +372,13 @@ static gboolean check_file_validity (const gchar * filename) { GstBus *bus; - GMainLoop *loop = g_main_loop_new (NULL, TRUE); + GMainLoop *loop = g_main_loop_new (NULL, FALSE); GstElement *playbin = gst_element_factory_make ("playbin2", NULL); GstElement *fakevideo = gst_element_factory_make ("fakesink", NULL); GstElement *fakeaudio = gst_element_factory_make ("fakesink", NULL); gchar *uri = g_strconcat ("file://", make_test_file_name (filename), NULL); - GST_DEBUG ("setting uri: %s", uri); + GST_DEBUG ("checking uri: %s", uri); g_object_set (G_OBJECT (playbin), "uri", uri, "video-sink", fakevideo, "audio-sink", fakeaudio, NULL); @@ -294,7 +386,6 @@ check_file_validity (const gchar * filename) gst_bus_add_watch (bus, (GstBusFunc) validity_bus_cb, loop); gst_element_set_state (playbin, GST_STATE_PLAYING); - g_main_loop_run (loop); gst_element_set_state (playbin, GST_STATE_NULL); @@ -314,39 +405,14 @@ GST_START_TEST (test_single_image_capture) g_object_set (camera, "mode", 0, "filename", make_test_file_name (SINGLE_IMAGE_FILENAME), NULL); - continuous = FALSE; - /* Test photography iface settings */ gst_element_get_state (GST_ELEMENT (camera), NULL, NULL, (2 * GST_SECOND)); test_photography_settings (camera); - g_signal_emit_by_name (camera, "user-start", 0); - g_signal_emit_by_name (camera, "user-stop", 0); -} - -GST_END_TEST; - -GST_START_TEST (test_burst_image_capture) -{ - if (!camera) - return; - - /* set still image mode */ - g_object_set (camera, "mode", 0, - "filename", make_test_seq_file_name (BURST_IMAGE_FILENAME), NULL); - - /* set burst mode */ - continuous = TRUE; - - g_signal_emit_by_name (camera, "user-start", 0); - - GST_DEBUG ("waiting for img-done"); - g_mutex_lock (cam_mutex); - g_cond_wait (cam_cond, cam_mutex); - g_mutex_unlock (cam_mutex); - GST_DEBUG ("received img-done"); + GST_INFO ("starting capture"); + g_signal_emit_by_name (camera, "user-start", NULL); - g_signal_emit_by_name (camera, "user-stop", 0); + g_main_loop_run (main_loop); } GST_END_TEST; @@ -360,58 +426,47 @@ GST_START_TEST (test_video_recording) g_object_set (camera, "mode", 1, "filename", make_test_file_name (VIDEO_FILENAME), NULL); - g_signal_emit_by_name (camera, "user-start", 0); + GST_INFO ("starting capture"); + g_signal_emit_by_name (camera, "user-start", NULL); /* Record for one seconds */ g_usleep (G_USEC_PER_SEC); - g_signal_emit_by_name (camera, "user-stop", 0); + g_signal_emit_by_name (camera, "user-stop", NULL); } GST_END_TEST; GST_START_TEST (test_image_video_cycle) { - guint i; - if (!camera) return; - continuous = FALSE; - - for (i = 0; i < 2; i++) { - /* Set still image mode */ - g_object_set (camera, "mode", 0, - "filename", make_test_file_name (CYCLE_IMAGE_FILENAME), NULL); + cycle_count = 2; - /* Take a picture */ - g_signal_emit_by_name (camera, "user-start", 0); - g_signal_emit_by_name (camera, "user-stop", 0); - GST_DEBUG ("image captured"); + /* set still image mode */ + g_object_set (camera, "mode", 0, + "filename", make_test_file_name (CYCLE_IMAGE_FILENAME), NULL); - /* Set video recording mode */ - g_object_set (camera, "mode", 1, - "filename", make_test_file_name (CYCLE_VIDEO_FILENAME), NULL); + GST_INFO ("starting capture"); + g_signal_emit_by_name (camera, "user-start", NULL); - /* Record video */ - g_signal_emit_by_name (camera, "user-start", 0); - g_usleep (G_USEC_PER_SEC); - g_signal_emit_by_name (camera, "user-stop", 0); - GST_DEBUG ("video captured"); - } + g_main_loop_run (main_loop); } GST_END_TEST; GST_START_TEST (validate_captured_image_files) { - GString *filename; - gint i; - if (!camera) return; /* validate single image */ check_file_validity (SINGLE_IMAGE_FILENAME); +/* burst capture is not supported in camerabin for the moment */ +#ifdef ENABLE_BURST_CAPTURE + GString *filename; + gint i; + /* validate burst mode images */ filename = g_string_new (""); for (i = 0; i < MAX_BURST_IMAGES; i++) { @@ -419,7 +474,7 @@ GST_START_TEST (validate_captured_image_files) check_file_validity (filename->str); } g_string_free (filename, TRUE); - +#endif /* validate cycled image */ check_file_validity (CYCLE_IMAGE_FILENAME); } @@ -453,7 +508,6 @@ camerabin_suite (void) tcase_set_timeout (tc_basic, 20); tcase_add_checked_fixture (tc_basic, setup, teardown); tcase_add_test (tc_basic, test_single_image_capture); - tcase_add_test (tc_basic, test_burst_image_capture); tcase_add_test (tc_basic, test_video_recording); tcase_add_test (tc_basic, test_image_video_cycle); diff --git a/tests/check/elements/rtpbin_buffer_list.c b/tests/check/elements/rtpbin_buffer_list.c new file mode 100644 index 00000000..af4003dd --- /dev/null +++ b/tests/check/elements/rtpbin_buffer_list.c @@ -0,0 +1,331 @@ +/* GStreamer + * + * Unit test for gstrtpbin sending rtp packets using GstBufferList. + * Copyright (C) 2009 Branko Subasic <branko dot subasic at axis 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. + */ + +#include <gst/check/gstcheck.h> + +#include <gst/rtp/gstrtpbuffer.h> + + + +/* This test makes sure that RTP packets sent as buffer lists are sent through + * the rtpbin as they are supposed to, and not corrupted in any way. + */ + + +#define TEST_CAPS \ + "application/x-rtp, " \ + "media=(string)video, " \ + "clock-rate=(int)90000, " \ + "encoding-name=(string)H264, " \ + "profile-level-id=(string)4d4015, " \ + "payload=(int)96, " \ + "ssrc=(guint)2633237432, " \ + "clock-base=(guint)1868267015, " \ + "seqnum-base=(guint)54229" + + +/* RTP headers and the first 2 bytes of the payload (FU indicator and FU header) + */ +static const guint8 rtp_header[2][14] = { + {0x80, 0x60, 0xbb, 0xb7, 0x5c, 0xe9, 0x09, + 0x0d, 0xf5, 0x9c, 0x43, 0x55, 0x1c, 0x86}, + {0x80, 0x60, 0xbb, 0xb8, 0x5c, 0xe9, 0x09, + 0x0d, 0xf5, 0x9c, 0x43, 0x55, 0x1c, 0x46} +}; + +static const guint rtp_header_len[] = { + sizeof rtp_header[0], + sizeof rtp_header[1] +}; + +static GstBuffer *header_buffer[2] = { NULL, NULL }; + + +/* Some payload. + */ +static char *payload = + "0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF" + "0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF" + "0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF" + "0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF" + "0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF" + "0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF" + "0123456789ABSDEF0123456"; + +static const guint payload_offset[] = { + 0, 498 +}; + +static const guint payload_len[] = { + 498, 5 +}; + + +static GstBuffer *original_buffer = NULL; + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp")); + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp")); + + +static GstBuffer * +_create_original_buffer (void) +{ + GstCaps *caps; + + if (original_buffer != NULL) + return original_buffer; + + original_buffer = gst_buffer_new (); + fail_unless (original_buffer != NULL); + + gst_buffer_set_data (original_buffer, (guint8 *) payload, strlen (payload)); + GST_BUFFER_TIMESTAMP (original_buffer) = + gst_clock_get_internal_time (gst_system_clock_obtain ()); + + caps = gst_caps_from_string (TEST_CAPS); + fail_unless (caps != NULL); + gst_buffer_set_caps (original_buffer, caps); + gst_caps_unref (caps); + + return original_buffer; +} + +static GstBufferList * +_create_buffer_list (void) +{ + GstBufferList *list; + GstBufferListIterator *it; + GstBuffer *orig_buffer; + GstBuffer *buffer; + + orig_buffer = _create_original_buffer (); + fail_if (orig_buffer == NULL); + + list = gst_buffer_list_new (); + fail_if (list == NULL); + + it = gst_buffer_list_iterate (list); + fail_if (it == NULL); + + /*** First group, i.e. first packet. **/ + gst_buffer_list_iterator_add_group (it); + + /* Create buffer with RTP header and add it to the 1st group */ + buffer = gst_buffer_new (); + GST_BUFFER_MALLOCDATA (buffer) = g_memdup (&rtp_header[0], rtp_header_len[0]); + GST_BUFFER_DATA (buffer) = GST_BUFFER_MALLOCDATA (buffer); + GST_BUFFER_SIZE (buffer) = rtp_header_len[0]; + gst_buffer_copy_metadata (buffer, orig_buffer, GST_BUFFER_COPY_ALL); + header_buffer[0] = buffer; + gst_buffer_list_iterator_add (it, buffer); + + /* Create the payload buffer and add it to the 1st group + */ + buffer = + gst_buffer_create_sub (orig_buffer, payload_offset[0], payload_len[0]); + fail_if (buffer == NULL); + gst_buffer_list_iterator_add (it, buffer); + + + /*** Second group, i.e. second packet. ***/ + + /* Create a new group to hold the rtp header and the payload */ + gst_buffer_list_iterator_add_group (it); + + /* Create buffer with RTP header and add it to the 2nd group */ + buffer = gst_buffer_new (); + GST_BUFFER_MALLOCDATA (buffer) = g_memdup (&rtp_header[1], rtp_header_len[1]); + GST_BUFFER_DATA (buffer) = GST_BUFFER_MALLOCDATA (buffer); + GST_BUFFER_SIZE (buffer) = rtp_header_len[1]; + gst_buffer_copy_metadata (buffer, orig_buffer, GST_BUFFER_COPY_ALL); + header_buffer[1] = buffer; + + /* Add the rtp header to the buffer list */ + gst_buffer_list_iterator_add (it, buffer); + + /* Create the payload buffer and add it to the 2d group + */ + buffer = + gst_buffer_create_sub (orig_buffer, payload_offset[1], payload_len[1]); + fail_if (buffer == NULL); + gst_buffer_list_iterator_add (it, buffer); + + gst_buffer_list_iterator_free (it); + + return list; +} + + +static void +_check_header (GstBuffer * buffer, guint index) +{ + guint8 *data; + + fail_if (buffer == NULL); + fail_unless (index < 2); + + fail_unless (GST_BUFFER_SIZE (buffer) == rtp_header_len[index]); + + /* Can't do a memcmp() on the whole header, cause the SSRC (bytes 8-11) will + * most likely be changed in gstrtpbin. + */ + fail_unless ((data = GST_BUFFER_DATA (buffer)) != NULL); + fail_unless_equals_uint64 (*(guint64 *) data, *(guint64 *) rtp_header[index]); + fail_unless (*(guint16 *) (data + 12) == + *(guint16 *) (rtp_header[index] + 12)); +} + + +static void +_check_payload (GstBuffer * buffer, guint index) +{ + fail_if (buffer == NULL); + fail_unless (index < 2); + + fail_unless (GST_BUFFER_SIZE (buffer) == payload_len[index]); + fail_if (GST_BUFFER_DATA (buffer) != + (gpointer) (payload + payload_offset[index])); + fail_if (memcmp (GST_BUFFER_DATA (buffer), payload + payload_offset[index], + payload_len[index])); +} + + +static void +_check_group (GstBufferListIterator * it, guint index, GstCaps * caps) +{ + GstBuffer *buffer; + + fail_unless (it != NULL); + fail_unless (gst_buffer_list_iterator_n_buffers (it) == 2); + fail_unless (caps != NULL); + + fail_unless ((buffer = gst_buffer_list_iterator_next (it)) != NULL); + + fail_unless (GST_BUFFER_TIMESTAMP (buffer) == + GST_BUFFER_TIMESTAMP (original_buffer)); + + fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (original_buffer), + GST_BUFFER_CAPS (buffer))); + + _check_header (buffer, index); + + fail_unless ((buffer = gst_buffer_list_iterator_next (it)) != NULL); + _check_payload (buffer, index); +} + + +static GstFlowReturn +_sink_chain_list (GstPad * pad, GstBufferList * list) +{ + GstCaps *caps; + GstBufferListIterator *it; + + caps = gst_caps_from_string (TEST_CAPS); + fail_unless (caps != NULL); + + fail_unless (GST_IS_BUFFER_LIST (list)); + fail_unless (gst_buffer_list_n_groups (list) == 2); + + it = gst_buffer_list_iterate (list); + fail_if (it == NULL); + + fail_unless (gst_buffer_list_iterator_next_group (it)); + _check_group (it, 0, caps); + + fail_unless (gst_buffer_list_iterator_next_group (it)); + _check_group (it, 1, caps); + + gst_caps_unref (caps); + gst_buffer_list_iterator_free (it); + + gst_buffer_list_unref (list); + + return GST_FLOW_OK; +} + + +static void +_set_chain_functions (GstPad * pad) +{ + gst_pad_set_chain_list_function (pad, _sink_chain_list); +} + + +GST_START_TEST (test_bufferlist) +{ + GstElement *rtpbin; + GstPad *sinkpad; + GstPad *srcpad; + GstBufferList *list; + + list = _create_buffer_list (); + fail_unless (list != NULL); + + rtpbin = gst_check_setup_element ("gstrtpbin"); + + srcpad = + gst_check_setup_src_pad_by_name (rtpbin, &srctemplate, "send_rtp_sink_0"); + fail_if (srcpad == NULL); + sinkpad = + gst_check_setup_sink_pad_by_name (rtpbin, &sinktemplate, + "send_rtp_src_0"); + fail_if (sinkpad == NULL); + + _set_chain_functions (sinkpad); + + gst_pad_set_active (sinkpad, TRUE); + gst_element_set_state (rtpbin, GST_STATE_PLAYING); + fail_unless (gst_pad_push_list (srcpad, list) == GST_FLOW_OK); + gst_pad_set_active (sinkpad, FALSE); + + gst_check_teardown_pad_by_name (rtpbin, "send_rtp_src_0"); + gst_check_teardown_pad_by_name (rtpbin, "send_rtp_sink_0"); + gst_check_teardown_element (rtpbin); +} + +GST_END_TEST; + + + +static Suite * +bufferlist_suite (void) +{ + Suite *s = suite_create ("BufferList"); + + TCase *tc_chain = tcase_create ("general"); + + /* time out after 30s. */ + tcase_set_timeout (tc_chain, 10); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_bufferlist); + + return s; +} + +GST_CHECK_MAIN (bufferlist); diff --git a/tests/check/elements/shapewipe.c b/tests/check/elements/shapewipe.c index 6fcb0698..d0ec63f9 100644 --- a/tests/check/elements/shapewipe.c +++ b/tests/check/elements/shapewipe.c @@ -298,6 +298,7 @@ shapewipe_suite (void) TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); + tcase_set_timeout (tc_chain, 180); tcase_add_test (tc_chain, test_general); return s; diff --git a/tests/check/pipelines/metadata.c b/tests/check/pipelines/metadata.c index a632df44..1a16a4a7 100644 --- a/tests/check/pipelines/metadata.c +++ b/tests/check/pipelines/metadata.c @@ -190,7 +190,13 @@ test_tags (const gchar * tag_str) GST_START_TEST (test_common_tags) { + /* The title tag will only work if the XMP backend is enabled. + * And since we don't have any programmatic feedback on whether + * a tag is properly handled or not... we need to do this kind + * of hack. */ +#if HAVE_XMP test_tags ("taglist,title=\"test image\""); +#endif } GST_END_TEST; diff --git a/tests/examples/Makefile.am b/tests/examples/Makefile.am index b36232de..e68204e3 100644 --- a/tests/examples/Makefile.am +++ b/tests/examples/Makefile.am @@ -1,5 +1,5 @@ if HAVE_GTK -GTK_EXAMPLES=scaletempo +GTK_EXAMPLES=scaletempo mxf else GTK_EXAMPLES= endif @@ -10,5 +10,5 @@ else DIRECTFB_DIR= endif -SUBDIRS= $(DIRECTFB_DIR) $(GTK_EXAMPLES) switch shapewipe mxf +SUBDIRS= $(DIRECTFB_DIR) $(GTK_EXAMPLES) switch shapewipe DIST_SUBDIRS= directfb switch scaletempo shapewipe mxf diff --git a/win32/common/config.h b/win32/common/config.h index ca6ae1c6..19137494 100644 --- a/win32/common/config.h +++ b/win32/common/config.h @@ -199,7 +199,7 @@ #undef USE_POISONING /* Version number of package */ -#define VERSION "0.10.12.1" +#define VERSION "0.10.13.1" /* Define to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ |