summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3029
-rw-r--r--NEWS61
-rw-r--r--RELEASE135
-rwxr-xr-xautogen.sh4
m---------common0
-rw-r--r--configure.ac69
-rw-r--r--docs/plugins/Makefile.am6
-rw-r--r--docs/plugins/gst-plugins-bad-plugins-docs.sgml11
-rw-r--r--docs/plugins/gst-plugins-bad-plugins-sections.txt92
-rw-r--r--docs/plugins/gst-plugins-bad-plugins.args74
-rw-r--r--docs/plugins/gst-plugins-bad-plugins.hierarchy337
-rw-r--r--docs/plugins/gst-plugins-bad-plugins.interfaces28
-rw-r--r--docs/plugins/gst-plugins-bad-plugins.prerequisites14
-rw-r--r--docs/plugins/inspect/plugin-aacparse.xml4
-rw-r--r--docs/plugins/inspect/plugin-aiffparse.xml4
-rw-r--r--docs/plugins/inspect/plugin-alsaspdif.xml4
-rw-r--r--docs/plugins/inspect/plugin-amrparse.xml4
-rw-r--r--docs/plugins/inspect/plugin-apex.xml4
-rw-r--r--docs/plugins/inspect/plugin-autoconvert.xml4
-rw-r--r--docs/plugins/inspect/plugin-bayer.xml4
-rw-r--r--docs/plugins/inspect/plugin-bz2.xml4
-rw-r--r--docs/plugins/inspect/plugin-camerabin.xml4
-rw-r--r--docs/plugins/inspect/plugin-cdaudio.xml4
-rw-r--r--docs/plugins/inspect/plugin-cdxaparse.xml4
-rw-r--r--docs/plugins/inspect/plugin-celt.xml4
-rw-r--r--docs/plugins/inspect/plugin-dc1394.xml4
-rw-r--r--docs/plugins/inspect/plugin-dccp.xml2
-rw-r--r--docs/plugins/inspect/plugin-debugutilsbad.xml4
-rw-r--r--docs/plugins/inspect/plugin-deinterlace2.xml34
-rw-r--r--docs/plugins/inspect/plugin-dfbvideosink.xml4
-rw-r--r--docs/plugins/inspect/plugin-dirac.xml2
-rw-r--r--docs/plugins/inspect/plugin-directdraw.xml20
-rw-r--r--docs/plugins/inspect/plugin-dtmf.xml4
-rw-r--r--docs/plugins/inspect/plugin-dtsdec.xml4
-rw-r--r--docs/plugins/inspect/plugin-dvb.xml4
-rw-r--r--docs/plugins/inspect/plugin-dvdspu.xml4
-rw-r--r--docs/plugins/inspect/plugin-faac.xml4
-rw-r--r--docs/plugins/inspect/plugin-faad.xml4
-rw-r--r--docs/plugins/inspect/plugin-fbdevsink.xml4
-rw-r--r--docs/plugins/inspect/plugin-festival.xml4
-rw-r--r--docs/plugins/inspect/plugin-flv.xml67
-rw-r--r--docs/plugins/inspect/plugin-flvdemux.xml40
-rw-r--r--docs/plugins/inspect/plugin-freeze.xml4
-rw-r--r--docs/plugins/inspect/plugin-gsm.xml4
-rw-r--r--docs/plugins/inspect/plugin-gstinterlace.xml34
-rw-r--r--docs/plugins/inspect/plugin-gstrtpmanager.xml4
-rw-r--r--docs/plugins/inspect/plugin-gstsiren.xml4
-rw-r--r--docs/plugins/inspect/plugin-h264parse.xml4
-rw-r--r--docs/plugins/inspect/plugin-jack.xml4
-rw-r--r--docs/plugins/inspect/plugin-ladspa.xml4039
-rw-r--r--docs/plugins/inspect/plugin-legacyresample.xml6
-rw-r--r--docs/plugins/inspect/plugin-liveadder.xml4
-rw-r--r--docs/plugins/inspect/plugin-metadata.xml4
-rw-r--r--docs/plugins/inspect/plugin-mms.xml4
-rw-r--r--docs/plugins/inspect/plugin-modplug.xml6
-rw-r--r--docs/plugins/inspect/plugin-mpeg2enc.xml2
-rw-r--r--docs/plugins/inspect/plugin-mpeg4videoparse.xml4
-rw-r--r--docs/plugins/inspect/plugin-mpegdemux2.xml4
-rw-r--r--docs/plugins/inspect/plugin-mpegtsmux.xml4
-rw-r--r--docs/plugins/inspect/plugin-mpegvideoparse.xml4
-rw-r--r--docs/plugins/inspect/plugin-mplex.xml4
-rw-r--r--docs/plugins/inspect/plugin-musepack.xml6
-rw-r--r--docs/plugins/inspect/plugin-musicbrainz.xml4
-rw-r--r--docs/plugins/inspect/plugin-mve.xml4
-rw-r--r--docs/plugins/inspect/plugin-mxf.xml4
-rw-r--r--docs/plugins/inspect/plugin-mythtv.xml4
-rw-r--r--docs/plugins/inspect/plugin-nas.xml4
-rw-r--r--docs/plugins/inspect/plugin-neon.xml4
-rw-r--r--docs/plugins/inspect/plugin-nsfdec.xml4
-rw-r--r--docs/plugins/inspect/plugin-nuvdemux.xml4
-rw-r--r--docs/plugins/inspect/plugin-ofa.xml4
-rw-r--r--docs/plugins/inspect/plugin-oss4.xml4
-rw-r--r--docs/plugins/inspect/plugin-pcapparse.xml2
-rw-r--r--docs/plugins/inspect/plugin-qtmux.xml10
-rw-r--r--docs/plugins/inspect/plugin-rawparse.xml4
-rw-r--r--docs/plugins/inspect/plugin-real.xml4
-rw-r--r--docs/plugins/inspect/plugin-resindvd.xml2
-rw-r--r--docs/plugins/inspect/plugin-rfbsrc.xml4
-rw-r--r--docs/plugins/inspect/plugin-rtpmux.xml4
-rw-r--r--docs/plugins/inspect/plugin-scaletempo.xml2
-rw-r--r--docs/plugins/inspect/plugin-sdl.xml4
-rw-r--r--docs/plugins/inspect/plugin-sdp.xml4
-rw-r--r--docs/plugins/inspect/plugin-selector.xml4
-rw-r--r--docs/plugins/inspect/plugin-sndfile.xml4
-rw-r--r--docs/plugins/inspect/plugin-soundtouch.xml2
-rw-r--r--docs/plugins/inspect/plugin-spcdec.xml2
-rw-r--r--docs/plugins/inspect/plugin-speed.xml4
-rw-r--r--docs/plugins/inspect/plugin-stereo.xml4
-rw-r--r--docs/plugins/inspect/plugin-subenc.xml4
-rw-r--r--docs/plugins/inspect/plugin-tta.xml4
-rw-r--r--docs/plugins/inspect/plugin-valve.xml4
-rw-r--r--docs/plugins/inspect/plugin-vcdsrc.xml4
-rw-r--r--docs/plugins/inspect/plugin-videosignal.xml4
-rw-r--r--docs/plugins/inspect/plugin-vmnc.xml4
-rw-r--r--docs/plugins/inspect/plugin-wildmidi.xml4
-rw-r--r--docs/plugins/inspect/plugin-x264.xml4
-rw-r--r--docs/plugins/inspect/plugin-xdgmime.xml4
-rw-r--r--docs/plugins/inspect/plugin-xvid.xml4
-rw-r--r--docs/plugins/inspect/plugin-y4menc.xml34
-rw-r--r--ext/celt/gstceltenc.c7
-rw-r--r--ext/dirac/gstdiracenc.cc16
-rw-r--r--ext/dts/gstdtsdec.c489
-rw-r--r--ext/dts/gstdtsdec.h32
-rw-r--r--ext/faac/gstfaac.c11
-rw-r--r--ext/jp2k/gstjasperenc.c16
-rw-r--r--ext/mpeg2enc/gstmpeg2enc.cc18
-rw-r--r--ext/neon/gstneonhttpsrc.c71
-rw-r--r--ext/neon/gstneonhttpsrc.h3
-rw-r--r--ext/resindvd/gstmpegdemux.c72
-rw-r--r--ext/resindvd/gstmpegdemux.h2
-rw-r--r--ext/resindvd/resindvdbin.c28
-rw-r--r--ext/resindvd/resindvdbin.h1
-rw-r--r--ext/resindvd/resindvdsrc.c495
-rw-r--r--ext/resindvd/resindvdsrc.h14
-rw-r--r--ext/resindvd/rsnaudiomunge.c55
-rw-r--r--ext/x264/GstX264Enc.prs47
-rw-r--r--ext/x264/gstx264enc.c32
-rw-r--r--ext/x264/gstx264enc.h2
-rw-r--r--ext/xvid/gstxvidenc.c8
-rw-r--r--gst-plugins-bad.doap11
-rw-r--r--gst-plugins-bad.spec.in9
-rw-r--r--gst/adpcmdec/Makefile.am12
-rw-r--r--gst/adpcmdec/adpcmdec.c452
-rw-r--r--gst/debugutils/fpsdisplaysink.c16
-rw-r--r--gst/deinterlace/.gitignore7
-rw-r--r--gst/deinterlace/Makefile.am12
-rw-r--r--gst/deinterlace/deinterlace.vcproj148
-rw-r--r--gst/deinterlace/gstdeinterlace.c514
-rw-r--r--gst/deinterlace/gstdeinterlace.h74
-rw-r--r--gst/deinterlace2/Makefile.am48
-rw-r--r--gst/deinterlace2/gstdeinterlace2.c1509
-rw-r--r--gst/deinterlace2/gstdeinterlace2.h258
-rw-r--r--gst/deinterlace2/tvtime/greedy.c488
-rw-r--r--gst/deinterlace2/tvtime/greedyh.asm250
-rw-r--r--gst/deinterlace2/tvtime/greedyh.c420
-rw-r--r--gst/deinterlace2/tvtime/greedyhmacros.h75
-rw-r--r--gst/deinterlace2/tvtime/linear.c214
-rw-r--r--gst/deinterlace2/tvtime/linearblend.c231
-rw-r--r--gst/deinterlace2/tvtime/mmx.h723
-rw-r--r--gst/deinterlace2/tvtime/plugins.h54
-rw-r--r--gst/deinterlace2/tvtime/scalerbob.c74
-rw-r--r--gst/deinterlace2/tvtime/sse.h992
-rw-r--r--gst/deinterlace2/tvtime/tomsmocomp.c211
-rw-r--r--gst/deinterlace2/tvtime/tomsmocomp/SearchLoop0A.inc15
-rw-r--r--gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc174
-rw-r--r--gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA.inc11
-rw-r--r--gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA8.inc12
-rw-r--r--gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA.inc10
-rw-r--r--gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA2.inc5
-rw-r--r--gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA6.inc11
-rw-r--r--gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH.inc10
-rw-r--r--gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH2.inc5
-rw-r--r--gst/deinterlace2/tvtime/tomsmocomp/SearchLoopTop.inc254
-rw-r--r--gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVA.inc6
-rw-r--r--gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVAH.inc6
-rw-r--r--gst/deinterlace2/tvtime/tomsmocomp/StrangeBob.inc435
-rw-r--r--gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc241
-rw-r--r--gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc243
-rw-r--r--gst/deinterlace2/tvtime/tomsmocomp/WierdBob.inc286
-rw-r--r--gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h164
-rw-r--r--gst/deinterlace2/tvtime/vfir.c187
-rw-r--r--gst/deinterlace2/tvtime/weave.c82
-rw-r--r--gst/deinterlace2/tvtime/weavebff.c88
-rw-r--r--gst/deinterlace2/tvtime/weavetff.c88
-rw-r--r--gst/deinterlace2/tvtime/x86-64_macros.inc82
-rw-r--r--gst/dvdspu/Makefile.am4
-rw-r--r--gst/dvdspu/gstdvdspu-render.c513
-rw-r--r--gst/dvdspu/gstdvdspu.c883
-rw-r--r--gst/dvdspu/gstdvdspu.h132
-rw-r--r--gst/dvdspu/gstspu-common.h56
-rw-r--r--gst/dvdspu/gstspu-pgs.c762
-rw-r--r--gst/dvdspu/gstspu-pgs.h106
-rw-r--r--gst/dvdspu/gstspu-vobsub-render.c536
-rw-r--r--gst/dvdspu/gstspu-vobsub.c513
-rw-r--r--gst/dvdspu/gstspu-vobsub.h110
-rw-r--r--gst/flv/Makefile.am9
-rw-r--r--gst/flv/gstflvdemux.c1323
-rw-r--r--gst/flv/gstflvdemux.h130
-rw-r--r--gst/flv/gstflvmux.c1040
-rw-r--r--gst/flv/gstflvmux.h89
-rw-r--r--gst/flv/gstflvparse.c1283
-rw-r--r--gst/id3tag/Makefile.am19
-rw-r--r--gst/id3tag/gstid3tag.c229
-rw-r--r--gst/id3tag/gstid3tag.h63
-rw-r--r--gst/id3tag/gsttagmux.c495
-rw-r--r--gst/id3tag/gsttagmux.h79
-rw-r--r--gst/id3tag/id3tag.c1194
-rw-r--r--gst/id3tag/id3tag.h (renamed from gst/flv/gstflvparse.h)28
-rw-r--r--gst/mpeg4videoparse/mpeg4videoparse.c8
-rw-r--r--gst/mpegdemux/gstmpegdefs.h4
-rw-r--r--gst/mpegdemux/gstmpegdemux.c134
-rw-r--r--gst/mpegdemux/gstmpegdemux.h5
-rw-r--r--gst/mpegdemux/gstmpegtsdemux.c375
-rw-r--r--gst/mpegdemux/gstmpegtsdemux.h22
-rw-r--r--gst/mpegdemux/gstpesfilter.c18
-rw-r--r--gst/mpegdemux/gstpesfilter.h2
-rw-r--r--gst/mpegdemux/mpegtspacketizer.c19
-rw-r--r--gst/mpegdemux/mpegtspacketizer.h2
-rw-r--r--gst/mpegdemux/mpegtsparse.c69
-rw-r--r--gst/mpegdemux/mpegtsparse.h2
-rw-r--r--gst/mpegvideoparse/mpegpacketiser.c7
-rw-r--r--gst/mpegvideoparse/mpegpacketiser.h2
-rw-r--r--gst/mpegvideoparse/mpegvideoparse.c1
-rw-r--r--gst/mxf/mxf.c3
-rw-r--r--gst/mxf/mxfdemux.c161
-rw-r--r--gst/mxf/mxfdemux.h2
-rw-r--r--gst/mxf/mxfmetadata.c2
-rw-r--r--gst/mxf/mxfmux.c107
-rw-r--r--gst/mxf/mxfmux.h1
-rw-r--r--gst/qtmux/atoms.c12
-rw-r--r--gst/qtmux/gstqtmux.c2
-rw-r--r--gst/qtmux/gstqtmuxmap.c2
-rw-r--r--gst/rtpmanager/gstrtpbin-marshal.list1
-rw-r--r--gst/rtpmanager/gstrtpbin.c361
-rw-r--r--gst/rtpmanager/gstrtpsession.c60
-rw-r--r--gst/rtpmanager/gstrtpssrcdemux.c82
-rw-r--r--gst/rtpmanager/gstrtpssrcdemux.h6
-rw-r--r--gst/rtpmanager/rtpsource.c49
-rw-r--r--gst/sdp/gstsdpdemux.c76
-rw-r--r--gst/sdp/gstsdpdemux.h1
-rw-r--r--gst/y4m/Makefile.am10
-rw-r--r--gst/y4m/gsty4mencode.c332
-rw-r--r--gst/y4m/gsty4mencode.h67
-rw-r--r--m4/gst-fionread.m416
-rw-r--r--po/Makevars5
-rw-r--r--po/af.po92
-rw-r--r--po/az.po92
-rw-r--r--po/bg.po268
-rw-r--r--po/ca.po92
-rw-r--r--po/cs.po92
-rw-r--r--po/da.po104
-rw-r--r--po/de.po262
-rw-r--r--po/en_GB.po92
-rw-r--r--po/es.po102
-rw-r--r--po/fi.po92
-rw-r--r--po/fr.po92
-rw-r--r--po/hu.po267
-rw-r--r--po/id.po96
-rw-r--r--po/it.po112
-rw-r--r--po/ky.po92
-rw-r--r--po/lt.po92
-rw-r--r--po/mt.po92
-rw-r--r--po/nb.po92
-rw-r--r--po/nl.po92
-rw-r--r--po/or.po92
-rw-r--r--po/pl.po92
-rw-r--r--po/pt_BR.po92
-rw-r--r--po/ru.po92
-rw-r--r--po/sk.po92
-rw-r--r--po/sq.po92
-rw-r--r--po/sr.po92
-rw-r--r--po/sv.po92
-rw-r--r--po/tr.po92
-rw-r--r--po/uk.po92
-rw-r--r--po/vi.po108
-rw-r--r--po/zh_CN.po92
-rw-r--r--sys/Makefile.am10
-rw-r--r--sys/directdraw/Makefile.am12
-rw-r--r--sys/directdraw/gstdirectdrawplugin.c47
-rw-r--r--sys/directdraw/gstdirectdrawsink.c1945
-rw-r--r--sys/directdraw/gstdirectdrawsink.h141
-rw-r--r--tests/check/Makefile.am4
-rw-r--r--tests/check/elements/.gitignore1
-rw-r--r--tests/check/elements/rtpbin.c337
-rw-r--r--tests/check/elements/y4menc.c165
-rw-r--r--tests/examples/scaletempo/demo-player.c2
-rw-r--r--win32/MANIFEST3
-rw-r--r--win32/common/config.h4
-rw-r--r--win32/vs6/libgstdirectdraw.dsp125
-rw-r--r--win32/vs7/libgstdirectdraw.vcproj (renamed from gst/y4m/y4menc.vcproj)59
-rw-r--r--win32/vs8/libgstdirectdraw.vcproj214
271 files changed, 14074 insertions, 23130 deletions
diff --git a/ChangeLog b/ChangeLog
index 3e6e6424..85254fb0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,9 +1,3034 @@
+=== release 0.10.12 ===
+
+2009-05-20 Jan Schmidt <jan.schmidt@sun.com>
+
+ * configure.ac:
+ releasing 0.10.12, "More than I can handle"
+
+2009-05-20 17:10:40 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/mxf/mxfmetadata.c:
+ mxf: Fix frame_layout for non-interlaced formats. Fixes #583337
+
+2009-05-16 01:58:33 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ * configure.ac:
+ * 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:
+ * win32/common/config.h:
+ 0.10.11.3 pre-release
+
+2009-05-16 01:53:15 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * win32/MANIFEST:
+ win32: Add directdraw project files to the win32 manifest
+
+2009-05-16 01:14:23 +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-directdraw.xml:
+ * sys/Makefile.am:
+ Moved 'directdraw' from -good to -bad
+
+2007-06-15 09:13:55 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ [MOVED FROM GOOD] win32/vs6/: Mark *.dsp & *.dsw as binary files and convert to DOS line endings, as they don't load into VS6 correctly...
+ Original commit message from CVS:
+ * win32/vs6/autogen.dsp:
+ * win32/vs6/gst_plugins_good.dsw:
+ * win32/vs6/libgstalaw.dsp:
+ * win32/vs6/libgstalpha.dsp:
+ * win32/vs6/libgstalphacolor.dsp:
+ * win32/vs6/libgstapetag.dsp:
+ * win32/vs6/libgstaudiofx.dsp:
+ * win32/vs6/libgstauparse.dsp:
+ * win32/vs6/libgstautodetect.dsp:
+ * win32/vs6/libgstavi.dsp:
+ * win32/vs6/libgstcutter.dsp:
+ * win32/vs6/libgstdirectdraw.dsp:
+ * win32/vs6/libgstdirectsound.dsp:
+ * win32/vs6/libgsteffectv.dsp:
+ * win32/vs6/libgstflx.dsp:
+ * win32/vs6/libgstgoom.dsp:
+ * win32/vs6/libgsticydemux.dsp:
+ * win32/vs6/libgstid3demux.dsp:
+ * win32/vs6/libgstinterleave.dsp:
+ * win32/vs6/libgstjpeg.dsp:
+ * win32/vs6/libgstlevel.dsp:
+ * win32/vs6/libgstmatroska.dsp:
+ * win32/vs6/libgstmedian.dsp:
+ * win32/vs6/libgstmonoscope.dsp:
+ * win32/vs6/libgstmulaw.dsp:
+ * win32/vs6/libgstmultipart.dsp:
+ * win32/vs6/libgstqtdemux.dsp:
+ * win32/vs6/libgstrtp.dsp:
+ * win32/vs6/libgstrtsp.dsp:
+ * win32/vs6/libgstsmpte.dsp:
+ * win32/vs6/libgstspeex.dsp:
+ * win32/vs6/libgstudp.dsp:
+ * win32/vs6/libgstvideobalance.dsp:
+ * win32/vs6/libgstvideobox.dsp:
+ * win32/vs6/libgstvideocrop.dsp:
+ * win32/vs6/libgstvideoflip.dsp:
+ * win32/vs6/libgstvideomixer.dsp:
+ * win32/vs6/libgstwaveform.dsp:
+ * win32/vs6/libgstwavenc.dsp:
+ * win32/vs6/libgstwavparse.dsp:
+ Mark *.dsp & *.dsw as binary files and convert to DOS line
+ endings, as they don't load into VS6 correctly otherwise.
+
+2007-02-11 15:26:49 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ [MOVED FROM GOOD] Makefile.am: Add win32 MANIFEST
+ Original commit message from CVS:
+ * Makefile.am:
+ Add win32 MANIFEST
+ * sys/directdraw/gstdirectdrawsink.c:
+ * sys/directdraw/gstdirectdrawsink.h:
+ Clear unused code and add comments.
+ Remove yuv from template caps, it only supports RGB
+ actually.
+ Implement XOverlay interface and remove window and fullscreen
+ properties.
+ Add debug logs.
+ Test for blit capabilities to return only the current colorspace if
+ the hardware can't blit for one colorspace to another.
+ * sys/directsound/gstdirectsoundsink.c:
+ Add some debugs.
+ * win32/MANIFEST:
+ Add VS7 project files and solution.
+ * win32/vs6/gst_plugins_bad.dsw:
+ * win32/vs6/libgstdirectdraw.dsp:
+ * win32/vs6/libgstdirectsound.dsp:
+ * win32/vs6/libgstqtdemux.dsp:
+ Update project files.
+
+2006-11-01 10:19:18 +0000 Sergey Scobich <sergey.scobich@gmail.com>
+
+ [MOVED FROM GOOD] sys/: Wait until the window is created before using it; guard unistd.h includes with HAVE_UNISTD_H. (#366523)
+ Original commit message from CVS:
+ Patch by: Sergey Scobich <sergey dot scobich at gmail com>
+ * sys/directdraw/gstdirectdrawsink.c:
+ (gst_directdrawsink_window_thread),
+ (gst_directdrawsink_create_default_window):
+ * sys/directdraw/gstdirectdrawsink.h:
+ * sys/directsound/gstdirectsoundsink.c:
+ Wait until the window is created before using it; guard unistd.h
+ includes with HAVE_UNISTD_H. (#366523)
+ * win32/vs8/libgstdirectdraw.vcproj:
+ * win32/vs8/libgstdirectsound.vcproj:
+ Update project files.
+
+2006-07-24 21:43:06 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ [MOVED FROM GOOD] sys/directsound/gstdirectsoundsink.*: Add an attenuation property that will directly attenuate the directsound buffer.
+ Original commit message from CVS:
+ * sys/directsound/gstdirectsoundsink.h:
+ * sys/directsound/gstdirectsoundsink.c:
+ Add an attenuation property that will directly attenuate the
+ directsound buffer.
+ Change the size of the directsound secondary buffer to a half second.
+ Add more debug logs.
+ Add a lock to protect dsound buffer write access.
+ Fix a bad implementation of reset.
+ * sys/directsound/gstdirectdrawsink.c:
+ * sys/directsound/gstdirectdrawsink.h:
+ Add a keep_aspect_ratio property.
+ Do not use overlay if not supported.
+ Add more debug logs.
+ Remove overwrite of WM_ERASEBKGND message handling. It was not
+ redrawing border when keep_aspect_ratio was enabled.
+ * win32/common/config.h:
+ update version waiting an auto-generated config.h
+
+2006-03-03 23:45:23 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ [MOVED FROM GOOD] sys/: sinks are now using GST_RANK_PRIMARY to be used with autodectection
+ Original commit message from CVS:
+ * sys/directdraw:
+ * sys/directsound:
+ sinks are now using GST_RANK_PRIMARY to be used with autodectection
+ * win32/vs6:
+ project files updated to fix some bugs
+ * win32/vs7:
+ * win32/vs8:
+ vs7 and vs8 project files added
+
+2006-01-05 23:17:44 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ * win32/vs6/libgstdirectdraw.dsp:
+ [MOVED FROM GOOD] added sys/directdraw added sys/directsound added win32/vs6/gst_plugins_bad.dsw added win32/vs6/libgstdirectsound.dsp ...
+ Original commit message from CVS:
+ 2006-01-05 Sebastien Moutte <sebastien@moutte.net>
+ * added sys/directdraw
+ * added sys/directsound
+ * added win32/vs6/gst_plugins_bad.dsw
+ * added win32/vs6/libgstdirectsound.dsp
+ * added win32/vs6/libgstdirectdraw.dsp
+ * added win32/common/config.h
+
+2009-02-27 20:40:31 +0100 LRN <lrn1986@gmail.com>
+
+ * sys/directdraw/gstdirectdrawsink.c:
+ [MOVED FROM GOOD] directdrawsink: Fix type mismatches
+ Fixes bug #573343.
+
+2009-01-29 11:07:59 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/directdraw/gstdirectdrawsink.c:
+ [MOVED FROM GOOD] Remove version numbers from a few gst-launch examples.
+ The majority of the examples doe not use -0.10 and this will also help us to maintain the docs.
+
+2009-01-29 10:10:08 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/directdraw/gstdirectdrawsink.c:
+ [MOVED FROM GOOD] Update and add documentation for platform specific plugins (sys).
+ Link to properties. Correct titles for examples. Fix examples.
+
+2008-11-04 12:28:34 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ [MOVED FROM GOOD] Don't install static libs for plugins. Fixes #550851 for -good.
+ Original commit message from CVS:
+ * ext/aalib/Makefile.am:
+ * ext/annodex/Makefile.am:
+ * ext/cairo/Makefile.am:
+ * ext/dv/Makefile.am:
+ * ext/esd/Makefile.am:
+ * ext/flac/Makefile.am:
+ * ext/gconf/Makefile.am:
+ * ext/gdk_pixbuf/Makefile.am:
+ * ext/hal/Makefile.am:
+ * ext/jpeg/Makefile.am:
+ * ext/ladspa/Makefile.am:
+ * ext/libcaca/Makefile.am:
+ * ext/libmng/Makefile.am:
+ * ext/libpng/Makefile.am:
+ * ext/mikmod/Makefile.am:
+ * ext/pulse/Makefile.am:
+ * ext/raw1394/Makefile.am:
+ * ext/shout2/Makefile.am:
+ * ext/soup/Makefile.am:
+ * ext/speex/Makefile.am:
+ * ext/taglib/Makefile.am:
+ * ext/wavpack/Makefile.am:
+ * gst/alpha/Makefile.am:
+ * gst/apetag/Makefile.am:
+ * gst/audiofx/Makefile.am:
+ * gst/auparse/Makefile.am:
+ * gst/autodetect/Makefile.am:
+ * gst/avi/Makefile.am:
+ * gst/cutter/Makefile.am:
+ * gst/debug/Makefile.am:
+ * gst/effectv/Makefile.am:
+ * gst/equalizer/Makefile.am:
+ * gst/flx/Makefile.am:
+ * gst/goom/Makefile.am:
+ * gst/goom2k1/Makefile.am:
+ * gst/icydemux/Makefile.am:
+ * gst/id3demux/Makefile.am:
+ * gst/interleave/Makefile.am:
+ * gst/law/Makefile.am:
+ * gst/level/Makefile.am:
+ * gst/matroska/Makefile.am:
+ * gst/median/Makefile.am:
+ * gst/monoscope/Makefile.am:
+ * gst/multifile/Makefile.am:
+ * gst/multipart/Makefile.am:
+ * gst/oldcore/Makefile.am:
+ * gst/qtdemux/Makefile.am:
+ * gst/replaygain/Makefile.am:
+ * gst/rtp/Makefile.am:
+ * gst/rtsp/Makefile.am:
+ * gst/smpte/Makefile.am:
+ * gst/spectrum/Makefile.am:
+ * gst/udp/Makefile.am:
+ * gst/videobox/Makefile.am:
+ * gst/videocrop/Makefile.am:
+ * gst/videofilter/Makefile.am:
+ * gst/videomixer/Makefile.am:
+ * gst/wavenc/Makefile.am:
+ * gst/wavparse/Makefile.am:
+ * sys/directdraw/Makefile.am:
+ * sys/directsound/Makefile.am:
+ * sys/oss/Makefile.am:
+ * sys/osxaudio/Makefile.am:
+ * sys/osxvideo/Makefile.am:
+ * sys/sunaudio/Makefile.am:
+ * sys/v4l2/Makefile.am:
+ * sys/waveform/Makefile.am:
+ * sys/ximage/Makefile.am:
+ Don't install static libs for plugins. Fixes #550851 for -good.
+
+2008-08-21 21:56:19 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ * sys/directdraw/gstdirectdrawsink.c:
+ [MOVED FROM GOOD] sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_buffer_alloc, gst_directdraw_sink_bufferpool_clear):
+ Original commit message from CVS:
+ * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_buffer_alloc,
+ gst_directdraw_sink_bufferpool_clear):
+ Fix two more buffer ref leaks.
+
+2008-08-21 15:28:09 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ [MOVED FROM GOOD] sys/directdraw/gstdirectdrawsink.c: Fix buffer ref leak.
+ Original commit message from CVS:
+ Patch by: Ole André Vadla Ravnås <ole.andre.ravnas at tandberg com>
+ * sys/directdraw/gstdirectdrawsink.c:
+ (gst_directdraw_sink_show_frame):
+ Fix buffer ref leak.
+
+2008-05-07 15:33:52 +0000 Haakon Sporsheim <haakon.sporsheim@tandberg.com>
+
+ [MOVED FROM GOOD] sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_setup_ddraw): Do IDirectDrawClipper_SetHWnd() if the window I...
+ Original commit message from CVS:
+ patch by: Haakon Sporsheim <haakon.sporsheim at tandberg com>
+ * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_setup_ddraw):
+ Do IDirectDrawClipper_SetHWnd() if the window ID has already been
+ set after creating the clipper.
+
+2008-05-07 15:28:06 +0000 Haakon Sporsheim <haakon.sporsheim@tandberg.com>
+
+ [MOVED FROM GOOD] sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_show_frame): Added checking of surface lost case after an uns...
+ Original commit message from CVS:
+ patch by: Haakon Sporsheim <haakon.sporsheim at tandberg com>
+ * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_show_frame):
+ Added checking of surface lost case after an unsuccessful
+ IDirectDrawSurface7_Lock() call.
+ If surface is lost, return GST_FLOW_OK.
+
+2008-05-07 15:19:47 +0000 Haakon Sporsheim <haakon.sporsheim@tandberg.com>
+
+ * sys/directdraw/gstdirectdrawsink.c:
+ [MOVED FROM GOOD] sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_show_frame,
+ Original commit message from CVS:
+ patch by: Haakon Sporsheim <haakon.sporsheim at tandberg com>
+ * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_show_frame,
+ WndProc, gst_directdraw_sink_window_thread):
+ Improved Windows message loop and fixed window destruction issue.
+ When the window which DirectDraw is rendering to is destroyed, the
+ render/show_frame function will return GST_FLOW_ERROR.
+ Partially fixes #520885.
+
+2008-05-07 15:09:10 +0000 Haakon Sporsheim <haakon.sporsheim@tandberg.com>
+
+ [MOVED FROM GOOD] sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_set_caps): Fixed mid stream resolution change bug, the offscr...
+ Original commit message from CVS:
+ patch by: Haakon Sporsheim <haakon.sporsheim at tandberg com>
+ * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_set_caps):
+ Fixed mid stream resolution change bug, the offscreen surface is now
+ released when set_caps is called.
+ Partially fixes #520885.
+
+2008-05-07 14:56:22 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ * sys/directdraw/gstdirectdrawsink.c:
+ [MOVED FROM GOOD] sys/directdraw/gstdirectdrawsink.c
+ Original commit message from CVS:
+ * sys/directdraw/gstdirectdrawsink.c
+ (gst_directdraw_sink_buffer_alloc):
+ Make it so that gst_directdraw_sink_buffer_alloc uses the right
+ width/height.
+ Especially when looking through the pool of buffers, make sure that
+ the width/height of caps is used instead of the already negotiated
+ dimensions.
+ For example if a buffer with different caps is requested, i.e.
+ higher resolution, the caller would get a buffer with the old
+ dimensions and thus corrupt the heap.
+
+2008-05-07 14:43:39 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ * sys/directdraw/gstdirectdrawsink.c:
+ [MOVED FROM GOOD] sys/directdraw/gstdirectdrawsink.c
+ Original commit message from CVS:
+ * sys/directdraw/gstdirectdrawsink.c
+ (gst_directdraw_sink_buffer_alloc):
+ Clear the flags on recycled buffers from buffer_alloc.
+ Partially fixes #520885.
+ The right fix this time.
+
+2008-05-07 14:39:45 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ * sys/directdraw/gstdirectdrawsink.c:
+ [MOVED FROM GOOD] sys/directdraw/gstdirectdrawsink.c
+ Original commit message from CVS:
+ * sys/directdraw/gstdirectdrawsink.c
+ (gst_directdraw_sink_buffer_alloc):
+ Reverting previous commit, it had it all mixed up, was for a different
+ patch (major automation screw-up). Sorry!
+
+2008-05-07 13:48:28 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ * sys/directdraw/gstdirectdrawsink.c:
+ [MOVED FROM GOOD] sys/directdraw/gstdirectdrawsink.c
+ Original commit message from CVS:
+ * sys/directdraw/gstdirectdrawsink.c
+ (gst_directdraw_sink_buffer_alloc):
+ Clear the flags on recycled buffers from buffer_alloc.
+ Partially fixes #520885.
+
+2008-02-12 12:22:48 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ [MOVED FROM GOOD] sys/directdraw/gstdirectdrawsink.c: Properly chain up finalize functions. Fixes bug #515980.
+ Original commit message from CVS:
+ * sys/directdraw/gstdirectdrawsink.c:
+ (gst_ddrawsurface_class_init), (gst_ddrawsurface_finalize),
+ (gst_directdraw_sink_finalize):
+ Properly chain up finalize functions. Fixes bug #515980.
+
+2008-01-07 16:41:00 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ [MOVED FROM GOOD] sys/directdraw/gstdirectdrawsink.c: FALSE is not a gpointer.
+ Original commit message from CVS:
+ * sys/directdraw/gstdirectdrawsink.c:
+ (gst_directdraw_sink_window_thread):
+ FALSE is not a gpointer.
+
+2008-01-05 21:20:08 +0000 Julien Moutte <julien@moutte.net>
+
+ [MOVED FROM GOOD] sys/directdraw/gstdirectdrawsink.c: Make sure we create our internal window only when we need it. That will give a ch...
+ Original commit message from CVS:
+ 2008-01-05 Julien Moutte <julien@fluendo.com>
+ * sys/directdraw/gstdirectdrawsink.c:
+ (gst_directdraw_sink_set_window_id),
+ (gst_directdraw_sink_set_caps),
+ (gst_directdraw_sink_change_state),
+ (gst_directdraw_sink_buffer_alloc),
+ (gst_directdraw_sink_draw_borders),
+ (gst_directdraw_sink_show_frame),
+ (gst_directdraw_sink_setup_ddraw),
+ (gst_directdraw_sink_window_thread),
+ (gst_directdraw_sink_get_ddrawcaps),
+ (gst_directdraw_sink_surface_create): Make sure we create our
+ internal window only when we need it. That will give a chance to
+ the application to get the prepare-xwindow-id bus message. Draw
+ black borders when keeping aspect ratio. Handle the case where
+ our
+ rendering window disappears (closed or errors) like other sinks
+ do. Various 80 columns fixes, improve state change order. That
+ element could need some more love.
+
+2007-09-22 08:12:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * sys/directdraw/gstdirectdrawsink.c:
+ * sys/directdraw/gstdirectdrawsink.h:
+ [MOVED FROM GOOD] fix header and comments
+ Original commit message from CVS:
+ fix header and comments
+
+2007-06-14 12:14:24 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ [MOVED FROM GOOD] Make sure to dist everything needed for win32 builds.
+ Original commit message from CVS:
+ * configure.ac:
+ * sys/Makefile.am:
+ * sys/directdraw/Makefile.am:
+ * sys/directsound/Makefile.am:
+ * sys/waveform/Makefile.am:
+ Make sure to dist everything needed for win32 builds.
+
+2007-06-08 16:31:15 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ [MOVED FROM GOOD] Rename the keep-aspect-ratio property to force-aspect-ratio to make it consistent with xvimagesink and ximagesink.
+ Original commit message from CVS:
+ * docs/plugins/gst-plugins-bad-plugins.args:
+ * sys/directdraw/gstdirectdrawsink.c:
+ (gst_directdraw_sink_class_init):
+ Rename the keep-aspect-ratio property to force-aspect-ratio to make
+ it consistent with xvimagesink and ximagesink.
+
+2007-05-24 08:35:23 +0000 Vincent Torri <vtorri@univ-evry.fr>
+
+ [MOVED FROM GOOD] sys/directdraw/gstdirectdrawsink.*: Fix more warnings when compiling with MingW (#439914).
+ Original commit message from CVS:
+ Patch by: Vincent Torri <vtorri at univ-evry fr>
+ * sys/directdraw/gstdirectdrawsink.c:
+ (gst_directdraw_sink_buffer_alloc),
+ (gst_directdraw_sink_show_frame),
+ (gst_directdraw_sink_check_primary_surface),
+ (gst_directdraw_sink_check_offscreen_surface),
+ (EnumModesCallback2), (gst_directdraw_sink_get_ddrawcaps),
+ (gst_directdraw_sink_surface_create):
+ * sys/directdraw/gstdirectdrawsink.h:
+ Fix more warnings when compiling with MingW (#439914).
+
+2007-05-20 14:59:46 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ [MOVED FROM GOOD] sys/directdraw/gstdirectdrawsink.c: Bunch of small fixes: remove static function that doesn't exist; declare another ...
+ Original commit message from CVS:
+ * sys/directdraw/gstdirectdrawsink.c: (gst_ddrawsurface_finalize),
+ (gst_directdraw_sink_buffer_alloc),
+ (gst_directdraw_sink_get_ddrawcaps),
+ (gst_directdraw_sink_surface_create):
+ Bunch of small fixes: remove static function that doesn't exist;
+ declare another one that does; printf format fix; use right macro
+ when specifying debug category; remove a bunch of unused variables;
+ #if 0 out an unused chunk of code (partially fixes #439914).
+
+2007-05-15 17:22:58 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ [MOVED FROM GOOD] Add DIRECTDRAW_CFLAGS and DIRECTSOUND_CFLAGS to Makefile.am; save and restore the various flags in the directdraw/dir...
+ Original commit message from CVS:
+ * configure.ac:
+ * sys/directdraw/Makefile.am:
+ * sys/directsound/Makefile.am:
+ Add DIRECTDRAW_CFLAGS and DIRECTSOUND_CFLAGS to Makefile.am; save
+ and restore the various flags in the directdraw/directsound
+ detection section. Apparently improves cross-compiling for win32
+ with mingw32 under some circumstances (#437539).
+
+2007-04-29 13:56:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * sys/directdraw/gstdirectdrawsink.c:
+ [MOVED FROM GOOD] 80 char police
+ Original commit message from CVS:
+ 80 char police
+
+2007-03-11 22:23:04 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ [MOVED FROM GOOD] sys/directdraw/gstdirectdrawsink.*: Handle display mode changes during playback.
+ Original commit message from CVS:
+ * sys/directdraw/gstdirectdrawsink.c:
+ * sys/directdraw/gstdirectdrawsink.h:
+ Handle display mode changes during playback.
+
+2007-02-27 12:02:03 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * sys/directdraw/gstdirectdrawplugin.c:
+ * sys/directdraw/gstdirectdrawsink.c:
+ * sys/directdraw/gstdirectdrawsink.h:
+ [MOVED FROM GOOD] update copyright statements
+ Original commit message from CVS:
+ update copyright statements
+
+2007-02-18 18:00:51 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ [MOVED FROM GOOD] sys/directdraw/: Prepare the plugin to move to good:
+ Original commit message from CVS:
+ * sys/directdraw/gstdirectdrawplugin.c:
+ * sys/directdraw/gstdirectdrawsink.c:
+ * sys/directdraw/gstdirectdrawsink.h:
+ Prepare the plugin to move to good:
+ Remove unused/untested code (rendering to an extern surface,
+ yuv format rendering).Use GST_(DEBUG/*)_OBJECT macros
+ Rename all functions from gst_directdrawsink to gst_directdraw_sink.
+ Add gtk doc section
+ Fix a bug in gst_directdraw_sink_show_frame, memcpy line by line
+ respecting destination surface stride.
+ * sys/directsound/gstdirectsoundplugin.c:
+ * sys/directsound/gstdirectsoundsink.c:
+ * sys/directsound/gstdirectsoundsink.h:
+ Prepare the plugin to move to good:
+ Rename all functions from gst_directsoundsink to gst_directsound_sink.
+ Add gtk doc section
+ * win32/common/config.h.in:
+ * win32/MANIFEST:
+ Add config.h.in
+
+2007-02-11 15:26:49 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ [MOVED FROM GOOD] Makefile.am: Add win32 MANIFEST
+ Original commit message from CVS:
+ * Makefile.am:
+ Add win32 MANIFEST
+ * sys/directdraw/gstdirectdrawsink.c:
+ * sys/directdraw/gstdirectdrawsink.h:
+ Clear unused code and add comments.
+ Remove yuv from template caps, it only supports RGB
+ actually.
+ Implement XOverlay interface and remove window and fullscreen
+ properties.
+ Add debug logs.
+ Test for blit capabilities to return only the current colorspace if
+ the hardware can't blit for one colorspace to another.
+ * sys/directsound/gstdirectsoundsink.c:
+ Add some debugs.
+ * win32/MANIFEST:
+ Add VS7 project files and solution.
+ * win32/vs6/gst_plugins_bad.dsw:
+ * win32/vs6/libgstdirectdraw.dsp:
+ * win32/vs6/libgstdirectsound.dsp:
+ * win32/vs6/libgstqtdemux.dsp:
+ Update project files.
+
+2007-01-03 19:54:33 +0000 Vincent Torri <vtorri@univ-evry.fr>
+
+ [MOVED FROM GOOD] Add directdrawsink to build and dist it, so it gets built when compiling with MingW on win32 and the required headers...
+ Original commit message from CVS:
+ Patch by: Vincent Torri <vtorri at univ-evry fr>
+ * configure.ac:
+ * sys/Makefile.am:
+ * sys/directdraw/Makefile.am:
+ Add directdrawsink to build and dist it, so it gets built when
+ compiling with MingW on win32 and the required headers and libraries
+ are available (fixes: #392313).
+ * sys/directdraw/gstdirectdrawsink.c:
+ (gst_directdrawsink_center_rect), (gst_directdrawsink_show_frame),
+ (gst_directdrawsink_setup_ddraw),
+ (gst_directdrawsink_surface_create):
+ Comment out some unused things and fix some printf format issues in
+ order to avoid warnings when buildling with MingW (#392313).
+
+2006-11-01 10:19:18 +0000 Sergey Scobich <sergey.scobich@gmail.com>
+
+ [MOVED FROM GOOD] sys/: Wait until the window is created before using it; guard unistd.h includes with HAVE_UNISTD_H. (#366523)
+ Original commit message from CVS:
+ Patch by: Sergey Scobich <sergey dot scobich at gmail com>
+ * sys/directdraw/gstdirectdrawsink.c:
+ (gst_directdrawsink_window_thread),
+ (gst_directdrawsink_create_default_window):
+ * sys/directdraw/gstdirectdrawsink.h:
+ * sys/directsound/gstdirectsoundsink.c:
+ Wait until the window is created before using it; guard unistd.h
+ includes with HAVE_UNISTD_H. (#366523)
+ * win32/vs8/libgstdirectdraw.vcproj:
+ * win32/vs8/libgstdirectsound.vcproj:
+ Update project files.
+
+2006-07-24 21:43:06 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ [MOVED FROM GOOD] sys/directsound/gstdirectsoundsink.*: Add an attenuation property that will directly attenuate the directsound buffer.
+ Original commit message from CVS:
+ * sys/directsound/gstdirectsoundsink.h:
+ * sys/directsound/gstdirectsoundsink.c:
+ Add an attenuation property that will directly attenuate the
+ directsound buffer.
+ Change the size of the directsound secondary buffer to a half second.
+ Add more debug logs.
+ Add a lock to protect dsound buffer write access.
+ Fix a bad implementation of reset.
+ * sys/directsound/gstdirectdrawsink.c:
+ * sys/directsound/gstdirectdrawsink.h:
+ Add a keep_aspect_ratio property.
+ Do not use overlay if not supported.
+ Add more debug logs.
+ Remove overwrite of WM_ERASEBKGND message handling. It was not
+ redrawing border when keep_aspect_ratio was enabled.
+ * win32/common/config.h:
+ update version waiting an auto-generated config.h
+
+2006-06-12 10:53:26 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ [MOVED FROM GOOD] ext/libmms/gstmms.c: Set caps on outgoing buffers.
+ Original commit message from CVS:
+ * ext/libmms/gstmms.c: (gst_mms_create):
+ Set caps on outgoing buffers.
+ * sys/directdraw/gstdirectdrawsink.c: (gst_directdrawsink_init):
+ Comment out unused global instance variable.
+
+2006-06-01 22:00:26 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ [MOVED FROM GOOD] Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass
+ Original commit message from CVS:
+ * ext/alsaspdif/alsaspdifsink.h:
+ * ext/amrwb/gstamrwbdec.h:
+ * ext/amrwb/gstamrwbenc.h:
+ * ext/amrwb/gstamrwbparse.h:
+ * ext/arts/gst_arts.h:
+ * ext/artsd/gstartsdsink.h:
+ * ext/audiofile/gstafparse.h:
+ * ext/audiofile/gstafsink.h:
+ * ext/audiofile/gstafsrc.h:
+ * ext/audioresample/gstaudioresample.h:
+ * ext/bz2/gstbz2dec.h:
+ * ext/bz2/gstbz2enc.h:
+ * ext/dirac/gstdiracdec.h:
+ * ext/directfb/dfbvideosink.h:
+ * ext/divx/gstdivxdec.h:
+ * ext/divx/gstdivxenc.h:
+ * ext/dts/gstdtsdec.h:
+ * ext/faac/gstfaac.h:
+ * ext/gsm/gstgsmdec.h:
+ * ext/gsm/gstgsmenc.h:
+ * ext/ivorbis/vorbisenc.h:
+ * ext/libfame/gstlibfame.h:
+ * ext/nas/nassink.h:
+ * ext/neon/gstneonhttpsrc.h:
+ * ext/polyp/polypsink.h:
+ * ext/sdl/sdlaudiosink.h:
+ * ext/sdl/sdlvideosink.h:
+ * ext/shout/gstshout.h:
+ * ext/snapshot/gstsnapshot.h:
+ * ext/sndfile/gstsf.h:
+ * ext/swfdec/gstswfdec.h:
+ * ext/tarkin/gsttarkindec.h:
+ * ext/tarkin/gsttarkinenc.h:
+ * ext/theora/theoradec.h:
+ * ext/wavpack/gstwavpackdec.h:
+ * ext/wavpack/gstwavpackparse.h:
+ * ext/xine/gstxine.h:
+ * ext/xvid/gstxviddec.h:
+ * ext/xvid/gstxvidenc.h:
+ * gst/cdxaparse/gstcdxaparse.h:
+ * gst/cdxaparse/gstcdxastrip.h:
+ * gst/colorspace/gstcolorspace.h:
+ * gst/festival/gstfestival.h:
+ * gst/freeze/gstfreeze.h:
+ * gst/gdp/gstgdpdepay.h:
+ * gst/gdp/gstgdppay.h:
+ * gst/modplug/gstmodplug.h:
+ * gst/mpeg1sys/gstmpeg1systemencode.h:
+ * gst/mpeg1videoparse/gstmp1videoparse.h:
+ * gst/mpeg2sub/gstmpeg2subt.h:
+ * gst/mpegaudioparse/gstmpegaudioparse.h:
+ * gst/multifilesink/gstmultifilesink.h:
+ * gst/overlay/gstoverlay.h:
+ * gst/playondemand/gstplayondemand.h:
+ * gst/qtdemux/qtdemux.h:
+ * gst/rtjpeg/gstrtjpegdec.h:
+ * gst/rtjpeg/gstrtjpegenc.h:
+ * gst/smooth/gstsmooth.h:
+ * gst/smoothwave/gstsmoothwave.h:
+ * gst/spectrum/gstspectrum.h:
+ * gst/speed/gstspeed.h:
+ * gst/stereo/gststereo.h:
+ * gst/switch/gstswitch.h:
+ * gst/tta/gstttadec.h:
+ * gst/tta/gstttaparse.h:
+ * gst/videodrop/gstvideodrop.h:
+ * gst/xingheader/gstxingmux.h:
+ * sys/directdraw/gstdirectdrawsink.h:
+ * sys/directsound/gstdirectsoundsink.h:
+ * sys/dxr3/dxr3audiosink.h:
+ * sys/dxr3/dxr3spusink.h:
+ * sys/dxr3/dxr3videosink.h:
+ * sys/qcam/gstqcamsrc.h:
+ * sys/vcd/vcdsrc.h:
+ Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass
+
+2006-04-25 21:56:38 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ [MOVED FROM GOOD] Define GstElementDetails as const and also static (when defined as global)
+ Original commit message from CVS:
+ * ext/amrwb/gstamrwbdec.c:
+ * ext/amrwb/gstamrwbenc.c:
+ * ext/amrwb/gstamrwbparse.c:
+ * ext/arts/gst_arts.c:
+ * ext/artsd/gstartsdsink.c:
+ * ext/audiofile/gstafparse.c:
+ * ext/audiofile/gstafsink.c:
+ * ext/audiofile/gstafsrc.c:
+ * ext/audioresample/gstaudioresample.c:
+ * ext/bz2/gstbz2dec.c:
+ * ext/bz2/gstbz2enc.c:
+ * ext/cdaudio/gstcdaudio.c:
+ * ext/directfb/dfbvideosink.c:
+ * ext/divx/gstdivxdec.c:
+ * ext/divx/gstdivxenc.c:
+ * ext/dts/gstdtsdec.c: (gst_dtsdec_base_init):
+ * ext/faac/gstfaac.c: (gst_faac_base_init):
+ * ext/faad/gstfaad.c:
+ * ext/gsm/gstgsmdec.c:
+ * ext/gsm/gstgsmenc.c:
+ * ext/hermes/gsthermescolorspace.c:
+ * ext/ivorbis/vorbisfile.c:
+ * ext/lcs/gstcolorspace.c:
+ * ext/libfame/gstlibfame.c:
+ * ext/libmms/gstmms.c: (gst_mms_base_init):
+ * ext/musepack/gstmusepackdec.c: (gst_musepackdec_base_init):
+ * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_base_init):
+ * ext/nas/nassink.c: (gst_nassink_base_init):
+ * ext/neon/gstneonhttpsrc.c:
+ * ext/sdl/sdlaudiosink.c:
+ * ext/sdl/sdlvideosink.c:
+ * ext/shout/gstshout.c:
+ * ext/snapshot/gstsnapshot.c:
+ * ext/sndfile/gstsf.c:
+ * ext/swfdec/gstswfdec.c:
+ * ext/tarkin/gsttarkindec.c:
+ * ext/tarkin/gsttarkinenc.c:
+ * ext/theora/theoradec.c:
+ * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init):
+ * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init):
+ * ext/xvid/gstxviddec.c:
+ * ext/xvid/gstxvidenc.c:
+ * gst/cdxaparse/gstcdxaparse.c: (gst_cdxa_parse_base_init):
+ * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_base_init):
+ * gst/chart/gstchart.c:
+ * gst/colorspace/gstcolorspace.c:
+ * gst/deinterlace/gstdeinterlace.c:
+ * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_base_init):
+ * gst/festival/gstfestival.c:
+ * gst/filter/gstbpwsinc.c:
+ * gst/filter/gstiir.c:
+ * gst/filter/gstlpwsinc.c:
+ * gst/freeze/gstfreeze.c:
+ * gst/games/gstpuzzle.c: (gst_puzzle_base_init):
+ * gst/librfb/gstrfbsrc.c:
+ * gst/mixmatrix/mixmatrix.c:
+ * gst/mpeg1sys/gstmpeg1systemencode.c:
+ * gst/mpeg1videoparse/gstmp1videoparse.c:
+ * gst/mpeg2sub/gstmpeg2subt.c:
+ * gst/mpegaudioparse/gstmpegaudioparse.c:
+ * gst/multifilesink/gstmultifilesink.c:
+ * gst/overlay/gstoverlay.c:
+ * gst/passthrough/gstpassthrough.c:
+ * gst/playondemand/gstplayondemand.c:
+ * gst/qtdemux/qtdemux.c:
+ * gst/rtjpeg/gstrtjpegdec.c:
+ * gst/rtjpeg/gstrtjpegenc.c:
+ * gst/smooth/gstsmooth.c:
+ * gst/smoothwave/gstsmoothwave.c:
+ * gst/spectrum/gstspectrum.c:
+ * gst/speed/gstspeed.c:
+ * gst/stereo/gststereo.c:
+ * gst/switch/gstswitch.c:
+ * gst/tta/gstttadec.c: (gst_tta_dec_base_init):
+ * gst/tta/gstttaparse.c: (gst_tta_parse_base_init):
+ * gst/vbidec/gstvbidec.c:
+ * gst/videocrop/gstvideocrop.c:
+ * gst/videodrop/gstvideodrop.c:
+ * gst/virtualdub/gstxsharpen.c:
+ * gst/xingheader/gstxingmux.c: (gst_xing_mux_base_init):
+ * gst/y4m/gsty4mencode.c:
+ * sys/cdrom/gstcdplayer.c:
+ * sys/directdraw/gstdirectdrawsink.c:
+ * sys/directsound/gstdirectsoundsink.c:
+ * sys/glsink/glimagesink.c:
+ * sys/qcam/gstqcamsrc.c:
+ * sys/v4l2/gstv4l2src.c:
+ * sys/vcd/vcdsrc.c: (gst_vcdsrc_base_init):
+ * sys/ximagesrc/ximagesrc.c:
+ Define GstElementDetails as const and also static (when defined as
+ global)
+
+2006-04-01 10:09:11 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * sys/directdraw/gstdirectdrawplugin.c:
+ [MOVED FROM GOOD] rework build; add translations for v4l2
+ Original commit message from CVS:
+ rework build; add translations for v4l2
+
+2006-03-03 23:45:23 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ [MOVED FROM GOOD] sys/: sinks are now using GST_RANK_PRIMARY to be used with autodectection
+ Original commit message from CVS:
+ * sys/directdraw:
+ * sys/directsound:
+ sinks are now using GST_RANK_PRIMARY to be used with autodectection
+ * win32/vs6:
+ project files updated to fix some bugs
+ * win32/vs7:
+ * win32/vs8:
+ vs7 and vs8 project files added
+
+2006-01-05 23:17:44 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ * sys/directdraw/gstdirectdrawplugin.c:
+ * sys/directdraw/gstdirectdrawsink.c:
+ * sys/directdraw/gstdirectdrawsink.h:
+ [MOVED FROM GOOD] added sys/directdraw added sys/directsound added win32/vs6/gst_plugins_bad.dsw added win32/vs6/libgstdirectsound.dsp ...
+ Original commit message from CVS:
+ 2006-01-05 Sebastien Moutte <sebastien@moutte.net>
+ * added sys/directdraw
+ * added sys/directsound
+ * added win32/vs6/gst_plugins_bad.dsw
+ * added win32/vs6/libgstdirectsound.dsp
+ * added win32/vs6/libgstdirectdraw.dsp
+ * added win32/common/config.h
+
+2009-05-15 10:45:45 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/debugutils/fpsdisplaysink.c:
+ fpsdisplaysink: Fix resetting of the sink in NULL
+ Reset the fpsdisplaysink in NULL by removing the textoverlay if we
+ created it.
+ Fixes: #582633
+
+2009-05-16 00:17:00 +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-y4menc.xml:
+ * gst/y4m/Makefile.am:
+ * gst/y4m/gsty4mencode.c:
+ * gst/y4m/gsty4mencode.h:
+ * gst/y4m/y4menc.vcproj:
+ * tests/check/Makefile.am:
+ * tests/check/elements/.gitignore:
+ * tests/check/elements/y4menc.c:
+ Moved 'y4menc' from -bad to -good
+
+2009-05-15 18:24:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/Makevars:
+ po: add Makevars magic so we don't get line numbers in *.po files
+ This avoids the number one reason for local modifications in *.po
+ files and and makes things less annoying when working with git (or
+ any other VCS for that matter).
+
+2009-05-15 01:54:44 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br>
+
+ * gst/qtmux/atoms.c:
+ [qtmux] Fixes segfault when adding a blob as first tag.
+ Moves tags data initialization to the function that actually appends
+ the tags to the list. Fixes #582702
+ Also fixes some style caught by the pre-commit hook.
+
+2009-05-14 21:20:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfdemux.c:
+ * gst/mxf/mxfdemux.h:
+ mxfdemux: Use a RW lock to protect metadata and add all pads at once without a lock held
+ This makes it possible, among other things, to do a query in the
+ pad-added callback.
+ Fixes bug #582656.
+
+2009-05-14 10:34:08 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ resindvd: Fix the argument order in a debug statement
+ Make the debug statement correctly show the 'old' and 'new' button
+ coordinates, instead of the wrong way around.
+
+2009-05-14 09:53:25 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/gstmpegdemux.c:
+ * ext/resindvd/gstmpegdemux.h:
+ resindvd: Make segment updates less aggressive.
+ When updating a pad, send the update to half a second behind the SCR,
+ which avoids ever updating the start time for a pad to beyond the end of
+ the cell. Also, remember the last actual new-segment start time for each
+ pad, and use it when closing the segment.
+
+2009-05-13 12:47:43 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ resindvd: Rework button highlight calculation slightly
+ When the current button number is higher than the number of available
+ buttons, switch to the highest numbered button rather than the lowest.
+ Also, don't throw errors when we fail to retrieve some button info
+ from libdvdnav, just reset the highlight.
+
+2009-05-12 23:42:00 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ * ext/resindvd/resindvdsrc.h:
+ resindvd: Send commands-changed on button change and handle commands query
+ Send the commands-changed navigation message when the set of available
+ DVD menu button actions changes, and handle the commands navigation
+ query so that (e.g.) Totem can know about the available navigation
+ commands.
+
+2009-05-14 08:42:24 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ resindvd: Fix a leak of the DVD title string
+
+2009-05-14 10:55:38 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/dvdspu/gstdvdspu.c:
+ dvdspu: Push update frame, if any, when entering stills.
+ When entering a still frame generates an updated buffer, make sure
+ to push it out, otherwise we may not put a frame onscreen with a
+ rendered button, causing raciness as to whether buttons get drawn
+ or not when jumping back to the menu on some discs.
+
+2009-05-13 10:29:36 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdbin.c:
+ * ext/resindvd/resindvdbin.h:
+ resindvd: Fix raciness in rsndvdbin when initially creating pads
+ Protect pad exposure with a preroll lock to avoid situations
+ where no-more-pads is fired more than once, or fired just before
+ the last pad is actually added.
+
+2009-05-13 17:55:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/y4m/gsty4mencode.c:
+ y4menc: change my email
+ change my email to something more current
+ See #580783
+
+2009-05-13 17:54:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/y4m/gsty4mencode.c:
+ y4menc: don't strip timestamps
+ Fixes #582483
+
+2009-05-13 10:47:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * 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-deinterlace2.xml:
+ * docs/plugins/inspect/plugin-gstinterlace.xml:
+ * gst/deinterlace/.gitignore:
+ * gst/deinterlace/Makefile.am:
+ * gst/deinterlace/deinterlace.vcproj:
+ * gst/deinterlace/gstdeinterlace.c:
+ * gst/deinterlace/gstdeinterlace.h:
+ * gst/deinterlace2/Makefile.am:
+ * gst/deinterlace2/gstdeinterlace2.c:
+ * gst/deinterlace2/gstdeinterlace2.h:
+ * gst/deinterlace2/tvtime/greedy.c:
+ * gst/deinterlace2/tvtime/greedyh.asm:
+ * gst/deinterlace2/tvtime/greedyh.c:
+ * gst/deinterlace2/tvtime/greedyhmacros.h:
+ * gst/deinterlace2/tvtime/linear.c:
+ * gst/deinterlace2/tvtime/linearblend.c:
+ * gst/deinterlace2/tvtime/mmx.h:
+ * gst/deinterlace2/tvtime/plugins.h:
+ * gst/deinterlace2/tvtime/scalerbob.c:
+ * gst/deinterlace2/tvtime/sse.h:
+ * gst/deinterlace2/tvtime/tomsmocomp.c:
+ * gst/deinterlace2/tvtime/tomsmocomp/SearchLoop0A.inc:
+ * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc:
+ * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA.inc:
+ * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA8.inc:
+ * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA.inc:
+ * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA2.inc:
+ * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA6.inc:
+ * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH.inc:
+ * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH2.inc:
+ * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopTop.inc:
+ * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVA.inc:
+ * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVAH.inc:
+ * gst/deinterlace2/tvtime/tomsmocomp/StrangeBob.inc:
+ * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc:
+ * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc:
+ * gst/deinterlace2/tvtime/tomsmocomp/WierdBob.inc:
+ * gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h:
+ * gst/deinterlace2/tvtime/vfir.c:
+ * gst/deinterlace2/tvtime/weave.c:
+ * gst/deinterlace2/tvtime/weavebff.c:
+ * gst/deinterlace2/tvtime/weavetff.c:
+ * gst/deinterlace2/tvtime/x86-64_macros.inc:
+ Moved 'deinterlace2' from -bad to -good
+ And remove old deinterlace plugin as deinterlace2 will
+ be called deinterlace in -good.
+
+2009-05-12 21:50:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * 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-flv.xml:
+ * docs/plugins/inspect/plugin-flvdemux.xml:
+ * gst/flv/Makefile.am:
+ * gst/flv/gstflvdemux.c:
+ * gst/flv/gstflvdemux.h:
+ * gst/flv/gstflvmux.c:
+ * gst/flv/gstflvmux.h:
+ * gst/flv/gstflvparse.c:
+ * gst/flv/gstflvparse.h:
+ Moved 'flv' from -bad to -good
+
+2009-05-12 00:50:01 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ * configure.ac:
+ * 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:
+ * win32/common/config.h:
+ 0.10.11.2 pre-release
+
+2009-05-11 17:50:41 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/gstmpegdemux.c:
+ * ext/resindvd/gstmpegdemux.h:
+ resindvd: Modify the segment update logic
+ Send segment updates to the audio and subpicture pads more frequently,
+ but less often to the video pad, where timestamps appear less often.
+ This helps with gap filling on some DVDs.
+
+2009-05-11 16:09:56 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/rsnaudiomunge.c:
+ resindvd: Increase the amount of filler audio generated
+ When creating a filler audio buffer in rsnaudiomunge, generate
+ a bit more, as audio sinks don't seem to preroll otherwise. This
+ needs a better algorithm in general, to intelligently fill the
+ gap, rather than hard-coding a value.
+
+2009-05-11 14:17:42 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ * ext/resindvd/resindvdsrc.h:
+ resindvd: Manage timed still sequences better
+ Make timed still frames work better by extending the current segment
+ when needed, and restarting the still sequence with the correct
+ remaining duration when the wait it interrupted by activation of a
+ highlight NAV packet.
+
+2009-05-11 11:06:03 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/rsnaudiomunge.c:
+ resindvd: Change the audiomunge debug output.
+ Make sure we always show information about the segment events passing through,
+ even when pre-roll audio buffers aren't going to be needed.
+
+2009-05-11 11:04:25 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/dvdspu/gstdvdspu.c:
+ dvdspu: Make the debugging output a bit clearer.
+ Display more info about custom DVD events in the debug messages.
+
+2009-05-08 17:42:12 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/dvdspu/gstdvdspu.c:
+ dvdspu: Always push a frame at the start of a still frame, and fix a leak.
+ Make sure to push the frame for a still frame, with discont = true and
+ timestamp=none, so that it gets displayed by the sink. Also, don't leak
+ each rendered video frame during still menus.
+
+2009-05-08 17:40:48 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/dvdspu/gstdvdspu-render.c:
+ dvdspu: Add a guard when we don't have any subpicture buffer to render
+
+2009-05-08 16:29:20 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/rsnaudiomunge.c:
+ resindvd: Rename the audio munger debug category
+ Rename a debug category: rsn_audiomunge -> rsnaudiomunge.
+
+2009-05-08 16:27:31 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ resindvd: Ensure we send a title tag in the first play section.
+
+2009-05-08 16:06:01 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ resindvd: Simplify some stuff. Remove an unnecessary LOG message.
+ Skip attempting to schedule a nav block unless we're in PLAYING. Take a lock
+ slightly later, when we actually need it. Remove a noisy LOG message.
+
+2009-05-08 14:23:48 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ resindvd: Remove per-menu description from the TITLE tag
+ The part number reported while in a menu doesn't reflect the selected
+ menu, so it's pointless to use it to report which menu we're in (Audio,
+ Angle etc). Just report "DVD Menu" in the title tag instead.
+
+2009-05-08 14:20:32 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ * ext/resindvd/resindvdsrc.h:
+ resindvd: Send title info message when current angle is switched.
+ Make sure we send an update title tag when the current angle or available
+ angles changes.
+
+2009-05-08 10:43:27 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ * ext/resindvd/resindvdsrc.h:
+ resindvd: Implement navigation command change message and query
+ Send messages when the available DVD navigation commands changes, and
+ handle navigation commands and angles queries.
+
+2009-05-11 16:59:20 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/mpegdemux/gstmpegtsdemux.c:
+ * gst/mpegdemux/gstmpegtsdemux.h:
+ mpegtsdemux: Protect bitrate estimation against bogus values.
+ If the estimated bitrate is lower than 188 bytes, there's most likely
+ something completely wrong with the two samples. If that happens,
+ force recalculation.
+ Use guint64 for observation PCR, I saw cases where it would overflow.
+
+2009-05-11 16:58:58 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/mpegdemux/gstmpegtsdemux.c:
+ mpegtsdemux: Only take PCR from the active stream for bitrate estimation.
+
+2009-05-11 16:40:46 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/mpegdemux/gstmpegtsdemux.c:
+ mpegtsdemux: Change debugging levels for very frequent messages.
+ This allows debugging with mpegtsdemux:4 while being able to track what's
+ going on (and avoid taking up as much cpu for debugging as for the actual
+ demuxing process).
+
+2009-05-09 09:57:47 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/mpegdemux/gstmpegtsdemux.h:
+ mpegtsdemux: Revert indentation and comment header file.
+ One shouldn't run gst-indent on .h files, in this case it was un-beautifying
+ the indentation :)
+
+2009-05-10 21:21:36 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/qtmux/gstqtmuxmap.c:
+ gppmux: Add MPEG-4 part 2 to supported formats. Fixes #581593.
+
+2009-05-10 17:17:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ faad: Fix configure check for the FAAD version
+ The previous version matched things like 297 for
+ version 2.7, etc which could be added to the file
+ by other headers.
+ Fixes bug #582074.
+
+2009-05-10 11:17:17 +0200 Marc-Andre Lureau <marcandre.lureau@gmail.com>
+
+ * autogen.sh:
+ Run libtoolize before aclocal
+ This unbreaks the build in some cases. Fixes bug #582021
+
+2009-05-10 10:40:36 +0200 Tristan Matthews <le.businessman@gmail.com>
+
+ * gst/mxf/mxfmux.c:
+ mxfmux: Fix uninitialized variable compiler warning
+ This will always be set to something but gcc didn't detect
+ this. Fixes bug #582013.
+
+2009-05-09 23:47:39 +0100 Christian Schaller <christian.schaller@collabora.co.uk>
+
+ * ext/x264/GstX264Enc.prs:
+ Remove wrong stuff from preset file
+
+2009-05-09 15:48:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfmux.c:
+ * gst/mxf/mxfmux.h:
+ mxfmux: Write metadata items in reference order
+ This ensures that the metadata items are always written
+ in the same order and that first comes the preface,
+ then the identification linked from the preface, ...
+ Some demuxers can't handle files where the metadata
+ items are in random order.
+
+2009-05-09 15:48:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfmux.c:
+ mxfmux: Fix EOS logic again
+
+2009-05-09 15:48:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfmux.c:
+ mxfmux: Don't unref NULL buffers if pushing a buffer after the first failed
+
+2009-05-09 12:42:25 +0100 Christian Schaller <christian.schaller@collabora.co.uk>
+
+ * ext/x264/GstX264Enc.prs:
+ Add a more representative example preset file for x264
+
+2009-05-08 18:24:28 +0100 Zaheer Merali <zaheerabbas@merali.org>
+
+ * gst/mpegdemux/gstmpegtsdemux.c:
+ * gst/mpegdemux/gstmpegtsdemux.h:
+ mpegtsdemux: Add initial naive seeking support and fix duration query.
+ Sync from gst-fluendo-mpegdemux and have seeking/duration query
+ improvements in. No support however for wrapped around pcrs etc. but a
+ start nonetheless.
+ Also fix indentation issues.
+
+2009-05-08 16:38:26 +0100 Christian Schaller <christian.schaller@collabora.co.uk>
+
+ * gst-plugins-bad.spec.in:
+ Comment out preset not in yet
+
+2009-05-08 15:39:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/deinterlace2/gstdeinterlace2.c:
+ * gst/deinterlace2/gstdeinterlace2.h:
+ deinterlace2: Add a disabled mode for passthrough operation
+ Also allow to change the mode in PAUSED and PLAYING by updating
+ the caps if necessary.
+
+2009-05-07 17:53:42 +0100 Christian Schaller <christian.schaller@collabora.co.uk>
+
+ * ext/faac/gstfaac.c:
+ * ext/mpeg2enc/gstmpeg2enc.cc:
+ * ext/x264/gstx264enc.c:
+ * gst/flv/gstflvdemux.c:
+ * gst/mxf/mxf.c:
+ * gst/qtmux/gstqtmux.c:
+ Add ranks to various muxers and encoders in -bad
+
+2009-05-07 17:34:36 +0100 Christian Schaller <christian.schaller@collabora.co.uk>
+
+ * gst-plugins-bad.spec.in:
+ Update spec file
+
+2009-05-07 13:12:34 +0200 Rov Juvano <rovjuvano@users.sourceforge.net>
+
+ * tests/examples/scaletempo/demo-player.c:
+ scaletempo: Don't require gconfaudiosink in the demo
+ Fixes bug #537700.
+
+2009-05-06 21:48:30 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ resindvd: Don't open all VTS ifo at the start
+ Load each VTS ifo the first time the disc enters that VTS,
+ rather than scanning them all at the start.
+
+2009-05-06 21:19:13 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ * ext/resindvd/resindvdsrc.h:
+ resindvd: Send a title tag when we change chapter/menu/angle
+ Allow apps like Totem to display a nicer title that reflects the current
+ position on the disc.
+
+2009-05-05 13:18:20 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ resindvd: Don't send highlight-reset messages when not needed
+ Fix a small bug that results in the SPU highlight being reset more often
+ than is necessary - ie, clearing it when it's already cleared.
+
+2009-05-05 13:14:47 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ * ext/resindvd/resindvdsrc.h:
+ resindvd: send angles-changed messages when appropriate
+ When the current angle changes, or the number of available angles changes,
+ send an angles-changed message to let the app know.
+
+2009-05-05 11:34:26 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ resindvd: Make the next/prev angle switching cycle at the ends
+ When the current angle is 1 and prev_angle is requested, loop to the
+ maximum angle and vice versa for next_angle
+
+2009-05-05 16:54:39 +0200 Arnout Vandecappelle <arnout@mind.be>
+
+ * gst/mpeg4videoparse/mpeg4videoparse.c:
+ mpeg4videoparse: don't leak the config data
+ Clear the config data when going to READY or when disposed.
+ Fixes #581427
+
+2009-05-05 16:48:37 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/rtpmanager/gstrtpssrcdemux.c:
+ rtpssrcdemux: drop unexpected RTCP packets
+ We usually only get SR packets in our chain function but if an invalid packet
+ contains the SR packet after the RR packet, we must not fail but simply ignore
+ the malformed packet.
+ Fixes #581375
+
+2009-05-04 22:09:05 +0100 Zaheer Abbas Merali <zaheer@localhost.localdomain>
+
+ * gst/mpegdemux/mpegtsparse.c:
+ * gst/mpegdemux/mpegtsparse.h:
+ mpegtsparse: Remember pids that are meant to be stream pids.
+ Fixes #569781
+
+2009-05-04 12:37:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/celt/gstceltenc.c:
+ celt: Implement preset interface
+
+2009-05-04 12:36:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/dirac/gstdiracenc.cc:
+ dirac: Implement preset interface
+
+2009-05-04 12:34:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/jp2k/gstjasperenc.c:
+ jp2kenc: Implement preset interface
+
+2009-05-04 12:33:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/mpeg2enc/gstmpeg2enc.cc:
+ mpeg2enc: Implement Preset interface
+
+2009-05-04 12:31:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/xvid/gstxvidenc.c:
+ xvid: Implement Preset interface
+
+2009-05-04 12:30:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/faac/gstfaac.c:
+ faac: Implement preset interface
+
+2009-05-03 17:42:44 +0100 Vincent Genieux <mutex@runbox.com>
+
+ * gst/mpegdemux/mpegtspacketizer.c:
+ * gst/mpegdemux/mpegtspacketizer.h:
+ * gst/mpegdemux/mpegtsparse.c:
+ mpegtsparse: Ignore subtable extension when parsing PAT
+ Fixes #569673.
+
+2009-05-03 17:21:22 +0100 Vincent Genieux <mutex@runbox.com>
+
+ * gst/mpegdemux/mpegtsparse.c:
+ * gst/mpegdemux/mpegtsparse.h:
+ mpegtsparse: make safe changing the program-numbers property dynamically
+ Fixes #569437.
+
+2009-05-03 14:28:51 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/libmms/gstmms.c:
+ mms: extend BaseSrc query handling rather than overriding
+
+2009-04-27 22:39:15 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/aacparse/gstbaseparse.c:
+ * gst/amrparse/gstbaseparse.c:
+ * gst/flacparse/gstbaseparse.c:
+ baseparse: fix (regression in) newsegment handling
+ (aacparse, amrparse, flacparse). Fixes #580133.
+
+2009-05-02 12:23:03 +0100 Zaheer Merali <zaheerabbas@merali.org>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: fix pes filter pid resetting
+
+2009-05-01 02:26:22 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/dts/gstdtsdec.h:
+ dtsdec: cosmetic fix to header structure to make gtk-doc happy
+
+2009-05-01 14:25:40 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-bad-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-bad-plugins-sections.txt:
+ * gst/debugutils/fpsdisplaysink.c:
+ docs: make fpsdisplaysink show up in the docs
+
+2009-05-01 02:21:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/debugutils/fpsdisplaysink.c:
+ * gst/debugutils/fpsdisplaysink.h:
+ fpsdisplaysink: move private struct into plugin struct and use Gst namespace
+
+2009-05-01 01:59:56 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/plugins/inspect/plugin-debugutilsbad.xml:
+ * docs/plugins/inspect/plugin-fpsdisplaysink.xml:
+ * gst/debugutils/Makefile.am:
+ * gst/debugutils/debugutilsbad.c:
+ * gst/debugutils/fpsdisplaysink.c:
+ fpsdisplaysink: rename plugin (not element) to debugutilsbad
+ Makes it easier to add further utils here without creating yet another plugin.
+
+2009-05-01 14:28:23 +0100 Zaheer Merali <zaheerabbas@merali.org>
+
+ * sys/dvb/gstdvbsrc.c:
+ dvbsrc: unset pid filters correctly
+
+2009-04-30 14:43:36 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br>
+
+ * gst/qtmux/gstqtmuxmap.c:
+ qtmux: changes caps of src pads to video/quicktime, variant=something
+ Take a look at bug #580005 for further info.
+
+2009-04-30 17:29:35 +0100 Christian Schaller <christian.schaller@collabora.co.uk>
+
+ Merge branch 'master' of ssh://uraeus@git.freedesktop.org/git/gstreamer/gst-plugins-bad
+
+2009-04-30 17:28:47 +0100 Christian Schaller <christian.schaller@collabora.co.uk>
+
+ * gst-plugins-bad.spec.in:
+ Update for new presets file
+
+2009-04-30 17:08:52 +0100 Tristan Matthews <le.businessman@gmail.com>
+
+ * gst/debugutils/fpsdisplaysink.c:
+ fpsdisplaysink: init variable to NULL to avoid compiler warning
+ Fixes #580901.
+
+2009-04-30 14:20:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/dvdspu/gstdvdspu-render.c:
+ * gst/dvdspu/gstdvdspu.h:
+ dvdspu: do some basic clipping
+ Add some basic clipping of the subtitle region when the subtitle is bigger than
+ the image we should put it on.
+
+2009-04-30 14:18:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/dvdspu/gstdvdspu.c:
+ dvdspu: don't EOS when the subtitle got EOS
+ Don't forward the EOS on the subtitle pad as the video might still be running.
+
+2009-04-30 13:45:30 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/debugutils/fpsdisplaysink.c:
+ fpsdisplay: code cleanup and plug overlay as needed
+ Pluggin the text-ovelay causes some slowdowns and might need a colorspace
+ converter. We now only check the text-overlay property whne goint to ready and
+ plug or unplug the text-overlay at that time. If the property changes during
+ playing, its not switched immediately.
+
+2009-04-30 00:06:36 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/x264/GstX264Enc.prs:
+ * ext/x264/Makefile.am:
+ * ext/x264/gstx264enc.c:
+ x264enc: add preset support
+ Add preset iface and a (dummy) preset file as a starting point.
+
+2009-04-26 21:26:00 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/gstmpegdemux.c:
+ * ext/resindvd/resindvdsrc.c:
+ * ext/resindvd/rsnaudiodec.c:
+ * ext/resindvd/rsnaudiomunge.c:
+ resindvd: Convert some g_print to GST_LOG_OBJECT and friends, remove some others
+ Trim down the g_print verbosity.
+
+2009-04-26 21:29:27 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ resindvd: Add DVDFASTSTART env var to making some testing easier
+
+2009-04-24 14:08:55 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/gstmpegdemux.c:
+ resindvd: Remove redundant modulo operation in the demuxer
+
+2009-04-24 14:07:30 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/gstmpegdemux.c:
+ * ext/resindvd/resindvdsrc.c:
+ resindvd: Map audio and subpicture logical streams to physical.
+ The logical audio and subpicture stream number doesn't always correspond
+ with the physical substream it is coming from. When configuring the demuxer
+ pads, use the mapping table provided in each PGC to get the layout and
+ ensure the demuxer creates the correct pads.
+
+2009-04-29 18:52:20 +0100 Tristan Matthews <le.businessman@gmail.com>
+
+ * gst/flv/gstflvmux.c:
+ flvmux: init variable to NULL to fix compiler warning
+ Fixes #580786.
+
+2009-04-29 16:57:36 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/x264/gstx264enc.c:
+ x264enc: add some documentation on profile
+
+2009-04-29 13:56:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/flv/gstflvmux.c:
+ * gst/flv/gstflvparse.c:
+ flv: Set/require the framed/parsed fields of the audio/mpeg caps to TRUE
+
+2009-04-29 13:16:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/flv/gstflvmux.c:
+ flv: Always write at least the minimal tags and write the PAR as tags
+
+2009-04-29 13:03:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/flv/gstflvmux.c:
+ * gst/flv/gstflvmux.h:
+ flv: Add support for muxing some tags
+
+2009-04-29 13:03:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/flv/gstflvparse.c:
+ flv: Add support for title tag
+
+2009-04-29 09:40:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/flv/gstflvparse.c:
+ flv: Fix parsing of tags and add new mappings
+ We shouldn't register a new GstTag for every unknown tag
+ we find as this might lead to conflicts and also those
+ tags are essentially unknown.
+ Add mappings for some known tags and also convert string
+ dates to GDate, as found in many FLV files.
+
+2009-04-28 16:10:21 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst/rtpmux/gstrtpmux.c:
+ rtpmux: Reject wrong caps
+
+2009-04-28 16:03:19 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst/rtpmux/gstrtpmux.c:
+ rtpmux: Fix leak
+ Fixed a leak discovered by Laurent Glayal <spegle@yahoo.fr>
+
+2009-04-28 15:58:41 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst/rtpmux/gstrtpmux.c:
+ rtpmux: Fix leak
+ Fixed a leak discovered by Laurent Glayal <spegle@yahoo.fr>
+
+2009-04-27 11:09:08 +0200 Olivier Crete <olivier.crete@collabora.co.uk>
+
+ * gst/rtpmanager/rtpsource.c:
+ rtpsouce: make WARNING into LOG
+ Since neither rtpmanager nor any of the payloaders properly implement
+ pad allocation, there is no way for the rtpmanager to inform downstream elements
+ of the new SSRC if there is an SSRC collision. So the warning is emitted all the
+ time and it is confusing.
+ Fixes #580144
+
+2009-04-27 11:06:01 +0200 Olivier Crete <olivier.crete@collabora.co.uk>
+
+ * gst/rtpmanager/rtpsession.c:
+ rtpsession: notify when SSRC changes
+ Emit a g_object_notify when the SSRc changes because of a collision.
+ Fixes #580144
+
+2009-04-27 10:04:51 +0100 Christian Schaller <christian.schaller@collabora.co.uk>
+
+ * gst-plugins-bad.spec.in:
+ * gst/dccp/Makefile.am:
+ Add new plugin to spec file and add missing header to gst/dccp/Makefile.am
+
+2009-04-25 00:44:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/.gitignore:
+ * tests/check/pipelines/.gitignore:
+ tests: make git ignore new unit tests binaries
+
+2009-04-25 00:42:44 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/MANIFEST:
+ win32: dist libgstdshow.def by adding it to win32/MANIFEST
+ Fixes #578563.
+
+2009-04-24 18:53:36 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br>
+
+ * gst/qtmux/gstqtmuxmap.c:
+ mp4mux: Changes src caps to application/x-iso-mp4
+ Fixes #580005
+
+2009-04-24 16:01:44 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * win32/common/config.h:
+ win32: Commit the win32 config with bumped version number.
+ Should have committed this when I unfroze the build last time, sorry.
+
+2009-04-24 14:51:00 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/Makefile.am:
+ check: exclude rsndvdbin from the states test
+
+2009-04-24 15:42:27 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * configure.ac:
+ soundtouch: fix configure to use proper shell syntax. fixes #580091
+
+2009-04-23 17:33:25 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ soundtouch: Fix compilation on newer libSoundTouch
+ Newer libsoundtouch requires that we include an extra header that wasn't
+ previously required, so define HAVE_SOUNDTOUCH_1_4 for newer builds so that it
+ gets included.
+
+2009-04-20 11:38:01 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/debugutils/fpsdisplaysink.c:
+ fpsdisplay: more cleanups
+ Use normal gst-defines in PLUGIN_DEFINE. Shorten _start/stop method names.
+ More ideas. Move debug category-init down to plugin-init.
+
+2009-04-20 09:51:50 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/debugutils/fpsdisplaysink.c:
+ fpsdisplay: use a nicer font family
+
+2009-04-20 10:24:37 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/debugutils/fpsdisplaysink.c:
+ fpsdisplay: various cleanups, docs and comments
+ Remove unused base_init. Add basic doc blob. Reuse query object. Rename
+ variables for clarity. Add comments and ToDos.
+
+2009-04-20 09:49:32 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/debugutils/fpsdisplaysink.c:
+ fpsdisplay: remove iface proxy
+ When we get bus messages for setting the xid, we have the real sink element
+ instance as message_src. No need to proxy the xoverlay iface therefore
+ (autovideosink does not do it either). Also we don't need to rewrite the
+ message src of all messages from that sink.
+
+2009-04-23 11:04:46 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/selector/gstinputselector.c:
+ input-selector: Forward segment events for the active pad immediately.
+ When a segment event is received on the active pad, forward it downstream
+ immediately instead of deferring it until the next data buffer arrives. This
+ fixes problems with segment updates never being sent downstream, like those
+ needed for sparse streams, or for closing previously opened segments.
+ This fixes playback of DVD menus with a still video frame and an audio track,
+ for example.
+ Fixes: #577843
+
+2009-04-22 18:01:07 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst/rtpmux/gstrtpmux.c:
+ rtpmux: Fix warning
+
+2009-04-20 20:00:15 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst/rtpmux/gstrtpmux.c:
+ rtpmux: Set different caps depending on the input
+
+2009-04-22 16:25:07 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst/rtpmux/gstrtpmux.c:
+ rtpmux: Only free pad private when pad is disposed
+
+2009-04-22 19:52:05 +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:
+ * gst/flv/gstflvdemux.c:
+ * gst/flv/gstflvdemux.h:
+ * gst/flv/gstflvmux.c:
+ * gst/flv/gstflvmux.h:
+ flv: Add documentation to flvmux and flvdemux
+ Partially fixes bug #573737.
+
+2009-04-22 19:45:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfmux.h:
+ mxf: Mark most fields of the instance struct as private
+
+2009-04-22 19:43:22 +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:
+ * gst/deinterlace2/gstdeinterlace2.c:
+ * gst/deinterlace2/gstdeinterlace2.h:
+ deinterlace2: Add documentation and integrate into the build system
+
+2009-04-22 19:24:43 +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-deinterlace2.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-flv.xml:
+ * docs/plugins/inspect/plugin-fpsdisplaysink.xml:
+ * docs/plugins/inspect/plugin-freeze.xml:
+ * docs/plugins/inspect/plugin-gsm.xml:
+ * docs/plugins/inspect/plugin-gstinterlace.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-sndfile.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:
+ * docs/plugins/inspect/plugin-y4menc.xml:
+ * gst/mxf/mxfmux.c:
+ mxf: Add documentation to mxfmux and update the docs
+
+2009-03-19 15:37:17 -0700 LRN <lrn1986@gmail.com>
+
+ * ext/modplug/gstmodplug.cc:
+ modplug: Use correct header file
+ modplug's sndfile.h conflicts with libsndfile's sndfile.h, so
+ we'll access it directly using modplug/sndfile.h. Fixes #573849
+ Signed-off-by: David Schleef <ds@schleef.org>
+
+2009-03-19 15:29:04 -0700 LRN <lrn1986@gmail.com>
+
+ * m4/gst-sdl.m4:
+ sdl: Use SDL static-libs for conftest
+ Fixes: #573847. This fixes building with SDL on Windows.
+ Signed-off-by: David Schleef <ds@schleef.org>
+
+2009-03-19 14:55:26 -0700 LRN <lrn1986@gmail.com>
+
+ * ext/mpeg2enc/gstmpeg2encoptions.cc:
+ mpeg2enc: Get number of processors on win32
+ Fixes #573848.
+ Signed-off-by: David Schleef <ds@schleef.org>
+
+2009-03-19 14:49:13 -0700 David Schleef <ds@schleef.org>
+
+ * configure.ac:
+ soundtouch: Add pkgconfig check for soundtouch-1.4
+ Fixes #573846.
+
+2009-02-26 14:18:54 -0800 David Schleef <ds@schleef.org>
+
+ * gst/rawparse/gstrawparse.c:
+ * gst/rawparse/gstrawparse.h:
+ * gst/rawparse/gstvideoparse.c:
+ * gst/rawparse/gstvideoparse.h:
+ Add interlaced support to videoparse
+ Add a virtual method in rawparse to set buffer flags. This doesn't
+ use API from unreleased -base, since it defines GST_VIDEO_BUFFER_TFF
+ if it's not defined yet.
+
+2009-04-21 22:13:12 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Automatic update of common submodule
+ From b3941ea to 6ab11d1
+
+2009-04-21 13:27:29 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ Merge branch 'rtpmux-fixes'
+
+2009-04-21 16:48:39 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * ext/libmms/gstmms.c:
+ mmssrc: If the connection fails, emit a redirection msg to the rtsp equivalent.
+ This should help fix the issue with Windows Media Server using rtsp... but
+ still declaring the stream with mms://
+
+2009-04-21 16:08:55 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/mpegdemux/gstmpegdemux.c:
+ mpegdemux: Only error out at EOS push failure if we don't have any streams.
+ This should remove the bogus error messages while still keeping the original
+ intent of this, which is to inform the pipeline/application/user that we
+ could not find any valid streams.
+ There are many reasons why pushing an event can fail, and not all of them are
+ because there's no link downstream (it could be because it was blocked, or
+ flushing).
+
+2009-04-10 19:24:26 +0200 Zaheer Abbas Merali <zaheer@localhost.localdomain>
+
+ * gst/mpegdemux/gstmpegtsdemux.c:
+ mpegtsdemux: add hack specific for itvhd
+ itvhd masks its h264 video stream as a private stream making it harder for
+ other set top boxes to decode. this checks for specific program number, video
+ pid and stream type combination before declaring it as h264.
+
+2009-04-10 19:06:55 +0200 Zaheer Abbas Merali <zaheer@localhost.localdomain>
+
+ * gst/mpegdemux/mpegtspacketizer.c:
+ mpegtsparse: detect AC3 streams in PMT table
+ add 'has-ac3' boolean to pmt bus message
+
+2009-04-10 01:16:30 +0200 Zaheer Abbas Merali <zaheer@localhost.localdomain>
+
+ * gst/mpegdemux/gstmpegtsdemux.c:
+ itv hd hack
+
+2009-04-10 01:11:01 +0200 Zaheer Abbas Merali <zaheer@localhost.localdomain>
+
+ * gst/mpegdemux/gstmpegtsdemux.c:
+ hack for itvhd sid to detect mpeg1 as h264
+
+2009-04-20 18:41:39 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst/rtpmux/gstrtpmux.c:
+ rtpmux: Remove useless caps mangling
+
+2009-04-20 18:36:42 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst/rtpmux/gstrtpmux.c:
+ rtpmux: Rename variable for more clarity
+
+2009-04-20 17:43:39 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst/rtpmux/gstrtpdtmfmux.c:
+ * gst/rtpmux/gstrtpmux.c:
+ rtpmux: Use GST_BOILERPLATE
+
+2009-04-20 17:42:40 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst/rtpmux/gstrtpdtmfmux.c:
+ * gst/rtpmux/gstrtpdtmfmux.h:
+ * gst/rtpmux/gstrtpmux.c:
+ rtpmux: Do the includes locally
+
+2009-04-20 16:34:30 +0200 Andy Wingo <wingo@wingomac.bcn.oblong.net>
+
+ * sys/osxvideo/osxvideosrc.c:
+ patch over logic errors in osxvideosrc
+ apple's compiler carps, with reason, about some constructs in osxvideosrc.c
+ fix them.
+ also it seems that for some reason this required a gst-indent run. whee
+
+2009-04-20 13:09:46 +0200 Andy Wingo <wingo@oblong.net>
+
+ add osxvideosrc
+ * configure.ac:
+ * sys/Makefile.am:
+ * sys/osxvideo/Makefile.am: Autoconfiscation.
+ * sys/osxvideo/osxvideoplugin.m:
+ * sys/osxvideo/osxvideosrc.h:
+ * sys/osxvideo/osxvideosrc.c: Add osxvideosrc. Should fix #153684.
+ Patch-by: Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+ Patch-by: Ali Sabil <ali.sabil@tandberg.com>
+ Patch-by: Barracuda Networks <justin@affinix.com>
+
+2009-04-19 17:18:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/deinterlace2/gstdeinterlace2.c:
+ deinterlace2: Make it possible to select interlacing autodetection or to enfore deinterlacing
+ For this add a "mode" property that defaults to "interlaced" for now as
+ most decoders/demuxers don't properly set the "interlaced" field on the
+ caps yet.
+ If this property is set to "auto" the element will work in passthrough
+ mode unless the caps contain the "interlaced" field.
+
+2009-04-18 23:42:57 +0100 Zaheer Merali <zaheerabbas@merali.org>
+
+ * gst/mpegdemux/mpegtspacketizer.c:
+ mpegtsparse: fix leak of GST_TYPE_LIST gvalue
+
+2009-04-18 13:09:23 +0100 Zaheer Merali <zaheerabbas@merali.org>
+
+ * gst/mpegdemux/mpegtsparse.c:
+ mpegtsparse: fix leak in src_pad_query
+
+2009-04-17 16:16:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/rtpmanager/gstrtpsession.c:
+ rtpsession: join the RTCP thread
+ Avoid a case where a joinable thread would be left unjoined, which leaked the
+ thread structure.
+ Fixes #577318.
+
+2009-04-17 15:39:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/deinterlace2/gstdeinterlace2.c:
+ deinterlace2: Use GST_(DEBUG|WARNING|ERROR)_OBJECT instead of the non-OBJECT ones
+
+2009-04-17 15:39:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/deinterlace2/gstdeinterlace2.c:
+ deinterlace2: Reset history if DISCONT is set on the incoming buffer
+
+2009-04-17 15:39:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/deinterlace2/gstdeinterlace2.c:
+ deinterlace2: Fix timestamps for buffers with RFF flag set
+
+2009-04-16 22:14:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfmetadata.c:
+ mxf: Properly handle the new interlaced support from libgstvideo for (de)muxing
+
+2009-04-16 17:41:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/deinterlace2/gstdeinterlace2.c:
+ * gst/deinterlace2/gstdeinterlace2.h:
+ * gst/deinterlace2/tvtime/greedy.c:
+ * gst/deinterlace2/tvtime/greedyh.c:
+ * gst/deinterlace2/tvtime/scalerbob.c:
+ * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc:
+ * gst/deinterlace2/tvtime/weave.c:
+ * gst/deinterlace2/tvtime/weavebff.c:
+ * gst/deinterlace2/tvtime/weavetff.c:
+ deinterlace2: Rename line_length to row_stride and remove output_stride
+
+2009-04-16 15:52:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/deinterlace2/gstdeinterlace2.c:
+ deinterlace2: Implement support for RFF and ONEFIELD buffer flags
+
+2009-04-16 18:36:13 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * configure.ac:
+ * gst/debugutils/Makefile.am:
+ * gst/debugutils/fpsdisplaysink.c:
+ * gst/debugutils/fpsdisplaysink.h:
+ fpsdisplaysink: add a initial port of a sink with fps display
+ This now works with a event probe. Needs some extra work.
+
+2009-03-09 18:22:28 +0200 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com>
+
+ * gst/camerabin/gstcamerabin.c:
+ camerabin: clean up and fix assertion fail when setting zoom in NULL state
+
+2009-03-09 18:31:07 +0200 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com>
+
+ * gst/camerabin/gstcamerabin.c:
+ camerabin: fix format matching when detecting allowed frame rate
+
+2009-03-09 18:25:48 +0200 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com>
+
+ * gst/camerabin/gstcamerabin.c:
+ camerabin: don't lose pending state when changing resolution
+
+2009-02-27 17:12:38 +0200 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com>
+
+ * gst/camerabin/gstcamerabin-marshal.list:
+ * gst/camerabin/gstcamerabin.c:
+ * gst/camerabin/gstcamerabin.h:
+ * tests/check/elements/camerabin.c:
+ camerabin: change img-done signal parameter from GString* to const gchar*
+ Don't allow setting filename via img-done signal parameter but force app
+ use filename property. Don't stop capture when setting filename property.
+ Update check unit test based on the change.
+
+2009-04-15 13:23:01 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst/rtpmux/gstrtpdtmfmux.c:
+ * gst/rtpmux/gstrtpmux.c:
+ rtpmux: Add GST_DEBUG_FUNCPTRs
+
+2009-04-15 13:15:55 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst/rtpmux/gstrtpdtmfmux.c:
+ rtpdtmfmux: Release locked pad on release_pad
+ Release the special pad if the pad is removed from the muxer.
+
+2009-04-15 13:09:27 -0400 Laurent Glayal <spglegle@yahoo.fr>
+
+ * gst/rtpmux/gstrtpdtmfmux.c:
+ rtpdtmfmux: Release special on pad dispose
+ Fixes #577690
+
+2009-04-15 18:14:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/rtpmanager/gstrtpjitterbuffer.c:
+ jitterbuffer: prevent overflow in EOS estimation
+ Use a guint64 instead of a guint to hold a 64bit value to prevent completely
+ bogues EOS estimation values due to overflows.
+
+2009-04-15 17:44:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/rtpmanager/gstrtpbin.c:
+ * gst/rtpmanager/gstrtpbin.h:
+ rtpbin: we should not provide a clock
+ There is no need to provide a clock.
+
+2009-04-15 17:28:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/rtpmanager/gstrtpjitterbuffer.c:
+ jitterbuffer: more estimated EOS fixes
+ Do more accurate EOS estimate and guard against backward timestamps.
+
+2009-04-15 17:25:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/rtpmanager/gstrtpjitterbuffer.c:
+ jitterbuffer: release lock before pushing EOS
+ Make sure we release the jitterbuffer lock before we start pushing out data
+ because else we might deadlock.
+
+2009-04-15 15:46:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/deinterlace2/gstdeinterlace2.c:
+ * gst/deinterlace2/gstdeinterlace2.h:
+ * gst/deinterlace2/tvtime/greedy.c:
+ * gst/deinterlace2/tvtime/greedyh.c:
+ * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc:
+ deinterlace2: Move output buffer from the instance struct to a function parameter
+
+2009-04-15 15:33:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/deinterlace2/gstdeinterlace2.c:
+ * gst/deinterlace2/gstdeinterlace2.h:
+ deinterlace2: Add initial support for automatic detection of the field order
+
+2009-04-15 14:47:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/deinterlace2/gstdeinterlace2.c:
+ deinterlace2: Add support for YVYU colorspace
+ This is the same as YUY2 with just Cr and Cb swapped. As
+ we don't make a difference between them when deinterlacing
+ this works.
+
+2009-04-13 13:32:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfmux.c:
+ mxfmux: Small cleanup
+
+2009-04-10 18:00:06 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * sys/dshowdecwrapper/gstdshowaudiodec.cpp:
+ * sys/dshowdecwrapper/gstdshowvideodec.cpp:
+ dshowdec: fix compilation with the debugging system disabled
+ One GST_DEBUG_CATEGORY_INIT should be enough anyway.
+ Fixes #578562 (spotted by David Hoyt).
+
+2009-04-09 23:53:39 +0200 Janin Kolenc <janin.kolenc at marand.si>
+
+ * ext/x264/gstx264enc.c:
+ * ext/x264/gstx264enc.h:
+ x264enc: add force keyframe event handling
+ Use the GstForceKeyUnit event to force a keyframe.
+ Fixes #578112.
+
+2009-04-08 11:52:46 -0700 Michael Smith <msmith@songbirdnest.com>
+
+ * configure.ac:
+ * sys/acmenc/Makefile.am:
+ * sys/acmmp3dec/Makefile.am:
+ acmenc, acmmp3dec, sdp: link to all requires libraries on win32.
+ Add winsock for windows (for sdp). Link to all the plugins-base
+ libs we indirectly use for acmmenc and acmmp3dec.
+
+2009-04-07 15:50:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/pipelines/mxf.c:
+ mxf: Add unit tests for checking if mxfmux ! mxfdemux pipelines are working without errors
+
+2009-04-07 15:49:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfdemux.c:
+ mxfdemux: Don't use invalid buffer offsets, instead assume offset == 0
+
+2009-04-07 15:45:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfmetadata.c:
+ mxf: Fix comparison
+
+2009-04-07 15:19:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfmetadata.c:
+ * gst/mxf/mxful.c:
+ * gst/mxf/mxful.h:
+ Use UL database for all metadata ULs
+
+2009-04-07 04:53:02 +0300 René Stadler <mail@renestadler.de>
+
+ * gst/aacparse/gstbaseparse.c:
+ * gst/amrparse/gstbaseparse.c:
+ * gst/flacparse/gstbaseparse.c:
+ baseparse: Fix slightly broken buffer-in-segment check (aacparse, amrparse, flacparse)
+
+2009-04-05 03:50:19 +0300 René Stadler <mail@renestadler.de>
+
+ * gst/aacparse/gstbaseparse.c:
+ * gst/amrparse/gstbaseparse.c:
+ baseparse: Fix push mode seeking (aacparse, amrparse)
+ Sending the flush-start event forward before taking the stream lock actually
+ works, in contrast to deadlocking in downstream preroll_wait (hunk 1).
+ After that we get the chain function being stuck in a busy loop. This is fixed
+ by updating the minimum frame size inside the synchronization loop because the
+ subclass asks for more data in this way (hunk 2).
+ Finally, this leads to a very probable crash because the subclass can find a
+ valid frame with a size greater than the currently available data in the
+ adapter. This makes the subsequent gst_adapter_take_buffer call return NULL,
+ which is not expected (hunk 3).
+
+2009-04-04 21:19:11 +0300 Felipe Contreras <felipe.contreras@gmail.com>
+
+ * common:
+ Automatic update of common submodule
+ From d0ea89e to b3941ea
+
+2009-04-04 17:51:34 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/bz2/Makefile.am:
+ * ext/bz2/gstbz2dec.c:
+ * ext/bz2/gstbz2enc.c:
+ bz2: fix some refcount mistakes and do some cleaning up
+ No need to unref buffers if pad_push returns something non-FLOW_OK.
+ In fact, this will cause assertions or crashes. However, we do need
+ to unref the input buffer whenever we don't pass it downstream. Also,
+ a non-OK flow return is not an error, so don't post error messages on
+ the bus - the pipeline may just be shutting down. Miscellaneous other
+ clean-ups and crack removal. Plenty of work left for those who feel
+ like it.
+
+2009-04-04 14:54:25 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ Automatic update of common submodule
+ From f8b3d91 to d0ea89e
+
+2009-04-03 23:10:28 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure.ac: fix dvdnav version check
+ Fixes #577864. This time for real.
+
+2009-04-03 17:55:31 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * ext/resindvd/resindvdsrc.h:
+ resindvd: require libdvdnav >= 4.1.2 for dvdnav_get_current_time()
+ Fixes #577864.
+
+2009-04-03 10:29:53 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ misc: Bump plugins-base requirement to 0.10.22.1
+
+2009-04-01 17:41:40 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ resindvd: Send both the logical and physical substream ID in the stream change.
+ When sending the stream change message(s) to the demuxer, also include the
+ logical stream id along with the physical ID, so that the demuxer can remap
+ logical->physical MPEG stream ID.
+
+2009-04-01 02:23:20 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/Makefile.am:
+ * ext/resindvd/resindvdsrc.c:
+ * ext/resindvd/resindvdsrc.h:
+ resindvd: Use new GstNavigation functionality.
+ Handle the new DVD commands, so that we can handle commands from a player
+ to change angle, jump to menus etc. Use the new GstNavigation event parsing
+ functions, instead of hand-rolled stuff.
+ Send GstNavigation notification messages when the mouse enters a button
+ or leaves it, so UI can turn the mouse cursor to a hand icon.
+
+2009-03-30 01:07:49 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdbin.c:
+ * ext/resindvd/resindvdbin.h:
+ resindvd: Switch to using a hard-coded mpeg2dec, and change pad blocking a bit.
+ Change the pad blocking behaviour during startup, and use a hard-coded mpeg2dec (for the moment), in order to make things work with playbin2.
+
+2009-03-25 12:31:10 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ resindvd: Add newline to debug g_print statement
+
+2009-03-25 02:20:12 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ resindvd: Make highlights work when jumping into menus
+ Make the highlights re-appear correctly when jumping back into menus
+ by making sure to set the flushing_seek flag for user-action initiated
+ seeks.
+ Fiddle some debug related to tracking down the issue.
+
+2009-03-25 01:21:28 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ resindvd: Support multiangle titles.
+ Add a workaround for an apparent libdvdnav bug where it loses nav packets
+ during multiangle titles, and add some keypress bindings to switch the angle.
+
+2009-03-18 09:35:12 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdbin.c:
+ resindvd: Add back in support for using hardcoded a52dec
+
+2009-03-16 20:31:58 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/gstmpegdemux.c:
+ resindvd: Add some debug when creating the output pads in the demuxer
+
+2009-03-10 10:39:22 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/rsnaudiodec.c:
+ resindvd: More hacking on the audio decoder.
+
+2009-03-05 00:04:24 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ resindvd: Trim back the g_print debug - convert to GST_DEBUG and GST_LOG
+
+2009-03-04 16:16:57 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdbin.c:
+ * ext/resindvd/rsnaudiodec.c:
+ * ext/resindvd/rsnaudiodec.h:
+ resindvd: Extend the Resin audio decoder element, and switch rsndvdbin to use it
+
+2009-02-27 10:18:14 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/Makefile.am:
+ * ext/resindvd/rsnaudiodec.c:
+ * ext/resindvd/rsnaudiodec.h:
+ resindvd: First part of the re-plugging audio decoder
+
+2009-02-27 09:42:35 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdbin.c:
+ resindvd: remove unused code path from the bin
+
+2009-02-26 00:29:26 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdbin.h:
+ resindvd: Indent some things
+
+2009-02-26 00:27:54 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/rsnaudiomunge.c:
+ * ext/resindvd/rsnwrappedbuffer.c:
+ resindvd: Switch GST_BOILERPLATE to G_DEFINE_TYPE for no real reason.
+
+2009-03-24 01:02:28 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ * ext/resindvd/resindvdsrc.h:
+ resindvd: Add faststart, and work around some multi-angle issues
+ Add a 'fast-start' property to the rsndvdsrc element, that attempts to
+ jump directly to the DVD menu when starting. Doesn't work correctly on all
+ titles yet.
+ Add workarounds for issues with multiple angles in libdvdnav: Use a heuristic
+ to avoid detecting discontinuities during multiple-angle titles, it seems
+ caused by libdvdnav losing some NAV packets in multiangle titles. Fix
+ seeking in multi-angle titles by aligning our sector calculation logic
+ with libdvdnav's. Also, use libdvdnav's dvdnav_get_current_time() method
+ to determine the logical position of the current cell when it changes, as the
+ cell_start value in the cell_change event provides a number that doesn't
+ compensate for angle cell blocks.
+
+2009-03-21 19:04:05 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/resindvd/resindvdsrc.c:
+ resindvd: Small debug output change in the source element
+
+2009-04-01 02:25:42 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/dvdspu/gstdvdspu.c:
+ dvdspu: Add some debug
+ Add a little bit of extra debug. Wrap a hardcoded #if 0 into a define instead.
+
+2009-04-02 13:05:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/jp2k/gstjasperenc.c:
+ jp2enc: Unref peer caps after usage to fix a memory leak
+
+2009-04-02 12:46:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/elements/mxfmux.c:
+ mxfmux: Add unit tests
+
+2009-04-01 15:45:22 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/legacyresample/gstlegacyresample.c:
+ legacyresample: fix negotiation so that upstream can actually fixate to downstream's rate
+ If one side has a preference for a particular sample rate or set of sample rates, we
+ should honour this in the caps we advertise and transform to and from, so that elements
+ actually know about the other side's sample rate preference and can negotiate to it
+ if supported. Also add unit test for this.
+
+2009-03-31 16:07:46 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/aacparse/gstbaseparse.c:
+ * gst/amrparse/gstbaseparse.c:
+ baseparse: Delay newsegment as long as possible.
+ If newsegment is sent (too) early, caps may not yet be fixed/set,
+ and downstream may not have been linked.
+
+2009-03-30 21:57:12 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/mpeg2enc/gstmpeg2encoptions.cc:
+ mpeg2enc: fix bitrate property settings
+ Align bitrate property interpretation with usual mpeg2enc behaviour.
+ Fixes #575736.
+
+2009-03-27 21:39:05 +0000 Alan Falloon <afalloon@lumenera.com>
+
+ * configure.ac:
+ configure.ac: make --disable-external work again
+
+2009-03-27 19:37:47 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/jp2k/gstjasperdec.c:
+ * ext/jp2k/gstjasperdec.h:
+ jp2kdec: implement basic QoS
+ Don't try to decode frames that are going to be late anyway.
+
+2009-03-27 17:44:57 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/rtpmanager/gstrtpbin.c:
+ * gst/rtpmanager/gstrtpbin.h:
+ * gst/rtpmanager/gstrtpjitterbuffer.c:
+ * gst/rtpmanager/gstrtpjitterbuffer.h:
+ rtpbin: add on_npt_stop signal
+ Add the on_npt_stop signal to rtpbin and rtpjitterbuffer to notify the
+ application that the NPT stop position has been reached.
+
+2009-03-27 11:20:02 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/selector/gstoutputselector.c:
+ outputselector: reset state when going to READY
+ Reset the last-buffer, the pending pad and the segment when going to the READY
+ state.
+ Fixes #576712.
+
+2009-03-25 21:24:44 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/qtmux/gstqtmux.c:
+ qtmux: fix reusing element
+ State change to READY and then back to PAUSED should still provide
+ the proper structures as are otherwise freshly available following
+ a request_new_pad.
+ Pointed out by Thiago Santos.
+
+2009-03-26 20:28:30 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfmux.c:
+ * gst/mxf/mxftypes.c:
+ mxf: Fix compilation and compiler errors with GLib < 2.16.0
+
+2009-03-26 14:26:34 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxftypes.c:
+ mxf: Fix "cast to pointer type of different size" compiler warning
+
+2009-03-26 13:24:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxftypes.c:
+ mxf: Rename forgotten function to fix unresolved symbols error
+
+2009-03-26 13:20:18 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfaes-bwf.c:
+ * gst/mxf/mxfdemux.c:
+ * gst/mxf/mxfdv-dif.c:
+ * gst/mxf/mxfvc3.c:
+ mxf: Use mxf_u{l,uid}_is_equal() and friends instead of memcmp()
+
+2009-03-26 13:11:07 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfaes-bwf.c:
+ * gst/mxf/mxfdemux.c:
+ * gst/mxf/mxfdms1.c:
+ * gst/mxf/mxfdms1.h:
+ * gst/mxf/mxfmetadata.c:
+ * gst/mxf/mxfmetadata.h:
+ * gst/mxf/mxfmpeg.c:
+ * gst/mxf/mxfmux.c:
+ * gst/mxf/mxftypes.c:
+ * gst/mxf/mxftypes.h:
+ mxf: Differentiate between UL and UUID
+
+2009-03-26 12:46:22 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/Makefile.am:
+ * gst/mxf/mxf.c:
+ * gst/mxf/mxfaes-bwf.c:
+ * gst/mxf/mxfaes-bwf.h:
+ * gst/mxf/mxfalaw.c:
+ * gst/mxf/mxfalaw.h:
+ * gst/mxf/mxfd10.c:
+ * gst/mxf/mxfd10.h:
+ * gst/mxf/mxfdemux.c:
+ * gst/mxf/mxfdemux.h:
+ * gst/mxf/mxfdms1.c:
+ * gst/mxf/mxfdv-dif.c:
+ * gst/mxf/mxfdv-dif.h:
+ * gst/mxf/mxfessence.c:
+ * gst/mxf/mxfessence.h:
+ * gst/mxf/mxfjpeg2000.c:
+ * gst/mxf/mxfjpeg2000.h:
+ * gst/mxf/mxfmetadata.c:
+ * gst/mxf/mxfmpeg.c:
+ * gst/mxf/mxfmpeg.h:
+ * gst/mxf/mxfmux.h:
+ * gst/mxf/mxfparse.c:
+ * gst/mxf/mxfparse.h:
+ * gst/mxf/mxftypes.c:
+ * gst/mxf/mxftypes.h:
+ * gst/mxf/mxful.c:
+ * gst/mxf/mxful.h:
+ * gst/mxf/mxfup.c:
+ * gst/mxf/mxfup.h:
+ * gst/mxf/mxfvc3.c:
+ * gst/mxf/mxfvc3.h:
+ * gst/mxf/mxfwrite.c:
+ * gst/mxf/mxfwrite.h:
+ mxf: Source files and #include cleanup
+
+2009-03-26 12:10:05 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ * gst/xdgmime/Makefile.am:
+ * gst/xdgmime/gstxdgmime.c:
+ xdgmime: Use GIOs g_content_type_guess() if possible
+
+2009-03-26 11:51:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfwrite.c:
+ mxf: Use the UL database for some more ULs
+
+2009-03-26 11:42:45 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfmetadata.c:
+ mxf: Remove some GLib < 2.14 compatibility stuff
+
+2009-03-26 11:37:28 +0100 РуÑлан Ижбулатов <lrn1986@gmail.com>
+
+ * configure.ac:
+ * sys/acmenc/Makefile.am:
+ * sys/acmenc/acmenc.c:
+ * sys/acmmp3dec/Makefile.am:
+ * sys/acmmp3dec/acmmp3dec.c:
+ acm: Port to MinGW
+ Fixes bug #573595.
+
+2009-03-26 11:33:50 +0100 РуÑлан Ижбулатов <lrn1986@gmail.com>
+
+ * configure.ac:
+ * gst/xdgmime/Makefile.am:
+ xdgmime: Link with winsock library to fix build with MinGW
+ Partially fixes bug #573595.
+
+2009-03-26 11:32:08 +0100 РуÑлан Ижбулатов <lrn1986@gmail.com>
+
+ * configure.ac:
+ * gst/dccp/Makefile.am:
+ * gst/dccp/gstdccp.c:
+ * gst/dccp/gstdccp.h:
+ * gst/dccp/gstdccp_common.h:
+ * gst/dccp/gstdccpclientsink.c:
+ * gst/dccp/gstdccpclientsink.h:
+ * gst/dccp/gstdccpclientsrc.c:
+ * gst/dccp/gstdccpclientsrc.h:
+ * gst/dccp/gstdccpserversink.c:
+ * gst/dccp/gstdccpserversink.h:
+ * gst/dccp/gstdccpserversrc.c:
+ * gst/dccp/gstdccpserversrc.h:
+ dccp: Port DCCP plugin to MinGW
+ Partially fixes bug #573595.
+
+2009-03-26 11:23:30 +0100 РуÑлан Ижбулатов <lrn1986@gmail.com>
+
+ * configure.ac:
+ dccp: Disable the dccp plugin if no pthread support is available
+ Partially fixes bug #573595.
+
+2009-03-26 08:13:10 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'mxfmux'
+
+2009-03-26 08:12:02 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfdv-dif.c:
+ * gst/mxf/mxfjpeg2000.c:
+ * gst/mxf/mxfvc3.c:
+ mxfmux: Cleanup
+
+2009-03-26 08:11:20 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfaes-bwf.c:
+ * gst/mxf/mxfalaw.c:
+ * gst/mxf/mxfmux.c:
+ * gst/mxf/mxfmux.h:
+ mxfmux: Fix handling of buffers with more than one edit unit and EOS handling
+
+2009-03-25 23:04:13 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/ladspa/gstsignalprocessor.c:
+ * ext/ladspa/gstsignalprocessor.h:
+ ladspa: comment signalprocessor class more and do minor code cleanups
+
+2009-03-25 12:40:35 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ Require core >= 0.10.22.1 for %u pad template support
+
+2009-03-24 15:23:03 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/selector/gstinputselector.c:
+ selector: merge the tags
+ Merge the tags received on the input-selector sinkpads instead of only keeping
+ the last one we saw.
+
+2009-03-23 19:33:31 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * NEWS:
+ Fix version number in the NEWS file
+
+2009-03-19 01:17:25 +0200 René Stadler <mail@renestadler.de>
+
+ * gst/aacparse/gstaacparse.c:
+ aacparse: Fix busyloop when seeking. Fixes #575388
+ The problem is that after a discont, set_min_frame_size(1024) is called when
+ detect_stream returns FALSE. However, detect_stream calls check_adts_frame
+ which sets the frame size on its own to something larger than 1024. This is the
+ same situation as in the beginning, so the base class ends up calling
+ check_valid_frame in an endless loop.
+
+2009-03-19 00:32:40 +0200 René Stadler <mail@renestadler.de>
+
+ * gst/aacparse/gstaacparse.c:
+ aacparse: Refactor check_valid_frame to expose broken code
+ Just moving code around and removing an unhelpful/misleading comment.
+
+2009-03-23 11:17:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/qtmux/gstqtmux.c:
+ qtmux: fix includes for lseek
+ --
+
+2009-03-20 14:20:16 +0100 LRN <lrn1986 at gmail dot com>
+
+ * gst/qtmux/gstqtmux.c:
+ win32: fix seeking in large files
+ Use _lseeki64() on Windows to seek in large files.
+ Fixes #576021.
+
+2009-03-16 11:21:02 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/jack/gstjack.c:
+ * ext/jack/gstjack.h:
+ * ext/jack/gstjackaudiosink.c:
+ * ext/jack/gstjackaudiosrc.c:
+ jack: Add new connection mode
+ Add a new connection mode to jacksrc and jacksink. In this new auto-force
+ connection mode jack will create as many ports as requested/needed in the
+ pipeline and will then connect as many physical ports as possible, possibly
+ leaving some ports unconnected.
+ Also get rid of some leftover g_print.
+ Fixes #575284.
+
+2009-03-23 15:06:11 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfparse.c:
+ mxf: Move some static const variables into functions
+
+2009-03-13 19:42:18 +0100 Alessandro Decina <alessandro.decina@collabora.co.uk>
+
+ * configure.ac:
+ * ext/celt/gstceltenc.c:
+ celtenc: build with celt 0.5.
+
+2009-03-22 20:14:25 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ back to development -> 0.10.11.1
+
+2009-03-20 15:55:19 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/Makefile.am:
+ tests: reenable metadata test
+
+2009-03-20 15:33:31 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/Makefile.am:
+ metadata: reenable test
+
+2009-03-20 15:18:05 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/metadata/metadataexif.h:
+ * ext/metadata/metadataiptc.h:
+ * ext/metadata/metadatamuxjpeg.c:
+ * ext/metadata/metadatamuxpng.c:
+ * ext/metadata/metadataparsejpeg.c:
+ * ext/metadata/metadataparsepng.c:
+ * ext/metadata/metadataxmp.h:
+ metdata: more logging and code cleanups
+ Sprinkle more debug log statements into the code. Move some repeaded string
+ constant into header files and use sizeof instead of manually counted bytes. Add
+ comments.
+
+2009-03-20 15:14:07 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/metadata/metadatamuxjpeg.c:
+ metadata: fix muxing jfifless jpeg. Fixes #574401
+ Don't error out when to be muxed jpeg has no jfif, as we can easily
+ add it.
+
+2009-03-20 15:10:22 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/metadata/metadataexif.h:
+ * ext/metadata/metadataiptc.h:
+ * ext/metadata/metadataxmp.h:
+ metadata: fix include guards
+
+2009-03-20 15:04:16 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/metadata/metadata.c:
+ metadata: rework doc comment
+
+2009-03-09 23:43:55 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/autoconvert/Makefile.am:
+ * gst/camerabin/Makefile.am:
+ * gst/dtmf/Makefile.am:
+ * gst/liveadder/Makefile.am:
+ * gst/mxf/Makefile.am:
+ * gst/nuvdemux/Makefile.am:
+ * gst/qtmux/Makefile.am:
+ * gst/rtpmux/Makefile.am:
+ * gst/siren/Makefile.am:
+ * gst/valve/Makefile.am:
+ Makefile.am: no static libs for plugins
+
+2009-03-22 15:58:50 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfmux.c:
+ mxfmux: Fix error handling
+
+2009-03-22 15:51:37 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfaes-bwf.c:
+ * gst/mxf/mxfalaw.c:
+ * gst/mxf/mxfdv-dif.c:
+ * gst/mxf/mxfjpeg2000.c:
+ * gst/mxf/mxfmetadata.c:
+ * gst/mxf/mxfmetadata.h:
+ * gst/mxf/mxfmpeg.c:
+ * gst/mxf/mxfup.c:
+ * gst/mxf/mxfvc3.c:
+ mxfmux: Fix some memory leaks, improve debugging and handle errors better
+
+2009-03-22 15:35:42 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfmux.c:
+ * gst/mxf/mxfmux.h:
+ mxfmux: Add an error state from which we return immediately
+ Also improve debugging a bit.
+
+2009-03-19 20:41:16 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxful.c:
+ mxf: Optimize mxf_ul_is_subclass() a bit
+
+2009-03-19 14:30:34 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/Makefile.am:
+ * gst/mxf/mxfparse.c:
+ * gst/mxf/mxfparse.h:
+ * gst/mxf/mxftypes.h:
+ * gst/mxf/mxful.c:
+ * gst/mxf/mxful.h:
+ mxf: Start implementing a central UL database and add some helper functions and use them
+
+2009-03-17 14:27:50 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfmpeg.c:
+ mxfmux: Make sure to include a picture in the edit units when muxing MPEG2/MPEG4
+
+2009-03-17 14:23:37 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfmpeg.c:
+ mxfdemux: Remove accidentially committed g_assert_not_reached()
+
+2009-03-16 17:49:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfup.c:
+ mxf: Add support for muxing/demuxing subsampled YUV formats
+
+2009-03-16 17:22:22 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfup.c:
+ mxfdemux: Use correct width/height for stride conversions
+
+2009-03-16 17:18:17 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfup.c:
+ mxf: Implement stride transformations for raw video content for muxing and demuxing
+
+2009-03-16 15:37:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfup.c:
+ mxfdemux: Simplify caps selection by using a lookup table
+
+2009-03-16 12:48:31 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfup.c:
+ mxfmux: Add initial support for muxing raw picture essence
+
+2009-03-16 12:15:46 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfmux.c:
+ mxfmux: Only add an essence container UL once to the partition and preface
+
+2009-03-16 12:07:20 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfup.c:
+ mxfdemux: Add support for AYUV and v308 YUV colorspaces
+
+2009-03-16 11:00:57 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfmpeg.c:
+ mxfmux: Use the correct edit rate instead of estimating it from the first buffer duration
+
+2009-03-15 15:27:56 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfdemux.c:
+ mxfdemux: Error out directly if pushing a packet downstream failed
+
+2009-03-15 15:27:24 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfdv-dif.c:
+ mxfmux: Add support for DV/DIF muxing and add framerate, etc to the caps when demuxing DV/DIF content
+
+2009-03-15 15:27:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfmux.c:
+ mxfmux: Add some debugging and error out on invalid input data
+
+2009-03-14 19:59:39 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/deinterlace/gstdeinterlace.c:
+ deinterlace: Fix uninitialized variable compiler warnings
+
+2009-03-11 19:38:26 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfmpeg.c:
+ mxfmux: Add support for muxing MPEG audio and video
+
+2009-03-11 19:38:02 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfmpeg.c:
+ mxfdemux: Use correct caps type for AC3 audio (audio/x-ac3 instead of audio/ac3)
+
+2009-03-11 19:34:12 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfjpeg2000.c:
+ mxfmux: Add support for muxing JPEG2000 code streams
+
+2009-03-11 19:33:54 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfvc3.c:
+ mxfmux: Add support for muxing VC-3 (aka DNxHD) video
+
+2009-03-11 19:33:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfalaw.c:
+ mxfmux: Add support for muxing A-Law audio
+
+2009-03-11 19:33:18 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/mxf/mxfaes-bwf.c:
+ mxfmux: Add support for muxing raw audio
+
+2009-03-11 19:32:16 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ * gst/mxf/Makefile.am:
+ * gst/mxf/mxf.c:
+ * gst/mxf/mxfmetadata.c:
+ * gst/mxf/mxfmetadata.h:
+ * gst/mxf/mxfmux.c:
+ * gst/mxf/mxfmux.h:
+ * gst/mxf/mxfparse.c:
+ * gst/mxf/mxfparse.h:
+ * gst/mxf/mxftypes.h:
+ * gst/mxf/mxfwrite.c:
+ * gst/mxf/mxfwrite.h:
+ mxf: Add MXF muxer
+ This muxer currently only supports OP1a and is
+ probably not yet 100% complying to the standards.
+
+2009-03-11 19:30:22 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/jp2k/gstjasperenc.c:
+ jp2kenc: Add width/height/fourcc to the pad template caps
+
=== release 0.10.11 ===
-2009-03-21 Jan Schmidt <jan.schmidt@sun.com>
+2009-03-21 01:09:08 +0000 Jan Schmidt <thaytan@noraisin.net>
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
* configure.ac:
- releasing 0.10.11, "A precious stone"
+ * 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-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-deinterlace2.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-flv.xml:
+ * docs/plugins/inspect/plugin-freeze.xml:
+ * docs/plugins/inspect/plugin-gsm.xml:
+ * docs/plugins/inspect/plugin-gstinterlace.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-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:
+ * docs/plugins/inspect/plugin-y4menc.xml:
+ * gst-plugins-bad.doap:
+ * win32/common/config.h:
+ Release 0.10.11
2009-03-20 23:37:39 +0000 Jan Schmidt <thaytan@noraisin.net>
diff --git a/NEWS b/NEWS
index 90bd44ca..966261a0 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,63 @@
-This is GStreamer Bad Plug-ins 0.10.11, "A precious stone"
+This is GStreamer Bad Plug-ins 0.10.11, "More than I can handle"
+
+Changes since 0.10.11:
+
+ * 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
+
+Bugs fixed since 0.10.11:
+
+ * 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
Changes since 0.10.10:
diff --git a/RELEASE b/RELEASE
index b3abafb6..5b86ba82 100644
--- a/RELEASE
+++ b/RELEASE
@@ -1,5 +1,5 @@
-Release notes for GStreamer Bad Plug-ins 0.10.11 "A precious stone"
+Release notes for GStreamer Bad Plug-ins 0.10.12 "More than I can handle"
@@ -60,45 +60,62 @@ contains a set of well-supported plug-ins, but might pose problems for
Features of this release
- * Add ASS/SSA subtitle handling element assrender
- * Leak fixes in the QuickTime decoder wrapper
- * Better DirectShow output on Windows
- * Extend QT muxing support to include AMR and H.263
- * mms seeking support
- * Extended MXF file format handling
- * camerabin and photography API for digital camera interfacing
- * Merge elements from Farsight: liveadder, sirendec, sirenenc, valve, rtpdtmfsrc, rtpdtmdepay, dtmfsrc, rtpdtmfmux, autoconvert, mimdec, mimenc
- * typefinder based on xdgmime
+ * 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
Bugs fixed in this release
- * 573369 : [gstfaad] Memory corruption and segfault
- * 568704 : Metadatamux: unable to configure byte order for EXIF
- * 354908 : videoflipping interface for v4l2src
- * 369912 : missing inclusion in rpm spec file
- * 469930 : [mmssrc] seeking support PATCH
- * 481075 : Full support for ASS/SSA subtitles
- * 549645 : merge useful elements from gst-plugins-farsight into core
- * 567003 : [ladspa] improve plugin scanning
- * 567371 : [mpegtsparse] memory leak in mpegtspacketizer
- * 567828 : rtpmanager and RTCP BYE packet
- * 567965 : [flvdemux] add support for ECMA arrays in script tags
- * 568480 : gst-plugins-bad dccp plugin won't compile on Soalris
- * 568483 : Problems linking gst-plugins-bad
- * 568837 : RFE: allow building against the system modplug library
- * 569323 : [qtmux] should support audio/AMR sink
- * 570996 : bpmdetect relibably crashes with SIGSEGV on particular file
- * 571560 : gstdshowaudio decoder doesn't compile.
- * 572315 : Compiling camerabin on Windows with Visual Studio
- * 572900 : gstrtpsession should not forward recv side event to the s...
- * 573288 : [mpegtsdemux] memory leak when pusi is missed due to pack...
- * 573391 : [videoanalyse] Wrong brightness calculation
- * 575157 : xdgmime typefinder: make more conservative
- * 575565 : [mxf] mxf plugin uses symbols not in glib 2.6 (minimum gl...
- * 564114 : [PATCH] fbdev: fix depth calculation
- * 573850 : Use Glib's byte order in gstgsmdec
- * 573851 : Use glib integer types in gstfaad
- * 172043 : [mpegpsdemux] wrong video length on mpeg file
+ * 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
Download
@@ -127,46 +144,38 @@ Applications
Contributors to this release
- * Andoni Morales
- * Andrzej Polatyński
+ * Alan Falloon
+ * Alessandro Decina
* Andy Wingo
- * Benjamin Schmitz
- * Brian Cameron
+ * Arnout Vandecappelle
* Christian Schaller
* David Schleef
* Edward Hervey
- * Hans de Goede
- * HÃ¥vard Graff
+ * Felipe Contreras
+ * Haakon Sporsheim
* Jan Schmidt
- * Jan Urbanski
- * Josep Torra
+ * Janin Kolenc
* Julien Moutte
- * LRN
* Lasse Laukkanen
* Laurent Glayal
+ * Marc-Andre Lureau
* Mark Nauwelaerts
* Michael Smith
- * Nokia Corporation
- * Olivier Crete
+ * Ole André Vadla Ravnås
* Olivier Crête
- * Peter Kjellerstedt
- * Philipe Kalaf
- * Philippe Khalaf
* René Stadler
+ * Rov Juvano
* Sebastian Dröge
- * Sebastian Pölsterl
- * Simon McVittie
- * Sjoerd Simons
+ * Sergey Scobich
* Stefan Kost
- * Thiago Sousa Santos
+ * Sébastien Moutte
+ * Thiago Santos
+ * Thomas Vander Stichele
* Tim-Philipp Müller
+ * Tristan Matthews
+ * Vincent Genieux
+ * Vincent Torri
* Wim Taymans
- * Youness Alaoui
- * Zaheer Merali
- * Zeeshan Ali
- * philippe.kalaf@collabora.co.uk
- * sjoerd@luon.net
- * vanista
- * zeenix@gmail.com
- * zeeshan.ali@nokia.com
+ * Zaheer Abbas Merali
+ * РуÑлан Ижбулатов
  \ No newline at end of file
diff --git a/autogen.sh b/autogen.sh
index 7ac3720d..61fb4d7c 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -76,15 +76,15 @@ fi
tool_run "$autopoint --force"
patch -p0 < common/gettext.patch
-tool_run "$aclocal" "-I m4 -I common/m4 $ACLOCAL_FLAGS"
tool_run "$libtoolize" "--copy --force"
+tool_run "$aclocal" "-I m4 -I common/m4 $ACLOCAL_FLAGS"
tool_run "$autoheader"
# touch the stamp-h.in build stamp so we don't re-run autoheader in maintainer mode -- wingo
echo timestamp > stamp-h.in 2> /dev/null
tool_run "$autoconf"
-tool_run "$automake" "-a -c -Wno-portability"
+tool_run "$automake" "-a -c"
# if enable exists, add an -enable option for each of the lines in that file
if test -f enable; then
diff --git a/common b/common
-Subproject 6ab11d17cb8e4d1ed755da7accac9630d567a09
+Subproject c57272152d5c40617fab305d839db1b1fefe0ea
diff --git a/configure.ac b/configure.ac
index 9fd46354..a9b89f0f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3,14 +3,14 @@ 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.11.1,
+AC_INIT(GStreamer Bad Plug-ins, 0.10.12.1,
http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer,
gst-plugins-bad)
AG_GST_INIT
dnl initialize automake
-AM_INIT_AUTOMAKE
+AM_INIT_AUTOMAKE([-Wno-portability])
dnl define PACKAGE_VERSION_* variables
AS_VERSION
@@ -158,13 +158,6 @@ GST_CHECK_FIONREAD
dnl *** checks for structures ***
dnl *** checks for compiler characteristics ***
-dnl check if we have GCC inline-asm
-AS_GCC_INLINE_ASSEMBLY([HAVE_GCC_ASM=yes], [HAVE_GCC_ASM=no])
-if test x$HAVE_GCC_ASM = xyes ; then
- AC_DEFINE(HAVE_GCC_ASM, 1,
- [Define if compiler supports gcc inline assembly])
-fi
-AM_CONDITIONAL(HAVE_GCC_ASM, test "x$HAVE_GCC_ASM" = "xyes")
dnl *** checks for library functions ***
AC_CHECK_FUNCS([gmtime_r])
@@ -258,6 +251,7 @@ dnl *** plug-ins to include ***
dnl these are all the gst plug-ins, compilable without additional libs
AG_GST_CHECK_PLUGIN(aacparse)
+AG_GST_CHECK_PLUGIN(adpcmdec)
AG_GST_CHECK_PLUGIN(aiffparse)
AG_GST_CHECK_PLUGIN(amrparse)
AG_GST_CHECK_PLUGIN(autoconvert)
@@ -267,14 +261,12 @@ AG_GST_CHECK_PLUGIN(bayer)
AG_GST_CHECK_PLUGIN(cdxaparse)
AG_GST_CHECK_PLUGIN(dccp)
AG_GST_CHECK_PLUGIN(debugutils)
-AG_GST_CHECK_PLUGIN(deinterlace)
-AG_GST_CHECK_PLUGIN(deinterlace2)
AG_GST_CHECK_PLUGIN(dtmf)
AG_GST_CHECK_PLUGIN(dvdspu)
AG_GST_CHECK_PLUGIN(festival)
-AG_GST_CHECK_PLUGIN(flv)
AG_GST_CHECK_PLUGIN(freeze)
AG_GST_CHECK_PLUGIN(h264parse)
+AG_GST_CHECK_PLUGIN(id3tag)
AG_GST_CHECK_PLUGIN(librfb)
AG_GST_CHECK_PLUGIN(liveadder)
AG_GST_CHECK_PLUGIN(mpegdemux)
@@ -303,7 +295,6 @@ AG_GST_CHECK_PLUGIN(valve)
AG_GST_CHECK_PLUGIN(videosignal)
AG_GST_CHECK_PLUGIN(vmnc)
AG_GST_CHECK_PLUGIN(xdgmime)
-AG_GST_CHECK_PLUGIN(y4m)
dnl *** plug-ins to exclude ***
@@ -359,6 +350,46 @@ fi
dnl *** sys plug-ins ***
+dnl DirectDraw
+translit(dnm, m, l) AM_CONDITIONAL(USE_DIRECTDRAW, true)
+AG_GST_CHECK_FEATURE(DIRECTDRAW, [DirectDraw plug-in], directdrawsink, [
+ HAVE_DIRECTDRAW="no"
+ save_CFLAGS="$CFLAGS"
+ save_LDFLAGS="$LDFLAGS"
+ save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $DIRECTDRAW_CFLAGS"
+ LDFLAGS="$LDFLAGS $DIRECTDRAW_LDFLAGS"
+ LIBS="$LIBS -lddraw -lgdi32"
+ AC_MSG_CHECKING(for DirectDraw LDFLAGS)
+ AC_LINK_IFELSE([
+#include <windows.h>
+#include <ddraw.h>
+
+int main ()
+{
+ GetStockObject(0);
+ DirectDrawCreate(NULL, NULL, NULL);
+
+ return 0;
+}
+],
+ [HAVE_DIRECTDRAW="yes"],
+ [HAVE_DIRECTDRAW="no"])
+ AC_MSG_RESULT($HAVE_DIRECTDRAW)
+ CFLAGS=$save_CFLAGS
+ LDFLAGS=$save_LDFLAGS
+ LIBS=$save_LIBS
+
+ if test "x$HAVE_DIRECTDRAW" = "xyes"; then
+ dnl this is much more than we want
+ DIRECTDRAW_LIBS="-lddraw -ldxguid -lgdi32"
+ AC_SUBST(DIRECTDRAW_CFLAGS)
+ AC_SUBST(DIRECTDRAW_LDFLAGS)
+ AC_SUBST(DIRECTDRAW_LIBS)
+ fi
+ AC_SUBST(HAVE_DIRECTDRAW)
+])
+
dnl *** OS X videosrc ***
translit(dnm, m, l) AM_CONDITIONAL(USE_OSX_VIDEO, true)
HAVE_OSX_VIDEO="no"
@@ -830,9 +861,9 @@ AG_GST_CHECK_FEATURE(FAAD, [AAC decoder plug-in], faad, [
AC_MSG_CHECKING([Checking FAAD2 version in $faad_hdr])
for minor in 10 9 8 7 6 5 0; do
if test x$faad2_minor_version = "x"; then
- AC_EGREP_CPP([2.$minor], [
+ AC_EGREP_CPP([GST_CHECK_FAAD_VERSION \"2\.$minor\"], [
#include <$faad_hdr>
- FAAD2_VERSION
+ GST_CHECK_FAAD_VERSION FAAD2_VERSION
], [
faad2_minor_version=$minor
])
@@ -1432,6 +1463,7 @@ AM_CONDITIONAL(USE_CDAUDIO, false)
AM_CONDITIONAL(USE_CELT, false)
AM_CONDITIONAL(USE_DC1394, false)
AM_CONDITIONAL(USE_DIRECTFB, false)
+AM_CONDITIONAL(USE_DIRECTDRAW, false)
AM_CONDITIONAL(USE_DTS, false)
AM_CONDITIONAL(USE_DIRAC, false)
AM_CONDITIONAL(USE_DIVX, false)
@@ -1537,6 +1569,7 @@ common/shave-libtool
gst-plugins-bad.spec
gst/Makefile
gst/aacparse/Makefile
+gst/adpcmdec/Makefile
gst/aiffparse/Makefile
gst/amrparse/Makefile
gst/autoconvert/Makefile
@@ -1547,14 +1580,12 @@ gst/camerabin/Makefile
gst/cdxaparse/Makefile
gst/dccp/Makefile
gst/debugutils/Makefile
-gst/deinterlace/Makefile
-gst/deinterlace2/Makefile
gst/dtmf/Makefile
gst/dvdspu/Makefile
gst/festival/Makefile
-gst/flv/Makefile
gst/freeze/Makefile
gst/h264parse/Makefile
+gst/id3tag/Makefile
gst/librfb/Makefile
gst/mpegdemux/Makefile
gst/mpegtsmux/Makefile
@@ -1583,7 +1614,6 @@ gst/videosignal/Makefile
gst/vmnc/Makefile
gst/real/Makefile
gst/xdgmime/Makefile
-gst/y4m/Makefile
gst-libs/Makefile
gst-libs/gst/Makefile
gst-libs/gst/dshow/Makefile
@@ -1593,6 +1623,7 @@ sys/Makefile
sys/dshowdecwrapper/Makefile
sys/acmenc/Makefile
sys/acmmp3dec/Makefile
+sys/directdraw/Makefile
sys/dshowsrcwrapper/Makefile
sys/dshowvideosink/Makefile
sys/dvb/Makefile
diff --git a/docs/plugins/Makefile.am b/docs/plugins/Makefile.am
index faa5e33c..dcd9e5df 100644
--- a/docs/plugins/Makefile.am
+++ b/docs/plugins/Makefile.am
@@ -120,8 +120,6 @@ EXTRA_HFILES = \
$(top_srcdir)/gst/amrparse/gstamrparse.h \
$(top_srcdir)/gst/autoconvert/gstautoconvert.h \
$(top_srcdir)/gst/camerabin/gstcamerabin.h \
- $(top_srcdir)/gst/deinterlace/gstdeinterlace.h \
- $(top_srcdir)/gst/deinterlace2/gstdeinterlace2.h \
$(top_srcdir)/gst/dccp/gstdccpclientsink.h \
$(top_srcdir)/gst/dccp/gstdccpclientsrc.h \
$(top_srcdir)/gst/dccp/gstdccpserversink.h \
@@ -132,8 +130,6 @@ EXTRA_HFILES = \
$(top_srcdir)/gst/dtmf/gstrtpdtmfdepay.h \
$(top_srcdir)/gst/dvdspu/gstdvdspu.h \
$(top_srcdir)/gst/festival/gstfestival.h \
- $(top_srcdir)/gst/flv/gstflvdemux.h \
- $(top_srcdir)/gst/flv/gstflvmux.h \
$(top_srcdir)/gst/legacyresample/gstlegacyresample.h \
$(top_srcdir)/gst/liveadder/liveadder.h \
$(top_srcdir)/gst/mxf/mxfdemux.h \
@@ -159,7 +155,7 @@ EXTRA_HFILES = \
$(top_srcdir)/gst/videosignal/gstvideodetect.h \
$(top_srcdir)/gst/videosignal/gstvideomark.h \
$(top_srcdir)/gst/valve/gstvalve.h \
- $(top_srcdir)/gst/y4m/gsty4mencode.h \
+ $(top_srcdir)/sys/directdraw/gstdirectdrawsink.h \
$(top_srcdir)/sys/dvb/gstdvbsrc.h
# Images to copy into HTML directory.
diff --git a/docs/plugins/gst-plugins-bad-plugins-docs.sgml b/docs/plugins/gst-plugins-bad-plugins-docs.sgml
index 2fc7166a..329e6bab 100644
--- a/docs/plugins/gst-plugins-bad-plugins-docs.sgml
+++ b/docs/plugins/gst-plugins-bad-plugins-docs.sgml
@@ -32,16 +32,13 @@
<xi:include href="xml/element-dccpclientsrc.xml" />
<xi:include href="xml/element-dccpserversink.xml" />
<xi:include href="xml/element-dccpserversrc.xml" />
- <xi:include href="xml/element-deinterlace.xml" />
- <xi:include href="xml/element-deinterlace2.xml" />
<xi:include href="xml/element-dfbvideosink.xml" />
+ <xi:include href="xml/element-directdrawsink.xml" />
<xi:include href="xml/element-dtmfsrc.xml" />
<xi:include href="xml/element-dtsdec.xml" />
<xi:include href="xml/element-dvbsrc.xml" />
<xi:include href="xml/element-dvdspu.xml" />
<xi:include href="xml/element-festival.xml" />
- <xi:include href="xml/element-flvdemux.xml" />
- <xi:include href="xml/element-flvmux.xml" />
<xi:include href="xml/element-fpsdisplaysink.xml" />
<xi:include href="xml/element-gstrtpbin.xml" />
<xi:include href="xml/element-gstrtpclient.xml" />
@@ -87,7 +84,6 @@
<xi:include href="xml/element-videoparse.xml" />
<xi:include href="xml/element-wildmidi.xml" />
<xi:include href="xml/element-x264enc.xml" />
- <xi:include href="xml/element-y4menc.xml" />
</chapter>
<chapter>
@@ -106,9 +102,9 @@
<xi:include href="xml/plugin-celt.xml" />
<xi:include href="xml/plugin-dccp.xml" />
<xi:include href="xml/plugin-debugutilsbad.xml" />
- <xi:include href="xml/plugin-deinterlace2.xml" />
<xi:include href="xml/plugin-dfbvideosink.xml" />
<xi:include href="xml/plugin-dirac.xml" />
+ <xi:include href="xml/plugin-directdraw.xml" />
<xi:include href="xml/plugin-dtmf.xml" />
<xi:include href="xml/plugin-dtsdec.xml" />
<xi:include href="xml/plugin-dvbsrc.xml" />
@@ -119,10 +115,8 @@
<xi:include href="xml/plugin-fbdevsink.xml" />
<xi:include href="xml/plugin-festival.xml" />
<xi:include href="xml/plugin-filter.xml" />
- <xi:include href="xml/plugin-flv.xml" />
<xi:include href="xml/plugin-freeze.xml" />
<xi:include href="xml/plugin-gsm.xml" />
- <xi:include href="xml/plugin-gstinterlace.xml" />
<xi:include href="xml/plugin-gstrtpmanager.xml" />
<xi:include href="xml/plugin-h264parse.xml" />
<xi:include href="xml/plugin-jack.xml" />
@@ -169,7 +163,6 @@
<xi:include href="xml/plugin-wildmidi.xml" />
<xi:include href="xml/plugin-x264.xml" />
<xi:include href="xml/plugin-xvid.xml" />
- <xi:include href="xml/plugin-y4menc.xml" />
</chapter>
<chapter>
diff --git a/docs/plugins/gst-plugins-bad-plugins-sections.txt b/docs/plugins/gst-plugins-bad-plugins-sections.txt
index 1523e264..2c57e3f1 100644
--- a/docs/plugins/gst-plugins-bad-plugins-sections.txt
+++ b/docs/plugins/gst-plugins-bad-plugins-sections.txt
@@ -210,34 +210,6 @@ gst_dccp_server_src_get_type
</SECTION>
<SECTION>
-<FILE>element-deinterlace</FILE>
-<TITLE>deinterlace</TITLE>
-GstDeinterlace
-<SUBSECTION Standard>
-GstDeinterlaceClass
-GST_DEINTERLACE
-GST_DEINTERLACE_CLASS
-GST_IS_DEINTERLACE
-GST_IS_DEINTERLACE_CLASS
-GST_TYPE_DEINTERLACE
-gst_deinterlace_get_type
-</SECTION>
-
-<SECTION>
-<FILE>element-deinterlace2</FILE>
-<TITLE>deinterlace2</TITLE>
-GstDeinterlace2
-<SUBSECTION Standard>
-GstDeinterlace2Class
-GST_IS_DEINTERLACE2
-GST_IS_DEINTERLACE2_CLASS
-GST_DEINTERLACE2
-GST_DEINTERLACE2_CLASS
-GST_TYPE_DEINTERLACE2
-gst_deinterlace2_get_type
-</SECTION>
-
-<SECTION>
<FILE>element-dfbvideosink</FILE>
<TITLE>dfbvideosink</TITLE>
GstDfbVideoSink
@@ -258,6 +230,25 @@ gst_dfbsurface_get_type
</SECTION>
<SECTION>
+<FILE>element-directdrawsink</FILE>
+<TITLE>directdrawsink</TITLE>
+GstDirectDrawSink
+<SUBSECTION Standard>
+GstDirectDrawSinkClass
+GST_DIRECTDRAW_SINK
+GST_DIRECTDRAW_SINK_CLASS
+GST_IS_DIRECTDRAW_SINK
+GST_IS_DIRECTDRAW_SINK_CLASS
+GST_TYPE_DIRECTDRAW_SINK
+gst_directdraw_sink_get_type
+GstDDrawSurface
+GST_DDRAWSURFACE
+GST_IS_DDRAWSURFACE
+GST_TYPE_DDRAWSURFACE
+DIRECTDRAW_VERSION
+</SECTION>
+
+<SECTION>
<FILE>element-dtmfsrc</FILE>
<TITLE>dtmfsrc</TITLE>
GstDTMFSrc
@@ -357,36 +348,6 @@ FESTIVAL_DEFAULT_TEXT_MODE
</SECTION>
<SECTION>
-<FILE>element-flvdemux</FILE>
-<TITLE>flvdemux</TITLE>
-GstFLVDemux
-<SUBSECTION Standard>
-GstFLVDemuxClass
-GstFLVDemuxFlags
-GST_FLV_DEMUX
-GST_FLV_DEMUX_CLASS
-GST_IS_FLV_DEMUX
-GST_IS_FLV_DEMUX_CLASS
-GST_TYPE_FLV_DEMUX
-gst_flv_demux_get_type
-</SECTION>
-
-<SECTION>
-<FILE>element-flvmux</FILE>
-<TITLE>flvmux</TITLE>
-GstFlvMux
-<SUBSECTION Standard>
-GstFlvMuxClass
-GstFlvMuxFlags
-GST_FLV_MUX
-GST_FLV_MUX_CLASS
-GST_IS_FLV_MUX
-GST_IS_FLV_MUX_CLASS
-GST_TYPE_FLV_MUX
-gst_flv_mux_get_type
-</SECTION>
-
-<SECTION>
<FILE>element-fpsdisplaysink</FILE>
<TITLE>fpsdisplaysink</TITLE>
GstFPSDisplaySink
@@ -1064,21 +1025,6 @@ GST_TYPE_X264_ENC
</SECTION>
<SECTION>
-<FILE>element-y4menc</FILE>
-<TITLE>y4menc</TITLE>
-GstY4mEncode
-<SUBSECTION Standard>
-GstY4mEncodeClass
-GST_Y4M_ENCODE
-GST_Y4M_ENCODE_CLASS
-GST_IS_Y4M_ENCODE
-GST_IS_Y4M_ENCODE_CLASS
-GST_Y4M_ENCODE_GET_CLASS
-GST_TYPE_Y4M_ENCODE
-gst_y4m_encode_get_type
-</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 0f238ebf..a1b7e6e2 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>
@@ -681,7 +681,7 @@
<ARG>
<NAME>GstMpeg2enc::bitrate</NAME>
<TYPE>gint</TYPE>
-<RANGE>[0,10240]</RANGE>
+<RANGE>[0,10000]</RANGE>
<FLAGS>rw</FLAGS>
<NICK>Bitrate</NICK>
<BLURB>Compressed video bitrate (kbps).</BLURB>
@@ -841,7 +841,7 @@
<ARG>
<NAME>GstMpeg2enc::non-video-bitrate</NAME>
<TYPE>gint</TYPE>
-<RANGE>[0,10240]</RANGE>
+<RANGE>[0,10000]</RANGE>
<FLAGS>rw</FLAGS>
<NICK>Non-video bitrate</NICK>
<BLURB>Assumed bitrate of non-video for sequence splitting (kbps).</BLURB>
@@ -984,7 +984,7 @@
<RANGE>[0,512]</RANGE>
<FLAGS>rw</FLAGS>
<NICK>VCD stills size</NICK>
-<BLURB>Size of VCD stills (in kB).</BLURB>
+<BLURB>Size of VCD stills (in KB).</BLURB>
<DEFAULT>0</DEFAULT>
</ARG>
@@ -1681,7 +1681,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>
@@ -17455,7 +17455,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>
@@ -17495,7 +17495,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>
@@ -18431,7 +18431,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>
@@ -22376,7 +22376,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>
@@ -22416,7 +22416,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>
@@ -22476,7 +22476,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>
@@ -22536,7 +22536,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>
@@ -22596,7 +22596,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>
@@ -22656,7 +22656,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>
@@ -22676,7 +22676,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>
@@ -23206,7 +23206,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>
@@ -23236,7 +23236,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>
@@ -23286,7 +23286,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>
@@ -23306,7 +23306,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>
@@ -23373,3 +23373,23 @@
<DEFAULT>TRUE</DEFAULT>
</ARG>
+<ARG>
+<NAME>GstFPSDisplaySink::sync</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Sync</NICK>
+<BLURB>Sync on the clock.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFPSDisplaySink::text-overlay</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>text-overlay</NICK>
+<BLURB>Wether to use text-overlay.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
diff --git a/docs/plugins/gst-plugins-bad-plugins.hierarchy b/docs/plugins/gst-plugins-bad-plugins.hierarchy
index 52501cc2..d29e1748 100644
--- a/docs/plugins/gst-plugins-bad-plugins.hierarchy
+++ b/docs/plugins/gst-plugins-bad-plugins.hierarchy
@@ -13,299 +13,151 @@ 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
+ GstBPMDetect
GstStereo
GstBayer2RGB
GstScaletempo
+ GstDeinterlace
GstVideoFilter
GstVideoAnalyse
GstVideoDetect
GstVideoMark
- GstAudioresample
- GstDeinterlace
- 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
- GstCeltEnc
- GstCeltDec
+ ladspa-lpf
+ ladspa-hpf
+ GstXvidEnc
+ GstXvidDec
+ GstPitch
+ GstMusepackDec
+ GstMpeg2enc
+ GstGSMEnc
+ GstGSMDec
+ GstFaac
+ GstDtsDec
+ GstDiracEnc
GstTRM
+ GstX264Enc
+ GstBaseMetadata
+ GstMetadataDemux
+ GstMetadataMux
GstOss4Mixer
+ GstAmrBaseParse
+ GstAmrParse
+ GstFestival
+ GstModPlug
GstMveDemux
GstMveMux
- GstDeinterlace2
- GstBaseRTPDepayload
- GstRtpDTMFDepay
- GstRtpJitterBuffer
- GstRtpPtDemux
- GstRtpSession
- GstRtpSsrcDemux
- GstMpegPSDemux
- GstMpegTSDemux
- MpegTSParse
- GstH264Parse
- GstLiveAdder
+ GstSrtEnc
GstMpeg4VParse
- GstValve
- MpegVideoParse
- GstFLVDemux
- GstFlvMux
- 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
- GstSirenDec
- GstSirenEnc
- GstPcapParse
+ GstSpeed
+ GstFreeze
+ GstDVDSpu
+ AIFFParse
+ GstTtaParse
+ GstTtaDec
+ GstLiveAdder
+ GstValve
+ GstBaseRTPDepayload
+ GstRtpDTMFDepay
+ GstNuvDemux
+ GstFLVDemux
+ GstFlvMux
+ GstMpegPSDemux
+ GstMpegTSDemux
+ MpegTSParse
+ GstDeinterlace2
GstBus
GstTask
GstClock
@@ -327,12 +179,13 @@ GInterface
GTypePlugin
GstChildProxy
GstURIHandler
- GstTagSetter
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 415e3e72..4a91852b 100644
--- a/docs/plugins/gst-plugins-bad-plugins.interfaces
+++ b/docs/plugins/gst-plugins-bad-plugins.interfaces
@@ -1,28 +1,34 @@
GstBin GstChildProxy
GstPipeline GstChildProxy
-GstCameraBin GstChildProxy GstTagSetter GstImplementsInterface GstColorBalance GstXOverlay GstPhotography
+GstCameraBin GstChildProxy GstImplementsInterface GstColorBalance GstXOverlay GstTagSetter GstPhotography
RsnDvdBin GstChildProxy GstURIHandler
DvbBaseBin GstChildProxy GstURIHandler
+GstAutoConvert GstChildProxy
GstRtpBin GstChildProxy
GstRtpClient GstChildProxy
-FPSDisplaySink GstChildProxy GstImplementsInterface GstXOverlay
-GstAutoConvert GstChildProxy
GstSDPDemux GstChildProxy
-GstMetadataMux GstTagSetter
+GstFPSDisplaySink GstChildProxy
+GstNeonhttpSrc GstURIHandler
+GstMythtvSrc GstURIHandler
+GstMMS GstURIHandler
+GstOss4Source GstImplementsInterface GstMixer GstPropertyProbe
+GstVCDSrc GstURIHandler
GstCDAudio GstURIHandler
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
-GstCeltEnc GstTagSetter
+GstCeltEnc GstTagSetter GstPreset
+GstXvidEnc GstPreset
+GstMpeg2enc GstPreset
+GstFaac GstPreset
+GstDiracEnc GstPreset
+GstX264Enc GstPreset
+GstMetadataMux GstTagSetter
GstOss4Mixer GstImplementsInterface GstMixer GstPropertyProbe
-GstDeinterlace2 GstChildProxy
GstQTMux GstTagSetter
GstMP4Mux GstTagSetter
GstGPPMux GstTagSetter
GstMJ2Mux 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 1c7d252e..1c393910 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.11.1</version>
+ <version>0.10.12</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-aiffparse.xml b/docs/plugins/inspect/plugin-aiffparse.xml
index bda4ae6d..bd759dab 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.11.1</version>
+ <version>0.10.12</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-alsaspdif.xml b/docs/plugins/inspect/plugin-alsaspdif.xml
index 2639b4e3..cf814485 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.11.1</version>
+ <version>0.10.12</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-amrparse.xml b/docs/plugins/inspect/plugin-amrparse.xml
index 41c890ae..cf277f20 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.11.1</version>
+ <version>0.10.12</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-apex.xml b/docs/plugins/inspect/plugin-apex.xml
index e17de0b2..ad80bfcc 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.11.1</version>
+ <version>0.10.12</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-autoconvert.xml b/docs/plugins/inspect/plugin-autoconvert.xml
index ea9be4e7..3b36c4bf 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.11.1</version>
+ <version>0.10.12</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-bayer.xml b/docs/plugins/inspect/plugin-bayer.xml
index b706b97b..f80b59c3 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.11.1</version>
+ <version>0.10.12</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-bz2.xml b/docs/plugins/inspect/plugin-bz2.xml
index 75959fc3..1d4c9832 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.11.1</version>
+ <version>0.10.12</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-camerabin.xml b/docs/plugins/inspect/plugin-camerabin.xml
index fc709f6e..de34c5d4 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.11.1</version>
+ <version>0.10.12</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-cdaudio.xml b/docs/plugins/inspect/plugin-cdaudio.xml
index 2cc8c513..df9b1ee4 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.11.1</version>
+ <version>0.10.12</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-cdxaparse.xml b/docs/plugins/inspect/plugin-cdxaparse.xml
index 610e0a88..64fa14f2 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.11.1</version>
+ <version>0.10.12</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-celt.xml b/docs/plugins/inspect/plugin-celt.xml
index bab76834..14473606 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.11.1</version>
+ <version>0.10.12</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-dc1394.xml b/docs/plugins/inspect/plugin-dc1394.xml
index 32e341b2..c71c1695 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.11.1</version>
+ <version>0.10.12</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-dccp.xml b/docs/plugins/inspect/plugin-dccp.xml
index dda567bd..d2d230b4 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.11.1</version>
+ <version>0.10.12</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 9edeaf09..d9c59e36 100644
--- a/docs/plugins/inspect/plugin-debugutilsbad.xml
+++ b/docs/plugins/inspect/plugin-debugutilsbad.xml
@@ -3,10 +3,10 @@
<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.11.1</version>
+ <version>0.10.12</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-deinterlace2.xml b/docs/plugins/inspect/plugin-deinterlace2.xml
deleted file mode 100644
index 59e419a1..00000000
--- a/docs/plugins/inspect/plugin-deinterlace2.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<plugin>
- <name>deinterlace2</name>
- <description>Deinterlacer</description>
- <filename>../../gst/deinterlace2/.libs/libgstdeinterlace2.so</filename>
- <basename>libgstdeinterlace2.so</basename>
- <version>0.10.11.1</version>
- <license>LGPL</license>
- <source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins CVS/prerelease</package>
- <origin>Unknown package origin</origin>
- <elements>
- <element>
- <name>deinterlace2</name>
- <longname>Deinterlacer</longname>
- <class>Filter/Video</class>
- <description>Deinterlace Methods ported from DScaler/TvTime</description>
- <author>Martin Eikermann &lt;meiker@upb.de&gt;, Sebastian Dröge &lt;slomo@circular-chaos.org&gt;</author>
- <pads>
- <caps>
- <name>sink</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
- </caps>
- <caps>
- <name>src</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
- </caps>
- </pads>
- </element>
- </elements>
-</plugin> \ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-dfbvideosink.xml b/docs/plugins/inspect/plugin-dfbvideosink.xml
index a4975984..954ba16d 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.11.1</version>
+ <version>0.10.12</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-dirac.xml b/docs/plugins/inspect/plugin-dirac.xml
index 07bd893c..3aed5544 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.11</version>
+ <version>0.10.12</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-directdraw.xml b/docs/plugins/inspect/plugin-directdraw.xml
new file mode 100644
index 00000000..24110324
--- /dev/null
+++ b/docs/plugins/inspect/plugin-directdraw.xml
@@ -0,0 +1,20 @@
+<plugin>
+ <name>directdraw</name>
+ <description>Direct Draw plugin</description>
+ <filename>../../win32/vs6/release/libgstdirectdraw.dll</filename>
+ <basename>libgstdirectdraw.dll</basename>
+ <version>0.10.4.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-bad</source>
+ <package>GStreamer Bad Plug-ins CVS</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>directdrawsink</name>
+ <longname>Direct Draw video sink</longname>
+ <class>Sink/Video</class>
+ <description>Direct Draw video sink</description>
+ <author>Sebastien Moutte &lt;sebastien@moutte.net&gt;</author>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-dtmf.xml b/docs/plugins/inspect/plugin-dtmf.xml
index ccf2d2d5..ec7ba070 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.11.1</version>
+ <version>0.10.12</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-dtsdec.xml b/docs/plugins/inspect/plugin-dtsdec.xml
index 31dd0876..952b06c3 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.11.1</version>
+ <version>0.10.12</version>
<license>GPL</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-dvb.xml b/docs/plugins/inspect/plugin-dvb.xml
index 5d55eb67..3beaaf82 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.11.1</version>
+ <version>0.10.12</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-dvdspu.xml b/docs/plugins/inspect/plugin-dvdspu.xml
index 2fe9d8d9..e930028b 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.11.1</version>
+ <version>0.10.12</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-faac.xml b/docs/plugins/inspect/plugin-faac.xml
index a4d7ada2..ca97558e 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.11.1</version>
+ <version>0.10.12</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-faad.xml b/docs/plugins/inspect/plugin-faad.xml
index 9b289935..a895c494 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.11.1</version>
+ <version>0.10.12</version>
<license>GPL</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-fbdevsink.xml b/docs/plugins/inspect/plugin-fbdevsink.xml
index 5b4fde9f..e5f0cc7a 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.11.1</version>
+ <version>0.10.12</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-festival.xml b/docs/plugins/inspect/plugin-festival.xml
index 8786b357..6bbf7b22 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.11.1</version>
+ <version>0.10.12</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-flv.xml b/docs/plugins/inspect/plugin-flv.xml
deleted file mode 100644
index 4007af6c..00000000
--- a/docs/plugins/inspect/plugin-flv.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<plugin>
- <name>flv</name>
- <description>FLV muxing and demuxing plugin</description>
- <filename>../../gst/flv/.libs/libgstflv.so</filename>
- <basename>libgstflv.so</basename>
- <version>0.10.11.1</version>
- <license>LGPL</license>
- <source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins CVS/prerelease</package>
- <origin>Unknown package origin</origin>
- <elements>
- <element>
- <name>flvdemux</name>
- <longname>FLV Demuxer</longname>
- <class>Codec/Demuxer</class>
- <description>Demux FLV feeds into digital streams</description>
- <author>Julien Moutte &lt;julien@moutte.net&gt;</author>
- <pads>
- <caps>
- <name>video</name>
- <direction>source</direction>
- <presence>sometimes</presence>
- <details>ANY</details>
- </caps>
- <caps>
- <name>audio</name>
- <direction>source</direction>
- <presence>sometimes</presence>
- <details>ANY</details>
- </caps>
- <caps>
- <name>sink</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>video/x-flv</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>flvmux</name>
- <longname>FLV muxer</longname>
- <class>Codec/Muxer</class>
- <description>Muxes video/audio streams into a FLV stream</description>
- <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;</author>
- <pads>
- <caps>
- <name>src</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>video/x-flv</details>
- </caps>
- <caps>
- <name>audio</name>
- <direction>sink</direction>
- <presence>request</presence>
- <details>audio/x-adpcm, layout=(string)swf, channels=(int){ 1, 2 }, rate=(int){ 5512, 11025, 22050, 44100 }; audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int){ 1, 2 }, rate=(int){ 5512, 8000, 11025, 22050, 44100 }; audio/mpeg, mpegversion=(int)4; audio/x-nellymoser, channels=(int){ 1, 2 }, rate=(int){ 5512, 8000, 11025, 16000, 22050, 44100 }; audio/x-raw-int, endianness=(int)1234, channels=(int){ 1, 2 }, width=(int)8, depth=(int)8, rate=(int){ 5512, 11025, 22050, 44100 }, signed=(boolean)false; audio/x-raw-int, endianness=(int)1234, channels=(int){ 1, 2 }, width=(int)16, depth=(int)16, rate=(int){ 5512, 11025, 22050, 44100 }, signed=(boolean)true; audio/x-alaw, channels=(int){ 1, 2 }, rate=(int){ 5512, 11025, 22050, 44100 }; audio/x-mulaw, channels=(int){ 1, 2 }, rate=(int){ 5512, 11025, 22050, 44100 }; audio/x-speex, channels=(int){ 1, 2 }, rate=(int){ 5512, 11025, 22050, 44100 }</details>
- </caps>
- <caps>
- <name>video</name>
- <direction>sink</direction>
- <presence>request</presence>
- <details>video/x-flash-video; video/x-flash-screen; video/x-vp6-flash; video/x-vp6-alpha; video/x-h264</details>
- </caps>
- </pads>
- </element>
- </elements>
-</plugin> \ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-flvdemux.xml b/docs/plugins/inspect/plugin-flvdemux.xml
deleted file mode 100644
index 38efba36..00000000
--- a/docs/plugins/inspect/plugin-flvdemux.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<plugin>
- <name>flvdemux</name>
- <description>Element demuxing FLV stream</description>
- <filename>../../gst/flv/.libs/libgstflvdemux.so</filename>
- <basename>libgstflvdemux.so</basename>
- <version>0.10.8</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>flvdemux</name>
- <longname>FLV Demuxer</longname>
- <class>Codec/Demuxer</class>
- <description>Demux FLV feeds into digital streams</description>
- <author>Julien Moutte &lt;julien@moutte.net&gt;</author>
- <pads>
- <caps>
- <name>sink</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>video/x-flv</details>
- </caps>
- <caps>
- <name>audio</name>
- <direction>source</direction>
- <presence>sometimes</presence>
- <details>ANY</details>
- </caps>
- <caps>
- <name>video</name>
- <direction>source</direction>
- <presence>sometimes</presence>
- <details>ANY</details>
- </caps>
- </pads>
- </element>
- </elements>
-</plugin> \ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-freeze.xml b/docs/plugins/inspect/plugin-freeze.xml
index c7797157..574c3c54 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.11.1</version>
+ <version>0.10.12</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-gsm.xml b/docs/plugins/inspect/plugin-gsm.xml
index 83765d70..102af4d1 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.11.1</version>
+ <version>0.10.12</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-gstinterlace.xml b/docs/plugins/inspect/plugin-gstinterlace.xml
deleted file mode 100644
index 14e0b2a0..00000000
--- a/docs/plugins/inspect/plugin-gstinterlace.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<plugin>
- <name>gstinterlace</name>
- <description>Deinterlace video</description>
- <filename>../../gst/deinterlace/.libs/libgstdeinterlace.so</filename>
- <basename>libgstdeinterlace.so</basename>
- <version>0.10.11.1</version>
- <license>LGPL</license>
- <source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins CVS/prerelease</package>
- <origin>Unknown package origin</origin>
- <elements>
- <element>
- <name>deinterlace</name>
- <longname>Deinterlace</longname>
- <class>Filter/Effect/Video</class>
- <description>Deinterlace video</description>
- <author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
- <pads>
- <caps>
- <name>sink</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>video/x-raw-yuv, format=(fourcc){ I420, Y42B }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
- </caps>
- <caps>
- <name>src</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>video/x-raw-yuv, format=(fourcc){ I420, Y42B }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
- </caps>
- </pads>
- </element>
- </elements>
-</plugin> \ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-gstrtpmanager.xml b/docs/plugins/inspect/plugin-gstrtpmanager.xml
index f6f246dd..9c085e5c 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.11.1</version>
+ <version>0.10.12</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-gstsiren.xml b/docs/plugins/inspect/plugin-gstsiren.xml
index d56f0434..29bc12bd 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.11.1</version>
+ <version>0.10.12</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-h264parse.xml b/docs/plugins/inspect/plugin-h264parse.xml
index 58a5c86e..b190eda0 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.11.1</version>
+ <version>0.10.12</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-jack.xml b/docs/plugins/inspect/plugin-jack.xml
index b23ec5dd..c8cf9ef7 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.11.1</version>
+ <version>0.10.12</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-ladspa.xml b/docs/plugins/inspect/plugin-ladspa.xml
index c89cce37..677a3601 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.11.1</version>
+ <version>0.10.12</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>
- <name>ladspa-Ambisonics-11-cube-decoder</name>
- <longname>AMB order 1,1 cube decoder</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>AMB order 1,1 cube decoder</description>
- <author>Fons Adriaensen &lt;fons@kokkinizita.net&gt;</author>
- <pads>
- <caps>
- <name>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 &lt;fons@kokkinizita.net&gt;</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 &lt;fons@kokkinizita.net&gt;</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 &lt;fons@kokkinizita.net&gt;</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 &lt;fons@kokkinizita.net&gt;</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 &lt;fons@kokkinizita.net&gt;</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 &lt;fons@kokkinizita.net&gt;</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 &lt;fons@kokkinizita.net&gt;</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 &lt;fons.adriaensen@alcatel.be&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Chorus2</name>
- <longname>Chorus2 - Based on CSound orchestra by Sean Costello</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Chorus2 - Based on CSound orchestra by Sean Costello</description>
- <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-G2reverb</name>
- <longname>Stereo reverb</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Stereo reverb</description>
- <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
- <pads>
- <caps>
- <name>Out_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Out_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>In_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>In_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-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 &lt;fons.adriaensen@skynet.be&gt;</author>
- <pads>
- <caps>
- <name>Exp_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Mvclpf-1</name>
- <longname>Mvclpf-1 Digital implementation of the VC filter invented by R.A.Moog</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Mvclpf-1 Digital implementation of the VC filter invented by R.A.Moog</description>
- <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
- <pads>
- <caps>
- <name>Resonance</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Exp_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Mvclpf-2</name>
- <longname>Mvclpf-2 Digital implementation of the VC filter invented by R.A.Moog</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Mvclpf-2 Digital implementation of the VC filter invented by R.A.Moog</description>
- <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
- <pads>
- <caps>
- <name>Resonance</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Exp_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Mvclpf-3</name>
- <longname>Mvclpf-3 Digital implementation of the VC filter invented by R.A.Moog</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Mvclpf-3 Digital implementation of the VC filter invented by R.A.Moog</description>
- <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
- <pads>
- <caps>
- <name>Resonance</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Exp_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Mvclpf-4</name>
- <longname>Mvclpf-4 Digital implementation of the VC filter invented by R.A.Moog</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Mvclpf-4 Digital implementation of the VC filter invented by R.A.Moog</description>
- <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
- <pads>
- <caps>
- <name>Resonance</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Exp_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Parametric1</name>
- <longname>4-band parametric filter</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>4-band parametric filter</description>
- <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-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 &lt;fons.adriaensen@alcatel.be&gt;</author>
- <pads>
- <caps>
- <name>Lin_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Exp_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Phaser1+LFO</name>
- <longname>Phaser1 with LFO</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Phaser1 with LFO</description>
- <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Pulse-VCO</name>
- <longname>Pulse-VCO -- Anti-aliased oscillator</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Pulse-VCO -- Anti-aliased oscillator</description>
- <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
- <pads>
- <caps>
- <name>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 &lt;fons.adriaensen@alcatel.be&gt;</author>
- <pads>
- <caps>
- <name>Sync</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Mod</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Lin_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Exp_FM</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Frequency</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-Saw-VCO</name>
- <longname>Saw-VCO -- Anti-aliased oscillator</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Saw-VCO -- Anti-aliased oscillator</description>
- <author>Fons Adriaensen &lt;fons.adriaensen@alcatel.be&gt;</author>
- <pads>
- <caps>
- <name>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 &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-allpass-c</name>
- <longname>Allpass delay line, cubic spline interpolation</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
- <description>Allpass delay line, cubic spline interpolation</description>
- <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-allpass-l</name>
- <longname>Allpass delay line, linear interpolation</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
- <description>Allpass delay line, linear interpolation</description>
- <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-allpass-n</name>
- <longname>Allpass delay line, noninterpolating</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
- <description>Allpass delay line, noninterpolating</description>
- <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-amPitchshift</name>
- <longname>AM pitchshifter</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/Pitch shifters</class>
- <description>AM pitchshifter</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-amp</name>
- <longname>Simple amplifier</longname>
- <class>Filter/Effect/Audio/LADSPA/Amplitude/Amplifiers</class>
- <description>Simple amplifier</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-amp-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 &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-artificialLatency</name>
- <longname>Artificial latency</longname>
- <class>Filter/Effect/Audio/LADSPA/Utilities</class>
- <description>Artificial latency</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-autoPhaser</name>
- <longname>Auto phaser</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Phasers</class>
- <description>Auto phaser</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-bandpass-a-iir</name>
- <longname>Glame Bandpass Analog Filter</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/Bandpass/Filters</class>
- <description>Glame Bandpass Analog Filter</description>
- <author>Alexander Ehlert &lt;mag@glame.de&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-bandpass-iir</name>
- <longname>Glame Bandpass Filter</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/Bandpass/Filters</class>
- <description>Glame Bandpass Filter</description>
- <author>Alexander Ehlert &lt;mag@glame.de&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-bodeShifter</name>
- <longname>Bode frequency shifter</longname>
- <class>Filter/Effect/Audio/LADSPA/Spectral</class>
- <description>Bode frequency shifter</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Up_out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Down_out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-bodeShifterCV</name>
- <longname>Bode frequency shifter (CV)</longname>
- <class>Filter/Effect/Audio/LADSPA/Spectral</class>
- <description>Bode frequency shifter (CV)</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Mix_out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Up_out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Down_out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Shift_CV</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-butthigh-iir</name>
- <longname>GLAME Butterworth Highpass</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/Highpass/Filters</class>
- <description>GLAME Butterworth Highpass</description>
- <author>Alexander Ehlert &lt;mag@glame.de&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-buttlow-iir</name>
- <longname>GLAME Butterworth Lowpass</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/Lowpass/Filters</class>
- <description>GLAME Butterworth Lowpass</description>
- <author>Alexander Ehlert &lt;mag@glame.de&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-bwxover-iir</name>
- <longname>Glame Butterworth X-over Filter</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/Bandpass/Filters</class>
- <description>Glame Butterworth X-over Filter</description>
- <author>Alexander Ehlert &lt;mag@glame.de&gt;</author>
- <pads>
- <caps>
- <name>HP-Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>LP-Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-chebstortion</name>
- <longname>Chebyshev distortion</longname>
- <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
- <description>Chebyshev distortion</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-comb</name>
- <longname>Comb Filter</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/Combs/Filters</class>
- <description>Comb Filter</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-comb-c</name>
- <longname>Comb delay line, cubic spline interpolation</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
- <description>Comb delay line, cubic spline interpolation</description>
- <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-comb-l</name>
- <longname>Comb delay line, linear interpolation</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
- <description>Comb delay line, linear interpolation</description>
- <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-comb-n</name>
- <longname>Comb delay line, noninterpolating</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
- <description>Comb delay line, noninterpolating</description>
- <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-combSplitter</name>
- <longname>Comb Splitter</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/Combs/Filters</class>
- <description>Comb Splitter</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output_2</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output_1</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-const</name>
- <longname>Constant Signal Generator</longname>
- <class>Filter/Effect/Audio/LADSPA/Utilities</class>
- <description>Constant Signal Generator</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-crossoverDist</name>
- <longname>Crossover distortion</longname>
- <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
- <description>Crossover distortion</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-dcRemove</name>
- <longname>DC Offset Remover</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>DC Offset Remover</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-decay</name>
- <longname>Exponential signal decay</longname>
- <class>Filter/Effect/Audio/LADSPA/Utilities</class>
- <description>Exponential signal decay</description>
- <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-decimator</name>
- <longname>Decimator</longname>
- <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
- <description>Decimator</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-declip</name>
- <longname>Declipper</longname>
- <class>Filter/Effect/Audio/LADSPA/Amplitude/Waveshapers</class>
- <description>Declipper</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-delay-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 &lt;wingo at pobox dot com&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-delay-l</name>
- <longname>Simple delay line, linear interpolation</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
- <description>Simple delay line, linear interpolation</description>
- <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-delay-n</name>
- <longname>Simple delay line, noninterpolating</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
- <description>Simple delay line, noninterpolating</description>
- <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-delayorama</name>
- <longname>Delayorama</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
- <description>Delayorama</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-diode</name>
- <longname>Diode Processor</longname>
- <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
- <description>Diode Processor</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-divider</name>
- <longname>Audio Divider (Suboctave Generator)</longname>
- <class>Filter/Effect/Audio/LADSPA/Generators</class>
- <description>Audio Divider (Suboctave Generator)</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-dj-eq</name>
- <longname>DJ EQ</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/EQs</class>
- <description>DJ EQ</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-dj-eq-mono</name>
- <longname>DJ EQ (mono)</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/EQs</class>
- <description>DJ EQ (mono)</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-djFlanger</name>
- <longname>DJ flanger</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Flangers</class>
- <description>DJ flanger</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-dysonCompress</name>
- <longname>Dyson compressor</longname>
- <class>Filter/Effect/Audio/LADSPA/Compressors/Amplitude/Dynamics</class>
- <description>Dyson compressor</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-fadDelay</name>
- <longname>Fractionally Addressed Delay Line</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
- <description>Fractionally Addressed Delay Line</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-fastLookaheadLimiter</name>
- <longname>Fast Lookahead limiter</longname>
- <class>Filter/Effect/Audio/LADSPA/Limiters/Amplitude/Dynamics</class>
- <description>Fast Lookahead limiter</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output_2</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output_1</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_2</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_1</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-flanger</name>
- <longname>Flanger</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Flangers</class>
- <description>Flanger</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-fmOsc</name>
- <longname>FM Oscillator</longname>
- <class>Filter/Effect/Audio/LADSPA/Generators/Oscillators</class>
- <description>FM Oscillator</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Frequency_-Hz-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-foldover</name>
- <longname>Foldover distortion</longname>
- <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
- <description>Foldover distortion</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-fourByFourPole</name>
- <longname>4 x 4 pole allpass</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/Filters/Allpass</class>
- <description>4 x 4 pole allpass</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-foverdrive</name>
- <longname>Fast overdrive</longname>
- <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
- <description>Fast overdrive</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-freqTracker</name>
- <longname>Frequency tracker</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/Measurement</class>
- <description>Frequency tracker</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Frequency_-Hz-</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-gate</name>
- <longname>Gate</longname>
- <class>Filter/Effect/Audio/LADSPA/Gates/Amplitude/Dynamics</class>
- <description>Gate</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-giantFlange</name>
- <longname>Giant flange</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Flangers</class>
- <description>Giant flange</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-gong</name>
- <longname>Gong model</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Gong model</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-gongBeater</name>
- <longname>Gong beater</longname>
- <class>Filter/Effect/Audio/LADSPA/Generators</class>
- <description>Gong beater</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-gsm</name>
- <longname>GSM simulator</longname>
- <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
- <description>GSM simulator</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-gverb</name>
- <longname>GVerb</longname>
- <class>Filter/Effect/Audio/LADSPA/Reverbs/Time/Simulators</class>
- <description>GVerb</description>
- <author>Juhana Sadeharju &lt;kouhia at nic.funet.fi&gt;, LADSPAification by Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Right_output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Left_output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-hardLimiter</name>
- <longname>Hard Limiter</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Hard Limiter</description>
- <author>Marcus Andersson</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-harmonicGen</name>
- <longname>Harmonic generator</longname>
- <class>Filter/Effect/Audio/LADSPA/Generators</class>
- <description>Harmonic generator</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-hermesFilter</name>
- <longname>Hermes Filter</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/Filters</class>
- <description>Hermes Filter</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-highpass-iir</name>
- <longname>Glame Highpass Filter</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/Highpass/Filters</class>
- <description>Glame Highpass Filter</description>
- <author>Alexander Ehlert &lt;mag@glame.de&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-hilbert</name>
- <longname>Hilbert transformer</longname>
- <class>Filter/Effect/Audio/LADSPA/Utilities</class>
- <description>Hilbert transformer</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>90deg_output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>0deg_output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-hpf</name>
<longname>Simple High Pass Filter</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -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 &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-impulse-fc</name>
- <longname>Nonbandlimited single-sample impulses (Frequency: Control)</longname>
- <class>Source/Audio/LADSPA/Utilities</class>
- <description>Nonbandlimited single-sample impulses (Frequency: Control)</description>
- <author>Andy Wingo &lt;wingo at pobox dot com&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-inv</name>
- <longname>Inverter</longname>
- <class>Filter/Effect/Audio/LADSPA/Utilities</class>
- <description>Inverter</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-karaoke</name>
- <longname>Karaoke</longname>
- <class>Filter/Effect/Audio/LADSPA/Utilities</class>
- <description>Karaoke</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Right_out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Left_out</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Right_in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Left_in</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-lcrDelay</name>
- <longname>L/C/R Delay</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
- <description>L/C/R Delay</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>R_output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>L_output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>R_input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>L_input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-lfoPhaser</name>
- <longname>LFO Phaser</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Phasers</class>
- <description>LFO Phaser</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-lowpass-iir</name>
- <longname>Glame Lowpass Filter</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/Lowpass/Filters</class>
- <description>Glame Lowpass Filter</description>
- <author>Alexander Ehlert &lt;mag@glame.de&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-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 &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-matrixMSSt</name>
- <longname>Matrix: MS to Stereo</longname>
- <class>Filter/Effect/Audio/LADSPA/Utilities</class>
- <description>Matrix: MS to Stereo</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Right</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Left</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Side</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Mid</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-matrixSpatialiser</name>
- <longname>Matrix Spatialiser</longname>
- <class>Filter/Effect/Audio/LADSPA/Utilities</class>
- <description>Matrix Spatialiser</description>
- <author>Joern Nettingsmeier &lt;nettings@folkwang-hochschule.de&gt;</author>
- <pads>
- <caps>
- <name>Output_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-matrixStMS</name>
- <longname>Matrix: Stereo to MS</longname>
- <class>Filter/Effect/Audio/LADSPA/Utilities</class>
- <description>Matrix: Stereo to MS</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Side</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Mid</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Right</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Left</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-mbeq</name>
- <longname>Multiband EQ</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/Multiband/EQs</class>
- <description>Multiband EQ</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-modDelay</name>
- <longname>Modulatable delay</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
- <description>Modulatable delay</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Delay_-s-</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-multivoiceChorus</name>
- <longname>Multivoice Chorus</longname>
- <class>Filter/Effect/Audio/LADSPA/Chorus/Time</class>
- <description>Multivoice Chorus</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-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 &lt;mag@glame.de&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-pitchScale</name>
- <longname>Pitch Scaler</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/Pitch shifters</class>
- <description>Pitch Scaler</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-pitchScaleHQ</name>
- <longname>Higher Quality Pitch Scaler</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/Pitch shifters</class>
- <description>Higher Quality Pitch Scaler</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-plate</name>
- <longname>Plate reverb</longname>
- <class>Filter/Effect/Audio/LADSPA/Reverbs/Time/Simulators</class>
- <description>Plate reverb</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Right_output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Left_output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-pointerCastDistortion</name>
- <longname>Pointer cast distortion</longname>
- <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
- <description>Pointer cast distortion</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-rateShifter</name>
- <longname>Rate shifter</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/Pitch shifters</class>
- <description>Rate shifter</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-retroFlange</name>
- <longname>Retro Flanger</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Flangers</class>
- <description>Retro Flanger</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-revdelay</name>
- <longname>Reverse Delay (5s max)</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
- <description>Reverse Delay (5s max)</description>
- <author>Jesse Chappell &lt;jesse at essej dot net&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-ringmod-1i1o1l</name>
- <longname>Ringmod with LFO</longname>
- <class>Filter/Effect/Audio/LADSPA/Amplitude/Modulators</class>
- <description>Ringmod with LFO</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-ringmod-2i1o</name>
- <longname>Ringmod with two inputs</longname>
- <class>Filter/Effect/Audio/LADSPA/Amplitude/Modulators</class>
- <description>Ringmod with two inputs</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Modulator</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-satanMaximiser</name>
- <longname>Barry's Satan Maximiser</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Barry's Satan Maximiser</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-sc1</name>
- <longname>SC1</longname>
- <class>Filter/Effect/Audio/LADSPA/Compressors/Amplitude/Dynamics</class>
- <description>SC1</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-sc2</name>
- <longname>SC2</longname>
- <class>Filter/Effect/Audio/LADSPA/Compressors/Amplitude/Dynamics</class>
- <description>SC2</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Sidechain</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-sc3</name>
- <longname>SC3</longname>
- <class>Filter/Effect/Audio/LADSPA/Compressors/Amplitude/Dynamics</class>
- <description>SC3</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Right_output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Left_output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Right_input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Left_input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Sidechain</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-sc4</name>
- <longname>SC4</longname>
- <class>Filter/Effect/Audio/LADSPA/Compressors/Amplitude/Dynamics</class>
- <description>SC4</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Right_output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Left_output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Right_input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Left_input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-sc4m</name>
- <longname>SC4 mono</longname>
- <class>Filter/Effect/Audio/LADSPA/Compressors/Amplitude/Dynamics</class>
- <description>SC4 mono</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-se4</name>
- <longname>SE4</longname>
- <class>Filter/Effect/Audio/LADSPA/Compressors/Amplitude/Dynamics</class>
- <description>SE4</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Right_output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Left_output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Right_input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Left_input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-shaper</name>
- <longname>Wave shaper</longname>
- <class>Filter/Effect/Audio/LADSPA/Amplitude/Waveshapers</class>
- <description>Wave shaper</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-sifter</name>
- <longname>Signal sifter</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Signal sifter</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-sinCos</name>
- <longname>Sine + cosine oscillator</longname>
- <class>Source/Audio/LADSPA/Generators/Oscillators</class>
- <description>Sine + cosine oscillator</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Cosine_output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Sine_output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
<name>ladspa-sine-faaa</name>
<longname>Sine Oscillator (Freq:audio, Amp:audio)</longname>
<class>Filter/Effect/Audio/LADSPA</class>
@@ -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 &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-sinusWavewrapper</name>
- <longname>Sinus wavewrapper</longname>
- <class>Filter/Effect/Audio/LADSPA/Amplitude/Waveshapers</class>
- <description>Sinus wavewrapper</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-smoothDecimate</name>
- <longname>Smooth Decimator</longname>
- <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
- <description>Smooth Decimator</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-split</name>
- <longname>Mono to Stereo splitter</longname>
- <class>Filter/Effect/Audio/LADSPA/Utilities</class>
- <description>Mono to Stereo splitter</description>
- <author>Frank Neumann &lt;franky@users.sourceforge.net&gt;</author>
- <pads>
- <caps>
- <name>Output_2</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output_1</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-stepMuxer</name>
- <longname>Step Demuxer</longname>
- <class>Filter/Effect/Audio/LADSPA/Utilities</class>
- <description>Step Demuxer</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_8</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_7</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_6</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_5</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_4</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_3</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_2</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_1</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Clock</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-surroundEncoder</name>
- <longname>Surround matrix encoder</longname>
- <class>Filter/Effect/Audio/LADSPA/Utilities</class>
- <description>Surround matrix encoder</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Rt</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Lt</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>S</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>C</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-svf</name>
- <longname>State Variable Filter</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/Filters</class>
- <description>State Variable Filter</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tap-autopan</name>
- <longname>TAP AutoPanner</longname>
- <class>Filter/Effect/Audio/LADSPA/Amplitude/Modulators</class>
- <description>TAP AutoPanner</description>
- <author>Tom Szilagyi</author>
- <pads>
- <caps>
- <name>Output_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tap-chorusflanger</name>
- <longname>TAP Chorus/Flanger</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Flangers</class>
- <description>TAP Chorus/Flanger</description>
- <author>Tom Szilagyi</author>
- <pads>
- <caps>
- <name>Output_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tap-deesser</name>
- <longname>TAP DeEsser</longname>
- <class>Filter/Effect/Audio/LADSPA/Amplitude/Dynamics</class>
- <description>TAP DeEsser</description>
- <author>Tom Szilagyi</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tap-doubler</name>
- <longname>TAP Fractal Doubler</longname>
- <class>Filter/Effect/Audio/LADSPA/Simulators</class>
- <description>TAP Fractal Doubler</description>
- <author>Tom Szilagyi</author>
- <pads>
- <caps>
- <name>Output_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tap-dynamics-m</name>
- <longname>TAP Dynamics (M)</longname>
- <class>Filter/Effect/Audio/LADSPA/Amplitude/Dynamics</class>
- <description>TAP Dynamics (M)</description>
- <author>Tom Szilagyi</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tap-dynamics-st</name>
- <longname>TAP Dynamics (St)</longname>
- <class>Filter/Effect/Audio/LADSPA/Amplitude/Dynamics</class>
- <description>TAP Dynamics (St)</description>
- <author>Tom Szilagyi</author>
- <pads>
- <caps>
- <name>Output_Right</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output_Left</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_Right</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_Left</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tap-equalizer</name>
- <longname>TAP Equalizer</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/EQs</class>
- <description>TAP Equalizer</description>
- <author>Tom Szilagyi</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tap-equalizer-bw</name>
- <longname>TAP Equalizer/BW</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/EQs</class>
- <description>TAP Equalizer/BW</description>
- <author>Tom Szilagyi</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tap-limiter</name>
- <longname>TAP Scaling Limiter</longname>
- <class>Filter/Effect/Audio/LADSPA/Limiters/Amplitude/Dynamics</class>
- <description>TAP Scaling Limiter</description>
- <author>Tom Szilagyi</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tap-pinknoise</name>
- <longname>TAP Pink/Fractal Noise</longname>
- <class>Filter/Effect/Audio/LADSPA/Utilities</class>
- <description>TAP Pink/Fractal Noise</description>
- <author>Tom Szilagyi</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tap-pitch</name>
- <longname>TAP Pitch Shifter</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/Pitch shifters</class>
- <description>TAP Pitch Shifter</description>
- <author>Tom Szilagyi</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tap-reflector</name>
- <longname>TAP Reflector</longname>
- <class>Filter/Effect/Audio/LADSPA/Time</class>
- <description>TAP Reflector</description>
- <author>Tom Szilagyi</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tap-reverb</name>
- <longname>TAP Reverberator</longname>
- <class>Filter/Effect/Audio/LADSPA/Reverbs/Time/Simulators</class>
- <description>TAP Reverberator</description>
- <author>Tom Szilagyi</author>
- <pads>
- <caps>
- <name>Output_Right</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_Right</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output_Left</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_Left</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tap-rotspeak</name>
- <longname>TAP Rotary Speaker</longname>
- <class>Filter/Effect/Audio/LADSPA/Simulators</class>
- <description>TAP Rotary Speaker</description>
- <author>Tom Szilagyi</author>
- <pads>
- <caps>
- <name>Output_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tap-sigmoid</name>
- <longname>TAP Sigmoid Booster</longname>
- <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
- <description>TAP Sigmoid Booster</description>
- <author>Tom Szilagyi</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tap-stereo-echo</name>
- <longname>TAP Stereo Echo</longname>
- <class>Filter/Effect/Audio/LADSPA/Time/Delays</class>
- <description>TAP Stereo Echo</description>
- <author>Tom Szilagyi</author>
- <pads>
- <caps>
- <name>Output_Right</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_Right</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output_Left</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_Left</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tap-tremolo</name>
- <longname>TAP Tremolo</longname>
- <class>Filter/Effect/Audio/LADSPA/Amplitude/Modulators</class>
- <description>TAP Tremolo</description>
- <author>Tom Szilagyi</author>
- <pads>
- <caps>
- <name>Output_0</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_0</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tap-tubewarmth</name>
- <longname>TAP TubeWarmth</longname>
- <class>Filter/Effect/Audio/LADSPA/Simulators</class>
- <description>TAP TubeWarmth</description>
- <author>Tom Szilagyi</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tap-vibrato</name>
- <longname>TAP Vibrato</longname>
- <class>Filter/Effect/Audio/LADSPA/Amplitude/Modulators</class>
- <description>TAP Vibrato</description>
- <author>Tom Szilagyi</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-tapeDelay</name>
- <longname>Tape Delay Simulation</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Tape Delay Simulation</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-transient</name>
- <longname>Transient mangler</longname>
- <class>Filter/Effect/Audio/LADSPA/Amplitude/Dynamics</class>
- <description>Transient mangler</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-triplePara</name>
- <longname>Triple band parametric with shelves</longname>
- <class>Filter/Effect/Audio/LADSPA/Frequency/EQs/Parametric</class>
- <description>Triple band parametric with shelves</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-valve</name>
- <longname>Valve saturation</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Valve saturation</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-valveRect</name>
- <longname>Valve rectifier</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Valve rectifier</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-vynil</name>
- <longname>VyNil (Vinyl Effect)</longname>
- <class>Filter/Effect/Audio/LADSPA/Distortions/Amplitude</class>
- <description>VyNil (Vinyl Effect)</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output_R</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output_L</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_R</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_L</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-waveTerrain</name>
- <longname>Wave Terrain Oscillator</longname>
- <class>Filter/Effect/Audio/LADSPA/Generators/Oscillators</class>
- <description>Wave Terrain Oscillator</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>z</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>y</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>x</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-xfade</name>
- <longname>Crossfade</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Crossfade</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output_right</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output_left</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_B_right</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_B_left</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_A_right</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_A_left</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-xfade4</name>
- <longname>Crossfade (4 outs)</longname>
- <class>Filter/Effect/Audio/LADSPA</class>
- <description>Crossfade (4 outs)</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output_B_right</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output_B_left</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output_A_right</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Output_A_left</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_B_right</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_B_left</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_A_right</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input_A_left</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
- <element>
- <name>ladspa-zm1</name>
- <longname>z-1</longname>
- <class>Filter/Effect/Audio/LADSPA/Utilities</class>
- <description>z-1</description>
- <author>Steve Harris &lt;steve@plugin.org.uk&gt;</author>
- <pads>
- <caps>
- <name>Output</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- <caps>
- <name>Input</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>audio/x-raw-float, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234</details>
- </caps>
- </pads>
- </element>
</elements>
</plugin> \ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-legacyresample.xml b/docs/plugins/inspect/plugin-legacyresample.xml
index 401c8705..e8b72df4 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.12</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 cd22b920..7582e6aa 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.11.1</version>
+ <version>0.10.12</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-metadata.xml b/docs/plugins/inspect/plugin-metadata.xml
index 2ee4dec7..05c4f451 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.11.1</version>
+ <version>0.10.12</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-mms.xml b/docs/plugins/inspect/plugin-mms.xml
index 43096f07..a434232a 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.11.1</version>
+ <version>0.10.12</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-modplug.xml b/docs/plugins/inspect/plugin-modplug.xml
index 8ed3885b..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.11.1</version>
+ <version>0.10.10</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-mpeg2enc.xml b/docs/plugins/inspect/plugin-mpeg2enc.xml
index 648a481f..aeed34c6 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.11</version>
+ <version>0.10.12</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 c5864a01..bedff713 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.11.1</version>
+ <version>0.10.12</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-mpegdemux2.xml b/docs/plugins/inspect/plugin-mpegdemux2.xml
index 769a3af5..959b7a4b 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.11.1</version>
+ <version>0.10.12</version>
<license>unknown</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-mpegtsmux.xml b/docs/plugins/inspect/plugin-mpegtsmux.xml
index 79b43760..2e1084af 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.11.1</version>
+ <version>0.10.12</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-mpegvideoparse.xml b/docs/plugins/inspect/plugin-mpegvideoparse.xml
index 53588b80..dbf663d3 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.11.1</version>
+ <version>0.10.12</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-mplex.xml b/docs/plugins/inspect/plugin-mplex.xml
index af5cb223..cdd16c37 100644
--- a/docs/plugins/inspect/plugin-mplex.xml
+++ b/docs/plugins/inspect/plugin-mplex.xml
@@ -3,10 +3,10 @@
<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.9.1</version>
+ <version>0.10.12</version>
<license>GPL</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-musepack.xml b/docs/plugins/inspect/plugin-musepack.xml
index 8ae20d01..c0b0823a 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.11.1</version>
+ <version>0.10.12</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>
@@ -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 414f3d20..6df560cd 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.11.1</version>
+ <version>0.10.12</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-mve.xml b/docs/plugins/inspect/plugin-mve.xml
index ba546161..4ad0b598 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.11.1</version>
+ <version>0.10.12</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-mxf.xml b/docs/plugins/inspect/plugin-mxf.xml
index 4de635a6..27c152ad 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.11.1</version>
+ <version>0.10.12</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-mythtv.xml b/docs/plugins/inspect/plugin-mythtv.xml
index 6f4d0b54..81b309fb 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.11.1</version>
+ <version>0.10.12</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-nas.xml b/docs/plugins/inspect/plugin-nas.xml
index 29cf4b9b..01b60e53 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.11.1</version>
+ <version>0.10.12</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-neon.xml b/docs/plugins/inspect/plugin-neon.xml
index aa7e7511..bce0ddd8 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.11.1</version>
+ <version>0.10.12</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-nsfdec.xml b/docs/plugins/inspect/plugin-nsfdec.xml
index f3c5bc09..e034cbb7 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.11.1</version>
+ <version>0.10.12</version>
<license>GPL</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-nuvdemux.xml b/docs/plugins/inspect/plugin-nuvdemux.xml
index 84891954..7e127f8b 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.11.1</version>
+ <version>0.10.12</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-ofa.xml b/docs/plugins/inspect/plugin-ofa.xml
index f9343810..74aad399 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.11.1</version>
+ <version>0.10.12</version>
<license>GPL</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-oss4.xml b/docs/plugins/inspect/plugin-oss4.xml
index 55258802..bb34fea1 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.11.1</version>
+ <version>0.10.12</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-pcapparse.xml b/docs/plugins/inspect/plugin-pcapparse.xml
index c7606d2c..251eefde 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.11.1</version>
+ <version>0.10.12</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 b0f56196..9f664379 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.11.1</version>
+ <version>0.10.12</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>gsoc2008 package</package>
@@ -20,7 +20,7 @@
<name>video_%d</name>
<direction>sink</direction>
<presence>request</presence>
- <details>video/x-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-h264, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ <details>video/x-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-divx, divxversion=(int)5, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-h264, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
</caps>
<caps>
<name>audio_%d</name>
@@ -32,7 +32,7 @@
<name>src</name>
<direction>source</direction>
<presence>always</presence>
- <details>application/x-3gp</details>
+ <details>video/quicktime, variant=(string)3gpp</details>
</caps>
</pads>
</element>
@@ -86,7 +86,7 @@
<name>src</name>
<direction>source</direction>
<presence>always</presence>
- <details>video/quicktime</details>
+ <details>video/quicktime, variant=(string)iso</details>
</caps>
</pads>
</element>
@@ -113,7 +113,7 @@
<name>src</name>
<direction>source</direction>
<presence>always</presence>
- <details>video/quicktime</details>
+ <details>video/quicktime, variant=(string)apple</details>
</caps>
</pads>
</element>
diff --git a/docs/plugins/inspect/plugin-rawparse.xml b/docs/plugins/inspect/plugin-rawparse.xml
index 26363e48..5d96a9dc 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.11.1</version>
+ <version>0.10.12</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-real.xml b/docs/plugins/inspect/plugin-real.xml
index a20b2be8..c47ad40e 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.11.1</version>
+ <version>0.10.12</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-resindvd.xml b/docs/plugins/inspect/plugin-resindvd.xml
index a5f669de..159dfde4 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.11.1</version>
+ <version>0.10.12</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 d22dc398..20bf6b36 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.11.1</version>
+ <version>0.10.12</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-rtpmux.xml b/docs/plugins/inspect/plugin-rtpmux.xml
index 467f3124..4adc8799 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.11.1</version>
+ <version>0.10.12</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-scaletempo.xml b/docs/plugins/inspect/plugin-scaletempo.xml
index 16d4def8..ca7cb44c 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.11.1</version>
+ <version>0.10.12</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 46f357c5..4047dd24 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.11.1</version>
+ <version>0.10.12</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-sdp.xml b/docs/plugins/inspect/plugin-sdp.xml
index 0d25b34b..52f79329 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.11.1</version>
+ <version>0.10.12</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-selector.xml b/docs/plugins/inspect/plugin-selector.xml
index ce4bdc5c..6f4e9b9d 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.11.1</version>
+ <version>0.10.12</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-sndfile.xml b/docs/plugins/inspect/plugin-sndfile.xml
index af3fdc42..cc52fb63 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.11.1</version>
+ <version>0.10.12</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-soundtouch.xml b/docs/plugins/inspect/plugin-soundtouch.xml
index f073ffcb..2362b104 100644
--- a/docs/plugins/inspect/plugin-soundtouch.xml
+++ b/docs/plugins/inspect/plugin-soundtouch.xml
@@ -3,7 +3,7 @@
<description>Audio Pitch Controller &amp; BPM Detection</description>
<filename>../../ext/soundtouch/.libs/libgstsoundtouch.so</filename>
<basename>libgstsoundtouch.so</basename>
- <version>0.10.11</version>
+ <version>0.10.12</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-spcdec.xml b/docs/plugins/inspect/plugin-spcdec.xml
index fa39a614..8c852b08 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.11</version>
+ <version>0.10.12</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 80f69e21..c86c002f 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.11.1</version>
+ <version>0.10.12</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-stereo.xml b/docs/plugins/inspect/plugin-stereo.xml
index 4b08e8d4..795fe63c 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.11.1</version>
+ <version>0.10.12</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-subenc.xml b/docs/plugins/inspect/plugin-subenc.xml
index f3951b95..5e64469e 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.11.1</version>
+ <version>0.10.12</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-tta.xml b/docs/plugins/inspect/plugin-tta.xml
index cc27956c..2ca01490 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.11.1</version>
+ <version>0.10.12</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-valve.xml b/docs/plugins/inspect/plugin-valve.xml
index 55e85654..977fdf23 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.11.1</version>
+ <version>0.10.12</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-vcdsrc.xml b/docs/plugins/inspect/plugin-vcdsrc.xml
index 3b66f401..09414b54 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.11.1</version>
+ <version>0.10.12</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-videosignal.xml b/docs/plugins/inspect/plugin-videosignal.xml
index 47f1a8cb..79720091 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.11.1</version>
+ <version>0.10.12</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-vmnc.xml b/docs/plugins/inspect/plugin-vmnc.xml
index d1880676..7baa0743 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.11.1</version>
+ <version>0.10.12</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-wildmidi.xml b/docs/plugins/inspect/plugin-wildmidi.xml
index d6479b22..904ae28b 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.11.1</version>
+ <version>0.10.12</version>
<license>GPL</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-x264.xml b/docs/plugins/inspect/plugin-x264.xml
index a449eeef..be47f395 100644
--- a/docs/plugins/inspect/plugin-x264.xml
+++ b/docs/plugins/inspect/plugin-x264.xml
@@ -3,10 +3,10 @@
<description>libx264-based H264 plugins</description>
<filename>../../ext/x264/.libs/libgstx264.so</filename>
<basename>libgstx264.so</basename>
- <version>0.10.11.1</version>
+ <version>0.10.12</version>
<license>GPL</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-xdgmime.xml b/docs/plugins/inspect/plugin-xdgmime.xml
index 7c276fac..4f725957 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.11.1</version>
+ <version>0.10.12</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>
diff --git a/docs/plugins/inspect/plugin-xvid.xml b/docs/plugins/inspect/plugin-xvid.xml
index efaf16e7..87de1d95 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.11.1</version>
+ <version>0.10.12</version>
<license>GPL</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-y4menc.xml b/docs/plugins/inspect/plugin-y4menc.xml
deleted file mode 100644
index 6aaf4738..00000000
--- a/docs/plugins/inspect/plugin-y4menc.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<plugin>
- <name>y4menc</name>
- <description>Encodes a YUV frame into the yuv4mpeg format (mjpegtools)</description>
- <filename>../../gst/y4m/.libs/libgsty4menc.so</filename>
- <basename>libgsty4menc.so</basename>
- <version>0.10.11.1</version>
- <license>LGPL</license>
- <source>gst-plugins-bad</source>
- <package>GStreamer Bad Plug-ins CVS/prerelease</package>
- <origin>Unknown package origin</origin>
- <elements>
- <element>
- <name>y4menc</name>
- <longname>YUV4MPEG video encoder</longname>
- <class>Codec/Encoder/Video</class>
- <description>Encodes a YUV frame into the yuv4mpeg format (mjpegtools)</description>
- <author>Wim Taymans &lt;wim.taymans@chello.be&gt;</author>
- <pads>
- <caps>
- <name>sink</name>
- <direction>sink</direction>
- <presence>always</presence>
- <details>video/x-raw-yuv, format=(fourcc){ IYUV, I420 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
- </caps>
- <caps>
- <name>src</name>
- <direction>source</direction>
- <presence>always</presence>
- <details>application/x-yuv4mpeg, y4mversion=(int)2</details>
- </caps>
- </pads>
- </element>
- </elements>
-</plugin> \ No newline at end of file
diff --git a/ext/celt/gstceltenc.c b/ext/celt/gstceltenc.c
index 11b57e55..58ed7571 100644
--- a/ext/celt/gstceltenc.c
+++ b/ext/celt/gstceltenc.c
@@ -106,9 +106,16 @@ static void
gst_celt_enc_setup_interfaces (GType celtenc_type)
{
static const GInterfaceInfo tag_setter_info = { NULL, NULL, NULL };
+ const GInterfaceInfo preset_interface_info = {
+ NULL, /* interface_init */
+ NULL, /* interface_finalize */
+ NULL /* interface_data */
+ };
g_type_add_interface_static (celtenc_type, GST_TYPE_TAG_SETTER,
&tag_setter_info);
+ g_type_add_interface_static (celtenc_type, GST_TYPE_PRESET,
+ &preset_interface_info);
GST_DEBUG_CATEGORY_INIT (celtenc_debug, "celtenc", 0, "Celt encoder");
}
diff --git a/ext/dirac/gstdiracenc.cc b/ext/dirac/gstdiracenc.cc
index f3be8202..11372f89 100644
--- a/ext/dirac/gstdiracenc.cc
+++ b/ext/dirac/gstdiracenc.cc
@@ -148,7 +148,21 @@ GST_STATIC_PAD_TEMPLATE ("src",
GST_STATIC_CAPS ("video/x-dirac")
);
-GST_BOILERPLATE (GstDiracEnc, gst_dirac_enc, GstElement, GST_TYPE_ELEMENT);
+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 (GstDiracEnc, gst_dirac_enc, GstElement, GST_TYPE_ELEMENT,
+ _do_init);
static void
gst_dirac_enc_base_init (gpointer g_class)
diff --git a/ext/dts/gstdtsdec.c b/ext/dts/gstdtsdec.c
index 5b85a803..08695936 100644
--- a/ext/dts/gstdtsdec.c
+++ b/ext/dts/gstdtsdec.c
@@ -1,5 +1,6 @@
/* GStreamer DTS decoder plugin based on libdtsdec
* Copyright (C) 2004 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright (C) 2009 Jan Schmidt <thaytan@noraisin.net>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -84,43 +85,46 @@ typedef struct dts_state_s dca_state_t;
#include <liboil/liboilcpu.h>
#include <liboil/liboilfunction.h>
-GST_DEBUG_CATEGORY_STATIC (dtsdec_debug);
-#define GST_CAT_DEFAULT (dtsdec_debug)
-
static const GstElementDetails gst_dtsdec_details =
GST_ELEMENT_DETAILS ("DTS audio decoder",
"Codec/Decoder/Audio",
"Decodes DTS audio streams",
+ "Jan Schmidt <thaytan@noraisin.net>\n"
"Ronald Bultje <rbultje@ronald.bitfreak.net>");
+#if defined(LIBDTS_FIXED) || defined(LIBDCA_FIXED)
+#define SAMPLE_WIDTH 16
+#elif defined (LIBDTS_DOUBLE) || defined(LIBDCA_DOUBLE)
+#define SAMPLE_WIDTH 64
+#else
+#define SAMPLE_WIDTH 32
+#endif
+
+GST_DEBUG_CATEGORY_STATIC (dtsdec_debug);
+#define GST_CAT_DEFAULT (dtsdec_debug)
+
enum
{
ARG_0,
ARG_DRC
};
+
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
- GST_STATIC_CAPS ("audio/x-dts;" "audio/x-private1-dts")
+ GST_STATIC_CAPS ("audio/x-dts; audio/x-private1-dts")
);
#if defined(LIBDTS_FIXED) || defined(LIBDCA_FIXED)
#define DTS_CAPS "audio/x-raw-int, " \
"endianness = (int) " G_STRINGIFY (G_BYTE_ORDER) ", " \
"signed = (boolean) true, " \
- "width = (int) 16, " \
+ "width = (int) " G_STRINGIFY (SAMPLE_WIDTH) ", " \
"depth = (int) 16"
-#define SAMPLE_WIDTH 16
-#elif defined(LIBDTS_DOUBLE) || defined(LIBDCA_DOUBLE)
-#define DTS_CAPS "audio/x-raw-float, " \
- "endianness = (int) " G_STRINGIFY (G_BYTE_ORDER) ", " \
- "width = (int) 64"
-#define SAMPLE_WIDTH 64
#else
#define DTS_CAPS "audio/x-raw-float, " \
"endianness = (int) " G_STRINGIFY (G_BYTE_ORDER) ", " \
- "width = (int) 32"
-#define SAMPLE_WIDTH 32
+ "width = (int) " G_STRINGIFY (SAMPLE_WIDTH)
#endif
static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
@@ -135,6 +139,7 @@ GST_BOILERPLATE (GstDtsDec, gst_dtsdec, GstElement, GST_TYPE_ELEMENT);
static gboolean gst_dtsdec_sink_setcaps (GstPad * pad, GstCaps * caps);
static gboolean gst_dtsdec_sink_event (GstPad * pad, GstEvent * event);
static GstFlowReturn gst_dtsdec_chain (GstPad * pad, GstBuffer * buf);
+static GstFlowReturn gst_dtsdec_chain_raw (GstPad * pad, GstBuffer * buf);
static GstStateChangeReturn gst_dtsdec_change_state (GstElement * element,
GstStateChange transition);
@@ -155,7 +160,7 @@ gst_dtsdec_base_init (gpointer g_class)
gst_static_pad_template_get (&src_factory));
gst_element_class_set_details (element_class, &gst_dtsdec_details);
- GST_DEBUG_CATEGORY_INIT (dtsdec_debug, "dtsdec", 0, "DTS audio decoder");
+ GST_DEBUG_CATEGORY_INIT (dtsdec_debug, "dtsdec", 0, "DTS/DCA audio decoder");
}
static void
@@ -202,6 +207,7 @@ gst_dtsdec_class_init (GstDtsDecClass * klass)
static void
gst_dtsdec_init (GstDtsDec * dtsdec, GstDtsDecClass * g_class)
{
+ /* create the sink and src pads */
dtsdec->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink");
gst_pad_set_setcaps_function (dtsdec->sinkpad,
GST_DEBUG_FUNCPTR (gst_dtsdec_sink_setcaps));
@@ -212,10 +218,12 @@ gst_dtsdec_init (GstDtsDec * dtsdec, GstDtsDecClass * g_class)
gst_element_add_pad (GST_ELEMENT (dtsdec), dtsdec->sinkpad);
dtsdec->srcpad = gst_pad_new_from_static_template (&src_factory, "src");
- gst_pad_use_fixed_caps (dtsdec->srcpad);
gst_element_add_pad (GST_ELEMENT (dtsdec), dtsdec->srcpad);
+ dtsdec->request_channels = DCA_CHANNEL;
dtsdec->dynamic_range_compression = FALSE;
+
+ gst_segment_init (&dtsdec->segment, GST_FORMAT_UNDEFINED);
}
static gint
@@ -317,6 +325,105 @@ gst_dtsdec_channels (uint32_t flags, GstAudioChannelPosition ** pos)
return chans;
}
+static void
+clear_queued (GstDtsDec * dec)
+{
+ g_list_foreach (dec->queued, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (dec->queued);
+ dec->queued = NULL;
+}
+
+static GstFlowReturn
+flush_queued (GstDtsDec * dec)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ while (dec->queued) {
+ GstBuffer *buf = GST_BUFFER_CAST (dec->queued->data);
+
+ GST_LOG_OBJECT (dec, "pushing buffer %p, timestamp %"
+ GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT, buf,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
+
+ /* iterate ouput queue an push downstream */
+ ret = gst_pad_push (dec->srcpad, buf);
+
+ dec->queued = g_list_delete_link (dec->queued, dec->queued);
+ }
+ return ret;
+}
+
+static GstFlowReturn
+gst_dtsdec_drain (GstDtsDec * dec)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ if (dec->segment.rate < 0.0) {
+ /* if we have some queued frames for reverse playback, flush
+ * them now */
+ ret = flush_queued (dec);
+ }
+ return ret;
+}
+
+static GstFlowReturn
+gst_dtsdec_push (GstDtsDec * dtsdec,
+ GstPad * srcpad, int flags, sample_t * samples, GstClockTime timestamp)
+{
+ GstBuffer *buf;
+ int chans, n, c;
+ GstFlowReturn result;
+
+ flags &= (DCA_CHANNEL_MASK | DCA_LFE);
+ chans = gst_dtsdec_channels (flags, NULL);
+ if (!chans) {
+ GST_ELEMENT_ERROR (GST_ELEMENT (dtsdec), STREAM, DECODE, (NULL),
+ ("Invalid channel flags: %d", flags));
+ return GST_FLOW_ERROR;
+ }
+
+ result =
+ gst_pad_alloc_buffer_and_set_caps (srcpad, 0,
+ 256 * chans * (SAMPLE_WIDTH / 8), GST_PAD_CAPS (srcpad), &buf);
+ if (result != GST_FLOW_OK)
+ return result;
+
+ for (n = 0; n < 256; n++) {
+ for (c = 0; c < chans; c++) {
+ ((sample_t *) GST_BUFFER_DATA (buf))[n * chans + c] =
+ samples[c * 256 + n];
+ }
+ }
+ GST_BUFFER_TIMESTAMP (buf) = timestamp;
+ GST_BUFFER_DURATION (buf) = 256 * GST_SECOND / dtsdec->sample_rate;
+
+ result = GST_FLOW_OK;
+ if ((buf = gst_audio_buffer_clip (buf, &dtsdec->segment,
+ dtsdec->sample_rate, (SAMPLE_WIDTH / 8) * chans))) {
+ /* set discont when needed */
+ if (dtsdec->discont) {
+ GST_LOG_OBJECT (dtsdec, "marking DISCONT");
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
+ dtsdec->discont = FALSE;
+ }
+
+ if (dtsdec->segment.rate > 0.0) {
+ GST_DEBUG_OBJECT (dtsdec,
+ "Pushing buffer with ts %" GST_TIME_FORMAT " duration %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
+
+ result = gst_pad_push (srcpad, buf);
+ } else {
+ /* reverse playback, queue frame till later when we get a discont. */
+ GST_DEBUG_OBJECT (dtsdec, "queued frame");
+ dtsdec->queued = g_list_prepend (dtsdec->queued, buf);
+ }
+ }
+ return result;
+}
+
static gboolean
gst_dtsdec_renegotiate (GstDtsDec * dts)
{
@@ -360,32 +467,57 @@ gst_dtsdec_sink_event (GstPad * pad, GstEvent * event)
switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_NEWSEGMENT:{
GstFormat format;
- gint64 val;
-
- gst_event_parse_new_segment (event, NULL, NULL, &format, &val, NULL,
- NULL);
- if (format != GST_FORMAT_TIME || !GST_CLOCK_TIME_IS_VALID (val)) {
- GST_WARNING ("No time in newsegment event %p", event);
+ gboolean update;
+ gint64 start, end, pos;
+ gdouble rate;
+
+ gst_event_parse_new_segment (event, &update, &rate, &format, &start, &end,
+ &pos);
+
+ /* drain queued buffers before activating the segment so that we can clip
+ * against the old segment first */
+ gst_dtsdec_drain (dtsdec);
+
+ if (format != GST_FORMAT_TIME || !GST_CLOCK_TIME_IS_VALID (start)) {
+ GST_WARNING ("No time in newsegment event %p (format is %s)",
+ event, gst_format_get_name (format));
+ gst_event_unref (event);
+ dtsdec->sent_segment = FALSE;
+ /* set some dummy values, FIXME: do proper conversion */
+ dtsdec->time = start = pos = 0;
+ format = GST_FORMAT_TIME;
+ end = -1;
} else {
- dtsdec->current_ts = val;
+ dtsdec->time = start;
+ dtsdec->sent_segment = TRUE;
+ ret = gst_pad_push_event (dtsdec->srcpad, event);
}
- if (dtsdec->cache) {
- gst_buffer_unref (dtsdec->cache);
- dtsdec->cache = NULL;
- }
- ret = gst_pad_event_default (pad, event);
+ gst_segment_set_newsegment (&dtsdec->segment, update, rate, format, start,
+ end, pos);
break;
}
+ case GST_EVENT_TAG:
+ ret = gst_pad_push_event (dtsdec->srcpad, event);
+ break;
+ case GST_EVENT_EOS:
+ gst_dtsdec_drain (dtsdec);
+ ret = gst_pad_push_event (dtsdec->srcpad, event);
+ break;
+ case GST_EVENT_FLUSH_START:
+ ret = gst_pad_push_event (dtsdec->srcpad, event);
+ break;
case GST_EVENT_FLUSH_STOP:
if (dtsdec->cache) {
gst_buffer_unref (dtsdec->cache);
dtsdec->cache = NULL;
}
- ret = gst_pad_event_default (pad, event);
+ clear_queued (dtsdec);
+ gst_segment_init (&dtsdec->segment, GST_FORMAT_UNDEFINED);
+ ret = gst_pad_push_event (dtsdec->srcpad, event);
break;
default:
- ret = gst_pad_event_default (pad, event);
+ ret = gst_pad_push_event (dtsdec->srcpad, event);
break;
}
@@ -393,24 +525,6 @@ gst_dtsdec_sink_event (GstPad * pad, GstEvent * event)
return ret;
}
-static gboolean
-gst_dtsdec_sink_setcaps (GstPad * pad, GstCaps * caps)
-{
- GstDtsDec *dts = GST_DTSDEC (gst_pad_get_parent (pad));
- GstStructure *structure;
-
- structure = gst_caps_get_structure (caps, 0);
-
- if (structure && gst_structure_has_name (structure, "audio/x-private1-dts"))
- dts->dvdmode = TRUE;
- else
- dts->dvdmode = FALSE;
-
- gst_object_unref (dts);
-
- return TRUE;
-}
-
static void
gst_dtsdec_update_streaminfo (GstDtsDec * dts)
{
@@ -419,6 +533,7 @@ gst_dtsdec_update_streaminfo (GstDtsDec * dts)
taglist = gst_tag_list_new ();
gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND,
+ GST_TAG_AUDIO_CODEC, "DTS DCA",
GST_TAG_BITRATE, (guint) dts->bit_rate, NULL);
gst_element_found_tags_for_pad (GST_ELEMENT (dts), dts->srcpad, taglist);
@@ -428,29 +543,37 @@ static GstFlowReturn
gst_dtsdec_handle_frame (GstDtsDec * dts, guint8 * data,
guint length, gint flags, gint sample_rate, gint bit_rate)
{
+ gint channels, i, num_blocks;
gboolean need_renegotiation = FALSE;
- gint channels, num_blocks;
- GstBuffer *out;
- gint i, s, c, num_c;
- sample_t *samples;
- GstFlowReturn result = GST_FLOW_OK;
- /* go over stream properties, update caps/streaminfo if needed */
+ /* go over stream properties, renegotiate or update streaminfo if needed */
if (dts->sample_rate != sample_rate) {
need_renegotiation = TRUE;
dts->sample_rate = sample_rate;
}
- dts->stream_channels = flags;
+ if (flags) {
+ dts->stream_channels = flags & (DCA_CHANNEL_MASK | DCA_LFE);
+ }
if (bit_rate != dts->bit_rate) {
dts->bit_rate = bit_rate;
gst_dtsdec_update_streaminfo (dts);
}
- if (dts->request_channels == DCA_CHANNEL) {
+ /* If we haven't had an explicit number of channels chosen through properties
+ * at this point, choose what to downmix to now, based on what the peer will
+ * accept - this allows a52dec to do downmixing in preference to a
+ * downstream element such as audioconvert.
+ * FIXME: Add the property back in for forcing output channels.
+ */
+ if (dts->request_channels != DCA_CHANNEL) {
+ flags = dts->request_channels;
+ } else if (dts->flag_update) {
GstCaps *caps;
+ dts->flag_update = FALSE;
+
caps = gst_pad_get_allowed_caps (dts->srcpad);
if (caps && gst_caps_get_size (caps) > 0) {
GstCaps *copy = gst_caps_copy_nth (caps, 0);
@@ -472,38 +595,38 @@ gst_dtsdec_handle_frame (GstDtsDec * dts, guint8 * data,
flags ? gst_dtsdec_channels (flags, NULL) : 6);
gst_structure_get_int (structure, "channels", &channels);
if (channels <= 6)
- dts->request_channels = dts_channels[channels - 1];
+ flags = dts_channels[channels - 1];
else
- dts->request_channels = dts_channels[5];
+ flags = dts_channels[5];
gst_caps_unref (copy);
} else if (flags) {
- dts->request_channels = dts->stream_channels;
+ flags = dts->stream_channels;
} else {
- dts->request_channels = DCA_3F2R | DCA_LFE;
+ flags = DCA_3F2R | DCA_LFE;
}
if (caps)
gst_caps_unref (caps);
+ } else {
+ flags = dts->using_channels;
}
-
/* process */
- flags = dts->request_channels | DCA_ADJUST_LEVEL;
+ flags |= DCA_ADJUST_LEVEL;
dts->level = 1;
-
if (dca_frame (dts->state, data, &flags, &dts->level, dts->bias)) {
- GST_WARNING ("dts_frame error");
+ GST_WARNING_OBJECT (dts, "dts_frame error");
+ dts->discont = TRUE;
return GST_FLOW_OK;
}
-
channels = flags & (DCA_CHANNEL_MASK | DCA_LFE);
-
if (dts->using_channels != channels) {
need_renegotiation = TRUE;
dts->using_channels = channels;
}
- if (need_renegotiation == TRUE) {
+ /* negotiate if required */
+ if (need_renegotiation) {
GST_DEBUG ("dtsdec: sample_rate:%d stream_chans:0x%x using_chans:0x%x",
dts->sample_rate, dts->stream_channels, dts->using_channels);
if (!gst_dtsdec_renegotiate (dts)) {
@@ -520,107 +643,60 @@ gst_dtsdec_handle_frame (GstDtsDec * dts, guint8 * data,
num_blocks = dca_blocks_num (dts->state);
for (i = 0; i < num_blocks; i++) {
if (dca_block (dts->state)) {
- GST_WARNING ("dts_block error %d", i);
- continue;
- }
-
- samples = dca_samples (dts->state);
- num_c = gst_dtsdec_channels (dts->using_channels, NULL);
-
- result = gst_pad_alloc_buffer_and_set_caps (dts->srcpad, 0,
- (SAMPLE_WIDTH / 8) * 256 * num_c, GST_PAD_CAPS (dts->srcpad), &out);
-
- if (result != GST_FLOW_OK)
- break;
+ /* Ignore errors, but mark a discont */
+ GST_WARNING_OBJECT (dts, "dts_block error %d", i);
+ dts->discont = TRUE;
+ } else {
+ GstFlowReturn ret;
- GST_BUFFER_TIMESTAMP (out) = dts->current_ts;
- GST_BUFFER_DURATION (out) = GST_SECOND * 256 / dts->sample_rate;
- dts->current_ts += GST_BUFFER_DURATION (out);
-
- /* libdts returns buffers in 256-sample-blocks per channel,
- * we want interleaved. And we need to copy anyway... */
- data = GST_BUFFER_DATA (out);
- for (s = 0; s < 256; s++) {
- for (c = 0; c < num_c; c++) {
- *(sample_t *) data = samples[s + c * 256];
- data += (SAMPLE_WIDTH / 8);
- }
+ /* push on */
+ ret = gst_dtsdec_push (dts, dts->srcpad, dts->using_channels,
+ dts->samples, dts->time);
+ if (ret != GST_FLOW_OK)
+ return ret;
}
-
- /* push on */
- result = gst_pad_push (dts->srcpad, out);
-
- if (result != GST_FLOW_OK)
- break;
+ dts->time += GST_SECOND * 256 / dts->sample_rate;
}
- return result;
+ return GST_FLOW_OK;
}
-static GstFlowReturn
-gst_dtsdec_chain_raw (GstPad * pad, GstBuffer * buf)
+static gboolean
+gst_dtsdec_sink_setcaps (GstPad * pad, GstCaps * caps)
{
- GstDtsDec *dts;
- guint8 *data;
- gint size;
- gint length, flags, sample_rate, bit_rate, frame_length;
- GstFlowReturn result = GST_FLOW_OK;
-
- dts = GST_DTSDEC (GST_PAD_PARENT (pad));
-
- if (dts->cache) {
- buf = gst_buffer_join (dts->cache, buf);
- dts->cache = NULL;
- }
+ GstDtsDec *dts = GST_DTSDEC (gst_pad_get_parent (pad));
+ GstStructure *structure;
- data = GST_BUFFER_DATA (buf);
- size = GST_BUFFER_SIZE (buf);
- length = 0;
- while (size >= 7) {
- length = dca_syncinfo (dts->state, data, &flags,
- &sample_rate, &bit_rate, &frame_length);
- if (length == 0) {
- /* shift window to re-find sync */
- data++;
- size--;
- } else if (length <= size) {
- GST_DEBUG ("Sync: frame size %d", length);
- result = gst_dtsdec_handle_frame (dts, data, length,
- flags, sample_rate, bit_rate);
- if (result != GST_FLOW_OK) {
- size = 0;
- break;
- }
- size -= length;
- data += length;
- } else {
- GST_LOG ("Not enough data available (needed %d had %d)", length, size);
- break;
- }
- }
+ structure = gst_caps_get_structure (caps, 0);
- /* keep cache */
- if (length == 0) {
- GST_LOG ("No sync found");
- }
- if (size > 0) {
- dts->cache = gst_buffer_create_sub (buf,
- GST_BUFFER_SIZE (buf) - size, size);
- }
+ if (structure && gst_structure_has_name (structure, "audio/x-private1-dts"))
+ dts->dvdmode = TRUE;
+ else
+ dts->dvdmode = FALSE;
- gst_buffer_unref (buf);
+ gst_object_unref (dts);
- return result;
+ return TRUE;
}
-
static GstFlowReturn
gst_dtsdec_chain (GstPad * pad, GstBuffer * buf)
{
- GstFlowReturn res = GST_FLOW_OK;
+ GstFlowReturn ret = GST_FLOW_OK;
GstDtsDec *dts = GST_DTSDEC (GST_PAD_PARENT (pad));
gint first_access;
+ if (GST_BUFFER_IS_DISCONT (buf)) {
+ GST_LOG_OBJECT (dts, "received DISCONT");
+ gst_dtsdec_drain (dts);
+ /* clear cache on discont and mark a discont in the element */
+ if (dts->cache) {
+ gst_buffer_unref (dts->cache);
+ dts->cache = NULL;
+ }
+ dts->discont = TRUE;
+ }
+
if (dts->dvdmode) {
gint size = GST_BUFFER_SIZE (buf);
guint8 *data = GST_BUFFER_DATA (buf);
@@ -644,8 +720,8 @@ gst_dtsdec_chain (GstPad * pad, GstBuffer * buf)
subbuf = gst_buffer_create_sub (buf, offset, len);
GST_BUFFER_TIMESTAMP (subbuf) = GST_CLOCK_TIME_NONE;
- res = gst_dtsdec_chain_raw (pad, subbuf);
- if (res != GST_FLOW_OK)
+ ret = gst_dtsdec_chain_raw (pad, subbuf);
+ if (ret != GST_FLOW_OK)
goto done;
offset += len;
@@ -655,21 +731,20 @@ gst_dtsdec_chain (GstPad * pad, GstBuffer * buf)
subbuf = gst_buffer_create_sub (buf, offset, len);
GST_BUFFER_TIMESTAMP (subbuf) = GST_BUFFER_TIMESTAMP (buf);
- res = gst_dtsdec_chain_raw (pad, subbuf);
+ ret = gst_dtsdec_chain_raw (pad, subbuf);
}
} else {
- /* first_access = 0 or 1, so if there's a timestamp it applies
- * to the first byte */
+ /* first_access = 0 or 1, so if there's a timestamp it applies to the first byte */
subbuf = gst_buffer_create_sub (buf, offset, size - offset);
GST_BUFFER_TIMESTAMP (subbuf) = GST_BUFFER_TIMESTAMP (buf);
- res = gst_dtsdec_chain_raw (pad, subbuf);
+ ret = gst_dtsdec_chain_raw (pad, subbuf);
}
} else {
- res = gst_dtsdec_chain_raw (pad, buf);
+ ret = gst_dtsdec_chain_raw (pad, buf);
}
done:
- return res;
+ return ret;
/* ERRORS */
not_enough_data:
@@ -684,7 +759,97 @@ bad_first_access_parameter:
("Bad first_access parameter (%d) in buffer", first_access));
return GST_FLOW_ERROR;
}
+}
+
+static GstFlowReturn
+gst_dtsdec_chain_raw (GstPad * pad, GstBuffer * buf)
+{
+ GstDtsDec *dts;
+ guint8 *data;
+ gint size;
+ gint length = 0, flags, sample_rate, bit_rate, frame_length;
+ GstFlowReturn result = GST_FLOW_OK;
+
+ dts = GST_DTSDEC (GST_PAD_PARENT (pad));
+
+ if (!dts->sent_segment) {
+ GstSegment segment;
+
+ /* Create a basic segment. Usually, we'll get a new-segment sent by
+ * another element that will know more information (a demuxer). If we're
+ * just looking at a raw AC3 stream, we won't - so we need to send one
+ * here, but we don't know much info, so just send a minimal TIME
+ * new-segment event
+ */
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ gst_pad_push_event (dts->srcpad, gst_event_new_new_segment (FALSE,
+ segment.rate, segment.format, segment.start,
+ segment.duration, segment.start));
+ dts->sent_segment = TRUE;
+ }
+
+ /* merge with cache, if any. Also make sure timestamps match */
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
+ dts->time = GST_BUFFER_TIMESTAMP (buf);
+ GST_DEBUG_OBJECT (dts,
+ "Received buffer with ts %" GST_TIME_FORMAT " duration %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
+ }
+
+ if (dts->cache) {
+ buf = gst_buffer_join (dts->cache, buf);
+ dts->cache = NULL;
+ }
+ data = GST_BUFFER_DATA (buf);
+ size = GST_BUFFER_SIZE (buf);
+
+ /* find and read header */
+ bit_rate = dts->bit_rate;
+ sample_rate = dts->sample_rate;
+ flags = 0;
+ while (size >= 7) {
+ length = dca_syncinfo (dts->state, data, &flags,
+ &sample_rate, &bit_rate, &frame_length);
+
+ if (length == 0) {
+ /* shift window to re-find sync */
+ data++;
+ size--;
+ } else if (length <= size) {
+ GST_DEBUG ("Sync: frame size %d", length);
+ if (flags != dts->prev_flags)
+ dts->flag_update = TRUE;
+ dts->prev_flags = flags;
+
+ result = gst_dtsdec_handle_frame (dts, data, length,
+ flags, sample_rate, bit_rate);
+ if (result != GST_FLOW_OK) {
+ size = 0;
+ break;
+ }
+ size -= length;
+ data += length;
+ } else {
+ GST_LOG ("Not enough data available (needed %d had %d)", length, size);
+ break;
+ }
+ }
+
+ /* keep cache */
+ if (length == 0) {
+ GST_LOG ("No sync found");
+ }
+
+ if (size > 0) {
+ dts->cache = gst_buffer_create_sub (buf,
+ GST_BUFFER_SIZE (buf) - size, size);
+ }
+
+ gst_buffer_unref (buf);
+
+ return result;
}
static GstStateChangeReturn
@@ -705,13 +870,14 @@ gst_dtsdec_change_state (GstElement * element, GstStateChange transition)
dts->samples = dca_samples (dts->state);
dts->bit_rate = -1;
dts->sample_rate = -1;
- dts->stream_channels = 0;
- /* FIXME force stereo for now */
- dts->request_channels = DCA_CHANNEL;
- dts->using_channels = 0;
+ dts->stream_channels = DCA_CHANNEL;
+ dts->using_channels = DCA_CHANNEL;
dts->level = 1;
dts->bias = 0;
- dts->current_ts = 0;
+ dts->time = 0;
+ dts->sent_segment = FALSE;
+ dts->flag_update = TRUE;
+ gst_segment_init (&dts->segment, GST_FORMAT_UNDEFINED);
break;
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
break;
@@ -730,6 +896,7 @@ gst_dtsdec_change_state (GstElement * element, GstStateChange transition)
gst_buffer_unref (dts->cache);
dts->cache = NULL;
}
+ clear_queued (dts);
break;
case GST_STATE_CHANGE_READY_TO_NULL:
dca_free (dts->state);
diff --git a/ext/dts/gstdtsdec.h b/ext/dts/gstdtsdec.h
index 5222c687..a7c8f718 100644
--- a/ext/dts/gstdtsdec.h
+++ b/ext/dts/gstdtsdec.h
@@ -43,15 +43,22 @@ struct _GstDtsDec {
GstElement element;
/* pads */
- GstPad *sinkpad;
- GstPad *srcpad;
+ GstPad *sinkpad;
+ GstPad *srcpad;
+ GstSegment segment;
+
+ gboolean dvdmode;
+ gboolean sent_segment;
+ gboolean discont;
+ gboolean flag_update;
+ gboolean prev_flags;
/* stream properties */
- gint bit_rate;
- gint sample_rate;
- gint stream_channels;
- gint request_channels;
- gint using_channels;
+ gint bit_rate;
+ gint sample_rate;
+ gint stream_channels;
+ gint request_channels;
+ gint using_channels;
/* decoding properties */
sample_t level;
@@ -63,13 +70,14 @@ struct _GstDtsDec {
#else
dts_state_t *state;
#endif
- gboolean dvdmode;
+
/* Data left over from the previous buffer */
- GstBuffer *cache;
-
- /* keep track of time */
- GstClockTime current_ts;
+ GstBuffer *cache;
+ GstClockTime time;
+
+ /* reverse playback */
+ GList *queued;
};
struct _GstDtsDecClass {
diff --git a/ext/faac/gstfaac.c b/ext/faac/gstfaac.c
index 22484ffb..0dc8a42a 100644
--- a/ext/faac/gstfaac.c
+++ b/ext/faac/gstfaac.c
@@ -118,9 +118,17 @@ gst_faac_get_type (void)
0,
(GInstanceInitFunc) gst_faac_init,
};
+ const GInterfaceInfo preset_interface_info = {
+ NULL, /* interface_init */
+ NULL, /* interface_finalize */
+ NULL /* interface_data */
+ };
gst_faac_type = g_type_register_static (GST_TYPE_ELEMENT,
"GstFaac", &gst_faac_info, 0);
+
+ g_type_add_interface_static (gst_faac_type, GST_TYPE_PRESET,
+ &preset_interface_info);
}
return gst_faac_type;
@@ -798,7 +806,8 @@ gst_faac_change_state (GstElement * element, GstStateChange transition)
static gboolean
plugin_init (GstPlugin * plugin)
{
- return gst_element_register (plugin, "faac", GST_RANK_NONE, GST_TYPE_FAAC);
+ return gst_element_register (plugin, "faac", GST_RANK_SECONDARY,
+ GST_TYPE_FAAC);
}
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
diff --git a/ext/jp2k/gstjasperenc.c b/ext/jp2k/gstjasperenc.c
index 47818eb3..9e6e17c9 100644
--- a/ext/jp2k/gstjasperenc.c
+++ b/ext/jp2k/gstjasperenc.c
@@ -94,7 +94,21 @@ static GstFlowReturn gst_jasper_enc_chain (GstPad * pad, GstBuffer * buffer);
typedef GstJasperEnc GstJp2kEnc;
typedef GstJasperEncClass GstJp2kEncClass;
-GST_BOILERPLATE (GstJp2kEnc, gst_jasper_enc, GstElement, GST_TYPE_ELEMENT);
+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 (GstJp2kEnc, gst_jasper_enc, GstElement, GST_TYPE_ELEMENT,
+ _do_init);
static void
gst_jasper_enc_base_init (gpointer g_class)
diff --git a/ext/mpeg2enc/gstmpeg2enc.cc b/ext/mpeg2enc/gstmpeg2enc.cc
index e96e8124..64008b16 100644
--- a/ext/mpeg2enc/gstmpeg2enc.cc
+++ b/ext/mpeg2enc/gstmpeg2enc.cc
@@ -99,7 +99,21 @@ static void gst_mpeg2enc_get_property (GObject * object,
static void gst_mpeg2enc_set_property (GObject * object,
guint prop_id, const GValue * value, GParamSpec * pspec);
-GST_BOILERPLATE (GstMpeg2enc, gst_mpeg2enc, GstElement, GST_TYPE_ELEMENT);
+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 (GstMpeg2enc, gst_mpeg2enc, GstElement, GST_TYPE_ELEMENT,
+ _do_init);
static void
gst_mpeg2enc_base_init (gpointer klass)
@@ -703,7 +717,7 @@ plugin_init (GstPlugin * plugin)
mjpeg_default_handler_verbosity (0);
return gst_element_register (plugin, "mpeg2enc",
- GST_RANK_NONE, GST_TYPE_MPEG2ENC);
+ GST_RANK_SECONDARY, GST_TYPE_MPEG2ENC);
}
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
diff --git a/ext/neon/gstneonhttpsrc.c b/ext/neon/gstneonhttpsrc.c
index 739b0132..1af733db 100644
--- a/ext/neon/gstneonhttpsrc.c
+++ b/ext/neon/gstneonhttpsrc.c
@@ -63,6 +63,7 @@ static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
#define DEFAULT_IRADIO_GENRE NULL
#define DEFAULT_IRADIO_URL NULL
#define DEFAULT_AUTOMATIC_REDIRECT TRUE
+#define DEFAULT_ACCEPT_SELF_SIGNED FALSE
#define DEFAULT_NEON_HTTP_DEBUG FALSE
enum
@@ -76,6 +77,7 @@ enum
PROP_IRADIO_GENRE,
PROP_IRADIO_URL,
PROP_AUTOMATIC_REDIRECT,
+ PROP_ACCEPT_SELF_SIGNED,
#ifndef GST_DISABLE_GST_DEBUG
PROP_NEON_HTTP_DEBUG
#endif
@@ -200,6 +202,12 @@ gst_neonhttp_src_class_init (GstNeonhttpSrcClass * klass)
"Automatically follow HTTP redirects (HTTP Status Code 302/303)",
TRUE, G_PARAM_READWRITE));
+ g_object_class_install_property
+ (gobject_class, PROP_ACCEPT_SELF_SIGNED,
+ g_param_spec_boolean ("accept-self-signed", "accept-self-signed",
+ "Accept self-signed SSL/TLS certificates",
+ DEFAULT_ACCEPT_SELF_SIGNED, G_PARAM_READWRITE));
+
#ifndef GST_DISABLE_GST_DEBUG
g_object_class_install_property
(gobject_class, PROP_NEON_HTTP_DEBUG,
@@ -233,6 +241,7 @@ gst_neonhttp_src_init (GstNeonhttpSrc * src, GstNeonhttpSrcClass * g_class)
src->iradio_url = DEFAULT_IRADIO_URL;
src->user_agent = g_strdup (DEFAULT_USER_AGENT);
src->automatic_redirect = DEFAULT_AUTOMATIC_REDIRECT;
+ src->accept_self_signed = DEFAULT_ACCEPT_SELF_SIGNED;
src->session = NULL;
src->request = NULL;
@@ -332,28 +341,23 @@ gst_neonhttp_src_set_property (GObject * object, guint prop_id,
break;
}
case PROP_USER_AGENT:
- {
if (src->user_agent)
g_free (src->user_agent);
src->user_agent = g_strdup (g_value_get_string (value));
break;
- }
case PROP_IRADIO_MODE:
- {
src->iradio_mode = g_value_get_boolean (value);
break;
- }
case PROP_AUTOMATIC_REDIRECT:
- {
src->automatic_redirect = g_value_get_boolean (value);
break;
- }
+ case PROP_ACCEPT_SELF_SIGNED:
+ src->accept_self_signed = g_value_get_boolean (value);
+ break;
#ifndef GST_DISABLE_GST_DEBUG
case PROP_NEON_HTTP_DEBUG:
- {
src->neon_http_debug = g_value_get_boolean (value);
break;
- }
#endif
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -401,10 +405,8 @@ gst_neonhttp_src_get_property (GObject * object, guint prop_id,
break;
}
case PROP_USER_AGENT:
- {
g_value_set_string (value, neonhttpsrc->user_agent);
break;
- }
case PROP_IRADIO_MODE:
g_value_set_boolean (value, neonhttpsrc->iradio_mode);
break;
@@ -420,6 +422,9 @@ gst_neonhttp_src_get_property (GObject * object, guint prop_id,
case PROP_AUTOMATIC_REDIRECT:
g_value_set_boolean (value, neonhttpsrc->automatic_redirect);
break;
+ case PROP_ACCEPT_SELF_SIGNED:
+ g_value_set_boolean (value, neonhttpsrc->accept_self_signed);
+ break;
#ifndef GST_DISABLE_GST_DEBUG
case PROP_NEON_HTTP_DEBUG:
g_value_set_boolean (value, neonhttpsrc->neon_http_debug);
@@ -431,6 +436,13 @@ gst_neonhttp_src_get_property (GObject * object, guint prop_id,
}
}
+/* NEON CALLBACK */
+static void
+oom_callback ()
+{
+ GST_ERROR ("memory exeception in neon");
+}
+
static GstFlowReturn
gst_neonhttp_src_create (GstPushSrc * psrc, GstBuffer ** outbuf)
{
@@ -772,6 +784,37 @@ error:
}
}
+static int
+ssl_verify_callback (void *data, int failures, const ne_ssl_certificate * cert)
+{
+ GstNeonhttpSrc *src = GST_NEONHTTP_SRC (data);
+
+ if ((failures & NE_SSL_UNTRUSTED) &&
+ src->accept_self_signed && !ne_ssl_cert_signedby (cert)) {
+ GST_ELEMENT_INFO (src, RESOURCE, READ,
+ (NULL), ("Accepting self-signed server certificate"));
+
+ failures &= ~NE_SSL_UNTRUSTED;
+ }
+
+ if (failures & NE_SSL_NOTYETVALID)
+ GST_ELEMENT_ERROR (src, RESOURCE, READ,
+ (NULL), ("Server certificate not valid yet"));
+ if (failures & NE_SSL_EXPIRED)
+ GST_ELEMENT_ERROR (src, RESOURCE, READ,
+ (NULL), ("Server certificate has expired"));
+ if (failures & NE_SSL_IDMISMATCH)
+ GST_ELEMENT_ERROR (src, RESOURCE, READ,
+ (NULL), ("Server certificate doesn't match hostname"));
+ if (failures & NE_SSL_UNTRUSTED)
+ GST_ELEMENT_ERROR (src, RESOURCE, READ,
+ (NULL), ("Server certificate signer not trusted"));
+
+ GST_DEBUG_OBJECT (src, "failures: %d\n", failures);
+
+ return failures;
+}
+
/* Try to send the HTTP request to the Icecast server, and if possible deals with
* all the probable redirections (HTTP status code == 302/303)
*/
@@ -799,6 +842,7 @@ gst_neonhttp_src_send_request_and_redirect (GstNeonhttpSrc * src,
}
ne_set_session_flag (session, NE_SESSFLAG_ICYPROTO, 1);
+ ne_ssl_set_verify (session, ssl_verify_callback, src);
request = ne_request_create (session, "GET", src->query_string);
@@ -1014,13 +1058,6 @@ gst_neonhttp_src_uri_handler_init (gpointer g_iface, gpointer iface_data)
iface->set_uri = gst_neonhttp_src_uri_set_uri;
}
-/* NEON CALLBACK */
-static void
-oom_callback ()
-{
- GST_ERROR ("memory exeception in neon");
-}
-
/* entry point to initialize the plug-in
* initialize the plug-in itself
* register the element factories and pad templates
diff --git a/ext/neon/gstneonhttpsrc.h b/ext/neon/gstneonhttpsrc.h
index 68383485..f88c964c 100644
--- a/ext/neon/gstneonhttpsrc.h
+++ b/ext/neon/gstneonhttpsrc.h
@@ -71,6 +71,9 @@ struct _GstNeonhttpSrc {
/* enable Neon HTTP debug messages */
gboolean neon_http_debug;
+ /* accept self-signed certificates */
+ gboolean accept_self_signed;
+
gint64 read_position;
gboolean seekable;
};
diff --git a/ext/resindvd/gstmpegdemux.c b/ext/resindvd/gstmpegdemux.c
index d41ded0b..5ab26107 100644
--- a/ext/resindvd/gstmpegdemux.c
+++ b/ext/resindvd/gstmpegdemux.c
@@ -28,7 +28,8 @@
#include "gstmpegdefs.h"
#include "gstmpegdemux.h"
-#define SEGMENT_THRESHOLD (GST_SECOND/2)
+#define SEGMENT_THRESHOLD (300*GST_MSECOND)
+#define VIDEO_SEGMENT_THRESHOLD (500*GST_MSECOND)
/* The SCR_MUNGE value is used to offset the scr_adjust value, to avoid
* ever generating a negative timestamp */
@@ -248,6 +249,7 @@ gst_flups_demux_create_stream (GstFluPSDemux * demux, gint id, gint stream_type)
gchar *name;
GstFluPSDemuxClass *klass = GST_FLUPS_DEMUX_GET_CLASS (demux);
GstCaps *caps;
+ GstClockTime threshold = SEGMENT_THRESHOLD;
name = NULL;
template = NULL;
@@ -277,6 +279,7 @@ gst_flups_demux_create_stream (GstFluPSDemux * demux, gint id, gint stream_type)
caps = gst_caps_new_simple ("video/mpeg",
"mpegversion", G_TYPE_INT, mpeg_version,
"systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
+ threshold = VIDEO_SEGMENT_THRESHOLD;
break;
}
case ST_AUDIO_MPEG1:
@@ -296,6 +299,7 @@ gst_flups_demux_create_stream (GstFluPSDemux * demux, gint id, gint stream_type)
template = klass->video_template;
name = g_strdup_printf ("video_%02x", id);
caps = gst_caps_new_simple ("video/x-h264", NULL);
+ threshold = VIDEO_SEGMENT_THRESHOLD;
break;
case ST_PS_AUDIO_AC3:
template = klass->audio_template;
@@ -335,6 +339,7 @@ gst_flups_demux_create_stream (GstFluPSDemux * demux, gint id, gint stream_type)
stream->notlinked = FALSE;
stream->type = stream_type;
stream->pad = gst_pad_new_from_template (template, name);
+ stream->segment_thresh = threshold;
gst_pad_set_event_function (stream->pad, gst_flups_demux_src_event);
gst_pad_set_query_function (stream->pad, gst_flups_demux_src_query);
gst_pad_use_fixed_caps (stream->pad);
@@ -464,7 +469,7 @@ gst_flups_demux_clear_times (GstFluPSDemux * demux)
GstFluPSStream *stream = demux->streams[id];
if (stream) {
- stream->last_ts = GST_CLOCK_TIME_NONE;
+ stream->last_seg_start = stream->last_ts = GST_CLOCK_TIME_NONE;
}
}
}
@@ -487,11 +492,17 @@ gst_flups_demux_send_segment_updates (GstFluPSDemux * demux,
if (stream->last_ts == GST_CLOCK_TIME_NONE ||
stream->last_ts < demux->src_segment.start)
stream->last_ts = demux->src_segment.start;
- if (stream->last_ts + SEGMENT_THRESHOLD < new_time) {
+ if (stream->last_ts + stream->segment_thresh < new_time) {
#if 0
- g_print ("Segment update to pad %s time %" GST_TIME_FORMAT "\n",
- GST_PAD_NAME (stream->pad), GST_TIME_ARGS (new_time));
+ g_print ("Segment update to pad %s time %" GST_TIME_FORMAT " stop now %"
+ GST_TIME_FORMAT " last_stop %" GST_TIME_FORMAT "\n",
+ GST_PAD_NAME (stream->pad), GST_TIME_ARGS (new_time),
+ GST_TIME_ARGS (demux->src_segment.stop),
+ GST_TIME_ARGS (demux->src_segment.last_stop));
#endif
+ GST_DEBUG_OBJECT (demux,
+ "Segment update to pad %s time %" GST_TIME_FORMAT,
+ GST_PAD_NAME (stream->pad), GST_TIME_ARGS (new_time));
if (event == NULL) {
event = gst_event_new_new_segment_full (TRUE,
demux->src_segment.rate, demux->src_segment.applied_rate,
@@ -501,7 +512,7 @@ gst_flups_demux_send_segment_updates (GstFluPSDemux * demux,
}
gst_event_ref (event);
gst_pad_push_event (stream->pad, event);
- stream->last_ts = new_time;
+ stream->last_seg_start = stream->last_ts = new_time;
}
}
}
@@ -515,28 +526,39 @@ gst_flups_demux_send_segment_close (GstFluPSDemux * demux)
{
gint id;
GstEvent *event = NULL;
+ GstClockTime stop = demux->src_segment.stop;
+
+ if (demux->src_segment.last_stop != -1 && demux->src_segment.last_stop > stop)
+ stop = demux->src_segment.last_stop;
for (id = 0; id < GST_FLUPS_DEMUX_MAX_STREAMS; id++) {
GstFluPSStream *stream = demux->streams[id];
if (stream) {
- if (stream->last_ts == GST_CLOCK_TIME_NONE ||
- stream->last_ts < demux->src_segment.start)
- stream->last_ts = demux->src_segment.start;
+ GstClockTime start = demux->src_segment.start;
+
+ if (stream->last_seg_start != GST_CLOCK_TIME_NONE &&
+ stream->last_seg_start > start)
+ start = stream->last_seg_start;
#if 0
- g_print ("Segment update to pad %s start %" GST_TIME_FORMAT
+ g_print ("Segment close to pad %s start %" GST_TIME_FORMAT
" stop %" GST_TIME_FORMAT "\n",
- GST_PAD_NAME (stream->pad), GST_TIME_ARGS (stream->last_ts),
- GST_TIME_ARGS (demux->src_segment.stop));
+ GST_PAD_NAME (stream->pad), GST_TIME_ARGS (start),
+ GST_TIME_ARGS (stop));
#endif
+ if (start > stop) {
+ g_print ("Problem on pad %s with start %" GST_TIME_FORMAT " > stop %"
+ GST_TIME_FORMAT "\n",
+ gst_object_get_name (GST_OBJECT (stream->pad)),
+ GST_TIME_ARGS (start), GST_TIME_ARGS (stop));
+ }
event = gst_event_new_new_segment_full (TRUE,
demux->src_segment.rate, demux->src_segment.applied_rate,
- GST_FORMAT_TIME, stream->last_ts,
- demux->src_segment.stop,
- demux->src_segment.time +
- (stream->last_ts - demux->src_segment.start));
- gst_pad_push_event (stream->pad, event);
+ GST_FORMAT_TIME, start,
+ stop, demux->src_segment.time + (start - demux->src_segment.start));
+ if (event)
+ gst_pad_push_event (stream->pad, event);
}
}
}
@@ -550,7 +572,7 @@ gst_flups_demux_send_event (GstFluPSDemux * demux, GstEvent * event)
for (id = 0; id < GST_FLUPS_DEMUX_MAX_STREAMS; id++) {
GstFluPSStream *stream = demux->streams[id];
- if (stream && !stream->notlinked) {
+ if (stream) {
(void) gst_event_ref (event);
if (!gst_pad_push_event (stream->pad, event)) {
@@ -717,6 +739,8 @@ gst_flups_demux_handle_dvd_event (GstFluPSDemux * demux, GstEvent * event)
"event", G_TYPE_STRING, "select-pad", NULL);
GstEvent *sel_event =
gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM, s);
+
+ temp->notlinked = FALSE;
gst_pad_push_event (temp->pad, sel_event);
gst_event_ref (event);
@@ -856,8 +880,12 @@ gst_flups_demux_sink_event (GstPad * pad, GstEvent * event)
else
demux->scr_adjust = -GSTTIME_TO_MPEGTIME (-adjust);
- if (stop != -1)
+ if (stop != -1) {
stop = start + dur;
+ if (demux->src_segment.last_stop != -1
+ && demux->src_segment.last_stop > stop)
+ stop = demux->src_segment.last_stop;
+ }
GST_DEBUG_OBJECT (demux,
"sending new segment: update %d rate %g format %d, start: %"
@@ -1134,7 +1162,7 @@ gst_flups_demux_reset_psm (GstFluPSDemux * demux)
FILL_TYPE (0x40, 0x7f, -1);
FILL_TYPE (0x80, 0x87, ST_PS_AUDIO_AC3);
FILL_TYPE (0x88, 0x9f, ST_PS_AUDIO_DTS);
- FILL_TYPE (0xa0, 0xbf, ST_PS_AUDIO_LPCM);
+ FILL_TYPE (0xa0, 0xaf, ST_PS_AUDIO_LPCM);
FILL_TYPE (0xbd, 0xbd, -1);
FILL_TYPE (0xc0, 0xdf, ST_AUDIO_MPEG1);
FILL_TYPE (0xe0, 0xef, ST_GST_VIDEO_MPEG1_OR_2);
@@ -1346,8 +1374,8 @@ gst_flups_demux_parse_pack_start (GstFluPSDemux * demux)
new_time = MPEGTIME_TO_GSTTIME (scr_adjusted);
if (new_time != GST_CLOCK_TIME_NONE) {
// g_print ("SCR now %" GST_TIME_FORMAT "\n", GST_TIME_ARGS (new_time));
+ gst_segment_set_last_stop (&demux->src_segment, GST_FORMAT_TIME, new_time);
gst_flups_demux_send_segment_updates (demux, new_time);
- demux->src_segment.last_stop = new_time;
}
/* Reset the bytes_since_scr value to count the data remaining in the
@@ -1841,7 +1869,7 @@ need_data:
}
}
-static gboolean
+static inline gboolean
gst_flups_demux_is_pes_sync (guint32 sync)
{
return ((sync & 0xfc) == 0xbc) ||
diff --git a/ext/resindvd/gstmpegdemux.h b/ext/resindvd/gstmpegdemux.h
index 3f38b088..683b7cde 100644
--- a/ext/resindvd/gstmpegdemux.h
+++ b/ext/resindvd/gstmpegdemux.h
@@ -63,7 +63,9 @@ struct _GstFluPSStream {
gboolean notlinked;
gboolean need_segment;
+ GstClockTime last_seg_start;
GstClockTime last_ts;
+ GstClockTime segment_thresh;
};
struct _GstFluPSDemux {
diff --git a/ext/resindvd/resindvdbin.c b/ext/resindvd/resindvdbin.c
index 310fac7f..e5f28288 100644
--- a/ext/resindvd/resindvdbin.c
+++ b/ext/resindvd/resindvdbin.c
@@ -44,6 +44,9 @@ GST_DEBUG_CATEGORY_EXTERN (resindvd_debug);
#define DVDBIN_LOCK(d) g_mutex_lock((d)->dvd_lock)
#define DVDBIN_UNLOCK(d) g_mutex_unlock((d)->dvd_lock)
+#define DVDBIN_PREROLL_LOCK(d) g_mutex_lock((d)->preroll_lock)
+#define DVDBIN_PREROLL_UNLOCK(d) g_mutex_unlock((d)->preroll_lock)
+
#define DEFAULT_DEVICE "/dev/dvd"
enum
{
@@ -159,6 +162,7 @@ static void
rsn_dvdbin_init (RsnDvdBin * dvdbin, RsnDvdBinClass * gclass)
{
dvdbin->dvd_lock = g_mutex_new ();
+ dvdbin->preroll_lock = g_mutex_new ();
}
static void
@@ -167,6 +171,7 @@ rsn_dvdbin_finalize (GObject * object)
RsnDvdBin *dvdbin = RESINDVDBIN (object);
g_mutex_free (dvdbin->dvd_lock);
+ g_mutex_free (dvdbin->preroll_lock);
g_free (dvdbin->last_uri);
g_free (dvdbin->device);
@@ -741,58 +746,57 @@ failed:
static void
dvdbin_pad_blocked_cb (GstPad * pad, gboolean blocked, RsnDvdBin * dvdbin)
{
- gboolean changed = FALSE;
+ gboolean added_last_pad = FALSE;
gboolean added = FALSE;
if (!blocked)
return;
if (pad == dvdbin->subpicture_pad) {
GST_DEBUG_OBJECT (dvdbin, "Pad block -> subpicture pad");
- GST_OBJECT_LOCK (dvdbin);
+ DVDBIN_PREROLL_LOCK (dvdbin);
added = dvdbin->subpicture_added;
dvdbin->subpicture_added = TRUE;
- GST_OBJECT_UNLOCK (dvdbin);
if (!added) {
gst_element_add_pad (GST_ELEMENT (dvdbin), dvdbin->subpicture_pad);
- changed = TRUE;
+ added_last_pad = (dvdbin->audio_added && dvdbin->video_added);
}
+ DVDBIN_PREROLL_UNLOCK (dvdbin);
gst_pad_set_blocked_async (pad, FALSE,
(GstPadBlockCallback) dvdbin_pad_blocked_cb, dvdbin);
} else if (pad == dvdbin->audio_pad) {
GST_DEBUG_OBJECT (dvdbin, "Pad block -> audio pad");
- GST_OBJECT_LOCK (dvdbin);
+ DVDBIN_PREROLL_LOCK (dvdbin);
added = dvdbin->audio_added;
dvdbin->audio_added = TRUE;
- GST_OBJECT_UNLOCK (dvdbin);
if (!added) {
gst_element_add_pad (GST_ELEMENT (dvdbin), dvdbin->audio_pad);
- changed = TRUE;
+ added_last_pad = (dvdbin->subpicture_added && dvdbin->video_added);
}
+ DVDBIN_PREROLL_UNLOCK (dvdbin);
gst_pad_set_blocked_async (pad, FALSE,
(GstPadBlockCallback) dvdbin_pad_blocked_cb, dvdbin);
} else if (pad == dvdbin->video_pad) {
GST_DEBUG_OBJECT (dvdbin, "Pad block -> video pad");
- GST_OBJECT_LOCK (dvdbin);
+ DVDBIN_PREROLL_LOCK (dvdbin);
added = dvdbin->video_added;
dvdbin->video_added = TRUE;
- GST_OBJECT_UNLOCK (dvdbin);
if (!added) {
gst_element_add_pad (GST_ELEMENT (dvdbin), dvdbin->video_pad);
- changed = TRUE;
+ added_last_pad = (dvdbin->subpicture_added && dvdbin->audio_added);
}
+ DVDBIN_PREROLL_UNLOCK (dvdbin);
gst_pad_set_blocked_async (pad, FALSE,
(GstPadBlockCallback) dvdbin_pad_blocked_cb, dvdbin);
}
- if (changed &&
- dvdbin->video_added && dvdbin->audio_added && dvdbin->subpicture_added) {
+ if (added_last_pad) {
GST_DEBUG_OBJECT (dvdbin, "Firing no more pads from pad-blocked cb");
gst_element_no_more_pads (GST_ELEMENT (dvdbin));
}
diff --git a/ext/resindvd/resindvdbin.h b/ext/resindvd/resindvdbin.h
index 5a063f4f..d9aa1078 100644
--- a/ext/resindvd/resindvdbin.h
+++ b/ext/resindvd/resindvdbin.h
@@ -58,6 +58,7 @@ struct _RsnDvdBin
/* Protects pieces list and properties */
GMutex *dvd_lock;
+ GMutex *preroll_lock;
gchar *device;
gchar *last_uri;
diff --git a/ext/resindvd/resindvdsrc.c b/ext/resindvd/resindvdsrc.c
index a2f31610..f24e45aa 100644
--- a/ext/resindvd/resindvdsrc.c
+++ b/ext/resindvd/resindvdsrc.c
@@ -53,6 +53,15 @@ typedef enum
RSN_NAV_RESULT_BRANCH_AND_HIGHLIGHT
} RsnNavResult;
+typedef enum
+{
+ RSN_BTN_NONE = 0x00,
+ RSN_BTN_LEFT = 0x01,
+ RSN_BTN_RIGHT = 0x02,
+ RSN_BTN_UP = 0x04,
+ RSN_BTN_DOWN = 0x04
+} RsnBtnMask;
+
enum
{
/* FILL ME */
@@ -134,6 +143,7 @@ static gboolean rsn_dvdsrc_src_event (RsnBaseSrc * basesrc, GstEvent * event);
static gboolean rsn_dvdsrc_src_query (RsnBaseSrc * basesrc, GstQuery * query);
static GstClockTime ifotime_to_gsttime (dvd_time_t * ifo_time);
+static void rsn_dvdsrc_send_commands_changed (resinDvdSrc * src);
static GstClockTime
ifotime_to_gsttime (dvd_time_t * ifo_time)
@@ -374,6 +384,8 @@ rsn_dvdsrc_start (RsnBaseSrc * bsrc)
}
}
+ dvdnav_get_title_string (src->dvdnav, &src->disc_name);
+
src->first_seek = TRUE;
src->running = TRUE;
src->branching = FALSE;
@@ -388,8 +400,17 @@ rsn_dvdsrc_start (RsnBaseSrc * bsrc)
src->vts_n = 0;
src->in_menu = FALSE;
+ src->title_n = -1;
+ src->part_n = -1;
src->active_button = -1;
+ src->cur_btn_mask = RSN_BTN_NONE;
+
+ src->angles_changed = FALSE;
+ src->n_angles = 0;
+ src->cur_angle = 0;
+
+ src->commands_changed = TRUE;
src->cur_spu_phys_stream = -1;
src->cur_spu_forced_only = FALSE;
@@ -414,7 +435,6 @@ fail:
static gboolean
read_vts_info (resinDvdSrc * src)
{
- gint i;
gint n_vts;
if (src->vts_attrs) {
@@ -443,28 +463,48 @@ read_vts_info (resinDvdSrc * src)
return FALSE;
g_array_set_size (src->vts_attrs, n_vts + 1);
- for (i = 1; i <= n_vts; i++) {
- ifo_handle_t *ifo = ifoOpen (src->dvdread, i);
+ return TRUE;
+}
+
+static vtsi_mat_t *
+get_vts_attr (resinDvdSrc * src, gint n)
+{
+ vtsi_mat_t *vts_attr;
+
+ if (src->vts_attrs == NULL || n >= src->vts_attrs->len) {
+ if (src->vts_attrs)
+ GST_ERROR_OBJECT (src, "No stream info for VTS %d (have %d)", n,
+ src->vts_attrs->len);
+ else
+ GST_ERROR_OBJECT (src, "No stream info");
+ return NULL;
+ }
+
+ vts_attr = &g_array_index (src->vts_attrs, vtsi_mat_t, src->vts_n);
+
+ /* Check if we have read this VTS ifo yet */
+ if (vts_attr->vtsm_vobs == 0) {
+ ifo_handle_t *ifo = ifoOpen (src->dvdread, n);
if (!ifo) {
- GST_ERROR ("Can't open VTS %d", i);
- return FALSE;
+ GST_ERROR ("Can't open VTS %d", n);
+ return NULL;
}
GST_DEBUG ("VTS %d, Menu has %d audio %d subpictures. "
- "Title has %d and %d", i,
+ "Title has %d and %d", n,
ifo->vtsi_mat->nr_of_vtsm_audio_streams,
ifo->vtsi_mat->nr_of_vtsm_subp_streams,
ifo->vtsi_mat->nr_of_vts_audio_streams,
ifo->vtsi_mat->nr_of_vts_subp_streams);
- memcpy (&g_array_index (src->vts_attrs, vtsi_mat_t, i),
+ memcpy (&g_array_index (src->vts_attrs, vtsi_mat_t, n),
ifo->vtsi_mat, sizeof (vtsi_mat_t));
ifoClose (ifo);
- }
+ };
- return TRUE;
+ return vts_attr;
}
static gboolean
@@ -516,6 +556,8 @@ rsn_dvdsrc_stop (RsnBaseSrc * bsrc)
src->highlight_event = NULL;
}
+ src->disc_name = NULL;
+
if (src->dvdnav) {
if (dvdnav_close (src->dvdnav) != DVDNAV_STATUS_OK) {
GST_ELEMENT_ERROR (src, RESOURCE, CLOSE, (NULL),
@@ -551,6 +593,7 @@ rsn_dvdsrc_do_still (resinDvdSrc * src, int duration)
{
GstEvent *still_event;
GstEvent *hl_event;
+ gboolean cmds_changed;
GstStructure *s;
GstEvent *seg_event;
GstSegment *segment = &(GST_BASE_SRC (src)->segment);
@@ -558,6 +601,12 @@ rsn_dvdsrc_do_still (resinDvdSrc * src, int duration)
if (src->in_still_state == FALSE) {
GST_DEBUG_OBJECT (src, "**** Start STILL FRAME. Duration %d ****",
duration);
+
+ if (duration == 255)
+ src->still_time_remaining = GST_CLOCK_TIME_NONE;
+ else
+ src->still_time_remaining = GST_SECOND * duration;
+
/* Send a close-segment event, and a dvd-still start
* event, then sleep */
s = gst_structure_new ("application/x-gst-dvd",
@@ -574,6 +623,8 @@ rsn_dvdsrc_do_still (resinDvdSrc * src, int duration)
/* Grab any pending highlight event to send too */
hl_event = src->highlight_event;
src->highlight_event = NULL;
+ cmds_changed = src->commands_changed;
+ src->commands_changed = FALSE;
/* Now, send the events. We need to drop the dvd lock while doing so,
* and then check after if we got flushed */
@@ -584,13 +635,18 @@ rsn_dvdsrc_do_still (resinDvdSrc * src, int duration)
GST_LOG_OBJECT (src, "Sending highlight event before still");
gst_pad_push_event (GST_BASE_SRC_PAD (src), hl_event);
}
+ if (cmds_changed)
+ rsn_dvdsrc_send_commands_changed (src);
+
g_mutex_lock (src->dvd_lock);
g_mutex_lock (src->branch_lock);
src->in_still_state = TRUE;
} else {
- GST_DEBUG_OBJECT (src, "Re-entering still wait");
+ GST_DEBUG_OBJECT (src,
+ "Re-entering still wait with %" GST_TIME_FORMAT " remaining",
+ GST_TIME_ARGS (src->still_time_remaining));
g_mutex_lock (src->branch_lock);
}
@@ -627,26 +683,42 @@ rsn_dvdsrc_do_still (resinDvdSrc * src, int duration)
GTimeVal end_time;
gboolean was_signalled;
- g_get_current_time (&end_time);
- g_time_val_add (&end_time, duration * G_USEC_PER_SEC);
+ if (src->still_time_remaining > 0) {
+ g_get_current_time (&end_time);
+ g_time_val_add (&end_time, src->still_time_remaining / GST_USECOND);
- /* FIXME: Implement timed stills by sleeping on the clock, possibly
- * in multiple steps if we get paused/unpaused */
- g_mutex_unlock (src->dvd_lock);
- GST_LOG_OBJECT (src, "cond_timed_wait still");
- was_signalled =
- g_cond_timed_wait (src->still_cond, src->branch_lock, &end_time);
- was_signalled |= src->branching;
+ /* Implement timed stills by sleeping, possibly
+ * in multiple steps if we get paused/unpaused */
+ g_mutex_unlock (src->dvd_lock);
+ GST_LOG_OBJECT (src, "cond_timed_wait still for %d sec", duration);
+ was_signalled =
+ g_cond_timed_wait (src->still_cond, src->branch_lock, &end_time);
+ was_signalled |= src->branching;
- g_mutex_unlock (src->branch_lock);
- g_mutex_lock (src->dvd_lock);
+ g_mutex_unlock (src->branch_lock);
+ g_mutex_lock (src->dvd_lock);
- if (was_signalled) {
- /* Signalled - must be flushing */
- GST_LOG_OBJECT (src,
- "cond_timed_wait still over. Signalled, branching = %d",
- src->branching);
- return TRUE;
+ if (was_signalled) {
+ /* Signalled - must be flushing */
+ GTimeVal cur_time;
+ GstClockTimeDiff remain;
+
+ g_get_current_time (&cur_time);
+ remain =
+ (end_time.tv_sec - cur_time.tv_sec) * GST_SECOND +
+ (end_time.tv_usec - cur_time.tv_usec) * GST_USECOND;
+ if (remain < 0)
+ src->still_time_remaining = 0;
+ else
+ src->still_time_remaining = remain;
+
+ GST_LOG_OBJECT (src,
+ "cond_timed_wait still aborted by signal with %" GST_TIME_FORMAT
+ " remaining. branching = %d",
+ GST_TIME_ARGS (src->still_time_remaining), src->branching);
+
+ return TRUE;
+ }
}
/* Else timed out, end the still */
@@ -658,12 +730,17 @@ rsn_dvdsrc_do_still (resinDvdSrc * src, int duration)
}
/* Tell downstream the still is over.
- * Later: We'll only do this if the still isn't interrupted: */
+ * We only do this if the still isn't interrupted: */
s = gst_structure_new ("application/x-gst-dvd",
"event", G_TYPE_STRING, "dvd-still",
"still-state", G_TYPE_BOOLEAN, FALSE, NULL);
still_event = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM, s);
+ /* If the segment was too short in a timed still, it may need extending */
+ if (segment->last_stop < segment->start + GST_SECOND * duration)
+ gst_segment_set_last_stop (segment, GST_FORMAT_TIME,
+ segment->start + (GST_SECOND * duration));
+
g_mutex_unlock (src->dvd_lock);
gst_pad_push_event (GST_BASE_SRC_PAD (src), still_event);
g_mutex_lock (src->dvd_lock);
@@ -722,6 +799,71 @@ get_current_pgc (resinDvdSrc * src)
return pgc;
}
+static void
+update_title_info (resinDvdSrc * src)
+{
+ gint n_angles, cur_agl;
+ gint title_n, part_n;
+
+ if (dvdnav_get_angle_info (src->dvdnav, &cur_agl,
+ &n_angles) == DVDNAV_STATUS_OK && src->n_angles != n_angles) {
+ /* Make sure we send an angles-changed message soon */
+ src->angles_changed = TRUE;
+ }
+
+ if (dvdnav_current_title_info (src->dvdnav, &title_n,
+ &part_n) != DVDNAV_STATUS_OK) {
+ if (!src->in_menu)
+ return; /* Can't update now */
+ /* Must be in the first play sequence */
+ title_n = -1;
+ part_n = 0;
+ }
+
+ if (title_n != src->title_n || part_n != src->part_n ||
+ src->n_angles != n_angles || src->cur_angle != cur_agl) {
+ gchar *title_str = NULL;
+
+ src->title_n = title_n;
+ src->part_n = part_n;
+ src->n_angles = n_angles;
+ src->cur_angle = cur_agl;
+
+ if (title_n == 0) {
+ /* In a menu */
+ title_str = g_strdup ("DVD Menu");
+ } else if (title_n > 0) {
+ /* In a title */
+ if (n_angles > 1) {
+ title_str = g_strdup_printf ("Title %i, Chapter %i, Angle %i of %i",
+ title_n, part_n, cur_agl, n_angles);
+
+ } else {
+ title_str = g_strdup_printf ("Title %i, Chapter %i", title_n, part_n);
+ }
+ }
+
+ if (src->disc_name && src->disc_name[0]) {
+ /* We have a name for this disc, publish it */
+ if (title_str) {
+ gchar *new_title_str =
+ g_strdup_printf ("%s, %s", title_str, src->disc_name);
+ g_free (title_str);
+ title_str = new_title_str;
+ } else {
+ title_str = g_strdup (src->disc_name);
+ }
+ }
+ if (title_str) {
+ GstTagList *tags = gst_tag_list_new ();
+ gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_TITLE,
+ title_str, NULL);
+ g_free (title_str);
+ gst_element_found_tags (GST_ELEMENT_CAST (src), tags);
+ }
+ }
+}
+
static GstFlowReturn
rsn_dvdsrc_step (resinDvdSrc * src, gboolean have_dvd_lock)
{
@@ -821,7 +963,6 @@ rsn_dvdsrc_step (resinDvdSrc * src, gboolean have_dvd_lock)
src->next_is_nav_block = FALSE;
src->next_nav_ts = GST_CLOCK_TIME_NONE;
}
-
break;
}
case DVDNAV_STOP:
@@ -874,6 +1015,8 @@ rsn_dvdsrc_step (resinDvdSrc * src, gboolean have_dvd_lock)
rsn_dvdsrc_prepare_streamsinfo_event (src);
+ update_title_info (src);
+
break;
}
case DVDNAV_SPU_CLUT_CHANGE:
@@ -926,6 +1069,9 @@ 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);
rsn_dvdsrc_update_highlight (src);
break;
}
@@ -967,6 +1113,99 @@ branching:
return GST_FLOW_WRONG_STATE;
}
+/* Send app a bus message that the available commands have changed */
+static void
+rsn_dvdsrc_send_commands_changed (resinDvdSrc * src)
+{
+ GstMessage *cmds_msg =
+ gst_navigation_message_new_commands_changed (GST_OBJECT_CAST (src));
+ gst_element_post_message (GST_ELEMENT_CAST (src), cmds_msg);
+}
+
+static gboolean
+rsn_dvdsrc_handle_cmds_query (resinDvdSrc * src, GstQuery * query)
+{
+ /* Expand this array if we have more commands in the future: */
+ GstNavigationCommand cmds[16];
+ gint n_cmds = 0;
+
+ /* Fill out the standard set of commands we support */
+ cmds[n_cmds++] = GST_NAVIGATION_COMMAND_DVD_MENU;
+ cmds[n_cmds++] = GST_NAVIGATION_COMMAND_DVD_TITLE_MENU;
+ cmds[n_cmds++] = GST_NAVIGATION_COMMAND_DVD_ROOT_MENU;
+ cmds[n_cmds++] = GST_NAVIGATION_COMMAND_DVD_SUBPICTURE_MENU;
+ cmds[n_cmds++] = GST_NAVIGATION_COMMAND_DVD_AUDIO_MENU;
+ cmds[n_cmds++] = GST_NAVIGATION_COMMAND_DVD_ANGLE_MENU;
+ cmds[n_cmds++] = GST_NAVIGATION_COMMAND_DVD_CHAPTER_MENU;
+
+ g_mutex_lock (src->dvd_lock);
+
+ /* Multiple angles available? */
+ if (src->n_angles > 1) {
+ cmds[n_cmds++] = GST_NAVIGATION_COMMAND_PREV_ANGLE;
+ cmds[n_cmds++] = GST_NAVIGATION_COMMAND_NEXT_ANGLE;
+ }
+
+ /* Add button selection commands if we have them */
+ if (src->active_button > 0) {
+ /* We have a valid current button */
+ cmds[n_cmds++] = GST_NAVIGATION_COMMAND_ACTIVATE;
+ }
+ /* Check for buttons in each direction */
+ if (src->cur_btn_mask & RSN_BTN_LEFT)
+ cmds[n_cmds++] = GST_NAVIGATION_COMMAND_LEFT;
+ if (src->cur_btn_mask & RSN_BTN_RIGHT)
+ cmds[n_cmds++] = GST_NAVIGATION_COMMAND_RIGHT;
+ if (src->cur_btn_mask & RSN_BTN_UP)
+ cmds[n_cmds++] = GST_NAVIGATION_COMMAND_UP;
+ if (src->cur_btn_mask & RSN_BTN_DOWN)
+ cmds[n_cmds++] = GST_NAVIGATION_COMMAND_DOWN;
+ g_mutex_unlock (src->dvd_lock);
+
+ gst_navigation_query_set_commandsv (query, n_cmds, cmds);
+
+ return TRUE;
+}
+
+static gboolean
+rsn_dvdsrc_handle_angles_query (resinDvdSrc * src, GstQuery * query)
+{
+ gint cur_agl, n_angles;
+ gboolean res = FALSE;
+
+ g_mutex_lock (src->dvd_lock);
+ if (dvdnav_get_angle_info (src->dvdnav, &cur_agl,
+ &n_angles) == DVDNAV_STATUS_OK) {
+ gst_navigation_query_set_angles (query, cur_agl, n_angles);
+ res = TRUE;
+ }
+ g_mutex_unlock (src->dvd_lock);
+
+ return res;
+}
+
+static gboolean
+rsn_dvdsrc_handle_navigation_query (resinDvdSrc * src,
+ GstNavigationQueryType nq_type, GstQuery * query)
+{
+ gboolean res;
+
+ GST_LOG_OBJECT (src, "Have Navigation query of type %d", nq_type);
+
+ switch (nq_type) {
+ case GST_NAVIGATION_QUERY_COMMANDS:
+ res = rsn_dvdsrc_handle_cmds_query (src, query);
+ break;
+ case GST_NAVIGATION_QUERY_ANGLES:
+ res = rsn_dvdsrc_handle_angles_query (src, query);
+ break;
+ default:
+ res = FALSE;
+ }
+
+ return res;
+}
+
static GstFlowReturn
rsn_dvdsrc_prepare_next_block (resinDvdSrc * src, gboolean have_dvd_lock)
{
@@ -998,6 +1237,8 @@ rsn_dvdsrc_create (RsnPushSrc * psrc, GstBuffer ** outbuf)
GstEvent *spu_select_event = NULL;
GstEvent *audio_select_event = NULL;
GstEvent *highlight_event = NULL;
+ GstMessage *angles_msg = NULL;
+ gboolean cmds_changed = FALSE;
*outbuf = NULL;
@@ -1020,6 +1261,20 @@ rsn_dvdsrc_create (RsnPushSrc * psrc, GstBuffer ** outbuf)
clut_event = src->clut_event;
src->clut_event = NULL;
+ if (src->angles_changed) {
+ gint cur, agls;
+ if (dvdnav_get_angle_info (src->dvdnav, &cur, &agls) == DVDNAV_STATUS_OK) {
+
+ angles_msg =
+ gst_navigation_message_new_angles_changed (GST_OBJECT_CAST (src),
+ cur, agls);
+ }
+ src->angles_changed = FALSE;
+ }
+
+ cmds_changed = src->commands_changed;
+ src->commands_changed = FALSE;
+
g_mutex_unlock (src->dvd_lock);
/* Push in-band events now that we've dropped the dvd_lock, before
@@ -1089,6 +1344,13 @@ rsn_dvdsrc_create (RsnPushSrc * psrc, GstBuffer ** outbuf)
gst_pad_push_event (GST_BASE_SRC_PAD (src), highlight_event);
}
+ if (angles_msg) {
+ gst_element_post_message (GST_ELEMENT_CAST (src), angles_msg);
+ }
+
+ if (cmds_changed)
+ rsn_dvdsrc_send_commands_changed (src);
+
return ret;
}
@@ -1212,19 +1474,40 @@ rsn_dvdsrc_do_command (resinDvdSrc * src, GstNavigationCommand command)
case GST_NAVIGATION_COMMAND_PREV_ANGLE:{
gint32 cur, agls;
- if (dvdnav_get_angle_info (src->dvdnav, &cur, &agls) == DVDNAV_STATUS_OK
- && cur > 0
- && dvdnav_angle_change (src->dvdnav, cur - 1) == DVDNAV_STATUS_OK)
- GST_INFO_OBJECT (src, "Switched to angle %d", cur - 1);
- /* Angle switches are seamless and involve no branching */
+ gint new_angle = 0;
+ if (dvdnav_get_angle_info (src->dvdnav, &cur, &agls) == DVDNAV_STATUS_OK) {
+ if (cur > 0 &&
+ dvdnav_angle_change (src->dvdnav, cur - 1) == DVDNAV_STATUS_OK) {
+ new_angle = cur - 1;
+ } else if (cur == 1 &&
+ dvdnav_angle_change (src->dvdnav, agls) == DVDNAV_STATUS_OK) {
+ new_angle = agls;
+ }
+ /* Angle switches are seamless and involve no branching */
+ if (new_angle) {
+ src->angles_changed = TRUE;
+ GST_INFO_OBJECT (src, "Switched to angle %d", new_angle);
+ }
+ }
break;
}
case GST_NAVIGATION_COMMAND_NEXT_ANGLE:{
gint32 cur, agls;
- if (dvdnav_get_angle_info (src->dvdnav, &cur, &agls) == DVDNAV_STATUS_OK
- && dvdnav_angle_change (src->dvdnav, cur + 1) == DVDNAV_STATUS_OK)
- GST_INFO_OBJECT (src, "Switched to angle %d", cur + 1);
- /* Angle switches are seamless and involve no branching */
+ gint new_angle = 0;
+ if (dvdnav_get_angle_info (src->dvdnav, &cur, &agls) == DVDNAV_STATUS_OK) {
+ if (cur < agls
+ && dvdnav_angle_change (src->dvdnav, cur + 1) == DVDNAV_STATUS_OK) {
+ new_angle = cur + 1;
+ } else if (cur == agls
+ && dvdnav_angle_change (src->dvdnav, 1) == DVDNAV_STATUS_OK) {
+ new_angle = 1;
+ }
+ /* Angle switches are seamless and involve no branching */
+ if (new_angle) {
+ src->angles_changed = TRUE;
+ GST_INFO_OBJECT (src, "Switched to angle %d", new_angle);
+ }
+ }
break;
}
default:
@@ -1242,6 +1525,7 @@ rsn_dvdsrc_handle_navigation_event (resinDvdSrc * src, GstEvent * event)
RsnNavResult nav_res = RSN_NAV_RESULT_NONE;
GstNavigationEventType etype = gst_navigation_event_get_type (event);
GstMessage *mouse_over_msg = NULL;
+ GstMessage *angles_msg = NULL;
switch (etype) {
case GST_NAVIGATION_EVENT_KEY_PRESS:{
@@ -1375,6 +1659,7 @@ rsn_dvdsrc_handle_navigation_event (resinDvdSrc * src, GstEvent * event)
if (have_lock) {
gboolean channel_hop = FALSE;
+ gboolean cmds_changed;
if (nav_res != RSN_NAV_RESULT_NONE) {
if (nav_res == RSN_NAV_RESULT_BRANCH) {
@@ -1422,6 +1707,22 @@ rsn_dvdsrc_handle_navigation_event (resinDvdSrc * src, GstEvent * event)
hl_event = src->highlight_event;
src->highlight_event = NULL;
+ if (src->angles_changed) {
+ gint cur, agls;
+ if (dvdnav_get_angle_info (src->dvdnav, &cur, &agls) == DVDNAV_STATUS_OK) {
+
+ angles_msg =
+ gst_navigation_message_new_angles_changed (GST_OBJECT_CAST (src),
+ cur, agls);
+ }
+ src->angles_changed = FALSE;
+
+ update_title_info (src);
+ }
+
+ cmds_changed = src->commands_changed;
+ src->commands_changed = FALSE;
+
g_mutex_unlock (src->dvd_lock);
if (hl_event) {
@@ -1429,12 +1730,19 @@ rsn_dvdsrc_handle_navigation_event (resinDvdSrc * src, GstEvent * event)
src->active_button);
gst_pad_push_event (GST_BASE_SRC_PAD (src), hl_event);
}
+
+ if (cmds_changed)
+ rsn_dvdsrc_send_commands_changed (src);
}
if (mouse_over_msg) {
gst_element_post_message (GST_ELEMENT_CAST (src), mouse_over_msg);
}
+ if (angles_msg) {
+ gst_element_post_message (GST_ELEMENT_CAST (src), angles_msg);
+ }
+
return TRUE;
not_running:
if (have_lock)
@@ -1515,15 +1823,6 @@ rsn_dvdsrc_prepare_streamsinfo_event (resinDvdSrc * src)
gboolean have_audio;
gboolean have_subp;
- if (src->vts_attrs == NULL || src->vts_n >= src->vts_attrs->len) {
- if (src->vts_attrs)
- GST_ERROR_OBJECT (src, "No stream info for VTS %d (have %d)", src->vts_n,
- src->vts_attrs->len);
- else
- GST_ERROR_OBJECT (src, "No stream info");
- return FALSE;
- }
-
if (src->vts_n == 0) {
/* VMGM info */
vts_attr = NULL;
@@ -1534,7 +1833,7 @@ rsn_dvdsrc_prepare_streamsinfo_event (resinDvdSrc * src)
n_subp = MIN (1, src->vmgm_attr.nr_of_vmgm_subp_streams);
} else if (src->in_menu) {
/* VTSM attrs */
- vts_attr = &g_array_index (src->vts_attrs, vtsi_mat_t, src->vts_n);
+ vts_attr = get_vts_attr (src, src->vts_n);
v_attr = &vts_attr->vtsm_video_attr;
a_attrs = &vts_attr->vtsm_audio_attr;
n_audio = vts_attr->nr_of_vtsm_audio_streams;
@@ -1542,7 +1841,7 @@ rsn_dvdsrc_prepare_streamsinfo_event (resinDvdSrc * src)
n_subp = vts_attr->nr_of_vtsm_subp_streams;
} else {
/* VTS domain */
- vts_attr = &g_array_index (src->vts_attrs, vtsi_mat_t, src->vts_n);
+ vts_attr = get_vts_attr (src, src->vts_n);
v_attr = &vts_attr->vts_video_attr;
a_attrs = vts_attr->vts_audio_attr;
n_audio = vts_attr->nr_of_vts_audio_streams;
@@ -1550,6 +1849,9 @@ rsn_dvdsrc_prepare_streamsinfo_event (resinDvdSrc * src)
n_subp = vts_attr->nr_of_vts_subp_streams;
}
+ if (src->vts_n > 0 && vts_attr == NULL)
+ return FALSE;
+
GST_DEBUG_OBJECT (src, "Preparing streamsinfo for %d audio and "
"%d subpicture streams", n_audio, n_subp);
@@ -1712,28 +2014,33 @@ rsn_dvdsrc_update_highlight (resinDvdSrc * src)
int button = 0;
pci_t *pci = &src->cur_pci;
dvdnav_highlight_area_t area;
- int mode = 0;
+ int mode = src->active_highlight ? 1 : 0;
GstEvent *event = NULL;
GstStructure *s;
if (src->have_pci) {
- if (dvdnav_get_current_highlight (src->dvdnav, &button) != DVDNAV_STATUS_OK) {
- GST_ELEMENT_ERROR (src, LIBRARY, FAILED, (NULL),
- ("dvdnav_get_current_highlight: %s",
- dvdnav_err_to_string (src->dvdnav)));
- return;
+ if (dvdnav_get_current_highlight (src->dvdnav, &button) == DVDNAV_STATUS_OK) {
+ GST_LOG_OBJECT (src, "current dvdnav button is %d, we have %d",
+ button, src->active_button);
}
- if (pci->hli.hl_gi.hli_ss == 0 || (button > pci->hli.hl_gi.btn_ns) ||
- (button < 1)) {
+ if (pci->hli.hl_gi.hli_ss == 0 || button < 0) {
+ button = 0;
+ } else if (button > pci->hli.hl_gi.btn_ns) {
/* button is out of the range of possible buttons. */
+ button = pci->hli.hl_gi.btn_ns;
+ dvdnav_button_select (src->dvdnav, &src->cur_pci, button);
+ }
+
+ if (button > 0 && dvdnav_get_highlight_area (pci, button, mode,
+ &area) != DVDNAV_STATUS_OK) {
button = 0;
}
}
if (button == 0) {
/* No highlight available, or no button selected - clear the SPU */
- if (src->active_button < 1) {
+ if (src->active_button != 0) {
src->active_button = 0;
s = gst_structure_new ("application/x-gst-dvd", "event",
@@ -1742,29 +2049,28 @@ rsn_dvdsrc_update_highlight (resinDvdSrc * src)
if (src->highlight_event)
gst_event_unref (src->highlight_event);
src->highlight_event = event;
+ if (src->cur_btn_mask != RSN_BTN_NONE) {
+ src->cur_btn_mask = RSN_BTN_NONE;
+ src->commands_changed = TRUE;
+ }
}
return;
}
- if (src->active_highlight)
- mode = 1;
-
- if (dvdnav_get_highlight_area (pci, button, mode, &area) != DVDNAV_STATUS_OK) {
- GST_ELEMENT_ERROR (src, LIBRARY, FAILED, (NULL),
- ("dvdnav_get_highlight_area: %s", dvdnav_err_to_string (src->dvdnav)));
- return;
- }
-
/* Check if we have a new button number, or a new highlight region. */
if (button != src->active_button ||
area.sx != src->area.sx || area.sy != src->area.sy ||
area.ex != src->area.ex || area.ey != src->area.ey ||
area.palette != src->area.palette) {
+ btni_t *btn_info = pci->hli.btnit + button - 1;
+ guint32 btn_mask;
- GST_DEBUG_OBJECT (src, "Setting highlight. Button %d @ %d,%d "
- "active %d palette 0x%x (from button %d @ %d,%d palette 0x%x)",
- button, src->area.sx, src->area.sy, mode, src->area.palette,
- src->active_button, area.sx, area.sy, area.palette);
+ GST_DEBUG_OBJECT (src, "Setting highlight. Button %d @ %d,%d,%d,%d "
+ "active %d palette 0x%x (from button %d @ %d,%d,%d,%d palette 0x%x)",
+ button, area.sx, area.sy, area.ex, area.ey,
+ mode, area.palette,
+ src->active_button, src->area.sx, src->area.sy, src->area.ex,
+ src->area.ey, src->area.palette);
memcpy (&(src->area), &area, sizeof (dvdnav_highlight_area_t));
@@ -1790,6 +2096,22 @@ rsn_dvdsrc_update_highlight (resinDvdSrc * src)
if (src->highlight_event)
gst_event_unref (src->highlight_event);
src->highlight_event = event;
+
+ /* Calculate whether the available set of button motions is changed */
+ btn_mask = 0;
+ if (btn_info->left && btn_info->left != button)
+ btn_mask |= RSN_BTN_LEFT;
+ if (btn_info->right && btn_info->right != button)
+ btn_mask |= RSN_BTN_RIGHT;
+ if (btn_info->up && btn_info->up != button)
+ btn_mask |= RSN_BTN_UP;
+ if (btn_info->down && btn_info->down != button)
+ btn_mask |= RSN_BTN_DOWN;
+
+ if (btn_mask != src->cur_btn_mask) {
+ src->cur_btn_mask = btn_mask;
+ src->commands_changed = TRUE;
+ }
}
}
@@ -1828,14 +2150,18 @@ rsn_dvdsrc_activate_nav_block (resinDvdSrc * src, GstBuffer * nav_buf)
src->have_pci = TRUE;
forced_button = src->cur_pci.hli.hl_gi.fosl_btnn & 0x3f;
-
- if (forced_button != 0)
+ if (forced_button != 0) {
+ GST_DEBUG_OBJECT (src, "Selecting button %d based on nav packet command",
+ forced_button);
dvdnav_button_select (src->dvdnav, &src->cur_pci, forced_button);
-
+ }
/* highlight might change, let's check */
rsn_dvdsrc_update_highlight (src);
- if (src->highlight_event)
+
+ if (src->highlight_event && src->in_still_state) {
+ GST_LOG_OBJECT (src, "Signalling still condition due to highlight change");
g_cond_broadcast (src->still_cond);
+ }
}
static void
@@ -1908,19 +2234,19 @@ rsn_dvdsrc_nav_clock_cb (GstClock * clock, GstClockTime time, GstClockID id,
return TRUE;
}
+/* Called with dvd_lock held */
static void
rsn_dvdsrc_schedule_nav_cb (resinDvdSrc * src, RsnDvdPendingNav * next_nav)
{
GstClock *clock;
GstClockTime base_ts;
- GST_OBJECT_LOCK (src);
if (!src->in_playing) {
GST_LOG_OBJECT (src, "Not scheduling NAV block - state != PLAYING");
- GST_OBJECT_UNLOCK (src);
return; /* Not in playing state yet */
}
+ GST_OBJECT_LOCK (src);
clock = GST_ELEMENT_CLOCK (src);
base_ts = GST_ELEMENT (src)->base_time;
@@ -1943,6 +2269,7 @@ rsn_dvdsrc_schedule_nav_cb (resinDvdSrc * src, RsnDvdPendingNav * next_nav)
gst_object_unref (clock);
}
+/* Called with dvd_lock held */
static void
rsn_dvdsrc_check_nav_blocks (resinDvdSrc * src)
{
@@ -1953,9 +2280,10 @@ rsn_dvdsrc_check_nav_blocks (resinDvdSrc * src)
return; /* Something already scheduled */
}
if (src->pending_nav_blocks == NULL) {
- GST_LOG_OBJECT (src, "No NAV blocks to schedule");
return; /* No nav blocks available yet */
}
+ if (!src->in_playing)
+ return; /* Not in playing state yet */
GST_LOG_OBJECT (src, "Installing NAV callback");
next_nav = (RsnDvdPendingNav *) src->pending_nav_blocks->data;
@@ -1963,8 +2291,6 @@ rsn_dvdsrc_check_nav_blocks (resinDvdSrc * src)
rsn_dvdsrc_schedule_nav_cb (src, next_nav);
}
-/* Use libdvdread to read and cache info from the IFO file about
- * streams in each VTS */
static gboolean
rsn_dvdsrc_src_event (RsnBaseSrc * basesrc, GstEvent * event)
{
@@ -2117,6 +2443,15 @@ rsn_dvdsrc_src_query (RsnBaseSrc * basesrc, GstQuery * query)
}
g_mutex_unlock (src->dvd_lock);
break;
+ case GST_QUERY_CUSTOM:
+ {
+ GstNavigationQueryType nq_type = gst_navigation_query_get_type (query);
+ if (nq_type != GST_NAVIGATION_QUERY_INVALID)
+ res = rsn_dvdsrc_handle_navigation_query (src, nq_type, query);
+ else
+ res = GST_BASE_SRC_CLASS (parent_class)->query (basesrc, query);
+ break;
+ }
default:
res = GST_BASE_SRC_CLASS (parent_class)->query (basesrc, query);
break;
diff --git a/ext/resindvd/resindvdsrc.h b/ext/resindvd/resindvdsrc.h
index 61fa5d19..263c7afb 100644
--- a/ext/resindvd/resindvdsrc.h
+++ b/ext/resindvd/resindvdsrc.h
@@ -58,6 +58,8 @@ struct _resinDvdSrc
gchar *device;
dvdnav_t *dvdnav;
+ const char *disc_name;
+
/* dvd_reader instance is used to load and cache VTS/VMG ifo info */
dvd_reader_t *dvdread;
@@ -72,6 +74,10 @@ struct _resinDvdSrc
/* Current playback location: VTS 0 = VMG, plus in_menu or not */
gint vts_n;
gboolean in_menu;
+ gint title_n; /* Title num */
+ gint part_n; /* Part num */
+ gint n_angles; /* number of angles */
+ gint cur_angle; /* current angle */
gboolean running;
gboolean discont;
@@ -84,6 +90,9 @@ struct _resinDvdSrc
gboolean was_mouse_over;
+ /* Remaining time to wait in a timed still: */
+ GstClockTime still_time_remaining;
+
GstBuffer *alloc_buf;
GstBuffer *next_buf;
/* TRUE if the next_buf is a nav block that needs enqueueing */
@@ -114,6 +123,9 @@ struct _resinDvdSrc
GstEvent *audio_select_event;
GstEvent *highlight_event;
+ gboolean angles_changed;
+ gboolean commands_changed;
+
/* GList of NAV packets awaiting activation, and the
* running times to activate them. */
GSList *pending_nav_blocks;
@@ -129,6 +141,8 @@ struct _resinDvdSrc
gint8 cur_spu_phys_stream;
gboolean cur_spu_forced_only;
guint32 cur_clut[16];
+
+ guint32 cur_btn_mask;
};
struct _resinDvdSrcClass
diff --git a/ext/resindvd/rsnaudiomunge.c b/ext/resindvd/rsnaudiomunge.c
index fc7e552f..50d33be7 100644
--- a/ext/resindvd/rsnaudiomunge.c
+++ b/ext/resindvd/rsnaudiomunge.c
@@ -86,8 +86,8 @@ rsn_audiomunge_class_init (RsnAudioMungeClass * klass)
"Jan Schmidt <thaytan@noraisin.net>"
};
- GST_DEBUG_CATEGORY_INIT (rsn_audiomunge_debug, "rsn_audiomunge",
- 0, "Resin audio stream regulator");
+ GST_DEBUG_CATEGORY_INIT (rsn_audiomunge_debug, "rsnaudiomunge",
+ 0, "ResinDVD audio stream regulator");
gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&src_template));
@@ -288,15 +288,12 @@ rsn_audiomunge_sink_event (GstPad * pad, GstEvent * event)
gst_segment_set_newsegment_full (segment, update,
rate, arate, format, start, stop, time);
- if (munge->have_audio) {
- ret = gst_pad_push_event (munge->srcpad, event);
- break;
- }
-
/*
* FIXME:
- * If the accum >= threshold or we're in a still frame and there's been
- * no audio received, then we need to generate some audio data.
+ * If this is a segment update and accum >= threshold,
+ * or we're in a still frame and there's been no audio received,
+ * then we need to generate some audio data.
+ *
* If caused by a segment start update (time advancing in a gap) adjust
* the new-segment and send the buffer.
*
@@ -304,32 +301,38 @@ rsn_audiomunge_sink_event (GstPad * pad, GstEvent * event)
* in the closing segment.
*/
if (!update) {
- GST_DEBUG_OBJECT (munge, "Sending newsegment: start %" GST_TIME_FORMAT
- " stop %" GST_TIME_FORMAT " accum now %" GST_TIME_FORMAT,
+ GST_DEBUG_OBJECT (munge,
+ "Sending newsegment: update %d start %" GST_TIME_FORMAT " stop %"
+ GST_TIME_FORMAT " accum now %" GST_TIME_FORMAT, update,
GST_TIME_ARGS (start), GST_TIME_ARGS (stop),
GST_TIME_ARGS (segment->accum));
ret = gst_pad_push_event (munge->srcpad, event);
}
- if (segment->accum >= AUDIO_FILL_THRESHOLD || munge->in_still) {
- GST_DEBUG_OBJECT (munge,
- "Sending audio fill: accum = %" GST_TIME_FORMAT " still-state=%d",
- GST_TIME_ARGS (segment->accum), munge->in_still);
-
- /* Just generate a 100ms silence buffer for now. FIXME: Fill the gap */
- if (rsn_audiomunge_make_audio (munge, segment->start,
- GST_SECOND / 10) == GST_FLOW_OK)
- munge->have_audio = TRUE;
- } else {
- GST_LOG_OBJECT (munge, "Not sending audio fill buffer: "
- "segment accum below thresh: accum = %" GST_TIME_FORMAT,
- GST_TIME_ARGS (segment->accum));
+ if (!munge->have_audio) {
+ if ((update && segment->accum >= AUDIO_FILL_THRESHOLD)
+ || munge->in_still) {
+ GST_DEBUG_OBJECT (munge,
+ "Sending audio fill with ts %" GST_TIME_FORMAT ": accum = %"
+ GST_TIME_FORMAT " still-state=%d", GST_TIME_ARGS (segment->start),
+ GST_TIME_ARGS (segment->accum), munge->in_still);
+
+ /* Just generate a 200ms silence buffer for now. FIXME: Fill the gap */
+ if (rsn_audiomunge_make_audio (munge, segment->start,
+ GST_SECOND / 5) == GST_FLOW_OK)
+ munge->have_audio = TRUE;
+ } else {
+ GST_LOG_OBJECT (munge, "Not sending audio fill buffer: "
+ "Not segment update, or segment accum below thresh: accum = %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (segment->accum));
+ }
}
if (update) {
- GST_DEBUG_OBJECT (munge, "Sending newsegment: start %" GST_TIME_FORMAT
- " stop %" GST_TIME_FORMAT " accum now %" GST_TIME_FORMAT,
+ GST_DEBUG_OBJECT (munge,
+ "Sending newsegment: update %d start %" GST_TIME_FORMAT " stop %"
+ GST_TIME_FORMAT " accum now %" GST_TIME_FORMAT, update,
GST_TIME_ARGS (start), GST_TIME_ARGS (stop),
GST_TIME_ARGS (segment->accum));
diff --git a/ext/x264/GstX264Enc.prs b/ext/x264/GstX264Enc.prs
index daf60a77..84c76a94 100644
--- a/ext/x264/GstX264Enc.prs
+++ b/ext/x264/GstX264Enc.prs
@@ -2,12 +2,43 @@
version=0.10
element-name=GstX264Enc
-# see http://mewiki.project357.com/wiki/X264_Settings for x264 properties
-
-# lower default bitrate
-# turn of cabac for devices that do not support main-profile
-[just-an-example]
-_meta/comment=use for mobile pocket video player
-_meta/device=pocketvideo
-bitrate=1024
+[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/gstx264enc.c b/ext/x264/gstx264enc.c
index 37f53cce..0bcd4434 100644
--- a/ext/x264/gstx264enc.c
+++ b/ext/x264/gstx264enc.c
@@ -76,6 +76,7 @@ enum
ARG_PASS,
ARG_QUANTIZER,
ARG_STATS_FILE,
+ ARG_MULTIPASS_CACHE_FILE,
ARG_BYTE_STREAM,
ARG_BITRATE,
ARG_VBV_BUF_CAPACITY,
@@ -104,7 +105,8 @@ enum
#define ARG_THREADS_DEFAULT 1
#define ARG_PASS_DEFAULT 0
#define ARG_QUANTIZER_DEFAULT 21
-#define ARG_STATS_FILE_DEFAULT "x264.log"
+#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
@@ -300,8 +302,12 @@ gst_x264_enc_class_init (GstX264EncClass * klass)
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",
+ "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",
@@ -448,7 +454,7 @@ gst_x264_enc_init (GstX264Enc * encoder, GstX264EncClass * klass)
encoder->threads = ARG_THREADS_DEFAULT;
encoder->pass = ARG_PASS_DEFAULT;
encoder->quantizer = ARG_QUANTIZER_DEFAULT;
- encoder->stats_file = g_strdup (ARG_STATS_FILE_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;
@@ -502,8 +508,8 @@ gst_x264_enc_finalize (GObject * object)
{
GstX264Enc *encoder = GST_X264_ENC (object);
- g_free (encoder->stats_file);
- encoder->stats_file = NULL;
+ g_free (encoder->mp_cache_file);
+ encoder->mp_cache_file = NULL;
g_free (encoder->buffer);
encoder->buffer = NULL;
g_queue_free (encoder->delay);
@@ -637,8 +643,8 @@ gst_x264_enc_init_encoder (GstX264Enc * encoder)
encoder->x264param.rc.b_stat_write = 1;
break;
}
- encoder->x264param.rc.psz_stat_in = encoder->stats_file;
- encoder->x264param.rc.psz_stat_out = encoder->stats_file;
+ encoder->x264param.rc.psz_stat_in = encoder->mp_cache_file;
+ encoder->x264param.rc.psz_stat_out = encoder->mp_cache_file;
GST_OBJECT_UNLOCK (encoder);
@@ -1110,9 +1116,10 @@ gst_x264_enc_set_property (GObject * object, guint prop_id,
encoder->quantizer = g_value_get_uint (value);
break;
case ARG_STATS_FILE:
- if (encoder->stats_file)
- g_free (encoder->stats_file);
- encoder->stats_file = g_value_dup_string (value);
+ 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);
@@ -1218,7 +1225,8 @@ gst_x264_enc_get_property (GObject * object, guint prop_id,
g_value_set_uint (value, encoder->quantizer);
break;
case ARG_STATS_FILE:
- g_value_set_string (value, encoder->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);
@@ -1303,7 +1311,7 @@ plugin_init (GstPlugin * plugin)
"h264 encoding element");
return gst_element_register (plugin, "x264enc",
- GST_RANK_NONE, GST_TYPE_X264_ENC);
+ GST_RANK_PRIMARY, GST_TYPE_X264_ENC);
}
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
diff --git a/ext/x264/gstx264enc.h b/ext/x264/gstx264enc.h
index 7cebf112..15ffe65e 100644
--- a/ext/x264/gstx264enc.h
+++ b/ext/x264/gstx264enc.h
@@ -57,7 +57,7 @@ struct _GstX264Enc
guint threads;
gint pass;
guint quantizer;
- gchar *stats_file;
+ gchar *mp_cache_file;
gboolean byte_stream;
guint bitrate;
gint me;
diff --git a/ext/xvid/gstxvidenc.c b/ext/xvid/gstxvidenc.c
index ea6d3aed..40b5be22 100644
--- a/ext/xvid/gstxvidenc.c
+++ b/ext/xvid/gstxvidenc.c
@@ -199,9 +199,17 @@ gst_xvidenc_get_type (void)
0,
(GInstanceInitFunc) gst_xvidenc_init,
};
+ const GInterfaceInfo preset_interface_info = {
+ NULL, /* interface_init */
+ NULL, /* interface_finalize */
+ NULL /* interface_data */
+ };
xvidenc_type = g_type_register_static (GST_TYPE_ELEMENT,
"GstXvidEnc", &xvidenc_info, 0);
+
+ g_type_add_interface_static (xvidenc_type, GST_TYPE_PRESET,
+ &preset_interface_info);
}
return xvidenc_type;
}
diff --git a/gst-plugins-bad.doap b/gst-plugins-bad.doap
index ab67cf2e..4e8dbecc 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.12</revision>
+ <branch>0.10</branch>
+ <name>More than I can handle</name>
+ <created>2009-05-20</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-0.10.12.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-0.10.12.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
<revision>0.10.11</revision>
<branch>0.10</branch>
<name>A precious stone</name>
diff --git a/gst-plugins-bad.spec.in b/gst-plugins-bad.spec.in
index 8992e518..d9031f54 100644
--- a/gst-plugins-bad.spec.in
+++ b/gst-plugins-bad.spec.in
@@ -79,9 +79,7 @@ rm -rf $RPM_BUILD_ROOT
%{_libdir}/gstreamer-%{majorminor}/libgstfreeze.so
%{_libdir}/gstreamer-%{majorminor}/libgsth264parse.so
%{_libdir}/gstreamer-%{majorminor}/libgstnsf.so
-%{_libdir}/gstreamer-%{majorminor}/libgstdeinterlace.so
%{_libdir}/gstreamer-%{majorminor}/libgstnuvdemux.so
-%{_libdir}/gstreamer-%{majorminor}/libgsty4menc.so
%{_libdir}/gstreamer-%{majorminor}/libgstrfbsrc.so
%{_libdir}/gstreamer-%{majorminor}/libgstreal.so
%{_libdir}/gstreamer-%{majorminor}/libgstmve.so
@@ -101,7 +99,6 @@ rm -rf $RPM_BUILD_ROOT
%{_libdir}/gstreamer-%{majorminor}/libgstselector.so
%{_libdir}/gstreamer-%{majorminor}/libgstsubenc.so
%{_libdir}/gstreamer-%{majorminor}/libgstoss4audio.so
-%{_libdir}/gstreamer-%{majorminor}/libgstdeinterlace2.so
%{_libdir}/gstreamer-%{majorminor}/libresindvd.so
%{_libdir}/gstreamer-%{majorminor}/libgstaiffparse.so
%{_libdir}/gstreamer-%{majorminor}/libgstdccp.so
@@ -109,7 +106,6 @@ rm -rf $RPM_BUILD_ROOT
%{_libdir}/gstreamer-%{majorminor}/libgstmpegtsmux.so
%{_libdir}/gstreamer-%{majorminor}/libgstscaletempoplugin.so
%{_libdir}/gstreamer-%{majorminor}/libgstmpegdemux.so
-%{_libdir}/gstreamer-%{majorminor}/libgstflv.so
%{_libdir}/gstreamer-%{majorminor}/libgstjp2k.so
%{_libdir}/gstreamer-%{majorminor}/libgstapexsink.so
%{_libdir}/gstreamer-%{majorminor}/libgstaacparse.so
@@ -126,7 +122,9 @@ rm -rf $RPM_BUILD_ROOT
%{_libdir}/gstreamer-%{majorminor}/libgstrtpmux.so
%{_libdir}/gstreamer-%{majorminor}/libgstsiren.so
%{_libdir}/gstreamer-%{majorminor}/libgstxdgmime.so
-%{_libdir}/gstreamer-%{majorminor}/libgstfpsdisplaysink.so
+%{_libdir}/gstreamer-%{majorminor}/libgstadpcmdec.so
+%{_libdir}/gstreamer-%{majorminor}/libgstid3tag.so
+%{_libdir}/gstreamer-%{majorminor}/libgstdebugutilsbad.so
%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/photography-enumtypes.h
%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/photography.h
%{_libdir}/libgstphotography-0.10.so
@@ -134,6 +132,7 @@ rm -rf $RPM_BUILD_ROOT
%{_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
@USE_FAAC_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstfaac.so
diff --git a/gst/adpcmdec/Makefile.am b/gst/adpcmdec/Makefile.am
new file mode 100644
index 00000000..5c60ad4f
--- /dev/null
+++ b/gst/adpcmdec/Makefile.am
@@ -0,0 +1,12 @@
+plugin_LTLIBRARIES = libgstadpcmdec.la
+
+# sources used to compile this plug-in
+libgstadpcmdec_la_SOURCES = adpcmdec.c
+
+# flags used to compile this plugin
+# add other _CFLAGS and _LIBS as needed
+libgstadpcmdec_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS)
+libgstadpcmdec_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS)
+libgstadpcmdec_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstadpcmdec_la_LIBTOOLFLAGS = --tag=disable-static
+
diff --git a/gst/adpcmdec/adpcmdec.c b/gst/adpcmdec/adpcmdec.c
new file mode 100644
index 00000000..c58dc5d8
--- /dev/null
+++ b/gst/adpcmdec/adpcmdec.c
@@ -0,0 +1,452 @@
+/* GStreamer
+ * Copyright (C) 2009 Pioneers of the Inevitable <songbird@songbirdnest.com>
+ *
+ * Authors: Michael Smith <msmith@songbirdnest.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.
+ */
+
+/* Based on MS-ADPCM decoder in libsndfile,
+ Copyright (C) 1999-2002 Erik de Castro Lopo <erikd@zip.com.au
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+#include <gst/base/gstadapter.h>
+
+#define GST_TYPE_ADPCM_DEC \
+ (adpcmdec_get_type ())
+
+#define GST_ADPCM_DEC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_ADPCM_DEC, ADPCMDec))
+
+#define GST_CAT_DEFAULT adpcmdec_debug
+GST_DEBUG_CATEGORY_STATIC (adpcmdec_debug);
+
+static const GstElementDetails adpcmdec_details =
+GST_ELEMENT_DETAILS ("MS-ADPCM decoder",
+ "Codec/Decoder/Audio",
+ "Decode MS AD-PCM audio",
+ "Pioneers of the Inevitable <songbird@songbirdnest.com");
+
+static GstStaticPadTemplate adpcmdec_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-adpcm, "
+ "layout=(string)microsoft, "
+ "block_align = (int) [64, 8096], "
+ "rate = (int)[ 1, MAX ], " "channels = (int)[1,2]")
+ );
+
+static GstStaticPadTemplate adpcmdec_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-raw-int, "
+ "depth = (int)16, "
+ "width = (int)16, "
+ "endianness = (int)" G_STRINGIFY (G_BYTE_ORDER) ", "
+ "signed = (boolean)TRUE, "
+ "channels = (int) [1,2], " "rate = (int)[1, MAX]")
+ );
+
+typedef struct _ADPCMDecClass
+{
+ GstElementClass parent_class;
+} ADPCMDecClass;
+
+typedef struct _ADPCMDec
+{
+ GstElement parent;
+
+ GstPad *sinkpad;
+ GstPad *srcpad;
+
+ GstCaps *output_caps;
+
+ int rate;
+ int channels;
+ int blocksize;
+
+ gboolean is_setup;
+
+ GstClockTime timestamp;
+
+ guint64 out_samples;
+
+ GstAdapter *adapter;
+
+} ADPCMDec;
+
+GST_BOILERPLATE (ADPCMDec, adpcmdec, GstElement, GST_TYPE_ELEMENT);
+static gboolean
+adpcmdec_setup (ADPCMDec * dec)
+{
+ dec->output_caps = gst_caps_new_simple ("audio/x-raw-int",
+ "rate", G_TYPE_INT, dec->rate,
+ "channels", G_TYPE_INT, dec->channels,
+ "width", G_TYPE_INT, 16,
+ "depth", G_TYPE_INT, 16,
+ "endianness", G_TYPE_INT, G_BYTE_ORDER,
+ "signed", G_TYPE_BOOLEAN, TRUE, NULL);
+
+ if (dec->output_caps) {
+ gst_pad_set_caps (dec->srcpad, dec->output_caps);
+ }
+
+ dec->is_setup = TRUE;
+ dec->timestamp = GST_CLOCK_TIME_NONE;
+ dec->adapter = gst_adapter_new ();
+ dec->out_samples = 0;
+
+ return gst_pad_push_event (dec->srcpad, gst_event_new_new_segment (FALSE,
+ 1.0, GST_FORMAT_TIME, 0, -1, 0));
+}
+
+static void
+adpcmdec_teardown (ADPCMDec * dec)
+{
+ if (dec->output_caps) {
+ gst_caps_unref (dec->output_caps);
+ dec->output_caps = NULL;
+ }
+ if (dec->adapter) {
+ g_object_unref (dec->adapter);
+ dec->adapter = NULL;
+ }
+ dec->is_setup = FALSE;
+}
+
+static gboolean
+adpcmdec_sink_setcaps (GstPad * pad, GstCaps * caps)
+{
+ ADPCMDec *dec = (ADPCMDec *) gst_pad_get_parent (pad);
+ GstStructure *structure = gst_caps_get_structure (caps, 0);
+
+ if (!gst_structure_get_int (structure, "block_align", &dec->blocksize))
+ return FALSE;
+ if (!gst_structure_get_int (structure, "rate", &dec->rate))
+ return FALSE;
+ if (!gst_structure_get_int (structure, "channels", &dec->channels))
+ return FALSE;
+
+ if (dec->is_setup)
+ adpcmdec_teardown (dec);
+ gst_object_unref (dec);
+
+ return TRUE;
+}
+
+
+/*=====================================================================
+ * From libsndfile:
+ *
+ * MS ADPCM Block Layout.
+ * ======================
+ * Block is usually 256, 512 or 1024 bytes depending on sample rate.
+ * For a mono file, the block is laid out as follows:
+ * byte purpose
+ * 0 block predictor [0..6]
+ * 1,2 initial idelta (positive)
+ * 3,4 sample 1
+ * 5,6 sample 0
+ * 7..n packed bytecodes
+ *
+ * For a stereo file, the block is laid out as follows:
+ * byte purpose
+ * 0 block predictor [0..6] for left channel
+ * 1 block predictor [0..6] for right channel
+ * 2,3 initial idelta (positive) for left channel
+ * 4,5 initial idelta (positive) for right channel
+ * 6,7 sample 1 for left channel
+ * 8,9 sample 1 for right channel
+ * 10,11 sample 0 for left channel
+ * 12,13 sample 0 for right channel
+ * 14..n packed bytecodes
+ *
+ *=====================================================================
+*/
+static int AdaptationTable[] = {
+ 230, 230, 230, 230, 307, 409, 512, 614,
+ 768, 614, 512, 409, 307, 230, 230, 230
+};
+
+static int AdaptCoeff1[] = {
+ 256, 512, 0, 192, 240, 460, 392
+};
+
+static int AdaptCoeff2[] = {
+ 0, -256, 0, 64, 0, -208, -232
+};
+
+static gint16
+read_sample (guint8 * data)
+{
+ guint16 val = data[0] | (data[1] << 8);
+ return *((gint16 *) & val);
+}
+
+/* Decode a single block of data from 'data', storing 'n_samples' decoded 16 bit
+ samples in 'samples'.
+
+ All buffer lengths have been verified by the caller
+ */
+static gboolean
+adpcmdec_decode_ms_block (ADPCMDec * dec, int n_samples, guint8 * data,
+ gint16 * samples)
+{
+ gint16 pred[2];
+ gint16 idelta[2];
+ int idx; /* Current byte offset in 'data' */
+ int i; /* Current sample index in 'samples' */
+
+ /* Read the block header, verify for sanity */
+ if (dec->channels == 1) {
+ pred[0] = data[0];
+ idelta[0] = read_sample (data + 1);
+ samples[1] = read_sample (data + 3);
+ samples[0] = read_sample (data + 5);
+ idx = 7;
+ i = 2;
+ if (pred[0] < 0 || pred[0] > 6) {
+ GST_WARNING_OBJECT (dec, "Invalid block predictor");
+ return FALSE;
+ }
+ }
+
+ else {
+ pred[0] = data[0];
+ pred[1] = data[1];
+ idelta[0] = read_sample (data + 2);
+ idelta[1] = read_sample (data + 4);
+ samples[2] = read_sample (data + 6);
+ samples[3] = read_sample (data + 8);
+ samples[0] = read_sample (data + 10);
+ samples[1] = read_sample (data + 12);
+ idx = 14;
+ i = 4;
+ if (pred[0] < 0 || pred[0] > 6 || pred[1] < 0 || pred[1] > 6) {
+ GST_WARNING_OBJECT (dec, "Invalid block predictor");
+ return FALSE;
+ }
+ }
+ for (; i < n_samples; i++) {
+ int chan = i % dec->channels;
+ int bytecode;
+ int delta;
+ int current;
+ int predict;
+ if (i % 2 == 0) {
+ bytecode = (data[idx] >> 4) & 0x0F;
+ } else {
+ bytecode = data[idx] & 0x0F;
+ idx++;
+ }
+
+ delta = idelta[chan];
+ idelta[chan] = (AdaptationTable[bytecode] * delta) >> 8;
+ if (idelta[chan] < 16)
+ idelta[chan] = 16;
+
+ /* Bytecode is used above as an index into the table. Below, it's used
+ as a signed 4-bit value; convert appropriately */
+ if (bytecode & 0x8)
+ bytecode -= 0x10;
+
+ predict = ((samples[i - dec->channels] * AdaptCoeff1[pred[chan]]) +
+ (samples[i - 2 * dec->channels] * AdaptCoeff2[pred[chan]])
+ ) >> 8;
+
+ current = (bytecode * delta) + predict;
+
+ /* Clamp to 16 bits, store decoded sample */
+ samples[i] = CLAMP (current, G_MININT16, G_MAXINT16);
+ }
+ return TRUE;
+}
+
+static GstFlowReturn
+adpcmdec_chain (GstPad * pad, GstBuffer * buf)
+{
+ ADPCMDec *dec = (ADPCMDec *) gst_pad_get_parent (pad);
+ GstFlowReturn ret = GST_FLOW_OK;
+ guint8 *data;
+ GstBuffer *outbuf = NULL;
+ GstBuffer *databuf = NULL;
+ int outsize;
+ int samples;
+ gboolean res;
+
+ if (!dec->is_setup)
+ adpcmdec_setup (dec);
+
+ if (dec->timestamp == GST_CLOCK_TIME_NONE)
+ dec->timestamp = GST_BUFFER_TIMESTAMP (buf);
+
+ gst_adapter_push (dec->adapter, buf);
+
+ while (gst_adapter_available (dec->adapter) >= dec->blocksize) {
+ databuf = gst_adapter_take_buffer (dec->adapter, dec->blocksize);
+ data = GST_BUFFER_DATA (databuf);
+
+ /* Each block has a 3 byte header per channel, plus 4 bytes per channel to
+ give two initial sample values per channel. Then the remainder gives
+ two samples per byte */
+ samples = (dec->blocksize - 7 * dec->channels) * 2 + 2 * dec->channels;
+ outsize = 2 * samples;
+ outbuf = gst_buffer_new_and_alloc (outsize);
+
+ res = adpcmdec_decode_ms_block (dec, samples, data,
+ (gint16 *) (GST_BUFFER_DATA (outbuf)));
+
+ /* Done with input data, free it */
+ gst_buffer_unref (databuf);
+
+ if (!res) {
+ gst_buffer_unref (outbuf);
+ GST_WARNING_OBJECT (dec, "Decode of block failed");
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+
+ gst_buffer_set_caps (outbuf, dec->output_caps);
+ GST_BUFFER_TIMESTAMP (outbuf) = dec->timestamp;
+ dec->out_samples += samples / dec->channels;
+ dec->timestamp =
+ gst_util_uint64_scale_int (dec->out_samples, GST_SECOND, dec->rate);
+ GST_BUFFER_DURATION (outbuf) =
+ dec->timestamp - GST_BUFFER_TIMESTAMP (outbuf);
+
+ ret = gst_pad_push (dec->srcpad, outbuf);
+ if (ret != GST_FLOW_OK)
+ goto done;
+ }
+
+done:
+ gst_object_unref (dec);
+
+ return ret;
+}
+
+static gboolean
+adpcmdec_sink_event (GstPad * pad, GstEvent * event)
+{
+ ADPCMDec *dec = (ADPCMDec *) gst_pad_get_parent (pad);
+ gboolean res;
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_STOP:
+ gst_adapter_clear (dec->adapter);
+ /* Fall through */
+ default:
+ res = gst_pad_push_event (dec->srcpad, event);
+ break;
+ }
+ gst_object_unref (dec);
+ return res;
+}
+
+static GstStateChangeReturn
+adpcmdec_change_state (GstElement * element, GstStateChange transition)
+{
+ GstStateChangeReturn ret;
+ ADPCMDec *dec = (ADPCMDec *) element;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ adpcmdec_teardown (dec);
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ break;
+ default:
+ break;
+ }
+ return ret;
+}
+
+static void
+adpcmdec_dispose (GObject * obj)
+{
+ G_OBJECT_CLASS (parent_class)->dispose (obj);
+}
+
+static void
+adpcmdec_init (ADPCMDec * dec, ADPCMDecClass * klass)
+{
+ dec->sinkpad =
+ gst_pad_new_from_static_template (&adpcmdec_sink_template, "sink");
+ gst_pad_set_setcaps_function (dec->sinkpad,
+ GST_DEBUG_FUNCPTR (adpcmdec_sink_setcaps));
+ gst_pad_set_chain_function (dec->sinkpad, GST_DEBUG_FUNCPTR (adpcmdec_chain));
+ gst_pad_set_event_function (dec->sinkpad,
+ GST_DEBUG_FUNCPTR (adpcmdec_sink_event));
+ gst_element_add_pad (GST_ELEMENT (dec), dec->sinkpad);
+ dec->srcpad =
+ gst_pad_new_from_static_template (&adpcmdec_src_template, "src");
+ gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad);
+}
+
+static void
+adpcmdec_class_init (ADPCMDecClass * klass)
+{
+ GObjectClass *gobjectclass = (GObjectClass *) klass;
+ GstElementClass *gstelement_class = (GstElementClass *) klass;
+ gobjectclass->dispose = adpcmdec_dispose;
+ gstelement_class->change_state = adpcmdec_change_state;
+} static void
+
+adpcmdec_base_init (gpointer klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&adpcmdec_sink_template));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&adpcmdec_src_template));
+ gst_element_class_set_details (element_class, &adpcmdec_details);
+}
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ GST_DEBUG_CATEGORY_INIT (adpcmdec_debug, "adpcmdec", 0, "ADPCM Decoders");
+ if (!gst_element_register (plugin, "msadpcmdec", GST_RANK_PRIMARY,
+ GST_TYPE_ADPCM_DEC)) {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "adpcmdec",
+ "ADPCM decoder", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME,
+ GST_PACKAGE_ORIGIN);
diff --git a/gst/debugutils/fpsdisplaysink.c b/gst/debugutils/fpsdisplaysink.c
index b37ab112..54f5cc54 100644
--- a/gst/debugutils/fpsdisplaysink.c
+++ b/gst/debugutils/fpsdisplaysink.c
@@ -267,11 +267,11 @@ fps_display_sink_start (GstFPSDisplaySink * self)
gst_object_ref (self->text_overlay);
g_object_set (self->text_overlay,
"font-desc", DEFAULT_FONT, "silent", FALSE, NULL);
- }
- gst_bin_add (GST_BIN (self), self->text_overlay);
+ gst_bin_add (GST_BIN (self), self->text_overlay);
- if (!gst_element_link (self->text_overlay, self->video_sink)) {
- GST_ERROR_OBJECT (self, "Could not link elements");
+ if (!gst_element_link (self->text_overlay, self->video_sink)) {
+ GST_ERROR_OBJECT (self, "Could not link elements");
+ }
}
target_pad = gst_element_get_static_pad (self->text_overlay, "video_sink");
}
@@ -280,6 +280,7 @@ no_text_overlay:
if (self->text_overlay) {
gst_element_unlink (self->text_overlay, self->video_sink);
gst_bin_remove (GST_BIN (self), self->text_overlay);
+ self->text_overlay = NULL;
}
target_pad = gst_element_get_static_pad (self->video_sink, "sink");
}
@@ -300,6 +301,13 @@ fps_display_sink_stop (GstFPSDisplaySink * self)
g_source_remove (self->timeout_id);
self->timeout_id = 0;
}
+
+ if (self->text_overlay) {
+ gst_element_unlink (self->text_overlay, self->video_sink);
+ gst_bin_remove (GST_BIN (self), self->text_overlay);
+ gst_object_unref (self->text_overlay);
+ self->text_overlay = NULL;
+ }
}
static void
diff --git a/gst/deinterlace/.gitignore b/gst/deinterlace/.gitignore
deleted file mode 100644
index 08f5ed37..00000000
--- a/gst/deinterlace/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-Makefile
-Makefile.in
-*.o
-*.lo
-*.la
-.deps
-.libs
diff --git a/gst/deinterlace/Makefile.am b/gst/deinterlace/Makefile.am
deleted file mode 100644
index 3d842d01..00000000
--- a/gst/deinterlace/Makefile.am
+++ /dev/null
@@ -1,12 +0,0 @@
-plugin_LTLIBRARIES = libgstdeinterlace.la
-
-libgstdeinterlace_la_SOURCES = gstdeinterlace.c
-libgstdeinterlace_la_CFLAGS = \
- $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS)
-libgstdeinterlace_la_LIBADD = \
- $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(GST_BASE_LIBS)
-libgstdeinterlace_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libgstdeinterlace_la_LIBTOOLFLAGS = --tag=disable-static
-
-noinst_HEADERS = gstdeinterlace.h
-
diff --git a/gst/deinterlace/deinterlace.vcproj b/gst/deinterlace/deinterlace.vcproj
deleted file mode 100644
index 200d88ee..00000000
--- a/gst/deinterlace/deinterlace.vcproj
+++ /dev/null
@@ -1,148 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="deinterlace"
- ProjectGUID="{979C216F-0ACF-4956-AE00-055A42D678B0}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../win32/Debug"
- IntermediateDirectory="../../win32/Debug"
- ConfigurationType="2"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../../../gstreamer/win32;../../../gstreamer;../../../gstreamer/libs;../../../glib;../../../glib/glib;../../../glib/gmodule;&quot;../../gst-libs&quot;;../../../popt/include;../../../libxml2/include/libxml2"
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;deinterlace_EXPORTS;HAVE_CONFIG_H;_USE_MATH_DEFINES"
- MinimalRebuild="TRUE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="4"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
- OutputFile="$(OutDir)/gstdeinterlace.dll"
- LinkIncremental="2"
- AdditionalLibraryDirectories="../../../gstreamer/win32/Debug;../../../glib/glib;../../../glib/gmodule;../../../glib/gthread;../../../glib/gobject;../../../gettext/lib;../../../libiconv/lib"
- ModuleDefinitionFile=""
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/deinterlace.pdb"
- SubSystem="2"
- OptimizeReferences="2"
- ImportLibrary="$(OutDir)/gstdeinterlace.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../win32/Release"
- IntermediateDirectory="../../win32/Release"
- ConfigurationType="2"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="../../../gstreamer/win32;../../../gstreamer;../../../gstreamer/libs;../../../glib;../../../glib/glib;../../../glib/gmodule;&quot;../../gst-libs&quot;;../../../popt/include;../../../libxml2/include/libxml2"
- PreprocessorDefinitions="WIN32;NDEBUG;GST_DISABLE_GST_DEBUG;_WINDOWS;_USRDLL;deinterlace_EXPORTS;HAVE_CONFIG_H;_USE_MATH_DEFINES"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
- OutputFile="$(OutDir)/gstdeinterlace.dll"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../gstreamer/win32/Release;../../../glib/glib;../../../glib/gmodule;../../../glib/gthread;../../../glib/gobject;../../../gettext/lib;../../../libiconv/lib"
- ModuleDefinitionFile=""
- GenerateDebugInformation="TRUE"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- ImportLibrary="$(OutDir)/gstdeinterlace.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath=".\gstdeinterlace.c">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
- <File
- RelativePath=".\gstdeinterlace.h">
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/gst/deinterlace/gstdeinterlace.c b/gst/deinterlace/gstdeinterlace.c
deleted file mode 100644
index b2a25afe..00000000
--- a/gst/deinterlace/gstdeinterlace.c
+++ /dev/null
@@ -1,514 +0,0 @@
-/* GStreamer simple deinterlacing plugin
- * Copyright (C) 1999 Erik Walthinsen <omega@cse.ogi.edu>
- * Copyright (C) 2006-2008 Tim-Philipp Müller <tim centricular 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.
- */
-/* based on the Area Based Deinterlacer (for RGB frames) */
-/* (a VirtualDub filter) from Gunnar Thalin <guth@home.se> */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <string.h>
-#include "gstdeinterlace.h"
-#include <gst/video/video.h>
-
-/**
- * SECTION:element-deinterlace
- *
- * Adaptively deinterlaces video frames by detecting interlacing artifacts.
- * An edge detection matrix is used, with a threshold value. Pixels detected
- * as 'interlaced' are replaced with pixels blended from the pixels above and
- * below.
- *
- * <refsect2>
- * <title>Example launch line</title>
- * |[
- * gst-launch -v videotestsrc ! deinterlace ! ffmpegcolorspace ! xvimagesink
- * ]|
- * </refsect2>
- */
-
-GST_DEBUG_CATEGORY_STATIC (deinterlace_debug);
-#define GST_CAT_DEFAULT deinterlace_debug
-
-#define DEFAULT_DI_AREA_ONLY FALSE
-#define DEFAULT_NI_AREA_ONLY FALSE
-#define DEFAULT_BLEND FALSE
-#define DEFAULT_DEINTERLACE TRUE
-#define DEFAULT_THRESHOLD 20
-#define DEFAULT_EDGE_DETECT 25
-
-enum
-{
- ARG_0,
- ARG_DI_ONLY,
- ARG_NI_ONLY,
- ARG_BLEND,
- ARG_THRESHOLD,
- ARG_EDGE_DETECT,
- ARG_DEINTERLACE
-};
-
-static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
- GST_PAD_SRC,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{ I420, Y42B }"))
- );
-
-static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
- GST_PAD_SINK,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{ I420, Y42B }"))
- );
-
-GST_BOILERPLATE (GstDeinterlace, gst_deinterlace, GstBaseTransform,
- GST_TYPE_BASE_TRANSFORM);
-
-static void gst_deinterlace_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec);
-static void gst_deinterlace_get_property (GObject * object, guint prop_id,
- GValue * value, GParamSpec * pspec);
-static GstFlowReturn gst_deinterlace_transform_ip (GstBaseTransform * trans,
- GstBuffer * buf);
-static gboolean gst_deinterlace_stop (GstBaseTransform * trans);
-static gboolean gst_deinterlace_set_caps (GstBaseTransform * trans,
- GstCaps * incaps, GstCaps * outcaps);
-static GstCaps *gst_deinterlace_transform_caps (GstBaseTransform * trans,
- GstPadDirection direction, GstCaps * incaps);
-
-static void
-gst_deinterlace_base_init (gpointer g_class)
-{
- GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
-
- gst_element_class_set_details_simple (element_class, "Deinterlace",
- "Filter/Effect/Video", "Deinterlace video",
- "Wim Taymans <wim.taymans@gmail.com>");
-}
-
-static void
-gst_deinterlace_class_init (GstDeinterlaceClass * klass)
-{
- GObjectClass *gobject_class;
- GstBaseTransformClass *basetransform_class;
-
- gobject_class = (GObjectClass *) klass;
- basetransform_class = (GstBaseTransformClass *) klass;
-
- gobject_class->set_property = gst_deinterlace_set_property;
- gobject_class->get_property = gst_deinterlace_get_property;
-
- /**
- * GstDeinterlace:deinterlace:
- *
- * Turn processing on/off. When false, no modification of the
- * video frames occurs and they pass through intact.
- */
- g_object_class_install_property (gobject_class, ARG_DEINTERLACE,
- g_param_spec_boolean ("deinterlace", "deinterlace",
- "turn deinterlacing on/off", DEFAULT_DEINTERLACE, G_PARAM_READWRITE));
- /**
- * GstDeinterlace:di-area-only:
- *
- * When set to true, only areas affected by the deinterlacing are output,
- * making it easy to see which regions are being modified.
- *
- * See Also: #GstDeinterlace:ni-area-only
- */
- g_object_class_install_property (gobject_class, ARG_DI_ONLY,
- g_param_spec_boolean ("di-area-only", "di-area-only",
- "displays deinterlaced areas only", DEFAULT_DI_AREA_ONLY,
- G_PARAM_READWRITE));
- /**
- * GstDeinterlace:ni-area-only:
- *
- * When set to true, only areas unaffected by the deinterlacing are output,
- * making it easy to see which regions are being preserved intact.
- *
- * See Also: #GstDeinterlace:di-area-only
- */
- g_object_class_install_property (gobject_class, ARG_NI_ONLY,
- g_param_spec_boolean ("ni-area-only", "ni-area-only",
- "displays non-interlaced areas only", DEFAULT_DI_AREA_ONLY,
- G_PARAM_READWRITE));
- /**
- * GstDeinterlace:blend:
- *
- * Change the blending for pixels which are detected as
- * 'interlacing artifacts'. When true, the output pixel is a weighted
- * average (1,2,1) of the pixel and the pixels above and below it.
- * When false, the odd field lines are preserved, and the even field lines
- * are averaged from the surrounding pixels above and below (the odd field).
- */
- g_object_class_install_property (gobject_class, ARG_BLEND,
- g_param_spec_boolean ("blend", "blend", "blend", DEFAULT_BLEND,
- G_PARAM_READWRITE));
- /**
- * GstDeinterlace:threshold:
- *
- * Affects the threshold of the edge-detection function used for detecting
- * interlacing artifacts.
- */
- g_object_class_install_property (gobject_class, ARG_THRESHOLD,
- g_param_spec_int ("threshold", "Edge-detection threshold",
- "Threshold value for the interlacing artifacts in the output "
- "of the edge detection", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE));
- /**
- * GstDeinterlace:edge-detect:
- *
- * Affects the weighting of the edge-detection function used for detecting
- * interlacing artifacts.
- */
- g_object_class_install_property (gobject_class, ARG_EDGE_DETECT,
- g_param_spec_int ("edge-detect", "edge detection weighting",
- "Weighting value used for calculating the edge detection matrix",
- G_MININT, G_MAXINT, 0, G_PARAM_READWRITE));
-
- basetransform_class->transform_ip =
- GST_DEBUG_FUNCPTR (gst_deinterlace_transform_ip);
- basetransform_class->transform_caps =
- GST_DEBUG_FUNCPTR (gst_deinterlace_transform_caps);
- basetransform_class->stop = GST_DEBUG_FUNCPTR (gst_deinterlace_stop);
- basetransform_class->set_caps = GST_DEBUG_FUNCPTR (gst_deinterlace_set_caps);
-}
-
-static void
-gst_deinterlace_init (GstDeinterlace * filter, GstDeinterlaceClass * klass)
-{
- filter->show_deinterlaced_area_only = DEFAULT_DI_AREA_ONLY;
- filter->show_noninterlaced_area_only = DEFAULT_NI_AREA_ONLY;
- filter->blend = DEFAULT_BLEND;
- filter->deinterlace = DEFAULT_DEINTERLACE;
- filter->threshold = DEFAULT_THRESHOLD;
- filter->edge_detect = DEFAULT_EDGE_DETECT;
- /*filter->threshold_blend = 0; */
-
- filter->src = NULL;
- filter->picsize = 0;
-}
-
-static gboolean
-gst_deinterlace_stop (GstBaseTransform * trans)
-{
- GstDeinterlace *filter;
-
- filter = GST_DEINTERLACE (trans);
-
- g_free (filter->src);
- filter->src = NULL;
- filter->picsize = 0;
- filter->width = 0;
- filter->height = 0;
-
- return TRUE;
-}
-
-static GstCaps *
-gst_deinterlace_transform_caps (GstBaseTransform * trans,
- GstPadDirection direction, GstCaps * incaps)
-{
- return gst_caps_ref (incaps);
-}
-
-static gboolean
-gst_deinterlace_set_caps (GstBaseTransform * trans, GstCaps * incaps,
- GstCaps * outcaps)
-{
- GstDeinterlace *filter;
- GstVideoFormat fmt;
- GstStructure *s;
- guint32 fourcc;
- gint picsize, w, h;
-
- filter = GST_DEINTERLACE (trans);
-
- g_assert (gst_caps_is_equal_fixed (incaps, outcaps));
-
- s = gst_caps_get_structure (incaps, 0);
- if (!gst_structure_get_int (s, "width", &w) ||
- !gst_structure_get_int (s, "height", &h) ||
- !gst_structure_get_fourcc (s, "format", &fourcc)) {
- return FALSE;
- }
-
- filter->width = w;
- filter->height = h;
- filter->fourcc = fourcc;
-
- GST_DEBUG_OBJECT (filter, "width x height = %d x %d, fourcc: %"
- GST_FOURCC_FORMAT, w, h, GST_FOURCC_ARGS (fourcc));
-
- fmt = gst_video_format_from_fourcc (fourcc);
-
- filter->y_stride = gst_video_format_get_row_stride (fmt, 0, w);
- filter->u_stride = gst_video_format_get_row_stride (fmt, 1, w);
- filter->v_stride = gst_video_format_get_row_stride (fmt, 2, w);
-
- filter->uv_height = gst_video_format_get_component_height (fmt, 1, h);
-
- filter->y_off = gst_video_format_get_component_offset (fmt, 0, w, h);
- filter->u_off = gst_video_format_get_component_offset (fmt, 1, w, h);
- filter->v_off = gst_video_format_get_component_offset (fmt, 2, w, h);
-
- picsize = gst_video_format_get_size (fmt, w, h);
-
- if (filter->picsize != picsize) {
- filter->picsize = picsize;
- g_free (filter->src); /* free + alloc avoids memcpy */
- filter->src = g_malloc0 (filter->picsize);
- GST_LOG_OBJECT (filter, "temp buffer size %d", filter->picsize);
- }
-
- return TRUE;
-}
-
-static GstFlowReturn
-gst_deinterlace_transform_ip (GstBaseTransform * trans, GstBuffer * buf)
-{
- GstDeinterlace *filter;
- gboolean bShowDeinterlacedAreaOnly;
- gboolean bShowNoninterlacedAreaOnly;
- gint y0, y1, y2, y3;
- guchar *psrc1, *pdst1, *yuvptr, *src;
- gint iInterlaceValue0, iInterlaceValue1, iInterlaceValue2;
- gint x, y, p;
- gint y_line;
- guchar *y_dst, *y_src;
- guchar fill_value;
- gboolean bBlend;
- gboolean bDeinterlace;
- gint iThreshold;
- gint iEdgeDetect;
- gint width, height;
-
- /* g_assert (gst_buffer_is_writable (buf)); */
-
- filter = GST_DEINTERLACE (trans);
-
- GST_OBJECT_LOCK (filter);
- bBlend = filter->blend;
- bDeinterlace = filter->deinterlace;
- iThreshold = filter->threshold;
- iEdgeDetect = filter->edge_detect;
- bShowDeinterlacedAreaOnly = filter->show_deinterlaced_area_only;
- bShowNoninterlacedAreaOnly = filter->show_noninterlaced_area_only;
- GST_OBJECT_UNLOCK (filter);
-
- src = filter->src;
- yuvptr = GST_BUFFER_DATA (buf);
-
- memcpy (filter->src, yuvptr, filter->picsize);
-
-
- iThreshold = iThreshold * iThreshold * 4;
- /* We don't want an integer overflow in the interlace calculation. */
- if (iEdgeDetect > 180)
- iEdgeDetect = 180;
- iEdgeDetect = iEdgeDetect * iEdgeDetect;
-
- for (p = 0; p < 3; p++) {
- switch (p) {
- case 0:
- y_dst = yuvptr + filter->y_off; /* dst y pointer */
- y_line = filter->y_stride;
- y_src = src + filter->y_off;
- width = filter->width;
- height = filter->height;
- fill_value = 0;
- break;
- case 1:
- y_dst = yuvptr + filter->u_off; /* dst U pointer */
- y_line = filter->u_stride;
- y_src = src + filter->u_off;
- width = filter->width / 2;
- height = filter->uv_height;
- fill_value = 128;
- break;
- case 2:
- y_dst = yuvptr + filter->v_off; /* dst V pointer */
- y_line = filter->v_stride;
- y_src = src + filter->v_off;
- width = filter->width / 2;
- height = filter->uv_height;
- fill_value = 128;
- break;
- default:
- g_assert_not_reached ();
- break;
- }
-
- for (x = 0; x < width; x++) {
- pdst1 = y_dst + x;
- psrc1 = y_src + x;
- iInterlaceValue1 = iInterlaceValue2 = 0;
-
- for (y = 0; y < height; y++, psrc1 += y_line, pdst1 += y_line) {
- /* current line is 1 */
- y0 = y1 = y2 = y3 = *psrc1;
- if (y > 0)
- y0 = *(psrc1 - y_line);
- if (y < (height - 1))
- y2 = *(psrc1 + y_line);
- if (y < (height - 2))
- y3 = *(psrc1 + 2 * y_line);
-
- iInterlaceValue0 = iInterlaceValue1;
- iInterlaceValue1 = iInterlaceValue2;
-
- if (y < height - 1)
- iInterlaceValue2 =
- (ABS (y1 - y2) * ABS (y3 - y2) - ((iEdgeDetect * (y1 - y3) * (y1 -
- y3)) >> 12)) * 10;
- else
- iInterlaceValue2 = 0;
-
- if ((iInterlaceValue0 + 2 * iInterlaceValue1 + iInterlaceValue2 >
- iThreshold) && (y > 0)) {
- if (bShowNoninterlacedAreaOnly) {
- *pdst1 = fill_value; /* blank the point and so the interlac area */
- } else {
- if (bDeinterlace) {
- if (bBlend) {
- *pdst1 = (unsigned char) ((y0 + 2 * y1 + y2) >> 2);
- } else {
- /* this method seems to work better than blending if the */
- /* quality is pretty bad and the half pics don't fit together */
- if ((y % 2) == 1) { /* if odd simply copy the value */
- *pdst1 = *psrc1;
- } else { /* if even interpolate the line (upper + lower)/2 */
- *pdst1 = (unsigned char) ((y0 + y2) >> 1);
- }
- }
- } else {
- *pdst1 = *psrc1;
- }
- }
-
- } else {
- /* so we went below the treshold and therefore we don't have to */
- /* change anything */
- if (bShowDeinterlacedAreaOnly) {
- /* this is for testing to see how we should tune the treshhold */
- /* and shows as the things that haven't change because the */
- /* threshold was to low?? (or shows that everything is ok :-) */
- *pdst1 = fill_value; /* blank the point and so the non-interlac area */
- } else {
- *pdst1 = *psrc1;
- }
- }
- }
- }
- }
-
- return GST_FLOW_OK;
-}
-
-static void
-gst_deinterlace_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec)
-{
- GstDeinterlace *filter;
-
- filter = GST_DEINTERLACE (object);
-
- GST_OBJECT_LOCK (filter);
- switch (prop_id) {
- case ARG_DEINTERLACE:
- filter->deinterlace = g_value_get_boolean (value);
- break;
- case ARG_DI_ONLY:
- filter->show_deinterlaced_area_only = g_value_get_boolean (value);
- break;
- case ARG_NI_ONLY:
- filter->show_noninterlaced_area_only = g_value_get_boolean (value);
- break;
- case ARG_BLEND:
- filter->blend = g_value_get_boolean (value);
- break;
- case ARG_THRESHOLD:
- filter->threshold = g_value_get_int (value);
- break;
- case ARG_EDGE_DETECT:
- filter->edge_detect = g_value_get_int (value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
- GST_OBJECT_UNLOCK (filter);
-}
-
-static void
-gst_deinterlace_get_property (GObject * object, guint prop_id, GValue * value,
- GParamSpec * pspec)
-{
- GstDeinterlace *filter;
-
- filter = GST_DEINTERLACE (object);
-
- GST_OBJECT_LOCK (filter);
- switch (prop_id) {
- case ARG_DEINTERLACE:
- g_value_set_boolean (value, filter->deinterlace);
- break;
- case ARG_DI_ONLY:
- g_value_set_boolean (value, filter->show_deinterlaced_area_only);
- break;
- case ARG_NI_ONLY:
- g_value_set_boolean (value, filter->show_noninterlaced_area_only);
- break;
- case ARG_BLEND:
- g_value_set_boolean (value, filter->blend);
- break;
- case ARG_THRESHOLD:
- g_value_set_int (value, filter->threshold);
- break;
- case ARG_EDGE_DETECT:
- g_value_set_int (value, filter->edge_detect);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
- GST_OBJECT_UNLOCK (filter);
-}
-
-static gboolean
-plugin_init (GstPlugin * plugin)
-{
- GST_DEBUG_CATEGORY_INIT (deinterlace_debug, "deinterlace", 0,
- "deinterlace element");
-
- if (!gst_element_register (plugin, "deinterlace", GST_RANK_NONE,
- gst_deinterlace_get_type ()))
- return FALSE;
-
- return TRUE;
-}
-
-GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
- GST_VERSION_MINOR,
- "gstinterlace",
- "Deinterlace video", plugin_init, PACKAGE_VERSION, "LGPL", GST_PACKAGE_NAME,
- GST_PACKAGE_ORIGIN);
diff --git a/gst/deinterlace/gstdeinterlace.h b/gst/deinterlace/gstdeinterlace.h
deleted file mode 100644
index faa8e811..00000000
--- a/gst/deinterlace/gstdeinterlace.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* GStreamer simple deinterlacing plugin
- * Copyright (C) 1999 Erik Walthinsen <omega@cse.ogi.edu>
- * Copyright (C) 2006 Tim-Philipp Müller <tim centricular 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.
- */
-
-#ifndef __GST_DEINTERLACE_H__
-#define __GST_DEINTERLACE_H__
-
-#include <gst/gst.h>
-#include <gst/base/gstbasetransform.h>
-
-G_BEGIN_DECLS
-
-#define GST_TYPE_DEINTERLACE (gst_deinterlace_get_type())
-#define GST_DEINTERLACE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DEINTERLACE,GstDeinterlace))
-#define GST_DEINTERLACE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DEINTERLACE,GstDeinterlaceClass))
-#define GST_IS_DEINTERLACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DEINTERLACE))
-#define GST_IS_DEINTERLACE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DEINTERLACE))
-
-typedef struct _GstDeinterlace GstDeinterlace;
-typedef struct _GstDeinterlaceClass GstDeinterlaceClass;
-
-struct _GstDeinterlace {
- GstBaseTransform basetransform;
-
- /*< private >*/
- gint width;
- gint height;
- gint uv_height;
- guint32 fourcc;
-
- gboolean show_deinterlaced_area_only;
- gboolean show_noninterlaced_area_only;
- gboolean blend;
- gboolean deinterlace;
- gint threshold_blend; /* here we start blending */
- gint threshold; /* here we start interpolating TODO FIXME */
- gint edge_detect;
-
- gint picsize;
- gint y_stride;
- gint u_stride;
- gint v_stride;
- gint y_off;
- gint u_off;
- gint v_off;
-
- guchar *src;
-};
-
-struct _GstDeinterlaceClass {
- GstBaseTransformClass basetransformclass;
-};
-
-GType gst_deinterlace_get_type (void);
-
-G_END_DECLS
-
-#endif /* __GST_DEINTERLACE_H__ */
diff --git a/gst/deinterlace2/Makefile.am b/gst/deinterlace2/Makefile.am
deleted file mode 100644
index 1de59919..00000000
--- a/gst/deinterlace2/Makefile.am
+++ /dev/null
@@ -1,48 +0,0 @@
-plugin_LTLIBRARIES = libgstdeinterlace2.la
-
-libgstdeinterlace2_la_SOURCES = \
- gstdeinterlace2.c \
- tvtime/greedy.c \
- tvtime/greedyh.c \
- tvtime/vfir.c \
- tvtime/tomsmocomp.c \
- tvtime/weavetff.c \
- tvtime/weavebff.c \
- tvtime/weave.c \
- tvtime/linear.c \
- tvtime/linearblend.c \
- tvtime/scalerbob.c
-
-libgstdeinterlace2_la_CFLAGS = $(GST_CFLAGS) \
- $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(LIBOIL_CFLAGS)
-libgstdeinterlace2_la_LIBADD = $(GST_LIBS) \
- $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(LIBOIL_LIBS)
-libgstdeinterlace2_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libgstdeinterlace2_la_LIBTOOLFLAGS = --tag=disable-static
-
-noinst_HEADERS = \
- gstdeinterlace2.h \
- tvtime/mmx.h \
- tvtime/sse.h \
- tvtime/greedyh.asm \
- tvtime/greedyhmacros.h \
- tvtime/plugins.h \
- tvtime/x86-64_macros.inc \
- tvtime/tomsmocomp/SearchLoop0A.inc \
- tvtime/tomsmocomp/SearchLoopBottom.inc \
- tvtime/tomsmocomp/SearchLoopEdgeA8.inc \
- tvtime/tomsmocomp/SearchLoopEdgeA.inc \
- tvtime/tomsmocomp/SearchLoopOddA2.inc \
- tvtime/tomsmocomp/SearchLoopOddA6.inc \
- tvtime/tomsmocomp/SearchLoopOddAH2.inc \
- tvtime/tomsmocomp/SearchLoopOddAH.inc \
- tvtime/tomsmocomp/SearchLoopOddA.inc \
- tvtime/tomsmocomp/SearchLoopTop.inc \
- tvtime/tomsmocomp/SearchLoopVAH.inc \
- tvtime/tomsmocomp/SearchLoopVA.inc \
- tvtime/tomsmocomp/StrangeBob.inc \
- tvtime/tomsmocomp/TomsMoCompAll2.inc \
- tvtime/tomsmocomp/TomsMoCompAll.inc \
- tvtime/tomsmocomp/tomsmocompmacros.h \
- tvtime/tomsmocomp/WierdBob.inc
-
diff --git a/gst/deinterlace2/gstdeinterlace2.c b/gst/deinterlace2/gstdeinterlace2.c
deleted file mode 100644
index b293b43e..00000000
--- a/gst/deinterlace2/gstdeinterlace2.c
+++ /dev/null
@@ -1,1509 +0,0 @@
-/*
- * GStreamer
- * Copyright (C) 2005 Martin Eikermann <meiker@upb.de>
- * Copyright (C) 2008-2009 Sebastian Dröge <slomo@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.
- */
-
-/**
- * SECTION:element-deinterlace2
- *
- * deinterlace2 deinterlaces interlaced video frames to progressive video frames.
- * For this different algorithms can be selected which will be described later.
- *
- * <refsect2>
- * <title>Example launch line</title>
- * |[
- * gst-launch -v filesrc location=/path/to/file ! decodebin2 ! ffmpegcolorspace ! deinterlace2 ! ffmpegcolorspace ! autovideosink
- * ]| This pipeline deinterlaces a video file with the default deinterlacing options.
- * </refsect2>
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <gst/gst.h>
-#include <gst/video/video.h>
-#include <liboil/liboil.h>
-
-#include "gstdeinterlace2.h"
-#include "tvtime/plugins.h"
-
-#include <string.h>
-
-GST_DEBUG_CATEGORY_STATIC (deinterlace2_debug);
-#define GST_CAT_DEFAULT (deinterlace2_debug)
-
-/* Object signals and args */
-enum
-{
- LAST_SIGNAL
-};
-
-/* Properties */
-
-#define DEFAULT_MODE GST_DEINTERLACE2_MODE_INTERLACED
-#define DEFAULT_METHOD GST_DEINTERLACE2_GREEDY_H
-#define DEFAULT_FIELDS GST_DEINTERLACE2_ALL
-#define DEFAULT_FIELD_LAYOUT GST_DEINTERLACE2_LAYOUT_AUTO
-
-enum
-{
- PROP_0,
- PROP_MODE,
- PROP_METHOD,
- PROP_FIELDS,
- PROP_FIELD_LAYOUT,
- PROP_LAST
-};
-
-G_DEFINE_TYPE (GstDeinterlaceMethod, gst_deinterlace_method, GST_TYPE_OBJECT);
-
-static void
-gst_deinterlace_method_class_init (GstDeinterlaceMethodClass * klass)
-{
-
-}
-
-static void
-gst_deinterlace_method_init (GstDeinterlaceMethod * self)
-{
-
-}
-
-static void
-gst_deinterlace_method_deinterlace_frame (GstDeinterlaceMethod * self,
- GstDeinterlace2 * parent, GstBuffer * outbuf)
-{
- GstDeinterlaceMethodClass *klass = GST_DEINTERLACE_METHOD_GET_CLASS (self);
-
- klass->deinterlace_frame (self, parent, outbuf);
-}
-
-static gint
-gst_deinterlace_method_get_fields_required (GstDeinterlaceMethod * self)
-{
- GstDeinterlaceMethodClass *klass = GST_DEINTERLACE_METHOD_GET_CLASS (self);
-
- return klass->fields_required;
-}
-
-static gint
-gst_deinterlace_method_get_latency (GstDeinterlaceMethod * self)
-{
- GstDeinterlaceMethodClass *klass = GST_DEINTERLACE_METHOD_GET_CLASS (self);
-
- return klass->latency;
-}
-
-
-G_DEFINE_TYPE (GstDeinterlaceSimpleMethod, gst_deinterlace_simple_method,
- GST_TYPE_DEINTERLACE_METHOD);
-
-static void
-gst_deinterlace_simple_method_interpolate_scanline (GstDeinterlaceMethod * self,
- GstDeinterlace2 * parent, guint8 * out,
- GstDeinterlaceScanlineData * scanlines, gint width)
-{
- oil_memcpy (out, scanlines->m1, parent->row_stride);
-}
-
-static void
-gst_deinterlace_simple_method_copy_scanline (GstDeinterlaceMethod * self,
- GstDeinterlace2 * parent, guint8 * out,
- GstDeinterlaceScanlineData * scanlines, gint width)
-{
- oil_memcpy (out, scanlines->m0, parent->row_stride);
-}
-
-static void
-gst_deinterlace_simple_method_deinterlace_frame (GstDeinterlaceMethod * self,
- GstDeinterlace2 * parent, GstBuffer * outbuf)
-{
- GstDeinterlaceSimpleMethodClass *dsm_class =
- GST_DEINTERLACE_SIMPLE_METHOD_GET_CLASS (self);
- GstDeinterlaceMethodClass *dm_class = GST_DEINTERLACE_METHOD_GET_CLASS (self);
- GstDeinterlaceScanlineData scanlines;
- guint8 *out = GST_BUFFER_DATA (outbuf);
- guint8 *field0 = NULL, *field1 = NULL, *field2 = NULL, *field3 = NULL;
- gint cur_field_idx = parent->history_count - dm_class->fields_required;
- guint cur_field_flags = parent->field_history[cur_field_idx].flags;
- gint line;
-
- field0 = GST_BUFFER_DATA (parent->field_history[cur_field_idx].buf);
-
- g_assert (dm_class->fields_required <= 4);
-
- if (dm_class->fields_required >= 2)
- field1 = GST_BUFFER_DATA (parent->field_history[cur_field_idx + 1].buf);
- if (dm_class->fields_required >= 3)
- field2 = GST_BUFFER_DATA (parent->field_history[cur_field_idx + 2].buf);
- if (dm_class->fields_required >= 4)
- field3 = GST_BUFFER_DATA (parent->field_history[cur_field_idx + 3].buf);
-
-
- if (cur_field_flags == PICTURE_INTERLACED_BOTTOM) {
- /* double the first scanline of the bottom field */
- oil_memcpy (out, field0, parent->row_stride);
- out += parent->row_stride;
- }
-
- oil_memcpy (out, field0, parent->row_stride);
- out += parent->row_stride;
-
- for (line = 2; line <= parent->field_height; line++) {
-
- memset (&scanlines, 0, sizeof (scanlines));
- scanlines.bottom_field = (cur_field_flags == PICTURE_INTERLACED_BOTTOM);
-
- /* interp. scanline */
- scanlines.t0 = field0;
- scanlines.b0 = field0 + parent->field_stride;
-
- if (field1 != NULL) {
- scanlines.tt1 = field1;
- scanlines.m1 = field1 + parent->field_stride;
- scanlines.bb1 = field1 + parent->field_stride * 2;
- field1 += parent->field_stride;
- }
-
- if (field2 != NULL) {
- scanlines.t2 = field2;
- scanlines.b2 = field2 + parent->field_stride;
- }
-
- if (field3 != NULL) {
- scanlines.tt3 = field3;
- scanlines.m3 = field3 + parent->field_stride;
- scanlines.bb3 = field3 + parent->field_stride * 2;
- field3 += parent->field_stride;
- }
-
- /* set valid data for corner cases */
- if (line == 2) {
- scanlines.tt1 = scanlines.bb1;
- scanlines.tt3 = scanlines.bb3;
- } else if (line == parent->field_height) {
- scanlines.bb1 = scanlines.tt1;
- scanlines.bb3 = scanlines.tt3;
- }
-
- dsm_class->interpolate_scanline (self, parent, out, &scanlines,
- parent->frame_width);
- out += parent->row_stride;
-
- memset (&scanlines, 0, sizeof (scanlines));
- scanlines.bottom_field = (cur_field_flags == PICTURE_INTERLACED_BOTTOM);
-
- /* copy a scanline */
- scanlines.tt0 = field0;
- scanlines.m0 = field0 + parent->field_stride;
- scanlines.bb0 = field0 + parent->field_stride * 2;
- field0 += parent->field_stride;
-
- if (field1 != NULL) {
- scanlines.t1 = field1;
- scanlines.b1 = field1 + parent->field_stride;
- }
-
- if (field2 != NULL) {
- scanlines.tt2 = field2;
- scanlines.m2 = field2 + parent->field_stride;
- scanlines.bb2 = field2 + parent->field_stride * 2;
- field2 += parent->field_stride;
- }
-
- if (field3 != NULL) {
- scanlines.t3 = field3;
- scanlines.b3 = field3 + parent->field_stride;
- }
-
- /* set valid data for corner cases */
- if (line == parent->field_height) {
- scanlines.bb0 = scanlines.tt0;
- scanlines.b1 = scanlines.t1;
- scanlines.bb2 = scanlines.tt2;
- scanlines.b3 = scanlines.t3;
- }
-
- dsm_class->copy_scanline (self, parent, out, &scanlines,
- parent->frame_width);
- out += parent->row_stride;
- }
-
- if (cur_field_flags == PICTURE_INTERLACED_TOP) {
- /* double the last scanline of the top field */
- oil_memcpy (out, field0, parent->row_stride);
- }
-}
-
-static void
-gst_deinterlace_simple_method_class_init (GstDeinterlaceSimpleMethodClass *
- klass)
-{
- GstDeinterlaceMethodClass *dm_class = (GstDeinterlaceMethodClass *) klass;
-
- dm_class->deinterlace_frame = gst_deinterlace_simple_method_deinterlace_frame;
- dm_class->fields_required = 2;
-
- klass->interpolate_scanline =
- gst_deinterlace_simple_method_interpolate_scanline;
- klass->copy_scanline = gst_deinterlace_simple_method_copy_scanline;
-}
-
-static void
-gst_deinterlace_simple_method_init (GstDeinterlaceSimpleMethod * self)
-{
-}
-
-#define GST_TYPE_DEINTERLACE2_METHODS (gst_deinterlace2_methods_get_type ())
-static GType
-gst_deinterlace2_methods_get_type (void)
-{
- static GType deinterlace2_methods_type = 0;
-
- static const GEnumValue methods_types[] = {
- {GST_DEINTERLACE2_TOMSMOCOMP, "Motion Adaptive: Motion Search",
- "tomsmocomp"},
- {GST_DEINTERLACE2_GREEDY_H, "Motion Adaptive: Advanced Detection",
- "greedyh"},
- {GST_DEINTERLACE2_GREEDY_L, "Motion Adaptive: Simple Detection", "greedyl"},
- {GST_DEINTERLACE2_VFIR, "Blur Vertical", "vfir"},
- {GST_DEINTERLACE2_LINEAR, "Television: Full resolution", "linear"},
- {GST_DEINTERLACE2_LINEAR_BLEND, "Blur: Temporal", "linearblend"},
- {GST_DEINTERLACE2_SCALER_BOB, "Double lines", "scalerbob"},
- {GST_DEINTERLACE2_WEAVE, "Weave", "weave"},
- {GST_DEINTERLACE2_WEAVE_TFF, "Progressive: Top Field First", "weavetff"},
- {GST_DEINTERLACE2_WEAVE_BFF, "Progressive: Bottom Field First", "weavebff"},
- {0, NULL, NULL},
- };
-
- if (!deinterlace2_methods_type) {
- deinterlace2_methods_type =
- g_enum_register_static ("GstDeinterlace2Methods", methods_types);
- }
- return deinterlace2_methods_type;
-}
-
-#define GST_TYPE_DEINTERLACE2_FIELDS (gst_deinterlace2_fields_get_type ())
-static GType
-gst_deinterlace2_fields_get_type (void)
-{
- static GType deinterlace2_fields_type = 0;
-
- static const GEnumValue fields_types[] = {
- {GST_DEINTERLACE2_ALL, "All fields", "all"},
- {GST_DEINTERLACE2_TF, "Top fields only", "top"},
- {GST_DEINTERLACE2_BF, "Bottom fields only", "bottom"},
- {0, NULL, NULL},
- };
-
- if (!deinterlace2_fields_type) {
- deinterlace2_fields_type =
- g_enum_register_static ("GstDeinterlace2Fields", fields_types);
- }
- return deinterlace2_fields_type;
-}
-
-#define GST_TYPE_DEINTERLACE2_FIELD_LAYOUT (gst_deinterlace2_field_layout_get_type ())
-static GType
-gst_deinterlace2_field_layout_get_type (void)
-{
- static GType deinterlace2_field_layout_type = 0;
-
- static const GEnumValue field_layout_types[] = {
- {GST_DEINTERLACE2_LAYOUT_AUTO, "Auto detection", "auto"},
- {GST_DEINTERLACE2_LAYOUT_TFF, "Top field first", "tff"},
- {GST_DEINTERLACE2_LAYOUT_BFF, "Bottom field first", "bff"},
- {0, NULL, NULL},
- };
-
- if (!deinterlace2_field_layout_type) {
- deinterlace2_field_layout_type =
- g_enum_register_static ("GstDeinterlace2FieldLayout",
- field_layout_types);
- }
- return deinterlace2_field_layout_type;
-}
-
-#define GST_TYPE_DEINTERLACE2_MODES (gst_deinterlace2_modes_get_type ())
-static GType
-gst_deinterlace2_modes_get_type (void)
-{
- static GType deinterlace2_modes_type = 0;
-
- static const GEnumValue modes_types[] = {
- {GST_DEINTERLACE2_MODE_AUTO, "Auto detection", "auto"},
- {GST_DEINTERLACE2_MODE_INTERLACED, "Enfore deinterlacing", "interlaced"},
- {0, NULL, NULL},
- };
-
- if (!deinterlace2_modes_type) {
- deinterlace2_modes_type =
- g_enum_register_static ("GstDeinterlace2Modes", modes_types);
- }
- return deinterlace2_modes_type;
-}
-
-static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src",
- GST_PAD_SRC,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("YUY2") ";"
- GST_VIDEO_CAPS_YUV ("YVYU"))
- );
-
-static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink",
- GST_PAD_SINK,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("YUY2") ";"
- GST_VIDEO_CAPS_YUV ("YVYU"))
- );
-
-static void gst_deinterlace2_finalize (GObject * self);
-static void gst_deinterlace2_set_property (GObject * self, guint prop_id,
- const GValue * value, GParamSpec * pspec);
-static void gst_deinterlace2_get_property (GObject * self, guint prop_id,
- GValue * value, GParamSpec * pspec);
-
-static GstCaps *gst_deinterlace2_getcaps (GstPad * pad);
-static gboolean gst_deinterlace2_setcaps (GstPad * pad, GstCaps * caps);
-static gboolean gst_deinterlace2_sink_event (GstPad * pad, GstEvent * event);
-static GstFlowReturn gst_deinterlace2_chain (GstPad * pad, GstBuffer * buffer);
-static GstStateChangeReturn gst_deinterlace2_change_state (GstElement * element,
- GstStateChange transition);
-
-static gboolean gst_deinterlace2_src_event (GstPad * pad, GstEvent * event);
-static gboolean gst_deinterlace2_src_query (GstPad * pad, GstQuery * query);
-static const GstQueryType *gst_deinterlace2_src_query_types (GstPad * pad);
-
-static void gst_deinterlace2_reset (GstDeinterlace2 * self);
-
-static void gst_deinterlace2_child_proxy_interface_init (gpointer g_iface,
- gpointer iface_data);
-
-static void
-_do_init (GType object_type)
-{
- const GInterfaceInfo child_proxy_interface_info = {
- (GInterfaceInitFunc) gst_deinterlace2_child_proxy_interface_init,
- NULL, /* interface_finalize */
- NULL /* interface_data */
- };
-
- g_type_add_interface_static (object_type, GST_TYPE_CHILD_PROXY,
- &child_proxy_interface_info);
-}
-
-GST_BOILERPLATE_FULL (GstDeinterlace2, gst_deinterlace2, GstElement,
- GST_TYPE_ELEMENT, _do_init);
-
-static void
-gst_deinterlace2_set_method (GstDeinterlace2 * self,
- GstDeinterlace2Methods method)
-{
-
- if (self->method) {
- gst_child_proxy_child_removed (GST_OBJECT (self),
- GST_OBJECT (self->method));
- gst_object_unparent (GST_OBJECT (self->method));
- self->method = NULL;
- }
-
- switch (method) {
- case GST_DEINTERLACE2_TOMSMOCOMP:
- self->method = g_object_new (GST_TYPE_DEINTERLACE_TOMSMOCOMP, NULL);
- break;
- case GST_DEINTERLACE2_GREEDY_H:
- self->method = g_object_new (GST_TYPE_DEINTERLACE_GREEDY_H, NULL);
- break;
- case GST_DEINTERLACE2_GREEDY_L:
- self->method = g_object_new (GST_TYPE_DEINTERLACE_GREEDY_L, NULL);
- break;
- case GST_DEINTERLACE2_VFIR:
- self->method = g_object_new (GST_TYPE_DEINTERLACE_VFIR, NULL);
- break;
- case GST_DEINTERLACE2_LINEAR:
- self->method = g_object_new (GST_TYPE_DEINTERLACE_LINEAR, NULL);
- break;
- case GST_DEINTERLACE2_LINEAR_BLEND:
- self->method = g_object_new (GST_TYPE_DEINTERLACE_LINEAR_BLEND, NULL);
- break;
- case GST_DEINTERLACE2_SCALER_BOB:
- self->method = g_object_new (GST_TYPE_DEINTERLACE_SCALER_BOB, NULL);
- break;
- case GST_DEINTERLACE2_WEAVE:
- self->method = g_object_new (GST_TYPE_DEINTERLACE_WEAVE, NULL);
- break;
- case GST_DEINTERLACE2_WEAVE_TFF:
- self->method = g_object_new (GST_TYPE_DEINTERLACE_WEAVE_TFF, NULL);
- break;
- case GST_DEINTERLACE2_WEAVE_BFF:
- self->method = g_object_new (GST_TYPE_DEINTERLACE_WEAVE_BFF, NULL);
- break;
- default:
- GST_WARNING_OBJECT (self, "Invalid Deinterlacer Method");
- return;
- }
-
- self->method_id = method;
-
- gst_object_set_name (GST_OBJECT (self->method), "method");
- gst_object_set_parent (GST_OBJECT (self->method), GST_OBJECT (self));
- gst_child_proxy_child_added (GST_OBJECT (self), GST_OBJECT (self->method));
-}
-
-static void
-gst_deinterlace2_base_init (gpointer klass)
-{
- GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_templ));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_templ));
-
- gst_element_class_set_details_simple (element_class,
- "Deinterlacer",
- "Filter/Video",
- "Deinterlace Methods ported from DScaler/TvTime",
- "Martin Eikermann <meiker@upb.de>, "
- "Sebastian Dröge <slomo@circular-chaos.org>");
-}
-
-static void
-gst_deinterlace2_class_init (GstDeinterlace2Class * klass)
-{
- GObjectClass *gobject_class = (GObjectClass *) klass;
-
- GstElementClass *element_class = (GstElementClass *) klass;
-
- gobject_class->set_property = gst_deinterlace2_set_property;
- gobject_class->get_property = gst_deinterlace2_get_property;
- gobject_class->finalize = gst_deinterlace2_finalize;
-
- /**
- * GstDeinterlace2:mode
- *
- * This selects whether the deinterlacing methods should
- * always be applied or if they should only be applied
- * on content that has the "interlaced" flag on the caps.
- *
- */
- g_object_class_install_property (gobject_class, PROP_MODE,
- g_param_spec_enum ("mode",
- "Mode",
- "Deinterlace Mode",
- GST_TYPE_DEINTERLACE2_MODES,
- DEFAULT_MODE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
- );
-
- /**
- * GstDeinterlace2:method
- *
- * Selects the different deinterlacing algorithms that can be used.
- * These provide different quality and CPU usage.
- *
- * Some methods provide parameters which can be set by getting
- * the "method" child via the #GstChildProxy interface and
- * setting the appropiate properties on it.
- *
- * <itemizedlist>
- * <listitem>
- * <para>
- * tomsmocomp
- * Motion Adaptive: Motion Search
- * </para>
- * </listitem>
- * <listitem>
- * <para>
- * greedyh
- * Motion Adaptive: Advanced Detection
- * </para>
- * </listitem>
- * <listitem>
- * <para>
- * greedyl
- * Motion Adaptive: Simple Detection
- * </para>
- * </listitem>
- * <listitem>
- * <para>
- * vfir
- * Blur vertical
- * </para>
- * </listitem>
- * <listitem>
- * <para>
- * linear
- * Linear interpolation
- * </para>
- * </listitem>
- * <listitem>
- * <para>
- * linearblend
- * Linear interpolation in time domain
- * </para>
- * </listitem>
- * <listitem>
- * <para>
- * scalerbob
- * Double lines
- * </para>
- * </listitem>
- * <listitem>
- * <para>
- * weave
- * Weave
- * </para>
- * </listitem>
- * <listitem>
- * <para>
- * weavetff
- * Progressive: Top Field First
- * </para>
- * </listitem>
- * <listitem>
- * <para>
- * weavebff
- * Progressive: Bottom Field First
- * </para>
- * </listitem>
- * </itemizedlist>
- */
- g_object_class_install_property (gobject_class, PROP_METHOD,
- g_param_spec_enum ("method",
- "Method",
- "Deinterlace Method",
- GST_TYPE_DEINTERLACE2_METHODS,
- DEFAULT_METHOD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
- );
-
- /**
- * GstDeinterlace2:fields
- *
- * This selects which fields should be output. If "all" is selected
- * the output framerate will be double.
- *
- */
- g_object_class_install_property (gobject_class, PROP_FIELDS,
- g_param_spec_enum ("fields",
- "fields",
- "Fields to use for deinterlacing",
- GST_TYPE_DEINTERLACE2_FIELDS,
- DEFAULT_FIELDS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
- );
-
- /**
- * GstDeinterlace2:layout
- *
- * This selects which fields is the first in time.
- *
- */
- g_object_class_install_property (gobject_class, PROP_FIELD_LAYOUT,
- g_param_spec_enum ("tff",
- "tff",
- "Deinterlace top field first",
- GST_TYPE_DEINTERLACE2_FIELD_LAYOUT,
- DEFAULT_FIELD_LAYOUT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
- );
-
- element_class->change_state =
- GST_DEBUG_FUNCPTR (gst_deinterlace2_change_state);
-}
-
-static GstObject *
-gst_deinterlace2_child_proxy_get_child_by_index (GstChildProxy * child_proxy,
- guint index)
-{
- GstDeinterlace2 *self = GST_DEINTERLACE2 (child_proxy);
-
- g_return_val_if_fail (index == 0, NULL);
-
- return gst_object_ref (self->method);
-}
-
-static guint
-gst_deinterlace2_child_proxy_get_children_count (GstChildProxy * child_proxy)
-{
- return 1;
-}
-
-static void
-gst_deinterlace2_child_proxy_interface_init (gpointer g_iface,
- gpointer iface_data)
-{
- GstChildProxyInterface *iface = g_iface;
-
- iface->get_child_by_index = gst_deinterlace2_child_proxy_get_child_by_index;
- iface->get_children_count = gst_deinterlace2_child_proxy_get_children_count;
-}
-
-static void
-gst_deinterlace2_init (GstDeinterlace2 * self, GstDeinterlace2Class * klass)
-{
- self->sinkpad = gst_pad_new_from_static_template (&sink_templ, "sink");
- gst_pad_set_chain_function (self->sinkpad,
- GST_DEBUG_FUNCPTR (gst_deinterlace2_chain));
- gst_pad_set_event_function (self->sinkpad,
- GST_DEBUG_FUNCPTR (gst_deinterlace2_sink_event));
- gst_pad_set_setcaps_function (self->sinkpad,
- GST_DEBUG_FUNCPTR (gst_deinterlace2_setcaps));
- gst_pad_set_getcaps_function (self->sinkpad,
- GST_DEBUG_FUNCPTR (gst_deinterlace2_getcaps));
- gst_element_add_pad (GST_ELEMENT (self), self->sinkpad);
-
- self->srcpad = gst_pad_new_from_static_template (&src_templ, "src");
- gst_pad_set_event_function (self->srcpad,
- GST_DEBUG_FUNCPTR (gst_deinterlace2_src_event));
- gst_pad_set_query_type_function (self->srcpad,
- GST_DEBUG_FUNCPTR (gst_deinterlace2_src_query_types));
- gst_pad_set_query_function (self->srcpad,
- GST_DEBUG_FUNCPTR (gst_deinterlace2_src_query));
- gst_pad_set_setcaps_function (self->srcpad,
- GST_DEBUG_FUNCPTR (gst_deinterlace2_setcaps));
- gst_pad_set_getcaps_function (self->srcpad,
- GST_DEBUG_FUNCPTR (gst_deinterlace2_getcaps));
- gst_element_add_pad (GST_ELEMENT (self), self->srcpad);
-
- gst_element_no_more_pads (GST_ELEMENT (self));
-
- self->mode = DEFAULT_MODE;
- gst_deinterlace2_set_method (self, DEFAULT_METHOD);
- self->fields = DEFAULT_FIELDS;
- self->field_layout = DEFAULT_FIELD_LAYOUT;
-
- gst_deinterlace2_reset (self);
-}
-
-static void
-gst_deinterlace2_reset_history (GstDeinterlace2 * self)
-{
- gint i;
-
- for (i = 0; i < self->history_count; i++) {
- if (self->field_history[i].buf) {
- gst_buffer_unref (self->field_history[i].buf);
- self->field_history[i].buf = NULL;
- }
- }
- memset (self->field_history, 0, MAX_FIELD_HISTORY * sizeof (GstPicture));
- self->history_count = 0;
-}
-
-static void
-gst_deinterlace2_reset (GstDeinterlace2 * self)
-{
- self->row_stride = 0;
- self->frame_width = 0;
- self->frame_height = 0;
- self->frame_rate_n = 0;
- self->frame_rate_d = 0;
- self->field_height = 0;
- self->field_stride = 0;
-
- gst_deinterlace2_reset_history (self);
-}
-
-static void
-gst_deinterlace2_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec)
-{
- GstDeinterlace2 *self;
-
- g_return_if_fail (GST_IS_DEINTERLACE2 (object));
- self = GST_DEINTERLACE2 (object);
-
- switch (prop_id) {
- case PROP_MODE:
- if (GST_STATE (self) >= GST_STATE_PAUSED) {
- g_warning ("Setting the 'mode' property is only allowed in "
- "states other than PAUSED and PLAYING");
- } else {
- self->mode = g_value_get_enum (value);
- }
- break;
- case PROP_METHOD:
- gst_deinterlace2_set_method (self, g_value_get_enum (value));
- break;
- case PROP_FIELDS:{
- gint oldfields;
-
- GST_OBJECT_LOCK (self);
- oldfields = self->fields;
- self->fields = g_value_get_enum (value);
- if (self->fields != oldfields && GST_PAD_CAPS (self->srcpad))
- gst_deinterlace2_setcaps (self->sinkpad, GST_PAD_CAPS (self->sinkpad));
- GST_OBJECT_UNLOCK (self);
- break;
- }
- case PROP_FIELD_LAYOUT:
- self->field_layout = g_value_get_enum (value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (self, prop_id, pspec);
- }
-
-}
-
-static void
-gst_deinterlace2_get_property (GObject * object, guint prop_id,
- GValue * value, GParamSpec * pspec)
-{
- GstDeinterlace2 *self;
-
- g_return_if_fail (GST_IS_DEINTERLACE2 (object));
- self = GST_DEINTERLACE2 (object);
-
- switch (prop_id) {
- case PROP_MODE:
- g_value_set_enum (value, self->mode);
- break;
- case PROP_METHOD:
- g_value_set_enum (value, self->method_id);
- break;
- case PROP_FIELDS:
- g_value_set_enum (value, self->fields);
- break;
- case PROP_FIELD_LAYOUT:
- g_value_set_enum (value, self->field_layout);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (self, prop_id, pspec);
- }
-}
-
-static void
-gst_deinterlace2_finalize (GObject * object)
-{
- GstDeinterlace2 *self = GST_DEINTERLACE2 (object);
-
- gst_deinterlace2_reset (self);
-
- if (self->method) {
- gst_object_unparent (GST_OBJECT (self->method));
- self->method = NULL;
- }
-
- G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-static GstBuffer *
-gst_deinterlace2_pop_history (GstDeinterlace2 * self)
-{
- GstBuffer *buffer = NULL;
-
- g_assert (self->history_count > 0);
-
- buffer = self->field_history[self->history_count - 1].buf;
-
- self->history_count--;
- GST_DEBUG_OBJECT (self, "pop, size(history): %d", self->history_count);
-
- return buffer;
-}
-
-#if 0
-static GstBuffer *
-gst_deinterlace2_head_history (GstDeinterlace2 * self)
-{
- return self->field_history[self->history_count - 1].buf;
-}
-#endif
-
-
-/* invariant: field with smallest timestamp is self->field_history[self->history_count-1]
-
-*/
-
-static void
-gst_deinterlace2_push_history (GstDeinterlace2 * self, GstBuffer * buffer)
-{
- int i = 1;
- GstClockTime timestamp;
- GstDeinterlace2FieldLayout field_layout = self->field_layout;
- gboolean repeated = GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_RFF);
- gboolean tff = GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_TFF);
- gboolean onefield =
- GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_ONEFIELD);
- GstBuffer *field1, *field2;
- guint fields_to_push = (onefield) ? 1 : (!repeated) ? 2 : 3;
- gint field1_flags, field2_flags;
-
- g_assert (self->history_count < MAX_FIELD_HISTORY - fields_to_push);
-
- for (i = MAX_FIELD_HISTORY - 1; i >= fields_to_push; i--) {
- self->field_history[i].buf = self->field_history[i - fields_to_push].buf;
- self->field_history[i].flags =
- self->field_history[i - fields_to_push].flags;
- }
-
- if (field_layout == GST_DEINTERLACE2_LAYOUT_AUTO) {
- if (!self->interlaced) {
- GST_WARNING_OBJECT (self, "Can't detect field layout -- assuming TFF");
- field_layout = GST_DEINTERLACE2_LAYOUT_TFF;
- } else if (tff) {
- field_layout = GST_DEINTERLACE2_LAYOUT_TFF;
- } else {
- field_layout = GST_DEINTERLACE2_LAYOUT_BFF;
- }
- }
-
- if (field_layout == GST_DEINTERLACE2_LAYOUT_TFF) {
- GST_DEBUG_OBJECT (self, "Top field first");
- field1 = gst_buffer_ref (buffer);
- field1_flags = PICTURE_INTERLACED_TOP;
- field2 = gst_buffer_create_sub (buffer, self->row_stride,
- GST_BUFFER_SIZE (buffer) - self->row_stride);
- field2_flags = PICTURE_INTERLACED_BOTTOM;
- } else {
- GST_DEBUG_OBJECT (self, "Bottom field first");
- field1 = gst_buffer_create_sub (buffer, self->row_stride,
- GST_BUFFER_SIZE (buffer) - self->row_stride);
- field1_flags = PICTURE_INTERLACED_BOTTOM;
- field2 = gst_buffer_ref (buffer);
- field2_flags = PICTURE_INTERLACED_TOP;
- }
-
- /* Timestamps are assigned to the field buffers under the assumption that
- the timestamp of the buffer equals the first fields timestamp */
-
- timestamp = GST_BUFFER_TIMESTAMP (buffer);
- GST_BUFFER_TIMESTAMP (field1) = timestamp;
- GST_BUFFER_TIMESTAMP (field2) = timestamp + self->field_duration;
- if (repeated)
- GST_BUFFER_TIMESTAMP (field2) += self->field_duration;
-
- if (repeated) {
- self->field_history[0].buf = field2;
- self->field_history[0].flags = field2_flags;
- self->field_history[1].buf = gst_buffer_ref (field1);
- GST_BUFFER_TIMESTAMP (self->field_history[1].buf) += self->field_duration;
- self->field_history[1].flags = field1_flags;
- self->field_history[2].buf = field1;
- self->field_history[2].flags = field1_flags;
- } else if (!onefield) {
- self->field_history[0].buf = field2;
- self->field_history[0].flags = field2_flags;
- self->field_history[1].buf = field1;
- self->field_history[1].flags = field1_flags;
- } else { /* onefield */
- self->field_history[0].buf = field1;
- self->field_history[0].flags = field1_flags;
- gst_buffer_unref (field2);
- }
-
- self->history_count += fields_to_push;
- GST_DEBUG_OBJECT (self, "push, size(history): %d", self->history_count);
-
- gst_buffer_unref (buffer);
-}
-
-static GstFlowReturn
-gst_deinterlace2_chain (GstPad * pad, GstBuffer * buf)
-{
- GstDeinterlace2 *self = NULL;
- GstClockTime timestamp;
- GstFlowReturn ret = GST_FLOW_OK;
- gint fields_required = 0;
- gint cur_field_idx = 0;
- GstBuffer *outbuf;
-
- self = GST_DEINTERLACE2 (GST_PAD_PARENT (pad));
-
- if (!self->interlaced && self->mode != GST_DEINTERLACE2_MODE_INTERLACED)
- return gst_pad_push (self->srcpad, buf);
-
- if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT)) {
- GST_DEBUG_OBJECT (self, "DISCONT buffer, resetting history");
- gst_deinterlace2_reset_history (self);
- }
-
- gst_deinterlace2_push_history (self, buf);
- buf = NULL;
-
- fields_required = gst_deinterlace_method_get_fields_required (self->method);
-
- /* Not enough fields in the history */
- if (self->history_count < fields_required + 1) {
- /* TODO: do bob or just forward frame */
- GST_DEBUG_OBJECT (self, "HistoryCount=%d", self->history_count);
- return GST_FLOW_OK;
- }
-
- while (self->history_count >= fields_required) {
- if (self->fields == GST_DEINTERLACE2_ALL)
- GST_DEBUG_OBJECT (self, "All fields");
- if (self->fields == GST_DEINTERLACE2_TF)
- GST_DEBUG_OBJECT (self, "Top fields");
- if (self->fields == GST_DEINTERLACE2_BF)
- GST_DEBUG_OBJECT (self, "Bottom fields");
-
- cur_field_idx = self->history_count - fields_required;
-
- if ((self->field_history[cur_field_idx].flags == PICTURE_INTERLACED_TOP
- && self->fields == GST_DEINTERLACE2_TF) ||
- self->fields == GST_DEINTERLACE2_ALL) {
- GST_DEBUG_OBJECT (self, "deinterlacing top field");
-
- /* create new buffer */
- ret = gst_pad_alloc_buffer_and_set_caps (self->srcpad,
- GST_BUFFER_OFFSET_NONE, self->frame_size,
- GST_PAD_CAPS (self->srcpad), &outbuf);
- if (ret != GST_FLOW_OK)
- return ret;
-
- /* do magic calculus */
- gst_deinterlace_method_deinterlace_frame (self->method, self, outbuf);
-
- g_assert (self->history_count - 1 -
- gst_deinterlace_method_get_latency (self->method) >= 0);
- buf =
- self->field_history[self->history_count - 1 -
- gst_deinterlace_method_get_latency (self->method)].buf;
- timestamp = GST_BUFFER_TIMESTAMP (buf);
-
- gst_buffer_unref (gst_deinterlace2_pop_history (self));
-
- GST_BUFFER_TIMESTAMP (outbuf) = timestamp;
- if (self->fields == GST_DEINTERLACE2_ALL)
- GST_BUFFER_DURATION (outbuf) = self->field_duration;
- else
- GST_BUFFER_DURATION (outbuf) = 2 * self->field_duration;
-
- ret = gst_pad_push (self->srcpad, outbuf);
- outbuf = NULL;
- if (ret != GST_FLOW_OK)
- return ret;
- }
- /* no calculation done: remove excess field */
- else if (self->field_history[cur_field_idx].flags ==
- PICTURE_INTERLACED_TOP && self->fields == GST_DEINTERLACE2_BF) {
- GST_DEBUG_OBJECT (self, "Removing unused top field");
- gst_buffer_unref (gst_deinterlace2_pop_history (self));
- }
-
- cur_field_idx = self->history_count - fields_required;
- if (self->history_count < fields_required)
- break;
-
- /* deinterlace bottom_field */
- if ((self->field_history[cur_field_idx].flags == PICTURE_INTERLACED_BOTTOM
- && self->fields == GST_DEINTERLACE2_BF) ||
- self->fields == GST_DEINTERLACE2_ALL) {
- GST_DEBUG_OBJECT (self, "deinterlacing bottom field");
-
- /* create new buffer */
- ret = gst_pad_alloc_buffer_and_set_caps (self->srcpad,
- GST_BUFFER_OFFSET_NONE, self->frame_size,
- GST_PAD_CAPS (self->srcpad), &outbuf);
- if (ret != GST_FLOW_OK)
- return ret;
-
- /* do magic calculus */
- gst_deinterlace_method_deinterlace_frame (self->method, self, outbuf);
-
- g_assert (self->history_count - 1 -
- gst_deinterlace_method_get_latency (self->method) >= 0);
- buf =
- self->field_history[self->history_count - 1 -
- gst_deinterlace_method_get_latency (self->method)].buf;
- timestamp = GST_BUFFER_TIMESTAMP (buf);
-
- gst_buffer_unref (gst_deinterlace2_pop_history (self));
-
- GST_BUFFER_TIMESTAMP (outbuf) = timestamp;
- if (self->fields == GST_DEINTERLACE2_ALL)
- GST_BUFFER_DURATION (outbuf) = self->field_duration;
- else
- GST_BUFFER_DURATION (outbuf) = 2 * self->field_duration;
-
- ret = gst_pad_push (self->srcpad, outbuf);
- outbuf = NULL;
-
- if (ret != GST_FLOW_OK)
- return ret;
- }
- /* no calculation done: remove excess field */
- else if (self->field_history[cur_field_idx].flags ==
- PICTURE_INTERLACED_BOTTOM && self->fields == GST_DEINTERLACE2_TF) {
- GST_DEBUG_OBJECT (self, "Removing unused bottom field");
- gst_buffer_unref (gst_deinterlace2_pop_history (self));
- }
- }
-
- GST_DEBUG_OBJECT (self, "----chain end ----\n\n");
-
- return ret;
-}
-
-static gint
-gst_greatest_common_divisor (gint a, gint b)
-{
- while (b != 0) {
- int temp = a;
-
- a = b;
- b = temp % b;
- }
-
- return ABS (a);
-}
-
-static gboolean
-gst_fraction_double (gint * n_out, gint * d_out, gboolean half)
-{
- gint n, d, gcd;
-
- n = *n_out;
- d = *d_out;
-
- if (d == 0)
- return FALSE;
-
- if (n == 0 || (n == G_MAXINT && d == 1))
- return TRUE;
-
- gcd = gst_greatest_common_divisor (n, d);
- n /= gcd;
- d /= gcd;
-
- if (!half) {
- if (G_MAXINT / 2 >= ABS (n)) {
- n *= 2;
- } else if (d >= 2) {
- d /= 2;
- } else {
- return FALSE;
- }
- } else {
- if (G_MAXINT / 2 >= ABS (d)) {
- d *= 2;
- } else if (n >= 2) {
- n /= 2;
- } else {
- return FALSE;
- }
- }
-
- *n_out = n;
- *d_out = d;
-
- return TRUE;
-}
-
-static GstCaps *
-gst_deinterlace2_getcaps (GstPad * pad)
-{
- GstCaps *ret;
- GstDeinterlace2 *self = GST_DEINTERLACE2 (gst_pad_get_parent (pad));
- GstPad *otherpad;
- gint len;
- const GstCaps *ourcaps;
- GstCaps *peercaps;
-
- GST_OBJECT_LOCK (self);
-
- otherpad = (pad == self->srcpad) ? self->sinkpad : self->srcpad;
-
- ourcaps = gst_pad_get_pad_template_caps (pad);
- peercaps = gst_pad_peer_get_caps (otherpad);
-
- if (peercaps) {
- ret = gst_caps_intersect (ourcaps, peercaps);
- gst_caps_unref (peercaps);
- } else {
- ret = gst_caps_copy (ourcaps);
- }
-
- GST_OBJECT_UNLOCK (self);
-
- if ((self->interlaced || self->mode == GST_DEINTERLACE2_MODE_INTERLACED) &&
- self->fields == GST_DEINTERLACE2_ALL) {
- for (len = gst_caps_get_size (ret); len > 0; len--) {
- GstStructure *s = gst_caps_get_structure (ret, len - 1);
- const GValue *val;
-
- val = gst_structure_get_value (s, "framerate");
- if (!val)
- continue;
-
- if (G_VALUE_TYPE (val) == GST_TYPE_FRACTION) {
- gint n, d;
-
- n = gst_value_get_fraction_numerator (val);
- d = gst_value_get_fraction_denominator (val);
-
- if (!gst_fraction_double (&n, &d, pad != self->srcpad)) {
- goto error;
- }
-
- gst_structure_set (s, "framerate", GST_TYPE_FRACTION, n, d, NULL);
- } else if (G_VALUE_TYPE (val) == GST_TYPE_FRACTION_RANGE) {
- const GValue *min, *max;
- GValue nrange = { 0, }, nmin = {
- 0,}, nmax = {
- 0,};
- gint n, d;
-
- g_value_init (&nrange, GST_TYPE_FRACTION_RANGE);
- g_value_init (&nmin, GST_TYPE_FRACTION);
- g_value_init (&nmax, GST_TYPE_FRACTION);
-
- min = gst_value_get_fraction_range_min (val);
- max = gst_value_get_fraction_range_max (val);
-
- n = gst_value_get_fraction_numerator (min);
- d = gst_value_get_fraction_denominator (min);
-
- if (!gst_fraction_double (&n, &d, pad != self->srcpad)) {
- g_value_unset (&nrange);
- g_value_unset (&nmax);
- g_value_unset (&nmin);
- goto error;
- }
-
- gst_value_set_fraction (&nmin, n, d);
-
- n = gst_value_get_fraction_numerator (max);
- d = gst_value_get_fraction_denominator (max);
-
- if (!gst_fraction_double (&n, &d, pad != self->srcpad)) {
- g_value_unset (&nrange);
- g_value_unset (&nmax);
- g_value_unset (&nmin);
- goto error;
- }
-
- gst_value_set_fraction (&nmax, n, d);
- gst_value_set_fraction_range (&nrange, &nmin, &nmax);
-
- gst_structure_set_value (s, "framerate", &nrange);
-
- g_value_unset (&nmin);
- g_value_unset (&nmax);
- g_value_unset (&nrange);
- } else if (G_VALUE_TYPE (val) == GST_TYPE_LIST) {
- const GValue *lval;
- GValue nlist = { 0, };
- GValue nval = { 0, };
- gint i;
-
- g_value_init (&nlist, GST_TYPE_LIST);
- for (i = gst_value_list_get_size (val); i > 0; i--) {
- gint n, d;
-
- lval = gst_value_list_get_value (val, i);
-
- if (G_VALUE_TYPE (lval) != GST_TYPE_FRACTION)
- continue;
-
- n = gst_value_get_fraction_numerator (lval);
- d = gst_value_get_fraction_denominator (lval);
-
- /* Double/Half the framerate but if this fails simply
- * skip this value from the list */
- if (!gst_fraction_double (&n, &d, pad != self->srcpad)) {
- continue;
- }
-
- g_value_init (&nval, GST_TYPE_FRACTION);
-
- gst_value_set_fraction (&nval, n, d);
- gst_value_list_append_value (&nlist, &nval);
- g_value_unset (&nval);
- }
- gst_structure_set_value (s, "framerate", &nlist);
- g_value_unset (&nlist);
- }
- }
- }
-
- GST_DEBUG_OBJECT (pad, "Returning caps %" GST_PTR_FORMAT, ret);
-
- return ret;
-
-error:
- GST_ERROR_OBJECT (pad, "Unable to transform peer caps");
- gst_caps_unref (ret);
- return NULL;
-}
-
-static gboolean
-gst_deinterlace2_setcaps (GstPad * pad, GstCaps * caps)
-{
- gboolean res = TRUE;
- GstDeinterlace2 *self = GST_DEINTERLACE2 (gst_pad_get_parent (pad));
- GstPad *otherpad;
- GstStructure *structure;
- GstVideoFormat fmt;
- guint32 fourcc;
- GstCaps *othercaps;
-
- otherpad = (pad == self->srcpad) ? self->sinkpad : self->srcpad;
-
- structure = gst_caps_get_structure (caps, 0);
-
- res = gst_structure_get_int (structure, "width", &self->frame_width);
- res &= gst_structure_get_int (structure, "height", &self->frame_height);
- res &=
- gst_structure_get_fraction (structure, "framerate", &self->frame_rate_n,
- &self->frame_rate_d);
- res &= gst_structure_get_fourcc (structure, "format", &fourcc);
- res &= gst_video_format_parse_caps_interlaced (caps, &self->interlaced);
- if (!res)
- goto invalid_caps;
-
- if ((self->interlaced || self->mode == GST_DEINTERLACE2_MODE_INTERLACED) &&
- self->fields == GST_DEINTERLACE2_ALL) {
- gint fps_n = self->frame_rate_n, fps_d = self->frame_rate_d;
-
- if (!gst_fraction_double (&fps_n, &fps_d, otherpad != self->srcpad))
- goto invalid_caps;
-
- othercaps = gst_caps_copy (caps);
-
- gst_caps_set_simple (othercaps, "framerate", GST_TYPE_FRACTION, fps_n,
- fps_d, NULL);
- } else {
- othercaps = gst_caps_ref (caps);
- }
-
- if (!gst_pad_set_caps (otherpad, othercaps))
- goto caps_not_accepted;
- gst_caps_unref (othercaps);
-
- self->field_height = self->frame_height / 2;
-
- fmt = gst_video_format_from_fourcc (fourcc);
-
- /* TODO: only true if fields are subbuffers of interlaced frames,
- change when the buffer-fields concept has landed */
- self->field_stride =
- gst_video_format_get_row_stride (fmt, 0, self->frame_width) * 2;
-
- /* in bytes */
- self->row_stride =
- gst_video_format_get_row_stride (fmt, 0, self->frame_width);
- self->frame_size =
- gst_video_format_get_size (fmt, self->frame_width, self->frame_height);
-
- if (self->fields == GST_DEINTERLACE2_ALL && otherpad == self->srcpad)
- self->field_duration =
- gst_util_uint64_scale (GST_SECOND, self->frame_rate_d,
- self->frame_rate_n);
- else
- self->field_duration =
- gst_util_uint64_scale (GST_SECOND, self->frame_rate_d,
- 2 * self->frame_rate_n);
-
- GST_DEBUG_OBJECT (self, "Set caps: %" GST_PTR_FORMAT, caps);
-
-done:
-
- gst_object_unref (self);
- return res;
-
-invalid_caps:
- res = FALSE;
- GST_ERROR_OBJECT (pad, "Invalid caps: %" GST_PTR_FORMAT, caps);
- goto done;
-
-caps_not_accepted:
- res = FALSE;
- GST_ERROR_OBJECT (pad, "Caps not accepted: %" GST_PTR_FORMAT, othercaps);
- gst_caps_unref (othercaps);
- goto done;
-}
-
-static gboolean
-gst_deinterlace2_sink_event (GstPad * pad, GstEvent * event)
-{
- gboolean res = TRUE;
- GstDeinterlace2 *self = GST_DEINTERLACE2 (gst_pad_get_parent (pad));
-
- GST_LOG_OBJECT (pad, "received %s event", GST_EVENT_TYPE_NAME (event));
-
- switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_FLUSH_STOP:
- case GST_EVENT_EOS:
- case GST_EVENT_NEWSEGMENT:
- gst_deinterlace2_reset_history (self);
-
- /* fall through */
- default:
- res = gst_pad_event_default (pad, event);
- break;
- }
-
- gst_object_unref (self);
- return res;
-}
-
-static GstStateChangeReturn
-gst_deinterlace2_change_state (GstElement * element, GstStateChange transition)
-{
- GstStateChangeReturn ret;
- GstDeinterlace2 *self = GST_DEINTERLACE2 (element);
-
- switch (transition) {
- case GST_STATE_CHANGE_NULL_TO_READY:
- break;
- case GST_STATE_CHANGE_READY_TO_PAUSED:
- break;
- case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
- break;
- default:
- break;
- }
-
- ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
- if (ret != GST_STATE_CHANGE_SUCCESS)
- return ret;
-
- switch (transition) {
- case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
- break;
- case GST_STATE_CHANGE_PAUSED_TO_READY:
- gst_deinterlace2_reset (self);
- break;
- case GST_STATE_CHANGE_READY_TO_NULL:
- default:
- break;
- }
-
- return ret;
-}
-
-static gboolean
-gst_deinterlace2_src_event (GstPad * pad, GstEvent * event)
-{
- GstDeinterlace2 *self = GST_DEINTERLACE2 (gst_pad_get_parent (pad));
- gboolean res;
-
- GST_DEBUG_OBJECT (pad, "received %s event", GST_EVENT_TYPE_NAME (event));
-
- switch (GST_EVENT_TYPE (event)) {
- default:
- res = gst_pad_event_default (pad, event);
- break;
- }
-
- gst_object_unref (self);
-
- return res;
-}
-
-static gboolean
-gst_deinterlace2_src_query (GstPad * pad, GstQuery * query)
-{
- GstDeinterlace2 *self = GST_DEINTERLACE2 (gst_pad_get_parent (pad));
- gboolean res = FALSE;
-
- GST_LOG_OBJECT (self, "%s query", GST_QUERY_TYPE_NAME (query));
-
- switch (GST_QUERY_TYPE (query)) {
- case GST_QUERY_LATENCY:
- if (self->interlaced || self->mode == GST_DEINTERLACE2_MODE_INTERLACED) {
- GstClockTime min, max;
- gboolean live;
- GstPad *peer;
-
- if ((peer = gst_pad_get_peer (self->sinkpad))) {
- if ((res = gst_pad_query (peer, query))) {
- GstClockTime latency;
- gint fields_required = 0;
- gint method_latency = 0;
-
- if (self->method) {
- fields_required =
- gst_deinterlace_method_get_fields_required (self->method);
- method_latency =
- gst_deinterlace_method_get_latency (self->method);
- }
-
- gst_query_parse_latency (query, &live, &min, &max);
-
- GST_DEBUG_OBJECT (self, "Peer latency: min %"
- GST_TIME_FORMAT " max %" GST_TIME_FORMAT,
- GST_TIME_ARGS (min), GST_TIME_ARGS (max));
-
- /* add our own latency */
- latency = (fields_required + method_latency) * self->field_duration;
-
- GST_DEBUG_OBJECT (self, "Our latency: min %" GST_TIME_FORMAT
- ", max %" GST_TIME_FORMAT,
- GST_TIME_ARGS (latency), GST_TIME_ARGS (latency));
-
- min += latency;
- if (max != GST_CLOCK_TIME_NONE)
- max += latency;
- else
- max = latency;
-
- GST_DEBUG_OBJECT (self, "Calculated total latency : min %"
- GST_TIME_FORMAT " max %" GST_TIME_FORMAT,
- GST_TIME_ARGS (min), GST_TIME_ARGS (max));
-
- gst_query_set_latency (query, live, min, max);
- }
- gst_object_unref (peer);
- } else {
- res = gst_pad_query_default (pad, query);
- }
- break;
- }
- default:
- res = gst_pad_query_default (pad, query);
- break;
- }
-
- gst_object_unref (self);
- return res;
-}
-
-static const GstQueryType *
-gst_deinterlace2_src_query_types (GstPad * pad)
-{
- static const GstQueryType types[] = {
- GST_QUERY_LATENCY,
- GST_QUERY_NONE
- };
- return types;
-}
-
-static gboolean
-plugin_init (GstPlugin * plugin)
-{
- GST_DEBUG_CATEGORY_INIT (deinterlace2_debug, "deinterlace2", 0,
- "Deinterlacer");
-
- oil_init ();
-
- if (!gst_element_register (plugin, "deinterlace2", GST_RANK_NONE,
- GST_TYPE_DEINTERLACE2)) {
- return FALSE;
- }
-
- return TRUE;
-}
-
-GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
- GST_VERSION_MINOR,
- "deinterlace2",
- "Deinterlacer", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME,
- GST_PACKAGE_ORIGIN);
diff --git a/gst/deinterlace2/gstdeinterlace2.h b/gst/deinterlace2/gstdeinterlace2.h
deleted file mode 100644
index de63f54e..00000000
--- a/gst/deinterlace2/gstdeinterlace2.h
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * GStreamer
- * Copyright (C) 2005 Martin Eikermann <meiker@upb.de>
- * Copyright (C) 2008-2009 Sebastian Dröge <slomo@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_DEINTERLACE_2_H__
-#define __GST_DEINTERLACE_2_H__
-
-#include <gst/gst.h>
-#include <gst/base/gstbasetransform.h>
-#include <liboil/liboil.h>
-#include <liboil/liboilcpu.h>
-#include <liboil/liboilfunction.h>
-
-#ifdef HAVE_GCC_ASM
-#if defined(HAVE_CPU_I386) || defined(HAVE_CPU_X86_64)
-#define BUILD_X86_ASM
-#endif
-#endif
-
-G_BEGIN_DECLS
-
-#define GST_TYPE_DEINTERLACE2 \
- (gst_deinterlace2_get_type())
-#define GST_DEINTERLACE2(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DEINTERLACE2,GstDeinterlace2))
-#define GST_DEINTERLACE2_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DEINTERLACE2,GstDeinterlace2))
-#define GST_IS_DEINTERLACE2(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DEINTERLACE2))
-#define GST_IS_DEINTERLACE2_CLASS(obj) \
- (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DEINTERLACE2))
-
-typedef struct _GstDeinterlace2 GstDeinterlace2;
-typedef struct _GstDeinterlace2Class GstDeinterlace2Class;
-
-#define GST_TYPE_DEINTERLACE_METHOD (gst_deinterlace_method_get_type ())
-#define GST_IS_DEINTERLACE_METHOD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD))
-#define GST_IS_DEINTERLACE_METHOD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD))
-#define GST_DEINTERLACE_METHOD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD, GstDeinterlaceMethodClass))
-#define GST_DEINTERLACE_METHOD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD, GstDeinterlaceMethod))
-#define GST_DEINTERLACE_METHOD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD, GstDeinterlaceMethodClass))
-#define GST_DEINTERLACE_METHOD_CAST(obj) ((GstDeinterlaceMethod*)(obj))
-
-typedef struct _GstDeinterlaceMethod GstDeinterlaceMethod;
-typedef struct _GstDeinterlaceMethodClass GstDeinterlaceMethodClass;
-
-/*
- * This structure defines the deinterlacer plugin.
- */
-
-struct _GstDeinterlaceMethod {
- GstObject parent;
-};
-
-struct _GstDeinterlaceMethodClass {
- GstObjectClass parent_class;
- guint fields_required;
- guint latency;
-
- void (*deinterlace_frame) (GstDeinterlaceMethod *self, GstDeinterlace2 * parent, GstBuffer *outbuf);
-
- const gchar *name;
- const gchar *nick;
-};
-
-GType gst_deinterlace_method_get_type (void);
-
-#define GST_TYPE_DEINTERLACE_SIMPLE_METHOD (gst_deinterlace_simple_method_get_type ())
-#define GST_IS_DEINTERLACE_SIMPLE_METHOD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_SIMPLE_METHOD))
-#define GST_IS_DEINTERLACE_SIMPLE_METHOD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_SIMPLE_METHOD))
-#define GST_DEINTERLACE_SIMPLE_METHOD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_SIMPLE_METHOD, GstDeinterlaceSimpleMethodClass))
-#define GST_DEINTERLACE_SIMPLE_METHOD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_SIMPLE_METHOD, GstDeinterlaceSimpleMethod))
-#define GST_DEINTERLACE_SIMPLE_METHOD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_SIMPLE_METHOD, GstDeinterlaceSimpleMethodClass))
-#define GST_DEINTERLACE_SIMPLE_METHOD_CAST(obj) ((GstDeinterlaceSimpleMethod*)(obj))
-
-typedef struct _GstDeinterlaceSimpleMethod GstDeinterlaceSimpleMethod;
-typedef struct _GstDeinterlaceSimpleMethodClass GstDeinterlaceSimpleMethodClass;
-typedef struct _GstDeinterlaceScanlineData GstDeinterlaceScanlineData;
-
-/*
- * This structure defines the simple deinterlacer plugin.
- */
-
-struct _GstDeinterlaceScanlineData {
- guint8 *tt0, *t0, *m0, *b0, *bb0;
- guint8 *tt1, *t1, *m1, *b1, *bb1;
- guint8 *tt2, *t2, *m2, *b2, *bb2;
- guint8 *tt3, *t3, *m3, *b3, *bb3;
- gboolean bottom_field;
-};
-
-/**
- * For interpolate_scanline the input is:
- *
- * | t-3 t-2 t-1 t
- * | Field 3 | Field 2 | Field 1 | Field 0 |
- * | TT3 | | TT1 | |
- * | | T2 | | T0 |
- * | M3 | | M1 | |
- * | | B2 | | B0 |
- * | BB3 | | BB1 | |
- *
- * For copy_scanline the input is:
- *
- * | t-3 t-2 t-1 t
- * | Field 3 | Field 2 | Field 1 | Field 0 |
- * | | TT2 | | TT0 |
- * | T3 | | T1 | |
- * | | M2 | | M0 |
- * | B3 | | B1 | |
- * | | BB2 | | BB0 |
- *
- * All other values are NULL.
- */
-
-struct _GstDeinterlaceSimpleMethod {
- GstDeinterlaceMethod parent;
-};
-
-struct _GstDeinterlaceSimpleMethodClass {
- GstDeinterlaceMethodClass parent_class;
-
- void (*interpolate_scanline) (GstDeinterlaceMethod *self, GstDeinterlace2 * parent, guint8 *out, GstDeinterlaceScanlineData *scanlines, gint width);
- void (*copy_scanline) (GstDeinterlaceMethod *self, GstDeinterlace2 * parent, guint8 *out, GstDeinterlaceScanlineData *scanlines, gint width);
-};
-
-GType gst_deinterlace_simple_method_get_type (void);
-
-
-#define MAX_FIELD_HISTORY 10
-
-#define PICTURE_PROGRESSIVE 0
-#define PICTURE_INTERLACED_BOTTOM 1
-#define PICTURE_INTERLACED_TOP 2
-#define PICTURE_INTERLACED_MASK (PICTURE_INTERLACED_BOTTOM | PICTURE_INTERLACED_TOP)
-
-typedef struct
-{
- /* pointer to the start of data for this field */
- GstBuffer *buf;
- /* see PICTURE_ flags */
- guint flags;
-} GstPicture;
-
-typedef enum
-{
- GST_DEINTERLACE2_TOMSMOCOMP,
- GST_DEINTERLACE2_GREEDY_H,
- GST_DEINTERLACE2_GREEDY_L,
- GST_DEINTERLACE2_VFIR,
- GST_DEINTERLACE2_LINEAR,
- GST_DEINTERLACE2_LINEAR_BLEND,
- GST_DEINTERLACE2_SCALER_BOB,
- GST_DEINTERLACE2_WEAVE,
- GST_DEINTERLACE2_WEAVE_TFF,
- GST_DEINTERLACE2_WEAVE_BFF
-} GstDeinterlace2Methods;
-
-typedef enum
-{
- GST_DEINTERLACE2_ALL, /* All (missing data is interp.) */
- GST_DEINTERLACE2_TF, /* Top Fields Only */
- GST_DEINTERLACE2_BF /* Bottom Fields Only */
-} GstDeinterlace2Fields;
-
-typedef enum
-{
- GST_DEINTERLACE2_LAYOUT_AUTO,
- GST_DEINTERLACE2_LAYOUT_TFF,
- GST_DEINTERLACE2_LAYOUT_BFF
-} GstDeinterlace2FieldLayout;
-
-typedef enum {
- GST_DEINTERLACE2_MODE_AUTO,
- GST_DEINTERLACE2_MODE_INTERLACED
-} GstDeinterlace2Mode;
-
-struct _GstDeinterlace2
-{
- GstElement parent;
-
- GstPad *srcpad, *sinkpad;
-
- /* <private> */
-
- GstDeinterlace2Mode mode;
-
- GstDeinterlace2FieldLayout field_layout;
-
- guint frame_size;
- gint frame_rate_n, frame_rate_d;
- gboolean interlaced;
-
- /* Duration of one field */
- GstClockTime field_duration;
-
- GstDeinterlace2Fields fields;
-
- GstDeinterlace2Methods method_id;
- GstDeinterlaceMethod *method;
-
- /* The most recent pictures
- PictureHistory[0] is always the most recent.
- Pointers are NULL if the picture in question isn't valid, e.g. because
- the program just started or a picture was skipped.
- */
- GstPicture field_history[MAX_FIELD_HISTORY];
- guint history_count;
-
- /* Number of bytes of actual data in each scanline. May be less than
- OverlayPitch since the overlay's scanlines might have alignment
- requirements. Generally equal to FrameWidth * 2.
- */
- guint row_stride;
-
- /* Number of pixels in each scanline. */
- gint frame_width;
-
- /* Number of scanlines per frame. */
- gint frame_height;
-
- /* Number of scanlines per field. FrameHeight / 2, mostly for
- cleanliness so we don't have to keep dividing FrameHeight by 2.
- */
- gint field_height;
-
- /* distance between lines in image
- need not match the pixel width
- */
- guint field_stride;
-};
-
-struct _GstDeinterlace2Class
-{
- GstElementClass parent_class;
-};
-
-GType gst_deinterlace2_get_type (void);
-
-G_END_DECLS
-#endif /* __GST_DEINTERLACE_2_H__ */
diff --git a/gst/deinterlace2/tvtime/greedy.c b/gst/deinterlace2/tvtime/greedy.c
deleted file mode 100644
index 7d4e4b3a..00000000
--- a/gst/deinterlace2/tvtime/greedy.c
+++ /dev/null
@@ -1,488 +0,0 @@
-/*
- *
- * GStreamer
- * Copyright (c) 2000 Tom Barry All rights reserved.
- * mmx.h port copyright (c) 2002 Billy Biggs <vektor@dumbterm.net>.
- *
- * Copyright (C) 2008 Sebastian Dröge <slomo@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.
- */
-
-/*
- * Relicensed for GStreamer from GPL to LGPL with permit from Tom Barry
- * and Billy Biggs.
- * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "_stdint.h"
-
-#include "gstdeinterlace2.h"
-#include <string.h>
-
-#define GST_TYPE_DEINTERLACE_METHOD_GREEDY_L (gst_deinterlace_method_greedy_l_get_type ())
-#define GST_IS_DEINTERLACE_METHOD_GREEDY_L(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_GREEDY_L))
-#define GST_IS_DEINTERLACE_METHOD_GREEDY_L_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_GREEDY_L))
-#define GST_DEINTERLACE_METHOD_GREEDY_L_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_GREEDY_L, GstDeinterlaceMethodGreedyLClass))
-#define GST_DEINTERLACE_METHOD_GREEDY_L(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_GREEDY_L, GstDeinterlaceMethodGreedyL))
-#define GST_DEINTERLACE_METHOD_GREEDY_L_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_GREEDY_L, GstDeinterlaceMethodGreedyLClass))
-#define GST_DEINTERLACE_METHOD_GREEDY_L_CAST(obj) ((GstDeinterlaceMethodGreedyL*)(obj))
-
-GType gst_deinterlace_method_greedy_l_get_type (void);
-
-typedef struct
-{
- GstDeinterlaceMethod parent;
-
- guint max_comb;
-} GstDeinterlaceMethodGreedyL;
-
-typedef struct
-{
- GstDeinterlaceMethodClass parent_class;
- void (*scanline) (GstDeinterlaceMethodGreedyL * self, uint8_t * L2,
- uint8_t * L1, uint8_t * L3, uint8_t * L2P, uint8_t * Dest, int size);
-} GstDeinterlaceMethodGreedyLClass;
-
-// This is a simple lightweight DeInterlace method that uses little CPU time
-// but gives very good results for low or intermedite motion.
-// It defers frames by one field, but that does not seem to produce noticeable
-// lip sync problems.
-//
-// The method used is to take either the older or newer weave pixel depending
-// upon which give the smaller comb factor, and then clip to avoid large damage
-// when wrong.
-//
-// I'd intended this to be part of a larger more elaborate method added to
-// Blended Clip but this give too good results for the CPU to ignore here.
-
-static inline void
-deinterlace_greedy_packed422_scanline_c (GstDeinterlaceMethodGreedyL * self,
- uint8_t * m0, uint8_t * t1,
- uint8_t * b1, uint8_t * m2, uint8_t * output, int width)
-{
- int avg, l2_diff, lp2_diff, max, min, best;
- guint max_comb = self->max_comb;
-
- // L2 == m0
- // L1 == t1
- // L3 == b1
- // LP2 == m2
-
- while (width--) {
- avg = (*t1 + *b1) / 2;
-
- l2_diff = ABS (*m0 - avg);
- lp2_diff = ABS (*m2 - avg);
-
- if (l2_diff > lp2_diff)
- best = *m2;
- else
- best = *m0;
-
- max = MAX (*t1, *b1);
- min = MIN (*t1, *b1);
-
- if (max < 256 - max_comb)
- max += max_comb;
- else
- max = 255;
-
- if (min > max_comb)
- min -= max_comb;
- else
- min = 0;
-
- *output = CLAMP (best, min, max);
-
- // Advance to the next set of pixels.
- output += 1;
- m0 += 1;
- t1 += 1;
- b1 += 1;
- m2 += 1;
- }
-}
-
-#ifdef BUILD_X86_ASM
-#include "mmx.h"
-static void
-deinterlace_greedy_packed422_scanline_mmx (GstDeinterlaceMethodGreedyL * self,
- uint8_t * m0, uint8_t * t1,
- uint8_t * b1, uint8_t * m2, uint8_t * output, int width)
-{
- mmx_t MaxComb;
- mmx_t ShiftMask;
-
- // How badly do we let it weave? 0-255
- MaxComb.ub[0] = self->max_comb;
- MaxComb.ub[1] = self->max_comb;
- MaxComb.ub[2] = self->max_comb;
- MaxComb.ub[3] = self->max_comb;
- MaxComb.ub[4] = self->max_comb;
- MaxComb.ub[5] = self->max_comb;
- MaxComb.ub[6] = self->max_comb;
- MaxComb.ub[7] = self->max_comb;
-
- ShiftMask.ub[0] = 0x7f;
- ShiftMask.ub[1] = 0x7f;
- ShiftMask.ub[2] = 0x7f;
- ShiftMask.ub[3] = 0x7f;
- ShiftMask.ub[4] = 0x7f;
- ShiftMask.ub[5] = 0x7f;
- ShiftMask.ub[6] = 0x7f;
- ShiftMask.ub[7] = 0x7f;
-
- // L2 == m0
- // L1 == t1
- // L3 == b1
- // LP2 == m2
-
- movq_m2r (MaxComb, mm6);
-
- for (; width > 7; width -= 8) {
- movq_m2r (*t1, mm1); // L1
- movq_m2r (*m0, mm2); // L2
- movq_m2r (*b1, mm3); // L3
- movq_m2r (*m2, mm0); // LP2
-
- // average L1 and L3 leave result in mm4
- movq_r2r (mm1, mm4); // L1
- movq_r2r (mm3, mm5); // L3
- psrlw_i2r (1, mm4); // L1/2
- pand_m2r (ShiftMask, mm4);
- psrlw_i2r (1, mm5); // L3/2
- pand_m2r (ShiftMask, mm5);
- paddusb_r2r (mm5, mm4); // (L1 + L3) / 2
-
- // get abs value of possible L2 comb
- movq_r2r (mm2, mm7); // L2
- psubusb_r2r (mm4, mm7); // L2 - avg
- movq_r2r (mm4, mm5); // avg
- psubusb_r2r (mm2, mm5); // avg - L2
- por_r2r (mm7, mm5); // abs(avg-L2)
-
- // get abs value of possible LP2 comb
- movq_r2r (mm0, mm7); // LP2
- psubusb_r2r (mm4, mm7); // LP2 - avg
- psubusb_r2r (mm0, mm4); // avg - LP2
- por_r2r (mm7, mm4); // abs(avg-LP2)
-
- // use L2 or LP2 depending upon which makes smaller comb
- psubusb_r2r (mm5, mm4); // see if it goes to zero
- psubusb_r2r (mm5, mm5); // 0
- pcmpeqb_r2r (mm5, mm4); // if (mm4=0) then FF else 0
- pcmpeqb_r2r (mm4, mm5); // opposite of mm4
-
- // if Comb(LP2) <= Comb(L2) then mm4=ff, mm5=0 else mm4=0, mm5 = 55
- pand_r2r (mm2, mm5); // use L2 if mm5 == ff, else 0
- pand_r2r (mm0, mm4); // use LP2 if mm4 = ff, else 0
- por_r2r (mm5, mm4); // may the best win
-
- // Now lets clip our chosen value to be not outside of the range
- // of the high/low range L1-L3 by more than abs(L1-L3)
- // This allows some comb but limits the damages and also allows more
- // detail than a boring oversmoothed clip.
-
- movq_r2r (mm1, mm2); // copy L1
- psubusb_r2r (mm3, mm2); // - L3, with saturation
- paddusb_r2r (mm3, mm2); // now = Max(L1,L3)
-
- pcmpeqb_r2r (mm7, mm7); // all ffffffff
- psubusb_r2r (mm1, mm7); // - L1
- paddusb_r2r (mm7, mm3); // add, may sat at fff..
- psubusb_r2r (mm7, mm3); // now = Min(L1,L3)
-
- // allow the value to be above the high or below the low by amt of MaxComb
- paddusb_r2r (mm6, mm2); // increase max by diff
- psubusb_r2r (mm6, mm3); // lower min by diff
-
- psubusb_r2r (mm3, mm4); // best - Min
- paddusb_r2r (mm3, mm4); // now = Max(best,Min(L1,L3)
-
- pcmpeqb_r2r (mm7, mm7); // all ffffffff
- psubusb_r2r (mm4, mm7); // - Max(best,Min(best,L3)
- paddusb_r2r (mm7, mm2); // add may sat at FFF..
- psubusb_r2r (mm7, mm2); // now = Min( Max(best, Min(L1,L3), L2 )=L2 clipped
-
- movq_r2m (mm2, *output); // move in our clipped best
-
- // Advance to the next set of pixels.
- output += 8;
- m0 += 8;
- t1 += 8;
- b1 += 8;
- m2 += 8;
- }
- emms ();
- if (width > 0)
- deinterlace_greedy_packed422_scanline_c (self, m0, t1, b1, m2, output,
- width);
-}
-
-#include "sse.h"
-
-static void
-deinterlace_greedy_packed422_scanline_mmxext (GstDeinterlaceMethodGreedyL *
- self, uint8_t * m0, uint8_t * t1, uint8_t * b1, uint8_t * m2,
- uint8_t * output, int width)
-{
- mmx_t MaxComb;
-
- // How badly do we let it weave? 0-255
- MaxComb.ub[0] = self->max_comb;
- MaxComb.ub[1] = self->max_comb;
- MaxComb.ub[2] = self->max_comb;
- MaxComb.ub[3] = self->max_comb;
- MaxComb.ub[4] = self->max_comb;
- MaxComb.ub[5] = self->max_comb;
- MaxComb.ub[6] = self->max_comb;
- MaxComb.ub[7] = self->max_comb;
-
- // L2 == m0
- // L1 == t1
- // L3 == b1
- // LP2 == m2
-
- movq_m2r (MaxComb, mm6);
-
- for (; width > 7; width -= 8) {
- movq_m2r (*t1, mm1); // L1
- movq_m2r (*m0, mm2); // L2
- movq_m2r (*b1, mm3); // L3
- movq_m2r (*m2, mm0); // LP2
-
- // average L1 and L3 leave result in mm4
- movq_r2r (mm1, mm4); // L1
- pavgb_r2r (mm3, mm4); // (L1 + L3)/2
-
- // get abs value of possible L2 comb
- movq_r2r (mm2, mm7); // L2
- psubusb_r2r (mm4, mm7); // L2 - avg
- movq_r2r (mm4, mm5); // avg
- psubusb_r2r (mm2, mm5); // avg - L2
- por_r2r (mm7, mm5); // abs(avg-L2)
-
- // get abs value of possible LP2 comb
- movq_r2r (mm0, mm7); // LP2
- psubusb_r2r (mm4, mm7); // LP2 - avg
- psubusb_r2r (mm0, mm4); // avg - LP2
- por_r2r (mm7, mm4); // abs(avg-LP2)
-
- // use L2 or LP2 depending upon which makes smaller comb
- psubusb_r2r (mm5, mm4); // see if it goes to zero
- pxor_r2r (mm5, mm5); // 0
- pcmpeqb_r2r (mm5, mm4); // if (mm4=0) then FF else 0
- pcmpeqb_r2r (mm4, mm5); // opposite of mm4
-
- // if Comb(LP2) <= Comb(L2) then mm4=ff, mm5=0 else mm4=0, mm5 = 55
- pand_r2r (mm2, mm5); // use L2 if mm5 == ff, else 0
- pand_r2r (mm0, mm4); // use LP2 if mm4 = ff, else 0
- por_r2r (mm5, mm4); // may the best win
-
- // Now lets clip our chosen value to be not outside of the range
- // of the high/low range L1-L3 by more than abs(L1-L3)
- // This allows some comb but limits the damages and also allows more
- // detail than a boring oversmoothed clip.
-
- movq_r2r (mm1, mm2); // copy L1
- pmaxub_r2r (mm3, mm2); // now = Max(L1,L3)
-
- pminub_r2r (mm1, mm3); // now = Min(L1,L3)
-
- // allow the value to be above the high or below the low by amt of MaxComb
- paddusb_r2r (mm6, mm2); // increase max by diff
- psubusb_r2r (mm6, mm3); // lower min by diff
-
-
- pmaxub_r2r (mm3, mm4); // now = Max(best,Min(L1,L3)
- pminub_r2r (mm4, mm2); // now = Min( Max(best, Min(L1,L3)), L2 )=L2 clipped
-
- movq_r2m (mm2, *output); // move in our clipped best
-
- // Advance to the next set of pixels.
- output += 8;
- m0 += 8;
- t1 += 8;
- b1 += 8;
- m2 += 8;
- }
- emms ();
-
- if (width > 0)
- deinterlace_greedy_packed422_scanline_c (self, m0, t1, b1, m2, output,
- width);
-}
-
-#endif
-
-static void
-deinterlace_frame_di_greedy (GstDeinterlaceMethod * d_method,
- GstDeinterlace2 * object, GstBuffer * outbuf)
-{
- GstDeinterlaceMethodGreedyL *self =
- GST_DEINTERLACE_METHOD_GREEDY_L (d_method);
- GstDeinterlaceMethodGreedyLClass *klass =
- GST_DEINTERLACE_METHOD_GREEDY_L_GET_CLASS (self);
- int InfoIsOdd = 0;
- int Line;
- unsigned int Pitch = object->field_stride;
- unsigned char *L1; // ptr to Line1, of 3
- unsigned char *L2; // ptr to Line2, the weave line
- unsigned char *L3; // ptr to Line3
-
- unsigned char *L2P; // ptr to prev Line2
- unsigned char *Dest = GST_BUFFER_DATA (outbuf);
-
- // copy first even line no matter what, and the first odd line if we're
- // processing an EVEN field. (note diff from other deint rtns.)
-
- if (object->field_history[object->history_count - 1].flags ==
- PICTURE_INTERLACED_BOTTOM) {
- InfoIsOdd = 1;
-
- L1 = GST_BUFFER_DATA (object->field_history[object->history_count - 2].buf);
- L2 = GST_BUFFER_DATA (object->field_history[object->history_count - 1].buf);
- L3 = L1 + Pitch;
- L2P =
- GST_BUFFER_DATA (object->field_history[object->history_count - 3].buf);
-
- // copy first even line
- oil_memcpy (Dest, L1, object->row_stride);
- Dest += object->row_stride;
- } else {
- InfoIsOdd = 0;
- L1 = GST_BUFFER_DATA (object->field_history[object->history_count - 2].buf);
- L2 = GST_BUFFER_DATA (object->field_history[object->history_count -
- 1].buf) + Pitch;
- L3 = L1 + Pitch;
- L2P =
- GST_BUFFER_DATA (object->field_history[object->history_count - 3].buf) +
- Pitch;
-
- // copy first even line
- oil_memcpy (Dest, GST_BUFFER_DATA (object->field_history[0].buf),
- object->row_stride);
- Dest += object->row_stride;
- // then first odd line
- oil_memcpy (Dest, L1, object->row_stride);
- Dest += object->row_stride;
- }
-
- for (Line = 0; Line < (object->field_height - 1); ++Line) {
- klass->scanline (self, L2, L1, L3, L2P, Dest, object->row_stride);
- Dest += object->row_stride;
- oil_memcpy (Dest, L3, object->row_stride);
- Dest += object->row_stride;
-
- L1 += Pitch;
- L2 += Pitch;
- L3 += Pitch;
- L2P += Pitch;
- }
-
- if (InfoIsOdd) {
- oil_memcpy (Dest, L2, object->row_stride);
- }
-}
-
-
-G_DEFINE_TYPE (GstDeinterlaceMethodGreedyL, gst_deinterlace_method_greedy_l,
- GST_TYPE_DEINTERLACE_METHOD);
-
-enum
-{
- ARG_0,
- ARG_MAX_COMB
-};
-
-static void
-gst_deinterlace_method_greedy_l_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec)
-{
- GstDeinterlaceMethodGreedyL *self = GST_DEINTERLACE_METHOD_GREEDY_L (object);
-
- switch (prop_id) {
- case ARG_MAX_COMB:
- self->max_comb = g_value_get_uint (value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- }
-}
-
-static void
-gst_deinterlace_method_greedy_l_get_property (GObject * object, guint prop_id,
- GValue * value, GParamSpec * pspec)
-{
- GstDeinterlaceMethodGreedyL *self = GST_DEINTERLACE_METHOD_GREEDY_L (object);
-
- switch (prop_id) {
- case ARG_MAX_COMB:
- g_value_set_uint (value, self->max_comb);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- }
-}
-
-static void
-gst_deinterlace_method_greedy_l_class_init (GstDeinterlaceMethodGreedyLClass *
- klass)
-{
- GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass;
- GObjectClass *gobject_class = (GObjectClass *) klass;
-#ifdef BUILD_X86_ASM
- guint cpu_flags = oil_cpu_get_flags ();
-#endif
-
- gobject_class->set_property = gst_deinterlace_method_greedy_l_set_property;
- gobject_class->get_property = gst_deinterlace_method_greedy_l_get_property;
-
- g_object_class_install_property (gobject_class, ARG_MAX_COMB,
- g_param_spec_uint ("max-comb",
- "Max comb",
- "Max Comb", 0, 255, 15, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
- );
-
- dim_class->fields_required = 4;
- dim_class->deinterlace_frame = deinterlace_frame_di_greedy;
- dim_class->name = "Motion Adaptive: Simple Detection";
- dim_class->nick = "greedyl";
- dim_class->latency = 1;
-
-#ifdef BUILD_X86_ASM
- if (cpu_flags & OIL_IMPL_FLAG_MMXEXT) {
- klass->scanline = deinterlace_greedy_packed422_scanline_mmxext;
- } else if (cpu_flags & OIL_IMPL_FLAG_MMX) {
- klass->scanline = deinterlace_greedy_packed422_scanline_mmx;
- } else {
- klass->scanline = deinterlace_greedy_packed422_scanline_c;
- }
-#else
- klass->scanline = deinterlace_greedy_packed422_scanline_c;
-#endif
-}
-
-static void
-gst_deinterlace_method_greedy_l_init (GstDeinterlaceMethodGreedyL * self)
-{
- self->max_comb = 15;
-}
diff --git a/gst/deinterlace2/tvtime/greedyh.asm b/gst/deinterlace2/tvtime/greedyh.asm
deleted file mode 100644
index 86e97c58..00000000
--- a/gst/deinterlace2/tvtime/greedyh.asm
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- *
- * GStreamer
- * Copyright (c) 2001 Tom Barry. All rights reserved.
- * Copyright (C) 2008 Sebastian Dröge <slomo@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.
- */
-
-
-/*
- * Relicensed for GStreamer from GPL to LGPL with permit from Tom Barry.
- * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578
- */
-
-
-#include "x86-64_macros.inc"
-
-void
-FUNCT_NAME (GstDeinterlaceMethodGreedyH *self, uint8_t * L1, uint8_t * L2, uint8_t * L3, uint8_t * L2P,
- uint8_t * Dest, int size)
-{
-
- // in tight loop some vars are accessed faster in local storage
- int64_t YMask = 0x00ff00ff00ff00ffull; // to keep only luma
- int64_t UVMask = 0xff00ff00ff00ff00ull; // to keep only chroma
- int64_t ShiftMask = 0xfefefefefefefefeull; // to avoid shifting chroma to luma
- int64_t QW256 = 0x0100010001000100ull; // 4 256's
- int64_t MaxComb;
- int64_t MotionThreshold;
- int64_t MotionSense;
- int64_t i;
- long LoopCtr;
- long oldbx;
-
- int64_t QW256B;
- int64_t LastAvg = 0; //interp value from left qword
-
- // FIXME: Use C implementation if the width is not a multiple of 4
- // Do something more optimal later
- if (size % 8 != 0)
- greedyDScaler_C (self, L1, L2, L3, L2P, Dest, size);
-
- // Set up our two parms that are actually evaluated for each pixel
- i = self->max_comb;
- MaxComb =
- i << 56 | i << 48 | i << 40 | i << 32 | i << 24 | i << 16 | i << 8 | i;
-
- i = self->motion_threshold; // scale to range of 0-257
- MotionThreshold = i << 48 | i << 32 | i << 16 | i | UVMask;
-
- i = self->motion_sense; // scale to range of 0-257
- MotionSense = i << 48 | i << 32 | i << 16 | i;
-
- i = 0xffffffff - 256;
- QW256B = i << 48 | i << 32 | i << 16 | i; // save a couple instr on PMINSW instruct.
-
- LoopCtr = size / 8 - 1; // there are LineLength / 8 qwords per line but do 1 less, adj at end of loop
-
- // For ease of reading, the comments below assume that we're operating on an odd
- // field (i.e., that InfoIsOdd is true). Assume the obvious for even lines..
- __asm__ __volatile__ (
- // save ebx (-fPIC)
- MOVX " %%" XBX ", %[oldbx]\n\t"
- MOVX " %[L1], %%" XAX "\n\t"
- LEAX " 8(%%" XAX "), %%" XBX "\n\t" // next qword needed by DJR
- MOVX " %[L3], %%" XCX "\n\t"
- SUBX " %%" XAX ", %%" XCX "\n\t" // carry L3 addr as an offset
- MOVX " %[L2P], %%" XDX "\n\t"
- MOVX " %[L2], %%" XSI "\n\t"
- MOVX " %[Dest], %%" XDI "\n\t" // DL1 if Odd or DL2 if Even
-
- ".align 8\n\t"
- "1:\n\t"
- "movq (%%" XSI "), %%mm0\n\t" // L2 - the newest weave pixel value
- "movq (%%" XAX "), %%mm1\n\t" // L1 - the top pixel
- "movq (%%" XDX "), %%mm2\n\t" // L2P - the prev weave pixel
- "movq (%%" XAX ", %%" XCX "), %%mm3\n\t" // L3, next odd row
- "movq %%mm1, %%mm6\n\t" // L1 - get simple single pixel interp
-
- // pavgb mm6, mm3 // use macro below
- V_PAVGB ("%%mm6", "%%mm3", "%%mm4", "%[ShiftMask]")
-
- // DJR - Diagonal Jaggie Reduction
- // In the event that we are going to use an average (Bob) pixel we do not want a jagged
- // stair step effect. To combat this we avg in the 2 horizontally adjacen pixels into the
- // interpolated Bob mix. This will do horizontal smoothing for only the Bob'd pixels.
-
- "movq %[LastAvg], %%mm4\n\t" // the bob value from prev qword in row
- "movq %%mm6, %[LastAvg]\n\t" // save for next pass
- "psrlq $48, %%mm4\n\t" // right justify 1 pixel
- "movq %%mm6, %%mm7\n\t" // copy of simple bob pixel
- "psllq $16, %%mm7\n\t" // left justify 3 pixels
- "por %%mm7, %%mm4\n\t" // and combine
- "movq (%%" XBX "), %%mm5\n\t" // next horiz qword from L1
- // pavgb mm5, qword ptr[ebx+ecx] // next horiz qword from L3, use macro below
-
- V_PAVGB ("%%mm5", "(%%" XBX ",%%" XCX ")", "%%mm7", "%[ShiftMask]")
- "psllq $48, %%mm5\n\t" // left just 1 pixel
- "movq %%mm6, %%mm7\n\t" // another copy of simple bob pixel
- "psrlq $16, %%mm7\n\t" // right just 3 pixels
- "por %%mm7, %%mm5\n\t" // combine
- // pavgb mm4, mm5 // avg of forward and prev by 1 pixel, use macro
- V_PAVGB ("%%mm4", "%%mm5", "%%mm5", "%[ShiftMask]") // mm5 gets modified if MMX
- // pavgb mm6, mm4 // avg of center and surround interp vals, use macro
- V_PAVGB ("%%mm6", "%%mm4", "%%mm7", "%[ShiftMask]")
-
- // Don't do any more averaging than needed for mmx. It hurts performance and causes rounding errors.
-#ifndef IS_MMX
- // pavgb mm4, mm6 // 1/4 center, 3/4 adjacent
- V_PAVGB ("%%mm4", "%%mm6", "%%mm7", "%[ShiftMask]")
- // pavgb mm6, mm4 // 3/8 center, 5/8 adjacent
- V_PAVGB ("%%mm6", "%%mm4", "%%mm7", "%[ShiftMask]")
-#endif
-
- // get abs value of possible L2 comb
- "movq %%mm6, %%mm4\n\t" // work copy of interp val
- "movq %%mm2, %%mm7\n\t" // L2
- "psubusb %%mm4, %%mm7\n\t" // L2 - avg
- "movq %%mm4, %%mm5\n\t" // avg
- "psubusb %%mm2, %%mm5\n\t" // avg - L2
- "por %%mm7, %%mm5\n\t" // abs(avg-L2)
-
- // get abs value of possible L2P comb
- "movq %%mm0, %%mm7\n\t" // L2P
- "psubusb %%mm4, %%mm7\n\t" // L2P - avg
- "psubusb %%mm0, %%mm4\n\t" // avg - L2P
- "por %%mm7, %%mm4\n\t" // abs(avg-L2P)
-
- // use L2 or L2P depending upon which makes smaller comb
- "psubusb %%mm5, %%mm4\n\t" // see if it goes to zero
- "psubusb %%mm5, %%mm5\n\t" // 0
- "pcmpeqb %%mm5, %%mm4\n\t" // if (mm4=0) then FF else 0
- "pcmpeqb %%mm4, %%mm5\n\t" // opposite of mm4
-
- // if Comb(L2P) <= Comb(L2) then mm4=ff, mm5=0 else mm4=0, mm5 = 55
- "pand %%mm2, %%mm5\n\t" // use L2 if mm5 == ff, else 0
- "pand %%mm0, %%mm4\n\t" // use L2P if mm4 = ff, else 0
- "por %%mm5, %%mm4\n\t" // may the best win
-
- // Inventory: at this point we have the following values:
- // mm0 = L2P (or L2)
- // mm1 = L1
- // mm2 = L2 (or L2P)
- // mm3 = L3
- // mm4 = the best of L2,L2P weave pixel, base upon comb
- // mm6 = the avg interpolated value, if we need to use it
- // Let's measure movement, as how much the weave pixel has changed
-
- "movq %%mm2, %%mm7\n\t"
- "psubusb %%mm0, %%mm2\n\t"
- "psubusb %%mm7, %%mm0\n\t"
- "por %%mm2, %%mm0\n\t" // abs value of change, used later
-
- // Now lets clip our chosen value to be not outside of the range
- // of the high/low range L1-L3 by more than MaxComb.
- // This allows some comb but limits the damages and also allows more
- // detail than a boring oversmoothed clip.
-
- "movq %%mm1, %%mm2\n\t" // copy L1
- // pmaxub mm2, mm3 // use macro
- V_PMAXUB ("%%mm2", "%%mm3") // now = Max(L1,L3)
- "movq %%mm1, %%mm5\n\t" // copy L1
- // pminub mm5, mm3 // now = Min(L1,L3), use macro
- V_PMINUB ("%%mm5", "%%mm3", "%%mm7")
-
- // allow the value to be above the high or below the low by amt of MaxComb
- "psubusb %[MaxComb], %%mm5\n\t" // lower min by diff
- "paddusb %[MaxComb], %%mm2\n\t" // increase max by diff
- // pmaxub mm4, mm5 // now = Max(best,Min(L1,L3) use macro
- V_PMAXUB ("%%mm4", "%%mm5")
- // pminub mm4, mm2 // now = Min( Max(best, Min(L1,L3), L2 )=L2 clipped
- V_PMINUB ("%%mm4", "%%mm2", "%%mm7")
-
- // Blend weave pixel with bob pixel, depending on motion val in mm0
- "psubusb %[MotionThreshold], %%mm0\n\t" // test Threshold, clear chroma change >>>??
- "pmullw %[MotionSense], %%mm0\n\t" // mul by user factor, keep low 16 bits
- "movq %[QW256], %%mm7\n\t"
-#ifdef IS_MMXEXT
- "pminsw %%mm7, %%mm0\n\t" // max = 256
-#else
- "paddusw %[QW256B], %%mm0\n\t" // add, may sat at fff..
- "psubusw %[QW256B], %%mm0\n\t" // now = Min(L1,256)
-#endif
- "psubusw %%mm0, %%mm7\n\t" // so the 2 sum to 256, weighted avg
- "movq %%mm4, %%mm2\n\t" // save weave chroma info before trashing
- "pand %[YMask], %%mm4\n\t" // keep only luma from calc'd value
- "pmullw %%mm7, %%mm4\n\t" // use more weave for less motion
- "pand %[YMask], %%mm6\n\t" // keep only luma from calc'd value
- "pmullw %%mm0, %%mm6\n\t" // use more bob for large motion
- "paddusw %%mm6, %%mm4\n\t" // combine
- "psrlw $8, %%mm4\n\t" // div by 256 to get weighted avg
- // chroma comes from weave pixel
- "pand %[UVMask], %%mm2\n\t" // keep chroma
- "por %%mm4, %%mm2\n\t" // and combine
- V_MOVNTQ ("(%%" XDI ")", "%%mm2") // move in our clipped best, use macro
- // bump ptrs and loop
- LEAX " 8(%%" XAX "), %%" XAX "\n\t"
- LEAX " 8(%%" XBX "), %%" XBX "\n\t"
- LEAX " 8(%%" XDX "), %%" XDX "\n\t"
- LEAX " 8(%%" XDI "), %%" XDI "\n\t"
- LEAX " 8(%%" XSI "), %%" XSI "\n\t"
- DECX " %[LoopCtr]\n\t"
-
- "jg 1b\n\t" // loop if not to last line
- // note P-III default assumes backward branches taken
- "jl 1f\n\t" // done
- MOVX " %%" XAX ", %%" XBX "\n\t" // sharpness lookahead 1 byte only, be wrong on 1
- "jmp 1b\n\t"
-
- "1:\n\t"
- MOVX " %[oldbx], %%" XBX "\n\t"
- "emms\n\t": /* no outputs */
-
- :[LastAvg] "m" (LastAvg),
- [L1] "m" (L1),
- [L3] "m" (L3),
- [L2P] "m" (L2P),
- [L2] "m" (L2),
- [Dest] "m" (Dest),
- [ShiftMask] "m" (ShiftMask),
- [MaxComb] "m" (MaxComb),
- [MotionThreshold] "m" (MotionThreshold),
- [MotionSense] "m" (MotionSense),
- [QW256B] "m" (QW256B),
- [YMask] "m" (YMask),
- [UVMask] "m" (UVMask),
- [LoopCtr] "m" (LoopCtr),
- [QW256] "m" (QW256),
- [oldbx] "m" (oldbx)
- : XAX, XCX, XDX, XSI, XDI,
- "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
-#ifdef __MMX__
- "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
-#endif
- "memory", "cc");
-}
diff --git a/gst/deinterlace2/tvtime/greedyh.c b/gst/deinterlace2/tvtime/greedyh.c
deleted file mode 100644
index a5aafd18..00000000
--- a/gst/deinterlace2/tvtime/greedyh.c
+++ /dev/null
@@ -1,420 +0,0 @@
-/*
- *
- * GStreamer
- * Copyright (C) 2004 Billy Biggs <vektor@dumbterm.net>
- * Copyright (C) 2008 Sebastian Dröge <slomo@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.
- */
-
-/*
- * Relicensed for GStreamer from GPL to LGPL with permit from Billy Biggs.
- * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "greedyhmacros.h"
-
-#include <stdlib.h>
-#include "_stdint.h"
-#include <string.h>
-
-#include "gst/gst.h"
-#include "plugins.h"
-#include "gstdeinterlace2.h"
-
-#define GST_TYPE_DEINTERLACE_METHOD_GREEDY_H (gst_deinterlace_method_greedy_h_get_type ())
-#define GST_IS_DEINTERLACE_METHOD_GREEDY_H(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_GREEDY_H))
-#define GST_IS_DEINTERLACE_METHOD_GREEDY_H_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_GREEDY_H))
-#define GST_DEINTERLACE_METHOD_GREEDY_H_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_GREEDY_H, GstDeinterlaceMethodGreedyHClass))
-#define GST_DEINTERLACE_METHOD_GREEDY_H(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_GREEDY_H, GstDeinterlaceMethodGreedyH))
-#define GST_DEINTERLACE_METHOD_GREEDY_H_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_GREEDY_H, GstDeinterlaceMethodGreedyHClass))
-#define GST_DEINTERLACE_METHOD_GREEDY_H_CAST(obj) ((GstDeinterlaceMethodGreedyH*)(obj))
-
-GType gst_deinterlace_method_greedy_h_get_type (void);
-
-typedef struct
-{
- GstDeinterlaceMethod parent;
-
- guint max_comb, motion_threshold, motion_sense;
-} GstDeinterlaceMethodGreedyH;
-
-typedef struct
-{
- GstDeinterlaceMethodClass parent_class;
- void (*scanline) (GstDeinterlaceMethodGreedyH * self, uint8_t * L2,
- uint8_t * L1, uint8_t * L3, uint8_t * L2P, uint8_t * Dest, int size);
-} GstDeinterlaceMethodGreedyHClass;
-
-void
-greedyDScaler_C (GstDeinterlaceMethodGreedyH * self, uint8_t * L1, uint8_t * L2,
- uint8_t * L3, uint8_t * L2P, uint8_t * Dest, int size)
-{
- int Pos;
- uint8_t l1_l, l1_1_l, l3_l, l3_1_l;
- uint8_t l1_c, l1_1_c, l3_c, l3_1_c;
- uint8_t avg_l, avg_c, avg_l_1, avg_c_1;
- uint8_t avg_l__1 = 0, avg_c__1 = 0;
- uint8_t avg_s_l, avg_s_c;
- uint8_t avg_sc_l, avg_sc_c;
- uint8_t best_l, best_c;
- uint16_t mov_l;
- uint8_t out_l, out_c;
- uint8_t l2_l, l2_c, lp2_l, lp2_c;
- uint8_t l2_l_diff, l2_c_diff, lp2_l_diff, lp2_c_diff;
- uint8_t min_l, min_c, max_l, max_c;
- guint max_comb = self->max_comb;
- guint motion_sense = self->motion_sense;
- guint motion_threshold = self->motion_threshold;
-
- for (Pos = 0; Pos < size; Pos += 2) {
- l1_l = L1[0];
- l1_c = L1[1];
- l3_l = L3[0];
- l3_c = L3[1];
-
- if (Pos == size - 1) {
- l1_1_l = l1_l;
- l1_1_c = l1_c;
- l3_1_l = l3_l;
- l3_1_c = l3_c;
- } else {
- l1_1_l = L1[2];
- l1_1_c = L1[3];
- l3_1_l = L3[2];
- l3_1_c = L3[3];
- }
-
- /* Average of L1 and L3 */
- avg_l = (l1_l + l3_l) / 2;
- avg_c = (l1_c + l3_c) / 2;
-
- if (Pos == 0) {
- avg_l__1 = avg_l;
- avg_c__1 = avg_c;
- }
-
- /* Average of next L1 and next L3 */
- avg_l_1 = (l1_1_l + l3_1_l) / 2;
- avg_c_1 = (l1_1_c + l3_1_c) / 2;
-
- /* Calculate average of one pixel forward and previous */
- avg_s_l = (avg_l__1 + avg_l_1) / 2;
- avg_s_c = (avg_c__1 + avg_c_1) / 2;
-
- /* Calculate average of center and surrounding pixels */
- avg_sc_l = (avg_l + avg_s_l) / 2;
- avg_sc_c = (avg_c + avg_s_c) / 2;
-
- /* move forward */
- avg_l__1 = avg_l;
- avg_c__1 = avg_c;
-
- /* Get best L2/L2P, i.e. least diff from above average */
- l2_l = L2[0];
- l2_c = L2[1];
- lp2_l = L2P[0];
- lp2_c = L2P[1];
-
- l2_l_diff = ABS (l2_l - avg_sc_l);
- l2_c_diff = ABS (l2_c - avg_sc_c);
-
- lp2_l_diff = ABS (lp2_l - avg_sc_l);
- lp2_c_diff = ABS (lp2_c - avg_sc_c);
-
- if (l2_l_diff > lp2_l_diff)
- best_l = lp2_l;
- else
- best_l = l2_l;
-
- if (l2_c_diff > lp2_c_diff)
- best_c = lp2_c;
- else
- best_c = l2_c;
-
- /* Clip this best L2/L2P by L1/L3 and allow to differ by GreedyMaxComb */
- max_l = MAX (l1_l, l3_l);
- min_l = MIN (l1_l, l3_l);
-
- if (max_l < 256 - max_comb)
- max_l += max_comb;
- else
- max_l = 255;
-
- if (min_l > max_comb)
- min_l -= max_comb;
- else
- min_l = 0;
-
- max_c = MAX (l1_c, l3_c);
- min_c = MIN (l1_c, l3_c);
-
- if (max_c < 256 - max_comb)
- max_c += max_comb;
- else
- max_c = 255;
-
- if (min_c > max_comb)
- min_c -= max_comb;
- else
- min_c = 0;
-
- out_l = CLAMP (best_l, min_l, max_l);
- out_c = CLAMP (best_c, min_c, max_c);
-
- /* Do motion compensation for luma, i.e. how much
- * the weave pixel differs */
- mov_l = ABS (l2_l - lp2_l);
- if (mov_l > motion_threshold)
- mov_l -= motion_threshold;
- else
- mov_l = 0;
-
- mov_l = mov_l * motion_sense;
- if (mov_l > 256)
- mov_l = 256;
-
- /* Weighted sum on clipped weave pixel and average */
- out_l = (out_l * (256 - mov_l) + avg_sc_l * mov_l) / 256;
-
- Dest[0] = out_l;
- Dest[1] = out_c;
-
- Dest += 2;
- L1 += 2;
- L2 += 2;
- L3 += 2;
- L2P += 2;
- }
-}
-
-#ifdef BUILD_X86_ASM
-
-#define IS_MMXEXT
-#define SIMD_TYPE MMXEXT
-#define FUNCT_NAME greedyDScaler_MMXEXT
-#include "greedyh.asm"
-#undef SIMD_TYPE
-#undef IS_MMXEXT
-#undef FUNCT_NAME
-
-#define IS_3DNOW
-#define SIMD_TYPE 3DNOW
-#define FUNCT_NAME greedyDScaler_3DNOW
-#include "greedyh.asm"
-#undef SIMD_TYPE
-#undef IS_3DNOW
-#undef FUNCT_NAME
-
-#define IS_MMX
-#define SIMD_TYPE MMX
-#define FUNCT_NAME greedyDScaler_MMX
-#include "greedyh.asm"
-#undef SIMD_TYPE
-#undef IS_MMX
-#undef FUNCT_NAME
-
-#endif
-
-static void
-deinterlace_frame_di_greedyh (GstDeinterlaceMethod * d_method,
- GstDeinterlace2 * object, GstBuffer * outbuf)
-{
- GstDeinterlaceMethodGreedyH *self =
- GST_DEINTERLACE_METHOD_GREEDY_H (d_method);
- GstDeinterlaceMethodGreedyHClass *klass =
- GST_DEINTERLACE_METHOD_GREEDY_H_GET_CLASS (self);
- int InfoIsOdd = 0;
- int Line;
- unsigned int Pitch = object->field_stride;
-
- unsigned char *L1; // ptr to Line1, of 3
- unsigned char *L2; // ptr to Line2, the weave line
- unsigned char *L3; // ptr to Line3
-
- unsigned char *L2P; // ptr to prev Line2
- unsigned char *Dest = GST_BUFFER_DATA (outbuf);
-
- // copy first even line no matter what, and the first odd line if we're
- // processing an EVEN field. (note diff from other deint rtns.)
-
- if (object->field_history[object->history_count - 1].flags ==
- PICTURE_INTERLACED_BOTTOM) {
- InfoIsOdd = 1;
-
- L1 = GST_BUFFER_DATA (object->field_history[object->history_count - 2].buf);
- L2 = GST_BUFFER_DATA (object->field_history[object->history_count - 1].buf);
- L3 = L1 + Pitch;
- L2P =
- GST_BUFFER_DATA (object->field_history[object->history_count - 3].buf);
-
- // copy first even line
- oil_memcpy (Dest, L1, object->row_stride);
- Dest += object->row_stride;
- } else {
- InfoIsOdd = 0;
- L1 = GST_BUFFER_DATA (object->field_history[object->history_count - 2].buf);
- L2 = GST_BUFFER_DATA (object->field_history[object->history_count -
- 1].buf) + Pitch;
- L3 = L1 + Pitch;
- L2P =
- GST_BUFFER_DATA (object->field_history[object->history_count - 3].buf) +
- Pitch;
-
- // copy first even line
- oil_memcpy (Dest, GST_BUFFER_DATA (object->field_history[0].buf),
- object->row_stride);
- Dest += object->row_stride;
- // then first odd line
- oil_memcpy (Dest, L1, object->row_stride);
- Dest += object->row_stride;
- }
-
- for (Line = 0; Line < (object->field_height - 1); ++Line) {
- klass->scanline (self, L1, L2, L3, L2P, Dest, object->row_stride);
- Dest += object->row_stride;
- oil_memcpy (Dest, L3, object->row_stride);
- Dest += object->row_stride;
-
- L1 += Pitch;
- L2 += Pitch;
- L3 += Pitch;
- L2P += Pitch;
- }
-
- if (InfoIsOdd) {
- oil_memcpy (Dest, L2, object->row_stride);
- }
-}
-
-G_DEFINE_TYPE (GstDeinterlaceMethodGreedyH, gst_deinterlace_method_greedy_h,
- GST_TYPE_DEINTERLACE_METHOD);
-
-enum
-{
- ARG_0,
- ARG_MAX_COMB,
- ARG_MOTION_THRESHOLD,
- ARG_MOTION_SENSE
-};
-
-static void
-gst_deinterlace_method_greedy_h_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec)
-{
- GstDeinterlaceMethodGreedyH *self = GST_DEINTERLACE_METHOD_GREEDY_H (object);
-
- switch (prop_id) {
- case ARG_MAX_COMB:
- self->max_comb = g_value_get_uint (value);
- break;
- case ARG_MOTION_THRESHOLD:
- self->motion_threshold = g_value_get_uint (value);
- break;
- case ARG_MOTION_SENSE:
- self->motion_sense = g_value_get_uint (value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- }
-}
-
-static void
-gst_deinterlace_method_greedy_h_get_property (GObject * object, guint prop_id,
- GValue * value, GParamSpec * pspec)
-{
- GstDeinterlaceMethodGreedyH *self = GST_DEINTERLACE_METHOD_GREEDY_H (object);
-
- switch (prop_id) {
- case ARG_MAX_COMB:
- g_value_set_uint (value, self->max_comb);
- break;
- case ARG_MOTION_THRESHOLD:
- g_value_set_uint (value, self->motion_threshold);
- break;
- case ARG_MOTION_SENSE:
- g_value_set_uint (value, self->motion_sense);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- }
-}
-
-static void
-gst_deinterlace_method_greedy_h_class_init (GstDeinterlaceMethodGreedyHClass *
- klass)
-{
- GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass;
- GObjectClass *gobject_class = (GObjectClass *) klass;
-#ifdef BUILD_X86_ASM
- guint cpu_flags = oil_cpu_get_flags ();
-#endif
-
- gobject_class->set_property = gst_deinterlace_method_greedy_h_set_property;
- gobject_class->get_property = gst_deinterlace_method_greedy_h_get_property;
-
- g_object_class_install_property (gobject_class, ARG_MAX_COMB,
- g_param_spec_uint ("max-comb",
- "Max comb",
- "Max Comb", 0, 255, 5, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
- );
-
- g_object_class_install_property (gobject_class, ARG_MOTION_THRESHOLD,
- g_param_spec_uint ("motion-threshold",
- "Motion Threshold",
- "Motion Threshold",
- 0, 255, 25, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
- );
-
- g_object_class_install_property (gobject_class, ARG_MOTION_SENSE,
- g_param_spec_uint ("motion-sense",
- "Motion Sense",
- "Motion Sense",
- 0, 255, 30, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
- );
-
- dim_class->fields_required = 4;
- dim_class->deinterlace_frame = deinterlace_frame_di_greedyh;
- dim_class->name = "Motion Adaptive: Advanced Detection";
- dim_class->nick = "greedyh";
- dim_class->latency = 1;
-
-#ifdef BUILD_X86_ASM
- if (cpu_flags & OIL_IMPL_FLAG_MMXEXT) {
- klass->scanline = greedyDScaler_MMXEXT;
- } else if (cpu_flags & OIL_IMPL_FLAG_3DNOW) {
- klass->scanline = greedyDScaler_3DNOW;
- } else if (cpu_flags & OIL_IMPL_FLAG_MMX) {
- klass->scanline = greedyDScaler_MMX;
- } else {
- klass->scanline = greedyDScaler_C;
- }
-#else
- klass->scanline = greedyDScaler_C;
-#endif
-}
-
-static void
-gst_deinterlace_method_greedy_h_init (GstDeinterlaceMethodGreedyH * self)
-{
- self->max_comb = 5;
- self->motion_threshold = 25;
- self->motion_sense = 30;
-}
diff --git a/gst/deinterlace2/tvtime/greedyhmacros.h b/gst/deinterlace2/tvtime/greedyhmacros.h
deleted file mode 100644
index 0386c28e..00000000
--- a/gst/deinterlace2/tvtime/greedyhmacros.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2001 Tom Barry. All rights reserved.
-/////////////////////////////////////////////////////////////////////////////
-//
-// This file is subject to the terms of the GNU General Public License as
-// published by the Free Software Foundation. A copy of this license is
-// included with this software distribution in the file COPYING. If you
-// do not have a copy, you may obtain a copy by writing to the Free
-// Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// This software is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details
-//
-/////////////////////////////////////////////////////////////////////////////
-
-// Define a few macros for CPU dependent instructions.
-// I suspect I don't really understand how the C macro preprocessor works but
-// this seems to get the job done. // TRB 7/01
-
-// BEFORE USING THESE YOU MUST SET:
-
-// #define SIMD_TYPE MMXEXT (or MMX or 3DNOW)
-
-// some macros for pavgb instruction
-// V_PAVGB(mmr1, mmr2, mmr work register, smask) mmr2 may = mmrw if you can trash it
-
-#define V_PAVGB_MMX(mmr1, mmr2, mmrw, smask) \
- "movq "mmr2", "mmrw"\n\t" \
- "pand "smask", "mmrw"\n\t" \
- "psrlw $1, "mmrw"\n\t" \
- "pand "smask", "mmr1"\n\t" \
- "psrlw $1, "mmr1"\n\t" \
- "paddusb "mmrw", "mmr1"\n\t"
-#define V_PAVGB_MMXEXT(mmr1, mmr2, mmrw, smask) "pavgb "mmr2", "mmr1"\n\t"
-#define V_PAVGB_3DNOW(mmr1, mmr2, mmrw, smask) "pavgusb "mmr2", "mmr1"\n\t"
-#define V_PAVGB(mmr1, mmr2, mmrw, smask) V_PAVGB2(mmr1, mmr2, mmrw, smask, SIMD_TYPE)
-#define V_PAVGB2(mmr1, mmr2, mmrw, smask, simd_type) V_PAVGB3(mmr1, mmr2, mmrw, smask, simd_type)
-#define V_PAVGB3(mmr1, mmr2, mmrw, smask, simd_type) V_PAVGB_##simd_type(mmr1, mmr2, mmrw, smask)
-
-// some macros for pmaxub instruction
-#define V_PMAXUB_MMX(mmr1, mmr2) \
- "psubusb "mmr2", "mmr1"\n\t" \
- "paddusb "mmr2", "mmr1"\n\t"
-#define V_PMAXUB_MMXEXT(mmr1, mmr2) "pmaxub "mmr2", "mmr1"\n\t"
-#define V_PMAXUB_3DNOW(mmr1, mmr2) V_PMAXUB_MMX(mmr1, mmr2) // use MMX version
-#define V_PMAXUB(mmr1, mmr2) V_PMAXUB2(mmr1, mmr2, SIMD_TYPE)
-#define V_PMAXUB2(mmr1, mmr2, simd_type) V_PMAXUB3(mmr1, mmr2, simd_type)
-#define V_PMAXUB3(mmr1, mmr2, simd_type) V_PMAXUB_##simd_type(mmr1, mmr2)
-
-// some macros for pminub instruction
-// V_PMINUB(mmr1, mmr2, mmr work register) mmr2 may NOT = mmrw
-#define V_PMINUB_MMX(mmr1, mmr2, mmrw) \
- "pcmpeqb "mmrw", "mmrw"\n\t" \
- "psubusb "mmr2", "mmrw"\n\t" \
- "paddusb "mmrw", "mmr1"\n\t" \
- "psubusb "mmrw", "mmr1"\n\t"
-#define V_PMINUB_MMXEXT(mmr1, mmr2, mmrw) "pminub "mmr2", "mmr1"\n\t"
-#define V_PMINUB_3DNOW(mmr1, mmr2, mmrw) V_PMINUB_MMX(mmr1, mmr2, mmrw) // use MMX version
-#define V_PMINUB(mmr1, mmr2, mmrw) V_PMINUB2(mmr1, mmr2, mmrw, SIMD_TYPE)
-#define V_PMINUB2(mmr1, mmr2, mmrw, simd_type) V_PMINUB3(mmr1, mmr2, mmrw, simd_type)
-#define V_PMINUB3(mmr1, mmr2, mmrw, simd_type) V_PMINUB_##simd_type(mmr1, mmr2, mmrw)
-
-// some macros for movntq instruction
-// V_MOVNTQ(mmr1, mmr2)
-#define V_MOVNTQ_MMX(mmr1, mmr2) "movq "mmr2", "mmr1"\n\t"
-#define V_MOVNTQ_3DNOW(mmr1, mmr2) "movq "mmr2", "mmr1"\n\t"
-#define V_MOVNTQ_MMXEXT(mmr1, mmr2) "movntq "mmr2", "mmr1"\n\t"
-#define V_MOVNTQ(mmr1, mmr2) V_MOVNTQ2(mmr1, mmr2, SIMD_TYPE)
-#define V_MOVNTQ2(mmr1, mmr2, simd_type) V_MOVNTQ3(mmr1, mmr2, simd_type)
-#define V_MOVNTQ3(mmr1, mmr2, simd_type) V_MOVNTQ_##simd_type(mmr1, mmr2)
-
-// end of macros
-
diff --git a/gst/deinterlace2/tvtime/linear.c b/gst/deinterlace2/tvtime/linear.c
deleted file mode 100644
index 42403e49..00000000
--- a/gst/deinterlace2/tvtime/linear.c
+++ /dev/null
@@ -1,214 +0,0 @@
-/**
- * Copyright (C) 2002 Billy Biggs <vektor@dumbterm.net>.
- * Copyright (C) 2008 Sebastian Dröge <slomo@collabora.co.uk>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "_stdint.h"
-#include "gstdeinterlace2.h"
-#include <string.h>
-
-#define GST_TYPE_DEINTERLACE_METHOD_LINEAR (gst_deinterlace_method_linear_get_type ())
-#define GST_IS_DEINTERLACE_METHOD_LINEAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_LINEAR))
-#define GST_IS_DEINTERLACE_METHOD_LINEAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_LINEAR))
-#define GST_DEINTERLACE_METHOD_LINEAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_LINEAR, GstDeinterlaceMethodLinearClass))
-#define GST_DEINTERLACE_METHOD_LINEAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_LINEAR, GstDeinterlaceMethodLinear))
-#define GST_DEINTERLACE_METHOD_LINEAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_LINEAR, GstDeinterlaceMethodLinearClass))
-#define GST_DEINTERLACE_METHOD_LINEAR_CAST(obj) ((GstDeinterlaceMethodLinear*)(obj))
-
-GType gst_deinterlace_method_linear_get_type (void);
-
-typedef GstDeinterlaceSimpleMethod GstDeinterlaceMethodLinear;
-
-typedef GstDeinterlaceSimpleMethodClass GstDeinterlaceMethodLinearClass;
-
-static void
-deinterlace_scanline_linear_c (GstDeinterlaceMethod * self,
- GstDeinterlace2 * parent, guint8 * out,
- GstDeinterlaceScanlineData * scanlines, gint width)
-{
- gint i;
-
- width *= 2;
- for (i = 0; i < width; i++)
- out[i] = (scanlines->t0[i] + scanlines->b0[i]) / 2;
-}
-
-#ifdef BUILD_X86_ASM
-#include "mmx.h"
-static void
-deinterlace_scanline_linear_mmx (GstDeinterlaceMethod * self,
- GstDeinterlace2 * parent, guint8 * out,
- GstDeinterlaceScanlineData * scanlines, gint width)
-{
- const mmx_t shiftmask = { 0xfefffefffefffeffULL }; /* To avoid shifting chroma to luma. */
- int i;
- guint8 *bot = scanlines->b0, *top = scanlines->t0;
-
- for (i = width / 16; i; --i) {
- movq_m2r (*bot, mm0);
- movq_m2r (*top, mm1);
- movq_m2r (*(bot + 8), mm2);
- movq_m2r (*(top + 8), mm3);
- movq_m2r (*(bot + 16), mm4);
- movq_m2r (*(top + 16), mm5);
- movq_m2r (*(bot + 24), mm6);
- movq_m2r (*(top + 24), mm7);
- pand_m2r (shiftmask, mm0);
- pand_m2r (shiftmask, mm1);
- pand_m2r (shiftmask, mm2);
- pand_m2r (shiftmask, mm3);
- pand_m2r (shiftmask, mm4);
- pand_m2r (shiftmask, mm5);
- pand_m2r (shiftmask, mm6);
- pand_m2r (shiftmask, mm7);
- psrlw_i2r (1, mm0);
- psrlw_i2r (1, mm1);
- psrlw_i2r (1, mm2);
- psrlw_i2r (1, mm3);
- psrlw_i2r (1, mm4);
- psrlw_i2r (1, mm5);
- psrlw_i2r (1, mm6);
- psrlw_i2r (1, mm7);
- paddb_r2r (mm1, mm0);
- paddb_r2r (mm3, mm2);
- paddb_r2r (mm5, mm4);
- paddb_r2r (mm7, mm6);
- movq_r2m (mm0, *out);
- movq_r2m (mm2, *(out + 8));
- movq_r2m (mm4, *(out + 16));
- movq_r2m (mm6, *(out + 24));
- out += 32;
- top += 32;
- bot += 32;
- }
- width = (width & 0xf);
-
- for (i = width / 4; i; --i) {
- movq_m2r (*bot, mm0);
- movq_m2r (*top, mm1);
- pand_m2r (shiftmask, mm0);
- pand_m2r (shiftmask, mm1);
- psrlw_i2r (1, mm0);
- psrlw_i2r (1, mm1);
- paddb_r2r (mm1, mm0);
- movq_r2m (mm0, *out);
- out += 8;
- top += 8;
- bot += 8;
- }
- width = width & 0x7;
-
- /* Handle last few pixels. */
- for (i = width * 2; i; --i) {
- *out++ = ((*top++) + (*bot++)) >> 1;
- }
-
- emms ();
-}
-
-#include "sse.h"
-static void
-deinterlace_scanline_linear_mmxext (GstDeinterlaceMethod * self,
- GstDeinterlace2 * parent, guint8 * out,
- GstDeinterlaceScanlineData * scanlines, gint width)
-{
- gint i;
- guint8 *bot = scanlines->b0, *top = scanlines->t0;
-
- for (i = width / 16; i; --i) {
- movq_m2r (*bot, mm0);
- movq_m2r (*top, mm1);
- movq_m2r (*(bot + 8), mm2);
- movq_m2r (*(top + 8), mm3);
- movq_m2r (*(bot + 16), mm4);
- movq_m2r (*(top + 16), mm5);
- movq_m2r (*(bot + 24), mm6);
- movq_m2r (*(top + 24), mm7);
- pavgb_r2r (mm1, mm0);
- pavgb_r2r (mm3, mm2);
- pavgb_r2r (mm5, mm4);
- pavgb_r2r (mm7, mm6);
- movntq_r2m (mm0, *out);
- movntq_r2m (mm2, *(out + 8));
- movntq_r2m (mm4, *(out + 16));
- movntq_r2m (mm6, *(out + 24));
- out += 32;
- top += 32;
- bot += 32;
- }
- width = (width & 0xf);
-
- for (i = width / 4; i; --i) {
- movq_m2r (*bot, mm0);
- movq_m2r (*top, mm1);
- pavgb_r2r (mm1, mm0);
- movntq_r2m (mm0, *out);
- out += 8;
- top += 8;
- bot += 8;
- }
- width = width & 0x7;
-
- /* Handle last few pixels. */
- for (i = width * 2; i; --i) {
- *out++ = ((*top++) + (*bot++)) >> 1;
- }
-
- emms ();
-}
-
-#endif
-
-G_DEFINE_TYPE (GstDeinterlaceMethodLinear, gst_deinterlace_method_linear,
- GST_TYPE_DEINTERLACE_SIMPLE_METHOD);
-
-static void
-gst_deinterlace_method_linear_class_init (GstDeinterlaceMethodLinearClass *
- klass)
-{
- GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass;
- GstDeinterlaceSimpleMethodClass *dism_class =
- (GstDeinterlaceSimpleMethodClass *) klass;
-#ifdef BUILD_X86_ASM
- guint cpu_flags = oil_cpu_get_flags ();
-#endif
-
- dim_class->fields_required = 1;
- dim_class->name = "Television: Full resolution";
- dim_class->nick = "linear";
- dim_class->latency = 0;
-
- dism_class->interpolate_scanline = deinterlace_scanline_linear_c;
-
-#ifdef BUILD_X86_ASM
- if (cpu_flags & OIL_IMPL_FLAG_MMXEXT) {
- dism_class->interpolate_scanline = deinterlace_scanline_linear_mmxext;
- } else if (cpu_flags & OIL_IMPL_FLAG_MMXEXT) {
- dism_class->interpolate_scanline = deinterlace_scanline_linear_mmx;
- }
-#endif
-}
-
-static void
-gst_deinterlace_method_linear_init (GstDeinterlaceMethodLinear * self)
-{
-}
diff --git a/gst/deinterlace2/tvtime/linearblend.c b/gst/deinterlace2/tvtime/linearblend.c
deleted file mode 100644
index c25c4d0e..00000000
--- a/gst/deinterlace2/tvtime/linearblend.c
+++ /dev/null
@@ -1,231 +0,0 @@
-/**
- * Linear blend deinterlacing plugin. The idea for this algorithm came
- * from the linear blend deinterlacer which originated in the mplayer
- * sources.
- *
- * Copyright (C) 2002 Billy Biggs <vektor@dumbterm.net>.
- * Copyright (C) 2008 Sebastian Dröge <slomo@collabora.co.uk>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "_stdint.h"
-#include "gstdeinterlace2.h"
-#include <string.h>
-
-#define GST_TYPE_DEINTERLACE_METHOD_LINEAR_BLEND (gst_deinterlace_method_linear_blend_get_type ())
-#define GST_IS_DEINTERLACE_METHOD_LINEAR_BLEND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_LINEAR_BLEND))
-#define GST_IS_DEINTERLACE_METHOD_LINEAR_BLEND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_LINEAR_BLEND))
-#define GST_DEINTERLACE_METHOD_LINEAR_BLEND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_LINEAR_BLEND, GstDeinterlaceMethodLinearBlendClass))
-#define GST_DEINTERLACE_METHOD_LINEAR_BLEND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_LINEAR_BLEND, GstDeinterlaceMethodLinearBlend))
-#define GST_DEINTERLACE_METHOD_LINEAR_BLEND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_LINEAR_BLEND, GstDeinterlaceMethodLinearBlendClass))
-#define GST_DEINTERLACE_METHOD_LINEAR_BLEND_CAST(obj) ((GstDeinterlaceMethodLinearBlend*)(obj))
-
-GType gst_deinterlace_method_linear_blend_get_type (void);
-
-typedef GstDeinterlaceSimpleMethod GstDeinterlaceMethodLinearBlend;
-
-typedef GstDeinterlaceSimpleMethodClass GstDeinterlaceMethodLinearBlendClass;
-
-
-static inline void
-deinterlace_scanline_linear_blend_c (GstDeinterlaceMethod * self,
- GstDeinterlace2 * parent, guint8 * out,
- GstDeinterlaceScanlineData * scanlines, gint width)
-{
- guint8 *t0 = scanlines->t0;
- guint8 *b0 = scanlines->b0;
- guint8 *m1 = scanlines->m1;
-
- width *= 2;
-
- while (width--) {
- *out++ = (*t0++ + *b0++ + (*m1++ << 1)) >> 2;
- }
-}
-
-static inline void
-deinterlace_scanline_linear_blend2_c (GstDeinterlaceMethod * self,
- GstDeinterlace2 * parent, guint8 * out,
- GstDeinterlaceScanlineData * scanlines, gint width)
-{
- guint8 *m0 = scanlines->m0;
- guint8 *t1 = scanlines->t1;
- guint8 *b1 = scanlines->b1;
-
- width *= 2;
- while (width--) {
- *out++ = (*t1++ + *b1++ + (*m0++ << 1)) >> 2;
- }
-}
-
-#ifdef BUILD_X86_ASM
-#include "mmx.h"
-static inline void
-deinterlace_scanline_linear_blend_mmx (GstDeinterlaceMethod * self,
- GstDeinterlace2 * parent, guint8 * out,
- GstDeinterlaceScanlineData * scanlines, gint width)
-{
- guint8 *t0 = scanlines->t0;
- guint8 *b0 = scanlines->b0;
- guint8 *m1 = scanlines->m1;
- gint i;
-
- // Get width in bytes.
- width *= 2;
- i = width / 8;
- width -= i * 8;
-
- pxor_r2r (mm7, mm7);
- while (i--) {
- movd_m2r (*t0, mm0);
- movd_m2r (*b0, mm1);
- movd_m2r (*m1, mm2);
-
- movd_m2r (*(t0 + 4), mm3);
- movd_m2r (*(b0 + 4), mm4);
- movd_m2r (*(m1 + 4), mm5);
-
- punpcklbw_r2r (mm7, mm0);
- punpcklbw_r2r (mm7, mm1);
- punpcklbw_r2r (mm7, mm2);
-
- punpcklbw_r2r (mm7, mm3);
- punpcklbw_r2r (mm7, mm4);
- punpcklbw_r2r (mm7, mm5);
-
- psllw_i2r (1, mm2);
- psllw_i2r (1, mm5);
- paddw_r2r (mm0, mm2);
- paddw_r2r (mm3, mm5);
- paddw_r2r (mm1, mm2);
- paddw_r2r (mm4, mm5);
- psrlw_i2r (2, mm2);
- psrlw_i2r (2, mm5);
- packuswb_r2r (mm2, mm2);
- packuswb_r2r (mm5, mm5);
-
- movd_r2m (mm2, *out);
- movd_r2m (mm5, *(out + 4));
- out += 8;
- t0 += 8;
- b0 += 8;
- m1 += 8;
- }
- while (width--) {
- *out++ = (*t0++ + *b0++ + (*m1++ << 1)) >> 2;
- }
- emms ();
-}
-
-static inline void
-deinterlace_scanline_linear_blend2_mmx (GstDeinterlaceMethod * self,
- GstDeinterlace2 * parent, guint8 * out,
- GstDeinterlaceScanlineData * scanlines, gint width)
-{
- guint8 *m0 = scanlines->m0;
- guint8 *t1 = scanlines->t1;
- guint8 *b1 = scanlines->b1;
- gint i;
-
- // Get width in bytes.
- width *= 2;
- i = width / 8;
- width -= i * 8;
-
- pxor_r2r (mm7, mm7);
- while (i--) {
- movd_m2r (*t1, mm0);
- movd_m2r (*b1, mm1);
- movd_m2r (*m0, mm2);
-
- movd_m2r (*(t1 + 4), mm3);
- movd_m2r (*(b1 + 4), mm4);
- movd_m2r (*(m0 + 4), mm5);
-
- punpcklbw_r2r (mm7, mm0);
- punpcklbw_r2r (mm7, mm1);
- punpcklbw_r2r (mm7, mm2);
-
- punpcklbw_r2r (mm7, mm3);
- punpcklbw_r2r (mm7, mm4);
- punpcklbw_r2r (mm7, mm5);
-
- psllw_i2r (1, mm2);
- psllw_i2r (1, mm5);
- paddw_r2r (mm0, mm2);
- paddw_r2r (mm3, mm5);
- paddw_r2r (mm1, mm2);
- paddw_r2r (mm4, mm5);
- psrlw_i2r (2, mm2);
- psrlw_i2r (2, mm5);
- packuswb_r2r (mm2, mm2);
- packuswb_r2r (mm5, mm5);
-
- movd_r2m (mm2, *out);
- movd_r2m (mm5, *(out + 4));
- out += 8;
- t1 += 8;
- b1 += 8;
- m0 += 8;
- }
- while (width--) {
- *out++ = (*t1++ + *b1++ + (*m0++ << 1)) >> 2;
- }
- emms ();
-}
-
-#endif
-
-G_DEFINE_TYPE (GstDeinterlaceMethodLinearBlend,
- gst_deinterlace_method_linear_blend, GST_TYPE_DEINTERLACE_SIMPLE_METHOD);
-
-static void
- gst_deinterlace_method_linear_blend_class_init
- (GstDeinterlaceMethodLinearBlendClass * klass)
-{
- GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass;
- GstDeinterlaceSimpleMethodClass *dism_class =
- (GstDeinterlaceSimpleMethodClass *) klass;
-#ifdef BUILD_X86_ASM
- guint cpu_flags = oil_cpu_get_flags ();
-#endif
-
- dim_class->fields_required = 2;
- dim_class->name = "Blur: Temporal";
- dim_class->nick = "linearblend";
- dim_class->latency = 0;
-
- dism_class->interpolate_scanline = deinterlace_scanline_linear_blend_c;
- dism_class->copy_scanline = deinterlace_scanline_linear_blend2_c;
-
-#ifdef BUILD_X86_ASM
- if (cpu_flags & OIL_IMPL_FLAG_MMX) {
- dism_class->interpolate_scanline = deinterlace_scanline_linear_blend_mmx;
- dism_class->copy_scanline = deinterlace_scanline_linear_blend2_mmx;
- }
-#endif
-}
-
-static void
-gst_deinterlace_method_linear_blend_init (GstDeinterlaceMethodLinearBlend *
- self)
-{
-}
diff --git a/gst/deinterlace2/tvtime/mmx.h b/gst/deinterlace2/tvtime/mmx.h
deleted file mode 100644
index 3627e61b..00000000
--- a/gst/deinterlace2/tvtime/mmx.h
+++ /dev/null
@@ -1,723 +0,0 @@
-/* mmx.h
-
- MultiMedia eXtensions GCC interface library for IA32.
-
- To use this library, simply include this header file
- and compile with GCC. You MUST have inlining enabled
- in order for mmx_ok() to work; this can be done by
- simply using -O on the GCC command line.
-
- Compiling with -DMMX_TRACE will cause detailed trace
- output to be sent to stderr for each mmx operation.
- This adds lots of code, and obviously slows execution to
- a crawl, but can be very useful for debugging.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY
- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
- LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR ANY PARTICULAR PURPOSE.
-
- 1997-98 by H. Dietz and R. Fisher
-
- History:
- 97-98* R.Fisher Early versions
- 980501 R.Fisher Original Release
- 980611* H.Dietz Rewrite, correctly implementing inlines, and
- R.Fisher including direct register accesses.
- 980616 R.Fisher Release of 980611 as 980616.
- 980714 R.Fisher Minor corrections to Makefile, etc.
- 980715 R.Fisher mmx_ok() now prevents optimizer from using
- clobbered values.
- mmx_ok() now checks if cpuid instruction is
- available before trying to use it.
- 980726* R.Fisher mm_support() searches for AMD 3DNow, Cyrix
- Extended MMX, and standard MMX. It returns a
- value which is positive if any of these are
- supported, and can be masked with constants to
- see which. mmx_ok() is now a call to this
- 980726* R.Fisher Added i2r support for shift functions
- 980919 R.Fisher Fixed AMD extended feature recognition bug.
- 980921 R.Fisher Added definition/check for _MMX_H.
- Added "float s[2]" to mmx_t for use with
- 3DNow and EMMX. So same mmx_t can be used.
- 981013 R.Fisher Fixed cpuid function 1 bug (looked at wrong reg)
- Fixed psllq_i2r error in mmxtest.c
-
- * Unreleased (internal or interim) versions
-
- Notes:
- It appears that the latest gas has the pand problem fixed, therefore
- I'll undefine BROKEN_PAND by default.
- String compares may be quicker than the multiple test/jumps in vendor
- test sequence in mmx_ok(), but I'm not concerned with that right now.
-
- Acknowledgments:
- Jussi Laako for pointing out the errors ultimately found to be
- connected to the failure to notify the optimizer of clobbered values.
- Roger Hardiman for reminding us that CPUID isn't everywhere, and that
- someone may actually try to use this on a machine without CPUID.
- Also for suggesting code for checking this.
- Robert Dale for pointing out the AMD recognition bug.
- Jimmy Mayfield and Carl Witty for pointing out the Intel recognition
- bug.
- Carl Witty for pointing out the psllq_i2r test bug.
-*/
-
-#ifndef _MMX_H
-#define _MMX_H
-
-/*#define MMX_TRACE */
-
-/* Warning: at this writing, the version of GAS packaged
- with most Linux distributions does not handle the
- parallel AND operation mnemonic correctly. If the
- symbol BROKEN_PAND is defined, a slower alternative
- coding will be used. If execution of mmxtest results
- in an illegal instruction fault, define this symbol.
-*/
-#undef BROKEN_PAND
-
-
-/* The type of an value that fits in an MMX register
- (note that long long constant values MUST be suffixed
- by LL and unsigned long long values by ULL, lest
- they be truncated by the compiler)
-*/
-typedef union {
- long long q; /* Quadword (64-bit) value */
- unsigned long long uq; /* Unsigned Quadword */
- int d[2]; /* 2 Doubleword (32-bit) values */
- unsigned int ud[2]; /* 2 Unsigned Doubleword */
- short w[4]; /* 4 Word (16-bit) values */
- unsigned short uw[4]; /* 4 Unsigned Word */
- char b[8]; /* 8 Byte (8-bit) values */
- unsigned char ub[8]; /* 8 Unsigned Byte */
- float s[2]; /* Single-precision (32-bit) value */
-} mmx_t;
-
-
-/* Function to test if multimedia instructions are supported...
-*/
-inline extern int
-mm_support(void)
-{
- /* Returns 1 if MMX instructions are supported,
- 3 if Cyrix MMX and Extended MMX instructions are supported
- 5 if AMD MMX and 3DNow! instructions are supported
- 0 if hardware does not support any of these
- */
- register int rval = 0;
-
- __asm__ __volatile__ (
- /* See if CPUID instruction is supported ... */
- /* ... Get copies of EFLAGS into eax and ecx */
- "pushf\n\t"
- "popl %%eax\n\t"
- "movl %%eax, %%ecx\n\t"
-
- /* ... Toggle the ID bit in one copy and store */
- /* to the EFLAGS reg */
- "xorl $0x200000, %%eax\n\t"
- "push %%eax\n\t"
- "popf\n\t"
-
- /* ... Get the (hopefully modified) EFLAGS */
- "pushf\n\t"
- "popl %%eax\n\t"
-
- /* ... Compare and test result */
- "xorl %%eax, %%ecx\n\t"
- "testl $0x200000, %%ecx\n\t"
- "jz NotSupported1\n\t" /* Nothing supported */
-
-
- /* Get standard CPUID information, and
- go to a specific vendor section */
- "movl $0, %%eax\n\t"
- "cpuid\n\t"
-
- /* Check for Intel */
- "cmpl $0x756e6547, %%ebx\n\t"
- "jne TryAMD\n\t"
- "cmpl $0x49656e69, %%edx\n\t"
- "jne TryAMD\n\t"
- "cmpl $0x6c65746e, %%ecx\n"
- "jne TryAMD\n\t"
- "jmp Intel\n\t"
-
- /* Check for AMD */
- "\nTryAMD:\n\t"
- "cmpl $0x68747541, %%ebx\n\t"
- "jne TryCyrix\n\t"
- "cmpl $0x69746e65, %%edx\n\t"
- "jne TryCyrix\n\t"
- "cmpl $0x444d4163, %%ecx\n"
- "jne TryCyrix\n\t"
- "jmp AMD\n\t"
-
- /* Check for Cyrix */
- "\nTryCyrix:\n\t"
- "cmpl $0x69727943, %%ebx\n\t"
- "jne NotSupported2\n\t"
- "cmpl $0x736e4978, %%edx\n\t"
- "jne NotSupported3\n\t"
- "cmpl $0x64616574, %%ecx\n\t"
- "jne NotSupported4\n\t"
- /* Drop through to Cyrix... */
-
-
- /* Cyrix Section */
- /* See if extended CPUID is supported */
- "movl $0x80000000, %%eax\n\t"
- "cpuid\n\t"
- "cmpl $0x80000000, %%eax\n\t"
- "jl MMXtest\n\t" /* Try standard CPUID instead */
-
- /* Extended CPUID supported, so get extended features */
- "movl $0x80000001, %%eax\n\t"
- "cpuid\n\t"
- "testl $0x00800000, %%eax\n\t" /* Test for MMX */
- "jz NotSupported5\n\t" /* MMX not supported */
- "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */
- "jnz EMMXSupported\n\t"
- "movl $1, %0:\n\n\t" /* MMX Supported */
- "jmp Return\n\n"
- "EMMXSupported:\n\t"
- "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */
- "jmp Return\n\t"
-
-
- /* AMD Section */
- "AMD:\n\t"
-
- /* See if extended CPUID is supported */
- "movl $0x80000000, %%eax\n\t"
- "cpuid\n\t"
- "cmpl $0x80000000, %%eax\n\t"
- "jl MMXtest\n\t" /* Try standard CPUID instead */
-
- /* Extended CPUID supported, so get extended features */
- "movl $0x80000001, %%eax\n\t"
- "cpuid\n\t"
- "testl $0x00800000, %%edx\n\t" /* Test for MMX */
- "jz NotSupported6\n\t" /* MMX not supported */
- "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */
- "jnz ThreeDNowSupported\n\t"
- "movl $1, %0:\n\n\t" /* MMX Supported */
- "jmp Return\n\n"
- "ThreeDNowSupported:\n\t"
- "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */
- "jmp Return\n\t"
-
-
- /* Intel Section */
- "Intel:\n\t"
-
- /* Check for MMX */
- "MMXtest:\n\t"
- "movl $1, %%eax\n\t"
- "cpuid\n\t"
- "testl $0x00800000, %%edx\n\t" /* Test for MMX */
- "jz NotSupported7\n\t" /* MMX Not supported */
- "movl $1, %0:\n\n\t" /* MMX Supported */
- "jmp Return\n\t"
-
- /* Nothing supported */
- "\nNotSupported1:\n\t"
- "#movl $101, %0:\n\n\t"
- "\nNotSupported2:\n\t"
- "#movl $102, %0:\n\n\t"
- "\nNotSupported3:\n\t"
- "#movl $103, %0:\n\n\t"
- "\nNotSupported4:\n\t"
- "#movl $104, %0:\n\n\t"
- "\nNotSupported5:\n\t"
- "#movl $105, %0:\n\n\t"
- "\nNotSupported6:\n\t"
- "#movl $106, %0:\n\n\t"
- "\nNotSupported7:\n\t"
- "#movl $107, %0:\n\n\t"
- "movl $0, %0:\n\n\t"
-
- "Return:\n\t"
- : "=a" (rval)
- : /* no input */
- : "eax", "ebx", "ecx", "edx"
- );
-
- /* Return */
- return(rval);
-}
-
-/* Function to test if mmx instructions are supported...
-*/
-inline extern int
-mmx_ok(void)
-{
- /* Returns 1 if MMX instructions are supported, 0 otherwise */
- return ( mm_support() & 0x1 );
-}
-
-
-/* Helper functions for the instruction macros that follow...
- (note that memory-to-register, m2r, instructions are nearly
- as efficient as register-to-register, r2r, instructions;
- however, memory-to-memory instructions are really simulated
- as a convenience, and are only 1/3 as efficient)
-*/
-#ifdef MMX_TRACE
-
-/* Include the stuff for printing a trace to stderr...
-*/
-
-#include <stdio.h>
-
-#define mmx_i2r(op, imm, reg) \
- { \
- mmx_t mmx_trace; \
- mmx_trace = (imm); \
- fprintf(stderr, #op "_i2r(" #imm "=0x%016llx, ", mmx_trace.q); \
- __asm__ __volatile__ ("movq %%" #reg ", %0" \
- : "=X" (mmx_trace) \
- : /* nothing */ ); \
- fprintf(stderr, #reg "=0x%016llx) => ", mmx_trace.q); \
- __asm__ __volatile__ (#op " %0, %%" #reg \
- : /* nothing */ \
- : "X" (imm)); \
- __asm__ __volatile__ ("movq %%" #reg ", %0" \
- : "=X" (mmx_trace) \
- : /* nothing */ ); \
- fprintf(stderr, #reg "=0x%016llx\n", mmx_trace.q); \
- }
-
-#define mmx_m2r(op, mem, reg) \
- { \
- mmx_t mmx_trace; \
- mmx_trace = (mem); \
- fprintf(stderr, #op "_m2r(" #mem "=0x%016llx, ", mmx_trace.q); \
- __asm__ __volatile__ ("movq %%" #reg ", %0" \
- : "=X" (mmx_trace) \
- : /* nothing */ ); \
- fprintf(stderr, #reg "=0x%016llx) => ", mmx_trace.q); \
- __asm__ __volatile__ (#op " %0, %%" #reg \
- : /* nothing */ \
- : "X" (mem)); \
- __asm__ __volatile__ ("movq %%" #reg ", %0" \
- : "=X" (mmx_trace) \
- : /* nothing */ ); \
- fprintf(stderr, #reg "=0x%016llx\n", mmx_trace.q); \
- }
-
-#define mmx_r2m(op, reg, mem) \
- { \
- mmx_t mmx_trace; \
- __asm__ __volatile__ ("movq %%" #reg ", %0" \
- : "=X" (mmx_trace) \
- : /* nothing */ ); \
- fprintf(stderr, #op "_r2m(" #reg "=0x%016llx, ", mmx_trace.q); \
- mmx_trace = (mem); \
- fprintf(stderr, #mem "=0x%016llx) => ", mmx_trace.q); \
- __asm__ __volatile__ (#op " %%" #reg ", %0" \
- : "=X" (mem) \
- : /* nothing */ ); \
- mmx_trace = (mem); \
- fprintf(stderr, #mem "=0x%016llx\n", mmx_trace.q); \
- }
-
-#define mmx_r2r(op, regs, regd) \
- { \
- mmx_t mmx_trace; \
- __asm__ __volatile__ ("movq %%" #regs ", %0" \
- : "=X" (mmx_trace) \
- : /* nothing */ ); \
- fprintf(stderr, #op "_r2r(" #regs "=0x%016llx, ", mmx_trace.q); \
- __asm__ __volatile__ ("movq %%" #regd ", %0" \
- : "=X" (mmx_trace) \
- : /* nothing */ ); \
- fprintf(stderr, #regd "=0x%016llx) => ", mmx_trace.q); \
- __asm__ __volatile__ (#op " %" #regs ", %" #regd); \
- __asm__ __volatile__ ("movq %%" #regd ", %0" \
- : "=X" (mmx_trace) \
- : /* nothing */ ); \
- fprintf(stderr, #regd "=0x%016llx\n", mmx_trace.q); \
- }
-
-#define mmx_m2m(op, mems, memd) \
- { \
- mmx_t mmx_trace; \
- mmx_trace = (mems); \
- fprintf(stderr, #op "_m2m(" #mems "=0x%016llx, ", mmx_trace.q); \
- mmx_trace = (memd); \
- fprintf(stderr, #memd "=0x%016llx) => ", mmx_trace.q); \
- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \
- #op " %1, %%mm0\n\t" \
- "movq %%mm0, %0" \
- : "=X" (memd) \
- : "X" (mems)); \
- mmx_trace = (memd); \
- fprintf(stderr, #memd "=0x%016llx\n", mmx_trace.q); \
- }
-
-#else
-
-/* These macros are a lot simpler without the tracing...
-*/
-
-#define mmx_i2r(op, imm, reg) \
- __asm__ __volatile__ (#op " $" #imm ", %%" #reg \
- : /* nothing */ \
- : /* nothing */);
-
-#define mmx_m2r(op, mem, reg) \
- __asm__ __volatile__ (#op " %0, %%" #reg \
- : /* nothing */ \
- : "m" (mem))
-
-#define mmx_r2m(op, reg, mem) \
- __asm__ __volatile__ (#op " %%" #reg ", %0" \
- : "=m" (mem) \
- : /* nothing */ )
-
-#define mmx_r2r(op, regs, regd) \
- __asm__ __volatile__ (#op " %" #regs ", %" #regd)
-
-#define mmx_m2m(op, mems, memd) \
- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \
- #op " %1, %%mm0\n\t" \
- "movq %%mm0, %0" \
- : "=m" (memd) \
- : "m" (mems))
-
-#endif
-
-
-/* 1x64 MOVe Quadword
- (this is both a load and a store...
- in fact, it is the only way to store)
-*/
-#define movq_m2r(var, reg) mmx_m2r(movq, var, reg)
-#define movq_r2m(reg, var) mmx_r2m(movq, reg, var)
-#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd)
-#define movq(vars, vard) \
- __asm__ __volatile__ ("movq %1, %%mm0\n\t" \
- "movq %%mm0, %0" \
- : "=X" (vard) \
- : "X" (vars))
-
-
-/* 1x32 MOVe Doubleword
- (like movq, this is both load and store...
- but is most useful for moving things between
- mmx registers and ordinary registers)
-*/
-#define movd_m2r(var, reg) mmx_m2r(movd, var, reg)
-#define movd_r2m(reg, var) mmx_r2m(movd, reg, var)
-#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd)
-#define movd(vars, vard) \
- __asm__ __volatile__ ("movd %1, %%mm0\n\t" \
- "movd %%mm0, %0" \
- : "=X" (vard) \
- : "X" (vars))
-
-
-/* 2x32, 4x16, and 8x8 Parallel ADDs
-*/
-#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg)
-#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd)
-#define paddd(vars, vard) mmx_m2m(paddd, vars, vard)
-
-#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg)
-#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd)
-#define paddw(vars, vard) mmx_m2m(paddw, vars, vard)
-
-#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg)
-#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd)
-#define paddb(vars, vard) mmx_m2m(paddb, vars, vard)
-
-
-/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic
-*/
-#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg)
-#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd)
-#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard)
-
-#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg)
-#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd)
-#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard)
-
-
-/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic
-*/
-#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg)
-#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd)
-#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard)
-
-#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg)
-#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd)
-#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard)
-
-
-/* 2x32, 4x16, and 8x8 Parallel SUBs
-*/
-#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg)
-#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd)
-#define psubd(vars, vard) mmx_m2m(psubd, vars, vard)
-
-#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg)
-#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd)
-#define psubw(vars, vard) mmx_m2m(psubw, vars, vard)
-
-#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg)
-#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd)
-#define psubb(vars, vard) mmx_m2m(psubb, vars, vard)
-
-
-/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic
-*/
-#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg)
-#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd)
-#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard)
-
-#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg)
-#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd)
-#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard)
-
-
-/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic
-*/
-#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg)
-#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd)
-#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard)
-
-#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg)
-#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd)
-#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard)
-
-
-/* 4x16 Parallel MULs giving Low 4x16 portions of results
-*/
-#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg)
-#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd)
-#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard)
-
-
-/* 4x16 Parallel MULs giving High 4x16 portions of results
-*/
-#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg)
-#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd)
-#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard)
-
-
-/* 4x16->2x32 Parallel Mul-ADD
- (muls like pmullw, then adds adjacent 16-bit fields
- in the multiply result to make the final 2x32 result)
-*/
-#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg)
-#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd)
-#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard)
-
-
-/* 1x64 bitwise AND
-*/
-#ifdef BROKEN_PAND
-#define pand_m2r(var, reg) \
- { \
- mmx_m2r(pandn, (mmx_t) -1LL, reg); \
- mmx_m2r(pandn, var, reg); \
- }
-#define pand_r2r(regs, regd) \
- { \
- mmx_m2r(pandn, (mmx_t) -1LL, regd); \
- mmx_r2r(pandn, regs, regd); \
- }
-#define pand(vars, vard) \
- { \
- movq_m2r(vard, mm0); \
- mmx_m2r(pandn, (mmx_t) -1LL, mm0); \
- mmx_m2r(pandn, vars, mm0); \
- movq_r2m(mm0, vard); \
- }
-#else
-#define pand_m2r(var, reg) mmx_m2r(pand, var, reg)
-#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd)
-#define pand(vars, vard) mmx_m2m(pand, vars, vard)
-#endif
-
-
-/* 1x64 bitwise AND with Not the destination
-*/
-#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg)
-#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd)
-#define pandn(vars, vard) mmx_m2m(pandn, vars, vard)
-
-
-/* 1x64 bitwise OR
-*/
-#define por_m2r(var, reg) mmx_m2r(por, var, reg)
-#define por_r2r(regs, regd) mmx_r2r(por, regs, regd)
-#define por(vars, vard) mmx_m2m(por, vars, vard)
-
-
-/* 1x64 bitwise eXclusive OR
-*/
-#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg)
-#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd)
-#define pxor(vars, vard) mmx_m2m(pxor, vars, vard)
-
-
-/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality
- (resulting fields are either 0 or -1)
-*/
-#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg)
-#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd)
-#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard)
-
-#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg)
-#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd)
-#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard)
-
-#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg)
-#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd)
-#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard)
-
-
-/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than
- (resulting fields are either 0 or -1)
-*/
-#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg)
-#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd)
-#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard)
-
-#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg)
-#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd)
-#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard)
-
-#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg)
-#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd)
-#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard)
-
-
-/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical
-*/
-#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg)
-#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg)
-#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd)
-#define psllq(vars, vard) mmx_m2m(psllq, vars, vard)
-
-#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg)
-#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg)
-#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd)
-#define pslld(vars, vard) mmx_m2m(pslld, vars, vard)
-
-#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg)
-#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg)
-#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd)
-#define psllw(vars, vard) mmx_m2m(psllw, vars, vard)
-
-
-/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical
-*/
-#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg)
-#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg)
-#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd)
-#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard)
-
-#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg)
-#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg)
-#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd)
-#define psrld(vars, vard) mmx_m2m(psrld, vars, vard)
-
-#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg)
-#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg)
-#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd)
-#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard)
-
-
-/* 2x32 and 4x16 Parallel Shift Right Arithmetic
-*/
-#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg)
-#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg)
-#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd)
-#define psrad(vars, vard) mmx_m2m(psrad, vars, vard)
-
-#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg)
-#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg)
-#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd)
-#define psraw(vars, vard) mmx_m2m(psraw, vars, vard)
-
-
-/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate
- (packs source and dest fields into dest in that order)
-*/
-#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg)
-#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd)
-#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard)
-
-#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg)
-#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd)
-#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard)
-
-
-/* 4x16->8x8 PACK and Unsigned Saturate
- (packs source and dest fields into dest in that order)
-*/
-#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg)
-#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd)
-#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard)
-
-
-/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low
- (interleaves low half of dest with low half of source
- as padding in each result field)
-*/
-#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg)
-#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd)
-#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard)
-
-#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg)
-#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd)
-#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard)
-
-#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg)
-#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd)
-#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard)
-
-
-/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High
- (interleaves high half of dest with high half of source
- as padding in each result field)
-*/
-#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg)
-#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd)
-#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard)
-
-#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg)
-#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd)
-#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard)
-
-#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg)
-#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd)
-#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard)
-
-
-/* Empty MMx State
- (used to clean-up when going from mmx to float use
- of the registers that are shared by both; note that
- there is no float-to-mmx operation needed, because
- only the float tag word info is corruptible)
-*/
-#ifdef MMX_TRACE
-
-#define emms() \
- { \
- fprintf(stderr, "emms()\n"); \
- __asm__ __volatile__ ("emms"); \
- }
-
-#else
-
-#define emms() __asm__ __volatile__ ("emms")
-
-#endif
-
-#endif
diff --git a/gst/deinterlace2/tvtime/plugins.h b/gst/deinterlace2/tvtime/plugins.h
deleted file mode 100644
index 8fb01af5..00000000
--- a/gst/deinterlace2/tvtime/plugins.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *
- * GStreamer
- * Copyright (C) 2004 Billy Biggs <vektor@dumbterm.net>
- * Copyright (C) 2008 Sebastian Dröge <slomo@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.
- */
-
-/*
- * Relicensed for GStreamer from GPL to LGPL with permit from Billy Biggs.
- * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578
- */
-
-#ifndef TVTIME_PLUGINS_H_INCLUDED
-#define TVTIME_PLUGINS_H_INCLUDED
-
-#define GST_TYPE_DEINTERLACE_TOMSMOCOMP (gst_deinterlace_method_tomsmocomp_get_type ())
-#define GST_TYPE_DEINTERLACE_GREEDY_H (gst_deinterlace_method_greedy_h_get_type ())
-#define GST_TYPE_DEINTERLACE_GREEDY_L (gst_deinterlace_method_greedy_l_get_type ())
-#define GST_TYPE_DEINTERLACE_VFIR (gst_deinterlace_method_vfir_get_type ())
-#define GST_TYPE_DEINTERLACE_LINEAR (gst_deinterlace_method_linear_get_type ())
-#define GST_TYPE_DEINTERLACE_LINEAR_BLEND (gst_deinterlace_method_linear_blend_get_type ())
-#define GST_TYPE_DEINTERLACE_SCALER_BOB (gst_deinterlace_method_scaler_bob_get_type ())
-#define GST_TYPE_DEINTERLACE_WEAVE (gst_deinterlace_method_weave_get_type ())
-#define GST_TYPE_DEINTERLACE_WEAVE_TFF (gst_deinterlace_method_weave_tff_get_type ())
-#define GST_TYPE_DEINTERLACE_WEAVE_BFF (gst_deinterlace_method_weave_bff_get_type ())
-
-GType gst_deinterlace_method_tomsmocomp_get_type (void);
-GType gst_deinterlace_method_greedy_h_get_type (void);
-GType gst_deinterlace_method_greedy_l_get_type (void);
-GType gst_deinterlace_method_vfir_get_type (void);
-
-GType gst_deinterlace_method_linear_get_type (void);
-GType gst_deinterlace_method_linear_blend_get_type (void);
-GType gst_deinterlace_method_scaler_bob_get_type (void);
-GType gst_deinterlace_method_weave_get_type (void);
-GType gst_deinterlace_method_weave_tff_get_type (void);
-GType gst_deinterlace_method_weave_bff_get_type (void);
-
-#endif /* TVTIME_PLUGINS_H_INCLUDED */
diff --git a/gst/deinterlace2/tvtime/scalerbob.c b/gst/deinterlace2/tvtime/scalerbob.c
deleted file mode 100644
index a37792ab..00000000
--- a/gst/deinterlace2/tvtime/scalerbob.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Double lines
- * Copyright (C) 2008 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 Lesser 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "_stdint.h"
-#include "gstdeinterlace2.h"
-#include <string.h>
-
-#define GST_TYPE_DEINTERLACE_METHOD_SCALER_BOB (gst_deinterlace_method_scaler_bob_get_type ())
-#define GST_IS_DEINTERLACE_METHOD_SCALER_BOB(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_SCALER_BOB))
-#define GST_IS_DEINTERLACE_METHOD_SCALER_BOB_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_SCALER_BOB))
-#define GST_DEINTERLACE_METHOD_SCALER_BOB_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_SCALER_BOB, GstDeinterlaceMethodScalerBobClass))
-#define GST_DEINTERLACE_METHOD_SCALER_BOB(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_SCALER_BOB, GstDeinterlaceMethodScalerBob))
-#define GST_DEINTERLACE_METHOD_SCALER_BOB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_SCALER_BOB, GstDeinterlaceMethodScalerBobClass))
-#define GST_DEINTERLACE_METHOD_SCALER_BOB_CAST(obj) ((GstDeinterlaceMethodScalerBob*)(obj))
-
-GType gst_deinterlace_method_scaler_bob_get_type (void);
-
-typedef GstDeinterlaceSimpleMethod GstDeinterlaceMethodScalerBob;
-
-typedef GstDeinterlaceSimpleMethodClass GstDeinterlaceMethodScalerBobClass;
-
-
-static void
-deinterlace_scanline_scaler_bob (GstDeinterlaceMethod * self,
- GstDeinterlace2 * parent, guint8 * out,
- GstDeinterlaceScanlineData * scanlines, gint width)
-{
- oil_memcpy (out, scanlines->t0, parent->row_stride);
-}
-
-G_DEFINE_TYPE (GstDeinterlaceMethodScalerBob, gst_deinterlace_method_scaler_bob,
- GST_TYPE_DEINTERLACE_SIMPLE_METHOD);
-
-static void
-gst_deinterlace_method_scaler_bob_class_init (GstDeinterlaceMethodScalerBobClass
- * klass)
-{
- GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass;
- GstDeinterlaceSimpleMethodClass *dism_class =
- (GstDeinterlaceSimpleMethodClass *) klass;
-
- dim_class->fields_required = 1;
- dim_class->name = "Double lines";
- dim_class->nick = "scalerbob";
- dim_class->latency = 0;
-
- dism_class->interpolate_scanline = deinterlace_scanline_scaler_bob;
-}
-
-static void
-gst_deinterlace_method_scaler_bob_init (GstDeinterlaceMethodScalerBob * self)
-{
-}
diff --git a/gst/deinterlace2/tvtime/sse.h b/gst/deinterlace2/tvtime/sse.h
deleted file mode 100644
index 2e00ee0c..00000000
--- a/gst/deinterlace2/tvtime/sse.h
+++ /dev/null
@@ -1,992 +0,0 @@
-/* sse.h
-
- Streaming SIMD Extenstions (a.k.a. Katmai New Instructions)
- GCC interface library for IA32.
-
- To use this library, simply include this header file
- and compile with GCC. You MUST have inlining enabled
- in order for sse_ok() to work; this can be done by
- simply using -O on the GCC command line.
-
- Compiling with -DSSE_TRACE will cause detailed trace
- output to be sent to stderr for each sse operation.
- This adds lots of code, and obviously slows execution to
- a crawl, but can be very useful for debugging.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY
- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
- LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR ANY PARTICULAR PURPOSE.
-
- 1999 by R. Fisher
- Based on libmmx by H. Dietz and R. Fisher
-
- Notes:
- This is still extremely alpha.
- Because this library depends on an assembler which understands the
- SSE opcodes, you probably won't be able to use this yet.
- For now, do not use TRACE versions. These both make use
- of the MMX registers, not the SSE registers. This will be resolved
- at a later date.
- ToDo:
- Rewrite TRACE macros
- Major Debugging Work
-*/
-
-#ifndef _SSE_H
-#define _SSE_H
-
-
-
-/* The type of an value that fits in an SSE register
- (note that long long constant values MUST be suffixed
- by LL and unsigned long long values by ULL, lest
- they be truncated by the compiler)
-*/
-typedef union {
- float sf[4]; /* Single-precision (32-bit) value */
-} __attribute__ ((aligned (16))) sse_t; /* On a 16 byte (128-bit) boundary */
-
-
-#if 0
-/* Function to test if multimedia instructions are supported...
-*/
-inline extern int
-mm_support(void)
-{
- /* Returns 1 if MMX instructions are supported,
- 3 if Cyrix MMX and Extended MMX instructions are supported
- 5 if AMD MMX and 3DNow! instructions are supported
- 9 if MMX and SSE instructions are supported
- 0 if hardware does not support any of these
- */
- register int rval = 0;
-
- __asm__ __volatile__ (
- /* See if CPUID instruction is supported ... */
- /* ... Get copies of EFLAGS into eax and ecx */
- "pushf\n\t"
- "popl %%eax\n\t"
- "movl %%eax, %%ecx\n\t"
-
- /* ... Toggle the ID bit in one copy and store */
- /* to the EFLAGS reg */
- "xorl $0x200000, %%eax\n\t"
- "push %%eax\n\t"
- "popf\n\t"
-
- /* ... Get the (hopefully modified) EFLAGS */
- "pushf\n\t"
- "popl %%eax\n\t"
-
- /* ... Compare and test result */
- "xorl %%eax, %%ecx\n\t"
- "testl $0x200000, %%ecx\n\t"
- "jz NotSupported1\n\t" /* CPUID not supported */
-
-
- /* Get standard CPUID information, and
- go to a specific vendor section */
- "movl $0, %%eax\n\t"
- "cpuid\n\t"
-
- /* Check for Intel */
- "cmpl $0x756e6547, %%ebx\n\t"
- "jne TryAMD\n\t"
- "cmpl $0x49656e69, %%edx\n\t"
- "jne TryAMD\n\t"
- "cmpl $0x6c65746e, %%ecx\n"
- "jne TryAMD\n\t"
- "jmp Intel\n\t"
-
- /* Check for AMD */
- "\nTryAMD:\n\t"
- "cmpl $0x68747541, %%ebx\n\t"
- "jne TryCyrix\n\t"
- "cmpl $0x69746e65, %%edx\n\t"
- "jne TryCyrix\n\t"
- "cmpl $0x444d4163, %%ecx\n"
- "jne TryCyrix\n\t"
- "jmp AMD\n\t"
-
- /* Check for Cyrix */
- "\nTryCyrix:\n\t"
- "cmpl $0x69727943, %%ebx\n\t"
- "jne NotSupported2\n\t"
- "cmpl $0x736e4978, %%edx\n\t"
- "jne NotSupported3\n\t"
- "cmpl $0x64616574, %%ecx\n\t"
- "jne NotSupported4\n\t"
- /* Drop through to Cyrix... */
-
-
- /* Cyrix Section */
- /* See if extended CPUID level 80000001 is supported */
- /* The value of CPUID/80000001 for the 6x86MX is undefined
- according to the Cyrix CPU Detection Guide (Preliminary
- Rev. 1.01 table 1), so we'll check the value of eax for
- CPUID/0 to see if standard CPUID level 2 is supported.
- According to the table, the only CPU which supports level
- 2 is also the only one which supports extended CPUID levels.
- */
- "cmpl $0x2, %%eax\n\t"
- "jne MMXtest\n\t" /* Use standard CPUID instead */
-
- /* Extended CPUID supported (in theory), so get extended
- features */
- "movl $0x80000001, %%eax\n\t"
- "cpuid\n\t"
- "testl $0x00800000, %%eax\n\t" /* Test for MMX */
- "jz NotSupported5\n\t" /* MMX not supported */
- "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */
- "jnz EMMXSupported\n\t"
- "movl $1, %0:\n\n\t" /* MMX Supported */
- "jmp Return\n\n"
- "EMMXSupported:\n\t"
- "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */
- "jmp Return\n\t"
-
-
- /* AMD Section */
- "AMD:\n\t"
-
- /* See if extended CPUID is supported */
- "movl $0x80000000, %%eax\n\t"
- "cpuid\n\t"
- "cmpl $0x80000000, %%eax\n\t"
- "jl MMXtest\n\t" /* Use standard CPUID instead */
-
- /* Extended CPUID supported, so get extended features */
- "movl $0x80000001, %%eax\n\t"
- "cpuid\n\t"
- "testl $0x00800000, %%edx\n\t" /* Test for MMX */
- "jz NotSupported6\n\t" /* MMX not supported */
- "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */
- "jnz ThreeDNowSupported\n\t"
- "movl $1, %0:\n\n\t" /* MMX Supported */
- "jmp Return\n\n"
- "ThreeDNowSupported:\n\t"
- "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */
- "jmp Return\n\t"
-
-
- /* Intel Section */
- "Intel:\n\t"
-
- /* Check for SSE */
- "SSEtest:\n\t"
- "movl $1, %%eax\n\t"
- "cpuid\n\t"
- "testl $0x02000000, %%edx\n\t" /* Test for SSE */
- "jz MMXtest\n\t" /* SSE Not supported */
- "movl $9, %0:\n\n\t" /* SSE Supported */
- "jmp Return\n\t"
-
- /* Check for MMX */
- "MMXtest:\n\t"
- "movl $1, %%eax\n\t"
- "cpuid\n\t"
- "testl $0x00800000, %%edx\n\t" /* Test for MMX */
- "jz NotSupported7\n\t" /* MMX Not supported */
- "movl $1, %0:\n\n\t" /* MMX Supported */
- "jmp Return\n\t"
-
- /* Nothing supported */
- "\nNotSupported1:\n\t"
- "#movl $101, %0:\n\n\t"
- "\nNotSupported2:\n\t"
- "#movl $102, %0:\n\n\t"
- "\nNotSupported3:\n\t"
- "#movl $103, %0:\n\n\t"
- "\nNotSupported4:\n\t"
- "#movl $104, %0:\n\n\t"
- "\nNotSupported5:\n\t"
- "#movl $105, %0:\n\n\t"
- "\nNotSupported6:\n\t"
- "#movl $106, %0:\n\n\t"
- "\nNotSupported7:\n\t"
- "#movl $107, %0:\n\n\t"
- "movl $0, %0:\n\n\t"
-
- "Return:\n\t"
- : "=a" (rval)
- : /* no input */
- : "eax", "ebx", "ecx", "edx"
- );
-
- /* Return */
- return(rval);
-}
-
-/* Function to test if sse instructions are supported...
-*/
-inline extern int
-sse_ok(void)
-{
- /* Returns 1 if SSE instructions are supported, 0 otherwise */
- return ( (mm_support() & 0x8) >> 3 );
-}
-#endif
-
-
-
-/* Helper functions for the instruction macros that follow...
- (note that memory-to-register, m2r, instructions are nearly
- as efficient as register-to-register, r2r, instructions;
- however, memory-to-memory instructions are really simulated
- as a convenience, and are only 1/3 as efficient)
-*/
-#ifdef SSE_TRACE
-
-/* Include the stuff for printing a trace to stderr...
-*/
-
-#include <stdio.h>
-
-#define sse_i2r(op, imm, reg) \
- { \
- sse_t sse_trace; \
- sse_trace.uq = (imm); \
- fprintf(stderr, #op "_i2r(" #imm "=0x%08x%08x, ", \
- sse_trace.d[1], sse_trace.d[0]); \
- __asm__ __volatile__ ("movq %%" #reg ", %0" \
- : "=X" (sse_trace) \
- : /* nothing */ ); \
- fprintf(stderr, #reg "=0x%08x%08x) => ", \
- sse_trace.d[1], sse_trace.d[0]); \
- __asm__ __volatile__ (#op " %0, %%" #reg \
- : /* nothing */ \
- : "X" (imm)); \
- __asm__ __volatile__ ("movq %%" #reg ", %0" \
- : "=X" (sse_trace) \
- : /* nothing */ ); \
- fprintf(stderr, #reg "=0x%08x%08x\n", \
- sse_trace.d[1], sse_trace.d[0]); \
- }
-
-#define sse_m2r(op, mem, reg) \
- { \
- sse_t sse_trace; \
- sse_trace = (mem); \
- fprintf(stderr, #op "_m2r(" #mem "=0x%08x%08x, ", \
- sse_trace.d[1], sse_trace.d[0]); \
- __asm__ __volatile__ ("movq %%" #reg ", %0" \
- : "=X" (sse_trace) \
- : /* nothing */ ); \
- fprintf(stderr, #reg "=0x%08x%08x) => ", \
- sse_trace.d[1], sse_trace.d[0]); \
- __asm__ __volatile__ (#op " %0, %%" #reg \
- : /* nothing */ \
- : "X" (mem)); \
- __asm__ __volatile__ ("movq %%" #reg ", %0" \
- : "=X" (sse_trace) \
- : /* nothing */ ); \
- fprintf(stderr, #reg "=0x%08x%08x\n", \
- sse_trace.d[1], sse_trace.d[0]); \
- }
-
-#define sse_r2m(op, reg, mem) \
- { \
- sse_t sse_trace; \
- __asm__ __volatile__ ("movq %%" #reg ", %0" \
- : "=X" (sse_trace) \
- : /* nothing */ ); \
- fprintf(stderr, #op "_r2m(" #reg "=0x%08x%08x, ", \
- sse_trace.d[1], sse_trace.d[0]); \
- sse_trace = (mem); \
- fprintf(stderr, #mem "=0x%08x%08x) => ", \
- sse_trace.d[1], sse_trace.d[0]); \
- __asm__ __volatile__ (#op " %%" #reg ", %0" \
- : "=X" (mem) \
- : /* nothing */ ); \
- sse_trace = (mem); \
- fprintf(stderr, #mem "=0x%08x%08x\n", \
- sse_trace.d[1], sse_trace.d[0]); \
- }
-
-#define sse_r2r(op, regs, regd) \
- { \
- sse_t sse_trace; \
- __asm__ __volatile__ ("movq %%" #regs ", %0" \
- : "=X" (sse_trace) \
- : /* nothing */ ); \
- fprintf(stderr, #op "_r2r(" #regs "=0x%08x%08x, ", \
- sse_trace.d[1], sse_trace.d[0]); \
- __asm__ __volatile__ ("movq %%" #regd ", %0" \
- : "=X" (sse_trace) \
- : /* nothing */ ); \
- fprintf(stderr, #regd "=0x%08x%08x) => ", \
- sse_trace.d[1], sse_trace.d[0]); \
- __asm__ __volatile__ (#op " %" #regs ", %" #regd); \
- __asm__ __volatile__ ("movq %%" #regd ", %0" \
- : "=X" (sse_trace) \
- : /* nothing */ ); \
- fprintf(stderr, #regd "=0x%08x%08x\n", \
- sse_trace.d[1], sse_trace.d[0]); \
- }
-
-#define sse_m2m(op, mems, memd) \
- { \
- sse_t sse_trace; \
- sse_trace = (mems); \
- fprintf(stderr, #op "_m2m(" #mems "=0x%08x%08x, ", \
- sse_trace.d[1], sse_trace.d[0]); \
- sse_trace = (memd); \
- fprintf(stderr, #memd "=0x%08x%08x) => ", \
- sse_trace.d[1], sse_trace.d[0]); \
- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \
- #op " %1, %%mm0\n\t" \
- "movq %%mm0, %0" \
- : "=X" (memd) \
- : "X" (mems)); \
- sse_trace = (memd); \
- fprintf(stderr, #memd "=0x%08x%08x\n", \
- sse_trace.d[1], sse_trace.d[0]); \
- }
-
-#else
-
-/* These macros are a lot simpler without the tracing...
-*/
-
-#define sse_i2r(op, imm, reg) \
- __asm__ __volatile__ (#op " %0, %%" #reg \
- : /* nothing */ \
- : "X" (imm) )
-
-#define sse_m2r(op, mem, reg) \
- __asm__ __volatile__ (#op " %0, %%" #reg \
- : /* nothing */ \
- : "X" (mem))
-
-#define sse_r2m(op, reg, mem) \
- __asm__ __volatile__ (#op " %%" #reg ", %0" \
- : "=X" (mem) \
- : /* nothing */ )
-
-#define sse_r2r(op, regs, regd) \
- __asm__ __volatile__ (#op " %" #regs ", %" #regd)
-
-#define sse_r2ri(op, regs, regd, imm) \
- __asm__ __volatile__ (#op " %0, %%" #regs ", %%" #regd \
- : /* nothing */ \
- : "X" (imm) )
-
-/* Load data from mems to xmmreg, operate on xmmreg, and store data to memd */
-#define sse_m2m(op, mems, memd, xmmreg) \
- __asm__ __volatile__ ("movups %0, %%xmm0\n\t" \
- #op " %1, %%xmm0\n\t" \
- "movups %%mm0, %0" \
- : "=X" (memd) \
- : "X" (mems))
-
-#define sse_m2ri(op, mem, reg, subop) \
- __asm__ __volatile__ (#op " %0, %%" #reg ", " #subop \
- : /* nothing */ \
- : "X" (mem))
-
-#define sse_m2mi(op, mems, memd, xmmreg, subop) \
- __asm__ __volatile__ ("movups %0, %%xmm0\n\t" \
- #op " %1, %%xmm0, " #subop "\n\t" \
- "movups %%mm0, %0" \
- : "=X" (memd) \
- : "X" (mems))
-#endif
-
-
-
-
-/* 1x128 MOVe Aligned four Packed Single-fp
-*/
-#define movaps_m2r(var, reg) sse_m2r(movaps, var, reg)
-#define movaps_r2m(reg, var) sse_r2m(movaps, reg, var)
-#define movaps_r2r(regs, regd) sse_r2r(movaps, regs, regd)
-#define movaps(vars, vard) \
- __asm__ __volatile__ ("movaps %1, %%mm0\n\t" \
- "movaps %%mm0, %0" \
- : "=X" (vard) \
- : "X" (vars))
-
-
-/* 1x128 MOVe aligned Non-Temporal four Packed Single-fp
-*/
-#define movntps_r2m(xmmreg, var) sse_r2m(movntps, xmmreg, var)
-
-
-/* 1x64 MOVe Non-Temporal Quadword
-*/
-#define movntq_r2m(mmreg, var) sse_r2m(movntq, mmreg, var)
-
-
-/* 1x128 MOVe Unaligned four Packed Single-fp
-*/
-#define movups_m2r(var, reg) sse_m2r(movups, var, reg)
-#define movups_r2m(reg, var) sse_r2m(movups, reg, var)
-#define movups_r2r(regs, regd) sse_r2r(movups, regs, regd)
-#define movups(vars, vard) \
- __asm__ __volatile__ ("movups %1, %%mm0\n\t" \
- "movups %%mm0, %0" \
- : "=X" (vard) \
- : "X" (vars))
-
-
-/* MOVe High to Low Packed Single-fp
- high half of 4x32f (x) -> low half of 4x32f (y)
-*/
-#define movhlps_r2r(regs, regd) sse_r2r(movhlps, regs, regd)
-
-
-/* MOVe Low to High Packed Single-fp
- low half of 4x32f (x) -> high half of 4x32f (y)
-*/
-#define movlhps_r2r(regs, regd) sse_r2r(movlhps, regs, regd)
-
-
-/* MOVe High Packed Single-fp
- 2x32f -> high half of 4x32f
-*/
-#define movhps_m2r(var, reg) sse_m2r(movhps, var, reg)
-#define movhps_r2m(reg, var) sse_r2m(movhps, reg, var)
-#define movhps(vars, vard) \
- __asm__ __volatile__ ("movhps %1, %%mm0\n\t" \
- "movhps %%mm0, %0" \
- : "=X" (vard) \
- : "X" (vars))
-
-
-/* MOVe Low Packed Single-fp
- 2x32f -> low half of 4x32f
-*/
-#define movlps_m2r(var, reg) sse_m2r(movlps, var, reg)
-#define movlps_r2m(reg, var) sse_r2m(movlps, reg, var)
-#define movlps(vars, vard) \
- __asm__ __volatile__ ("movlps %1, %%mm0\n\t" \
- "movlps %%mm0, %0" \
- : "=X" (vard) \
- : "X" (vars))
-
-
-/* MOVe Scalar Single-fp
- lowest field of 4x32f (x) -> lowest field of 4x32f (y)
-*/
-#define movss_m2r(var, reg) sse_m2r(movss, var, reg)
-#define movss_r2m(reg, var) sse_r2m(movss, reg, var)
-#define movss_r2r(regs, regd) sse_r2r(movss, regs, regd)
-#define movss(vars, vard) \
- __asm__ __volatile__ ("movss %1, %%mm0\n\t" \
- "movss %%mm0, %0" \
- : "=X" (vard) \
- : "X" (vars))
-
-
-/* 4x16 Packed SHUFfle Word
-*/
-#define pshufw_m2r(var, reg, index) sse_m2ri(pshufw, var, reg, index)
-#define pshufw_r2r(regs, regd, index) sse_r2ri(pshufw, regs, regd, index)
-
-
-/* 1x128 SHUFfle Packed Single-fp
-*/
-#define shufps_m2r(var, reg, index) sse_m2ri(shufps, var, reg, index)
-#define shufps_r2r(regs, regd, index) sse_r2ri(shufps, regs, regd, index)
-
-
-/* ConVerT Packed signed Int32 to(2) Packed Single-fp
-*/
-#define cvtpi2ps_m2r(var, xmmreg) sse_m2r(cvtpi2ps, var, xmmreg)
-#define cvtpi2ps_r2r(mmreg, xmmreg) sse_r2r(cvtpi2ps, mmreg, xmmreg)
-
-
-/* ConVerT Packed Single-fp to(2) Packed signed Int32
-*/
-#define cvtps2pi_m2r(var, mmreg) sse_m2r(cvtps2pi, var, mmreg)
-#define cvtps2pi_r2r(xmmreg, mmreg) sse_r2r(cvtps2pi, mmreg, xmmreg)
-
-
-/* ConVerT with Truncate Packed Single-fp to(2) Packed Int32
-*/
-#define cvttps2pi_m2r(var, mmreg) sse_m2r(cvttps2pi, var, mmreg)
-#define cvttps2pi_r2r(xmmreg, mmreg) sse_r2r(cvttps2pi, mmreg, xmmreg)
-
-
-/* ConVerT Signed Int32 to(2) Single-fp (Scalar)
-*/
-#define cvtsi2ss_m2r(var, xmmreg) sse_m2r(cvtsi2ss, var, xmmreg)
-#define cvtsi2ss_r2r(reg, xmmreg) sse_r2r(cvtsi2ss, reg, xmmreg)
-
-
-/* ConVerT Scalar Single-fp to(2) Signed Int32
-*/
-#define cvtss2si_m2r(var, reg) sse_m2r(cvtss2si, var, reg)
-#define cvtss2si_r2r(xmmreg, reg) sse_r2r(cvtss2si, xmmreg, reg)
-
-
-/* ConVerT with Truncate Scalar Single-fp to(2) Signed Int32
-*/
-#define cvttss2si_m2r(var, reg) sse_m2r(cvtss2si, var, reg)
-#define cvttss2si_r2r(xmmreg, reg) sse_r2r(cvtss2si, xmmreg, reg)
-
-
-/* Parallel EXTRact Word from 4x16
-*/
-#define pextrw_r2r(mmreg, reg, field) sse_r2ri(pextrw, mmreg, reg, field)
-
-
-/* Parallel INSeRt Word from 4x16
-*/
-#define pinsrw_r2r(reg, mmreg, field) sse_r2ri(pinsrw, reg, mmreg, field)
-
-
-
-/* MOVe MaSK from Packed Single-fp
-*/
-#ifdef SSE_TRACE
- #define movmskps(xmmreg, reg) \
- { \
- fprintf(stderr, "movmskps()\n"); \
- __asm__ __volatile__ ("movmskps %" #xmmreg ", %" #reg) \
- }
-#else
- #define movmskps(xmmreg, reg) \
- __asm__ __volatile__ ("movmskps %" #xmmreg ", %" #reg)
-#endif
-
-
-/* Parallel MOVe MaSK from mmx reg to 32-bit reg
-*/
-#ifdef SSE_TRACE
- #define pmovmskb(mmreg, reg) \
- { \
- fprintf(stderr, "movmskps()\n"); \
- __asm__ __volatile__ ("movmskps %" #mmreg ", %" #reg) \
- }
-#else
- #define pmovmskb(mmreg, reg) \
- __asm__ __volatile__ ("movmskps %" #mmreg ", %" #reg)
-#endif
-
-
-/* MASKed MOVe from 8x8 to memory pointed to by (e)di register
-*/
-#define maskmovq(mmregs, fieldreg) sse_r2ri(maskmovq, mmregs, fieldreg)
-
-
-
-
-/* 4x32f Parallel ADDs
-*/
-#define addps_m2r(var, reg) sse_m2r(addps, var, reg)
-#define addps_r2r(regs, regd) sse_r2r(addps, regs, regd)
-#define addps(vars, vard, xmmreg) sse_m2m(addps, vars, vard, xmmreg)
-
-
-/* Lowest Field of 4x32f Parallel ADDs
-*/
-#define addss_m2r(var, reg) sse_m2r(addss, var, reg)
-#define addss_r2r(regs, regd) sse_r2r(addss, regs, regd)
-#define addss(vars, vard, xmmreg) sse_m2m(addss, vars, vard, xmmreg)
-
-
-/* 4x32f Parallel SUBs
-*/
-#define subps_m2r(var, reg) sse_m2r(subps, var, reg)
-#define subps_r2r(regs, regd) sse_r2r(subps, regs, regd)
-#define subps(vars, vard, xmmreg) sse_m2m(subps, vars, vard, xmmreg)
-
-
-/* Lowest Field of 4x32f Parallel SUBs
-*/
-#define subss_m2r(var, reg) sse_m2r(subss, var, reg)
-#define subss_r2r(regs, regd) sse_r2r(subss, regs, regd)
-#define subss(vars, vard, xmmreg) sse_m2m(subss, vars, vard, xmmreg)
-
-
-/* 8x8u -> 4x16u Packed Sum of Absolute Differences
-*/
-#define psadbw_m2r(var, reg) sse_m2r(psadbw, var, reg)
-#define psadbw_r2r(regs, regd) sse_r2r(psadbw, regs, regd)
-#define psadbw(vars, vard, mmreg) sse_m2m(psadbw, vars, vard, mmreg)
-
-
-/* 4x16u Parallel MUL High Unsigned
-*/
-#define pmulhuw_m2r(var, reg) sse_m2r(pmulhuw, var, reg)
-#define pmulhuw_r2r(regs, regd) sse_r2r(pmulhuw, regs, regd)
-#define pmulhuw(vars, vard, mmreg) sse_m2m(pmulhuw, vars, vard, mmreg)
-
-
-/* 4x32f Parallel MULs
-*/
-#define mulps_m2r(var, reg) sse_m2r(mulps, var, reg)
-#define mulps_r2r(regs, regd) sse_r2r(mulps, regs, regd)
-#define mulps(vars, vard, xmmreg) sse_m2m(mulps, vars, vard, xmmreg)
-
-
-/* Lowest Field of 4x32f Parallel MULs
-*/
-#define mulss_m2r(var, reg) sse_m2r(mulss, var, reg)
-#define mulss_r2r(regs, regd) sse_r2r(mulss, regs, regd)
-#define mulss(vars, vard, xmmreg) sse_m2m(mulss, vars, vard, xmmreg)
-
-
-/* 4x32f Parallel DIVs
-*/
-#define divps_m2r(var, reg) sse_m2r(divps, var, reg)
-#define divps_r2r(regs, regd) sse_r2r(divps, regs, regd)
-#define divps(vars, vard, xmmreg) sse_m2m(divps, vars, vard, xmmreg)
-
-
-/* Lowest Field of 4x32f Parallel DIVs
-*/
-#define divss_m2r(var, reg) sse_m2r(divss, var, reg)
-#define divss_r2r(regs, regd) sse_r2r(divss, regs, regd)
-#define divss(vars, vard, xmmreg) sse_m2m(divss, vars, vard, xmmreg)
-
-
-/* 4x32f Parallel Reciprocals
-*/
-#define rcpps_m2r(var, reg) sse_m2r(rcpps, var, reg)
-#define rcpps_r2r(regs, regd) sse_r2r(rcpps, regs, regd)
-#define rcpps(vars, vard, xmmreg) sse_m2m(rcpps, vars, vard, xmmreg)
-
-
-/* Lowest Field of 4x32f Parallel Reciprocals
-*/
-#define rcpss_m2r(var, reg) sse_m2r(rcpss, var, reg)
-#define rcpss_r2r(regs, regd) sse_r2r(rcpss, regs, regd)
-#define rcpss(vars, vard, xmmreg) sse_m2m(rcpss, vars, vard, xmmreg)
-
-
-/* 4x32f Parallel Square Root of Reciprocals
-*/
-#define rsqrtps_m2r(var, reg) sse_m2r(rsqrtps, var, reg)
-#define rsqrtps_r2r(regs, regd) sse_r2r(rsqrtps, regs, regd)
-#define rsqrtps(vars, vard, xmmreg) sse_m2m(rsqrtps, vars, vard, xmmreg)
-
-
-/* Lowest Field of 4x32f Parallel Square Root of Reciprocals
-*/
-#define rsqrtss_m2r(var, reg) sse_m2r(rsqrtss, var, reg)
-#define rsqrtss_r2r(regs, regd) sse_r2r(rsqrtss, regs, regd)
-#define rsqrtss(vars, vard, xmmreg) sse_m2m(rsqrtss, vars, vard, xmmreg)
-
-
-/* 4x32f Parallel Square Roots
-*/
-#define sqrtps_m2r(var, reg) sse_m2r(sqrtps, var, reg)
-#define sqrtps_r2r(regs, regd) sse_r2r(sqrtps, regs, regd)
-#define sqrtps(vars, vard, xmmreg) sse_m2m(sqrtps, vars, vard, xmmreg)
-
-
-/* Lowest Field of 4x32f Parallel Square Roots
-*/
-#define sqrtss_m2r(var, reg) sse_m2r(sqrtss, var, reg)
-#define sqrtss_r2r(regs, regd) sse_r2r(sqrtss, regs, regd)
-#define sqrtss(vars, vard, xmmreg) sse_m2m(sqrtss, vars, vard, xmmreg)
-
-
-/* 8x8u and 4x16u Parallel AVeraGe
-*/
-#define pavgb_m2r(var, reg) sse_m2r(pavgb, var, reg)
-#define pavgb_r2r(regs, regd) sse_r2r(pavgb, regs, regd)
-#define pavgb(vars, vard, mmreg) sse_m2m(pavgb, vars, vard, mmreg)
-
-#define pavgw_m2r(var, reg) sse_m2r(pavgw, var, reg)
-#define pavgw_r2r(regs, regd) sse_r2r(pavgw, regs, regd)
-#define pavgw(vars, vard, mmreg) sse_m2m(pavgw, vars, vard, mmreg)
-
-
-/* 1x128 bitwise AND
-*/
-#define andps_m2r(var, reg) sse_m2r(andps, var, reg)
-#define andps_r2r(regs, regd) sse_r2r(andps, regs, regd)
-#define andps(vars, vard, xmmreg) sse_m2m(andps, vars, vard, xmmreg)
-
-
-/* 1x128 bitwise AND with Not the destination
-*/
-#define andnps_m2r(var, reg) sse_m2r(andnps, var, reg)
-#define andnps_r2r(regs, regd) sse_r2r(andnps, regs, regd)
-#define andnps(vars, vard, xmmreg) sse_m2m(andnps, vars, vard, xmmreg)
-
-
-/* 1x128 bitwise OR
-*/
-#define orps_m2r(var, reg) sse_m2r(orps, var, reg)
-#define orps_r2r(regs, regd) sse_r2r(orps, regs, regd)
-#define orps(vars, vard, xmmreg) sse_m2m(orps, vars, vard, xmmreg)
-
-
-/* 1x128 bitwise eXclusive OR
-*/
-#define xorps_m2r(var, reg) sse_m2r(xorps, var, reg)
-#define xorps_r2r(regs, regd) sse_r2r(xorps, regs, regd)
-#define xorps(vars, vard, xmmreg) sse_m2m(xorps, vars, vard, xmmreg)
-
-
-/* 8x8u, 4x16, and 4x32f Parallel Maximum
-*/
-#define pmaxub_m2r(var, reg) sse_m2r(pmaxub, var, reg)
-#define pmaxub_r2r(regs, regd) sse_r2r(pmaxub, regs, regd)
-#define pmaxub(vars, vard, mmreg) sse_m2m(pmaxub, vars, vard, mmreg)
-
-#define pmaxsw_m2r(var, reg) sse_m2r(pmaxsw, var, reg)
-#define pmaxsw_r2r(regs, regd) sse_r2r(pmaxsw, regs, regd)
-#define pmaxsw(vars, vard, mmreg) sse_m2m(pmaxsw, vars, vard, mmreg)
-
-#define maxps_m2r(var, reg) sse_m2r(maxps, var, reg)
-#define maxps_r2r(regs, regd) sse_r2r(maxps, regs, regd)
-#define maxps(vars, vard, xmmreg) sse_m2m(maxps, vars, vard, xmmreg)
-
-
-/* Lowest Field of 4x32f Parallel Maximum
-*/
-#define maxss_m2r(var, reg) sse_m2r(maxss, var, reg)
-#define maxss_r2r(regs, regd) sse_r2r(maxss, regs, regd)
-#define maxss(vars, vard, xmmreg) sse_m2m(maxss, vars, vard, xmmreg)
-
-
-/* 8x8u, 4x16, and 4x32f Parallel Minimum
-*/
-#define pminub_m2r(var, reg) sse_m2r(pminub, var, reg)
-#define pminub_r2r(regs, regd) sse_r2r(pminub, regs, regd)
-#define pminub(vars, vard, mmreg) sse_m2m(pminub, vars, vard, mmreg)
-
-#define pminsw_m2r(var, reg) sse_m2r(pminsw, var, reg)
-#define pminsw_r2r(regs, regd) sse_r2r(pminsw, regs, regd)
-#define pminsw(vars, vard, mmreg) sse_m2m(pminsw, vars, vard, mmreg)
-
-#define minps_m2r(var, reg) sse_m2r(minps, var, reg)
-#define minps_r2r(regs, regd) sse_r2r(minps, regs, regd)
-#define minps(vars, vard, xmmreg) sse_m2m(minps, vars, vard, xmmreg)
-
-
-/* Lowest Field of 4x32f Parallel Minimum
-*/
-#define minss_m2r(var, reg) sse_m2r(minss, var, reg)
-#define minss_r2r(regs, regd) sse_r2r(minss, regs, regd)
-#define minss(vars, vard, xmmreg) sse_m2m(minss, vars, vard, xmmreg)
-
-
-/* 4x32f Parallel CoMPares
- (resulting fields are either 0 or -1)
-*/
-#define cmpps_m2r(var, reg, op) sse_m2ri(cmpps, var, reg, op)
-#define cmpps_r2r(regs, regd, op) sse_r2ri(cmpps, regs, regd, op)
-#define cmpps(vars, vard, op, xmmreg) sse_m2mi(cmpps, vars, vard, xmmreg, op)
-
-#define cmpeqps_m2r(var, reg) sse_m2ri(cmpps, var, reg, 0)
-#define cmpeqps_r2r(regs, regd) sse_r2ri(cmpps, regs, regd, 0)
-#define cmpeqps(vars, vard, xmmreg) sse_m2mi(cmpps, vars, vard, xmmreg, 0)
-
-#define cmpltps_m2r(var, reg) sse_m2ri(cmpps, var, reg, 1)
-#define cmpltps_r2r(regs, regd) sse_r2ri(cmpps, regs, regd, 1)
-#define cmpltps(vars, vard, xmmreg) sse_m2mi(cmpps, vars, vard, xmmreg, 1)
-
-#define cmpleps_m2r(var, reg) sse_m2ri(cmpps, var, reg, 2)
-#define cmpleps_r2r(regs, regd) sse_r2ri(cmpps, regs, regd, 2)
-#define cmpleps(vars, vard, xmmreg) sse_m2mi(cmpps, vars, vard, xmmreg, 2)
-
-#define cmpunordps_m2r(var, reg) sse_m2ri(cmpps, var, reg, 3)
-#define cmpunordps_r2r(regs, regd) sse_r2ri(cmpps, regs, regd, 3)
-#define cmpunordps(vars, vard, xmmreg) sse_m2mi(cmpps, vars, vard, xmmreg, 3)
-
-#define cmpneqps_m2r(var, reg) sse_m2ri(cmpps, var, reg, 4)
-#define cmpneqps_r2r(regs, regd) sse_r2ri(cmpps, regs, regd, 4)
-#define cmpneqps(vars, vard, xmmreg) sse_m2mi(cmpps, vars, vard, xmmreg, 4)
-
-#define cmpnltps_m2r(var, reg) sse_m2ri(cmpps, var, reg, 5)
-#define cmpnltps_r2r(regs, regd) sse_r2ri(cmpps, regs, regd, 5)
-#define cmpnltps(vars, vard, xmmreg) sse_m2mi(cmpps, vars, vard, xmmreg, 5)
-
-#define cmpnleps_m2r(var, reg) sse_m2ri(cmpps, var, reg, 6)
-#define cmpnleps_r2r(regs, regd) sse_r2ri(cmpps, regs, regd, 6)
-#define cmpnleps(vars, vard, xmmreg) sse_m2mi(cmpps, vars, vard, xmmreg, 6)
-
-#define cmpordps_m2r(var, reg) sse_m2ri(cmpps, var, reg, 7)
-#define cmpordps_r2r(regs, regd) sse_r2ri(cmpps, regs, regd, 7)
-#define cmpordps(vars, vard, xmmreg) sse_m2mi(cmpps, vars, vard, xmmreg, 7)
-
-
-/* Lowest Field of 4x32f Parallel CoMPares
- (resulting fields are either 0 or -1)
-*/
-#define cmpss_m2r(var, reg, op) sse_m2ri(cmpss, var, reg, op)
-#define cmpss_r2r(regs, regd, op) sse_r2ri(cmpss, regs, regd, op)
-#define cmpss(vars, vard, op, xmmreg) sse_m2mi(cmpss, vars, vard, xmmreg, op)
-
-#define cmpeqss_m2r(var, reg) sse_m2ri(cmpss, var, reg, 0)
-#define cmpeqss_r2r(regs, regd) sse_r2ri(cmpss, regs, regd, 0)
-#define cmpeqss(vars, vard, xmmreg) sse_m2mi(cmpss, vars, vard, xmmreg, 0)
-
-#define cmpltss_m2r(var, reg) sse_m2ri(cmpss, var, reg, 1)
-#define cmpltss_r2r(regs, regd) sse_r2ri(cmpss, regs, regd, 1)
-#define cmpltss(vars, vard, xmmreg) sse_m2mi(cmpss, vars, vard, xmmreg, 1)
-
-#define cmpless_m2r(var, reg) sse_m2ri(cmpss, var, reg, 2)
-#define cmpless_r2r(regs, regd) sse_r2ri(cmpss, regs, regd, 2)
-#define cmpless(vars, vard, xmmreg) sse_m2mi(cmpss, vars, vard, xmmreg, 2)
-
-#define cmpunordss_m2r(var, reg) sse_m2ri(cmpss, var, reg, 3)
-#define cmpunordss_r2r(regs, regd) sse_r2ri(cmpss, regs, regd, 3)
-#define cmpunordss(vars, vard, xmmreg) sse_m2mi(cmpss, vars, vard, xmmreg, 3)
-
-#define cmpneqss_m2r(var, reg) sse_m2ri(cmpss, var, reg, 4)
-#define cmpneqss_r2r(regs, regd) sse_r2ri(cmpss, regs, regd, 4)
-#define cmpneqss(vars, vard, xmmreg) sse_m2mi(cmpss, vars, vard, xmmreg, 4)
-
-#define cmpnltss_m2r(var, reg) sse_m2ri(cmpss, var, reg, 5)
-#define cmpnltss_r2r(regs, regd) sse_r2ri(cmpss, regs, regd, 5)
-#define cmpnltss(vars, vard, xmmreg) sse_m2mi(cmpss, vars, vard, xmmreg, 5)
-
-#define cmpnless_m2r(var, reg) sse_m2ri(cmpss, var, reg, 6)
-#define cmpnless_r2r(regs, regd) sse_r2ri(cmpss, regs, regd, 6)
-#define cmpnless(vars, vard, xmmreg) sse_m2mi(cmpss, vars, vard, xmmreg, 6)
-
-#define cmpordss_m2r(var, reg) sse_m2ri(cmpss, var, reg, 7)
-#define cmpordss_r2r(regs, regd) sse_r2ri(cmpss, regs, regd, 7)
-#define cmpordss(vars, vard, xmmreg) sse_m2mi(cmpss, vars, vard, xmmreg, 7)
-
-
-/* Lowest Field of 4x32f Parallel CoMPares to set EFLAGS
- (resulting fields are either 0 or -1)
-*/
-#define comiss_m2r(var, reg) sse_m2r(comiss, var, reg)
-#define comiss_r2r(regs, regd) sse_r2r(comiss, regs, regd)
-#define comiss(vars, vard, xmmreg) sse_m2m(comiss, vars, vard, xmmreg)
-
-
-/* Lowest Field of 4x32f Unordered Parallel CoMPares to set EFLAGS
- (resulting fields are either 0 or -1)
-*/
-#define ucomiss_m2r(var, reg) sse_m2r(ucomiss, var, reg)
-#define ucomiss_r2r(regs, regd) sse_r2r(ucomiss, regs, regd)
-#define ucomiss(vars, vard, xmmreg) sse_m2m(ucomiss, vars, vard, xmmreg)
-
-
-/* 2-(4x32f) -> 4x32f UNPaCK Low Packed Single-fp
- (interleaves low half of dest with low half of source
- as padding in each result field)
-*/
-#define unpcklps_m2r(var, reg) sse_m2r(unpcklps, var, reg)
-#define unpcklps_r2r(regs, regd) sse_r2r(unpcklps, regs, regd)
-
-
-/* 2-(4x32f) -> 4x32f UNPaCK High Packed Single-fp
- (interleaves high half of dest with high half of source
- as padding in each result field)
-*/
-#define unpckhps_m2r(var, reg) sse_m2r(unpckhps, var, reg)
-#define unpckhps_r2r(regs, regd) sse_r2r(unpckhps, regs, regd)
-
-
-
-/* Fp and mmX ReSTORe state
-*/
-#ifdef SSE_TRACE
- #define fxrstor(mem) \
- { \
- fprintf(stderr, "fxrstor()\n"); \
- __asm__ __volatile__ ("fxrstor %0" \
- : /* nothing */ \
- : "X" (mem)) \
- }
-#else
- #define fxrstor(mem) \
- __asm__ __volatile__ ("fxrstor %0" \
- : /* nothing */ \
- : "X" (mem))
-#endif
-
-
-/* Fp and mmX SAVE state
-*/
-#ifdef SSE_TRACE
- #define fxsave(mem) \
- { \
- fprintf(stderr, "fxsave()\n"); \
- __asm__ __volatile__ ("fxsave %0" \
- : /* nothing */ \
- : "X" (mem)) \
- }
-#else
- #define fxsave(mem) \
- __asm__ __volatile__ ("fxsave %0" \
- : /* nothing */ \
- : "X" (mem))
-#endif
-
-
-/* STore streaMing simd eXtensions Control/Status Register
-*/
-#ifdef SSE_TRACE
- #define stmxcsr(mem) \
- { \
- fprintf(stderr, "stmxcsr()\n"); \
- __asm__ __volatile__ ("stmxcsr %0" \
- : /* nothing */ \
- : "X" (mem)) \
- }
-#else
- #define stmxcsr(mem) \
- __asm__ __volatile__ ("stmxcsr %0" \
- : /* nothing */ \
- : "X" (mem))
-#endif
-
-
-/* LoaD streaMing simd eXtensions Control/Status Register
-*/
-#ifdef SSE_TRACE
- #define ldmxcsr(mem) \
- { \
- fprintf(stderr, "ldmxcsr()\n"); \
- __asm__ __volatile__ ("ldmxcsr %0" \
- : /* nothing */ \
- : "X" (mem)) \
- }
-#else
- #define ldmxcsr(mem) \
- __asm__ __volatile__ ("ldmxcsr %0" \
- : /* nothing */ \
- : "X" (mem))
-#endif
-
-
-/* Store FENCE - enforce ordering of stores before fence vs. stores
- occuring after fence in source code.
-*/
-#ifdef SSE_TRACE
- #define sfence() \
- { \
- fprintf(stderr, "sfence()\n"); \
- __asm__ __volatile__ ("sfence\n\t") \
- }
-#else
- #define sfence() \
- __asm__ __volatile__ ("sfence\n\t")
-#endif
-
-
-/* PREFETCH data using T0, T1, T2, or NTA hint
- T0 = Prefetch into all cache levels
- T1 = Prefetch into all cache levels except 0th level
- T2 = Prefetch into all cache levels except 0th and 1st levels
- NTA = Prefetch data into non-temporal cache structure
-*/
-#ifdef SSE_TRACE
-#else
- #define prefetch(mem, hint) \
- __asm__ __volatile__ ("prefetch" #hint " %0" \
- : /* nothing */ \
- : "X" (mem))
-
- #define prefetcht0(mem) prefetch(mem, t0)
- #define prefetcht1(mem) prefetch(mem, t1)
- #define prefetcht2(mem) prefetch(mem, t2)
- #define prefetchnta(mem) prefetch(mem, nta)
-#endif
-
-
-
-#endif
diff --git a/gst/deinterlace2/tvtime/tomsmocomp.c b/gst/deinterlace2/tvtime/tomsmocomp.c
deleted file mode 100644
index 64e78c5b..00000000
--- a/gst/deinterlace2/tvtime/tomsmocomp.c
+++ /dev/null
@@ -1,211 +0,0 @@
-/**
- * Copyright (C) 2004 Billy Biggs <vektor@dumbterm.net>
- * Copyright (C) 2008 Sebastian Dröge <slomo@collabora.co.uk>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdlib.h>
-#include "_stdint.h"
-#include <string.h>
-
-#include "gst/gst.h"
-#include "gstdeinterlace2.h"
-#include "plugins.h"
-
-#define GST_TYPE_DEINTERLACE_METHOD_TOMSMOCOMP (gst_deinterlace_method_tomsmocomp_get_type ())
-#define GST_IS_DEINTERLACE_METHOD_TOMSMOCOMP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_TOMSMOCOMP))
-#define GST_IS_DEINTERLACE_METHOD_TOMSMOCOMP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_TOMSMOCOMP))
-#define GST_DEINTERLACE_METHOD_TOMSMOCOMP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_TOMSMOCOMP, GstDeinterlaceMethodTomsMoCompClass))
-#define GST_DEINTERLACE_METHOD_TOMSMOCOMP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_TOMSMOCOMP, GstDeinterlaceMethodTomsMoComp))
-#define GST_DEINTERLACE_METHOD_TOMSMOCOMP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_TOMSMOCOMP, GstDeinterlaceMethodTomsMoCompClass))
-#define GST_DEINTERLACE_METHOD_TOMSMOCOMP_CAST(obj) ((GstDeinterlaceMethodTomsMoComp*)(obj))
-
-GType gst_deinterlace_method_tomsmocomp_get_type (void);
-
-typedef struct
-{
- GstDeinterlaceMethod parent;
-
- guint search_effort;
- gboolean strange_bob;
-} GstDeinterlaceMethodTomsMoComp;
-
-typedef struct
-{
- GstDeinterlaceMethodClass parent_class;
-} GstDeinterlaceMethodTomsMoCompClass;
-
-static int
-Fieldcopy (void *dest, const void *src, size_t count,
- int rows, int dst_pitch, int src_pitch)
-{
- unsigned char *pDest = (unsigned char *) dest;
- unsigned char *pSrc = (unsigned char *) src;
-
- int i;
-
- for (i = 0; i < rows; i++) {
- oil_memcpy (pDest, pSrc, count);
- pSrc += src_pitch;
- pDest += dst_pitch;
- }
- return 0;
-}
-
-#define USE_FOR_DSCALER
-
-#define IS_C
-#define SIMD_TYPE C
-#define FUNCT_NAME tomsmocompDScaler_C
-#include "tomsmocomp/TomsMoCompAll.inc"
-#undef IS_C
-#undef SIMD_TYPE
-#undef FUNCT_NAME
-
-#ifdef BUILD_X86_ASM
-
-#include "tomsmocomp/tomsmocompmacros.h"
-#include "x86-64_macros.inc"
-
-#define IS_MMX
-#define SIMD_TYPE MMX
-#define FUNCT_NAME tomsmocompDScaler_MMX
-#include "tomsmocomp/TomsMoCompAll.inc"
-#undef IS_MMX
-#undef SIMD_TYPE
-#undef FUNCT_NAME
-
-#define IS_3DNOW
-#define SIMD_TYPE 3DNOW
-#define FUNCT_NAME tomsmocompDScaler_3DNOW
-#include "tomsmocomp/TomsMoCompAll.inc"
-#undef IS_3DNOW
-#undef SIMD_TYPE
-#undef FUNCT_NAME
-
-#define IS_MMXEXT
-#define SIMD_TYPE MMXEXT
-#define FUNCT_NAME tomsmocompDScaler_MMXEXT
-#include "tomsmocomp/TomsMoCompAll.inc"
-#undef IS_MMXEXT
-#undef SIMD_TYPE
-#undef FUNCT_NAME
-
-#endif
-
-G_DEFINE_TYPE (GstDeinterlaceMethodTomsMoComp,
- gst_deinterlace_method_tomsmocomp, GST_TYPE_DEINTERLACE_METHOD);
-
-enum
-{
- ARG_0,
- ARG_SEARCH_EFFORT,
- ARG_STRANGE_BOB
-};
-
-static void
-gst_deinterlace_method_tomsmocomp_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec)
-{
- GstDeinterlaceMethodTomsMoComp *self =
- GST_DEINTERLACE_METHOD_TOMSMOCOMP (object);
-
- switch (prop_id) {
- case ARG_SEARCH_EFFORT:
- self->search_effort = g_value_get_uint (value);
- break;
- case ARG_STRANGE_BOB:
- self->strange_bob = g_value_get_boolean (value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- }
-}
-
-static void
-gst_deinterlace_method_tomsmocomp_get_property (GObject * object, guint prop_id,
- GValue * value, GParamSpec * pspec)
-{
- GstDeinterlaceMethodTomsMoComp *self =
- GST_DEINTERLACE_METHOD_TOMSMOCOMP (object);
-
- switch (prop_id) {
- case ARG_SEARCH_EFFORT:
- g_value_set_uint (value, self->search_effort);
- break;
- case ARG_STRANGE_BOB:
- g_value_set_boolean (value, self->strange_bob);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- }
-}
-
-static void
- gst_deinterlace_method_tomsmocomp_class_init
- (GstDeinterlaceMethodTomsMoCompClass * klass)
-{
- GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass;
- GObjectClass *gobject_class = (GObjectClass *) klass;
-#ifdef BUILD_X86_ASM
- guint cpu_flags = oil_cpu_get_flags ();
-#endif
-
- gobject_class->set_property = gst_deinterlace_method_tomsmocomp_set_property;
- gobject_class->get_property = gst_deinterlace_method_tomsmocomp_get_property;
-
- g_object_class_install_property (gobject_class, ARG_SEARCH_EFFORT,
- g_param_spec_uint ("search-effort",
- "Search Effort",
- "Search Effort", 0, 27, 5, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
- );
-
- g_object_class_install_property (gobject_class, ARG_STRANGE_BOB,
- g_param_spec_boolean ("strange-bob",
- "Strange Bob",
- "Use strange bob", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
- );
-
- dim_class->fields_required = 4;
- dim_class->name = "Motion Adaptive: Motion Search";
- dim_class->nick = "tomsmocomp";
- dim_class->latency = 1;
-
-#ifdef BUILD_X86_ASM
- if (cpu_flags & OIL_IMPL_FLAG_MMXEXT) {
- dim_class->deinterlace_frame = tomsmocompDScaler_MMXEXT;
- } else if (cpu_flags & OIL_IMPL_FLAG_3DNOW) {
- dim_class->deinterlace_frame = tomsmocompDScaler_3DNOW;
- } else if (cpu_flags & OIL_IMPL_FLAG_MMX) {
- dim_class->deinterlace_frame = tomsmocompDScaler_MMX;
- } else {
- dim_class->deinterlace_frame = tomsmocompDScaler_C;
- }
-#else
- dim_class->deinterlace_frame = tomsmocompDScaler_C;
-#endif
-}
-
-static void
-gst_deinterlace_method_tomsmocomp_init (GstDeinterlaceMethodTomsMoComp * self)
-{
- self->search_effort = 5;
- self->strange_bob = FALSE;
-}
diff --git a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoop0A.inc b/gst/deinterlace2/tvtime/tomsmocomp/SearchLoop0A.inc
deleted file mode 100644
index b1d9aeca..00000000
--- a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoop0A.inc
+++ /dev/null
@@ -1,15 +0,0 @@
-// -*- c++ -*-
-
-// Searches just the center pixel, in both the old
-// and new fields, but takes averages. This is an even
-// pixel address. Any chroma match will be used. (YUY2)
-// We best like finding 0 motion so we will bias everything we found previously
-// up by a little, and adjust later
-
-#ifdef IS_SSE2
- "paddusb "_ONES", %%xmm7\n\t" // bias toward no motion
-#else
- "paddusb "_ONES", %%mm7\n\t" // bias toward no motion
-#endif
-
- MERGE4PIXavg("(%%"XDI", %%"XCX")", "(%%"XSI", %%"XCX")") // center, in old and new
diff --git a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc b/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc
deleted file mode 100644
index e1560353..00000000
--- a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc
+++ /dev/null
@@ -1,174 +0,0 @@
-// -*- c++ -*-
-
-// Version for non-SSE2
-
-#ifndef IS_C
-
-#ifdef SKIP_SEARCH
- "movq %%mm6, %%mm0\n\t" // just use the results of our wierd bob
-#else
-
-
- // JA 9/Dec/2002
- // failed experiment
- // but leave in placeholder for me to play about
-#ifdef DONT_USE_STRANGE_BOB
- // Use the best weave if diffs less than 10 as that
- // means the image is still or moving cleanly
- // if there is motion we will clip which will catch anything
- "psubusb "_FOURS", %%mm7\n\t" // sets bits to zero if weave diff < 4
- "pxor %%mm0, %%mm0\n\t"
- "pcmpeqb %%mm0, %%mm7\n\t" // all ff where weave better, else 00
- "pcmpeqb %%mm7, %%mm0\n\t" // all ff where bob better, else 00
- "pand %%mm6, %%mm0\n\t" // use bob for these pixel values
- "pand %%mm5, %%mm7\n\t" // use weave for these
- "por %%mm7, %%mm0\n\t" // combine both
-#else
- // Use the better of bob or weave
- // pminub mm4, TENS // the most we care about
- V_PMINUB ("%%mm4", _TENS, "%%mm0") // the most we care about
-
- "psubusb %%mm4, %%mm7\n\t" // foregive that much from weave est?
- "psubusb "_FOURS", %%mm7\n\t" // bias it a bit toward weave
- "pxor %%mm0, %%mm0\n\t"
- "pcmpeqb %%mm0, %%mm7\n\t" // all ff where weave better, else 00
- "pcmpeqb %%mm7, %%mm0\n\t" // all ff where bob better, else 00
- "pand %%mm6, %%mm0\n\t" // use bob for these pixel values
- "pand %%mm5, %%mm7\n\t" // use weave for these
- "por %%mm7, %%mm0\n\t" // combine both
-#endif
-
-
- // pminub mm0, Max_Vals // but clip to catch the stray error
- V_PMINUB ("%%mm0", _Max_Vals, "%%mm1") // but clip to catch the stray error
- // pmaxub mm0, Min_Vals
- V_PMAXUB ("%%mm0", _Min_Vals)
-
-#endif
-
-
- MOVX" "_pDest", %%"XAX"\n\t"
-
-#ifdef USE_VERTICAL_FILTER
- "movq %%mm0, %%mm1\n\t"
- // pavgb mm0, qword ptr["XBX"]
- V_PAVGB ("%%mm0", "(%%"XBX")", "%%mm2", _ShiftMask)
- // movntq qword ptr["XAX"+"XDX"], mm0
- V_MOVNTQ ("(%"XAX", %%"XDX")", "%%mm0")
- // pavgb mm1, qword ptr["XBX"+"XCX"]
- V_PAVGB ("%%mm1", "(%%"XBX", %%"XCX")", "%%mm2", _ShiftMask)
- //FIXME: XDX or XAX!!
- "addq "_dst_pitchw", %%"XBX
- // movntq qword ptr["XAX"+"XDX"], mm1
- V_MOVNTQ ("(%%"XAX", %%"XDX")", "%%mm1")
-#else
-
- // movntq qword ptr["XAX"+"XDX"], mm0
- V_MOVNTQ ("(%%"XAX", %%"XDX")", "%%mm0")
-#endif
-
- LEAX" 8(%%"XDX"), %%"XDX"\n\t" // bump offset pointer
- CMPX" "_Last8", %%"XDX"\n\t" // done with line?
- "jb 1b\n\t" // y
-
- MOVX" "_oldbx", %%"XBX"\n\t"
-
- : /* no outputs */
-
- : "m"(pBob),
- "m"(src_pitch2),
- "m"(ShiftMask),
- "m"(pDest),
- "m"(dst_pitchw),
- "m"(Last8),
- "m"(pSrc),
- "m"(pSrcP),
- "m"(pBobP),
- "m"(DiffThres),
- "m"(Min_Vals),
- "m"(Max_Vals),
- "m"(FOURS),
- "m"(TENS),
- "m"(ONES),
- "m"(UVMask),
- "m"(Max_Mov),
- "m"(YMask),
- "m"(oldbx)
-
- : XAX, XCX, XDX, XSI, XDI,
- "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
-#ifdef __MMX__
- "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
-#endif
- "memory", "cc"
- );
-
- // adjust for next line
- pSrc += src_pitch2;
- pSrcP += src_pitch2;
- pDest += dst_pitch2;
- pBob += src_pitch2;
- pBobP += src_pitch2;
- }
-
- return 0;
-#else
-#ifdef SKIP_SEARCH
- out[0] = best[0]; // just use the results of our wierd bob
- out[1] = best[1];
-#else
- diff[0] = diff[0] - MIN (diff[0], 10) - 4;
- diff[1] = diff[1] - MIN (diff[1] - 10) - 4;
- if (diff[0] < 0)
- out[0] = weave[0];
- else
- out[0] = best[0];
-
- if (diff[1] < 0)
- out[1] = weave[1];
- else
- out[1] = best[1];
-
-
- out[0] = CLAMP (out[0], MinVals[0], MaxVals[0]);
- out[1] = CLAMP (out[1], MinVals[1], MaxVals[1]);
-#endif
-
-#ifdef USE_VERTICAL_FILTER
- pDest[x] = (out[0] + pBob[0]) / 2;
- pDest[x + dst_pitchw] = (pBob[src_pitch2] + out[0]) / 2;
- pDest[x + 1] = (out[1] + pBob[1]) / 2;
- pDest[x + 1 + dst_pitchw] = (pBob[src_pitch2 + 1] + out[1]) / 2;
-#else
- pDest[x] = out[0];
- pDest[x+1] = out[1];
-#endif
- pBob += 2;
- pBobP += 2;
- pSrc += 2;
- pSrcP += 2;
- }
- // adjust for next line
- pSrc = src_pitch2 * (y+1) + pWeaveSrc;
- pSrcP = src_pitch2 * (y+1) + pWeaveSrcP;
- pDest = dst_pitch2 * (y+1) + pWeaveDest + dst_pitch2;
-
-
- if (TopFirst)
- {
- pBob = pCopySrc + src_pitch2;
- pBobP = pCopySrcP + src_pitch2;
- }
- else
- {
- pBob = pCopySrc;
- pBobP = pCopySrcP;
- }
-
- pBob += src_pitch2 * (y+1);
- pBobP += src_pitch2 * (y+1);
- }
-
- return 0;
-
-#endif
diff --git a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA.inc b/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA.inc
deleted file mode 100644
index 6208fe8c..00000000
--- a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA.inc
+++ /dev/null
@@ -1,11 +0,0 @@
-// -*- c++ -*-
-
-// Searches 2 pixel to the left and right, in both the old
-// and new fields, but takes averages. These are even
-// pixel addresses. Chroma match will be used. (YUY2)
- MERGE4PIXavg("-4(%%"XDI")", "4(%%"XSI", %%"XCX", 2)") // up left, down right
- MERGE4PIXavg("4(%%"XDI")", "-4(%%"XSI", %%"XCX", 2)") // up right, down left
- MERGE4PIXavg("-4(%%"XDI", %%"XCX")", "4(%%"XSI", %%"XCX")") // left, right
- MERGE4PIXavg("4(%%"XDI", %%"XCX")", "-4(%%"XSI", %%"XCX")") // right, left
- MERGE4PIXavg("-4(%%"XDI", %%"XCX", 2)", "4(%%"XSI")") // down left, up right
- MERGE4PIXavg("4(%%"XDI", %%"XCX", 2)", "-4(%%"XSI")") // down right, up left
diff --git a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA8.inc b/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA8.inc
deleted file mode 100644
index 2841c3f6..00000000
--- a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA8.inc
+++ /dev/null
@@ -1,12 +0,0 @@
-// -*- c++ -*-
-
-// Searches 4 pixel to the left and right, in both the old
-// and new fields, but takes averages. These are even
-// pixel addresses. Chroma match will be used. (YUY2)
- MERGE4PIXavg("-8(%%"XDI")", "8(%%"XSI", %%"XCX", 2)") // up left, down right
- MERGE4PIXavg("8(%%"XDI")", "-8(%%"XSI", %%"XCX", 2)") // up right, down left
- MERGE4PIXavg("-8(%%"XDI", %%"XCX")", "8(%%"XSI", %%"XCX")") // left, right
- MERGE4PIXavg("8(%%"XDI", %%"XCX")", "-8(%%"XSI", %%"XCX")") // right, left
- MERGE4PIXavg("-8(%%"XDI", %%"XCX", 2)", "8(%%"XSI")") // down left, up right
- MERGE4PIXavg("8(%%"XDI", %%"XCX", 2)", "-8(%%"XSI")") // down right, up left
-
diff --git a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA.inc b/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA.inc
deleted file mode 100644
index ab5375f4..00000000
--- a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA.inc
+++ /dev/null
@@ -1,10 +0,0 @@
-// -*- c++ -*-
-
-// Searches 1 pixel to the left and right, in both the old
-// and new fields, but takes averages. These are odd
-// pixel addresses. Any chroma match will not be used. (YUY2)
- MERGE4PIXavg("-2(%%"XDI")", "2(%%"XSI", %%"XCX", 2)") // up left, down right
- MERGE4PIXavg("2(%%"XDI")", "-2(%%"XSI", %%"XCX", 2)") // up right, down left
- MERGE4PIXavg("-2(%%"XDI", %%"XCX", 2)", "2(%%"XSI")") // down left, up right
- MERGE4PIXavg("2(%%"XDI", %%"XCX", 2)", "-2(%%"XSI")") // down right, up left
-#include "SearchLoopOddA2.inc"
diff --git a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA2.inc b/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA2.inc
deleted file mode 100644
index fd3f6fb0..00000000
--- a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA2.inc
+++ /dev/null
@@ -1,5 +0,0 @@
-// Searches 1 pixel to the left and right, in both the old
-// and new fields, but takes averages. These are odd
-// pixel addresses. Any chroma match will not be used. (YUY2)
- MERGE4PIXavg("-2(%%"XDI", %%"XCX")", "2(%%"XSI", %%"XCX")") // left, right
- MERGE4PIXavg("2(%%"XDI", %%"XCX")", "-2(%%"XSI", %%"XCX")") // right, left
diff --git a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA6.inc b/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA6.inc
deleted file mode 100644
index cbae014e..00000000
--- a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA6.inc
+++ /dev/null
@@ -1,11 +0,0 @@
-// -*- c++ -*-
-
-// Searches 3 pixels to the left and right, in both the old
-// and new fields, but takes averages. These are odd
-// pixel addresses. Any chroma match will not be used. (YUY2)
- MERGE4PIXavg("-6(%%"XDI")", "6(%%"XSI", %%"XCX", 2)") // up left, down right
- MERGE4PIXavg("6(%%"XDI")", "-6(%%"XSI", %%"XCX", 2)") // up right, down left
- MERGE4PIXavg("-6(%%"XDI", %%"XCX")", "6(%%"XSI", %%"XCX")") // left, right
- MERGE4PIXavg("6(%%"XDI", %%"XCX")", "-6(%%"XSI", %%"XCX")") // right, left
- MERGE4PIXavg("-6(%%"XDI", %%"XCX", 2)", "6(%%"XSI")") // down left, up right
- MERGE4PIXavg("6(%%"XDI", %%"XCX", 2)", "-6(%%"XSI")") // down right, up left
diff --git a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH.inc b/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH.inc
deleted file mode 100644
index e59e3c7e..00000000
--- a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH.inc
+++ /dev/null
@@ -1,10 +0,0 @@
-// Searches 1 pixel to the left and right, in both the old
-// and new fields, but takes v-half pel averages. These are odd
-// pixel addresses. Any chroma match will not be used. (YUY2)
- __asm
- {
- MERGE4PIXavgH("XDI"-2, "XDI"+"XCX"-2, "XSI"+"XCX"+2, "XSI"+2*"XCX"+2) // up left, down right
- MERGE4PIXavgH("XDI"+2, "XDI"+"XCX"+2, "XSI"+"XCX"-2, "XSI"+2*"XCX"-2) // up right, down left
- MERGE4PIXavgH("XDI"+2*"XCX"-2, "XDI"+"XCX"-2, "XSI"+"XCX"+2, "XSI"+2) // down left, up right
- MERGE4PIXavgH("XDI"+2*"XCX"+2, "XDI"+"XCX"+2, "XSI"+"XCX"-2, "XSI"-2) // down right, up left
- }
diff --git a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH2.inc b/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH2.inc
deleted file mode 100644
index cd7d812a..00000000
--- a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH2.inc
+++ /dev/null
@@ -1,5 +0,0 @@
-// Searches 1 pixel to the left and right, in both the old
-// and new fields, but takes vertical averages. These are odd
-// pixel addresses. Any chroma match will not be used. (YUY2)
- MERGE4PIXavgH("-2(%%"XDI", %%"XCX")", "(%%"XDI", %%"XCX")", "(%%"XSI", %%"XCX")", "2(%%"XSI", %%"XCX")") // left, right
- MERGE4PIXavgH("2(%%"XDI", %%"XCX")", "(%%"XDI", %%"XCX")", "(%%"XSI", %%"XCX")", "-2(%%"XSI", %%"XCX")") // right, left
diff --git a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopTop.inc b/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopTop.inc
deleted file mode 100644
index 9d6a490f..00000000
--- a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopTop.inc
+++ /dev/null
@@ -1,254 +0,0 @@
-// -*- c++ -*-
-
-unsigned char* pDest;
-const unsigned char* pSrcP;
-const unsigned char* pSrc;
-const unsigned char* pBob;
-const unsigned char* pBobP;
-
-// long is int32 on ARCH_368, int64 on ARCH_AMD64. Declaring it this way
-// saves a lot of xor's to delete 64bit garbage.
-
-#if defined(DBL_RESIZE) || defined(USE_FOR_DSCALER)
-long src_pitch2 = src_pitch; // even & odd lines are not interleaved in DScaler
-#else
-long src_pitch2 = 2 * src_pitch; // even & odd lines are interleaved in Avisynth
-#endif
-
-
-long dst_pitch2 = 2 * dst_pitch;
-long y;
-
-long Last8;
-
- pSrc = pWeaveSrc; // points 1 weave line above
- pSrcP = pWeaveSrcP; // "
-
-#ifdef DBL_RESIZE
-
-#ifdef USE_VERTICAL_FILTER
- pDest = pWeaveDest + dst_pitch2;
-#else
- pDest = pWeaveDest + 3*dst_pitch;
-#endif
-
-#else
-
-#ifdef USE_VERTICAL_FILTER
- pDest = pWeaveDest + dst_pitch;
-#else
- pDest = pWeaveDest + dst_pitch2;
-#endif
-
-#endif
-
- if (TopFirst)
- {
- pBob = pCopySrc + src_pitch2; // remember one weave line just copied previously
- pBobP = pCopySrcP + src_pitch2;
- }
- else
- {
- pBob = pCopySrc;
- pBobP = pCopySrcP;
- }
-
-#ifndef IS_C
-
-#ifndef _pBob
-#define _pBob "%0"
-#define _src_pitch2 "%1"
-#define _ShiftMask "%2"
-#define _pDest "%3"
-#define _dst_pitchw "%4"
-#define _Last8 "%5"
-#define _pSrc "%6"
-#define _pSrcP "%7"
-#define _pBobP "%8"
-#define _DiffThres "%9"
-#define _Min_Vals "%10"
-#define _Max_Vals "%11"
-#define _FOURS "%12"
-#define _TENS "%13"
-#define _ONES "%14"
-#define _UVMask "%15"
-#define _Max_Mov "%16"
-#define _YMask "%17"
-#define _oldbx "%18"
-#endif
- Last8 = (rowsize-8);
-
- for (y=1; y < FldHeight-1; y++)
- {
- long dst_pitchw = dst_pitch; // local stor so asm can ref
- int64_t Max_Mov = 0x0404040404040404ull;
- int64_t DiffThres = 0x0f0f0f0f0f0f0f0full;
- int64_t YMask = 0x00ff00ff00ff00ffull; // keeps only luma
- int64_t UVMask = 0xff00ff00ff00ff00ull; // keeps only chroma
- int64_t TENS = 0x0a0a0a0a0a0a0a0aull;
- int64_t FOURS = 0x0404040404040404ull;
- int64_t ONES = 0x0101010101010101ull;
- int64_t Min_Vals = 0x0000000000000000ull;
- int64_t Max_Vals = 0x0000000000000000ull;
- int64_t ShiftMask = 0xfefffefffefffeffull;
-
- long oldbx;
-
- // pretend it's indented -->>
- __asm__ __volatile__
- (
- // Loop general reg usage
- //
- // XAX - pBobP, then pDest
- // XBX - pBob
- // XCX - src_pitch2
- // XDX - current offset
- // XDI - prev weave pixels, 1 line up
- // XSI - next weave pixels, 1 line up
-
- // Save "XBX" (-fPIC)
- MOVX" %%"XBX", "_oldbx"\n\t"
-
- // simple bob first 8 bytes
- MOVX" "_pBob", %%"XBX"\n\t"
- MOVX" "_src_pitch2", %%"XCX"\n\t"
-
-#ifdef USE_VERTICAL_FILTER
- "movq (%%"XBX"), %%mm0\n\t"
- "movq (%%"XBX", %%"XCX"), %%mm1\n\t" //, qword ptr["XBX"+"XCX"]
- "movq %%mm0, %%mm2\n\t"
- V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // halfway between
- V_PAVGB ("%%mm0", "%%mm2", "%%mm3", _ShiftMask) // 1/4 way
- V_PAVGB ("%%mm1", "%%mm2", "%%mm3", _ShiftMask) // 3/4 way
- MOVX" "_pDest", %%"XDI"\n\t"
- MOVX" "_dst_pitchw", %%"XAX"\n\t"
- V_MOVNTQ ("(%%"XDI")", "%%mm0")
- V_MOVNTQ ("(%%"XDI", %%"XAX")", "%%mm1") // qword ptr["XDI"+"XAX"], mm1
-
- // simple bob last 8 bytes
- MOVX" "_Last8", %%"XDX"\n\t"
- LEAX" (%%"XBX", %%"XDX"), %%"XSI"\n\t" // ["XBX"+"XDX"]
- "movq (%%"XSI"), %%mm0\n\t"
- "movq (%%"XSI", %%"XCX"), %%mm1\n\t" // qword ptr["XSI"+"XCX"]
- "movq %%mm0, %%mm2\n\t"
- V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // halfway between
- V_PAVGB ("%%mm0", "%%mm2", "%%mm3", _ShiftMask) // 1/4 way
- V_PAVGB ("%%mm1", "%%mm2", "%%mm3", _ShiftMask) // 3/4 way
- ADDX" %%"XDX", %%"XDI"\n\t" // last 8 bytes of dest
- V_MOVNTQ ("%%"XDI"", "%%mm0")
- V_MOVNTQ ("(%%"XDI", %%"XAX")", "%%mm1") // qword ptr["XDI"+"XAX"], mm1)
-
-#else
- "movq (%%"XBX"), %%mm0\n\t"
- // pavgb mm0, qword ptr["XBX"+"XCX"]
- V_PAVGB ("%%mm0", "(%%"XBX", %%"XCX")", "%%mm2", _ShiftMask) // qword ptr["XBX"+"XCX"], mm2, ShiftMask)
- MOVX" "_pDest", %%"XDI"\n\t"
- V_MOVNTQ ("(%%"XDI")", "%%mm0")
-
- // simple bob last 8 bytes
- MOVX" "_Last8", %%"XDX"\n\t"
- LEAX" (%%"XBX", %%"XDX"), %%"XSI"\n\t" //"XSI", ["XBX"+"XDX"]
- "movq (%%"XSI"), %%mm0\n\t"
- // pavgb mm0, qword ptr["XSI"+"XCX"]
- V_PAVGB ("%%mm0", "(%%"XSI", %%"XCX")", "%%mm2", _ShiftMask) // qword ptr["XSI"+"XCX"], mm2, ShiftMask)
- V_MOVNTQ ("(%%"XDI", %%"XDX")", "%%mm0") // qword ptr["XDI"+"XDX"], mm0)
-#endif
- // now loop and get the middle qwords
- MOVX" "_pSrc", %%"XSI"\n\t"
- MOVX" "_pSrcP", %%"XDI"\n\t"
- MOVX" $8, %%"XDX"\n\t" // curr offset longo all lines
-
- "1:\n\t"
- MOVX" "_pBobP", %%"XAX"\n\t"
- ADDX" $8, %%"XDI"\n\t"
- ADDX" $8, %%"XSI"\n\t"
- ADDX" $8, %%"XBX"\n\t"
- ADDX" %%"XDX", %%"XAX"\n\t"
-
-#ifdef USE_STRANGE_BOB
-#include "StrangeBob.inc"
-#else
-#include "WierdBob.inc"
-#endif
-
- // For non-SSE2:
- // through out most of the rest of this loop we will maintain
- // mm4 our min bob value
- // mm5 best weave pixels so far
- // mm6 our max Bob value
- // mm7 best weighted pixel ratings so far
-
- // We will keep a slight bias to using the weave pixels
- // from the current location, by rating them by the min distance
- // from the Bob value instead of the avg distance from that value.
- // our best and only rating so far
- "pcmpeqb %%mm7, %%mm7\n\t" // ffff, say we didn't find anything good yet
-
-#else
- Last8 = (rowsize - 4);
-
- for (y=1; y < FldHeight-1; y++)
- {
- #ifdef USE_STRANGE_BOB
- long DiffThres = 0x0f;
- #endif
-
- #ifndef SKIP_SEARCH
- long weave[2], MaxVals[2], MinVals[2];
- #endif
-
- long diff[2], best[2], avg[2], diff2[2], out[2], x;
-
-#ifdef USE_VERTICAL_FILTER
- pDest[0] = (3 * pBob[0] + pBob[src_pitch2]) / 4;
- pDest[1] = (3 * pBob[1] + pBob[src_pitch2 + 1]) / 4;
- pDest[2] = (3 * pBob[2] + pBob[src_pitch2 + 2]) / 4;
- pDest[3] = (3 * pBob[3] + pBob[src_pitch2 + 3]) / 4;
- pDest[dst_pitchw] = (pBob[0] + 3 * pBob[src_pitch2]) / 4;
- pDest[dst_pitchw + 1] = (pBob[1] + 3 * pBob[src_pitch2 + 1]) / 4;
- pDest[dst_pitchw + 2] = (pBob[2] + 3 * pBob[src_pitch2 + 2]) / 4;
- pDest[dst_pitchw + 3] = (pBob[3] + 3 * pBob[src_pitch2 + 3]) / 4;
-
- // simple bob last byte
- pDest[Last8] = (3 * pBob[Last8] + pBob[Last8 + src_pitch2]) / 4;
- pDest[Last8 + 1] = (3 * pBob[Last8 + 1] + pBob[Last8 + src_pitch2 + 1]) / 4;
- pDest[Last8 + 2] = (3 * pBob[Last8 + 2] + pBob[Last8 + src_pitch2 + 2]) / 4;
- pDest[Last8 + 3] = (3 * pBob[Last8 + 3] + pBob[Last8 + src_pitch2 + 3]) / 4;
- pDest[Last8 + src_pitch2] = (pBob[Last8] + 3 * pBob[Last8 + src_pitch2]) / 4;
- pDest[Last8 + src_pitch2 + 1] = (pBob[Last8 + 1] + 3 * pBob[Last8 + src_pitch2 + 1]) / 4;
- pDest[Last8 + src_pitch2 + 2] = (pBob[Last8 + 2] + 3 * pBob[Last8 + src_pitch2 + 2]) / 4;
- pDest[Last8 + src_pitch2 + 3] = (pBob[Last8 + 3] + 3 * pBob[Last8 + src_pitch2 + 3]) / 4;
-#else
- pDest[0] = (pBob[0] + pBob[src_pitch2 + 1]) / 2;
- pDest[1] = (pBob[1] + pBob[src_pitch2 + 1]) / 2;
- pDest[2] = (pBob[2] + pBob[src_pitch2 + 2]) / 2;
- pDest[3] = (pBob[3] + pBob[src_pitch2 + 3]) / 2;
-
- // simple bob last byte
- pDest[Last8] = (pBob[Last8] + pBob[Last8 + src_pitch2]) / 2;
- pDest[Last8 + 1] = (pBob[Last8 + 1] + pBob[Last8 + src_pitch2 + 1]) / 2;
- pDest[Last8 + 2] = (pBob[Last8 + 2] + pBob[Last8 + src_pitch2 + 2]) / 2;
- pDest[Last8 + 3] = (pBob[Last8 + 3] + pBob[Last8 + src_pitch2 + 3]) / 2;
-#endif
-
- pBob += 4;
- pBobP += 4;
- pSrc += 4;
- pSrcP += 4;
-
- for (x=4; x < Last8; x += 2) {
-
-#ifdef USE_STRANGE_BOB
-#include "StrangeBob.inc"
-#else
-#include "WierdBob.inc"
-#endif
-
- // We will keep a slight bias to using the weave pixels
- // from the current location, by rating them by the min distance
- // from the Bob value instead of the avg distance from that value.
- // our best and only rating so far
- diff[0] = diff[1] = 255;
-
-
-#endif
diff --git a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVA.inc b/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVA.inc
deleted file mode 100644
index 3e3d19b5..00000000
--- a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVA.inc
+++ /dev/null
@@ -1,6 +0,0 @@
-// -*- c++ -*-
-
-// Searches the center vertical line above center and below, in both the old
-// and new fields, but takes averages. These are even pixel addresses.
- MERGE4PIXavg("(%%"XDI", %%"XCX", 2)", "(%%"XSI")") // down, up
- MERGE4PIXavg("(%%"XDI")", "(%%"XSI", %%"XCX", 2)") // up, down
diff --git a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVAH.inc b/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVAH.inc
deleted file mode 100644
index 33155bc1..00000000
--- a/gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVAH.inc
+++ /dev/null
@@ -1,6 +0,0 @@
-// -*- c++ -*-
-
-// Searches the center vertical line above center and below, in both the old
-// and new fields, but takes averages. These are even pixel addresses.
- MERGE4PIXavgH("(%%"XDI", %%"XCX", 2)", "(%%"XDI", %%"XCX")", "(%%"XSI", %%"XCX")", "(%%"XSI")") // down, up
- MERGE4PIXavgH("(%%"XDI")", "(%%"XDI", %%"XCX")", "(%%"XSI", %%"XCX")", "(%%"XSI", %%"XCX", 2)") // up, down
diff --git a/gst/deinterlace2/tvtime/tomsmocomp/StrangeBob.inc b/gst/deinterlace2/tvtime/tomsmocomp/StrangeBob.inc
deleted file mode 100644
index 45b4c865..00000000
--- a/gst/deinterlace2/tvtime/tomsmocomp/StrangeBob.inc
+++ /dev/null
@@ -1,435 +0,0 @@
-// -*- c++ -*-
-
- // First, get and save our possible Bob values
- // Assume our pixels are layed out as follows with x the calc'd bob value
- // and the other pixels are from the current field
- //
- // j a b c k current field
- // x calculated line
- // m d e f n current field
- //
- // we calc the bob value luma value as:
- // if |j - n| < Thres && |a - m| > Thres
- // avg(j,n)
- // end if
- // if |k - m| < Thres && |c - n| > Thres
- // avg(k,m)
- // end if
- // if |c - d| < Thres && |b - f| > Thres
- // avg(c,d)
- // end if
- // if |a - f| < Thres && |b - d| > Thres
- // avg(a,f)
- // end if
- // if |b - e| < Thres
- // avg(b,e)
- // end if
- // pickup any thing not yet set with avg(b,e)
-
-#ifndef IS_C
-
- // j, n
- "pxor %%mm5, %%mm5\n\t"
- "pxor %%mm6, %%mm6\n\t"
- "pxor %%mm7, %%mm7\n\t"
-
- "movq -2(%%"XBX"), %%mm0\n\t" // value a from top left
- "movq -4(%%"XBX", %%"XCX"), %%mm1\n\t" // value m from bottom right
-
- "movq %%mm0, %%mm3\n\t"
- "psubusb %%mm1, %%mm3\n\t"
- "psubusb %%mm0, %%mm1\n\t"
- "por %%mm1, %%mm3\n\t" // abs(a,m)
-
- "psubusb "_DiffThres", %%mm3\n\t" // nonzero where abs(a,m) > Thres else 0
- "pxor %%mm4, %%mm4\n\t"
- "pcmpeqb %%mm4, %%mm3\n\t" // now ff where abs(a,m) < Thres, else 00
- "pcmpeqb %%mm3, %%mm4\n\t" // here ff where abs(a,m) > Thres, else 00
-
-
- "movq -4(%%"XBX"), %%mm0\n\t" // value j
- "movq 4(%%"XBX", %%"XCX"), %%mm1\n\t" // value n
- "movq %%mm0, %%mm2\n\t"
- V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // avg(j,n)
- "movq %%mm0, %%mm3\n\t"
- "psubusb %%mm1, %%mm0\n\t"
- "psubusb %%mm3, %%mm1\n\t"
- "por %%mm1, %%mm0\n\t" // abs(j,n)
-
- "movq %%mm0, %%mm1\n\t"
- "psubusb "_DiffThres", %%mm1\n\t" // nonzero where abs(j,n) > Thres else 0
- "pxor %%mm3, %%mm3\n\t"
- "pcmpeqb %%mm3, %%mm1\n\t" // now ff where abs(j,n) < Thres, else 00
-
- "pand %%mm4, %%mm1\n\t"
- "pand %%mm1, %%mm2\n\t"
- "pand %%mm1, %%mm0\n\t"
-
- "movq %%mm1, %%mm3\n\t"
- "pxor %%mm5, %%mm3\n\t"
- "pand %%mm3, %%mm6\n\t"
- "pand %%mm3, %%mm7\n\t"
- "pand %%mm3, %%mm5\n\t"
-
- "por %%mm1, %%mm5\n\t"
- "por %%mm2, %%mm6\n\t"
- "por %%mm0, %%mm7\n\t"
-
- // k & m
- "movq 2(%%"XBX"), %%mm0\n\t" // value c from top left
- "movq 4(%%"XBX", %%"XCX"), %%mm1\n\t" // value n from bottom right
-
- "movq %%mm0, %%mm3\n\t"
- "psubusb %%mm1, %%mm3\n\t"
- "psubusb %%mm0, %%mm1\n\t"
- "por %%mm1, %%mm3\n\t" // abs(c,n)
-
- "psubusb "_DiffThres", %%mm3\n\t" // nonzero where abs(c,n) > Thres else 0
- "pxor %%mm4, %%mm4\n\t"
- "pcmpeqb %%mm4, %%mm3\n\t" // now ff where abs(c,n) < Thres, else 00
- "pcmpeqb %%mm3, %%mm4\n\t" // here ff where abs(c,n) > Thres, else 00
-
-
- "movq 4(%%"XBX"), %%mm0\n\t" // value k
- "movq -4(%%"XBX", %%"XCX"), %%mm1\n\t" // value m
- "movq %%mm0, %%mm2\n\t"
- V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // avg(k,m)
- "movq %%mm0, %%mm3\n\t"
- "psubusb %%mm1, %%mm0\n\t"
- "psubusb %%mm3, %%mm1\n\t"
- "por %%mm1, %%mm0\n\t" // abs(k,m)
-
- "movq %%mm0, %%mm1\n\t"
- "psubusb "_DiffThres", %%mm1\n\t" // nonzero where abs(k,m) > Thres else 0
- "pxor %%mm3, %%mm3\n\t"
- "pcmpeqb %%mm3, %%mm1\n\t" // now ff where abs(k,m) < Thres, else 00
-
- "pand %%mm4, %%mm1\n\t"
-
- "pand %%mm1, %%mm2\n\t"
- "pand %%mm1, %%mm0\n\t"
-
- "movq %%mm1, %%mm3\n\t"
- "pxor %%mm5, %%mm3\n\t"
- "pand %%mm3, %%mm6\n\t"
- "pand %%mm3, %%mm7\n\t"
- "pand %%mm3, %%mm5\n\t"
-
- "por %%mm1, %%mm5\n\t"
- "por %%mm2, %%mm6\n\t"
- "por %%mm0, %%mm7\n\t"
-
-
- // c & d
- "movq (%%"XBX"), %%mm0\n\t" // value b from top left
- "movq 2(%%"XBX", %%"XCX"), %%mm1\n\t" // value f from bottom right
-
- "movq %%mm0, %%mm3\n\t"
- "psubusb %%mm1, %%mm3\n\t"
- "psubusb %%mm0, %%mm1\n\t"
- "por %%mm1, %%mm3\n\t" // abs(b,f)
-
- "psubusb "_DiffThres", %%mm3\n\t" // nonzero where abs(b,f) > Thres else 0
- "pxor %%mm4, %%mm4\n\t"
- "pcmpeqb %%mm4, %%mm3\n\t" // now ff where abs(b,f) < Thres, else 00
- "pcmpeqb %%mm3, %%mm4\n\t" // here ff where abs(b,f) > Thres, else 00
-
- "movq 2(%%"XBX"), %%mm0\n\t" // value c
- "movq -2(%%"XBX", %%"XCX"), %%mm1\n\t" // value d
- "movq %%mm0, %%mm2\n\t"
- V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // avg(c,d)
- "movq %%mm0, %%mm3\n\t"
- "psubusb %%mm1, %%mm0\n\t"
- "psubusb %%mm3, %%mm1\n\t"
- "por %%mm1, %%mm0\n\t" // abs(c,d)
-
- "movq %%mm0, %%mm1\n\t"
- "psubusb "_DiffThres", %%mm1\n\t" // nonzero where abs(c,d) > Thres else 0
- "pxor %%mm3, %%mm3\n\t"
- "pcmpeqb %%mm3, %%mm1\n\t" // now ff where abs(c,d) < Thres, else 00
-
- "pand %%mm4, %%mm1\n\t"
-
- "pand %%mm1, %%mm2\n\t"
- "pand %%mm1, %%mm0\n\t"
-
- "movq %%mm1, %%mm3\n\t"
- "pxor %%mm5, %%mm3\n\t"
- "pand %%mm3, %%mm6\n\t"
- "pand %%mm3, %%mm7\n\t"
- "pand %%mm3, %%mm5\n\t"
-
- "por %%mm1, %%mm5\n\t"
- "por %%mm2, %%mm6\n\t"
- "por %%mm0, %%mm7\n\t"
-
- // a & f
- "movq (%%"XBX"), %%mm0\n\t" // value b from top left
- "movq -2(%%"XBX", %%"XCX"), %%mm1\n\t" // value d from bottom right
-
- "movq %%mm0, %%mm3\n\t"
- "psubusb %%mm1, %%mm3\n\t"
- "psubusb %%mm0, %%mm1\n\t"
- "por %%mm1, %%mm3\n\t" // abs(b,d)
-
- "psubusb "_DiffThres", %%mm3\n\t" // nonzero where abs(b,d) > Thres else 0
- "pxor %%mm4, %%mm4\n\t"
- "pcmpeqb %%mm4, %%mm3\n\t" // now ff where abs(b,d) < Thres, else 00
- "pcmpeqb %%mm3, %%mm4\n\t" // here ff where abs(b,d) > Thres, else 00
-
- "movq -2(%%"XBX"), %%mm0\n\t" // value a
- "movq 2(%%"XBX", %%"XCX"), %%mm1\n\t" // value f
- "movq %%mm0, %%mm2\n\t"
- V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // avg(a,f)
- "movq %%mm0, %%mm3\n\t"
- "psubusb %%mm1, %%mm0\n\t"
- "psubusb %%mm3, %%mm1\n\t"
- "por %%mm1, %%mm0\n\t" // abs(a,f)
-
- "movq %%mm0, %%mm1\n\t"
- "psubusb "_DiffThres", %%mm1\n\t" // nonzero where abs(a,f) > Thres else 0
- "pxor %%mm3, %%mm3\n\t"
- "pcmpeqb %%mm3, %%mm1\n\t" // now ff where abs(a,f) < Thres, else 00
-
- "pand %%mm4, %%mm1\n\t"
-
- "pand %%mm1, %%mm2\n\t"
- "pand %%mm1, %%mm0\n\t"
-
- "movq %%mm1, %%mm3\n\t"
- "pxor %%mm5, %%mm3\n\t"
- "pand %%mm3, %%mm6\n\t"
- "pand %%mm3, %%mm7\n\t"
- "pand %%mm3, %%mm5\n\t"
-
- "por %%mm1, %%mm5\n\t"
- "por %%mm2, %%mm6\n\t"
- "por %%mm0, %%mm7\n\t"
-
- "pand "_YMask", %%mm5\n\t" // mask out chroma from here
- "pand "_YMask", %%mm6\n\t" // mask out chroma from here
- "pand "_YMask", %%mm7\n\t" // mask out chroma from here
-
- // b,e
- "movq (%%"XBX"), %%mm0\n\t" // value b from top
- "movq (%%"XBX", %%"XCX"), %%mm1\n\t" // value e from bottom
- "movq %%mm0, %%mm2\n\t"
- V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // avg(b,e)
- "movq %%mm0, %%mm3\n\t"
- "psubusb %%mm1, %%mm0\n\t"
- "psubusb %%mm3, %%mm1\n\t"
- "por %%mm1, %%mm0\n\t" // abs(b,e)
-
- "movq %%mm0, %%mm1\n\t"
- "psubusb "_DiffThres", %%mm1\n\t" // nonzero where abs(b,e) > Thres else 0
- "pxor %%mm3, %%mm3\n\t"
- "pcmpeqb %%mm3, %%mm1\n\t" // now ff where abs(b,e) < Thres, else 00
-
- "pand %%mm1, %%mm2\n\t"
- "pand %%mm1, %%mm0\n\t"
-
- "movq %%mm1, %%mm3\n\t"
- "pxor %%mm5, %%mm3\n\t"
- "pand %%mm3, %%mm6\n\t"
- "pand %%mm3, %%mm7\n\t"
- "pand %%mm3, %%mm5\n\t"
-
- "por %%mm1, %%mm5\n\t"
- "por %%mm2, %%mm6\n\t"
- "por %%mm0, %%mm7\n\t"
-
- // bob in any leftovers
- "movq (%%"XBX"), %%mm0\n\t" // value b from top
- "movq (%%"XBX", %%"XCX"), %%mm1\n\t" // value e from bottom
-
-
-// We will also calc here the max/min values to later limit comb
-// so the max excursion will not exceed the Max_Comb constant
-
-#ifdef SKIP_SEARCH
- "movq %%mm0, %%mm2\n\t"
-// pminub %%mm2, %%mm1
- V_PMINUB ("%%mm2", "%%mm1", "%%mm4")
-
-// pmaxub %%mm6, %%mm2 // clip our current results so far to be above this
- V_PMAXUB ("%%mm6", "%%mm2")
- "movq %%mm0, %%mm2\n\t"
- V_PMAXUB ("%%mm2", "%%mm1")
-// pminub %%mm6, %%mm2 // clip our current results so far to be below this
- V_PMINUB ("%%mm6", "%%mm2", "%%mm4")
-
-#else
- "movq %%mm0, %%mm2\n\t"
- "movq (%%"XAX"), %%mm4\n\t"
- "psubusb %%mm4, %%mm2\n\t"
- "psubusb %%mm0, %%mm4\n\t"
- "por %%mm2, %%mm4\n\t" // abs diff
-
- "movq %%mm1, %%mm2\n\t"
- "movq (%%"XAX", %%"XCX"), %%mm3\n\t"
- "psubusb %%mm3, %%mm2\n\t"
- "psubusb %%mm1, %%mm3\n\t"
- "por %%mm2, %%mm3\n\t" // abs diff
-// pmaxub %%mm3, %%mm4 // top or bottom pixel moved most
- V_PMAXUB ("%%mm3", "%%mm4") // top or bottom pixel moved most
- "psubusb "_DiffThres", %%mm3\n\t" // moved more than allowed? or goes to 0?
- "pxor %%mm4, %%mm4\n\t"
- "pcmpeqb %%mm4, %%mm3\n\t" // now ff where low motion, else high motion
-
- "movq %%mm0, %%mm2\n\t"
-// pminub %%mm2, %%mm1
- V_PMINUB ("%%mm2", "%%mm1", "%%mm4")
-
-// pmaxub %%mm6, %%mm2 // clip our current results so far to be above this
- V_PMAXUB ("%%mm6", "%%mm2")
-
- "psubusb %%mm3, %%mm2\n\t" // maybe decrease it to 0000.. if no surround motion
- "movq %%mm2, "_Min_Vals"\n\t"
-
- "movq %%mm0, %%mm2\n\t"
- V_PMAXUB ("%%mm2", "%%mm1")
-// pminub %%mm6, %%mm2 // clip our current results so far to be below this
- V_PMINUB ("%%mm6", "%%mm2", "%%mm4")
- "paddusb %%mm3, %%mm2\n\t" // maybe increase it to ffffff if no surround motion
- "movq %%mm2, "_Max_Vals"\n\t"
-#endif
-
- "movq %%mm0, %%mm2\n\t"
-// pavgb %%mm2, %%mm1 // avg(b,e)
- V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // avg(b,e)
-
- "movq %%mm0, %%mm3\n\t"
- "psubusb %%mm1, %%mm3\n\t"
- "psubusb %%mm0, %%mm1\n\t"
- "por %%mm1, %%mm3\n\t" // abs(b,e)
- "movq %%mm3, %%mm1\n\t" // keep copy of diffs
-
- "pxor %%mm4, %%mm4\n\t"
- "psubusb %%mm7, %%mm3\n\t" // nonzero where new weights bigger, else 0
- "pcmpeqb %%mm4, %%mm3\n\t" // now ff where new better, else 00
- "pcmpeqb %%mm0, %%mm0\n\t"
- "pandn %%mm0, %%mm5\n\t"
- "por %%mm5, %%mm3\n\t"
- "pcmpeqb %%mm3, %%mm4\n\t" // here ff where old better, else 00
-
- "pand %%mm3, %%mm1\n\t"
- "pand %%mm3, %%mm2\n\t"
-
- "pand %%mm4, %%mm6\n\t"
- "pand %%mm4, %%mm7\n\t"
-
- "por %%mm2, %%mm6\n\t" // our x2 value
- "por %%mm1, %%mm7\n\t" // our x2 diffs
- "movq %%mm7, %%mm4\n\t" // save as bob uncertainty indicator
-
-#else
-
- diff[0] = -1;
- diff[1] = -1;
- best[0] = 0;
- best[1] = 0;
- // j, n
- if (ABS (pBob[-2] - pBob[src_pitch2 - 4]) < DiffThres &&
- ABS (pBob[-4] - pBob[src_pitch2 + 4]) > DiffThres) {
- best[0] = (pBob[-2] + pBob[src_pitch2 - 4]) / 2;
- diff[0] = ABS (pBob[-2] - pBob[src_pitch2 - 4]);
- }
- if (ABS (pBob[-1] - pBob[src_pitch2 - 3]) < DiffThres &&
- ABS (pBob[-3] - pBob[src_pitch2 + 5]) > DiffThres) {
- best[1] = (pBob[-1] + pBob[src_pitch2 - 3]) / 2;
- diff[1] = ABS (pBob[-1] - pBob[src_pitch2 - 3]);
- }
-
- // k & m
- if (ABS (pBob[2] - pBob[src_pitch2 + 4]) < DiffThres &&
- ABS (pBob[4] - pBob[src_pitch2 - 4]) > DiffThres) {
- best[0] = (pBob[4] + pBob[src_pitch2 - 4]) / 2;
- diff[0] = ABS (pBob[4] - pBob[src_pitch2 - 4]);
- }
-
- if (ABS (pBob[3] - pBob[src_pitch2 + 5]) < DiffThres &&
- ABS (pBob[5] - pBob[src_pitch2 - 3]) > DiffThres) {
- best[1] = (pBob[5] + pBob[src_pitch2 - 3]) / 2;
- diff[1] = ABS (pBob[5] - pBob[src_pitch2 - 3]);
- }
-
- // c & d
- if (ABS (pBob[0] - pBob[src_pitch2 + 2]) < DiffThres &&
- ABS (pBob[2] - pBob[src_pitch2 - 2]) > DiffThres) {
- best[0] = (pBob[2] + pBob[src_pitch2 - 2]) / 2;
- diff[0] = ABS (pBob[2] - pBob[src_pitch2 - 2]);
- }
-
- if (ABS (pBob[1] - pBob[src_pitch2 + 3]) < DiffThres &&
- ABS (pBob[3] - pBob[src_pitch2 - 1]) > DiffThres) {
- best[1] = (pBob[3] + pBob[src_pitch2 - 1]) / 2;
- diff[1] = ABS (pBob[3] - pBob[src_pitch2 - 1]);
- }
-
- // a & f
- if (ABS (pBob[0] - pBob[src_pitch2 - 2]) < DiffThres &&
- ABS (pBob[-2] - pBob[src_pitch2 + 2]) > DiffThres) {
- best[0] = (pBob[-2] + pBob[src_pitch2 + 2]) / 2;
- diff[0] = ABS (pBob[-2] - pBob[src_pitch2 + 2]);
- }
-
- if (ABS (pBob[1] - pBob[src_pitch2 - 1]) < DiffThres &&
- ABS (pBob[-1] - pBob[src_pitch2 + 3]) > DiffThres) {
- best[1] = (pBob[-1] + pBob[src_pitch2 + 3]) / 2;
- diff[1] = ABS (pBob[-1] - pBob[src_pitch2 + 3]);
- }
-
- // b,e
- if (ABS (pBob[0] - pBob[src_pitch2]) < DiffThres) {
- best[0] = (pBob[0] + pBob[src_pitch2]) / 2;
- diff[0] = ABS (pBob[0] - pBob[src_pitch2]);
- }
-
- if (ABS (pBob[1] - pBob[src_pitch2 + 1]) < DiffThres) {
- best[1] = (pBob[1] + pBob[src_pitch2 + 1]) / 2;
- diff[1] = ABS (pBob[1] - pBob[src_pitch2 + 1]);
- }
-
-
-// We will also calc here the max/min values to later limit comb
-// so the max excursion will not exceed the Max_Comb constant
-
-#ifdef SKIP_SEARCH
- best[0] = CLAMP (best[0], MIN (pBob[src_pitch2], pBob[0]), MAX (pBob[src_pitch2], pBob[0]));
- best[1] = CLAMP (best[1], MIN (pBob[src_pitch2 + 1], pBob[1]), MAX (pBob[src_pitch2 + 1], pBob[1]));
-#else
- mov[0] = MAX (ABS (pBob[0] - pBobP[0]), ABS (pBob[src_pitch2] - pBobP[src_pitch2]));
- mov[1] = MAX (ABS (pBob[1] - pBobP[1]), ABS (pBob[src_pitch2 + 1] - pBobP[src_pitch2 + 1]));
-
- MinVals[0] = 0;
- MinVals[1] = 0;
- MaxVals[0] = 255;
- MaxVals[1] = 255;
- if (mov[0] > DiffThres) {
- MinVals[0] = MAX (MIN (pBob[0], pBob[src_pitch2]), best[0]);
- MaxVals[0] = MIN (MAX (pBob[0], pBob[src_pitch2]), best[0]);
- }
-
- if (mov[1] > DiffThres) {
- MinVals[1] = MAX (MIN (pBob[1], pBob[src_pitch2+1]), best[1]);
- MaxVals[1] = MIN (MAX (pBob[1], pBob[src_pitch2+1]), best[1]);
- }
-
- best[0] = CLAMP (best[0], MIN (pBob[src_pitch2], pBob[0]), MAX (pBob[src_pitch2], pBob[0]));
- best[1] = CLAMP (best[1], MIN (pBob[src_pitch2 + 1], pBob[1]), MAX (pBob[src_pitch2 + 1], pBob[1]));
-#endif
- avg[0] = (pBob[src_pitch2] + pBob[0]) / 2;
- avg[1] = (pBob[src_pitch2 + 1] + pBob[1]) / 2;
- diff2[0] = ABS (pBob[src_pitch2 + 1] - pBob[1]);
- diff2[1] = ABS (pBob[src_pitch2 + 1] - pBob[1]);
-
- if (diff[0] == -1 || diff2[0] < diff[0]) {
- best[0] = avg[0];
- diff[0] = diff2[0];
- }
-
- if (diff[1] == -1 || diff2[1] < diff[1]) {
- best[1] = avg[1];
- diff[1] = diff2[1];
- }
-#endif
diff --git a/gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc b/gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc
deleted file mode 100644
index 89ed39e4..00000000
--- a/gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * GStreamer
- * Copyright (c) 2002 Tom Barry All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Relicensed for GStreamer from GPL to LGPL with permit from Tom Barry.
- * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578
- */
-
-
-#ifndef TopFirst
-#define TopFirst IsOdd
-#endif
-
-#ifdef SEFUNC
-#undef SEFUNC
-#endif
-
-#if defined(IS_MMXEXT)
-#define SEFUNC(x) Search_Effort_MMXEXT_##x(int src_pitch, int dst_pitch, int rowsize, const unsigned char *pWeaveSrc, const unsigned char *pWeaveSrcP, unsigned char *pWeaveDest, int IsOdd, const unsigned char *pCopySrc, const unsigned char *pCopySrcP, int FldHeight)
-#elif defined(IS_3DNOW)
-#define SEFUNC(x) Search_Effort_3DNOW_##x(int src_pitch, int dst_pitch, int rowsize, const unsigned char *pWeaveSrc, const unsigned char *pWeaveSrcP, unsigned char *pWeaveDest, int IsOdd, const unsigned char *pCopySrc, const unsigned char *pCopySrcP, int FldHeight)
-#elif defined(IS_MMX)
-#define SEFUNC(x) Search_Effort_MMX_##x(int src_pitch, int dst_pitch, int rowsize, const unsigned char *pWeaveSrc, const unsigned char *pWeaveSrcP, unsigned char *pWeaveDest, int IsOdd, const unsigned char *pCopySrc, const unsigned char *pCopySrcP, int FldHeight)
-#else
-#define SEFUNC(x) Search_Effort_C_##x(int src_pitch, int dst_pitch, int rowsize, const unsigned char *pWeaveSrc, const unsigned char *pWeaveSrcP, unsigned char *pWeaveDest, int IsOdd, const unsigned char *pCopySrc, const unsigned char *pCopySrcP, int FldHeight)
-#endif
-
-#include "TomsMoCompAll2.inc"
-
-#define USE_STRANGE_BOB
-
-#include "TomsMoCompAll2.inc"
-
-#undef USE_STRANGE_BOB
-
-#undef SEFUNC
-#if defined(IS_MMXEXT)
-#define SEFUNC(x) Search_Effort_MMXEXT_##x(src_pitch, dst_pitch, rowsize, pWeaveSrc, pWeaveSrcP, pWeaveDest, IsOdd, pCopySrc, pCopySrcP, FldHeight)
-#elif defined(IS_3DNOW)
-#define SEFUNC(x) Search_Effort_3DNOW_##x(src_pitch, dst_pitch, rowsize, pWeaveSrc, pWeaveSrcP, pWeaveDest, IsOdd, pCopySrc, pCopySrcP, FldHeight)
-#elif defined(IS_MMX)
-#define SEFUNC(x) Search_Effort_MMX_##x(src_pitch, dst_pitch, rowsize, pWeaveSrc, pWeaveSrcP, pWeaveDest, IsOdd, pCopySrc, pCopySrcP, FldHeight)
-#else
-#define SEFUNC(x) Search_Effort_C_##x(src_pitch, dst_pitch, rowsize, pWeaveSrc, pWeaveSrcP, pWeaveDest, IsOdd, pCopySrc, pCopySrcP, FldHeight)
-#endif
-
-void FUNCT_NAME(GstDeinterlaceMethod *d_method, GstDeinterlace2* object, GstBuffer *outbuf)
-{
- GstDeinterlaceMethodTomsMoComp *self = GST_DEINTERLACE_METHOD_TOMSMOCOMP (d_method);
- long SearchEffort = self->search_effort;
- int UseStrangeBob = self->strange_bob;
- int IsOdd;
- const unsigned char *pWeaveSrc;
- const unsigned char *pWeaveSrcP;
- unsigned char *pWeaveDest;
- const unsigned char *pCopySrc;
- const unsigned char *pCopySrcP;
- unsigned char *pCopyDest;
- int src_pitch;
- int dst_pitch;
- int rowsize;
- int FldHeight;
-
- /* double stride do address just every odd/even scanline */
- src_pitch = object->field_stride;
- dst_pitch = object->row_stride;
- rowsize = object->row_stride;
- FldHeight = object->field_height;
-
- pCopySrc = GST_BUFFER_DATA(object->field_history[object->history_count-1].buf);
- pCopySrcP = GST_BUFFER_DATA(object->field_history[object->history_count-3].buf);
- pWeaveSrc = GST_BUFFER_DATA(object->field_history[object->history_count-2].buf);
- pWeaveSrcP = GST_BUFFER_DATA(object->field_history[object->history_count-4].buf);
-
- /* use bottom field and interlace top field */
- if (object->field_history[object->history_count-2].flags == PICTURE_INTERLACED_BOTTOM) {
- IsOdd = 1;
-
- // if we have an odd field we copy an even field and weave an odd field
- pCopyDest = GST_BUFFER_DATA(outbuf);
- pWeaveDest = pCopyDest + dst_pitch;
- }
- /* do it vice verca */
- else {
-
- IsOdd = 0;
- // if we have an even field we copy an odd field and weave an even field
- pCopyDest = GST_BUFFER_DATA(outbuf) + dst_pitch;
- pWeaveDest = GST_BUFFER_DATA(outbuf);
- }
-
-
- // copy 1st and last weave lines
- Fieldcopy(pWeaveDest, pCopySrc, rowsize,
- 1, dst_pitch*2, src_pitch);
- Fieldcopy(pWeaveDest+(FldHeight-1)*dst_pitch*2,
- pCopySrc+(FldHeight-1)*src_pitch, rowsize,
- 1, dst_pitch*2, src_pitch);
-
-#ifdef USE_VERTICAL_FILTER
- // Vertical Filter currently not implemented for DScaler !!
- // copy 1st and last lines the copy field
- Fieldcopy(pCopyDest, pCopySrc, rowsize,
- 1, dst_pitch*2, src_pitch);
- Fieldcopy(pCopyDest+(FldHeight-1)*dst_pitch*2,
- pCopySrc+(FldHeight-1)*src_pitch, rowsize,
- 1, dst_pitch*2, src_pitch);
-#else
-
- // copy all of the copy field
- Fieldcopy(pCopyDest, pCopySrc, rowsize,
- FldHeight, dst_pitch*2, src_pitch);
-#endif
- // then go fill in the hard part, being variously lazy depending upon
- // SearchEffort
-
- if(!UseStrangeBob) {
- if (SearchEffort == 0)
- {
- SEFUNC(0);
- }
- else if (SearchEffort <= 1)
- {
- SEFUNC(1);
- }
- /* else if (SearchEffort <= 2)
- {
- SEFUNC(2);
- }
- */
- else if (SearchEffort <= 3)
- {
- SEFUNC(3);
- }
- else if (SearchEffort <= 5)
- {
- SEFUNC(5);
- }
- else if (SearchEffort <= 9)
- {
- SEFUNC(9);
- }
- else if (SearchEffort <= 11)
- {
- SEFUNC(11);
- }
- else if (SearchEffort <= 13)
- {
- SEFUNC(13);
- }
- else if (SearchEffort <= 15)
- {
- SEFUNC(15);
- }
- else if (SearchEffort <= 19)
- {
- SEFUNC(19);
- }
- else if (SearchEffort <= 21)
- {
- SEFUNC(21);
- }
- else
- {
- SEFUNC(Max);
- }
- }
- else
- {
- if (SearchEffort == 0)
- {
- SEFUNC(0SB);
- }
- else if (SearchEffort <= 1)
- {
- SEFUNC(1SB);
- }
- /* else if (SearchEffort <= 2)
- {
- SEFUNC(2SB);
- }
- */
- else if (SearchEffort <= 3)
- {
- SEFUNC(3SB);
- }
- else if (SearchEffort <= 5)
- {
- SEFUNC(5SB);
- }
- else if (SearchEffort <= 9)
- {
- SEFUNC(9SB);
- }
- else if (SearchEffort <= 11)
- {
- SEFUNC(11SB);
- }
- else if (SearchEffort <= 13)
- {
- SEFUNC(13SB);
- }
- else if (SearchEffort <= 15)
- {
- SEFUNC(15SB);
- }
- else if (SearchEffort <= 19)
- {
- SEFUNC(19SB);
- }
- else if (SearchEffort <= 21)
- {
- SEFUNC(21SB);
- }
- else
- {
- SEFUNC(MaxSB);
- }
- }
-
-#if defined(BUILD_X86_ASM) && !defined(IS_C)
- __asm__ __volatile__("emms");
-#endif
-}
diff --git a/gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc b/gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc
deleted file mode 100644
index f6344eab..00000000
--- a/gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc
+++ /dev/null
@@ -1,243 +0,0 @@
-// -*- c++ -*-
-
-#ifdef SEARCH_EFFORT_FUNC
-#undef SEARCH_EFFORT_FUNC
-#endif
-
-#ifdef USE_STRANGE_BOB
-#define SEARCH_EFFORT_FUNC(n) SEFUNC(n##SB)
-#else
-#define SEARCH_EFFORT_FUNC(n) SEFUNC(n)
-#endif
-
-static inline int SEARCH_EFFORT_FUNC(0) // we don't try at all ;-)
-{
- //see Search_Effort_Max() for comments
-#define SKIP_SEARCH
-#include "SearchLoopTop.inc"
-#include "SearchLoopBottom.inc"
-#undef SKIP_SEARCH
-}
-
-static inline int SEARCH_EFFORT_FUNC(1)
-{
-#ifdef IS_C
-#define SKIP_SEARCH
-#include "SearchLoopTop.inc"
-#include "SearchLoopBottom.inc"
-#undef SKIP_SEARCH
-#else
- //see Search_Effort_Max() for comments
-#include "SearchLoopTop.inc"
- RESET_CHROMA // pretend chroma diffs was 255 each
-#include "SearchLoop0A.inc"
-#include "SearchLoopBottom.inc"
-#endif
-}
-
-static inline int SEARCH_EFFORT_FUNC(3)
-{
-#ifdef IS_C
-#define SKIP_SEARCH
-#include "SearchLoopTop.inc"
-#include "SearchLoopBottom.inc"
-#undef SKIP_SEARCH
-#else
- //see Search_Effort_Max() for comments
-#include "SearchLoopTop.inc"
-#include "SearchLoopOddA2.inc"
- RESET_CHROMA // pretend chroma diffs was 255 each
-#include "SearchLoop0A.inc"
-#include "SearchLoopBottom.inc"
-#endif
-}
-
-static inline int SEARCH_EFFORT_FUNC(5)
-{
-#ifdef IS_C
-#define SKIP_SEARCH
-#include "SearchLoopTop.inc"
-#include "SearchLoopBottom.inc"
-#undef SKIP_SEARCH
-#else
- //see Search_Effort_Max() for comments
-#include "SearchLoopTop.inc"
-#include "SearchLoopOddA2.inc"
-#include "SearchLoopOddAH2.inc"
- RESET_CHROMA // pretend chroma diffs was 255 each
-#include "SearchLoop0A.inc"
-#include "SearchLoopBottom.inc"
-#endif
-}
-
-// 3x3 search
-static inline int SEARCH_EFFORT_FUNC(9)
-{
-#ifdef IS_C
-#define SKIP_SEARCH
-#include "SearchLoopTop.inc"
-#include "SearchLoopBottom.inc"
-#undef SKIP_SEARCH
-#else
- //see SearchEffortMax() for comments
-#include "SearchLoopTop.inc"
-#include "SearchLoopOddA.inc"
- RESET_CHROMA // pretend chroma diffs was 255 each
-#include "SearchLoopVA.inc"
-#include "SearchLoop0A.inc"
-#include "SearchLoopBottom.inc"
-#endif
-}
-
-// Search 9 with 2 H-half pels added
-static inline int SEARCH_EFFORT_FUNC(11)
-{
-#ifdef IS_C
-#define SKIP_SEARCH
-#include "SearchLoopTop.inc"
-#include "SearchLoopBottom.inc"
-#undef SKIP_SEARCH
-#else
- //see SearchEffortMax() for comments
-#include "SearchLoopTop.inc"
-#include "SearchLoopOddA.inc"
-#include "SearchLoopOddAH2.inc"
- RESET_CHROMA // pretend chroma diffs was 255 each
-#include "SearchLoopVA.inc"
-#include "SearchLoop0A.inc"
-#include "SearchLoopBottom.inc"
-#endif
-}
-
-// Search 11 with 2 V-half pels added
-static inline int SEARCH_EFFORT_FUNC(13)
-{
-#ifdef IS_C
-#define SKIP_SEARCH
-#include "SearchLoopTop.inc"
-#include "SearchLoopBottom.inc"
-#undef SKIP_SEARCH
-#else
- //see SearchEffortMax() for comments
-#include "SearchLoopTop.inc"
-#include "SearchLoopOddA.inc"
-#include "SearchLoopOddAH2.inc"
- RESET_CHROMA // pretend chroma diffs was 255 each
-#include "SearchLoopVAH.inc"
-#include "SearchLoopVA.inc"
-#include "SearchLoop0A.inc"
-#include "SearchLoopBottom.inc"
-#endif
-}
-
-// 5x3
-static inline int SEARCH_EFFORT_FUNC(15)
-{
-#ifdef IS_C
-#define SKIP_SEARCH
-#include "SearchLoopTop.inc"
-#include "SearchLoopBottom.inc"
-#undef SKIP_SEARCH
-#else
- //see SearchEffortMax() for comments
-#include "SearchLoopTop.inc"
-#include "SearchLoopOddA.inc"
- RESET_CHROMA // pretend chroma diffs was 255 each
-#include "SearchLoopEdgeA.inc"
-#include "SearchLoopVA.inc"
-#include "SearchLoop0A.inc"
-#include "SearchLoopBottom.inc"
-#endif
-}
-
-// 5x3 + 4 half pels
-static inline int SEARCH_EFFORT_FUNC(19)
-{
-#ifdef IS_C
-#define SKIP_SEARCH
-#include "SearchLoopTop.inc"
-#include "SearchLoopBottom.inc"
-#undef SKIP_SEARCH
-#else
- //see SearchEffortMax() for comments
-#include "SearchLoopTop.inc"
-#include "SearchLoopOddA.inc"
-#include "SearchLoopOddAH2.inc"
- RESET_CHROMA // pretend chroma diffs was 255 each
-#include "SearchLoopEdgeA.inc"
-#include "SearchLoopVAH.inc"
-#include "SearchLoopVA.inc"
-#include "SearchLoop0A.inc"
-#include "SearchLoopBottom.inc"
-#endif
-}
-
-// Handle one 4x1 block of pixels
-// Search a 7x3 area, no half pels
-
-static inline int SEARCH_EFFORT_FUNC(21)
-{
-#ifdef IS_C
-#define SKIP_SEARCH
-#include "SearchLoopTop.inc"
-#include "SearchLoopBottom.inc"
-#undef SKIP_SEARCH
-#else
- //see SearchLoopTop.inc for comments
-#include "SearchLoopTop.inc"
-
- // odd addresses -- the pixels at odd address wouldn't generate
- // good luma values but we will mask those off
-
-#include "SearchLoopOddA6.inc" // 4 odd v half pels, 3 to left & right
-#include "SearchLoopOddA.inc" // 6 odd pels, 1 to left & right
-
- RESET_CHROMA // pretend chroma diffs was 255 each
-
- // even addresses -- use both luma and chroma from these
- // search averages of 2 pixels left and right
-#include "SearchLoopEdgeA.inc"
- // search vertical line and averages, -1,0,+1
-#include "SearchLoopVA.inc"
- // blend our results and loop
-#include "SearchLoop0A.inc"
-#include "SearchLoopBottom.inc"
-#endif
-}
-
-// Handle one 4x1 block of pixels
-// Search a 9x3 area, no half pels
-static inline int SEARCH_EFFORT_FUNC(Max)
-{
-#ifdef IS_C
-#define SKIP_SEARCH
-#include "SearchLoopTop.inc"
-#include "SearchLoopBottom.inc"
-#undef SKIP_SEARCH
-#else
- //see SearchLoopTop.inc for comments
-#include "SearchLoopTop.inc"
-
- // odd addresses -- the pixels at odd address wouldn't generate
- // good luma values but we will mask those off
-
-#include "SearchLoopOddA6.inc" // 4 odd v half pels, 3 to left & right
-#include "SearchLoopOddA.inc" // 6 odd pels, 1 to left & right
-
- RESET_CHROMA // pretend chroma diffs was 255 each
-
- // even addresses -- use both luma and chroma from these
- // search averages of 4 pixels left and right
-#include "SearchLoopEdgeA8.inc"
- // search averages of 2 pixels left and right
-#include "SearchLoopEdgeA.inc"
- // search vertical line and averages, -1,0,+1
-#include "SearchLoopVA.inc"
- // blend our results and loop
-#include "SearchLoop0A.inc"
-#include "SearchLoopBottom.inc"
-#endif
-}
-
-#undef SEARCH_EFFORT_FUNC
-
diff --git a/gst/deinterlace2/tvtime/tomsmocomp/WierdBob.inc b/gst/deinterlace2/tvtime/tomsmocomp/WierdBob.inc
deleted file mode 100644
index f4bbb830..00000000
--- a/gst/deinterlace2/tvtime/tomsmocomp/WierdBob.inc
+++ /dev/null
@@ -1,286 +0,0 @@
-// -*- c++ -*-
-
- // First, get and save our possible Bob values
- // Assume our pixels are layed out as follows with x the calc'd bob value
- // and the other pixels are from the current field
- //
- // j a b c k current field
- // x calculated line
- // m d e f n current field
- //
- // we calc the bob value as:
- // x2 = either avg(a,f), avg(c,d), avg(b,e), avg(j,n), or avg(k,m)
-
- // selected for the smallest of abs(a,f), abs(c,d), or abs(b,e), etc.
-
-#ifndef IS_C
- // a,f
- "movq -2(%%"XBX"), %%mm0\n\t" // value a from top left
- "movq 2(%%"XBX", %%"XCX"), %%mm1\n\t" // value f from bottom right
- "movq %%mm0, %%mm6\n\t"
-// pavgb %%mm6, %%mm1 // avg(a,f), also best so far
- V_PAVGB ("%%mm6", "%%mm1", "%%mm7", _ShiftMask) // avg(a,f), also best so far
- "movq %%mm0, %%mm7\n\t"
- "psubusb %%mm1, %%mm7\n\t"
- "psubusb %%mm0, %%mm1\n\t"
- "por %%mm1, %%mm7\n\t" // abs diff, also best so far
-
- // c,d
- "movq 2(%%"XBX"), %%mm0\n\t" // value a from top left
- "movq -2(%%"XBX", %%"XCX"), %%mm1\n\t" // value f from bottom right
- "movq %%mm0, %%mm2\n\t"
-// pavgb %%mm2, %%mm1 // avg(c,d)
- V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // avg(c,d)
- "movq %%mm0, %%mm3\n\t"
- "psubusb %%mm1, %%mm3\n\t"
- "psubusb %%mm0, %%mm1\n\t"
- "por %%mm1, %%mm3\n\t" // abs(c,d)
- "movq %%mm3, %%mm1\n\t" // keep copy
-
- "psubusb %%mm7, %%mm3\n\t" // nonzero where new weights bigger, else 0
- "pxor %%mm4, %%mm4\n\t"
- "pcmpeqb %%mm4, %%mm3\n\t" // now ff where new better, else 00
- "pcmpeqb %%mm3, %%mm4\n\t" // here ff where old better, else 00
-
- "pand %%mm3, %%mm1\n\t" // keep only better new avg and abs
- "pand %%mm3, %%mm2\n\t"
-
- "pand %%mm4, %%mm6\n\t"
- "pand %%mm4, %%mm7\n\t"
-
- "por %%mm2, %%mm6\n\t" // and merge new & old vals keeping best
- "por %%mm1, %%mm7\n\t"
- "por "_UVMask", %%mm7\n\t" // but we know chroma is worthless so far
- "pand "_YMask", %%mm5\n\t" // mask out chroma from here also
-
- // j,n
- "movq -4(%%"XBX"), %%mm0\n\t" // value j from top left
- "movq 4(%%"XBX", %%"XCX"), %%mm1\n\t" // value n from bottom right
- "movq %%mm0, %%mm2\n\t"
-// pavgb %%mm2, %%mm1 // avg(j,n)
- V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // avg(j,n)
- "movq %%mm0, %%mm3\n\t"
- "psubusb %%mm1, %%mm3\n\t"
- "psubusb %%mm0, %%mm1\n\t"
- "por %%mm1, %%mm3\n\t" // abs(j-n)
- "movq %%mm3, %%mm1\n\t" // keep copy
-
- "psubusb %%mm7, %%mm3\n\t" // nonzero where new weights bigger, else 0
- "pxor %%mm4, %%mm4\n\t"
- "pcmpeqb %%mm4, %%mm3\n\t" // now ff where new better, else 00
- "pcmpeqb %%mm3, %%mm4\n\t" // here ff where old better, else 00
-
- "pand %%mm3, %%mm1\n\t" // keep only better new avg and abs
- "pand %%mm2, %%mm3\n\t"
-
- "pand %%mm4, %%mm6\n\t"
- "pand %%mm4, %%mm7\n\t"
-
- "por %%mm3, %%mm6\n\t" // and merge new & old vals keeping best
- "por %%mm1, %%mm7\n\t" // "
-
- // k, m
- "movq 4(%%"XBX"), %%mm0\n\t" // value k from top right
- "movq -4(%%"XBX", %%"XCX"), %%mm1\n\t" // value n from bottom left
- "movq %%mm0, %%mm4\n\t"
-// pavgb %%mm4, %%mm1 // avg(k,m)
- V_PAVGB ("%%mm4", "%%mm1", "%%mm3", _ShiftMask) // avg(k,m)
-
- "movq %%mm0, %%mm3\n\t"
- "psubusb %%mm1, %%mm3\n\t"
- "psubusb %%mm0, %%mm1\n\t"
- "por %%mm1, %%mm3\n\t" // abs(k,m)
- "movq %%mm3, %%mm1\n\t" // keep copy
-
- "movq %%mm4, %%mm2\n\t" // avg(k,m)
-
- "psubusb %%mm7, %%mm3\n\t" // nonzero where new weights bigger, else 0
- "pxor %%mm4, %%mm4\n\t"
- "pcmpeqb %%mm4, %%mm3\n\t" // now ff where new better, else 00
- "pcmpeqb %%mm3, %%mm4\n\t" // here ff where old better, else 00
-
- "pand %%mm3, %%mm1\n\t" // keep only better new avg and abs
- "pand %%mm2, %%mm3\n\t"
-
- "pand %%mm4, %%mm6\n\t"
- "pand %%mm4, %%mm7\n\t"
-
- "por %%mm3, %%mm6\n\t" // and merge new & old vals keeping best
- "por %%mm1, %%mm7\n\t" // "
-
- // b,e
- "movq (%%"XBX"), %%mm0\n\t" // value b from top
- "movq (%%"XBX", %%"XCX"), %%mm1\n\t" // value e from bottom
-
-// We will also calc here the max/min values to later limit comb
-// so the max excursion will not exceed the Max_Comb constant
-
-#ifdef SKIP_SEARCH
- "movq %%mm0, %%mm2\n\t"
-// pminub %%mm2, %%mm1
- V_PMINUB ("%%mm2", "%%mm1", "%%mm4")
-
-// pmaxub %%mm6, %%mm2 // clip our current results so far to be above this
- V_PMAXUB ("%%mm6", "%%mm2")
- "movq %%mm0, %%mm2\n\t"
- V_PMAXUB ("%%mm2", "%%mm1")
-// pminub %%mm6, %%mm2 // clip our current results so far to be below this
- V_PMINUB ("%%mm6", "%%mm2", "%%mm4")
-
-#else
- "movq %%mm0, %%mm2\n\t"
- "movq (%%"XAX"), %%mm4\n\t"
- "psubusb %%mm4, %%mm2\n\t"
- "psubusb %%mm0, %%mm4\n\t"
- "por %%mm2, %%mm4\n\t" // abs diff
-
- "movq %%mm1, %%mm2\n\t"
- "movq (%%"XAX", %%"XCX"), %%mm3\n\t"
- "psubusb %%mm3, %%mm2\n\t"
- "psubusb %%mm1, %%mm3\n\t"
- "por %%mm2, %%mm3\n\t" // abs diff
-// pmaxub %%mm3, %%mm4 // top or bottom pixel moved most
- V_PMAXUB ("%%mm3", "%%mm4") // top or bottom pixel moved most
- "psubusb "_Max_Mov", %%mm3\n\t" // moved more than allowed? or goes to 0?
- "pxor %%mm4, %%mm4\n\t"
- "pcmpeqb %%mm4, %%mm3\n\t" // now ff where low motion, else high motion
-
- "movq %%mm0, %%mm2\n\t"
-// pminub %%mm2, %%mm1
- V_PMINUB ("%%mm2", "%%mm1", "%%mm4")
-
-// pmaxub %%mm6, %%mm2 // clip our current results so far to be above this
- V_PMAXUB ("%%mm6", "%%mm2")
-
- "psubusb %%mm3, %%mm2\n\t" // maybe decrease it to 0000.. if no surround motion
- "movq %%mm2, "_Min_Vals"\n\t"
-
- "movq %%mm0, %%mm2\n\t"
- V_PMAXUB ("%%mm2", "%%mm1")
-// pminub %%mm6, %%mm2 // clip our current results so far to be below this
- V_PMINUB ("%%mm6", "%%mm2", "%%mm4")
- "paddusb %%mm3, %%mm2\n\t" // maybe increase it to ffffff if no surround motion
- "movq %%mm2, "_Max_Vals"\n\t"
-#endif
-
- "movq %%mm0, %%mm2\n\t"
-// pavgb %%mm2, %%mm1 // avg(b,e)
- V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // avg(b,e)
-
- "movq %%mm0, %%mm3\n\t"
- "psubusb %%mm1, %%mm3\n\t"
- "psubusb %%mm0, %%mm1\n\t"
- "por %%mm1, %%mm3\n\t" // abs(c,d)
- "movq %%mm3, %%mm1\n\t" // keep copy of diffs
-
- "pxor %%mm4, %%mm4\n\t"
- "psubusb %%mm7, %%mm3\n\t" // nonzero where new weights bigger, else 0
- "pcmpeqb %%mm4, %%mm3\n\t" // now ff where new better, else 00
-
- "pcmpeqb %%mm3, %%mm4\n\t" // here ff where old better, else 00
-
- "pand %%mm3, %%mm1\n\t"
- "pand %%mm3, %%mm2\n\t"
-
- "pand %%mm4, %%mm6\n\t"
- "pand %%mm4, %%mm7\n\t"
-
- "por %%mm2, %%mm6\n\t" // our x2 value
- "por %%mm1, %%mm7\n\t" // our x2 diffs
- "movq %%mm7, %%mm4\n\t" // save as bob uncertainty indicator
-
-#else
-
- // a,f
- best[0] = (pBob[-2] + pBob[src_pitch2 + 2]) / 2;
- diff[0] = ABS (pBob[-2] - pBob[src_pitch2 + 2]);
- best[1] = (pBob[-1] + pBob[src_pitch2 + 3]) / 2;
- diff[1] = ABS (pBob[-1] - pBob[src_pitch2 + 3]);
-
- // c,d
- if (ABS (pBob[2] - pBob[src_pitch2 - 2]) < diff[0]) {
- best[0] = (pBob[2] + pBob[src_pitch2 - 2]) / 2;
- diff[0] = ABS (pBob[2] - pBob[src_pitch2 - 2]);
- }
-
- if (ABS (pBob[3] - pBob[src_pitch2 - 1]) < diff[1]) {
- best[1] = (pBob[3] + pBob[src_pitch2 - 1]) / 2;
- diff[1] = ABS (pBob[3] - pBob[src_pitch2 - 1]);
- }
-
- // j,n
- if (ABS (pBob[-4] - pBob[src_pitch2 + 4]) < diff[0]) {
- best[0] = (pBob[-4] + pBob[src_pitch2 + 4]) / 2;
- diff[0] = ABS (pBob[-4] - pBob[src_pitch2 + 4]);
- }
-
- if (ABS (pBob[-3] - pBob[src_pitch2 + 5]) < diff[1]) {
- best[1] = (pBob[-3] + pBob[src_pitch2 + 5]) / 2;
- diff[1] = ABS (pBob[-3] - pBob[src_pitch2 + 5]);
- }
-
- // k,m
- if (ABS (pBob[4] - pBob[src_pitch2 - 4]) < diff[0]) {
- best[0] = (pBob[4] + pBob[src_pitch2 - 4]) / 2;
- diff[0] = ABS (pBob[-4] - pBob[src_pitch2 - 4]);
- }
-
- if (ABS (pBob[5] - pBob[src_pitch2 - 3]) < diff[1]) {
- best[1] = (pBob[5] + pBob[src_pitch2 - 3]) / 2;
- diff[1] = ABS (pBob[-3] - pBob[src_pitch2 - 3]);
- }
- // k,m
- if (ABS (pBob[4] - pBob[src_pitch2 - 4]) < diff[0]) {
- best[0] = (pBob[4] + pBob[src_pitch2 - 4]) / 2;
- diff[0] = ABS (pBob[-4] - pBob[src_pitch2 - 4]);
- }
-
- if (ABS (pBob[5] - pBob[src_pitch2 - 3]) < diff[1]) {
- best[1] = (pBob[5] + pBob[src_pitch2 - 3]) / 2;
- diff[1] = ABS (pBob[-3] - pBob[src_pitch2 - 3]);
- }
-
-// We will also calc here the max/min values to later limit comb
-// so the max excursion will not exceed the Max_Comb constant
-
-#ifdef SKIP_SEARCH
- best[0] = CLAMP (best[0], MIN (pBob[src_pitch2], pBob[0]), MAX (pBob[src_pitch2], pBob[0]));
- best[1] = CLAMP (best[1], MIN (pBob[src_pitch2 + 1], pBob[1]), MAX (pBob[src_pitch2 + 1], pBob[1]));
-#else
- mov[0] = MAX (ABS (pBob[0] - pBobP[0]), ABS (pBob[src_pitch2] - pBobP[src_pitch2]));
- mov[1] = MAX (ABS (pBob[1] - pBobP[1]), ABS (pBob[src_pitch2 + 1] - pBobP[src_pitch2 + 1]));
-
- MinVals[0] = 0;
- MinVals[1] = 0;
- MaxVals[0] = 255;
- MaxVals[1] = 255;
-
- if (mov[0] > Max_Mov[0]) {
- MinVals[0] = MAX (MIN (pBob[0], pBob[src_pitch2]), best[0]);
- MaxVals[0] = MIN (MAX (pBob[0], pBob[src_pitch2]), best[0]);
- }
-
- if (mov[1] > Max_Mov[1]) {
- MinVals[1] = MAX (MIN (pBob[1], pBob[src_pitch2 + 1]), best[1]);
- MaxVals[1] = MIN (MAX (pBob[1], pBob[src_pitch2 + 1]), best[1]);
- }
-
- best[0] = CLAMP (best[0], MIN (pBob[src_pitch2], pBob[0]), MAX (pBob[src_pitch2], pBob[0]));
- best[1] = CLAMP (best[1], MIN (pBob[src_pitch2 + 1], pBob[1]), MAX (pBob[src_pitch2 + 1], pBob[1]));
-#endif
-
- avg[0] = (pBob[src_pitch2] + pBob[0]) / 2;
- avg[1] = (pBob[src_pitch2 + 1] + pBob[1]) / 2;
- diff2[0] = ABS (pBob[src_pitch2] - pBob[0]);
- diff2[1] = ABS (pBob[src_pitch2 + 1] - pBob[1]);
-
- if (diff2[0] < diff[0]) {
- best[0] = avg[0];
- diff[0] = diff2[0];
- }
-
- if (diff2[1] < diff[1]) {
- best[1] = avg[1];
- diff[1] = diff2[1];
- }
-#endif
diff --git a/gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h b/gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h
deleted file mode 100644
index 7e8147ec..00000000
--- a/gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h
+++ /dev/null
@@ -1,164 +0,0 @@
-#include <string.h>
-#include <math.h>
-
-// Define a few macros for CPU dependent instructions.
-// I suspect I don't really understand how the C macro preprocessor works but
-// this seems to get the job done. // TRB 7/01
-
-// BEFORE USING THESE YOU MUST SET:
-
-// #define SIMD_TYPE MMXEXT (or MMX or 3DNOW)
-
-// some macros for pavgb instruction
-// V_PAVGB(mmr1, mmr2, mmr work register, smask) mmr2 may = mmrw if you can trash it
-
-#define V_PAVGB_MMX(mmr1, mmr2, mmrw, smask) \
- "movq "mmr2", "mmrw"\n\t" \
- "pand "smask", "mmrw"\n\t" \
- "psrlw $1, "mmrw"\n\t" \
- "pand "smask", "mmr1"\n\t" \
- "psrlw $1, "mmr1"\n\t" \
- "paddusb "mmrw", "mmr1"\n\t"
-#define V_PAVGB_MMXEXT(mmr1, mmr2, mmrw, smask) "pavgb "mmr2", "mmr1"\n\t"
-#define V_PAVGB_3DNOW(mmr1, mmr2, mmrw, smask) "pavgusb "mmr2", "mmr1"\n\t"
-#define V_PAVGB(mmr1, mmr2, mmrw, smask) V_PAVGB2(mmr1, mmr2, mmrw, smask, SIMD_TYPE)
-#define V_PAVGB2(mmr1, mmr2, mmrw, smask, simd_type) V_PAVGB3(mmr1, mmr2, mmrw, smask, simd_type)
-#define V_PAVGB3(mmr1, mmr2, mmrw, smask, simd_type) V_PAVGB_##simd_type(mmr1, mmr2, mmrw, smask)
-
-// some macros for pmaxub instruction
-#define V_PMAXUB_MMX(mmr1, mmr2) \
- "psubusb "mmr2", "mmr1"\n\t" \
- "paddusb "mmr2", "mmr1"\n\t"
-#define V_PMAXUB_MMXEXT(mmr1, mmr2) "pmaxub "mmr2", "mmr1"\n\t"
-#define V_PMAXUB_3DNOW(mmr1, mmr2) V_PMAXUB_MMX(mmr1, mmr2) // use MMX version
-#define V_PMAXUB(mmr1, mmr2) V_PMAXUB2(mmr1, mmr2, SIMD_TYPE)
-#define V_PMAXUB2(mmr1, mmr2, simd_type) V_PMAXUB3(mmr1, mmr2, simd_type)
-#define V_PMAXUB3(mmr1, mmr2, simd_type) V_PMAXUB_##simd_type(mmr1, mmr2)
-
-// some macros for pminub instruction
-// V_PMINUB(mmr1, mmr2, mmr work register) mmr2 may NOT = mmrw
-#define V_PMINUB_MMX(mmr1, mmr2, mmrw) \
- "pcmpeqb "mmrw", "mmrw"\n\t" \
- "psubusb "mmr2", "mmrw"\n\t" \
- "paddusb "mmrw", "mmr1"\n\t" \
- "psubusb "mmrw", "mmr1"\n\t"
-#define V_PMINUB_MMXEXT(mmr1, mmr2, mmrw) "pminub "mmr2", "mmr1"\n\t"
-#define V_PMINUB_3DNOW(mmr1, mmr2, mmrw) V_PMINUB_MMX(mmr1, mmr2, mmrw) // use MMX version
-#define V_PMINUB(mmr1, mmr2, mmrw) V_PMINUB2(mmr1, mmr2, mmrw, SIMD_TYPE)
-#define V_PMINUB2(mmr1, mmr2, mmrw, simd_type) V_PMINUB3(mmr1, mmr2, mmrw, simd_type)
-#define V_PMINUB3(mmr1, mmr2, mmrw, simd_type) V_PMINUB_##simd_type(mmr1, mmr2, mmrw)
-
-// some macros for movntq instruction
-// V_MOVNTQ(mmr1, mmr2)
-#define V_MOVNTQ_MMX(mmr1, mmr2) "movq "mmr2", "mmr1"\n\t"
-#define V_MOVNTQ_3DNOW(mmr1, mmr2) "movq "mmr2", "mmr1"\n\t"
-#define V_MOVNTQ_MMXEXT(mmr1, mmr2) "movntq "mmr2", "mmr1"\n\t"
-#define V_MOVNTQ(mmr1, mmr2) V_MOVNTQ2(mmr1, mmr2, SIMD_TYPE)
-#define V_MOVNTQ2(mmr1, mmr2, simd_type) V_MOVNTQ3(mmr1, mmr2, simd_type)
-#define V_MOVNTQ3(mmr1, mmr2, simd_type) V_MOVNTQ_##simd_type(mmr1, mmr2)
-
-// end of macros
-
-#ifdef IS_SSE2
-
-#define MERGE4PIXavg(PADDR1, PADDR2) \
- "movdqu "PADDR1", %%xmm0\n\t" /* our 4 pixels */ \
- "movdqu "PADDR2", %%xmm1\n\t" /* our pixel2 value */ \
- "movdqa %%xmm0, %%xmm2\n\t" /* another copy of our pixel1 value */ \
- "movdqa %%xmm1, %%xmm3\n\t" /* another copy of our pixel1 value */ \
- "psubusb %%xmm1, %%xmm2\n\t" \
- "psubusb %%xmm0, %%xmm3\n\t" \
- "por %%xmm3, %%xmm2\n\t" \
- "pavgb %%xmm1, %%xmm0\n\t" /* avg of 2 pixels */ \
- "movdqa %%xmm2, %%xmm3\n\t" /* another copy of our our weights */ \
- "pxor %%xmm1, %%xmm1\n\t" \
- "psubusb %%xmm7, %%xmm3\n\t" /* nonzero where old weights lower, else 0 */ \
- "pcmpeqb %%xmm1, %%xmm3\n\t" /* now ff where new better, else 00 */ \
- "pcmpeqb %%xmm3, %%xmm1\n\t" /* here ff where old better, else 00 */ \
- "pand %%xmm3, %%xmm0\n\t" /* keep only better new pixels */ \
- "pand %%xmm3, %%xmm2\n\t" /* and weights */ \
- "pand %%xmm1, %%xmm5\n\t" /* keep only better old pixels */ \
- "pand %%xmm1, %%xmm7\n\t" \
- "por %%xmm0, %%xmm5\n\t" /* and merge new & old vals */ \
- "por %%xmm2, %%xmm7\n\t"
-
-#define MERGE4PIXavgH(PADDR1A, PADDR1B, PADDR2A, PADDR2B) \
- "movdqu "PADDR1A", %%xmm0\n\t" /* our 4 pixels */ \
- "movdqu "PADDR2A", %%xmm1\n\t" /* our pixel2 value */ \
- "movdqu "PADDR1B", %%xmm2\n\t" /* our 4 pixels */ \
- "movdqu "PADDR2B", %%xmm3\n\t" /* our pixel2 value */ \
- "pavgb %%xmm2, %%xmm0\n\t" \
- "pavgb %%xmm3, %%xmm1\n\t" \
- "movdqa %%xmm0, %%xmm2\n\t" /* another copy of our pixel1 value */ \
- "movdqa %%xmm1, %%xmm3\n\t" /* another copy of our pixel1 value */ \
- "psubusb %%xmm1, %%xmm2\n\t" \
- "psubusb %%xmm0, %%xmm3\n\t" \
- "por %%xmm3, %%xmm2\n\t" \
- "pavgb %%xmm1, %%xmm0\n\t" /* avg of 2 pixels */ \
- "movdqa %%xmm2, %%xmm3\n\t" /* another copy of our our weights */ \
- "pxor %%xmm1, %%xmm1\n\t" \
- "psubusb %%xmm7, %%xmm3\n\t" /* nonzero where old weights lower, else 0 */ \
- "pcmpeqb %%xmm1, %%xmm3\n\t" /* now ff where new better, else 00 */ \
- "pcmpeqb %%xmm3, %%xmm1\n\t" /* here ff where old better, else 00 */ \
- "pand %%xmm3, %%xmm0\n\t" /* keep only better new pixels */ \
- "pand %%xmm3, %%xmm2\n\t" /* and weights */ \
- "pand %%xmm1, %%xmm5\n\t" /* keep only better old pixels */ \
- "pand %%xmm1, %%xmm7\n\t" \
- "por %%xmm0, %%xmm5\n\t" /* and merge new & old vals */ \
- "por %%xmm2, %%xmm7\n\t"
-
-#define RESET_CHROMA "por "_UVMask", %%xmm7\n\t"
-
-#else // ifdef IS_SSE2
-
-#define MERGE4PIXavg(PADDR1, PADDR2) \
- "movq "PADDR1", %%mm0\n\t" /* our 4 pixels */ \
- "movq "PADDR2", %%mm1\n\t" /* our pixel2 value */ \
- "movq %%mm0, %%mm2\n\t" /* another copy of our pixel1 value */ \
- "movq %%mm1, %%mm3\n\t" /* another copy of our pixel1 value */ \
- "psubusb %%mm1, %%mm2\n\t" \
- "psubusb %%mm0, %%mm3\n\t" \
- "por %%mm3, %%mm2\n\t" \
- V_PAVGB ("%%mm0", "%%mm1", "%%mm3", _ShiftMask) /* avg of 2 pixels */ \
- "movq %%mm2, %%mm3\n\t" /* another copy of our our weights */ \
- "pxor %%mm1, %%mm1\n\t" \
- "psubusb %%mm7, %%mm3\n\t" /* nonzero where old weights lower, else 0 */ \
- "pcmpeqb %%mm1, %%mm3\n\t" /* now ff where new better, else 00 */ \
- "pcmpeqb %%mm3, %%mm1\n\t" /* here ff where old better, else 00 */ \
- "pand %%mm3, %%mm0\n\t" /* keep only better new pixels */ \
- "pand %%mm3, %%mm2\n\t" /* and weights */ \
- "pand %%mm1, %%mm5\n\t" /* keep only better old pixels */ \
- "pand %%mm1, %%mm7\n\t" \
- "por %%mm0, %%mm5\n\t" /* and merge new & old vals */ \
- "por %%mm2, %%mm7\n\t"
-
-#define MERGE4PIXavgH(PADDR1A, PADDR1B, PADDR2A, PADDR2B) \
- "movq "PADDR1A", %%mm0\n\t" /* our 4 pixels */ \
- "movq "PADDR2A", %%mm1\n\t" /* our pixel2 value */ \
- "movq "PADDR1B", %%mm2\n\t" /* our 4 pixels */ \
- "movq "PADDR2B", %%mm3\n\t" /* our pixel2 value */ \
- V_PAVGB("%%mm0", "%%mm2", "%%mm2", _ShiftMask) \
- V_PAVGB("%%mm1", "%%mm3", "%%mm3", _ShiftMask) \
- "movq %%mm0, %%mm2\n\t" /* another copy of our pixel1 value */ \
- "movq %%mm1, %%mm3\n\t" /* another copy of our pixel1 value */ \
- "psubusb %%mm1, %%mm2\n\t" \
- "psubusb %%mm0, %%mm3\n\t" \
- "por %%mm3, %%mm2\n\t" \
- V_PAVGB("%%mm0", "%%mm1", "%%mm3", _ShiftMask) /* avg of 2 pixels */ \
- "movq %%mm2, %%mm3\n\t" /* another copy of our our weights */ \
- "pxor %%mm1, %%mm1\n\t" \
- "psubusb %%mm7, %%mm3\n\t" /* nonzero where old weights lower, else 0 */ \
- "pcmpeqb %%mm1, %%mm3\n\t" /* now ff where new better, else 00 */ \
- "pcmpeqb %%mm3, %%mm1\n\t" /* here ff where old better, else 00 */ \
- "pand %%mm3, %%mm0\n\t" /* keep only better new pixels */ \
- "pand %%mm3, %%mm2\n\t" /* and weights */ \
- "pand %%mm1, %%mm5\n\t" /* keep only better old pixels */ \
- "pand %%mm1, %%mm7\n\t" \
- "por %%mm0, %%mm5\n\t" /* and merge new & old vals */ \
- "por %%mm2, %%mm7\n\t"
-
-#define RESET_CHROMA "por "_UVMask", %%mm7\n\t"
-
-#endif
-
-
diff --git a/gst/deinterlace2/tvtime/vfir.c b/gst/deinterlace2/tvtime/vfir.c
deleted file mode 100644
index 56950459..00000000
--- a/gst/deinterlace2/tvtime/vfir.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- *
- * GStreamer
- * Copyright (C) 2004 Billy Biggs <vektor@dumbterm.net>
- * Copyright (c) 2001, 2002, 2003 Fabrice Bellard.
- * Copyright (C) 2008 Sebastian Dröge <slomo@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.
- */
-
-/*
- * This file contains code from ffmpeg, see http://ffmpeg.org/ (LGPL)
- * and modifications by Billy Biggs.
- *
- * Relicensed for GStreamer from GPL to LGPL with permit from Billy Biggs.
- * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "_stdint.h"
-#include "gstdeinterlace2.h"
-#include <string.h>
-
-#define GST_TYPE_DEINTERLACE_METHOD_VFIR (gst_deinterlace_method_vfir_get_type ())
-#define GST_IS_DEINTERLACE_METHOD_VFIR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_VFIR))
-#define GST_IS_DEINTERLACE_METHOD_VFIR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_VFIR))
-#define GST_DEINTERLACE_METHOD_VFIR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_VFIR, GstDeinterlaceMethodVFIRClass))
-#define GST_DEINTERLACE_METHOD_VFIR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_VFIR, GstDeinterlaceMethodVFIR))
-#define GST_DEINTERLACE_METHOD_VFIR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_VFIR, GstDeinterlaceMethodVFIRClass))
-#define GST_DEINTERLACE_METHOD_VFIR_CAST(obj) ((GstDeinterlaceMethodVFIR*)(obj))
-
-GType gst_deinterlace_method_vfir_get_type (void);
-
-typedef GstDeinterlaceSimpleMethod GstDeinterlaceMethodVFIR;
-
-typedef GstDeinterlaceSimpleMethodClass GstDeinterlaceMethodVFIRClass;
-
-/*
- * The MPEG2 spec uses a slightly harsher filter, they specify
- * [-1 8 2 8 -1]. ffmpeg uses a similar filter but with more of
- * a tendancy to blur than to use the local information. The
- * filter taps here are: [-1 4 2 4 -1].
- */
-
-/**
- * C implementation.
- */
-static inline void
-deinterlace_line_c (GstDeinterlaceMethod * self, GstDeinterlace2 * parent,
- guint8 * dst, GstDeinterlaceScanlineData * scanlines, gint width)
-{
- gint sum;
- guint8 *lum_m4 = scanlines->tt1;
- guint8 *lum_m3 = scanlines->t0;
- guint8 *lum_m2 = scanlines->m1;
- guint8 *lum_m1 = scanlines->b0;
- guint8 *lum = scanlines->bb1;
- gint size = width * 2;
-
- for (; size >= 0; size--) {
- sum = -lum_m4[0];
- sum += lum_m3[0] << 2;
- sum += lum_m2[0] << 1;
- sum += lum_m1[0] << 2;
- sum += -lum[0];
- dst[0] = (sum + 4) >> 3; // This needs to be clipped at 0 and 255: cm[(sum + 4) >> 3];
- lum_m4++;
- lum_m3++;
- lum_m2++;
- lum_m1++;
- lum++;
- dst++;
- }
-}
-
-#ifdef BUILD_X86_ASM
-#include "mmx.h"
-static void
-deinterlace_line_mmx (GstDeinterlaceMethod * self, GstDeinterlace2 * parent,
- guint8 * dst, GstDeinterlaceScanlineData * scanlines, gint width)
-{
- mmx_t rounder;
- guint8 *lum_m4 = scanlines->tt1;
- guint8 *lum_m3 = scanlines->t0;
- guint8 *lum_m2 = scanlines->m1;
- guint8 *lum_m1 = scanlines->b0;
- guint8 *lum = scanlines->bb1;
-
- rounder.uw[0] = 4;
- rounder.uw[1] = 4;
- rounder.uw[2] = 4;
- rounder.uw[3] = 4;
- pxor_r2r (mm7, mm7);
- movq_m2r (rounder, mm6);
-
- for (; width > 1; width -= 2) {
- movd_m2r (*lum_m4, mm0);
- movd_m2r (*lum_m3, mm1);
- movd_m2r (*lum_m2, mm2);
- movd_m2r (*lum_m1, mm3);
- movd_m2r (*lum, mm4);
- punpcklbw_r2r (mm7, mm0);
- punpcklbw_r2r (mm7, mm1);
- punpcklbw_r2r (mm7, mm2);
- punpcklbw_r2r (mm7, mm3);
- punpcklbw_r2r (mm7, mm4);
- paddw_r2r (mm3, mm1);
- psllw_i2r (1, mm2);
- paddw_r2r (mm4, mm0);
- psllw_i2r (2, mm1); // 2
- paddw_r2r (mm6, mm2);
- paddw_r2r (mm2, mm1);
- psubusw_r2r (mm0, mm1);
- psrlw_i2r (3, mm1); // 3
- packuswb_r2r (mm7, mm1);
- movd_r2m (mm1, *dst);
- lum_m4 += 4;
- lum_m3 += 4;
- lum_m2 += 4;
- lum_m1 += 4;
- lum += 4;
- dst += 4;
- }
- emms ();
-
- /* Handle odd widths */
- if (width > 0) {
- scanlines->tt1 = lum_m4;
- scanlines->t0 = lum_m3;
- scanlines->m1 = lum_m2;
- scanlines->b0 = lum_m1;
- scanlines->bb1 = lum;
-
- deinterlace_line_c (self, parent, dst, scanlines, width);
- }
-}
-#endif
-
-G_DEFINE_TYPE (GstDeinterlaceMethodVFIR, gst_deinterlace_method_vfir,
- GST_TYPE_DEINTERLACE_SIMPLE_METHOD);
-
-static void
-gst_deinterlace_method_vfir_class_init (GstDeinterlaceMethodVFIRClass * klass)
-{
- GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass;
- GstDeinterlaceSimpleMethodClass *dism_class =
- (GstDeinterlaceSimpleMethodClass *) klass;
-#ifdef BUILD_X86_ASM
- guint cpu_flags = oil_cpu_get_flags ();
-#endif
-
- dim_class->fields_required = 2;
- dim_class->name = "Blur Vertical";
- dim_class->nick = "vfir";
- dim_class->latency = 0;
-
-#ifdef BUILD_X86_ASM
- if (cpu_flags & OIL_IMPL_FLAG_MMX) {
- dism_class->interpolate_scanline = deinterlace_line_mmx;
- } else {
- dism_class->interpolate_scanline = deinterlace_line_c;
- }
-#else
- dism_class->interpolate_scanline = deinterlace_line_c;
-#endif
-}
-
-static void
-gst_deinterlace_method_vfir_init (GstDeinterlaceMethodVFIR * self)
-{
-}
diff --git a/gst/deinterlace2/tvtime/weave.c b/gst/deinterlace2/tvtime/weave.c
deleted file mode 100644
index 09732a3a..00000000
--- a/gst/deinterlace2/tvtime/weave.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * Weave frames
- * Copyright (C) 2002 Billy Biggs <vektor@dumbterm.net>.
- * Copyright (C) 2008 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 Lesser 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "_stdint.h"
-#include "gstdeinterlace2.h"
-#include <string.h>
-
-#define GST_TYPE_DEINTERLACE_METHOD_WEAVE (gst_deinterlace_method_weave_get_type ())
-#define GST_IS_DEINTERLACE_METHOD_WEAVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_WEAVE))
-#define GST_IS_DEINTERLACE_METHOD_WEAVE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_WEAVE))
-#define GST_DEINTERLACE_METHOD_WEAVE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_WEAVE, GstDeinterlaceMethodWeaveClass))
-#define GST_DEINTERLACE_METHOD_WEAVE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_WEAVE, GstDeinterlaceMethodWeave))
-#define GST_DEINTERLACE_METHOD_WEAVE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_WEAVE, GstDeinterlaceMethodWeaveClass))
-#define GST_DEINTERLACE_METHOD_WEAVE_CAST(obj) ((GstDeinterlaceMethodWeave*)(obj))
-
-GType gst_deinterlace_method_weave_get_type (void);
-
-typedef GstDeinterlaceSimpleMethod GstDeinterlaceMethodWeave;
-
-typedef GstDeinterlaceSimpleMethodClass GstDeinterlaceMethodWeaveClass;
-
-
-static void
-deinterlace_scanline_weave (GstDeinterlaceMethod * self,
- GstDeinterlace2 * parent, guint8 * out,
- GstDeinterlaceScanlineData * scanlines, gint width)
-{
- oil_memcpy (out, scanlines->m1, parent->row_stride);
-}
-
-static void
-copy_scanline (GstDeinterlaceMethod * self, GstDeinterlace2 * parent,
- guint8 * out, GstDeinterlaceScanlineData * scanlines, gint width)
-{
- oil_memcpy (out, scanlines->m0, parent->row_stride);
-}
-
-G_DEFINE_TYPE (GstDeinterlaceMethodWeave, gst_deinterlace_method_weave,
- GST_TYPE_DEINTERLACE_SIMPLE_METHOD);
-
-static void
-gst_deinterlace_method_weave_class_init (GstDeinterlaceMethodWeaveClass * klass)
-{
- GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass;
- GstDeinterlaceSimpleMethodClass *dism_class =
- (GstDeinterlaceSimpleMethodClass *) klass;
-
- dim_class->fields_required = 2;
- dim_class->name = "Weave";
- dim_class->nick = "weave";
- dim_class->latency = 0;
-
- dism_class->interpolate_scanline = deinterlace_scanline_weave;
- dism_class->copy_scanline = copy_scanline;
-}
-
-static void
-gst_deinterlace_method_weave_init (GstDeinterlaceMethodWeave * self)
-{
-}
diff --git a/gst/deinterlace2/tvtime/weavebff.c b/gst/deinterlace2/tvtime/weavebff.c
deleted file mode 100644
index 4ddf5a51..00000000
--- a/gst/deinterlace2/tvtime/weavebff.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * Weave frames, bottom-field-first.
- * Copyright (C) 2003 Billy Biggs <vektor@dumbterm.net>.
- * Copyright (C) 2008 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 Lesser 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "_stdint.h"
-#include "gstdeinterlace2.h"
-#include <string.h>
-
-#define GST_TYPE_DEINTERLACE_METHOD_WEAVE_BFF (gst_deinterlace_method_weave_bff_get_type ())
-#define GST_IS_DEINTERLACE_METHOD_WEAVE_BFF(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_WEAVE_BFF))
-#define GST_IS_DEINTERLACE_METHOD_WEAVE_BFF_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_WEAVE_BFF))
-#define GST_DEINTERLACE_METHOD_WEAVE_BFF_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_WEAVE_BFF, GstDeinterlaceMethodWeaveBFFClass))
-#define GST_DEINTERLACE_METHOD_WEAVE_BFF(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_WEAVE_BFF, GstDeinterlaceMethodWeaveBFF))
-#define GST_DEINTERLACE_METHOD_WEAVE_BFF_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_WEAVE_BFF, GstDeinterlaceMethodWeaveBFFClass))
-#define GST_DEINTERLACE_METHOD_WEAVE_BFF_CAST(obj) ((GstDeinterlaceMethodWeaveBFF*)(obj))
-
-GType gst_deinterlace_method_weave_bff_get_type (void);
-
-typedef GstDeinterlaceSimpleMethod GstDeinterlaceMethodWeaveBFF;
-
-typedef GstDeinterlaceSimpleMethodClass GstDeinterlaceMethodWeaveBFFClass;
-
-
-static void
-deinterlace_scanline_weave (GstDeinterlaceMethod * self,
- GstDeinterlace2 * parent, guint8 * out,
- GstDeinterlaceScanlineData * scanlines, gint width)
-{
- oil_memcpy (out, scanlines->m1, parent->row_stride);
-}
-
-static void
-copy_scanline (GstDeinterlaceMethod * self, GstDeinterlace2 * parent,
- guint8 * out, GstDeinterlaceScanlineData * scanlines, gint width)
-{
- /* FIXME: original code used m2 and m0 but this looks really bad */
- if (scanlines->bottom_field) {
- oil_memcpy (out, scanlines->bb2, parent->row_stride);
- } else {
- oil_memcpy (out, scanlines->bb0, parent->row_stride);
- }
-}
-
-G_DEFINE_TYPE (GstDeinterlaceMethodWeaveBFF, gst_deinterlace_method_weave_bff,
- GST_TYPE_DEINTERLACE_SIMPLE_METHOD);
-
-static void
-gst_deinterlace_method_weave_bff_class_init (GstDeinterlaceMethodWeaveBFFClass *
- klass)
-{
- GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass;
- GstDeinterlaceSimpleMethodClass *dism_class =
- (GstDeinterlaceSimpleMethodClass *) klass;
-
- dim_class->fields_required = 3;
- dim_class->name = "Progressive: Bottom Field First";
- dim_class->nick = "weavebff";
- dim_class->latency = 0;
-
- dism_class->interpolate_scanline = deinterlace_scanline_weave;
- dism_class->copy_scanline = copy_scanline;
-}
-
-static void
-gst_deinterlace_method_weave_bff_init (GstDeinterlaceMethodWeaveBFF * self)
-{
-}
diff --git a/gst/deinterlace2/tvtime/weavetff.c b/gst/deinterlace2/tvtime/weavetff.c
deleted file mode 100644
index 9411f51b..00000000
--- a/gst/deinterlace2/tvtime/weavetff.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * Weave frames, top-field-first.
- * Copyright (C) 2003 Billy Biggs <vektor@dumbterm.net>.
- * Copyright (C) 2008 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 Lesser 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "_stdint.h"
-#include "gstdeinterlace2.h"
-#include <string.h>
-
-#define GST_TYPE_DEINTERLACE_METHOD_WEAVE_TFF (gst_deinterlace_method_weave_tff_get_type ())
-#define GST_IS_DEINTERLACE_METHOD_WEAVE_TFF(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_WEAVE_TFF))
-#define GST_IS_DEINTERLACE_METHOD_WEAVE_TFF_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_WEAVE_TFF))
-#define GST_DEINTERLACE_METHOD_WEAVE_TFF_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_WEAVE_TFF, GstDeinterlaceMethodWeaveTFFClass))
-#define GST_DEINTERLACE_METHOD_WEAVE_TFF(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_WEAVE_TFF, GstDeinterlaceMethodWeaveTFF))
-#define GST_DEINTERLACE_METHOD_WEAVE_TFF_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_WEAVE_TFF, GstDeinterlaceMethodWeaveTFFClass))
-#define GST_DEINTERLACE_METHOD_WEAVE_TFF_CAST(obj) ((GstDeinterlaceMethodWeaveTFF*)(obj))
-
-GType gst_deinterlace_method_weave_tff_get_type (void);
-
-typedef GstDeinterlaceSimpleMethod GstDeinterlaceMethodWeaveTFF;
-
-typedef GstDeinterlaceSimpleMethodClass GstDeinterlaceMethodWeaveTFFClass;
-
-
-static void
-deinterlace_scanline_weave (GstDeinterlaceMethod * self,
- GstDeinterlace2 * parent, guint8 * out,
- GstDeinterlaceScanlineData * scanlines, gint width)
-{
- oil_memcpy (out, scanlines->m1, parent->row_stride);
-}
-
-static void
-copy_scanline (GstDeinterlaceMethod * self, GstDeinterlace2 * parent,
- guint8 * out, GstDeinterlaceScanlineData * scanlines, gint width)
-{
- /* FIXME: original code used m2 and m0 but this looks really bad */
- if (scanlines->bottom_field) {
- oil_memcpy (out, scanlines->bb0, parent->row_stride);
- } else {
- oil_memcpy (out, scanlines->bb2, parent->row_stride);
- }
-}
-
-G_DEFINE_TYPE (GstDeinterlaceMethodWeaveTFF, gst_deinterlace_method_weave_tff,
- GST_TYPE_DEINTERLACE_SIMPLE_METHOD);
-
-static void
-gst_deinterlace_method_weave_tff_class_init (GstDeinterlaceMethodWeaveTFFClass *
- klass)
-{
- GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass;
- GstDeinterlaceSimpleMethodClass *dism_class =
- (GstDeinterlaceSimpleMethodClass *) klass;
-
- dim_class->fields_required = 3;
- dim_class->name = "Progressive: Top Field First";
- dim_class->nick = "weavetff";
- dim_class->latency = 0;
-
- dism_class->interpolate_scanline = deinterlace_scanline_weave;
- dism_class->copy_scanline = copy_scanline;
-}
-
-static void
-gst_deinterlace_method_weave_tff_init (GstDeinterlaceMethodWeaveTFF * self)
-{
-}
diff --git a/gst/deinterlace2/tvtime/x86-64_macros.inc b/gst/deinterlace2/tvtime/x86-64_macros.inc
deleted file mode 100644
index 2e9df758..00000000
--- a/gst/deinterlace2/tvtime/x86-64_macros.inc
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *
- * GStreamer
- * Copyright (C) 2004 Dirk Ziegelmeier <dziegel@gmx.de>
- *
- * 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.
- */
-
-/*
- *
- * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578
- */
-
-/*
- * This file is copied from TVTIME's sources.
- * Original author: Achim Schneider <batchall@mordor.ch>
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#ifndef XAX
-
-#if defined (HAVE_CPU_I386) && !defined(HAVE_CPU_X86_64)
-
-#define XAX "eax"
-#define XBX "ebx"
-#define XCX "ecx"
-#define XDX "edx"
-#define XSI "esi"
-#define XDI "edi"
-#define XSP "esp"
-#define MOVX "movl"
-#define LEAX "leal"
-#define DECX "decl"
-#define PUSHX "pushl"
-#define POPX "popl"
-#define CMPX "cmpl"
-#define ADDX "addl"
-#define SHLX "shll"
-#define SHRX "shrl"
-#define SUBX "subl"
-
-#elif defined (HAVE_CPU_X86_64)
-
-#define XAX "rax"
-#define XBX "rbx"
-#define XCX "rcx"
-#define XDX "rdx"
-#define XSI "rsi"
-#define XDI "rdi"
-#define XSP "rsp"
-#define MOVX "movq"
-#define LEAX "leaq"
-#define DECX "decq"
-#define PUSHX "pushq"
-#define POPX "popq"
-#define CMPX "cmpq"
-#define ADDX "addq"
-#define SHLX "shlq"
-#define SHRX "shrq"
-#define SUBX "subq"
-
-#else
-#error Undefined architecture. Define either ARCH_X86 or ARCH_X86_64.
-#endif
-
-#endif
diff --git a/gst/dvdspu/Makefile.am b/gst/dvdspu/Makefile.am
index 4d75f76c..07a66357 100644
--- a/gst/dvdspu/Makefile.am
+++ b/gst/dvdspu/Makefile.am
@@ -1,13 +1,13 @@
plugin_LTLIBRARIES = libgstdvdspu.la
-libgstdvdspu_la_SOURCES = gstdvdspu.c gstdvdspu-render.c
+libgstdvdspu_la_SOURCES = gstdvdspu.c gstdvdspu-render.c gstspu-vobsub.c gstspu-vobsub-render.c gstspu-pgs.c
libgstdvdspu_la_CFLAGS = $(GST_CFLAGS)
libgstdvdspu_la_LIBADD = $(GST_LIBS)
libgstdvdspu_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
libgstdvdspu_la_LIBTOOLFLAGS = --tag=disable-static
-noinst_HEADERS = gstdvdspu.h
+noinst_HEADERS = gstdvdspu.h gstspu-pgs.h gstspu-vobsub.h
EXTRA_DIST = Notes.txt
diff --git a/gst/dvdspu/gstdvdspu-render.c b/gst/dvdspu/gstdvdspu-render.c
index e3bae8b6..7731aed4 100644
--- a/gst/dvdspu/gstdvdspu-render.c
+++ b/gst/dvdspu/gstdvdspu-render.c
@@ -1,5 +1,6 @@
/* GStreamer DVD Sub-Picture Unit
* Copyright (C) 2007 Fluendo S.A. <info@fluendo.com>
+ * Copyright (C) 2009 Jan Schmidt <thaytan@noraisin.net>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -29,338 +30,38 @@
GST_DEBUG_CATEGORY_EXTERN (dvdspu_debug);
#define GST_CAT_DEFAULT dvdspu_debug
-static void
-dvdspu_recalc_palette (GstDVDSpu * dvdspu,
- SpuColour * dest, guint8 * idx, guint8 * alpha)
-{
- SpuState *state = &dvdspu->spu_state;
- gint i;
-
- for (i = 0; i < 4; i++, dest++) {
- guint32 col = state->current_clut[idx[i]];
-
- dest->Y = (guint16) ((col >> 16) & 0xff) * alpha[i];
- /* U/V are stored as V/U in the clut words, so switch them */
- dest->U = (guint16) (col & 0xff) * alpha[i];
- dest->V = (guint16) ((col >> 8) & 0xff) * alpha[i];
- dest->A = alpha[i];
- }
-}
-
-/* Recalculate the main, HL & ChgCol palettes */
-static void
-dvdspu_update_palettes (GstDVDSpu * dvdspu, SpuState * state)
-{
- gint16 l, c;
- guint8 index[4]; /* Indices for the palette */
- guint8 alpha[4]; /* Alpha values the palette */
-
- if (state->main_pal_dirty) {
- dvdspu_recalc_palette (dvdspu, state->main_pal, state->main_idx,
- state->main_alpha);
-
- /* Need to refresh the hl_ctrl info copies of the main palette too */
- memcpy (state->hl_ctrl_i.pix_ctrl_i[0].pal_cache, state->main_pal,
- 4 * sizeof (SpuColour));
- memcpy (state->hl_ctrl_i.pix_ctrl_i[2].pal_cache, state->main_pal,
- 4 * sizeof (SpuColour));
-
- state->main_pal_dirty = FALSE;
- }
-
- if (state->hl_pal_dirty) {
- dvdspu_recalc_palette (dvdspu, state->hl_ctrl_i.pix_ctrl_i[1].pal_cache,
- state->hl_idx, state->hl_alpha);
- state->hl_pal_dirty = FALSE;
- }
-
- /* Update the offset positions for the highlight region */
- if (state->hl_rect.top != -1) {
- state->hl_ctrl_i.top = state->hl_rect.top;
- state->hl_ctrl_i.bottom = state->hl_rect.bottom;
- state->hl_ctrl_i.n_changes = 3;
- state->hl_ctrl_i.pix_ctrl_i[0].left = 0;
- state->hl_ctrl_i.pix_ctrl_i[1].left = state->hl_rect.left;
- state->hl_ctrl_i.pix_ctrl_i[2].left = state->hl_rect.right + 1;
- }
-
- if (state->line_ctrl_i_pal_dirty) {
- GST_LOG_OBJECT (dvdspu, "Updating chg-col-con palettes");
- for (l = 0; l < state->n_line_ctrl_i; l++) {
- SpuLineCtrlI *cur_line_ctrl = state->line_ctrl_i + l;
-
- for (c = 0; c < cur_line_ctrl->n_changes; c++) {
- SpuPixCtrlI *cur = cur_line_ctrl->pix_ctrl_i + c;
-
- index[3] = (cur->palette >> 28) & 0x0f;
- index[2] = (cur->palette >> 24) & 0x0f;
- index[1] = (cur->palette >> 20) & 0x0f;
- index[0] = (cur->palette >> 16) & 0x0f;
-
- alpha[3] = (cur->palette >> 12) & 0x0f;
- alpha[2] = (cur->palette >> 8) & 0x0f;
- alpha[1] = (cur->palette >> 4) & 0x0f;
- alpha[0] = (cur->palette) & 0x0f;
- dvdspu_recalc_palette (dvdspu, cur->pal_cache, index, alpha);
- }
- }
- state->line_ctrl_i_pal_dirty = FALSE;
- }
-}
-
-static void
-dvdspu_clear_comp_buffers (SpuState * state)
+void
+gstspu_clear_comp_buffers (SpuState * state)
{
- /* The area to clear is the line inside the disp_rect, each entry 2 bytes,
+ /* The area to clear is the line inside the disp_rect, each entry 4 bytes,
* of the sub-sampled UV planes. */
- gint16 left = state->disp_rect.left / 2;
- gint16 right = state->disp_rect.right / 2;
- gint16 uv_width = 2 * (right - left + 1);
+ gint16 left = state->comp_left / 2;
+ gint16 right = state->comp_right / 2;
+ gint16 uv_width = sizeof (guint32) * (right - left + 1);
memset (state->comp_bufs[0] + left, 0, uv_width);
memset (state->comp_bufs[1] + left, 0, uv_width);
memset (state->comp_bufs[2] + left, 0, uv_width);
-
- state->comp_last_x[0] = -1;
- state->comp_last_x[1] = -1;
-}
-
-static inline guint8
-dvdspu_get_nibble (SpuState * state, guint16 * rle_offset)
-{
- guint8 ret;
-
- if (G_UNLIKELY (*rle_offset >= state->max_offset))
- return 0; /* Overran the buffer */
-
- ret = GST_BUFFER_DATA (state->pix_buf)[(*rle_offset) / 2];
-
- /* If the offset is even, we shift the answer down 4 bits, otherwise not */
- if (*rle_offset & 0x01)
- ret &= 0x0f;
- else
- ret = ret >> 4;
-
- (*rle_offset)++;
- return ret;
}
-static guint16
-dvdspu_get_rle_code (SpuState * state, guint16 * rle_offset)
-{
- guint16 code;
-
- code = dvdspu_get_nibble (state, rle_offset);
- if (code < 0x4) { /* 4 .. f */
- code = (code << 4) | dvdspu_get_nibble (state, rle_offset);
- if (code < 0x10) { /* 1x .. 3x */
- code = (code << 4) | dvdspu_get_nibble (state, rle_offset);
- if (code < 0x40) { /* 04x .. 0fx */
- code = (code << 4) | dvdspu_get_nibble (state, rle_offset);
- }
- }
- }
- return code;
-}
-
-static inline void
-dvdspu_draw_rle_run (SpuState * state, gint16 x, gint16 end, SpuColour * colour)
-{
-#if 0
- GST_LOG ("Y: %d x: %d end %d col %d %d %d %d",
- state->cur_Y, x, end, colour->Y, colour->U, colour->V, colour->A);
-#endif
-
- if (colour->A != 0) {
- guint8 inv_A = 0xf - colour->A;
-
- /* FIXME: This could be more efficient */
- while (x < end) {
- state->out_Y[x] = (inv_A * state->out_Y[x] + colour->Y) / 0xf;
- state->out_U[x / 2] += colour->U;
- state->out_V[x / 2] += colour->V;
- state->out_A[x / 2] += colour->A;
- x++;
- }
- /* Update the compositing buffer so we know how much to blend later */
- *(state->comp_last_x_ptr) = end;
- }
-}
-
-static inline gint16
-rle_end_x (guint16 rle_code, gint16 x, gint16 end)
-{
- /* run length = rle_code >> 2 */
- if (G_UNLIKELY (((rle_code >> 2) == 0)))
- return end;
- else
- return MIN (end, x + (rle_code >> 2));
-}
-
-static void dvdspu_render_line_with_chgcol (SpuState * state,
- guint8 * planes[3], guint16 * rle_offset);
-static gboolean dvdspu_update_chgcol (SpuState * state);
-
-static void
-dvdspu_render_line (SpuState * state, guint8 * planes[3], guint16 * rle_offset)
-{
- gint16 x, next_x, end, rle_code;
- SpuColour *colour;
-
- /* Check for special case of chg_col info to use (either highlight or
- * ChgCol command */
- if (state->cur_chg_col != NULL) {
- if (dvdspu_update_chgcol (state)) {
- /* Check the top & bottom, because we might not be within the region yet */
- if (state->cur_Y >= state->cur_chg_col->top &&
- state->cur_Y <= state->cur_chg_col->bottom) {
- dvdspu_render_line_with_chgcol (state, planes, rle_offset);
- return;
- }
- }
- }
-
- /* No special case. Render as normal */
-
- /* Set up our output pointers */
- state->out_Y = planes[0];
- state->out_U = state->comp_bufs[0];
- state->out_V = state->comp_bufs[1];
- state->out_A = state->comp_bufs[2];
- /* We always need to start our RLE decoding byte_aligned */
- *rle_offset = GST_ROUND_UP_2 (*rle_offset);
-
- x = state->disp_rect.left;
- end = state->disp_rect.right + 1;
- while (x < end) {
- rle_code = dvdspu_get_rle_code (state, rle_offset);
- colour = &state->main_pal[rle_code & 3];
- next_x = rle_end_x (rle_code, x, end);
- /* Now draw the run between [x,next_x) */
- dvdspu_draw_rle_run (state, x, next_x, colour);
- x = next_x;
- }
-}
-
-static gboolean
-dvdspu_update_chgcol (SpuState * state)
-{
- if (state->cur_chg_col == NULL)
- return FALSE;
-
- if (state->cur_Y <= state->cur_chg_col->bottom)
- return TRUE;
-
- while (state->cur_chg_col < state->cur_chg_col_end) {
- if (state->cur_Y >= state->cur_chg_col->top &&
- state->cur_Y <= state->cur_chg_col->bottom) {
-#if 0
- g_print ("Stopped @ entry %d with top %d bottom %d, cur_y %d",
- (gint16) (state->cur_chg_col - state->line_ctrl_i),
- state->cur_chg_col->top, state->cur_chg_col->bottom, y);
-#endif
- return TRUE;
- }
- state->cur_chg_col++;
- }
-
- /* Finished all our cur_chg_col entries. Use the main palette from here on */
- state->cur_chg_col = NULL;
- return FALSE;
-}
-
-static void
-dvdspu_render_line_with_chgcol (SpuState * state, guint8 * planes[3],
- guint16 * rle_offset)
-{
- SpuLineCtrlI *chg_col = state->cur_chg_col;
-
- gint16 x, next_x, disp_end, rle_code, run_end;
- SpuColour *colour;
- SpuPixCtrlI *cur_pix_ctrl;
- SpuPixCtrlI *next_pix_ctrl;
- SpuPixCtrlI *end_pix_ctrl;
- SpuPixCtrlI dummy_pix_ctrl;
- gint16 cur_reg_end;
- gint i;
-
- state->out_Y = planes[0];
- state->out_U = state->comp_bufs[0];
- state->out_V = state->comp_bufs[1];
- state->out_A = state->comp_bufs[2];
-
- /* We always need to start our RLE decoding byte_aligned */
- *rle_offset = GST_ROUND_UP_2 (*rle_offset);
-
- /* Our run will cover the display rect */
- x = state->disp_rect.left;
- disp_end = state->disp_rect.right + 1;
-
- /* Work out the first pixel control info, which may point to the dummy entry if
- * the global palette/alpha need using initally */
- cur_pix_ctrl = chg_col->pix_ctrl_i;
- end_pix_ctrl = chg_col->pix_ctrl_i + chg_col->n_changes;
-
- if (cur_pix_ctrl->left != 0) {
- next_pix_ctrl = cur_pix_ctrl;
- cur_pix_ctrl = &dummy_pix_ctrl;
- for (i = 0; i < 4; i++) /* Copy the main palette to our dummy entry */
- dummy_pix_ctrl.pal_cache[i] = state->main_pal[i];
- } else {
- next_pix_ctrl = cur_pix_ctrl + 1;
- }
- if (next_pix_ctrl < end_pix_ctrl)
- cur_reg_end = next_pix_ctrl->left;
- else
- cur_reg_end = disp_end;
-
- /* Render stuff */
- while (x < disp_end) {
- rle_code = dvdspu_get_rle_code (state, rle_offset);
- next_x = rle_end_x (rle_code, x, disp_end);
-
- /* Now draw the run between [x,next_x), crossing palette regions as needed */
- while (x < next_x) {
- run_end = MIN (next_x, cur_reg_end);
-
- if (G_LIKELY (x < run_end)) {
- colour = &cur_pix_ctrl->pal_cache[rle_code & 3];
- dvdspu_draw_rle_run (state, x, run_end, colour);
- x = run_end;
- }
-
- if (x >= cur_reg_end) {
- /* Advance to next region */
- cur_pix_ctrl = next_pix_ctrl;
- next_pix_ctrl++;
-
- if (next_pix_ctrl < end_pix_ctrl)
- cur_reg_end = next_pix_ctrl->left;
- else
- cur_reg_end = disp_end;
- }
- }
- }
-}
-
-static void
-dvdspu_blend_comp_buffers (SpuState * state, guint8 * planes[3])
+void
+gstspu_blend_comp_buffers (SpuState * state, guint8 * planes[3])
{
gint16 uv_end;
gint16 left, x;
guint8 *out_U;
guint8 *out_V;
- guint16 *in_U;
- guint16 *in_V;
- guint16 *in_A;
- gint16 comp_last_x = MAX (state->comp_last_x[0], state->comp_last_x[1]);
+ guint32 *in_U;
+ guint32 *in_V;
+ guint32 *in_A;
+ gint16 comp_last_x = state->comp_right;
- if (comp_last_x < state->disp_rect.left)
+ if (comp_last_x < state->comp_left)
return; /* Didn't draw in the comp buffers, nothing to do... */
#if 0
- GST_LOG ("Blending comp buffers from disp_rect.left %d to x=%d",
- state->disp_rect.left, comp_last_x);
+ GST_LOG ("Blending comp buffers from x=%d to x=%d",
+ state->comp_left, state->comp_right);
#endif
/* Set up the output pointers */
@@ -376,186 +77,18 @@ dvdspu_blend_comp_buffers (SpuState * state, guint8 * planes[3])
* drawn in the render_line function, divided by 2 (rounding up) to account
* for UV sub-sampling */
uv_end = (comp_last_x + 1) / 2;
- left = state->disp_rect.left / 2;
+ left = state->comp_left / 2;
for (x = left; x < uv_end; x++) {
- guint16 tmp;
- guint16 inv_A = (4 * 0xf) - in_A[x];
-
+ guint32 tmp;
/* Each entry in the compositing buffer is 4 summed pixels, so the
- * inverse alpha is (4 * 0x0f) - in_A[x] */
+ * inverse alpha is (4 * 0xff) - in_A[x] */
+ guint16 inv_A = (4 * 0xff) - in_A[x];
+
tmp = in_U[x] + inv_A * out_U[x];
- out_U[x] = (guint8) (tmp / (4 * 0xf));
+ out_U[x] = (guint8) (tmp / (4 * 0xff));
tmp = in_V[x] + inv_A * out_V[x];
- out_V[x] = (guint8) (tmp / (4 * 0xf));
- }
-}
-
-void
-gst_dvd_spu_render_spu (GstDVDSpu * dvdspu, GstBuffer * buf)
-{
- SpuState *state = &dvdspu->spu_state;
- guint8 *planes[3]; /* YUV frame pointers */
- gint y, last_y;
-
- /* Set up our initial state */
-
- /* Store the start of each plane */
- planes[0] = GST_BUFFER_DATA (buf);
- planes[1] = planes[0] + (state->Y_height * state->Y_stride);
- planes[2] = planes[1] + (state->UV_height * state->UV_stride);
-
- /* Sanity check */
- g_return_if_fail (planes[2] + (state->UV_height * state->UV_stride) <=
- GST_BUFFER_DATA (buf) + GST_BUFFER_SIZE (buf));
-
- GST_DEBUG ("Rendering SPU. disp_rect %d,%d to %d,%d. hl_rect %d,%d to %d,%d",
- state->disp_rect.left, state->disp_rect.top,
- state->disp_rect.right, state->disp_rect.bottom,
- state->hl_rect.left, state->hl_rect.top,
- state->hl_rect.right, state->hl_rect.bottom);
-
- GST_DEBUG ("vid_disp %d,%d", state->vid_width, state->vid_height);
-
- /* When reading RLE data, we track the offset in nibbles... */
- state->cur_offsets[0] = state->pix_data[0] * 2;
- state->cur_offsets[1] = state->pix_data[1] * 2;
- state->max_offset = GST_BUFFER_SIZE (state->pix_buf) * 2;
-
- /* Update all the palette caches */
- dvdspu_update_palettes (dvdspu, state);
-
- /* Set up HL or Change Color & Contrast rect tracking */
- if (state->hl_rect.top != -1) {
- state->cur_chg_col = &state->hl_ctrl_i;
- state->cur_chg_col_end = state->cur_chg_col + 1;
- } else if (state->n_line_ctrl_i > 0) {
- state->cur_chg_col = state->line_ctrl_i;
- state->cur_chg_col_end = state->cur_chg_col + state->n_line_ctrl_i;
- } else
- state->cur_chg_col = NULL;
-
- /* We start rendering from the first line of the display rect */
- y = state->disp_rect.top;
- /* start_y is always an even number and we render lines in pairs from there,
- * accumulating 2 lines of chroma then blending it. We might need to render a
- * single line at the end if the display rect ends on an even line too. */
- last_y = (state->disp_rect.bottom - 1) & ~(0x01);
-
- /* center the image when display rectangle exceeds the video width */
- if (state->vid_width < state->disp_rect.right) {
- gint diff, disp_width;
-
- disp_width = state->disp_rect.left - state->disp_rect.right;
- diff = (disp_width - state->vid_width) / 2;
-
- /* fixme, this is not used yet */
- state->clip_rect.left = state->disp_rect.left + diff;
- state->clip_rect.right = state->disp_rect.right - diff;
-
- GST_DEBUG ("clipping width to %d,%d", state->clip_rect.left,
- state->clip_rect.right);
- } else {
- state->clip_rect.left = state->disp_rect.left;
- state->clip_rect.right = state->disp_rect.right;
- }
-
- /* for the height, chop off the bottom bits of the diplay rectangle because we
- * assume the picture is in the lower part. We should better check where it
- * is and do something more clever. */
- state->clip_rect.bottom = state->disp_rect.bottom;
- if (state->vid_height < state->disp_rect.bottom) {
- state->clip_rect.top = state->disp_rect.bottom - state->vid_height;
- GST_DEBUG ("clipping height to %d,%d", state->clip_rect.top,
- state->clip_rect.bottom);
- } else {
- state->clip_rect.top = state->disp_rect.top;
- /* Update our plane references to the first line of the disp_rect */
- planes[0] += state->Y_stride * y;
- planes[1] += state->UV_stride * (y / 2);
- planes[2] += state->UV_stride * (y / 2);
- }
-
- for (state->cur_Y = y; state->cur_Y <= last_y; state->cur_Y++) {
- gboolean clip;
-
- clip = (state->cur_Y < state->clip_rect.top
- || state->cur_Y > state->clip_rect.bottom);
-
- /* Reset the compositing buffer */
- dvdspu_clear_comp_buffers (state);
- /* Render even line */
- state->comp_last_x_ptr = state->comp_last_x;
- dvdspu_render_line (state, planes, &state->cur_offsets[0]);
- if (!clip) {
- /* Advance the luminance output pointer */
- planes[0] += state->Y_stride;
- }
- state->cur_Y++;
-
- /* Render odd line */
- state->comp_last_x_ptr = state->comp_last_x + 1;
- dvdspu_render_line (state, planes, &state->cur_offsets[1]);
- /* Blend the accumulated UV compositing buffers onto the output */
- dvdspu_blend_comp_buffers (state, planes);
-
- if (!clip) {
- /* Update all the output pointers */
- planes[0] += state->Y_stride;
- planes[1] += state->UV_stride;
- planes[2] += state->UV_stride;
- }
- }
- if (state->cur_Y == state->disp_rect.bottom) {
- g_assert ((state->disp_rect.bottom & 0x01) == 0);
-
- /* Render a remaining lone last even line. y already has the correct value
- * after the above loop exited. */
- dvdspu_clear_comp_buffers (state);
- state->comp_last_x_ptr = state->comp_last_x;
- dvdspu_render_line (state, planes, &state->cur_offsets[0]);
- dvdspu_blend_comp_buffers (state, planes);
+ out_V[x] = (guint8) (tmp / (4 * 0xff));
}
-
- /* for debugging purposes, draw a faint rectangle at the edges of the disp_rect */
-#if 0
- do {
- guint8 *cur;
- gint16 pos;
-
- cur = GST_BUFFER_DATA (buf) + state->Y_stride * state->disp_rect.top;
- for (pos = state->disp_rect.left + 1; pos < state->disp_rect.right; pos++)
- cur[pos] = (cur[pos] / 2) + 0x8;
- cur = GST_BUFFER_DATA (buf) + state->Y_stride * state->disp_rect.bottom;
- for (pos = state->disp_rect.left + 1; pos < state->disp_rect.right; pos++)
- cur[pos] = (cur[pos] / 2) + 0x8;
- cur = GST_BUFFER_DATA (buf) + state->Y_stride * state->disp_rect.top;
- for (pos = state->disp_rect.top; pos <= state->disp_rect.bottom; pos++) {
- cur[state->disp_rect.left] = (cur[state->disp_rect.left] / 2) + 0x8;
- cur[state->disp_rect.right] = (cur[state->disp_rect.right] / 2) + 0x8;
- cur += state->Y_stride;
- }
- } while (0);
-#endif
- /* For debugging purposes, draw a faint rectangle around the highlight rect */
-#if 0
- if (state->hl_rect.top != -1) {
- guint8 *cur;
- gint16 pos;
-
- cur = GST_BUFFER_DATA (buf) + state->Y_stride * state->hl_rect.top;
- for (pos = state->hl_rect.left + 1; pos < state->hl_rect.right; pos++)
- cur[pos] = (cur[pos] / 2) + 0x8;
- cur = GST_BUFFER_DATA (buf) + state->Y_stride * state->hl_rect.bottom;
- for (pos = state->hl_rect.left + 1; pos < state->hl_rect.right; pos++)
- cur[pos] = (cur[pos] / 2) + 0x8;
- cur = GST_BUFFER_DATA (buf) + state->Y_stride * state->hl_rect.top;
- for (pos = state->hl_rect.top; pos <= state->hl_rect.bottom; pos++) {
- cur[state->hl_rect.left] = (cur[state->hl_rect.left] / 2) + 0x8;
- cur[state->hl_rect.right] = (cur[state->hl_rect.right] / 2) + 0x8;
- cur += state->Y_stride;
- }
- }
-#endif
}
diff --git a/gst/dvdspu/gstdvdspu.c b/gst/dvdspu/gstdvdspu.c
index 3b4c1a0c..f5fce4bc 100644
--- a/gst/dvdspu/gstdvdspu.c
+++ b/gst/dvdspu/gstdvdspu.c
@@ -32,22 +32,17 @@
# include <config.h>
#endif
+#include <gst/gst-i18n-plugin.h>
+
#include <string.h>
#include <gst/gst.h>
#include "gstdvdspu.h"
-#define DUMP_DCSQ 0
-
-extern void gst_dvd_spu_render_spu (GstDVDSpu * dvdspu, GstBuffer * buf);
-
GST_DEBUG_CATEGORY (dvdspu_debug);
#define GST_CAT_DEFAULT dvdspu_debug
-/* Convert an STM offset in the SPU sequence to a GStreamer timestamp */
-#define STM_TO_GST(stm) ((GST_MSECOND * 1024 * (stm)) / 90)
-
/* Filter signals and args */
enum
{
@@ -73,12 +68,19 @@ static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
);
static GstStaticPadTemplate subpic_sink_factory =
-GST_STATIC_PAD_TEMPLATE ("subpicture",
+ GST_STATIC_PAD_TEMPLATE ("subpicture",
GST_PAD_SINK,
GST_PAD_ALWAYS,
- GST_STATIC_CAPS ("video/x-dvd-subpicture")
+ GST_STATIC_CAPS ("video/x-dvd-subpicture; subpicture/x-pgs")
);
+static const guint32 default_clut[16] = {
+ 0xb48080, 0x248080, 0x628080, 0xd78080,
+ 0x808080, 0x808080, 0x808080, 0x808080,
+ 0x808080, 0x808080, 0x808080, 0x808080,
+ 0x808080, 0x808080, 0x808080, 0x808080
+};
+
GST_BOILERPLATE (GstDVDSpu, gst_dvd_spu, GstElement, GST_TYPE_ELEMENT);
static void gst_dvd_spu_dispose (GObject * object);
@@ -94,27 +96,31 @@ static GstFlowReturn gst_dvd_spu_video_chain (GstPad * pad, GstBuffer * buf);
static gboolean gst_dvd_spu_video_event (GstPad * pad, GstEvent * event);
static GstFlowReturn gst_dvd_spu_buffer_alloc (GstPad * sinkpad, guint64 offset,
guint size, GstCaps * caps, GstBuffer ** buf);
-static void gst_dvd_spu_redraw_still (GstDVDSpu * dvdspu);
+static void gst_dvd_spu_redraw_still (GstDVDSpu * dvdspu, gboolean force);
static void gst_dvd_spu_check_still_updates (GstDVDSpu * dvdspu);
static GstFlowReturn gst_dvd_spu_subpic_chain (GstPad * pad, GstBuffer * buf);
static gboolean gst_dvd_spu_subpic_event (GstPad * pad, GstEvent * event);
+static gboolean gst_dvd_spu_subpic_set_caps (GstPad * pad, GstCaps * caps);
static void gst_dvd_spu_clear (GstDVDSpu * dvdspu);
-static void gst_dvd_spu_flush_spu_info (GstDVDSpu * dvdspu);
+static void gst_dvd_spu_flush_spu_info (GstDVDSpu * dvdspu,
+ gboolean process_events);
static void gst_dvd_spu_advance_spu (GstDVDSpu * dvdspu, GstClockTime new_ts);
+static void gstspu_render (GstDVDSpu * dvdspu, GstBuffer * buf);
static GstFlowReturn
dvdspu_handle_vid_buffer (GstDVDSpu * dvdspu, GstBuffer * buf);
+static void gst_dvd_spu_handle_dvd_event (GstDVDSpu * dvdspu, GstEvent * event);
static void
gst_dvd_spu_base_init (gpointer gclass)
{
static GstElementDetails element_details =
- GST_ELEMENT_DETAILS ("Fluendo DVD Player Sub-picture Overlay",
- "Mixer/Video/Overlay/DVD",
- "Parses the DVD Sub-Picture command stream and renders the SPU overlay "
+ GST_ELEMENT_DETAILS ("GStreamer Sub-picture Overlay",
+ "Mixer/Video/Overlay/DVD/Bluray",
+ "Parses Sub-Picture command streams and renders the SPU overlay "
"onto the video as it passes through",
- "Jan Schmidt <jan@fluendo.com>");
+ "Jan Schmidt <thaytan@noraisin.net>");
GstElementClass *element_class = GST_ELEMENT_CLASS (gclass);
gst_element_class_add_pad_template (element_class,
@@ -164,7 +170,8 @@ gst_dvd_spu_init (GstDVDSpu * dvdspu, GstDVDSpuClass * gclass)
gst_pad_new_from_static_template (&subpic_sink_factory, "subpicture");
gst_pad_set_chain_function (dvdspu->subpic_sinkpad, gst_dvd_spu_subpic_chain);
gst_pad_set_event_function (dvdspu->subpic_sinkpad, gst_dvd_spu_subpic_event);
- gst_pad_use_fixed_caps (dvdspu->subpic_sinkpad);
+ gst_pad_set_setcaps_function (dvdspu->subpic_sinkpad,
+ gst_dvd_spu_subpic_set_caps);
gst_element_add_pad (GST_ELEMENT (dvdspu), dvdspu->videosinkpad);
gst_element_add_pad (GST_ELEMENT (dvdspu), dvdspu->subpic_sinkpad);
@@ -179,7 +186,10 @@ gst_dvd_spu_init (GstDVDSpu * dvdspu, GstDVDSpuClass * gclass)
static void
gst_dvd_spu_clear (GstDVDSpu * dvdspu)
{
- gst_dvd_spu_flush_spu_info (dvdspu);
+ gst_dvd_spu_flush_spu_info (dvdspu, FALSE);
+ gst_segment_init (&dvdspu->subp_seg, GST_FORMAT_UNDEFINED);
+
+ dvdspu->spu_input_type = SPU_INPUT_TYPE_NONE;
gst_buffer_replace (&dvdspu->ref_frame, NULL);
gst_buffer_replace (&dvdspu->pending_frame, NULL);
@@ -223,15 +233,14 @@ gst_dvd_spu_finalize (GObject * object)
/* With SPU lock held, clear the queue of SPU packets */
static void
-gst_dvd_spu_flush_spu_info (GstDVDSpu * dvdspu)
+gst_dvd_spu_flush_spu_info (GstDVDSpu * dvdspu, gboolean keep_events)
{
SpuPacket *packet;
SpuState *state = &dvdspu->spu_state;
+ GQueue tmp_q = G_QUEUE_INIT;
GST_INFO_OBJECT (dvdspu, "Flushing SPU information");
- gst_segment_init (&dvdspu->subp_seg, GST_FORMAT_UNDEFINED);
-
if (dvdspu->partial_spu) {
gst_buffer_unref (dvdspu->partial_spu);
dvdspu->partial_spu = NULL;
@@ -239,38 +248,37 @@ gst_dvd_spu_flush_spu_info (GstDVDSpu * dvdspu)
packet = (SpuPacket *) g_queue_pop_head (dvdspu->pending_spus);
while (packet != NULL) {
- if (packet->buf)
+ if (packet->buf) {
gst_buffer_unref (packet->buf);
- if (packet->event)
- gst_event_unref (packet->event);
- g_free (packet);
+ g_assert (packet->event == NULL);
+ g_free (packet);
+ } else if (packet->event) {
+ if (keep_events) {
+ g_queue_push_tail (&tmp_q, packet);
+ } else {
+ gst_event_unref (packet->event);
+ g_free (packet);
+ }
+ }
packet = (SpuPacket *) g_queue_pop_head (dvdspu->pending_spus);
}
+ /* Push anything we decided to keep back onto the pending_spus list */
+ for (packet = g_queue_pop_head (&tmp_q); packet != NULL;
+ packet = g_queue_pop_head (&tmp_q))
+ g_queue_push_tail (dvdspu->pending_spus, packet);
- if (state->buf) {
- gst_buffer_unref (state->buf);
- state->buf = NULL;
- }
- if (state->pix_buf) {
- gst_buffer_unref (state->pix_buf);
- state->pix_buf = NULL;
- }
-
- state->base_ts = state->next_ts = GST_CLOCK_TIME_NONE;
state->flags &= ~(SPU_STATE_FLAGS_MASK);
- state->pix_data[0] = 0;
- state->pix_data[1] = 0;
+ state->next_ts = GST_CLOCK_TIME_NONE;
- state->hl_rect.top = -1;
- state->hl_rect.bottom = -1;
-
- state->disp_rect.top = -1;
- state->disp_rect.bottom = -1;
-
- state->n_line_ctrl_i = 0;
- if (state->line_ctrl_i != NULL) {
- g_free (state->line_ctrl_i);
- state->line_ctrl_i = NULL;
+ switch (dvdspu->spu_input_type) {
+ case SPU_INPUT_TYPE_VOBSUB:
+ gstspu_vobsub_flush (dvdspu);
+ break;
+ case SPU_INPUT_TYPE_PGS:
+ gstspu_pgs_flush (dvdspu);
+ break;
+ default:
+ break;
}
}
@@ -342,7 +350,7 @@ gst_dvd_spu_video_set_caps (GstPad * pad, GstCaps * caps)
state->UV_stride = GST_ROUND_UP_4 (state->Y_stride / 2);
for (i = 0; i < 3; i++) {
state->comp_bufs[i] = g_realloc (state->comp_bufs[i],
- sizeof (guint16) * state->UV_stride);
+ sizeof (guint32) * state->UV_stride);
}
}
DVD_SPU_UNLOCK (dvdspu);
@@ -413,13 +421,16 @@ gst_dvd_spu_video_event (GstPad * pad, GstEvent * event)
break;
}
- GST_DEBUG_OBJECT (dvdspu,
- "DVD event of type %s on video pad", event_type);
-
if (strcmp (event_type, "dvd-still") == 0) {
gboolean in_still;
if (gst_structure_get_boolean (structure, "still-state", &in_still)) {
+ GstBuffer *to_push = NULL;
+
+ GST_DEBUG_OBJECT (dvdspu,
+ "DVD event of type %s on video pad: in-still = %d", event_type,
+ in_still);
+
DVD_SPU_LOCK (dvdspu);
if (in_still) {
state->flags |= SPU_STATE_STILL_FRAME;
@@ -429,15 +440,24 @@ gst_dvd_spu_video_event (GstPad * pad, GstEvent * event)
/* And re-draw the still frame to make sure it appears on
* screen, otherwise the last frame might have been discarded
* by QoS */
- gst_dvd_spu_redraw_still (dvdspu);
- } else
+ gst_dvd_spu_redraw_still (dvdspu, TRUE);
+ to_push = dvdspu->pending_frame;
+ dvdspu->pending_frame = NULL;
+
+ } else {
state->flags &= ~(SPU_STATE_STILL_FRAME);
+ }
DVD_SPU_UNLOCK (dvdspu);
+ if (to_push)
+ gst_pad_push (dvdspu->srcpad, to_push);
}
gst_event_unref (event);
res = TRUE;
- } else
+ } else {
+ GST_DEBUG_OBJECT (dvdspu,
+ "DVD event of type %s on video pad", event_type);
res = gst_pad_event_default (pad, event);
+ }
break;
}
case GST_EVENT_NEWSEGMENT:
@@ -602,7 +622,7 @@ dvdspu_handle_vid_buffer (GstDVDSpu * dvdspu, GstBuffer * buf)
/* Render the SPU overlay onto the buffer */
buf = gst_buffer_make_writable (buf);
- gst_dvd_spu_render_spu (dvdspu, buf);
+ gstspu_render (dvdspu, buf);
} else {
if (using_ref == FALSE) {
/* Not going to draw anything on this frame, just store a reference
@@ -631,17 +651,35 @@ no_ref_frame:
return GST_FLOW_OK;
}
+
+static void
+gstspu_render (GstDVDSpu * dvdspu, GstBuffer * buf)
+{
+ switch (dvdspu->spu_input_type) {
+ case SPU_INPUT_TYPE_VOBSUB:
+ gstspu_vobsub_render (dvdspu, buf);
+ break;
+ case SPU_INPUT_TYPE_PGS:
+ gstspu_pgs_render (dvdspu, buf);
+ break;
+ default:
+ break;
+ }
+}
+
/* With SPU LOCK */
static void
-gst_dvd_spu_redraw_still (GstDVDSpu * dvdspu)
+gst_dvd_spu_redraw_still (GstDVDSpu * dvdspu, gboolean force)
{
/* If we have an active SPU command set and a reference frame, copy the
* frame, redraw the SPU and store it as the pending frame for output */
if (dvdspu->ref_frame) {
- if ((dvdspu->spu_state.flags & SPU_STATE_FORCED_DSP) ||
- ((dvdspu->spu_state.flags & SPU_STATE_FORCED_ONLY) == 0 &&
- (dvdspu->spu_state.flags & SPU_STATE_DISPLAY))) {
- GstBuffer *buf = gst_buffer_copy (dvdspu->ref_frame);
+ gboolean redraw = (dvdspu->spu_state.flags & SPU_STATE_FORCED_DSP);
+ redraw |= (dvdspu->spu_state.flags & SPU_STATE_FORCED_ONLY) == 0 &&
+ (dvdspu->spu_state.flags & SPU_STATE_DISPLAY);
+
+ if (redraw) {
+ GstBuffer *buf = gst_buffer_ref (dvdspu->ref_frame);
buf = gst_buffer_make_writable (buf);
@@ -652,11 +690,23 @@ gst_dvd_spu_redraw_still (GstDVDSpu * dvdspu)
GST_BUFFER_DURATION (buf) = GST_CLOCK_TIME_NONE;
/* Render the SPU overlay onto the buffer */
- gst_dvd_spu_render_spu (dvdspu, buf);
+ gstspu_render (dvdspu, buf);
gst_buffer_replace (&dvdspu->pending_frame, buf);
+ gst_buffer_unref (buf);
+ } else if (force) {
+ /* Simply output the reference frame */
+ GstBuffer *buf = gst_buffer_ref (dvdspu->ref_frame);
+ buf = gst_buffer_make_metadata_writable (buf);
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
+ GST_BUFFER_TIMESTAMP (buf) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_DURATION (buf) = GST_CLOCK_TIME_NONE;
+
+ GST_DEBUG_OBJECT (dvdspu, "Pushing reference frame at start of still");
+
+ gst_buffer_replace (&dvdspu->pending_frame, buf);
+ gst_buffer_unref (buf);
} else {
- GST_LOG_OBJECT (dvdspu,
- "Redraw due to Still Frame skipped - no SPU to draw");
+ GST_LOG_OBJECT (dvdspu, "Redraw due to Still Frame skipped");
}
} else {
GST_LOG_OBJECT (dvdspu, "Not redrawing still frame - no ref frame");
@@ -664,392 +714,47 @@ gst_dvd_spu_redraw_still (GstDVDSpu * dvdspu)
}
static void
-gst_dvd_spu_parse_chg_colcon (GstDVDSpu * dvdspu, guint8 * data, guint8 * end)
-{
- SpuState *state = &dvdspu->spu_state;
- guint8 *cur;
- gint16 n_entries;
- gint16 i;
-
- /* Clear any existing chg colcon info */
- state->n_line_ctrl_i = 0;
- if (state->line_ctrl_i != NULL) {
- g_free (state->line_ctrl_i);
- state->line_ctrl_i = NULL;
- }
- GST_DEBUG_OBJECT (dvdspu, "Change Color & Contrast. Pixel data = %d bytes",
- (gint16) (end - data));
-
- /* Count the number of entries we'll need */
- n_entries = 0;
- for (cur = data; cur < end;) {
- guint8 n_changes;
- guint32 code;
-
- if (cur + 4 > end)
- break;
-
- code = GST_READ_UINT32_BE (cur);
- if (code == 0x0fffffff)
- break; /* Termination code */
-
- n_changes = CLAMP ((cur[2] >> 4), 1, 8);
- cur += 4 + (6 * n_changes);
-
- if (cur > end)
- break; /* Invalid entry overrunning buffer */
-
- n_entries++;
- }
-
- state->n_line_ctrl_i = n_entries;
- state->line_ctrl_i = g_new (SpuLineCtrlI, n_entries);
-
- cur = data;
- for (i = 0; i < n_entries; i++) {
- SpuLineCtrlI *cur_line_ctrl = state->line_ctrl_i + i;
- guint8 n_changes = CLAMP ((cur[2] >> 4), 1, 8);
- guint8 c;
-
- cur_line_ctrl->n_changes = n_changes;
- cur_line_ctrl->top = ((cur[0] << 8) & 0x300) | cur[1];
- cur_line_ctrl->bottom = ((cur[2] << 8) & 0x300) | cur[3];
-
- GST_LOG_OBJECT (dvdspu, "ChgColcon Entry %d Top: %d Bottom: %d Changes: %d",
- i, cur_line_ctrl->top, cur_line_ctrl->bottom, n_changes);
- cur += 4;
-
- for (c = 0; c < n_changes; c++) {
- SpuPixCtrlI *cur_pix_ctrl = cur_line_ctrl->pix_ctrl_i + c;
-
- cur_pix_ctrl->left = ((cur[0] << 8) & 0x300) | cur[1];
- cur_pix_ctrl->palette = GST_READ_UINT32_BE (cur + 2);
- GST_LOG_OBJECT (dvdspu, " %d: left: %d palette 0x%x", c,
- cur_pix_ctrl->left, cur_pix_ctrl->palette);
- cur += 6;
- }
- }
-}
-
-static void
-gst_dvd_spu_exec_cmd_blk (GstDVDSpu * dvdspu, guint8 * data, guint8 * end)
-{
- SpuState *state = &dvdspu->spu_state;
-
- while (data < end) {
- guint8 cmd;
-
- cmd = data[0];
-
- switch (cmd) {
- case SPU_CMD_FSTA_DSP:
- GST_DEBUG_OBJECT (dvdspu, " Forced Display");
- state->flags |= SPU_STATE_FORCED_DSP;
- data += 1;
- break;
- case SPU_CMD_DSP:
- GST_DEBUG_OBJECT (dvdspu, " Display On");
- state->flags |= SPU_STATE_DISPLAY;
- data += 1;
- break;
- case SPU_CMD_STP_DSP:
- GST_DEBUG_OBJECT (dvdspu, " Display Off");
- state->flags &= ~(SPU_STATE_FORCED_DSP | SPU_STATE_DISPLAY);
- data += 1;
- break;
- case SPU_CMD_SET_COLOR:{
- if (G_UNLIKELY (data + 3 >= end))
- return; /* Invalid SET_COLOR cmd at the end of the blk */
-
- state->main_idx[3] = data[1] >> 4;
- state->main_idx[2] = data[1] & 0x0f;
- state->main_idx[1] = data[2] >> 4;
- state->main_idx[0] = data[2] & 0x0f;
-
- state->main_pal_dirty = TRUE;
-
- GST_DEBUG_OBJECT (dvdspu,
- " Set Color bg %u pattern %u emph-1 %u emph-2 %u",
- state->main_idx[0], state->main_idx[1], state->main_idx[2],
- state->main_idx[3]);
- data += 3;
- break;
- }
- case SPU_CMD_SET_ALPHA:{
- if (G_UNLIKELY (data + 3 >= end))
- return; /* Invalid SET_ALPHA cmd at the end of the blk */
-
- state->main_alpha[3] = data[1] >> 4;
- state->main_alpha[2] = data[1] & 0x0f;
- state->main_alpha[1] = data[2] >> 4;
- state->main_alpha[0] = data[2] & 0x0f;
-
- state->main_pal_dirty = TRUE;
-
- GST_DEBUG_OBJECT (dvdspu,
- " Set Alpha bg %u pattern %u emph-1 %u emph-2 %u",
- state->main_alpha[0], state->main_alpha[1], state->main_alpha[2],
- state->main_alpha[3]);
- data += 3;
- break;
- }
- case SPU_CMD_SET_DAREA:{
- SpuRect *r = &state->disp_rect;
-
- if (G_UNLIKELY (data + 7 >= end))
- return; /* Invalid SET_DAREA cmd at the end of the blk */
-
- r->top = ((data[4] & 0x3f) << 4) | ((data[5] & 0xe0) >> 4);
- r->left = ((data[1] & 0x3f) << 4) | ((data[2] & 0xf0) >> 4);
- r->right = ((data[2] & 0x03) << 8) | data[3];
- r->bottom = ((data[5] & 0x03) << 8) | data[6];
-
- GST_DEBUG_OBJECT (dvdspu,
- " Set Display Area top %u left %u bottom %u right %u", r->top,
- r->left, r->bottom, r->right);
-
- data += 7;
- break;
- }
- case SPU_CMD_DSPXA:{
- if (G_UNLIKELY (data + 5 >= end))
- return; /* Invalid SET_DSPXE cmd at the end of the blk */
-
- state->pix_data[0] = GST_READ_UINT16_BE (data + 1);
- state->pix_data[1] = GST_READ_UINT16_BE (data + 3);
- /* Store a reference to the current command buffer, as that's where
- * we'll need to take our pixel data from */
- gst_buffer_replace (&state->pix_buf, state->buf);
-
- GST_DEBUG_OBJECT (dvdspu, " Set Pixel Data Offsets top: %u bot: %u",
- state->pix_data[0], state->pix_data[1]);
-
- data += 5;
- break;
- }
- case SPU_CMD_CHG_COLCON:{
- guint16 field_size;
-
- GST_DEBUG_OBJECT (dvdspu, " Set Color & Contrast Change");
- if (G_UNLIKELY (data + 3 >= end))
- return; /* Invalid CHG_COLCON cmd at the end of the blk */
-
- data++;
- field_size = GST_READ_UINT16_BE (data);
-
- if (G_UNLIKELY (data + field_size >= end))
- return; /* Invalid CHG_COLCON cmd at the end of the blk */
-
- gst_dvd_spu_parse_chg_colcon (dvdspu, data + 2, data + field_size);
- state->line_ctrl_i_pal_dirty = TRUE;
- data += field_size;
- break;
- }
- case SPU_CMD_END:
- default:
- GST_DEBUG_OBJECT (dvdspu, " END");
- data = end;
- break;
- }
- }
-}
-
-static void
-gst_dvd_spu_finish_spu_buf (GstDVDSpu * dvdspu)
-{
- SpuState *state = &dvdspu->spu_state;
-
- state->next_ts = state->base_ts = GST_CLOCK_TIME_NONE;
- gst_buffer_replace (&state->buf, NULL);
-
- GST_DEBUG_OBJECT (dvdspu, "Finished SPU buffer");
-}
-
-static gboolean
-gst_dvd_spu_setup_cmd_blk (GstDVDSpu * dvdspu, guint16 cmd_blk_offset,
- guint8 * start, guint8 * end)
-{
- SpuState *state = &dvdspu->spu_state;
- guint16 delay;
- guint8 *cmd_blk = start + cmd_blk_offset;
-
- if (G_UNLIKELY (cmd_blk + 5 >= end))
- return FALSE; /* No valid command block to read */
-
- delay = GST_READ_UINT16_BE (cmd_blk);
- state->next_ts = state->base_ts + STM_TO_GST (delay);
- state->cur_cmd_blk = cmd_blk_offset;
-
- GST_DEBUG_OBJECT (dvdspu, "Setup CMD Block @ %u with TS %" GST_TIME_FORMAT,
- state->cur_cmd_blk, GST_TIME_ARGS (state->next_ts));
- return TRUE;
-}
-
-static void
-gst_dvd_spu_handle_new_spu_buf (GstDVDSpu * dvdspu, SpuPacket * packet)
-{
- guint8 *start, *end;
- SpuState *state = &dvdspu->spu_state;
-
- if (G_UNLIKELY (GST_BUFFER_SIZE (packet->buf) < 4))
- goto invalid;
-
- if (state->buf != NULL) {
- gst_buffer_unref (state->buf);
- state->buf = NULL;
- }
- state->buf = packet->buf;
- state->base_ts = packet->event_ts;
-
- start = GST_BUFFER_DATA (state->buf);
- end = start + GST_BUFFER_SIZE (state->buf);
-
- /* Configure the first command block in this buffer as our initial blk */
- state->cur_cmd_blk = GST_READ_UINT16_BE (start + 2);
- gst_dvd_spu_setup_cmd_blk (dvdspu, state->cur_cmd_blk, start, end);
- /* Clear existing chg-colcon info */
- state->n_line_ctrl_i = 0;
- if (state->line_ctrl_i != NULL) {
- g_free (state->line_ctrl_i);
- state->line_ctrl_i = NULL;
- }
- return;
-
-invalid:
- /* Invalid buffer */
- gst_dvd_spu_finish_spu_buf (dvdspu);
-}
-
-static void
gst_dvd_spu_handle_dvd_event (GstDVDSpu * dvdspu, GstEvent * event)
{
- const gchar *event_type;
const GstStructure *structure = gst_event_get_structure (event);
- SpuState *state = &dvdspu->spu_state;
+ const gchar *event_type = gst_structure_get_string (structure, "event");
gboolean hl_change = FALSE;
- event_type = gst_structure_get_string (structure, "event");
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));
- if (strcmp (event_type, "dvd-spu-clut-change") == 0) {
- gchar prop_name[32];
- gint i;
- gint entry;
-
- for (i = 0; i < 16; i++) {
- g_snprintf (prop_name, 32, "clut%02d", i);
- if (!gst_structure_get_int (structure, prop_name, &entry))
- entry = 0;
- state->current_clut[i] = (guint32) entry;
- }
-
- state->main_pal_dirty = TRUE;
- state->hl_pal_dirty = TRUE;
- state->line_ctrl_i_pal_dirty = TRUE;
- hl_change = TRUE;
- } else if (strcmp (event_type, "dvd-spu-highlight") == 0) {
- gint val;
-
- if (gst_structure_get_int (structure, "palette", &val)) {
- state->hl_idx[3] = ((guint32) (val) >> 28) & 0x0f;
- state->hl_idx[2] = ((guint32) (val) >> 24) & 0x0f;
- state->hl_idx[1] = ((guint32) (val) >> 20) & 0x0f;
- state->hl_idx[0] = ((guint32) (val) >> 16) & 0x0f;
-
- state->hl_alpha[3] = ((guint32) (val) >> 12) & 0x0f;
- state->hl_alpha[2] = ((guint32) (val) >> 8) & 0x0f;
- state->hl_alpha[1] = ((guint32) (val) >> 4) & 0x0f;
- state->hl_alpha[0] = ((guint32) (val) >> 0) & 0x0f;
-
- state->hl_pal_dirty = TRUE;
- }
- if (gst_structure_get_int (structure, "sx", &val))
- state->hl_rect.left = (gint16) val;
- if (gst_structure_get_int (structure, "sy", &val))
- state->hl_rect.top = (gint16) val;
- if (gst_structure_get_int (structure, "ex", &val))
- state->hl_rect.right = (gint16) val;
- if (gst_structure_get_int (structure, "ey", &val))
- state->hl_rect.bottom = (gint16) val;
-
- GST_INFO_OBJECT (dvdspu, "Highlight rect is now (%d,%d) to (%d,%d)",
- state->hl_rect.left, state->hl_rect.top,
- state->hl_rect.right, state->hl_rect.bottom);
- hl_change = TRUE;
- } else if (strcmp (event_type, "dvd-spu-reset-highlight") == 0) {
- if (state->hl_rect.top != -1 || state->hl_rect.bottom != -1)
- hl_change = TRUE;
- state->hl_rect.top = -1;
- state->hl_rect.bottom = -1;
- GST_INFO_OBJECT (dvdspu, "Highlight off");
- } else if (strcmp (event_type, "dvd-set-subpicture-track") == 0) {
- gboolean forced_only;
-
- if (gst_structure_get_boolean (structure, "forced-only", &forced_only)) {
- gboolean was_forced = (state->flags & SPU_STATE_FORCED_ONLY);
-
- if (forced_only)
- state->flags |= SPU_STATE_FORCED_ONLY;
- else
- state->flags &= ~(SPU_STATE_FORCED_ONLY);
-
- if ((was_forced && !forced_only) || (!was_forced && forced_only))
- hl_change = TRUE;
- }
+ switch (dvdspu->spu_input_type) {
+ case SPU_INPUT_TYPE_VOBSUB:
+ hl_change = gstspu_vobsub_handle_dvd_event (dvdspu, event);
+ break;
+ case SPU_INPUT_TYPE_PGS:
+ hl_change = gstspu_pgs_handle_dvd_event (dvdspu, event);
+ break;
+ default:
+ break;
}
- if (hl_change && (state->flags & SPU_STATE_STILL_FRAME)) {
- gst_dvd_spu_redraw_still (dvdspu);
+ if (hl_change && (dvdspu->spu_state.flags & SPU_STATE_STILL_FRAME)) {
+ gst_dvd_spu_redraw_still (dvdspu, FALSE);
}
-
- gst_event_unref (event);
}
-#if DUMP_DCSQ
-static void
-gst_dvd_spu_dump_dcsq (GstDVDSpu * dvdspu,
- GstClockTime start_ts, GstBuffer * spu_buf)
+static gboolean
+gstspu_execute_event (GstDVDSpu * dvdspu)
{
- guint16 cmd_blk_offset;
- guint16 next_blk;
- guint8 *start, *end;
-
- start = GST_BUFFER_DATA (spu_buf);
- end = start + GST_BUFFER_SIZE (spu_buf);
-
- g_return_if_fail (start != NULL);
-
- /* First command */
- next_blk = GST_READ_UINT16_BE (start + 2);
- cmd_blk_offset = 0;
-
- /* Loop through all commands */
- g_print ("SPU begins @ %" GST_TIME_FORMAT " offset %u\n",
- GST_TIME_ARGS (start_ts), next_blk);
-
- while (cmd_blk_offset != next_blk) {
- guint8 *data;
- GstClockTime cmd_blk_ts;
-
- cmd_blk_offset = next_blk;
-
- if (G_UNLIKELY (start + cmd_blk_offset + 5 >= end))
- break; /* No valid command to read */
-
- data = start + cmd_blk_offset;
-
- cmd_blk_ts = start_ts + STM_TO_GST (GST_READ_UINT16_BE (data));
- next_blk = GST_READ_UINT16_BE (data + 2);
-
- g_print ("Cmd Blk @ offset %u next %u ts %" GST_TIME_FORMAT "\n",
- cmd_blk_offset, next_blk, GST_TIME_ARGS (cmd_blk_ts));
-
- data += 4;
- gst_dvd_spu_exec_cmd_blk (dvdspu, data, end);
+ switch (dvdspu->spu_input_type) {
+ case SPU_INPUT_TYPE_VOBSUB:
+ return gstspu_vobsub_execute_event (dvdspu);
+ break;
+ case SPU_INPUT_TYPE_PGS:
+ return gstspu_pgs_execute_event (dvdspu);
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
}
+ return FALSE;
}
-#endif
/* Advance the SPU packet/command queue to a time. new_ts is in running time */
static void
@@ -1057,11 +762,15 @@ gst_dvd_spu_advance_spu (GstDVDSpu * dvdspu, GstClockTime new_ts)
{
SpuState *state = &dvdspu->spu_state;
+ if (G_UNLIKELY (dvdspu->spu_input_type == SPU_INPUT_TYPE_NONE))
+ return;
+
while (state->next_ts == GST_CLOCK_TIME_NONE || state->next_ts <= new_ts) {
- guint8 *start, *cmd_blk, *end;
- guint16 next_blk;
+ GST_DEBUG_OBJECT (dvdspu,
+ "Advancing SPU from TS %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (state->next_ts), GST_TIME_ARGS (new_ts));
- if (state->buf == NULL) {
+ if (!gstspu_execute_event (dvdspu)) {
GstClockTime vid_run_ts;
/* No current command buffer, try and get one */
@@ -1082,51 +791,25 @@ gst_dvd_spu_advance_spu (GstDVDSpu * dvdspu, GstClockTime new_ts)
packet->buf ? "buffer" : "event");
if (packet->buf) {
-#if DUMP_DCSQ
- gst_dvd_spu_dump_dcsq (dvdspu, packet->event_ts, packet->buf);
-#endif
- gst_dvd_spu_handle_new_spu_buf (dvdspu, packet);
- }
- if (packet->event)
+ switch (dvdspu->spu_input_type) {
+ case SPU_INPUT_TYPE_VOBSUB:
+ gstspu_vobsub_handle_new_buf (dvdspu, packet->event_ts,
+ packet->buf);
+ break;
+ case SPU_INPUT_TYPE_PGS:
+ gstspu_pgs_handle_new_buf (dvdspu, packet->event_ts, packet->buf);
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+ g_assert (packet->event == NULL);
+ } else if (packet->event)
gst_dvd_spu_handle_dvd_event (dvdspu, packet->event);
g_free (packet);
continue;
}
-
- GST_DEBUG_OBJECT (dvdspu,
- "Advancing SPU from TS %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT,
- GST_TIME_ARGS (state->next_ts), GST_TIME_ARGS (new_ts));
-
- /* If we get here, we have an SPU buffer, and it's time to process the
- * next cmd */
- g_assert (state->buf != NULL);
-
- GST_DEBUG_OBJECT (dvdspu, "Executing cmd blk with TS %" GST_TIME_FORMAT
- " @ offset %u", GST_TIME_ARGS (state->next_ts), state->cur_cmd_blk);
-
- start = GST_BUFFER_DATA (state->buf);
- end = start + GST_BUFFER_SIZE (state->buf);
-
- cmd_blk = start + state->cur_cmd_blk;
-
- if (G_UNLIKELY (cmd_blk + 5 >= end)) {
- /* Invalid. Finish the buffer and loop again */
- gst_dvd_spu_finish_spu_buf (dvdspu);
- continue;
- }
-
- gst_dvd_spu_exec_cmd_blk (dvdspu, cmd_blk + 4, end);
-
- next_blk = GST_READ_UINT16_BE (cmd_blk + 2);
- if (next_blk != state->cur_cmd_blk) {
- /* Advance to the next block of commands */
- gst_dvd_spu_setup_cmd_blk (dvdspu, next_blk, start, end);
- } else {
- /* Next Block points to the current block, so we're finished with this
- * SPU buffer */
- gst_dvd_spu_finish_spu_buf (dvdspu);
- }
}
}
@@ -1152,10 +835,66 @@ gst_dvd_spu_check_still_updates (GstDVDSpu * dvdspu)
}
}
+static void
+submit_new_spu_packet (GstDVDSpu * dvdspu, GstBuffer * buf)
+{
+ SpuPacket *spu_packet;
+ GstClockTime ts;
+ GstClockTime run_ts = GST_CLOCK_TIME_NONE;
+
+ GST_DEBUG_OBJECT (dvdspu,
+ "Complete subpicture buffer of %u bytes with TS %" GST_TIME_FORMAT,
+ GST_BUFFER_SIZE (buf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));
+
+ /* Decide whether to pass this buffer through to the rendering code */
+ ts = GST_BUFFER_TIMESTAMP (buf);
+ if (GST_CLOCK_TIME_IS_VALID (ts)) {
+ if (ts < (GstClockTime) dvdspu->subp_seg.start) {
+ GstClockTimeDiff diff = dvdspu->subp_seg.start - ts;
+
+ /* Buffer starts before segment, see if we can calculate a running time */
+ run_ts =
+ gst_segment_to_running_time (&dvdspu->subp_seg, GST_FORMAT_TIME,
+ dvdspu->subp_seg.start);
+ if (run_ts >= (GstClockTime) diff)
+ run_ts -= diff;
+ else
+ run_ts = GST_CLOCK_TIME_NONE; /* No running time possible for this subpic */
+ } else {
+ /* TS within segment, convert to running time */
+ run_ts =
+ gst_segment_to_running_time (&dvdspu->subp_seg, GST_FORMAT_TIME, ts);
+ }
+ }
+
+ if (GST_CLOCK_TIME_IS_VALID (run_ts)) {
+ /* Complete SPU packet, push it onto the queue for processing when
+ * video packets come past */
+ spu_packet = g_new0 (SpuPacket, 1);
+ spu_packet->buf = buf;
+
+ /* Store the activation time of this buffer in running time */
+ spu_packet->event_ts = run_ts;
+ GST_INFO_OBJECT (dvdspu,
+ "Pushing SPU buf with TS %" GST_TIME_FORMAT " running time %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (ts),
+ GST_TIME_ARGS (spu_packet->event_ts));
+
+ g_queue_push_tail (dvdspu->pending_spus, spu_packet);
+
+ /* In a still frame condition, advance the SPU to make sure the state is
+ * up to date */
+ gst_dvd_spu_check_still_updates (dvdspu);
+ } else {
+ gst_buffer_unref (buf);
+ }
+}
+
static GstFlowReturn
gst_dvd_spu_subpic_chain (GstPad * pad, GstBuffer * buf)
{
GstDVDSpu *dvdspu = (GstDVDSpu *) (gst_object_get_parent (GST_OBJECT (pad)));
+ GstFlowReturn ret = GST_FLOW_OK;
g_return_val_if_fail (dvdspu != NULL, GST_FLOW_ERROR);
@@ -1170,7 +909,15 @@ gst_dvd_spu_subpic_chain (GstPad * pad, GstBuffer * buf)
GST_BUFFER_TIMESTAMP (buf));
}
+ if (GST_BUFFER_IS_DISCONT (buf) && dvdspu->partial_spu) {
+ gst_buffer_unref (dvdspu->partial_spu);
+ dvdspu->partial_spu = NULL;
+ }
+
if (dvdspu->partial_spu != NULL) {
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buf))
+ GST_WARNING_OBJECT (dvdspu,
+ "Joining subpicture buffer with timestamp to previous");
dvdspu->partial_spu = gst_buffer_join (dvdspu->partial_spu, buf);
} else {
/* If we don't yet have a buffer, wait for one with a timestamp,
@@ -1181,85 +928,88 @@ gst_dvd_spu_subpic_chain (GstPad * pad, GstBuffer * buf)
gst_buffer_unref (buf);
}
- if (dvdspu->partial_spu != NULL && GST_BUFFER_SIZE (dvdspu->partial_spu) > 4) {
- guint16 packet_size;
- guint8 *data;
-
- data = GST_BUFFER_DATA (dvdspu->partial_spu);
- packet_size = GST_READ_UINT16_BE (data);
-
- if (packet_size == GST_BUFFER_SIZE (dvdspu->partial_spu)) {
- SpuPacket *spu_packet;
- GstClockTime ts;
- GstClockTime run_ts = GST_CLOCK_TIME_NONE;
-
- GST_DEBUG_OBJECT (dvdspu,
- "Complete subpicture buffer of %u bytes with TS %" GST_TIME_FORMAT,
- GST_BUFFER_SIZE (dvdspu->partial_spu),
- GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (dvdspu->partial_spu)));
-
- /* Decide whether to pass this buffer through to the rendering code */
- ts = GST_BUFFER_TIMESTAMP (dvdspu->partial_spu);
- if (GST_CLOCK_TIME_IS_VALID (ts)) {
- if (ts < (GstClockTime) dvdspu->subp_seg.start) {
- GstClockTimeDiff diff = dvdspu->subp_seg.start - ts;
-
- /* Buffer starts before segment, see if we can calculate a running time */
- run_ts =
- gst_segment_to_running_time (&dvdspu->subp_seg, GST_FORMAT_TIME,
- dvdspu->subp_seg.start);
- if (run_ts >= (GstClockTime) diff)
- run_ts -= diff;
- else
- run_ts = GST_CLOCK_TIME_NONE; /* No running time possible for this subpic */
+ if (dvdspu->partial_spu == NULL)
+ goto done;
+
+ switch (dvdspu->spu_input_type) {
+ case SPU_INPUT_TYPE_VOBSUB:
+ if (GST_BUFFER_SIZE (dvdspu->partial_spu) > 4) {
+ guint16 packet_size;
+ guint8 *data;
+
+ data = GST_BUFFER_DATA (dvdspu->partial_spu);
+ packet_size = GST_READ_UINT16_BE (data);
+
+ if (packet_size == GST_BUFFER_SIZE (dvdspu->partial_spu)) {
+ submit_new_spu_packet (dvdspu, dvdspu->partial_spu);
+ dvdspu->partial_spu = NULL;
+ } else if (packet_size < GST_BUFFER_SIZE (dvdspu->partial_spu)) {
+ /* Somehow we collected too much - something is wrong. Drop the
+ * packet entirely and wait for a new one */
+ GST_DEBUG_OBJECT (dvdspu, "Discarding invalid SPU buffer of size %u",
+ GST_BUFFER_SIZE (dvdspu->partial_spu));
+
+ gst_buffer_unref (dvdspu->partial_spu);
+ dvdspu->partial_spu = NULL;
} else {
- /* TS within segment, convert to running time */
- run_ts =
- gst_segment_to_running_time (&dvdspu->subp_seg, GST_FORMAT_TIME,
- ts);
+ GST_LOG_OBJECT (dvdspu,
+ "SPU buffer claims to be of size %u. Collected %u so far.",
+ packet_size, GST_BUFFER_SIZE (dvdspu->partial_spu));
+ }
+ }
+ break;
+ case SPU_INPUT_TYPE_PGS:{
+ /* Collect until we have a command buffer that ends exactly at the size
+ * we've collected */
+ guint8 packet_type;
+ guint16 packet_size;
+ guint8 *data = GST_BUFFER_DATA (dvdspu->partial_spu);
+ guint8 *end = data + GST_BUFFER_SIZE (dvdspu->partial_spu);
+
+ /* FIXME: There's no need to walk the command set each time. We can set a
+ * marker and resume where we left off next time */
+ /* FIXME: Move the packet parsing and sanity checking into the format-specific modules */
+ while (data != end) {
+ if (data + 3 > end)
+ break;
+ packet_type = *data++;
+ packet_size = GST_READ_UINT16_BE (data);
+ data += 2;
+ if (data + packet_size > end)
+ break;
+ data += packet_size;
+ /* 0x80 is the END command for PGS packets */
+ if (packet_type == 0x80 && data != end) {
+ /* Extra cruft on the end of the packet -> assume invalid */
+ gst_buffer_unref (dvdspu->partial_spu);
+ dvdspu->partial_spu = NULL;
+ break;
}
}
- if (GST_CLOCK_TIME_IS_VALID (run_ts)) {
- /* Complete SPU packet, push it onto the queue for processing when
- * video packets come past */
- spu_packet = g_new0 (SpuPacket, 1);
- spu_packet->buf = dvdspu->partial_spu;
-
- /* Store the activation time of this buffer in running time */
- spu_packet->event_ts =
- gst_segment_to_running_time (&dvdspu->subp_seg, GST_FORMAT_TIME,
- ts);
- GST_INFO_OBJECT (dvdspu,
- "Pushing SPU buf with TS %" GST_TIME_FORMAT " running time %"
- GST_TIME_FORMAT, GST_TIME_ARGS (ts),
- GST_TIME_ARGS (spu_packet->event_ts));
-
- g_queue_push_tail (dvdspu->pending_spus, spu_packet);
- dvdspu->partial_spu = NULL;
-
- /* In a still frame condition, advance the SPU to make sure the state is
- * up to date */
- gst_dvd_spu_check_still_updates (dvdspu);
- } else {
- gst_buffer_unref (dvdspu->partial_spu);
+ if (dvdspu->partial_spu && data == end) {
+ GST_DEBUG_OBJECT (dvdspu,
+ "Have complete PGS packet of size %u. Enqueueing.",
+ GST_BUFFER_SIZE (dvdspu->partial_spu));
+ submit_new_spu_packet (dvdspu, dvdspu->partial_spu);
dvdspu->partial_spu = NULL;
}
- } else if (packet_size < GST_BUFFER_SIZE (dvdspu->partial_spu)) {
- /* Somehow we collected too much - something is wrong. Drop the
- * packet entirely and wait for a new one */
- GST_DEBUG_OBJECT (dvdspu, "Discarding invalid SPU buffer of size %u",
- GST_BUFFER_SIZE (dvdspu->partial_spu));
-
- gst_buffer_unref (dvdspu->partial_spu);
- dvdspu->partial_spu = NULL;
+ break;
}
+ default:
+ GST_ERROR_OBJECT (dvdspu, "Input type not configured before SPU passing");
+ goto caps_not_set;
}
+done:
DVD_SPU_UNLOCK (dvdspu);
-
gst_object_unref (dvdspu);
- return GST_FLOW_OK;
+ return ret;
+caps_not_set:
+ GST_ELEMENT_ERROR (dvdspu, RESOURCE, NO_SPACE_LEFT,
+ (_("Subpicture format was not configured before data flow")), (NULL));
+ ret = GST_FLOW_ERROR;
+ goto done;
}
static gboolean
@@ -1287,7 +1037,8 @@ gst_dvd_spu_subpic_event (GstPad * pad, GstEvent * event)
DVD_SPU_LOCK (dvdspu);
if (GST_EVENT_IS_SERIALIZED (event)) {
SpuPacket *spu_packet = g_new0 (SpuPacket, 1);
-
+ GST_DEBUG_OBJECT (dvdspu,
+ "Enqueueing DVD event on subpicture pad for later");
spu_packet->event = event;
g_queue_push_tail (dvdspu->pending_spus, spu_packet);
} else {
@@ -1348,8 +1099,11 @@ gst_dvd_spu_subpic_event (GstPad * pad, GstEvent * event)
GST_TIME_ARGS (stop), GST_TIME_ARGS (time));
DVD_SPU_LOCK (dvdspu);
+
gst_segment_set_newsegment_full (&dvdspu->subp_seg, update, rate, arate,
format, start, stop, time);
+ GST_LOG_OBJECT (dvdspu, "Subpicture segment now: %" GST_SEGMENT_FORMAT,
+ &dvdspu->subp_seg);
DVD_SPU_UNLOCK (dvdspu);
gst_event_unref (event);
@@ -1359,8 +1113,10 @@ gst_dvd_spu_subpic_event (GstPad * pad, GstEvent * event)
gst_event_unref (event);
goto done;
case GST_EVENT_FLUSH_STOP:
+ GST_DEBUG_OBJECT (dvdspu, "Have flush-stop event on SPU pad");
DVD_SPU_LOCK (dvdspu);
- gst_dvd_spu_flush_spu_info (dvdspu);
+ gst_segment_init (&dvdspu->subp_seg, GST_FORMAT_UNDEFINED);
+ gst_dvd_spu_flush_spu_info (dvdspu, TRUE);
DVD_SPU_UNLOCK (dvdspu);
/* We don't forward flushes on the spu pad */
@@ -1383,6 +1139,39 @@ done:
return res;
}
+static gboolean
+gst_dvd_spu_subpic_set_caps (GstPad * pad, GstCaps * caps)
+{
+ GstDVDSpu *dvdspu = GST_DVD_SPU (gst_pad_get_parent (pad));
+ gboolean res = FALSE;
+ GstStructure *s;
+ SpuInputType input_type;
+
+ s = gst_caps_get_structure (caps, 0);
+
+ if (gst_structure_has_name (s, "video/x-dvd-subpicture")) {
+ input_type = SPU_INPUT_TYPE_VOBSUB;
+ } else if (gst_structure_has_name (s, "subpicture/x-pgs")) {
+ input_type = SPU_INPUT_TYPE_PGS;
+ } else {
+ goto done;
+ }
+
+ DVD_SPU_LOCK (dvdspu);
+ if (dvdspu->spu_input_type != input_type) {
+ GST_INFO_OBJECT (dvdspu, "Incoming SPU packet type changed to %u",
+ input_type);
+ dvdspu->spu_input_type = input_type;
+ gst_dvd_spu_flush_spu_info (dvdspu, TRUE);
+ }
+
+ DVD_SPU_UNLOCK (dvdspu);
+ res = TRUE;
+done:
+ gst_object_unref (dvdspu);
+ return res;
+}
+
static GstStateChangeReturn
gst_dvd_spu_change_state (GstElement * element, GstStateChange transition)
{
@@ -1407,8 +1196,8 @@ gst_dvd_spu_change_state (GstElement * element, GstStateChange transition)
gboolean
gst_dvd_spu_plugin_init (GstPlugin * plugin)
{
- GST_DEBUG_CATEGORY_INIT (dvdspu_debug, "gstdvdspu",
- 0, "DVD Sub-picture Overlay decoder/renderer");
+ GST_DEBUG_CATEGORY_INIT (dvdspu_debug, "gstspu",
+ 0, "Sub-picture Overlay decoder/renderer");
return gst_element_register (plugin, "dvdspu",
GST_RANK_NONE, GST_TYPE_DVD_SPU);
diff --git a/gst/dvdspu/gstdvdspu.h b/gst/dvdspu/gstdvdspu.h
index dfc51f9e..22b48d1d 100644
--- a/gst/dvdspu/gstdvdspu.h
+++ b/gst/dvdspu/gstdvdspu.h
@@ -16,11 +16,15 @@
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
-#ifndef __DVD_SPU_H__
-#define __DVD_SPU_H__
+#ifndef __GST_DVD_SPU_H__
+#define __GST_DVD_SPU_H__
#include <gst/gst.h>
+#include "gstspu-common.h"
+#include "gstspu-vobsub.h"
+#include "gstspu-pgs.h"
+
G_BEGIN_DECLS
#define GST_TYPE_DVD_SPU \
@@ -37,63 +41,16 @@ G_BEGIN_DECLS
#define DVD_SPU_LOCK(s) g_mutex_lock ((s)->spu_lock);
#define DVD_SPU_UNLOCK(s) g_mutex_unlock ((s)->spu_lock);
-typedef struct _GstDVDSpu GstDVDSpu;
typedef struct _GstDVDSpuClass GstDVDSpuClass;
-typedef struct SpuRect SpuRect;
-typedef struct SpuPixCtrlI SpuPixCtrlI;
-typedef struct SpuLineCtrlI SpuLineCtrlI;
-typedef struct SpuColour SpuColour;
typedef enum SpuStateFlags SpuStateFlags;
-typedef struct SpuState SpuState;
+typedef enum SpuInputType SpuInputType;
typedef struct SpuPacket SpuPacket;
-typedef enum SpuCmd SpuCmd;
-
-/* Describe the limits of a rectangle */
-struct SpuRect {
- gint16 left;
- gint16 top;
- gint16 right;
- gint16 bottom;
-};
-
-/* Store a pre-multiplied colour value. The YUV fields hold the YUV values
- * multiplied by the 8-bit alpha, to save computing it while rendering */
-struct SpuColour {
- guint16 Y;
- guint16 U;
- guint16 V;
- guint8 A;
-};
-
-/* Pixel Control Info from a Change Color Contrast command */
-struct SpuPixCtrlI {
- gint16 left;
- guint32 palette;
-
- /* Pre-multiplied palette values, updated as
- * needed */
- SpuColour pal_cache[4];
-};
-
-struct SpuLineCtrlI {
- guint8 n_changes; /* 1 to 8 */
- SpuPixCtrlI pix_ctrl_i[8];
-
- gint16 top;
- gint16 bottom;
-};
-enum SpuCmd {
- SPU_CMD_FSTA_DSP = 0x00, /* Forced Display */
- SPU_CMD_DSP = 0x01, /* Display Start */
- SPU_CMD_STP_DSP = 0x02, /* Display Off */
- SPU_CMD_SET_COLOR = 0x03, /* Set the color indexes for the palette */
- SPU_CMD_SET_ALPHA = 0x04, /* Set the alpha indexes for the palette */
- SPU_CMD_SET_DAREA = 0x05, /* Set the display area for the SPU */
- SPU_CMD_DSPXA = 0x06, /* Pixel data addresses */
- SPU_CMD_CHG_COLCON = 0x07, /* Change Color & Contrast */
- SPU_CMD_END = 0xff
+enum SpuInputType {
+ SPU_INPUT_TYPE_NONE = 0x00,
+ SPU_INPUT_TYPE_VOBSUB = 0x01,
+ SPU_INPUT_TYPE_PGS = 0x02
};
enum SpuStateFlags {
@@ -110,69 +67,19 @@ enum SpuStateFlags {
struct SpuState {
GstClockTime next_ts; /* Next event TS in running time */
-
- GstClockTime base_ts; /* base TS for cmd blk delays in running time */
- GstBuffer *buf; /* Current SPU packet we're executing commands from */
- guint16 cur_cmd_blk; /* Offset into the buf for the current cmd block */
-
SpuStateFlags flags;
-
- /* Top + Bottom field offsets in the buffer. 0 = not set */
- guint16 pix_data[2];
- GstBuffer *pix_buf; /* Current SPU packet the pix_data references */
-
- SpuRect disp_rect;
- SpuRect clip_rect;
- SpuRect hl_rect;
-
- guint32 current_clut[16]; /* Colour lookup table from incoming events */
-
- guint8 main_idx[4]; /* Indices for current main palette */
- guint8 main_alpha[4]; /* Alpha values for main palette */
-
- guint8 hl_idx[4]; /* Indices for current highlight palette */
- guint8 hl_alpha[4]; /* Alpha values for highlight palette */
-
- /* Pre-multiplied colour palette for the main palette */
- SpuColour main_pal[4];
- gboolean main_pal_dirty;
-
- /* Line control info for rendering the highlight palette */
- SpuLineCtrlI hl_ctrl_i;
- gboolean hl_pal_dirty; /* Indicates that the HL palette info needs refreshing */
-
- /* LineCtrlI Info from a Change Color & Contrast command */
- SpuLineCtrlI *line_ctrl_i;
- gint16 n_line_ctrl_i;
- gboolean line_ctrl_i_pal_dirty; /* Indicates that the palettes for the line_ctrl_i
- * need recalculating */
-
- /* Rendering state vars below */
- guint16 *comp_bufs[3]; /* Compositing buffers for U+V & A */
- gint16 comp_last_x[2]; /* Maximum X values we rendered into the comp buffer (odd & even) */
- gint16 *comp_last_x_ptr; /* Ptr to the current comp_last_x value to be updated by the render */
+
+ gint fps_n, fps_d;
gint16 vid_width, vid_height;
gint16 Y_stride, UV_stride;
gint16 Y_height, UV_height;
- gint fps_n, fps_d;
-
- /* Current Y Position */
- gint16 cur_Y;
-
- /* Current offset in nibbles into the pix_data */
- guint16 cur_offsets[2];
- guint16 max_offset;
-
- /* current ChgColCon Line Info */
- SpuLineCtrlI *cur_chg_col;
- SpuLineCtrlI *cur_chg_col_end;
+ guint32 *comp_bufs[3]; /* Compositing buffers for U+V & A */
+ guint16 comp_left;
+ guint16 comp_right;
- /* Output position tracking */
- guint8 *out_Y;
- guint16 *out_U;
- guint16 *out_V;
- guint16 *out_A;
+ SpuVobsubState vobsub;
+ SpuPgsState pgs;
};
/* Structure used to store the queue of pending SPU packets. The start_ts is
@@ -198,6 +105,7 @@ struct _GstDVDSpu {
GstSegment subp_seg;
SpuState spu_state;
+ SpuInputType spu_input_type;
/* GQueue of SpuBuf structures */
GQueue *pending_spus;
@@ -221,4 +129,4 @@ GType gst_dvd_spu_get_type (void);
G_END_DECLS
-#endif /* __DVD_SPU_H__ */
+#endif /* __GST_DVD_SPU_H__ */
diff --git a/gst/dvdspu/gstspu-common.h b/gst/dvdspu/gstspu-common.h
new file mode 100644
index 00000000..206e8820
--- /dev/null
+++ b/gst/dvdspu/gstspu-common.h
@@ -0,0 +1,56 @@
+/* GStreamer DVD Sub-Picture Unit
+ * Copyright (C) 2007 Fluendo S.A. <info@fluendo.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#ifndef __GSTSPU_COMMON_H__
+#define __GSTSPU_COMMON_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+/* FIXME: Move this back to gstdvdspu.h when the renderers no longer use it: */
+typedef struct _GstDVDSpu GstDVDSpu;
+
+typedef struct SpuState SpuState;
+typedef struct SpuColour SpuColour;
+typedef struct SpuRect SpuRect;
+
+/* Describe the limits of a rectangle */
+struct SpuRect {
+ gint16 left;
+ gint16 top;
+ gint16 right;
+ gint16 bottom;
+};
+
+/* Store a pre-multiplied colour value. The YUV fields hold the YUV values
+ * multiplied by the 8-bit alpha, to save computing it while rendering */
+struct SpuColour {
+ guint16 Y;
+ guint16 U;
+ guint16 V;
+ guint8 A;
+};
+
+void gstspu_clear_comp_buffers (SpuState * state);
+void gstspu_blend_comp_buffers (SpuState * state, guint8 * planes[3]);
+
+
+G_END_DECLS
+
+#endif /* __GSTSPU_COMMON_H__ */
diff --git a/gst/dvdspu/gstspu-pgs.c b/gst/dvdspu/gstspu-pgs.c
new file mode 100644
index 00000000..d1d4de18
--- /dev/null
+++ b/gst/dvdspu/gstspu-pgs.c
@@ -0,0 +1,762 @@
+/* GStreamer Sub-Picture Unit - PGS handling
+ * Copyright (C) 2009 Jan Schmidt <thaytan@noraisin.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.
+ */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+#include <gst/gst.h>
+
+#include "gstdvdspu.h"
+#include "gstspu-pgs.h"
+
+const struct PgsFrameRateEntry
+{
+ guint8 id;
+ guint fps_n;
+ guint fps_d;
+} PgsFrameRates[] = {
+ {
+ 64, 30000, 1001} /* 29.97 FPS */
+};
+
+typedef enum PgsCommandType PgsCommandType;
+
+enum PgsCommandType
+{
+ PGS_COMMAND_SET_PALETTE = 0x14,
+ PGS_COMMAND_SET_OBJECT_DATA = 0x15,
+ PGS_COMMAND_PRESENTATION_SEGMENT = 0x16,
+ PGS_COMMAND_SET_WINDOW = 0x17,
+ PGS_COMMAND_INTERACTIVE_SEGMENT = 0x18,
+
+ PGS_COMMAND_END_DISPLAY = 0x80,
+
+ PGS_COMMAND_INVALID = 0xFFFF
+};
+
+static gint gstspu_exec_pgs_buffer (GstDVDSpu * dvdspu, GstBuffer * buf);
+
+#define DUMP_CMDS 0
+#define DUMP_FULL_IMAGE 0
+#define DUMP_FULL_PALETTE 0
+
+#if DUMP_CMDS
+#define PGS_DUMP(...) g_print(__VA_ARGS__)
+#else
+#define PGS_DUMP(...)
+#endif
+
+static void
+dump_bytes (guint8 * data, guint16 len)
+{
+ gint i;
+
+ /* Dump the numbers */
+ for (i = 0; i < len; i++) {
+ PGS_DUMP ("0x%02x ", data[i]);
+ if (!((i + 1) % 16))
+ PGS_DUMP ("\n");
+ }
+ if (len > 0 && (i % 16))
+ PGS_DUMP ("\n");
+}
+
+static void
+dump_rle_data (GstDVDSpu * dvdspu, guint8 * data, guint32 len)
+{
+ guint8 *end = data + len;
+ guint16 obj_w, obj_h;
+ guint x = 0;
+
+ if (data + 4 > end)
+ return;
+
+ /* RLE data: */
+ obj_w = GST_READ_UINT16_BE (data);
+ obj_h = GST_READ_UINT16_BE (data + 2);
+ data += 4;
+ PGS_DUMP ("RLE image is %ux%u\n", obj_w, obj_h);
+
+ while (data < end) {
+ guint8 pal_id;
+ guint16 run_len;
+
+ pal_id = *data++;
+ if (pal_id != 0) {
+ // PGS_DUMP ("data 0x%02x\n", data[0]);
+ run_len = 1;
+ } else {
+ if (data + 1 > end)
+ return;
+ switch (data[0] & 0xC0) {
+ case 0x00:
+ //PGS_DUMP ("data 0x%02x\n", data[0]);
+ run_len = (data[0] & 0x3f);
+ data++;
+ break;
+ case 0x40:
+ if (data + 2 > end)
+ return;
+ //PGS_DUMP ("data 0x%02x 0x%02x\n", data[0], data[1]);
+ run_len = ((data[0] << 8) | data[1]) & 0x3fff;
+ data += 2;
+ break;
+ case 0x80:
+ if (data + 2 > end)
+ return;
+ //PGS_DUMP ("data 0x%02x 0x%02x\n", data[0], data[1]);
+ run_len = (data[0] & 0x3f);
+ pal_id = data[1];
+ data += 2;
+ break;
+ case 0xC0:
+ if (data + 3 > end)
+ return;
+ //PGS_DUMP ("data 0x%02x 0x%02x 0x%02x\n", data[0], data[1], data[2]);
+ run_len = ((data[0] << 8) | data[1]) & 0x3fff;
+ pal_id = data[2];
+ data += 3;
+ break;
+ }
+ }
+
+#if DUMP_FULL_IMAGE
+ {
+ gint i;
+#if 1
+ if (dvdspu->spu_state.pgs.palette[pal_id].A) {
+ guint8 val = dvdspu->spu_state.pgs.palette[pal_id].A;
+ for (i = 0; i < run_len; i++)
+ PGS_DUMP ("%02x ", val);
+ } else {
+ for (i = 0; i < run_len; i++)
+ PGS_DUMP (" ");
+ }
+ if (!run_len || (x + run_len) > obj_w)
+ PGS_DUMP ("\n");
+#else
+ PGS_DUMP ("Run x: %d pix: %d col: %d\n", x, run_len, pal_id);
+#endif
+ }
+#endif
+
+ x += run_len;
+ if (!run_len || x > obj_w)
+ x = 0;
+ };
+
+ PGS_DUMP ("\n");
+}
+
+static void
+pgs_composition_object_render (PgsCompositionObject * obj, SpuState * state,
+ GstBuffer * dest_buf)
+{
+ SpuColour *colour;
+ guint8 *planes[3]; /* YUV frame pointers */
+ guint8 *data, *end;
+ guint16 obj_w, obj_h;
+ guint x, y, i, max_x;
+
+ if (G_UNLIKELY (obj->rle_data == NULL || obj->rle_data_size == 0
+ || obj->rle_data_used != obj->rle_data_size))
+ return;
+
+ data = obj->rle_data;
+ end = data + obj->rle_data_used;
+
+ if (data + 4 > end)
+ return;
+
+ /* FIXME: Calculate and use the cropping window for the output, as the
+ * intersection of the crop rectangle for this object (if any) and the
+ * window specified by the object's window_id */
+
+ /* Store the start of each plane */
+ planes[0] = GST_BUFFER_DATA (dest_buf);
+ planes[1] = planes[0] + (state->Y_height * state->Y_stride);
+ planes[2] = planes[1] + (state->UV_height * state->UV_stride);
+
+ /* Sanity check */
+ g_return_if_fail (planes[2] + (state->UV_height * state->UV_stride) <=
+ GST_BUFFER_DATA (dest_buf) + GST_BUFFER_SIZE (dest_buf));
+
+ x = obj->x;
+ y = obj->y;
+
+ planes[0] += state->Y_stride * y;
+ planes[1] += state->UV_stride * (y / 2);
+ planes[2] += state->UV_stride * (y / 2);
+
+ /* RLE data: */
+ obj_w = GST_READ_UINT16_BE (data);
+ obj_h = GST_READ_UINT16_BE (data + 2);
+ data += 4;
+
+ max_x = x + obj_w;
+
+ state->comp_left = x;
+ state->comp_right = max_x;
+
+ gstspu_clear_comp_buffers (state);
+
+ while (data < end) {
+ guint8 pal_id;
+ guint16 run_len;
+
+ pal_id = *data++;
+ if (pal_id != 0) {
+ run_len = 1;
+ } else {
+ if (data + 1 > end)
+ return;
+ switch (data[0] & 0xC0) {
+ case 0x00:
+ run_len = (data[0] & 0x3f);
+ data++;
+ break;
+ case 0x40:
+ if (data + 2 > end)
+ return;
+ run_len = ((data[0] << 8) | data[1]) & 0x3fff;
+ data += 2;
+ break;
+ case 0x80:
+ if (data + 2 > end)
+ return;
+ run_len = (data[0] & 0x3f);
+ pal_id = data[1];
+ data += 2;
+ break;
+ case 0xC0:
+ if (data + 3 > end)
+ return;
+ run_len = ((data[0] << 8) | data[1]) & 0x3fff;
+ pal_id = data[2];
+ data += 3;
+ break;
+ }
+ }
+
+ colour = &state->pgs.palette[pal_id];
+ if (colour->A) {
+ guint32 inv_A = 0xff - colour->A;
+
+ for (i = 0; i < run_len; i++) {
+ planes[0][x] = (inv_A * planes[0][x] + colour->Y) / 0xff;
+
+ state->comp_bufs[0][x / 2] += colour->U;
+ state->comp_bufs[1][x / 2] += colour->V;
+ state->comp_bufs[2][x / 2] += colour->A;
+ x++;
+ }
+ } else {
+ x += run_len;
+ }
+
+ if (!run_len || x > max_x) {
+ x = state->pgs.win_x;
+ planes[0] += state->Y_stride;
+
+ if (y % 2) {
+ gstspu_blend_comp_buffers (state, planes);
+ gstspu_clear_comp_buffers (state);
+
+ planes[1] += state->UV_stride;
+ planes[2] += state->UV_stride;
+ }
+ y++;
+ }
+ }
+
+ if (y % 2)
+ gstspu_blend_comp_buffers (state, planes);
+}
+
+static void
+pgs_composition_object_clear (PgsCompositionObject * obj)
+{
+ if (obj->rle_data) {
+ g_free (obj->rle_data);
+ obj->rle_data = NULL;
+ }
+ obj->rle_data_size = obj->rle_data_used = 0;
+}
+
+static void
+pgs_presentation_segment_set_object_count (PgsPresentationSegment * ps,
+ guint8 n_objects)
+{
+ if (ps->objects == NULL) {
+ ps->objects =
+ g_array_sized_new (FALSE, TRUE, sizeof (PgsCompositionObject),
+ n_objects);
+ g_array_set_size (ps->objects, n_objects);
+ return;
+ }
+
+ /* Clear memory in any extraneous objects */
+ if (ps->objects->len > n_objects) {
+ guint i;
+ for (i = n_objects; i < ps->objects->len; i++) {
+ PgsCompositionObject *cur =
+ &g_array_index (ps->objects, PgsCompositionObject, i);
+ pgs_composition_object_clear (cur);
+ }
+ }
+
+ g_array_set_size (ps->objects, n_objects);
+
+ if (n_objects == 0) {
+ g_array_free (ps->objects, TRUE);
+ ps->objects = NULL;
+ }
+}
+
+static PgsCompositionObject *
+pgs_presentation_segment_find_object (PgsPresentationSegment * ps,
+ guint16 obj_id)
+{
+ guint i;
+ if (ps->objects == NULL)
+ return NULL;
+
+ for (i = 0; i < ps->objects->len; i++) {
+ PgsCompositionObject *cur =
+ &g_array_index (ps->objects, PgsCompositionObject, i);
+ if (cur->id == obj_id)
+ return cur;
+ }
+
+ return NULL;
+}
+
+static int
+parse_presentation_segment (GstDVDSpu * dvdspu, guint8 type, guint8 * payload,
+ guint16 len)
+{
+ guint8 *end = payload + len;
+ PgsPresentationSegment *ps = &dvdspu->spu_state.pgs.pres_seg;
+ guint8 n_objects, palette_id;
+ gint i;
+
+ /* Parse video descriptor */
+ if (payload + 5 > end)
+ return 0;
+
+ ps->vid_w = GST_READ_UINT16_BE (payload);
+ ps->vid_h = GST_READ_UINT16_BE (payload + 2);
+ ps->vid_fps_code = payload[4];
+ payload += 5;
+
+ /* Parse composition descriptor */
+ if (payload + 3 > end)
+ return 0;
+ ps->composition_no = GST_READ_UINT16_BE (payload);
+ ps->composition_state = payload[2];
+ payload += 3;
+
+ /* Parse other bits */
+ if (payload + 3 > end)
+ return 0;
+
+ ps->flags = payload[0];
+
+ palette_id = payload[1];
+ n_objects = payload[2];
+ payload += 3;
+
+ if (ps->flags & PGS_PRES_SEGMENT_FLAG_UPDATE_PALETTE)
+ ps->palette_id = palette_id;
+
+ PGS_DUMP ("Video width %u height %u fps code %u\n", ps->vid_w, ps->vid_h,
+ ps->vid_fps_code);
+ PGS_DUMP
+ ("Composition num %u state 0x%02x flags 0x%02x palette id %u n_objects %u\n",
+ ps->composition_no, ps->composition_state, ps->flags, ps->palette_id,
+ n_objects);
+
+ pgs_presentation_segment_set_object_count (ps, n_objects);
+
+ for (i = 0; i < (gint) n_objects; i++) {
+ PgsCompositionObject *obj =
+ &g_array_index (ps->objects, PgsCompositionObject, i);
+
+ if (payload + 8 > end)
+ break;
+ obj->id = GST_READ_UINT16_BE (payload);
+ obj->win_id = payload[2];
+ obj->flags = payload[3];
+ obj->x = GST_READ_UINT16_BE (payload + 4);
+ obj->y = GST_READ_UINT16_BE (payload + 6);
+ obj->rle_data_size = obj->rle_data_used = 0;
+
+ payload += 8;
+
+ PGS_DUMP ("Composition object %d Object ID %u Window ID %u flags 0x%02x "
+ "x %u y %u\n", i, obj->id, obj->win_id, obj->flags, obj->x, obj->y);
+
+ if (obj->flags & PGS_COMPOSITION_OBJECT_FLAG_CROPPED) {
+ if (payload + 8 > end)
+ break;
+
+ obj->crop_x = GST_READ_UINT16_BE (payload);
+ obj->crop_y = GST_READ_UINT16_BE (payload + 2);
+ obj->crop_w = GST_READ_UINT16_BE (payload + 4);
+ obj->crop_h = GST_READ_UINT16_BE (payload + 6);
+
+ payload += 8;
+
+ PGS_DUMP ("Cropping window x %u y %u w %u h %u\n",
+ obj->crop_x, obj->crop_y, obj->crop_w, obj->crop_h);
+ }
+
+ if (obj->flags & ~(PGS_COMPOSITION_OBJECT_FLAG_CROPPED |
+ PGS_COMPOSITION_OBJECT_FLAG_FORCED))
+ g_warning ("PGS Composition Object has unknown flags: 0x%02x",
+ obj->flags);
+ }
+
+ if (payload != end) {
+ g_warning ("PGS Composition Object: %ld bytes not consumed", end - payload);
+ dump_bytes (payload, end - payload);
+ }
+
+ return 0;
+}
+
+static int
+parse_set_palette (GstDVDSpu * dvdspu, guint8 type, guint8 * payload,
+ guint16 len)
+{
+ SpuState *state = &dvdspu->spu_state;
+
+ const gint PGS_PALETTE_ENTRY_SIZE = 5;
+ guint8 *end = payload + len;
+ guint8 palette_id;
+ guint8 palette_version;
+ gint n_entries, i;
+
+ if (len < 2) /* Palette command too short */
+ return 0;
+ palette_id = payload[0];
+ palette_version = payload[1];
+ payload += 2;
+
+ n_entries = (len - 2) / PGS_PALETTE_ENTRY_SIZE;
+
+ PGS_DUMP ("Palette ID %u version %u. %d entries\n",
+ palette_id, palette_version, n_entries);
+ for (i = 0; i < 256; i++)
+ state->pgs.palette[i].A = 0;
+ for (i = 0; i < n_entries; i++) {
+ guint8 n, Y, U, V, A;
+ n = payload[0];
+ Y = payload[1];
+ U = payload[2];
+ V = payload[3];
+ A = payload[4];
+
+#if DUMP_FULL_PALETTE
+ PGS_DUMP ("Entry %3d: Y %3d U %3d V %3d A %3d ", n, Y, U, V, A);
+ if (((i + 1) % 2) == 0)
+ PGS_DUMP ("\n");
+#endif
+
+ /* Premultiply the palette entries by the alpha */
+ state->pgs.palette[n].Y = Y * A;
+ state->pgs.palette[n].U = U * A;
+ state->pgs.palette[n].V = V * A;
+ state->pgs.palette[n].A = A;
+
+ payload += PGS_PALETTE_ENTRY_SIZE;
+ }
+
+#if DUMP_FULL_PALETTE
+ if (n_entries > 0 && (i % 2))
+ PGS_DUMP ("\n");
+#endif
+
+ if (payload != end) {
+ g_warning ("PGS Set Palette: %ld bytes not consumed", end - payload);
+ dump_bytes (payload, end - payload);
+ }
+
+ return 0;
+}
+
+static int
+parse_set_window (GstDVDSpu * dvdspu, guint8 type, guint8 * payload,
+ guint16 len)
+{
+ SpuState *state = &dvdspu->spu_state;
+ guint8 *end = payload + len;
+ guint8 win_id, win_ver;
+
+ if (payload + 10 > end)
+ return 0;
+
+ dump_bytes (payload, len);
+
+ /* FIXME: This is just a guess as to what the numbers mean: */
+ win_id = payload[0];
+ win_ver = payload[1];
+ state->pgs.win_x = GST_READ_UINT16_BE (payload + 2);
+ state->pgs.win_y = GST_READ_UINT16_BE (payload + 4);
+ state->pgs.win_w = GST_READ_UINT16_BE (payload + 6);
+ state->pgs.win_h = GST_READ_UINT16_BE (payload + 8);
+ payload += 10;
+
+ PGS_DUMP ("Win ID %u version %d x %d y %d w %d h %d\n",
+ win_id, win_ver, state->pgs.win_x, state->pgs.win_y, state->pgs.win_w,
+ state->pgs.win_h);
+
+ if (payload != end) {
+ g_warning ("PGS Set Window: %ld bytes not consumed", end - payload);
+ dump_bytes (payload, end - payload);
+ }
+
+ return 0;
+}
+
+static int
+parse_set_object_data (GstDVDSpu * dvdspu, guint8 type, guint8 * payload,
+ guint16 len)
+{
+ SpuPgsState *pgs_state = &dvdspu->spu_state.pgs;
+ PgsCompositionObject *obj;
+ guint8 *end = payload + len;
+ guint16 obj_id;
+ guint8 obj_ver, flags;
+
+ if (payload + 4 > end)
+ return 0;
+
+ obj_id = GST_READ_UINT16_BE (payload);
+ obj_ver = payload[2];
+ flags = payload[3];
+ payload += 4;
+
+ obj = pgs_presentation_segment_find_object (&(pgs_state->pres_seg), obj_id);
+
+ PGS_DUMP ("Object ID %d ver %u flags 0x%02x\n", obj_id, obj_ver, flags);
+
+ if (flags & PGS_OBJECT_UPDATE_FLAG_START_RLE) {
+ obj->rle_data_ver = obj_ver;
+
+ if (payload + 3 > end)
+ return 0;
+
+ obj->rle_data_size = GST_READ_UINT24_BE (payload);
+ payload += 3;
+
+ PGS_DUMP ("%d bytes of RLE data, of %d bytes total.\n",
+ end - payload, obj->rle_data_size);
+
+ obj->rle_data = g_realloc (obj->rle_data, obj->rle_data_size);
+ obj->rle_data_used = end - payload;
+ memcpy (obj->rle_data, payload, end - payload);
+ payload = end;
+ } else {
+ PGS_DUMP ("%d bytes of additional RLE data\n", end - payload);
+ /* Check that the data chunk is for this object version, and fits in the buffer */
+ if (obj->rle_data_ver == obj_ver &&
+ obj->rle_data_used + end - payload <= obj->rle_data_size) {
+
+ memcpy (obj->rle_data + obj->rle_data_used, payload, end - payload);
+ obj->rle_data_used += end - payload;
+ payload = end;
+ }
+ }
+
+ if (obj->rle_data_size == obj->rle_data_used)
+ dump_rle_data (dvdspu, obj->rle_data, obj->rle_data_size);
+
+ if (payload != end) {
+ g_warning ("PGS Set Object Data: %ld bytes not consumed", end - payload);
+ dump_bytes (payload, end - payload);
+ }
+
+ return 0;
+}
+
+static int
+parse_pgs_packet (GstDVDSpu * dvdspu, guint8 type, guint8 * payload,
+ guint16 len)
+{
+ SpuPgsState *pgs_state = &dvdspu->spu_state.pgs;
+ int ret = 0;
+
+ if (!pgs_state->in_presentation_segment
+ && type != PGS_COMMAND_PRESENTATION_SEGMENT) {
+ PGS_DUMP ("Expected BEGIN PRESENTATION SEGMENT command. "
+ "Got command type 0x%02x len %u. Skipping\n", type, len);
+ return 0;
+ }
+
+ switch (type) {
+ case PGS_COMMAND_PRESENTATION_SEGMENT:
+ PGS_DUMP ("*******************************************\n"
+ "Begin PRESENTATION_SEGMENT (0x%02x) packet len %u\n", type, len);
+ pgs_state->in_presentation_segment =
+ pgs_state->have_presentation_segment = TRUE;
+ ret = parse_presentation_segment (dvdspu, type, payload, len);
+ break;
+ case PGS_COMMAND_SET_OBJECT_DATA:
+ PGS_DUMP ("*** Set Object Data (0x%02x) packet len %u\n", type, len);
+ ret = parse_set_object_data (dvdspu, type, payload, len);
+ break;
+ case PGS_COMMAND_SET_PALETTE:
+ PGS_DUMP ("*** Set Palette (0x%02x) packet len %u\n", type, len);
+ ret = parse_set_palette (dvdspu, type, payload, len);
+ break;
+ case PGS_COMMAND_SET_WINDOW:
+ PGS_DUMP ("*** Set Window command (0x%02x) packet len %u\n", type, len);
+ ret = parse_set_window (dvdspu, type, payload, len);
+ break;
+ case PGS_COMMAND_INTERACTIVE_SEGMENT:
+ PGS_DUMP ("*** Interactive Segment command(0x%02x) packet len %u\n",
+ type, len);
+ dump_bytes (payload, len);
+ break;
+ case PGS_COMMAND_END_DISPLAY:
+ PGS_DUMP ("*** End Display command (0x%02x) packet len %u\n", type,
+ len);
+ pgs_state->in_presentation_segment = FALSE;
+ break;
+ default:
+ g_warning ("Unknown PGS command: type 0x%02x len %u", type, len);
+ dump_bytes (payload, len);
+ break;
+ }
+ PGS_DUMP ("\n");
+
+ return ret;
+}
+
+gint
+gstspu_exec_pgs_buffer (GstDVDSpu * dvdspu, GstBuffer * buf)
+{
+ guint8 *pos, *end;
+ guint8 type;
+ guint16 packet_len;
+
+ pos = GST_BUFFER_DATA (buf);
+ end = pos + GST_BUFFER_SIZE (buf);
+
+ /* Need at least 3 bytes */
+ if (pos + 3 > end) {
+ PGS_DUMP ("Not enough bytes to be a PGS packet\n");
+ return -1;
+ }
+
+ PGS_DUMP ("Begin dumping command buffer of size %u ts %" GST_TIME_FORMAT "\n",
+ end - pos, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));
+ do {
+ type = *pos++;
+ packet_len = GST_READ_UINT16_BE (pos);
+ pos += 2;
+
+ if (pos + packet_len > end) {
+ PGS_DUMP ("Invalid packet length %u (only have %u bytes)\n", packet_len,
+ end - pos);
+ return -1;
+ }
+
+ if (parse_pgs_packet (dvdspu, type, pos, packet_len))
+ return -1;
+
+ pos += packet_len;
+ } while (pos + 3 <= end);
+
+ PGS_DUMP ("End dumping command buffer with %u bytes remaining\n", end - pos);
+ return (pos - GST_BUFFER_DATA (buf));
+}
+
+void
+gstspu_pgs_handle_new_buf (GstDVDSpu * dvdspu, GstClockTime event_ts,
+ GstBuffer * buf)
+{
+ SpuState *state = &dvdspu->spu_state;
+
+ state->next_ts = event_ts;
+ state->pgs.pending_cmd = buf;
+}
+
+gboolean
+gstspu_pgs_execute_event (GstDVDSpu * dvdspu)
+{
+ SpuState *state = &dvdspu->spu_state;
+
+ if (state->pgs.pending_cmd) {
+ gstspu_exec_pgs_buffer (dvdspu, state->pgs.pending_cmd);
+ gst_buffer_unref (state->pgs.pending_cmd);
+ state->pgs.pending_cmd = NULL;
+ }
+
+ state->next_ts = GST_CLOCK_TIME_NONE;
+
+ state->flags &= ~SPU_STATE_DISPLAY;
+ if (state->pgs.have_presentation_segment) {
+ if (state->pgs.pres_seg.objects && state->pgs.pres_seg.objects->len > 0)
+ state->flags |= SPU_STATE_DISPLAY;
+ }
+ return FALSE;
+}
+
+void
+gstspu_pgs_render (GstDVDSpu * dvdspu, GstBuffer * buf)
+{
+ SpuState *state = &dvdspu->spu_state;
+ PgsPresentationSegment *ps = &state->pgs.pres_seg;
+ guint i;
+
+ if (ps->objects == NULL)
+ return;
+
+ for (i = 0; i < ps->objects->len; i++) {
+ PgsCompositionObject *cur =
+ &g_array_index (ps->objects, PgsCompositionObject, i);
+ pgs_composition_object_render (cur, state, buf);
+ }
+}
+
+gboolean
+gstspu_pgs_handle_dvd_event (GstDVDSpu * dvdspu, GstEvent * event)
+{
+ return FALSE;
+}
+
+void
+gstspu_pgs_flush (GstDVDSpu * dvdspu)
+{
+ SpuPgsState *pgs_state = &dvdspu->spu_state.pgs;
+
+ if (pgs_state->pending_cmd) {
+ gst_buffer_unref (pgs_state->pending_cmd);
+ pgs_state->pending_cmd = NULL;
+ }
+
+ pgs_state->have_presentation_segment = FALSE;
+ pgs_state->in_presentation_segment = FALSE;
+ pgs_presentation_segment_set_object_count (&pgs_state->pres_seg, 0);
+
+ pgs_state->win_x = pgs_state->win_y = pgs_state->win_w = pgs_state->win_h = 0;
+}
diff --git a/gst/dvdspu/gstspu-pgs.h b/gst/dvdspu/gstspu-pgs.h
new file mode 100644
index 00000000..164f4d81
--- /dev/null
+++ b/gst/dvdspu/gstspu-pgs.h
@@ -0,0 +1,106 @@
+/* GStreamer Sub-Picture Unit - PGS handling
+ * Copyright (C) 2009 Jan Schmidt <thaytan@noraisin.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.
+ */
+
+#ifndef __GSTSPU_PGS_H__
+#define __GSTSPU_PGS_H__
+
+#include "gstspu-common.h"
+
+typedef struct SpuPgsState SpuPgsState;
+typedef enum PgsCompositionObjectFlags PgsCompositionObjectFlags;
+typedef enum PgsPresentationSegmentFlags PgsPresentationSegmentFlags;
+typedef enum PgsObjectUpdateFlags PgsObjectUpdateFlags;
+
+typedef struct PgsPresentationSegment PgsPresentationSegment;
+typedef struct PgsCompositionObject PgsCompositionObject;
+
+enum PgsPresentationSegmentFlags
+{
+ PGS_PRES_SEGMENT_FLAG_UPDATE_PALETTE = 0x80
+};
+
+enum PgsCompositionObjectFlags
+{
+ PGS_COMPOSITION_OBJECT_FLAG_CROPPED = 0x80,
+ PGS_COMPOSITION_OBJECT_FLAG_FORCED = 0x40
+};
+
+enum PgsObjectUpdateFlags
+{
+ /* Set in an object_update if this is the beginning of new RLE data.
+ * If not set, the data is a continuation to be appended */
+ PGS_OBJECT_UPDATE_FLAG_START_RLE = 0x80,
+ PGS_OBJECT_UPDATE_FLAG_END_RLE = 0x40 /* This one is a guess */
+};
+
+struct PgsPresentationSegment
+{
+ guint16 composition_no;
+ guint8 composition_state;
+
+ PgsPresentationSegmentFlags flags;
+
+ guint8 palette_id;
+
+ guint16 vid_w, vid_h;
+ guint8 vid_fps_code;
+
+ GArray *objects;
+};
+
+struct PgsCompositionObject
+{
+ guint16 id;
+ guint8 version;
+ PgsCompositionObjectFlags flags;
+
+ guint8 win_id;
+
+ guint8 rle_data_ver;
+ guint8 *rle_data;
+ guint32 rle_data_size;
+ guint32 rle_data_used;
+
+ /* Top left corner of this object */
+ guint16 x, y;
+
+ /* Only valid if PGS_COMPOSITION_OBJECT_FLAG_CROPPED is set */
+ guint16 crop_x, crop_y, crop_w, crop_h;
+};
+
+struct SpuPgsState {
+ GstBuffer *pending_cmd;
+
+ gboolean in_presentation_segment;
+ gboolean have_presentation_segment;
+
+ PgsPresentationSegment pres_seg;
+
+ SpuColour palette[256];
+
+ guint16 win_x, win_y, win_w, win_h;
+};
+
+void gstspu_pgs_handle_new_buf (GstDVDSpu * dvdspu, GstClockTime event_ts, GstBuffer *buf);
+gboolean gstspu_pgs_execute_event (GstDVDSpu *dvdspu);
+void gstspu_pgs_render (GstDVDSpu *dvdspu, GstBuffer *buf);
+gboolean gstspu_pgs_handle_dvd_event (GstDVDSpu *dvdspu, GstEvent *event);
+void gstspu_pgs_flush (GstDVDSpu *dvdspu);
+
+#endif
diff --git a/gst/dvdspu/gstspu-vobsub-render.c b/gst/dvdspu/gstspu-vobsub-render.c
new file mode 100644
index 00000000..07abff22
--- /dev/null
+++ b/gst/dvdspu/gstspu-vobsub-render.c
@@ -0,0 +1,536 @@
+/* GStreamer DVD Sub-Picture Unit
+ * Copyright (C) 2007 Fluendo S.A. <info@fluendo.com>
+ * Copyright (C) 2009 Jan Schmidt <thaytan@noraisin.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.
+ */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#include <gst/gst.h>
+
+#include "gstdvdspu.h"
+
+GST_DEBUG_CATEGORY_EXTERN (dvdspu_debug);
+#define GST_CAT_DEFAULT dvdspu_debug
+
+static void
+gstspu_vobsub_recalc_palette (GstDVDSpu * dvdspu,
+ SpuColour * dest, guint8 * idx, guint8 * alpha)
+{
+ SpuState *state = &dvdspu->spu_state;
+ gint i;
+
+ for (i = 0; i < 4; i++, dest++) {
+ guint32 col = state->vobsub.current_clut[idx[i]];
+
+ /* Convert incoming 4-bit alpha to 8 bit for blending */
+ dest->A = (alpha[i] << 4) | alpha[i];
+ dest->Y = ((guint16) ((col >> 16) & 0xff)) * dest->A;
+ /* U/V are stored as V/U in the clut words, so switch them */
+ dest->V = ((guint16) ((col >> 8) & 0xff)) * dest->A;
+ dest->U = ((guint16) (col & 0xff)) * dest->A;
+ }
+}
+
+/* Recalculate the main, HL & ChgCol palettes */
+static void
+gstspu_vobsub_update_palettes (GstDVDSpu * dvdspu, SpuState * state)
+{
+ guint8 index[4]; /* Indices for the palette */
+ guint8 alpha[4]; /* Alpha values the palette */
+
+ if (state->vobsub.main_pal_dirty) {
+ gstspu_vobsub_recalc_palette (dvdspu, state->vobsub.main_pal,
+ state->vobsub.main_idx, state->vobsub.main_alpha);
+
+ /* Need to refresh the hl_ctrl info copies of the main palette too */
+ memcpy (state->vobsub.hl_ctrl_i.pix_ctrl_i[0].pal_cache,
+ state->vobsub.main_pal, 4 * sizeof (SpuColour));
+ memcpy (state->vobsub.hl_ctrl_i.pix_ctrl_i[2].pal_cache,
+ state->vobsub.main_pal, 4 * sizeof (SpuColour));
+
+ state->vobsub.main_pal_dirty = FALSE;
+ }
+
+ if (state->vobsub.hl_pal_dirty) {
+ gstspu_vobsub_recalc_palette (dvdspu,
+ state->vobsub.hl_ctrl_i.pix_ctrl_i[1].pal_cache, state->vobsub.hl_idx,
+ state->vobsub.hl_alpha);
+ state->vobsub.hl_pal_dirty = FALSE;
+ }
+
+ /* Update the offset positions for the highlight region */
+ if (state->vobsub.hl_rect.top != -1) {
+ state->vobsub.hl_ctrl_i.top = state->vobsub.hl_rect.top;
+ state->vobsub.hl_ctrl_i.bottom = state->vobsub.hl_rect.bottom;
+ state->vobsub.hl_ctrl_i.n_changes = 3;
+ state->vobsub.hl_ctrl_i.pix_ctrl_i[0].left = 0;
+ state->vobsub.hl_ctrl_i.pix_ctrl_i[1].left = state->vobsub.hl_rect.left;
+ state->vobsub.hl_ctrl_i.pix_ctrl_i[2].left =
+ state->vobsub.hl_rect.right + 1;
+ }
+
+ if (state->vobsub.line_ctrl_i_pal_dirty) {
+ gint16 l, c;
+ GST_LOG_OBJECT (dvdspu, "Updating chg-col-con palettes");
+ for (l = 0; l < state->vobsub.n_line_ctrl_i; l++) {
+ SpuVobsubLineCtrlI *cur_line_ctrl = state->vobsub.line_ctrl_i + l;
+
+ for (c = 0; c < cur_line_ctrl->n_changes; c++) {
+ SpuVobsubPixCtrlI *cur = cur_line_ctrl->pix_ctrl_i + c;
+
+ index[3] = (cur->palette >> 28) & 0x0f;
+ index[2] = (cur->palette >> 24) & 0x0f;
+ index[1] = (cur->palette >> 20) & 0x0f;
+ index[0] = (cur->palette >> 16) & 0x0f;
+
+ alpha[3] = (cur->palette >> 12) & 0x0f;
+ alpha[2] = (cur->palette >> 8) & 0x0f;
+ alpha[1] = (cur->palette >> 4) & 0x0f;
+ alpha[0] = (cur->palette) & 0x0f;
+ gstspu_vobsub_recalc_palette (dvdspu, cur->pal_cache, index, alpha);
+ }
+ }
+ state->vobsub.line_ctrl_i_pal_dirty = FALSE;
+ }
+}
+
+static inline guint8
+gstspu_vobsub_get_nibble (SpuState * state, guint16 * rle_offset)
+{
+ guint8 ret;
+
+ if (G_UNLIKELY (*rle_offset >= state->vobsub.max_offset))
+ return 0; /* Overran the buffer */
+
+ ret = GST_BUFFER_DATA (state->vobsub.pix_buf)[(*rle_offset) / 2];
+
+ /* If the offset is even, we shift the answer down 4 bits, otherwise not */
+ if (*rle_offset & 0x01)
+ ret &= 0x0f;
+ else
+ ret = ret >> 4;
+
+ (*rle_offset)++;
+ return ret;
+}
+
+static guint16
+gstspu_vobsub_get_rle_code (SpuState * state, guint16 * rle_offset)
+{
+ guint16 code;
+
+ code = gstspu_vobsub_get_nibble (state, rle_offset);
+ if (code < 0x4) { /* 4 .. f */
+ code = (code << 4) | gstspu_vobsub_get_nibble (state, rle_offset);
+ if (code < 0x10) { /* 1x .. 3x */
+ code = (code << 4) | gstspu_vobsub_get_nibble (state, rle_offset);
+ if (code < 0x40) { /* 04x .. 0fx */
+ code = (code << 4) | gstspu_vobsub_get_nibble (state, rle_offset);
+ }
+ }
+ }
+ return code;
+}
+
+static inline void
+gstspu_vobsub_draw_rle_run (SpuState * state, gint16 x, gint16 end,
+ SpuColour * colour)
+{
+#if 0
+ GST_LOG ("Y: %d x: %d end %d col %d %d %d %d",
+ state->vobsub.cur_Y, x, end, colour->Y, colour->U, colour->V, colour->A);
+#endif
+
+ if (colour->A != 0) {
+ guint32 inv_A = 0xff - colour->A;
+
+ /* FIXME: This could be more efficient */
+ while (x < end) {
+ state->vobsub.out_Y[x] =
+ (inv_A * state->vobsub.out_Y[x] + colour->Y) / 0xff;
+ state->vobsub.out_U[x / 2] += colour->U;
+ state->vobsub.out_V[x / 2] += colour->V;
+ state->vobsub.out_A[x / 2] += colour->A;
+ x++;
+ }
+ /* Update the compositing buffer so we know how much to blend later */
+ *(state->vobsub.comp_last_x_ptr) = end;
+ }
+}
+
+static inline gint16
+rle_end_x (guint16 rle_code, gint16 x, gint16 end)
+{
+ /* run length = rle_code >> 2 */
+ if (G_UNLIKELY (((rle_code >> 2) == 0)))
+ return end;
+ else
+ return MIN (end, x + (rle_code >> 2));
+}
+
+static void gstspu_vobsub_render_line_with_chgcol (SpuState * state,
+ guint8 * planes[3], guint16 * rle_offset);
+static gboolean gstspu_vobsub_update_chgcol (SpuState * state);
+
+static void
+gstspu_vobsub_render_line (SpuState * state, guint8 * planes[3],
+ guint16 * rle_offset)
+{
+ gint16 x, next_x, end, rle_code;
+ SpuColour *colour;
+
+ /* Check for special case of chg_col info to use (either highlight or
+ * ChgCol command */
+ if (state->vobsub.cur_chg_col != NULL) {
+ if (gstspu_vobsub_update_chgcol (state)) {
+ /* Check the top & bottom, because we might not be within the region yet */
+ if (state->vobsub.cur_Y >= state->vobsub.cur_chg_col->top &&
+ state->vobsub.cur_Y <= state->vobsub.cur_chg_col->bottom) {
+ gstspu_vobsub_render_line_with_chgcol (state, planes, rle_offset);
+ return;
+ }
+ }
+ }
+
+ /* No special case. Render as normal */
+
+ /* Set up our output pointers */
+ state->vobsub.out_Y = planes[0];
+ state->vobsub.out_U = state->comp_bufs[0];
+ state->vobsub.out_V = state->comp_bufs[1];
+ state->vobsub.out_A = state->comp_bufs[2];
+ /* We always need to start our RLE decoding byte_aligned */
+ *rle_offset = GST_ROUND_UP_2 (*rle_offset);
+
+ x = state->vobsub.disp_rect.left;
+ end = state->vobsub.disp_rect.right + 1;
+ while (x < end) {
+ rle_code = gstspu_vobsub_get_rle_code (state, rle_offset);
+ colour = &state->vobsub.main_pal[rle_code & 3];
+ next_x = rle_end_x (rle_code, x, end);
+ /* Now draw the run between [x,next_x) */
+ gstspu_vobsub_draw_rle_run (state, x, next_x, colour);
+ x = next_x;
+ }
+}
+
+static gboolean
+gstspu_vobsub_update_chgcol (SpuState * state)
+{
+ if (state->vobsub.cur_chg_col == NULL)
+ return FALSE;
+
+ if (state->vobsub.cur_Y <= state->vobsub.cur_chg_col->bottom)
+ return TRUE;
+
+ while (state->vobsub.cur_chg_col < state->vobsub.cur_chg_col_end) {
+ if (state->vobsub.cur_Y >= state->vobsub.cur_chg_col->top &&
+ state->vobsub.cur_Y <= state->vobsub.cur_chg_col->bottom) {
+#if 0
+ g_print ("Stopped @ entry %d with top %d bottom %d, cur_y %d",
+ (gint16) (state->vobsub.cur_chg_col - state->vobsub.line_ctrl_i),
+ state->vobsub.cur_chg_col->top, state->vobsub.cur_chg_col->bottom, y);
+#endif
+ return TRUE;
+ }
+ state->vobsub.cur_chg_col++;
+ }
+
+ /* Finished all our cur_chg_col entries. Use the main palette from here on */
+ state->vobsub.cur_chg_col = NULL;
+ return FALSE;
+}
+
+static void
+gstspu_vobsub_render_line_with_chgcol (SpuState * state, guint8 * planes[3],
+ guint16 * rle_offset)
+{
+ SpuVobsubLineCtrlI *chg_col = state->vobsub.cur_chg_col;
+
+ gint16 x, next_x, disp_end, rle_code, run_end;
+ SpuColour *colour;
+ SpuVobsubPixCtrlI *cur_pix_ctrl;
+ SpuVobsubPixCtrlI *next_pix_ctrl;
+ SpuVobsubPixCtrlI *end_pix_ctrl;
+ SpuVobsubPixCtrlI dummy_pix_ctrl;
+ gint16 cur_reg_end;
+ gint i;
+
+ state->vobsub.out_Y = planes[0];
+ state->vobsub.out_U = state->comp_bufs[0];
+ state->vobsub.out_V = state->comp_bufs[1];
+ state->vobsub.out_A = state->comp_bufs[2];
+
+ /* We always need to start our RLE decoding byte_aligned */
+ *rle_offset = GST_ROUND_UP_2 (*rle_offset);
+
+ /* Our run will cover the display rect */
+ x = state->vobsub.disp_rect.left;
+ disp_end = state->vobsub.disp_rect.right + 1;
+
+ /* Work out the first pixel control info, which may point to the dummy entry if
+ * the global palette/alpha need using initally */
+ cur_pix_ctrl = chg_col->pix_ctrl_i;
+ end_pix_ctrl = chg_col->pix_ctrl_i + chg_col->n_changes;
+
+ if (cur_pix_ctrl->left != 0) {
+ next_pix_ctrl = cur_pix_ctrl;
+ cur_pix_ctrl = &dummy_pix_ctrl;
+ for (i = 0; i < 4; i++) /* Copy the main palette to our dummy entry */
+ dummy_pix_ctrl.pal_cache[i] = state->vobsub.main_pal[i];
+ } else {
+ next_pix_ctrl = cur_pix_ctrl + 1;
+ }
+ if (next_pix_ctrl < end_pix_ctrl)
+ cur_reg_end = next_pix_ctrl->left;
+ else
+ cur_reg_end = disp_end;
+
+ /* Render stuff */
+ while (x < disp_end) {
+ rle_code = gstspu_vobsub_get_rle_code (state, rle_offset);
+ next_x = rle_end_x (rle_code, x, disp_end);
+
+ /* Now draw the run between [x,next_x), crossing palette regions as needed */
+ while (x < next_x) {
+ run_end = MIN (next_x, cur_reg_end);
+
+ if (G_LIKELY (x < run_end)) {
+ colour = &cur_pix_ctrl->pal_cache[rle_code & 3];
+ gstspu_vobsub_draw_rle_run (state, x, run_end, colour);
+ x = run_end;
+ }
+
+ if (x >= cur_reg_end) {
+ /* Advance to next region */
+ cur_pix_ctrl = next_pix_ctrl;
+ next_pix_ctrl++;
+
+ if (next_pix_ctrl < end_pix_ctrl)
+ cur_reg_end = next_pix_ctrl->left;
+ else
+ cur_reg_end = disp_end;
+ }
+ }
+ }
+}
+
+static void
+gstspu_vobsub_blend_comp_buffers (SpuState * state, guint8 * planes[3])
+{
+ state->comp_left = state->vobsub.disp_rect.left;
+ state->comp_right =
+ MAX (state->vobsub.comp_last_x[0], state->vobsub.comp_last_x[1]);
+
+ gstspu_blend_comp_buffers (state, planes);
+}
+
+void
+gstspu_vobsub_clear_comp_buffers (SpuState * state)
+{
+ state->comp_left = state->vobsub.disp_rect.left;
+ state->comp_right = state->vobsub.disp_rect.right;
+
+ gstspu_clear_comp_buffers (state);
+
+ state->vobsub.comp_last_x[0] = -1;
+ state->vobsub.comp_last_x[1] = -1;
+}
+
+void
+gstspu_vobsub_render (GstDVDSpu * dvdspu, GstBuffer * buf)
+{
+ SpuState *state = &dvdspu->spu_state;
+ guint8 *planes[3]; /* YUV frame pointers */
+ gint y, last_y;
+
+ /* Set up our initial state */
+ if (G_UNLIKELY (state->vobsub.pix_buf == NULL))
+ return;
+
+ /* Store the start of each plane */
+ planes[0] = GST_BUFFER_DATA (buf);
+ planes[1] = planes[0] + (state->Y_height * state->Y_stride);
+ planes[2] = planes[1] + (state->UV_height * state->UV_stride);
+
+ /* Sanity check */
+ g_return_if_fail (planes[2] + (state->UV_height * state->UV_stride) <=
+ GST_BUFFER_DATA (buf) + GST_BUFFER_SIZE (buf));
+
+ GST_DEBUG ("Rendering SPU. disp_rect %d,%d to %d,%d. hl_rect %d,%d to %d,%d",
+ state->vobsub.disp_rect.left, state->vobsub.disp_rect.top,
+ state->vobsub.disp_rect.right, state->vobsub.disp_rect.bottom,
+ state->vobsub.hl_rect.left, state->vobsub.hl_rect.top,
+ state->vobsub.hl_rect.right, state->vobsub.hl_rect.bottom);
+
+ GST_DEBUG ("vid_disp %d,%d", state->vid_width, state->vid_height);
+
+ /* When reading RLE data, we track the offset in nibbles... */
+ state->vobsub.cur_offsets[0] = state->vobsub.pix_data[0] * 2;
+ state->vobsub.cur_offsets[1] = state->vobsub.pix_data[1] * 2;
+ state->vobsub.max_offset = GST_BUFFER_SIZE (state->vobsub.pix_buf) * 2;
+
+ /* Update all the palette caches */
+ gstspu_vobsub_update_palettes (dvdspu, state);
+
+ /* Set up HL or Change Color & Contrast rect tracking */
+ if (state->vobsub.hl_rect.top != -1) {
+ state->vobsub.cur_chg_col = &state->vobsub.hl_ctrl_i;
+ state->vobsub.cur_chg_col_end = state->vobsub.cur_chg_col + 1;
+ } else if (state->vobsub.n_line_ctrl_i > 0) {
+ state->vobsub.cur_chg_col = state->vobsub.line_ctrl_i;
+ state->vobsub.cur_chg_col_end =
+ state->vobsub.cur_chg_col + state->vobsub.n_line_ctrl_i;
+ } else
+ state->vobsub.cur_chg_col = NULL;
+
+ /* We start rendering from the first line of the display rect */
+ y = state->vobsub.disp_rect.top;
+ /* start_y is always an even number and we render lines in pairs from there,
+ * accumulating 2 lines of chroma then blending it. We might need to render a
+ * single line at the end if the display rect ends on an even line too. */
+ last_y = (state->vobsub.disp_rect.bottom - 1) & ~(0x01);
+
+ /* center the image when display rectangle exceeds the video width */
+ if (state->vid_width < state->vobsub.disp_rect.right) {
+ gint diff, disp_width;
+
+ disp_width = state->vobsub.disp_rect.left - state->vobsub.disp_rect.right;
+ diff = (disp_width - state->vid_width) / 2;
+
+ /* fixme, this is not used yet */
+ state->vobsub.clip_rect.left = state->vobsub.disp_rect.left + diff;
+ state->vobsub.clip_rect.right = state->vobsub.disp_rect.right - diff;
+
+ GST_DEBUG ("clipping width to %d,%d", state->vobsub.clip_rect.left,
+ state->vobsub.clip_rect.right);
+ } else {
+ state->vobsub.clip_rect.left = state->vobsub.disp_rect.left;
+ state->vobsub.clip_rect.right = state->vobsub.disp_rect.right;
+ }
+
+ /* for the height, chop off the bottom bits of the diplay rectangle because we
+ * assume the picture is in the lower part. We should better check where it
+ * is and do something more clever. */
+ state->vobsub.clip_rect.bottom = state->vobsub.disp_rect.bottom;
+ if (state->vid_height < state->vobsub.disp_rect.bottom) {
+ state->vobsub.clip_rect.top =
+ state->vobsub.disp_rect.bottom - state->vid_height;
+ GST_DEBUG ("clipping height to %d,%d", state->vobsub.clip_rect.top,
+ state->vobsub.clip_rect.bottom);
+ } else {
+ state->vobsub.clip_rect.top = state->vobsub.disp_rect.top;
+ /* Update our plane references to the first line of the disp_rect */
+ planes[0] += state->Y_stride * y;
+ planes[1] += state->UV_stride * (y / 2);
+ planes[2] += state->UV_stride * (y / 2);
+ }
+
+ for (state->vobsub.cur_Y = y; state->vobsub.cur_Y <= last_y;
+ state->vobsub.cur_Y++) {
+ gboolean clip;
+
+ clip = (state->vobsub.cur_Y < state->vobsub.clip_rect.top
+ || state->vobsub.cur_Y > state->vobsub.clip_rect.bottom);
+
+ /* Reset the compositing buffer */
+ gstspu_clear_comp_buffers (state);
+ /* Render even line */
+ state->vobsub.comp_last_x_ptr = state->vobsub.comp_last_x;
+ gstspu_vobsub_render_line (state, planes, &state->vobsub.cur_offsets[0]);
+ if (!clip) {
+ /* Advance the luminance output pointer */
+ planes[0] += state->Y_stride;
+ }
+ state->vobsub.cur_Y++;
+
+ /* Render odd line */
+ state->vobsub.comp_last_x_ptr = state->vobsub.comp_last_x + 1;
+ gstspu_vobsub_render_line (state, planes, &state->vobsub.cur_offsets[1]);
+ /* Blend the accumulated UV compositing buffers onto the output */
+ gstspu_vobsub_blend_comp_buffers (state, planes);
+
+ if (!clip) {
+ /* Update all the output pointers */
+ planes[0] += state->Y_stride;
+ planes[1] += state->UV_stride;
+ planes[2] += state->UV_stride;
+ }
+ }
+ if (state->vobsub.cur_Y == state->vobsub.disp_rect.bottom) {
+ g_assert ((state->vobsub.disp_rect.bottom & 0x01) == 0);
+
+ /* Render a remaining lone last even line. y already has the correct value
+ * after the above loop exited. */
+ gstspu_clear_comp_buffers (state);
+ state->vobsub.comp_last_x_ptr = state->vobsub.comp_last_x;
+ gstspu_vobsub_render_line (state, planes, &state->vobsub.cur_offsets[0]);
+ gstspu_vobsub_blend_comp_buffers (state, planes);
+ }
+
+ /* for debugging purposes, draw a faint rectangle at the edges of the disp_rect */
+#if 0
+ do {
+ guint8 *cur;
+ gint16 pos;
+
+ cur = GST_BUFFER_DATA (buf) + state->Y_stride * state->vobsub.disp_rect.top;
+ for (pos = state->vobsub.disp_rect.left + 1;
+ pos < state->vobsub.disp_rect.right; pos++)
+ cur[pos] = (cur[pos] / 2) + 0x8;
+ cur =
+ GST_BUFFER_DATA (buf) +
+ state->Y_stride * state->vobsub.disp_rect.bottom;
+ for (pos = state->vobsub.disp_rect.left + 1;
+ pos < state->vobsub.disp_rect.right; pos++)
+ cur[pos] = (cur[pos] / 2) + 0x8;
+ cur = GST_BUFFER_DATA (buf) + state->Y_stride * state->vobsub.disp_rect.top;
+ for (pos = state->vobsub.disp_rect.top;
+ pos <= state->vobsub.disp_rect.bottom; pos++) {
+ cur[state->vobsub.disp_rect.left] =
+ (cur[state->vobsub.disp_rect.left] / 2) + 0x8;
+ cur[state->vobsub.disp_rect.right] =
+ (cur[state->vobsub.disp_rect.right] / 2) + 0x8;
+ cur += state->Y_stride;
+ }
+ } while (0);
+#endif
+ /* For debugging purposes, draw a faint rectangle around the highlight rect */
+#if 0
+ if (state->hl_rect.top != -1) {
+ guint8 *cur;
+ gint16 pos;
+
+ cur = GST_BUFFER_DATA (buf) + state->Y_stride * state->hl_rect.top;
+ for (pos = state->hl_rect.left + 1; pos < state->hl_rect.right; pos++)
+ cur[pos] = (cur[pos] / 2) + 0x8;
+ cur = GST_BUFFER_DATA (buf) + state->Y_stride * state->hl_rect.bottom;
+ for (pos = state->hl_rect.left + 1; pos < state->hl_rect.right; pos++)
+ cur[pos] = (cur[pos] / 2) + 0x8;
+ cur = GST_BUFFER_DATA (buf) + state->Y_stride * state->hl_rect.top;
+ for (pos = state->hl_rect.top; pos <= state->hl_rect.bottom; pos++) {
+ cur[state->hl_rect.left] = (cur[state->hl_rect.left] / 2) + 0x8;
+ cur[state->hl_rect.right] = (cur[state->hl_rect.right] / 2) + 0x8;
+ cur += state->Y_stride;
+ }
+ }
+#endif
+}
diff --git a/gst/dvdspu/gstspu-vobsub.c b/gst/dvdspu/gstspu-vobsub.c
new file mode 100644
index 00000000..1757feb7
--- /dev/null
+++ b/gst/dvdspu/gstspu-vobsub.c
@@ -0,0 +1,513 @@
+/* GStreamer Sub-Picture Unit - VobSub/DVD handling
+ * Copyright (C) 2009 Jan Schmidt <thaytan@noraisin.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.
+ */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#include <gst/gst.h>
+
+#include "gstdvdspu.h"
+#include "gstspu-vobsub.h"
+
+GST_DEBUG_CATEGORY_EXTERN (dvdspu_debug);
+#define GST_CAT_DEFAULT dvdspu_debug
+
+/* Define to dump out a text description of the incoming SPU commands */
+#define DUMP_DCSQ 0
+
+/* Convert an STM offset in the SPU sequence to a GStreamer timestamp */
+#define STM_TO_GST(stm) ((GST_MSECOND * 1024 * (stm)) / 90)
+
+typedef enum SpuVobsubCmd SpuVobsubCmd;
+
+enum SpuVobsubCmd
+{
+ SPU_CMD_FSTA_DSP = 0x00, /* Forced Display */
+ SPU_CMD_DSP = 0x01, /* Display Start */
+ SPU_CMD_STP_DSP = 0x02, /* Display Off */
+ SPU_CMD_SET_COLOR = 0x03, /* Set the color indexes for the palette */
+ SPU_CMD_SET_ALPHA = 0x04, /* Set the alpha indexes for the palette */
+ SPU_CMD_SET_DAREA = 0x05, /* Set the display area for the SPU */
+ SPU_CMD_DSPXA = 0x06, /* Pixel data addresses */
+ SPU_CMD_CHG_COLCON = 0x07, /* Change Color & Contrast */
+ SPU_CMD_END = 0xff
+};
+
+static void
+gst_dvd_spu_parse_chg_colcon (GstDVDSpu * dvdspu, guint8 * data, guint8 * end)
+{
+ SpuState *state = &dvdspu->spu_state;
+ guint8 *cur;
+ gint16 n_entries;
+ gint16 i;
+
+ /* Clear any existing chg colcon info */
+ state->vobsub.n_line_ctrl_i = 0;
+ if (state->vobsub.line_ctrl_i != NULL) {
+ g_free (state->vobsub.line_ctrl_i);
+ state->vobsub.line_ctrl_i = NULL;
+ }
+ GST_DEBUG_OBJECT (dvdspu, "Change Color & Contrast. Pixel data = %d bytes",
+ (gint16) (end - data));
+
+ /* Count the number of entries we'll need */
+ n_entries = 0;
+ for (cur = data; cur < end;) {
+ guint8 n_changes;
+ guint32 code;
+
+ if (cur + 4 > end)
+ break;
+
+ code = GST_READ_UINT32_BE (cur);
+ if (code == 0x0fffffff)
+ break; /* Termination code */
+
+ n_changes = CLAMP ((cur[2] >> 4), 1, 8);
+ cur += 4 + (6 * n_changes);
+
+ if (cur > end)
+ break; /* Invalid entry overrunning buffer */
+
+ n_entries++;
+ }
+
+ state->vobsub.n_line_ctrl_i = n_entries;
+ state->vobsub.line_ctrl_i = g_new (SpuVobsubLineCtrlI, n_entries);
+
+ cur = data;
+ for (i = 0; i < n_entries; i++) {
+ SpuVobsubLineCtrlI *cur_line_ctrl = state->vobsub.line_ctrl_i + i;
+ guint8 n_changes = CLAMP ((cur[2] >> 4), 1, 8);
+ guint8 c;
+
+ cur_line_ctrl->n_changes = n_changes;
+ cur_line_ctrl->top = ((cur[0] << 8) & 0x300) | cur[1];
+ cur_line_ctrl->bottom = ((cur[2] << 8) & 0x300) | cur[3];
+
+ GST_LOG_OBJECT (dvdspu, "ChgColcon Entry %d Top: %d Bottom: %d Changes: %d",
+ i, cur_line_ctrl->top, cur_line_ctrl->bottom, n_changes);
+ cur += 4;
+
+ for (c = 0; c < n_changes; c++) {
+ SpuVobsubPixCtrlI *cur_pix_ctrl = cur_line_ctrl->pix_ctrl_i + c;
+
+ cur_pix_ctrl->left = ((cur[0] << 8) & 0x300) | cur[1];
+ cur_pix_ctrl->palette = GST_READ_UINT32_BE (cur + 2);
+ GST_LOG_OBJECT (dvdspu, " %d: left: %d palette 0x%x", c,
+ cur_pix_ctrl->left, cur_pix_ctrl->palette);
+ cur += 6;
+ }
+ }
+}
+
+static void
+gst_dvd_spu_exec_cmd_blk (GstDVDSpu * dvdspu, guint8 * data, guint8 * end)
+{
+ SpuState *state = &dvdspu->spu_state;
+
+ while (data < end) {
+ guint8 cmd;
+
+ cmd = data[0];
+
+ switch (cmd) {
+ case SPU_CMD_FSTA_DSP:
+ GST_DEBUG_OBJECT (dvdspu, " Forced Display");
+ state->flags |= SPU_STATE_FORCED_DSP;
+ data += 1;
+ break;
+ case SPU_CMD_DSP:
+ GST_DEBUG_OBJECT (dvdspu, " Display On");
+ state->flags |= SPU_STATE_DISPLAY;
+ data += 1;
+ break;
+ case SPU_CMD_STP_DSP:
+ GST_DEBUG_OBJECT (dvdspu, " Display Off");
+ state->flags &= ~(SPU_STATE_FORCED_DSP | SPU_STATE_DISPLAY);
+ data += 1;
+ break;
+ case SPU_CMD_SET_COLOR:{
+ if (G_UNLIKELY (data + 3 >= end))
+ return; /* Invalid SET_COLOR cmd at the end of the blk */
+
+ state->vobsub.main_idx[3] = data[1] >> 4;
+ state->vobsub.main_idx[2] = data[1] & 0x0f;
+ state->vobsub.main_idx[1] = data[2] >> 4;
+ state->vobsub.main_idx[0] = data[2] & 0x0f;
+
+ state->vobsub.main_pal_dirty = TRUE;
+
+ GST_DEBUG_OBJECT (dvdspu,
+ " Set Color bg %u pattern %u emph-1 %u emph-2 %u",
+ state->vobsub.main_idx[0], state->vobsub.main_idx[1],
+ state->vobsub.main_idx[2], state->vobsub.main_idx[3]);
+ data += 3;
+ break;
+ }
+ case SPU_CMD_SET_ALPHA:{
+ if (G_UNLIKELY (data + 3 >= end))
+ return; /* Invalid SET_ALPHA cmd at the end of the blk */
+
+ state->vobsub.main_alpha[3] = data[1] >> 4;
+ state->vobsub.main_alpha[2] = data[1] & 0x0f;
+ state->vobsub.main_alpha[1] = data[2] >> 4;
+ state->vobsub.main_alpha[0] = data[2] & 0x0f;
+
+ state->vobsub.main_pal_dirty = TRUE;
+
+ GST_DEBUG_OBJECT (dvdspu,
+ " Set Alpha bg %u pattern %u emph-1 %u emph-2 %u",
+ state->vobsub.main_alpha[0], state->vobsub.main_alpha[1],
+ state->vobsub.main_alpha[2], state->vobsub.main_alpha[3]);
+ data += 3;
+ break;
+ }
+ case SPU_CMD_SET_DAREA:{
+ SpuRect *r = &state->vobsub.disp_rect;
+
+ if (G_UNLIKELY (data + 7 >= end))
+ return; /* Invalid SET_DAREA cmd at the end of the blk */
+
+ r->top = ((data[4] & 0x3f) << 4) | ((data[5] & 0xe0) >> 4);
+ r->left = ((data[1] & 0x3f) << 4) | ((data[2] & 0xf0) >> 4);
+ r->right = ((data[2] & 0x03) << 8) | data[3];
+ r->bottom = ((data[5] & 0x03) << 8) | data[6];
+
+ GST_DEBUG_OBJECT (dvdspu,
+ " Set Display Area top %u left %u bottom %u right %u", r->top,
+ r->left, r->bottom, r->right);
+
+ data += 7;
+ break;
+ }
+ case SPU_CMD_DSPXA:{
+ if (G_UNLIKELY (data + 5 >= end))
+ return; /* Invalid SET_DSPXE cmd at the end of the blk */
+
+ state->vobsub.pix_data[0] = GST_READ_UINT16_BE (data + 1);
+ state->vobsub.pix_data[1] = GST_READ_UINT16_BE (data + 3);
+ /* Store a reference to the current command buffer, as that's where
+ * we'll need to take our pixel data from */
+ gst_buffer_replace (&state->vobsub.pix_buf, state->vobsub.buf);
+
+ GST_DEBUG_OBJECT (dvdspu, " Set Pixel Data Offsets top: %u bot: %u",
+ state->vobsub.pix_data[0], state->vobsub.pix_data[1]);
+
+ data += 5;
+ break;
+ }
+ case SPU_CMD_CHG_COLCON:{
+ guint16 field_size;
+
+ GST_DEBUG_OBJECT (dvdspu, " Set Color & Contrast Change");
+ if (G_UNLIKELY (data + 3 >= end))
+ return; /* Invalid CHG_COLCON cmd at the end of the blk */
+
+ data++;
+ field_size = GST_READ_UINT16_BE (data);
+
+ if (G_UNLIKELY (data + field_size >= end))
+ return; /* Invalid CHG_COLCON cmd at the end of the blk */
+
+ gst_dvd_spu_parse_chg_colcon (dvdspu, data + 2, data + field_size);
+ state->vobsub.line_ctrl_i_pal_dirty = TRUE;
+ data += field_size;
+ break;
+ }
+ case SPU_CMD_END:
+ default:
+ GST_DEBUG_OBJECT (dvdspu, " END");
+ data = end;
+ break;
+ }
+ }
+}
+
+static void
+gst_dvd_spu_finish_spu_buf (GstDVDSpu * dvdspu)
+{
+ SpuState *state = &dvdspu->spu_state;
+
+ state->next_ts = state->vobsub.base_ts = GST_CLOCK_TIME_NONE;
+ gst_buffer_replace (&state->vobsub.buf, NULL);
+
+ GST_DEBUG_OBJECT (dvdspu, "Finished SPU buffer");
+}
+
+static gboolean
+gst_dvd_spu_setup_cmd_blk (GstDVDSpu * dvdspu, guint16 cmd_blk_offset,
+ guint8 * start, guint8 * end)
+{
+ SpuState *state = &dvdspu->spu_state;
+ guint16 delay;
+ guint8 *cmd_blk = start + cmd_blk_offset;
+
+ if (G_UNLIKELY (cmd_blk + 5 >= end))
+ return FALSE; /* No valid command block to read */
+
+ delay = GST_READ_UINT16_BE (cmd_blk);
+ state->next_ts = state->vobsub.base_ts + STM_TO_GST (delay);
+ state->vobsub.cur_cmd_blk = cmd_blk_offset;
+
+ GST_DEBUG_OBJECT (dvdspu, "Setup CMD Block @ %u with TS %" GST_TIME_FORMAT,
+ state->vobsub.cur_cmd_blk, GST_TIME_ARGS (state->next_ts));
+ return TRUE;
+}
+
+#if DUMP_DCSQ
+static void
+gst_dvd_spu_dump_dcsq (GstDVDSpu * dvdspu,
+ GstClockTime start_ts, GstBuffer * spu_buf)
+{
+ guint16 cmd_blk_offset;
+ guint16 next_blk;
+ guint8 *start, *end;
+
+ start = GST_BUFFER_DATA (spu_buf);
+ end = start + GST_BUFFER_SIZE (spu_buf);
+
+ g_return_if_fail (start != NULL);
+
+ /* First command */
+ next_blk = GST_READ_UINT16_BE (start + 2);
+ cmd_blk_offset = 0;
+
+ /* Loop through all commands */
+ g_print ("SPU begins @ %" GST_TIME_FORMAT " offset %u\n",
+ GST_TIME_ARGS (start_ts), next_blk);
+
+ while (cmd_blk_offset != next_blk) {
+ guint8 *data;
+ GstClockTime cmd_blk_ts;
+
+ cmd_blk_offset = next_blk;
+
+ if (G_UNLIKELY (start + cmd_blk_offset + 5 >= end))
+ break; /* No valid command to read */
+
+ data = start + cmd_blk_offset;
+
+ cmd_blk_ts = start_ts + STM_TO_GST (GST_READ_UINT16_BE (data));
+ next_blk = GST_READ_UINT16_BE (data + 2);
+
+ g_print ("Cmd Blk @ offset %u next %u ts %" GST_TIME_FORMAT "\n",
+ cmd_blk_offset, next_blk, GST_TIME_ARGS (cmd_blk_ts));
+
+ data += 4;
+ gst_dvd_spu_exec_cmd_blk (dvdspu, data, end);
+ }
+}
+#endif
+
+void
+gstspu_vobsub_handle_new_buf (GstDVDSpu * dvdspu, GstClockTime event_ts,
+ GstBuffer * buf)
+{
+ guint8 *start, *end;
+ SpuState *state = &dvdspu->spu_state;
+
+#if DUMP_DCSQ
+ gst_dvd_spu_dump_dcsq (dvdspu, event_ts, buf);
+#endif
+
+ if (G_UNLIKELY (GST_BUFFER_SIZE (buf) < 4))
+ goto invalid;
+
+ if (state->vobsub.buf != NULL) {
+ gst_buffer_unref (state->vobsub.buf);
+ state->vobsub.buf = NULL;
+ }
+ state->vobsub.buf = buf;
+ state->vobsub.base_ts = event_ts;
+
+ start = GST_BUFFER_DATA (state->vobsub.buf);
+ end = start + GST_BUFFER_SIZE (state->vobsub.buf);
+
+ /* Configure the first command block in this buffer as our initial blk */
+ state->vobsub.cur_cmd_blk = GST_READ_UINT16_BE (start + 2);
+ gst_dvd_spu_setup_cmd_blk (dvdspu, state->vobsub.cur_cmd_blk, start, end);
+ /* Clear existing chg-colcon info */
+ state->vobsub.n_line_ctrl_i = 0;
+ if (state->vobsub.line_ctrl_i != NULL) {
+ g_free (state->vobsub.line_ctrl_i);
+ state->vobsub.line_ctrl_i = NULL;
+ }
+ return;
+
+invalid:
+ /* Invalid buffer */
+ gst_dvd_spu_finish_spu_buf (dvdspu);
+}
+
+gboolean
+gstspu_vobsub_execute_event (GstDVDSpu * dvdspu)
+{
+ guint8 *start, *cmd_blk, *end;
+ guint16 next_blk;
+ SpuState *state = &dvdspu->spu_state;
+
+ if (state->vobsub.buf == NULL)
+ return FALSE;
+
+ GST_DEBUG_OBJECT (dvdspu, "Executing cmd blk with TS %" GST_TIME_FORMAT
+ " @ offset %u", GST_TIME_ARGS (state->next_ts),
+ state->vobsub.cur_cmd_blk);
+
+ start = GST_BUFFER_DATA (state->vobsub.buf);
+ end = start + GST_BUFFER_SIZE (state->vobsub.buf);
+
+ cmd_blk = start + state->vobsub.cur_cmd_blk;
+
+ if (G_UNLIKELY (cmd_blk + 5 >= end)) {
+ /* Invalid. Finish the buffer and loop again */
+ gst_dvd_spu_finish_spu_buf (dvdspu);
+ return FALSE;
+ }
+
+ gst_dvd_spu_exec_cmd_blk (dvdspu, cmd_blk + 4, end);
+
+ next_blk = GST_READ_UINT16_BE (cmd_blk + 2);
+ if (next_blk != state->vobsub.cur_cmd_blk) {
+ /* Advance to the next block of commands */
+ gst_dvd_spu_setup_cmd_blk (dvdspu, next_blk, start, end);
+ } else {
+ /* Next Block points to the current block, so we're finished with this
+ * SPU buffer */
+ gst_dvd_spu_finish_spu_buf (dvdspu);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+gboolean
+gstspu_vobsub_handle_dvd_event (GstDVDSpu * dvdspu, GstEvent * event)
+{
+ const gchar *event_type;
+ const GstStructure *structure = gst_event_get_structure (event);
+ SpuState *state = &dvdspu->spu_state;
+ gboolean hl_change = FALSE;
+
+ event_type = gst_structure_get_string (structure, "event");
+
+ if (strcmp (event_type, "dvd-spu-clut-change") == 0) {
+ gchar prop_name[32];
+ gint i;
+ gint entry;
+
+ for (i = 0; i < 16; i++) {
+ g_snprintf (prop_name, 32, "clut%02d", i);
+ if (!gst_structure_get_int (structure, prop_name, &entry))
+ entry = 0;
+ state->vobsub.current_clut[i] = (guint32) entry;
+ }
+
+ state->vobsub.main_pal_dirty = TRUE;
+ state->vobsub.hl_pal_dirty = TRUE;
+ state->vobsub.line_ctrl_i_pal_dirty = TRUE;
+ hl_change = TRUE;
+ } else if (strcmp (event_type, "dvd-spu-highlight") == 0) {
+ gint val;
+
+ if (gst_structure_get_int (structure, "palette", &val)) {
+ state->vobsub.hl_idx[3] = ((guint32) (val) >> 28) & 0x0f;
+ state->vobsub.hl_idx[2] = ((guint32) (val) >> 24) & 0x0f;
+ state->vobsub.hl_idx[1] = ((guint32) (val) >> 20) & 0x0f;
+ state->vobsub.hl_idx[0] = ((guint32) (val) >> 16) & 0x0f;
+
+ state->vobsub.hl_alpha[3] = ((guint32) (val) >> 12) & 0x0f;
+ state->vobsub.hl_alpha[2] = ((guint32) (val) >> 8) & 0x0f;
+ state->vobsub.hl_alpha[1] = ((guint32) (val) >> 4) & 0x0f;
+ state->vobsub.hl_alpha[0] = ((guint32) (val) >> 0) & 0x0f;
+
+ state->vobsub.hl_pal_dirty = TRUE;
+ }
+ if (gst_structure_get_int (structure, "sx", &val))
+ state->vobsub.hl_rect.left = (gint16) val;
+ if (gst_structure_get_int (structure, "sy", &val))
+ state->vobsub.hl_rect.top = (gint16) val;
+ if (gst_structure_get_int (structure, "ex", &val))
+ state->vobsub.hl_rect.right = (gint16) val;
+ if (gst_structure_get_int (structure, "ey", &val))
+ state->vobsub.hl_rect.bottom = (gint16) val;
+
+ GST_INFO_OBJECT (dvdspu, "Highlight rect is now (%d,%d) to (%d,%d)",
+ state->vobsub.hl_rect.left, state->vobsub.hl_rect.top,
+ state->vobsub.hl_rect.right, state->vobsub.hl_rect.bottom);
+ hl_change = TRUE;
+ } else if (strcmp (event_type, "dvd-spu-reset-highlight") == 0) {
+ if (state->vobsub.hl_rect.top != -1 || state->vobsub.hl_rect.bottom != -1)
+ hl_change = TRUE;
+ state->vobsub.hl_rect.top = -1;
+ state->vobsub.hl_rect.bottom = -1;
+ GST_INFO_OBJECT (dvdspu, "Highlight off");
+ } else if (strcmp (event_type, "dvd-set-subpicture-track") == 0) {
+ gboolean forced_only;
+
+ if (gst_structure_get_boolean (structure, "forced-only", &forced_only)) {
+ gboolean was_forced = (state->flags & SPU_STATE_FORCED_ONLY);
+
+ if (forced_only)
+ state->flags |= SPU_STATE_FORCED_ONLY;
+ else
+ state->flags &= ~(SPU_STATE_FORCED_ONLY);
+
+ if (was_forced != forced_only)
+ hl_change = TRUE;
+ }
+ }
+
+ gst_event_unref (event);
+
+ return hl_change;
+}
+
+void
+gstspu_vobsub_flush (GstDVDSpu * dvdspu)
+{
+ SpuState *state = &dvdspu->spu_state;
+
+ if (state->vobsub.buf) {
+ gst_buffer_unref (state->vobsub.buf);
+ state->vobsub.buf = NULL;
+ }
+ if (state->vobsub.pix_buf) {
+ gst_buffer_unref (state->vobsub.pix_buf);
+ state->vobsub.pix_buf = NULL;
+ }
+
+ state->vobsub.base_ts = GST_CLOCK_TIME_NONE;
+ state->vobsub.pix_data[0] = 0;
+ state->vobsub.pix_data[1] = 0;
+
+ state->vobsub.hl_rect.top = -1;
+ state->vobsub.hl_rect.bottom = -1;
+
+ state->vobsub.disp_rect.top = -1;
+ state->vobsub.disp_rect.bottom = -1;
+
+ state->vobsub.n_line_ctrl_i = 0;
+ if (state->vobsub.line_ctrl_i != NULL) {
+ g_free (state->vobsub.line_ctrl_i);
+ state->vobsub.line_ctrl_i = NULL;
+ }
+}
diff --git a/gst/dvdspu/gstspu-vobsub.h b/gst/dvdspu/gstspu-vobsub.h
new file mode 100644
index 00000000..9b4196bc
--- /dev/null
+++ b/gst/dvdspu/gstspu-vobsub.h
@@ -0,0 +1,110 @@
+/* GStreamer Sub-Picture Unit - VobSub/DVD handling
+ * Copyright (C) 2009 Jan Schmidt <thaytan@noraisin.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.
+ */
+
+#ifndef __GSTSPU_VOBSUB_H__
+#define __GSTSPU_VOBSUB_H__
+
+#include "gstspu-common.h"
+
+typedef struct SpuVobsubState SpuVobsubState;
+typedef struct SpuVobsubPixCtrlI SpuVobsubPixCtrlI;
+typedef struct SpuVobsubLineCtrlI SpuVobsubLineCtrlI;
+
+/* Pixel Control Info from a Change Color Contrast command */
+struct SpuVobsubPixCtrlI {
+ gint16 left;
+ guint32 palette;
+
+ /* Pre-multiplied palette values, updated as
+ * needed */
+ SpuColour pal_cache[4];
+};
+
+struct SpuVobsubLineCtrlI {
+ guint8 n_changes; /* 1 to 8 */
+ SpuVobsubPixCtrlI pix_ctrl_i[8];
+
+ gint16 top;
+ gint16 bottom;
+};
+
+struct SpuVobsubState {
+ GstClockTime base_ts; /* base TS for cmd blk delays in running time */
+ GstBuffer *buf; /* Current SPU packet we're executing commands from */
+ guint16 cur_cmd_blk; /* Offset into the buf for the current cmd block */
+
+ /* Top + Bottom field offsets in the buffer. 0 = not set */
+ guint16 pix_data[2];
+ GstBuffer *pix_buf; /* Current SPU packet the pix_data references */
+
+ SpuRect disp_rect;
+ SpuRect clip_rect;
+ SpuRect hl_rect;
+
+ guint32 current_clut[16]; /* Colour lookup table from incoming events */
+
+ guint8 main_idx[4]; /* Indices for current main palette */
+ guint8 main_alpha[4]; /* Alpha values for main palette */
+
+ guint8 hl_idx[4]; /* Indices for current highlight palette */
+ guint8 hl_alpha[4]; /* Alpha values for highlight palette */
+
+ /* Pre-multiplied colour palette for the main palette */
+ SpuColour main_pal[4];
+ gboolean main_pal_dirty;
+
+ /* Line control info for rendering the highlight palette */
+ SpuVobsubLineCtrlI hl_ctrl_i;
+ gboolean hl_pal_dirty; /* Indicates that the HL palette info needs refreshing */
+
+ /* LineCtrlI Info from a Change Color & Contrast command */
+ SpuVobsubLineCtrlI *line_ctrl_i;
+ gint16 n_line_ctrl_i;
+ gboolean line_ctrl_i_pal_dirty; /* Indicates that the palettes for the line_ctrl_i
+ * need recalculating */
+
+ /* Rendering state vars below */
+ gint16 comp_last_x[2]; /* Maximum X values we rendered into the comp buffer (odd & even) */
+ gint16 *comp_last_x_ptr; /* Ptr to the current comp_last_x value to be updated by the render */
+
+ /* Current Y Position */
+ gint16 cur_Y;
+
+ /* Current offset in nibbles into the pix_data */
+ guint16 cur_offsets[2];
+ guint16 max_offset;
+
+ /* current ChgColCon Line Info */
+ SpuVobsubLineCtrlI *cur_chg_col;
+ SpuVobsubLineCtrlI *cur_chg_col_end;
+
+ /* Output position tracking */
+ guint8 *out_Y;
+ guint32 *out_U;
+ guint32 *out_V;
+ guint32 *out_A;
+};
+
+void gstspu_vobsub_handle_new_buf (GstDVDSpu * dvdspu, GstClockTime event_ts, GstBuffer *buf);
+gboolean gstspu_vobsub_execute_event (GstDVDSpu *dvdspu);
+void gstspu_vobsub_render (GstDVDSpu *dvdspu, GstBuffer *buf);
+gboolean gstspu_vobsub_handle_dvd_event (GstDVDSpu *dvdspu, GstEvent *event);
+void gstspu_vobsub_flush (GstDVDSpu *dvdspu);
+
+#endif
diff --git a/gst/flv/Makefile.am b/gst/flv/Makefile.am
deleted file mode 100644
index 6e1a58b2..00000000
--- a/gst/flv/Makefile.am
+++ /dev/null
@@ -1,9 +0,0 @@
-plugin_LTLIBRARIES = libgstflv.la
-
-libgstflv_la_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS)
-libgstflv_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS)
-libgstflv_la_LDFLAGS = ${GST_PLUGIN_LDFLAGS}
-libgstflv_la_SOURCES = gstflvdemux.c gstflvparse.c gstflvmux.c
-libgstflv_la_LIBTOOLFLAGS = --tag=disable-static
-
-noinst_HEADERS = gstflvdemux.h gstflvparse.h gstflvmux.h
diff --git a/gst/flv/gstflvdemux.c b/gst/flv/gstflvdemux.c
deleted file mode 100644
index f31a22e8..00000000
--- a/gst/flv/gstflvdemux.c
+++ /dev/null
@@ -1,1323 +0,0 @@
-/* GStreamer
- * Copyright (C) <2007> Julien Moutte <julien@moutte.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-flvdemux
- *
- * flvdemux demuxes an FLV file into the different contained streams.
- *
- * <refsect2>
- * <title>Example launch line</title>
- * |[
- * gst-launch -v filesrc location=/path/to/flv ! flvdemux ! audioconvert ! autoaudiosink
- * ]| This pipeline demuxes an FLV file and outputs the contained raw audio streams.
- * </refsect2>
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "gstflvdemux.h"
-#include "gstflvparse.h"
-#include "gstflvmux.h"
-
-#include <string.h>
-
-static GstStaticPadTemplate flv_sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
- GST_PAD_SINK,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS ("video/x-flv")
- );
-
-static GstStaticPadTemplate audio_src_template =
-GST_STATIC_PAD_TEMPLATE ("audio",
- GST_PAD_SRC,
- GST_PAD_SOMETIMES,
- GST_STATIC_CAPS_ANY);
-
-static GstStaticPadTemplate video_src_template =
-GST_STATIC_PAD_TEMPLATE ("video",
- GST_PAD_SRC,
- GST_PAD_SOMETIMES,
- GST_STATIC_CAPS_ANY);
-
-GST_DEBUG_CATEGORY (flvdemux_debug);
-#define GST_CAT_DEFAULT flvdemux_debug
-
-GST_BOILERPLATE (GstFLVDemux, gst_flv_demux, GstElement, GST_TYPE_ELEMENT);
-
-/* 9 bytes of header + 4 bytes of first previous tag size */
-#define FLV_HEADER_SIZE 13
-/* 1 byte of tag type + 3 bytes of tag data size */
-#define FLV_TAG_TYPE_SIZE 4
-
-static void
-gst_flv_demux_flush (GstFLVDemux * demux, gboolean discont)
-{
- GST_DEBUG_OBJECT (demux, "flushing queued data in the FLV demuxer");
-
- gst_adapter_clear (demux->adapter);
-
- demux->audio_need_discont = TRUE;
- demux->video_need_discont = TRUE;
-
- demux->flushing = FALSE;
-
- /* Only in push mode */
- if (!demux->random_access) {
- /* After a flush we expect a tag_type */
- demux->state = FLV_STATE_TAG_TYPE;
- /* We reset the offset and will get one from first push */
- demux->offset = 0;
- }
-}
-
-static void
-gst_flv_demux_cleanup (GstFLVDemux * demux)
-{
- GST_DEBUG_OBJECT (demux, "cleaning up FLV demuxer");
-
- demux->state = FLV_STATE_HEADER;
-
- demux->flushing = FALSE;
- demux->need_header = TRUE;
- demux->audio_need_segment = TRUE;
- demux->video_need_segment = TRUE;
- demux->audio_need_discont = TRUE;
- demux->video_need_discont = TRUE;
-
- /* By default we consider them as linked */
- demux->audio_linked = TRUE;
- demux->video_linked = TRUE;
-
- demux->has_audio = FALSE;
- demux->has_video = FALSE;
- demux->push_tags = FALSE;
- demux->got_par = FALSE;
-
- gst_segment_init (&demux->segment, GST_FORMAT_TIME);
-
- demux->w = demux->h = 0;
- demux->par_x = demux->par_y = 1;
- demux->video_offset = 0;
- demux->audio_offset = 0;
- demux->offset = demux->cur_tag_offset = 0;
- demux->tag_size = demux->tag_data_size = 0;
- demux->duration = GST_CLOCK_TIME_NONE;
-
- if (demux->new_seg_event) {
- gst_event_unref (demux->new_seg_event);
- demux->new_seg_event = NULL;
- }
-
- if (demux->close_seg_event) {
- gst_event_unref (demux->close_seg_event);
- demux->close_seg_event = NULL;
- }
-
- gst_adapter_clear (demux->adapter);
-
- if (demux->audio_codec_data) {
- gst_buffer_unref (demux->audio_codec_data);
- demux->audio_codec_data = NULL;
- }
-
- if (demux->video_codec_data) {
- gst_buffer_unref (demux->video_codec_data);
- demux->video_codec_data = NULL;
- }
-
- if (demux->audio_pad) {
- gst_element_remove_pad (GST_ELEMENT (demux), demux->audio_pad);
- gst_object_unref (demux->audio_pad);
- demux->audio_pad = NULL;
- }
-
- if (demux->video_pad) {
- gst_element_remove_pad (GST_ELEMENT (demux), demux->video_pad);
- gst_object_unref (demux->video_pad);
- demux->video_pad = NULL;
- }
-
- if (demux->times) {
- g_array_free (demux->times, TRUE);
- demux->times = NULL;
- }
-
- if (demux->filepositions) {
- g_array_free (demux->filepositions, TRUE);
- demux->filepositions = NULL;
- }
-}
-
-static GstFlowReturn
-gst_flv_demux_chain (GstPad * pad, GstBuffer * buffer)
-{
- GstFlowReturn ret = GST_FLOW_OK;
- GstFLVDemux *demux = NULL;
-
- demux = GST_FLV_DEMUX (gst_pad_get_parent (pad));
-
- GST_LOG_OBJECT (demux, "received buffer of %d bytes at offset %"
- G_GUINT64_FORMAT, GST_BUFFER_SIZE (buffer), GST_BUFFER_OFFSET (buffer));
-
- if (G_UNLIKELY (GST_BUFFER_OFFSET (buffer) == 0)) {
- GST_DEBUG_OBJECT (demux, "beginning of file, expect header");
- demux->state = FLV_STATE_HEADER;
- demux->offset = 0;
- }
-
- if (G_UNLIKELY (demux->offset == 0 && GST_BUFFER_OFFSET (buffer) != 0)) {
- GST_DEBUG_OBJECT (demux, "offset was zero, synchronizing with buffer's");
- demux->offset = GST_BUFFER_OFFSET (buffer);
- }
-
- gst_adapter_push (demux->adapter, buffer);
-
-parse:
- if (G_UNLIKELY (ret != GST_FLOW_OK)) {
- if (ret == GST_FLOW_NOT_LINKED && (demux->audio_linked
- || demux->video_linked)) {
- ret = GST_FLOW_OK;
- } else {
- GST_DEBUG_OBJECT (demux, "got flow return %s", gst_flow_get_name (ret));
- goto beach;
- }
- }
-
- if (G_UNLIKELY (demux->flushing)) {
- GST_DEBUG_OBJECT (demux, "we are now flushing, exiting parser loop");
- ret = GST_FLOW_WRONG_STATE;
- goto beach;
- }
-
- switch (demux->state) {
- case FLV_STATE_HEADER:
- {
- if (gst_adapter_available (demux->adapter) >= FLV_HEADER_SIZE) {
- GstBuffer *buffer;
-
- buffer = gst_adapter_take_buffer (demux->adapter, FLV_HEADER_SIZE);
-
- ret = gst_flv_parse_header (demux, buffer);
-
- gst_buffer_unref (buffer);
- demux->offset += FLV_HEADER_SIZE;
-
- demux->state = FLV_STATE_TAG_TYPE;
- goto parse;
- } else {
- goto beach;
- }
- }
- case FLV_STATE_TAG_TYPE:
- {
- if (gst_adapter_available (demux->adapter) >= FLV_TAG_TYPE_SIZE) {
- GstBuffer *buffer;
-
- /* Remember the tag offset in bytes */
- demux->cur_tag_offset = demux->offset;
-
- buffer = gst_adapter_take_buffer (demux->adapter, FLV_TAG_TYPE_SIZE);
-
- ret = gst_flv_parse_tag_type (demux, buffer);
-
- gst_buffer_unref (buffer);
- demux->offset += FLV_TAG_TYPE_SIZE;
-
- goto parse;
- } else {
- goto beach;
- }
- }
- case FLV_STATE_TAG_VIDEO:
- {
- if (gst_adapter_available (demux->adapter) >= demux->tag_size) {
- GstBuffer *buffer;
-
- buffer = gst_adapter_take_buffer (demux->adapter, demux->tag_size);
-
- ret = gst_flv_parse_tag_video (demux, buffer);
-
- gst_buffer_unref (buffer);
- demux->offset += demux->tag_size;
-
- demux->state = FLV_STATE_TAG_TYPE;
- goto parse;
- } else {
- goto beach;
- }
- }
- case FLV_STATE_TAG_AUDIO:
- {
- if (gst_adapter_available (demux->adapter) >= demux->tag_size) {
- GstBuffer *buffer;
-
- buffer = gst_adapter_take_buffer (demux->adapter, demux->tag_size);
-
- ret = gst_flv_parse_tag_audio (demux, buffer);
-
- gst_buffer_unref (buffer);
- demux->offset += demux->tag_size;
-
- demux->state = FLV_STATE_TAG_TYPE;
- goto parse;
- } else {
- goto beach;
- }
- }
- case FLV_STATE_TAG_SCRIPT:
- {
- if (gst_adapter_available (demux->adapter) >= demux->tag_size) {
- GstBuffer *buffer;
-
- buffer = gst_adapter_take_buffer (demux->adapter, demux->tag_size);
-
- ret = gst_flv_parse_tag_script (demux, buffer);
-
- gst_buffer_unref (buffer);
- demux->offset += demux->tag_size;
-
- demux->state = FLV_STATE_TAG_TYPE;
- goto parse;
- } else {
- goto beach;
- }
- }
- default:
- GST_DEBUG_OBJECT (demux, "unexpected demuxer state");
- }
-
-beach:
- if (G_UNLIKELY (ret == GST_FLOW_NOT_LINKED)) {
- /* If either audio or video is linked we return GST_FLOW_OK */
- if (demux->audio_linked || demux->video_linked) {
- ret = GST_FLOW_OK;
- }
- }
-
- gst_object_unref (demux);
-
- return ret;
-}
-
-static GstFlowReturn
-gst_flv_demux_pull_range (GstFLVDemux * demux, GstPad * pad, guint64 offset,
- guint size, GstBuffer ** buffer)
-{
- GstFlowReturn ret;
-
- ret = gst_pad_pull_range (pad, offset, size, buffer);
- if (G_UNLIKELY (ret != GST_FLOW_OK)) {
- GST_WARNING_OBJECT (demux,
- "failed when pulling %d bytes from offset %" G_GUINT64_FORMAT ": %s",
- size, offset, gst_flow_get_name (ret));
- *buffer = NULL;
- return ret;
- }
-
- if (G_UNLIKELY (*buffer && GST_BUFFER_SIZE (*buffer) != size)) {
- GST_WARNING_OBJECT (demux,
- "partial pull got %d when expecting %d from offset %" G_GUINT64_FORMAT,
- GST_BUFFER_SIZE (*buffer), size, offset);
- gst_buffer_unref (*buffer);
- ret = GST_FLOW_UNEXPECTED;
- *buffer = NULL;
- return ret;
- }
-
- return ret;
-}
-
-static GstFlowReturn
-gst_flv_demux_pull_tag (GstPad * pad, GstFLVDemux * demux)
-{
- GstBuffer *buffer = NULL;
- GstFlowReturn ret = GST_FLOW_OK;
-
- /* Store tag offset */
- demux->cur_tag_offset = demux->offset;
-
- /* Get the first 4 bytes to identify tag type and size */
- if (G_UNLIKELY ((ret = gst_flv_demux_pull_range (demux, pad, demux->offset,
- FLV_TAG_TYPE_SIZE, &buffer)) != GST_FLOW_OK))
- goto beach;
-
- /* Identify tag type */
- ret = gst_flv_parse_tag_type (demux, buffer);
-
- gst_buffer_unref (buffer);
-
- if (G_UNLIKELY (ret != GST_FLOW_OK))
- goto beach;
-
- /* Jump over tag type + size */
- demux->offset += FLV_TAG_TYPE_SIZE;
-
- /* Pull the whole tag */
- if (G_UNLIKELY ((ret = gst_flv_demux_pull_range (demux, pad, demux->offset,
- demux->tag_size, &buffer)) != GST_FLOW_OK))
- goto beach;
-
- switch (demux->state) {
- case FLV_STATE_TAG_VIDEO:
- ret = gst_flv_parse_tag_video (demux, buffer);
- break;
- case FLV_STATE_TAG_AUDIO:
- ret = gst_flv_parse_tag_audio (demux, buffer);
- break;
- case FLV_STATE_TAG_SCRIPT:
- ret = gst_flv_parse_tag_script (demux, buffer);
- break;
- default:
- GST_WARNING_OBJECT (demux, "unexpected state %d", demux->state);
- }
-
- gst_buffer_unref (buffer);
-
- /* Jump over that part we've just parsed */
- demux->offset += demux->tag_size;
-
- /* Make sure we reinitialize the tag size */
- demux->tag_size = 0;
-
- /* Ready for the next tag */
- demux->state = FLV_STATE_TAG_TYPE;
-
- if (G_UNLIKELY (ret == GST_FLOW_NOT_LINKED)) {
- /* If either audio or video is linked we return GST_FLOW_OK */
- if (demux->audio_linked || demux->video_linked) {
- ret = GST_FLOW_OK;
- } else {
- GST_WARNING_OBJECT (demux, "parsing this tag returned not-linked and "
- "neither video nor audio are linked");
- }
- }
-
-beach:
- return ret;
-}
-
-static GstFlowReturn
-gst_flv_demux_pull_header (GstPad * pad, GstFLVDemux * demux)
-{
- GstBuffer *buffer = NULL;
- GstFlowReturn ret = GST_FLOW_OK;
-
- /* Get the first 9 bytes */
- if (G_UNLIKELY ((ret = gst_flv_demux_pull_range (demux, pad, demux->offset,
- FLV_HEADER_SIZE, &buffer)) != GST_FLOW_OK))
- goto beach;
-
- ret = gst_flv_parse_header (demux, buffer);
-
- gst_buffer_unref (buffer);
-
- /* Jump over the header now */
- demux->offset += FLV_HEADER_SIZE;
- demux->state = FLV_STATE_TAG_TYPE;
-
-beach:
- return ret;
-}
-
-static GstFlowReturn
-gst_flv_demux_seek_to_prev_keyframe (GstFLVDemux * demux)
-{
- return GST_FLOW_OK;
-}
-
-static gboolean
-gst_flv_demux_push_src_event (GstFLVDemux * demux, GstEvent * event)
-{
- gboolean ret = TRUE;
-
- if (demux->audio_pad)
- ret |= gst_pad_push_event (demux->audio_pad, gst_event_ref (event));
-
- if (demux->video_pad)
- ret |= gst_pad_push_event (demux->video_pad, gst_event_ref (event));
-
- gst_event_unref (event);
-
- return ret;
-}
-
-static void
-gst_flv_demux_create_index (GstFLVDemux * demux)
-{
- gint64 size;
- GstFormat fmt = GST_FORMAT_BYTES;
- size_t tag_size;
- guint64 old_offset;
- GstBuffer *buffer;
- GstFlowReturn ret;
-
- if (!gst_pad_query_peer_duration (demux->sinkpad, &fmt, &size) ||
- fmt != GST_FORMAT_BYTES)
- return;
-
- old_offset = demux->offset;
-
- while ((ret =
- gst_flv_demux_pull_range (demux, demux->sinkpad, demux->offset, 12,
- &buffer)) == GST_FLOW_OK) {
- if (gst_flv_parse_tag_timestamp (demux, buffer,
- &tag_size) == GST_CLOCK_TIME_NONE) {
- gst_buffer_unref (buffer);
- break;
- }
-
- gst_buffer_unref (buffer);
- demux->offset += tag_size;
- }
-
- demux->offset = old_offset;
-}
-
-static void
-gst_flv_demux_loop (GstPad * pad)
-{
- GstFLVDemux *demux = NULL;
- GstFlowReturn ret = GST_FLOW_OK;
-
- demux = GST_FLV_DEMUX (gst_pad_get_parent (pad));
-
- if (demux->segment.rate >= 0) {
- /* pull in data */
- switch (demux->state) {
- case FLV_STATE_TAG_TYPE:
- ret = gst_flv_demux_pull_tag (pad, demux);
- break;
- case FLV_STATE_DONE:
- ret = GST_FLOW_UNEXPECTED;
- break;
- default:
- ret = gst_flv_demux_pull_header (pad, demux);
- if (ret == GST_FLOW_OK)
- gst_flv_demux_create_index (demux);
-
- }
-
- /* pause if something went wrong */
- if (G_UNLIKELY (ret != GST_FLOW_OK))
- goto pause;
-
- /* check EOS condition */
- if ((demux->segment.flags & GST_SEEK_FLAG_SEGMENT) &&
- (demux->segment.stop != -1) &&
- (demux->segment.last_stop >= demux->segment.stop)) {
- ret = GST_FLOW_UNEXPECTED;
- goto pause;
- }
- } else { /* Reverse playback */
- /* pull in data */
- switch (demux->state) {
- case FLV_STATE_TAG_TYPE:
- ret = gst_flv_demux_pull_tag (pad, demux);
- /* When packet parsing returns UNEXPECTED that means we ve reached the
- point where we want to go to the previous keyframe. This is either
- the last FLV tag or the keyframe we used last time */
- if (ret == GST_FLOW_UNEXPECTED) {
- ret = gst_flv_demux_seek_to_prev_keyframe (demux);
- demux->state = FLV_STATE_TAG_TYPE;
- }
- break;
- default:
- ret = gst_flv_demux_pull_header (pad, demux);
- if (ret == GST_FLOW_OK)
- gst_flv_demux_create_index (demux);
- }
-
- /* pause if something went wrong */
- if (G_UNLIKELY (ret != GST_FLOW_OK))
- goto pause;
-
- /* check EOS condition */
- if (demux->segment.last_stop <= demux->segment.start) {
- ret = GST_FLOW_UNEXPECTED;
- goto pause;
- }
- }
-
- gst_object_unref (demux);
-
- return;
-
-pause:
- {
- const gchar *reason = gst_flow_get_name (ret);
-
- GST_LOG_OBJECT (demux, "pausing task, reason %s", reason);
- gst_pad_pause_task (pad);
-
- if (GST_FLOW_IS_FATAL (ret) || ret == GST_FLOW_NOT_LINKED) {
- if (ret == GST_FLOW_UNEXPECTED) {
- /* perform EOS logic */
- gst_element_no_more_pads (GST_ELEMENT_CAST (demux));
- if (demux->segment.flags & GST_SEEK_FLAG_SEGMENT) {
- gint64 stop;
-
- /* for segment playback we need to post when (in stream time)
- * we stopped, this is either stop (when set) or the duration. */
- if ((stop = demux->segment.stop) == -1)
- stop = demux->segment.duration;
-
- if (demux->segment.rate >= 0) {
- GST_LOG_OBJECT (demux, "Sending segment done, at end of segment");
- gst_element_post_message (GST_ELEMENT_CAST (demux),
- gst_message_new_segment_done (GST_OBJECT_CAST (demux),
- GST_FORMAT_TIME, stop));
- } else { /* Reverse playback */
- GST_LOG_OBJECT (demux, "Sending segment done, at beginning of "
- "segment");
- gst_element_post_message (GST_ELEMENT_CAST (demux),
- gst_message_new_segment_done (GST_OBJECT_CAST (demux),
- GST_FORMAT_TIME, demux->segment.start));
- }
- } else {
- /* normal playback, send EOS to all linked pads */
- gst_element_no_more_pads (GST_ELEMENT (demux));
- GST_LOG_OBJECT (demux, "Sending EOS, at end of stream");
- if (!gst_flv_demux_push_src_event (demux, gst_event_new_eos ()))
- GST_WARNING_OBJECT (demux, "failed pushing EOS on streams");
- }
- } else {
- GST_ELEMENT_ERROR (demux, STREAM, FAILED,
- ("Internal data stream error."),
- ("stream stopped, reason %s", reason));
- gst_flv_demux_push_src_event (demux, gst_event_new_eos ());
- }
- }
- gst_object_unref (demux);
- return;
- }
-}
-
-static guint64
-gst_flv_demux_find_offset (GstFLVDemux * demux, GstSegment * segment)
-{
- gint64 bytes = 0;
- gint64 time = 0;
- GstIndexEntry *entry;
-
- g_return_val_if_fail (segment != NULL, 0);
-
- time = segment->start;
-
- if (demux->index) {
- /* Let's check if we have an index entry for that seek time */
- entry = gst_index_get_assoc_entry (demux->index, demux->index_id,
- GST_INDEX_LOOKUP_BEFORE, GST_ASSOCIATION_FLAG_KEY_UNIT,
- GST_FORMAT_TIME, time);
-
- if (entry) {
- gst_index_entry_assoc_map (entry, GST_FORMAT_BYTES, &bytes);
- gst_index_entry_assoc_map (entry, GST_FORMAT_TIME, &time);
-
- GST_DEBUG_OBJECT (demux, "found index entry for %" GST_TIME_FORMAT
- " at %" GST_TIME_FORMAT ", seeking to %" G_GINT64_FORMAT,
- GST_TIME_ARGS (segment->start), GST_TIME_ARGS (time), bytes);
-
- /* Key frame seeking */
- if (segment->flags & GST_SEEK_FLAG_KEY_UNIT) {
- /* Adjust the segment so that the keyframe fits in */
- if (time < segment->start) {
- segment->start = segment->time = time;
- }
- segment->last_stop = time;
- }
- } else {
- GST_DEBUG_OBJECT (demux, "no index entry found for %" GST_TIME_FORMAT,
- GST_TIME_ARGS (segment->start));
- }
- }
-
- return bytes;
-}
-
-static gboolean
-gst_flv_demux_handle_seek_push (GstFLVDemux * demux, GstEvent * event)
-{
- GstFormat format;
- GstSeekFlags flags;
- GstSeekType start_type, stop_type;
- gint64 start, stop;
- gdouble rate;
- gboolean update, flush, keyframe, ret;
- GstSegment seeksegment;
-
- gst_event_parse_seek (event, &rate, &format, &flags,
- &start_type, &start, &stop_type, &stop);
-
- if (format != GST_FORMAT_TIME)
- goto wrong_format;
-
- flush = !!(flags & GST_SEEK_FLAG_FLUSH);
- keyframe = !!(flags & GST_SEEK_FLAG_KEY_UNIT);
-
- /* Work on a copy until we are sure the seek succeeded. */
- memcpy (&seeksegment, &demux->segment, sizeof (GstSegment));
-
- GST_DEBUG_OBJECT (demux, "segment before configure %" GST_SEGMENT_FORMAT,
- &demux->segment);
-
- /* Apply the seek to our segment */
- gst_segment_set_seek (&seeksegment, rate, format, flags,
- start_type, start, stop_type, stop, &update);
-
- GST_DEBUG_OBJECT (demux, "segment configured %" GST_SEGMENT_FORMAT,
- &seeksegment);
-
- if (flush || seeksegment.last_stop != demux->segment.last_stop) {
- /* Do the actual seeking */
- guint64 offset = gst_flv_demux_find_offset (demux, &seeksegment);
-
- GST_DEBUG_OBJECT (demux, "generating an upstream seek at position %"
- G_GUINT64_FORMAT, offset);
- ret = gst_pad_push_event (demux->sinkpad,
- gst_event_new_seek (seeksegment.rate, GST_FORMAT_BYTES,
- seeksegment.flags | GST_SEEK_FLAG_ACCURATE, GST_SEEK_TYPE_SET,
- offset, GST_SEEK_TYPE_NONE, 0));
- if (G_UNLIKELY (!ret)) {
- GST_WARNING_OBJECT (demux, "upstream seek failed");
- }
-
- /* Tell all the stream we moved to a different position (discont) */
- demux->audio_need_discont = TRUE;
- demux->video_need_discont = TRUE;
- } else {
- ret = TRUE;
- }
-
- if (ret) {
- /* Ok seek succeeded, take the newly configured segment */
- memcpy (&demux->segment, &seeksegment, sizeof (GstSegment));
-
- /* Tell all the stream a new segment is needed */
- demux->audio_need_segment = TRUE;
- demux->video_need_segment = TRUE;
- /* Clean any potential newsegment event kept for the streams. The first
- * stream needing a new segment will create a new one. */
- if (G_UNLIKELY (demux->new_seg_event)) {
- gst_event_unref (demux->new_seg_event);
- demux->new_seg_event = NULL;
- }
- gst_event_unref (event);
- } else {
- ret = gst_pad_push_event (demux->sinkpad, event);
- }
-
- return ret;
-
-/* ERRORS */
-wrong_format:
- {
- GST_WARNING_OBJECT (demux, "we only support seeking in TIME format");
- return gst_pad_push_event (demux->sinkpad, event);
- }
-}
-
-static gboolean
-gst_flv_demux_handle_seek_pull (GstFLVDemux * demux, GstEvent * event)
-{
- GstFormat format;
- GstSeekFlags flags;
- GstSeekType start_type, stop_type;
- gint64 start, stop;
- gdouble rate;
- gboolean update, flush, keyframe, ret;
- GstSegment seeksegment;
-
- gst_event_parse_seek (event, &rate, &format, &flags,
- &start_type, &start, &stop_type, &stop);
-
- gst_event_unref (event);
-
- if (format != GST_FORMAT_TIME)
- goto wrong_format;
-
- flush = !!(flags & GST_SEEK_FLAG_FLUSH);
- keyframe = !!(flags & GST_SEEK_FLAG_KEY_UNIT);
-
- if (flush) {
- /* Flush start up and downstream to make sure data flow and loops are
- idle */
- gst_flv_demux_push_src_event (demux, gst_event_new_flush_start ());
- gst_pad_push_event (demux->sinkpad, gst_event_new_flush_start ());
- } else {
- /* Pause the pulling task */
- gst_pad_pause_task (demux->sinkpad);
- }
-
- /* Take the stream lock */
- GST_PAD_STREAM_LOCK (demux->sinkpad);
-
- if (flush) {
- /* Stop flushing upstream we need to pull */
- gst_pad_push_event (demux->sinkpad, gst_event_new_flush_stop ());
- }
-
- /* Work on a copy until we are sure the seek succeeded. */
- memcpy (&seeksegment, &demux->segment, sizeof (GstSegment));
-
- GST_DEBUG_OBJECT (demux, "segment before configure %" GST_SEGMENT_FORMAT,
- &demux->segment);
-
- /* Apply the seek to our segment */
- gst_segment_set_seek (&seeksegment, rate, format, flags,
- start_type, start, stop_type, stop, &update);
-
- GST_DEBUG_OBJECT (demux, "segment configured %" GST_SEGMENT_FORMAT,
- &seeksegment);
-
- if (flush || seeksegment.last_stop != demux->segment.last_stop) {
- /* Do the actual seeking */
- demux->offset = gst_flv_demux_find_offset (demux, &seeksegment);
-
- /* Tell all the stream we moved to a different position (discont) */
- demux->audio_need_discont = TRUE;
- demux->video_need_discont = TRUE;
-
- /* If we seeked at the beginning of the file parse the header again */
- if (G_UNLIKELY (!demux->offset)) {
- demux->state = FLV_STATE_HEADER;
- } else { /* or parse a tag */
- demux->state = FLV_STATE_TAG_TYPE;
- }
- ret = TRUE;
- } else {
- ret = TRUE;
- }
-
- if (G_UNLIKELY (demux->close_seg_event)) {
- gst_event_unref (demux->close_seg_event);
- demux->close_seg_event = NULL;
- }
-
- if (flush) {
- /* Stop flushing, the sinks are at time 0 now */
- gst_flv_demux_push_src_event (demux, gst_event_new_flush_stop ());
- } else {
- GST_DEBUG_OBJECT (demux, "closing running segment %" GST_SEGMENT_FORMAT,
- &demux->segment);
-
- /* Close the current segment for a linear playback */
- if (demux->segment.rate >= 0) {
- /* for forward playback, we played from start to last_stop */
- demux->close_seg_event = gst_event_new_new_segment (TRUE,
- demux->segment.rate, demux->segment.format,
- demux->segment.start, demux->segment.last_stop, demux->segment.time);
- } else {
- gint64 stop;
-
- if ((stop = demux->segment.stop) == -1)
- stop = demux->segment.duration;
-
- /* for reverse playback, we played from stop to last_stop. */
- demux->close_seg_event = gst_event_new_new_segment (TRUE,
- demux->segment.rate, demux->segment.format,
- demux->segment.last_stop, stop, demux->segment.last_stop);
- }
- }
-
- if (ret) {
- /* Ok seek succeeded, take the newly configured segment */
- memcpy (&demux->segment, &seeksegment, sizeof (GstSegment));
-
- /* Notify about the start of a new segment */
- if (demux->segment.flags & GST_SEEK_FLAG_SEGMENT) {
- gst_element_post_message (GST_ELEMENT (demux),
- gst_message_new_segment_start (GST_OBJECT (demux),
- demux->segment.format, demux->segment.last_stop));
- }
-
- /* Tell all the stream a new segment is needed */
- demux->audio_need_segment = TRUE;
- demux->video_need_segment = TRUE;
- /* Clean any potential newsegment event kept for the streams. The first
- * stream needing a new segment will create a new one. */
- if (G_UNLIKELY (demux->new_seg_event)) {
- gst_event_unref (demux->new_seg_event);
- demux->new_seg_event = NULL;
- }
- }
-
- gst_pad_start_task (demux->sinkpad,
- (GstTaskFunction) gst_flv_demux_loop, demux->sinkpad);
-
- GST_PAD_STREAM_UNLOCK (demux->sinkpad);
-
- return ret;
-
- /* ERRORS */
-wrong_format:
- {
- GST_WARNING_OBJECT (demux, "we only support seeking in TIME format");
- return FALSE;
- }
-}
-
-/* If we can pull that's prefered */
-static gboolean
-gst_flv_demux_sink_activate (GstPad * sinkpad)
-{
- if (gst_pad_check_pull_range (sinkpad)) {
- return gst_pad_activate_pull (sinkpad, TRUE);
- } else {
- return gst_pad_activate_push (sinkpad, TRUE);
- }
-}
-
-/* This function gets called when we activate ourselves in push mode.
- * We cannot seek (ourselves) in the stream */
-static gboolean
-gst_flv_demux_sink_activate_push (GstPad * sinkpad, gboolean active)
-{
- GstFLVDemux *demux;
-
- demux = GST_FLV_DEMUX (gst_pad_get_parent (sinkpad));
-
- demux->random_access = FALSE;
-
- gst_object_unref (demux);
-
- return TRUE;
-}
-
-/* this function gets called when we activate ourselves in pull mode.
- * We can perform random access to the resource and we start a task
- * to start reading */
-static gboolean
-gst_flv_demux_sink_activate_pull (GstPad * sinkpad, gboolean active)
-{
- GstFLVDemux *demux;
-
- demux = GST_FLV_DEMUX (gst_pad_get_parent (sinkpad));
-
- if (active) {
- demux->random_access = TRUE;
- gst_object_unref (demux);
- return gst_pad_start_task (sinkpad, (GstTaskFunction) gst_flv_demux_loop,
- sinkpad);
- } else {
- demux->random_access = FALSE;
- gst_object_unref (demux);
- return gst_pad_stop_task (sinkpad);
- }
-}
-
-static gboolean
-gst_flv_demux_sink_event (GstPad * pad, GstEvent * event)
-{
- GstFLVDemux *demux;
- gboolean ret = FALSE;
-
- demux = GST_FLV_DEMUX (gst_pad_get_parent (pad));
-
- GST_DEBUG_OBJECT (demux, "handling event %s", GST_EVENT_TYPE_NAME (event));
-
- switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_FLUSH_START:
- GST_DEBUG_OBJECT (demux, "trying to force chain function to exit");
- demux->flushing = TRUE;
- ret = gst_flv_demux_push_src_event (demux, event);
- break;
- case GST_EVENT_FLUSH_STOP:
- GST_DEBUG_OBJECT (demux, "flushing FLV demuxer");
- gst_flv_demux_flush (demux, TRUE);
- ret = gst_flv_demux_push_src_event (demux, event);
- break;
- case GST_EVENT_EOS:
- GST_DEBUG_OBJECT (demux, "received EOS");
- if (demux->index) {
- GST_DEBUG_OBJECT (demux, "committing index");
- gst_index_commit (demux->index, demux->index_id);
- }
- gst_element_no_more_pads (GST_ELEMENT (demux));
- if (!gst_flv_demux_push_src_event (demux, event))
- GST_WARNING_OBJECT (demux, "failed pushing EOS on streams");
- ret = TRUE;
- break;
- case GST_EVENT_NEWSEGMENT:
- {
- GstFormat format;
- gdouble rate;
- gint64 start, stop, time;
- gboolean update;
-
- GST_DEBUG_OBJECT (demux, "received new segment");
-
- gst_event_parse_new_segment (event, &update, &rate, &format, &start,
- &stop, &time);
-
- if (format == GST_FORMAT_TIME) {
- /* time segment, this is perfect, copy over the values. */
- gst_segment_set_newsegment (&demux->segment, update, rate, format,
- start, stop, time);
-
- GST_DEBUG_OBJECT (demux, "NEWSEGMENT: %" GST_SEGMENT_FORMAT,
- &demux->segment);
-
- /* and forward */
- ret = gst_flv_demux_push_src_event (demux, event);
- } else {
- /* non-time format */
- demux->audio_need_segment = TRUE;
- demux->video_need_segment = TRUE;
- ret = TRUE;
- gst_event_unref (event);
- }
- break;
- }
- default:
- ret = gst_flv_demux_push_src_event (demux, event);
- break;
- }
-
- gst_object_unref (demux);
-
- return ret;
-}
-
-gboolean
-gst_flv_demux_src_event (GstPad * pad, GstEvent * event)
-{
- GstFLVDemux *demux;
- gboolean ret = FALSE;
-
- demux = GST_FLV_DEMUX (gst_pad_get_parent (pad));
-
- GST_DEBUG_OBJECT (demux, "handling event %s", GST_EVENT_TYPE_NAME (event));
-
- switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_SEEK:
- if (demux->random_access) {
- ret = gst_flv_demux_handle_seek_pull (demux, event);
- } else {
- ret = gst_flv_demux_handle_seek_push (demux, event);
- }
- break;
- default:
- ret = gst_pad_push_event (demux->sinkpad, event);
- break;
- }
-
- gst_object_unref (demux);
-
- return ret;
-}
-
-gboolean
-gst_flv_demux_query (GstPad * pad, GstQuery * query)
-{
- gboolean res = TRUE;
- GstFLVDemux *demux;
-
- demux = GST_FLV_DEMUX (gst_pad_get_parent (pad));
-
- switch (GST_QUERY_TYPE (query)) {
- case GST_QUERY_DURATION:
- {
- GstFormat format;
-
- gst_query_parse_duration (query, &format, NULL);
-
- /* duration is time only */
- if (format != GST_FORMAT_TIME) {
- GST_DEBUG_OBJECT (demux, "duration query only supported for time "
- "format");
- res = FALSE;
- goto beach;
- }
-
- GST_DEBUG_OBJECT (pad, "duration query, replying %" GST_TIME_FORMAT,
- GST_TIME_ARGS (demux->duration));
-
- gst_query_set_duration (query, GST_FORMAT_TIME, demux->duration);
-
- break;
- }
- case GST_QUERY_POSITION:
- {
- GstFormat format;
-
- gst_query_parse_position (query, &format, NULL);
-
- /* position is time only */
- if (format != GST_FORMAT_TIME) {
- GST_DEBUG_OBJECT (demux, "position query only supported for time "
- "format");
- res = FALSE;
- goto beach;
- }
-
- GST_DEBUG_OBJECT (pad, "position query, replying %" GST_TIME_FORMAT,
- GST_TIME_ARGS (demux->segment.last_stop));
-
- gst_query_set_duration (query, GST_FORMAT_TIME, demux->segment.last_stop);
-
- break;
- }
-
- case GST_QUERY_LATENCY:
- default:
- {
- GstPad *peer;
-
- if ((peer = gst_pad_get_peer (demux->sinkpad))) {
- /* query latency on peer pad */
- res = gst_pad_query (peer, query);
- gst_object_unref (peer);
- } else {
- /* no peer, we don't know */
- res = FALSE;
- }
- break;
- }
- }
-
-beach:
- gst_object_unref (demux);
-
- return res;
-}
-
-static GstStateChangeReturn
-gst_flv_demux_change_state (GstElement * element, GstStateChange transition)
-{
- GstFLVDemux *demux;
- GstStateChangeReturn ret;
-
- demux = GST_FLV_DEMUX (element);
-
- switch (transition) {
- case GST_STATE_CHANGE_READY_TO_PAUSED:
- /* If this is our own index destroy it as the
- * old entries might be wrong for the new stream */
- if (demux->own_index) {
- gst_object_unref (demux->index);
- demux->index = NULL;
- demux->own_index = FALSE;
- }
-
- /* If no index was created, generate one */
- if (G_UNLIKELY (!demux->index)) {
- GST_DEBUG_OBJECT (demux, "no index provided creating our own");
-
- demux->index = gst_index_factory_make ("memindex");
-
- gst_index_get_writer_id (demux->index, GST_OBJECT (demux),
- &demux->index_id);
- demux->own_index = TRUE;
- }
- gst_flv_demux_cleanup (demux);
- break;
- default:
- break;
- }
-
- ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
- if (ret == GST_STATE_CHANGE_FAILURE)
- return ret;
-
- switch (transition) {
- case GST_STATE_CHANGE_PAUSED_TO_READY:
- gst_flv_demux_cleanup (demux);
- break;
- default:
- break;
- }
-
- return ret;
-}
-
-static void
-gst_flv_demux_set_index (GstElement * element, GstIndex * index)
-{
- GstFLVDemux *demux = GST_FLV_DEMUX (element);
-
- GST_OBJECT_LOCK (demux);
- if (demux->index)
- gst_object_unref (demux->index);
- demux->index = gst_object_ref (index);
- GST_OBJECT_UNLOCK (demux);
-
- gst_index_get_writer_id (index, GST_OBJECT (element), &demux->index_id);
- demux->own_index = FALSE;
-}
-
-static GstIndex *
-gst_flv_demux_get_index (GstElement * element)
-{
- GstIndex *result = NULL;
-
- GstFLVDemux *demux = GST_FLV_DEMUX (element);
-
- GST_OBJECT_LOCK (demux);
- if (demux->index)
- result = gst_object_ref (demux->index);
- GST_OBJECT_UNLOCK (demux);
-
- return result;
-}
-
-static void
-gst_flv_demux_dispose (GObject * object)
-{
- GstFLVDemux *demux = GST_FLV_DEMUX (object);
-
- GST_DEBUG_OBJECT (demux, "disposing FLV demuxer");
-
- if (demux->adapter) {
- gst_adapter_clear (demux->adapter);
- g_object_unref (demux->adapter);
- demux->adapter = NULL;
- }
-
- if (demux->taglist) {
- gst_tag_list_free (demux->taglist);
- demux->taglist = NULL;
- }
-
- if (demux->new_seg_event) {
- gst_event_unref (demux->new_seg_event);
- demux->new_seg_event = NULL;
- }
-
- if (demux->close_seg_event) {
- gst_event_unref (demux->close_seg_event);
- demux->close_seg_event = NULL;
- }
-
- if (demux->audio_codec_data) {
- gst_buffer_unref (demux->audio_codec_data);
- demux->audio_codec_data = NULL;
- }
-
- if (demux->video_codec_data) {
- gst_buffer_unref (demux->video_codec_data);
- demux->video_codec_data = NULL;
- }
-
- if (demux->audio_pad) {
- gst_object_unref (demux->audio_pad);
- demux->audio_pad = NULL;
- }
-
- if (demux->video_pad) {
- gst_object_unref (demux->video_pad);
- demux->video_pad = NULL;
- }
-
- if (demux->index) {
- gst_object_unref (demux->index);
- demux->index = NULL;
- }
-
- if (demux->times) {
- g_array_free (demux->times, TRUE);
- demux->times = NULL;
- }
-
- if (demux->filepositions) {
- g_array_free (demux->filepositions, TRUE);
- demux->filepositions = NULL;
- }
-
- GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
-}
-
-static void
-gst_flv_demux_base_init (gpointer g_class)
-{
- GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&flv_sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&audio_src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&video_src_template));
- gst_element_class_set_details_simple (element_class, "FLV Demuxer",
- "Codec/Demuxer",
- "Demux FLV feeds into digital streams",
- "Julien Moutte <julien@moutte.net>");
-}
-
-static void
-gst_flv_demux_class_init (GstFLVDemuxClass * klass)
-{
- GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_flv_demux_dispose);
-
- gstelement_class->change_state =
- GST_DEBUG_FUNCPTR (gst_flv_demux_change_state);
- gstelement_class->set_index = GST_DEBUG_FUNCPTR (gst_flv_demux_set_index);
- gstelement_class->get_index = GST_DEBUG_FUNCPTR (gst_flv_demux_get_index);
-}
-
-static void
-gst_flv_demux_init (GstFLVDemux * demux, GstFLVDemuxClass * g_class)
-{
- demux->sinkpad =
- gst_pad_new_from_static_template (&flv_sink_template, "sink");
-
- gst_pad_set_event_function (demux->sinkpad,
- GST_DEBUG_FUNCPTR (gst_flv_demux_sink_event));
- gst_pad_set_chain_function (demux->sinkpad,
- GST_DEBUG_FUNCPTR (gst_flv_demux_chain));
- gst_pad_set_activate_function (demux->sinkpad,
- GST_DEBUG_FUNCPTR (gst_flv_demux_sink_activate));
- gst_pad_set_activatepull_function (demux->sinkpad,
- GST_DEBUG_FUNCPTR (gst_flv_demux_sink_activate_pull));
- gst_pad_set_activatepush_function (demux->sinkpad,
- GST_DEBUG_FUNCPTR (gst_flv_demux_sink_activate_push));
-
- gst_element_add_pad (GST_ELEMENT (demux), demux->sinkpad);
-
- demux->adapter = gst_adapter_new ();
- demux->taglist = gst_tag_list_new ();
- gst_segment_init (&demux->segment, GST_FORMAT_TIME);
-
- demux->own_index = FALSE;
-
- gst_flv_demux_cleanup (demux);
-}
-
-static gboolean
-plugin_init (GstPlugin * plugin)
-{
- GST_DEBUG_CATEGORY_INIT (flvdemux_debug, "flvdemux", 0, "FLV demuxer");
-
- if (!gst_element_register (plugin, "flvdemux", GST_RANK_PRIMARY,
- gst_flv_demux_get_type ()) ||
- !gst_element_register (plugin, "flvmux", GST_RANK_NONE,
- gst_flv_mux_get_type ()))
- return FALSE;
-
- return TRUE;
-}
-
-GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR,
- "flv", "FLV muxing and demuxing plugin",
- plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/gst/flv/gstflvdemux.h b/gst/flv/gstflvdemux.h
deleted file mode 100644
index 72c0bcd4..00000000
--- a/gst/flv/gstflvdemux.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/* GStreamer
- * Copyright (C) <2007> Julien Moutte <julien@moutte.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.
- */
-
-#ifndef __FLV_DEMUX_H__
-#define __FLV_DEMUX_H__
-
-#include <gst/gst.h>
-#include <gst/base/gstadapter.h>
-
-G_BEGIN_DECLS
-#define GST_TYPE_FLV_DEMUX \
- (gst_flv_demux_get_type())
-#define GST_FLV_DEMUX(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FLV_DEMUX,GstFLVDemux))
-#define GST_FLV_DEMUX_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FLV_DEMUX,GstFLVDemuxClass))
-#define GST_IS_FLV_DEMUX(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FLV_DEMUX))
-#define GST_IS_FLV_DEMUX_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FLV_DEMUX))
-typedef struct _GstFLVDemux GstFLVDemux;
-typedef struct _GstFLVDemuxClass GstFLVDemuxClass;
-
-typedef enum
-{
- FLV_STATE_HEADER,
- FLV_STATE_TAG_TYPE,
- FLV_STATE_TAG_VIDEO,
- FLV_STATE_TAG_AUDIO,
- FLV_STATE_TAG_SCRIPT,
- FLV_STATE_DONE,
- FLV_STATE_NONE
-} GstFLVDemuxState;
-
-struct _GstFLVDemux
-{
- GstElement element;
-
- GstPad *sinkpad;
-
- GstPad *audio_pad;
- GstPad *video_pad;
-
- /* <private> */
-
- GstIndex *index;
- gint index_id;
- gboolean own_index;
-
- GArray * times;
- GArray * filepositions;
-
- GstAdapter *adapter;
-
- GstSegment segment;
-
- GstEvent *close_seg_event;
- GstEvent *new_seg_event;
-
- GstTagList *taglist;
-
- GstFLVDemuxState state;
-
- guint64 offset;
- guint64 cur_tag_offset;
- GstClockTime duration;
- guint64 tag_size;
- guint64 tag_data_size;
-
- /* Audio infos */
- guint16 rate;
- guint16 channels;
- guint16 width;
- guint16 audio_codec_tag;
- guint64 audio_offset;
- gboolean audio_need_discont;
- gboolean audio_need_segment;
- gboolean audio_linked;
- GstBuffer * audio_codec_data;
-
- /* Video infos */
- guint32 w;
- guint32 h;
- guint32 par_x;
- guint32 par_y;
- guint16 video_codec_tag;
- guint64 video_offset;
- gboolean video_need_discont;
- gboolean video_need_segment;
- gboolean video_linked;
- gboolean got_par;
- GstBuffer * video_codec_data;
-
- gboolean random_access;
- gboolean need_header;
- gboolean has_audio;
- gboolean has_video;
- gboolean push_tags;
- gboolean strict;
- gboolean flushing;
-};
-
-struct _GstFLVDemuxClass
-{
- GstElementClass parent_class;
-};
-
-GType gst_flv_demux_get_type (void);
-
-gboolean gst_flv_demux_query (GstPad * pad, GstQuery * query);
-gboolean gst_flv_demux_src_event (GstPad * pad, GstEvent * event);
-
-G_END_DECLS
-#endif /* __FLV_DEMUX_H__ */
diff --git a/gst/flv/gstflvmux.c b/gst/flv/gstflvmux.c
deleted file mode 100644
index dd27276a..00000000
--- a/gst/flv/gstflvmux.c
+++ /dev/null
@@ -1,1040 +0,0 @@
-/* GStreamer
- *
- * Copyright (c) 2008 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.
- */
-
-/**
- * SECTION:element-flvmux
- *
- * flvmux muxes different streams into an FLV file.
- *
- * <refsect2>
- * <title>Example launch line</title>
- * |[
- * gst-launch -v filesrc location=/path/to/audio ! decodebin2 ! queue ! flvmux name=m ! filesink location=file.flv filesrc location=/path/to/video ! decodebin2 ! queue ! m.
- * ]| This pipeline muxes an audio and video file into a single FLV file.
- * </refsect2>
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <math.h>
-#include <string.h>
-
-#include "gstflvmux.h"
-
-GST_DEBUG_CATEGORY_STATIC (flvmux_debug);
-#define GST_CAT_DEFAULT flvmux_debug
-
-static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src",
- GST_PAD_SRC,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS ("video/x-flv")
- );
-
-static GstStaticPadTemplate videosink_templ = GST_STATIC_PAD_TEMPLATE ("video",
- GST_PAD_SINK,
- GST_PAD_REQUEST,
- GST_STATIC_CAPS ("video/x-flash-video; "
- "video/x-flash-screen; "
- "video/x-vp6-flash; " "video/x-vp6-alpha; " "video/x-h264;")
- );
-
-static GstStaticPadTemplate audiosink_templ = GST_STATIC_PAD_TEMPLATE ("audio",
- GST_PAD_SINK,
- GST_PAD_REQUEST,
- GST_STATIC_CAPS
- ("audio/x-adpcm, layout = (string) swf, channels = (int) { 1, 2 }, rate = (int) { 5512, 11025, 22050, 44100 }; "
- "audio/mpeg, mpegversion = (int) 1, layer = (int) 3, channels = (int) { 1, 2 }, rate = (int) { 5512, 8000, 11025, 22050, 44100 }, parsed = (boolean) TRUE; "
- "audio/mpeg, mpegversion = (int) 4, framed = (boolean) TRUE; "
- "audio/x-nellymoser, channels = (int) { 1, 2 }, rate = (int) { 5512, 8000, 11025, 16000, 22050, 44100 }; "
- "audio/x-raw-int, endianness = (int) LITTLE_ENDIAN, channels = (int) { 1, 2 }, width = (int) 8, depth = (int) 8, rate = (int) { 5512, 11025, 22050, 44100 }, signed = (boolean) FALSE; "
- "audio/x-raw-int, endianness = (int) LITTLE_ENDIAN, channels = (int) { 1, 2 }, width = (int) 16, depth = (int) 16, rate = (int) { 5512, 11025, 22050, 44100 }, signed = (boolean) TRUE; "
- "audio/x-alaw, channels = (int) { 1, 2 }, rate = (int) { 5512, 11025, 22050, 44100 }; "
- "audio/x-mulaw, channels = (int) { 1, 2 }, rate = (int) { 5512, 11025, 22050, 44100 }; "
- "audio/x-speex, channels = (int) { 1, 2 }, rate = (int) { 5512, 11025, 22050, 44100 };")
- );
-
-#define _do_init(type) \
- G_STMT_START{ \
- static const GInterfaceInfo tag_setter_info = { \
- NULL, \
- NULL, \
- NULL \
- }; \
- g_type_add_interface_static (type, GST_TYPE_TAG_SETTER, \
- &tag_setter_info); \
- }G_STMT_END
-
-GST_BOILERPLATE_FULL (GstFlvMux, gst_flv_mux, GstElement, GST_TYPE_ELEMENT,
- _do_init);
-
-static void gst_flv_mux_finalize (GObject * object);
-static GstFlowReturn
-gst_flv_mux_collected (GstCollectPads * pads, gpointer user_data);
-
-static gboolean gst_flv_mux_handle_src_event (GstPad * pad, GstEvent * event);
-static GstPad *gst_flv_mux_request_new_pad (GstElement * element,
- GstPadTemplate * templ, const gchar * name);
-static void gst_flv_mux_release_pad (GstElement * element, GstPad * pad);
-
-static GstStateChangeReturn
-gst_flv_mux_change_state (GstElement * element, GstStateChange transition);
-
-static void gst_flv_mux_reset (GstElement * element);
-
-static void
-gst_flv_mux_base_init (gpointer g_class)
-{
- GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&videosink_templ));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&audiosink_templ));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_templ));
- gst_element_class_set_details_simple (element_class, "FLV muxer",
- "Codec/Muxer",
- "Muxes video/audio streams into a FLV stream",
- "Sebastian Dröge <sebastian.droege@collabora.co.uk>");
-
- GST_DEBUG_CATEGORY_INIT (flvmux_debug, "flvmux", 0, "FLV muxer");
-}
-
-static void
-gst_flv_mux_class_init (GstFlvMuxClass * klass)
-{
- GObjectClass *gobject_class;
- GstElementClass *gstelement_class;
-
- GST_DEBUG_CATEGORY_INIT (flvmux_debug, "flvmux", 0, "FLV muxer");
-
- gobject_class = (GObjectClass *) klass;
- gstelement_class = (GstElementClass *) klass;
-
- gobject_class->finalize = gst_flv_mux_finalize;
-
- gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_flv_mux_change_state);
- gstelement_class->request_new_pad =
- GST_DEBUG_FUNCPTR (gst_flv_mux_request_new_pad);
- gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_flv_mux_release_pad);
-}
-
-static void
-gst_flv_mux_init (GstFlvMux * mux, GstFlvMuxClass * g_class)
-{
- mux->srcpad = gst_pad_new_from_static_template (&src_templ, "src");
- gst_pad_set_event_function (mux->srcpad, gst_flv_mux_handle_src_event);
- gst_element_add_pad (GST_ELEMENT (mux), mux->srcpad);
-
- mux->collect = gst_collect_pads_new ();
- gst_collect_pads_set_function (mux->collect,
- (GstCollectPadsFunction) GST_DEBUG_FUNCPTR (gst_flv_mux_collected), mux);
-
- gst_flv_mux_reset (GST_ELEMENT (mux));
-}
-
-static void
-gst_flv_mux_finalize (GObject * object)
-{
- GstFlvMux *mux = GST_FLV_MUX (object);
-
- gst_object_unref (mux->collect);
-
- G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-static void
-gst_flv_mux_reset (GstElement * element)
-{
- GstFlvMux *mux = GST_FLV_MUX (element);
- GSList *sl;
-
- while ((sl = mux->collect->data) != NULL) {
- GstFlvPad *cpad = (GstFlvPad *) sl->data;
-
- if (cpad->audio_codec_data)
- gst_buffer_unref (cpad->audio_codec_data);
- if (cpad->video_codec_data)
- gst_buffer_unref (cpad->video_codec_data);
-
- gst_collect_pads_remove_pad (mux->collect, cpad->collect.pad);
- }
-
- if (mux->tags)
- gst_tag_list_free (mux->tags);
- mux->tags = NULL;
-
- mux->state = GST_FLV_MUX_STATE_HEADER;
-}
-
-static gboolean
-gst_flv_mux_handle_src_event (GstPad * pad, GstEvent * event)
-{
- GstEventType type;
-
- type = event ? GST_EVENT_TYPE (event) : GST_EVENT_UNKNOWN;
-
- switch (type) {
- case GST_EVENT_SEEK:
- /* disable seeking for now */
- return FALSE;
- default:
- break;
- }
-
- return gst_pad_event_default (pad, event);
-}
-
-static gboolean
-gst_flv_mux_handle_sink_event (GstPad * pad, GstEvent * event)
-{
- GstFlvMux *mux = GST_FLV_MUX (gst_pad_get_parent (pad));
- gboolean ret = TRUE;
-
- switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_TAG:{
- GstTagList *tags;
-
- if (!mux->tags)
- mux->tags = gst_tag_list_new ();
-
- gst_event_parse_tag (event, &tags);
- if (tags) {
- gst_tag_list_insert (mux->tags, tags,
- gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (mux)));
- }
-
- break;
- }
- case GST_EVENT_NEWSEGMENT:
- /* We don't support NEWSEGMENT events */
- ret = FALSE;
- gst_event_unref (event);
- break;
- default:
- break;
- }
-
- /* now GstCollectPads can take care of the rest, e.g. EOS */
- if (ret)
- ret = mux->collect_event (pad, event);
- gst_object_unref (mux);
-
- return ret;
-}
-
-static gboolean
-gst_flv_mux_video_pad_setcaps (GstPad * pad, GstCaps * caps)
-{
- GstFlvMux *mux = GST_FLV_MUX (gst_pad_get_parent (pad));
- GstFlvPad *cpad = (GstFlvPad *) gst_pad_get_element_private (pad);
- gboolean ret = TRUE;
- GstStructure *s;
-
- s = gst_caps_get_structure (caps, 0);
-
- if (strcmp (gst_structure_get_name (s), "video/x-flash-video") == 0) {
- cpad->video_codec = 2;
- } else if (strcmp (gst_structure_get_name (s), "video/x-flash-screen") == 0) {
- cpad->video_codec = 3;
- } else if (strcmp (gst_structure_get_name (s), "video/x-vp6-flash") == 0) {
- cpad->video_codec = 4;
- } else if (strcmp (gst_structure_get_name (s), "video/x-vp6-alpha") == 0) {
- cpad->video_codec = 5;
- } else if (strcmp (gst_structure_get_name (s), "video/x-h264") == 0) {
- cpad->video_codec = 7;
- } else {
- ret = FALSE;
- }
-
- if (ret && gst_structure_has_field (s, "codec_data")) {
- const GValue *val = gst_structure_get_value (s, "codec_data");
-
- if (val) {
- cpad->video_codec_data = gst_buffer_ref (gst_value_get_buffer (val));
- cpad->sent_codec_data = FALSE;
- } else {
- cpad->sent_codec_data = TRUE;
- }
- } else {
- cpad->sent_codec_data = TRUE;
- }
-
- gst_object_unref (mux);
-
- return ret;
-}
-
-static gboolean
-gst_flv_mux_audio_pad_setcaps (GstPad * pad, GstCaps * caps)
-{
- GstFlvMux *mux = GST_FLV_MUX (gst_pad_get_parent (pad));
- GstFlvPad *cpad = (GstFlvPad *) gst_pad_get_element_private (pad);
- gboolean ret = TRUE;
- GstStructure *s;
-
- s = gst_caps_get_structure (caps, 0);
-
- if (strcmp (gst_structure_get_name (s), "audio/x-adpcm") == 0) {
- const gchar *layout = gst_structure_get_string (s, "layout");
- if (layout && strcmp (layout, "swf") == 0) {
- cpad->audio_codec = 1;
- } else {
- ret = FALSE;
- }
- } else if (strcmp (gst_structure_get_name (s), "audio/mpeg") == 0) {
- gint mpegversion;
-
- if (gst_structure_get_int (s, "mpegversion", &mpegversion)) {
- if (mpegversion == 1) {
- gint layer;
-
- if (gst_structure_get_int (s, "layer", &layer) && layer == 3) {
- gint rate;
-
- if (gst_structure_get_int (s, "rate", &rate) && rate == 8000)
- cpad->audio_codec = 14;
- else
- cpad->audio_codec = 2;
- } else {
- ret = FALSE;
- }
- } else if (mpegversion == 4) {
- cpad->audio_codec = 10;
- } else {
- ret = FALSE;
- }
- } else {
- ret = FALSE;
- }
- } else if (strcmp (gst_structure_get_name (s), "audio/x-nellymoser") == 0) {
- gint rate, channels;
-
- if (gst_structure_get_int (s, "rate", &rate)
- && gst_structure_get_int (s, "channels", &channels)) {
- if (channels == 1 && rate == 16000)
- cpad->audio_codec = 4;
- else if (channels == 1 && rate == 8000)
- cpad->audio_codec = 5;
- } else {
- cpad->audio_codec = 6;
- }
- } else if (strcmp (gst_structure_get_name (s), "audio/x-raw-int") == 0) {
- gint endianness;
-
- if (gst_structure_get_int (s, "endianness", &endianness)
- && endianness == G_LITTLE_ENDIAN)
- cpad->audio_codec = 3;
- else
- ret = FALSE;
- } else if (strcmp (gst_structure_get_name (s), "audio/x-alaw") == 0) {
- cpad->audio_codec = 7;
- } else if (strcmp (gst_structure_get_name (s), "audio/x-mulaw") == 0) {
- cpad->audio_codec = 8;
- } else if (strcmp (gst_structure_get_name (s), "audio/x-speex") == 0) {
- cpad->audio_codec = 11;
- } else {
- ret = FALSE;
- }
-
- if (ret) {
- gint rate, channels, width;
-
- if (gst_structure_get_int (s, "rate", &rate)) {
- if (cpad->audio_codec == 10)
- cpad->rate = 3;
- else if (rate == 5512)
- cpad->rate = 0;
- else if (rate == 11025)
- cpad->rate = 1;
- else if (rate == 22050)
- cpad->rate = 2;
- else if (rate == 44100)
- cpad->rate = 3;
- else if (rate == 8000 && (cpad->audio_codec == 5
- || cpad->audio_codec == 14))
- cpad->rate = 0;
- else if (rate == 16000 && cpad->audio_codec == 4)
- cpad->rate = 0;
- else
- ret = FALSE;
- } else if (cpad->audio_codec == 10) {
- cpad->rate = 3;
- } else {
- ret = FALSE;
- }
-
- if (gst_structure_get_int (s, "channels", &channels)) {
- if (cpad->audio_codec == 4 || cpad->audio_codec == 5
- || cpad->audio_codec == 6)
- cpad->channels = 0;
- else if (cpad->audio_codec == 10)
- cpad->channels = 1;
- else if (channels == 1)
- cpad->channels = 0;
- else if (channels == 2)
- cpad->channels = 1;
- else
- ret = FALSE;
- } else if (cpad->audio_codec == 4 || cpad->audio_codec == 5
- || cpad->audio_codec == 6) {
- cpad->channels = 0;
- } else if (cpad->audio_codec == 10) {
- cpad->channels = 1;
- } else {
- ret = FALSE;
- }
-
- if (gst_structure_get_int (s, "width", &width)) {
- if (cpad->audio_codec != 3)
- cpad->width = 1;
- else if (width == 8)
- cpad->width = 0;
- else if (width == 16)
- cpad->width = 1;
- else
- ret = FALSE;
- } else if (cpad->audio_codec != 3) {
- cpad->width = 1;
- } else {
- ret = FALSE;
- }
- }
-
- if (ret && gst_structure_has_field (s, "codec_data")) {
- const GValue *val = gst_structure_get_value (s, "codec_data");
-
- if (val) {
- cpad->audio_codec_data = gst_buffer_ref (gst_value_get_buffer (val));
- cpad->sent_codec_data = FALSE;
- } else {
- cpad->sent_codec_data = TRUE;
- }
- } else {
- cpad->sent_codec_data = TRUE;
- }
-
- gst_object_unref (mux);
-
- return ret;
-}
-
-static GstPad *
-gst_flv_mux_request_new_pad (GstElement * element,
- GstPadTemplate * templ, const gchar * pad_name)
-{
- GstElementClass *klass = GST_ELEMENT_GET_CLASS (element);
- GstFlvMux *mux = GST_FLV_MUX (element);
- GstFlvPad *cpad;
- GstPad *pad = NULL;
- const gchar *name = NULL;
- GstPadSetCapsFunction setcapsfunc = NULL;
- gboolean video;
-
- if (mux->state != GST_FLV_MUX_STATE_HEADER) {
- GST_WARNING_OBJECT (mux, "Can't request pads after writing header");
- return NULL;
- }
-
- if (templ == gst_element_class_get_pad_template (klass, "audio")) {
- if (mux->have_audio) {
- GST_WARNING_OBJECT (mux, "Already have an audio pad");
- return NULL;
- }
- mux->have_audio = TRUE;
- name = "audio";
- video = FALSE;
- setcapsfunc = GST_DEBUG_FUNCPTR (gst_flv_mux_audio_pad_setcaps);
- } else if (templ == gst_element_class_get_pad_template (klass, "video")) {
- if (mux->have_video) {
- GST_WARNING_OBJECT (mux, "Already have a video pad");
- return NULL;
- }
- mux->have_video = TRUE;
- name = "video";
- video = TRUE;
- setcapsfunc = GST_DEBUG_FUNCPTR (gst_flv_mux_video_pad_setcaps);
- } else {
- GST_WARNING_OBJECT (mux, "Invalid template");
- return NULL;
- }
-
- pad = gst_pad_new_from_template (templ, name);
- cpad = (GstFlvPad *)
- gst_collect_pads_add_pad (mux->collect, pad, sizeof (GstFlvPad));
-
- cpad->video = video;
-
- cpad->audio_codec = G_MAXUINT;
- cpad->rate = G_MAXUINT;
- cpad->width = G_MAXUINT;
- cpad->channels = G_MAXUINT;
- cpad->audio_codec_data = NULL;
-
- cpad->video_codec = G_MAXUINT;
- cpad->video_codec_data = NULL;
-
- cpad->sent_codec_data = FALSE;
-
- cpad->last_timestamp = 0;
-
- /* FIXME: hacked way to override/extend the event function of
- * GstCollectPads; because it sets its own event function giving the
- * element no access to events.
- */
- mux->collect_event = (GstPadEventFunction) GST_PAD_EVENTFUNC (pad);
- gst_pad_set_event_function (pad,
- GST_DEBUG_FUNCPTR (gst_flv_mux_handle_sink_event));
-
- gst_pad_set_setcaps_function (pad, setcapsfunc);
- gst_pad_set_active (pad, TRUE);
- gst_element_add_pad (element, pad);
-
- return pad;
-}
-
-static void
-gst_flv_mux_release_pad (GstElement * element, GstPad * pad)
-{
- GstFlvMux *mux = GST_FLV_MUX (GST_PAD_PARENT (pad));
- GstFlvPad *cpad = (GstFlvPad *) gst_pad_get_element_private (pad);
-
- if (cpad && cpad->audio_codec_data)
- gst_buffer_unref (cpad->audio_codec_data);
- if (cpad && cpad->video_codec_data)
- gst_buffer_unref (cpad->video_codec_data);
-
- gst_collect_pads_remove_pad (mux->collect, pad);
- gst_element_remove_pad (element, pad);
-}
-
-static GstFlowReturn
-gst_flv_mux_write_metadata (GstFlvMux * mux)
-{
- GstTagList *merged_tags;
- const GstTagList *user_tags;
- GstFlowReturn ret = GST_FLOW_OK;
- GstBuffer *script_tag, *tmp;
- guint8 *data;
- gint i, n_tags, tags_written = 0;
-
- user_tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (mux));
- GST_DEBUG_OBJECT (mux, "upstream tags = %" GST_PTR_FORMAT, mux->tags);
- GST_DEBUG_OBJECT (mux, "user-set tags = %" GST_PTR_FORMAT, user_tags);
-
- merged_tags = gst_tag_list_merge (user_tags, mux->tags,
- gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (mux)));
-
- GST_DEBUG_OBJECT (mux, "merged tags = %" GST_PTR_FORMAT, merged_tags);
-
- script_tag = gst_buffer_new_and_alloc (11);
- data = GST_BUFFER_DATA (script_tag);
-
- data[0] = 18;
-
- /* Data size, unknown for now */
- data[1] = 0;
- data[2] = 0;
- data[3] = 0;
-
- /* Timestamp */
- data[4] = data[5] = data[6] = data[7] = 0;
-
- /* Stream ID */
- data[8] = data[9] = data[10] = 0;
-
- tmp = gst_buffer_new_and_alloc (13);
- data = GST_BUFFER_DATA (tmp);
- data[0] = 2; /* string */
- data[1] = 0;
- data[2] = 0x0a; /* length 10 */
- memcpy (&data[3], "onMetaData", sizeof ("onMetaData"));
-
- script_tag = gst_buffer_join (script_tag, tmp);
-
- n_tags =
- (merged_tags) ? gst_structure_n_fields ((GstStructure *) merged_tags) : 0;
- tmp = gst_buffer_new_and_alloc (5);
- data = GST_BUFFER_DATA (tmp);
- data[0] = 8; /* ECMA array */
- GST_WRITE_UINT32_BE (data + 1, n_tags);
- script_tag = gst_buffer_join (script_tag, tmp);
-
- for (i = 0; merged_tags && i < n_tags; i++) {
- const gchar *tag_name =
- gst_structure_nth_field_name ((const GstStructure *) merged_tags, i);
- if (!strcmp (tag_name, GST_TAG_DURATION)) {
- gdouble d;
- guint64 dur;
-
- if (!gst_tag_list_get_uint64 (merged_tags, GST_TAG_DURATION, &dur))
- continue;
-
- d = gst_guint64_to_gdouble (dur);
- d /= (gdouble) GST_SECOND;
-
- tmp = gst_buffer_new_and_alloc (2 + 8 + 1 + 8);
- data = GST_BUFFER_DATA (tmp);
- data[0] = 0; /* 8 bytes name */
- data[1] = 8;
- memcpy (&data[2], "duration", sizeof ("duration"));
- data[10] = 0; /* double */
- GST_WRITE_DOUBLE_BE (data + 11, d);
- script_tag = gst_buffer_join (script_tag, tmp);
- tags_written++;
- } else if (!strcmp (tag_name, GST_TAG_ARTIST) ||
- !strcmp (tag_name, GST_TAG_TITLE)) {
- gchar *s;
- const gchar *t;
-
- if (!strcmp (tag_name, GST_TAG_ARTIST))
- t = "creator";
- else if (!strcmp (tag_name, GST_TAG_TITLE))
- t = "title";
-
- if (!gst_tag_list_get_string (merged_tags, tag_name, &s))
- continue;
-
- tmp = gst_buffer_new_and_alloc (2 + strlen (t) + 1 + 2 + strlen (s));
- data = GST_BUFFER_DATA (tmp);
- data[0] = 0; /* tag name length */
- data[1] = strlen (t);
- memcpy (&data[2], t, strlen (t));
- data[2 + strlen (t)] = 2; /* string */
- data[3 + strlen (t)] = (strlen (s) >> 8) & 0xff;
- data[4 + strlen (t)] = (strlen (s)) & 0xff;
- memcpy (&data[5 + strlen (t)], s, strlen (s));
- script_tag = gst_buffer_join (script_tag, tmp);
-
- g_free (s);
- tags_written++;
- }
- }
-
- if (mux->have_video) {
- GstPad *video_pad = NULL;
- GSList *l = mux->collect->data;
-
- for (; l; l = l->next) {
- GstFlvPad *cpad = l->data;
- if (cpad && cpad->video) {
- video_pad = cpad->collect.pad;
- break;
- }
- }
-
- if (video_pad && GST_PAD_CAPS (video_pad)) {
- GstStructure *s = gst_caps_get_structure (GST_PAD_CAPS (video_pad), 0);
- gint par_x, par_y;
-
- if (gst_structure_get_fraction (s, "pixel-aspect-ratio", &par_x, &par_y)) {
- gdouble d;
-
- d = par_x;
- tmp = gst_buffer_new_and_alloc (2 + 12 + 1 + 8);
- data = GST_BUFFER_DATA (tmp);
- data[0] = 0; /* 12 bytes name */
- data[1] = 12;
- memcpy (&data[2], "AspectRatioX", sizeof ("AspectRatioX"));
- data[14] = 0; /* double */
- GST_WRITE_DOUBLE_BE (data + 15, d);
- script_tag = gst_buffer_join (script_tag, tmp);
- tags_written++;
-
- d = par_y;
- tmp = gst_buffer_new_and_alloc (2 + 12 + 1 + 8);
- data = GST_BUFFER_DATA (tmp);
- data[0] = 0; /* 12 bytes name */
- data[1] = 12;
- memcpy (&data[2], "AspectRatioY", sizeof ("AspectRatioY"));
- data[14] = 0; /* double */
- GST_WRITE_DOUBLE_BE (data + 15, d);
- script_tag = gst_buffer_join (script_tag, tmp);
- tags_written++;
- }
- }
- }
-
- {
- const gchar *s = "GStreamer FLV muxer";
-
- tmp = gst_buffer_new_and_alloc (2 + 15 + 1 + 2 + strlen (s));
- data = GST_BUFFER_DATA (tmp);
- data[0] = 0; /* 15 bytes name */
- data[1] = 15;
- memcpy (&data[2], "metadatacreator", sizeof ("metadatacreator"));
- data[17] = 2; /* string */
- data[18] = (strlen (s) >> 8) & 0xff;
- data[19] = (strlen (s)) & 0xff;
- memcpy (&data[20], s, strlen (s));
- script_tag = gst_buffer_join (script_tag, tmp);
-
- tags_written++;
- }
-
- {
- GTimeVal tv = { 0, };
- time_t secs;
- struct tm *tm;
- gchar *s;
- static const gchar *weekdays[] = {
- "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
- };
- static const gchar *months[] = {
- "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
- "Aug", "Sep", "Oct", "Nov", "Dec"
- };
-
- g_get_current_time (&tv);
- secs = tv.tv_sec;
- tm = gmtime (&secs);
-
- s = g_strdup_printf ("%s %s %d %d:%d:%d %d", weekdays[tm->tm_wday],
- months[tm->tm_mon], tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec,
- tm->tm_year + 1900);
-
- tmp = gst_buffer_new_and_alloc (2 + 12 + 1 + 2 + strlen (s));
- data = GST_BUFFER_DATA (tmp);
- data[0] = 0; /* 12 bytes name */
- data[1] = 12;
- memcpy (&data[2], "creationdate", sizeof ("creationdate"));
- data[14] = 2; /* string */
- data[15] = (strlen (s) >> 8) & 0xff;
- data[16] = (strlen (s)) & 0xff;
- memcpy (&data[17], s, strlen (s));
- script_tag = gst_buffer_join (script_tag, tmp);
-
- g_free (s);
- tags_written++;
- }
-
- tmp = gst_buffer_new_and_alloc (2 + 0 + 1);
- data = GST_BUFFER_DATA (tmp);
- data[0] = 0; /* 0 byte size */
- data[1] = 0;
- data[2] = 9; /* end marker */
- script_tag = gst_buffer_join (script_tag, tmp);
- tags_written++;
-
-
- tmp = gst_buffer_new_and_alloc (4);
- data = GST_BUFFER_DATA (tmp);
- GST_WRITE_UINT32_BE (data, GST_BUFFER_SIZE (script_tag));
- script_tag = gst_buffer_join (script_tag, tmp);
-
- data = GST_BUFFER_DATA (script_tag);
- data[1] = ((GST_BUFFER_SIZE (script_tag) - 11 - 4) >> 16) & 0xff;
- data[2] = ((GST_BUFFER_SIZE (script_tag) - 11 - 4) >> 8) & 0xff;
- data[3] = ((GST_BUFFER_SIZE (script_tag) - 11 - 4) >> 0) & 0xff;
-
- GST_WRITE_UINT32_BE (data + 11 + 13 + 1, tags_written);
-
- gst_buffer_set_caps (script_tag, GST_PAD_CAPS (mux->srcpad));
- ret = gst_pad_push (mux->srcpad, script_tag);
-
- if (merged_tags)
- gst_tag_list_free (merged_tags);
-
- return ret;
-}
-
-static GstFlowReturn
-gst_flv_mux_write_header (GstFlvMux * mux)
-{
- GstBuffer *header = gst_buffer_new_and_alloc (9 + 4);
- guint8 *data = GST_BUFFER_DATA (header);
- GstFlowReturn ret;
-
- if (GST_PAD_CAPS (mux->srcpad) == NULL) {
- GstCaps *caps = gst_caps_new_simple ("video/x-flv", NULL);
-
- gst_pad_set_caps (mux->srcpad, caps);
- gst_caps_unref (caps);
- }
- gst_buffer_set_caps (header, GST_PAD_CAPS (mux->srcpad));
-
- data[0] = 'F';
- data[1] = 'L';
- data[2] = 'V';
- data[3] = 0x01; /* Version */
-
- data[4] = (mux->have_audio << 2) | mux->have_video; /* flags */
- GST_WRITE_UINT32_BE (data + 5, 9); /* data offset */
-
- GST_WRITE_UINT32_BE (data + 9, 0); /* previous tag size */
-
- ret = gst_pad_push (mux->srcpad, header);
- if (ret != GST_FLOW_OK)
- return ret;
-
- return gst_flv_mux_write_metadata (mux);
-}
-
-static GstFlowReturn
-gst_flv_mux_write_buffer (GstFlvMux * mux, GstFlvPad * cpad)
-{
- GstBuffer *tag;
- guint8 *data;
- guint size;
- GstBuffer *buffer =
- gst_collect_pads_pop (mux->collect, (GstCollectData *) cpad);
- guint32 timestamp =
- (GST_BUFFER_TIMESTAMP_IS_VALID (buffer)) ? GST_BUFFER_TIMESTAMP (buffer) /
- GST_MSECOND : cpad->last_timestamp / GST_MSECOND;
- gboolean second_run = FALSE;
- GstFlowReturn ret;
-
-next:
- size = 11;
- if (cpad->video) {
- size += 1;
- if (cpad->video_codec == 7 && !cpad->sent_codec_data)
- size += 4 + GST_BUFFER_SIZE (cpad->video_codec_data);
- else if (cpad->video_codec == 7)
- size += 4 + GST_BUFFER_SIZE (buffer);
- else
- size += GST_BUFFER_SIZE (buffer);
- } else {
- size += 1;
- if (cpad->audio_codec == 10 && !cpad->sent_codec_data)
- size += 1 + GST_BUFFER_SIZE (cpad->audio_codec_data);
- else if (cpad->audio_codec == 10)
- size += 1 + GST_BUFFER_SIZE (buffer);
- else
- size += GST_BUFFER_SIZE (buffer);
- }
- size += 4;
-
- tag = gst_buffer_new_and_alloc (size);
- data = GST_BUFFER_DATA (tag);
- memset (data, 0, size);
-
- data[0] = (cpad->video) ? 9 : 8;
-
- data[1] = ((size - 11 - 4) >> 16) & 0xff;
- data[2] = ((size - 11 - 4) >> 8) & 0xff;
- data[3] = ((size - 11 - 4) >> 0) & 0xff;
-
- data[4] = (timestamp >> 16) & 0xff;
- data[5] = (timestamp >> 8) & 0xff;
- data[6] = (timestamp >> 0) & 0xff;
- data[7] = (timestamp >> 24) & 0xff;
-
- data[8] = data[9] = data[10] = 0;
-
- if (cpad->video) {
- if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT))
- data[11] |= 2 << 4;
- else
- data[11] |= 1 << 4;
-
- data[11] |= cpad->video_codec & 0x0f;
-
- if (cpad->video_codec == 7 && !cpad->sent_codec_data) {
- data[12] = 0;
- data[13] = data[14] = data[15] = 0;
-
- memcpy (data + 11 + 1 + 4, GST_BUFFER_DATA (cpad->video_codec_data),
- GST_BUFFER_SIZE (cpad->video_codec_data));
- second_run = TRUE;
- } else if (cpad->video_codec == 7) {
- data[12] = 1;
-
- /* FIXME: what to do about composition time */
- data[13] = data[14] = data[15] = 0;
-
- memcpy (data + 11 + 1 + 4, GST_BUFFER_DATA (buffer),
- GST_BUFFER_SIZE (buffer));
- } else {
- memcpy (data + 11 + 1, GST_BUFFER_DATA (buffer),
- GST_BUFFER_SIZE (buffer));
- }
- } else {
- data[11] |= (cpad->audio_codec << 4) & 0xf0;
- data[11] |= (cpad->rate << 2) & 0x0c;
- data[11] |= (cpad->width << 1) & 0x02;
- data[11] |= (cpad->channels << 0) & 0x01;
-
- if (cpad->audio_codec == 10 && !cpad->sent_codec_data) {
- data[12] = 0;
-
- memcpy (data + 11 + 1 + 1, GST_BUFFER_DATA (cpad->audio_codec_data),
- GST_BUFFER_SIZE (cpad->audio_codec_data));
- second_run = TRUE;
- } else if (cpad->audio_codec == 10) {
- data[12] = 1;
-
- memcpy (data + 11 + 1 + 1, GST_BUFFER_DATA (buffer),
- GST_BUFFER_SIZE (buffer));
- } else {
- memcpy (data + 11 + 1, GST_BUFFER_DATA (buffer),
- GST_BUFFER_SIZE (buffer));
- }
- }
-
- GST_WRITE_UINT32_BE (data + size - 4, size - 4);
-
- gst_buffer_set_caps (tag, GST_PAD_CAPS (mux->srcpad));
-
- if (second_run) {
- second_run = FALSE;
- cpad->sent_codec_data = TRUE;
-
- ret = gst_pad_push (mux->srcpad, tag);
- if (ret != GST_FLOW_OK) {
- gst_buffer_unref (buffer);
- return ret;
- }
-
- cpad->last_timestamp = timestamp;
-
- tag = NULL;
- goto next;
- }
-
- gst_buffer_copy_metadata (tag, buffer, GST_BUFFER_COPY_TIMESTAMPS);
- GST_BUFFER_OFFSET (tag) = GST_BUFFER_OFFSET_END (tag) =
- GST_BUFFER_OFFSET_NONE;
-
- gst_buffer_unref (buffer);
-
- ret = gst_pad_push (mux->srcpad, tag);
-
- if (ret == GST_FLOW_OK)
- cpad->last_timestamp = timestamp;
-
- return ret;
-}
-
-static GstFlowReturn
-gst_flv_mux_collected (GstCollectPads * pads, gpointer user_data)
-{
- GstFlvMux *mux = GST_FLV_MUX (user_data);
- GstFlvPad *best;
- GstClockTime best_time;
- GstFlowReturn ret;
- GSList *sl;
- gboolean eos = TRUE;
-
- if (mux->state == GST_FLV_MUX_STATE_HEADER) {
- if (mux->collect->data == NULL) {
- GST_ELEMENT_ERROR (mux, STREAM, MUX, (NULL),
- ("No input streams configured"));
- return GST_FLOW_ERROR;
- }
-
- if (gst_pad_push_event (mux->srcpad,
- gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, 0, -1, 0)))
- ret = gst_flv_mux_write_header (mux);
- else
- ret = GST_FLOW_ERROR;
-
- if (ret != GST_FLOW_OK)
- return ret;
- mux->state = GST_FLV_MUX_STATE_DATA;
- }
-
- best = NULL;
- best_time = GST_CLOCK_TIME_NONE;
- for (sl = mux->collect->data; sl; sl = sl->next) {
- GstFlvPad *cpad = sl->data;
- GstBuffer *buffer = gst_collect_pads_peek (pads, (GstCollectData *) cpad);
- GstClockTime time;
-
- if (!buffer)
- continue;
-
- eos = FALSE;
-
- time = GST_BUFFER_TIMESTAMP (buffer);
- gst_buffer_unref (buffer);
-
- /* Use buffers without valid timestamp first */
- if (!GST_CLOCK_TIME_IS_VALID (time)) {
- GST_WARNING_OBJECT (pads, "Buffer without valid timestamp");
-
- best_time = cpad->last_timestamp;
- best = cpad;
- break;
- }
-
-
- if (best == NULL || (GST_CLOCK_TIME_IS_VALID (best_time)
- && time < best_time)) {
- best = cpad;
- best_time = time;
- }
- }
-
- if (GST_CLOCK_TIME_IS_VALID (best_time)
- && best_time / GST_MSECOND > G_MAXUINT32) {
- GST_WARNING_OBJECT (mux, "Timestamp larger than FLV supports - EOS");
- eos = TRUE;
- }
-
- if (!eos && best) {
- return gst_flv_mux_write_buffer (mux, best);
- } else if (eos) {
- gst_pad_push_event (mux->srcpad, gst_event_new_eos ());
- return GST_FLOW_UNEXPECTED;
- } else {
- return GST_FLOW_OK;
- }
-}
-
-static GstStateChangeReturn
-gst_flv_mux_change_state (GstElement * element, GstStateChange transition)
-{
- GstStateChangeReturn ret;
- GstFlvMux *mux = GST_FLV_MUX (element);
-
- switch (transition) {
- case GST_STATE_CHANGE_NULL_TO_READY:
- break;
- case GST_STATE_CHANGE_READY_TO_PAUSED:
- gst_collect_pads_start (mux->collect);
- break;
- case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
- break;
- case GST_STATE_CHANGE_PAUSED_TO_READY:
- gst_collect_pads_stop (mux->collect);
- break;
- default:
- break;
- }
-
- ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
-
- switch (transition) {
- case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
- break;
- case GST_STATE_CHANGE_PAUSED_TO_READY:
- gst_flv_mux_reset (GST_ELEMENT (mux));
- break;
- case GST_STATE_CHANGE_READY_TO_NULL:
- break;
- default:
- break;
- }
-
- return ret;
-}
diff --git a/gst/flv/gstflvmux.h b/gst/flv/gstflvmux.h
deleted file mode 100644
index 02df089d..00000000
--- a/gst/flv/gstflvmux.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/* GStreamer
- *
- * Copyright (c) 2008 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_FLV_MUX_H__
-#define __GST_FLV_MUX_H__
-
-#include <gst/gst.h>
-#include <gst/base/gstcollectpads.h>
-
-G_BEGIN_DECLS
-
-#define GST_TYPE_FLV_MUX \
- (gst_flv_mux_get_type ())
-#define GST_FLV_MUX(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_FLV_MUX, GstFlvMux))
-#define GST_FLV_MUX_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_FLV_MUX, GstFlvMuxClass))
-#define GST_IS_FLV_MUX(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_FLV_MUX))
-#define GST_IS_FLV_MUX_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_FLV_MUX))
-
-typedef struct
-{
- GstCollectData collect;
-
- gboolean video;
-
- guint audio_codec;
- guint rate;
- guint width;
- guint channels;
- GstBuffer *audio_codec_data;
-
- guint video_codec;
- GstBuffer *video_codec_data;
-
- gboolean sent_codec_data;
- GstClockTime last_timestamp;
-} GstFlvPad;
-
-typedef enum
-{
- GST_FLV_MUX_STATE_HEADER,
- GST_FLV_MUX_STATE_DATA
-} GstFlvMuxState;
-
-typedef struct _GstFlvMux {
- GstElement element;
-
- GstPad *srcpad;
- GstCollectPads *collect;
-
- /* <private> */
- GstPadEventFunction collect_event;
-
- GstFlvMuxState state;
- gboolean have_audio;
- gboolean have_video;
-
- GstTagList *tags;
-} GstFlvMux;
-
-typedef struct _GstFlvMuxClass {
- GstElementClass parent;
-} GstFlvMuxClass;
-
-GType gst_flv_mux_get_type (void);
-
-G_END_DECLS
-
-#endif /* __GST_FLV_MUX_H__ */
diff --git a/gst/flv/gstflvparse.c b/gst/flv/gstflvparse.c
deleted file mode 100644
index 59446512..00000000
--- a/gst/flv/gstflvparse.c
+++ /dev/null
@@ -1,1283 +0,0 @@
-/* GStreamer
- * Copyright (C) <2007> Julien Moutte <julien@moutte.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.
- */
-
-#include "gstflvparse.h"
-
-#include <gst/base/gstbytereader.h>
-
-#include <string.h>
-
-GST_DEBUG_CATEGORY_EXTERN (flvdemux_debug);
-#define GST_CAT_DEFAULT flvdemux_debug
-
-static gchar *
-FLV_GET_STRING (GstByteReader * reader)
-{
- guint16 string_size = 0;
- gchar *string = NULL;
- const guint8 *str;
-
- g_return_val_if_fail (reader != NULL, NULL);
-
- if (G_UNLIKELY (!gst_byte_reader_get_uint16_be (reader, &string_size)))
- return NULL;
-
- if (G_UNLIKELY (string_size > gst_byte_reader_get_remaining (reader)))
- return NULL;
-
- string = g_try_malloc0 (string_size + 1);
- if (G_UNLIKELY (!string)) {
- return NULL;
- }
-
- if (G_UNLIKELY (!gst_byte_reader_get_data (reader, string_size, &str))) {
- g_free (string);
- return NULL;
- }
-
- memcpy (string, str, string_size);
- if (!g_utf8_validate (string, string_size, NULL)) {
- g_free (string);
- return NULL;
- }
-
- return string;
-}
-
-static const GstQueryType *
-gst_flv_demux_query_types (GstPad * pad)
-{
- static const GstQueryType query_types[] = {
- GST_QUERY_DURATION,
- 0
- };
-
- return query_types;
-}
-
-static void
-parse_flv_date_string (GDate * date, const gchar * s)
-{
- g_date_set_parse (date, s);
- if (g_date_valid (date))
- return;
-
- /* "Fri Oct 15 15:13:16 2004" needs to be parsed */
- {
- static const gchar *months[] = {
- "Jan", "Feb", "Mar", "Apr",
- "May", "Jun", "Jul", "Aug",
- "Sep", "Oct", "Nov", "Dec"
- };
- gchar **tokens = g_strsplit (s, " ", -1);
- guint64 d;
- gchar *endptr;
- gint i;
-
- if (g_strv_length (tokens) != 5)
- goto out;
-
- if (strlen (tokens[1]) != 3)
- goto out;
- for (i = 0; i < 12; i++) {
- if (!strcmp (tokens[1], months[i])) {
- break;
- }
- }
- if (i == 12)
- goto out;
- g_date_set_month (date, i + 1);
-
- d = g_ascii_strtoull (tokens[2], &endptr, 10);
- if (d == 0 && *endptr != '\0')
- goto out;
-
- g_date_set_day (date, d);
-
- d = g_ascii_strtoull (tokens[4], &endptr, 10);
- if (d == 0 && *endptr != '\0')
- goto out;
-
- g_date_set_year (date, d);
-
- out:
- if (tokens)
- g_strfreev (tokens);
- }
-}
-
-static gboolean
-gst_flv_parse_metadata_item (GstFLVDemux * demux, GstByteReader * reader,
- gboolean * end_marker)
-{
- gchar *tag_name = NULL;
- guint8 tag_type = 0;
-
- /* Initialize the end_marker flag to FALSE */
- *end_marker = FALSE;
-
- /* Name of the tag */
- tag_name = FLV_GET_STRING (reader);
- if (G_UNLIKELY (!tag_name)) {
- GST_WARNING_OBJECT (demux, "failed reading tag name");
- return FALSE;
- }
-
- /* What kind of object is that */
- if (!gst_byte_reader_get_uint8 (reader, &tag_type))
- goto error;
-
- GST_DEBUG_OBJECT (demux, "tag name %s, tag type %d", tag_name, tag_type);
-
- switch (tag_type) {
- case 0: // Double
- { /* Use a union to read the uint64 and then as a double */
- gdouble d;
-
- if (!gst_byte_reader_get_float64_be (reader, &d))
- goto error;
-
- GST_DEBUG_OBJECT (demux, "%s => (double) %f", tag_name, d);
-
- if (!strcmp (tag_name, "duration")) {
- demux->duration = d * GST_SECOND;
-
- gst_tag_list_add (demux->taglist, GST_TAG_MERGE_REPLACE,
- GST_TAG_DURATION, demux->duration, NULL);
- } else if (!strcmp (tag_name, "AspectRatioX")) {
- demux->par_x = d;
- demux->got_par = TRUE;
- } else if (!strcmp (tag_name, "AspectRatioY")) {
- demux->par_y = d;
- demux->got_par = TRUE;
- } else {
- GST_INFO_OBJECT (demux, "Tag \'%s\' not handled", tag_name);
- }
-
- break;
- }
- case 1: // Boolean
- {
- guint8 b;
-
- if (!gst_byte_reader_get_uint8 (reader, &b))
- goto error;
-
- GST_DEBUG_OBJECT (demux, "%s => (boolean) %d", tag_name, b);
-
- GST_INFO_OBJECT (demux, "Tag \'%s\' not handled", tag_name);
-
- break;
- }
- case 2: // String
- {
- gchar *s = NULL;
-
- s = FLV_GET_STRING (reader);
- if (s == NULL)
- goto error;
-
- GST_DEBUG_OBJECT (demux, "%s => (string) %s", tag_name, s);
-
- if (!strcmp (tag_name, "creationdate")) {
- GDate *date = g_date_new ();
-
- parse_flv_date_string (date, s);
- if (!g_date_valid (date)) {
- GST_DEBUG_OBJECT (demux, "Failed to parse string as date");
- } else {
- gst_tag_list_add (demux->taglist, GST_TAG_MERGE_REPLACE,
- GST_TAG_DATE, date, NULL);
- }
- g_date_free (date);
- } else if (!strcmp (tag_name, "creator")) {
- gst_tag_list_add (demux->taglist, GST_TAG_MERGE_REPLACE,
- GST_TAG_ARTIST, s, NULL);
- } else if (!strcmp (tag_name, "title")) {
- gst_tag_list_add (demux->taglist, GST_TAG_MERGE_REPLACE,
- GST_TAG_TITLE, s, NULL);
- } else if (!strcmp (tag_name, "metadatacreator")) {
- gst_tag_list_add (demux->taglist, GST_TAG_MERGE_REPLACE,
- GST_TAG_ENCODER, s, NULL);
- } else {
- GST_INFO_OBJECT (demux, "Tag \'%s\' not handled", tag_name);
- }
-
- g_free (s);
-
- break;
- }
- case 3: // Object
- {
- gboolean end_of_object_marker = FALSE;
-
- while (!end_of_object_marker) {
- gboolean ok =
- gst_flv_parse_metadata_item (demux, reader, &end_of_object_marker);
-
- if (G_UNLIKELY (!ok)) {
- GST_WARNING_OBJECT (demux, "failed reading a tag, skipping");
- goto error;
- }
- }
-
- break;
- }
- case 8: // ECMA array
- {
- guint32 nb_elems;
- gboolean end_of_object_marker = FALSE;
-
- if (!gst_byte_reader_get_uint32_be (reader, &nb_elems))
- goto error;
-
- GST_DEBUG_OBJECT (demux, "there are approx. %d elements in the array",
- nb_elems);
-
- while (!end_of_object_marker) {
- gboolean ok =
- gst_flv_parse_metadata_item (demux, reader, &end_of_object_marker);
-
- if (G_UNLIKELY (!ok)) {
- GST_WARNING_OBJECT (demux, "failed reading a tag, skipping");
- goto error;
- }
- }
-
- break;
- }
- case 9: // End marker
- {
- GST_DEBUG_OBJECT (demux, "end marker ?");
- if (tag_name[0] == '\0') {
-
- GST_DEBUG_OBJECT (demux, "end marker detected");
-
- *end_marker = TRUE;
- }
-
- break;
- }
- case 10: // Array
- {
- guint32 nb_elems;
-
- if (!gst_byte_reader_get_uint32_be (reader, &nb_elems))
- goto error;
-
- GST_DEBUG_OBJECT (demux, "array has %d elements", nb_elems);
-
- if (!strcmp (tag_name, "times")) {
- if (demux->times) {
- g_array_free (demux->times, TRUE);
- }
- demux->times = g_array_new (FALSE, TRUE, sizeof (gdouble));
- } else if (!strcmp (tag_name, "filepositions")) {
- if (demux->filepositions) {
- g_array_free (demux->filepositions, TRUE);
- }
- demux->filepositions = g_array_new (FALSE, TRUE, sizeof (gdouble));
- }
-
- while (nb_elems--) {
- guint8 elem_type;
-
- if (!gst_byte_reader_get_uint8 (reader, &elem_type))
- goto error;
-
- switch (elem_type) {
- case 0:
- {
- gdouble d;
-
- if (!gst_byte_reader_get_float64_be (reader, &d))
- goto error;
-
- GST_DEBUG_OBJECT (demux, "element is a double %f", d);
-
- if (!strcmp (tag_name, "times") && demux->times) {
- g_array_append_val (demux->times, d);
- } else if (!strcmp (tag_name, "filepositions") &&
- demux->filepositions) {
- g_array_append_val (demux->filepositions, d);
- }
- break;
- }
- default:
- GST_WARNING_OBJECT (demux, "unsupported array element type %d",
- elem_type);
- }
- }
-
- break;
- }
- case 11: // Date
- {
- gdouble d;
- gint16 i;
-
- if (!gst_byte_reader_get_float64_be (reader, &d))
- goto error;
-
- if (!gst_byte_reader_get_int16_be (reader, &i))
- goto error;
-
- GST_DEBUG_OBJECT (demux,
- "%s => (date as a double) %f, timezone offset %d", tag_name, d, i);
-
- GST_INFO_OBJECT (demux, "Tag \'%s\' not handled", tag_name);
-
- break;
- }
- default:
- GST_WARNING_OBJECT (demux, "unsupported tag type %d", tag_type);
- }
-
- g_free (tag_name);
-
- return TRUE;
-
-error:
- g_free (tag_name);
-
- return FALSE;
-}
-
-GstFlowReturn
-gst_flv_parse_tag_script (GstFLVDemux * demux, GstBuffer * buffer)
-{
- GstFlowReturn ret = GST_FLOW_OK;
- GstByteReader reader = GST_BYTE_READER_INIT_FROM_BUFFER (buffer);
- guint8 type;
-
- g_return_val_if_fail (GST_BUFFER_SIZE (buffer) >= 7, GST_FLOW_ERROR);
-
- gst_byte_reader_skip (&reader, 7);
-
- GST_LOG_OBJECT (demux, "parsing a script tag");
-
- if (!gst_byte_reader_get_uint8 (&reader, &type))
- return GST_FLOW_OK;
-
- /* Must be string */
- if (type == 2) {
- gchar *function_name;
- guint i;
-
- function_name = FLV_GET_STRING (&reader);
-
- GST_LOG_OBJECT (demux, "function name is %s", GST_STR_NULL (function_name));
-
- if (function_name != NULL && strcmp (function_name, "onMetaData") == 0) {
- guint32 nb_elems = 0;
- gboolean end_marker = FALSE;
-
- GST_DEBUG_OBJECT (demux, "we have a metadata script object");
-
- /* Next type must be a ECMA array */
- if (!gst_byte_reader_get_uint8 (&reader, &type) || type != 8) {
- g_free (function_name);
- return GST_FLOW_OK;
- }
-
- if (!gst_byte_reader_get_uint32_be (&reader, &nb_elems)) {
- g_free (function_name);
- return GST_FLOW_OK;
- }
-
- GST_DEBUG_OBJECT (demux, "there are approx. %d elements in the array",
- nb_elems);
-
- while (nb_elems-- && !end_marker) {
- gboolean ok = gst_flv_parse_metadata_item (demux, &reader, &end_marker);
-
- if (G_UNLIKELY (!ok)) {
- GST_WARNING_OBJECT (demux, "failed reading a tag, skipping");
- break;
- }
- }
-
- demux->push_tags = TRUE;
- }
-
- g_free (function_name);
-
- if (demux->index && demux->times && demux->filepositions
- && !demux->random_access) {
- /* If an index was found and we're in push mode, insert associations */
- for (i = 0; i < MIN (demux->times->len, demux->filepositions->len); i++) {
- guint64 time, fileposition;
-
- time = g_array_index (demux->times, gdouble, i) * GST_SECOND;
- fileposition = g_array_index (demux->filepositions, gdouble, i);
- GST_LOG_OBJECT (demux, "adding association %" GST_TIME_FORMAT "-> %"
- G_GUINT64_FORMAT, GST_TIME_ARGS (time), fileposition);
- gst_index_add_association (demux->index, demux->index_id,
- GST_ASSOCIATION_FLAG_KEY_UNIT, GST_FORMAT_TIME, time,
- GST_FORMAT_BYTES, fileposition, NULL);
- }
- }
- }
-
- return ret;
-}
-
-static gboolean
-gst_flv_parse_audio_negotiate (GstFLVDemux * demux, guint32 codec_tag,
- guint32 rate, guint32 channels, guint32 width)
-{
- GstCaps *caps = NULL;
- gchar *codec_name = NULL;
- gboolean ret = FALSE;
-
- switch (codec_tag) {
- case 1:
- caps = gst_caps_new_simple ("audio/x-adpcm", "layout", G_TYPE_STRING,
- "swf", NULL);
- codec_name = "Shockwave ADPCM";
- break;
- case 2:
- case 14:
- caps = gst_caps_new_simple ("audio/mpeg",
- "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3,
- "parsed", G_TYPE_BOOLEAN, TRUE, NULL);
- codec_name = "MPEG 1 Audio, Layer 3 (MP3)";
- break;
- case 0:
- case 3:
- /* Assuming little endian for 0 (aka endianness of the
- * system on which the file was created) as most people
- * are probably using little endian machines */
- caps = gst_caps_new_simple ("audio/x-raw-int",
- "endianness", G_TYPE_INT, G_LITTLE_ENDIAN,
- "signed", G_TYPE_BOOLEAN, (width == 8) ? FALSE : TRUE,
- "width", G_TYPE_INT, width, "depth", G_TYPE_INT, width, NULL);
- codec_name = "Raw Audio";
- break;
- case 4:
- case 5:
- case 6:
- caps = gst_caps_new_simple ("audio/x-nellymoser", NULL);
- codec_name = "Nellymoser ASAO";
- break;
- case 10:
- caps = gst_caps_new_simple ("audio/mpeg",
- "mpegversion", G_TYPE_INT, 4, "framed", G_TYPE_BOOLEAN, TRUE, NULL);
- codec_name = "AAC";
- break;
- case 7:
- caps = gst_caps_new_simple ("audio/x-alaw", NULL);
- codec_name = "A-Law";
- break;
- case 8:
- caps = gst_caps_new_simple ("audio/x-mulaw", NULL);
- codec_name = "Mu-Law";
- break;
- case 11:
- caps = gst_caps_new_simple ("audio/x-speex", NULL);
- codec_name = "Speex";
- break;
- default:
- GST_WARNING_OBJECT (demux, "unsupported audio codec tag %u", codec_tag);
- }
-
- if (G_UNLIKELY (!caps)) {
- GST_WARNING_OBJECT (demux, "failed creating caps for audio pad");
- goto beach;
- }
-
- gst_caps_set_simple (caps,
- "rate", G_TYPE_INT, rate, "channels", G_TYPE_INT, channels, NULL);
-
- if (demux->audio_codec_data) {
- gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER,
- demux->audio_codec_data, NULL);
- }
-
- ret = gst_pad_set_caps (demux->audio_pad, caps);
-
- if (G_LIKELY (ret)) {
- /* Store the caps we have set */
- demux->audio_codec_tag = codec_tag;
- demux->rate = rate;
- demux->channels = channels;
- demux->width = width;
-
- if (codec_name) {
- if (demux->taglist == NULL)
- demux->taglist = gst_tag_list_new ();
- gst_tag_list_add (demux->taglist, GST_TAG_MERGE_REPLACE,
- GST_TAG_AUDIO_CODEC, codec_name, NULL);
- }
-
- GST_DEBUG_OBJECT (demux->audio_pad, "successfully negotiated caps %"
- GST_PTR_FORMAT, caps);
- } else {
- GST_WARNING_OBJECT (demux->audio_pad, "failed negotiating caps %"
- GST_PTR_FORMAT, caps);
- }
-
- gst_caps_unref (caps);
-
-beach:
- return ret;
-}
-
-GstFlowReturn
-gst_flv_parse_tag_audio (GstFLVDemux * demux, GstBuffer * buffer)
-{
- GstFlowReturn ret = GST_FLOW_OK;
- guint32 pts = 0, codec_tag = 0, rate = 5512, width = 8, channels = 1;
- guint32 codec_data = 0, pts_ext = 0;
- guint8 flags = 0;
- guint8 *data = GST_BUFFER_DATA (buffer);
- GstBuffer *outbuf;
-
- GST_LOG_OBJECT (demux, "parsing an audio tag");
-
- g_return_val_if_fail (GST_BUFFER_SIZE (buffer) == demux->tag_size,
- GST_FLOW_ERROR);
-
- GST_LOG_OBJECT (demux, "pts bytes %02X %02X %02X %02X", data[0], data[1],
- data[2], data[3]);
-
- /* Grab information about audio tag */
- pts = GST_READ_UINT24_BE (data);
- /* read the pts extension to 32 bits integer */
- pts_ext = GST_READ_UINT8 (data + 3);
- /* Combine them */
- pts |= pts_ext << 24;
-
- if (GST_BUFFER_SIZE (buffer) < 12) {
- GST_ERROR_OBJECT (demux, "Too small tag size");
- return GST_FLOW_ERROR;
- }
-
- /* Skip the stream id and go directly to the flags */
- flags = GST_READ_UINT8 (data + 7);
-
- /* Channels */
- if (flags & 0x01) {
- channels = 2;
- }
- /* Width */
- if (flags & 0x02) {
- width = 16;
- }
- /* Sampling rate */
- if ((flags & 0x0C) == 0x0C) {
- rate = 44100;
- } else if ((flags & 0x0C) == 0x08) {
- rate = 22050;
- } else if ((flags & 0x0C) == 0x04) {
- rate = 11025;
- }
- /* Codec tag */
- codec_tag = flags >> 4;
- if (codec_tag == 10) { /* AAC has an extra byte for packet type */
- codec_data = 2;
- } else {
- codec_data = 1;
- }
-
- /* codec tags with special rates */
- if (codec_tag == 5 || codec_tag == 14)
- rate = 8000;
- else if (codec_tag == 4)
- rate = 16000;
-
- GST_LOG_OBJECT (demux, "audio tag with %d channels, %dHz sampling rate, "
- "%d bits width, codec tag %u (flags %02X)", channels, rate, width,
- codec_tag, flags);
-
- /* If we don't have our audio pad created, then create it. */
- if (G_UNLIKELY (!demux->audio_pad)) {
-
- demux->audio_pad =
- gst_pad_new_from_template (gst_element_class_get_pad_template
- (GST_ELEMENT_GET_CLASS (demux), "audio"), "audio");
- if (G_UNLIKELY (!demux->audio_pad)) {
- GST_WARNING_OBJECT (demux, "failed creating audio pad");
- ret = GST_FLOW_ERROR;
- goto beach;
- }
-
- /* Negotiate caps */
- if (!gst_flv_parse_audio_negotiate (demux, codec_tag, rate, channels,
- width)) {
- gst_object_unref (demux->audio_pad);
- demux->audio_pad = NULL;
- ret = GST_FLOW_ERROR;
- goto beach;
- }
-
- GST_DEBUG_OBJECT (demux, "created audio pad with caps %" GST_PTR_FORMAT,
- GST_PAD_CAPS (demux->audio_pad));
-
- /* Set functions on the pad */
- gst_pad_set_query_type_function (demux->audio_pad,
- GST_DEBUG_FUNCPTR (gst_flv_demux_query_types));
- gst_pad_set_query_function (demux->audio_pad,
- GST_DEBUG_FUNCPTR (gst_flv_demux_query));
- gst_pad_set_event_function (demux->audio_pad,
- GST_DEBUG_FUNCPTR (gst_flv_demux_src_event));
-
- gst_pad_use_fixed_caps (demux->audio_pad);
-
- /* Make it active */
- gst_pad_set_active (demux->audio_pad, TRUE);
-
- /* We need to set caps before adding */
- gst_element_add_pad (GST_ELEMENT (demux),
- gst_object_ref (demux->audio_pad));
-
- /* We only emit no more pads when we have audio and video. Indeed we can
- * not trust the FLV header to tell us if there will be only audio or
- * only video and we would just break discovery of some files */
- if (demux->audio_pad && demux->video_pad) {
- GST_DEBUG_OBJECT (demux, "emitting no more pads");
- gst_element_no_more_pads (GST_ELEMENT (demux));
- }
- }
-
- /* Check if caps have changed */
- if (G_UNLIKELY (rate != demux->rate || channels != demux->channels ||
- codec_tag != demux->audio_codec_tag || width != demux->width)) {
- GST_DEBUG_OBJECT (demux, "audio settings have changed, changing caps");
-
- /* Negotiate caps */
- if (!gst_flv_parse_audio_negotiate (demux, codec_tag, rate, channels,
- width)) {
- ret = GST_FLOW_ERROR;
- goto beach;
- }
- }
-
- /* Push taglist if present */
- if ((demux->has_audio && !demux->audio_pad) &&
- (demux->has_video && !demux->video_pad)) {
- GST_DEBUG_OBJECT (demux, "we are still waiting for a stream to come up "
- "before we can push tags");
- } else {
- if (demux->taglist && demux->push_tags) {
- GST_DEBUG_OBJECT (demux, "pushing tags out");
- gst_element_found_tags (GST_ELEMENT (demux), demux->taglist);
- demux->taglist = gst_tag_list_new ();
- demux->push_tags = FALSE;
- }
- }
-
- /* Check if we have anything to push */
- if (demux->tag_data_size <= codec_data) {
- GST_LOG_OBJECT (demux, "Nothing left in this tag, returning");
- goto beach;
- }
-
- /* Create buffer from pad */
- outbuf =
- gst_buffer_create_sub (buffer, 7 + codec_data,
- demux->tag_data_size - codec_data);
-
- if (demux->audio_codec_tag == 10) {
- guint8 aac_packet_type = GST_READ_UINT8 (data + 8);
-
- switch (aac_packet_type) {
- case 0:
- {
- /* AudioSpecificConfic data */
- GST_LOG_OBJECT (demux, "got an AAC codec data packet");
- if (demux->audio_codec_data) {
- gst_buffer_unref (demux->audio_codec_data);
- }
- demux->audio_codec_data = outbuf;
- /* Use that buffer data in the caps */
- gst_flv_parse_audio_negotiate (demux, codec_tag, rate, channels, width);
- goto beach;
- break;
- }
- case 1:
- /* AAC raw packet */
- GST_LOG_OBJECT (demux, "got a raw AAC audio packet");
- break;
- default:
- GST_WARNING_OBJECT (demux, "invalid AAC packet type %u",
- aac_packet_type);
- }
- }
-
- /* Fill buffer with data */
- GST_BUFFER_TIMESTAMP (outbuf) = pts * GST_MSECOND;
- GST_BUFFER_DURATION (outbuf) = GST_CLOCK_TIME_NONE;
- GST_BUFFER_OFFSET (outbuf) = demux->audio_offset++;
- GST_BUFFER_OFFSET_END (outbuf) = demux->audio_offset;
- gst_buffer_set_caps (outbuf, GST_PAD_CAPS (demux->audio_pad));
-
- if (demux->duration == GST_CLOCK_TIME_NONE ||
- demux->duration < GST_BUFFER_TIMESTAMP (outbuf))
- demux->duration = GST_BUFFER_TIMESTAMP (outbuf);
-
- /* Only add audio frames to the index if we have no video
- * and if we don't have random access */
- if (!demux->has_video && demux->index && !demux->random_access) {
- GST_LOG_OBJECT (demux, "adding association %" GST_TIME_FORMAT "-> %"
- G_GUINT64_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)),
- demux->cur_tag_offset);
- gst_index_add_association (demux->index, demux->index_id,
- GST_ASSOCIATION_FLAG_KEY_UNIT,
- GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (outbuf),
- GST_FORMAT_BYTES, demux->cur_tag_offset, NULL);
- }
-
- if (G_UNLIKELY (demux->audio_need_discont)) {
- GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT);
- demux->audio_need_discont = FALSE;
- }
-
- gst_segment_set_last_stop (&demux->segment, GST_FORMAT_TIME,
- GST_BUFFER_TIMESTAMP (outbuf));
-
- /* Do we need a newsegment event ? */
- if (G_UNLIKELY (demux->audio_need_segment)) {
- if (demux->close_seg_event)
- gst_pad_push_event (demux->audio_pad,
- gst_event_ref (demux->close_seg_event));
-
- if (!demux->new_seg_event) {
- GST_DEBUG_OBJECT (demux, "pushing newsegment from %"
- GST_TIME_FORMAT " to %" GST_TIME_FORMAT,
- GST_TIME_ARGS (demux->segment.last_stop),
- GST_TIME_ARGS (demux->segment.stop));
- demux->new_seg_event =
- gst_event_new_new_segment (FALSE, demux->segment.rate,
- demux->segment.format, demux->segment.last_stop,
- demux->segment.stop, demux->segment.last_stop);
- } else {
- GST_DEBUG_OBJECT (demux, "pushing pre-generated newsegment event");
- }
-
- gst_pad_push_event (demux->audio_pad, gst_event_ref (demux->new_seg_event));
-
- demux->audio_need_segment = FALSE;
- }
-
- GST_LOG_OBJECT (demux, "pushing %d bytes buffer at pts %" GST_TIME_FORMAT
- " with duration %" GST_TIME_FORMAT ", offset %" G_GUINT64_FORMAT,
- GST_BUFFER_SIZE (outbuf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)),
- GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)), GST_BUFFER_OFFSET (outbuf));
-
- /* Push downstream */
- ret = gst_pad_push (demux->audio_pad, outbuf);
- if (G_UNLIKELY (ret != GST_FLOW_OK)) {
- GST_WARNING_OBJECT (demux, "failed pushing a %" G_GUINT64_FORMAT
- " bytes audio buffer: %s", demux->tag_data_size,
- gst_flow_get_name (ret));
- if (ret == GST_FLOW_NOT_LINKED) {
- demux->audio_linked = FALSE;
- }
- goto beach;
- }
-
- demux->audio_linked = TRUE;
-
-beach:
- return ret;
-}
-
-static gboolean
-gst_flv_parse_video_negotiate (GstFLVDemux * demux, guint32 codec_tag)
-{
- gboolean ret = FALSE;
- GstCaps *caps = NULL;
- gchar *codec_name = NULL;
-
- /* Generate caps for that pad */
- switch (codec_tag) {
- case 2:
- caps = gst_caps_new_simple ("video/x-flash-video", NULL);
- codec_name = "Sorenson Video";
- break;
- case 3:
- caps = gst_caps_new_simple ("video/x-flash-screen", NULL);
- codec_name = "Flash Screen Video";
- case 4:
- caps = gst_caps_new_simple ("video/x-vp6-flash", NULL);
- codec_name = "On2 VP6 Video";
- break;
- case 5:
- caps = gst_caps_new_simple ("video/x-vp6-alpha", NULL);
- codec_name = "On2 VP6 Video with alpha channel";
- break;
- case 7:
- caps = gst_caps_new_simple ("video/x-h264", NULL);
- codec_name = "H.264/AVC Video";
- break;
- default:
- GST_WARNING_OBJECT (demux, "unsupported video codec tag %u", codec_tag);
- }
-
- if (G_UNLIKELY (!caps)) {
- GST_WARNING_OBJECT (demux, "failed creating caps for video pad");
- goto beach;
- }
-
- gst_caps_set_simple (caps, "pixel-aspect-ratio", GST_TYPE_FRACTION,
- demux->par_x, demux->par_y, NULL);
-
- if (demux->video_codec_data) {
- gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER,
- demux->video_codec_data, NULL);
- }
-
- ret = gst_pad_set_caps (demux->video_pad, caps);
-
- if (G_LIKELY (ret)) {
- /* Store the caps we have set */
- demux->video_codec_tag = codec_tag;
-
- if (codec_name) {
- if (demux->taglist == NULL)
- demux->taglist = gst_tag_list_new ();
- gst_tag_list_add (demux->taglist, GST_TAG_MERGE_REPLACE,
- GST_TAG_VIDEO_CODEC, codec_name, NULL);
- }
-
- GST_DEBUG_OBJECT (demux->video_pad, "successfully negotiated caps %"
- GST_PTR_FORMAT, caps);
- } else {
- GST_WARNING_OBJECT (demux->video_pad, "failed negotiating caps %"
- GST_PTR_FORMAT, caps);
- }
-
- gst_caps_unref (caps);
-
-beach:
- return ret;
-}
-
-GstFlowReturn
-gst_flv_parse_tag_video (GstFLVDemux * demux, GstBuffer * buffer)
-{
- GstFlowReturn ret = GST_FLOW_OK;
- guint32 pts = 0, codec_data = 1, pts_ext = 0;
- gboolean keyframe = FALSE;
- guint8 flags = 0, codec_tag = 0;
- guint8 *data = GST_BUFFER_DATA (buffer);
- GstBuffer *outbuf;
-
- g_return_val_if_fail (GST_BUFFER_SIZE (buffer) == demux->tag_size,
- GST_FLOW_ERROR);
-
- GST_LOG_OBJECT (demux, "parsing a video tag");
-
- GST_LOG_OBJECT (demux, "pts bytes %02X %02X %02X %02X", data[0], data[1],
- data[2], data[3]);
-
- /* Grab information about video tag */
- pts = GST_READ_UINT24_BE (data);
- /* read the pts extension to 32 bits integer */
- pts_ext = GST_READ_UINT8 (data + 3);
- /* Combine them */
- pts |= pts_ext << 24;
-
- if (GST_BUFFER_SIZE (buffer) < 12) {
- GST_ERROR_OBJECT (demux, "Too small tag size");
- return GST_FLOW_ERROR;
- }
-
- /* Skip the stream id and go directly to the flags */
- flags = GST_READ_UINT8 (data + 7);
-
- /* Keyframe */
- if ((flags >> 4) == 1) {
- keyframe = TRUE;
- }
- /* Codec tag */
- codec_tag = flags & 0x0F;
- if (codec_tag == 4 || codec_tag == 5) {
- codec_data = 2;
- } else if (codec_tag == 7) {
- codec_data = 5;
- }
-
- GST_LOG_OBJECT (demux, "video tag with codec tag %u, keyframe (%d) "
- "(flags %02X)", codec_tag, keyframe, flags);
-
- /* If we don't have our video pad created, then create it. */
- if (G_UNLIKELY (!demux->video_pad)) {
- demux->video_pad =
- gst_pad_new_from_template (gst_element_class_get_pad_template
- (GST_ELEMENT_GET_CLASS (demux), "video"), "video");
- if (G_UNLIKELY (!demux->video_pad)) {
- GST_WARNING_OBJECT (demux, "failed creating video pad");
- ret = GST_FLOW_ERROR;
- goto beach;
- }
-
- if (!gst_flv_parse_video_negotiate (demux, codec_tag)) {
- gst_object_unref (demux->video_pad);
- demux->video_pad = NULL;
- ret = GST_FLOW_ERROR;
- goto beach;
- }
-
- /* When we ve set pixel-aspect-ratio we use that boolean to detect a
- * metadata tag that would come later and trigger a caps change */
- demux->got_par = FALSE;
-
- GST_DEBUG_OBJECT (demux, "created video pad with caps %" GST_PTR_FORMAT,
- GST_PAD_CAPS (demux->video_pad));
-
- /* Set functions on the pad */
- gst_pad_set_query_type_function (demux->video_pad,
- GST_DEBUG_FUNCPTR (gst_flv_demux_query_types));
- gst_pad_set_query_function (demux->video_pad,
- GST_DEBUG_FUNCPTR (gst_flv_demux_query));
- gst_pad_set_event_function (demux->video_pad,
- GST_DEBUG_FUNCPTR (gst_flv_demux_src_event));
-
- gst_pad_use_fixed_caps (demux->video_pad);
-
- /* Make it active */
- gst_pad_set_active (demux->video_pad, TRUE);
-
- /* We need to set caps before adding */
- gst_element_add_pad (GST_ELEMENT (demux),
- gst_object_ref (demux->video_pad));
-
- /* We only emit no more pads when we have audio and video. Indeed we can
- * not trust the FLV header to tell us if there will be only audio or
- * only video and we would just break discovery of some files */
- if (demux->audio_pad && demux->video_pad) {
- GST_DEBUG_OBJECT (demux, "emitting no more pads");
- gst_element_no_more_pads (GST_ELEMENT (demux));
- }
- }
-
- /* Check if caps have changed */
- if (G_UNLIKELY (codec_tag != demux->video_codec_tag || demux->got_par)) {
-
- GST_DEBUG_OBJECT (demux, "video settings have changed, changing caps");
-
- if (!gst_flv_parse_video_negotiate (demux, codec_tag)) {
- ret = GST_FLOW_ERROR;
- goto beach;
- }
-
- /* When we ve set pixel-aspect-ratio we use that boolean to detect a
- * metadata tag that would come later and trigger a caps change */
- demux->got_par = FALSE;
- }
-
- /* Push taglist if present */
- if ((demux->has_audio && !demux->audio_pad) &&
- (demux->has_video && !demux->video_pad)) {
- GST_DEBUG_OBJECT (demux, "we are still waiting for a stream to come up "
- "before we can push tags");
- } else {
- if (demux->taglist && demux->push_tags) {
- GST_DEBUG_OBJECT (demux, "pushing tags out");
- gst_element_found_tags (GST_ELEMENT (demux), demux->taglist);
- demux->taglist = gst_tag_list_new ();
- demux->push_tags = FALSE;
- }
- }
-
- /* Check if we have anything to push */
- if (demux->tag_data_size <= codec_data) {
- GST_LOG_OBJECT (demux, "Nothing left in this tag, returning");
- goto beach;
- }
-
- /* Create buffer from pad */
- outbuf =
- gst_buffer_create_sub (buffer, 7 + codec_data,
- demux->tag_data_size - codec_data);
-
- if (demux->video_codec_tag == 7) {
- guint8 avc_packet_type = GST_READ_UINT8 (data + 8);
-
- switch (avc_packet_type) {
- case 0:
- {
- /* AVCDecoderConfigurationRecord data */
- GST_LOG_OBJECT (demux, "got an H.264 codec data packet");
- if (demux->video_codec_data) {
- gst_buffer_unref (demux->video_codec_data);
- }
- demux->video_codec_data = outbuf;
- /* Use that buffer data in the caps */
- gst_flv_parse_video_negotiate (demux, codec_tag);
- goto beach;
- break;
- }
- case 1:
- /* H.264 NALU packet */
- GST_LOG_OBJECT (demux, "got a H.264 NALU audio packet");
- break;
- default:
- GST_WARNING_OBJECT (demux, "invalid AAC packet type %u",
- avc_packet_type);
- }
- }
-
- /* Fill buffer with data */
- GST_BUFFER_TIMESTAMP (outbuf) = pts * GST_MSECOND;
- GST_BUFFER_DURATION (outbuf) = GST_CLOCK_TIME_NONE;
- GST_BUFFER_OFFSET (outbuf) = demux->video_offset++;
- GST_BUFFER_OFFSET_END (outbuf) = demux->video_offset;
- gst_buffer_set_caps (outbuf, GST_PAD_CAPS (demux->video_pad));
-
- if (demux->duration == GST_CLOCK_TIME_NONE ||
- demux->duration < GST_BUFFER_TIMESTAMP (outbuf))
- demux->duration = GST_BUFFER_TIMESTAMP (outbuf);
-
- if (!keyframe) {
- GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT);
- if (demux->index && !demux->random_access) {
- GST_LOG_OBJECT (demux, "adding association %" GST_TIME_FORMAT "-> %"
- G_GUINT64_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)),
- demux->cur_tag_offset);
- gst_index_add_association (demux->index, demux->index_id,
- GST_ASSOCIATION_FLAG_NONE,
- GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (outbuf),
- GST_FORMAT_BYTES, demux->cur_tag_offset, NULL);
- }
- } else {
- if (demux->index && !demux->random_access) {
- GST_LOG_OBJECT (demux, "adding association %" GST_TIME_FORMAT "-> %"
- G_GUINT64_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)),
- demux->cur_tag_offset);
- gst_index_add_association (demux->index, demux->index_id,
- GST_ASSOCIATION_FLAG_KEY_UNIT,
- GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (outbuf),
- GST_FORMAT_BYTES, demux->cur_tag_offset, NULL);
- }
- }
-
- if (G_UNLIKELY (demux->video_need_discont)) {
- GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT);
- demux->video_need_discont = FALSE;
- }
-
- gst_segment_set_last_stop (&demux->segment, GST_FORMAT_TIME,
- GST_BUFFER_TIMESTAMP (outbuf));
-
- /* Do we need a newsegment event ? */
- if (G_UNLIKELY (demux->video_need_segment)) {
- if (demux->close_seg_event)
- gst_pad_push_event (demux->video_pad,
- gst_event_ref (demux->close_seg_event));
-
- if (!demux->new_seg_event) {
- GST_DEBUG_OBJECT (demux, "pushing newsegment from %"
- GST_TIME_FORMAT " to %" GST_TIME_FORMAT,
- GST_TIME_ARGS (demux->segment.last_stop),
- GST_TIME_ARGS (demux->segment.stop));
- demux->new_seg_event =
- gst_event_new_new_segment (FALSE, demux->segment.rate,
- demux->segment.format, demux->segment.last_stop,
- demux->segment.stop, demux->segment.last_stop);
- } else {
- GST_DEBUG_OBJECT (demux, "pushing pre-generated newsegment event");
- }
-
- gst_pad_push_event (demux->video_pad, gst_event_ref (demux->new_seg_event));
-
- demux->video_need_segment = FALSE;
- }
-
- GST_LOG_OBJECT (demux, "pushing %d bytes buffer at pts %" GST_TIME_FORMAT
- " with duration %" GST_TIME_FORMAT ", offset %" G_GUINT64_FORMAT
- ", keyframe (%d)", GST_BUFFER_SIZE (outbuf),
- GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)),
- GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)), GST_BUFFER_OFFSET (outbuf),
- keyframe);
-
- /* Push downstream */
- ret = gst_pad_push (demux->video_pad, outbuf);
-
- if (G_UNLIKELY (ret != GST_FLOW_OK)) {
- GST_WARNING_OBJECT (demux, "failed pushing a %" G_GUINT64_FORMAT
- " bytes video buffer: %s", demux->tag_data_size,
- gst_flow_get_name (ret));
- if (ret == GST_FLOW_NOT_LINKED) {
- demux->video_linked = FALSE;
- }
- goto beach;
- }
-
- demux->video_linked = TRUE;
-
-beach:
- return ret;
-}
-
-GstClockTime
-gst_flv_parse_tag_timestamp (GstFLVDemux * demux, GstBuffer * buffer,
- size_t * tag_size)
-{
- guint32 pts = 0, pts_ext = 0;
- guint32 tag_data_size;
- guint8 type;
- gboolean keyframe = TRUE;
- GstClockTime ret;
- guint8 *data = GST_BUFFER_DATA (buffer);
-
- g_return_val_if_fail (GST_BUFFER_SIZE (buffer) >= 12, GST_CLOCK_TIME_NONE);
-
- type = data[0];
-
- if (type != 9 && type != 8 && type != 18) {
- GST_WARNING_OBJECT (demux, "Unsupported tag type %u", data[0]);
- return GST_CLOCK_TIME_NONE;
- }
-
- if (type == 9)
- demux->has_video = TRUE;
- else if (type == 8)
- demux->has_audio = TRUE;
-
- tag_data_size = GST_READ_UINT24_BE (data + 1);
-
- if (GST_BUFFER_SIZE (buffer) >= tag_data_size + 11 + 4) {
- if (GST_READ_UINT32_BE (data + tag_data_size + 11) != tag_data_size + 11) {
- GST_WARNING_OBJECT (demux, "Invalid tag size");
- return GST_CLOCK_TIME_NONE;
- }
- }
-
- if (tag_size)
- *tag_size = tag_data_size + 11 + 4;
-
- data += 4;
-
- GST_LOG_OBJECT (demux, "pts bytes %02X %02X %02X %02X", data[0], data[1],
- data[2], data[3]);
-
- /* Grab timestamp of tag tag */
- pts = GST_READ_UINT24_BE (data);
- /* read the pts extension to 32 bits integer */
- pts_ext = GST_READ_UINT8 (data + 3);
- /* Combine them */
- pts |= pts_ext << 24;
-
- if (type == 9) {
- data += 7;
-
- keyframe = ((data[0] >> 4) == 1);
- }
-
- ret = pts * GST_MSECOND;
-
- if (demux->index && (type == 9 || (type == 8 && !demux->has_video))) {
- GST_LOG_OBJECT (demux, "adding association %" GST_TIME_FORMAT "-> %"
- G_GUINT64_FORMAT, GST_TIME_ARGS (ret), demux->offset);
- gst_index_add_association (demux->index, demux->index_id,
- (keyframe) ? GST_ASSOCIATION_FLAG_KEY_UNIT : GST_ASSOCIATION_FLAG_NONE,
- GST_FORMAT_TIME, ret, GST_FORMAT_BYTES, demux->offset, NULL);
- }
-
- if (demux->duration == GST_CLOCK_TIME_NONE || demux->duration < ret)
- demux->duration = ret;
-
- return ret;
-}
-
-GstFlowReturn
-gst_flv_parse_tag_type (GstFLVDemux * demux, GstBuffer * buffer)
-{
- GstFlowReturn ret = GST_FLOW_OK;
- guint8 tag_type = 0;
- guint8 *data = GST_BUFFER_DATA (buffer);
-
- g_return_val_if_fail (GST_BUFFER_SIZE (buffer) >= 4, GST_FLOW_ERROR);
-
- tag_type = data[0];
-
- switch (tag_type) {
- case 9:
- demux->state = FLV_STATE_TAG_VIDEO;
- demux->has_video = TRUE;
- break;
- case 8:
- demux->state = FLV_STATE_TAG_AUDIO;
- demux->has_audio = TRUE;
- break;
- case 18:
- demux->state = FLV_STATE_TAG_SCRIPT;
- break;
- default:
- GST_WARNING_OBJECT (demux, "unsupported tag type %u", tag_type);
- }
-
- /* Tag size is 1 byte of type + 3 bytes of size + 7 bytes + tag data size +
- * 4 bytes of previous tag size */
- demux->tag_data_size = GST_READ_UINT24_BE (data + 1);
- demux->tag_size = demux->tag_data_size + 11;
-
- GST_LOG_OBJECT (demux, "tag data size is %" G_GUINT64_FORMAT,
- demux->tag_data_size);
-
- return ret;
-}
-
-GstFlowReturn
-gst_flv_parse_header (GstFLVDemux * demux, GstBuffer * buffer)
-{
- GstFlowReturn ret = GST_FLOW_OK;
- guint8 *data = GST_BUFFER_DATA (buffer);
-
- g_return_val_if_fail (GST_BUFFER_SIZE (buffer) >= 9, GST_FLOW_ERROR);
-
- /* Check for the FLV tag */
- if (data[0] == 'F' && data[1] == 'L' && data[2] == 'V') {
- GST_DEBUG_OBJECT (demux, "FLV header detected");
- } else {
- if (G_UNLIKELY (demux->strict)) {
- GST_WARNING_OBJECT (demux, "invalid header tag detected");
- ret = GST_FLOW_UNEXPECTED;
- goto beach;
- }
- }
-
- /* Jump over the 4 first bytes */
- data += 4;
-
- /* Now look at audio/video flags */
- {
- guint8 flags = data[0];
-
- demux->has_video = demux->has_audio = FALSE;
-
- if (flags & 1) {
- GST_DEBUG_OBJECT (demux, "there is a video stream");
- demux->has_video = TRUE;
- }
- if (flags & 4) {
- GST_DEBUG_OBJECT (demux, "there is an audio stream");
- demux->has_audio = TRUE;
- }
- }
-
- /* We don't care about the rest */
- demux->need_header = FALSE;
-
-beach:
- return ret;
-}
diff --git a/gst/id3tag/Makefile.am b/gst/id3tag/Makefile.am
new file mode 100644
index 00000000..9595be0f
--- /dev/null
+++ b/gst/id3tag/Makefile.am
@@ -0,0 +1,19 @@
+plugin_LTLIBRARIES = libgstid3tag.la
+
+libgstid3tag_la_SOURCES = \
+ gsttagmux.c \
+ id3tag.c \
+ gstid3tag.c
+
+libgstid3tag_la_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_CFLAGS)
+
+libgstid3tag_la_LIBADD = \
+ $(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_MAJORMINOR) \
+ $(GST_LIBS)
+
+libgstid3tag_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstid3tag_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = gstid3tag.h id3tag.h gsttagmux.h
diff --git a/gst/id3tag/gstid3tag.c b/gst/id3tag/gstid3tag.c
new file mode 100644
index 00000000..9c8072c0
--- /dev/null
+++ b/gst/id3tag/gstid3tag.c
@@ -0,0 +1,229 @@
+/* GStreamer ID3 v1 and v2 muxer
+ *
+ * Copyright (C) 2006 Christophe Fergeau <teuf@gnome.org>
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ * Copyright (C) 2009 Pioneers of the Inevitable <songbird@songbirdnest.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-id3tag
+ * @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.
+ *
+ * Applications can set the tags to write using the #GstTagSetter interface.
+ * Tags sent by upstream elements will be picked up automatically (and merged
+ * according to the merge mode set via the tag setter interface).
+ *
+ * <refsect2>
+ * <title>Example pipelines</title>
+ * |[
+ * gst-launch -v filesrc location=foo.ogg ! decodebin ! audioconvert ! lame ! id3tag ! filesink location=foo.mp3
+ * ]| A pipeline that transcodes a file from Ogg/Vorbis to mp3 format with
+ * ID3 tags that contain the same metadata as the the Ogg/Vorbis file.
+ * Make sure the Ogg/Vorbis file actually has comments to preserve.
+ * |[
+ * gst-launch -m filesrc location=foo.mp3 ! id3demux ! fakesink silent=TRUE 2&gt; /dev/null | grep taglist
+ * ]| Verify that tags have been written.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gstid3tag.h"
+#include <gst/tag/tag.h>
+
+#include <string.h>
+
+GST_DEBUG_CATEGORY (gst_id3_tag_debug);
+#define GST_CAT_DEFAULT gst_id3_tag_debug
+
+enum
+{
+ ARG_0,
+ ARG_WRITE_V1,
+ ARG_WRITE_V2,
+ ARG_V2_MAJOR_VERSION
+};
+
+#define DEFAULT_WRITE_V1 TRUE
+#define DEFAULT_WRITE_V2 TRUE
+#define DEFAULT_V2_MAJOR_VERSION 3
+
+static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("application/x-id3"));
+
+GST_BOILERPLATE (GstId3Tag, gst_id3_tag, GstTagMux, GST_TYPE_TAG_MUX);
+
+static GstBuffer *gst_id3_tag_render_v2_tag (GstTagMux * mux,
+ GstTagList * taglist);
+static GstBuffer *gst_id3_tag_render_v1_tag (GstTagMux * mux,
+ GstTagList * taglist);
+
+static void gst_id3_tag_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_id3_tag_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static void
+gst_id3_tag_base_init (gpointer g_class)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&src_template));
+
+ gst_element_class_set_details_simple (element_class,
+ "ID3 v1 and v2 Muxer", "Formatter/Metadata",
+ "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)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+
+ gobject_class->set_property = gst_id3_tag_set_property;
+ gobject_class->get_property = gst_id3_tag_get_property;
+
+ g_object_class_install_property (gobject_class, ARG_WRITE_V1,
+ g_param_spec_boolean ("write-v1", "Write id3v1 tag",
+ "Write an id3v1 tag at the end of the file", DEFAULT_WRITE_V1,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
+ g_object_class_install_property (gobject_class, ARG_WRITE_V2,
+ g_param_spec_boolean ("write-v2", "Write id3v2 tag",
+ "Write an id3v2 tag at the start of the file", DEFAULT_WRITE_V2,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
+ g_object_class_install_property (gobject_class, ARG_V2_MAJOR_VERSION,
+ g_param_spec_int ("v2-version", "Version (3 or 4) of id3v2 tag",
+ "Set version (3 for id3v2.3, 4 for id3v2.4) of id3v2 tags",
+ 3, 4, DEFAULT_V2_MAJOR_VERSION,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
+ GST_TAG_MUX_CLASS (klass)->render_start_tag =
+ GST_DEBUG_FUNCPTR (gst_id3_tag_render_v2_tag);
+
+ GST_TAG_MUX_CLASS (klass)->render_end_tag = gst_id3_tag_render_v1_tag;
+}
+
+static void
+gst_id3_tag_init (GstId3Tag * id3mux, GstId3TagClass * id3mux_class)
+{
+ id3mux->write_v1 = DEFAULT_WRITE_V1;
+ id3mux->write_v2 = DEFAULT_WRITE_V2;
+
+ id3mux->v2_major_version = DEFAULT_V2_MAJOR_VERSION;
+}
+
+static void
+gst_id3_tag_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstId3Tag *mux = GST_ID3TAG (object);
+
+ switch (prop_id) {
+ case ARG_WRITE_V1:
+ mux->write_v1 = g_value_get_boolean (value);
+ break;
+ case ARG_WRITE_V2:
+ mux->write_v2 = g_value_get_boolean (value);
+ break;
+ case ARG_V2_MAJOR_VERSION:
+ mux->v2_major_version = g_value_get_int (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_id3_tag_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstId3Tag *mux = GST_ID3TAG (object);
+
+ switch (prop_id) {
+ case ARG_WRITE_V1:
+ g_value_set_boolean (value, mux->write_v1);
+ break;
+ case ARG_WRITE_V2:
+ g_value_set_boolean (value, mux->write_v2);
+ break;
+ case ARG_V2_MAJOR_VERSION:
+ g_value_set_int (value, mux->v2_major_version);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GstBuffer *
+gst_id3_tag_render_v2_tag (GstTagMux * mux, GstTagList * taglist)
+{
+ GstId3Tag *id3mux = GST_ID3TAG (mux);
+
+ if (id3mux->write_v2)
+ return gst_id3mux_render_v2_tag (mux, taglist, id3mux->v2_major_version);
+ else
+ return NULL;
+}
+
+static GstBuffer *
+gst_id3_tag_render_v1_tag (GstTagMux * mux, GstTagList * taglist)
+{
+ GstId3Tag *id3mux = GST_ID3TAG (mux);
+
+ if (id3mux->write_v1)
+ return gst_id3mux_render_v1_tag (mux, taglist);
+ else
+ return NULL;
+}
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ if (!gst_element_register (plugin, "id3tag", GST_RANK_NONE, GST_TYPE_ID3TAG))
+ return FALSE;
+
+ gst_tag_register_musicbrainz_tags ();
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "id3tag",
+ "ID3 v1 and v2 muxing plugin",
+ plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
diff --git a/gst/id3tag/gstid3tag.h b/gst/id3tag/gstid3tag.h
new file mode 100644
index 00000000..a9a1ad1c
--- /dev/null
+++ b/gst/id3tag/gstid3tag.h
@@ -0,0 +1,63 @@
+/* GStreamer ID3 v1 and v2 muxer
+ *
+ * Copyright (C) 2006 Christophe Fergeau <teuf@gnome.org>
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ * Copyright (C) 2009 Pioneers of the Inevitable <songbird@songbirdnest.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef GST_ID3TAG_H
+#define GST_ID3TAG_H
+
+#include "gsttagmux.h"
+#include "id3tag.h"
+
+G_BEGIN_DECLS
+
+typedef struct _GstId3Tag GstId3Tag;
+typedef struct _GstId3TagClass GstId3TagClass;
+
+struct _GstId3Tag {
+ GstTagMux tagmux;
+
+ gboolean write_v1;
+ gboolean write_v2;
+
+ gint v2_major_version;
+};
+
+struct _GstId3TagClass {
+ 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))
+
+GType gst_id3_tag_get_type (void);
+
+G_END_DECLS
+
+#endif /* GST_ID3TAG_H */
+
diff --git a/gst/id3tag/gsttagmux.c b/gst/id3tag/gsttagmux.c
new file mode 100644
index 00000000..3b7ff119
--- /dev/null
+++ b/gst/id3tag/gsttagmux.c
@@ -0,0 +1,495 @@
+/* GStreamer tag muxer base class
+ *
+ * Copyright (C) 2006 Christophe Fergeau <teuf@gnome.org>
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ * Copyright (C) 2006 Sebastian Dröge <slomo@circular-chaos.org>
+ * Copyright (C) 2009 Pioneers of the Inevitable <songbird@songbirdnest.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <gst/gsttagsetter.h>
+#include <gst/tag/tag.h>
+
+#include "gsttagmux.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_tag_mux_debug);
+#define GST_CAT_DEFAULT gst_tag_mux_debug
+
+/* Subclass provides a src template and pad. We accept anything as input here,
+ however. */
+
+static GstStaticPadTemplate gst_tag_mux_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("ANY"));
+
+static void
+gst_tag_mux_iface_init (GType tag_type)
+{
+ static const GInterfaceInfo tag_setter_info = {
+ NULL,
+ NULL,
+ NULL
+ };
+
+ g_type_add_interface_static (tag_type, GST_TYPE_TAG_SETTER, &tag_setter_info);
+}
+
+/* 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;
+
+GST_BOILERPLATE_FULL (GstId3TagMux, gst_tag_mux,
+ GstElement, GST_TYPE_ELEMENT, gst_tag_mux_iface_init);
+
+
+static GstStateChangeReturn
+gst_tag_mux_change_state (GstElement * element, GstStateChange transition);
+static GstFlowReturn gst_tag_mux_chain (GstPad * pad, GstBuffer * buffer);
+static gboolean gst_tag_mux_sink_event (GstPad * pad, GstEvent * event);
+
+static void
+gst_tag_mux_finalize (GObject * obj)
+{
+ GstTagMux *mux = GST_TAG_MUX (obj);
+
+ if (mux->newsegment_ev) {
+ gst_event_unref (mux->newsegment_ev);
+ mux->newsegment_ev = NULL;
+ }
+
+ if (mux->event_tags) {
+ gst_tag_list_free (mux->event_tags);
+ mux->event_tags = NULL;
+ }
+
+ if (mux->final_tags) {
+ gst_tag_list_free (mux->final_tags);
+ mux->final_tags = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+static void
+gst_tag_mux_base_init (gpointer g_class)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_tag_mux_sink_template));
+
+ GST_DEBUG_CATEGORY_INIT (gst_tag_mux_debug, "tagmux", 0,
+ "tag muxer base class");
+}
+
+static void
+gst_tag_mux_class_init (GstTagMuxClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+
+ gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_tag_mux_finalize);
+ gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_tag_mux_change_state);
+}
+
+static void
+gst_tag_mux_init (GstTagMux * mux, GstTagMuxClass * mux_class)
+{
+ GstElementClass *element_klass = GST_ELEMENT_CLASS (mux_class);
+ GstPadTemplate *tmpl;
+
+ /* pad through which data comes in to the element */
+ mux->sinkpad =
+ gst_pad_new_from_static_template (&gst_tag_mux_sink_template, "sink");
+ gst_pad_set_chain_function (mux->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_tag_mux_chain));
+ gst_pad_set_event_function (mux->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_tag_mux_sink_event));
+ gst_element_add_pad (GST_ELEMENT (mux), mux->sinkpad);
+
+ /* pad through which data goes out of the element */
+ tmpl = gst_element_class_get_pad_template (element_klass, "src");
+ if (tmpl) {
+ mux->srcpad = gst_pad_new_from_template (tmpl, "src");
+ gst_pad_use_fixed_caps (mux->srcpad);
+ gst_pad_set_caps (mux->srcpad, gst_pad_template_get_caps (tmpl));
+ gst_element_add_pad (GST_ELEMENT (mux), mux->srcpad);
+ }
+
+ mux->render_start_tag = TRUE;
+ mux->render_end_tag = TRUE;
+}
+
+static GstTagList *
+gst_tag_mux_get_tags (GstTagMux * mux)
+{
+ GstTagSetter *tagsetter = GST_TAG_SETTER (mux);
+ const GstTagList *tagsetter_tags;
+ GstTagMergeMode merge_mode;
+
+ if (mux->final_tags)
+ return mux->final_tags;
+
+ tagsetter_tags = gst_tag_setter_get_tag_list (tagsetter);
+ merge_mode = gst_tag_setter_get_tag_merge_mode (tagsetter);
+
+ GST_LOG_OBJECT (mux, "merging tags, merge mode = %d", merge_mode);
+ GST_LOG_OBJECT (mux, "event tags: %" GST_PTR_FORMAT, mux->event_tags);
+ GST_LOG_OBJECT (mux, "set tags: %" GST_PTR_FORMAT, tagsetter_tags);
+
+ mux->final_tags =
+ gst_tag_list_merge (tagsetter_tags, mux->event_tags, merge_mode);
+
+ GST_LOG_OBJECT (mux, "final tags: %" GST_PTR_FORMAT, mux->final_tags);
+
+ return mux->final_tags;
+}
+
+static GstFlowReturn
+gst_tag_mux_render_start_tag (GstTagMux * mux)
+{
+ GstTagMuxClass *klass;
+ GstBuffer *buffer;
+ GstTagList *taglist;
+ GstEvent *event;
+ GstFlowReturn ret;
+
+ taglist = gst_tag_mux_get_tags (mux);
+
+ klass = GST_TAG_MUX_CLASS (G_OBJECT_GET_CLASS (mux));
+
+ if (klass->render_start_tag == NULL)
+ goto no_vfunc;
+
+ buffer = klass->render_start_tag (mux, taglist);
+
+ /* Null buffer is ok, just means we're not outputting anything */
+ if (buffer == NULL) {
+ GST_INFO_OBJECT (mux, "No start tag generated");
+ mux->start_tag_size = 0;
+ return GST_FLOW_OK;
+ }
+
+ mux->start_tag_size = GST_BUFFER_SIZE (buffer);
+ GST_LOG_OBJECT (mux, "tag size = %" G_GSIZE_FORMAT " bytes",
+ mux->start_tag_size);
+
+ /* Send newsegment event from byte position 0, so the tag really gets
+ * written to the start of the file, independent of the upstream segment */
+ gst_pad_push_event (mux->srcpad,
+ gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, 0, -1, 0));
+
+ /* Send an event about the new tags to downstream elements */
+ /* gst_event_new_tag takes ownership of the list, so use a copy */
+ event = gst_event_new_tag (gst_tag_list_copy (taglist));
+ gst_pad_push_event (mux->srcpad, event);
+
+ GST_BUFFER_OFFSET (buffer) = 0;
+ ret = gst_pad_push (mux->srcpad, buffer);
+
+ mux->current_offset = mux->start_tag_size;
+ mux->max_offset = MAX (mux->max_offset, mux->current_offset);
+
+ return ret;
+
+no_vfunc:
+ {
+ GST_ERROR_OBJECT (mux, "Subclass does not implement "
+ "render_start_tag vfunc!");
+ return GST_FLOW_ERROR;
+ }
+}
+
+static GstFlowReturn
+gst_tag_mux_render_end_tag (GstTagMux * mux)
+{
+ GstTagMuxClass *klass;
+ GstBuffer *buffer;
+ GstTagList *taglist;
+ GstFlowReturn ret;
+
+ taglist = gst_tag_mux_get_tags (mux);
+
+ klass = GST_TAG_MUX_CLASS (G_OBJECT_GET_CLASS (mux));
+
+ if (klass->render_end_tag == NULL)
+ goto no_vfunc;
+
+ buffer = klass->render_end_tag (mux, taglist);
+
+ if (buffer == NULL) {
+ GST_INFO_OBJECT (mux, "No end tag generated");
+ mux->end_tag_size = 0;
+ return GST_FLOW_OK;
+ }
+
+ mux->end_tag_size = GST_BUFFER_SIZE (buffer);
+ GST_LOG_OBJECT (mux, "tag size = %" G_GSIZE_FORMAT " bytes",
+ mux->end_tag_size);
+
+ /* Send newsegment event from the end of the file, so it gets written there,
+ independent of whatever new segment events upstream has sent us */
+ gst_pad_push_event (mux->srcpad,
+ gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, mux->max_offset,
+ -1, 0));
+
+ GST_BUFFER_OFFSET (buffer) = mux->max_offset;
+ ret = gst_pad_push (mux->srcpad, buffer);
+
+ return ret;
+
+no_vfunc:
+ {
+ GST_ERROR_OBJECT (mux, "Subclass does not implement "
+ "render_end_tag vfunc!");
+ return GST_FLOW_ERROR;
+ }
+}
+
+static GstEvent *
+gst_tag_mux_adjust_event_offsets (GstTagMux * mux,
+ const GstEvent * newsegment_event)
+{
+ GstFormat format;
+ gint64 start, stop, cur;
+
+ gst_event_parse_new_segment ((GstEvent *) newsegment_event, NULL, NULL,
+ &format, &start, &stop, &cur);
+
+ g_assert (format == GST_FORMAT_BYTES);
+
+ if (start != -1)
+ start += mux->start_tag_size;
+ if (stop != -1)
+ stop += mux->start_tag_size;
+ if (cur != -1)
+ cur += mux->start_tag_size;
+
+ GST_DEBUG_OBJECT (mux, "adjusting newsegment event offsets to start=%"
+ G_GINT64_FORMAT ", stop=%" G_GINT64_FORMAT ", cur=%" G_GINT64_FORMAT
+ " (delta = +%" G_GSIZE_FORMAT ")", start, stop, cur, mux->start_tag_size);
+
+ return gst_event_new_new_segment (TRUE, 1.0, format, start, stop, cur);
+}
+
+static GstFlowReturn
+gst_tag_mux_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstTagMux *mux = GST_TAG_MUX (GST_OBJECT_PARENT (pad));
+ GstFlowReturn ret;
+ int length;
+
+ if (mux->render_start_tag) {
+
+ GST_INFO_OBJECT (mux, "Adding tags to stream");
+ ret = gst_tag_mux_render_start_tag (mux);
+ if (ret != GST_FLOW_OK) {
+ GST_DEBUG_OBJECT (mux, "flow: %s", gst_flow_get_name (ret));
+ gst_buffer_unref (buffer);
+ return ret;
+ }
+
+ /* Now send the cached newsegment event that we got from upstream */
+ if (mux->newsegment_ev) {
+ gint64 start;
+ GstEvent *newseg;
+
+ GST_DEBUG_OBJECT (mux, "sending cached newsegment event");
+ newseg = gst_tag_mux_adjust_event_offsets (mux, mux->newsegment_ev);
+ gst_event_unref (mux->newsegment_ev);
+ mux->newsegment_ev = NULL;
+
+ gst_event_parse_new_segment (newseg, NULL, NULL, NULL, &start, NULL,
+ NULL);
+
+ gst_pad_push_event (mux->srcpad, newseg);
+ mux->current_offset = start;
+ mux->max_offset = MAX (mux->max_offset, mux->current_offset);
+ } else {
+ /* upstream sent no newsegment event or only one in a non-BYTE format */
+ }
+
+ mux->render_start_tag = FALSE;
+ }
+
+ buffer = gst_buffer_make_metadata_writable (buffer);
+
+ if (GST_BUFFER_OFFSET (buffer) != GST_BUFFER_OFFSET_NONE) {
+ GST_LOG_OBJECT (mux, "Adjusting buffer offset from %" G_GINT64_FORMAT
+ " to %" G_GINT64_FORMAT, GST_BUFFER_OFFSET (buffer),
+ GST_BUFFER_OFFSET (buffer) + mux->start_tag_size);
+ GST_BUFFER_OFFSET (buffer) += mux->start_tag_size;
+ }
+
+ length = GST_BUFFER_SIZE (buffer);
+
+ gst_buffer_set_caps (buffer, GST_PAD_CAPS (mux->srcpad));
+ ret = gst_pad_push (mux->srcpad, buffer);
+
+ mux->current_offset += length;
+ mux->max_offset = MAX (mux->max_offset, mux->current_offset);
+
+ return ret;
+}
+
+static gboolean
+gst_tag_mux_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstTagMux *mux;
+ gboolean result;
+
+ mux = GST_TAG_MUX (gst_pad_get_parent (pad));
+ result = FALSE;
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_TAG:{
+ GstTagList *tags;
+
+ gst_event_parse_tag (event, &tags);
+
+ GST_INFO_OBJECT (mux, "Got tag event: %" GST_PTR_FORMAT, tags);
+
+ if (mux->event_tags != NULL) {
+ gst_tag_list_insert (mux->event_tags, tags, GST_TAG_MERGE_REPLACE);
+ } else {
+ mux->event_tags = gst_tag_list_copy (tags);
+ }
+
+ GST_INFO_OBJECT (mux, "Event tags are now: %" GST_PTR_FORMAT,
+ mux->event_tags);
+
+ /* just drop the event, we'll push a new tag event in render_start_tag */
+ gst_event_unref (event);
+ result = TRUE;
+ break;
+ }
+ case GST_EVENT_NEWSEGMENT:{
+ GstFormat fmt;
+ gint64 start;
+
+ gst_event_parse_new_segment (event, NULL, NULL, &fmt, &start, NULL, NULL);
+
+ if (fmt != GST_FORMAT_BYTES) {
+ GST_WARNING_OBJECT (mux, "dropping newsegment event in %s format",
+ gst_format_get_name (fmt));
+ gst_event_unref (event);
+ break;
+ }
+
+ if (mux->render_start_tag) {
+ /* we have not rendered the tag yet, which means that we don't know
+ * how large it is going to be yet, so we can't adjust the offsets
+ * here at this point and need to cache the newsegment event for now
+ * (also, there could be tag events coming after this newsegment event
+ * and before the first buffer). */
+ if (mux->newsegment_ev) {
+ GST_WARNING_OBJECT (mux, "discarding old cached newsegment event");
+ gst_event_unref (mux->newsegment_ev);
+ }
+
+ GST_LOG_OBJECT (mux, "caching newsegment event for later");
+ mux->newsegment_ev = event;
+ } else {
+ GST_DEBUG_OBJECT (mux, "got newsegment event, adjusting offsets");
+ gst_pad_push_event (mux->srcpad,
+ gst_tag_mux_adjust_event_offsets (mux, event));
+ gst_event_unref (event);
+
+ mux->current_offset = start;
+ mux->max_offset = MAX (mux->max_offset, mux->current_offset);
+ }
+ event = NULL;
+ result = TRUE;
+ break;
+ }
+ case GST_EVENT_EOS:{
+ if (mux->render_end_tag) {
+ GstFlowReturn ret;
+
+ GST_INFO_OBJECT (mux, "Adding tags to stream");
+ ret = gst_tag_mux_render_end_tag (mux);
+ if (ret != GST_FLOW_OK) {
+ GST_DEBUG_OBJECT (mux, "flow: %s", gst_flow_get_name (ret));
+ return ret;
+ }
+
+ mux->render_end_tag = FALSE;
+ }
+
+ /* Now forward EOS */
+ result = gst_pad_event_default (pad, event);
+ break;
+ }
+ default:
+ result = gst_pad_event_default (pad, event);
+ break;
+ }
+
+ gst_object_unref (mux);
+
+ return result;
+}
+
+
+static GstStateChangeReturn
+gst_tag_mux_change_state (GstElement * element, GstStateChange transition)
+{
+ GstTagMux *mux;
+ GstStateChangeReturn result;
+
+ mux = GST_TAG_MUX (element);
+
+ result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+ if (result != GST_STATE_CHANGE_SUCCESS) {
+ return result;
+ }
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:{
+ if (mux->newsegment_ev) {
+ gst_event_unref (mux->newsegment_ev);
+ mux->newsegment_ev = NULL;
+ }
+ if (mux->event_tags) {
+ gst_tag_list_free (mux->event_tags);
+ mux->event_tags = NULL;
+ }
+ mux->start_tag_size = 0;
+ mux->end_tag_size = 0;
+ mux->render_start_tag = TRUE;
+ mux->render_end_tag = TRUE;
+ mux->current_offset = 0;
+ mux->max_offset = 0;
+ break;
+ }
+ default:
+ break;
+ }
+
+ return result;
+}
diff --git a/gst/id3tag/gsttagmux.h b/gst/id3tag/gsttagmux.h
new file mode 100644
index 00000000..c13a7326
--- /dev/null
+++ b/gst/id3tag/gsttagmux.h
@@ -0,0 +1,79 @@
+/* GStreamer tag muxer base class
+ *
+ * Copyright (C) 2006 Christophe Fergeau <teuf@gnome.org>
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ * Copyright (C) 2009 Pioneers of the Inevitable <songbird@songbirdnest.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef GST_TAG_MUX_H
+#define GST_TAG_MUX_H
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstTagMux GstTagMux;
+typedef struct _GstTagMuxClass GstTagMuxClass;
+
+/* Definition of structure storing data for this element. */
+struct _GstTagMux {
+ GstElement element;
+
+ GstPad *srcpad;
+ GstPad *sinkpad;
+ GstTagList *event_tags; /* tags received from upstream elements */
+ GstTagList *final_tags; /* Final set of tags used for muxing */
+ gsize start_tag_size;
+ gsize end_tag_size;
+ gboolean render_start_tag;
+ gboolean render_end_tag;
+
+ gint64 current_offset;
+ gint64 max_offset;
+
+ GstEvent *newsegment_ev; /* cached newsegment event from upstream */
+};
+
+/* Standard definition defining a class for this element. */
+struct _GstTagMuxClass {
+ GstElementClass parent_class;
+
+ /* vfuncs */
+ GstBuffer * (*render_start_tag) (GstTagMux * mux, GstTagList * tag_list);
+ GstBuffer * (*render_end_tag) (GstTagMux * mux, GstTagList * tag_list);
+};
+
+/* Standard macros for defining types for this element. */
+#define GST_TYPE_TAG_MUX \
+ (gst_tag_mux_get_type())
+#define GST_TAG_MUX(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TAG_MUX,GstTagMux))
+#define GST_TAG_MUX_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TAG_MUX,GstTagMuxClass))
+#define GST_IS_TAG_MUX(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TAG_MUX))
+#define GST_IS_TAG_MUX_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TAG_MUX))
+
+/* Standard function returning type information. */
+GType gst_tag_mux_get_type (void);
+
+G_END_DECLS
+
+#endif
+
diff --git a/gst/id3tag/id3tag.c b/gst/id3tag/id3tag.c
new file mode 100644
index 00000000..a39e2a8e
--- /dev/null
+++ b/gst/id3tag/id3tag.c
@@ -0,0 +1,1194 @@
+/* GStreamer ID3v2 tag writer
+ *
+ * Copyright (C) 2006 Christophe Fergeau <teuf@gnome.org>
+ * Copyright (C) 2006-2009 Tim-Philipp Müller <tim centricular net>
+ * Copyright (C) 2009 Pioneers of the Inevitable <songbird@songbirdnest.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 "id3tag.h"
+#include <string.h>
+
+#include <gst/tag/tag.h>
+
+GST_DEBUG_CATEGORY_EXTERN (gst_id3_tag_debug);
+#define GST_CAT_DEFAULT gst_id3_tag_debug
+
+#define ID3V2_APIC_PICTURE_OTHER 0
+#define ID3V2_APIC_PICTURE_FILE_ICON 1
+
+/* ======================================================================== */
+
+typedef GString GstByteWriter;
+
+static inline GstByteWriter *
+gst_byte_writer_new (guint size)
+{
+ return (GstByteWriter *) g_string_sized_new (size);
+}
+
+static inline guint
+gst_byte_writer_get_length (GstByteWriter * w)
+{
+ return ((GString *) w)->len;
+}
+
+static inline void
+gst_byte_writer_write_bytes (GstByteWriter * w, const guint8 * data, guint len)
+{
+ g_string_append_len ((GString *) w, (const gchar *) data, len);
+}
+
+static inline void
+gst_byte_writer_write_uint8 (GstByteWriter * w, guint8 val)
+{
+ guint8 data[1];
+
+ GST_WRITE_UINT8 (data, val);
+ gst_byte_writer_write_bytes (w, data, 1);
+}
+
+static inline void
+gst_byte_writer_write_uint16 (GstByteWriter * w, guint16 val)
+{
+ guint8 data[2];
+
+ GST_WRITE_UINT16_BE (data, val);
+ gst_byte_writer_write_bytes (w, data, 2);
+}
+
+static inline void
+gst_byte_writer_write_uint32 (GstByteWriter * w, guint32 val)
+{
+ guint8 data[4];
+
+ GST_WRITE_UINT32_BE (data, val);
+ gst_byte_writer_write_bytes (w, data, 4);
+}
+
+static inline void
+gst_byte_writer_write_uint32_syncsafe (GstByteWriter * w, guint32 val)
+{
+ guint8 data[4];
+
+ data[0] = (guint8) ((val >> 21) & 0x7f);
+ data[1] = (guint8) ((val >> 14) & 0x7f);
+ data[2] = (guint8) ((val >> 7) & 0x7f);
+ data[3] = (guint8) ((val >> 0) & 0x7f);
+ gst_byte_writer_write_bytes (w, data, 4);
+}
+
+static void
+gst_byte_writer_copy_bytes (GstByteWriter * w, guint8 * dest, guint offset,
+ gint size)
+{
+ guint length;
+
+ length = gst_byte_writer_get_length (w);
+
+ if (size == -1)
+ size = length - offset;
+
+#if GLIB_CHECK_VERSION(2,16,0)
+ g_warn_if_fail (length >= (offset + size));
+#endif
+
+ memcpy (dest, w->str + offset, MIN (size, length - offset));
+}
+
+static inline void
+gst_byte_writer_free (GstByteWriter * w)
+{
+ g_string_free (w, TRUE);
+}
+
+/* ======================================================================== */
+
+/*
+typedef enum {
+ GST_ID3V2_FRAME_FLAG_NONE = 0,
+ GST_ID3V2_FRAME_FLAG_
+} GstID3v2FrameMsgFlags;
+*/
+
+typedef struct
+{
+ gchar id[5];
+ guint32 len; /* Length encoded in the header; this is the
+ total length - header size */
+ guint16 flags;
+ GstByteWriter *writer;
+ gboolean dirty; /* TRUE if frame header needs updating */
+} GstId3v2Frame;
+
+typedef struct
+{
+ GArray *frames;
+ guint major_version; /* The 3 in v2.3.0 */
+} GstId3v2Tag;
+
+typedef void (*GstId3v2AddTagFunc) (GstId3v2Tag * tag, const GstTagList * list,
+ const gchar * gst_tag, guint num_tags, const gchar * data);
+
+#define ID3V2_ENCODING_UTF8 0x03
+
+static gboolean id3v2_tag_init (GstId3v2Tag * tag, guint major_version);
+static void id3v2_tag_unset (GstId3v2Tag * tag);
+
+static void id3v2_frame_init (GstId3v2Frame * frame,
+ const gchar * frame_id, guint16 flags);
+static void id3v2_frame_unset (GstId3v2Frame * frame);
+static void id3v2_frame_finish (GstId3v2Tag * tag, GstId3v2Frame * frame);
+static guint id3v2_frame_get_size (GstId3v2Tag * tag, GstId3v2Frame * frame);
+
+static void id3v2_tag_add_text_frame (GstId3v2Tag * tag,
+ const gchar * frame_id, gchar ** strings, int num_strings);
+
+static gboolean
+id3v2_tag_init (GstId3v2Tag * tag, guint major_version)
+{
+ if (major_version != 3 && major_version != 4)
+ return FALSE;
+
+ tag->major_version = major_version;
+ tag->frames = g_array_new (TRUE, TRUE, sizeof (GstId3v2Frame));
+
+ return TRUE;
+}
+
+static void
+id3v2_tag_unset (GstId3v2Tag * tag)
+{
+ guint i;
+
+ for (i = 0; i < tag->frames->len; ++i)
+ id3v2_frame_unset (&g_array_index (tag->frames, GstId3v2Frame, i));
+
+ g_array_free (tag->frames, TRUE);
+ memset (tag, 0, sizeof (GstId3v2Tag));
+}
+
+#ifndef GST_ROUND_UP_1024
+#define GST_ROUND_UP_1024(num) (((num)+1023)&~1023)
+#endif
+
+static GstBuffer *
+id3v2_tag_to_buffer (GstId3v2Tag * tag)
+{
+ GstByteWriter *w;
+ GstBuffer *buf;
+ guint8 *dest;
+ guint i, size, offset, size_frames = 0;
+
+ GST_DEBUG ("Creating buffer for ID3v2 tag containing %d frames",
+ tag->frames->len);
+
+ for (i = 0; i < tag->frames->len; ++i) {
+ GstId3v2Frame *frame = &g_array_index (tag->frames, GstId3v2Frame, i);
+
+ id3v2_frame_finish (tag, frame);
+ size_frames += id3v2_frame_get_size (tag, frame);
+ }
+
+ size = GST_ROUND_UP_1024 (10 + size_frames);
+
+ w = gst_byte_writer_new (10);
+ gst_byte_writer_write_uint8 (w, 'I');
+ gst_byte_writer_write_uint8 (w, 'D');
+ gst_byte_writer_write_uint8 (w, '3');
+ gst_byte_writer_write_uint8 (w, tag->major_version);
+ gst_byte_writer_write_uint8 (w, 0); /* micro version */
+ gst_byte_writer_write_uint8 (w, 0); /* flags */
+ gst_byte_writer_write_uint32_syncsafe (w, size - 10);
+
+ buf = gst_buffer_new_and_alloc (size);
+ dest = GST_BUFFER_DATA (buf);
+ gst_byte_writer_copy_bytes (w, dest, 0, 10);
+ offset = 10;
+
+ for (i = 0; i < tag->frames->len; ++i) {
+ GstId3v2Frame *frame = &g_array_index (tag->frames, GstId3v2Frame, i);
+
+ gst_byte_writer_copy_bytes (frame->writer, dest + offset, 0, -1);
+ offset += id3v2_frame_get_size (tag, frame);
+ }
+
+ /* Zero out any additional space in our buffer as padding. */
+ memset (dest + offset, 0, size - offset);
+
+ gst_byte_writer_free (w);
+
+ return buf;
+}
+
+static inline void
+id3v2_frame_write_bytes (GstId3v2Frame * frame, const guint8 * data, guint len)
+{
+ gst_byte_writer_write_bytes (frame->writer, data, len);
+ frame->dirty = TRUE;
+}
+
+static inline void
+id3v2_frame_write_uint8 (GstId3v2Frame * frame, guint8 val)
+{
+ gst_byte_writer_write_uint8 (frame->writer, val);
+ frame->dirty = TRUE;
+}
+
+static inline void
+id3v2_frame_write_uint16 (GstId3v2Frame * frame, guint16 val)
+{
+ gst_byte_writer_write_uint16 (frame->writer, val);
+ frame->dirty = TRUE;
+}
+
+static inline void
+id3v2_frame_write_uint32 (GstId3v2Frame * frame, guint32 val)
+{
+ gst_byte_writer_write_uint32 (frame->writer, val);
+ frame->dirty = TRUE;
+}
+
+static inline void
+id3v2_frame_write_uint32_syncsafe (GstId3v2Frame * frame, guint32 val)
+{
+ guint8 data[4];
+
+ data[0] = (guint8) ((val >> 21) & 0x7f);
+ data[1] = (guint8) ((val >> 14) & 0x7f);
+ data[2] = (guint8) ((val >> 7) & 0x7f);
+ data[3] = (guint8) ((val >> 0) & 0x7f);
+ gst_byte_writer_write_bytes (frame->writer, data, 4);
+ frame->dirty = TRUE;
+}
+
+static void
+id3v2_frame_init (GstId3v2Frame * frame, const gchar * frame_id, guint16 flags)
+{
+ g_assert (strlen (frame_id) == 4); /* we only handle 2.3.0/2.4.0 */
+ memcpy (frame->id, frame_id, 4 + 1);
+ frame->flags = flags;
+ frame->len = 0;
+ frame->writer = gst_byte_writer_new (64);
+ id3v2_frame_write_bytes (frame, (const guint8 *) frame->id, 4);
+ id3v2_frame_write_uint32 (frame, 0); /* size, set later */
+ id3v2_frame_write_uint16 (frame, frame->flags);
+}
+
+static void
+id3v2_frame_finish (GstId3v2Tag * tag, GstId3v2Frame * frame)
+{
+ if (frame->dirty) {
+ frame->len = frame->writer->len - 10;
+ GST_LOG ("[%s] %u bytes", frame->id, frame->len);
+ if (tag->major_version == 3) {
+ GST_WRITE_UINT32_BE (frame->writer->str + 4, frame->len);
+ } else {
+ /* Version 4 uses a syncsafe int here */
+ GST_WRITE_UINT8 (frame->writer->str + 4, (frame->len >> 21) & 0x7f);
+ GST_WRITE_UINT8 (frame->writer->str + 5, (frame->len >> 14) & 0x7f);
+ GST_WRITE_UINT8 (frame->writer->str + 6, (frame->len >> 7) & 0x7f);
+ GST_WRITE_UINT8 (frame->writer->str + 7, (frame->len >> 0) & 0x7f);
+ }
+ frame->dirty = FALSE;
+ }
+}
+
+static guint
+id3v2_frame_get_size (GstId3v2Tag * tag, GstId3v2Frame * frame)
+{
+ id3v2_frame_finish (tag, frame);
+ return gst_byte_writer_get_length (frame->writer);
+}
+
+static void
+id3v2_frame_unset (GstId3v2Frame * frame)
+{
+ gst_byte_writer_free (frame->writer);
+ memset (frame, 0, sizeof (GstId3v2Frame));
+}
+
+static void
+id3v2_tag_add_text_frame (GstId3v2Tag * tag, const gchar * frame_id,
+ gchar ** strings_utf8, int num_strings)
+{
+ GstId3v2Frame frame;
+ guint len, i;
+
+ if (num_strings < 1 || strings_utf8 == NULL || strings_utf8[0] == NULL) {
+ GST_LOG ("Not adding text frame, no strings");
+ return;
+ }
+
+ id3v2_frame_init (&frame, frame_id, 0);
+ id3v2_frame_write_uint8 (&frame, ID3V2_ENCODING_UTF8);
+
+ GST_LOG ("Adding text frame %s with %d strings", frame_id, num_strings);
+
+ for (i = 0; i < num_strings; ++i) {
+ len = strlen (strings_utf8[i]);
+ g_return_if_fail (g_utf8_validate (strings_utf8[i], len, NULL));
+
+ /* write NUL terminator as well */
+ id3v2_frame_write_bytes (&frame, (const guint8 *) strings_utf8[i], len + 1);
+
+ /* only v2.4.0 supports multiple strings per frame (according to the
+ * earlier specs tag readers should just ignore everything after the first
+ * string, but we probably shouldn't write anything there, just in case
+ * tag readers that only support the old version are not expecting
+ * more data after the first string) */
+ if (tag->major_version < 4)
+ break;
+ }
+
+ if (i < num_strings - 1) {
+ GST_WARNING ("Only wrote one of multiple string values for text frame %s "
+ "- ID3v2 supports multiple string values only since v2.4.0, but writing"
+ "v2.%u.0 tag", frame_id, tag->major_version);
+ }
+
+ g_array_append_val (tag->frames, frame);
+}
+
+/* ====================================================================== */
+
+static void
+add_text_tag (GstId3v2Tag * id3v2tag, const GstTagList * list,
+ const gchar * tag, guint num_tags, const gchar * frame_id)
+{
+ gchar **strings;
+ guint n, i;
+
+ GST_LOG ("Adding '%s' frame", frame_id);
+
+ strings = g_new0 (gchar *, num_tags + 1);
+ for (n = 0, i = 0; n < num_tags; ++n) {
+ if (gst_tag_list_get_string_index (list, tag, n, &strings[i]) &&
+ strings[i] != NULL) {
+ GST_LOG ("%s: %s[%u] = '%s'", frame_id, tag, i, strings[i]);
+ ++i;
+ }
+ }
+
+ if (strings[0] != NULL) {
+ id3v2_tag_add_text_frame (id3v2tag, frame_id, strings, i);
+ } else {
+ GST_WARNING ("Empty list for tag %s, skipping", tag);
+ }
+
+ g_strfreev (strings);
+}
+
+static void
+add_id3v2frame_tag (GstId3v2Tag * id3v2tag, const GstTagList * list,
+ const gchar * tag, guint num_tags, const gchar * unused)
+{
+ guint i;
+
+ for (i = 0; i < num_tags; ++i) {
+ const GValue *val;
+ GstBuffer *buf;
+
+ val = gst_tag_list_get_value_index (list, tag, i);
+ buf = (GstBuffer *) gst_value_get_mini_object (val);
+
+ if (buf && GST_BUFFER_CAPS (buf)) {
+ GstStructure *s;
+ gint version = 0;
+
+ s = gst_caps_get_structure (GST_BUFFER_CAPS (buf), 0);
+ /* We can only add it if this private buffer is for the same ID3 version,
+ because we don't understand the contents at all. */
+ if (s && gst_structure_get_int (s, "version", &version) &&
+ version == id3v2tag->major_version) {
+ GstId3v2Frame frame;
+ gchar frame_id[5];
+ guint16 flags;
+ guint8 *data = GST_BUFFER_DATA (buf);
+ gint size = GST_BUFFER_SIZE (buf);
+
+ if (size < 10) /* header size */
+ return;
+
+ /* We only reach here if the frame version matches the muxer. Since the
+ muxer only does v2.3 or v2.4, the frame must be one of those - and
+ so the frame header is the same format */
+ memcpy (frame_id, data, 4);
+ frame_id[4] = 0;
+ flags = GST_READ_UINT16_BE (data + 8);
+
+ id3v2_frame_init (&frame, frame_id, flags);
+ id3v2_frame_write_bytes (&frame, data + 10, size - 10);
+
+ g_array_append_val (id3v2tag->frames, frame);
+ GST_DEBUG ("Added unparsed tag with %d bytes", size);
+ } else {
+ GST_WARNING ("Discarding unrecognised ID3 tag for different ID3 "
+ "version");
+ }
+ }
+ }
+}
+
+static void
+add_text_tag_v4 (GstId3v2Tag * id3v2tag, const GstTagList * list,
+ const gchar * tag, guint num_tags, const gchar * frame_id)
+{
+ if (id3v2tag->major_version == 4)
+ add_text_tag (id3v2tag, list, tag, num_tags, frame_id);
+ else {
+ GST_WARNING ("Cannot serialise tag '%s' in ID3v2.%d", frame_id,
+ id3v2tag->major_version);
+ }
+}
+
+static void
+add_count_or_num_tag (GstId3v2Tag * id3v2tag, const GstTagList * list,
+ const gchar * tag, guint num_tags, const gchar * frame_id)
+{
+ static const struct
+ {
+ const gchar *gst_tag;
+ const gchar *corr_count; /* corresponding COUNT tag (if number) */
+ const gchar *corr_num; /* corresponding NUMBER tag (if count) */
+ } corr[] = {
+ {
+ GST_TAG_TRACK_NUMBER, GST_TAG_TRACK_COUNT, NULL}, {
+ GST_TAG_TRACK_COUNT, NULL, GST_TAG_TRACK_NUMBER}, {
+ GST_TAG_ALBUM_VOLUME_NUMBER, GST_TAG_ALBUM_VOLUME_COUNT, NULL}, {
+ GST_TAG_ALBUM_VOLUME_COUNT, NULL, GST_TAG_ALBUM_VOLUME_NUMBER}
+ };
+ guint idx;
+
+ for (idx = 0; idx < G_N_ELEMENTS (corr); ++idx) {
+ if (strcmp (corr[idx].gst_tag, tag) == 0)
+ break;
+ }
+
+ g_assert (idx < G_N_ELEMENTS (corr));
+ g_assert (frame_id && strlen (frame_id) == 4);
+
+ if (corr[idx].corr_num == NULL) {
+ guint number;
+
+ /* number tag */
+ if (gst_tag_list_get_uint_index (list, tag, 0, &number)) {
+ gchar *tag_str;
+ guint count;
+
+ if (gst_tag_list_get_uint_index (list, corr[idx].corr_count, 0, &count))
+ tag_str = g_strdup_printf ("%u/%u", number, count);
+ else
+ tag_str = g_strdup_printf ("%u", number);
+
+ GST_DEBUG ("Setting %s to %s (frame_id = %s)", tag, tag_str, frame_id);
+
+ id3v2_tag_add_text_frame (id3v2tag, frame_id, &tag_str, 1);
+ g_free (tag_str);
+ }
+ } else if (corr[idx].corr_count == NULL) {
+ guint count;
+
+ /* count tag */
+ if (gst_tag_list_get_uint_index (list, corr[idx].corr_num, 0, &count)) {
+ GST_DEBUG ("%s handled with %s, skipping", tag, corr[idx].corr_num);
+ } else if (gst_tag_list_get_uint_index (list, tag, 0, &count)) {
+ gchar *tag_str = g_strdup_printf ("0/%u", count);
+ GST_DEBUG ("Setting %s to %s (frame_id = %s)", tag, tag_str, frame_id);
+
+ id3v2_tag_add_text_frame (id3v2tag, frame_id, &tag_str, 1);
+ g_free (tag_str);
+ }
+ }
+
+ if (num_tags > 1) {
+ GST_WARNING ("more than one %s, can only handle one", tag);
+ }
+}
+
+static void
+add_comment_tag (GstId3v2Tag * id3v2tag, const GstTagList * list,
+ const gchar * tag, guint num_tags, const gchar * unused)
+{
+ guint n;
+
+ GST_LOG ("Adding comment frames");
+ for (n = 0; n < num_tags; ++n) {
+ gchar *s = NULL;
+
+ if (gst_tag_list_get_string_index (list, tag, n, &s) && s != NULL) {
+ gchar *desc = NULL, *val = NULL, *lang = NULL;
+ int desclen, vallen;
+ GstId3v2Frame frame;
+
+ id3v2_frame_init (&frame, "COMM", 0);
+ id3v2_frame_write_uint8 (&frame, ID3V2_ENCODING_UTF8);
+
+ if (strcmp (tag, GST_TAG_COMMENT) == 0 ||
+ !gst_tag_parse_extended_comment (s, &desc, &lang, &val, TRUE)) {
+ /* create dummy description fields */
+ desc = g_strdup ("Comment");
+ val = g_strdup (s);
+ }
+
+ /* If we don't have a valid language, match what taglib does for
+ unknown languages */
+ if (!lang || strlen (lang) < 3)
+ lang = g_strdup ("XXX");
+
+ desclen = strlen (desc);
+ g_return_if_fail (g_utf8_validate (desc, desclen, NULL));
+ vallen = strlen (val);
+ g_return_if_fail (g_utf8_validate (val, vallen, NULL));
+
+ GST_LOG ("%s[%u] = '%s' (%s|%s|%s)", tag, n, s, GST_STR_NULL (desc),
+ GST_STR_NULL (lang), GST_STR_NULL (val));
+
+ id3v2_frame_write_bytes (&frame, (const guint8 *) lang, 3);
+ /* write description and value, each including NULL terminator */
+ id3v2_frame_write_bytes (&frame, (const guint8 *) desc, desclen + 1);
+ id3v2_frame_write_bytes (&frame, (const guint8 *) val, vallen + 1);
+
+ g_free (lang);
+ g_free (desc);
+ g_free (val);
+
+ g_array_append_val (id3v2tag->frames, frame);
+ }
+ g_free (s);
+ }
+}
+
+static void
+add_image_tag (GstId3v2Tag * id3v2tag, const GstTagList * list,
+ const gchar * tag, guint num_tags, const gchar * unused)
+{
+ guint n;
+
+ for (n = 0; n < num_tags; ++n) {
+ const GValue *val;
+ GstBuffer *image;
+
+ GST_DEBUG ("image %u/%u", n + 1, num_tags);
+
+ val = gst_tag_list_get_value_index (list, tag, n);
+ image = (GstBuffer *) gst_value_get_mini_object (val);
+
+ if (GST_IS_BUFFER (image) && GST_BUFFER_SIZE (image) > 0 &&
+ GST_BUFFER_CAPS (image) != NULL &&
+ !gst_caps_is_empty (GST_BUFFER_CAPS (image))) {
+ const gchar *mime_type;
+ GstStructure *s;
+
+ s = gst_caps_get_structure (GST_BUFFER_CAPS (image), 0);
+ mime_type = gst_structure_get_name (s);
+ if (mime_type != NULL) {
+ const gchar *desc;
+ GstId3v2Frame frame;
+
+ /* APIC frame specifies "-->" if we're providing a URL to the image
+ rather than directly embedding it */
+ if (strcmp (mime_type, "text/uri-list") == 0)
+ mime_type = "-->";
+
+ GST_DEBUG ("Attaching picture of %u bytes and mime type %s",
+ GST_BUFFER_SIZE (image), mime_type);
+
+ id3v2_frame_init (&frame, "APIC", 0);
+ id3v2_frame_write_uint8 (&frame, ID3V2_ENCODING_UTF8);
+ id3v2_frame_write_bytes (&frame, (const guint8 *) mime_type,
+ strlen (mime_type) + 1);
+
+ /* FIXME set image type properly from caps */
+ if (strcmp (tag, GST_TAG_PREVIEW_IMAGE) == 0)
+ id3v2_frame_write_uint8 (&frame, ID3V2_APIC_PICTURE_FILE_ICON);
+ else
+ id3v2_frame_write_uint8 (&frame, ID3V2_APIC_PICTURE_OTHER);
+
+ desc = gst_structure_get_string (s, "image-description");
+ if (!desc)
+ desc = "";
+ id3v2_frame_write_bytes (&frame, (const guint8 *) desc,
+ strlen (desc) + 1);
+
+ g_array_append_val (id3v2tag->frames, frame);
+ }
+ } else {
+ GST_WARNING ("NULL image or no caps on image buffer (%p, caps=%"
+ GST_PTR_FORMAT ")", image, (image) ? GST_BUFFER_CAPS (image) : NULL);
+ }
+ }
+}
+
+static void
+add_musicbrainz_tag (GstId3v2Tag * id3v2tag, const GstTagList * list,
+ const gchar * tag, guint num_tags, const gchar * data)
+{
+ static const struct
+ {
+ const gchar gst_tag[28];
+ const gchar spec_id[28];
+ const gchar realworld_id[28];
+ } mb_ids[] = {
+ {
+ GST_TAG_MUSICBRAINZ_ARTISTID, "MusicBrainz Artist Id",
+ "musicbrainz_artistid"}, {
+ GST_TAG_MUSICBRAINZ_ALBUMID, "MusicBrainz Album Id", "musicbrainz_albumid"}, {
+ GST_TAG_MUSICBRAINZ_ALBUMARTISTID, "MusicBrainz Album Artist Id",
+ "musicbrainz_albumartistid"}, {
+ GST_TAG_MUSICBRAINZ_TRMID, "MusicBrainz TRM Id", "musicbrainz_trmid"}, {
+ GST_TAG_CDDA_MUSICBRAINZ_DISCID, "MusicBrainz DiscID",
+ "musicbrainz_discid"}, {
+ /* the following one is more or less made up, there seems to be little
+ * evidence that any popular application is actually putting this info
+ * into TXXX frames; the first one comes from a musicbrainz wiki 'proposed
+ * tags' page, the second one is analogue to the vorbis/ape/flac tag. */
+ GST_TAG_CDDA_CDDB_DISCID, "CDDB DiscID", "discid"}
+ };
+ guint i, idx;
+
+ idx = (guint8) data[0];
+ g_assert (idx < G_N_ELEMENTS (mb_ids));
+
+ for (i = 0; i < num_tags; ++i) {
+ gchar *id_str;
+
+ if (gst_tag_list_get_string_index (list, tag, 0, &id_str) && id_str) {
+ /* add two frames, one with the ID the musicbrainz.org spec mentions
+ * and one with the ID that applications use in the real world */
+ GstId3v2Frame frame1, frame2;
+
+ GST_DEBUG ("Setting '%s' to '%s'", mb_ids[idx].spec_id, id_str);
+
+ id3v2_frame_init (&frame1, "TXXX", 0);
+ id3v2_frame_write_uint8 (&frame1, ID3V2_ENCODING_UTF8);
+ id3v2_frame_write_bytes (&frame1, (const guint8 *) mb_ids[idx].spec_id,
+ strlen (mb_ids[idx].spec_id) + 1);
+ id3v2_frame_write_bytes (&frame1, (const guint8 *) id_str,
+ strlen (id_str) + 1);
+ g_array_append_val (id3v2tag->frames, frame1);
+
+ id3v2_frame_init (&frame2, "TXXX", 0);
+ id3v2_frame_write_uint8 (&frame2, ID3V2_ENCODING_UTF8);
+ id3v2_frame_write_bytes (&frame2,
+ (const guint8 *) mb_ids[idx].realworld_id,
+ strlen (mb_ids[idx].realworld_id) + 1);
+ id3v2_frame_write_bytes (&frame2, (const guint8 *) id_str,
+ strlen (id_str) + 1);
+ g_array_append_val (id3v2tag->frames, frame2);
+
+ g_free (id_str);
+ }
+ }
+}
+
+static void
+add_unique_file_id_tag (GstId3v2Tag * id3v2tag, const GstTagList * list,
+ const gchar * tag, guint num_tags, const gchar * unused)
+{
+ const gchar *origin = "http://musicbrainz.org";
+ gchar *id_str = NULL;
+
+ if (gst_tag_list_get_string_index (list, tag, 0, &id_str) && id_str) {
+ GstId3v2Frame frame;
+
+ GST_LOG ("Adding %s (%s): %s", tag, origin, id_str);
+
+ id3v2_frame_init (&frame, "UFID", 0);
+ id3v2_frame_write_bytes (&frame, (const guint8 *) origin,
+ strlen (origin) + 1);
+ id3v2_frame_write_bytes (&frame, (const guint8 *) id_str,
+ strlen (id_str) + 1);
+ g_array_append_val (id3v2tag->frames, frame);
+
+ g_free (id_str);
+ }
+}
+
+static void
+add_date_tag (GstId3v2Tag * id3v2tag, const GstTagList * list,
+ const gchar * tag, guint num_tags, const gchar * unused)
+{
+ guint n;
+ guint i = 0;
+ const gchar *frame_id;
+ gchar **strings;
+
+ if (id3v2tag->major_version == 3)
+ frame_id = "TYER";
+ else
+ frame_id = "TDRC";
+
+ GST_LOG ("Adding date frame");
+
+ strings = g_new0 (gchar *, num_tags + 1);
+ for (n = 0; n < num_tags; ++n) {
+ GDate *date = NULL;
+
+ if (gst_tag_list_get_date_index (list, tag, n, &date) && date != NULL) {
+ GDateYear year;
+ gchar *s;
+
+ year = g_date_get_year (date);
+ if (year > 500 && year < 2100) {
+ s = g_strdup_printf ("%u", year);
+ GST_LOG ("%s[%u] = '%s'", tag, n, s);
+ strings[i] = s;
+ i++;
+ } else {
+ GST_WARNING ("invalid year %u, skipping", year);
+ }
+
+ g_date_free (date);
+ }
+ }
+
+ if (strings[0] != NULL) {
+ id3v2_tag_add_text_frame (id3v2tag, frame_id, strings, i);
+ } else {
+ GST_WARNING ("Empty list for tag %s, skipping", tag);
+ }
+
+ g_strfreev (strings);
+}
+
+static void
+add_encoder_tag (GstId3v2Tag * id3v2tag, const GstTagList * list,
+ const gchar * tag, guint num_tags, const gchar * unused)
+{
+ guint n;
+ gchar **strings;
+ int i = 0;
+
+ /* ENCODER_VERSION is either handled with the ENCODER tag or not at all */
+ if (strcmp (tag, GST_TAG_ENCODER_VERSION) == 0)
+ return;
+
+ strings = g_new0 (gchar *, num_tags + 1);
+ for (n = 0; n < num_tags; ++n) {
+ gchar *encoder = NULL;
+
+ if (gst_tag_list_get_string_index (list, tag, n, &encoder) && encoder) {
+ guint encoder_version;
+ gchar *s;
+
+ if (gst_tag_list_get_uint_index (list, GST_TAG_ENCODER_VERSION, n,
+ &encoder_version) && encoder_version > 0) {
+ s = g_strdup_printf ("%s %u", encoder, encoder_version);
+ } else {
+ s = g_strdup (encoder);
+ }
+
+ GST_LOG ("encoder[%u] = '%s'", n, s);
+ strings[i] = s;
+ i++;
+ g_free (encoder);
+ }
+ }
+
+ if (strings[0] != NULL) {
+ id3v2_tag_add_text_frame (id3v2tag, "TSSE", strings, i);
+ } else {
+ GST_WARNING ("Empty list for tag %s, skipping", tag);
+ }
+
+ g_strfreev (strings);
+}
+
+static void
+add_uri_tag (GstId3v2Tag * id3v2tag, const GstTagList * list,
+ const gchar * tag, guint num_tags, const gchar * frame_id)
+{
+ gchar *url = NULL;
+
+ g_assert (frame_id != NULL);
+
+ /* URI tags are limited to one of each per taglist */
+ if (gst_tag_list_get_string_index (list, tag, 0, &url) && url != NULL) {
+ guint url_len;
+
+ url_len = strlen (url);
+ if (url_len > 0 && gst_uri_is_valid (url)) {
+ GstId3v2Frame frame;
+
+ id3v2_frame_init (&frame, frame_id, 0);
+ id3v2_frame_write_bytes (&frame, (const guint8 *) url, strlen (url) + 1);
+ g_array_append_val (id3v2tag->frames, frame);
+ } else {
+ GST_WARNING ("Tag %s does not contain a valid URI (%s)", tag, url);
+ }
+
+ g_free (url);
+ }
+}
+
+static void
+add_relative_volume_tag (GstId3v2Tag * id3v2tag, const GstTagList * list,
+ const gchar * tag, guint num_tags, const gchar * unused)
+{
+ const char *gain_tag_name;
+ const char *peak_tag_name;
+ gdouble peak_val;
+ gdouble gain_val;
+ const char *identification;
+ guint16 peak_int;
+ gint16 gain_int;
+ guint8 peak_bits;
+ GstId3v2Frame frame;
+ gchar *frame_id;
+
+ /* figure out tag names and the identification string to use */
+ if (strcmp (tag, GST_TAG_TRACK_PEAK) == 0 ||
+ strcmp (tag, GST_TAG_TRACK_GAIN) == 0) {
+ gain_tag_name = GST_TAG_TRACK_GAIN;
+ peak_tag_name = GST_TAG_TRACK_PEAK;
+ identification = "track";
+ GST_DEBUG ("adding track relative-volume frame");
+ } else {
+ gain_tag_name = GST_TAG_ALBUM_GAIN;
+ peak_tag_name = GST_TAG_ALBUM_PEAK;
+ identification = "album";
+
+ if (id3v2tag->major_version == 3) {
+ GST_WARNING ("Cannot store replaygain album gain data in ID3v2.3");
+ return;
+ }
+ GST_DEBUG ("adding album relative-volume frame");
+ }
+
+ /* find the value for the paired tag (gain, if this is peak, and
+ * vice versa). if both tags exist, only write the frame when
+ * we're processing the peak tag.
+ */
+ if (strcmp (tag, GST_TAG_TRACK_PEAK) == 0 ||
+ strcmp (tag, GST_TAG_ALBUM_PEAK) == 0) {
+
+ gst_tag_list_get_double (list, tag, &peak_val);
+
+ if (gst_tag_list_get_tag_size (list, gain_tag_name) > 0) {
+ gst_tag_list_get_double (list, gain_tag_name, &gain_val);
+ GST_DEBUG ("setting volume adjustment %g", gain_val);
+ gain_int = (gint16) (gain_val * 512.0);
+ } else
+ gain_int = 0;
+
+ /* copying mutagen: always write as 16 bits for sanity. */
+ peak_int = (short) (peak_val * G_MAXSHORT);
+ peak_bits = 16;
+ } else {
+ gst_tag_list_get_double (list, tag, &gain_val);
+ GST_DEBUG ("setting volume adjustment %g", gain_val);
+
+ gain_int = (gint16) (gain_val * 512.0);
+ peak_bits = 0;
+ peak_int = 0;
+
+ if (gst_tag_list_get_tag_size (list, peak_tag_name) != 0) {
+ GST_DEBUG
+ ("both gain and peak tags exist, not adding frame this time around");
+ return;
+ }
+ }
+
+ if (id3v2tag->major_version == 4) {
+ /* 2.4: Use RVA2 tag */
+ frame_id = "RVA2";
+ } else {
+ /* 2.3: Use XRVA tag - this is experimental, but useful in the real world.
+ This version only officially supports the 'RVAD' tag, but that appears
+ to not be widely implemented in reality. */
+ frame_id = "XRVA";
+ }
+
+ id3v2_frame_init (&frame, frame_id, 0);
+ id3v2_frame_write_bytes (&frame, (const guint8 *) identification,
+ strlen (identification) + 1);
+ id3v2_frame_write_uint8 (&frame, 0x01); /* Master volume */
+ id3v2_frame_write_uint16 (&frame, gain_int);
+ id3v2_frame_write_uint8 (&frame, peak_bits);
+ if (peak_bits)
+ id3v2_frame_write_uint16 (&frame, peak_int);
+
+ g_array_append_val (id3v2tag->frames, frame);
+}
+
+/* id3demux produces these for frames it cannot parse */
+#define GST_ID3_DEMUX_TAG_ID3V2_FRAME "private-id3v2-frame"
+
+static const struct
+{
+ const gchar *gst_tag;
+ const GstId3v2AddTagFunc func;
+ const gchar *data;
+} add_funcs[] = {
+ {
+ /* Simple text tags */
+ GST_TAG_ARTIST, add_text_tag, "TPE1"}, {
+ GST_TAG_TITLE, add_text_tag, "TIT2"}, {
+ GST_TAG_ALBUM, add_text_tag, "TALB"}, {
+ GST_TAG_COPYRIGHT, add_text_tag, "TCOP"}, {
+ GST_TAG_COMPOSER, add_text_tag, "TCOM"}, {
+ GST_TAG_GENRE, add_text_tag, "TCON"}, {
+
+ /* Private frames */
+ GST_ID3_DEMUX_TAG_ID3V2_FRAME, add_id3v2frame_tag, NULL}, {
+
+ /* Track and album numbers */
+ GST_TAG_TRACK_NUMBER, add_count_or_num_tag, "TRCK"}, {
+ GST_TAG_TRACK_COUNT, add_count_or_num_tag, "TRCK"}, {
+ GST_TAG_ALBUM_VOLUME_NUMBER, add_count_or_num_tag, "TPOS"}, {
+ GST_TAG_ALBUM_VOLUME_COUNT, add_count_or_num_tag, "TPOS"}, {
+
+ /* Comment tags */
+ GST_TAG_COMMENT, add_comment_tag, NULL}, {
+ GST_TAG_EXTENDED_COMMENT, add_comment_tag, NULL}, {
+
+ /* Images */
+ GST_TAG_IMAGE, add_image_tag, NULL}, {
+ GST_TAG_PREVIEW_IMAGE, add_image_tag, NULL}, {
+
+ /* Misc user-defined text tags for IDs (and UFID frame) */
+ GST_TAG_MUSICBRAINZ_ARTISTID, add_musicbrainz_tag, "\000"}, {
+ GST_TAG_MUSICBRAINZ_ALBUMID, add_musicbrainz_tag, "\001"}, {
+ GST_TAG_MUSICBRAINZ_ALBUMARTISTID, add_musicbrainz_tag, "\002"}, {
+ GST_TAG_MUSICBRAINZ_TRMID, add_musicbrainz_tag, "\003"}, {
+ GST_TAG_CDDA_MUSICBRAINZ_DISCID, add_musicbrainz_tag, "\004"}, {
+ GST_TAG_CDDA_CDDB_DISCID, add_musicbrainz_tag, "\005"}, {
+ GST_TAG_MUSICBRAINZ_TRACKID, add_unique_file_id_tag, NULL}, {
+
+ /* Info about encoder */
+ GST_TAG_ENCODER, add_encoder_tag, NULL}, {
+ GST_TAG_ENCODER_VERSION, add_encoder_tag, NULL}, {
+
+ /* URIs */
+ GST_TAG_COPYRIGHT_URI, add_uri_tag, "WCOP"}, {
+ GST_TAG_LICENSE_URI, add_uri_tag, "WCOP"}, {
+
+ /* Up to here, all the frame ids and contents have been the same between
+ versions 2.3 and 2.4. The rest of them differ... */
+ /* Date (in ID3v2.3, this is a TYER tag. In v2.4, it's a TDRC tag */
+ GST_TAG_DATE, add_date_tag, NULL}, {
+
+ /* Replaygain data (not really supported in 2.3, we use an experimental
+ tag there) */
+ GST_TAG_TRACK_PEAK, add_relative_volume_tag, NULL}, {
+ GST_TAG_TRACK_GAIN, add_relative_volume_tag, NULL}, {
+ GST_TAG_ALBUM_PEAK, add_relative_volume_tag, NULL}, {
+ GST_TAG_ALBUM_GAIN, add_relative_volume_tag, NULL}, {
+
+ /* Sortable version of various tags. These are all v2.4 ONLY */
+ GST_TAG_ARTIST_SORTNAME, add_text_tag_v4, "TSOP"}, {
+ GST_TAG_ALBUM_SORTNAME, add_text_tag_v4, "TSOA"}, {
+ GST_TAG_TITLE_SORTNAME, add_text_tag_v4, "TSOT"}
+};
+
+static void
+foreach_add_tag (const GstTagList * list, const gchar * tag, gpointer userdata)
+{
+ GstId3v2Tag *id3v2tag = (GstId3v2Tag *) userdata;
+ guint num_tags, i;
+
+ num_tags = gst_tag_list_get_tag_size (list, tag);
+
+ GST_LOG ("Processing tag %s (num=%u)", tag, num_tags);
+
+ if (num_tags > 1 && gst_tag_is_fixed (tag)) {
+ GST_WARNING ("Multiple occurences of fixed tag '%s', ignoring some", tag);
+ num_tags = 1;
+ }
+
+ for (i = 0; i < G_N_ELEMENTS (add_funcs); ++i) {
+ if (strcmp (add_funcs[i].gst_tag, tag) == 0) {
+ add_funcs[i].func (id3v2tag, list, tag, num_tags, add_funcs[i].data);
+ break;
+ }
+ }
+
+ if (i == G_N_ELEMENTS (add_funcs)) {
+ GST_WARNING ("Unsupported tag '%s' - not written", tag);
+ }
+}
+
+GstBuffer *
+gst_id3mux_render_v2_tag (GstTagMux * mux, GstTagList * taglist, int version)
+{
+ GstId3v2Tag tag;
+ GstBuffer *buf;
+
+ if (!id3v2_tag_init (&tag, version)) {
+ GST_WARNING_OBJECT (mux, "Unsupported version %d", version);
+ return NULL;
+ }
+
+ /* Render the tag */
+ gst_tag_list_foreach (taglist, foreach_add_tag, &tag);
+
+#if 0
+ /* Do we want to add our own signature to the tag somewhere? */
+ {
+ gchar *tag_producer_str;
+
+ tag_producer_str = g_strdup_printf ("(GStreamer id3v2mux %s, using "
+ "taglib %u.%u)", VERSION, TAGLIB_MAJOR_VERSION, TAGLIB_MINOR_VERSION);
+ add_one_txxx_tag (id3v2tag, "tag_encoder", tag_producer_str);
+ g_free (tag_producer_str);
+ }
+#endif
+
+ /* Create buffer with tag */
+ buf = id3v2_tag_to_buffer (&tag);
+ gst_buffer_set_caps (buf, GST_PAD_CAPS (mux->srcpad));
+ GST_LOG_OBJECT (mux, "tag size = %d bytes", GST_BUFFER_SIZE (buf));
+
+ id3v2_tag_unset (&tag);
+
+ return buf;
+}
+
+#define ID3_V1_TAG_SIZE 128
+
+typedef void (*GstId3v1WriteFunc) (const GstTagList * list,
+ const gchar * gst_tag, guint8 * dst, int len);
+
+static void
+latin1_convert (const GstTagList * list, const gchar * tag,
+ guint8 * dst, int maxlen)
+{
+ gchar *str;
+ gsize len;
+ gchar *latin1;
+
+ if (!gst_tag_list_get_string (list, tag, &str))
+ return;
+
+ /* Convert to Latin-1 (ISO-8859-1), replacing unrepresentable characters
+ with '?' */
+ latin1 = g_convert_with_fallback (str, -1, "ISO-8859-1", "UTF-8", "?",
+ NULL, &len, NULL);
+
+ if (latin1) {
+ len = MIN (len, maxlen);
+ memcpy (dst, latin1, len);
+ g_free (latin1);
+ }
+
+ g_free (str);
+}
+
+static void
+date_v1_convert (const GstTagList * list, const gchar * tag,
+ guint8 * dst, int maxlen)
+{
+ GDate *date;
+
+ /* Only one date supported */
+ if (gst_tag_list_get_date_index (list, tag, 0, &date) && date != NULL) {
+ GDateYear year = g_date_get_year (date);
+ /* Check for plausible year */
+ if (year > 500 && year < 2100) {
+ gchar str[5];
+ g_snprintf (str, 5, "%.4u", year);
+ memcpy (dst, str, 4);
+ } else {
+ GST_WARNING ("invalid year %u, skipping", year);
+ }
+
+ g_date_free (date);
+ }
+}
+
+static void
+genre_v1_convert (const GstTagList * list, const gchar * tag,
+ guint8 * dst, int maxlen)
+{
+ gchar *str;
+ int genreidx = -1;
+ guint i, max;
+
+ /* We only support one genre */
+ if (!gst_tag_list_get_string_index (list, tag, 0, &str))
+ return;
+
+ max = gst_tag_id3_genre_count ();
+
+ for (i = 0; i < max; i++) {
+ const gchar *genre = gst_tag_id3_genre_get (i);
+ if (g_str_equal (str, genre)) {
+ genreidx = i;
+ break;
+ }
+ }
+
+ if (genreidx >= 0 && genreidx <= 127)
+ *dst = (guint8) genreidx;
+
+ g_free (str);
+}
+
+static void
+track_number_convert (const GstTagList * list, const gchar * tag,
+ guint8 * dst, int maxlen)
+{
+ guint tracknum;
+
+ /* We only support one track number */
+ if (!gst_tag_list_get_uint_index (list, tag, 0, &tracknum))
+ return;
+
+ if (tracknum <= 127)
+ *dst = (guint8) tracknum;
+}
+
+static const struct
+{
+ const gchar *gst_tag;
+ const gint offset;
+ const gint length;
+ const GstId3v1WriteFunc func;
+} v1_funcs[] = {
+ {
+ GST_TAG_TITLE, 3, 30, latin1_convert}, {
+ GST_TAG_ARTIST, 33, 30, latin1_convert}, {
+ GST_TAG_ALBUM, 63, 30, latin1_convert}, {
+ GST_TAG_DATE, 93, 4, date_v1_convert}, {
+ GST_TAG_COMMENT, 97, 28, latin1_convert}, {
+ /* Note: one-byte gap here */
+ GST_TAG_TRACK_NUMBER, 126, 1, track_number_convert}, {
+ GST_TAG_GENRE, 127, 1, genre_v1_convert}
+};
+
+GstBuffer *
+gst_id3mux_render_v1_tag (GstTagMux * mux, GstTagList * taglist)
+{
+ GstBuffer *buf = gst_buffer_new_and_alloc (ID3_V1_TAG_SIZE);
+ guint8 *data = GST_BUFFER_DATA (buf);
+ int i;
+
+ memset (data, 0, ID3_V1_TAG_SIZE);
+
+ data[0] = 'T';
+ data[1] = 'A';
+ data[2] = 'G';
+
+ 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);
+ }
+
+ gst_buffer_set_caps (buf, GST_PAD_CAPS (mux->srcpad));
+ return buf;
+}
diff --git a/gst/flv/gstflvparse.h b/gst/id3tag/id3tag.h
index 203d30de..1fb59376 100644
--- a/gst/flv/gstflvparse.h
+++ b/gst/id3tag/id3tag.h
@@ -1,5 +1,5 @@
-/* GStreamer
- * Copyright (C) <2007> Julien Moutte <julien@moutte.net>
+/* GStreamer ID3v2 tag writer
+ * Copyright (C) 2009 Tim-Philipp Müller <tim centricular net>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -17,26 +17,16 @@
* Boston, MA 02111-1307, USA.
*/
-#ifndef __FLV_PARSE_H__
-#define __FLV_PARSE_H__
-
-#include "gstflvdemux.h"
+#include "gsttagmux.h"
G_BEGIN_DECLS
+#define ID3_VERSION_2_3 3
+#define ID3_VERSION_2_4 4
-GstFlowReturn gst_flv_parse_tag_script (GstFLVDemux * demux,
- GstBuffer *buffer);
-
-GstFlowReturn gst_flv_parse_tag_audio (GstFLVDemux * demux, GstBuffer *buffer);
-
-GstFlowReturn gst_flv_parse_tag_video (GstFLVDemux * demux, GstBuffer *buffer);
-
-GstFlowReturn gst_flv_parse_tag_type (GstFLVDemux * demux, GstBuffer *buffer);
-
-GstFlowReturn gst_flv_parse_header (GstFLVDemux * demux, GstBuffer *buffer);
-
-GstClockTime gst_flv_parse_tag_timestamp (GstFLVDemux *demux, GstBuffer *buffer, size_t *tag_data_size);
+GstBuffer * gst_id3mux_render_v2_tag (GstTagMux * mux, GstTagList * taglist,
+ int version);
+GstBuffer * gst_id3mux_render_v1_tag (GstTagMux * mux, GstTagList * taglist);
G_END_DECLS
-#endif /* __FLV_PARSE_H__ */
+
diff --git a/gst/mpeg4videoparse/mpeg4videoparse.c b/gst/mpeg4videoparse/mpeg4videoparse.c
index 1efa28be..e0e28d0c 100644
--- a/gst/mpeg4videoparse/mpeg4videoparse.c
+++ b/gst/mpeg4videoparse/mpeg4videoparse.c
@@ -726,6 +726,10 @@ gst_mpeg4vparse_cleanup (GstMpeg4VParse * parse)
if (parse->adapter) {
gst_adapter_clear (parse->adapter);
}
+ if (parse->config != NULL) {
+ gst_buffer_unref (parse->config);
+ parse->config = NULL;
+ }
parse->state = PARSE_NEED_START;
parse->have_config = FALSE;
@@ -760,6 +764,10 @@ gst_mpeg4vparse_dispose (GObject * object)
g_object_unref (parse->adapter);
parse->adapter = NULL;
}
+ if (parse->config != NULL) {
+ gst_buffer_unref (parse->config);
+ parse->config = NULL;
+ }
GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
}
diff --git a/gst/mpegdemux/gstmpegdefs.h b/gst/mpegdemux/gstmpegdefs.h
index 7f38f4de..7ad1e25c 100644
--- a/gst/mpegdemux/gstmpegdefs.h
+++ b/gst/mpegdemux/gstmpegdefs.h
@@ -170,7 +170,11 @@
#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
/* Un-official time-code stream */
#define ST_PS_TIMECODE 0xd2
diff --git a/gst/mpegdemux/gstmpegdemux.c b/gst/mpegdemux/gstmpegdemux.c
index 439bb563..ce1d0978 100644
--- a/gst/mpegdemux/gstmpegdemux.c
+++ b/gst/mpegdemux/gstmpegdemux.c
@@ -39,6 +39,7 @@
* Fluendo, S.L. All Rights Reserved.
*
* Contributor(s): Wim Taymans <wim@fluendo.com>
+ * Jan Schmidt <thaytan@noraisin.net>
*/
#ifdef HAVE_CONFIG_H
@@ -56,6 +57,9 @@
#define SCAN_SCR_SZ 12
#define SCAN_PTS_SZ 80
+#define SEGMENT_THRESHOLD (300*GST_MSECOND)
+#define VIDEO_SEGMENT_THRESHOLD (500*GST_MSECOND)
+
typedef enum
{
SCAN_SCR,
@@ -177,6 +181,13 @@ static GstStaticPadTemplate audio_template =
"audio/x-private1-ac3;" "audio/x-private1-dts;" "audio/ac3")
);
+static GstStaticPadTemplate subpicture_template =
+GST_STATIC_PAD_TEMPLATE ("subpicture_%02x",
+ GST_PAD_SRC,
+ GST_PAD_SOMETIMES,
+ GST_STATIC_CAPS ("video/x-dvd-subpicture")
+ );
+
static GstStaticPadTemplate private_template =
GST_STATIC_PAD_TEMPLATE ("private_%d",
GST_PAD_SRC,
@@ -209,6 +220,10 @@ static inline gboolean gst_flups_demux_scan_forward_ts (GstFluPSDemux * demux,
static inline gboolean gst_flups_demux_scan_backward_ts (GstFluPSDemux * demux,
guint64 * pos, SCAN_MODE mode, guint64 * rts);
+static void gst_flups_demux_send_segment_updates (GstFluPSDemux * demux,
+ GstClockTime new_time);
+static void gst_flups_demux_clear_times (GstFluPSDemux * demux);
+
static GstElementClass *parent_class = NULL;
/*static guint gst_flups_demux_signals[LAST_SIGNAL] = { 0 };*/
@@ -250,10 +265,14 @@ gst_flups_demux_base_init (GstFluPSDemuxClass * klass)
klass->sink_template = gst_static_pad_template_get (&sink_template);
klass->video_template = gst_static_pad_template_get (&video_template);
klass->audio_template = gst_static_pad_template_get (&audio_template);
+ klass->subpicture_template =
+ gst_static_pad_template_get (&subpicture_template);
klass->private_template = gst_static_pad_template_get (&private_template);
gst_element_class_add_pad_template (element_class, klass->video_template);
gst_element_class_add_pad_template (element_class, klass->audio_template);
+ gst_element_class_add_pad_template (element_class,
+ klass->subpicture_template);
gst_element_class_add_pad_template (element_class, klass->private_template);
gst_element_class_add_pad_template (element_class, klass->sink_template);
@@ -340,6 +359,7 @@ gst_flups_demux_create_stream (GstFluPSDemux * demux, gint id, gint stream_type)
gchar *name;
GstFluPSDemuxClass *klass = GST_FLUPS_DEMUX_GET_CLASS (demux);
GstCaps *caps;
+ GstClockTime threshold = SEGMENT_THRESHOLD;
name = NULL;
template = NULL;
@@ -368,6 +388,7 @@ gst_flups_demux_create_stream (GstFluPSDemux * demux, gint id, gint stream_type)
caps = gst_caps_new_simple ("video/mpeg",
"mpegversion", G_TYPE_INT, mpeg_version,
"systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
+ threshold = VIDEO_SEGMENT_THRESHOLD;
break;
}
case ST_AUDIO_MPEG1:
@@ -387,6 +408,7 @@ gst_flups_demux_create_stream (GstFluPSDemux * demux, gint id, gint stream_type)
template = klass->video_template;
name = g_strdup_printf ("video_%02x", id);
caps = gst_caps_new_simple ("video/x-h264", NULL);
+ threshold = VIDEO_SEGMENT_THRESHOLD;
break;
case ST_PS_AUDIO_AC3:
template = klass->audio_template;
@@ -404,6 +426,9 @@ gst_flups_demux_create_stream (GstFluPSDemux * demux, gint id, gint stream_type)
caps = gst_caps_new_simple ("audio/x-private1-lpcm", NULL);
break;
case ST_PS_DVD_SUBPICTURE:
+ template = klass->subpicture_template;
+ name = g_strdup_printf ("subpicture_%02x", id);
+ caps = gst_caps_new_simple ("video/x-dvd-subpicture", NULL);
break;
case ST_GST_AUDIO_RAWA52:
template = klass->audio_template;
@@ -424,6 +449,7 @@ gst_flups_demux_create_stream (GstFluPSDemux * demux, gint id, gint stream_type)
stream->notlinked = FALSE;
stream->type = stream_type;
stream->pad = gst_pad_new_from_template (template, name);
+ stream->segment_thresh = threshold;
gst_pad_set_event_function (stream->pad,
GST_DEBUG_FUNCPTR (gst_flups_demux_src_event));
gst_pad_set_query_function (stream->pad,
@@ -559,6 +585,20 @@ gst_flups_demux_send_data (GstFluPSDemux * demux, GstFluPSStream * stream,
GST_TIME_ARGS (demux->src_segment.last_stop),
GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (demux->current_scr)));
+ if (demux->src_segment.last_stop != GST_CLOCK_TIME_NONE) {
+ GstClockTime new_time = demux->base_time + demux->src_segment.last_stop;
+
+ if (stream->last_ts == GST_CLOCK_TIME_NONE || stream->last_ts < new_time) {
+#if 0
+ g_print ("last_ts update on pad %s to time %" GST_TIME_FORMAT "\n",
+ GST_PAD_NAME (stream->pad), GST_TIME_ARGS (cur_scr_time));
+#endif
+ stream->last_ts = new_time;
+ }
+
+ gst_flups_demux_send_segment_updates (demux, new_time);
+ }
+
/* Set the buffer discont flag, and clear discont state on the stream */
if (stream->discont) {
GST_DEBUG_OBJECT (demux, "marking discont buffer");
@@ -731,12 +771,76 @@ gst_flups_demux_flush (GstFluPSDemux * demux)
gst_adapter_clear (demux->adapter);
gst_adapter_clear (demux->rev_adapter);
gst_pes_filter_drain (&demux->filter);
+ gst_flups_demux_clear_times (demux);
demux->adapter_offset = G_MAXUINT64;
demux->current_scr = G_MAXUINT64;
demux->bytes_since_scr = 0;
}
static void
+gst_flups_demux_clear_times (GstFluPSDemux * demux)
+{
+ gint id;
+
+ /* Clear the last ts for all streams */
+ for (id = 0; id < GST_FLUPS_DEMUX_MAX_STREAMS; id++) {
+ GstFluPSStream *stream = demux->streams[id];
+
+ if (stream) {
+ stream->last_seg_start = stream->last_ts = GST_CLOCK_TIME_NONE;
+ }
+ }
+}
+
+static void
+gst_flups_demux_send_segment_updates (GstFluPSDemux * demux,
+ GstClockTime new_time)
+{
+ /* Advance all lagging streams by sending a segment update */
+ gint id;
+ GstEvent *event = NULL;
+
+ /* FIXME: Handle reverse playback */
+
+ if (new_time > demux->src_segment.stop)
+ return;
+
+ for (id = 0; id < GST_FLUPS_DEMUX_MAX_STREAMS; id++) {
+ GstFluPSStream *stream = demux->streams[id];
+
+ if (stream) {
+ if (stream->last_ts == GST_CLOCK_TIME_NONE ||
+ stream->last_ts < demux->src_segment.start)
+ stream->last_ts = demux->src_segment.start;
+ if (stream->last_ts + stream->segment_thresh < new_time) {
+#if 0
+ g_print ("Segment update to pad %s time %" GST_TIME_FORMAT " stop now %"
+ GST_TIME_FORMAT "\n", GST_PAD_NAME (stream->pad),
+ GST_TIME_ARGS (new_time), GST_TIME_ARGS (demux->src_segment.stop));
+#endif
+ GST_DEBUG_OBJECT (demux,
+ "Segment update to pad %s time %" GST_TIME_FORMAT,
+ GST_PAD_NAME (stream->pad), GST_TIME_ARGS (new_time));
+ if (event == NULL) {
+ event = gst_event_new_new_segment_full (TRUE,
+ demux->src_segment.rate, demux->src_segment.applied_rate,
+ GST_FORMAT_TIME, new_time,
+ demux->src_segment.stop,
+ demux->src_segment.time + (new_time - demux->src_segment.start));
+ }
+ gst_event_ref (event);
+ gst_pad_push_event (stream->pad, event);
+ stream->last_seg_start = stream->last_ts = new_time;
+ stream->need_segment = FALSE;
+ }
+ }
+ }
+
+ if (event)
+ gst_event_unref (event);
+}
+
+static void
gst_flups_demux_close_segment (GstFluPSDemux * demux)
{
gint id;
@@ -747,6 +851,10 @@ gst_flups_demux_close_segment (GstFluPSDemux * demux)
&demux->src_segment);
#endif
+ /* FIXME: Need to send a different segment-close to each pad where the
+ * last_seg_start != clock_time_none, as that indicates a sparse-stream
+ * event was sent there */
+
/* Close the current segment for a linear playback */
if (demux->src_segment.rate >= 0) {
/* for forward playback, we played from start to last_stop */
@@ -1306,7 +1414,7 @@ gst_flups_demux_reset_psm (GstFluPSDemux * demux)
FILL_TYPE (0x40, 0x7f, -1);
FILL_TYPE (0x80, 0x87, ST_PS_AUDIO_AC3);
FILL_TYPE (0x88, 0x9f, ST_PS_AUDIO_DTS);
- FILL_TYPE (0xa0, 0xbf, ST_PS_AUDIO_LPCM);
+ FILL_TYPE (0xa0, 0xaf, ST_PS_AUDIO_LPCM);
FILL_TYPE (0xbd, 0xbd, -1);
FILL_TYPE (0xc0, 0xdf, ST_AUDIO_MPEG1);
FILL_TYPE (0xe0, 0xef, ST_GST_VIDEO_MPEG1_OR_2);
@@ -1839,18 +1947,26 @@ gst_flups_demux_data_cb (GstPESFilter * filter, gboolean first,
}
if (G_LIKELY (stream_type == -1)) {
- /* new id */
+ /* new id is in the first byte */
id = data[offset++];
- /* Number of audio frames in this packet */
- nframes = data[offset++];
-
- GST_DEBUG_OBJECT (demux, "private type 0x%02x, %d frames", id,
- nframes);
-
- datalen -= 2;
+ datalen--;
/* and remap */
stream_type = demux->psm[id];
+
+ /* Now, if it's a subpicture stream - no more, otherwise
+ * take the first byte too, since it's the frame count in audio
+ * streams and our backwards compat convention is to strip it off */
+ if (stream_type != ST_PS_DVD_SUBPICTURE) {
+ /* Number of audio frames in this packet */
+ nframes = data[offset++];
+ datalen--;
+ GST_DEBUG_OBJECT (demux, "private type 0x%02x, %d frames", id,
+ nframes);
+ } else {
+ GST_DEBUG_OBJECT (demux, "private type 0x%02x, stream type %d", id,
+ stream_type);
+ }
}
}
if (stream_type == -1)
diff --git a/gst/mpegdemux/gstmpegdemux.h b/gst/mpegdemux/gstmpegdemux.h
index ef175f76..29b3d5e5 100644
--- a/gst/mpegdemux/gstmpegdemux.h
+++ b/gst/mpegdemux/gstmpegdemux.h
@@ -86,6 +86,10 @@ struct _GstFluPSStream
gint type;
gint size_bound;
+ GstClockTime segment_thresh;
+ GstClockTime last_seg_start;
+ GstClockTime last_ts;
+
gboolean discont;
gboolean notlinked;
gboolean need_segment;
@@ -149,6 +153,7 @@ struct _GstFluPSDemuxClass
GstPadTemplate *sink_template;
GstPadTemplate *video_template;
GstPadTemplate *audio_template;
+ GstPadTemplate *subpicture_template;
GstPadTemplate *private_template;
};
diff --git a/gst/mpegdemux/gstmpegtsdemux.c b/gst/mpegdemux/gstmpegtsdemux.c
index 4464cdf8..ef0de2c8 100644
--- a/gst/mpegdemux/gstmpegtsdemux.c
+++ b/gst/mpegdemux/gstmpegtsdemux.c
@@ -34,9 +34,9 @@
*
* The Original Code is Fluendo MPEG Demuxer plugin.
*
- * The Initial Developer of the Original Code is Fluendo, S.L.
- * Portions created by Fluendo, S.L. are Copyright (C) 2005
- * Fluendo, S.L. All Rights Reserved.
+ * The Initial Developer of the Original Code is Fluendo, S.A.
+ * Portions created by Fluendo, S.L. are Copyright (C) 2005,2006,2007,2008,2009
+ * Fluendo, S.A. All Rights Reserved.
*
* Contributor(s): Wim Taymans <wim@fluendo.com>
*/
@@ -126,6 +126,13 @@ enum
PROP_M2TS
};
+#define GSTTIME_TO_BYTES(time) \
+ ((time != -1) ? gst_util_uint64_scale (MAX(0,(gint64) ((time))), \
+ demux->bitrate, GST_SECOND) : -1)
+#define BYTES_TO_GSTTIME(bytes) \
+ ((bytes != -1) ? (gst_util_uint64_scale (bytes, GST_SECOND, \
+ demux->bitrate)) : -1)
+
#define VIDEO_CAPS \
GST_STATIC_CAPS (\
"video/mpeg, " \
@@ -150,6 +157,10 @@ enum
"audio/x-dts" \
)
+/* Can also use the subpicture pads for text subtitles? */
+#define SUBPICTURE_CAPS \
+ GST_STATIC_CAPS ("subpicture/x-pgs; video/x-dvd-subpicture")
+
static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
@@ -168,6 +179,12 @@ GST_STATIC_PAD_TEMPLATE ("audio_%04x",
GST_PAD_SOMETIMES,
AUDIO_CAPS);
+static GstStaticPadTemplate subpicture_template =
+GST_STATIC_PAD_TEMPLATE ("subpicture_%04x",
+ GST_PAD_SRC,
+ GST_PAD_SOMETIMES,
+ SUBPICTURE_CAPS);
+
static GstStaticPadTemplate private_template =
GST_STATIC_PAD_TEMPLATE ("private_%04x",
GST_PAD_SRC,
@@ -189,6 +206,7 @@ static void gst_mpegts_demux_get_property (GObject * object, guint prop_id,
static gboolean gst_mpegts_demux_is_PMT (GstMpegTSDemux * demux, guint16 PID);
static gboolean gst_mpegts_demux_sink_event (GstPad * pad, GstEvent * event);
+static gboolean gst_mpegts_demux_src_event (GstPad * pad, GstEvent * event);
static GstFlowReturn gst_mpegts_demux_chain (GstPad * pad, GstBuffer * buffer);
static gboolean gst_mpegts_demux_sink_setcaps (GstPad * pad, GstCaps * caps);
@@ -242,10 +260,14 @@ gst_mpegts_demux_base_init (GstMpegTSDemuxClass * klass)
klass->sink_template = gst_static_pad_template_get (&sink_template);
klass->video_template = gst_static_pad_template_get (&video_template);
klass->audio_template = gst_static_pad_template_get (&audio_template);
+ klass->subpicture_template =
+ gst_static_pad_template_get (&subpicture_template);
klass->private_template = gst_static_pad_template_get (&private_template);
gst_element_class_add_pad_template (element_class, klass->video_template);
gst_element_class_add_pad_template (element_class, klass->audio_template);
+ gst_element_class_add_pad_template (element_class,
+ klass->subpicture_template);
gst_element_class_add_pad_template (element_class, klass->private_template);
gst_element_class_add_pad_template (element_class, klass->sink_template);
@@ -327,7 +349,12 @@ gst_mpegts_demux_init (GstMpegTSDemux * demux)
demux->m2ts_mode = FALSE;
demux->sync_lut = NULL;
demux->sync_lut_len = 0;
-
+ demux->bitrate = -1;
+ demux->num_packets = 0;
+ demux->pcr[0] = -1;
+ demux->pcr[1] = -1;
+ demux->cache_duration = GST_CLOCK_TIME_NONE;
+ demux->base_pts = GST_CLOCK_TIME_NONE;
#ifdef USE_LIBOIL
oil_init ();
#endif
@@ -369,8 +396,8 @@ gst_mpegts_demux_reset (GstMpegTSDemux * demux)
case PID_TYPE_ELEMENTARY:
gst_pes_filter_uninit (&stream->filter);
break;
- case PID_PROGRAM_ASSOCIATION_TABLE:
- case PID_CONDITIONAL_ACCESS_TABLE:
+ case PID_TYPE_PROGRAM_ASSOCIATION:
+ case PID_TYPE_CONDITIONAL_ACCESS:
case PID_TYPE_PROGRAM_MAP:
gst_section_filter_uninit (&stream->section_filter);
break;
@@ -607,6 +634,16 @@ gst_mpegts_demux_fill_stream (GstMpegTSStream * stream, guint8 id,
caps = gst_caps_new_simple ("private/teletext", NULL);
}
break;
+ case ST_HDV_PRIVATE_A0:
+ template = klass->private_template;
+ name = g_strdup_printf ("private_%04x", stream->PID);
+ caps = gst_caps_new_simple ("private/hdv-a0", NULL);
+ break;
+ case ST_HDV_PRIVATE_A1:
+ template = klass->private_template;
+ name = g_strdup_printf ("private_%04x", stream->PID);
+ caps = gst_caps_new_simple ("private/hdv-a1", NULL);
+ break;
case ST_PRIVATE_SECTIONS:
case ST_MHEG:
case ST_DSMCC:
@@ -652,6 +689,14 @@ gst_mpegts_demux_fill_stream (GstMpegTSStream * stream, guint8 id,
caps = gst_caps_new_simple ("audio/x-lpcm", NULL);
break;
case ST_PS_DVD_SUBPICTURE:
+ template = klass->subpicture_template;
+ name = g_strdup_printf ("subpicture_%04x", stream->PID);
+ caps = gst_caps_new_simple ("video/x-dvd-subpicture", NULL);
+ break;
+ case ST_BD_PGS_SUBPICTURE:
+ template = klass->subpicture_template;
+ name = g_strdup_printf ("subpicture_%04x", stream->PID);
+ caps = gst_caps_new_simple ("subpicture/x-pgs", NULL);
break;
default:
break;
@@ -668,6 +713,8 @@ gst_mpegts_demux_fill_stream (GstMpegTSStream * stream, guint8 id,
gst_caps_unref (caps);
gst_pad_set_query_function (stream->pad,
GST_DEBUG_FUNCPTR (gst_mpegts_demux_src_pad_query));
+ gst_pad_set_event_function (stream->pad,
+ GST_DEBUG_FUNCPTR (gst_mpegts_demux_src_event));
g_free (name);
return TRUE;
@@ -730,7 +777,7 @@ gst_mpegts_demux_send_new_segment (GstMpegTSDemux * demux,
}
base_PCR = PCR_stream->base_PCR;
- time = MPEGTIME_TO_GSTTIME (base_PCR);
+ demux->base_pts = time = MPEGTIME_TO_GSTTIME (base_PCR);
GST_DEBUG_OBJECT (demux, "segment PTS to (%" G_GUINT64_FORMAT ") time: %"
G_GUINT64_FORMAT, base_PCR, time);
@@ -828,7 +875,7 @@ gst_mpegts_demux_data_cb (GstPESFilter * filter, gboolean first,
demux = stream->demux;
srcpad = stream->pad;
- GST_LOG_OBJECT (demux, "got data on PID 0x%04x", stream->PID);
+ GST_DEBUG_OBJECT (demux, "got data on PID 0x%04x", stream->PID);
if (first && filter->pts != -1) {
pts = filter->pts;
@@ -932,7 +979,7 @@ gst_mpegts_demux_data_cb (GstPESFilter * filter, gboolean first,
pts = -1;
}
- GST_LOG_OBJECT (demux, "setting PTS to (%" G_GUINT64_FORMAT ") time: %"
+ GST_DEBUG_OBJECT (demux, "setting PTS to (%" G_GUINT64_FORMAT ") time: %"
GST_TIME_FORMAT " on buffer %p first buffer: %d base_time: %"
GST_TIME_FORMAT, pts, GST_TIME_ARGS (time), buffer, first,
GST_TIME_ARGS (stream->base_time));
@@ -967,8 +1014,8 @@ gst_mpegts_demux_data_cb (GstPESFilter * filter, gboolean first,
goto unknown_type;
GST_DEBUG_OBJECT (demux,
- "New stream 0x%04x of type %d with caps %" GST_PTR_FORMAT, stream->PID,
- stream->stream_type, GST_PAD_CAPS (stream->pad));
+ "New stream 0x%04x of type 0x%02x with caps %" GST_PTR_FORMAT,
+ stream->PID, stream->stream_type, GST_PAD_CAPS (stream->pad));
srcpad = stream->pad;
@@ -981,7 +1028,7 @@ gst_mpegts_demux_data_cb (GstPESFilter * filter, gboolean first,
gst_mpegts_demux_send_new_segment (demux, stream, pts);
}
- GST_DEBUG_OBJECT (demux, "pushing buffer");
+ GST_DEBUG_OBJECT (srcpad, "pushing buffer");
gst_buffer_set_caps (buffer, GST_PAD_CAPS (srcpad));
ret = gst_pad_push (srcpad, buffer);
ret = gst_mpegts_demux_combine_flows (demux, stream, ret);
@@ -992,7 +1039,7 @@ gst_mpegts_demux_data_cb (GstPESFilter * filter, gboolean first,
unknown_type:
{
GST_DEBUG_OBJECT (demux, "got unknown stream id 0x%02x, type 0x%02x",
- filter->id, filter->type);
+ filter->id, stream->stream_type);
gst_buffer_unref (buffer);
return gst_mpegts_demux_combine_flows (demux, stream, GST_FLOW_NOT_LINKED);
}
@@ -1184,16 +1231,16 @@ gst_mpegts_stream_parse_pmt (GstMpegTSStream * stream,
if (gst_mpegts_demux_calc_crc32 (data - 3, datalen) != 0)
goto wrong_crc;
- GST_DEBUG_OBJECT (demux, "PMT section_length: %d", datalen - 3);
+ GST_LOG_OBJECT (demux, "PMT section_length: %d", datalen - 3);
PMT = &stream->PMT;
/* check if version number changed */
version_number = (data[2] & 0x3e) >> 1;
- GST_DEBUG_OBJECT (demux, "PMT version_number: %d", version_number);
+ GST_LOG_OBJECT (demux, "PMT version_number: %d", version_number);
current_next_indicator = (data[2] & 0x01);
- GST_DEBUG_OBJECT (demux, "PMT current_next_indicator %d",
+ GST_LOG_OBJECT (demux, "PMT current_next_indicator %d",
current_next_indicator);
if (current_next_indicator == 0)
goto not_yet_applicable;
@@ -1559,7 +1606,7 @@ gst_mpegts_demux_parse_adaptation_field (GstMpegTSStream * stream,
if (length > 0) {
guint8 flags = *data++;
- GST_DEBUG_OBJECT (demux, "flags 0x%02x", flags);
+ GST_LOG_OBJECT (demux, "flags 0x%02x", flags);
/* discontinuity flag */
if (flags & 0x80) {
GST_DEBUG_OBJECT (demux, "discontinuity flag set");
@@ -1578,9 +1625,12 @@ gst_mpegts_demux_parse_adaptation_field (GstMpegTSStream * stream,
pcr_ext = (pcr2 & 0x01ff);
if (pcr_ext)
pcr = (pcr * 300 + pcr_ext % 300) / 300;
- GST_DEBUG_OBJECT (demux, "have PCR %" G_GUINT64_FORMAT " on PID 0x%04x "
- "and last pcr is %" G_GUINT64_FORMAT,
- pcr, stream->PID, stream->last_PCR);
+ GST_DEBUG_OBJECT (demux,
+ "have PCR %" G_GUINT64_FORMAT "(%" GST_TIME_FORMAT ") on PID 0x%04x "
+ "and last pcr is %" G_GUINT64_FORMAT " (%" GST_TIME_FORMAT ")", pcr,
+ GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (pcr)), stream->PID,
+ stream->last_PCR,
+ GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (stream->last_PCR)));
/* pcr has been converted into units of 90Khz ticks
* so assume discont if last pcr was > 900000 (10 second) lower */
if (stream->last_PCR != -1 &&
@@ -1676,11 +1726,24 @@ gst_mpegts_demux_parse_adaptation_field (GstMpegTSStream * stream,
}
stream->last_PCR_difference = pcr - stream->last_PCR;
}
+
GST_DEBUG_OBJECT (demux,
"valid pcr: %d last PCR difference: %" G_GUINT64_FORMAT, valid_pcr,
stream->last_PCR_difference);
if (valid_pcr) {
-
+ GstMpegTSStream *PMT_stream = demux->streams[demux->current_PMT];
+
+ if (PMT_stream && PMT_stream->PMT.PCR_PID == stream->PID) {
+ if (demux->pcr[0] == -1) {
+ GST_DEBUG ("RECORDING pcr[0]:%" G_GUINT64_FORMAT, pcr);
+ demux->pcr[0] = pcr;
+ demux->num_packets = 0;
+ } /* Considering a difference of 1 sec ie 90000 ticks */
+ else if (demux->pcr[1] == -1 && ((pcr - demux->pcr[0]) >= 90000)) {
+ GST_DEBUG ("RECORDING pcr[1]:%" G_GUINT64_FORMAT, pcr);
+ demux->pcr[1] = pcr;
+ }
+ }
stream->last_PCR = pcr;
if (demux->clock && demux->clock_base != GST_CLOCK_TIME_NONE) {
@@ -1955,15 +2018,20 @@ gst_mpegts_demux_is_PMT (GstMpegTSDemux * demux, guint16 PID)
}
static FORCE_INLINE GstFlowReturn
-gst_mpegts_stream_pes_buffer_flush (GstMpegTSStream * stream)
+gst_mpegts_stream_pes_buffer_flush (GstMpegTSStream * stream, gboolean discard)
{
GstFlowReturn ret = GST_FLOW_OK;
if (stream->pes_buffer) {
- GST_BUFFER_SIZE (stream->pes_buffer) = stream->pes_buffer_used;
- ret = gst_pes_filter_push (&stream->filter, stream->pes_buffer);
- if (ret == GST_FLOW_LOST_SYNC)
+ if (discard) {
+ gst_buffer_unref (stream->pes_buffer);
stream->pes_buffer_in_sync = FALSE;
+ } else {
+ GST_BUFFER_SIZE (stream->pes_buffer) = stream->pes_buffer_used;
+ ret = gst_pes_filter_push (&stream->filter, stream->pes_buffer);
+ if (ret == GST_FLOW_LOST_SYNC)
+ stream->pes_buffer_in_sync = FALSE;
+ }
stream->pes_buffer = NULL;
}
return ret;
@@ -1985,7 +2053,7 @@ gst_mpegts_stream_pes_buffer_push (GstMpegTSStream * stream,
if (stream->pes_buffer_size < (MPEGTS_MAX_PES_BUFFER_SIZE >> 1))
stream->pes_buffer_size <<= 1;
- ret = gst_mpegts_stream_pes_buffer_flush (stream);
+ ret = gst_mpegts_stream_pes_buffer_flush (stream, FALSE);
if (ret == GST_FLOW_LOST_SYNC)
goto done;
}
@@ -2010,7 +2078,7 @@ done:
}
static FORCE_INLINE GstFlowReturn
-gst_mpegts_demux_pes_buffer_flush (GstMpegTSDemux * demux)
+gst_mpegts_demux_pes_buffer_flush (GstMpegTSDemux * demux, gboolean discard)
{
gint i;
GstFlowReturn ret = GST_FLOW_OK;
@@ -2018,7 +2086,7 @@ gst_mpegts_demux_pes_buffer_flush (GstMpegTSDemux * demux)
for (i = 0; i < MPEGTS_MAX_PID + 1; i++) {
GstMpegTSStream *stream = demux->streams[i];
if (stream && stream->pad) {
- gst_mpegts_stream_pes_buffer_flush (stream);
+ gst_mpegts_stream_pes_buffer_flush (stream, discard);
stream->pes_buffer_in_sync = FALSE;
}
}
@@ -2093,7 +2161,7 @@ gst_mpegts_demux_parse_stream (GstMpegTSDemux * demux, GstMpegTSStream * stream,
data += 3;
datalen -= 3;
- GST_DEBUG_OBJECT (demux, "afc 0x%x, pusi %d, PID 0x%04x datalen %u",
+ GST_LOG_OBJECT (demux, "afc 0x%x, pusi %d, PID 0x%04x datalen %u",
adaptation_field_control, payload_unit_start_indicator, PID, datalen);
ret = GST_FLOW_OK;
@@ -2115,13 +2183,12 @@ gst_mpegts_demux_parse_stream (GstMpegTSDemux * demux, GstMpegTSStream * stream,
data += consumed;
datalen -= consumed;
- GST_DEBUG_OBJECT (demux, "consumed: %u datalen: %u", consumed, datalen);
+ GST_LOG_OBJECT (demux, "consumed: %u datalen: %u", consumed, datalen);
}
/* If this packet has a payload, handle it */
if (adaptation_field_control & 0x1) {
- GST_DEBUG_OBJECT (demux, "Packet payload %d bytes, PID 0x%04x", datalen,
- PID);
+ GST_LOG_OBJECT (demux, "Packet payload %d bytes, PID 0x%04x", datalen, PID);
/* For unknown streams, check if the PID is in the partial PIDs
* list as an elementary stream and override the type if so
@@ -2233,7 +2300,7 @@ gst_mpegts_demux_parse_stream (GstMpegTSDemux * demux, GstMpegTSStream * stream,
"bytes of %u bytes in the PES buffer",
PID, stream->pes_buffer_used, stream->pes_buffer_size);
/* Flush buffered PES data */
- gst_mpegts_stream_pes_buffer_flush (stream);
+ gst_mpegts_stream_pes_buffer_flush (stream, FALSE);
gst_pes_filter_drain (&stream->filter);
/* Resize the buffer to half if no overflow detected and
* had been used less than half of it */
@@ -2302,7 +2369,7 @@ static FORCE_INLINE GstFlowReturn
gst_mpegts_demux_parse_transport_packet (GstMpegTSDemux * demux,
const guint8 * data)
{
- GstFlowReturn ret;
+ GstFlowReturn ret = GST_FLOW_OK;
guint16 PID;
GstMpegTSStream *stream;
@@ -2312,6 +2379,10 @@ gst_mpegts_demux_parse_transport_packet (GstMpegTSDemux * demux,
/* get PID */
PID = ((data[0] & 0x1f) << 8) | data[1];
+ /* Skip NULL packets */
+ if (G_UNLIKELY (PID == 0x1fff))
+ goto beach;
+
/* get the stream. */
stream = gst_mpegts_demux_get_stream_for_PID (demux, PID);
@@ -2319,12 +2390,153 @@ gst_mpegts_demux_parse_transport_packet (GstMpegTSDemux * demux,
ret = gst_mpegts_demux_parse_stream (demux, stream, data,
MPEGTS_NORMAL_TS_PACKETSIZE - 1);
+ if (demux->pcr[1] != -1 && demux->bitrate == -1) {
+ guint64 bitrate;
+ GST_DEBUG_OBJECT (demux, "pcr[0]:%" G_GUINT64_FORMAT, demux->pcr[0]);
+ GST_DEBUG_OBJECT (demux, "pcr[1]:%" G_GUINT64_FORMAT, demux->pcr[1]);
+ GST_DEBUG_OBJECT (demux, "diff in time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (demux->pcr[1] - demux->pcr[0])));
+ GST_DEBUG_OBJECT (demux, "stream->last_PCR_difference: %" G_GUINT64_FORMAT
+ ", demux->num_packets %" G_GUINT64_FORMAT,
+ demux->pcr[1] - demux->pcr[0], demux->num_packets);
+ bitrate = gst_util_uint64_scale (GST_SECOND,
+ MPEGTS_NORMAL_TS_PACKETSIZE * demux->num_packets,
+ MPEGTIME_TO_GSTTIME (demux->pcr[1] - demux->pcr[0]));
+ /* somehow... I doubt a bitrate below one packet per second is valid */
+ if (bitrate > MPEGTS_NORMAL_TS_PACKETSIZE - 1) {
+ demux->bitrate = bitrate;
+ GST_DEBUG_OBJECT (demux, "bitrate is %" G_GINT64_FORMAT
+ " bytes per second", demux->bitrate);
+ } else {
+ GST_WARNING_OBJECT (demux, "Couldn't compute valid bitrate, recomputing");
+ demux->pcr[0] = demux->pcr[1] = -1;
+ demux->num_packets = -1;
+ }
+ }
+
+beach:
+ demux->num_packets++;
return ret;
/* ERRORS */
}
static gboolean
+gst_mpegts_demux_handle_seek_push (GstMpegTSDemux * demux, GstEvent * event)
+{
+ gboolean res = FALSE;
+ gdouble rate;
+ GstFormat format;
+ GstSeekFlags flags;
+ GstSeekType start_type, stop_type;
+ gint64 start, stop, bstart, bstop;
+ GstEvent *bevent;
+
+ gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start,
+ &stop_type, &stop);
+
+ GST_DEBUG_OBJECT (demux, "seek event, rate: %f start: %" GST_TIME_FORMAT
+ " stop: %" GST_TIME_FORMAT, rate, GST_TIME_ARGS (start),
+ GST_TIME_ARGS (stop));
+
+ if (format == GST_FORMAT_BYTES) {
+ GST_DEBUG_OBJECT (demux, "seek not supported on format %d", format);
+ goto beach;
+ }
+
+ GST_DEBUG_OBJECT (demux, "seek - trying directly upstream first");
+
+ /* first try original format seek */
+ res = gst_pad_push_event (demux->sinkpad, gst_event_ref (event));
+ if (res == TRUE)
+ goto beach;
+ GST_DEBUG_OBJECT (demux, "seek - no upstream");
+
+ if (format != GST_FORMAT_TIME) {
+ /* From here down, we only support time based seeks */
+ GST_DEBUG_OBJECT (demux, "seek not supported on format %d", format);
+ goto beach;
+ }
+
+ /* We need to convert to byte based seek and we need a scr_rate for that. */
+ if (demux->bitrate == -1) {
+ GST_DEBUG_OBJECT (demux, "seek not possible, no bitrate");
+ goto beach;
+ }
+
+ GST_DEBUG_OBJECT (demux, "try with bitrate");
+
+ bstart = GSTTIME_TO_BYTES (start);
+ bstop = GSTTIME_TO_BYTES (stop);
+
+ GST_DEBUG_OBJECT (demux, "in bytes bstart %" G_GINT64_FORMAT " bstop %"
+ G_GINT64_FORMAT, bstart, bstop);
+ bevent = gst_event_new_seek (rate, GST_FORMAT_BYTES, flags, start_type,
+ bstart, stop_type, bstop);
+
+ res = gst_pad_push_event (demux->sinkpad, bevent);
+
+beach:
+ gst_event_unref (event);
+ return res;
+}
+
+static gboolean
+gst_mpegts_demux_src_event (GstPad * pad, GstEvent * event)
+{
+ GstMpegTSDemux *demux = GST_MPEGTS_DEMUX (gst_pad_get_parent (pad));
+ gboolean res = FALSE;
+
+ GST_DEBUG_OBJECT (demux, "got event %s",
+ gst_event_type_get_name (GST_EVENT_TYPE (event)));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEEK:
+ res = gst_mpegts_demux_handle_seek_push (demux, event);
+ break;
+ default:
+ res = gst_pad_push_event (demux->sinkpad, event);
+ break;
+ }
+
+ gst_object_unref (demux);
+
+ return res;
+}
+
+static void
+gst_mpegts_demux_flush (GstMpegTSDemux * demux, gboolean discard)
+{
+ GstMpegTSStream *PCR_stream;
+ GstMpegTSStream *PMT_stream;
+
+ GST_DEBUG_OBJECT (demux, "flushing MPEG TS demuxer (discard %d)", discard);
+
+ /* Start by flushing internal buffers */
+ gst_mpegts_demux_pes_buffer_flush (demux, discard);
+
+ /* Clear adapter */
+ gst_adapter_clear (demux->adapter);
+
+ /* Try resetting the last_PCR value as we will have a discont */
+ if (demux->current_PMT == 0)
+ goto beach;
+
+ PMT_stream = demux->streams[demux->current_PMT];
+ if (PMT_stream == NULL)
+ goto beach;
+
+ PCR_stream = demux->streams[PMT_stream->PMT.PCR_PID];
+ if (PCR_stream == NULL)
+ goto beach;
+
+ PCR_stream->last_PCR = -1;
+
+beach:
+ return;
+}
+
+static gboolean
gst_mpegts_demux_send_event (GstMpegTSDemux * demux, GstEvent * event)
{
gint i;
@@ -2347,7 +2559,7 @@ static gboolean
gst_mpegts_demux_sink_event (GstPad * pad, GstEvent * event)
{
GstMpegTSDemux *demux = GST_MPEGTS_DEMUX (gst_pad_get_parent (pad));
- gboolean res;
+ gboolean res = FALSE;
GST_DEBUG_OBJECT (demux, "got event %s",
gst_event_type_get_name (GST_EVENT_TYPE (event)));
@@ -2358,11 +2570,11 @@ gst_mpegts_demux_sink_event (GstPad * pad, GstEvent * event)
break;
case GST_EVENT_FLUSH_STOP:
gst_adapter_clear (demux->adapter);
+ gst_mpegts_demux_flush (demux, TRUE);
res = gst_mpegts_demux_send_event (demux, event);
break;
case GST_EVENT_EOS:
- /* Flush buffered PES data */
- gst_mpegts_demux_pes_buffer_flush (demux);
+ gst_mpegts_demux_flush (demux, FALSE);
/* Send the EOS event on each stream */
if (!(res = gst_mpegts_demux_send_event (demux, event))) {
/* we have no streams */
@@ -2371,15 +2583,46 @@ gst_mpegts_demux_sink_event (GstPad * pad, GstEvent * event)
}
break;
case GST_EVENT_NEWSEGMENT:
- res = gst_mpegts_demux_send_event (demux, event);
+ {
+ gboolean update;
+ gdouble rate;
+ GstFormat format;
+ gint64 start, stop, time;
+
+ gst_event_parse_new_segment (event, &update, &rate, &format,
+ &start, &stop, &time);
+
+ gst_event_unref (event);
+ GST_INFO_OBJECT (demux, "received new segment: rate %g "
+ "format %d, start: %" G_GINT64_FORMAT ", stop: %" G_GINT64_FORMAT
+ ", time: %" G_GINT64_FORMAT, rate, format, start, stop, time);
+ if (format == GST_FORMAT_BYTES && demux->bitrate != -1) {
+ gint64 tstart = 0, tstop = 0, pos = 0;
+
+ if (demux->base_pts != GST_CLOCK_TIME_NONE) {
+ tstart = tstop = demux->base_pts;
+ }
+ tstart += BYTES_TO_GSTTIME (start);
+ tstop += BYTES_TO_GSTTIME (stop);
+ pos = BYTES_TO_GSTTIME (time);
+
+ event = gst_event_new_new_segment (update, rate,
+ GST_FORMAT_TIME, tstart, tstop, pos);
+ GST_DEBUG_OBJECT (demux, "pushing time newsegment from %"
+ GST_TIME_FORMAT " to %" GST_TIME_FORMAT " pos %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (tstart), GST_TIME_ARGS (tstop), GST_TIME_ARGS (pos));
+
+ res = gst_mpegts_demux_send_event (demux, event);
+ }
break;
+ }
default:
res = gst_mpegts_demux_send_event (demux, event);
break;
}
gst_object_unref (demux);
- return TRUE;
+ return res;
}
static gboolean
@@ -2415,8 +2658,7 @@ gst_mpegts_demux_provide_clock (GstElement * element)
"MpegTSClock", NULL);
demux->clock_base = GST_CLOCK_TIME_NONE;
}
-
- return demux->clock;
+ return gst_object_ref (demux->clock);
}
return NULL;
@@ -2455,21 +2697,54 @@ gst_mpegts_demux_src_pad_query (GstPad * pad, GstQuery * query)
case GST_QUERY_DURATION:
{
GstFormat format;
- gint64 duration;
+ GstPad *peer;
- gst_query_parse_duration (query, &format, &duration);
+ gst_query_parse_duration (query, &format, NULL);
- if (format == GST_FORMAT_BYTES) {
- res = FALSE;
- } else {
- res = gst_pad_query_default (pad, query);
+ /* Try query upstream first */
+ peer = gst_pad_get_peer (demux->sinkpad);
+ if (peer) {
+ res = gst_pad_query (peer, query);
+ /* Try doing something with that query if it failed */
+ if (!res && format == GST_FORMAT_TIME && demux->bitrate != -1) {
+ /* Try using cache first */
+ if (GST_CLOCK_TIME_IS_VALID (demux->cache_duration)) {
+ GST_LOG_OBJECT (demux, "replying duration query from cache %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (demux->cache_duration));
+ gst_query_set_duration (query, GST_FORMAT_TIME,
+ demux->cache_duration);
+ res = TRUE;
+ } else { /* Query upstream and approximate */
+ GstQuery *bquery = gst_query_new_duration (GST_FORMAT_BYTES);
+ gint64 duration = 0;
+
+ /* Query peer for duration in bytes */
+ res = gst_pad_query (peer, bquery);
+ if (res) {
+ /* Convert to time format */
+ gst_query_parse_duration (bquery, &format, &duration);
+ GST_DEBUG_OBJECT (demux, "query on peer pad reported bytes %"
+ G_GUINT64_FORMAT, duration);
+ demux->cache_duration = BYTES_TO_GSTTIME (duration);
+ GST_DEBUG_OBJECT (demux, "converted to time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (demux->cache_duration));
+ gst_query_set_duration (query, GST_FORMAT_TIME,
+ demux->cache_duration);
+ }
+ gst_query_unref (bquery);
+ }
+ } else {
+ GST_WARNING_OBJECT (demux, "unsupported query format or no bitrate "
+ "yet to approximate duration from bytes");
+ }
+ gst_object_unref (peer);
}
-
break;
}
default:
res = gst_pad_query_default (pad, query);
}
+ gst_object_unref (demux);
return res;
}
@@ -2554,9 +2829,7 @@ gst_mpegts_demux_chain (GstPad * pad, GstBuffer * buffer)
guint sync_count;
if (GST_BUFFER_IS_DISCONT (buffer)) {
- /* Flush buffered PES data */
- gst_mpegts_demux_pes_buffer_flush (demux);
- gst_adapter_clear (demux->adapter);
+ gst_mpegts_demux_flush (demux, FALSE);
}
/* first push the new buffer into the adapter */
gst_adapter_push (demux->adapter, buffer);
diff --git a/gst/mpegdemux/gstmpegtsdemux.h b/gst/mpegdemux/gstmpegtsdemux.h
index 8a4ca3d2..fde68926 100644
--- a/gst/mpegdemux/gstmpegtsdemux.h
+++ b/gst/mpegdemux/gstmpegtsdemux.h
@@ -34,9 +34,9 @@
*
* The Original Code is Fluendo MPEG Demuxer plugin.
*
- * The Initial Developer of the Original Code is Fluendo, S.L.
- * Portions created by Fluendo, S.L. are Copyright (C) 2005
- * Fluendo, S.L. All Rights Reserved.
+ * The Initial Developer of the Original Code is Fluendo, S.A.
+ * Portions created by Fluendo, S.A. are Copyright (C) 2005,2006,2007,2008,2009
+ * Fluendo, S.A. All Rights Reserved.
*
* Contributor(s): Wim Taymans <wim@fluendo.com>
*/
@@ -205,6 +205,21 @@ struct _GstMpegTSDemux {
/* clocking */
GstClock * clock;
GstClockTime clock_base;
+
+ /* Additional information required for seeking.
+ * num_packets: Number of packets outputted
+ * bitrate: estimated bitrate (based on pcr and num_packets */
+ guint64 num_packets;
+ gint64 bitrate;
+
+ /* Two PCRs observations to calculate bitrate */
+ guint64 pcr[2];
+
+ /* Cached duration estimation */
+ GstClockTime cache_duration;
+
+ /* Cached base_PCR in GStreamer time. */
+ GstClockTime base_pts;
};
struct _GstMpegTSDemuxClass {
@@ -213,6 +228,7 @@ struct _GstMpegTSDemuxClass {
GstPadTemplate * sink_template;
GstPadTemplate * video_template;
GstPadTemplate * audio_template;
+ GstPadTemplate * subpicture_template;
GstPadTemplate * private_template;
};
diff --git a/gst/mpegdemux/gstpesfilter.c b/gst/mpegdemux/gstpesfilter.c
index 1295a193..b520c766 100644
--- a/gst/mpegdemux/gstpesfilter.c
+++ b/gst/mpegdemux/gstpesfilter.c
@@ -167,6 +167,9 @@ gst_pes_filter_parse (GstPESFilter * filter)
avail = MIN (avail, filter->length + 6);
}
+ if (avail < 7)
+ goto need_more_data;
+
/* read more data, either the whole packet if there is a length
* or whatever we have available if this in an unbounded packet. */
if (!(data = gst_adapter_peek (filter->adapter, avail)))
@@ -189,7 +192,8 @@ gst_pes_filter_parse (GstPESFilter * filter)
case ID_PROGRAM_STREAM_DIRECTORY:
case ID_DSMCC_STREAM:
case ID_ITU_TREC_H222_TYPE_E_STREAM:
- goto skip;
+ /* Push directly out */
+ goto push_out;
case ID_PADDING_STREAM:
GST_DEBUG ("skipping padding stream");
goto skip;
@@ -197,9 +201,6 @@ gst_pes_filter_parse (GstPESFilter * filter)
break;
}
- if (datalen < 1)
- goto need_more_data;
-
filter->pts = filter->dts = -1;
/* stuffing bits, first two bits are '10' for mpeg2 pes so this code is
@@ -404,6 +405,7 @@ gst_pes_filter_parse (GstPESFilter * filter)
goto lost_sync;
}
+push_out:
{
GstBuffer *out;
guint16 consumed;
@@ -563,14 +565,8 @@ gst_pes_filter_process (GstPESFilter * filter)
ret = GST_FLOW_OK;
} else {
GstBuffer *out;
- guint8 *data;
-
- data = gst_adapter_take (filter->adapter, avail);
- out = gst_buffer_new ();
- GST_BUFFER_DATA (out) = data;
- GST_BUFFER_SIZE (out) = avail;
- GST_BUFFER_MALLOCDATA (out) = data;
+ out = gst_adapter_take_buffer (filter->adapter, avail);
ret = gst_pes_filter_data_push (filter, filter->first, out);
filter->first = FALSE;
diff --git a/gst/mpegdemux/gstpesfilter.h b/gst/mpegdemux/gstpesfilter.h
index b35d8746..ccc8461d 100644
--- a/gst/mpegdemux/gstpesfilter.h
+++ b/gst/mpegdemux/gstpesfilter.h
@@ -84,8 +84,6 @@ struct _GstPESFilter {
gboolean unbounded_packet;
guint16 length;
- guint8 type;
-
gint64 pts;
gint64 dts;
};
diff --git a/gst/mpegdemux/mpegtspacketizer.c b/gst/mpegdemux/mpegtspacketizer.c
index 1abbf1fe..b986fa60 100644
--- a/gst/mpegdemux/mpegtspacketizer.c
+++ b/gst/mpegdemux/mpegtspacketizer.c
@@ -241,7 +241,8 @@ mpegts_packetizer_parse_section_header (MpegTSPacketizer * packetizer,
data = GST_BUFFER_DATA (section->buffer);
section->table_id = *data++;
- if ((data[0] & 0x80) == 0)
+ /* if table_id is 0 (pat) then ignore the subtable extension */
+ if ((data[0] & 0x80) == 0 || section->table_id == 0)
section->subtable_extension = 0;
else
section->subtable_extension = GST_READ_UINT16_BE (data + 2);
@@ -1844,6 +1845,22 @@ mpegts_packetizer_clear (MpegTSPacketizer * packetizer)
gst_adapter_clear (packetizer->adapter);
}
+void
+mpegts_packetizer_remove_stream (MpegTSPacketizer * packetizer, gint16 pid)
+{
+ MpegTSPacketizerStream *stream =
+ (MpegTSPacketizerStream *) g_hash_table_lookup (packetizer->streams,
+ GINT_TO_POINTER ((gint) pid));
+ if (stream) {
+ GST_INFO ("Removing stream for PID %d", pid);
+
+ g_hash_table_remove (packetizer->streams, GINT_TO_POINTER ((gint) pid));
+
+ g_object_unref (stream->section_adapter);
+ g_free (stream);
+ }
+}
+
MpegTSPacketizer *
mpegts_packetizer_new ()
{
diff --git a/gst/mpegdemux/mpegtspacketizer.h b/gst/mpegdemux/mpegtspacketizer.h
index c54228af..97e15cf2 100644
--- a/gst/mpegdemux/mpegtspacketizer.h
+++ b/gst/mpegdemux/mpegtspacketizer.h
@@ -116,6 +116,8 @@ gboolean mpegts_packetizer_next_packet (MpegTSPacketizer *packetizer,
MpegTSPacketizerPacket *packet);
void mpegts_packetizer_clear_packet (MpegTSPacketizer *packetizer,
MpegTSPacketizerPacket *packet);
+void mpegts_packetizer_remove_stream(MpegTSPacketizer *packetizer,
+ gint16 pid);
gboolean mpegts_packetizer_push_section (MpegTSPacketizer *packetzer,
MpegTSPacketizerPacket *packet, MpegTSPacketizerSection *section);
diff --git a/gst/mpegdemux/mpegtsparse.c b/gst/mpegdemux/mpegtsparse.c
index 3a2d647d..976935f2 100644
--- a/gst/mpegdemux/mpegtsparse.c
+++ b/gst/mpegdemux/mpegtsparse.c
@@ -266,12 +266,15 @@ mpegts_parse_init (MpegTSParse * parse, MpegTSParseClass * klass)
gst_element_add_pad (GST_ELEMENT (parse), parse->sinkpad);
parse->disposed = FALSE;
+ parse->need_sync_program_pads = FALSE;
parse->packetizer = mpegts_packetizer_new ();
parse->program_numbers = g_strdup ("");
parse->pads_to_add = NULL;
+ parse->pads_to_remove = NULL;
parse->programs = g_hash_table_new_full (g_direct_hash, g_direct_equal,
NULL, (GDestroyNotify) mpegts_parse_free_program);
parse->psi_pids = g_hash_table_new (g_direct_hash, g_direct_equal);
+ parse->pes_pids = g_hash_table_new (g_direct_hash, g_direct_equal);
mpegts_parse_reset (parse);
}
@@ -301,6 +304,7 @@ mpegts_parse_finalize (GObject * object)
}
g_hash_table_destroy (parse->programs);
g_hash_table_destroy (parse->psi_pids);
+ g_hash_table_destroy (parse->pes_pids);
if (G_OBJECT_CLASS (parent_class)->finalize)
G_OBJECT_CLASS (parent_class)->finalize (object);
@@ -348,7 +352,7 @@ mpegts_parse_add_program (MpegTSParse * parse,
program->pcr_pid = G_MAXUINT16;
program->streams = g_hash_table_new_full (g_direct_hash, g_direct_equal,
NULL, (GDestroyNotify) mpegts_parse_free_stream);
- program->patcount = 1;
+ program->patcount = 0;
program->selected = 0;
program->active = FALSE;
@@ -422,22 +426,30 @@ mpegts_parse_remove_program (MpegTSParse * parse, gint program_number)
}
static void
-mpegts_parse_sync_program_pads (MpegTSParse * parse,
- GList * to_add, GList * to_remove)
+mpegts_parse_sync_program_pads (MpegTSParse * parse)
{
GList *walk;
- for (walk = to_remove; walk; walk = walk->next)
+ GST_INFO_OBJECT (parse, "begin sync pads");
+ for (walk = parse->pads_to_remove; walk; walk = walk->next)
gst_element_remove_pad (GST_ELEMENT (parse), GST_PAD (walk->data));
- for (walk = to_add; walk; walk = walk->next)
+ for (walk = parse->pads_to_add; walk; walk = walk->next)
gst_element_add_pad (GST_ELEMENT (parse), GST_PAD (walk->data));
- if (to_add)
- g_list_free (to_add);
+ if (parse->pads_to_add)
+ g_list_free (parse->pads_to_add);
+
+ if (parse->pads_to_remove)
+ g_list_free (parse->pads_to_remove);
+
+ GST_OBJECT_LOCK (parse);
+ parse->pads_to_remove = NULL;
+ parse->pads_to_add = NULL;
+ parse->need_sync_program_pads = FALSE;
+ GST_OBJECT_UNLOCK (parse);
- if (to_remove)
- g_list_free (to_remove);
+ GST_INFO_OBJECT (parse, "end sync pads");
}
@@ -493,9 +505,6 @@ static void
mpegts_parse_reset_selected_programs (MpegTSParse * parse,
gchar * program_numbers)
{
- GList *pads_to_add = NULL;
- GList *pads_to_remove = NULL;
-
GST_OBJECT_LOCK (parse);
if (parse->program_numbers)
g_free (parse->program_numbers);
@@ -526,13 +535,9 @@ mpegts_parse_reset_selected_programs (MpegTSParse * parse,
g_hash_table_foreach (parse->programs,
foreach_program_activate_or_deactivate, parse);
- pads_to_add = parse->pads_to_add;
- parse->pads_to_add = NULL;
- pads_to_remove = parse->pads_to_remove;
- parse->pads_to_remove = NULL;
+ if (parse->pads_to_remove || parse->pads_to_add)
+ parse->need_sync_program_pads = TRUE;
GST_OBJECT_UNLOCK (parse);
-
- mpegts_parse_sync_program_pads (parse, pads_to_add, pads_to_remove);
}
static void
@@ -804,6 +809,10 @@ mpegts_parse_is_psi (MpegTSParse * parse, MpegTSPacketizerPacket * packet)
if (g_hash_table_lookup (parse->psi_pids,
GINT_TO_POINTER ((gint) packet->pid)) != NULL)
retval = TRUE;
+ /* check is it is a pes pid */
+ if (g_hash_table_lookup (parse->pes_pids,
+ GINT_TO_POINTER ((gint) packet->pid)) != NULL)
+ return FALSE;
if (!retval) {
if (packet->payload_unit_start_indicator) {
table_id = *(packet->data);
@@ -850,8 +859,6 @@ mpegts_parse_apply_pat (MpegTSParse * parse, GstStructure * pat_info)
guint pid;
MpegTSParseProgram *program;
gint i;
- GList *pads_to_add = NULL;
- GList *pads_to_remove = NULL;
const GValue *programs;
gchar *dbg;
@@ -889,14 +896,12 @@ mpegts_parse_apply_pat (MpegTSParse * parse, GstStructure * pat_info)
g_hash_table_insert (parse->psi_pids,
GINT_TO_POINTER ((gint) pid), GINT_TO_POINTER (1));
}
-
- program->patcount += 1;
} else {
g_hash_table_insert (parse->psi_pids,
GINT_TO_POINTER ((gint) pid), GINT_TO_POINTER (1));
program = mpegts_parse_add_program (parse, program_number, pid);
}
-
+ program->patcount += 1;
if (program->selected && !program->active)
parse->pads_to_add = g_list_append (parse->pads_to_add,
mpegts_parse_activate_program (parse, program));
@@ -937,18 +942,15 @@ mpegts_parse_apply_pat (MpegTSParse * parse, GstStructure * pat_info)
mpegts_parse_remove_program (parse, program_number);
g_hash_table_remove (parse->psi_pids, GINT_TO_POINTER ((gint) pid));
+ mpegts_packetizer_remove_stream (parse->packetizer, pid);
}
gst_structure_free (old_pat);
}
- pads_to_add = parse->pads_to_add;
- parse->pads_to_add = NULL;
- pads_to_remove = parse->pads_to_remove;
- parse->pads_to_remove = NULL;
GST_OBJECT_UNLOCK (parse);
- mpegts_parse_sync_program_pads (parse, pads_to_add, pads_to_remove);
+ mpegts_parse_sync_program_pads (parse);
}
static void
@@ -983,10 +985,13 @@ mpegts_parse_apply_pmt (MpegTSParse * parse,
gst_structure_get_uint (stream, "pid", &pid);
gst_structure_get_uint (stream, "stream-type", &stream_type);
mpegts_parse_program_remove_stream (parse, program, (guint16) pid);
+ g_hash_table_remove (parse->pes_pids, GINT_TO_POINTER ((gint) pid));
}
/* remove pcr stream */
mpegts_parse_program_remove_stream (parse, program, program->pcr_pid);
+ g_hash_table_remove (parse->pes_pids,
+ GINT_TO_POINTER ((gint) program->pcr_pid));
gst_structure_free (program->pmt_info);
program->pmt_info = NULL;
@@ -1003,6 +1008,8 @@ mpegts_parse_apply_pmt (MpegTSParse * parse,
program->pmt_pid = pmt_pid;
program->pcr_pid = pcr_pid;
mpegts_parse_program_add_stream (parse, program, (guint16) pcr_pid, -1);
+ g_hash_table_insert (parse->pes_pids, GINT_TO_POINTER ((gint) pcr_pid),
+ GINT_TO_POINTER (1));
for (i = 0; i < gst_value_list_get_size (new_streams); ++i) {
value = gst_value_list_get_value (new_streams, i);
@@ -1012,6 +1019,9 @@ mpegts_parse_apply_pmt (MpegTSParse * parse,
gst_structure_get_uint (stream, "stream-type", &stream_type);
mpegts_parse_program_add_stream (parse, program,
(guint16) pid, (guint8) stream_type);
+ g_hash_table_insert (parse->pes_pids, GINT_TO_POINTER ((gint) pid),
+ GINT_TO_POINTER ((gint) 1));
+
}
GST_OBJECT_UNLOCK (parse);
@@ -1226,6 +1236,9 @@ mpegts_parse_chain (GstPad * pad, GstBuffer * buf)
mpegts_packetizer_clear_packet (parse->packetizer, &packet);
}
+ if (parse->need_sync_program_pads)
+ mpegts_parse_sync_program_pads (parse);
+
gst_object_unref (parse);
return res;
}
diff --git a/gst/mpegdemux/mpegtsparse.h b/gst/mpegdemux/mpegtsparse.h
index 34a78634..36466b81 100644
--- a/gst/mpegdemux/mpegtsparse.h
+++ b/gst/mpegdemux/mpegtsparse.h
@@ -60,7 +60,9 @@ struct _MpegTSParse {
GstStructure *pat;
MpegTSPacketizer *packetizer;
GHashTable *psi_pids;
+ GHashTable *pes_pids;
gboolean disposed;
+ gboolean need_sync_program_pads;
};
struct _MpegTSParseClass {
diff --git a/gst/mpegvideoparse/mpegpacketiser.c b/gst/mpegvideoparse/mpegpacketiser.c
index 447c50ae..0312680e 100644
--- a/gst/mpegvideoparse/mpegpacketiser.c
+++ b/gst/mpegvideoparse/mpegpacketiser.c
@@ -498,6 +498,9 @@ mpeg_util_parse_extension_packet (MPEGSeqHdr * hdr, guint8 * data, guint8 * end)
case MPEG_PACKET_EXT_SEQUENCE:
{
/* Parse a Sequence Extension */
+ guint8 profile_level;
+ gboolean low_delay;
+ guint8 chroma_format;
guint8 horiz_size_ext, vert_size_ext;
guint8 fps_n_ext, fps_d_ext;
@@ -505,8 +508,12 @@ mpeg_util_parse_extension_packet (MPEGSeqHdr * hdr, guint8 * data, guint8 * end)
/* need at least 10 bytes, minus 4 for the start code 000001b5 */
return FALSE;
+ profile_level = ((data[0] << 4) & 0xf0) | ((data[1]) >> 4);
+ hdr->progressive = data[1] & 0x08;
+ chroma_format = (data[1] >> 2) & 0x03;
horiz_size_ext = ((data[1] << 1) & 0x02) | ((data[2] >> 7) & 0x01);
vert_size_ext = (data[2] >> 5) & 0x03;
+ low_delay = data[5] >> 7;
fps_n_ext = (data[5] >> 5) & 0x03;
fps_d_ext = data[5] & 0x1f;
diff --git a/gst/mpegvideoparse/mpegpacketiser.h b/gst/mpegvideoparse/mpegpacketiser.h
index 426b13aa..549ca621 100644
--- a/gst/mpegvideoparse/mpegpacketiser.h
+++ b/gst/mpegvideoparse/mpegpacketiser.h
@@ -76,6 +76,8 @@ struct MPEGSeqHdr
gint width, height;
/* Framerate */
gint fps_n, fps_d;
+
+ gboolean progressive;
};
struct MPEGPictureHdr
diff --git a/gst/mpegvideoparse/mpegvideoparse.c b/gst/mpegvideoparse/mpegvideoparse.c
index 3c930179..2a7f9153 100644
--- a/gst/mpegvideoparse/mpegvideoparse.c
+++ b/gst/mpegvideoparse/mpegvideoparse.c
@@ -261,6 +261,7 @@ mpegvideoparse_handle_sequence (MpegVideoParse * mpegvideoparse,
"height", G_TYPE_INT, new_hdr.height,
"framerate", GST_TYPE_FRACTION, new_hdr.fps_n, new_hdr.fps_d,
"pixel-aspect-ratio", GST_TYPE_FRACTION, new_hdr.par_w, new_hdr.par_h,
+ "interlaced", G_TYPE_BOOLEAN, !new_hdr.progressive,
"codec_data", GST_TYPE_BUFFER, seq_buf, NULL);
GST_DEBUG ("New mpegvideoparse caps: %" GST_PTR_FORMAT, caps);
diff --git a/gst/mxf/mxf.c b/gst/mxf/mxf.c
index c1a0a716..7469317c 100644
--- a/gst/mxf/mxf.c
+++ b/gst/mxf/mxf.c
@@ -71,7 +71,8 @@ plugin_init (GstPlugin * plugin)
if (!gst_element_register (plugin, "mxfdemux", GST_RANK_PRIMARY,
GST_TYPE_MXF_DEMUX) ||
- !gst_element_register (plugin, "mxfmux", GST_RANK_NONE, GST_TYPE_MXF_MUX))
+ !gst_element_register (plugin, "mxfmux", GST_RANK_PRIMARY,
+ GST_TYPE_MXF_MUX))
return FALSE;
return TRUE;
diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c
index 6d7ca034..c33650b5 100644
--- a/gst/mxf/mxfdemux.c
+++ b/gst/mxf/mxfdemux.c
@@ -203,7 +203,7 @@ gst_mxf_demux_reset_metadata (GstMXFDemux * demux)
{
GST_DEBUG_OBJECT (demux, "Resetting metadata");
- g_mutex_lock (demux->metadata_lock);
+ g_static_rw_lock_writer_lock (&demux->metadata_lock);
demux->update_metadata = TRUE;
demux->metadata_resolved = FALSE;
@@ -217,7 +217,7 @@ gst_mxf_demux_reset_metadata (GstMXFDemux * demux)
}
demux->metadata = mxf_metadata_hash_table_new ();
- g_mutex_unlock (demux->metadata_lock);
+ g_static_rw_lock_writer_unlock (&demux->metadata_lock);
}
static void
@@ -513,11 +513,14 @@ gst_mxf_demux_resolve_references (GstMXFDemux * demux)
GstStructure *structure;
GstTagList *taglist;
+ g_static_rw_lock_writer_lock (&demux->metadata_lock);
+
GST_DEBUG_OBJECT (demux, "Resolve metadata references");
demux->update_metadata = FALSE;
if (!demux->metadata) {
GST_ERROR_OBJECT (demux, "No metadata yet");
+ g_static_rw_lock_writer_unlock (&demux->metadata_lock);
return GST_FLOW_ERROR;
}
#if GLIB_CHECK_VERSION (2, 16, 0)
@@ -565,6 +568,8 @@ gst_mxf_demux_resolve_references (GstMXFDemux * demux)
g_list_free (values);
#endif
+ g_static_rw_lock_writer_unlock (&demux->metadata_lock);
+
return ret;
error:
@@ -573,6 +578,7 @@ error:
#endif
demux->metadata_resolved = FALSE;
+ g_static_rw_lock_writer_unlock (&demux->metadata_lock);
return ret;
}
@@ -913,24 +919,29 @@ gst_mxf_demux_update_tracks (GstMXFDemux * demux)
gboolean first_run;
guint component_index;
GstFlowReturn ret;
+ GList *pads = NULL, *l;
+ g_static_rw_lock_writer_lock (&demux->metadata_lock);
GST_DEBUG_OBJECT (demux, "Updating tracks");
if ((ret = gst_mxf_demux_update_essence_tracks (demux)) != GST_FLOW_OK) {
- return ret;
+ goto error;
}
current_package = gst_mxf_demux_choose_package (demux);
if (!current_package) {
GST_ERROR_OBJECT (demux, "Unable to find current package");
- return GST_FLOW_ERROR;
+ ret = GST_FLOW_ERROR;
+ goto error;
} else if (!current_package->tracks) {
GST_ERROR_OBJECT (demux, "Current package has no (resolved) tracks");
- return GST_FLOW_ERROR;
+ ret = GST_FLOW_ERROR;
+ goto error;
} else if (!current_package->n_essence_tracks) {
GST_ERROR_OBJECT (demux, "Current package has no essence tracks");
- return GST_FLOW_ERROR;
+ ret = GST_FLOW_ERROR;
+ goto error;
}
first_run = (demux->src->len == 0);
@@ -977,10 +988,12 @@ gst_mxf_demux_update_tracks (GstMXFDemux * demux)
if (!track->parent.sequence) {
GST_WARNING_OBJECT (demux, "Track with no sequence");
- if (!pad)
+ if (!pad) {
continue;
- else
- return GST_FLOW_ERROR;
+ } else {
+ ret = GST_FLOW_ERROR;
+ goto error;
+ }
}
sequence = track->parent.sequence;
@@ -1021,20 +1034,24 @@ gst_mxf_demux_update_tracks (GstMXFDemux * demux)
if (track->parent.type && (track->parent.type & 0xf0) != 0x30) {
GST_DEBUG_OBJECT (demux, "No essence track");
- if (!pad)
+ if (!pad) {
continue;
- else
- return GST_FLOW_ERROR;
+ } else {
+ ret = GST_FLOW_ERROR;
+ goto error;
+ }
}
if (!source_package || track->parent.type == MXF_METADATA_TRACK_UNKNOWN
|| !source_track) {
GST_WARNING_OBJECT (demux,
"No source package or track type for track found");
- if (!pad)
+ if (!pad) {
continue;
- else
- return GST_FLOW_ERROR;
+ } else {
+ ret = GST_FLOW_ERROR;
+ goto error;
+ }
}
for (k = 0; k < demux->essence_tracks->len; k++) {
@@ -1050,44 +1067,54 @@ gst_mxf_demux_update_tracks (GstMXFDemux * demux)
if (!etrack) {
GST_WARNING_OBJECT (demux, "No essence track for this track found");
- if (!pad)
+ if (!pad) {
continue;
- else
- return GST_FLOW_ERROR;
+ } else {
+ ret = GST_FLOW_ERROR;
+ goto error;
+ }
}
if (track->edit_rate.n <= 0 || track->edit_rate.d <= 0 ||
source_track->edit_rate.n <= 0 || source_track->edit_rate.d <= 0) {
GST_WARNING_OBJECT (demux, "Track has an invalid edit rate");
- if (!pad)
+ if (!pad) {
continue;
- else
- return GST_FLOW_ERROR;
+ } else {
+ ret = GST_FLOW_ERROR;
+ goto error;
+ }
}
if (MXF_IS_METADATA_MATERIAL_PACKAGE (current_package) && !component) {
GST_WARNING_OBJECT (demux,
"Playing material package but found no component for track");
- if (!pad)
+ if (!pad) {
continue;
- else
- return GST_FLOW_ERROR;
+ } else {
+ ret = GST_FLOW_ERROR;
+ goto error;
+ }
}
if (!source_package->descriptor) {
GST_WARNING_OBJECT (demux, "Source package has no descriptors");
- if (!pad)
+ if (!pad) {
continue;
- else
- return GST_FLOW_ERROR;
+ } else {
+ ret = GST_FLOW_ERROR;
+ goto error;
+ }
}
if (!source_track->parent.descriptor) {
GST_WARNING_OBJECT (demux, "No descriptor found for track");
- if (!pad)
+ if (!pad) {
continue;
- else
- return GST_FLOW_ERROR;
+ } else {
+ ret = GST_FLOW_ERROR;
+ goto error;
+ }
}
if (!pad && first_run) {
@@ -1178,31 +1205,43 @@ gst_mxf_demux_update_tracks (GstMXFDemux * demux)
gst_pad_use_fixed_caps (GST_PAD_CAST (pad));
gst_pad_set_active (GST_PAD_CAST (pad), TRUE);
- gst_element_add_pad (GST_ELEMENT_CAST (demux), gst_object_ref (pad));
+ pads = g_list_prepend (pads, gst_object_ref (pad));
g_ptr_array_add (demux->src, pad);
pad->discont = TRUE;
}
}
- if (first_run)
- gst_element_no_more_pads (GST_ELEMENT_CAST (demux));
-
if (demux->src->len > 0) {
for (i = 0; i < demux->src->len; i++) {
GstMXFDemuxPad *pad = g_ptr_array_index (demux->src, i);
if (!pad->material_track || !pad->material_package) {
GST_ERROR_OBJECT (demux, "Unable to update existing pad");
- return GST_FLOW_ERROR;
+ ret = GST_FLOW_ERROR;
+ goto error;
}
}
} else {
GST_ERROR_OBJECT (demux, "Couldn't create any streams");
- return GST_FLOW_ERROR;
+ ret = GST_FLOW_ERROR;
+ goto error;
}
+ g_static_rw_lock_writer_unlock (&demux->metadata_lock);
+
+ for (l = pads; l; l = l->next)
+ gst_element_add_pad (GST_ELEMENT_CAST (demux), l->data);
+ g_list_free (pads);
+
+ if (first_run)
+ gst_element_no_more_pads (GST_ELEMENT_CAST (demux));
+
return GST_FLOW_OK;
+
+error:
+ g_static_rw_lock_writer_unlock (&demux->metadata_lock);
+ return ret;
}
static GstFlowReturn
@@ -1276,7 +1315,7 @@ gst_mxf_demux_handle_metadata (GstMXFDemux * demux, const MXFUL * key,
return GST_FLOW_OK;
}
- g_mutex_lock (demux->metadata_lock);
+ g_static_rw_lock_writer_lock (&demux->metadata_lock);
demux->update_metadata = TRUE;
if (MXF_IS_METADATA_PREFACE (metadata)) {
@@ -1287,7 +1326,7 @@ gst_mxf_demux_handle_metadata (GstMXFDemux * demux, const MXFUL * key,
g_hash_table_replace (demux->metadata,
&MXF_METADATA_BASE (metadata)->instance_uid, metadata);
- g_mutex_unlock (demux->metadata_lock);
+ g_static_rw_lock_writer_unlock (&demux->metadata_lock);
return ret;
}
@@ -1365,7 +1404,7 @@ gst_mxf_demux_handle_descriptive_metadata (GstMXFDemux * demux,
return GST_FLOW_OK;
}
- g_mutex_lock (demux->metadata_lock);
+ g_static_rw_lock_writer_lock (&demux->metadata_lock);
demux->update_metadata = TRUE;
gst_mxf_demux_reset_linked_metadata (demux);
@@ -1373,7 +1412,7 @@ gst_mxf_demux_handle_descriptive_metadata (GstMXFDemux * demux,
g_hash_table_replace (demux->metadata, &MXF_METADATA_BASE (m)->instance_uid,
m);
- g_mutex_unlock (demux->metadata_lock);
+ g_static_rw_lock_writer_unlock (&demux->metadata_lock);
return ret;
}
@@ -2224,17 +2263,14 @@ next_try:
/* resolve references etc */
- g_mutex_lock (demux->metadata_lock);
if (gst_mxf_demux_resolve_references (demux) !=
GST_FLOW_OK || gst_mxf_demux_update_tracks (demux) != GST_FLOW_OK) {
demux->current_partition->parsed_metadata = TRUE;
demux->offset =
demux->run_in + demux->current_partition->partition.this_partition -
demux->current_partition->partition.prev_partition;
- g_mutex_unlock (demux->metadata_lock);
goto next_try;
}
- g_mutex_unlock (demux->metadata_lock);
out:
if (buffer)
@@ -2253,7 +2289,6 @@ gst_mxf_demux_handle_klv_packet (GstMXFDemux * demux, const MXFUL * key,
#endif
GstFlowReturn ret = GST_FLOW_OK;
- g_mutex_lock (demux->metadata_lock);
if (demux->update_metadata
&& demux->preface
&& (demux->offset >=
@@ -2265,16 +2300,13 @@ gst_mxf_demux_handle_klv_packet (GstMXFDemux * demux, const MXFUL * key,
demux->current_partition->parsed_metadata = TRUE;
if ((ret = gst_mxf_demux_resolve_references (demux)) != GST_FLOW_OK ||
(ret = gst_mxf_demux_update_tracks (demux)) != GST_FLOW_OK) {
- g_mutex_unlock (demux->metadata_lock);
goto beach;
}
} else if (demux->metadata_resolved && demux->requested_package_string) {
if ((ret = gst_mxf_demux_update_tracks (demux)) != GST_FLOW_OK) {
- g_mutex_unlock (demux->metadata_lock);
goto beach;
}
}
- g_mutex_unlock (demux->metadata_lock);
if (!mxf_is_mxf_packet (key)) {
GST_WARNING_OBJECT (demux,
@@ -3106,15 +3138,12 @@ gst_mxf_demux_seek_push (GstMXFDemux * demux, GstEvent * event)
guint64 new_offset = -1;
GstEvent *e;
- g_mutex_lock (demux->metadata_lock);
if (!demux->metadata_resolved || demux->update_metadata) {
if (gst_mxf_demux_resolve_references (demux) != GST_FLOW_OK ||
gst_mxf_demux_update_tracks (demux) != GST_FLOW_OK) {
- g_mutex_unlock (demux->metadata_lock);
goto unresolved_metadata;
}
}
- g_mutex_unlock (demux->metadata_lock);
/* Do the actual seeking */
for (i = 0; i < demux->src->len; i++) {
@@ -3266,15 +3295,12 @@ gst_mxf_demux_seek_pull (GstMXFDemux * demux, GstEvent * event)
if (flush || seeksegment.last_stop != demux->segment.last_stop) {
guint64 new_offset = -1;
- g_mutex_lock (demux->metadata_lock);
if (!demux->metadata_resolved || demux->update_metadata) {
if (gst_mxf_demux_resolve_references (demux) != GST_FLOW_OK ||
gst_mxf_demux_update_tracks (demux) != GST_FLOW_OK) {
- g_mutex_unlock (demux->metadata_lock);
goto unresolved_metadata;
}
}
- g_mutex_unlock (demux->metadata_lock);
/* Do the actual seeking */
for (i = 0; i < demux->src->len; i++) {
@@ -3455,11 +3481,11 @@ gst_mxf_demux_src_query (GstPad * pad, GstQuery * query)
pos = mxfpad->last_stop;
- g_mutex_lock (demux->metadata_lock);
+ g_static_rw_lock_reader_lock (&demux->metadata_lock);
if (format == GST_FORMAT_DEFAULT && pos != GST_CLOCK_TIME_NONE) {
if (!mxfpad->material_track || mxfpad->material_track->edit_rate.n == 0
|| mxfpad->material_track->edit_rate.d == 0) {
- g_mutex_unlock (demux->metadata_lock);
+ g_static_rw_lock_reader_unlock (&demux->metadata_lock);
goto error;
}
@@ -3468,7 +3494,7 @@ gst_mxf_demux_src_query (GstPad * pad, GstQuery * query)
mxfpad->material_track->edit_rate.n,
mxfpad->material_track->edit_rate.d * GST_SECOND);
}
- g_mutex_unlock (demux->metadata_lock);
+ g_static_rw_lock_reader_unlock (&demux->metadata_lock);
GST_DEBUG_OBJECT (pad,
"Returning position %" G_GINT64_FORMAT " in format %s", pos,
@@ -3487,9 +3513,9 @@ gst_mxf_demux_src_query (GstPad * pad, GstQuery * query)
if (format != GST_FORMAT_TIME && format != GST_FORMAT_DEFAULT)
goto error;
- g_mutex_lock (demux->metadata_lock);
+ g_static_rw_lock_reader_lock (&demux->metadata_lock);
if (!mxfpad->material_track || !mxfpad->material_track->parent.sequence) {
- g_mutex_unlock (demux->metadata_lock);
+ g_static_rw_lock_reader_unlock (&demux->metadata_lock);
goto error;
}
@@ -3500,7 +3526,7 @@ gst_mxf_demux_src_query (GstPad * pad, GstQuery * query)
if (duration != -1 && format == GST_FORMAT_TIME) {
if (mxfpad->material_track->edit_rate.n == 0 ||
mxfpad->material_track->edit_rate.d == 0) {
- g_mutex_unlock (demux->metadata_lock);
+ g_static_rw_lock_reader_unlock (&demux->metadata_lock);
goto error;
}
@@ -3509,7 +3535,7 @@ gst_mxf_demux_src_query (GstPad * pad, GstQuery * query)
GST_SECOND * mxfpad->material_track->edit_rate.d,
mxfpad->material_track->edit_rate.n);
}
- g_mutex_unlock (demux->metadata_lock);
+ g_static_rw_lock_reader_unlock (&demux->metadata_lock);
GST_DEBUG_OBJECT (pad,
"Returning duration %" G_GINT64_FORMAT " in format %s", duration,
@@ -3746,7 +3772,7 @@ gst_mxf_demux_query (GstElement * element, GstQuery * query)
if (demux->src->len == 0)
goto done;
- g_mutex_lock (demux->metadata_lock);
+ g_static_rw_lock_reader_lock (&demux->metadata_lock);
for (i = 0; i < demux->src->len; i++) {
GstMXFDemuxPad *pad = g_ptr_array_index (demux->src, i);
gint64 pdur = -1;
@@ -3765,7 +3791,7 @@ gst_mxf_demux_query (GstElement * element, GstQuery * query)
pad->material_track->edit_rate.n);
duration = MAX (duration, pdur);
}
- g_mutex_unlock (demux->metadata_lock);
+ g_static_rw_lock_reader_unlock (&demux->metadata_lock);
if (duration == -1) {
GST_DEBUG_OBJECT (demux, "No duration known (yet)");
@@ -3862,7 +3888,7 @@ gst_mxf_demux_get_property (GObject * object, guint prop_id,
case PROP_STRUCTURE:{
GstStructure *s;
- g_mutex_lock (demux->metadata_lock);
+ g_static_rw_lock_reader_lock (&demux->metadata_lock);
if (demux->preface)
s = mxf_metadata_base_to_structure (MXF_METADATA_BASE (demux->preface));
else
@@ -3873,7 +3899,7 @@ gst_mxf_demux_get_property (GObject * object, guint prop_id,
if (s)
gst_structure_free (s);
- g_mutex_unlock (demux->metadata_lock);
+ g_static_rw_lock_reader_unlock (&demux->metadata_lock);
break;
}
default:
@@ -3911,10 +3937,7 @@ gst_mxf_demux_finalize (GObject * object)
g_hash_table_destroy (demux->metadata);
- if (demux->metadata_lock) {
- g_mutex_free (demux->metadata_lock);
- demux->metadata_lock = NULL;
- }
+ g_static_rw_lock_free (&demux->metadata_lock);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@@ -3990,7 +4013,7 @@ gst_mxf_demux_init (GstMXFDemux * demux, GstMXFDemuxClass * g_class)
demux->max_drift = 500 * GST_MSECOND;
demux->adapter = gst_adapter_new ();
- demux->metadata_lock = g_mutex_new ();
+ g_static_rw_lock_init (&demux->metadata_lock);
demux->src = g_ptr_array_new ();
demux->essence_tracks =
diff --git a/gst/mxf/mxfdemux.h b/gst/mxf/mxfdemux.h
index c8439cf6..e8b90261 100644
--- a/gst/mxf/mxfdemux.h
+++ b/gst/mxf/mxfdemux.h
@@ -154,7 +154,7 @@ struct _GstMXFDemux
GArray *random_index_pack;
/* Metadata */
- GMutex *metadata_lock;
+ GStaticRWLock metadata_lock;
gboolean update_metadata;
gboolean pull_footer_metadata;
diff --git a/gst/mxf/mxfmetadata.c b/gst/mxf/mxfmetadata.c
index 2237bc60..7d1af0c1 100644
--- a/gst/mxf/mxfmetadata.c
+++ b/gst/mxf/mxfmetadata.c
@@ -4984,7 +4984,7 @@ gboolean
s = gst_caps_get_structure (caps, 0);
if (!gst_structure_get_boolean (s, "interlaced", &interlaced) || !interlaced)
- self->frame_layout = 1;
+ self->frame_layout = 0;
else
self->frame_layout = 3;
diff --git a/gst/mxf/mxfmux.c b/gst/mxf/mxfmux.c
index 3ca60a4e..fdc1bc61 100644
--- a/gst/mxf/mxfmux.c
+++ b/gst/mxf/mxfmux.c
@@ -163,6 +163,8 @@ gst_mxf_mux_finalize (GObject * object)
if (mux->metadata) {
g_hash_table_destroy (mux->metadata);
mux->metadata = NULL;
+ g_list_free (mux->metadata_list);
+ mux->metadata_list = NULL;
}
gst_object_unref (mux->collect);
@@ -216,6 +218,8 @@ gst_mxf_mux_reset (GstMXFMux * mux)
if (mux->metadata) {
g_hash_table_destroy (mux->metadata);
mux->preface = NULL;
+ g_list_free (mux->metadata_list);
+ mux->metadata_list = NULL;
}
mux->metadata = mxf_metadata_hash_table_new ();
@@ -280,6 +284,7 @@ gst_mxf_mux_setcaps (GstPad * pad, GstCaps * caps)
gboolean ret = TRUE;
MXFUUID d_instance_uid = { {0,} };
MXFMetadataFileDescriptor *old_descriptor = cpad->descriptor;
+ GList *l;
GST_DEBUG_OBJECT (pad, "Setting caps %" GST_PTR_FORMAT, caps);
@@ -309,6 +314,19 @@ gst_mxf_mux_setcaps (GstPad * pad, GstCaps * caps)
memcpy (&MXF_METADATA_BASE (cpad->descriptor)->instance_uid, &d_instance_uid,
16);
+ if (old_descriptor) {
+ for (l = mux->metadata_list; l; l = l->next) {
+ MXFMetadataBase *tmp = l->data;
+
+ if (mxf_uuid_is_equal (&d_instance_uid, &tmp->instance_uid)) {
+ l->data = cpad->descriptor;
+ break;
+ }
+ }
+ } else {
+ mux->metadata_list = g_list_prepend (mux->metadata_list, cpad->descriptor);
+ }
+
g_hash_table_replace (mux->metadata,
&MXF_METADATA_BASE (cpad->descriptor)->instance_uid, cpad->descriptor);
@@ -449,6 +467,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux)
mux->metadata);
g_hash_table_insert (mux->metadata,
&MXF_METADATA_BASE (mux->preface)->instance_uid, mux->preface);
+ mux->metadata_list = g_list_prepend (mux->metadata_list, mux->preface);
mxf_timestamp_set_now (&mux->preface->last_modified_date);
mux->preface->version = 258;
@@ -505,6 +524,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux)
mux->metadata);
g_hash_table_insert (mux->metadata,
&MXF_METADATA_BASE (identification)->instance_uid, identification);
+ mux->metadata_list = g_list_prepend (mux->metadata_list, identification);
mxf_uuid_init (&identification->this_generation_uid, NULL);
@@ -561,6 +581,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux)
mxf_uuid_init (&MXF_METADATA_BASE (cstorage)->instance_uid, mux->metadata);
g_hash_table_insert (mux->metadata,
&MXF_METADATA_BASE (cstorage)->instance_uid, cstorage);
+ mux->metadata_list = g_list_prepend (mux->metadata_list, cstorage);
cstorage->n_packages = 2;
cstorage->packages = g_new0 (MXFMetadataGenericPackage *, 2);
@@ -576,6 +597,8 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux)
g_hash_table_insert (mux->metadata,
&MXF_METADATA_BASE (cstorage->packages[1])->instance_uid,
cstorage->packages[1]);
+ mux->metadata_list =
+ g_list_prepend (mux->metadata_list, cstorage->packages[1]);
p = (MXFMetadataSourcePackage *) cstorage->packages[1];
mxf_umid_init (&p->parent.package_uid);
@@ -601,6 +624,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux)
mxf_uuid_init (&MXF_METADATA_BASE (d)->instance_uid, mux->metadata);
g_hash_table_insert (mux->metadata,
&MXF_METADATA_BASE (d)->instance_uid, d);
+ mux->metadata_list = g_list_prepend (mux->metadata_list, d);
}
/* Tracks */
@@ -621,6 +645,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux)
mux->metadata);
g_hash_table_insert (mux->metadata,
&MXF_METADATA_BASE (track)->instance_uid, track);
+ mux->metadata_list = g_list_prepend (mux->metadata_list, track);
track->parent.track_id = n + 1;
track->parent.track_number =
@@ -637,6 +662,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux)
mux->metadata);
g_hash_table_insert (mux->metadata,
&MXF_METADATA_BASE (sequence)->instance_uid, sequence);
+ mux->metadata_list = g_list_prepend (mux->metadata_list, sequence);
memcpy (&sequence->data_definition, &cpad->writer->data_definition,
16);
@@ -653,6 +679,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux)
mux->metadata);
g_hash_table_insert (mux->metadata,
&MXF_METADATA_BASE (clip)->instance_uid, clip);
+ mux->metadata_list = g_list_prepend (mux->metadata_list, clip);
memcpy (&clip->parent.data_definition, &sequence->data_definition,
16);
@@ -687,6 +714,8 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux)
g_hash_table_insert (mux->metadata,
&MXF_METADATA_BASE (cstorage->packages[0])->instance_uid,
cstorage->packages[0]);
+ mux->metadata_list =
+ g_list_prepend (mux->metadata_list, cstorage->packages[0]);
p = (MXFMetadataMaterialPackage *) cstorage->packages[0];
mxf_umid_init (&p->package_uid);
@@ -724,6 +753,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux)
mux->metadata);
g_hash_table_insert (mux->metadata,
&MXF_METADATA_BASE (track)->instance_uid, track);
+ mux->metadata_list = g_list_prepend (mux->metadata_list, track);
track->parent.track_id = n + 1;
track->parent.track_number = 0;
@@ -757,6 +787,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux)
mux->metadata);
g_hash_table_insert (mux->metadata,
&MXF_METADATA_BASE (sequence)->instance_uid, sequence);
+ mux->metadata_list = g_list_prepend (mux->metadata_list, sequence);
memcpy (&sequence->data_definition, &cpad->writer->data_definition,
16);
@@ -772,6 +803,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux)
mux->metadata);
g_hash_table_insert (mux->metadata,
&MXF_METADATA_BASE (clip)->instance_uid, clip);
+ mux->metadata_list = g_list_prepend (mux->metadata_list, clip);
memcpy (&clip->parent.data_definition, &sequence->data_definition,
16);
@@ -798,6 +830,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux)
mux->metadata);
g_hash_table_insert (mux->metadata,
&MXF_METADATA_BASE (track)->instance_uid, track);
+ mux->metadata_list = g_list_prepend (mux->metadata_list, track);
track->parent.track_id = n + 1;
track->parent.track_number = 0;
@@ -811,6 +844,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux)
mux->metadata);
g_hash_table_insert (mux->metadata,
&MXF_METADATA_BASE (sequence)->instance_uid, sequence);
+ mux->metadata_list = g_list_prepend (mux->metadata_list, sequence);
memcpy (&sequence->data_definition,
mxf_metadata_track_identifier_get
@@ -828,6 +862,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux)
mux->metadata);
g_hash_table_insert (mux->metadata,
&MXF_METADATA_BASE (component)->instance_uid, component);
+ mux->metadata_list = g_list_prepend (mux->metadata_list, component);
memcpy (&component->parent.data_definition,
&sequence->data_definition, 16);
@@ -884,6 +919,9 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux)
g_hash_table_insert (mux->metadata,
&MXF_METADATA_BASE (cstorage->essence_container_data[0])->instance_uid,
cstorage->essence_container_data[0]);
+ mux->metadata_list =
+ g_list_prepend (mux->metadata_list,
+ cstorage->essence_container_data[0]);
cstorage->essence_container_data[0]->linked_package =
MXF_METADATA_SOURCE_PACKAGE (cstorage->packages[1]);
@@ -891,6 +929,43 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux)
cstorage->essence_container_data[0]->body_sid = 1;
}
+ /* Sort descriptors at the correct places */
+ {
+ GList *l;
+ GList *descriptors = NULL;
+
+ for (l = mux->metadata_list; l; l = l->next) {
+ MXFMetadataBase *m = l->data;
+
+ if (MXF_IS_METADATA_GENERIC_DESCRIPTOR (m)
+ && !MXF_IS_METADATA_MULTIPLE_DESCRIPTOR (m)) {
+ descriptors = l;
+ l->prev->next = NULL;
+ l->prev = NULL;
+ break;
+ }
+ }
+
+ g_assert (descriptors != NULL);
+
+ for (l = mux->metadata_list; l; l = l->next) {
+ MXFMetadataBase *m = l->data;
+ GList *s;
+
+ if (MXF_IS_METADATA_MULTIPLE_DESCRIPTOR (m) ||
+ MXF_IS_METADATA_SOURCE_PACKAGE (m)) {
+ s = l->prev;
+ l->prev = g_list_last (descriptors);
+ s->next = descriptors;
+ descriptors->prev = s;
+ l->prev->next = l;
+ break;
+ }
+ }
+ }
+
+ mux->metadata_list = g_list_reverse (mux->metadata_list);
+
return ret;
}
@@ -953,38 +1028,17 @@ gst_mxf_mux_write_header_metadata (GstMXFMux * mux)
GstFlowReturn ret = GST_FLOW_OK;
GstBuffer *buf;
GList *buffers = NULL;
-#if GLIB_CHECK_VERSION (2, 16, 0)
- GHashTableIter iter;
-#else
- GList *values;
-#endif
- MXFMetadataBase *m;
GList *l;
+ MXFMetadataBase *m;
guint64 header_byte_count = 0;
- buf =
- mxf_metadata_base_to_buffer (MXF_METADATA_BASE (mux->preface),
- &mux->primer);
- header_byte_count += GST_BUFFER_SIZE (buf);
- buffers = g_list_prepend (buffers, buf);
-
-#if GLIB_CHECK_VERSION (2, 16, 0)
- g_hash_table_iter_init (&iter, mux->metadata);
- while (g_hash_table_iter_next (&iter, NULL, (gpointer) & m)) {
-#else
- values = g_hash_table_get_values (mux->metadata);
- for (l = values; l; l = l->next) {
+ for (l = mux->metadata_list; l; l = l->next) {
m = l->data;
-#endif
buf = mxf_metadata_base_to_buffer (m, &mux->primer);
header_byte_count += GST_BUFFER_SIZE (buf);
buffers = g_list_prepend (buffers, buf);
}
-#if !GLIB_CHECK_VERSION (2, 16, 0)
- g_list_free (values);
-#endif
-
buffers = g_list_reverse (buffers);
buf = mxf_primer_pack_to_buffer (&mux->primer);
header_byte_count += GST_BUFFER_SIZE (buf);
@@ -1006,7 +1060,7 @@ gst_mxf_mux_write_header_metadata (GstMXFMux * mux)
if ((ret = gst_mxf_mux_push (mux, buf)) != GST_FLOW_OK) {
GST_ERROR_OBJECT (mux, "Failed pushing buffer: %s",
gst_flow_get_name (ret));
- g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
+ g_list_foreach (l, (GFunc) gst_mini_object_unref, NULL);
g_list_free (buffers);
return ret;
}
@@ -1150,10 +1204,11 @@ gst_mxf_mux_handle_eos (GstMXFMux * mux)
best = cpad;
break;
}
- } else if (have_data && !l->next) {
+ }
+
+ if (have_data && !l->next) {
mux->last_gc_position++;
mux->last_gc_timestamp = next_gc_timestamp;
- have_data = FALSE;
best = NULL;
break;
}
diff --git a/gst/mxf/mxfmux.h b/gst/mxf/mxfmux.h
index c8fd0b09..94330c46 100644
--- a/gst/mxf/mxfmux.h
+++ b/gst/mxf/mxfmux.h
@@ -85,6 +85,7 @@ typedef struct _GstMXFMux {
MXFPrimerPack primer;
GHashTable *metadata;
+ GList *metadata_list;
MXFMetadataPreface *preface;
MXFFraction min_edit_rate;
diff --git a/gst/qtmux/atoms.c b/gst/qtmux/atoms.c
index df6958e0..a5d8fe38 100644
--- a/gst/qtmux/atoms.c
+++ b/gst/qtmux/atoms.c
@@ -1855,13 +1855,11 @@ atom_stsd_copy_data (AtomSTSD * stsd, guint8 ** buffer, guint64 * size,
break;
default:
if (se->kind == VIDEO) {
- size +=
- sample_entry_mp4v_copy_data ((SampleTableEntryMP4V *) walker->
- data, buffer, size, offset);
+ size += sample_entry_mp4v_copy_data ((SampleTableEntryMP4V *)
+ walker->data, buffer, size, offset);
} else if (se->kind == AUDIO) {
- size +=
- sample_entry_mp4a_copy_data ((SampleTableEntryMP4A *) walker->
- data, buffer, size, offset);
+ size += sample_entry_mp4a_copy_data ((SampleTableEntryMP4A *)
+ walker->data, buffer, size, offset);
} else {
if (!atom_hint_sample_entry_copy_data (
(AtomHintSampleEntry *) walker->data, buffer, size, offset)) {
@@ -2547,6 +2545,7 @@ atom_moov_append_tag (AtomMOOV * moov, AtomInfo * tag)
{
AtomILST *ilst;
+ atom_moov_init_metatags (moov);
ilst = moov->udta->meta->ilst;
ilst->entries = g_list_append (ilst->entries, tag);
}
@@ -2563,7 +2562,6 @@ atom_moov_add_tag (AtomMOOV * moov, guint32 fourcc, guint32 flags,
atom_tag_data_alloc_data (tdata, size);
g_memmove (tdata->data, data, size);
- atom_moov_init_metatags (moov);
atom_moov_append_tag (moov,
build_atom_info_wrapper ((Atom *) tag, atom_tag_copy_data,
atom_tag_free));
diff --git a/gst/qtmux/gstqtmux.c b/gst/qtmux/gstqtmux.c
index f3e85f5c..b0df9d71 100644
--- a/gst/qtmux/gstqtmux.c
+++ b/gst/qtmux/gstqtmux.c
@@ -1886,7 +1886,7 @@ gst_qt_mux_register (GstPlugin * plugin)
g_type_set_qdata (type, GST_QT_MUX_PARAMS_QDATA, (gpointer) params);
g_type_add_interface_static (type, GST_TYPE_TAG_SETTER, &tag_setter_info);
- if (!gst_element_register (plugin, prop->name, GST_RANK_NONE, type))
+ if (!gst_element_register (plugin, prop->name, GST_RANK_PRIMARY, type))
return FALSE;
i++;
diff --git a/gst/qtmux/gstqtmuxmap.c b/gst/qtmux/gstqtmuxmap.c
index a4972661..11913670 100644
--- a/gst/qtmux/gstqtmuxmap.c
+++ b/gst/qtmux/gstqtmuxmap.c
@@ -174,7 +174,7 @@ GstQTMuxFormatProp gst_qt_mux_format_list[] = {
"3GPP",
"GstGPPMux",
GST_STATIC_CAPS ("video/quicktime, variant = (string) 3gpp"),
- GST_STATIC_CAPS (H263_CAPS "; " H264_CAPS),
+ GST_STATIC_CAPS (H263_CAPS "; " MPEG4V_CAPS "; " H264_CAPS),
GST_STATIC_CAPS (AMR_CAPS "; " MP3_CAPS "; " AAC_CAPS)
}
,
diff --git a/gst/rtpmanager/gstrtpbin-marshal.list b/gst/rtpmanager/gstrtpbin-marshal.list
index c4bc0bb2..ed73e43b 100644
--- a/gst/rtpmanager/gstrtpbin-marshal.list
+++ b/gst/rtpmanager/gstrtpbin-marshal.list
@@ -3,5 +3,6 @@ BOXED:UINT
BOXED:UINT,UINT
OBJECT:UINT
VOID:UINT,OBJECT
+VOID:UINT
VOID:UINT,UINT
VOID:OBJECT,OBJECT
diff --git a/gst/rtpmanager/gstrtpbin.c b/gst/rtpmanager/gstrtpbin.c
index 7d3b9823..19de4f1b 100644
--- a/gst/rtpmanager/gstrtpbin.c
+++ b/gst/rtpmanager/gstrtpbin.c
@@ -297,12 +297,17 @@ struct _GstRtpBinStream
/* the jitterbuffer of the SSRC */
GstElement *buffer;
+ gulong buffer_handlesync_sig;
+ gulong buffer_ptreq_sig;
+ gulong buffer_ntpstop_sig;
/* the PT demuxer of the SSRC */
GstElement *demux;
gulong demux_newpad_sig;
gulong demux_ptreq_sig;
gulong demux_pt_change_sig;
+ /* ghostpads from the ptdemuxer */
+ GSList *pads;
/* if we have calculated a valid unix_delta for this stream */
gboolean have_sync;
@@ -332,6 +337,7 @@ struct _GstRtpBinSession
/* the SSRC demuxer */
GstElement *demux;
gulong demux_newpad_sig;
+ gulong demux_padremoved_sig;
GMutex *lock;
@@ -343,12 +349,17 @@ struct _GstRtpBinSession
/* the pads of the session */
GstPad *recv_rtp_sink;
+ GstPad *recv_rtp_sink_ghost;
GstPad *recv_rtp_src;
GstPad *recv_rtcp_sink;
+ GstPad *recv_rtcp_sink_ghost;
GstPad *sync_src;
GstPad *send_rtp_sink;
+ GstPad *send_rtp_sink_ghost;
GstPad *send_rtp_src;
+ GstPad *send_rtp_src_ghost;
GstPad *send_rtcp_src;
+ GstPad *send_rtcp_src_ghost;
};
/* Manages the RTP streams that come from one client and should therefore be
@@ -389,9 +400,10 @@ find_session_by_pad (GstRtpBin * rtpbin, GstPad * pad)
for (walk = rtpbin->sessions; walk; walk = g_slist_next (walk)) {
GstRtpBinSession *sess = (GstRtpBinSession *) walk->data;
- if ((sess->recv_rtp_sink == pad) ||
- (sess->recv_rtcp_sink == pad) ||
- (sess->send_rtp_sink == pad) || (sess->send_rtcp_src == pad))
+ if ((sess->recv_rtp_sink_ghost == pad) ||
+ (sess->recv_rtcp_sink_ghost == pad) ||
+ (sess->send_rtp_sink_ghost == pad)
+ || (sess->send_rtcp_src_ghost == pad))
return sess;
}
return NULL;
@@ -467,6 +479,36 @@ on_npt_stop (GstElement * jbuf, GstRtpBinStream * stream)
stream->session->id, stream->ssrc);
}
+/* must be called with the SESSION lock */
+static GstRtpBinStream *
+find_stream_by_ssrc (GstRtpBinSession * session, guint32 ssrc)
+{
+ GSList *walk;
+
+ for (walk = session->streams; walk; walk = g_slist_next (walk)) {
+ GstRtpBinStream *stream = (GstRtpBinStream *) walk->data;
+
+ if (stream->ssrc == ssrc)
+ return stream;
+ }
+ return NULL;
+}
+
+static void
+ssrc_demux_pad_removed (GstElement * element, guint ssrc, GstPad * pad,
+ GstRtpBinSession * session)
+{
+ GstRtpBinStream *stream = NULL;
+
+ GST_RTP_SESSION_LOCK (session);
+ if ((stream = find_stream_by_ssrc (session, ssrc)))
+ session->streams = g_slist_remove (session->streams, stream);
+ GST_RTP_SESSION_UNLOCK (session);
+
+ if (stream)
+ free_stream (stream);
+}
+
/* create a session with the given id. Must be called with RTP_BIN_LOCK */
static GstRtpBinSession *
create_session (GstRtpBin * rtpbin, gint id)
@@ -474,6 +516,7 @@ create_session (GstRtpBin * rtpbin, gint id)
GstRtpBinSession *sess;
GstElement *session, *demux;
gint i;
+ GstState target;
if (!(session = gst_element_factory_make ("gstrtpsession", NULL)))
goto no_session;
@@ -522,11 +565,16 @@ create_session (GstRtpBin * rtpbin, gint id)
g_signal_connect (sess->session, "on-sender-timeout",
(GCallback) on_sender_timeout, sess);
- /* FIXME, change state only to what's needed */
gst_bin_add (GST_BIN_CAST (rtpbin), session);
- gst_element_set_state (session, GST_STATE_PLAYING);
gst_bin_add (GST_BIN_CAST (rtpbin), demux);
- gst_element_set_state (demux, GST_STATE_PLAYING);
+
+ GST_OBJECT_LOCK (rtpbin);
+ target = GST_STATE_TARGET (rtpbin);
+ GST_OBJECT_UNLOCK (rtpbin);
+
+ /* change state only to what's needed */
+ gst_element_set_state (demux, target);
+ gst_element_set_state (session, target);
return sess;
@@ -545,16 +593,12 @@ no_demux:
}
static void
-free_session (GstRtpBinSession * sess)
+free_session (GstRtpBinSession * sess, GstRtpBin * bin)
{
- GstRtpBin *bin;
-
- bin = sess->bin;
-
GST_DEBUG_OBJECT (bin, "freeing session %p", sess);
- gst_element_set_state (sess->session, GST_STATE_NULL);
gst_element_set_state (sess->demux, GST_STATE_NULL);
+ gst_element_set_state (sess->session, GST_STATE_NULL);
if (sess->recv_rtp_sink != NULL) {
gst_element_release_request_pad (sess->session, sess->recv_rtp_sink);
@@ -588,27 +632,9 @@ free_session (GstRtpBinSession * sess)
g_mutex_free (sess->lock);
g_hash_table_destroy (sess->ptmap);
- bin->sessions = g_slist_remove (bin->sessions, sess);
-
g_free (sess);
}
-#if 0
-static GstRtpBinStream *
-find_stream_by_ssrc (GstRtpBinSession * session, guint32 ssrc)
-{
- GSList *walk;
-
- for (walk = session->streams; walk; walk = g_slist_next (walk)) {
- GstRtpBinStream *stream = (GstRtpBinStream *) walk->data;
-
- if (stream->ssrc == ssrc)
- return stream;
- }
- return NULL;
-}
-#endif
-
/* get the payload type caps for the specific payload @pt in @session */
static GstCaps *
get_pt_map (GstRtpBinSession * session, guint pt)
@@ -822,8 +848,9 @@ get_client (GstRtpBin * bin, guint8 len, guint8 * data, gboolean * created)
}
static void
-free_client (GstRtpBinClient * client)
+free_client (GstRtpBinClient * client, GstRtpBin * bin)
{
+ GST_DEBUG_OBJECT (bin, "freeing client %p", client);
g_slist_free (client->streams);
g_free (client->cname);
g_free (client);
@@ -1079,6 +1106,8 @@ create_stream (GstRtpBinSession * session, guint32 ssrc)
{
GstElement *buffer, *demux;
GstRtpBinStream *stream;
+ GstRtpBin *rtpbin;
+ GstState target;
if (!(buffer = gst_element_factory_make ("gstrtpjitterbuffer", NULL)))
goto no_jitterbuffer;
@@ -1086,9 +1115,11 @@ create_stream (GstRtpBinSession * session, guint32 ssrc)
if (!(demux = gst_element_factory_make ("gstrtpptdemux", NULL)))
goto no_demux;
+ rtpbin = session->bin;
+
stream = g_new0 (GstRtpBinStream, 1);
stream->ssrc = ssrc;
- stream->bin = session->bin;
+ stream->bin = rtpbin;
stream->session = session;
stream->buffer = buffer;
stream->demux = demux;
@@ -1097,22 +1128,29 @@ create_stream (GstRtpBinSession * session, guint32 ssrc)
session->streams = g_slist_prepend (session->streams, stream);
/* provide clock_rate to the jitterbuffer when needed */
- g_signal_connect (buffer, "request-pt-map",
+ stream->buffer_ptreq_sig = g_signal_connect (buffer, "request-pt-map",
(GCallback) pt_map_requested, session);
- g_signal_connect (buffer, "on-npt-stop", (GCallback) on_npt_stop, stream);
+ stream->buffer_ntpstop_sig = g_signal_connect (buffer, "on-npt-stop",
+ (GCallback) on_npt_stop, stream);
/* configure latency and packet lost */
- g_object_set (buffer, "latency", session->bin->latency, NULL);
- g_object_set (buffer, "do-lost", session->bin->do_lost, NULL);
+ g_object_set (buffer, "latency", rtpbin->latency, NULL);
+ g_object_set (buffer, "do-lost", rtpbin->do_lost, NULL);
- gst_bin_add (GST_BIN_CAST (session->bin), buffer);
- gst_element_set_state (buffer, GST_STATE_PLAYING);
- gst_bin_add (GST_BIN_CAST (session->bin), demux);
- gst_element_set_state (demux, GST_STATE_PLAYING);
+ gst_bin_add (GST_BIN_CAST (rtpbin), demux);
+ gst_bin_add (GST_BIN_CAST (rtpbin), buffer);
/* link stuff */
gst_element_link (buffer, demux);
+ GST_OBJECT_LOCK (rtpbin);
+ target = GST_STATE_TARGET (rtpbin);
+ GST_OBJECT_UNLOCK (rtpbin);
+
+ /* from sink to source */
+ gst_element_set_state (demux, target);
+ gst_element_set_state (buffer, target);
+
return stream;
/* ERRORS */
@@ -1133,16 +1171,29 @@ static void
free_stream (GstRtpBinStream * stream)
{
GstRtpBinSession *session;
+ GSList *walk;
session = stream->session;
- gst_element_set_state (stream->buffer, GST_STATE_NULL);
+ g_signal_handler_disconnect (stream->demux, stream->demux_newpad_sig);
+ g_signal_handler_disconnect (stream->demux, stream->demux_ptreq_sig);
+ g_signal_handler_disconnect (stream->buffer, stream->buffer_handlesync_sig);
+ g_signal_handler_disconnect (stream->buffer, stream->buffer_ptreq_sig);
+ g_signal_handler_disconnect (stream->buffer, stream->buffer_ntpstop_sig);
+
gst_element_set_state (stream->demux, GST_STATE_NULL);
+ gst_element_set_state (stream->buffer, GST_STATE_NULL);
gst_bin_remove (GST_BIN_CAST (session->bin), stream->buffer);
gst_bin_remove (GST_BIN_CAST (session->bin), stream->demux);
- session->streams = g_slist_remove (session->streams, stream);
+ for (walk = stream->pads; walk; walk = g_slist_next (walk)) {
+ GstPad *gpad = GST_PAD_CAST (walk->data);
+
+ gst_pad_set_active (gpad, FALSE);
+ gst_element_remove_pad (GST_ELEMENT_CAST (session->bin), gpad);
+ }
+ g_slist_free (stream->pads);
g_free (stream);
}
@@ -1481,11 +1532,11 @@ gst_rtp_bin_dispose (GObject * object)
rtpbin = GST_RTP_BIN (object);
GST_DEBUG_OBJECT (object, "freeing sessions");
- g_slist_foreach (rtpbin->sessions, (GFunc) free_session, NULL);
+ g_slist_foreach (rtpbin->sessions, (GFunc) free_session, rtpbin);
g_slist_free (rtpbin->sessions);
rtpbin->sessions = NULL;
GST_DEBUG_OBJECT (object, "freeing clients");
- g_slist_foreach (rtpbin->clients, (GFunc) free_client, NULL);
+ g_slist_foreach (rtpbin->clients, (GFunc) free_client, rtpbin);
g_slist_free (rtpbin->clients);
rtpbin->clients = NULL;
@@ -1556,6 +1607,8 @@ gst_rtp_bin_set_sdes_string (GstRtpBin * bin, GstRTCPSDESType type,
if (type < 0 || type > 8)
return;
+ GST_RTP_BIN_LOCK (bin);
+
GST_OBJECT_LOCK (bin);
g_free (bin->sdes[type]);
bin->sdes[type] = g_strdup (data);
@@ -1564,6 +1617,8 @@ gst_rtp_bin_set_sdes_string (GstRtpBin * bin, GstRTCPSDESType type,
for (item = bin->sessions; item; item = g_slist_next (item))
g_object_set (item->data, name, bin->sdes[type], NULL);
GST_OBJECT_UNLOCK (bin);
+
+ GST_RTP_BIN_UNLOCK (bin);
}
static gchar *
@@ -1836,6 +1891,8 @@ new_payload_found (GstElement * element, guint pt, GstPad * pad,
gst_pad_set_active (gpad, TRUE);
gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), gpad);
+ stream->pads = g_slist_prepend (stream->pads, gpad);
+
GST_RTP_BIN_SHUTDOWN_UNLOCK (rtpbin);
return;
@@ -1947,7 +2004,7 @@ new_ssrc_pad_found (GstElement * element, guint ssrc, GstPad * pad,
/* connect to the RTCP sync signal from the jitterbuffer */
GST_DEBUG_OBJECT (rtpbin, "connecting sync signal");
- g_signal_connect (stream->buffer,
+ stream->buffer_handlesync_sig = g_signal_connect (stream->buffer,
"handle-sync", (GCallback) gst_rtp_bin_handle_sync, stream);
/* connect to the new-pad signal of the payload demuxer, this will expose the
@@ -1986,7 +2043,7 @@ no_stream:
static GstPad *
create_recv_rtp (GstRtpBin * rtpbin, GstPadTemplate * templ, const gchar * name)
{
- GstPad *result, *sinkdpad;
+ GstPad *sinkdpad;
guint sessid;
GstRtpBinSession *session;
GstPadLinkReturn lres;
@@ -2008,8 +2065,8 @@ create_recv_rtp (GstRtpBin * rtpbin, GstPadTemplate * templ, const gchar * name)
}
/* check if pad was requested */
- if (session->recv_rtp_sink != NULL)
- goto existed;
+ if (session->recv_rtp_sink_ghost != NULL)
+ return session->recv_rtp_sink_ghost;
GST_DEBUG_OBJECT (rtpbin, "getting RTP sink pad");
/* get recv_rtp pad and store */
@@ -2039,14 +2096,16 @@ create_recv_rtp (GstRtpBin * rtpbin, GstPadTemplate * templ, const gchar * name)
/* connect to the new-ssrc-pad signal of the SSRC demuxer */
session->demux_newpad_sig = g_signal_connect (session->demux,
"new-ssrc-pad", (GCallback) new_ssrc_pad_found, session);
+ session->demux_padremoved_sig = g_signal_connect (session->demux,
+ "removed-ssrc-pad", (GCallback) ssrc_demux_pad_removed, session);
GST_DEBUG_OBJECT (rtpbin, "ghosting session sink pad");
- result =
+ session->recv_rtp_sink_ghost =
gst_ghost_pad_new_from_template (name, session->recv_rtp_sink, templ);
- gst_pad_set_active (result, TRUE);
- gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), result);
+ gst_pad_set_active (session->recv_rtp_sink_ghost, TRUE);
+ gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), session->recv_rtp_sink_ghost);
- return result;
+ return session->recv_rtp_sink_ghost;
/* ERRORS */
no_name:
@@ -2059,12 +2118,6 @@ create_error:
/* create_session already warned */
return NULL;
}
-existed:
- {
- g_warning ("gstrtpbin: recv_rtp pad already requested for session %d",
- sessid);
- return NULL;
- }
pad_failed:
{
g_warning ("gstrtpbin: failed to get session pad");
@@ -2078,10 +2131,31 @@ link_failed:
}
static void
-remove_recv_rtp (GstRtpBin * rtpbin, GstRtpBinSession * session, GstPad * pad)
+remove_recv_rtp (GstRtpBin * rtpbin, GstRtpBinSession * session)
{
- g_warning ("gstrtpbin: releasing pad %s:%s is not implemented",
- GST_DEBUG_PAD_NAME (pad));
+ if (session->demux_newpad_sig) {
+ g_signal_handler_disconnect (session->demux, session->demux_newpad_sig);
+ session->demux_newpad_sig = 0;
+ }
+ if (session->demux_padremoved_sig) {
+ g_signal_handler_disconnect (session->demux, session->demux_padremoved_sig);
+ session->demux_padremoved_sig = 0;
+ }
+ if (session->recv_rtp_src) {
+ gst_object_unref (session->recv_rtp_src);
+ session->recv_rtp_src = NULL;
+ }
+ if (session->recv_rtp_sink) {
+ gst_element_release_request_pad (session->session, session->recv_rtp_sink);
+ gst_object_unref (session->recv_rtp_sink);
+ session->recv_rtp_sink = NULL;
+ }
+ if (session->recv_rtp_sink_ghost) {
+ gst_pad_set_active (session->recv_rtp_sink_ghost, FALSE);
+ gst_element_remove_pad (GST_ELEMENT_CAST (rtpbin),
+ session->recv_rtp_sink_ghost);
+ session->recv_rtp_sink_ghost = NULL;
+ }
}
/* Create a pad for receiving RTCP for the session in @name. Must be called with
@@ -2091,7 +2165,6 @@ static GstPad *
create_recv_rtcp (GstRtpBin * rtpbin, GstPadTemplate * templ,
const gchar * name)
{
- GstPad *result;
guint sessid;
GstRtpBinSession *session;
GstPad *sinkdpad;
@@ -2114,8 +2187,8 @@ create_recv_rtcp (GstRtpBin * rtpbin, GstPadTemplate * templ,
}
/* check if pad was requested */
- if (session->recv_rtcp_sink != NULL)
- goto existed;
+ if (session->recv_rtcp_sink_ghost != NULL)
+ return session->recv_rtcp_sink_ghost;
/* get recv_rtp pad and store */
GST_DEBUG_OBJECT (rtpbin, "getting RTCP sink pad");
@@ -2137,12 +2210,13 @@ create_recv_rtcp (GstRtpBin * rtpbin, GstPadTemplate * templ,
if (lres != GST_PAD_LINK_OK)
goto link_failed;
- result =
+ session->recv_rtcp_sink_ghost =
gst_ghost_pad_new_from_template (name, session->recv_rtcp_sink, templ);
- gst_pad_set_active (result, TRUE);
- gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), result);
+ gst_pad_set_active (session->recv_rtcp_sink_ghost, TRUE);
+ gst_element_add_pad (GST_ELEMENT_CAST (rtpbin),
+ session->recv_rtcp_sink_ghost);
- return result;
+ return session->recv_rtcp_sink_ghost;
/* ERRORS */
no_name:
@@ -2155,12 +2229,6 @@ create_error:
/* create_session already warned */
return NULL;
}
-existed:
- {
- g_warning ("gstrtpbin: recv_rtcp pad already requested for session %d",
- sessid);
- return NULL;
- }
pad_failed:
{
g_warning ("gstrtpbin: failed to get session pad");
@@ -2174,10 +2242,24 @@ link_failed:
}
static void
-remove_recv_rtcp (GstRtpBin * rtpbin, GstRtpBinSession * session, GstPad * pad)
+remove_recv_rtcp (GstRtpBin * rtpbin, GstRtpBinSession * session)
{
- g_warning ("gstrtpbin: releasing pad %s:%s is not implemented",
- GST_DEBUG_PAD_NAME (pad));
+ if (session->recv_rtcp_sink_ghost) {
+ gst_pad_set_active (session->recv_rtcp_sink_ghost, FALSE);
+ gst_element_remove_pad (GST_ELEMENT_CAST (rtpbin),
+ session->recv_rtcp_sink_ghost);
+ session->recv_rtcp_sink_ghost = NULL;
+ }
+ if (session->sync_src) {
+ /* releasing the request pad should also unref the sync pad */
+ gst_object_unref (session->sync_src);
+ session->sync_src = NULL;
+ }
+ if (session->recv_rtcp_sink) {
+ gst_element_release_request_pad (session->session, session->recv_rtcp_sink);
+ gst_object_unref (session->recv_rtcp_sink);
+ session->recv_rtcp_sink = NULL;
+ }
}
/* Create a pad for sending RTP for the session in @name. Must be called with
@@ -2186,7 +2268,6 @@ remove_recv_rtcp (GstRtpBin * rtpbin, GstRtpBinSession * session, GstPad * pad)
static GstPad *
create_send_rtp (GstRtpBin * rtpbin, GstPadTemplate * templ, const gchar * name)
{
- GstPad *result, *srcghost;
gchar *gname;
guint sessid;
GstRtpBinSession *session;
@@ -2206,8 +2287,8 @@ create_send_rtp (GstRtpBin * rtpbin, GstPadTemplate * templ, const gchar * name)
}
/* check if pad was requested */
- if (session->send_rtp_sink != NULL)
- goto existed;
+ if (session->send_rtp_sink_ghost != NULL)
+ return session->send_rtp_sink_ghost;
/* get send_rtp pad and store */
session->send_rtp_sink =
@@ -2215,10 +2296,10 @@ create_send_rtp (GstRtpBin * rtpbin, GstPadTemplate * templ, const gchar * name)
if (session->send_rtp_sink == NULL)
goto pad_failed;
- result =
+ session->send_rtp_sink_ghost =
gst_ghost_pad_new_from_template (name, session->send_rtp_sink, templ);
- gst_pad_set_active (result, TRUE);
- gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), result);
+ gst_pad_set_active (session->send_rtp_sink_ghost, TRUE);
+ gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), session->send_rtp_sink_ghost);
/* get srcpad */
session->send_rtp_src =
@@ -2230,13 +2311,13 @@ create_send_rtp (GstRtpBin * rtpbin, GstPadTemplate * templ, const gchar * name)
klass = GST_ELEMENT_GET_CLASS (rtpbin);
gname = g_strdup_printf ("send_rtp_src_%d", sessid);
templ = gst_element_class_get_pad_template (klass, "send_rtp_src_%d");
- srcghost =
+ session->send_rtp_src_ghost =
gst_ghost_pad_new_from_template (gname, session->send_rtp_src, templ);
- gst_pad_set_active (srcghost, TRUE);
- gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), srcghost);
+ gst_pad_set_active (session->send_rtp_src_ghost, TRUE);
+ gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), session->send_rtp_src_ghost);
g_free (gname);
- return result;
+ return session->send_rtp_sink_ghost;
/* ERRORS */
no_name:
@@ -2249,12 +2330,6 @@ create_error:
/* create_session already warned */
return NULL;
}
-existed:
- {
- g_warning ("gstrtpbin: send_rtp pad already requested for session %d",
- sessid);
- return NULL;
- }
pad_failed:
{
g_warning ("gstrtpbin: failed to get session pad for session %d", sessid);
@@ -2269,10 +2344,30 @@ no_srcpad:
}
static void
-remove_send_rtp (GstRtpBin * rtpbin, GstRtpBinSession * session, GstPad * pad)
+remove_send_rtp (GstRtpBin * rtpbin, GstRtpBinSession * session)
{
- g_warning ("gstrtpbin: releasing pad %s:%s is not implemented",
- GST_DEBUG_PAD_NAME (pad));
+ if (session->send_rtp_src_ghost) {
+ gst_pad_set_active (session->send_rtp_src_ghost, FALSE);
+ gst_element_remove_pad (GST_ELEMENT_CAST (rtpbin),
+ session->send_rtp_src_ghost);
+ session->send_rtp_src_ghost = NULL;
+ }
+ if (session->send_rtp_src) {
+ gst_object_unref (session->send_rtp_src);
+ session->send_rtp_src = NULL;
+ }
+ if (session->send_rtp_sink) {
+ gst_element_release_request_pad (GST_ELEMENT_CAST (session->session),
+ session->send_rtp_sink);
+ gst_object_unref (session->send_rtp_sink);
+ session->send_rtp_sink = NULL;
+ }
+ if (session->send_rtp_sink_ghost) {
+ gst_pad_set_active (session->send_rtp_sink_ghost, FALSE);
+ gst_element_remove_pad (GST_ELEMENT_CAST (rtpbin),
+ session->send_rtp_sink_ghost);
+ session->send_rtp_sink_ghost = NULL;
+ }
}
/* Create a pad for sending RTCP for the session in @name. Must be called with
@@ -2281,7 +2376,6 @@ remove_send_rtp (GstRtpBin * rtpbin, GstRtpBinSession * session, GstPad * pad)
static GstPad *
create_rtcp (GstRtpBin * rtpbin, GstPadTemplate * templ, const gchar * name)
{
- GstPad *result;
guint sessid;
GstRtpBinSession *session;
@@ -2295,8 +2389,8 @@ create_rtcp (GstRtpBin * rtpbin, GstPadTemplate * templ, const gchar * name)
goto no_session;
/* check if pad was requested */
- if (session->send_rtcp_src != NULL)
- goto existed;
+ if (session->send_rtcp_src_ghost != NULL)
+ return session->send_rtcp_src_ghost;
/* get rtcp_src pad and store */
session->send_rtcp_src =
@@ -2304,12 +2398,12 @@ create_rtcp (GstRtpBin * rtpbin, GstPadTemplate * templ, const gchar * name)
if (session->send_rtcp_src == NULL)
goto pad_failed;
- result =
+ session->send_rtcp_src_ghost =
gst_ghost_pad_new_from_template (name, session->send_rtcp_src, templ);
- gst_pad_set_active (result, TRUE);
- gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), result);
+ gst_pad_set_active (session->send_rtcp_src_ghost, TRUE);
+ gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), session->send_rtcp_src_ghost);
- return result;
+ return session->send_rtcp_src_ghost;
/* ERRORS */
no_name:
@@ -2322,12 +2416,6 @@ no_session:
g_warning ("gstrtpbin: session with id %d does not exist", sessid);
return NULL;
}
-existed:
- {
- g_warning ("gstrtpbin: send_rtcp_src pad already requested for session %d",
- sessid);
- return NULL;
- }
pad_failed:
{
g_warning ("gstrtpbin: failed to get rtcp pad for session %d", sessid);
@@ -2336,10 +2424,19 @@ pad_failed:
}
static void
-remove_rtcp (GstRtpBin * rtpbin, GstRtpBinSession * session, GstPad * pad)
+remove_rtcp (GstRtpBin * rtpbin, GstRtpBinSession * session)
{
- g_warning ("gstrtpbin: releasing pad %s:%s is not implemented",
- GST_DEBUG_PAD_NAME (pad));
+ if (session->send_rtcp_src_ghost) {
+ gst_pad_set_active (session->send_rtcp_src_ghost, FALSE);
+ gst_element_remove_pad (GST_ELEMENT_CAST (rtpbin),
+ session->send_rtcp_src_ghost);
+ session->send_rtcp_src_ghost = NULL;
+ }
+ if (session->send_rtcp_src) {
+ gst_element_release_request_pad (session->session, session->send_rtcp_src);
+ gst_object_unref (session->send_rtcp_src);
+ session->send_rtcp_src = NULL;
+ }
}
/* If the requested name is NULL we should create a name with
@@ -2403,7 +2500,7 @@ gst_rtp_bin_request_new_pad (GstElement * element,
pad_name = g_strdup (name);
}
- GST_DEBUG ("Trying to request a pad with name %s", pad_name);
+ GST_DEBUG_OBJECT (rtpbin, "Trying to request a pad with name %s", pad_name);
/* figure out the template */
if (templ == gst_element_class_get_pad_template (klass, "recv_rtp_sink_%d")) {
@@ -2440,32 +2537,39 @@ gst_rtp_bin_release_pad (GstElement * element, GstPad * pad)
{
GstRtpBinSession *session;
GstRtpBin *rtpbin;
- GstPad *target = NULL;
g_return_if_fail (GST_IS_GHOST_PAD (pad));
g_return_if_fail (GST_IS_RTP_BIN (element));
rtpbin = GST_RTP_BIN (element);
- target = gst_ghost_pad_get_target (GST_GHOST_PAD (pad));
- g_return_if_fail (target);
-
GST_RTP_BIN_LOCK (rtpbin);
- if (!(session = find_session_by_pad (rtpbin, target)))
+ GST_DEBUG_OBJECT (rtpbin, "Trying to release pad %s:%s",
+ GST_DEBUG_PAD_NAME (pad));
+
+ if (!(session = find_session_by_pad (rtpbin, pad)))
goto unknown_pad;
- if (session->recv_rtp_sink == target) {
- remove_recv_rtp (rtpbin, session, pad);
- } else if (session->recv_rtcp_sink == target) {
- remove_recv_rtcp (rtpbin, session, pad);
- } else if (session->send_rtp_sink == target) {
- remove_send_rtp (rtpbin, session, pad);
- } else if (session->send_rtcp_src == target) {
- remove_rtcp (rtpbin, session, pad);
+ if (session->recv_rtp_sink_ghost == pad) {
+ remove_recv_rtp (rtpbin, session);
+ } else if (session->recv_rtcp_sink_ghost == pad) {
+ remove_recv_rtcp (rtpbin, session);
+ } else if (session->send_rtp_sink_ghost == pad) {
+ remove_send_rtp (rtpbin, session);
+ } else if (session->send_rtcp_src_ghost == pad) {
+ remove_rtcp (rtpbin, session);
}
- GST_RTP_BIN_UNLOCK (rtpbin);
- gst_object_unref (target);
+ /* no more request pads, free the complete session */
+ if (session->recv_rtp_sink_ghost == NULL
+ && session->recv_rtcp_sink_ghost == NULL
+ && session->send_rtp_sink_ghost == NULL
+ && session->send_rtcp_src_ghost == NULL) {
+ GST_DEBUG_OBJECT (rtpbin, "no more pads for session %p", session);
+ rtpbin->sessions = g_slist_remove (rtpbin->sessions, session);
+ free_session (session, rtpbin);
+ }
+ GST_RTP_BIN_UNLOCK (rtpbin);
return;
@@ -2473,7 +2577,6 @@ gst_rtp_bin_release_pad (GstElement * element, GstPad * pad)
unknown_pad:
{
GST_RTP_BIN_UNLOCK (rtpbin);
- gst_object_unref (target);
g_warning ("gstrtpbin: %s:%s is not one of our request pads",
GST_DEBUG_PAD_NAME (pad));
return;
diff --git a/gst/rtpmanager/gstrtpsession.c b/gst/rtpmanager/gstrtpsession.c
index 035d82a8..c33fdfc6 100644
--- a/gst/rtpmanager/gstrtpsession.c
+++ b/gst/rtpmanager/gstrtpsession.c
@@ -323,63 +323,6 @@ on_ssrc_active (RTPSession * session, RTPSource * src, GstRtpSession * sess)
src->ssrc);
}
-static GstStructure *
-source_get_sdes_structure (RTPSource * src)
-{
- GstStructure *result;
- GValue val = { 0 };
- gchar *str;
-
- result = gst_structure_empty_new ("GstRTPSessionSDES");
-
- gst_structure_set (result, "ssrc", G_TYPE_UINT, src->ssrc, NULL);
-
- g_value_init (&val, G_TYPE_STRING);
- str = rtp_source_get_sdes_string (src, GST_RTCP_SDES_CNAME);
- if (str) {
- g_value_take_string (&val, str);
- gst_structure_set_value (result, "cname", &val);
- }
- str = rtp_source_get_sdes_string (src, GST_RTCP_SDES_NAME);
- if (str) {
- g_value_take_string (&val, str);
- gst_structure_set_value (result, "name", &val);
- }
- str = rtp_source_get_sdes_string (src, GST_RTCP_SDES_EMAIL);
- if (str) {
- g_value_take_string (&val, str);
- gst_structure_set_value (result, "email", &val);
- }
- str = rtp_source_get_sdes_string (src, GST_RTCP_SDES_PHONE);
- if (str) {
- g_value_take_string (&val, str);
- gst_structure_set_value (result, "phone", &val);
- }
- str = rtp_source_get_sdes_string (src, GST_RTCP_SDES_LOC);
- if (str) {
- g_value_take_string (&val, str);
- gst_structure_set_value (result, "location", &val);
- }
- str = rtp_source_get_sdes_string (src, GST_RTCP_SDES_TOOL);
- if (str) {
- g_value_take_string (&val, str);
- gst_structure_set_value (result, "tool", &val);
- }
- str = rtp_source_get_sdes_string (src, GST_RTCP_SDES_NOTE);
- if (str) {
- g_value_take_string (&val, str);
- gst_structure_set_value (result, "note", &val);
- }
- str = rtp_source_get_sdes_string (src, GST_RTCP_SDES_PRIV);
- if (str) {
- g_value_take_string (&val, str);
- gst_structure_set_value (result, "priv", &val);
- }
- g_value_unset (&val);
-
- return result;
-}
-
static void
on_ssrc_sdes (RTPSession * session, RTPSource * src, GstRtpSession * sess)
{
@@ -388,8 +331,9 @@ on_ssrc_sdes (RTPSession * session, RTPSource * src, GstRtpSession * sess)
/* convert the new SDES info into a message */
RTP_SESSION_LOCK (session);
- s = source_get_sdes_structure (src);
+ g_object_get (src, "sdes", &s, NULL);
RTP_SESSION_UNLOCK (session);
+
m = gst_message_new_custom (GST_MESSAGE_ELEMENT, GST_OBJECT (sess), s);
gst_element_post_message (GST_ELEMENT_CAST (sess), m);
diff --git a/gst/rtpmanager/gstrtpssrcdemux.c b/gst/rtpmanager/gstrtpssrcdemux.c
index 64394c45..6a305d8e 100644
--- a/gst/rtpmanager/gstrtpssrcdemux.c
+++ b/gst/rtpmanager/gstrtpssrcdemux.c
@@ -97,6 +97,8 @@ static GstElementDetails gst_rtp_ssrc_demux_details = {
enum
{
SIGNAL_NEW_SSRC_PAD,
+ SIGNAL_REMOVED_SSRC_PAD,
+ SIGNAL_CLEAR_SSRC,
LAST_SIGNAL
};
@@ -112,6 +114,9 @@ static void gst_rtp_ssrc_demux_finalize (GObject * object);
static GstStateChangeReturn gst_rtp_ssrc_demux_change_state (GstElement *
element, GstStateChange transition);
+static void gst_rtp_ssrc_demux_clear_ssrc (GstRtpSsrcDemux * demux,
+ guint32 ssrc);
+
/* sinkpad stuff */
static GstFlowReturn gst_rtp_ssrc_demux_chain (GstPad * pad, GstBuffer * buf);
static gboolean gst_rtp_ssrc_demux_sink_event (GstPad * pad, GstEvent * event);
@@ -245,9 +250,11 @@ gst_rtp_ssrc_demux_class_init (GstRtpSsrcDemuxClass * klass)
{
GObjectClass *gobject_klass;
GstElementClass *gstelement_klass;
+ GstRtpSsrcDemuxClass *gstrtpssrcdemux_klass;
gobject_klass = (GObjectClass *) klass;
gstelement_klass = (GstElementClass *) klass;
+ gstrtpssrcdemux_klass = (GstRtpSsrcDemuxClass *) klass;
gobject_klass->dispose = GST_DEBUG_FUNCPTR (gst_rtp_ssrc_demux_dispose);
gobject_klass->finalize = GST_DEBUG_FUNCPTR (gst_rtp_ssrc_demux_finalize);
@@ -267,8 +274,38 @@ gst_rtp_ssrc_demux_class_init (GstRtpSsrcDemuxClass * klass)
NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_OBJECT,
G_TYPE_NONE, 2, G_TYPE_UINT, GST_TYPE_PAD);
+ /**
+ * GstRtpSsrcDemux::removed-ssrc-pad:
+ * @demux: the object which received the signal
+ * @ssrc: the SSRC of the pad
+ * @pad: the removed pad.
+ *
+ * Emited when a SSRC pad has been removed.
+ */
+ gst_rtp_ssrc_demux_signals[SIGNAL_REMOVED_SSRC_PAD] =
+ g_signal_new ("removed-ssrc-pad",
+ G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstRtpSsrcDemuxClass, removed_ssrc_pad),
+ NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_OBJECT,
+ G_TYPE_NONE, 2, G_TYPE_UINT, GST_TYPE_PAD);
+
+ /**
+ * GstRtpSsrcDemux::clear-ssrc:
+ * @demux: the object which received the signal
+ * @ssrc: the SSRC of the pad
+ *
+ * Action signal to remove the pad for SSRC.
+ */
+ gst_rtp_ssrc_demux_signals[SIGNAL_CLEAR_SSRC] =
+ g_signal_new ("clear-ssrc",
+ G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET (GstRtpSsrcDemuxClass, clear_ssrc),
+ NULL, NULL, gst_rtp_bin_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT);
+
gstelement_klass->change_state =
GST_DEBUG_FUNCPTR (gst_rtp_ssrc_demux_change_state);
+ gstrtpssrcdemux_klass->clear_ssrc =
+ GST_DEBUG_FUNCPTR (gst_rtp_ssrc_demux_clear_ssrc);
GST_DEBUG_CATEGORY_INIT (gst_rtp_ssrc_demux_debug,
"rtpssrcdemux", 0, "RTP SSRC demuxer");
@@ -342,6 +379,43 @@ gst_rtp_ssrc_demux_finalize (GObject * object)
G_OBJECT_CLASS (parent_class)->finalize (object);
}
+static void
+gst_rtp_ssrc_demux_clear_ssrc (GstRtpSsrcDemux * demux, guint32 ssrc)
+{
+ GstRtpSsrcDemuxPad *dpad;
+
+ GST_PAD_LOCK (demux);
+ dpad = find_demux_pad_for_ssrc (demux, ssrc);
+ if (dpad != NULL)
+ goto unknown_pad;
+
+ GST_DEBUG_OBJECT (demux, "clearing pad for SSRC %08x", ssrc);
+
+ demux->srcpads = g_slist_remove (demux->srcpads, dpad);
+ GST_PAD_UNLOCK (demux);
+
+ gst_pad_set_active (dpad->rtp_pad, FALSE);
+ gst_pad_set_active (dpad->rtcp_pad, FALSE);
+
+ g_signal_emit (G_OBJECT (demux),
+ gst_rtp_ssrc_demux_signals[SIGNAL_REMOVED_SSRC_PAD], 0, ssrc,
+ dpad->rtp_pad);
+
+ gst_element_remove_pad (GST_ELEMENT_CAST (demux), dpad->rtp_pad);
+ gst_element_remove_pad (GST_ELEMENT_CAST (demux), dpad->rtcp_pad);
+
+ g_free (dpad);
+
+ return;
+
+ /* ERRORS */
+unknown_pad:
+ {
+ g_warning ("unknown SSRC %08x", ssrc);
+ return;
+ }
+}
+
static gboolean
gst_rtp_ssrc_demux_sink_event (GstPad * pad, GstEvent * event)
{
@@ -483,7 +557,7 @@ gst_rtp_ssrc_demux_rtcp_chain (GstPad * pad, GstBuffer * buf)
NULL);
break;
default:
- goto invalid_rtcp;
+ goto unexpected_rtcp;
}
GST_DEBUG_OBJECT (demux, "received RTCP of SSRC %08x", ssrc);
@@ -511,6 +585,12 @@ invalid_rtcp:
gst_buffer_unref (buf);
return GST_FLOW_ERROR;
}
+unexpected_rtcp:
+ {
+ GST_DEBUG_OBJECT (demux, "dropping unexpected RTCP packet");
+ gst_buffer_unref (buf);
+ return GST_FLOW_OK;
+ }
create_failed:
{
GST_ELEMENT_ERROR (demux, STREAM, DECODE, (NULL),
diff --git a/gst/rtpmanager/gstrtpssrcdemux.h b/gst/rtpmanager/gstrtpssrcdemux.h
index d89472af..d5a13caf 100644
--- a/gst/rtpmanager/gstrtpssrcdemux.h
+++ b/gst/rtpmanager/gstrtpssrcdemux.h
@@ -50,7 +50,11 @@ struct _GstRtpSsrcDemuxClass
GstElementClass parent_class;
/* signals */
- void (*new_ssrc_pad) (GstElement *element, guint32 ssrc, GstPad *pad);
+ void (*new_ssrc_pad) (GstRtpSsrcDemux *demux, guint32 ssrc, GstPad *pad);
+ void (*removed_ssrc_pad) (GstRtpSsrcDemux *demux, guint32 ssrc, GstPad *pad);
+
+ /* actions */
+ void (*clear_ssrc) (GstRtpSsrcDemux *demux, guint32 ssrc);
};
GType gst_rtp_ssrc_demux_get_type (void);
diff --git a/gst/rtpmanager/rtpsource.c b/gst/rtpmanager/rtpsource.c
index a40d974f..355526ee 100644
--- a/gst/rtpmanager/rtpsource.c
+++ b/gst/rtpmanager/rtpsource.c
@@ -188,12 +188,51 @@ rtp_source_finalize (GObject * object)
G_OBJECT_CLASS (rtp_source_parent_class)->finalize (object);
}
+#define MAX_ADDRESS 64
+static void
+make_address_string (GstNetAddress * addr, gchar * dest, gulong n)
+{
+ switch (gst_netaddress_get_net_type (addr)) {
+ case GST_NET_TYPE_IP4:
+ {
+ guint32 address;
+ guint16 port;
+
+ gst_netaddress_get_ip4_address (addr, &address, &port);
+
+ g_snprintf (dest, n, "%d.%d.%d.%d:%d", (address >> 24) & 0xff,
+ (address >> 16) & 0xff, (address >> 8) & 0xff, address & 0xff,
+ g_ntohs (port));
+ break;
+ }
+ case GST_NET_TYPE_IP6:
+ {
+ guint8 address[16];
+ guint16 port;
+
+ gst_netaddress_get_ip6_address (addr, address, &port);
+
+ g_snprintf (dest, n, "[%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x]:%d",
+ (address[0] << 8) | address[1], (address[2] << 8) | address[3],
+ (address[4] << 8) | address[5], (address[6] << 8) | address[7],
+ (address[8] << 8) | address[9], (address[10] << 8) | address[11],
+ (address[12] << 8) | address[13], (address[14] << 8) | address[15],
+ g_ntohs (port));
+ break;
+ }
+ default:
+ dest[0] = 0;
+ break;
+ }
+}
+
static GstStructure *
rtp_source_create_stats (RTPSource * src)
{
GstStructure *s;
gboolean is_sender = src->is_sender;
gboolean internal = src->internal;
+ gchar address_str[MAX_ADDRESS];
/* common data for all types of sources */
s = gst_structure_new ("application/x-rtp-source-stats",
@@ -204,6 +243,16 @@ rtp_source_create_stats (RTPSource * src)
"is-csrc", G_TYPE_BOOLEAN, src->is_csrc,
"is-sender", G_TYPE_BOOLEAN, is_sender, NULL);
+ /* add address and port */
+ if (src->have_rtp_from) {
+ make_address_string (&src->rtp_from, address_str, sizeof (address_str));
+ gst_structure_set (s, "rtp-from", G_TYPE_STRING, address_str, NULL);
+ }
+ if (src->have_rtcp_from) {
+ make_address_string (&src->rtcp_from, address_str, sizeof (address_str));
+ gst_structure_set (s, "rtcp-from", G_TYPE_STRING, address_str, NULL);
+ }
+
if (internal) {
/* our internal source */
if (is_sender) {
diff --git a/gst/sdp/gstsdpdemux.c b/gst/sdp/gstsdpdemux.c
index be34a22a..4deac870 100644
--- a/gst/sdp/gstsdpdemux.c
+++ b/gst/sdp/gstsdpdemux.c
@@ -51,6 +51,22 @@
#include <unistd.h>
#endif
+#ifdef G_OS_WIN32
+#ifdef _MSC_VER
+#include <Winsock2.h>
+#endif
+/* ws2_32.dll has getaddrinfo and freeaddrinfo on Windows XP and later.
+ * * minwg32 headers check WINVER before allowing the use of these */
+#ifndef WINVER
+#define WINVER 0x0501
+#endif
+#include <ws2tcpip.h>
+#else
+#include <sys/socket.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#endif
+
#include <stdlib.h>
#include <string.h>
#include <locale.h>
@@ -348,6 +364,39 @@ gst_sdp_demux_stream_free (GstSDPDemux * demux, GstSDPStream * stream)
g_free (stream);
}
+static gboolean
+is_multicast_address (const gchar * host_name)
+{
+ struct addrinfo hints;
+ struct addrinfo *ai;
+ struct addrinfo *res;
+ gboolean ret = FALSE;
+ int err;
+
+ memset (&hints, 0, sizeof (hints));
+ hints.ai_socktype = SOCK_DGRAM;
+
+ g_return_val_if_fail (host_name, FALSE);
+
+ if ((err = getaddrinfo (host_name, NULL, &hints, &res)) < 0)
+ return FALSE;
+
+ for (ai = res; !ret && ai; ai = ai->ai_next) {
+ if (ai->ai_family == AF_INET)
+ ret =
+ IN_MULTICAST (ntohl (((struct sockaddr_in *) ai->ai_addr)->
+ sin_addr.s_addr));
+ else
+ ret =
+ IN6_IS_ADDR_MULTICAST (&((struct sockaddr_in6 *) ai->
+ ai_addr)->sin6_addr);
+ }
+
+ freeaddrinfo (res);
+
+ return ret;
+}
+
static GstSDPStream *
gst_sdp_demux_create_stream (GstSDPDemux * demux, GstSDPMessage * sdp, gint idx)
{
@@ -395,6 +444,7 @@ gst_sdp_demux_create_stream (GstSDPDemux * demux, GstSDPMessage * sdp, gint idx)
stream->destination = conn->address;
stream->ttl = conn->ttl;
+ stream->multicast = is_multicast_address (stream->destination);
stream->rtp_port = gst_sdp_media_get_port (media);
if ((rtcp = gst_sdp_media_get_attribute_val (media, "rtcp"))) {
@@ -885,18 +935,24 @@ start_session_failure:
static gboolean
gst_sdp_demux_stream_configure_udp (GstSDPDemux * demux, GstSDPStream * stream)
{
- gchar *uri, *name;
+ gchar *uri, *name, *destination;
GstPad *pad;
GST_DEBUG_OBJECT (demux, "creating UDP sources for multicast");
+ /* if the destination is not a multicast address, we just want to listen on
+ * our local ports */
+ if (!stream->multicast)
+ destination = "0.0.0.0";
+ else
+ destination = stream->destination;
+
/* creating UDP source */
if (stream->rtp_port != -1) {
- GST_DEBUG_OBJECT (demux, "receiving RTP from %s:%d", stream->destination,
+ GST_DEBUG_OBJECT (demux, "receiving RTP from %s:%d", destination,
stream->rtp_port);
- uri = g_strdup_printf ("udp://%s:%d", stream->destination,
- stream->rtp_port);
+ uri = g_strdup_printf ("udp://%s:%d", destination, stream->rtp_port);
stream->udpsrc[0] = gst_element_make_from_uri (GST_URI_SRC, uri, NULL);
g_free (uri);
if (stream->udpsrc[0] == NULL)
@@ -933,10 +989,9 @@ gst_sdp_demux_stream_configure_udp (GstSDPDemux * demux, GstSDPStream * stream)
/* creating another UDP source */
if (stream->rtcp_port != -1) {
- GST_DEBUG_OBJECT (demux, "receiving RTCP from %s:%d", stream->destination,
+ GST_DEBUG_OBJECT (demux, "receiving RTCP from %s:%d", destination,
stream->rtcp_port);
- uri =
- g_strdup_printf ("udp://%s:%d", stream->destination, stream->rtcp_port);
+ uri = g_strdup_printf ("udp://%s:%d", destination, stream->rtcp_port);
stream->udpsrc[1] = gst_element_make_from_uri (GST_URI_SRC, uri, NULL);
g_free (uri);
if (stream->udpsrc[1] == NULL)
@@ -988,6 +1043,13 @@ gst_sdp_demux_stream_configure_udp_sink (GstSDPDemux * demux,
if (stream->udpsink == NULL)
goto no_sink_element;
+ /* we clear all destinations because we don't really know where to send the
+ * RTCP to and we want to avoid sending it to our own ports.
+ * FIXME when we get an RTCP packet from the sender, we could look at its
+ * source port and address and try to send RTCP there. */
+ if (!stream->multicast)
+ g_signal_emit_by_name (stream->udpsink, "clear");
+
/* no sync needed */
g_object_set (G_OBJECT (stream->udpsink), "sync", FALSE, NULL);
/* no async state changes needed */
diff --git a/gst/sdp/gstsdpdemux.h b/gst/sdp/gstsdpdemux.h
index 0ae60742..32a53293 100644
--- a/gst/sdp/gstsdpdemux.h
+++ b/gst/sdp/gstsdpdemux.h
@@ -68,6 +68,7 @@ struct _GstSDPStream {
gchar *destination;
guint ttl;
+ gboolean multicast;
/* our udp sink back to the server */
GstElement *udpsink;
diff --git a/gst/y4m/Makefile.am b/gst/y4m/Makefile.am
deleted file mode 100644
index 4415e9e2..00000000
--- a/gst/y4m/Makefile.am
+++ /dev/null
@@ -1,10 +0,0 @@
-
-plugin_LTLIBRARIES = libgsty4menc.la
-
-libgsty4menc_la_SOURCES = gsty4mencode.c
-libgsty4menc_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS)
-libgsty4menc_la_LIBADD = $(GST_LIBS)
-libgsty4menc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libgsty4menc_la_LIBTOOLFLAGS = --tag=disable-static
-
-noinst_HEADERS = gsty4mencode.h
diff --git a/gst/y4m/gsty4mencode.c b/gst/y4m/gsty4mencode.c
deleted file mode 100644
index dc218643..00000000
--- a/gst/y4m/gsty4mencode.c
+++ /dev/null
@@ -1,332 +0,0 @@
-/* GStreamer
- * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
- * Copyright (C) <2006> Mark Nauwelaerts <mnauw@users.sourceforge.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-y4menc
- *
- * <refsect2>
- * <para>
- * Creates a YU4MPEG2 raw video stream as defined by the mjpegtools project.
- * </para>
- * <title>Example launch line</title>
- * <para>
- * (write everything in one line, without the backslash characters)
- * <programlisting>
- * gst-launch-0.10 videotestsrc num-buffers=250 \
- * ! 'video/x-raw-yuv,format=(fourcc)I420,width=320,height=240,framerate=(fraction)25/1' \
- * ! y4menc ! filesink location=test.yuv
- * </programlisting>
- * </para>
- * </refsect2>
- *
- */
-
-/* see mjpegtools/yuv4mpeg.h for yuv4mpeg format */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <string.h>
-#include <gst/gst.h>
-#include <gst/video/video.h>
-#include "gsty4mencode.h"
-
-static const GstElementDetails y4mencode_details =
-GST_ELEMENT_DETAILS ("YUV4MPEG video encoder",
- "Codec/Encoder/Video",
- "Encodes a YUV frame into the yuv4mpeg format (mjpegtools)",
- "Wim Taymans <wim.taymans@chello.be>");
-
-
-/* Filter signals and args */
-enum
-{
- /* FILL ME */
- LAST_SIGNAL
-};
-
-enum
-{
- ARG_0
-};
-
-static GstStaticPadTemplate y4mencode_src_factory =
-GST_STATIC_PAD_TEMPLATE ("src",
- GST_PAD_SRC,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS ("application/x-yuv4mpeg, " "y4mversion = (int) 2")
- );
-
-static GstStaticPadTemplate y4mencode_sink_factory =
-GST_STATIC_PAD_TEMPLATE ("sink",
- GST_PAD_SINK,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{ IYUV, I420 }"))
- );
-
-
-static void gst_y4m_encode_set_property (GObject * object,
- guint prop_id, const GValue * value, GParamSpec * pspec);
-static void gst_y4m_encode_get_property (GObject * object,
- guint prop_id, GValue * value, GParamSpec * pspec);
-
-static void gst_y4m_encode_reset (GstY4mEncode * filter);
-
-static gboolean gst_y4m_encode_setcaps (GstPad * pad, GstCaps * vscaps);
-static GstFlowReturn gst_y4m_encode_chain (GstPad * pad, GstBuffer * buf);
-static GstStateChangeReturn gst_y4m_encode_change_state (GstElement * element,
- GstStateChange transition);
-
-GST_BOILERPLATE (GstY4mEncode, gst_y4m_encode, GstElement, GST_TYPE_ELEMENT);
-
-
-static void
-gst_y4m_encode_base_init (gpointer g_class)
-{
- GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&y4mencode_src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&y4mencode_sink_factory));
- gst_element_class_set_details (element_class, &y4mencode_details);
-}
-
-static void
-gst_y4m_encode_class_init (GstY4mEncodeClass * klass)
-{
- GObjectClass *gobject_class;
- GstElementClass *gstelement_class;
-
- gobject_class = (GObjectClass *) klass;
- gstelement_class = (GstElementClass *) klass;
-
- gstelement_class->change_state =
- GST_DEBUG_FUNCPTR (gst_y4m_encode_change_state);
-
- gobject_class->set_property = gst_y4m_encode_set_property;
- gobject_class->get_property = gst_y4m_encode_get_property;
-}
-
-static void
-gst_y4m_encode_init (GstY4mEncode * filter, GstY4mEncodeClass * klass)
-{
- filter->sinkpad =
- gst_pad_new_from_static_template (&y4mencode_sink_factory, "sink");
- gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad);
- gst_pad_set_chain_function (filter->sinkpad,
- GST_DEBUG_FUNCPTR (gst_y4m_encode_chain));
- gst_pad_set_setcaps_function (filter->sinkpad,
- GST_DEBUG_FUNCPTR (gst_y4m_encode_setcaps));
-
- filter->srcpad =
- gst_pad_new_from_static_template (&y4mencode_src_factory, "src");
- gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad);
- gst_pad_use_fixed_caps (filter->srcpad);
-
- /* init properties */
- gst_y4m_encode_reset (filter);
-}
-
-static void
-gst_y4m_encode_reset (GstY4mEncode * filter)
-{
- filter->width = filter->height = -1;
- filter->fps_num = filter->fps_den = 1;
- filter->par_num = filter->par_den = 1;
-}
-
-static gboolean
-gst_y4m_encode_setcaps (GstPad * pad, GstCaps * vscaps)
-{
- GstY4mEncode *filter;
- GstStructure *structure;
- gboolean res;
- gint w, h;
- const GValue *fps, *par;
-
- filter = GST_Y4M_ENCODE (GST_PAD_PARENT (pad));
-
- structure = gst_caps_get_structure (vscaps, 0);
-
- res = gst_structure_get_int (structure, "width", &w);
- res &= gst_structure_get_int (structure, "height", &h);
- res &= ((fps = gst_structure_get_value (structure, "framerate")) != NULL);
-
- if (!res || w <= 0 || h <= 0 || !GST_VALUE_HOLDS_FRACTION (fps))
- return FALSE;
-
- /* optional par info */
- par = gst_structure_get_value (structure, "pixel-aspect-ratio");
-
- filter->width = w;
- filter->height = h;
- filter->fps_num = gst_value_get_fraction_numerator (fps);
- filter->fps_den = gst_value_get_fraction_denominator (fps);
- if ((par != NULL) && GST_VALUE_HOLDS_FRACTION (par)) {
- filter->par_num = gst_value_get_fraction_numerator (par);
- filter->par_den = gst_value_get_fraction_denominator (par);
- } else { /* indicates unknown */
- filter->par_num = 0;
- filter->par_den = 0;
- }
-
- /* the template caps will do for the src pad, should always accept */
- return gst_pad_set_caps (filter->srcpad,
- gst_static_pad_template_get_caps (&y4mencode_src_factory));
-}
-
-static inline GstBuffer *
-gst_y4m_encode_get_stream_header (GstY4mEncode * filter)
-{
- gpointer header;
- GstBuffer *buf;
-
- header = g_strdup_printf ("YUV4MPEG2 W%d H%d I? F%d:%d A%d:%d\n",
- filter->width, filter->height,
- filter->fps_num, filter->fps_den, filter->par_num, filter->par_den);
-
- buf = gst_buffer_new ();
- gst_buffer_set_data (buf, header, strlen (header));
- /* so it gets free'd when needed */
- GST_BUFFER_MALLOCDATA (buf) = header;
-
- return buf;
-}
-
-static inline GstBuffer *
-gst_y4m_encode_get_frame_header (GstY4mEncode * filter)
-{
- gpointer header;
- GstBuffer *buf;
-
- header = g_strdup_printf ("FRAME\n");
-
- buf = gst_buffer_new ();
- gst_buffer_set_data (buf, header, strlen (header));
- /* so it gets free'd when needed */
- GST_BUFFER_MALLOCDATA (buf) = header;
-
- return buf;
-}
-
-static GstFlowReturn
-gst_y4m_encode_chain (GstPad * pad, GstBuffer * buf)
-{
- GstY4mEncode *filter = GST_Y4M_ENCODE (GST_PAD_PARENT (pad));
- GstBuffer *outbuf;
-
- /* check we got some decent info from caps */
- if (filter->width < 0) {
- GST_ELEMENT_ERROR ("filter", CORE, NEGOTIATION, (NULL),
- ("format wasn't negotiated before chain function"));
- gst_buffer_unref (buf);
- return GST_FLOW_NOT_NEGOTIATED;
- }
-
- if (G_UNLIKELY (!filter->header)) {
- outbuf = gst_y4m_encode_get_stream_header (filter);
- filter->header = TRUE;
- outbuf = gst_buffer_join (outbuf, gst_y4m_encode_get_frame_header (filter));
- } else {
- outbuf = gst_y4m_encode_get_frame_header (filter);
- }
- /* join with data */
- outbuf = gst_buffer_join (outbuf, buf);
- /* decorate */
- gst_buffer_make_metadata_writable (outbuf);
- gst_buffer_set_caps (outbuf, GST_PAD_CAPS (filter->srcpad));
- /* strip to avoid sink dropping on time-base, decorate and send */
- GST_BUFFER_TIMESTAMP (outbuf) = GST_CLOCK_TIME_NONE;
- return gst_pad_push (filter->srcpad, outbuf);
-}
-
-static void
-gst_y4m_encode_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec)
-{
- GstY4mEncode *filter;
-
- g_return_if_fail (GST_IS_Y4M_ENCODE (object));
- filter = GST_Y4M_ENCODE (object);
-
- switch (prop_id) {
- default:
- break;
- }
-}
-
-static void
-gst_y4m_encode_get_property (GObject * object, guint prop_id, GValue * value,
- GParamSpec * pspec)
-{
- GstY4mEncode *filter;
-
- g_return_if_fail (GST_IS_Y4M_ENCODE (object));
- filter = GST_Y4M_ENCODE (object);
-
- switch (prop_id) {
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static GstStateChangeReturn
-gst_y4m_encode_change_state (GstElement * element, GstStateChange transition)
-{
- GstY4mEncode *filter = GST_Y4M_ENCODE (element);
- GstStateChangeReturn ret;
-
- switch (transition) {
- case GST_STATE_CHANGE_NULL_TO_READY:
- case GST_STATE_CHANGE_READY_TO_PAUSED:
- break;
- default:
- break;
- }
-
- ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state,
- (element, transition), GST_STATE_CHANGE_SUCCESS);
- if (ret != GST_STATE_CHANGE_SUCCESS)
- return ret;
-
- switch (transition) {
- case GST_STATE_CHANGE_PAUSED_TO_READY:
- gst_y4m_encode_reset (filter);
- break;
- default:
- break;
- }
-
- return GST_STATE_CHANGE_SUCCESS;
-}
-
-static gboolean
-plugin_init (GstPlugin * plugin)
-{
- return gst_element_register (plugin, "y4menc", GST_RANK_NONE,
- GST_TYPE_Y4M_ENCODE);
-}
-
-GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
- GST_VERSION_MINOR,
- "y4menc",
- "Encodes a YUV frame into the yuv4mpeg format (mjpegtools)",
- plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/gst/y4m/gsty4mencode.h b/gst/y4m/gsty4mencode.h
deleted file mode 100644
index 1ca8105a..00000000
--- a/gst/y4m/gsty4mencode.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* GStreamer
- * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
- *
- * 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_Y4MENCODE_H__
-#define __GST_Y4MENCODE_H__
-
-
-#include <gst/gst.h>
-
-G_BEGIN_DECLS
-
-#define GST_TYPE_Y4M_ENCODE \
- (gst_y4m_encode_get_type())
-#define GST_Y4M_ENCODE(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_Y4M_ENCODE, GstY4mEncode))
-#define GST_Y4M_ENCODE_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_Y4M_ENCODE, GstY4mEncodeClass))
-#define GST_Y4M_ENCODE_GET_CLASS(obj) \
- (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_Y4M_ENCODE, GstY4mEncodeClass))
-#define GST_IS_Y4M_ENCODE(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_Y4M_ENCODE))
-#define GST_IS_Y4M_ENCODE_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_Y4M_ENCODE))
-
-typedef struct _GstY4mEncode GstY4mEncode;
-typedef struct _GstY4mEncodeClass GstY4mEncodeClass;
-
-struct _GstY4mEncode {
- GstElement element;
-
- GstPad *sinkpad,*srcpad;
-
- /* caps information */
- gint width, height;
- gint fps_num, fps_den;
- gint par_num, par_den;
-
- /* state information */
- gboolean header;
-};
-
-struct _GstY4mEncodeClass {
- GstElementClass parent_class;
-};
-
-GType gst_y4m_encode_get_type(void);
-
-G_END_DECLS
-
-#endif /* __GST_Y4MENCODE_H__ */
diff --git a/m4/gst-fionread.m4 b/m4/gst-fionread.m4
index dff19df9..603aa457 100644
--- a/m4/gst-fionread.m4
+++ b/m4/gst-fionread.m4
@@ -1,7 +1,7 @@
AC_DEFUN([GST_CHECK_FIONREAD], [
AC_MSG_CHECKING(for FIONREAD in sys/ioctl.h)
- AC_CACHE_VAL(GST_FIONREAD_IN_SYS_IOCTL, [
+ AC_CACHE_VAL(_cv_gst_fionread_in_sys_ioctl, [
AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/ioctl.h>
@@ -9,18 +9,18 @@ AC_DEFUN([GST_CHECK_FIONREAD], [
int x = FIONREAD;
if ( x )
return 0;
- ], GST_FIONREAD_IN_SYS_IOCTL="yes",GST_FIONREAD_IN_SYS_IOCTL="no")
+ ], _cv_gst_fionread_in_sys_ioctl="yes",_cv_gst_fionread_in_sys_ioctl="no")
])
- AC_MSG_RESULT($GST_FIONREAD_IN_SYS_IOCTL)
+ AC_MSG_RESULT($_cv_gst_fionread_in_sys_ioctl)
- if test "$GST_FIONREAD_IN_SYS_IOCTL" = "yes"; then
+ if test "$_cv_gst_fionread_in_sys_ioctl" = "yes"; then
AC_DEFINE([HAVE_FIONREAD_IN_SYS_IOCTL], 1, [FIONREAD ioctl found in sys/ioclt.h])
else
AC_MSG_CHECKING(for FIONREAD in sys/filio.h)
- AC_CACHE_VAL(GST_FIONREAD_IN_SYS_FILIO, [
+ AC_CACHE_VAL(_cv_gst_fionread_in_sys_filio, [
AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/filio.h>
@@ -28,12 +28,12 @@ if ( x )
int x = FIONREAD;
if ( x )
return 0;
- ], GST_FIONREAD_IN_SYS_FILIO="yes",GST_FIONREAD_IN_SYS_FILIO="no")
+ ], _cv_gst_fionread_in_sys_filio="yes",_cv_gst_fionread_in_sys_filio="no")
])
- AC_MSG_RESULT($GST_FIONREAD_IN_SYS_FILIO)
+ AC_MSG_RESULT($_cv_gst_fionread_in_sys_filio)
- if test "$GST_FIONREAD_IN_SYS_FILIO" = "yes"; then
+ if test "$_cv_gst_fionread_in_sys_filio" = "yes"; then
AC_DEFINE([HAVE_FIONREAD_IN_SYS_FILIO], 1, [FIONREAD ioctl found in sys/filio.h])
fi
diff --git a/po/Makevars b/po/Makevars
index 61559233..a6bdc7fa 100644
--- a/po/Makevars
+++ b/po/Makevars
@@ -39,3 +39,8 @@ MSGID_BUGS_ADDRESS = http://bugzilla.gnome.org/
# This is the list of locale categories, beyond LC_MESSAGES, for which the
# message catalogs shall be used. It is usually empty.
EXTRA_LOCALE_CATEGORIES =
+
+# Avoid line numbers in *.po, but keep them in *.pot.
+MSGMERGE = msgmerge --no-location
+MSGMERGE_UPDATE = msgmerge --no-location --update
+MSGFILTER = msgfilter --no-location
diff --git a/po/af.po b/po/af.po
index 623a635d..26239a60 100644
--- a/po/af.po
+++ b/po/af.po
@@ -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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -15,385 +15,295 @@ msgstr ""
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ext/resindvd/resindvdsrc.c:333
#, fuzzy
msgid "Could not read title information for DVD."
msgstr "Kon nie skryf na lêer \"%s\" nie."
-#: ext/resindvd/resindvdsrc.c:339
#, fuzzy, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Kon nie beheertoestel \"%s\" toemaak nie."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr ""
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
#, fuzzy
msgid "No file name specified for writing."
msgstr "Geen lêernaam gespesifiseer."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Kon nie lêer \"%s\" oopmaak om in te skryf nie."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr ""
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Kon nie skryf na lêer \"%s\" nie."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "Toestel \"%s\" bestaan nie."
-#: sys/dvb/gstdvbsrc.c:703
#, fuzzy, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Kon nie beheertoestel \"%s\" toemaak nie."
-#: sys/dvb/gstdvbsrc.c:715
#, fuzzy, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Kon nie genoeg buffers vanaf toestel \"%s\" kry nie."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Kon nie lêer \"%s\" oopmaak om te lees nie."
-#: sys/oss4/oss4-mixer.c:302
#, fuzzy
msgid "Could not open audio device for mixer control handling."
msgstr "Kon nie oudio-toestel \"%s\" oopmaak vir skryf nie."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
msgstr ""
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr ""
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr ""
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr ""
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr ""
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr ""
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr ""
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr ""
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr ""
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr ""
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr ""
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr ""
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr ""
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
#, fuzzy
msgid "Rear"
msgstr "Neem op"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
#, fuzzy
msgid "Side"
msgstr "Video"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr ""
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Mikrofoon"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr ""
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Lyn-in"
-#: sys/oss4/oss4-mixer.c:739
#, fuzzy
msgid "PCM 1"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:740
#, fuzzy
msgid "PCM 2"
msgstr "PCM-2"
-#: sys/oss4/oss4-mixer.c:741
#, fuzzy
msgid "PCM 3"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:742
#, fuzzy
msgid "PCM 4"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr ""
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr ""
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr ""
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
msgstr ""
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
msgstr ""
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
#, fuzzy
msgid "Could not open audio device for playback."
msgstr "Kon nie oudio-toestel \"%s\" oopmaak vir skryf nie."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
msgstr ""
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr ""
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr ""
diff --git a/po/az.po b/po/az.po
index 1950ffde..90d270ff 100644
--- a/po/az.po
+++ b/po/az.po
@@ -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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -16,385 +16,295 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: KBabel 1.0.2\n"
-#: ext/resindvd/resindvdsrc.c:333
#, fuzzy
msgid "Could not read title information for DVD."
msgstr "\"%s\" faylına yazıla bilmədi."
-#: ext/resindvd/resindvdsrc.c:339
#, fuzzy, c-format
msgid "Failed to open DVD device '%s'."
msgstr "\"%s\" idarə avadanlığı bağlana bilmədi."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr ""
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
#, fuzzy
msgid "No file name specified for writing."
msgstr "Fayl adı verilməyib."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "\"%s\" faylı yazma üçün açıla bilmədi."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr ""
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "\"%s\" faylına yazıla bilmədi."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "\"%s\" avadanlığı mövcud deyil."
-#: sys/dvb/gstdvbsrc.c:703
#, fuzzy, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "\"%s\" idarə avadanlığı bağlana bilmədi."
-#: sys/dvb/gstdvbsrc.c:715
#, fuzzy, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "\"%s\" avadanlığından kifayət qədər bufferlər alına bilmədi."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "\"%s\" faylı oxuma üçün açıla bilmədi."
-#: sys/oss4/oss4-mixer.c:302
#, fuzzy
msgid "Could not open audio device for mixer control handling."
msgstr "\"%s\" audio avadanlığı yazma üçün açıla bilmədi."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
msgstr ""
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr ""
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr ""
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr ""
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr ""
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr ""
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr ""
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr ""
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr ""
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr ""
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr ""
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr ""
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr ""
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
#, fuzzy
msgid "Rear"
msgstr "Qeyd"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
#, fuzzy
msgid "Side"
msgstr "Video"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr ""
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Mikrofon"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr ""
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Xətd-giriş"
-#: sys/oss4/oss4-mixer.c:739
#, fuzzy
msgid "PCM 1"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:740
#, fuzzy
msgid "PCM 2"
msgstr "PCM-2"
-#: sys/oss4/oss4-mixer.c:741
#, fuzzy
msgid "PCM 3"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:742
#, fuzzy
msgid "PCM 4"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr ""
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr ""
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr ""
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
msgstr ""
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
msgstr ""
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
#, fuzzy
msgid "Could not open audio device for playback."
msgstr "\"%s\" audio avadanlığı yazma üçün açıla bilmədi."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
msgstr ""
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr ""
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr ""
diff --git a/po/bg.po b/po/bg.po
index 346f9c81..ea593be4 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -1,14 +1,14 @@
# Bulgarian translation of gst-plugins-bad.
-# Copyright (C) 2007, 2008 Free Software Fondation, Inc.
+# Copyright (C) 2007, 2008, 2009 Free Software Fondation, Inc.
# This file is distributed under the same license as the gst-plugins-bad package.
-# Alexander Shopov <ash@contact.bg>, 2007, 2008.
+# Alexander Shopov <ash@contact.bg>, 2007, 2008, 2009.
#
msgid ""
msgstr ""
-"Project-Id-Version: gst-plugins-bad 0.10.7.2\n"
+"Project-Id-Version: gst-plugins-bad 0.10.11.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2009-03-20 23:36+0000\n"
-"PO-Revision-Date: 2008-07-21 11:20+0300\n"
+"POT-Creation-Date: 2009-05-20 20:43+0100\n"
+"PO-Revision-Date: 2009-05-15 08:31+0300\n"
"Last-Translator: Alexander Shopov <ash@contact.bg>\n"
"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
"MIME-Version: 1.0\n"
@@ -16,379 +16,293 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-#: ext/resindvd/resindvdsrc.c:333
-#, fuzzy
msgid "Could not read title information for DVD."
-msgstr "Във файла „%s“ не може да Ñе пише."
+msgstr "ИнформациÑта за заглавието на DVD-то не може да бъде прочетена."
-#: ext/resindvd/resindvdsrc.c:339
-#, fuzzy, c-format
+#, c-format
msgid "Failed to open DVD device '%s'."
-msgstr "УÑтройÑтвото „%s“ не може да бъде отворено."
+msgstr "УÑтройÑтвото за DVD „%s“ не може да бъде отворено."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
-msgstr ""
+msgstr "ÐеуÑпех при задаване на Ñ‚ÑŠÑ€Ñене чрез PGC."
-#: ext/resindvd/rsnbasesrc.c:1659
-#, fuzzy
msgid "Internal clock error."
-msgstr "Вътрешна грешка в потока от данни."
+msgstr "Вътрешна грешка в чаÑовника."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
-#, fuzzy
msgid "Internal data flow error."
msgstr "Вътрешна грешка в потока от данни."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "Ðе е указано име на файл, в който да Ñе пише."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Файлът „%s“ не може да бъде отворен за запиÑ."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "Вътрешна грешка в потока от данни."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Във файла „%s“ не може да Ñе пише."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "УÑтройÑтвото „%s“ не ÑъщеÑтвува."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "УÑтройÑтвото „%s“ не може да бъде отворено."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Ðе могат да бъдат получени наÑтройките от уÑтройÑтвото „%s“."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Файлът „%s“ не може да бъде отворен за четене."
-#: sys/oss4/oss4-mixer.c:302
-#, fuzzy
msgid "Could not open audio device for mixer control handling."
-msgstr "Файлът „%s“ не може да бъде отворен за четене."
+msgstr ""
+"Ðудио уÑтройÑтвото не може да бъде отворено за управление на ÑмеÑването."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
msgstr ""
+"Ðудио уÑтройÑтвото не може да бъде отворено за управление на ÑмеÑването. "
+"Тази верÑÐ¸Ñ Ð½Ð° Open Sound System не Ñе поддържа от този елемент."
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
-msgstr ""
+msgstr "Бързо"
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
-msgstr ""
+msgstr "ÐиÑки"
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
-msgstr ""
+msgstr "Средни"
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
-msgstr ""
+msgstr "ВиÑоки"
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
-msgstr ""
+msgstr "Много виÑоки"
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
-msgstr ""
+msgstr "ПроизводÑтво"
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
-msgstr ""
+msgstr "Изключено"
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
-msgstr ""
+msgstr "Включено"
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
-msgstr ""
+msgstr "Стерео"
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
-msgstr ""
+msgstr "Стерео и Ñъраунд"
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
-msgstr ""
+msgstr "ВходÑщ ÑмеÑител"
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
-msgstr ""
+msgstr "Отпред"
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
-msgstr ""
+msgstr "Отзад"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
-msgstr ""
+msgstr "ОтÑтрани"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
-msgstr ""
+msgstr "Център/баÑи"
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
-msgstr ""
+msgstr "Микрофон"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
-msgstr ""
+msgstr "Микрофон на Ð¿Ñ€ÐµÐ´Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
-msgstr ""
+msgstr "Вход"
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
-msgstr ""
+msgstr "ВходÑщ канал"
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
-msgstr ""
+msgstr "PCM 1"
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
-msgstr ""
+msgstr "PCM 2"
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
-msgstr ""
+msgstr "PCM 3"
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
-msgstr ""
+msgstr "PCM 4"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
-msgstr ""
+msgstr "Зелено гнездо"
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
-msgstr ""
+msgstr "Зелено гнездо на Ð¿Ñ€ÐµÐ´Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
-msgstr ""
+msgstr "Розово гнездо"
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
-msgstr ""
+msgstr "Розово гнездо на Ð¿Ñ€ÐµÐ´Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
-msgstr ""
+msgstr "Синьо гнездо"
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
-msgstr ""
+msgstr "Синьо гнездо на Ð¿Ñ€ÐµÐ´Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
-msgstr ""
+msgstr "Оранжево гнездо"
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
-msgstr ""
+msgstr "Оранжево гнездо на предни панел"
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
-msgstr ""
+msgstr "Черно гнездо"
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
-msgstr ""
+msgstr "Черно гнездо на Ð¿Ñ€ÐµÐ´Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
-msgstr ""
+msgstr "Сиво гнездо"
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
-msgstr ""
+msgstr "Сиво гнездо на Ð¿Ñ€ÐµÐ´Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
-msgstr ""
+msgstr "БÑло гнездо"
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
-msgstr ""
+msgstr "БÑло гнездо на Ð¿Ñ€ÐµÐ´Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
-msgstr ""
+msgstr "Червено гнездо"
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
-msgstr ""
+msgstr "Червено гнездо на Ð¿Ñ€ÐµÐ´Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
-msgstr ""
+msgstr "Жълто гнездо"
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
-msgstr ""
+msgstr "Жълто гнездо на Ð¿Ñ€ÐµÐ´Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
-msgstr ""
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° зеленото гнездо"
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
-msgstr ""
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° зеленото гнездо на Ð¿Ñ€ÐµÐ´Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
-msgstr ""
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° розовото гнездо"
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
-msgstr ""
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° розовото гнездо на Ð¿Ñ€ÐµÐ´Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
-msgstr ""
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° Ñиньото гнездо"
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
-msgstr ""
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° Ñиньото гнездо на Ð¿Ñ€ÐµÐ´Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
-msgstr ""
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° оранжевото гнездо"
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
-msgstr ""
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° оранжевото гнездо на Ð¿Ñ€ÐµÐ´Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
-msgstr ""
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° черното гнездо"
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
-msgstr ""
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° черното гнездо на Ð¿Ñ€ÐµÐ´Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
-msgstr ""
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° Ñивото гнездо"
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
-msgstr ""
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° Ñивото гнездо на Ð¿Ñ€ÐµÐ´Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
-msgstr ""
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° бÑлото гнездо"
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
-msgstr ""
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° бÑлото гнездо на Ð¿Ñ€ÐµÐ´Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
-msgstr ""
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° червеното гнездо"
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
-msgstr ""
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° червеното гнездо на Ð¿Ñ€ÐµÐ´Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
-msgstr ""
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° жълтото гнездо"
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
-msgstr ""
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° жълтото гнездо на Ð¿Ñ€ÐµÐ´Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
-msgstr ""
+msgstr "ВходÑщ канал на Ð¿Ñ€ÐµÐ´Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
-msgstr ""
+msgstr "Слушалки"
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
-msgstr ""
+msgstr "Слушалки на Ð¿Ñ€ÐµÐ´Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
-msgstr ""
+msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
-msgstr ""
+msgstr "Вход на виртуален ÑмеÑител"
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
-msgstr ""
+msgstr "Изход на виртуален ÑмеÑител"
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
-msgstr ""
+msgstr "ÐаÑтройки на каналите на виртуален ÑмеÑител"
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
msgstr ""
+"Ðудио уÑтройÑтвото не може да бъде отворено за изпълнение. използва Ñе от "
+"друго приложение."
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
msgstr ""
+"Ðудио уÑтройÑтвото не може да бъде отворено за изпълнение. ÐÑмате "
+"необходимите права."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
-#, fuzzy
msgid "Could not open audio device for playback."
-msgstr "УÑтройÑтвото „%s“ не може да бъде отворено."
+msgstr "Ðудио уÑтройÑтвото не може да бъде отворено за изпълнение."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
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 не Ñе поддържа от този елемент."
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
-msgstr ""
+msgstr "Това аудио уÑтройÑтво не поддържа изпълнение."
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
-msgstr ""
+msgstr "Грешка при изпълнение на аудиото."
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
-msgstr ""
+msgstr "Това аудио уÑтройÑтво не поддържа запиÑ."
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
-msgstr ""
+msgstr "Грешка при запиÑа от аудио уÑтройÑтвото."
diff --git a/po/ca.po b/po/ca.po
index bd8311ff..3ac15545 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -15,387 +15,297 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ext/resindvd/resindvdsrc.c:333
#, fuzzy
msgid "Could not read title information for DVD."
msgstr "No s'ha pogut escriure al fitxer «%s»."
-#: ext/resindvd/resindvdsrc.c:339
#, fuzzy, c-format
msgid "Failed to open DVD device '%s'."
msgstr "No s'ha pogut tancar el dispositiu de control «%s»."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr ""
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
#, fuzzy
msgid "No file name specified for writing."
msgstr "No s'ha especificat cap nom de fitxer."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "No s'ha pogut obrir el fitxer «%s» per a l'escriptura."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr ""
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "No s'ha pogut escriure al fitxer «%s»."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "El dispositiu «%s» no existeix."
-#: sys/dvb/gstdvbsrc.c:703
#, fuzzy, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "No s'ha pogut tancar el dispositiu de control «%s»."
-#: sys/dvb/gstdvbsrc.c:715
#, fuzzy, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "No s'han pogut obtenir búfers suficients del dispositiu «%s»."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "No s'ha pogut obrir el fitxer «%s» per a la lectura."
-#: sys/oss4/oss4-mixer.c:302
#, fuzzy
msgid "Could not open audio device for mixer control handling."
msgstr "No s'ha pogut el dispositiu d'àudio «%s» per a l'escriptura."
-#: sys/oss4/oss4-mixer.c:316
#, fuzzy
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
msgstr "No s'ha pogut el dispositiu d'àudio «%s» per a l'escriptura."
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr ""
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr ""
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr ""
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr ""
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr ""
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr ""
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr ""
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr ""
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr ""
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr ""
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr ""
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr ""
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
#, fuzzy
msgid "Rear"
msgstr "Enregistrament"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
#, fuzzy
msgid "Side"
msgstr "Vídeo"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr ""
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Micròfon"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr ""
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Línia-entrada"
-#: sys/oss4/oss4-mixer.c:739
#, fuzzy
msgid "PCM 1"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:740
#, fuzzy
msgid "PCM 2"
msgstr "PCM-2"
-#: sys/oss4/oss4-mixer.c:741
#, fuzzy
msgid "PCM 3"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:742
#, fuzzy
msgid "PCM 4"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr ""
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr ""
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr ""
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
msgstr ""
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
#, fuzzy
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
msgstr "No s'ha pogut el dispositiu d'àudio «%s» per a l'escriptura."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
#, fuzzy
msgid "Could not open audio device for playback."
msgstr "No s'ha pogut el dispositiu d'àudio «%s» per a l'escriptura."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
msgstr ""
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr ""
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr ""
diff --git a/po/cs.po b/po/cs.po
index 60927dd3..1ebc58a8 100644
--- a/po/cs.po
+++ b/po/cs.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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -18,72 +18,56 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-#: ext/resindvd/resindvdsrc.c:333
msgid "Could not read title information for DVD."
msgstr "NezdaÅ™ilo se pÅ™eÄtení informací o titulu DVD."
-#: ext/resindvd/resindvdsrc.c:339
#, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Nezdařilo se otevření zařízení DVD \"%s\"."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr "Nezdařilo se nastavení hledání založeného na PGC."
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr "VnitÅ™ní chyba ÄasovaÄe."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr "Vnitřní chyba datového toku."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "K zápisu nebyl zadán žádný název souboru."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Nezdařilo se otevření souboru \"%s\" k zápisu."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "Chyba proudu vnitřních dat."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Nezdařil se zápis do souboru \"%s\"."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "Zařízení \"%s\" neexistuje."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Nezdařilo se otevření zařízení rozhraní \"%s\"."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Ze zařízení rozhraní \"%s\" se nezdařilo získat nastavení."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "NezdaÅ™ilo se otevÅ™ení souboru \"%s\" ke Ätení."
-#: sys/oss4/oss4-mixer.c:302
msgid "Could not open audio device for mixer control handling."
msgstr ""
"NezdaÅ™ilo se otevÅ™ení zvukového zařízení pro obsluhu ovládání směšovaÄe."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
@@ -91,271 +75,204 @@ msgstr ""
"NezdaÅ™ilo se otevÅ™ení zvukového zařízení k obsluze ovládání směšovaÄe. Tato "
"verze Open Sound System není příslušným prvkem podporována."
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr "Rychlé"
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr "Nízké"
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr "Střední"
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr "Vysoké"
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr "Velmi vysoké"
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr "Výroba"
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr "Vypnuto"
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr "Zapnuto"
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr "Stereo"
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr "Prostorový zvuk"
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr "SměšovaÄ vstupu"
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr "Přední"
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr "Zadní"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr "BoÄní"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr "Středový / LFE"
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Mikrofon"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr "Mikrofon na předním panelu"
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr "Vstup"
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Linkový vstup"
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr "PCM 1"
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr "PCM 2"
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr "PCM 3"
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr "PCM 4"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr "Zelený konektor"
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr "Zelený konektor na předním panelu"
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr "Růžový konektor"
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr "Růžový konektor na předním panelu"
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr "Modrý konektor"
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr "Modrý konektor na předním panelu"
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr "Oranžový konektor"
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr "Oranžový konektor na předním panelu"
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr "Černý konektor"
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr "Černý konektor na předním panelu"
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr "Šedý konektor"
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr "Šedý konektor na předním panelu"
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr "Bílý konektor"
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr "Bílý konektor na předním panelu"
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr "Červený konektor"
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr "Červený konektor na předním panelu"
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr "Žlutý konektor"
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr "Žlutý konektor na předním panelu"
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr "Funkce zeleného konektoru"
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr "Funkce zeleného konektoru na předním panelu"
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr "Funkce růžového konektoru"
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr "Funkce růžového konektoru na předním panelu"
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr "Funkce modrého konektoru"
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr "Funkce modrého konektoru na předním panelu"
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr "Funkce oranžového konektoru"
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr "Funkce oranžového konektoru na předním panelu"
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr "Funkce Äerného konektoru"
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr "Funkce Äerného konektoru na pÅ™edním panelu"
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr "Funkce šedého konektoru"
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr "Funkce šedého konektoru na předním panelu"
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr "Funkce bílého konektoru"
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr "Funkce bílého konektoru na předním panelu"
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr "Funkce Äerveného konektoru"
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr "Funkce Äerveného konektoru na pÅ™edním panelu"
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr "Funkce žlutého konektoru"
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr "Funkce žlutého konektoru na předním panelu"
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr "Linkový vstup na předním panelu"
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr "Sluchátka"
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr "Sluchátka na předním panelu"
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr "Vstup virtuálního směšovaÄe"
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr "Výstup virtuálního směšovaÄe"
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr "Konfigurace kanálu virtuálního směšovaÄe"
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
@@ -363,7 +280,6 @@ msgstr ""
"Nezdařilo se otevření zvukového zařízení k přehrávání. Zařízení je právě "
"používáno jinou aplikací."
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
@@ -371,11 +287,9 @@ msgstr ""
"Nezdařilo se otevření zvukového zařízení k přehrávání. Nemáte oprávnění k "
"otevření zařízení."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
msgid "Could not open audio device for playback."
msgstr "Nezdařilo se otevření zvukového zařízení k přehrávání."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
@@ -383,19 +297,15 @@ msgstr ""
"Nezdařilo se otevření zvukového zařízení k přehrávání. Tato verze Open Sound "
"System není příslušným prvkem podporována."
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr "Přehrávání není tímto zvukovým zařízením podporováno."
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr "Chyba přehrávání zvuku."
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr "Toto zvukové zařízení nepodporuje nahrávání."
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr "Chyba při nahrávání ze zvukového zařízení."
diff --git a/po/da.po b/po/da.po
index ff72a86d..6e876d71 100644
--- a/po/da.po
+++ b/po/da.po
@@ -1,86 +1,70 @@
# Danish translation of gst-plugins-bad.
-# Copyright (C) 2008 gst.
+# Copyright (C) 2009 gst.
# This file is distributed under the same license as the gst-plugins-bad package.
# Mogens Jaeger <mogens@jaeger.tf>, 2007.
-# Joe Hansen <joedalton2@yahoo.dk>, 2008.
+# Joe Hansen <joedalton2@yahoo.dk>, 2008, 2009.
#
msgid ""
msgstr ""
-"Project-Id-Version: gst-plugins-bad-0.10.8.3\n"
+"Project-Id-Version: gst-plugins-bad-0.10.10.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2009-03-20 23:36+0000\n"
-"PO-Revision-Date: 2008-11-05 11:28+0200\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ext/resindvd/resindvdsrc.c:333
msgid "Could not read title information for DVD."
msgstr "Kunne ikke læse titelinformation for dvd."
-#: ext/resindvd/resindvdsrc.c:339
#, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Kunne ikke åbne dvd-enhed »%s«."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
-msgstr ""
+msgstr "Kunne ikke indstille PGC-baseret søgning."
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr "Intern urfejl."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr "Intern datastrømfejl."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "Intet filnavn er angivet til skrivning."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
-msgstr "Kunne ikke åbne filen »%s« for skrivning."
+msgstr "Kunne ikke åbne filen »%s« til skrivning."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "Intern datastrømfejl."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Kunne ikke skrive til fil »%s«."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "Enheden »%s« eksisterer ikke."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Kunne ikke åbne forende-enheden »%s«."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Kunne ikke hente indstillinger fra forende-enheden »%s«."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Kunne ikke åbne filen »%s« for læsning."
-#: sys/oss4/oss4-mixer.c:302
msgid "Could not open audio device for mixer control handling."
msgstr "Kunne ikke åbne lydenhed til mikserpulthåndtering."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
@@ -88,280 +72,212 @@ msgstr ""
"Kunne ikke åbne lydenhed til mikserpulthåndtering. Denne version af Open "
"Sound System er ikke understøttet af dette element."
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr "Hurtig"
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr "Lav"
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr "Medium"
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr "Højt"
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr "Meget højt"
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr "Produktion"
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr "Slukket"
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr "Tændt"
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr "Stereo"
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr "Surround-lyd"
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr "Inddata mix"
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr "Front"
# bagende eller eller "Bag" hvis det er den bagerste lydkanal
# vi snakker om
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr "Bag"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr "Side"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr "Center / LFE"
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Mikrofon"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr "Frontpanelmikrofon"
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr "Inddata"
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Linje-ind"
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr "PCM 1"
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr "PCM 2"
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr "PCM 3"
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr "PCM 4"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr "Grøn forbindelse"
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr "Grøn frontpanelforbindelse"
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr "Lyserød forbindelse"
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr "Lyserød frontpanelforbindelse"
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr "Blå forbindelse"
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr "Blå frontpanelforbindelse"
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr "Orange forbindelse"
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr "Orange frontpanelforbindelse"
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr "Sort forbindelse"
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr "Sort frontpanelforbindelse"
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr "Grå forbindelse"
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr "Grå frontpanelforbindelse"
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr "Hvid forbindelse"
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr "Hvid frontpanelforbindelse"
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr "Rød forbindelse"
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr "Rød frontpanelforbindelse"
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr "Gul forbindelse"
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr "Gul frontpanelforbindelse"
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr "Grøn forbindelsesfunktion"
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr "Grøn frontpanelforbindelsesfunktion"
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr "Lyserød forbindelsesfunktion"
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr "Lyserød frontpanelforbindelsesfunktion"
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr "Blå forbindelsesfunktion"
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr "Blå frontpanelforbindelsesfunktion"
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr "Orange forbindelsesfunktion"
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr "Orange frontpanelforbindelsesfunktion"
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr "Sort forbindelsesfunktion"
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr "Sort frontpanelforbindelsesfunktion"
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr "Grå forbindelsesfunktion"
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr "Grå frontpanelforbindelsesfunktion"
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr "Hvid forbindelsesfunktion"
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr "Hvid frontpanelforbindelsesfunktion"
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr "Rød forbindelsesfunktion"
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr "Rød frontpanelforbindelsesfunktion"
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr "Gul forbindelsesfunktion"
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr "Gul frontpanelforbindelsesfunktion"
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr "Frontpanel linje-ind"
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr "Høretelefoner"
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr "Frontpanel høretelefoner"
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr "Virtuel mikserpultinddata"
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr "Virtuel mikserpultuddata"
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr "Virtuel mikserkanalkonfiguration"
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
msgstr ""
"Kunne ikke åbne lydenhed til afspilning. Enheden bruges af et andet program."
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
@@ -369,11 +285,9 @@ msgstr ""
"Kunne ikke åbne lydenhed til afspilning. Du har ikke rettigheder til at åbne "
"enheden."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
msgid "Could not open audio device for playback."
msgstr "Kunne ikke åbne lydenhed til afspilning."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
@@ -381,19 +295,15 @@ msgstr ""
"Kunne ikke åbne lydenhed for afspilning. Denne version af Open Sound System "
"er ikke understøttet af dette element."
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr "Afspilning er ikke understøttet af denne lydenhed."
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr "Fejl ved lydafspilning."
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr "Optagelse er ikke understøttet af denne lydenhed."
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr "Fejl under optagelse fra lydenhed."
diff --git a/po/de.po b/po/de.po
index 3958c468..29de6310 100644
--- a/po/de.po
+++ b/po/de.po
@@ -2,13 +2,14 @@
# Copyright (C) 2007 Free Software Foundation, Inc.
# This file is distributed under the same license as the gst-plugins-bad package.
# Andre Klapper <ak-47@gmx.net>, 2008.
+# Christian Kirbach <Christian.Kirbach@googlemail.com>, 2009.
#
msgid ""
msgstr ""
-"Project-Id-Version: gst-plugins-bad 0.10.5.2\n"
+"Project-Id-Version: gst-plugins-bad 0.10.11.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2009-03-20 23:36+0000\n"
-"PO-Revision-Date: 2008-01-01 20:00+0100\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
"MIME-Version: 1.0\n"
@@ -16,379 +17,292 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ext/resindvd/resindvdsrc.c:333
-#, fuzzy
msgid "Could not read title information for DVD."
-msgstr "Es konnte nicht in Datei »%s« geschrieben werden."
+msgstr "Es konnte keine Titelinformationen der DVD gelesen werden."
-#: ext/resindvd/resindvdsrc.c:339
-#, fuzzy, c-format
+#, c-format
msgid "Failed to open DVD device '%s'."
-msgstr "Frontend-Gerät »%s« konnte nicht geöffnet werden."
+msgstr "Öffnen des DVD-Geräts »%s« schlug fehl."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1659
-#, fuzzy
msgid "Internal clock error."
-msgstr "Interner Datenstromfehler."
+msgstr "Interner Zeitfehler."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
-#, fuzzy
msgid "Internal data flow error."
msgstr "Interner Datenstromfehler."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "Kein Dateiname zum Schreiben angegeben."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Datei »%s« konnte nicht zum Schreiben geöffnet werden."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "Interner Datenstromfehler."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Es konnte nicht in Datei »%s« geschrieben werden."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "Gerät »%s« existiert nicht."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Frontend-Gerät »%s« konnte nicht geöffnet werden."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Einstellungen des Frontend-Geräts »%s« konnten nicht aufgerufen werden."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Datei »%s« konnte nicht zum Lesen geöffnet werden."
-#: sys/oss4/oss4-mixer.c:302
-#, fuzzy
msgid "Could not open audio device for mixer control handling."
-msgstr "Datei »%s« konnte nicht zum Lesen geöffnet werden."
+msgstr "Audio-Gerät konnte nicht zum Regeln geöffnet werden."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
msgstr ""
+"Audio-Gerät konnte nicht zum Regeln geöffnet werden. Diese Version des Open "
+"Sound System (OSS) wird nicht von diesem Element unterstützt."
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
-msgstr ""
+msgstr "Schnell"
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
-msgstr ""
+msgstr "Tief"
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
-msgstr ""
+msgstr "Mittel"
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
-msgstr ""
+msgstr "Hoch"
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
-msgstr ""
+msgstr "Sehr hoch"
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
-msgstr ""
+msgstr "Produktion"
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
-msgstr ""
+msgstr "Aus"
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
-msgstr ""
+msgstr "Ein"
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
-msgstr ""
+msgstr "Stereo"
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
-msgstr ""
+msgstr "Surround-Ton"
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
-msgstr ""
+msgstr "Aufnahmemixer"
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
-msgstr ""
+msgstr "Vorne"
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
-msgstr ""
+msgstr "Hinten"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
-msgstr ""
+msgstr "Seite"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
-msgstr ""
+msgstr "Mitte / LFE"
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
-msgstr ""
+msgstr "Mikrofon"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
-msgstr ""
+msgstr "Mikrofon am Fronteingang"
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
-msgstr ""
+msgstr "Aufnahme"
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
-msgstr ""
+msgstr "Line-in"
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
-msgstr ""
+msgstr "PCM 1"
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
-msgstr ""
+msgstr "PCM 2"
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
-msgstr ""
+msgstr "PCM 3"
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
-msgstr ""
+msgstr "PCM 4"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
-msgstr ""
+msgstr "Grüner Stecker"
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
-msgstr ""
+msgstr "Grüner Frontstecker"
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
-msgstr ""
+msgstr "Rosa Stecker"
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
-msgstr ""
+msgstr "Rosa Frontstecker"
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
-msgstr ""
+msgstr "Blauer Stecker"
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
-msgstr ""
+msgstr "Blauer Frontstecker"
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
-msgstr ""
+msgstr "Oranger Stecker"
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
-msgstr ""
+msgstr "Oranger Frontstecker"
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
-msgstr ""
+msgstr "Schwarzer Stecker"
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
-msgstr ""
+msgstr "Schwarzer Frontstecker"
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
-msgstr ""
+msgstr "Grauer Stecker"
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
-msgstr ""
+msgstr "Grauer Frontstecker"
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
-msgstr ""
+msgstr "Weißer Stecker"
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
-msgstr ""
+msgstr "Weißer Frontstecker"
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
-msgstr ""
+msgstr "Roter Stecker"
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
-msgstr ""
+msgstr "Roter Frontstecker"
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
-msgstr ""
+msgstr "Gelber Stecker"
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
-msgstr ""
+msgstr "Gelber Frontstecker"
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
-msgstr ""
+msgstr "Funktion des grünen Steckers"
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
-msgstr ""
+msgstr "Funktion des grünen Frontsteckers"
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
-msgstr ""
+msgstr "Funktion des rosa Steckers"
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
-msgstr ""
+msgstr "Funktion des rosa Frontsteckers"
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
-msgstr ""
+msgstr "Funktion des blauen Steckers"
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
-msgstr ""
+msgstr "Funktion des blauen Frontsteckers"
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
-msgstr ""
+msgstr "Funktion des orangen Steckers"
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
-msgstr ""
+msgstr "Funktion des orangen Frontsteckers"
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
-msgstr ""
+msgstr "Funktion des schwarzen Steckers"
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
-msgstr ""
+msgstr "Funktion des schwarzen Frontsteckers"
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
-msgstr ""
+msgstr "Funktion des grauen Steckers"
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
-msgstr ""
+msgstr "Funktion des grauen Frontsteckers"
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
-msgstr ""
+msgstr "Funktion des weißen Steckers"
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
-msgstr ""
+msgstr "Funktion des weißen Frontsteckers"
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
-msgstr ""
+msgstr "Funktion des roten Steckers"
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
-msgstr ""
+msgstr "Funktion des roten Frontsteckers"
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
-msgstr ""
+msgstr "Funktion des gelben Steckers"
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
-msgstr ""
+msgstr "Funktion des gelben Frontsteckers"
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
-msgstr ""
+msgstr "Front-Line-in"
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
-msgstr ""
+msgstr "Kopfhörer"
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
-msgstr ""
+msgstr "Front-Kopfhörer"
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
-msgstr ""
+msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
-msgstr ""
+msgstr "Eingang des virtuellen Mischers"
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
-msgstr ""
+msgstr "Ausgang des virtuellen Mischers"
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
-msgstr ""
+msgstr "Konfiguration des virtuellen Mischers"
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
msgstr ""
+"Das Audio-Gerät konnte nicht zur Wiedergabe geöffnet werden. Das Gerät wird "
+"von einer anderen Anwendung verwendet."
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
msgstr ""
+"Das Audio-Gerät konnte nicht zur Wiedergabe geöffnet werden. Sie haben "
+"nicht die Berechtigungen zum Öffnen des Gerätes."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
-#, fuzzy
msgid "Could not open audio device for playback."
-msgstr "Frontend-Gerät »%s« konnte nicht geöffnet werden."
+msgstr "Das Audio-Gerät konnte nicht zur Wiedergabe geöffnet werden. "
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
msgstr ""
+"Das Audio-Gerät konnte nicht zur Wiedergabe geöffnet werden. Diese Version "
+"des Open Sound System (OSS) wird nicht von diesem Element unterstützt."
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
-msgstr ""
+msgstr "Die Wiedergabe wird nicht von diesem Audio-Gerät unterstützt."
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
-msgstr ""
+msgstr "Fehler bei Audio-Wiedergabe."
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
-msgstr ""
+msgstr "Die Aufnahme wird nicht von diesem Audio-Gerät unterstützt."
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
-msgstr ""
+msgstr "Fehler bei der Aufnahme vom Audio-Gerät."
diff --git a/po/en_GB.po b/po/en_GB.po
index ce51a46f..714972a3 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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -14,385 +14,295 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ext/resindvd/resindvdsrc.c:333
#, fuzzy
msgid "Could not read title information for DVD."
msgstr "Could not write to file \"%s\"."
-#: ext/resindvd/resindvdsrc.c:339
#, fuzzy, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Could not close control device \"%s\"."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr ""
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
#, fuzzy
msgid "No file name specified for writing."
msgstr "No filename specified."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Could not open file \"%s\" for writing."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr ""
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Could not write to file \"%s\"."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "Device \"%s\" does not exist."
-#: sys/dvb/gstdvbsrc.c:703
#, fuzzy, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Could not close control device \"%s\"."
-#: sys/dvb/gstdvbsrc.c:715
#, fuzzy, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Could not get enough buffers from device \"%s\"."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Could not open file \"%s\" for reading."
-#: sys/oss4/oss4-mixer.c:302
#, fuzzy
msgid "Could not open audio device for mixer control handling."
msgstr "Could not open audio device \"%s\" for writing."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
msgstr ""
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr ""
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr ""
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr ""
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr ""
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr ""
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr ""
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr ""
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr ""
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr ""
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr ""
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr ""
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr ""
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
#, fuzzy
msgid "Rear"
msgstr "Record"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
#, fuzzy
msgid "Side"
msgstr "Video"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr ""
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Microphone"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr ""
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Line-in"
-#: sys/oss4/oss4-mixer.c:739
#, fuzzy
msgid "PCM 1"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:740
#, fuzzy
msgid "PCM 2"
msgstr "PCM-2"
-#: sys/oss4/oss4-mixer.c:741
#, fuzzy
msgid "PCM 3"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:742
#, fuzzy
msgid "PCM 4"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr ""
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr ""
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr ""
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
msgstr ""
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
msgstr ""
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
#, fuzzy
msgid "Could not open audio device for playback."
msgstr "Could not open audio device \"%s\" for writing."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
msgstr ""
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr ""
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr ""
diff --git a/po/es.po b/po/es.po
index 305316c5..07742fbd 100644
--- a/po/es.po
+++ b/po/es.po
@@ -1,14 +1,14 @@
-# translation of gst-plugins-bad-0.10.8.3.po to Español
+# translation of gst-plugins-bad-0.10.10.2.po to Español
# spanish translation for gst-plugins-bad
# This file is put in the public domain.
#
-# Jorge González González <aloriel@gmail.com>, 2007, 2008.
+# Jorge González González <aloriel@gmail.com>, 2007, 20, 2009.
msgid ""
msgstr ""
-"Project-Id-Version: gst-plugins-bad 0.10.8.3\n"
+"Project-Id-Version: gst-plugins-bad 0.10.10.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2009-03-20 23:36+0000\n"
-"PO-Revision-Date: 2008-10-18 17:06+0200\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
"MIME-Version: 1.0\n"
@@ -17,73 +17,57 @@ msgstr ""
"X-Generator: KBabel 1.11.4\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ext/resindvd/resindvdsrc.c:333
msgid "Could not read title information for DVD."
msgstr "No se pudo leer la información del título para el DVD."
-#: ext/resindvd/resindvdsrc.c:339
#, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Falló abrir el dispositivo DVD «%s»."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
-msgstr ""
+msgstr "Falló al establecer la búsqueda basada en PGC."
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr "Error en el reloj interno."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr "Error en el flujo de datos interno."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "No se especificó un nombre de archivo para su escritura."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "No se pudo abrir el archivo «%s» para escribir."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "Error en el flujo de datos interno."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "No se pudo escribir en el archivo «%s»."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "El dispositivo «%s» no existe."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "No se pudo abrir el dispositivo frontend «%s»."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "No se pudieron obtener los ajustes del dispositivo frontend «%s»."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "No se pudo abrir el archivo «%s» para leer."
-#: sys/oss4/oss4-mixer.c:302
msgid "Could not open audio device for mixer control handling."
msgstr ""
"No se pudo abrir el dispositivo de sonido para manejar el control del "
"mezclador."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
@@ -91,271 +75,204 @@ msgstr ""
"No se pudo abrir el dispositivo para manejar el control del mezclador. Este "
"elemento no soporta esta versión del Open Sound System."
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr "Rápido"
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr "Bajo"
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr "Medio"
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr "Alto"
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr "Muy alto"
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr "Producción"
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr "Apagado"
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr "Encendido"
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr "Estéreo"
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr "Sonido envolvente"
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr "Mezclador de entrada"
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr "Frontal"
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr "Trasero"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr "Lateral"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr "Centrado / LFE"
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Micrófono"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr "Micrófono del panel frontal"
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr "Entrada"
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Línea de entrada"
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr "PCM 1"
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr "PCM 2"
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr "PCM 3"
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr "PCM 4"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr "Conector verde"
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr "Conector verde del panel frontal"
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr "Conector rosa"
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr "Conector rosa del panel frontal"
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr "Conector azul"
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr "Conector azul del panel frontal"
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr "Conector naranja"
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr "Conector naranja del panel frontal"
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr "Conector negro"
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr "Conector negro del panel frontal"
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr "Conector gris"
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr "Conector gris del panel frontal"
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr "Conector blanco"
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr "Conector blanco del panel frontal"
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr "Conector rojo"
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr "Conector rojo del panel frontal"
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr "Conector amarillo"
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr "Conector amarillo del panel frontal"
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr "Función del conector verde"
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr "Función del conector verde del panel frontal"
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr "Función del conector rosa"
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr "Función del conector rosa del panel frontal"
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr "Función del conector azul"
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr "Función del conector azul del panel frontal"
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr "Función del conector naranja"
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr "Función del conector naranja del panel frontal"
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr "Función del conector negro"
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr "Función del conector negro del panel frontal"
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr "Función del conector gris"
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr "Función del conector gris del panel frontal"
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr "Función del conector blanco"
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr "Función del conector blanco del panel frontal"
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr "Función del conector rojo"
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr "Función del conector rojo del panel frontal"
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr "Función del conector amarillo"
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr "Función del conector amarillo del panel frontal"
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr "Línea de entrada del panel frontal"
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr "Auriculares"
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr "Auriculares del panel frontal"
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr "Entrada del mezclador virtual"
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr "Salida del mezclador virtual"
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr "Configuración del canal del mezclador virtual"
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
@@ -363,7 +280,6 @@ msgstr ""
"No se pudo abrir el dispositivo de sonido para reproducir. Otra aplicación "
"está usando el dispositivo."
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
@@ -371,11 +287,9 @@ msgstr ""
"No se pudo abrir el dispositivo de sonido para reproducir. No tiene permiso "
"para abrir el dispositivo."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
msgid "Could not open audio device for playback."
msgstr "No se pudo abrir el dispositivo de sonido para reproducción."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
@@ -383,19 +297,15 @@ msgstr ""
"No se pudo abrir el dispositivo para reproducir. Este elemento no soporta "
"esta versión del Open Sound System."
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr "Este dispositivo de sonido no soporta reproducción."
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr "Error en la reproducción del sonido."
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr "Este dispositivo de sonido no soporta grabación."
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr "Error al grabar desde el dispositivo de sonido."
diff --git a/po/fi.po b/po/fi.po
index 867bcef9..65496b23 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -21,71 +21,55 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: KBabel 1.11.2\n"
-#: ext/resindvd/resindvdsrc.c:333
msgid "Could not read title information for DVD."
msgstr "DVD:n otsikkotietoja ei voitu lukea."
-#: ext/resindvd/resindvdsrc.c:339
#, c-format
msgid "Failed to open DVD device '%s'."
msgstr "DVD-laitetta \"%s\" ei voitu avata."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr "PGC-pohjaisen kelauksen asetus epäonnistui."
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr "Sisäinen kellovirhe."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr "Sisäinen tietovirtavirhe."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "Kirjoitettavaa tiedostonimeä ei annettu."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Tiedostoa \"%s\" ei voi avata kirjoitettavaksi."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "Sisäisen tietovirran virhe."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Tiedostoon \"%s\" ei voitu kirjoittaa."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "Laitetta \"%s\" ei ole olemassa."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Edustalaitetta \"%s\" ei voitu avata."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Edustalaitteen \"%s\" asetuksia ei saatu."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Tiedostoa \"%s\" ei voi avata luettavaksi."
-#: sys/oss4/oss4-mixer.c:302
msgid "Could not open audio device for mixer control handling."
msgstr "Äänilaitetta ei voitu avata mikserinhallinnan käsiteltäväksi."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
@@ -93,271 +77,204 @@ msgstr ""
"Äänilaitetta ei voitu avata mikserinhallinnan käsiteltäväksi. Tämä elementti "
"ei tue tätä versiota Open Sound Systemistä."
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr "Nopea"
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr "Matala"
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr "Keskitaso"
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr "Korkea"
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr "Erittäin korkea"
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr "Tuotanto"
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr "Poissa"
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr "Päällä"
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr "Stereo"
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr "Surround-ääni"
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr "Sisääntulomiksaus"
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr "Etu"
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr "Taka"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr "Sivu"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr "Keski / LFE"
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Mikrofoni"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr "Etupaneelin mikrofoni"
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr "Sisääntulo"
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Linja sisään"
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr "PCM 1"
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr "PCM 2"
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr "PCM 3"
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr "PCM 4"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr "Vihreä liitin"
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr "Vihreä etupaneelin liitin"
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr "Violetti liitin"
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr "Violetti etupaneelin liitin"
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr "Sininen liitin"
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr "Sininen etupaneelin liitin"
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr "Oranssi liitin"
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr "Oranssi etupaneelin liitin"
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr "Musta liitin"
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr "Musta etupaneelin liitin"
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr "Harmaa liitin"
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr "Harmaa etupaneelin liitin"
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr "Valkoinen liitin"
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr "Valkoinen etupaneelin liitin"
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr "Punainen liitin"
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr "Punainen etupaneelin liitin"
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr "Keltainen liitin"
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr "Keltainen etupaneelin liitin"
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr "Vihreän liittimen toiminto"
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr "Vihreän etupaneelin liittimen toiminto"
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr "Violetin liittimen toiminto"
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr "Violetin etupaneelin liittimen toiminto"
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr "Sinisen liittimen toiminto"
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr "Sinisen etupaneelin liittimen toiminto"
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr "Oranssin liittimen toiminto"
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr "Oranssin etupaneelin liittimen toiminto"
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr "Mustan liittimen toiminto"
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr "Mustan etupaneelin liittimen toiminto"
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr "Harmaan liittimen toiminto"
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr "Harmaan etupaneelin liittimen toiminto"
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr "Valkoisen liittimen toiminto"
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr "Valkoisen etupaneelin liittimen toiminto"
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr "Punaisen liittimen toiminto"
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr "Punaisen etupaneelin liittimen toiminto"
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr "Keltaisen liittimen toiminto"
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr "Keltaisen etupaneelin liittimen toiminto"
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr "Etupaneelin linjasisääntulo"
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr "Kuulokkeet"
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr "Etupaneelin kuulokkeet"
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr "Näennäinen mikserisisääntulo"
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr "Näennäinen mikseriulostulo"
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr "Näennäinen mikserikanava-asetus"
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
@@ -365,7 +282,6 @@ msgstr ""
"Äänialaitetta ei voitu avata toistoa varten. Laite on toisen sovelluksen "
"käytössä."
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
@@ -373,11 +289,9 @@ msgstr ""
"Äänialaitetta ei voitu avata toistoa varten. Sinulla ei ole oikeuksia avata "
"laitetta."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
msgid "Could not open audio device for playback."
msgstr "Äänialaitetta ei voitu avata toistoa varten."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
@@ -385,18 +299,14 @@ msgstr ""
"Äänialaitetta ei voitu avata toistoa varten. Tämä elementti ei tue tätä "
"versiota Open Sound Systemistä."
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr "Tämä äänilaite ei tue toistamista."
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr "Äänentoistovirhe."
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr "Tämä äänilaite ei tue nauhoitusta."
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr "Virhe nauhoitettaessa äänilaitteelta."
diff --git a/po/fr.po b/po/fr.po
index ff4e8b66..e3a5d46d 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -16,73 +16,57 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ext/resindvd/resindvdsrc.c:333
msgid "Could not read title information for DVD."
msgstr "Impossible de lire les informations de titre du DVD."
-#: ext/resindvd/resindvdsrc.c:339
#, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Impossible d'ouvrir le périphérique du DVD « %s »."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr "Erreur d'horloge interne."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr "Erreur interne de flux de données."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "Aucun nom de fichier indiqué pour l'écriture."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Impossible d'ouvrir le fichier « %s » pour l'écriture."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "Erreur interne de flux de données."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Impossible d'écrire dans le fichier « %s »."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "Le périphérique « %s » n'existe pas."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Impossible d'ouvrir le périphérique frontal « %s »."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Impossible d'obtenir les paramètres du périphérique frontal « %s »."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Impossible d'ouvrir le fichier « %s » en lecture."
-#: sys/oss4/oss4-mixer.c:302
msgid "Could not open audio device for mixer control handling."
msgstr ""
"Impossible d'ouvrir le périphérique audio pour la gestion des contrôles de "
"mixage."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
@@ -91,271 +75,204 @@ msgstr ""
"mixage. Cette version de OSS (Open Sound System) n'est pas prise en charge "
"par cet élément."
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr "Rapide"
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr "Bas"
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr "Moyen"
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr "Élevé"
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr "Très élevé"
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr "Production"
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr "Désactivé"
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr "Activé"
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr "Stéréo"
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr "Son ambiophonique"
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr "Mélangeur d'entrée"
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr "Avant"
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr "Arrière"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr "Côté"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr "Centre / LFE"
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Microphone"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr "Micro du panneau avant"
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr "Entrée"
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Entrée ligne"
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr "PCM 1"
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr "PCM 2"
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr "PCM 3"
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr "PCM 4"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr "Connecteur vert"
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr "Connecteur vert du panneau avant"
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr "Connecteur rose"
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr "Connecteur rose du panneau avant"
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr "Connecteur bleu"
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr "Connecteur bleu du panneau avant"
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr "Connecteur orange"
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr "Connecteur orange du panneau avant"
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr "Connecteur noir"
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr "Connecteur noir du panneau avant"
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr "Connecteur gris"
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr "Connecteur gris du panneau avant"
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr "Connecteur blanc"
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr "Connecteur blanc du panneau avant"
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr "Connecteur rouge"
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr "Connecteur rouge du panneau avant"
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr "Connecteur jaune"
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr "Connecteur jaune du panneau avant"
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr "Fonction du connecteur vert"
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr "Fonction du connecteur vert du panneau avant"
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr "Fonction du connecteur rose"
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr "Fonction du connecteur rose du panneau avant"
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr "Fonction du connecteur bleu"
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr "Fonction du connecteur bleu du panneau avant"
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr "Fonction du connecteur orange"
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr "Fonction du connecteur orange du panneau avant"
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr "Fonction du connecteur noir"
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr "Fonction du connecteur noir du panneau avant"
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr "Fonction du connecteur gris"
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr "Fonction du connecteur gris du panneau avant"
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr "Fonction du connecteur blanc"
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr "Fonction du connecteur blanc du panneau avant"
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr "Fonction du connecteur rouge"
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr "Fonction du connecteur rouge du panneau avant"
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr "Fonction du connecteur jaune"
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr "Fonction du connecteur jaune du panneau avant"
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr "Entrée ligne du panneau avant"
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr "Écouteurs"
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr "Écouteurs du panneau avant"
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr "Entrée de mélangeur virtuel"
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr "Sortie de mélangeur virtuel"
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr "Configuration du canal du mélangeur virtuel"
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
@@ -363,7 +280,6 @@ msgstr ""
"Impossible d'ouvrir le périphérique audio pour la lecture. Le périphérique "
"est utilisé par une autre application."
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
@@ -371,11 +287,9 @@ msgstr ""
"Impossible d'ouvrir le périphérique audio pour la lecture. Vous n'avez pas "
"les droits nécessaires pour ouvrir le périphérique."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
msgid "Could not open audio device for playback."
msgstr "Impossible d'ouvrir le périphérique audio pour la lecture."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
@@ -383,19 +297,15 @@ msgstr ""
"Impossible d'ouvrir le périphérique audio pour la lecture. Cette version de "
"OSS (Open Sound System) n'est pas prise en charge par cet élément."
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr "La lecture n'est pas prise en charge par ce périphérique audio."
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr "Erreur de lecture audio."
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr "L'enregistrement n'est pas pris en charge par ce périphérique audio."
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr "Erreur lors de l'enregistrement à partir du périphérique audio."
diff --git a/po/hu.po b/po/hu.po
index 51d1a976..4a9ccb3c 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -1,13 +1,13 @@
# Hungarian translation of gst-plugins-bad
# This file is distributed under the same license as the gst-plugins-bad package.
-# Copyright (C) 2007, 2008 Free Software Foundation, Inc.
-# Gabor Kelemen <kelemeng@gnome.hu>, 2007, 2008.
+# Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
+# Gabor Kelemen <kelemeng@gnome.hu>, 2007, 2008, 2009.
msgid ""
msgstr ""
-"Project-Id-Version: gst-plugins-bad 0.10.6.3\n"
+"Project-Id-Version: gst-plugins-bad 0.10.10.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2009-03-20 23:36+0000\n"
-"PO-Revision-Date: 2008-05-12 03:32+0200\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
"MIME-Version: 1.0\n"
@@ -16,379 +16,292 @@ msgstr ""
"X-Generator: KBabel 1.11.4\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ext/resindvd/resindvdsrc.c:333
-#, fuzzy
msgid "Could not read title information for DVD."
-msgstr "Nem lehet írni a fájlba („%sâ€)."
+msgstr "Nem lehet címinformációkat olvasni a DVD-ről."
-#: ext/resindvd/resindvdsrc.c:339
-#, fuzzy, c-format
+#, c-format
msgid "Failed to open DVD device '%s'."
-msgstr "Nem nyitható meg az elÅ‘téteszköz („%sâ€)."
+msgstr "Nem nyitható meg a DVD eszköz („%sâ€)."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
-msgstr ""
+msgstr "A PGC-alapú keresés beállítása meghiúsult."
-#: ext/resindvd/rsnbasesrc.c:1659
-#, fuzzy
msgid "Internal clock error."
-msgstr "Belső adatfolyamhiba."
+msgstr "Belső órahiba."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
-#, fuzzy
msgid "Internal data flow error."
msgstr "Belső adatfolyamhiba."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "Nincs megadva fájlnév az íráshoz."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "A fájl („%sâ€) nem nyitható meg írásra."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "Belső adatfolyamhiba."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Nem lehet írni a fájlba („%sâ€)."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "Az eszköz („%sâ€) nem létezik."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Nem nyitható meg az elÅ‘téteszköz („%sâ€)."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Nem kérhetÅ‘k le a beállítások az elÅ‘téteszköztÅ‘l („%sâ€)."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "A fájl („%sâ€) nem nyitható meg olvasásra."
-#: sys/oss4/oss4-mixer.c:302
-#, fuzzy
msgid "Could not open audio device for mixer control handling."
-msgstr "A fájl („%sâ€) nem nyitható meg olvasásra."
+msgstr "A hangeszköz nem nyitható meg a keverő vezérlőinek kezeléséhez."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
msgstr ""
+"A hangeszköz nem nyitható meg a keverő vezérlőinek kezeléséhez. A Nyílt "
+"hangrendszer ezen verzióját nem támogatja az elem."
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
-msgstr ""
+msgstr "Gyors"
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
-msgstr ""
+msgstr "Alacsony"
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
-msgstr ""
+msgstr "Közepes"
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
-msgstr ""
+msgstr "Magas"
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
-msgstr ""
+msgstr "Nagyon magas"
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
-msgstr ""
+msgstr "Előállítás"
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
-msgstr ""
+msgstr "Ki"
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
-msgstr ""
+msgstr "Be"
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
-msgstr ""
+msgstr "Sztereó"
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
-msgstr ""
+msgstr "Térhatású hang"
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
-msgstr ""
+msgstr "Bemeneti keverő"
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
-msgstr ""
+msgstr "Elöl"
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
-msgstr ""
+msgstr "Hátul"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
-msgstr ""
+msgstr "Oldalt"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
-msgstr ""
+msgstr "Közép/LFE"
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
-msgstr ""
+msgstr "Mikrofon"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
-msgstr ""
+msgstr "Előlapi mikrofon"
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
-msgstr ""
+msgstr "Bemenet"
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
-msgstr ""
+msgstr "Vonalbemenet"
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
-msgstr ""
+msgstr "PCM 1"
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
-msgstr ""
+msgstr "PCM 2"
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
-msgstr ""
+msgstr "PCM 3"
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
-msgstr ""
+msgstr "PCM 4"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
-msgstr ""
+msgstr "Zöld csatlakozó"
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
-msgstr ""
+msgstr "Zöld előlapi csatlakozó"
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
-msgstr ""
+msgstr "Rózsaszín csatlakozó"
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
-msgstr ""
+msgstr "Rózsaszín előlapi csatlakozó"
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
-msgstr ""
+msgstr "Kék csatlakozó"
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
-msgstr ""
+msgstr "Kék előlapi csatlakozó"
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
-msgstr ""
+msgstr "Narancs csatlakozó"
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
-msgstr ""
+msgstr "Narancs előlapi csatlakozó"
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
-msgstr ""
+msgstr "Fekete csatlakozó"
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
-msgstr ""
+msgstr "Fekete előlapi csatlakozó"
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
-msgstr ""
+msgstr "Szürke csatlakozó"
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
-msgstr ""
+msgstr "Szürke előlapi csatlakozó"
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
-msgstr ""
+msgstr "Fehér csatlakozó"
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
-msgstr ""
+msgstr "Fehér előlapi csatlakozó"
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
-msgstr ""
+msgstr "Vörös csatlakozó"
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
-msgstr ""
+msgstr "Vörös előlapi csatlakozó"
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
-msgstr ""
+msgstr "Sárga csatlakozó"
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
-msgstr ""
+msgstr "Sárga előlapi csatlakozó"
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
-msgstr ""
+msgstr "Zöld csatlakozó funkciója"
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
-msgstr ""
+msgstr "Zöld előlapi csatlakozó funkciója"
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
-msgstr ""
+msgstr "Rózsaszín csatlakozó funkciója"
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
-msgstr ""
+msgstr "Rózsaszín előlapi csatlakozó funkciója"
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
-msgstr ""
+msgstr "Kék csatlakozó funkciója"
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
-msgstr ""
+msgstr "Kék előlapi csatlakozó funkciója"
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
-msgstr ""
+msgstr "Narancs csatlakozó funkciója"
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
-msgstr ""
+msgstr "Narancs előlapi csatlakozó funkciója"
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
-msgstr ""
+msgstr "Fekete csatlakozó funkciója"
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
-msgstr ""
+msgstr "Fekete előlapi csatlakozó funkciója"
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
-msgstr ""
+msgstr "Szürke csatlakozó funkciója"
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
-msgstr ""
+msgstr "Szürke előlapi csatlakozó funkciója"
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
-msgstr ""
+msgstr "Fehér csatlakozó funkciója"
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
-msgstr ""
+msgstr "Fehér előlapi csatlakozó funkciója"
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
-msgstr ""
+msgstr "Vörös csatlakozó funkciója"
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
-msgstr ""
+msgstr "Vörös előlapi csatlakozó funkciója"
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
-msgstr ""
+msgstr "Sárga csatlakozó funkciója"
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
-msgstr ""
+msgstr "Sárga előlapi csatlakozó funkciója"
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
-msgstr ""
+msgstr "Előlapi vonalbemenet"
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
-msgstr ""
+msgstr "Fülhallgatók"
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
-msgstr ""
+msgstr "Előlapi fülhallgató"
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
-msgstr ""
+msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
-msgstr ""
+msgstr "Virtuális keverőbemenet"
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
-msgstr ""
+msgstr "Virtuális keverőkimenet"
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
-msgstr ""
+msgstr "Virtuális keverő csatornabeállításai"
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
msgstr ""
+"Nem nyitható meg hangeszköz a lejátszáshoz. Az eszközt másik alkalmazás "
+"használja."
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
msgstr ""
+"Nem nyitható meg hangeszköz a lejátszáshoz. Nincs jogosultsága az eszköz "
+"megnyitására."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
-#, fuzzy
msgid "Could not open audio device for playback."
-msgstr "Nem nyitható meg az elÅ‘téteszköz („%sâ€)."
+msgstr "Nem nyitható meg hangeszköz a lejátszáshoz."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
msgstr ""
+"Nem nyitható meg hangeszköz a lejátszáshoz. A Nyílt hangrendszer ezen "
+"verzióját nem támogatja az elem."
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
-msgstr ""
+msgstr "A hangeszköz nem támogatja a lejátszást."
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
-msgstr ""
+msgstr "Hanglejátszási hiba."
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
-msgstr ""
+msgstr "A hangeszköz nem támogatja a felvételt."
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
-msgstr ""
+msgstr "Hiba a hangeszközről való felvételkor."
diff --git a/po/id.po b/po/id.po
index e55213b8..b9a5e89c 100644
--- a/po/id.po
+++ b/po/id.po
@@ -4,81 +4,65 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: gst-plugins-bad 0.10.10.2\n"
+"Project-Id-Version: gst-plugins-bad 0.10.11.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2009-03-20 23:36+0000\n"
-"PO-Revision-Date: 2009-03-10 22:23+0700\n"
+"POT-Creation-Date: 2009-05-20 20:43+0100\n"
+"PO-Revision-Date: 2009-05-14 21:41+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"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ext/resindvd/resindvdsrc.c:333
msgid "Could not read title information for DVD."
msgstr "Tak dapat membaca informasi judul untuk DVD."
-#: ext/resindvd/resindvdsrc.c:339
#, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Gagal membuka divais DVD '%s'."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr "Gagal mengatur pencarian berbasis PGC."
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr "Galat jam internal."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr "Galat arus data internal."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "Tak ada nama berkas yang ditentukan untuk ditulis."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Tak dapat membuka berkas \"%s\" untuk ditulis."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "Galat arus data internal."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Tak dapat menulis ke berkas \"%s\"."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "Divais \"%s\" tak ada."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Tak dapat membuka divais ujung-depan \"%s\"."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Tak dapat mendapatkan pengaturan dari divais ujung-depan \"%s\"."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Tak dapat membuka berkas \"%s\" untuk dibaca."
-#: sys/oss4/oss4-mixer.c:302
msgid "Could not open audio device for mixer control handling."
msgstr "Tak dapat membuka divais audio untuk pengendalian kontrol mixer."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
@@ -86,271 +70,204 @@ msgstr ""
"Tak dapat membuka divais audio untuk pengendalian kontrol mixer. Versi Open "
"Sound System ini tak didukung oleh elemen ini."
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr "Cepat"
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr "Rendah"
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr "Sedang"
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr "Tinggi"
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr "Sangat tinggi"
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr "Produksi"
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr "Mati"
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr "Hidup"
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr "Stereo"
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr "Surround sound"
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr "Mix masukan"
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr "Depan"
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr "Belakang"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr "Samping"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr "Tengah / LFE"
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Mikrofon"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr "Mikrofon panel depan"
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr "Masukan"
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Jalur-masuk"
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr "PCM 1"
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr "PCM 2"
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr "PCM 3"
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr "PCM 4"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr "Penyambung hijau"
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr "Penyambung panel depan hijau"
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr "Penyambung merah jambu"
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr "Penyambung panel depan merah jambu"
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr "Penyambung biru"
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr "Penyambung panel depan biru"
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr "Penyambung jingga"
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr "Penyambung panel depan jingga"
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr "Penyambung hitam"
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr "Penyambung panel depan hitam"
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr "Penyambung abu-abu"
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr "Penyambung panel depan abu-abu"
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr "Penyambung putih"
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr "Penyambung panel depan putih"
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr "Penyambung merah"
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr "Penyambung panel depan merah"
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr "Penyambung kuning"
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr "Penyambung panel depan kuning"
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr "Fungsi penyambung hijau"
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr "Fungsi penyambung panel depan hijau"
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr "Fungsi penyambung merah jambu"
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr "Fungsi penyambung panel depan merah jambu"
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr "Fungsi penyambung biru"
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr "Fungsi penyambung panel depan biru"
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr "Fungsi penyambung jingga"
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr "Fungsi penyambung panel depan jingga"
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr "Fungsi penyambung hitam"
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr "Fungsi penyambung panel depan hitam"
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr "Fungsi penyambung abu-abu"
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr "Fungsi penyambung panel depan abu-abu"
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr "Fungsi penyambung putih"
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr "Fungsi penyambung panel depan putih"
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr "Fungsi penyambung merah"
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr "Fungsi penyambung panel depan merah"
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr "Fungsi penyambung kuning"
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr "Fungsi penyambung panel depan kuning"
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr "Jalur-masuk panel depan"
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr "Headphone"
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr "Headphone panel depan"
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr "Masukan mixer virtual"
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr "Keluaran mixer virtual"
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr "Konfigurasi kanal mixer virtual"
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
@@ -358,7 +275,6 @@ msgstr ""
"Tak dapat membuka divais audio untuk putar kembali. Divais sedang digunakan "
"oleh aplikasi lain."
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
@@ -366,11 +282,9 @@ msgstr ""
"Tak dapat membuka divais audio untuk putar kembali. Anda tak memiliki hak "
"akses untuk membuka divais."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
msgid "Could not open audio device for playback."
msgstr "Tak dapat membuka divais audio untuk putar kembali."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
@@ -378,19 +292,15 @@ msgstr ""
"Tak dapat membuka divais audio untuk putar kembali. Versi Open Sound System "
"ini tak didukung oleh elemen ini."
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr "Putar kembali tak didukung oleh divais audio ini."
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr "Putar kembali audio galat."
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr "Perekaman tak didukung oleh divais audio ini."
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr "Galat ketika merekam dari divais audio."
diff --git a/po/it.po b/po/it.po
index 8c711362..62fa7705 100644
--- a/po/it.po
+++ b/po/it.po
@@ -1,87 +1,71 @@
# Italian translation for gst-plugins-bad package of GStreamer project.
# Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 GStreamer core team
# This file is distributed under the same license as the gst-plugins-bad package.
-# Luca Ferretti <elle.uca@infinito.it>, 2007-2009.
#
+# Luca Ferretti <elle.uca@infinito.it>, 2007, 2008, 2009.
msgid ""
msgstr ""
-"Project-Id-Version: gst-plugins-bad 0.10.9.3\n"
+"Project-Id-Version: gst-plugins-bad 0.10.11.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2009-03-20 23:36+0000\n"
-"PO-Revision-Date: 2009-01-14 10:51+0100\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ext/resindvd/resindvdsrc.c:333
msgid "Could not read title information for DVD."
-msgstr "Impossibile leggere le informazioni sul titolo per il DVD."
+msgstr "Impossibile leggere le informazioni del titolo per il DVD."
-#: ext/resindvd/resindvdsrc.c:339
#, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Apertura del device DVD «%s» non riuscita."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr "Impostazione del posizionamento basato su PGC non riuscita"
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr "Errore interno del clock."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr "Errore interno nel flusso di dati."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "Nessun nome di file specificato per la scrittura."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Impossibile aprire il file «%s» in scrittura."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "Errore interno nello stream di dati."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Impossibile scrivere sul file «%s»."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "Il device «%s» non esiste."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Impossibile aprire il device frontend «%s»."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Impossibile ottenere le impostazioni dal device frontend «%s»."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Impossibile aprire il file «%s» in lettura."
-#: sys/oss4/oss4-mixer.c:302
msgid "Could not open audio device for mixer control handling."
msgstr ""
"Impossibile aprire il device audio per la gestione della regolazione del "
"mixer."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
@@ -91,315 +75,241 @@ msgstr ""
"elemento."
# NdT: questo e i successivi non ho controllato che sono....
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr "Veloce"
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr "Lento"
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr "Medio"
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr "Alto"
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr "Molto alto"
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr "Produzione"
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr "Spento"
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr "Acceso"
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr "Stereo"
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr "Suono surround"
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr "Mix ingresso"
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr "Fronte"
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr "Dietro"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr "Lato"
# NdT: forse questo? --> http://en.wikipedia.org/wiki/Low-frequency_effect
#
# o forse Low Frequency Emitter
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr "Centro / LFE"
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Microfono"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr "Microfono pannello frontale"
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr "Input"
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Linea in"
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr "PCM 1"
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr "PCM 2"
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr "PCM 3"
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr "PCM 4"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr "Connettore verde"
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr "Connettore verde pannello frontale"
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr "Connettore rosa"
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr "Connettore rosa pannello frontale"
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr "Connettore blu"
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr "Connettore blu pannello frontale"
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr "Connettore arancione"
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr "Connettore arancione pannello frontale"
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr "Connettore nero"
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr "Connettore nero pannello frontale"
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr "Connettore grigio"
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr "Connettore grigio pannello frontale"
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr "Connettore bianco"
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr "Connettore bianco pannello frontale"
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr "Connettore rosso"
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr "Connettore rosso pannello frontale"
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr "Connettore giallo"
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr "Connettore giallo pannello frontale"
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr "Funzione connettore verde"
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr "Funzione connettore verde pannello frontale"
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr "Funzione connettore rosa"
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr "Funzione connettore rosa pannello frontale"
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr "Funzione connettore blu"
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr "Funzione connettore blu pannello frontale"
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr "Funzione connettore arancione"
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr "Funzione connettore arancione pannello frontale"
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr "Funzione connettore nero"
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr "Funzione connettore nero pannello frontale"
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr "Funzione connettore grigio"
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr "Funzione connettore grigio pannello frontale"
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr "Funzione connettore bianco"
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr "Funzione connettore bianco pannello frontale"
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr "Funzione connettore rosso"
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr "Funzione connettore rosso pannello frontale"
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr "Funzione connettore giallo"
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr "Funzione connettore giallo pannello frontale"
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr "Canale ingresso pannello frontale"
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr "Cuffie"
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr "Cuffie pannello frontale"
# http://it.wikipedia.org/wiki/Pulse-Code_Modulation
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr "Ingresso mixer virtuale"
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr "Uscita mixer virtuale"
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr "Configurazione canale mixer virtuale"
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
msgstr ""
-"Impossibile aprire il device audio in riproduzione. Il dispositivo è "
+"Impossibile aprire il device audio per la riproduzione. Il dispositivo è "
"attualmente usato da un'altra applicazione."
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
msgstr ""
-"Impossibile aprire il device audio in riproduzione. Permessi non sufficienti "
-"per aprire il dispositivo."
+"Impossibile aprire il device audio per la riproduzione. Permessi non "
+"sufficienti per aprire il dispositivo."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
msgid "Could not open audio device for playback."
-msgstr "Impossibile aprire il device audio in riproduzione."
+msgstr "Impossibile aprire il device audio per la riproduzione."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
msgstr ""
-"Impossibile aprire il device audio in riproduzione. Questa versione di Open "
-"Sound System non è supportata da questo elemento."
+"Impossibile aprire il device audio per la riproduzione. Questa versione di "
+"Open Sound System non è supportata da questo elemento."
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr "Questo device audio non supporta la riproduzione."
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr "Errore nel riprodurre l'audio."
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr "Questo dispositivo audio non supporta la registrazione."
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr "Errore nel registrare dal dispositivo audio."
diff --git a/po/ky.po b/po/ky.po
index f4aa4f61..9f3570b4 100644
--- a/po/ky.po
+++ b/po/ky.po
@@ -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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -16,376 +16,286 @@ msgstr ""
"X-Poedit-Language: Kyrgyz\n"
"X-Poedit-Country: KYRGYZSTAN\n"
-#: ext/resindvd/resindvdsrc.c:333
msgid "Could not read title information for DVD."
msgstr ""
-#: ext/resindvd/resindvdsrc.c:339
#, fuzzy, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Ðлдын \"%s\" жабдыкты ачалган жок."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr ""
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr ""
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, fuzzy, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "\"%s\" файлы окууга ачылган жок."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr ""
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, fuzzy, c-format
msgid "Could not write to file \"%s\"."
msgstr "Ðлдын \"%s\" жабдыкты ачалган жок."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "\"%s\" мындай жабдык жок."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Ðлдын \"%s\" жабдыкты ачалган жок."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Ðлдын \"%s\" жабдыктан ыраÑтоолор алынган жок."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "\"%s\" файлы окууга ачылган жок."
-#: sys/oss4/oss4-mixer.c:302
#, fuzzy
msgid "Could not open audio device for mixer control handling."
msgstr "\"%s\" файлы окууга ачылган жок."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
msgstr ""
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr ""
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr ""
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr ""
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr ""
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr ""
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr ""
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr ""
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr ""
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr ""
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr ""
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr ""
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr ""
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr ""
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr ""
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr ""
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr ""
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr ""
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr ""
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr ""
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr ""
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr ""
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr ""
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr ""
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr ""
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr ""
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr ""
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
msgstr ""
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
msgstr ""
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
#, fuzzy
msgid "Could not open audio device for playback."
msgstr "Ðлдын \"%s\" жабдыкты ачалган жок."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
msgstr ""
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr ""
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr ""
diff --git a/po/lt.po b/po/lt.po
index 141e7649..f9613a61 100644
--- a/po/lt.po
+++ b/po/lt.po
@@ -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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -17,379 +17,289 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%"
"100<10 || n%100>=20) ? 1 : 2);\n"
-#: ext/resindvd/resindvdsrc.c:333
#, fuzzy
msgid "Could not read title information for DVD."
msgstr "Nepavyko rašyti į failą „%s“."
-#: ext/resindvd/resindvdsrc.c:339
#, fuzzy, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Nepavyko atverti išorinės pusės įrenginio „%s“."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1659
#, fuzzy
msgid "Internal clock error."
msgstr "Vidinė duomenų srauto klaida."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
#, fuzzy
msgid "Internal data flow error."
msgstr "Vidinė duomenų srauto klaida."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "Nenurodytas failo rašymui pavadinimas."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Nepavyko atverti failo „%s“ rašymui."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "Vidinė duomenų srauto klaida."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Nepavyko rašyti į failą „%s“."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "Įrenginys „%s“ neegzistuoja."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Nepavyko atverti išorinės pusės įrenginio „%s“."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Nepavyko gauti nustatymų iš išorinės pusės įrenginio „%s“."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Nepavyko atverti failo „%s“ skaitymui."
-#: sys/oss4/oss4-mixer.c:302
#, fuzzy
msgid "Could not open audio device for mixer control handling."
msgstr "Nepavyko atverti failo „%s“ skaitymui."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
msgstr ""
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr ""
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr ""
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr ""
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr ""
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr ""
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr ""
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr ""
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr ""
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr ""
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr ""
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr ""
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr ""
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr ""
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr ""
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr ""
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr ""
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr ""
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr ""
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr ""
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr ""
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr ""
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr ""
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr ""
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr ""
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr ""
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr ""
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
msgstr ""
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
msgstr ""
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
#, fuzzy
msgid "Could not open audio device for playback."
msgstr "Nepavyko atverti išorinės pusės įrenginio „%s“."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
msgstr ""
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr ""
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr ""
diff --git a/po/mt.po b/po/mt.po
index 80b32cc0..bd142280 100644
--- a/po/mt.po
+++ b/po/mt.po
@@ -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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -17,71 +17,55 @@ msgstr ""
"X-Poedit-SourceCharset: utf-8\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ext/resindvd/resindvdsrc.c:333
msgid "Could not read title information for DVD."
msgstr "Ma stajtx naqra informazzjoni fuq it-titlu tad-DVD."
-#: ext/resindvd/resindvdsrc.c:339
#, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Problema biex niftaħ apparat tad-DVD '%s'."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr "Internal clock error."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr "Internal data flow error."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "L-ebda isem speċifikat biex nikteb."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Ma nistax niftaħ fajl \"%s\" biex nikteb."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "Internal data stream error."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Ma nistax nikteb fil-fajl \"%s\". "
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "Apparat \"%s\" ma jeżistiex."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Ma nistax niftaħ apparat frontend \"%s\"."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Ma nistax inġib is-settings mill-apparat frontend \"%s\"."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Ma nistax naqra mill-fajl \"%s\"."
-#: sys/oss4/oss4-mixer.c:302
msgid "Could not open audio device for mixer control handling."
msgstr "Ma nistax niftaħ apparat tal-awdjo għal mixer control handling."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
@@ -89,271 +73,204 @@ msgstr ""
"Ma nistax niftaħ apparat tal-awdjo għal mixer control handling. Din il-"
"verzjoni ta' Open Sound System mhux issapportjata minn din l-element."
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr "Fast"
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr "Low"
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr "Medium"
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr "High"
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr "Very high"
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr "Production"
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr "Off"
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr "On"
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr "Stereo"
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr "Surround sound"
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr "Input mix"
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr "Quddiem"
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr "Wara"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr "Ä enb"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr "Center / LFE"
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Mikrofonu"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr "Mikrofonu tal-panella ta' quddiem"
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr "Input"
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Line-in"
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr "PCM 1"
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr "PCM 2"
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr "PCM 3"
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr "PCM 4"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr "Connector aħdar"
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr "Front panel connector aħdar"
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr "Connector roża"
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr "Front panel connector roża"
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr "Connector Blu"
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr "Front panel connector blu"
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr "Connector oranġjo"
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr "Front Panel connector oranġjo"
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr "Connector iswed"
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr "Front panel connector iswed"
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr "Connector Griż"
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr "Front panel connector Griż"
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr "Connector abjad"
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr "Front panel connector abjad"
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr "Connector aħmar"
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr "Front panel connector aħmar"
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr "Connector isfar"
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr "Front panel connector isfar"
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr "Connector function aħdar"
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr "Front panel connector function aħdar"
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr "Connector function roża"
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr "Front panel connector function roża"
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr "Connector function blu"
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr "Front panel connector function blu"
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr "Connector function oranġjo"
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr "Front panel connector function oranġjo"
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr "Connector function iswed"
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr "Front panel connector function iswed"
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr "Connector function griż"
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr "Front panel connector function griż"
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr "Connector function abjad"
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr "Front panel connector function abjad"
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr "Connector function aħmar"
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr "Front panel connector function aħmar"
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr "Connector function isfar"
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr "Front panel connector function isfar"
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr "Front panel line-in"
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr "Headphones"
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr "Front panel headphones"
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr "Virtual mixer input"
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr "Virtual mixer output"
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr "Virtual mixer channel configuration"
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
@@ -361,7 +278,6 @@ msgstr ""
"Ma nistax niftaħ apparat tal-awdjo biex indoqq. Apparat qed jintuża minn "
"programm ieħor."
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
@@ -369,11 +285,9 @@ msgstr ""
"Ma nistax niftaħ apparat tal-awdjo biex indoqq. M'għandekx aċċess għall-"
"apparat."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
msgid "Could not open audio device for playback."
msgstr "Ma nistax niftaħ apparat tal-awdjo biex indoqq."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
@@ -381,19 +295,15 @@ msgstr ""
"Ma nistax niftaħ apparat tal-awdjo biex indoqq. Dil il-verżjoni ta' Open "
"Sound System mhux issapportjatha minn dan l-element."
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr "Id-daqq mhux issappartjat minn dan l-apparat tal-awdjo."
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr "Żball fiid-daqq tal-awdjo."
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr "Irrekordjar mhux issapportjat minn dan l-apparat tal-awdjo."
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr "Żball fl-irrekordjar mill-apparat tal-awdjo."
diff --git a/po/nb.po b/po/nb.po
index cef24f17..f583dceb 100644
--- a/po/nb.po
+++ b/po/nb.po
@@ -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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -14,379 +14,289 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ext/resindvd/resindvdsrc.c:333
#, fuzzy
msgid "Could not read title information for DVD."
msgstr "Kunne ikke skrive til fil «%s»."
-#: ext/resindvd/resindvdsrc.c:339
#, fuzzy, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Kunne ikke åpne frontenhet «%s»."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1659
#, fuzzy
msgid "Internal clock error."
msgstr "Intern feil i datastrøm."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
#, fuzzy
msgid "Internal data flow error."
msgstr "Intern feil i datastrøm."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "Ingen filnavn oppgitt for skriving."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Kunne ikke åpne filen «%s» for skriving."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "Intern feil i datastrøm."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Kunne ikke skrive til fil «%s»."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "Enhet «%s» eksisterer ikke."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Kunne ikke åpne frontenhet «%s»."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Kunne ikke hente innstillinger fra frontenhet «%s»."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Kunne ikke åpne filen «%s» for lesing."
-#: sys/oss4/oss4-mixer.c:302
#, fuzzy
msgid "Could not open audio device for mixer control handling."
msgstr "Kunne ikke åpne filen «%s» for lesing."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
msgstr ""
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr ""
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr ""
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr ""
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr ""
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr ""
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr ""
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr ""
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr ""
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr ""
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr ""
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr ""
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr ""
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr ""
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr ""
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr ""
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr ""
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr ""
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr ""
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr ""
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr ""
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr ""
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr ""
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr ""
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr ""
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr ""
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr ""
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
msgstr ""
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
msgstr ""
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
#, fuzzy
msgid "Could not open audio device for playback."
msgstr "Kunne ikke åpne frontenhet «%s»."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
msgstr ""
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr ""
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr ""
diff --git a/po/nl.po b/po/nl.po
index 7239d70b..0207dbec 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -18,71 +18,55 @@ msgstr ""
"X-Generator: KBabel 1.11.4\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-#: ext/resindvd/resindvdsrc.c:333
msgid "Could not read title information for DVD."
msgstr "Kan de titelinformatie voor de DVD niet lezen."
-#: ext/resindvd/resindvdsrc.c:339
#, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Kan het DVD-apparaat '%s' niet openen."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr "Het instellen van het zoeken op basis van PGC is mislukt."
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr "Interne fout met de klok."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr "Interne fout met gegevensdoorvoer."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "Geen bestandsnaam gespecificeerd voor de uitvoer."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Kan bestand \"%s\" niet openen voor uitvoer."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "Interne fout in gegevensstroom."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Kan niet in bestand \"%s\" schrijven."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "Apparaat \"%s\" bestaat niet."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Kan het frontend-apparaat \"%s\" niet openen."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Kan de instellingen van het frontend-apparaat \"%s\" niet verkrijgen."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Kan bestand \"%s\" niet openen om te lezen."
-#: sys/oss4/oss4-mixer.c:302
msgid "Could not open audio device for mixer control handling."
msgstr "Kan het audio-apparaat niet openen voor de mixerbesturing."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
@@ -90,271 +74,204 @@ msgstr ""
"Kan het audio-apparaat niet openen voor de mixerbesturing. Deze versie van "
"het Open Soundsysteem wordt niet ondersteund door dit element."
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr "Snel"
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr "Laag"
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr "Gemiddeld"
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr "Hoog"
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr "Erg hoog"
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr "Productie"
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr "Uit"
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr "Aan"
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr "Stereo"
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr "Surround geluid"
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr "Invoermix"
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr "Voorzijde"
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr "Achterzijde"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr "Zijkant"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr "Midden / LFE"
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Microfoon"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr "Microfoon in frontpaneel"
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr "Invoer"
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Lijn-in"
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr "PCM 1"
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr "PCM 2"
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr "PCM 3"
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr "PCM 4"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr "Groene connector"
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr "Groene connector in frontpaneel"
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr "Roze connector"
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr "Roze connector in frontpaneel"
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr "Blauwe connector"
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr "Blauwe connector in frontpaneel"
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr "Oranje connector"
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr "Oranje connector in frontpaneel"
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr "Zwarte connector"
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr "Zwarte connector in frontpaneel"
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr "Grijze connector"
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr "Grijze connector in frontpaneel"
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr "Witte connector"
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr "Witte connector in frontpaneel"
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr "Rode connector"
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr "Rode connector in frontpaneel"
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr "Gele connector"
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr "Gele connector in frontpaneel"
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr "Functie van groene connector"
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr "Functie van groene connector in frontpaneel"
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr "Functie van roze connector"
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr "Functie van roze connector in frontpaneel"
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr "Functie van blauwe connector"
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr "Functie van blauwe connector in frontpaneel"
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr "Functie van oranje connector"
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr "Functie van oranje connector in frontpaneel"
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr "Functie van zwarte connector"
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr "Functie van zwarte connector in frontpaneel"
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr "Functie van grijze connector"
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr "Functie van grijze connector in frontpaneel"
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr "Functie van witte connector"
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr "Functie van witte connector in frontpaneel"
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr "Functie van rode connector"
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr "Functie van rode connector in frontpaneel"
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr "Functie van gele connector"
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr "Functie van gele connector in frontpaneel"
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr "Lijn-in in frontpaneel"
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr "Hoofdtelefoon"
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr "Hoofdtelefoon in frontpaneel"
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr "Virtuele mixer-invoer"
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr "Virtuele mixer-uitvoer"
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr "Kanaalconfiguratie van virtuele mixer "
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
@@ -362,7 +279,6 @@ msgstr ""
"Kan het audio-apparaat niet openen voor afspelen. Apparaat is in gebruik bij "
"een andere applicatie."
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
@@ -370,11 +286,9 @@ msgstr ""
"Kan het audio-apparaat niet openen voor afspelen. U hebt geen toestemming om "
"het apparaat te openen."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
msgid "Could not open audio device for playback."
msgstr "Kan het audio-apparaat niet openen voor afspelen."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
@@ -382,19 +296,15 @@ msgstr ""
"Kan het audio-apparaat niet openen voor afspelen. Deze versie van het Open "
"Soundsysteem wordt niet ondersteund door dit element."
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr "Afspelen wordt door dit audio-apparaat niet ondersteund."
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr "Fout bij audio-afspelen."
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr "Opnemen wordt door dit audio-apparaat niet ondersteund."
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr "Fout bij opnemen met dit audio-apparaat."
diff --git a/po/or.po b/po/or.po
index a210198d..cc31265a 100644
--- a/po/or.po
+++ b/po/or.po
@@ -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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -16,387 +16,297 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ext/resindvd/resindvdsrc.c:333
#, fuzzy
msgid "Could not read title information for DVD."
msgstr "\"%s\" ଫାଇଲ ଲେଖିହେଲା ନାହିà¬."
-#: ext/resindvd/resindvdsrc.c:339
#, fuzzy, c-format
msgid "Failed to open DVD device '%s'."
msgstr "\"%s\" ନିୟନà­à¬¤à­à¬°à¬£ ଯନà­à¬¤à­à¬° ବନà­à¬¦ କରିହେଲା ନାହିà¬."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr ""
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
#, fuzzy
msgid "No file name specified for writing."
msgstr "କୌଣସି ଫାଇଲନାମ ଉଲà­à¬²à­‡à¬–ିତ ହୋଇ ନାହିà¬."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "\"%s\" ଫାଇଲ ଲେଖିବା ପାଇଠଖୋଲିହେଲା ନାହିà¬."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr ""
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "\"%s\" ଫାଇଲ ଲେଖିହେଲା ନାହିà¬."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "\"%s\" ଯନà­à¬¤à­à¬° ଅବସà­à¬¥à¬¿à¬¤ ନାହିà¬."
-#: sys/dvb/gstdvbsrc.c:703
#, fuzzy, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "\"%s\" ନିୟନà­à¬¤à­à¬°à¬£ ଯନà­à¬¤à­à¬° ବନà­à¬¦ କରିହେଲା ନାହିà¬."
-#: sys/dvb/gstdvbsrc.c:715
#, fuzzy, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "\"%s\" ଯନà­à¬¤à­à¬°à¬°à­ ପରà­à¬¯à­à¬¯à¬¾à¬ªà­à¬¤ ଅସà­à¬¥à¬¾à­Ÿà­€ ସଞà­à¬šà­Ÿ ସà­à¬¥à¬¾à¬¨ ଆଣିହେଲା ନାହିà¬."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "\"%s\" ଫାଇଲ ପଢ଼ିବା ପାଇଠଖୋଲିହେଲା ନାହିà¬."
-#: sys/oss4/oss4-mixer.c:302
#, fuzzy
msgid "Could not open audio device for mixer control handling."
msgstr "\"%s\" ଧà­à¬¬à¬¨à¬¿ ଯନà­à¬¤à­à¬° ଲେଖିବା ପାଇଠଖୋଲିହେଲା ନାହିà¬."
-#: sys/oss4/oss4-mixer.c:316
#, fuzzy
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
msgstr "\"%s\" ଧà­à¬¬à¬¨à¬¿ ଯନà­à¬¤à­à¬° ଲେଖିବା ପାଇଠଖୋଲିହେଲା ନାହିà¬."
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr ""
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr ""
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr ""
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr ""
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr ""
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr ""
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr ""
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr ""
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr ""
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr ""
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr ""
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr ""
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
#, fuzzy
msgid "Rear"
msgstr "ଅନà­à¬²à¬¿à¬ªà¬¿à¬•à¬°à¬£"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
#, fuzzy
msgid "Side"
msgstr "ଭିଡିଓ"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr ""
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "ମାଇକà­à¬°à­‹à¬«à­‹à¬¨à­"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr ""
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "ଲାଇନ-ଇନ"
-#: sys/oss4/oss4-mixer.c:739
#, fuzzy
msgid "PCM 1"
msgstr "ପି.ସି.à¬à¬®."
-#: sys/oss4/oss4-mixer.c:740
#, fuzzy
msgid "PCM 2"
msgstr "ପି.ସି.à¬à¬®.-à­¨"
-#: sys/oss4/oss4-mixer.c:741
#, fuzzy
msgid "PCM 3"
msgstr "ପି.ସି.à¬à¬®."
-#: sys/oss4/oss4-mixer.c:742
#, fuzzy
msgid "PCM 4"
msgstr "ପି.ସି.à¬à¬®."
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr ""
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "ପି.ସି.à¬à¬®."
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr ""
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr ""
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
msgstr ""
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
#, fuzzy
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
msgstr "\"%s\" ଧà­à¬¬à¬¨à¬¿ ଯନà­à¬¤à­à¬° ଲେଖିବା ପାଇଠଖୋଲିହେଲା ନାହିà¬."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
#, fuzzy
msgid "Could not open audio device for playback."
msgstr "\"%s\" ଧà­à¬¬à¬¨à¬¿ ଯନà­à¬¤à­à¬° ଲେଖିବା ପାଇଠଖୋଲିହେଲା ନାହିà¬."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
msgstr ""
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr ""
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr ""
diff --git a/po/pl.po b/po/pl.po
index 1fa28c45..d2100c89 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -14,71 +14,55 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ext/resindvd/resindvdsrc.c:333
msgid "Could not read title information for DVD."
msgstr "Nie udało się odczytać informacji o tytułach dla DVD."
-#: ext/resindvd/resindvdsrc.c:339
#, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Nie udało się otworzyć urządzenia DVD '%s'."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr "Nie udało się ustawić przewijania opartego na PGC."
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr "Błąd wewnętrzny zegara."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr "Błąd wewnętrzny przepływu danych."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "Nie określono nazwy pliku do zapisu."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Nie udało się otworzyć pliku \"%s\" do zapisu."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "Błąd wewnętrzny strumienia danych."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Nie udało się zapisać danych do pliku \"%s\"."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "UrzÄ…dzenie \"%s\" nie istnieje."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Nie udało się otworzyć urządzenia frontendu \"%s\"."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Nie udało się pobrać ustawień z urządzenia frontendu \"%s\"."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Nie udało się otworzyć pliku \"%s\" do odczytu."
-#: sys/oss4/oss4-mixer.c:302
msgid "Could not open audio device for mixer control handling."
msgstr "Nie udało się otworzyć urządzenia dźwiękowego do sterowania mikserem."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
@@ -86,271 +70,204 @@ msgstr ""
"Nie udało się otworzyć urządzenia dźwiękowego do sterowania mikserem. Ta "
"wersja Open Sound System nie jest obsługiwana przez ten moduł."
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr "Szybka"
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr "Niska"
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr "Åšrednia"
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr "Wysoka"
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr "Bardzo wysoka"
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr "Produkcyjna"
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr "Wyłączone"
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr "WÅ‚Ä…czone"
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr "Stereo"
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr "Dźwięk surround"
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr "Miksowanie wejścia"
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr "Przód"
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr "Tył"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr "Bok"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr "Åšrodek / LFE"
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Mikrofon"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr "Mikrofon na przednim panelu"
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr "Wejście"
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Wejście linii"
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr "PCM 1"
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr "PCM 2"
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr "PCM 3"
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr "PCM 4"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr "Zielone gniazdo"
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr "Zielone gniazdo na przednim panelu"
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr "Różowe gniazdo"
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr "Różowe gniazdo na przednim panelu"
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr "Niebieskie gniazdo"
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr "Niebieskie gniazdo na przednim panelu"
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr "Pomarańczowe gniazdo"
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr "Pomarańczowe gniazdo na przednim panelu"
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr "Czarne gniazdo"
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr "Czarne gniazdo na przednim panelu"
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr "Szare gniazdo"
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr "Szare gniazdo na przednim panelu"
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr "Białe gniazdo"
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr "Białe gniazdo na przednim panelu"
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr "Czerwone gniazdo"
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr "Czerwone gniazdo na przednim panelu"
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr "Żółte gniazdo"
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr "Żółte gniazdo na przednim panelu"
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr "Funkcja zielonego gniazda"
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr "Funkcja zielonego gniazda na przednim panelu"
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr "Funkcja różowego gniazda"
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr "Funkcja różowego gniazda na przednim panelu"
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr "Funkcja niebieskiego gniazda"
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr "Funkcja niebieskiego gniazda na przednim panelu"
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr "Funkcja pomarańczowego gniazda"
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr "Funkcja pomarańczowego gniazda na przednim panelu"
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr "Funkcja czarnego gniazda"
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr "Funkcja czarnego gniazda na przednim panelu"
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr "Funkcja szarego gniazda"
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr "Funkcja szarego gniazda na przednim panelu"
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr "Funkcja białego gniazda"
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr "Funkcja białego gniazda na przednim panelu"
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr "Funkcja czerwonego gniazda"
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr "Funkcja czerwonego gniazda na przednim panelu"
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr "Funkcja żółtego gniazda"
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr "Funkcja żółtego gniazda na przednim panelu"
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr "Wejście linii na przednim panelu"
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr "SÅ‚uchawki"
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr "SÅ‚uchawki na przednim panelu"
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr "Wejście wirtualnego miksera"
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr "Wyjście wirtualnego miksera"
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr "Konfiguracja kanałów wirtualnego miksera"
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
@@ -358,7 +275,6 @@ msgstr ""
"Nie udało się otworzyć urządzenia dźwiękowego do odtwarzania. Urządzenie "
"jest używane przez inną aplikację."
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
@@ -366,11 +282,9 @@ msgstr ""
"Nie udało się otworzyć urządzenia dźwiękowego do odtwarzania. Brak uprawnień "
"do otwarcia urzÄ…dzenia."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
msgid "Could not open audio device for playback."
msgstr "Nie udało się otworzyć urządzenia dźwiękowego do odtwarzania."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
@@ -378,19 +292,15 @@ msgstr ""
"Nie udało się otworzyć urządzenia dźwiękowego do odtwarzania. Ta wersja Open "
"Sound System nie jest obsługiwana przez ten moduł."
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr "To urządzenie dźwiękowe nie obsługuje odtwarzania."
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr "Błąd odtwarzania dźwięku"
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr "To urządzenie dźwiękowe nie obsługuje nagrywania."
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr "Błąd nagrywania z urządzenia dźwiękowego."
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 7d76a233..c0303ce2 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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -17,74 +17,58 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: ext/resindvd/resindvdsrc.c:333
msgid "Could not read title information for DVD."
msgstr "Não foi possível ler as informações de título do DVD."
-#: ext/resindvd/resindvdsrc.c:339
#, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Falha ao abrir o dispositivo de DVD \"%s\"."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr "Falha ao definir busca baseada em PGC."
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr "Erro interno do temporizador."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr "Erro interno de fluxo de dados."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "Nenhum nome de arquivo especificado para gravação."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Não foi possível abrir o arquivo \"%s\" para gravação."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "Erro interno de fluxo de dados."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Não foi possível gravar no arquivo \"%s\"."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "O dispositivo \"%s\" não existe."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Não foi possível abrir o dispositivo de interface \"%s\"."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr ""
"Não foi possível obter as configurações do dispositivo de interface \"%s\"."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Não foi possível abrir o arquivo \"%s\" para leitura."
-#: sys/oss4/oss4-mixer.c:302
msgid "Could not open audio device for mixer control handling."
msgstr ""
"Não foi possível abrir o dispositivo de áudio para manuseio do controle de "
"mixer."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
@@ -92,271 +76,204 @@ msgstr ""
"Não foi possível abrir o dispositivo de áudio para manuseio do controle de "
"mixer. Não há suporte a este elemento nesta versão do Open Sound System."
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr "Rápido"
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr "Baixo"
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr "Médio"
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr "Alto"
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr "Muito alto"
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr "Produção"
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr "Desligado"
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr "Ligado"
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr "Estéreo"
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr "Som surround"
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr "Mistura de entrada"
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr "Frontal"
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr "Traseira"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr "Lateral"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr "Centro/LFE"
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Microfone"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr "Microfone do painel frontal"
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr "Entrada"
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Entrada de linha"
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr "PCM 1"
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr "PCM 2"
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr "PCM 3"
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr "PCM 4"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr "Conector verde"
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr "Conector verde do painel frontal"
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr "Conector rosa"
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr "Conector rosa do painel frontal"
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr "Conector azul"
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr "Conector azul do painel frontal"
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr "Conector laranja"
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr "Conector laranja do painel frontal"
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr "Conector preto"
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr "Conector preto do painel frontal"
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr "Conector cinza"
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr "Conector cinza do painel frontal"
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr "Conector branco"
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr "Conector branco do painel frontal"
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr "Conector vermelho"
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr "Conector vermelho do painel frontal"
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr "Conector amarelo"
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr "Conector amarelo do painel frontal"
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr "Função do conector verde"
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr "Função do conector verde do painel frontal"
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr "Função do conector rosa"
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr "Função do conector rosa do painel frontal"
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr "Função do conector azul"
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr "Função do conector azul do painel frontal"
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr "Função do conector laranja"
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr "Função do conector laranja do painel frontal"
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr "Função do conector preto"
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr "Função do conector preto do painel frontal"
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr "Função do conector cinza"
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr "Função do conector cinza do painel frontal"
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr "Função do conector branco"
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr "Função do conector branco do painel frontal"
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr "Função do conector vermelho"
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr "Função do conector vermelho do painel frontal"
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr "Função do conector amarelo"
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr "Função do conector amarelo do painel frontal"
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr "Entrada de linha do painel frontal"
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr "Fones de ouvido"
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr "Fones de ouvido do painel frontal"
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr "Entrada do mixer virtual"
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr "Saída do mixer virtual"
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr "Configuração de canal do mixer virtual"
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
@@ -364,7 +281,6 @@ msgstr ""
"Não foi possível abrir o dispositivo de áudio para reprodução. O dispositivo "
"está sendo usado por outro aplicativo."
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
@@ -372,11 +288,9 @@ msgstr ""
"Não foi possível abrir o dispositivo de áudio para reprodução. Você não tem "
"permissão para abrir o dispositivo."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
msgid "Could not open audio device for playback."
msgstr "Não foi possível abrir o dispositivo de áudio para reprodução."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
@@ -384,18 +298,14 @@ msgstr ""
"Não foi possível abrir o dispositivo de áudio para reprodução. Não há "
"suporte a este elemento nesta versão do Open Sound System."
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr "Não há suporte a reprodução neste dispositivo de áudio."
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr "Erro de reprodução de áudio."
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr "Não há suporte a gravação neste dispositivo de áudio."
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr "Erro ao gravar deste dispositivo de áudio."
diff --git a/po/ru.po b/po/ru.po
index 0a278012..c7525626 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -15,71 +15,55 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ext/resindvd/resindvdsrc.c:333
msgid "Could not read title information for DVD."
msgstr "Ðе удалоÑÑŒ прочеÑÑ‚ÑŒ информацию о Ñтруктуре DVD."
-#: ext/resindvd/resindvdsrc.c:339
#, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Ðе удалоÑÑŒ открыть DVD-уÑтройÑтво «%s»."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr "Ðе удалоÑÑŒ включить PGC-позиционирование."
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr "ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° Ñинхронизации."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr "ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° передачи данных."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "Ðе указано Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Ðе удалоÑÑŒ открыть Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи файл «%s»."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° потока данных."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Ðе удалоÑÑŒ оÑущеÑтвить запиÑÑŒ в файл «%s»."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "УÑтройÑтво «%s» не ÑущеÑтвует."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Ðе удалоÑÑŒ открыть DVB-декодер «%s»."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Ðе удалоÑÑŒ получить параметры DVB-декодера «%s»."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Ðе удалоÑÑŒ открыть Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð» «%s»."
-#: sys/oss4/oss4-mixer.c:302
msgid "Could not open audio device for mixer control handling."
msgstr "Ðе удалоÑÑŒ открыть аудио-уÑтройÑтво Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ параметров микшера."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
@@ -87,271 +71,204 @@ msgstr ""
"Ðе удалоÑÑŒ открыть аудио-уÑтройÑтво Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ параметров микшера. Ð”Ð°Ð½Ð½Ð°Ñ "
"верÑÐ¸Ñ Open Sound System не поддерживаетÑÑ Ñтим Ñлементом."
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr "СкороÑÑ‚ÑŒ"
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr "Ðизкое"
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr "Среднее"
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr "Ð’Ñ‹Ñокое"
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr "Очень выÑокое"
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr "ПродукциÑ"
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr "Выкл"
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr "Вкл"
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr "Стерео"
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr "Объёмный звук"
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr "Уровень входа"
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr "Фронт"
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr "Тыл"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr "Боковые"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr "Центр / Сабвуфер"
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Микрофон"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr "Фронтальный микрофон"
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr "Вход"
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Линейный вход"
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr "PCM 1"
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr "PCM 2"
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr "PCM 3"
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr "PCM 4"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr "Зелёный разъём"
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr "Фронтальный зелёный разъём"
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr "Розовый разъём"
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr "Фронтальный розовый разъём"
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr "Синий разъём"
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr "Фронтальный Ñиний разъём"
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr "Оранжевый разъём"
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr "Фронтальный оранжевый разъём"
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr "Чёрный разъём"
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr "Фронтальный чёрный разъём"
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr "Серый разъём"
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr "Фронтальный Ñерый разъём"
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr "Белый разъём"
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr "Фронтальный белый разъём"
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr "КраÑный разъём"
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr "Фронтальный краÑный разъём"
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr "Жёлтый разъём"
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr "Фронтальный жёлтый разъём"
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð·ÐµÐ»Ñ‘Ð½Ð¾Ð³Ð¾ разъёма"
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ„Ñ€Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ зелёного разъёма"
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ€Ð¾Ð·Ð¾Ð²Ð¾Ð³Ð¾ разъёма"
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ„Ñ€Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ розового разъёма"
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñинего разъёма"
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ„Ñ€Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ Ñинего разъёма"
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¾Ñ€Ð°Ð½Ð¶ÐµÐ²Ð¾Ð³Ð¾ разъёма"
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ„Ñ€Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ оранжевого разъёма"
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ‡Ñ‘Ñ€Ð½Ð¾Ð³Ð¾ разъёма"
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ„Ñ€Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ чёрного разъёма"
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñерого разъёма"
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ„Ñ€Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ Ñерого разъёма"
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÐµÐ»Ð¾Ð³Ð¾ разъёма"
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ„Ñ€Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ белого разъёма"
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ ÐºÑ€Ð°Ñного разъёма"
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ„Ñ€Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ краÑного разъёма"
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¶Ñ‘Ð»Ñ‚Ð¾Ð³Ð¾ разъёма"
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ„Ñ€Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ жёлтого разъёма"
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr "Фронтальный линейный вход"
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr "Ðаушники"
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr "Фронтальные наушники"
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr "Виртуальный вход микшера"
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr "Виртуальный выход микшера"
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð²Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ñ‹Ñ… каналов микшера"
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
@@ -359,7 +276,6 @@ msgstr ""
"Ðе удалоÑÑŒ открыть аудио-уÑтройÑтво Ð´Ð»Ñ Ð²Ð¾ÑпроизведениÑ. УÑтройÑтво "
"иÑпользуетÑÑ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ приложением."
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
@@ -367,11 +283,9 @@ msgstr ""
"Ðе удалоÑÑŒ открыть аудио-уÑтройÑтво Ð´Ð»Ñ Ð²Ð¾ÑпроизведениÑ. ОтÑутÑтвуют права "
"доÑтупа к уÑтройÑтву."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
msgid "Could not open audio device for playback."
msgstr "Ðе удалоÑÑŒ открыть аудио-уÑтройÑтво Ð´Ð»Ñ Ð²Ð¾ÑпроизведениÑ."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
@@ -379,19 +293,15 @@ msgstr ""
"Ðе удалоÑÑŒ открыть аудио-уÑтройÑтво Ð´Ð»Ñ Ð²Ð¾ÑпроизведениÑ. Ð”Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Open "
"Sound System не поддерживаетÑÑ Ñтим Ñлементом."
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr "ВоÑпроизведение не поддерживаетÑÑ Ð´Ð°Ð½Ð½Ñ‹Ð¼ аудио-уÑтройÑтвом."
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr "Ошибка воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð°ÑƒÐ´Ð¸Ð¾."
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr "ЗапиÑÑŒ не поддерживаетÑÑ Ð´Ð°Ð½Ð½Ñ‹Ð¼ аудио-уÑтройÑтвом."
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr "Ошибка запиÑи Ñ Ð°ÑƒÐ´Ð¸Ð¾-уÑтройÑтва."
diff --git a/po/sk.po b/po/sk.po
index b5b5f441..5edb99c2 100644
--- a/po/sk.po
+++ b/po/sk.po
@@ -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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -20,71 +20,55 @@ msgstr ""
"X-Poedit-Language: Slovak\n"
"X-Poedit-Country: SLOVAKIA\n"
-#: ext/resindvd/resindvdsrc.c:333
msgid "Could not read title information for DVD."
msgstr "Nepodarilo sa preÄítaÅ¥ titulok DVD."
-#: ext/resindvd/resindvdsrc.c:339
#, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Nepodarilo sa otvoriť zariadenie DVD '%s'."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr "Vnútorná chyba ÄasovaÄa."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr "Vnútorná chyba prúdu údajov."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "Nebolo zadané žiadne meno súboru pre zápis."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Nepodarilo sa otvoriť súbor \"%s\" pre zápis."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "Vnútorná chyba prúdu údajov."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Nepodarilo sa zapísať do súboru \"%s\"."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "Zariadenie \"%s\" neexistuje."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Nepodarilo sa otvoriť ovládacie zariadenie \"%s\"."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Nepodarilo sa získať nastavenia od zariadenia \"%s\"."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Nepodarilo sa otvoriÅ¥ súbor \"%s\" na Äítanie."
-#: sys/oss4/oss4-mixer.c:302
msgid "Could not open audio device for mixer control handling."
msgstr "Nepodarilo sa otvoriť zvukové zariadenie pre obsluhu ovládania mixéra."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
@@ -92,271 +76,204 @@ msgstr ""
"Nepodarilo sa otvoriť zvukové zariadenie pre obsluhu ovládania mixéra. Táto "
"verzia Open Sound System nie je podporovaná týmto prvkom."
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr "Rýchla"
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr "Nízka"
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr "Stredná"
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr "Vysoká"
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr "Veľmi vysoká"
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr "ProdukÄná"
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr "Vyp"
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr "Zap"
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr "Stereo"
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr "Surround"
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr "Vstup mix"
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr "Predné"
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr "Zadné"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr "Postranné"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr "Stredné / LFE"
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Mikrofón"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr "Mikrofón predného panelu"
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr "Vstup"
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Linkový vstup"
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr "PCM 1"
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr "PCM 2"
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr "PCM 3"
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr "PCM 4"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr "Zelený konektor"
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr "Zelený konektor na prednom paneli"
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr "Ružový konektor"
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr "Ružový konektor na prednom paneli"
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr "Modrý konektor"
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr "Modrý konektor na prednom paneli"
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr "Oranžový konektor"
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr "Oranžový konektor na prednom paneli"
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr "ÄŒierny konektor"
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr "ÄŒierny konektor na prednom paneli"
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr "Šedý konektor"
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr "Šedý konektor na prednom paneli"
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr "Biely konektor"
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr "Biely konektor na prednom paneli"
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr "Červený konektor"
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr "Červený konektor na prednom paneli"
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr "Žltý konektor"
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr "Žltý konektor na prednom paneli"
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr "Funkcia zeleného konektora"
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr "Funkcia zeleného konektora na prednom paneli"
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr "Funkcia ružového konektora"
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr "Funkcia ružového konektora na prednom paneli"
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr "Funkcia modrého konektora"
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr "Funkcia modrého konektora na prednom paneli"
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr "Funkcia oranžového konektora"
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr "Funkcia oranžového konektora na prednom paneli"
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr "Funkcia Äierneho konektora"
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr "Funkcia Äierneho konektora na prednom paneli"
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr "Funkcia šedého konektora"
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr "Funkcia šedého konektora na prednom paneli"
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr "Funkcia bieleho konektora"
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr "Funkcia bieleho konektora na prednom paneli"
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr "Funkcia Äerveného konektora"
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr "Funkcia Äerveného konektora na prednom paneli"
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr "Funkcia žltého konektora"
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr "Funkcia žltého konektora na prednom paneli"
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr "Linkový vstup na prednom paneli"
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr "Slúchadlá"
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr "Slúchadlá na prednom paneli"
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr "Vstup virtuálneho mixéra"
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr "Výstup virtuálneho mixéra"
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr "Konfigurácia kanálov virtuálneho mixéra"
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
@@ -364,7 +281,6 @@ msgstr ""
"Nepodarilo sa otvoriť zvukové zariadenie v režime prehrávania. Zariadenie už "
"používa iná aplikácia."
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
@@ -372,11 +288,9 @@ msgstr ""
"Nepodarilo sa otvoriť zvukové zariadenie v režime prehrávania. Nemáte "
"oprávnenie na otvorenie tohto zariadenia."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
msgid "Could not open audio device for playback."
msgstr "Nepodarilo sa otvoriť zvukové zariadenie v režime prehrávania."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
@@ -384,19 +298,15 @@ msgstr ""
"Nepodarilo sa otvoriť zvukové zariadenie v režime prehrávania. Túto verziu "
"Open Sound System nepodporuje tento prvok."
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr "Toto zvukové zariadenie nepodporuje prehrávanie."
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr "Chyba prehrávania zvuku."
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr "Toto zvukové zariadenie nepodporuje záznam."
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr "Chyba pri zázname zo zvukového zariadenia."
diff --git a/po/sq.po b/po/sq.po
index 98729359..e0461250 100644
--- a/po/sq.po
+++ b/po/sq.po
@@ -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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -14,386 +14,296 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ext/resindvd/resindvdsrc.c:333
#, fuzzy
msgid "Could not read title information for DVD."
msgstr "I pamundur shkrimi tek file \"%s\"."
-#: ext/resindvd/resindvdsrc.c:339
#, fuzzy, c-format
msgid "Failed to open DVD device '%s'."
msgstr "E pamundur hapja e dispozitivit frontend \"%s\"."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1659
#, fuzzy
msgid "Internal clock error."
msgstr "Gabim i brendshëm tek stream i të dhënave."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
#, fuzzy
msgid "Internal data flow error."
msgstr "Gabim i brendshëm tek stream i të dhënave."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "Asnjë emër file specifikuar për shkrim."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "E pamundur hapja e file \"%s\" në shkrim."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "Gabim i brendshëm tek stream i të dhënave."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "I pamundur shkrimi tek file \"%s\"."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "Dispozitivi \"%s\" nuk ekziston."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "E pamundur hapja e dispozitivit frontend \"%s\"."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "E pamundur marrja e rregullimeve nga dispozitivi frontend \"%s\"."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "E pamundur hapja e file \"%s\" për lexim."
-#: sys/oss4/oss4-mixer.c:302
#, fuzzy
msgid "Could not open audio device for mixer control handling."
msgstr "E pamundur hapja e dispozitivit të zërit \"%s\" për shkrim."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
msgstr ""
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr ""
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr ""
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr ""
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr ""
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr ""
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr ""
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr ""
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr ""
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr ""
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr ""
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr ""
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr ""
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
#, fuzzy
msgid "Rear"
msgstr "Regjistrimi"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
#, fuzzy
msgid "Side"
msgstr "Video"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr ""
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Mikrofoni"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr ""
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Linja-hyrje"
-#: sys/oss4/oss4-mixer.c:739
#, fuzzy
msgid "PCM 1"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:740
#, fuzzy
msgid "PCM 2"
msgstr "PCM-2"
-#: sys/oss4/oss4-mixer.c:741
#, fuzzy
msgid "PCM 3"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:742
#, fuzzy
msgid "PCM 4"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr ""
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr ""
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr ""
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
msgstr ""
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
msgstr ""
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
#, fuzzy
msgid "Could not open audio device for playback."
msgstr "E pamundur hapja e dispozitivit të zërit \"%s\" për shkrim."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
msgstr ""
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr ""
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr ""
diff --git a/po/sr.po b/po/sr.po
index 07e329fc..c02366c5 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -16,385 +16,295 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : (n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-#: ext/resindvd/resindvdsrc.c:333
#, fuzzy
msgid "Could not read title information for DVD."
msgstr "Ðе могу да пишем у датотеку „%s“."
-#: ext/resindvd/resindvdsrc.c:339
#, fuzzy, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Ðе могу да затворим управљачки уређај „%s“."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr ""
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
#, fuzzy
msgid "No file name specified for writing."
msgstr "Име датотеке није задато."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Ðе могу да отворим датотеку „%s“ ради упиÑа."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr ""
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Ðе могу да пишем у датотеку „%s“."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "Ðе поÑтоји уређај „%s“."
-#: sys/dvb/gstdvbsrc.c:703
#, fuzzy, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Ðе могу да затворим управљачки уређај „%s“."
-#: sys/dvb/gstdvbsrc.c:715
#, fuzzy, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Ðе могу да примим довољно бафера Ñа уређаја „%s“."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Ðе могу да отворим датотеку „%s“ ради читања."
-#: sys/oss4/oss4-mixer.c:302
#, fuzzy
msgid "Could not open audio device for mixer control handling."
msgstr "Ðе могу да отворим звучни уређај „%s“ ради упиÑа."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
msgstr ""
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr ""
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr ""
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr ""
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr ""
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr ""
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr ""
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr ""
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr ""
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr ""
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr ""
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr ""
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr ""
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
#, fuzzy
msgid "Rear"
msgstr "Снимање"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
#, fuzzy
msgid "Side"
msgstr "Видео"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr ""
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Микрофон"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr ""
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Ул.лин."
-#: sys/oss4/oss4-mixer.c:739
#, fuzzy
msgid "PCM 1"
msgstr "ПЦМ"
-#: sys/oss4/oss4-mixer.c:740
#, fuzzy
msgid "PCM 2"
msgstr "ПЦМ-2"
-#: sys/oss4/oss4-mixer.c:741
#, fuzzy
msgid "PCM 3"
msgstr "ПЦМ"
-#: sys/oss4/oss4-mixer.c:742
#, fuzzy
msgid "PCM 4"
msgstr "ПЦМ"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr ""
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "ПЦМ"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr ""
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr ""
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
msgstr ""
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
msgstr ""
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
#, fuzzy
msgid "Could not open audio device for playback."
msgstr "Ðе могу да отворим звучни уређај „%s“ ради упиÑа."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
msgstr ""
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr ""
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr ""
diff --git a/po/sv.po b/po/sv.po
index d447a17f..ccafdb11 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -15,71 +15,55 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ext/resindvd/resindvdsrc.c:333
msgid "Could not read title information for DVD."
msgstr "Kunde inte läsa titelinformation för dvd."
-#: ext/resindvd/resindvdsrc.c:339
#, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Misslyckades med att öppna dvd-enheten \"%s\"."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr "Misslyckades med att ställa in PGC-baserad spolning."
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr "Internt klockfel."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr "Internt fel i dataflöde."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "Inget filnamn angavs för skrivning."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Kunde inte öppna filen \"%s\" för skrivning."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "Internt fel i dataström."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Kunde inte skriva till filen \"%s\"."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "Enheten \"%s\" finns inte."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Kunde inte öppna framändsenheten \"%s\"."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Kunde inte få inställningar från framändsenheten \"%s\"."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Kunde inte öppna filen \"%s\" för läsning."
-#: sys/oss4/oss4-mixer.c:302
msgid "Could not open audio device for mixer control handling."
msgstr "Kunde inte öppna ljudenheten för mixningshantering."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
@@ -87,272 +71,205 @@ msgstr ""
"Kunde inte öppna ljudenheten för mixningshantering. Denna version av Open "
"Sound System stöds inte av detta element."
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr "Snabb"
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr "LÃ¥g"
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr "Medel"
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr "Hög"
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr "Mycket hög"
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr "Produktion"
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr "Av"
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr "PÃ¥"
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr "Stereo"
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr "Surroundljud"
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr "Ingångsmix"
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr "Fram"
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr "Bak"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr "Sida"
# LFE=lågfrekvenseffekter
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr "Center / LFE"
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Mikrofon"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr "Frontpanelsmikrofon"
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr "Ingång"
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Linje-in"
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr "PCM 1"
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr "PCM 2"
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr "PCM 3"
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr "PCM 4"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr "Grön kontakt"
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr "Grön frontpanelskontakt"
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr "Rosa kontakt"
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr "Rosa frontpanelskontakt"
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr "Blå kontakt"
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr "Blå frontpanelskontakt"
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr "Orange kontakt"
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr "Orange frontpanelskontakt"
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr "Svart kontakt"
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr "Svart frontpanelskontakt"
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr "Grå kontakt"
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr "Grå frontpanelskontakt"
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr "Vit kontakt"
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr "Vit frontpanelskontakt"
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr "Röd kontakt"
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr "Röd frontpanelskontakt"
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr "Gul kontakt"
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr "Gul frontpanelskontakt"
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr "Funktion för grön kontakt"
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr "Funktion för grön frontpanelskontakt"
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr "Funktion för rosa kontakt"
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr "Funktion för rosa frontpanelskontakt"
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr "Funktion för blå kontakt"
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr "Funktion för blå frontpanelskontakt"
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr "Funktion för orange kontakt"
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr "Funktion för orange frontpanelskontakt"
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr "Funktion för svart kontakt"
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr "Funktion för svart frontpanelskontakt"
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr "Funktion för grå kontakt"
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr "Funktion för grå frontpanelskontakt"
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr "Funktion för vit kontakt"
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr "Funktion för vit frontpanelskontakt"
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr "Funktion för röd kontakt"
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr "Funktion för röd frontpanelskontakt"
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr "Funktion för gul kontakt"
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr "Funktion för gul frontpanelskontakt"
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr "Linje-in på frontpanel"
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr "Hörlurar"
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr "Hörlurar på frontpanel"
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr "Virtuell mixeringång"
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr "Virtuell mixerutgång"
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr "Kanalkonfiguration för virtuell mixer"
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
@@ -360,7 +277,6 @@ msgstr ""
"Kunde inte öppna ljudenheten för uppspelning. Enheten används av ett annat "
"program."
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
@@ -368,11 +284,9 @@ msgstr ""
"Kunde inte öppna ljudenheten för uppspelning. Du har inte behörighet att "
"öppna enheten."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
msgid "Could not open audio device for playback."
msgstr "Kunde inte öppna ljudenheten för uppspelning."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
@@ -380,19 +294,15 @@ msgstr ""
"Kunde inte öppna ljudenheten för uppspelning. Denna version av Open Sound "
"System stöds inte av detta element."
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr "Uppspelning stöds inte av denna ljudenhet."
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr "Fel vid ljuduppspelning."
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr "Inspelning stöds inte av denna ljudenhet."
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr "Fel vid inspelning från ljudenhet."
diff --git a/po/tr.po b/po/tr.po
index 0830cfce..1e1aaff2 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -15,71 +15,55 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: KBabel 1.11.4\n"
-#: ext/resindvd/resindvdsrc.c:333
msgid "Could not read title information for DVD."
msgstr "DVD'deki başlık bilgisi okunamıyor."
-#: ext/resindvd/resindvdsrc.c:339
#, c-format
msgid "Failed to open DVD device '%s'."
msgstr "DVD aygıtı açılamadı '%s'."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr "PGC temelli arama ayarı yapılamadı."
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr "İç saat hatası."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr "İç veri akış hatası."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "Yazmak için dosya adı belirtilmedi."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Dosyayı \"%s\" yazmak için açamıyor."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "İç veri akım hatası."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Dosya yazılamıyor \"%s\"."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "Aygıt \"%s\" bulunamadı."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Aygıt açılamaz durumda \"%s\"."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Aygıt ayarları bulunamadı \"%s\"."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Dosyayı \"%s\" okumak için açamıyor."
-#: sys/oss4/oss4-mixer.c:302
msgid "Could not open audio device for mixer control handling."
msgstr "Karıştırıcı işlemi için ses aygıtı açılamıyor."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
@@ -87,271 +71,204 @@ msgstr ""
"Karıştırıcı işlemi için ses aygıtı açılamıyor. Bu öğe tarafından Açık Ses "
"Sistemi'nin bu sürümü desteklenmiyor."
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr "Hızlı"
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr "Düşük"
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr "Orta"
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr "Yüksek"
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr "Çok yüksek"
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr "Yapım"
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr "Kapalı"
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr "Açık"
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr "Stereo"
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr "Surround ses"
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr "Giriş karışımı"
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr "Ön"
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr "Arka"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr "Yan"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr "Merkez / LFE"
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Mikrofon"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr "Ön panel mikrofonu"
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr "GiriÅŸ"
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Hat giriÅŸi"
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr "PCM 1"
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr "PCM 2"
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr "PCM 3"
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr "PCM 4"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr "Yeşil konnektör"
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr "Yeşil ön panel konnektörü"
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr "Pembe konnektör"
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr "Pembe ön panel könnektörü"
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr "Mavi konnektör"
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr "Mavi ön panel konnektörü"
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr "Portakal konnektör"
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr "Portakal ön panel konnektörü"
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr "Siyah konnektör"
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr "Siyah ön panel konnektörü"
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr "Gri konnektör"
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr "Gri ön panel konnektörü"
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr "Beyaz konnektör"
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr "Beyaz ön panel konnektörü"
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr "Kırmızı konnektör"
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr "Kırmızı ön panel konnektörü"
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr "Sarı konnektör"
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr "Sarı ön panel konnektörü"
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr "Yeşil konnektör işlevi"
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr "Yeşil ön panel konnektör işlevi"
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr "Pembe konnektör işlevi"
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr "Pembe ön panel konnektör işlevi"
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr "Mavi konnektör işlevi"
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr "Mavi ön panel konnektör işlevi"
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr "Portakal konnektör işlevi"
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr "Portakal ön panel konnektör işlevi"
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr "Siyah konnektör işlevi"
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr "Siyah ön panel konnektör işlevi"
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr "Gri konnektör işlevi"
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr "Gri ön panel konnektör işlevi"
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr "Beyaz konnektör işlevi"
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr "Beyaz ön panel konnektör işlevi"
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr "Kırmızı konnektör işlevi"
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr "Kırmızı ön panel konnektör işlevi"
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr "Sarı konnektör işlevi"
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr "Sarı ön panel konnektör işlevi"
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr "Ön panel hat girişi"
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr "Kulaklıklar"
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr "Ön panel kulaklıkları"
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr "Sanal karıştırıcı girişi"
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr "Sanal karıştırıcı çıkışı"
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr "Sanal karıştırıcı kanal yapılandırması"
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
@@ -359,17 +276,14 @@ msgstr ""
"Çalmak için ses aygıtı açılamıyor. Aygıt başka bir uygulama tarafından "
"kullanılıyor."
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
msgstr "Çalmak için ses aygıtı açılamıyor. Aygıtı açma izniniz bulunmuyor."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
msgid "Could not open audio device for playback."
msgstr "Çalmak için ses aygıtı açılamıyor."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
@@ -377,18 +291,14 @@ msgstr ""
"Çalmak için ses aygıtı açılamıyor. Açık Ses Sistemi'nin bu sürümü bu öğe "
"tarafından desteklenmiyor."
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr "Bu ses aygıtı çalma işlevini desteklemiyor."
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr "Ses çalma hatası."
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr "Bu ses aygıtı kayıt işlevini desteklemiyor."
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr "Ses aygıtı ile kayıtta hata."
diff --git a/po/uk.po b/po/uk.po
index 879845de..ae4a24a0 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
@@ -17,376 +17,286 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-#: ext/resindvd/resindvdsrc.c:333
msgid "Could not read title information for DVD."
msgstr ""
-#: ext/resindvd/resindvdsrc.c:339
#, fuzzy, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Ðе вдаєтьÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ приÑтрій Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ \"%s\"."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr ""
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr ""
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr ""
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, fuzzy, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Ðе вдаєтьÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr ""
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, fuzzy, c-format
msgid "Could not write to file \"%s\"."
msgstr "Ðе вдаєтьÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ приÑтрій Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ \"%s\"."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "ПриÑтрій \"%s\" не Ñ–Ñнує."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Ðе вдаєтьÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ приÑтрій Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ \"%s\"."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Ðе вдаєтьÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ параметри приÑтрою Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ \"%s\"."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Ðе вдаєтьÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ."
-#: sys/oss4/oss4-mixer.c:302
#, fuzzy
msgid "Could not open audio device for mixer control handling."
msgstr "Ðе вдаєтьÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
msgstr ""
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr ""
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr ""
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr ""
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr ""
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr ""
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr ""
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr ""
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr ""
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr ""
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr ""
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr ""
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr ""
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr ""
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr ""
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr ""
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr ""
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr ""
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr ""
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr ""
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr ""
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr ""
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr ""
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr ""
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr ""
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr ""
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr ""
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr ""
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr ""
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr ""
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr ""
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
msgstr ""
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
msgstr ""
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
#, fuzzy
msgid "Could not open audio device for playback."
msgstr "Ðе вдаєтьÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ приÑтрій Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ \"%s\"."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
msgstr ""
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr ""
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr ""
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr ""
diff --git a/po/vi.po b/po/vi.po
index 8f02fecf..22207357 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -5,10 +5,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: gst-plugins-bad 0.10.9.3\n"
+"Project-Id-Version: gst-plugins-bad 0.10.11.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2009-03-20 23:36+0000\n"
-"PO-Revision-Date: 2009-01-26 20:24+1030\n"
+"POT-Creation-Date: 2009-05-20 20:43+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"
"MIME-Version: 1.0\n"
@@ -17,71 +17,55 @@ msgstr ""
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: LocFactoryEditor 1.8\n"
-#: ext/resindvd/resindvdsrc.c:333
msgid "Could not read title information for DVD."
msgstr "Không thể Ä‘á»c thông tin tá»±a Ä‘á» vá» Ä‘Ä©a DVD."
-#: ext/resindvd/resindvdsrc.c:339
#, c-format
msgid "Failed to open DVD device '%s'."
msgstr "Không mở được thiết bị đĩa DVD « %s »."
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr "Không đặt được chức năng tìm nơi dựa vào PGC."
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr "Lỗi đồng hồ nội bộ."
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr "Lỗi luồng dữ liệu nội bộ."
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "Chưa ghi rõ tên tập tin để ghi vào."
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "Không thể mở tập tin « %s » để ghi."
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "Lỗi luồng dữ liệu nội bộ."
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "Không thể ghi vào tập tin « %s »."
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "Thiết bị « %s » không tồn tại."
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "Không thể mở thiết bị giao diện « %s »."
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "Không thể lấy thiết lập từ thiết bị giao diện « %s »."
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Không thể mở tập tin « %s » để Ä‘á»c."
-#: sys/oss4/oss4-mixer.c:302
msgid "Could not open audio device for mixer control handling."
msgstr "Không thể mở thiết bị âm thanh để quản lý Ä‘iá»u khiển máy hoà tiếng."
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
@@ -89,271 +73,204 @@ msgstr ""
"Không thể mở thiết bị âm thanh để quản lý Ä‘iá»u khiển máy hoà tiếng. Phiên "
"bản Hệ thống Âm thanh Mở này không được yếu tố này hỗ trợ."
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr "Nhanh"
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr "Thấp"
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr "Vừa"
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr "Cao"
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr "Rất cao"
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr "Sản xuất"
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr "Tắt"
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr "Bật"
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr "Âm lập thể"
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr "Âm thanh vòm"
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr "Hoà tiếng đầu vào"
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr "TrÆ°á»›c"
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr "Sau"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr "Bên"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr "Giữa/LFE"
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "Máy vi âm"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr "Máy vi âm bảng trước"
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr "Vào"
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "Dây vào"
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr "PCM 1"
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr "PCM 2"
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr "PCM 3"
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr "PCM 4"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr "Äầu kẹp lục"
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr "Äầu kẹp lục bảng trÆ°á»›c"
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr "Äầu kẹp hồng"
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr "Äầu kẹp hồng bảng trÆ°á»›c"
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr "Äầu kẹp xanh"
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr "Äầu kẹp xanh bảng trÆ°á»›c"
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr "Äầu kẹp cam"
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr "Äầu kẹp cam bảng trÆ°á»›c"
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr "Äầu kẹp Ä‘en"
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr "Äầu kẹp Ä‘en bảng trÆ°á»›c"
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr "Äầu kẹp xám"
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr "Äầu kẹp xám bảng trÆ°á»›c"
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr "Äầu kẹp trắng"
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr "Äầu kẹp trắng bảng trÆ°á»›c"
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr "Äầu kẹp Ä‘á»"
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr "Äầu kẹp Ä‘á» bảng trÆ°á»›c"
-#: sys/oss4/oss4-mixer.c:770
msgid "Yellow connector"
msgstr "Äầu kẹp vàng"
-#: sys/oss4/oss4-mixer.c:771
msgid "Yellow front panel connector"
msgstr "Äầu kẹp vàng bảng trÆ°á»›c"
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr "Chức năng đầu kẹp lục"
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr "Chức năng đầu kẹp lục bảng trước"
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr "Chức năng đầu kẹp hồng"
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr "Chức năng đầu kẹp hồng bảng trước"
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr "Chức năng đầu kẹp xanh"
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr "Chức năng đầu kẹp xanh bảng trước"
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr "Chức năng đầu kẹp cam"
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr "Chức năng đầu kẹp cam bảng trước"
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr "Chức năng đầu kẹp đen"
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr "Chức năng đầu kẹp đen bảng trước"
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr "Chức năng đầu kẹp xám"
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr "Chức năng đầu kẹp xám bảng trước"
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr "Chức năng đầu kẹp trắng"
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr "Chức năng đầu kẹp trắng bảng trước"
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr "Chức năng đầu kẹp Ä‘á»"
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr "Chức năng đầu kẹp đỠbảng trước"
-#: sys/oss4/oss4-mixer.c:790
msgid "Yellow connector function"
msgstr "Chức năng đầu kẹp vàng"
-#: sys/oss4/oss4-mixer.c:791
msgid "Yellow front panel connector function"
msgstr "Chức năng đầu kẹp vàng bảng trước"
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr "Dây vào bảng trước"
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr "Tai nghe"
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr "Tai nghe bảng trước"
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr "Äầu vào bá»™ hoà tiếng ảo"
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr "Äầu ra bá»™ hoà tiếng ảo"
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr "Cấu hình kênh bộ hoà tiếng ảo"
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
@@ -361,7 +278,6 @@ msgstr ""
"Không thể mở thiết bị âm thanh để phát lại. Thiết bị này đang được ứng dụng "
"khác sử dụng."
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
@@ -369,11 +285,9 @@ msgstr ""
"Không thể mở thiết bị âm thanh để phát lại. Bạn không có quyá»n mở thiết bị "
"này."
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
msgid "Could not open audio device for playback."
msgstr "Không thể mở thiết bị âm thanh để phát lại."
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
@@ -381,30 +295,14 @@ msgstr ""
"Không thể mở thiết bị âm thanh để phát lại. Phiên bản Hệ thống Âm thanh Mở "
"này không được yếu tố này hỗ trợ."
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr "Thiết bị âm thanh này không hỗ trợ chức năng phát lại."
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr "Lỗi phát lại âm thanh."
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr "Thiết bị âm thanh này không hỗ trợ chức năng thu."
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr "Lỗi thu từ thiết bị âm thanh."
-
-#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters."
-#~ msgstr ""
-#~ "Không cấu hình được bộ biên mã TwoLAME. Hãy kiểm tra lại các tham số biên "
-#~ "mã."
-
-#~ msgid ""
-#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The "
-#~ "bitrate was changed to %d kbit/s."
-#~ msgstr ""
-#~ "Không cho phép tỷ lệ bit yêu cầu %d kbit/giây cho thuộc tính « %s ». Tỷ lê "
-#~ "bit đã được thay đổi thành %d kbit/giây."
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 1f90b71f..5256dd7a 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-03-20 23:36+0000\n"
+"POT-Creation-Date: 2009-05-20 20:43+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."
@@ -18,380 +18,290 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ext/resindvd/resindvdsrc.c:333
msgid "Could not read title information for DVD."
msgstr "æ— æ³•è¯»å– DVD 的标头信æ¯ã€‚"
-#: ext/resindvd/resindvdsrc.c:339
#, c-format
msgid "Failed to open DVD device '%s'."
msgstr "无法打开 DVD 设备“%sâ€ã€‚"
-#: ext/resindvd/resindvdsrc.c:345
msgid "Failed to set PGC based seeking."
msgstr "无法设置基于 PGC 的检索。"
-#: ext/resindvd/rsnbasesrc.c:1659
msgid "Internal clock error."
msgstr "内部时钟错误。"
-#: ext/resindvd/rsnbasesrc.c:1904 ext/resindvd/rsnbasesrc.c:1915
-#: gst/aiffparse/aiffparse.c:1265
msgid "Internal data flow error."
msgstr "内部数æ®æµé”™è¯¯ã€‚"
-#: ext/sndfile/gstsfsink.c:277 ext/sndfile/gstsfsrc.c:345
msgid "No file name specified for writing."
msgstr "未指定写入文件å。"
-#: ext/sndfile/gstsfsink.c:290 ext/sndfile/gstsfsrc.c:351
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr "无法以写方å¼æ‰“开文件“%sâ€ã€‚"
-#: ext/sndfile/gstsfsink.c:440 gst/nuvdemux/gstnuvdemux.c:735
msgid "Internal data stream error."
msgstr "内部数æ®æµé”™è¯¯ã€‚"
-#: ext/sndfile/gstsfsink.c:494 ext/sndfile/gstsfsink.c:502
#, c-format
msgid "Could not write to file \"%s\"."
msgstr "无法写入文件“%sâ€ã€‚"
-#: sys/dvb/gstdvbsrc.c:699 sys/dvb/gstdvbsrc.c:792
#, c-format
msgid "Device \"%s\" does not exist."
msgstr "ä¸å­˜åœ¨è®¾å¤‡â€œ%sâ€ã€‚"
-#: sys/dvb/gstdvbsrc.c:703
#, c-format
msgid "Could not open frontend device \"%s\"."
msgstr "无法打开å‰ç«¯è®¾å¤‡â€œ%sâ€ã€‚"
-#: sys/dvb/gstdvbsrc.c:715
#, c-format
msgid "Could not get settings from frontend device \"%s\"."
msgstr "无法从å‰ç«¯è®¾å¤‡â€œ%sâ€èŽ·å–设置。"
-#: sys/dvb/gstdvbsrc.c:796
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "无法以读方å¼æ‰“开文件“%sâ€ã€‚"
-#: sys/oss4/oss4-mixer.c:302
msgid "Could not open audio device for mixer control handling."
msgstr "无法打开音频文件进行混音控制æ“作。"
-#: sys/oss4/oss4-mixer.c:316
msgid ""
"Could not open audio device for mixer control handling. This version of the "
"Open Sound System is not supported by this element."
msgstr ""
"无法打开音频设备进行音é‡æŽ§åˆ¶æ“作。此部件ä¸æ”¯æŒå¼€æ”¾å£°éŸ³ç³»ç»Ÿ(OSS)的版本。"
-#: sys/oss4/oss4-mixer.c:720
msgid "Fast"
msgstr "å¿«"
-#: sys/oss4/oss4-mixer.c:721
msgid "Low"
msgstr "æ…¢"
-#: sys/oss4/oss4-mixer.c:722
msgid "Medium"
msgstr "中等"
-#: sys/oss4/oss4-mixer.c:723
msgid "High"
msgstr "高"
-#: sys/oss4/oss4-mixer.c:724
msgid "Very high"
msgstr "很高"
-#: sys/oss4/oss4-mixer.c:725
msgid "Production"
msgstr "生产商"
-#: sys/oss4/oss4-mixer.c:726
msgid "Off"
msgstr "å…³"
-#: sys/oss4/oss4-mixer.c:727
msgid "On"
msgstr "å¼€"
-#: sys/oss4/oss4-mixer.c:728
msgid "Stereo"
msgstr "立体声"
-#: sys/oss4/oss4-mixer.c:729
msgid "Surround sound"
msgstr "立体声环绕"
-#: sys/oss4/oss4-mixer.c:730 sys/oss4/oss4-mixer.c:805
msgid "Input mix"
msgstr "混音输入"
-#: sys/oss4/oss4-mixer.c:731 sys/oss4/oss4-mixer.c:800
msgid "Front"
msgstr "å‰ç½®å£°é“"
-#: sys/oss4/oss4-mixer.c:732 sys/oss4/oss4-mixer.c:801
msgid "Rear"
msgstr "åŽç½®å£°é“"
-#: sys/oss4/oss4-mixer.c:733 sys/oss4/oss4-mixer.c:802
msgid "Side"
msgstr "å·¦å³å£°é“"
-#: sys/oss4/oss4-mixer.c:734 sys/oss4/oss4-mixer.c:803
msgid "Center / LFE"
msgstr "中置/低音炮"
-#: sys/oss4/oss4-mixer.c:735 sys/oss4/oss4-mixer.c:794
msgid "Microphone"
msgstr "è¯ç­’"
-#: sys/oss4/oss4-mixer.c:736 sys/oss4/oss4-mixer.c:795
msgid "Front panel microphone"
msgstr "è¯ç­’é¢æ¿"
-#: sys/oss4/oss4-mixer.c:737
msgid "Input"
msgstr "输入"
-#: sys/oss4/oss4-mixer.c:738 sys/oss4/oss4-mixer.c:796
msgid "Line-in"
msgstr "线路输入"
-#: sys/oss4/oss4-mixer.c:739
msgid "PCM 1"
msgstr "PCM 1"
-#: sys/oss4/oss4-mixer.c:740
msgid "PCM 2"
msgstr "PCM 2"
-#: sys/oss4/oss4-mixer.c:741
msgid "PCM 3"
msgstr "PCM 3"
-#: sys/oss4/oss4-mixer.c:742
msgid "PCM 4"
msgstr "PCM 4"
-#: sys/oss4/oss4-mixer.c:754
msgid "Green connector"
msgstr "线路输出"
-#: sys/oss4/oss4-mixer.c:755
msgid "Green front panel connector"
msgstr "线路输出é¢æ¿"
-#: sys/oss4/oss4-mixer.c:756
msgid "Pink connector"
msgstr "è¯ç­’输出"
-#: sys/oss4/oss4-mixer.c:757
msgid "Pink front panel connector"
msgstr "è¯ç­’输出é¢æ¿"
-#: sys/oss4/oss4-mixer.c:758
msgid "Blue connector"
msgstr "立体声输入"
-#: sys/oss4/oss4-mixer.c:759
msgid "Blue front panel connector"
msgstr "立体声输入é¢æ¿"
-#: sys/oss4/oss4-mixer.c:760
msgid "Orange connector"
msgstr "低音炮输出"
-#: sys/oss4/oss4-mixer.c:761
msgid "Orange front panel connector"
msgstr "低音炮输出é¢æ¿"
-#: sys/oss4/oss4-mixer.c:762
msgid "Black connector"
msgstr "åŽç½®å£°é“输出"
-#: sys/oss4/oss4-mixer.c:763
msgid "Black front panel connector"
msgstr "åŽç½®å£°é“输出é¢æ¿"
-#: sys/oss4/oss4-mixer.c:764
msgid "Gray connector"
msgstr "中置声é“输出"
-#: sys/oss4/oss4-mixer.c:765
msgid "Gray front panel connector"
msgstr "中置声é“输出é¢æ¿"
-#: sys/oss4/oss4-mixer.c:766
msgid "White connector"
msgstr "å·¦/å•å£°é“"
-#: sys/oss4/oss4-mixer.c:767
msgid "White front panel connector"
msgstr "å·¦/å•å£°é“é¢æ¿"
-#: sys/oss4/oss4-mixer.c:768
msgid "Red connector"
msgstr "å³å£°é“"
-#: sys/oss4/oss4-mixer.c:769
msgid "Red front panel connector"
msgstr "å³å£°é“é¢æ¿"
-#: sys/oss4/oss4-mixer.c:770
#, fuzzy
msgid "Yellow connector"
msgstr "Midi 输出/游æˆæ‘‡æ†"
-#: sys/oss4/oss4-mixer.c:771
#, fuzzy
msgid "Yellow front panel connector"
msgstr "Midi 输出/游æˆæ‘‡æ†é¢æ¿"
-#: sys/oss4/oss4-mixer.c:774
msgid "Green connector function"
msgstr "线路输出音效"
-#: sys/oss4/oss4-mixer.c:775
msgid "Green front panel connector function"
msgstr "线路输出音效é¢æ¿"
-#: sys/oss4/oss4-mixer.c:776
msgid "Pink connector function"
msgstr "è¯ç­’输出音效"
-#: sys/oss4/oss4-mixer.c:777
msgid "Pink front panel connector function"
msgstr "è¯ç­’输出音效é¢æ¿"
-#: sys/oss4/oss4-mixer.c:778
msgid "Blue connector function"
msgstr "立体声输入音效"
-#: sys/oss4/oss4-mixer.c:779
msgid "Blue front panel connector function"
msgstr "立体声输入音效é¢æ¿"
-#: sys/oss4/oss4-mixer.c:780
msgid "Orange connector function"
msgstr "低音炮输出音效"
-#: sys/oss4/oss4-mixer.c:781
msgid "Orange front panel connector function"
msgstr "低音炮输出音效é¢æ¿"
-#: sys/oss4/oss4-mixer.c:782
msgid "Black connector function"
msgstr "åŽç½®å£°é“输出音效"
-#: sys/oss4/oss4-mixer.c:783
msgid "Black front panel connector function"
msgstr "åŽç½®å£°é“输出音效é¢æ¿"
-#: sys/oss4/oss4-mixer.c:784
msgid "Gray connector function"
msgstr "中置声é“输出音效"
-#: sys/oss4/oss4-mixer.c:785
msgid "Gray front panel connector function"
msgstr "中置声é“输出音效é¢æ¿"
-#: sys/oss4/oss4-mixer.c:786
msgid "White connector function"
msgstr "å·¦/å•å£°é“输出音效"
-#: sys/oss4/oss4-mixer.c:787
msgid "White front panel connector function"
msgstr "å·¦/å•å£°é“输出音效é¢æ¿"
-#: sys/oss4/oss4-mixer.c:788
msgid "Red connector function"
msgstr "å³å£°é“输出音效"
-#: sys/oss4/oss4-mixer.c:789
msgid "Red front panel connector function"
msgstr "å³å£°é“输出音效é¢æ¿"
-#: sys/oss4/oss4-mixer.c:790
#, fuzzy
msgid "Yellow connector function"
msgstr "MIDI 输出音效"
-#: sys/oss4/oss4-mixer.c:791
#, fuzzy
msgid "Yellow front panel connector function"
msgstr "MIDI 输出音效é¢æ¿"
-#: sys/oss4/oss4-mixer.c:797
msgid "Front panel line-in"
msgstr "线路输入é¢æ¿"
-#: sys/oss4/oss4-mixer.c:798
msgid "Headphones"
msgstr "头戴å¼è€³æœº"
-#: sys/oss4/oss4-mixer.c:799
msgid "Front panel headphones"
msgstr "头戴å¼è€³æœºé¢æ¿"
-#: sys/oss4/oss4-mixer.c:804
msgid "PCM"
msgstr "PCM"
-#: sys/oss4/oss4-mixer.c:846
msgid "Virtual mixer input"
msgstr "模拟混音输入"
-#: sys/oss4/oss4-mixer.c:848
msgid "Virtual mixer output"
msgstr "模拟混音输出"
-#: sys/oss4/oss4-mixer.c:850
msgid "Virtual mixer channel configuration"
msgstr "模拟混音器设置"
-#: sys/oss4/oss4-sink.c:376 sys/oss4/oss4-source.c:367
msgid ""
"Could not open audio device for playback. Device is being used by another "
"application."
msgstr "无法打开音频设备播放音频。设备正由å¦ä¸€ç¨‹åºä½¿ç”¨ã€‚"
-#: sys/oss4/oss4-sink.c:386 sys/oss4/oss4-source.c:377
msgid ""
"Could not open audio device for playback. You don't have permission to open "
"the device."
msgstr "无法打开音频设备播放音频。您无æƒæ‰“开此设备"
-#: sys/oss4/oss4-sink.c:397 sys/oss4/oss4-source.c:388
msgid "Could not open audio device for playback."
msgstr "无法打开音频设备播放音频。"
-#: sys/oss4/oss4-sink.c:406 sys/oss4/oss4-source.c:398
msgid ""
"Could not open audio device for playback. This version of the Open Sound "
"System is not supported by this element."
msgstr "无法打开音频设备播放音频。此组件ä¸æ”¯æŒå¼€æ”¾å£°éŸ³ç³»ç»Ÿ(OSS)版本。"
-#: sys/oss4/oss4-sink.c:522
msgid "Playback is not supported by this audio device."
msgstr "此音频设备ä¸æ”¯æŒéŸ³é¢‘播放。"
-#: sys/oss4/oss4-sink.c:529
msgid "Audio playback error."
msgstr "音频播放错误。"
-#: sys/oss4/oss4-source.c:520
msgid "Recording is not supported by this audio device."
msgstr "此音频设备ä¸æ”¯æŒå½•éŸ³ã€‚"
-#: sys/oss4/oss4-source.c:527
msgid "Error recording from audio device."
msgstr "从音频设备录音时å‘生错误。"
diff --git a/sys/Makefile.am b/sys/Makefile.am
index e6212c65..161f3339 100644
--- a/sys/Makefile.am
+++ b/sys/Makefile.am
@@ -22,6 +22,12 @@ endif
# CDROM_DIR=
# endif
+if USE_DIRECTDRAW
+DIRECTDRAW_DIR=directdraw
+else
+DIRECTDRAW_DIR=
+endif
+
if USE_FBDEV
FBDEV_DIR=fbdev
else
@@ -64,8 +70,8 @@ else
ACM_DIR=
endif
-SUBDIRS = $(ACM_DIR) $(DVB_DIR) $(FBDEV_DIR) $(OSS4_DIR) $(OSX_VIDEO_DIR) $(QT_DIR) $(VCD_DIR) $(WININET_DIR)
+SUBDIRS = $(ACM_DIR) $(DIRECTDRAW_DIR) $(DVB_DIR) $(FBDEV_DIR) $(OSS4_DIR) $(OSX_VIDEO_DIR) $(QT_DIR) $(VCD_DIR) $(WININET_DIR)
-DIST_SUBDIRS = acmenc acmmp3dec dvb fbdev dshowdecwrapper dshowsrcwrapper dshowvideosink \
+DIST_SUBDIRS = acmenc acmmp3dec directdraw dvb fbdev dshowdecwrapper dshowsrcwrapper dshowvideosink \
oss4 osxvideo qtwrapper vcd wasapi wininet winks winscreencap
diff --git a/sys/directdraw/Makefile.am b/sys/directdraw/Makefile.am
new file mode 100644
index 00000000..647d58ac
--- /dev/null
+++ b/sys/directdraw/Makefile.am
@@ -0,0 +1,12 @@
+plugin_LTLIBRARIES = libgstdirectdrawsink.la
+
+libgstdirectdrawsink_la_SOURCES = gstdirectdrawsink.c gstdirectdrawplugin.c
+libgstdirectdrawsink_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \
+ $(GST_PLUGINS_BASE_CFLAGS) $(DIRECTDRAW_CFLAGS)
+libgstdirectdrawsink_la_LIBADD = $(DIRECTDRAW_LIBS) \
+ $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) \
+ -lgstinterfaces-$(GST_MAJORMINOR)
+libgstdirectdrawsink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(DIRECTDRAW_LDFLAGS)
+libgstdirectdrawsink_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS= gstdirectdrawsink.h
diff --git a/sys/directdraw/gstdirectdrawplugin.c b/sys/directdraw/gstdirectdrawplugin.c
new file mode 100644
index 00000000..190bd02e
--- /dev/null
+++ b/sys/directdraw/gstdirectdrawplugin.c
@@ -0,0 +1,47 @@
+/* GStreamer
+* Copyright (C) 2005 Sebastien Moutte <sebastien@moutte.net>
+* Copyright (C) 2007 Pioneers of the Inevitable <songbird@songbirdnest.com>
+*
+* gstdirectdrawplugin.c:
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Library General Public
+* License as published by the Free Software Foundation; either
+* version 2 of the License, or (at your option) any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Library General Public License for more details.
+*
+* You should have received a copy of the GNU Library General Public
+* License along with this library; if not, write to the
+* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+* Boston, MA 02111-1307, USA.
+*
+* The development of this code was made possible due to the involvement
+* of Pioneers of the Inevitable, the creators of the Songbird Music player
+*
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstdirectdrawsink.h"
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ if (!gst_element_register (plugin, "directdrawsink", GST_RANK_PRIMARY,
+ GST_TYPE_DIRECTDRAW_SINK))
+ return FALSE;
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "directdraw",
+ "Direct Draw plugin library",
+ plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/sys/directdraw/gstdirectdrawsink.c b/sys/directdraw/gstdirectdrawsink.c
new file mode 100644
index 00000000..144f6595
--- /dev/null
+++ b/sys/directdraw/gstdirectdrawsink.c
@@ -0,0 +1,1945 @@
+/* GStreamer
+ * Copyright (C) 2005 Sebastien Moutte <sebastien@moutte.net>
+ * Copyright (C) 2007 Pioneers of the Inevitable <songbird@songbirdnest.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.
+ *
+ * The development of this code was made possible due to the involvement
+ * of Pioneers of the Inevitable, the creators of the Songbird Music player
+ *
+ */
+
+/**
+ * SECTION:element-directdrawsink
+ *
+ * DirectdrawSink renders video RGB frames to any win32 window. This element
+ * can receive a window ID from the application through the #XOverlay interface
+ * and will then render video frames in this window.
+ * If no Window ID was provided by the application, the element will create its
+ * own internal window and render into it.
+ *
+ * <refsect2>
+ * <title>Example pipelines</title>
+ * |[
+ * gst-launch -v videotestsrc ! directdrawsink
+ * ]| a simple pipeline to test the sink
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstdirectdrawsink.h"
+
+GST_DEBUG_CATEGORY_STATIC (directdrawsink_debug);
+#define GST_CAT_DEFAULT directdrawsink_debug
+
+/* elementfactory information */
+static const GstElementDetails gst_directdraw_sink_details =
+GST_ELEMENT_DETAILS ("Direct Draw Video Sink",
+ "Sink/Video",
+ "Output to a video card via Direct Draw",
+ "Sebastien Moutte <sebastien@moutte.net>");
+
+static void gst_directdraw_sink_init_interfaces (GType type);
+
+GST_BOILERPLATE_FULL (GstDirectDrawSink, gst_directdraw_sink, GstVideoSink,
+ GST_TYPE_VIDEO_SINK, gst_directdraw_sink_init_interfaces);
+
+static void gst_directdraw_sink_finalize (GObject * object);
+static void gst_directdraw_sink_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_directdraw_sink_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+static GstCaps *gst_directdraw_sink_get_caps (GstBaseSink * bsink);
+static gboolean gst_directdraw_sink_set_caps (GstBaseSink * bsink,
+ GstCaps * caps);
+static GstStateChangeReturn gst_directdraw_sink_change_state (GstElement *
+ element, GstStateChange transition);
+static GstFlowReturn gst_directdraw_sink_buffer_alloc (GstBaseSink * bsink,
+ guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf);
+static void gst_directdraw_sink_get_times (GstBaseSink * bsink, GstBuffer * buf,
+ GstClockTime * start, GstClockTime * end);
+static GstFlowReturn gst_directdraw_sink_show_frame (GstBaseSink * bsink,
+ GstBuffer * buf);
+
+/* utils */
+static gboolean gst_directdraw_sink_setup_ddraw (GstDirectDrawSink * ddrawsink);
+static gboolean gst_directdraw_sink_create_default_window (GstDirectDrawSink *
+ ddrawsink);
+static gboolean gst_directdraw_sink_check_primary_surface (GstDirectDrawSink *
+ ddrawsink);
+static gboolean gst_directdraw_sink_check_offscreen_surface (GstDirectDrawSink *
+ ddrawsink);
+static GstCaps *gst_directdraw_sink_get_ddrawcaps (GstDirectDrawSink *
+ ddrawsink);
+static GstCaps
+ * gst_directdraw_sink_create_caps_from_surfacedesc (LPDDSURFACEDESC2 desc);
+static void gst_directdraw_sink_cleanup (GstDirectDrawSink * ddrawsink);
+static void gst_directdraw_sink_bufferpool_clear (GstDirectDrawSink *
+ ddrawsink);
+static int gst_directdraw_sink_get_depth (LPDDPIXELFORMAT lpddpfPixelFormat);
+static gboolean gst_ddrawvideosink_get_format_from_caps (GstDirectDrawSink *
+ ddrawsink, GstCaps * caps, DDPIXELFORMAT * pPixelFormat);
+static void gst_directdraw_sink_center_rect (GstDirectDrawSink * ddrawsink,
+ RECT src, RECT dst, RECT * result);
+char *DDErrorString (HRESULT hr);
+
+/* surfaces management functions */
+static void gst_directdraw_sink_surface_destroy (GstDirectDrawSink * ddrawsink,
+ GstDDrawSurface * surface);
+static GstDDrawSurface *gst_directdraw_sink_surface_create (GstDirectDrawSink *
+ ddrawsink, GstCaps * caps, size_t size);
+static gboolean gst_directdraw_sink_surface_check (GstDirectDrawSink *
+ ddrawsink, GstDDrawSurface * surface);
+
+static GstStaticPadTemplate directdrawsink_sink_factory =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("video/x-raw-rgb, "
+ "framerate = (fraction) [ 0, MAX ], "
+ "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ]")
+ );
+
+enum
+{
+ PROP_0,
+ PROP_KEEP_ASPECT_RATIO
+};
+
+/* XOverlay interface implementation */
+static gboolean
+gst_directdraw_sink_interface_supported (GstImplementsInterface * iface,
+ GType type)
+{
+ g_assert (type == GST_TYPE_X_OVERLAY);
+ return TRUE;
+}
+
+static void
+gst_directdraw_sink_interface_init (GstImplementsInterfaceClass * klass)
+{
+ klass->supported = gst_directdraw_sink_interface_supported;
+}
+
+static void
+gst_directdraw_sink_set_window_id (GstXOverlay * overlay, ULONG window_id)
+{
+ GstDirectDrawSink *ddrawsink = GST_DIRECTDRAW_SINK (overlay);
+
+ GST_OBJECT_LOCK (ddrawsink);
+ /* check if we are already using this window id */
+ if (ddrawsink->video_window == (HWND) window_id) {
+ GST_OBJECT_UNLOCK (ddrawsink);
+ return;
+ }
+
+ if (window_id) {
+ HRESULT hres;
+
+ /* If we had an internal window, close it first */
+ if (ddrawsink->video_window && ddrawsink->our_video_window) {
+ /* Trick to let the event thread know that it has to die silently */
+ ddrawsink->our_video_window = FALSE;
+ /* Post quit message and wait for our event window thread */
+ PostMessage (ddrawsink->video_window, WM_QUIT, 0, 0);
+ }
+
+ ddrawsink->video_window = (HWND) window_id;
+ ddrawsink->our_video_window = FALSE;
+ if (ddrawsink->setup) {
+ /* update the clipper object with the new window */
+ hres = IDirectDrawClipper_SetHWnd (ddrawsink->clipper, 0,
+ ddrawsink->video_window);
+ }
+ }
+ /* FIXME: Handle the case where window_id is 0 and we want the sink to
+ * create a new window when playback was already started (after set_caps) */
+ GST_OBJECT_UNLOCK (ddrawsink);
+}
+
+static void
+gst_directdraw_sink_expose (GstXOverlay * overlay)
+{
+ GstDirectDrawSink *ddrawsink = GST_DIRECTDRAW_SINK (overlay);
+
+ gst_directdraw_sink_show_frame (GST_BASE_SINK (ddrawsink), NULL);
+}
+
+static void
+gst_directdraw_sink_xoverlay_interface_init (GstXOverlayClass * iface)
+{
+ iface->set_xwindow_id = gst_directdraw_sink_set_window_id;
+ iface->expose = gst_directdraw_sink_expose;
+}
+
+static void
+gst_directdraw_sink_init_interfaces (GType type)
+{
+ static const GInterfaceInfo iface_info = {
+ (GInterfaceInitFunc) gst_directdraw_sink_interface_init,
+ NULL,
+ NULL,
+ };
+
+ static const GInterfaceInfo xoverlay_info = {
+ (GInterfaceInitFunc) gst_directdraw_sink_xoverlay_interface_init,
+ NULL,
+ NULL,
+ };
+
+ g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE,
+ &iface_info);
+ g_type_add_interface_static (type, GST_TYPE_X_OVERLAY, &xoverlay_info);
+}
+
+/* Subclass of GstBuffer which manages buffer_pool surfaces lifetime */
+static void gst_ddrawsurface_finalize (GstMiniObject * mini_object);
+static GstBufferClass *ddrawsurface_parent_class = NULL;
+
+static void
+gst_ddrawsurface_init (GstDDrawSurface * surface, gpointer g_class)
+{
+ surface->surface = NULL;
+ surface->width = 0;
+ surface->height = 0;
+ surface->ddrawsink = NULL;
+ surface->locked = FALSE;
+ surface->system_memory = FALSE;
+ memset (&surface->dd_pixel_format, 0, sizeof (DDPIXELFORMAT));
+}
+
+static void
+gst_ddrawsurface_class_init (gpointer g_class, gpointer class_data)
+{
+ GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (g_class);
+
+ ddrawsurface_parent_class = g_type_class_peek_parent (g_class);
+
+ mini_object_class->finalize = GST_DEBUG_FUNCPTR (gst_ddrawsurface_finalize);
+}
+
+GType
+gst_ddrawsurface_get_type (void)
+{
+ static GType _gst_ddrawsurface_type;
+
+ if (G_UNLIKELY (_gst_ddrawsurface_type == 0)) {
+ static const GTypeInfo ddrawsurface_info = {
+ sizeof (GstBufferClass),
+ NULL,
+ NULL,
+ gst_ddrawsurface_class_init,
+ NULL,
+ NULL,
+ sizeof (GstDDrawSurface),
+ 0,
+ (GInstanceInitFunc) gst_ddrawsurface_init,
+ NULL
+ };
+ _gst_ddrawsurface_type = g_type_register_static (GST_TYPE_BUFFER,
+ "GstDDrawSurface", &ddrawsurface_info, 0);
+ }
+ return _gst_ddrawsurface_type;
+}
+
+static void
+gst_ddrawsurface_finalize (GstMiniObject * mini_object)
+{
+ GstDirectDrawSink *ddrawsink = NULL;
+ GstDDrawSurface *surface;
+
+ surface = (GstDDrawSurface *) mini_object;
+
+ ddrawsink = surface->ddrawsink;
+ if (!ddrawsink)
+ goto no_sink;
+
+ /* If our geometry changed we can't reuse that image. */
+ if ((surface->width != ddrawsink->video_width) ||
+ (surface->height != ddrawsink->video_height) ||
+ (memcmp (&surface->dd_pixel_format, &ddrawsink->dd_pixel_format,
+ sizeof (DDPIXELFORMAT)) != 0 ||
+ !gst_directdraw_sink_surface_check (ddrawsink, surface))
+ ) {
+ GST_CAT_INFO_OBJECT (directdrawsink_debug, ddrawsink,
+ "destroy image as its size changed %dx%d vs current %dx%d",
+ surface->width, surface->height, ddrawsink->video_width,
+ ddrawsink->video_height);
+ gst_directdraw_sink_surface_destroy (ddrawsink, surface);
+ GST_MINI_OBJECT_CLASS (ddrawsurface_parent_class)->finalize (mini_object);
+ } else {
+ /* In that case we can reuse the image and add it to our image pool. */
+ GST_CAT_INFO_OBJECT (directdrawsink_debug, ddrawsink,
+ "recycling image in pool");
+
+ /* need to increment the refcount again to recycle */
+ gst_buffer_ref (GST_BUFFER (surface));
+
+ g_mutex_lock (ddrawsink->pool_lock);
+ ddrawsink->buffer_pool = g_slist_prepend (ddrawsink->buffer_pool, surface);
+ g_mutex_unlock (ddrawsink->pool_lock);
+ }
+
+ return;
+
+no_sink:
+ GST_CAT_WARNING (directdrawsink_debug, "no sink found");
+ GST_MINI_OBJECT_CLASS (ddrawsurface_parent_class)->finalize (mini_object);
+ return;
+}
+
+/************************************************************************/
+/* Directdraw sink functions */
+/************************************************************************/
+static void
+gst_directdraw_sink_base_init (gpointer g_class)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
+
+ gst_element_class_set_details (element_class, &gst_directdraw_sink_details);
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&directdrawsink_sink_factory));
+}
+
+static void
+gst_directdraw_sink_class_init (GstDirectDrawSinkClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseSinkClass *gstbasesink_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstbasesink_class = (GstBaseSinkClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+
+ GST_DEBUG_CATEGORY_INIT (directdrawsink_debug, "directdrawsink", 0,
+ "Directdraw sink");
+
+ gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_directdraw_sink_finalize);
+ gobject_class->get_property =
+ GST_DEBUG_FUNCPTR (gst_directdraw_sink_get_property);
+ gobject_class->set_property =
+ GST_DEBUG_FUNCPTR (gst_directdraw_sink_set_property);
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_directdraw_sink_change_state);
+ gstbasesink_class->get_caps =
+ GST_DEBUG_FUNCPTR (gst_directdraw_sink_get_caps);
+ gstbasesink_class->set_caps =
+ GST_DEBUG_FUNCPTR (gst_directdraw_sink_set_caps);
+ gstbasesink_class->preroll =
+ GST_DEBUG_FUNCPTR (gst_directdraw_sink_show_frame);
+ gstbasesink_class->render =
+ GST_DEBUG_FUNCPTR (gst_directdraw_sink_show_frame);
+ gstbasesink_class->get_times =
+ GST_DEBUG_FUNCPTR (gst_directdraw_sink_get_times);
+ gstbasesink_class->buffer_alloc =
+ GST_DEBUG_FUNCPTR (gst_directdraw_sink_buffer_alloc);
+
+ /* install properties */
+ /* setup aspect ratio mode */
+ g_object_class_install_property (G_OBJECT_CLASS (klass),
+ PROP_KEEP_ASPECT_RATIO, g_param_spec_boolean ("force-aspect-ratio",
+ "Force aspect ratio",
+ "When enabled, scaling will respect original aspect ratio", FALSE,
+ G_PARAM_READWRITE));
+}
+
+static void
+gst_directdraw_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstDirectDrawSink *ddrawsink = GST_DIRECTDRAW_SINK (object);
+
+ switch (prop_id) {
+ case PROP_KEEP_ASPECT_RATIO:
+ ddrawsink->keep_aspect_ratio = g_value_get_boolean (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_directdraw_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstDirectDrawSink *ddrawsink = GST_DIRECTDRAW_SINK (object);
+
+ switch (prop_id) {
+ case PROP_KEEP_ASPECT_RATIO:
+ g_value_set_boolean (value, ddrawsink->keep_aspect_ratio);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_directdraw_sink_finalize (GObject * object)
+{
+ GstDirectDrawSink *ddrawsink = GST_DIRECTDRAW_SINK (object);
+
+ if (ddrawsink->pool_lock) {
+ g_mutex_free (ddrawsink->pool_lock);
+ ddrawsink->pool_lock = NULL;
+ }
+ if (ddrawsink->caps) {
+ gst_caps_unref (ddrawsink->caps);
+ ddrawsink->caps = NULL;
+ }
+ if (ddrawsink->setup) {
+ gst_directdraw_sink_cleanup (ddrawsink);
+ }
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_directdraw_sink_init (GstDirectDrawSink * ddrawsink,
+ GstDirectDrawSinkClass * g_class)
+{
+ /*init members variables */
+ ddrawsink->ddraw_object = NULL;
+ ddrawsink->primary_surface = NULL;
+ ddrawsink->offscreen_surface = NULL;
+ ddrawsink->clipper = NULL;
+ ddrawsink->video_window = NULL;
+ ddrawsink->our_video_window = TRUE;
+ ddrawsink->last_buffer = NULL;
+ ddrawsink->caps = NULL;
+ ddrawsink->window_thread = NULL;
+ ddrawsink->setup = FALSE;
+ ddrawsink->buffer_pool = NULL;
+ ddrawsink->keep_aspect_ratio = FALSE;
+ ddrawsink->pool_lock = g_mutex_new ();
+ ddrawsink->can_blit_between_colorspace = TRUE;
+ ddrawsink->must_recreate_offscreen = FALSE;
+ memset (&ddrawsink->dd_pixel_format, 0, sizeof (DDPIXELFORMAT));
+
+ /*video default values */
+ ddrawsink->video_height = 0;
+ ddrawsink->video_width = 0;
+ ddrawsink->fps_n = 0;
+ ddrawsink->fps_d = 0;
+}
+
+static GstCaps *
+gst_directdraw_sink_get_caps (GstBaseSink * bsink)
+{
+ GstDirectDrawSink *ddrawsink = GST_DIRECTDRAW_SINK (bsink);
+ GstCaps *caps = NULL;
+
+ if (!ddrawsink->setup) {
+ caps = gst_caps_copy (gst_pad_get_pad_template_caps (GST_VIDEO_SINK_PAD
+ (ddrawsink)));
+ GST_CAT_INFO_OBJECT (directdrawsink_debug, ddrawsink,
+ "getcaps called and we are not setup yet, " "returning template %"
+ GST_PTR_FORMAT, caps);
+ } else {
+ caps = gst_caps_ref (ddrawsink->caps);
+ }
+
+ return caps;
+}
+
+static gboolean
+gst_directdraw_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
+{
+ GstDirectDrawSink *ddrawsink = GST_DIRECTDRAW_SINK (bsink);
+ GstStructure *structure = NULL;
+ gboolean ret;
+ const GValue *fps;
+
+ structure = gst_caps_get_structure (caps, 0);
+ if (!structure)
+ return FALSE;
+
+ ret = gst_structure_get_int (structure, "width", &ddrawsink->video_width);
+ ret &= gst_structure_get_int (structure, "height", &ddrawsink->video_height);
+ fps = gst_structure_get_value (structure, "framerate");
+ ret &= (fps != NULL);
+ ret &=
+ gst_ddrawvideosink_get_format_from_caps (ddrawsink, caps,
+ &ddrawsink->dd_pixel_format);
+ if (!ret) {
+ GST_ELEMENT_ERROR (ddrawsink, CORE, NEGOTIATION,
+ ("Failed to get caps properties from caps"), (NULL));
+ return FALSE;
+ }
+
+ ddrawsink->fps_n = gst_value_get_fraction_numerator (fps);
+ ddrawsink->fps_d = gst_value_get_fraction_denominator (fps);
+
+ /* Notify application to set window id now */
+ if (!ddrawsink->video_window) {
+ gst_x_overlay_prepare_xwindow_id (GST_X_OVERLAY (ddrawsink));
+ }
+
+ /* If we still don't have a window at that stage we create our own */
+ if (!ddrawsink->video_window) {
+ gst_directdraw_sink_create_default_window (ddrawsink);
+ }
+
+ /* if we are rendering to our own window, resize it to video size */
+ if (ddrawsink->video_window && ddrawsink->our_video_window) {
+ SetWindowPos (ddrawsink->video_window, NULL,
+ 0, 0, ddrawsink->video_width + (GetSystemMetrics (SM_CXSIZEFRAME) * 2),
+ ddrawsink->video_height + GetSystemMetrics (SM_CYCAPTION) +
+ (GetSystemMetrics (SM_CYSIZEFRAME) * 2), SWP_SHOWWINDOW | SWP_NOMOVE);
+ }
+
+ /* release the surface, we have to recreate it! */
+ if (ddrawsink->offscreen_surface) {
+ IDirectDrawSurface7_Release (ddrawsink->offscreen_surface);
+ ddrawsink->offscreen_surface = NULL;
+ }
+
+ /* create an offscreen surface with the caps */
+ ret = gst_directdraw_sink_check_offscreen_surface (ddrawsink);
+ if (!ret) {
+ GST_ELEMENT_ERROR (ddrawsink, CORE, NEGOTIATION,
+ ("Can't create a directdraw offscreen surface with the input caps"),
+ (NULL));
+ }
+
+ return ret;
+}
+
+static GstStateChangeReturn
+gst_directdraw_sink_change_state (GstElement * element,
+ GstStateChange transition)
+{
+ GstDirectDrawSink *ddrawsink = GST_DIRECTDRAW_SINK (element);
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ if (!gst_directdraw_sink_setup_ddraw (ddrawsink)) {
+ ret = GST_STATE_CHANGE_FAILURE;
+ goto beach;
+ }
+
+ if (!(ddrawsink->caps = gst_directdraw_sink_get_ddrawcaps (ddrawsink))) {
+ ret = GST_STATE_CHANGE_FAILURE;
+ goto beach;
+ }
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ ddrawsink->fps_n = 0;
+ ddrawsink->fps_d = 1;
+ ddrawsink->video_width = 0;
+ ddrawsink->video_height = 0;
+ if (ddrawsink->buffer_pool)
+ gst_directdraw_sink_bufferpool_clear (ddrawsink);
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ if (ddrawsink->setup)
+ gst_directdraw_sink_cleanup (ddrawsink);
+ break;
+ default:
+ break;
+ }
+
+beach:
+ return ret;
+}
+
+static GstFlowReturn
+gst_directdraw_sink_buffer_alloc (GstBaseSink * bsink, guint64 offset,
+ guint size, GstCaps * caps, GstBuffer ** buf)
+{
+ GstDirectDrawSink *ddrawsink = GST_DIRECTDRAW_SINK (bsink);
+ GstStructure *structure;
+ gint width, height;
+ GstDDrawSurface *surface = NULL;
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstCaps *buffer_caps = caps;
+ gboolean buffercaps_unref = FALSE;
+
+ GST_CAT_INFO_OBJECT (directdrawsink_debug, ddrawsink,
+ "a buffer of %u bytes was requested", size);
+
+ structure = gst_caps_get_structure (caps, 0);
+ if (!gst_structure_get_int (structure, "width", &width) ||
+ !gst_structure_get_int (structure, "height", &height)) {
+ GST_WARNING_OBJECT (ddrawsink, "invalid caps for buffer allocation %"
+ GST_PTR_FORMAT, caps);
+ return GST_FLOW_UNEXPECTED;
+ }
+
+ g_mutex_lock (ddrawsink->pool_lock);
+
+ /* Inspect our buffer pool */
+ while (ddrawsink->buffer_pool) {
+ surface = (GstDDrawSurface *) ddrawsink->buffer_pool->data;
+ if (surface) {
+ /* Removing from the pool */
+ ddrawsink->buffer_pool = g_slist_delete_link (ddrawsink->buffer_pool,
+ ddrawsink->buffer_pool);
+
+ /* If the surface is invalid for our need, destroy */
+ if ((surface->width != width) ||
+ (surface->height != height) ||
+ (memcmp (&surface->dd_pixel_format, &ddrawsink->dd_pixel_format,
+ sizeof (DDPIXELFORMAT)) ||
+ !gst_directdraw_sink_surface_check (ddrawsink, surface))
+ ) {
+ gst_directdraw_sink_surface_destroy (ddrawsink, surface);
+ gst_buffer_unref (GST_BUFFER_CAST (surface));
+ surface = NULL;
+ } else {
+ /* We found a suitable surface */
+ break;
+ }
+ }
+ }
+
+ if (!ddrawsink->can_blit_between_colorspace) {
+ /* Hardware doesn't support blit from one colorspace to another.
+ * Check if the colorspace of the current display mode has changed since
+ * the last negociation. If it's the case, we will have to renegociate
+ */
+ guint depth;
+ HRESULT hres;
+ DDSURFACEDESC2 surface_desc;
+ DDSURFACEDESC2 *sd;
+
+ if (!gst_structure_get_int (structure, "depth", (gint *) & depth)) {
+ GST_CAT_DEBUG_OBJECT (directdrawsink_debug, ddrawsink,
+ "Can't get depth from buffer_alloc caps");
+ return GST_FLOW_ERROR;
+ }
+ surface_desc.dwSize = sizeof (surface_desc);
+ sd = &surface_desc;
+ hres =
+ IDirectDraw7_GetDisplayMode (ddrawsink->ddraw_object,
+ (DDSURFACEDESC *) sd);
+ if (hres != DD_OK) {
+ GST_CAT_DEBUG_OBJECT (directdrawsink_debug, ddrawsink,
+ "Can't get current display mode (error=%ld)", (glong) hres);
+ return GST_FLOW_ERROR;
+ }
+
+ if (depth != gst_directdraw_sink_get_depth (&surface_desc.ddpfPixelFormat)) {
+ GstCaps *copy_caps = NULL;
+ GstStructure *copy_structure = NULL;
+ GstCaps *display_caps = NULL;
+ GstStructure *display_structure = NULL;
+
+ /* make a copy of the original caps */
+ copy_caps = gst_caps_copy (caps);
+ copy_structure = gst_caps_get_structure (copy_caps, 0);
+
+ display_caps =
+ gst_directdraw_sink_create_caps_from_surfacedesc (&surface_desc);
+ if (display_caps) {
+ display_structure = gst_caps_get_structure (display_caps, 0);
+ if (display_structure) {
+ gint bpp, endianness, red_mask, green_mask, blue_mask;
+
+ /* get new display mode properties */
+ gst_structure_get_int (display_structure, "depth", (gint *) & depth);
+ gst_structure_get_int (display_structure, "bpp", &bpp);
+ gst_structure_get_int (display_structure, "endianness", &endianness);
+ gst_structure_get_int (display_structure, "red_mask", &red_mask);
+ gst_structure_get_int (display_structure, "green_mask", &green_mask);
+ gst_structure_get_int (display_structure, "blue_mask", &blue_mask);
+
+ /* apply the new display mode changes to the previous caps */
+ gst_structure_set (copy_structure,
+ "bpp", G_TYPE_INT, bpp,
+ "depth", G_TYPE_INT, depth,
+ "endianness", G_TYPE_INT, endianness,
+ "red_mask", G_TYPE_INT, red_mask,
+ "green_mask", G_TYPE_INT, green_mask,
+ "blue_mask", G_TYPE_INT, blue_mask, NULL);
+
+ if (gst_pad_peer_accept_caps (GST_VIDEO_SINK_PAD (ddrawsink),
+ copy_caps)) {
+ buffer_caps = copy_caps;
+ buffercaps_unref = TRUE;
+ /* update buffer size needed to store video frames according to new caps */
+ size = width * height * (bpp / 8);
+
+ /* update our member pixel format */
+ gst_ddrawvideosink_get_format_from_caps (ddrawsink, buffer_caps,
+ &ddrawsink->dd_pixel_format);
+ ddrawsink->must_recreate_offscreen = TRUE;
+
+ GST_CAT_DEBUG_OBJECT (directdrawsink_debug, ddrawsink,
+ " desired caps %s \n\n new caps %s", gst_caps_to_string (caps),
+ gst_caps_to_string (buffer_caps));
+ } else {
+ GST_CAT_DEBUG_OBJECT (directdrawsink_debug, ddrawsink,
+ "peer refused caps re-negociation "
+ "and we can't render with the current caps.");
+ ret = GST_FLOW_ERROR;
+ }
+ }
+ gst_caps_unref (display_caps);
+ }
+
+ if (!buffercaps_unref)
+ gst_caps_unref (copy_caps);
+ }
+ }
+
+ /* We haven't found anything, creating a new one */
+ if (!surface) {
+ surface = gst_directdraw_sink_surface_create (ddrawsink, buffer_caps, size);
+ }
+
+ /* Now we should have a surface, set appropriate caps on it */
+ if (surface) {
+ GST_BUFFER_FLAGS (GST_BUFFER (surface)) = 0;
+ gst_buffer_set_caps (GST_BUFFER (surface), buffer_caps);
+ }
+
+ g_mutex_unlock (ddrawsink->pool_lock);
+
+ *buf = GST_BUFFER (surface);
+
+ if (buffercaps_unref)
+ gst_caps_unref (buffer_caps);
+
+ return ret;
+}
+
+static void
+gst_directdraw_sink_draw_borders (GstDirectDrawSink * ddrawsink, RECT dst_rect)
+{
+ RECT win_rect, fill_rect;
+ POINT win_point;
+ HDC hdc;
+
+ g_return_if_fail (GST_IS_DIRECTDRAW_SINK (ddrawsink));
+
+ /* Get the target window rect */
+ win_point.x = 0;
+ win_point.y = 0;
+ ClientToScreen (ddrawsink->video_window, &win_point);
+ GetClientRect (ddrawsink->video_window, &win_rect);
+ OffsetRect (&win_rect, win_point.x, win_point.y);
+
+ /* We acquire a drawing context */
+ if (IDirectDrawSurface7_GetDC (ddrawsink->primary_surface, &hdc) == DD_OK) {
+ HBRUSH brush = CreateSolidBrush (RGB (0, 0, 0));
+
+ /* Left border */
+ if (dst_rect.left > win_rect.left) {
+ fill_rect.left = win_rect.left;
+ fill_rect.top = win_rect.top;
+ fill_rect.bottom = win_rect.bottom;
+ fill_rect.right = dst_rect.left;
+ FillRect (hdc, &fill_rect, brush);
+ }
+ /* Right border */
+ if (dst_rect.right < win_rect.right) {
+ fill_rect.top = win_rect.top;
+ fill_rect.left = dst_rect.right;
+ fill_rect.bottom = win_rect.bottom;
+ fill_rect.right = win_rect.right;
+ FillRect (hdc, &fill_rect, brush);
+ }
+ /* Top border */
+ if (dst_rect.top > win_rect.top) {
+ fill_rect.top = win_rect.top;
+ fill_rect.left = win_rect.left;
+ fill_rect.right = win_rect.right;
+ fill_rect.bottom = dst_rect.top;
+ FillRect (hdc, &fill_rect, brush);
+ }
+ /* Bottom border */
+ if (dst_rect.bottom < win_rect.bottom) {
+ fill_rect.top = dst_rect.bottom;
+ fill_rect.left = win_rect.left;
+ fill_rect.right = win_rect.right;
+ fill_rect.bottom = win_rect.bottom;
+ FillRect (hdc, &fill_rect, brush);
+ }
+ DeleteObject (brush);
+ IDirectDrawSurface7_ReleaseDC (ddrawsink->primary_surface, hdc);
+ }
+}
+
+static GstFlowReturn
+gst_directdraw_sink_show_frame (GstBaseSink * bsink, GstBuffer * buf)
+{
+ GstDirectDrawSink *ddrawsink = GST_DIRECTDRAW_SINK (bsink);
+ HRESULT hRes;
+ RECT destsurf_rect, src_rect;
+ POINT dest_surf_point;
+
+ if (buf) {
+ /* save a reference to the input buffer */
+ gst_buffer_ref (buf);
+ if (ddrawsink->last_buffer != NULL)
+ gst_buffer_unref (ddrawsink->last_buffer);
+ ddrawsink->last_buffer = buf;
+ } else {
+ /* use last buffer */
+ buf = ddrawsink->last_buffer;
+ }
+
+ if (buf == NULL) {
+ GST_ERROR_OBJECT (ddrawsink, "No buffer to render.");
+ return GST_FLOW_ERROR;
+ } else if (!ddrawsink->video_window) {
+ GST_WARNING_OBJECT (ddrawsink, "No video window to render to.");
+ return GST_FLOW_ERROR;
+ }
+
+ /* get the video window position */
+ GST_OBJECT_LOCK (ddrawsink);
+ if (G_UNLIKELY (!ddrawsink->video_window)) {
+ GST_OBJECT_UNLOCK (ddrawsink);
+ GST_CAT_WARNING_OBJECT (directdrawsink_debug, ddrawsink,
+ "gst_directdraw_sink_show_frame our video window disappeared");
+ GST_ELEMENT_ERROR (ddrawsink, RESOURCE, NOT_FOUND,
+ ("Output window was closed"), (NULL));
+ return GST_FLOW_ERROR;
+ }
+ dest_surf_point.x = 0;
+ dest_surf_point.y = 0;
+ ClientToScreen (ddrawsink->video_window, &dest_surf_point);
+ GetClientRect (ddrawsink->video_window, &destsurf_rect);
+ OffsetRect (&destsurf_rect, dest_surf_point.x, dest_surf_point.y);
+
+ if (ddrawsink->keep_aspect_ratio) {
+ /* center image to dest image keeping aspect ratio */
+ src_rect.top = 0;
+ src_rect.left = 0;
+ src_rect.bottom = ddrawsink->video_height;
+ src_rect.right = ddrawsink->video_width;
+ gst_directdraw_sink_center_rect (ddrawsink, src_rect, destsurf_rect,
+ &destsurf_rect);
+ gst_directdraw_sink_draw_borders (ddrawsink, destsurf_rect);
+ }
+ GST_OBJECT_UNLOCK (ddrawsink);
+
+ if (ddrawsink->must_recreate_offscreen && ddrawsink->offscreen_surface) {
+ IDirectDrawSurface7_Release (ddrawsink->offscreen_surface);
+ ddrawsink->offscreen_surface = NULL;
+ }
+
+ /* check for surfaces lost */
+ if (!gst_directdraw_sink_check_primary_surface (ddrawsink) ||
+ !gst_directdraw_sink_check_offscreen_surface (ddrawsink)) {
+ return GST_FLOW_ERROR;
+ }
+
+ if (!GST_IS_DDRAWSURFACE (buf) ||
+ ((GST_IS_DDRAWSURFACE (buf)) && (GST_BUFFER (buf)->malloc_data))) {
+ /* We are receiving a system memory buffer so we will copy
+ to the memory of our offscreen surface and next blit this surface
+ on the primary surface */
+ LPBYTE data = NULL;
+ guint src_pitch, line;
+ DDSURFACEDESC2 surf_desc;
+ DDSURFACEDESC2 *sd;
+
+ ZeroMemory (&surf_desc, sizeof (surf_desc));
+ surf_desc.dwSize = sizeof (surf_desc);
+ sd = &surf_desc;
+
+ /* Lock the surface */
+ hRes =
+ IDirectDrawSurface7_Lock (ddrawsink->offscreen_surface, NULL,
+ (DDSURFACEDESC *) sd, DDLOCK_WAIT, NULL);
+ if (hRes != DD_OK) {
+ GST_CAT_WARNING_OBJECT (directdrawsink_debug, ddrawsink,
+ "gst_directdraw_sink_show_frame failed locking surface %s",
+ DDErrorString (hRes));
+
+ if (IDirectDrawSurface7_IsLost (ddrawsink->offscreen_surface) == DD_OK)
+ return GST_FLOW_OK;
+ else
+ return GST_FLOW_ERROR;
+ }
+
+ /* Write each line respecting the destination surface pitch */
+ data = surf_desc.lpSurface;
+ src_pitch = GST_BUFFER_SIZE (buf) / ddrawsink->video_height;
+ for (line = 0; line < surf_desc.dwHeight; line++) {
+ memcpy (data, GST_BUFFER_DATA (buf) + (line * src_pitch), src_pitch);
+ data += surf_desc.lPitch;
+ }
+
+ /* Unlock the surface */
+ hRes = IDirectDrawSurface7_Unlock (ddrawsink->offscreen_surface, NULL);
+ if (hRes != DD_OK) {
+ GST_CAT_WARNING_OBJECT (directdrawsink_debug, ddrawsink,
+ "gst_directdraw_sink_show_frame failed unlocking surface %s",
+ DDErrorString (hRes));
+ return GST_FLOW_ERROR;
+ }
+
+ /* blit to primary surface ( Blt will scale the video the dest rect surface
+ * if needed */
+ hRes = IDirectDrawSurface7_Blt (ddrawsink->primary_surface, &destsurf_rect,
+ ddrawsink->offscreen_surface, NULL, DDBLT_WAIT, NULL);
+ if (hRes != DD_OK) /* FIXME: Is it really safe to continue past here ? */
+ GST_CAT_WARNING_OBJECT (directdrawsink_debug, ddrawsink,
+ "IDirectDrawSurface7_Blt (object's offscreen surface) " "returned %s",
+ DDErrorString (hRes));
+
+ } else {
+ /* We are receiving a directdraw surface (previously returned by our buffer
+ * pool so we will simply blit it on the primary surface */
+ GstDDrawSurface *surface = NULL;
+
+ surface = GST_DDRAWSURFACE (buf);
+
+ /* Unlocking surface before blit */
+ IDirectDrawSurface7_Unlock (surface->surface, NULL);
+ surface->locked = FALSE;
+
+ /* blit to our primary surface */
+ hRes = IDirectDrawSurface7_Blt (ddrawsink->primary_surface, &destsurf_rect,
+ surface->surface, NULL, DDBLT_WAIT, NULL);
+ if (hRes != DD_OK) /* FIXME: Is it really safe to continue past here ? */
+ GST_CAT_WARNING_OBJECT (directdrawsink_debug, ddrawsink,
+ "IDirectDrawSurface7_Blt (offscreen surface from buffer_alloc) "
+ "returned %s", DDErrorString (hRes));
+ }
+
+ return GST_FLOW_OK;
+}
+
+static void
+gst_directdraw_sink_get_times (GstBaseSink * bsink, GstBuffer * buf,
+ GstClockTime * start, GstClockTime * end)
+{
+ GstDirectDrawSink *ddrawsink;
+
+ ddrawsink = GST_DIRECTDRAW_SINK (bsink);
+
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
+ *start = GST_BUFFER_TIMESTAMP (buf);
+ if (GST_BUFFER_DURATION_IS_VALID (buf)) {
+ *end = *start + GST_BUFFER_DURATION (buf);
+ } else {
+ if (ddrawsink->fps_n > 0) {
+ *end = *start + (GST_SECOND * ddrawsink->fps_d) / ddrawsink->fps_n;
+ }
+ }
+ }
+}
+
+/* Utility functions */
+
+/* this function fill a DDPIXELFORMAT using Gstreamer caps */
+static gboolean
+gst_ddrawvideosink_get_format_from_caps (GstDirectDrawSink * ddrawsink,
+ GstCaps * caps, DDPIXELFORMAT * pPixelFormat)
+{
+ GstStructure *structure = NULL;
+ gboolean ret = TRUE;
+
+ /* check params */
+ g_return_val_if_fail (pPixelFormat, FALSE);
+ g_return_val_if_fail (caps, FALSE);
+
+ /* init structure */
+ memset (pPixelFormat, 0, sizeof (DDPIXELFORMAT));
+ pPixelFormat->dwSize = sizeof (DDPIXELFORMAT);
+
+ if (!(structure = gst_caps_get_structure (caps, 0))) {
+ GST_CAT_ERROR_OBJECT (directdrawsink_debug, ddrawsink,
+ "can't get structure pointer from caps");
+ return FALSE;
+ }
+
+ if (gst_structure_has_name (structure, "video/x-raw-rgb")) {
+ gint depth, bitcount, bitmask, endianness;
+
+ pPixelFormat->dwFlags = DDPF_RGB;
+ ret &= gst_structure_get_int (structure, "bpp", &bitcount);
+ pPixelFormat->dwRGBBitCount = bitcount;
+ ret &= gst_structure_get_int (structure, "depth", &depth);
+ ret &= gst_structure_get_int (structure, "red_mask", &bitmask);
+ pPixelFormat->dwRBitMask = bitmask;
+ ret &= gst_structure_get_int (structure, "green_mask", &bitmask);
+ pPixelFormat->dwGBitMask = bitmask;
+ ret &= gst_structure_get_int (structure, "blue_mask", &bitmask);
+ pPixelFormat->dwBBitMask = bitmask;
+
+ gst_structure_get_int (structure, "endianness", &endianness);
+ if (endianness == G_BIG_ENDIAN) {
+ endianness = G_LITTLE_ENDIAN;
+ pPixelFormat->dwRBitMask = GUINT32_TO_BE (pPixelFormat->dwRBitMask);
+ pPixelFormat->dwGBitMask = GUINT32_TO_BE (pPixelFormat->dwGBitMask);
+ pPixelFormat->dwBBitMask = GUINT32_TO_BE (pPixelFormat->dwBBitMask);
+ }
+ } else if (gst_structure_has_name (structure, "video/x-raw-yuv")) {
+ guint32 fourcc;
+
+ pPixelFormat->dwFlags = DDPF_FOURCC;
+ ret &= gst_structure_get_fourcc (structure, "format", &fourcc);
+ pPixelFormat->dwFourCC = fourcc;
+ } else {
+ GST_CAT_WARNING_OBJECT (directdrawsink_debug, ddrawsink,
+ "unknown caps name received %" GST_PTR_FORMAT, caps);
+ ret = FALSE;
+ }
+
+ return ret;
+}
+
+/* This function centers the RECT of source surface to
+a dest surface and set the result RECT into result */
+static void
+gst_directdraw_sink_center_rect (GstDirectDrawSink * ddrawsink, RECT src,
+ RECT dst, RECT * result)
+{
+ gdouble src_ratio, dst_ratio;
+ long src_width = src.right;
+ long src_height = src.bottom;
+ long dst_width = dst.right - dst.left;
+ long dst_heigth = dst.bottom - dst.top;
+ long result_width = 0, result_height = 0;
+
+ g_return_if_fail (result != NULL);
+
+ src_ratio = (gdouble) src_width / src_height;
+ dst_ratio = (gdouble) dst_width / dst_heigth;
+
+ if (src_ratio > dst_ratio) {
+ /* new height */
+ result_height = (long) (dst_width / src_ratio);
+
+ result->left = dst.left;
+ result->right = dst.right;
+ result->top = dst.top + (dst_heigth - result_height) / 2;
+ result->bottom = result->top + result_height;
+
+ } else if (src_ratio < dst_ratio) {
+ /* new width */
+ result_width = (long) (dst_heigth * src_ratio);
+
+ result->top = dst.top;
+ result->bottom = dst.bottom;
+ result->left = dst.left + (dst_width - result_width) / 2;
+ result->right = result->left + result_width;
+
+ } else {
+ /* same ratio */
+ memcpy (result, &dst, sizeof (RECT));
+ }
+
+ GST_CAT_INFO_OBJECT (directdrawsink_debug, ddrawsink,
+ "source is %ldx%ld dest is %ldx%ld, result is %ldx%ld with x,y %ldx%ld",
+ src_width, src_height, dst_width, dst_heigth,
+ result->right - result->left, result->bottom - result->top, result->left,
+ result->right);
+}
+
+/**
+ * Get DirectDraw error message.
+ * @hr: HRESULT code
+ * Returns: Text representation of the error.
+ */
+char *
+DDErrorString (HRESULT hr)
+{
+ switch (hr) {
+ case DDERR_ALREADYINITIALIZED:
+ return "DDERR_ALREADYINITIALIZED";
+ case DDERR_CANNOTATTACHSURFACE:
+ return "DDERR_CANNOTATTACHSURFACE";
+ case DDERR_CANNOTDETACHSURFACE:
+ return "DDERR_CANNOTDETACHSURFACE";
+ case DDERR_CURRENTLYNOTAVAIL:
+ return "DDERR_CURRENTLYNOTAVAIL";
+ case DDERR_EXCEPTION:
+ return "DDERR_EXCEPTION";
+ case DDERR_GENERIC:
+ return "DDERR_GENERIC";
+ case DDERR_HEIGHTALIGN:
+ return "DDERR_HEIGHTALIGN";
+ case DDERR_INCOMPATIBLEPRIMARY:
+ return "DDERR_INCOMPATIBLEPRIMARY";
+ case DDERR_INVALIDCAPS:
+ return "DDERR_INVALIDCAPS";
+ case DDERR_INVALIDCLIPLIST:
+ return "DDERR_INVALIDCLIPLIST";
+ case DDERR_INVALIDMODE:
+ return "DDERR_INVALIDMODE";
+ case DDERR_INVALIDOBJECT:
+ return "DDERR_INVALIDOBJECT";
+ case DDERR_INVALIDPARAMS:
+ return "DDERR_INVALIDPARAMS";
+ case DDERR_INVALIDPIXELFORMAT:
+ return "DDERR_INVALIDPIXELFORMAT";
+ case DDERR_INVALIDRECT:
+ return "DDERR_INVALIDRECT";
+ case DDERR_LOCKEDSURFACES:
+ return "DDERR_LOCKEDSURFACES";
+ case DDERR_NO3D:
+ return "DDERR_NO3D";
+ case DDERR_NOALPHAHW:
+ return "DDERR_NOALPHAHW";
+ case DDERR_NOCLIPLIST:
+ return "DDERR_NOCLIPLIST";
+ case DDERR_NOCOLORCONVHW:
+ return "DDERR_NOCOLORCONVHW";
+ case DDERR_NOCOOPERATIVELEVELSET:
+ return "DDERR_NOCOOPERATIVELEVELSET";
+ case DDERR_NOCOLORKEY:
+ return "DDERR_NOCOLORKEY";
+ case DDERR_NOCOLORKEYHW:
+ return "DDERR_NOCOLORKEYHW";
+ case DDERR_NODIRECTDRAWSUPPORT:
+ return "DDERR_NODIRECTDRAWSUPPORT";
+ case DDERR_NOEXCLUSIVEMODE:
+ return "DDERR_NOEXCLUSIVEMODE";
+ case DDERR_NOFLIPHW:
+ return "DDERR_NOFLIPHW";
+ case DDERR_NOGDI:
+ return "DDERR_NOGDI";
+ case DDERR_NOMIRRORHW:
+ return "DDERR_NOMIRRORHW";
+ case DDERR_NOTFOUND:
+ return "DDERR_NOTFOUND";
+ case DDERR_NOOVERLAYHW:
+ return "DDERR_NOOVERLAYHW";
+ case DDERR_NORASTEROPHW:
+ return "DDERR_NORASTEROPHW";
+ case DDERR_NOROTATIONHW:
+ return "DDERR_NOROTATIONHW";
+ case DDERR_NOSTRETCHHW:
+ return "DDERR_NOSTRETCHHW";
+ case DDERR_NOT4BITCOLOR:
+ return "DDERR_NOT4BITCOLOR";
+ case DDERR_NOT4BITCOLORINDEX:
+ return "DDERR_NOT4BITCOLORINDEX";
+ case DDERR_NOT8BITCOLOR:
+ return "DDERR_NOT8BITCOLOR";
+ case DDERR_NOTEXTUREHW:
+ return "DDERR_NOTEXTUREHW";
+ case DDERR_NOVSYNCHW:
+ return "DDERR_NOVSYNCHW";
+ case DDERR_NOZBUFFERHW:
+ return "DDERR_NOZBUFFERHW";
+ case DDERR_NOZOVERLAYHW:
+ return "DDERR_NOZOVERLAYHW";
+ case DDERR_OUTOFCAPS:
+ return "DDERR_OUTOFCAPS";
+ case DDERR_OUTOFMEMORY:
+ return "DDERR_OUTOFMEMORY";
+ case DDERR_OUTOFVIDEOMEMORY:
+ return "DDERR_OUTOFVIDEOMEMORY";
+ case DDERR_OVERLAYCANTCLIP:
+ return "DDERR_OVERLAYCANTCLIP";
+ case DDERR_OVERLAYCOLORKEYONLYONEACTIVE:
+ return "DDERR_OVERLAYCOLORKEYONLYONEACTIVE";
+ case DDERR_PALETTEBUSY:
+ return "DDERR_PALETTEBUSY";
+ case DDERR_COLORKEYNOTSET:
+ return "DDERR_COLORKEYNOTSET";
+ case DDERR_SURFACEALREADYATTACHED:
+ return "DDERR_SURFACEALREADYATTACHED";
+ case DDERR_SURFACEALREADYDEPENDENT:
+ return "DDERR_SURFACEALREADYDEPENDENT";
+ case DDERR_SURFACEBUSY:
+ return "DDERR_SURFACEBUSY";
+ case DDERR_CANTLOCKSURFACE:
+ return "DDERR_CANTLOCKSURFACE";
+ case DDERR_SURFACEISOBSCURED:
+ return "DDERR_SURFACEISOBSCURED";
+ case DDERR_SURFACELOST:
+ return "DDERR_SURFACELOST";
+ case DDERR_SURFACENOTATTACHED:
+ return "DDERR_SURFACENOTATTACHED";
+ case DDERR_TOOBIGHEIGHT:
+ return "DDERR_TOOBIGHEIGHT";
+ case DDERR_TOOBIGSIZE:
+ return "DDERR_TOOBIGSIZE";
+ case DDERR_TOOBIGWIDTH:
+ return "DDERR_TOOBIGWIDTH";
+ case DDERR_UNSUPPORTED:
+ return "DDERR_UNSUPPORTED";
+ case DDERR_UNSUPPORTEDFORMAT:
+ return "DDERR_UNSUPPORTEDFORMAT";
+ case DDERR_UNSUPPORTEDMASK:
+ return "DDERR_UNSUPPORTEDMASK";
+ case DDERR_VERTICALBLANKINPROGRESS:
+ return "DDERR_VERTICALBLANKINPROGRESS";
+ case DDERR_WASSTILLDRAWING:
+ return "DDERR_WASSTILLDRAWING";
+ case DDERR_XALIGN:
+ return "DDERR_XALIGN";
+ case DDERR_INVALIDDIRECTDRAWGUID:
+ return "DDERR_INVALIDDIRECTDRAWGUID";
+ case DDERR_DIRECTDRAWALREADYCREATED:
+ return "DDERR_DIRECTDRAWALREADYCREATED";
+ case DDERR_NODIRECTDRAWHW:
+ return "DDERR_NODIRECTDRAWHW";
+ case DDERR_PRIMARYSURFACEALREADYEXISTS:
+ return "DDERR_PRIMARYSURFACEALREADYEXISTS";
+ case DDERR_NOEMULATION:
+ return "DDERR_NOEMULATION";
+ case DDERR_REGIONTOOSMALL:
+ return "DDERR_REGIONTOOSMALL";
+ case DDERR_CLIPPERISUSINGHWND:
+ return "DDERR_CLIPPERISUSINGHWND";
+ case DDERR_NOCLIPPERATTACHED:
+ return "DDERR_NOCLIPPERATTACHED";
+ case DDERR_NOHWND:
+ return "DDERR_NOHWND";
+ case DDERR_HWNDSUBCLASSED:
+ return "DDERR_HWNDSUBCLASSED";
+ case DDERR_HWNDALREADYSET:
+ return "DDERR_HWNDALREADYSET";
+ case DDERR_NOPALETTEATTACHED:
+ return "DDERR_NOPALETTEATTACHED";
+ case DDERR_NOPALETTEHW:
+ return "DDERR_NOPALETTEHW";
+ case DDERR_BLTFASTCANTCLIP:
+ return "DDERR_BLTFASTCANTCLIP";
+ case DDERR_NOBLTHW:
+ return "DDERR_NOBLTHW";
+ case DDERR_NODDROPSHW:
+ return "DDERR_NODDROPSHW";
+ case DDERR_OVERLAYNOTVISIBLE:
+ return "DDERR_OVERLAYNOTVISIBLE";
+ case DDERR_NOOVERLAYDEST:
+ return "DDERR_NOOVERLAYDEST";
+ case DDERR_INVALIDPOSITION:
+ return "DDERR_INVALIDPOSITION";
+ case DDERR_NOTAOVERLAYSURFACE:
+ return "DDERR_NOTAOVERLAYSURFACE";
+ case DDERR_EXCLUSIVEMODEALREADYSET:
+ return "DDERR_EXCLUSIVEMODEALREADYSET";
+ case DDERR_NOTFLIPPABLE:
+ return "DDERR_NOTFLIPPABLE";
+ case DDERR_CANTDUPLICATE:
+ return "DDERR_CANTDUPLICATE";
+ case DDERR_NOTLOCKED:
+ return "DDERR_NOTLOCKED";
+ case DDERR_CANTCREATEDC:
+ return "DDERR_CANTCREATEDC";
+ case DDERR_NODC:
+ return "DDERR_NODC";
+ case DDERR_WRONGMODE:
+ return "DDERR_WRONGMODE";
+ case DDERR_IMPLICITLYCREATED:
+ return "DDERR_IMPLICITLYCREATED";
+ case DDERR_NOTPALETTIZED:
+ return "DDERR_NOTPALETTIZED";
+ case DDERR_UNSUPPORTEDMODE:
+ return "DDERR_UNSUPPORTEDMODE";
+ case DDERR_NOMIPMAPHW:
+ return "DDERR_NOMIPMAPHW";
+ case DDERR_INVALIDSURFACETYPE:
+ return "DDERR_INVALIDSURFACETYPE";
+ case DDERR_DCALREADYCREATED:
+ return "DDERR_DCALREADYCREATED";
+ case DDERR_CANTPAGELOCK:
+ return "DDERR_CANTPAGELOCK";
+ case DDERR_CANTPAGEUNLOCK:
+ return "DDERR_CANTPAGEUNLOCK";
+ case DDERR_NOTPAGELOCKED:
+ return "DDERR_NOTPAGELOCKED";
+ case DDERR_NOTINITIALIZED:
+ return "DDERR_NOTINITIALIZED";
+ }
+ return "Unknown Error";
+}
+
+static gboolean
+gst_directdraw_sink_setup_ddraw (GstDirectDrawSink * ddrawsink)
+{
+ gboolean bRet = TRUE;
+ HRESULT hRes;
+
+ /* create an instance of the ddraw object use DDCREATE_EMULATIONONLY as first
+ * parameter to force Directdraw to use the hardware emulation layer */
+ hRes = DirectDrawCreateEx ( /*DDCREATE_EMULATIONONLY */ 0,
+ (void **) &ddrawsink->ddraw_object, &IID_IDirectDraw7, NULL);
+ if (hRes != DD_OK || ddrawsink->ddraw_object == NULL) {
+ GST_ELEMENT_ERROR (ddrawsink, RESOURCE, WRITE,
+ ("Failed to create the DirectDraw object error=%s",
+ DDErrorString (hRes)), (NULL));
+ return FALSE;
+ }
+
+ /* set cooperative level */
+ hRes = IDirectDraw7_SetCooperativeLevel (ddrawsink->ddraw_object,
+ NULL, DDSCL_NORMAL);
+ if (hRes != DD_OK) {
+ GST_ELEMENT_ERROR (ddrawsink, RESOURCE, WRITE,
+ ("Failed to set the set the cooperative level error=%s",
+ DDErrorString (hRes)), (NULL));
+ return FALSE;
+ }
+
+ /* setup the clipper object */
+ hRes = IDirectDraw7_CreateClipper (ddrawsink->ddraw_object, 0,
+ &ddrawsink->clipper, NULL);
+
+ if (hRes == DD_OK && ddrawsink->video_window)
+ IDirectDrawClipper_SetHWnd (ddrawsink->clipper, 0, ddrawsink->video_window);
+
+ /* create our primary surface */
+ if (!gst_directdraw_sink_check_primary_surface (ddrawsink))
+ return FALSE;
+
+ /* directdraw objects are setup */
+ ddrawsink->setup = TRUE;
+
+ return bRet;
+}
+
+long FAR PASCAL
+WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ switch (message) {
+ case WM_ERASEBKGND:
+ return TRUE;
+ case WM_CLOSE:
+ DestroyWindow (hWnd);
+ case WM_DESTROY:
+ PostQuitMessage (0);
+ return 0;
+ }
+
+ return DefWindowProc (hWnd, message, wParam, lParam);
+}
+
+static gpointer
+gst_directdraw_sink_window_thread (GstDirectDrawSink * ddrawsink)
+{
+ WNDCLASS WndClass;
+ MSG msg;
+
+ memset (&WndClass, 0, sizeof (WNDCLASS));
+ WndClass.style = CS_HREDRAW | CS_VREDRAW;
+ WndClass.hInstance = GetModuleHandle (NULL);
+ WndClass.lpszClassName = "GStreamer-DirectDraw";
+ WndClass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
+ WndClass.cbClsExtra = 0;
+ WndClass.cbWndExtra = 0;
+ WndClass.lpfnWndProc = WndProc;
+ WndClass.hCursor = LoadCursor (NULL, IDC_ARROW);
+ RegisterClass (&WndClass);
+
+ ddrawsink->video_window = CreateWindowEx (0, "GStreamer-DirectDraw",
+ "GStreamer-DirectDraw sink default window",
+ WS_OVERLAPPEDWINDOW | WS_SIZEBOX, 0, 0, 640, 480, NULL, NULL,
+ WndClass.hInstance, NULL);
+ if (ddrawsink->video_window == NULL)
+ return NULL;
+
+ /* Set the clipper on that window */
+ IDirectDrawClipper_SetHWnd (ddrawsink->clipper, 0, ddrawsink->video_window);
+
+ /* signal application we created a window */
+ gst_x_overlay_got_xwindow_id (GST_X_OVERLAY (ddrawsink),
+ (gulong) ddrawsink->video_window);
+
+ ReleaseSemaphore (ddrawsink->window_created_signal, 1, NULL);
+
+ /* start message loop processing our default window messages */
+ while (GetMessage (&msg, NULL, 0, 0) != FALSE) {
+ TranslateMessage (&msg);
+ DispatchMessage (&msg);
+ }
+
+ GST_CAT_LOG_OBJECT (directdrawsink_debug, ddrawsink,
+ "our window received WM_QUIT or error.");
+ /* The window could have changed, if it is not ours anymore we don't
+ * overwrite the current video window with NULL */
+ if (ddrawsink->our_video_window) {
+ GST_OBJECT_LOCK (ddrawsink);
+ ddrawsink->video_window = NULL;
+ GST_OBJECT_UNLOCK (ddrawsink);
+ }
+
+ return NULL;
+}
+
+static gboolean
+gst_directdraw_sink_create_default_window (GstDirectDrawSink * ddrawsink)
+{
+ ddrawsink->window_created_signal = CreateSemaphore (NULL, 0, 1, NULL);
+ if (ddrawsink->window_created_signal == NULL)
+ return FALSE;
+
+ ddrawsink->window_thread = g_thread_create (
+ (GThreadFunc) gst_directdraw_sink_window_thread, ddrawsink, TRUE, NULL);
+
+ if (ddrawsink->window_thread == NULL)
+ goto failed;
+
+ /* wait maximum 10 seconds for windows creating */
+ if (WaitForSingleObject (ddrawsink->window_created_signal,
+ 10000) != WAIT_OBJECT_0)
+ goto failed;
+
+ CloseHandle (ddrawsink->window_created_signal);
+ return TRUE;
+
+failed:
+ CloseHandle (ddrawsink->window_created_signal);
+ GST_ELEMENT_ERROR (ddrawsink, RESOURCE, WRITE,
+ ("Error creating our default window"), (NULL));
+
+ return FALSE;
+}
+
+static gboolean
+gst_directdraw_sink_check_primary_surface (GstDirectDrawSink * ddrawsink)
+{
+ HRESULT hres;
+ DDSURFACEDESC2 dd_surface_desc;
+ DDSURFACEDESC2 *sd;
+
+ /* if our primary surface already exist, check if it's not lost */
+ if (ddrawsink->primary_surface) {
+ if (IDirectDrawSurface7_IsLost (ddrawsink->primary_surface) == DD_OK) {
+ /* no problem with our primary surface */
+ return TRUE;
+ } else {
+ /* our primary surface was lost, try to restore it */
+ if (IDirectDrawSurface7_Restore (ddrawsink->primary_surface) == DD_OK) {
+ /* restore is done */
+ GST_CAT_LOG_OBJECT (directdrawsink_debug, ddrawsink,
+ "Our primary surface" " was restored after lost");
+ return TRUE;
+ } else {
+ /* failed to restore our primary surface,
+ * probably because the display mode was changed.
+ * Release this surface and recreate a new one.
+ */
+ GST_CAT_LOG_OBJECT (directdrawsink_debug, ddrawsink,
+ "Our primary surface"
+ " was lost and display mode has changed. Destroy and recreate our surface.");
+ IDirectDrawSurface7_Release (ddrawsink->primary_surface);
+ ddrawsink->primary_surface = NULL;
+
+ /* also release offscreen surface */
+ IDirectDrawSurface7_Release (ddrawsink->offscreen_surface);
+ ddrawsink->offscreen_surface = NULL;
+ }
+ }
+ }
+
+ /* create our primary surface */
+ memset (&dd_surface_desc, 0, sizeof (dd_surface_desc));
+ dd_surface_desc.dwSize = sizeof (dd_surface_desc);
+ dd_surface_desc.dwFlags = DDSD_CAPS;
+ dd_surface_desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
+ sd = &dd_surface_desc;
+ hres =
+ IDirectDraw7_CreateSurface (ddrawsink->ddraw_object, (DDSURFACEDESC *) sd,
+ &ddrawsink->primary_surface, NULL);
+ if (hres != DD_OK) {
+ GST_ELEMENT_ERROR (ddrawsink, RESOURCE, WRITE,
+ ("Failed to create our primary surface error=%s", DDErrorString (hres)),
+ (NULL));
+ return FALSE;
+ }
+
+ /* attach our clipper object to the new primary surface */
+ if (ddrawsink->clipper) {
+ hres = IDirectDrawSurface7_SetClipper (ddrawsink->primary_surface,
+ ddrawsink->clipper);
+ }
+
+ return TRUE;
+}
+
+static gboolean
+gst_directdraw_sink_check_offscreen_surface (GstDirectDrawSink * ddrawsink)
+{
+ DDSURFACEDESC2 dd_surface_desc;
+ DDSURFACEDESC2 *sd;
+ HRESULT hres;
+
+ /* if our offscreen surface already exist, check if it's not lost */
+ if (ddrawsink->offscreen_surface) {
+ if (IDirectDrawSurface7_IsLost (ddrawsink->offscreen_surface) == DD_OK) {
+ /* no problem with our offscreen surface */
+ return TRUE;
+ } else {
+ /* our offscreen surface was lost, try to restore it */
+ if (IDirectDrawSurface7_Restore (ddrawsink->offscreen_surface) == DD_OK) {
+ /* restore is done */
+ GST_CAT_LOG_OBJECT (directdrawsink_debug, ddrawsink,
+ "Our offscreen surface" " was restored after lost");
+ return TRUE;
+ } else {
+ /* failed to restore our offscreen surface,
+ * probably because the display mode was changed.
+ * Release this surface and recreate a new one.
+ */
+ GST_CAT_LOG_OBJECT (directdrawsink_debug, ddrawsink,
+ "Our offscreen surface"
+ " was lost and display mode has changed. Destroy and recreate our surface.");
+ IDirectDrawSurface7_Release (ddrawsink->offscreen_surface);
+ ddrawsink->offscreen_surface = NULL;
+ }
+ }
+ }
+
+ memset (&dd_surface_desc, 0, sizeof (dd_surface_desc));
+ dd_surface_desc.dwSize = sizeof (dd_surface_desc);
+ dd_surface_desc.dwFlags =
+ DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
+ dd_surface_desc.dwHeight = ddrawsink->video_height;
+ dd_surface_desc.dwWidth = ddrawsink->video_width;
+ memcpy (&(dd_surface_desc.ddpfPixelFormat), &ddrawsink->dd_pixel_format,
+ sizeof (DDPIXELFORMAT));
+
+ dd_surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
+ sd = &dd_surface_desc;
+ hres =
+ IDirectDraw7_CreateSurface (ddrawsink->ddraw_object, (DDSURFACEDESC *) sd,
+ &ddrawsink->offscreen_surface, NULL);
+ if (hres != DD_OK) {
+ GST_CAT_WARNING_OBJECT (directdrawsink_debug, ddrawsink,
+ "create_ddraw_surface:CreateSurface (offscreen surface for buffer_pool) failed %s",
+ DDErrorString (hres));
+ return FALSE;
+ }
+
+ ddrawsink->must_recreate_offscreen = FALSE;
+
+ return TRUE;
+}
+
+static int
+gst_directdraw_sink_get_depth (LPDDPIXELFORMAT lpddpfPixelFormat)
+{
+ gint order = 0, binary;
+
+ binary =
+ lpddpfPixelFormat->dwRBitMask | lpddpfPixelFormat->
+ dwGBitMask | lpddpfPixelFormat->dwBBitMask | lpddpfPixelFormat->
+ dwRGBAlphaBitMask;
+ while (binary != 0) {
+ if ((binary % 2) == 1)
+ order++;
+ binary = binary >> 1;
+ }
+ return order;
+}
+
+HRESULT WINAPI
+EnumModesCallback2 (LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext)
+{
+ GstDirectDrawSink *ddrawsink = (GstDirectDrawSink *) lpContext;
+ GstCaps *format_caps = NULL;
+ LPDDSURFACEDESC2 sd;
+
+ if (!ddrawsink || !lpDDSurfaceDesc)
+ return DDENUMRET_CANCEL;
+
+ sd = (LPDDSURFACEDESC2) lpDDSurfaceDesc;
+ if ((sd->dwFlags & DDSD_PIXELFORMAT) != DDSD_PIXELFORMAT) {
+ GST_CAT_INFO_OBJECT (directdrawsink_debug, ddrawsink,
+ "Display mode found with DDSD_PIXELFORMAT not set");
+ return DDENUMRET_OK;
+ }
+
+ if ((sd->ddpfPixelFormat.dwFlags & DDPF_RGB) != DDPF_RGB)
+ return DDENUMRET_OK;
+
+ format_caps = gst_directdraw_sink_create_caps_from_surfacedesc (sd);
+
+ if (format_caps) {
+ gst_caps_append (ddrawsink->caps, format_caps);
+ }
+
+ return DDENUMRET_OK;
+}
+
+static GstCaps *
+gst_directdraw_sink_create_caps_from_surfacedesc (LPDDSURFACEDESC2 desc)
+{
+ GstCaps *caps = NULL;
+ gint endianness = G_LITTLE_ENDIAN;
+ gint depth;
+
+ if ((desc->ddpfPixelFormat.dwFlags & DDPF_RGB) != DDPF_RGB)
+ return NULL;
+
+ depth = gst_directdraw_sink_get_depth (&desc->ddpfPixelFormat);
+
+ if (desc->ddpfPixelFormat.dwRGBBitCount == 24 ||
+ desc->ddpfPixelFormat.dwRGBBitCount == 32) {
+ /* ffmpegcolorspace handles 24/32 bpp RGB as big-endian. */
+ endianness = G_BIG_ENDIAN;
+ desc->ddpfPixelFormat.dwRBitMask =
+ GUINT32_TO_BE (desc->ddpfPixelFormat.dwRBitMask);
+ desc->ddpfPixelFormat.dwGBitMask =
+ GUINT32_TO_BE (desc->ddpfPixelFormat.dwGBitMask);
+ desc->ddpfPixelFormat.dwBBitMask =
+ GUINT32_TO_BE (desc->ddpfPixelFormat.dwBBitMask);
+ if (desc->ddpfPixelFormat.dwRGBBitCount == 24) {
+ desc->ddpfPixelFormat.dwRBitMask >>= 8;
+ desc->ddpfPixelFormat.dwGBitMask >>= 8;
+ desc->ddpfPixelFormat.dwBBitMask >>= 8;
+ }
+ }
+
+ caps = gst_caps_new_simple ("video/x-raw-rgb",
+ "width", GST_TYPE_INT_RANGE, 1, G_MAXINT,
+ "height", GST_TYPE_INT_RANGE, 1, G_MAXINT,
+ "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1,
+ "bpp", G_TYPE_INT, desc->ddpfPixelFormat.dwRGBBitCount,
+ "depth", G_TYPE_INT, depth,
+ "endianness", G_TYPE_INT, endianness,
+ "red_mask", G_TYPE_INT, desc->ddpfPixelFormat.dwRBitMask,
+ "green_mask", G_TYPE_INT, desc->ddpfPixelFormat.dwGBitMask,
+ "blue_mask", G_TYPE_INT, desc->ddpfPixelFormat.dwBBitMask, NULL);
+
+ return caps;
+}
+
+static GstCaps *
+gst_directdraw_sink_get_ddrawcaps (GstDirectDrawSink * ddrawsink)
+{
+ HRESULT hRes = S_OK;
+ DDCAPS ddcaps_hardware;
+ DDCAPS ddcaps_emulation;
+ GstCaps *format_caps = NULL;
+
+ ddrawsink->caps = gst_caps_new_empty ();
+ if (!ddrawsink->caps)
+ return FALSE;
+
+ /* get hardware caps */
+ ddcaps_hardware.dwSize = sizeof (DDCAPS);
+ ddcaps_emulation.dwSize = sizeof (DDCAPS);
+ IDirectDraw7_GetCaps (ddrawsink->ddraw_object, &ddcaps_hardware,
+ &ddcaps_emulation);
+
+ /* we don't test for DDCAPS_BLTSTRETCH on the hardware as the directdraw
+ * emulation layer can do it */
+ if (!(ddcaps_hardware.dwCaps & DDCAPS_BLTFOURCC)) {
+ DDSURFACEDESC2 surface_desc;
+ DDSURFACEDESC2 *sd;
+
+ GST_CAT_INFO_OBJECT (directdrawsink_debug, ddrawsink,
+ "hardware doesn't support blit from one colorspace to another one. "
+ "so we will create a caps with only the current display mode");
+
+ /* save blit caps */
+ ddrawsink->can_blit_between_colorspace = FALSE;
+
+ surface_desc.dwSize = sizeof (surface_desc);
+ sd = &surface_desc;
+ hRes =
+ IDirectDraw7_GetDisplayMode (ddrawsink->ddraw_object,
+ (DDSURFACEDESC *) sd);
+ if (hRes != DD_OK) {
+ GST_ELEMENT_ERROR (ddrawsink, CORE, NEGOTIATION,
+ ("Error getting the current display mode error=%s",
+ DDErrorString (hRes)), (NULL));
+ return NULL;
+ }
+
+ format_caps =
+ gst_directdraw_sink_create_caps_from_surfacedesc (&surface_desc);
+ if (format_caps) {
+ gst_caps_append (ddrawsink->caps, format_caps);
+ }
+
+ GST_CAT_INFO_OBJECT (directdrawsink_debug, ddrawsink, "returning caps %s",
+ gst_caps_to_string (ddrawsink->caps));
+ return ddrawsink->caps;
+ }
+
+ GST_CAT_INFO_OBJECT (directdrawsink_debug, ddrawsink,
+ "the hardware can blit from one colorspace to another, "
+ "then enumerate the colorspace supported by the hardware");
+
+ /* save blit caps */
+ ddrawsink->can_blit_between_colorspace = TRUE;
+
+ /* enumerate display modes exposed by directdraw object
+ to know supported RGB modes */
+ hRes =
+ IDirectDraw7_EnumDisplayModes (ddrawsink->ddraw_object,
+ DDEDM_REFRESHRATES, NULL, ddrawsink, EnumModesCallback2);
+ if (hRes != DD_OK) {
+ GST_ELEMENT_ERROR (ddrawsink, CORE, NEGOTIATION,
+ ("Error enumerating display modes error=%s", DDErrorString (hRes)),
+ (NULL));
+
+ return NULL;
+ }
+
+ if (gst_caps_is_empty (ddrawsink->caps)) {
+ gst_caps_unref (ddrawsink->caps);
+ ddrawsink->caps = NULL;
+ GST_ELEMENT_ERROR (ddrawsink, CORE, NEGOTIATION,
+ ("No supported caps found."), (NULL));
+ return NULL;
+ }
+
+ /*GST_CAT_INFO_OBJECT (directdrawsink_debug, ddrawsink, "returning caps %s",
+ * gst_caps_to_string (ddrawsink->caps)); */
+
+ return ddrawsink->caps;
+}
+
+/* Creates miniobject and our internal surface */
+static GstDDrawSurface *
+gst_directdraw_sink_surface_create (GstDirectDrawSink * ddrawsink,
+ GstCaps * caps, size_t size)
+{
+ GstDDrawSurface *surface = NULL;
+ GstStructure *structure = NULL;
+ gint pitch;
+
+#if 0
+ HRESULT hRes;
+#endif
+ DDSURFACEDESC2 surf_desc, surf_lock_desc;
+
+ g_return_val_if_fail (GST_IS_DIRECTDRAW_SINK (ddrawsink), NULL);
+
+ /*init structures */
+ memset (&surf_desc, 0, sizeof (surf_desc));
+ memset (&surf_lock_desc, 0, sizeof (surf_desc));
+ surf_desc.dwSize = sizeof (surf_desc);
+ surf_lock_desc.dwSize = sizeof (surf_lock_desc);
+
+ /*create miniobject and initialize it */
+ surface = (GstDDrawSurface *) gst_mini_object_new (GST_TYPE_DDRAWSURFACE);
+ surface->locked = FALSE;
+
+ structure = gst_caps_get_structure (caps, 0);
+ if (!gst_structure_get_int (structure, "width", &surface->width) ||
+ !gst_structure_get_int (structure, "height", &surface->height)) {
+ GST_CAT_WARNING_OBJECT (directdrawsink_debug, ddrawsink,
+ "failed getting geometry from caps %" GST_PTR_FORMAT, caps);
+ }
+
+ pitch = GST_ROUND_UP_8 (size / surface->height);
+ if (!gst_ddrawvideosink_get_format_from_caps (ddrawsink, caps,
+ &surface->dd_pixel_format)) {
+ GST_CAT_WARNING_OBJECT (directdrawsink_debug, ddrawsink,
+ "failed getting pixel format from caps %" GST_PTR_FORMAT, caps);
+ }
+
+ /* disable return of directdraw surface to buffer alloc because actually I
+ * have no solution to handle display mode changes. The problem is that when
+ * the display mode is changed surface's memory is freed then the upstream
+ * filter would crash trying to write to this memory. Directdraw has a system
+ * lock (DDLOCK_NOSYSLOCK to disable it) to prevent display mode changes
+ * when a surface memory is locked but we need to disable this lock to return
+ * multiple buffers (surfaces) and do not lock directdraw API calls.
+ */
+#if 0
+/* if (ddrawsink->ddraw_object) {*/
+ /* Creating an internal surface which will be used as GstBuffer, we used
+ the detected pixel format and video dimensions */
+
+ surf_desc.ddsCaps.dwCaps =
+ DDSCAPS_OFFSCREENPLAIN /* | DDSCAPS_SYSTEMMEMORY */ ;
+ surf_desc.dwFlags =
+ DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT | DDSD_PITCH;
+ surf_desc.dwHeight = surface->height;
+ surf_desc.dwWidth = surface->width;
+ memcpy (&(surf_desc.ddpfPixelFormat), &surface->dd_pixel_format,
+ sizeof (DDPIXELFORMAT));
+
+ hRes = IDirectDraw7_CreateSurface (ddrawsink->ddraw_object, &surf_desc,
+ &surface->surface, NULL);
+ if (hRes != DD_OK) {
+ goto surface_pitch_bad;
+ }
+
+ /* Locking the surface to acquire the memory pointer.
+ Use DDLOCK_NOSYSLOCK to disable syslock which can cause a deadlock
+ if directdraw api is used while a buffer is lock */
+lock:
+ hRes = IDirectDrawSurface7_Lock (surface->surface, NULL, &surf_lock_desc,
+ DDLOCK_WAIT | DDLOCK_NOSYSLOCK, NULL);
+ if (hRes == DDERR_SURFACELOST) {
+ IDirectDrawSurface7_Restore (surface->surface);
+ goto lock;
+ }
+ surface->locked = TRUE;
+
+ if (surf_lock_desc.lPitch != pitch) {
+ GST_CAT_INFO_OBJECT (directdrawsink_debug, ddrawsink,
+ "DDraw stride/pitch %ld isn't as expected value %d, let's continue allocating a system memory buffer.",
+ surf_lock_desc.lPitch, pitch);
+
+ /*Unlock the surface as we will change it to use system memory with a GStreamer compatible pitch */
+ hRes = IDirectDrawSurface_Unlock (surface->surface, NULL);
+ goto surface_pitch_bad;
+ }
+ GST_BUFFER_DATA (surface) = surf_lock_desc.lpSurface;
+ GST_BUFFER_SIZE (surface) = surf_lock_desc.lPitch * surface->height;
+ GST_CAT_INFO_OBJECT (directdrawsink_debug, ddrawsink,
+ "allocating a surface of %d bytes (stride=%ld)\n", size,
+ surf_lock_desc.lPitch);
+
+surface_pitch_bad:
+#else
+ GST_BUFFER (surface)->malloc_data = g_malloc (size);
+ GST_BUFFER_DATA (surface) = GST_BUFFER (surface)->malloc_data;
+ GST_BUFFER_SIZE (surface) = size;
+ surface->surface = NULL;
+ GST_CAT_INFO_OBJECT (directdrawsink_debug, ddrawsink,
+ "allocating a system memory buffer of %d bytes", size);
+
+#endif
+
+ /* Keep a ref to our sink */
+ surface->ddrawsink = gst_object_ref (ddrawsink);
+
+ return surface;
+}
+
+/* We are called from the finalize method of miniobject, the object will be
+ * destroyed so we just have to clean our internal stuff */
+static void
+gst_directdraw_sink_surface_destroy (GstDirectDrawSink * ddrawsink,
+ GstDDrawSurface * surface)
+{
+ g_return_if_fail (GST_IS_DIRECTDRAW_SINK (ddrawsink));
+
+ /* Release our internal surface */
+ if (surface->surface) {
+ if (surface->locked) {
+ IDirectDrawSurface7_Unlock (surface->surface, NULL);
+ surface->locked = FALSE;
+ }
+ IDirectDrawSurface7_Release (surface->surface);
+ surface->surface = NULL;
+ }
+
+ if (GST_BUFFER (surface)->malloc_data) {
+ g_free (GST_BUFFER (surface)->malloc_data);
+ GST_BUFFER (surface)->malloc_data = NULL;
+ }
+
+ if (!surface->ddrawsink) {
+ goto no_sink;
+ }
+
+ /* Release the ref to our sink */
+ surface->ddrawsink = NULL;
+ gst_object_unref (ddrawsink);
+
+ return;
+
+no_sink:
+ GST_WARNING ("no sink found in surface");
+ return;
+}
+
+static gboolean
+gst_directdraw_sink_surface_check (GstDirectDrawSink * ddrawsink,
+ GstDDrawSurface * surface)
+{
+ if (!surface->surface)
+ return TRUE; /* system memory buffer */
+
+ if (IDirectDrawSurface7_IsLost (surface->surface) == DD_OK) {
+ /* no problem with this surface */
+ return TRUE;
+ } else {
+ /* this surface was lost, try to restore it */
+ if (IDirectDrawSurface7_Restore (ddrawsink->offscreen_surface) == DD_OK) {
+ /* restore is done */
+ GST_CAT_LOG_OBJECT (directdrawsink_debug, ddrawsink, "A surface from our"
+ " bufferpool was restored after lost");
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static void
+gst_directdraw_sink_bufferpool_clear (GstDirectDrawSink * ddrawsink)
+{
+ g_mutex_lock (ddrawsink->pool_lock);
+ while (ddrawsink->buffer_pool) {
+ GstDDrawSurface *surface = ddrawsink->buffer_pool->data;
+
+ ddrawsink->buffer_pool = g_slist_delete_link (ddrawsink->buffer_pool,
+ ddrawsink->buffer_pool);
+ gst_directdraw_sink_surface_destroy (ddrawsink, surface);
+ gst_buffer_unref (GST_BUFFER_CAST (surface));
+ }
+ g_mutex_unlock (ddrawsink->pool_lock);
+}
+
+static void
+gst_directdraw_sink_cleanup (GstDirectDrawSink * ddrawsink)
+{
+ /* Post quit message and wait for our event window thread */
+ if (ddrawsink->video_window && ddrawsink->our_video_window)
+ PostMessage (ddrawsink->video_window, WM_QUIT, 0, 0);
+
+ if (ddrawsink->window_thread) {
+ g_thread_join (ddrawsink->window_thread);
+ ddrawsink->window_thread = NULL;
+ }
+
+ if (ddrawsink->buffer_pool) {
+ gst_directdraw_sink_bufferpool_clear (ddrawsink);
+ ddrawsink->buffer_pool = NULL;
+ }
+
+ if (ddrawsink->offscreen_surface) {
+ IDirectDrawSurface7_Release (ddrawsink->offscreen_surface);
+ ddrawsink->offscreen_surface = NULL;
+ }
+
+ if (ddrawsink->clipper) {
+ IDirectDrawClipper_Release (ddrawsink->clipper);
+ ddrawsink->clipper = NULL;
+ }
+
+ if (ddrawsink->primary_surface) {
+ IDirectDrawSurface7_Release (ddrawsink->primary_surface);
+ ddrawsink->primary_surface = NULL;
+ }
+
+ if (ddrawsink->ddraw_object) {
+ IDirectDraw7_Release (ddrawsink->ddraw_object);
+ ddrawsink->ddraw_object = NULL;
+ }
+
+ if (ddrawsink->last_buffer) {
+ gst_buffer_unref (ddrawsink->last_buffer);
+ ddrawsink->last_buffer = NULL;
+ }
+
+ ddrawsink->setup = FALSE;
+}
diff --git a/sys/directdraw/gstdirectdrawsink.h b/sys/directdraw/gstdirectdrawsink.h
new file mode 100644
index 00000000..9cb5f788
--- /dev/null
+++ b/sys/directdraw/gstdirectdrawsink.h
@@ -0,0 +1,141 @@
+/* GStreamer
+ * Copyright (C) 2005 Sebastien Moutte <sebastien@moutte.net>
+ * Copyright (C) 2007 Pioneers of the Inevitable <songbird@songbirdnest.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.
+ *
+ * The development of this code was made possible due to the involvement
+ * of Pioneers of the Inevitable, the creators of the Songbird Music player
+ *
+ */
+
+#ifndef __GST_DIRECTDRAWSINK_H__
+#define __GST_DIRECTDRAWSINK_H__
+
+#define DIRECTDRAW_VERSION 0x0700
+
+#include <gst/gst.h>
+#include <gst/video/gstvideosink.h>
+#include <gst/interfaces/xoverlay.h>
+
+#include <windows.h>
+#include <ddraw.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_DIRECTDRAW_SINK (gst_directdraw_sink_get_type())
+#define GST_DIRECTDRAW_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DIRECTDRAW_SINK,GstDirectDrawSink))
+#define GST_DIRECTDRAW_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DIRECTDRAW_SINK,GstDirectDrawSinkClass))
+#define GST_IS_DIRECTDRAW_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DIRECTDRAW_SINK))
+#define GST_IS_DIRECTDRAW_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DIRECTDRAW_SINK))
+typedef struct _GstDirectDrawSink GstDirectDrawSink;
+typedef struct _GstDirectDrawSinkClass GstDirectDrawSinkClass;
+
+#define GST_TYPE_DDRAWSURFACE (gst_ddrawsurface_get_type())
+#define GST_IS_DDRAWSURFACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DDRAWSURFACE))
+#define GST_DDRAWSURFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DDRAWSURFACE, GstDDrawSurface))
+
+typedef struct _GstDDrawSurface GstDDrawSurface;
+
+struct _GstDDrawSurface
+{
+ /* Extension of GstBuffer to store directdraw surfaces */
+ GstBuffer buffer;
+
+ /* directdraw surface */
+ LPDIRECTDRAWSURFACE surface;
+
+ /* surface dimensions */
+ gint width;
+ gint height;
+
+ /*TRUE when surface is locked*/
+ gboolean locked;
+
+ /*TRUE when surface is using a system memory buffer
+ (i'm using system memory when directdraw optimized pitch is not the same as the GStreamer one)*/
+ gboolean system_memory;
+
+ /* pixel format of the encapsulated surface */
+ DDPIXELFORMAT dd_pixel_format;
+
+ /* pointer to parent */
+ GstDirectDrawSink *ddrawsink;
+};
+
+struct _GstDirectDrawSink
+{
+ GstVideoSink videosink;
+
+ /* directdraw offscreen surfaces pool */
+ GSList *buffer_pool;
+ GMutex *pool_lock;
+
+ /* directdraw objects */
+ LPDIRECTDRAW ddraw_object;
+ LPDIRECTDRAWSURFACE primary_surface;
+ LPDIRECTDRAWSURFACE offscreen_surface;
+ LPDIRECTDRAWCLIPPER clipper;
+
+ /* last buffer displayed (used for XOverlay interface expose method) */
+ GstBuffer * last_buffer;
+
+ /* directdraw caps */
+ GstCaps *caps;
+
+ /* video window management */
+ HWND video_window;
+ gboolean our_video_window;
+ HANDLE window_created_signal;
+
+ /* video properties */
+ gint video_width, video_height;
+ gint out_width, out_height;
+ gint fps_n;
+ gint fps_d;
+
+ /* properties */
+ gboolean keep_aspect_ratio;
+
+ /*pixel format */
+ DDPIXELFORMAT dd_pixel_format;
+
+ /* thread processing our default window messages */
+ GThread *window_thread;
+
+ /* TRUE when directdraw object is set up */
+ gboolean setup;
+
+ /* TRUE if the hardware supports blitting from one colorspace to another */
+ gboolean can_blit_between_colorspace;
+
+ /* This flag is used to force re-creation of our offscreen surface.
+ * It's needed when hardware doesn't support fourcc blit and the bit depth
+ * of the current display mode changes.
+ */
+ gboolean must_recreate_offscreen;
+};
+
+struct _GstDirectDrawSinkClass
+{
+ GstVideoSinkClass parent_class;
+};
+
+GType gst_directdraw_sink_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_DIRECTDRAWSINK_H__ */
diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am
index cc2d61e4..393e032a 100644
--- a/tests/check/Makefile.am
+++ b/tests/check/Makefile.am
@@ -13,7 +13,7 @@ TESTS_ENVIRONMENT = \
$(REGISTRY_ENVIRONMENT) \
GST_PLUGIN_SYSTEM_PATH= \
GST_PLUGIN_PATH=$(top_builddir)/gst:$(top_builddir)/sys:$(top_builddir)/ext:$(top_builddir)/../gst-ffmpeg/ext/ffmpeg:$(top_builddir)/../gst-plugins-good/gst:$(top_builddir)/../gst-plugins-good/sys:$(top_builddir)/../gst-plugins-good/ext:$(top_builddir)/../gst-plugins-ugly/gst:$(top_builddir)/../gst-plugins-ugly/sys:$(top_builddir)/../gst-plugins-ugly/ext:$(GSTPB_PLUGINS_DIR):$(GST_PLUGINS_DIR) \
- STATE_IGNORE_ELEMENTS="alsaspdifsink apexsink cdaudio dc1394src dccpclientsrc dccpclientsink dccpserversrc dccpserversink dvbsrc dvbbasebin dfbvideosink festival nassink rsndvdbin sdlaudiosink sdlvideosink vcdsrc rfbsrc"
+ STATE_IGNORE_ELEMENTS="alsaspdifsink apexsink camerabin cdaudio dc1394src dccpclientsrc dccpclientsink dccpserversrc dccpserversink dvbsrc dvbbasebin dfbvideosink festival nassink rsndvdbin sdlaudiosink sdlvideosink vcdsrc rfbsrc"
plugindir = $(libdir)/gstreamer-@GST_MAJORMINOR@
@@ -92,11 +92,11 @@ check_PROGRAMS = \
elements/camerabin \
elements/legacyresample \
elements/qtmux \
+ elements/rtpbin \
elements/selector \
elements/mxfdemux \
elements/mxfmux \
pipelines/mxf \
- elements/y4menc \
$(check_metadata)
noinst_HEADERS = elements/mxfdemux.h elements/amrparse_data.h elements/aacparse_data.h
diff --git a/tests/check/elements/.gitignore b/tests/check/elements/.gitignore
index 3e9d29bf..091fb4e5 100644
--- a/tests/check/elements/.gitignore
+++ b/tests/check/elements/.gitignore
@@ -18,6 +18,7 @@ souphttpsrc
rganalysis
rglimiter
rgvolume
+rtpbin
selector
spectrum
timidity
diff --git a/tests/check/elements/rtpbin.c b/tests/check/elements/rtpbin.c
new file mode 100644
index 00000000..bc30c918
--- /dev/null
+++ b/tests/check/elements/rtpbin.c
@@ -0,0 +1,337 @@
+/* GStreamer
+ *
+ * unit test for gstrtpbin
+ *
+ * Copyright (C) <2009> Wim Taymans <wim.taymans@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gst/check/gstcheck.h>
+
+GST_START_TEST (test_cleanup_send)
+{
+ GstElement *rtpbin;
+ GstPad *rtp_sink, *rtp_src, *rtcp_src;
+ GObject *session;
+ gint count = 2;
+
+ rtpbin = gst_element_factory_make ("gstrtpbin", "rtpbin");
+
+ while (count--) {
+ /* request session 0 */
+ rtp_sink = gst_element_get_request_pad (rtpbin, "send_rtp_sink_0");
+ fail_unless (rtp_sink != NULL);
+ ASSERT_OBJECT_REFCOUNT (rtp_sink, "rtp_sink", 2);
+
+ /* request again */
+ rtp_sink = gst_element_get_request_pad (rtpbin, "send_rtp_sink_0");
+ fail_unless (rtp_sink != NULL);
+ ASSERT_OBJECT_REFCOUNT (rtp_sink, "rtp_sink", 3);
+ gst_object_unref (rtp_sink);
+
+ /* this static pad should be created automatically now */
+ rtp_src = gst_element_get_static_pad (rtpbin, "send_rtp_src_0");
+ fail_unless (rtp_src != NULL);
+ ASSERT_OBJECT_REFCOUNT (rtp_src, "rtp_src", 2);
+
+ /* we should be able to get an internal session 0 now */
+ g_signal_emit_by_name (rtpbin, "get-internal-session", 0, &session);
+ fail_unless (session != NULL);
+ g_object_unref (session);
+
+ /* get the send RTCP pad too */
+ rtcp_src = gst_element_get_request_pad (rtpbin, "send_rtcp_src_0");
+ fail_unless (rtcp_src != NULL);
+ ASSERT_OBJECT_REFCOUNT (rtcp_src, "rtcp_src", 2);
+
+ /* second time */
+ rtcp_src = gst_element_get_request_pad (rtpbin, "send_rtcp_src_0");
+ fail_unless (rtcp_src != NULL);
+ ASSERT_OBJECT_REFCOUNT (rtcp_src, "rtcp_src", 3);
+ gst_object_unref (rtcp_src);
+
+ gst_element_release_request_pad (rtpbin, rtp_sink);
+ /* we should only have our refs to the pads now */
+ ASSERT_OBJECT_REFCOUNT (rtp_sink, "rtp_sink", 1);
+ ASSERT_OBJECT_REFCOUNT (rtp_src, "rtp_src", 1);
+ ASSERT_OBJECT_REFCOUNT (rtcp_src, "rtp_src", 2);
+
+ /* the other pad should be gone now */
+ fail_unless (gst_element_get_static_pad (rtpbin, "send_rtp_src_0") == NULL);
+
+ /* internal session should still be there */
+ g_signal_emit_by_name (rtpbin, "get-internal-session", 0, &session);
+ fail_unless (session != NULL);
+ g_object_unref (session);
+
+ /* release the RTCP pad */
+ gst_element_release_request_pad (rtpbin, rtcp_src);
+ /* we should only have our refs to the pads now */
+ ASSERT_OBJECT_REFCOUNT (rtp_sink, "rtp_sink", 1);
+ ASSERT_OBJECT_REFCOUNT (rtp_src, "rtp_src", 1);
+ ASSERT_OBJECT_REFCOUNT (rtcp_src, "rtp_src", 1);
+
+ /* the session should be gone now */
+ g_signal_emit_by_name (rtpbin, "get-internal-session", 0, &session);
+ fail_unless (session == NULL);
+
+ /* unref the request pad and the static pad */
+ gst_object_unref (rtp_sink);
+ gst_object_unref (rtp_src);
+ gst_object_unref (rtcp_src);
+ }
+
+ gst_object_unref (rtpbin);
+}
+
+GST_END_TEST;
+
+typedef struct
+{
+ guint16 seqnum;
+ gboolean pad_added;
+ GstPad *pad;
+ GMutex *lock;
+ GCond *cond;
+ GstPad *sinkpad;
+ GList *pads;
+} CleanupData;
+
+static void
+init_data (CleanupData * data)
+{
+ data->seqnum = 10;
+ data->pad_added = FALSE;
+ data->lock = g_mutex_new ();
+ data->cond = g_cond_new ();
+ data->pads = NULL;
+}
+
+static void
+clean_data (CleanupData * data)
+{
+ g_list_foreach (data->pads, (GFunc) gst_object_unref, NULL);
+ g_list_free (data->pads);
+ g_mutex_free (data->lock);
+ g_cond_free (data->cond);
+}
+
+static guint8 rtp_packet[] = { 0x80, 0x60, 0x94, 0xbc, 0x8f, 0x37, 0x4e, 0xb8,
+ 0x44, 0xa8, 0xf3, 0x7c, 0x06, 0x6a, 0x0c, 0xce,
+ 0x13, 0x25, 0x19, 0x69, 0x1f, 0x93, 0x25, 0x9d,
+ 0x2b, 0x82, 0x31, 0x3b, 0x36, 0xc1, 0x3c, 0x13
+};
+
+static GstBuffer *
+make_rtp_packet (CleanupData * data)
+{
+ static GstCaps *caps = NULL;
+ GstBuffer *result;
+ guint8 *datap;
+
+ if (caps == NULL) {
+ caps = gst_caps_from_string ("application/x-rtp,"
+ "media=(string)audio, clock-rate=(int)44100, "
+ "encoding-name=(string)L16, encoding-params=(string)1, channels=(int)1");
+ data->seqnum = 0;
+ }
+
+ result = gst_buffer_new_and_alloc (sizeof (rtp_packet));
+ datap = GST_BUFFER_DATA (result);
+ memcpy (datap, rtp_packet, sizeof (rtp_packet));
+
+ datap[2] = (data->seqnum >> 8) & 0xff;
+ datap[3] = data->seqnum & 0xff;
+
+ data->seqnum++;
+
+ gst_buffer_set_caps (result, caps);
+
+ return result;
+}
+
+static GstFlowReturn
+dummy_chain (GstPad * pad, GstBuffer * buffer)
+{
+ gst_buffer_unref (buffer);
+
+ return GST_FLOW_OK;
+}
+
+static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("application/x-rtp"));
+
+
+static GstPad *
+make_sinkpad (CleanupData * data)
+{
+ GstPad *pad;
+
+ pad = gst_pad_new_from_static_template (&sink_factory, "sink");
+
+ gst_pad_set_chain_function (pad, dummy_chain);
+ gst_pad_set_active (pad, TRUE);
+
+ data->pads = g_list_prepend (data->pads, pad);
+
+ return pad;
+}
+
+static void
+pad_added_cb (GstElement * rtpbin, GstPad * pad, CleanupData * data)
+{
+ GstPad *sinkpad;
+
+ GST_DEBUG ("pad added %s:%s\n", GST_DEBUG_PAD_NAME (pad));
+
+ if (GST_PAD_IS_SINK (pad))
+ return;
+
+ fail_unless (data->pad_added == FALSE);
+
+ sinkpad = make_sinkpad (data);
+ fail_unless (gst_pad_link (pad, sinkpad) == GST_PAD_LINK_OK);
+
+ g_mutex_lock (data->lock);
+ data->pad_added = TRUE;
+ data->pad = pad;
+ g_cond_signal (data->cond);
+ g_mutex_unlock (data->lock);
+}
+
+static void
+pad_removed_cb (GstElement * rtpbin, GstPad * pad, CleanupData * data)
+{
+ GST_DEBUG ("pad removed %s:%s\n", GST_DEBUG_PAD_NAME (pad));
+
+ if (data->pad != pad)
+ return;
+
+ fail_unless (data->pad_added == TRUE);
+
+ g_mutex_lock (data->lock);
+ data->pad_added = FALSE;
+ g_cond_signal (data->cond);
+ g_mutex_unlock (data->lock);
+}
+
+GST_START_TEST (test_cleanup_recv)
+{
+ GstElement *rtpbin;
+ GstPad *rtp_sink;
+ CleanupData data;
+ GstStateChangeReturn ret;
+ GstFlowReturn res;
+ GstBuffer *buffer;
+ gint count = 2;
+
+ init_data (&data);
+
+ rtpbin = gst_element_factory_make ("gstrtpbin", "rtpbin");
+
+ g_signal_connect (rtpbin, "pad-added", (GCallback) pad_added_cb, &data);
+ g_signal_connect (rtpbin, "pad-removed", (GCallback) pad_removed_cb, &data);
+
+ ret = gst_element_set_state (rtpbin, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+ while (count--) {
+ /* request session 0 */
+ rtp_sink = gst_element_get_request_pad (rtpbin, "recv_rtp_sink_0");
+ fail_unless (rtp_sink != NULL);
+ ASSERT_OBJECT_REFCOUNT (rtp_sink, "rtp_sink", 2);
+
+ /* no sourcepads are created yet */
+ fail_unless (rtpbin->numsinkpads == 1);
+ fail_unless (rtpbin->numsrcpads == 0);
+
+ buffer = make_rtp_packet (&data);
+ res = gst_pad_chain (rtp_sink, buffer);
+ GST_DEBUG ("res %d, %s\n", res, gst_flow_get_name (res));
+ fail_unless (res == GST_FLOW_OK);
+
+ buffer = make_rtp_packet (&data);
+ res = gst_pad_chain (rtp_sink, buffer);
+ GST_DEBUG ("res %d, %s\n", res, gst_flow_get_name (res));
+ fail_unless (res == GST_FLOW_OK);
+
+ /* we wait for the new pad to appear now */
+ g_mutex_lock (data.lock);
+ while (!data.pad_added)
+ g_cond_wait (data.cond, data.lock);
+ g_mutex_unlock (data.lock);
+
+ /* sourcepad created now */
+ fail_unless (rtpbin->numsinkpads == 1);
+ fail_unless (rtpbin->numsrcpads == 1);
+
+ /* remove the session */
+ gst_element_release_request_pad (rtpbin, rtp_sink);
+ gst_object_unref (rtp_sink);
+
+ /* pad should be gone now */
+ g_mutex_lock (data.lock);
+ while (data.pad_added)
+ g_cond_wait (data.cond, data.lock);
+ g_mutex_unlock (data.lock);
+
+ /* nothing left anymore now */
+ fail_unless (rtpbin->numsinkpads == 0);
+ fail_unless (rtpbin->numsrcpads == 0);
+ }
+
+ ret = gst_element_set_state (rtpbin, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+ gst_object_unref (rtpbin);
+
+ clean_data (&data);
+}
+
+GST_END_TEST;
+
+Suite *
+gstrtpbin_suite (void)
+{
+ Suite *s = suite_create ("gstrtpbin");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_cleanup_send);
+ tcase_add_test (tc_chain, test_cleanup_recv);
+
+ return s;
+}
+
+int
+main (int argc, char **argv)
+{
+ int nf;
+
+ Suite *s = gstrtpbin_suite ();
+ SRunner *sr = srunner_create (s);
+
+ gst_check_init (&argc, &argv);
+
+ srunner_run_all (sr, CK_NORMAL);
+ nf = srunner_ntests_failed (sr);
+ srunner_free (sr);
+
+ return nf;
+}
diff --git a/tests/check/elements/y4menc.c b/tests/check/elements/y4menc.c
deleted file mode 100644
index b5c5fcc4..00000000
--- a/tests/check/elements/y4menc.c
+++ /dev/null
@@ -1,165 +0,0 @@
-/* GStreamer
- *
- * unit test for y4menc
- *
- * Copyright (C) <2006> Mark Nauwelaerts <manauw@skynet.be>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <unistd.h>
-
-#include <gst/check/gstcheck.h>
-
-/* For ease of programming we use globals to keep refs for our floating
- * src and sink pads we create; otherwise we always have to do get_pad,
- * get_peer, and then remove references in every test function */
-static GstPad *mysrcpad, *mysinkpad;
-
-#define VIDEO_CAPS_STRING "video/x-raw-yuv, " \
- "width = (int) 384, " \
- "height = (int) 288, " \
- "framerate = (fraction) 25/1, " \
- "pixel-aspect-ratio = (fraction) 1/1"
-
-#define Y4M_CAPS_STRING "application/x-yuv4mpeg, " \
- "y4mversion = (int) 2"
-
-static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
- GST_PAD_SINK,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS (Y4M_CAPS_STRING));
-
-static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
- GST_PAD_SRC,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS (VIDEO_CAPS_STRING));
-
-
-GstElement *
-setup_y4menc ()
-{
- GstElement *y4menc;
-
- GST_DEBUG ("setup_y4menc");
- y4menc = gst_check_setup_element ("y4menc");
- mysrcpad = gst_check_setup_src_pad (y4menc, &srctemplate, NULL);
- mysinkpad = gst_check_setup_sink_pad (y4menc, &sinktemplate, NULL);
- gst_pad_set_active (mysrcpad, TRUE);
- gst_pad_set_active (mysinkpad, TRUE);
-
- return y4menc;
-}
-
-void
-cleanup_y4menc (GstElement * y4menc)
-{
- GST_DEBUG ("cleanup_y4menc");
- gst_element_set_state (y4menc, GST_STATE_NULL);
-
- gst_pad_set_active (mysrcpad, FALSE);
- gst_pad_set_active (mysinkpad, FALSE);
- gst_check_teardown_src_pad (y4menc);
- gst_check_teardown_sink_pad (y4menc);
- gst_check_teardown_element (y4menc);
-}
-
-GST_START_TEST (test_y4m)
-{
- GstElement *y4menc;
- GstBuffer *inbuffer, *outbuffer;
- GstCaps *caps;
- int i, num_buffers, size;
- const gchar *data0 = "YUV4MPEG2 W384 H288 I? F25:1 A1:1\nFRAME\n";
-
-
- y4menc = setup_y4menc ();
- fail_unless (gst_element_set_state (y4menc,
- GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
- "could not set to playing");
-
- /* corresponds to I420 buffer for the size mentioned in the caps */
- size = 384 * 288 * 3 / 2;
- inbuffer = gst_buffer_new_and_alloc (size);
- /* makes valgrind's memcheck happier */
- memset (GST_BUFFER_DATA (inbuffer), 0, GST_BUFFER_SIZE (inbuffer));
- caps = gst_caps_from_string (VIDEO_CAPS_STRING);
- gst_buffer_set_caps (inbuffer, caps);
- gst_caps_unref (caps);
- GST_BUFFER_TIMESTAMP (inbuffer) = 0;
- ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
- fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
-
- num_buffers = g_list_length (buffers);
- fail_unless (num_buffers == 1);
-
- /* clean up buffers */
- for (i = 0; i < num_buffers; ++i) {
- outbuffer = GST_BUFFER (buffers->data);
- fail_if (outbuffer == NULL);
-
- switch (i) {
- case 0:
- fail_unless (strlen (data0) == 40);
- fail_unless (GST_BUFFER_SIZE (outbuffer) == size + 40);
- fail_unless (memcmp (data0, GST_BUFFER_DATA (outbuffer),
- strlen (data0)) == 0);
- break;
- default:
- break;
- }
- buffers = g_list_remove (buffers, outbuffer);
-
- ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1);
- gst_buffer_unref (outbuffer);
- outbuffer = NULL;
- }
-
- cleanup_y4menc (y4menc);
- g_list_free (buffers);
- buffers = NULL;
-}
-
-GST_END_TEST;
-
-Suite *
-y4menc_suite (void)
-{
- Suite *s = suite_create ("y4menc");
- TCase *tc_chain = tcase_create ("general");
-
- suite_add_tcase (s, tc_chain);
- tcase_add_test (tc_chain, test_y4m);
-
- return s;
-}
-
-int
-main (int argc, char **argv)
-{
- int nf;
-
- Suite *s = y4menc_suite ();
- SRunner *sr = srunner_create (s);
-
- gst_check_init (&argc, &argv);
-
- srunner_run_all (sr, CK_NORMAL);
- nf = srunner_ntests_failed (sr);
- srunner_free (sr);
-
- return nf;
-}
diff --git a/tests/examples/scaletempo/demo-player.c b/tests/examples/scaletempo/demo-player.c
index 3ed4b718..0adf0e1f 100644
--- a/tests/examples/scaletempo/demo-player.c
+++ b/tests/examples/scaletempo/demo-player.c
@@ -194,7 +194,7 @@ demo_player_build_pipeline (DemoPlayer * player)
priv->pipeline = playbin;
priv->scaletempo_line = audioline;
- MAKE_ELEMENT (NULL, priv->scalerate_line, "gconfaudiosink",
+ MAKE_ELEMENT (NULL, priv->scalerate_line, audiosink_name,
"scaling_audio_sink");
gst_pad_add_event_probe (gst_element_get_static_pad (priv->scalerate_line,
"sink"), G_CALLBACK (demo_player_event_listener), player);
diff --git a/win32/MANIFEST b/win32/MANIFEST
index 61247a21..647176e4 100644
--- a/win32/MANIFEST
+++ b/win32/MANIFEST
@@ -2,6 +2,7 @@ win32/MANIFEST
win32/common/config.h
win32/common/config.h.in
win32/vs6/gst_plugins_bad.dsw
+win32/vs6/libgstdirectdraw.dsp
win32/vs6/libgstdshow.dsp
win32/vs6/libgstdshowdecwrapper.dsp
win32/vs6/libdshowsrcwrapper.dsp
@@ -9,5 +10,7 @@ win32/vs6/libgstflv.dsp
win32/vs6/libgstmpegvideoparse.dsp
win32/vs6/libgstneon.dsp
win32/vs7/gst-plugins-bad.sln
+win32/vs7/libgstdirectdraw.vcproj
win32/vs8/gst-plugins-bad.sln
+win32/vs8/libgstdirectdraw.vcproj
win32/common/libgstdshow.def
diff --git a/win32/common/config.h b/win32/common/config.h
index c012aaff..ca6ae1c6 100644
--- a/win32/common/config.h
+++ b/win32/common/config.h
@@ -24,7 +24,7 @@
#define GST_LICENSE "LGPL"
/* package name in plugins */
-#define GST_PACKAGE_NAME "GStreamer Bad Plug-ins CVS/prerelease"
+#define GST_PACKAGE_NAME "GStreamer Bad Plug-ins git/prerelease"
/* package origin */
#define GST_PACKAGE_ORIGIN "Unknown package origin"
@@ -199,7 +199,7 @@
#undef USE_POISONING
/* Version number of package */
-#define VERSION "0.10.11.1"
+#define VERSION "0.10.12.1"
/* Define to 1 if your processor stores words with the most significant byte
first (like Motorola and SPARC, unlike Intel and VAX). */
diff --git a/win32/vs6/libgstdirectdraw.dsp b/win32/vs6/libgstdirectdraw.dsp
new file mode 100644
index 00000000..3fee3bd9
--- /dev/null
+++ b/win32/vs6/libgstdirectdraw.dsp
@@ -0,0 +1,125 @@
+# Microsoft Developer Studio Project File - Name="libgstdirectdraw" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstdirectdraw - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "libgstdirectdraw.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "libgstdirectdraw.mak" CFG="libgstdirectdraw - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstdirectdraw - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstdirectdraw - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "libgstdirectdraw - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTDIRECTDRAW_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTDIRECTDRAW_EXPORTS" /D "HAVE_CONFIG_H" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x40c /d "NDEBUG"
+# ADD RSC /l 0x40c /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 glib-2.0.lib gobject-2.0.lib libgstinterfaces-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstvideo-0.10.lib ddraw.lib user32.lib gdi32.lib Rpcrt4.lib dxguid.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"../../../gst-plugins-base/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstdirectdraw.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstdirectdraw - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTDIRECTDRAW_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTDIRECTDRAW_EXPORTS" /D "HAVE_CONFIG_H" /YX /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x40c /d "_DEBUG"
+# ADD RSC /l 0x40c /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 glib-2.0D.lib gobject-2.0D.lib libgstinterfaces-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstvideo-0.10.lib ddraw.lib user32.lib gdi32.lib Rpcrt4.lib dxguid.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstdirectdraw.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstdirectdraw - Win32 Release"
+# Name "libgstdirectdraw - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\sys\directdraw\gstdirectdrawplugin.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\sys\directdraw\gstdirectdrawsink.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\sys\directdraw\gstdirectdrawsink.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/gst/y4m/y4menc.vcproj b/win32/vs7/libgstdirectdraw.vcproj
index 7251140e..553d0c08 100644
--- a/gst/y4m/y4menc.vcproj
+++ b/win32/vs7/libgstdirectdraw.vcproj
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="Windows-1252"?>
+<?xml version="1.0" encoding="windows-1251"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
- Name="y4mencode"
- ProjectGUID="{979C216F-0ACF-4956-AE00-055A42D678E5}"
+ Name="libgstdirectdraw"
+ ProjectGUID="{1594A623-5529-4B86-BD4A-694CF0BDB5C4}"
Keyword="Win32Proj">
<Platforms>
<Platform
@@ -12,18 +12,18 @@
<Configurations>
<Configuration
Name="Debug|Win32"
- OutputDirectory="../../win32/Debug"
- IntermediateDirectory="../../win32/Debug"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
ConfigurationType="2"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="../../../gstreamer/win32;../../../gstreamer;../../../gstreamer/libs;../../../glib;../../../glib/glib;../../../glib/gmodule;&quot;../../gst-libs&quot;;../../../popt/include;../../../libxml2/include/libxml2"
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;y4mencode_EXPORTS;HAVE_CONFIG_H;_USE_MATH_DEFINES"
+ AdditionalIncludeDirectories="../../../gstreamer,../../../gst-plugins-base/gst-libs,../../../gstreamer/libs,../../../gstreamer/win32/common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTDIRECTDRAW_EXPORTS;HAVE_CONFIG_H"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
- RuntimeLibrary="3"
+ RuntimeLibrary="1"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
@@ -32,22 +32,20 @@
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
- OutputFile="$(OutDir)/gsty4mencode.dll"
+ AdditionalDependencies="ddraw.lib libgstvideo-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstdirectdraw.dll"
LinkIncremental="2"
- AdditionalLibraryDirectories="../../../gstreamer/win32/Debug;../../../glib/glib;../../../glib/gmodule;../../../glib/gthread;../../../glib/gobject;../../../gettext/lib;../../../libiconv/lib"
- ModuleDefinitionFile=""
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs7/$(OutDir);../../../gst-plugins-base/win32/vs7/$(OutDir)"
GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/y4mencode.pdb"
+ ProgramDatabaseFile="$(OutDir)/libgstdirectdraw.pdb"
SubSystem="2"
- OptimizeReferences="2"
- ImportLibrary="$(OutDir)/gsty4mencode.lib"
+ ImportLibrary="$(OutDir)/libgstdirectdraw.lib"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\lib\gstreamer-0.10"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
@@ -67,15 +65,15 @@
</Configuration>
<Configuration
Name="Release|Win32"
- OutputDirectory="../../win32/Release"
- IntermediateDirectory="../../win32/Release"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
ConfigurationType="2"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="../../../gstreamer/win32;../../../gstreamer;../../../gstreamer/libs;../../../glib;../../../glib/glib;../../../glib/gmodule;&quot;../../gst-libs&quot;;../../../popt/include;../../../libxml2/include/libxml2"
- PreprocessorDefinitions="WIN32;NDEBUG;GST_DISABLE_GST_DEBUG;_WINDOWS;_USRDLL;y4mencode_EXPORTS;HAVE_CONFIG_H;_USE_MATH_DEFINES"
- RuntimeLibrary="2"
+ AdditionalIncludeDirectories="../../../gstreamer,../../../gst-plugins-base/gst-libs,../../../gstreamer/libs,../../../gstreamer/win32/common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTDIRECTDRAW_EXPORTS;HAVE_CONFIG_H"
+ RuntimeLibrary="0"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
@@ -84,22 +82,21 @@
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
- OutputFile="$(OutDir)/gsty4mencode.dll"
+ AdditionalDependencies="ddraw.lib libgstvideo-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstdirectdraw.dll"
LinkIncremental="1"
- AdditionalLibraryDirectories="../../../gstreamer/win32/Release;../../../glib/glib;../../../glib/gmodule;../../../glib/gthread;../../../glib/gobject;../../../gettext/lib;../../../libiconv/lib"
- ModuleDefinitionFile=""
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs7/$(OutDir);../../../gst-plugins-base/win32/vs7/$(OutDir)"
GenerateDebugInformation="TRUE"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
- ImportLibrary="$(OutDir)/gsty4mencode.lib"
+ ImportLibrary="$(OutDir)/libgstdirectdraw.lib"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\lib\gstreamer-0.10"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
@@ -126,16 +123,16 @@
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
<File
- RelativePath=".\gsty4mencode.c">
+ RelativePath="..\..\sys\directdraw\gstdirectdrawplugin.c">
+ </File>
+ <File
+ RelativePath="..\..\sys\directdraw\gstdirectdrawsink.c">
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
- <File
- RelativePath=".\gsty4mencode.h">
- </File>
</Filter>
<Filter
Name="Resource Files"
diff --git a/win32/vs8/libgstdirectdraw.vcproj b/win32/vs8/libgstdirectdraw.vcproj
new file mode 100644
index 00000000..31af1ca9
--- /dev/null
+++ b/win32/vs8/libgstdirectdraw.vcproj
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="libgstdirectdraw"
+ ProjectGUID="{1594A623-5529-4B86-BD4A-694CF0BDB5C4}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
+ ConfigurationType="2"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer,../../../gst-plugins-base/gst-libs,../../../gstreamer/libs,../../../gstreamer/win32/common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTDIRECTDRAW_EXPORTS;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ddraw.lib libgstvideo-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib user32.lib gdi32.lib"
+ OutputFile="$(OutDir)/libgstdirectdraw.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName);../../../gst-plugins-base/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)/libgstdirectdraw.pdb"
+ SubSystem="2"
+ ImportLibrary="$(OutDir)/libgstdirectdraw.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
+ ConfigurationType="2"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer,../../../gst-plugins-base/gst-libs,../../../gstreamer/libs,../../../gstreamer/win32/common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTDIRECTDRAW_EXPORTS;HAVE_CONFIG_H"
+ RuntimeLibrary="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ddraw.lib libgstvideo-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib user32.lib gdi32.lib"
+ OutputFile="$(OutDir)/libgstdirectdraw.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName);../../../gst-plugins-base/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ ImportLibrary="$(OutDir)/libgstdirectdraw.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\sys\directdraw\gstdirectdrawplugin.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\sys\directdraw\gstdirectdrawsink.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>